Skip to content

Commit f6894eb

Browse files
Clean up LLVM module naming (just use CodegenUnit names).
1 parent 2c5cd9c commit f6894eb

File tree

6 files changed

+39
-69
lines changed

6 files changed

+39
-69
lines changed

src/librustc_codegen_llvm/back/link.rs

-7
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,6 @@ use std::process::{Output, Stdio};
4545
use std::str;
4646
use syntax::attr;
4747

48-
/// The LLVM module name containing crate-metadata. This includes a `.` on
49-
/// purpose, so it cannot clash with the name of a user-defined module.
50-
pub const METADATA_MODULE_NAME: &'static str = "crate.metadata";
51-
52-
// same as for metadata above, but for allocator shim
53-
pub const ALLOCATOR_MODULE_NAME: &'static str = "crate.allocator";
54-
5548
pub use rustc_codegen_utils::link::{find_crate_name, filename_for_input, default_output_for_target,
5649
invalid_output_for_target, build_link_meta, out_filename,
5750
check_file_is_writeable};

src/librustc_codegen_llvm/back/lto.rs

+5-6
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ fn fat_lto(cgcx: &CodegenContext,
238238
.expect("must be codegen'ing at least one module");
239239
let module = modules.remove(costliest_module);
240240
let llmod = module.llvm().expect("can't lto pre-codegened modules").llmod;
241-
info!("using {:?} as a base module", module.llmod_id);
241+
info!("using {:?} as a base module", module.name);
242242

243243
// For all other modules we codegened we'll need to link them into our own
244244
// bitcode. All modules were codegened in their own LLVM context, however,
@@ -248,7 +248,7 @@ fn fat_lto(cgcx: &CodegenContext,
248248
for module in modules {
249249
let llvm = module.llvm().expect("can't lto pre-codegened modules");
250250
let buffer = ModuleBuffer::new(llvm.llmod);
251-
let llmod_id = CString::new(&module.llmod_id[..]).unwrap();
251+
let llmod_id = CString::new(&module.name[..]).unwrap();
252252
serialized_modules.push((SerializedModule::Local(buffer), llmod_id));
253253
}
254254

@@ -376,9 +376,9 @@ fn thin_lto(cgcx: &CodegenContext,
376376
// the most expensive portion of this small bit of global
377377
// analysis!
378378
for (i, module) in modules.iter().enumerate() {
379-
info!("local module: {} - {}", i, module.llmod_id);
379+
info!("local module: {} - {}", i, module.name);
380380
let llvm = module.llvm().expect("can't lto precodegened module");
381-
let name = CString::new(module.llmod_id.clone()).unwrap();
381+
let name = CString::new(module.name.clone()).unwrap();
382382
let buffer = ThinBuffer::new(llvm.llmod);
383383
thin_modules.push(llvm::ThinLTOModule {
384384
identifier: name.as_ptr(),
@@ -387,7 +387,7 @@ fn thin_lto(cgcx: &CodegenContext,
387387
});
388388
thin_buffers.push(buffer);
389389
module_names.push(name);
390-
timeline.record(&module.llmod_id);
390+
timeline.record(&module.name);
391391
}
392392

393393
// FIXME: All upstream crates are deserialized internally in the
@@ -676,7 +676,6 @@ impl ThinModule {
676676
llcx,
677677
tm,
678678
}),
679-
llmod_id: self.name().to_string(),
680679
name: self.name().to_string(),
681680
kind: ModuleKind::Regular,
682681
};

src/librustc_codegen_llvm/back/write.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -696,7 +696,7 @@ unsafe fn codegen(cgcx: &CodegenContext,
696696

697697
if config.emit_bc_compressed {
698698
let dst = bc_out.with_extension(RLIB_BYTECODE_EXTENSION);
699-
let data = bytecode::encode(&module.llmod_id, data);
699+
let data = bytecode::encode(&module.name, data);
700700
if let Err(e) = fs::write(&dst, data) {
701701
diag_handler.err(&format!("failed to write bytecode: {}", e));
702702
}
@@ -1308,7 +1308,6 @@ fn execute_work_item(cgcx: &CodegenContext,
13081308
assert_eq!(bytecode_compressed.is_some(), config.emit_bc_compressed);
13091309

13101310
Ok(WorkItemResult::Compiled(CompiledModule {
1311-
llmod_id: module.llmod_id.clone(),
13121311
name: module_name,
13131312
kind: ModuleKind::Regular,
13141313
pre_existing: true,

src/librustc_codegen_llvm/base.rs

+30-48
Original file line numberDiff line numberDiff line change
@@ -739,15 +739,18 @@ pub fn codegen_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
739739
let link_meta = link::build_link_meta(crate_hash);
740740

741741
// Codegen the metadata.
742-
let llmod_id = "metadata";
742+
let metadata_cgu_name = CodegenUnit::build_cgu_name(tcx,
743+
LOCAL_CRATE,
744+
&["crate"],
745+
Some("metadata")).as_str()
746+
.to_string();
743747
let (metadata_llcx, metadata_llmod, metadata) =
744748
time(tcx.sess, "write metadata", || {
745-
write_metadata(tcx, llmod_id, &link_meta)
749+
write_metadata(tcx, &metadata_cgu_name, &link_meta)
746750
});
747751

748752
let metadata_module = ModuleCodegen {
749-
name: link::METADATA_MODULE_NAME.to_string(),
750-
llmod_id: llmod_id.to_string(),
753+
name: metadata_cgu_name,
751754
source: ModuleSource::Codegened(ModuleLlvm {
752755
llcx: metadata_llcx,
753756
llmod: metadata_llmod,
@@ -810,26 +813,30 @@ pub fn codegen_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
810813

811814
// Codegen an allocator shim, if any
812815
let allocator_module = if let Some(kind) = *tcx.sess.allocator_kind.get() {
813-
unsafe {
814-
let llmod_id = "allocator";
815-
let (llcx, llmod) =
816-
context::create_context_and_module(tcx.sess, llmod_id);
817-
let modules = ModuleLlvm {
818-
llmod,
819-
llcx,
820-
tm: create_target_machine(tcx.sess, false),
821-
};
822-
time(tcx.sess, "write allocator module", || {
816+
let llmod_id = CodegenUnit::build_cgu_name(tcx,
817+
LOCAL_CRATE,
818+
&["crate"],
819+
Some("allocator")).as_str()
820+
.to_string();
821+
let (llcx, llmod) = unsafe {
822+
context::create_context_and_module(tcx.sess, &llmod_id)
823+
};
824+
let modules = ModuleLlvm {
825+
llmod,
826+
llcx,
827+
tm: create_target_machine(tcx.sess, false),
828+
};
829+
time(tcx.sess, "write allocator module", || {
830+
unsafe {
823831
allocator::codegen(tcx, &modules, kind)
824-
});
832+
}
833+
});
825834

826-
Some(ModuleCodegen {
827-
name: link::ALLOCATOR_MODULE_NAME.to_string(),
828-
llmod_id: llmod_id.to_string(),
829-
source: ModuleSource::Codegened(modules),
830-
kind: ModuleKind::Allocator,
831-
})
832-
}
835+
Some(ModuleCodegen {
836+
name: llmod_id,
837+
source: ModuleSource::Codegened(modules),
838+
kind: ModuleKind::Allocator,
839+
})
833840
} else {
834841
None
835842
};
@@ -872,21 +879,10 @@ pub fn codegen_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
872879
// succeed it means that none of the dependencies has changed
873880
// and we can safely re-use.
874881
if let Some(dep_node_index) = tcx.dep_graph.try_mark_green(tcx, dep_node) {
875-
// Append ".rs" to LLVM module identifier.
876-
//
877-
// LLVM code generator emits a ".file filename" directive
878-
// for ELF backends. Value of the "filename" is set as the
879-
// LLVM module identifier. Due to a LLVM MC bug[1], LLVM
880-
// crashes if the module identifier is same as other symbols
881-
// such as a function name in the module.
882-
// 1. http://llvm.org/bugs/show_bug.cgi?id=11479
883-
let llmod_id = format!("{}.rs", cgu.name());
884-
885882
let module = ModuleCodegen {
886883
name: cgu.name().to_string(),
887884
source: ModuleSource::Preexisting(buf),
888885
kind: ModuleKind::Regular,
889-
llmod_id,
890886
};
891887
tcx.dep_graph.mark_loaded_from_cache(dep_node_index, true);
892888
write::submit_codegened_module_to_llvm(tcx, module, 0);
@@ -1195,21 +1191,8 @@ fn compile_codegen_unit<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
11951191
{
11961192
let cgu_name = cgu.name().to_string();
11971193

1198-
// Append ".rs" to LLVM module identifier.
1199-
//
1200-
// LLVM code generator emits a ".file filename" directive
1201-
// for ELF backends. Value of the "filename" is set as the
1202-
// LLVM module identifier. Due to a LLVM MC bug[1], LLVM
1203-
// crashes if the module identifier is same as other symbols
1204-
// such as a function name in the module.
1205-
// 1. http://llvm.org/bugs/show_bug.cgi?id=11479
1206-
let llmod_id = format!("{}-{}.rs",
1207-
cgu.name(),
1208-
tcx.crate_disambiguator(LOCAL_CRATE)
1209-
.to_fingerprint().to_hex());
1210-
12111194
// Instantiate monomorphizations without filling out definitions yet...
1212-
let cx = CodegenCx::new(tcx, cgu, &llmod_id);
1195+
let cx = CodegenCx::new(tcx, cgu);
12131196
let module = {
12141197
let mono_items = cx.codegen_unit
12151198
.items_in_deterministic_order(cx.tcx);
@@ -1267,7 +1250,6 @@ fn compile_codegen_unit<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
12671250
name: cgu_name,
12681251
source: ModuleSource::Codegened(llvm_module),
12691252
kind: ModuleKind::Regular,
1270-
llmod_id,
12711253
}
12721254
};
12731255

src/librustc_codegen_llvm/context.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -214,8 +214,7 @@ pub unsafe fn create_context_and_module(sess: &Session, mod_name: &str) -> (Cont
214214

215215
impl<'a, 'tcx> CodegenCx<'a, 'tcx> {
216216
pub fn new(tcx: TyCtxt<'a, 'tcx, 'tcx>,
217-
codegen_unit: Arc<CodegenUnit<'tcx>>,
218-
llmod_id: &str)
217+
codegen_unit: Arc<CodegenUnit<'tcx>>)
219218
-> CodegenCx<'a, 'tcx> {
220219
// An interesting part of Windows which MSVC forces our hand on (and
221220
// apparently MinGW didn't) is the usage of `dllimport` and `dllexport`
@@ -268,7 +267,7 @@ impl<'a, 'tcx> CodegenCx<'a, 'tcx> {
268267

269268
unsafe {
270269
let (llcx, llmod) = create_context_and_module(&tcx.sess,
271-
&llmod_id[..]);
270+
&codegen_unit.name().as_str());
272271

273272
let dbg_cx = if tcx.sess.opts.debuginfo != NoDebugInfo {
274273
let dctx = debuginfo::CrateDebugContext::new(llmod);

src/librustc_codegen_llvm/lib.rs

+1-3
Original file line numberDiff line numberDiff line change
@@ -257,8 +257,8 @@ struct ModuleCodegen {
257257
/// unique amongst **all** crates. Therefore, it should contain
258258
/// something unique to this crate (e.g., a module path) as well
259259
/// as the crate name and disambiguator.
260+
/// We currently generate these names via CodegenUnit::build_cgu_name().
260261
name: String,
261-
llmod_id: String,
262262
source: ModuleSource,
263263
kind: ModuleKind,
264264
}
@@ -305,7 +305,6 @@ impl ModuleCodegen {
305305
};
306306

307307
CompiledModule {
308-
llmod_id: self.llmod_id,
309308
name: self.name.clone(),
310309
kind: self.kind,
311310
pre_existing,
@@ -319,7 +318,6 @@ impl ModuleCodegen {
319318
#[derive(Debug)]
320319
struct CompiledModule {
321320
name: String,
322-
llmod_id: String,
323321
kind: ModuleKind,
324322
pre_existing: bool,
325323
object: Option<PathBuf>,

0 commit comments

Comments
 (0)