Skip to content

Commit 95ed511

Browse files
committed
Mostly fix compiling without LLVM (with metadata_only backend)
1 parent 6ceb163 commit 95ed511

File tree

11 files changed

+15
-119
lines changed

11 files changed

+15
-119
lines changed

config.toml.example

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,6 @@
1414
# =============================================================================
1515
[llvm]
1616

17-
# Indicates whether rustc will support compilation with LLVM
18-
# note: rustc does not compile without LLVM at the moment
19-
#enabled = true
20-
2117
# Indicates whether the LLVM build is a Release or Debug build
2218
#optimize = true
2319

src/Cargo.lock

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2031,8 +2031,6 @@ dependencies = [
20312031
name = "rustc_codegen_utils"
20322032
version = "0.0.0"
20332033
dependencies = [
2034-
"ar 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
2035-
"flate2 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
20362034
"log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
20372035
"rustc 0.0.0",
20382036
"rustc_data_structures 0.0.0",

src/bootstrap/bin/rustc.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -114,10 +114,6 @@ fn main() {
114114

115115
cmd.env("RUSTC_BREAK_ON_ICE", "1");
116116

117-
if args.iter().find(|s| **s == OsString::from("___")).is_some() {
118-
cmd.arg("-Zcodegen-backend=metadata_only");
119-
}
120-
121117
if let Some(target) = target {
122118
// The stage0 compiler has a special sysroot distinct from what we
123119
// actually downloaded, so we just always pass the `--sysroot` option.

src/bootstrap/builder.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -893,7 +893,7 @@ impl<'a> Builder<'a> {
893893
//
894894
// If LLVM support is disabled we need to use the snapshot compiler to compile
895895
// build scripts, as the new compiler doesn't support executables.
896-
if mode == Mode::Std || !self.config.llvm_enabled {
896+
if mode == Mode::Std || self.config.rust_codegen_backends.is_empty() {
897897
cargo
898898
.env("RUSTC_SNAPSHOT", &self.initial_rustc)
899899
.env("RUSTC_SNAPSHOT_LIBDIR", self.rustc_snapshot_libdir());

src/bootstrap/config.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@ pub struct Config {
7474
pub backtrace_on_ice: bool,
7575

7676
// llvm codegen options
77-
pub llvm_enabled: bool,
7877
pub llvm_assertions: bool,
7978
pub llvm_optimize: bool,
8079
pub llvm_release_debuginfo: bool,
@@ -239,7 +238,6 @@ struct Install {
239238
#[derive(Deserialize, Default)]
240239
#[serde(deny_unknown_fields, rename_all = "kebab-case")]
241240
struct Llvm {
242-
enabled: Option<bool>,
243241
ccache: Option<StringOrBool>,
244242
ninja: Option<bool>,
245243
assertions: Option<bool>,
@@ -341,7 +339,6 @@ impl Config {
341339

342340
pub fn default_opts() -> Config {
343341
let mut config = Config::default();
344-
config.llvm_enabled = true;
345342
config.llvm_optimize = true;
346343
config.llvm_version_check = true;
347344
config.use_jemalloc = true;
@@ -496,7 +493,6 @@ impl Config {
496493
Some(StringOrBool::Bool(false)) | None => {}
497494
}
498495
set(&mut config.ninja, llvm.ninja);
499-
set(&mut config.llvm_enabled, llvm.enabled);
500496
llvm_assertions = llvm.assertions;
501497
set(&mut config.llvm_optimize, llvm.optimize);
502498
set(&mut config.llvm_release_debuginfo, llvm.release_debuginfo);

src/bootstrap/test.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1096,7 +1096,7 @@ impl Step for Compiletest {
10961096
cmd.arg("--quiet");
10971097
}
10981098

1099-
if builder.config.llvm_enabled {
1099+
if !builder.config.rust_codegen_backends.is_empty() {
11001100
let llvm_config = builder.ensure(native::Llvm {
11011101
target: builder.config.build,
11021102
emscripten: false,
@@ -1129,7 +1129,7 @@ impl Step for Compiletest {
11291129
}
11301130
}
11311131
}
1132-
if suite == "run-make-fulldeps" && !builder.config.llvm_enabled {
1132+
if suite == "run-make-fulldeps" && builder.config.rust_codegen_backends.is_empty() {
11331133
builder.info(&format!(
11341134
"Ignoring run-make test suite as they generally don't work without LLVM"
11351135
));

src/bootstrap/tool.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -672,7 +672,7 @@ impl<'a> Builder<'a> {
672672
}
673673

674674
fn llvm_bin_path(&self) -> Option<PathBuf> {
675-
if self.config.llvm_enabled && !self.config.dry_run {
675+
if !self.config.rust_codegen_backends.is_empty() && !self.config.dry_run {
676676
let llvm_config = self.ensure(native::Llvm {
677677
target: self.config.build,
678678
emscripten: false,

src/librustc_codegen_utils/Cargo.toml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@ crate-type = ["dylib"]
1010
test = false
1111

1212
[dependencies]
13-
ar = "0.3.0"
14-
flate2 = "1.0"
1513
log = "0.4"
1614

1715
syntax = { path = "../libsyntax" }

src/librustc_codegen_utils/codegen_backend.rs

Lines changed: 11 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,13 @@
2222
#![feature(box_syntax)]
2323

2424
use std::any::Any;
25-
use std::io::prelude::*;
26-
use std::io::{self, Cursor};
25+
use std::io::{self, Write};
2726
use std::fs::File;
2827
use std::path::Path;
2928
use std::sync::{mpsc, Arc};
3029

3130
use rustc_data_structures::owning_ref::OwningRef;
3231
use rustc_data_structures::sync::Lrc;
33-
use ar::{Archive, Builder, Header};
34-
use flate2::Compression;
35-
use flate2::write::DeflateEncoder;
3632

3733
use syntax::symbol::Symbol;
3834
use rustc::hir::def_id::LOCAL_CRATE;
@@ -80,96 +76,27 @@ pub trait CodegenBackend {
8076
) -> Result<(), CompileIncomplete>;
8177
}
8278

83-
pub struct DummyCodegenBackend;
84-
85-
impl CodegenBackend for DummyCodegenBackend {
86-
fn metadata_loader(&self) -> Box<MetadataLoader + Sync> {
87-
box DummyMetadataLoader(())
88-
}
89-
90-
fn provide(&self, _providers: &mut Providers) {
91-
bug!("DummyCodegenBackend::provide");
92-
}
93-
94-
fn provide_extern(&self, _providers: &mut Providers) {
95-
bug!("DummyCodegenBackend::provide_extern");
96-
}
97-
98-
fn codegen_crate<'a, 'tcx>(
99-
&self,
100-
_tcx: TyCtxt<'a, 'tcx, 'tcx>,
101-
_rx: mpsc::Receiver<Box<Any + Send>>
102-
) -> Box<Any> {
103-
bug!("DummyCodegenBackend::codegen_backend");
104-
}
105-
106-
fn join_codegen_and_link(
107-
&self,
108-
_ongoing_codegen: Box<Any>,
109-
_sess: &Session,
110-
_dep_graph: &DepGraph,
111-
_outputs: &OutputFilenames,
112-
) -> Result<(), CompileIncomplete> {
113-
bug!("DummyCodegenBackend::join_codegen_and_link");
114-
}
115-
}
116-
117-
pub struct DummyMetadataLoader(());
118-
119-
impl MetadataLoader for DummyMetadataLoader {
120-
fn get_rlib_metadata(
121-
&self,
122-
_target: &Target,
123-
_filename: &Path
124-
) -> Result<MetadataRef, String> {
125-
bug!("DummyMetadataLoader::get_rlib_metadata");
126-
}
127-
128-
fn get_dylib_metadata(
129-
&self,
130-
_target: &Target,
131-
_filename: &Path
132-
) -> Result<MetadataRef, String> {
133-
bug!("DummyMetadataLoader::get_dylib_metadata");
134-
}
135-
}
136-
13779
pub struct NoLlvmMetadataLoader;
13880

13981
impl MetadataLoader for NoLlvmMetadataLoader {
14082
fn get_rlib_metadata(&self, _: &Target, filename: &Path) -> Result<MetadataRef, String> {
141-
let file = File::open(filename)
83+
let mut file = File::open(filename)
14284
.map_err(|e| format!("metadata file open err: {:?}", e))?;
143-
let mut archive = Archive::new(file);
14485

145-
while let Some(entry_result) = archive.next_entry() {
146-
let mut entry = entry_result
147-
.map_err(|e| format!("metadata section read err: {:?}", e))?;
148-
if entry.header().identifier() == "rust.metadata.bin" {
149-
let mut buf = Vec::new();
150-
io::copy(&mut entry, &mut buf).unwrap();
151-
let buf: OwningRef<Vec<u8>, [u8]> = OwningRef::new(buf).into();
152-
return Ok(rustc_erase_owner!(buf.map_owner_box()));
153-
}
154-
}
155-
156-
Err("Couldn't find metadata section".to_string())
86+
let mut buf = Vec::new();
87+
io::copy(&mut file, &mut buf).unwrap();
88+
let buf: OwningRef<Vec<u8>, [u8]> = OwningRef::new(buf).into();
89+
return Ok(rustc_erase_owner!(buf.map_owner_box()));
15790
}
15891

159-
fn get_dylib_metadata(
160-
&self,
161-
_target: &Target,
162-
_filename: &Path,
163-
) -> Result<MetadataRef, String> {
164-
// FIXME: Support reading dylibs from llvm enabled rustc
165-
self.get_rlib_metadata(_target, _filename)
92+
fn get_dylib_metadata(&self, target: &Target, filename: &Path) -> Result<MetadataRef, String> {
93+
self.get_rlib_metadata(target, filename)
16694
}
16795
}
16896

16997
pub struct MetadataOnlyCodegenBackend(());
17098
pub struct OngoingCodegen {
17199
metadata: EncodedMetadata,
172-
metadata_version: Vec<u8>,
173100
crate_name: Symbol,
174101
}
175102

@@ -257,7 +184,6 @@ impl CodegenBackend for MetadataOnlyCodegenBackend {
257184

258185
box OngoingCodegen {
259186
metadata: metadata,
260-
metadata_version: tcx.metadata_encoding_version().to_vec(),
261187
crate_name: tcx.crate_name(LOCAL_CRATE),
262188
}
263189
}
@@ -277,18 +203,9 @@ impl CodegenBackend for MetadataOnlyCodegenBackend {
277203
}
278204
let output_name =
279205
out_filename(sess, crate_type, &outputs, &ongoing_codegen.crate_name.as_str());
280-
let mut compressed = ongoing_codegen.metadata_version.clone();
281-
let metadata = if crate_type == CrateType::CrateTypeDylib {
282-
DeflateEncoder::new(&mut compressed, Compression::fast())
283-
.write_all(&ongoing_codegen.metadata.raw_data)
284-
.unwrap();
285-
&compressed
286-
} else {
287-
&ongoing_codegen.metadata.raw_data
288-
};
289-
let mut builder = Builder::new(File::create(&output_name).unwrap());
290-
let header = Header::new("rust.metadata.bin".to_string(), metadata.len() as u64);
291-
builder.append(&header, Cursor::new(metadata)).unwrap();
206+
let metadata = &ongoing_codegen.metadata.raw_data;
207+
let mut file = File::create(&output_name).unwrap();
208+
file.write_all(metadata).unwrap();
292209
}
293210

294211
sess.abort_if_errors();

src/librustc_codegen_utils/lib.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,6 @@
2525

2626
#![recursion_limit="256"]
2727

28-
extern crate ar;
29-
extern crate flate2;
3028
#[macro_use]
3129
extern crate log;
3230

@@ -39,8 +37,6 @@ extern crate syntax;
3937
extern crate syntax_pos;
4038
#[macro_use] extern crate rustc_data_structures;
4139

42-
pub extern crate rustc as __rustc;
43-
4440
use rustc::ty::TyCtxt;
4541

4642
pub mod link;

0 commit comments

Comments
 (0)