Skip to content

Commit

Permalink
trans: save metadata even with -Z no-trans.
Browse files Browse the repository at this point in the history
  • Loading branch information
eddyb committed May 12, 2016
1 parent 749494e commit adee551
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 27 deletions.
2 changes: 1 addition & 1 deletion src/librustc/session/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1103,7 +1103,7 @@ pub fn build_session_options(matches: &getopts::Matches) -> Options {
let no_analysis = debugging_opts.no_analysis;

let mut output_types = HashMap::new();
if !debugging_opts.parse_only && !no_trans {
if !debugging_opts.parse_only {
for list in matches.opt_strs("emit") {
for output_type in list.split(',') {
let mut parts = output_type.splitn(2, '=');
Expand Down
4 changes: 0 additions & 4 deletions src/librustc_driver/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -504,10 +504,6 @@ impl<'a> CompilerCalls<'a> for RustcDefaultCalls {
control.after_write_deps.stop = Compilation::Stop;
}

if sess.opts.no_trans {
control.after_analysis.stop = Compilation::Stop;
}

if !sess.opts.output_types.keys().any(|&i| i == OutputType::Exe) {
control.after_llvm.stop = Compilation::Stop;
}
Expand Down
54 changes: 32 additions & 22 deletions src/librustc_trans/base.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2424,11 +2424,7 @@ fn contains_null(s: &str) -> bool {
s.bytes().any(|b| b == 0)
}

pub fn write_metadata<'a, 'tcx>(cx: &SharedCrateContext<'a, 'tcx>,
krate: &hir::Crate,
reachable: &NodeSet,
mir_map: &MirMap<'tcx>)
-> Vec<u8> {
pub fn write_metadata<'a, 'tcx>(cx: &SharedCrateContext<'a, 'tcx>) -> Vec<u8> {
use flate;

let any_library = cx.sess()
Expand All @@ -2444,9 +2440,9 @@ pub fn write_metadata<'a, 'tcx>(cx: &SharedCrateContext<'a, 'tcx>,
let metadata = cstore.encode_metadata(cx.tcx(),
cx.export_map(),
cx.link_meta(),
reachable,
mir_map,
krate);
cx.reachable(),
cx.mir_map(),
cx.tcx().map.krate());
let mut compressed = cstore.metadata_encoding_version().to_vec();
compressed.extend_from_slice(&flate::deflate_bytes(&metadata));

Expand Down Expand Up @@ -2679,6 +2675,16 @@ pub fn trans_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
reachable,
check_overflow,
check_dropflag);
// Translate the metadata.
let metadata = time(tcx.sess.time_passes(), "write metadata", || {
write_metadata(&shared_ccx)
});

let metadata_module = ModuleTranslation {
llcx: shared_ccx.metadata_llcx(),
llmod: shared_ccx.metadata_llmod(),
};
let no_builtins = attr::contains_name(&krate.attrs, "no_builtins");

let codegen_units = collect_and_partition_translation_items(&shared_ccx);
let codegen_unit_count = codegen_units.len();
Expand All @@ -2687,6 +2693,24 @@ pub fn trans_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,

let crate_context_list = CrateContextList::new(&shared_ccx, codegen_units);

let modules = crate_context_list.iter()
.map(|ccx| ModuleTranslation { llcx: ccx.llcx(), llmod: ccx.llmod() })
.collect();

// Skip crate items and just output metadata in -Z no-trans mode.
if tcx.sess.opts.no_trans {
let linker_info = LinkerInfo::new(&shared_ccx, &[]);
return CrateTranslation {
modules: modules,
metadata_module: metadata_module,
link: link_meta,
metadata: metadata,
reachable: vec![],
no_builtins: no_builtins,
linker_info: linker_info
};
}

{
let ccx = crate_context_list.get_ccx(0);

Expand Down Expand Up @@ -2718,10 +2742,6 @@ pub fn trans_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,

let reachable_symbol_ids = filter_reachable_ids(&shared_ccx);

// Translate the metadata.
let metadata = time(tcx.sess.time_passes(), "write metadata", || {
write_metadata(&shared_ccx, krate, &reachable_symbol_ids, mir_map)
});

if shared_ccx.sess().trans_stats() {
let stats = shared_ccx.stats();
Expand Down Expand Up @@ -2752,10 +2772,6 @@ pub fn trans_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
}
}

let modules = crate_context_list.iter()
.map(|ccx| ModuleTranslation { llcx: ccx.llcx(), llmod: ccx.llmod() })
.collect();

let sess = shared_ccx.sess();
let mut reachable_symbols = reachable_symbol_ids.iter().map(|&id| {
let def_id = shared_ccx.tcx().map.local_def_id(id);
Expand Down Expand Up @@ -2789,12 +2805,6 @@ pub fn trans_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
create_imps(&crate_context_list);
}

let metadata_module = ModuleTranslation {
llcx: shared_ccx.metadata_llcx(),
llmod: shared_ccx.metadata_llmod(),
};
let no_builtins = attr::contains_name(&krate.attrs, "no_builtins");

let linker_info = LinkerInfo::new(&shared_ccx, &reachable_symbols);
CrateTranslation {
modules: modules,
Expand Down
4 changes: 4 additions & 0 deletions src/librustc_trans/context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -485,6 +485,10 @@ impl<'b, 'tcx> SharedCrateContext<'b, 'tcx> {
pub fn symbol_hasher(&self) -> &RefCell<Sha256> {
&self.symbol_hasher
}

pub fn mir_map(&self) -> &MirMap<'tcx> {
&self.mir_map
}
}

impl<'tcx> LocalCrateContext<'tcx> {
Expand Down

0 comments on commit adee551

Please sign in to comment.