Skip to content

Commit 3d5753f

Browse files
committed
Auto merge of #52422 - michaelwoerister:revert-52266, r=oli-obk
Revert #52266 Reverts #52266 until the performance issues with that PR are ironed out.
2 parents 1fa76a4 + d992090 commit 3d5753f

File tree

25 files changed

+171
-457
lines changed

25 files changed

+171
-457
lines changed

src/librustc/mir/mono.rs

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

11-
use hir::def_id::{DefId, CrateNum};
11+
use hir::def_id::DefId;
1212
use syntax::ast::NodeId;
13-
use syntax::symbol::{Symbol, InternedString};
13+
use syntax::symbol::InternedString;
1414
use ty::{Instance, TyCtxt};
1515
use util::nodemap::FxHashMap;
1616
use rustc_data_structures::base_n;
1717
use rustc_data_structures::stable_hasher::{HashStable, StableHasherResult,
1818
StableHasher};
1919
use ich::{Fingerprint, StableHashingContext, NodeIdHashingMode};
20-
use std::fmt;
2120
use std::hash::Hash;
2221

2322
#[derive(PartialEq, Eq, Clone, Copy, Debug, Hash)]
@@ -174,80 +173,6 @@ impl<'tcx> CodegenUnit<'tcx> {
174173
self.size_estimate = Some(size_estimate + delta);
175174
}
176175
}
177-
178-
/// CGU names should fulfill the following requirements:
179-
/// - They should be able to act as a file name on any kind of file system
180-
/// - They should not collide with other CGU names, even for different versions
181-
/// of the same crate.
182-
///
183-
/// Consequently, we don't use special characters except for '.' and '-' and we
184-
/// prefix each name with the crate-name and crate-disambiguator.
185-
///
186-
/// This function will build CGU names of the form:
187-
///
188-
/// ```
189-
/// <crate-name>.<crate-disambiguator>(-<component>)*[.<special-suffix>]
190-
/// ```
191-
///
192-
/// The '.' before `<special-suffix>` makes sure that names with a special
193-
/// suffix can never collide with a name built out of regular Rust
194-
/// identifiers (e.g. module paths).
195-
pub fn build_cgu_name<I, C, S>(tcx: TyCtxt,
196-
cnum: CrateNum,
197-
components: I,
198-
special_suffix: Option<S>)
199-
-> InternedString
200-
where I: IntoIterator<Item=C>,
201-
C: fmt::Display,
202-
S: fmt::Display,
203-
{
204-
let cgu_name = CodegenUnit::build_cgu_name_no_mangle(tcx,
205-
cnum,
206-
components,
207-
special_suffix);
208-
209-
if tcx.sess.opts.debugging_opts.human_readable_cgu_names {
210-
cgu_name
211-
} else {
212-
let cgu_name = &cgu_name.as_str()[..];
213-
Symbol::intern(&CodegenUnit::mangle_name(cgu_name)).as_interned_str()
214-
}
215-
}
216-
217-
/// Same as `CodegenUnit::build_cgu_name()` but will never mangle the
218-
/// resulting name.
219-
pub fn build_cgu_name_no_mangle<I, C, S>(tcx: TyCtxt,
220-
cnum: CrateNum,
221-
components: I,
222-
special_suffix: Option<S>)
223-
-> InternedString
224-
where I: IntoIterator<Item=C>,
225-
C: fmt::Display,
226-
S: fmt::Display,
227-
{
228-
use std::fmt::Write;
229-
230-
let mut cgu_name = String::with_capacity(64);
231-
232-
// Start out with the crate name and disambiguator
233-
write!(cgu_name,
234-
"{}.{}",
235-
tcx.crate_name(cnum),
236-
tcx.crate_disambiguator(cnum)).unwrap();
237-
238-
// Add the components
239-
for component in components {
240-
write!(cgu_name, "-{}", component).unwrap();
241-
}
242-
243-
if let Some(special_suffix) = special_suffix {
244-
// We add a dot in here so it cannot clash with anything in a regular
245-
// Rust identifier
246-
write!(cgu_name, ".{}", special_suffix).unwrap();
247-
}
248-
249-
Symbol::intern(&cgu_name[..]).as_interned_str()
250-
}
251176
}
252177

