diff options
| author | ljedrz <ljedrz@gmail.com> | 2018-10-08 16:55:04 +0200 |
|---|---|---|
| committer | ljedrz <ljedrz@gmail.com> | 2018-10-08 16:55:04 +0200 |
| commit | cd41765851fd3b531a1dd8bcb6fcc4ad3e3b750e (patch) | |
| tree | d184002e3e4f2c79578d4e52deb4233ba96d3d61 /src/librustc_codegen_llvm | |
| parent | 61f47737b503d6af656ed48eea2a03ba35547b61 (diff) | |
| download | rust-cd41765851fd3b531a1dd8bcb6fcc4ad3e3b750e.tar.gz rust-cd41765851fd3b531a1dd8bcb6fcc4ad3e3b750e.zip | |
codegen_llvm: improve allocations
Diffstat (limited to 'src/librustc_codegen_llvm')
| -rw-r--r-- | src/librustc_codegen_llvm/allocator.rs | 2 | ||||
| -rw-r--r-- | src/librustc_codegen_llvm/attributes.rs | 16 | ||||
| -rw-r--r-- | src/librustc_codegen_llvm/base.rs | 17 | ||||
| -rw-r--r-- | src/librustc_codegen_llvm/llvm_util.rs | 5 |
4 files changed, 26 insertions, 14 deletions
diff --git a/src/librustc_codegen_llvm/allocator.rs b/src/librustc_codegen_llvm/allocator.rs index 0beb8a8844c..7c237407c8f 100644 --- a/src/librustc_codegen_llvm/allocator.rs +++ b/src/librustc_codegen_llvm/allocator.rs @@ -33,7 +33,7 @@ pub(crate) unsafe fn codegen(tcx: TyCtxt, mods: &ModuleLlvm, kind: AllocatorKind let void = llvm::LLVMVoidTypeInContext(llcx); for method in ALLOCATOR_METHODS { - let mut args = Vec::new(); + let mut args = Vec::with_capacity(method.inputs.len()); for ty in method.inputs.iter() { match *ty { AllocatorTy::Layout => { diff --git a/src/librustc_codegen_llvm/attributes.rs b/src/librustc_codegen_llvm/attributes.rs index 51380db5b23..89fe6911041 100644 --- a/src/librustc_codegen_llvm/attributes.rs +++ b/src/librustc_codegen_llvm/attributes.rs @@ -280,12 +280,14 @@ pub fn provide_extern(providers: &mut Providers) { // `NativeLibrary` internally contains information about // `#[link(wasm_import_module = "...")]` for example. let native_libs = tcx.native_libraries(cnum); - let mut def_id_to_native_lib = FxHashMap(); - for lib in native_libs.iter() { + + let def_id_to_native_lib = native_libs.iter().filter_map(|lib| if let Some(id) = lib.foreign_module { - def_id_to_native_lib.insert(id, lib); + Some((id, lib)) + } else { + None } - } + ).collect::<FxHashMap<_, _>>(); let mut ret = FxHashMap(); for lib in tcx.foreign_modules(cnum).iter() { @@ -296,10 +298,10 @@ pub fn provide_extern(providers: &mut Providers) { Some(s) => s, None => continue, }; - for id in lib.foreign_items.iter() { + ret.extend(lib.foreign_items.iter().map(|id| { assert_eq!(id.krate, cnum); - ret.insert(*id, module.to_string()); - } + (*id, module.to_string()) + })); } Lrc::new(ret) diff --git a/src/librustc_codegen_llvm/base.rs b/src/librustc_codegen_llvm/base.rs index 6acf884214a..a86865bdec4 100644 --- a/src/librustc_codegen_llvm/base.rs +++ b/src/librustc_codegen_llvm/base.rs @@ -1122,7 +1122,15 @@ impl CrateInfo { info.load_wasm_imports(tcx, LOCAL_CRATE); } - for &cnum in tcx.crates().iter() { + let crates = tcx.crates(); + + let n_crates = crates.len(); + info.native_libraries.reserve(n_crates); + info.crate_name.reserve(n_crates); + info.used_crate_source.reserve(n_crates); + info.missing_lang_items.reserve(n_crates); + + for &cnum in crates.iter() { info.native_libraries.insert(cnum, tcx.native_libraries(cnum)); info.crate_name.insert(cnum, tcx.crate_name(cnum).to_string()); info.used_crate_source.insert(cnum, tcx.used_crate_source(cnum)); @@ -1164,11 +1172,12 @@ impl CrateInfo { } fn load_wasm_imports(&mut self, tcx: TyCtxt, cnum: CrateNum) { - for (&id, module) in tcx.wasm_import_module_map(cnum).iter() { + self.wasm_imports.extend(tcx.wasm_import_module_map(cnum).iter().map(|(&id, module)| { let instance = Instance::mono(tcx, id); let import_name = tcx.symbol_name(instance); - self.wasm_imports.insert(import_name.to_string(), module.clone()); - } + + (import_name.to_string(), module.clone()) + })); } } diff --git a/src/librustc_codegen_llvm/llvm_util.rs b/src/librustc_codegen_llvm/llvm_util.rs index 9e8ff204703..8456cf2f480 100644 --- a/src/librustc_codegen_llvm/llvm_util.rs +++ b/src/librustc_codegen_llvm/llvm_util.rs @@ -52,8 +52,9 @@ fn require_inited() { } unsafe fn configure_llvm(sess: &Session) { - let mut llvm_c_strs = Vec::new(); - let mut llvm_args = Vec::new(); + let n_args = sess.opts.cg.llvm_args.len(); + let mut llvm_c_strs = Vec::with_capacity(n_args + 1); + let mut llvm_args = Vec::with_capacity(n_args + 1); { let mut add = |arg: &str| { |
