Skip to content

Commit 9eeaba1

Browse files
committed
Move NoLlvmMetadataLoader to rustc_trans_traits
1 parent 44c1843 commit 9eeaba1

File tree

7 files changed

+169
-211
lines changed

7 files changed

+169
-211
lines changed

src/Cargo.lock

+4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/bootstrap/bin/rustc.rs

-4
Original file line numberDiff line numberDiff line change
@@ -159,10 +159,6 @@ fn main() {
159159
cmd.arg("-C").arg("panic=abort");
160160
}
161161

162-
if env::var("RUSTC_LLVM_ENABLED") == Ok("0".to_string()) && stage != "0" {
163-
cmd.arg("-Zno-trans");
164-
}
165-
166162
// Set various options from config.toml to configure how we're building
167163
// code.
168164
if env::var("RUSTC_DEBUGINFO") == Ok("true".to_string()) {

src/bootstrap/builder.rs

+3
Original file line numberDiff line numberDiff line change
@@ -531,6 +531,9 @@ impl<'a> Builder<'a> {
531531
// For other crates, however, we know that we've already got a standard
532532
// library up and running, so we can use the normal compiler to compile
533533
// build scripts in that situation.
534+
//
535+
// If LLVM support is disabled we need to use the snapshot compiler to compile
536+
// build scripts, as the new compiler doesnt support executables.
534537
if mode == Mode::Libstd || !self.build.config.llvm_enabled {
535538
cargo.env("RUSTC_SNAPSHOT", &self.initial_rustc)
536539
.env("RUSTC_SNAPSHOT_LIBDIR", self.rustc_snapshot_libdir());

src/librustc_driver/driver.rs

+22-41
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@
88
// option. This file may not be copied, modified, or distributed
99
// except according to those terms.
1010

11-
#![cfg_attr(not(feature="llvm"), allow(dead_code))]
12-
1311
use rustc::dep_graph::DepGraph;
1412
use rustc::hir::{self, map as hir_map};
1513
use rustc::hir::lowering::lower_crate;
@@ -96,10 +94,6 @@ pub fn compile_input(sess: &Session,
9694
}
9795

9896
if cfg!(not(feature="llvm")) {
99-
if !sess.opts.debugging_opts.no_trans && sess.opts.output_types.should_trans() {
100-
sess.err("LLVM is not supported by this rustc. Please use -Z no-trans to compile")
101-
}
102-
10397
for cty in sess.opts.crate_types.iter() {
10498
match *cty {
10599
CrateType::CrateTypeRlib | CrateType::CrateTypeDylib |
@@ -269,48 +263,36 @@ pub fn compile_input(sess: &Session,
269263
})??
270264
};
271265

272-
if cfg!(not(feature="llvm")) {
273-
let (_, _) = (outputs, trans);
274-
275-
if sess.opts.crate_types.contains(&CrateType::CrateTypeRlib)
276-
|| sess.opts.crate_types.contains(&CrateType::CrateTypeDylib) {
277-
return Ok(())
278-
}
279-
sess.fatal("LLVM is not supported by this rustc");
266+
if sess.opts.debugging_opts.print_type_sizes {
267+
sess.code_stats.borrow().print_type_sizes();
280268
}
281269

282-
#[cfg(feature="llvm")]
283-
{
284-
if sess.opts.debugging_opts.print_type_sizes {
285-
sess.code_stats.borrow().print_type_sizes();
286-
}
287-
288-
let (phase5_result, trans) = phase_5_run_llvm_passes::<DefaultTransCrate>(sess, &dep_graph, trans);
289-
290-
controller_entry_point!(after_llvm,
291-
sess,
292-
CompileState::state_after_llvm(input, sess, outdir, output, &trans),
293-
phase5_result);
294-
phase5_result?;
270+
let (phase5_result, trans) = phase_5_run_llvm_passes::<DefaultTransCrate>(sess, &dep_graph, trans);
295271

296-
phase_6_link_output::<DefaultTransCrate>(sess, &trans, &outputs);
272+
controller_entry_point!(after_llvm,
273+
sess,
274+
CompileState::state_after_llvm(input, sess, outdir, output, &trans),
275+
phase5_result);
276+
phase5_result?;
297277

298-
// Now that we won't touch anything in the incremental compilation directory
299-
// any more, we can finalize it (which involves renaming it)
300-
rustc_incremental::finalize_session_directory(sess, trans.link.crate_hash);
278+
phase_6_link_output::<DefaultTransCrate>(sess, &trans, &outputs);
301279

302-
if sess.opts.debugging_opts.perf_stats {
303-
sess.print_perf_stats();
304-
}
280+
// Now that we won't touch anything in the incremental compilation directory
281+
// any more, we can finalize it (which involves renaming it)
282+
#[cfg(feature="llvm")]
283+
rustc_incremental::finalize_session_directory(sess, trans.link.crate_hash);
305284

306-
controller_entry_point!(
307-
compilation_done,
308-
sess,
309-
CompileState::state_when_compilation_done(input, sess, outdir, output),
310-
Ok(())
311-
);
285+
if sess.opts.debugging_opts.perf_stats {
286+
sess.print_perf_stats();
312287
}
313288

289+
controller_entry_point!(
290+
compilation_done,
291+
sess,
292+
CompileState::state_when_compilation_done(input, sess, outdir, output),
293+
Ok(())
294+
);
295+
314296
Ok(())
315297
}
316298

@@ -1171,7 +1153,6 @@ pub fn phase_5_run_llvm_passes<T: TransCrate>(sess: &Session,
11711153

11721154
/// Run the linker on any artifacts that resulted from the LLVM run.
11731155
/// This should produce either a finished executable or library.
1174-
#[cfg(feature="llvm")]
11751156
pub fn phase_6_link_output<T: TransCrate>(sess: &Session,
11761157
trans: &<T as TransCrate>::TranslatedCrate,
11771158
outputs: &OutputFilenames) {

src/librustc_driver/lib.rs

+3-163
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,6 @@
2525
#![feature(rustc_diagnostic_macros)]
2626
#![feature(set_stdio)]
2727

28-
extern crate ar;
29-
extern crate flate2;
3028
extern crate arena;
3129
extern crate getopts;
3230
extern crate graphviz;
@@ -155,173 +153,17 @@ pub fn run<F>(run_compiler: F) -> isize
155153
}
156154

157155
#[cfg(not(feature="llvm"))]
158-
pub use trans_metadata_only::MetadataOnlyTransCrate as DefaultTransCrate;
156+
pub use rustc_trans_traits::MetadataOnlyTransCrate as DefaultTransCrate;
159157
#[cfg(feature="llvm")]
160158
pub use rustc_trans::LlvmTransCrate as DefaultTransCrate;
161159

162-
mod no_llvm_metadata_loader {
163-
extern crate owning_ref;
164-
165-
use rustc::middle::cstore::MetadataLoader as MetadataLoaderTrait;
166-
use rustc_back::target::Target;
167-
use std::io;
168-
use std::fs::File;
169-
use std::path::Path;
170-
171-
use ar::Archive;
172-
use self::owning_ref::{OwningRef, ErasedBoxRef};
173-
174-
pub struct NoLlvmMetadataLoader;
175-
176-
impl MetadataLoaderTrait for NoLlvmMetadataLoader {
177-
fn get_rlib_metadata(
178-
&self,
179-
_: &Target,
180-
filename: &Path
181-
) -> Result<ErasedBoxRef<[u8]>, String> {
182-
let file = File::open(filename).map_err(|e| {
183-
format!("metadata file open err: {:?}", e)
184-
})?;
185-
let mut archive = Archive::new(file);
186-
187-
while let Some(entry_result) = archive.next_entry() {
188-
let mut entry = entry_result.map_err(|e| {
189-
format!("metadata section read err: {:?}", e)
190-
})?;
191-
if entry.header().identifier() == "rust.metadata.bin" {
192-
let mut buf = Vec::new();
193-
io::copy(&mut entry, &mut buf).unwrap();
194-
let buf: OwningRef<Vec<u8>, [u8]> = OwningRef::new(buf).into();
195-
return Ok(buf.map_owner_box().erase_owner());
196-
}
197-
}
198-
199-
Err("Couldnt find metadata section".to_string())
200-
}
201-
202-
fn get_dylib_metadata(&self,
203-
_target: &Target,
204-
_filename: &Path)
205-
-> Result<ErasedBoxRef<[u8]>, String> {
206-
// FIXME: Support reading dylibs from llvm enabled rustc
207-
self.get_rlib_metadata(_target, _filename)
208-
}
209-
}
210-
}
211-
212-
mod trans_metadata_only {
213-
use std::io::prelude::*;
214-
use std::io::Cursor;
215-
use std::fs::File;
216-
217-
use ar::{Builder, Header};
218-
use flate2::Compression;
219-
use flate2::write::DeflateEncoder;
220-
221-
use syntax::symbol::Symbol;
222-
use rustc::hir::def_id::LOCAL_CRATE;
223-
use rustc::session::Session;
224-
use rustc::session::config::{OutputFilenames, CrateType};
225-
use rustc::ty::{TyCtxt, CrateAnalysis};
226-
use rustc::ty::maps::Providers;
227-
use rustc::middle::cstore::{MetadataLoader, EncodedMetadata};
228-
use rustc::dep_graph::DepGraph;
229-
use rustc_incremental::IncrementalHashesMap;
230-
use rustc_trans_utils::find_exported_symbols;
231-
use rustc_trans_utils::link::{out_filename, build_link_meta};
232-
use rustc_trans_traits::TransCrate;
233-
234-
#[allow(dead_code)]
235-
pub struct MetadataOnlyTransCrate;
236-
pub struct OngoingCrateTranslation {
237-
metadata: EncodedMetadata,
238-
metadata_version: Vec<u8>,
239-
crate_name: Symbol,
240-
}
241-
pub struct TranslatedCrate(OngoingCrateTranslation);
242-
243-
impl MetadataOnlyTransCrate {
244-
#[allow(dead_code)]
245-
pub fn new(/*_sess: &Session*/) -> Self {
246-
MetadataOnlyTransCrate
247-
}
248-
}
249-
250-
impl TransCrate for MetadataOnlyTransCrate {
251-
type MetadataLoader = ::no_llvm_metadata_loader::NoLlvmMetadataLoader;
252-
type OngoingCrateTranslation = OngoingCrateTranslation;
253-
type TranslatedCrate = TranslatedCrate;
254-
255-
fn metadata_loader() -> Box<MetadataLoader> {
256-
box ::no_llvm_metadata_loader::NoLlvmMetadataLoader
257-
}
258-
259-
fn provide(_providers: &mut Providers) {}
260-
261-
fn trans_crate<'a, 'tcx>(
262-
tcx: TyCtxt<'a, 'tcx, 'tcx>,
263-
analysis: CrateAnalysis,
264-
incr_hashes_map: IncrementalHashesMap,
265-
_output_filenames: &OutputFilenames
266-
) -> Self::OngoingCrateTranslation {
267-
let link_meta = build_link_meta(&incr_hashes_map);
268-
let exported_symbols = find_exported_symbols(tcx, &analysis.reachable);
269-
let (metadata, _hashes) = tcx.encode_metadata(&link_meta, &exported_symbols);
270-
271-
OngoingCrateTranslation {
272-
metadata: metadata,
273-
metadata_version: tcx.metadata_encoding_version().to_vec(),
274-
crate_name: tcx.crate_name(LOCAL_CRATE),
275-
}
276-
}
277-
278-
fn join_trans(
279-
trans: Self::OngoingCrateTranslation,
280-
_sess: &Session,
281-
_dep_graph: &DepGraph,
282-
) -> Self::TranslatedCrate {
283-
TranslatedCrate(trans)
284-
}
285-
286-
fn link_binary(sess: &Session,
287-
trans: &Self::TranslatedCrate,
288-
outputs: &OutputFilenames) {
289-
for &crate_type in sess.opts.crate_types.iter() {
290-
if crate_type != CrateType::CrateTypeRlib &&
291-
crate_type != CrateType::CrateTypeDylib {
292-
continue;
293-
}
294-
let output_name =
295-
out_filename(sess, crate_type, &outputs, &trans.0.crate_name.as_str());
296-
let mut compressed = trans.0.metadata_version.clone();
297-
let metadata = if crate_type == CrateType::CrateTypeDylib {
298-
DeflateEncoder::new(&mut compressed, Compression::Fast)
299-
.write_all(&trans.0.metadata.raw_data).unwrap();
300-
&compressed
301-
} else {
302-
&trans.0.metadata.raw_data
303-
};
304-
let mut builder = Builder::new(File::create(&output_name).unwrap());
305-
let header = Header::new(
306-
"rust.metadata.bin".to_string(),
307-
metadata.len() as u64
308-
);
309-
builder
310-
.append(&header, Cursor::new(metadata))
311-
.unwrap();
312-
}
313-
}
314-
315-
fn dump_incremental_data(_trans: &Self::TranslatedCrate) {}
316-
}
317-
}
318-
319160
#[cfg(not(feature="llvm"))]
320161
mod rustc_trans {
321162
use syntax_pos::symbol::Symbol;
322163
use rustc::session::Session;
323164
use rustc::session::config::PrintRequest;
324-
pub use trans_metadata_only::MetadataOnlyTransCrate as LlvmTransCrate;
165+
pub use rustc_trans_traits::MetadataOnlyTransCrate as LlvmTransCrate;
166+
pub use rustc_trans_traits::TranslatedCrate as CrateTranslation;
325167

326168
pub fn init(_sess: &Session) {}
327169
pub fn enable_llvm_debug() {}
@@ -330,8 +172,6 @@ mod rustc_trans {
330172
pub fn print(_req: PrintRequest, _sess: &Session) {}
331173
pub fn target_features(_sess: &Session) -> Vec<Symbol> { vec![] }
332174

333-
pub struct CrateTranslation(());
334-
335175
pub mod back {
336176
pub mod write {
337177
pub const RELOC_MODEL_ARGS: [(&'static str, ()); 0] = [];

src/librustc_trans_traits/Cargo.toml

+4
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,12 @@ crate-type = ["dylib"]
1010
test = false
1111

1212
[dependencies]
13+
ar = "0.3.0"
14+
flate2 = "0.2"
1315
owning_ref = "0.3.3"
1416

17+
syntax = { path = "../libsyntax" }
1518
rustc = { path = "../librustc" }
1619
rustc_back = { path = "../librustc_back" }
1720
rustc_incremental = { path = "../librustc_incremental" }
21+
rustc_trans_utils = { path = "../librustc_trans_utils" }

0 commit comments

Comments
 (0)