253178
impl<'a, 'tcx> HashStable<StableHashingContext<'a>> for CodegenUnit<'tcx> {

src/librustc/session/mod.rs

-9
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ use util::nodemap::{FxHashMap, FxHashSet};
2626
use util::common::{duration_to_secs_str, ErrorReported};
2727
use util::common::ProfileQueriesMsg;
2828

29-
use rustc_data_structures::base_n;
3029
use rustc_data_structures::sync::{self, Lrc, Lock, LockCell, OneThread, Once, RwLock};
3130

3231
use syntax::ast::NodeId;
@@ -1186,14 +1185,6 @@ impl CrateDisambiguator {
11861185
}
11871186
}
11881187

1189-
impl fmt::Display for CrateDisambiguator {
1190-
fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
1191-
let (a, b) = self.0.as_value();
1192-
let as_u128 = a as u128 | ((b as u128) << 64);
1193-
f.write_str(&base_n::encode(as_u128, base_n::CASE_INSENSITIVE))
1194-
}
1195-
}
1196-
11971188
impl From<Fingerprint> for CrateDisambiguator {
11981189
fn from(fingerprint: Fingerprint) -> CrateDisambiguator {
11991190
CrateDisambiguator(fingerprint)

src/librustc_codegen_llvm/back/link.rs

+7
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,13 @@ 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+
4855
pub use rustc_codegen_utils::link::{find_crate_name, filename_for_input, default_output_for_target,
4956
invalid_output_for_target, build_link_meta, out_filename,
5057
check_file_is_writeable};

src/librustc_codegen_llvm/back/lto.rs

+9-142
Original file line numberDiff line numberDiff line change
@@ -20,23 +20,16 @@ use rustc::hir::def_id::LOCAL_CRATE;
2020
use rustc::middle::exported_symbols::SymbolExportLevel;
2121
use rustc::session::config::{self, Lto};
2222
use rustc::util::common::time_ext;
23-
use rustc_data_structures::fx::FxHashMap;
2423
use time_graph::Timeline;
2524
use {ModuleCodegen, ModuleLlvm, ModuleKind, ModuleSource};
2625

2726
use libc;
2827

29-
use std::ffi::{CString, CStr};
30-
use std::fs::File;
31-
use std::io;
32-
use std::mem;
33-
use std::path::Path;
28+
use std::ffi::CString;
3429
use std::ptr;
3530
use std::slice;
3631
use std::sync::Arc;
3732

38-
pub const THIN_LTO_IMPORTS_INCR_COMP_FILE_NAME: &str = "thin-lto-imports.bin";
39-
4033
pub fn crate_type_allows_lto(crate_type: config::CrateType) -> bool {
4134
match crate_type {
4235
config::CrateTypeExecutable |
@@ -200,7 +193,7 @@ pub(crate) fn run(cgcx: &CodegenContext,
200193
}
201194
Lto::Thin |
202195
Lto::ThinLocal => {
203-
thin_lto(cgcx, &diag_handler, modules, upstream_modules, &arr, timeline)
196+
thin_lto(&diag_handler, modules, upstream_modules, &arr, timeline)
204197
}
205198
Lto::No => unreachable!(),
206199
}
@@ -238,7 +231,7 @@ fn fat_lto(cgcx: &CodegenContext,
238231
.expect("must be codegen'ing at least one module");
239232
let module = modules.remove(costliest_module);
240233
let llmod = module.llvm().expect("can't lto pre-codegened modules").llmod;
241-
info!("using {:?} as a base module", module.name);
234+
info!("using {:?} as a base module", module.llmod_id);
242235

243236
// For all other modules we codegened we'll need to link them into our own
244237
// bitcode. All modules were codegened in their own LLVM context, however,
@@ -248,7 +241,7 @@ fn fat_lto(cgcx: &CodegenContext,
248241
for module in modules {
249242
let llvm = module.llvm().expect("can't lto pre-codegened modules");
250243
let buffer = ModuleBuffer::new(llvm.llmod);
251-
let llmod_id = CString::new(&module.name[..]).unwrap();
244+
let llmod_id = CString::new(&module.llmod_id[..]).unwrap();
252245
serialized_modules.push((SerializedModule::Local(buffer), llmod_id));
253246
}
254247

@@ -353,8 +346,7 @@ impl Drop for Linker {
353346
/// calculating the *index* for ThinLTO. This index will then be shared amongst
354347
/// all of the `LtoModuleCodegen` units returned below and destroyed once
355348
/// they all go out of scope.
356-
fn thin_lto(cgcx: &CodegenContext,
357-
diag_handler: &Handler,
349+
fn thin_lto(diag_handler: &Handler,
358350
modules: Vec<ModuleCodegen>,
359351
serialized_modules: Vec<(SerializedModule, CString)>,
360352
symbol_white_list: &[*const libc::c_char],
@@ -376,9 +368,9 @@ fn thin_lto(cgcx: &CodegenContext,
376368
// the most expensive portion of this small bit of global
377369
// analysis!
378370
for (i, module) in modules.iter().enumerate() {
379-
info!("local module: {} - {}", i, module.name);
371+
info!("local module: {} - {}", i, module.llmod_id);
380372
let llvm = module.llvm().expect("can't lto precodegened module");
381-
let name = CString::new(module.name.clone()).unwrap();
373+
let name = CString::new(module.llmod_id.clone()).unwrap();
382374
let buffer = ThinBuffer::new(llvm.llmod);
383375
thin_modules.push(llvm::ThinLTOModule {
384376
identifier: name.as_ptr(),
@@ -387,7 +379,7 @@ fn thin_lto(cgcx: &CodegenContext,
387379
});
388380
thin_buffers.push(buffer);
389381
module_names.push(name);
390-
timeline.record(&module.name);
382+
timeline.record(&module.llmod_id);
391383
}
392384

393385
// FIXME: All upstream crates are deserialized internally in the
@@ -432,18 +424,6 @@ fn thin_lto(cgcx: &CodegenContext,
432424
let msg = format!("failed to prepare thin LTO context");
433425
return Err(write::llvm_err(&diag_handler, msg))
434426
}
435-
436-
// Save the ThinLTO import information for incremental compilation.
437-
if let Some(ref incr_comp_session_dir) = cgcx.incr_comp_session_dir {
438-
let path = incr_comp_session_dir.join(THIN_LTO_IMPORTS_INCR_COMP_FILE_NAME);
439-
let imports = ThinLTOImports::from_thin_lto_data(data);
440-
if let Err(err) = imports.save_to_file(&path) {
441-
let msg = format!("Error while writing ThinLTO import data: {}",
442-
err);
443-
return Err(write::llvm_err(&diag_handler, msg));
444-
}
445-
}
446-
447427
let data = ThinData(data);
448428
info!("thin LTO data created");
449429
timeline.record("data");
@@ -676,6 +656,7 @@ impl ThinModule {
676656
llcx,
677657
tm,
678658
}),
659+
llmod_id: self.name().to_string(),
679660
name: self.name().to_string(),
680661
kind: ModuleKind::Regular,
681662
};
@@ -795,117 +776,3 @@ impl ThinModule {
795776
Ok(module)
796777
}
797778
}
798-
799-
800-
#[derive(Debug)]
801-
pub struct ThinLTOImports {
802-
// key = llvm name of importing module, value = list of modules it imports from
803-
imports: FxHashMap<String, Vec<String>>,
804-
}
805-
806-
impl ThinLTOImports {
807-
808-
pub fn new() -> ThinLTOImports {
809-
ThinLTOImports {
810-
imports: FxHashMap(),
811-
}
812-
}
813-
814-
/// Load the ThinLTO import map from ThinLTOData.
815-
unsafe fn from_thin_lto_data(data: *const llvm::ThinLTOData) -> ThinLTOImports {
816-
817-
fn module_name_to_str(c_str: &CStr) -> &str {
818-
match c_str.to_str() {
819-
Ok(s) => s,
820-
Err(e) => {
821-
bug!("Encountered non-utf8 LLVM module name `{}`: {}",
822-
c_str.to_string_lossy(),
823-
e)
824-
}
825-
}
826-
}
827-
828-
unsafe extern "C" fn imported_module_callback(payload: *mut libc::c_void,
829-
importing_module_name: *const libc::c_char,
830-
imported_module_name: *const libc::c_char) {
831-
let map = &mut* (payload as *mut ThinLTOImports);
832-
833-
let importing_module_name = CStr::from_ptr(importing_module_name);
834-
let importing_module_name = module_name_to_str(&importing_module_name);
835-
let imported_module_name = CStr::from_ptr(imported_module_name);
836-
let imported_module_name = module_name_to_str(&imported_module_name);
837-
838-
if !map.imports.contains_key(importing_module_name) {
839-
map.imports.insert(importing_module_name.to_owned(), vec![]);
840-
}
841-
842-
map.imports
843-
.get_mut(importing_module_name)
844-
.unwrap()
845-
.push(imported_module_name.to_owned());
846-
}
847-
848-
let mut map = ThinLTOImports {
849-
imports: FxHashMap(),
850-
};
851-
852-
llvm::LLVMRustGetThinLTOModuleImports(data,
853-
imported_module_callback,
854-
&mut map as *mut _ as *mut libc::c_void);
855-
map
856-
}
857-
858-
pub fn save_to_file(&self, path: &Path) -> io::Result<()> {
859-
use std::io::Write;
860-
861-
let file = File::create(path)?;
862-
let mut writer = io::BufWriter::new(file);
863-
864-
for (importing_module_name, imported_modules) in &self.imports {
865-
writeln!(writer, "{}", importing_module_name)?;
866-
867-
for imported_module in imported_modules {
868-
writeln!(writer, " {}", imported_module)?;
869-
}
870-
871-
writeln!(writer)?;
872-
}
873-
874-
Ok(())
875-
}
876-
877-
pub fn load_from_file(path: &Path) -> io::Result<ThinLTOImports> {
878-
use std::io::BufRead;
879-
880-
let mut imports = FxHashMap();
881-
let mut current_module = None;
882-
let mut current_imports = vec![];
883-
884-
let file = File::open(path)?;
885-
886-
for line in io::BufReader::new(file).lines() {
887-
let line = line?;
888-
889-
if line.is_empty() {
890-
let importing_module = current_module
891-
.take()
892-
.expect("Importing module not set");
893-
894-
imports.insert(importing_module,
895-
mem::replace(&mut current_imports, vec![]));
896-
} else if line.starts_with(" ") {
897-
// This is an imported module
898-
assert_ne!(current_module, None);
899-
current_imports.push(line.trim().to_string());
900-
} else {
901-
// This is the beginning of a new module
902-
assert_eq!(current_module, None);
903-
current_module = Some(line.trim().to_string());
904-
}
905-
}
906-
907-
Ok(ThinLTOImports {
908-
imports
909-
})
910-
}
911-
}

src/librustc_codegen_llvm/back/write.rs

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

695695
if config.emit_bc_compressed {
696696
let dst = bc_out.with_extension(RLIB_BYTECODE_EXTENSION);
697-
let data = bytecode::encode(&module.name, data);
697+
let data = bytecode::encode(&module.llmod_id, data);
698698
if let Err(e) = fs::write(&dst, data) {
699699
diag_handler.err(&format!("failed to write bytecode: {}", e));
700700
}
@@ -1306,6 +1306,7 @@ fn execute_work_item(cgcx: &CodegenContext,
13061306
assert_eq!(bytecode_compressed.is_some(), config.emit_bc_compressed);
13071307

13081308
Ok(WorkItemResult::Compiled(CompiledModule {
1309+
llmod_id: module.llmod_id.clone(),
13091310
name: module_name,
13101311
kind: ModuleKind::Regular,
13111312
pre_existing: true,

0 commit comments

Comments
 (0)