From b719578f48c06047aea5f5b307ec1e3affb8f4ff Mon Sep 17 00:00:00 2001 From: Simonas Kazlauskas Date: Thu, 4 Jan 2018 22:19:23 +0200 Subject: [PATCH] Use name-discarding LLVM context This is only applicable when neither of --emit=llvm-ir or --emit=llvm-bc are not requested. In case either of these outputs are wanted, but the benefits of such context are desired as well, -Zfewer_names option provides the same functionality regardless of the outputs requested. --- src/librustc/session/config.rs | 6 ++++++ src/librustc/session/mod.rs | 9 ++++++++- src/librustc_llvm/ffi.rs | 2 +- src/librustc_trans/back/lto.rs | 2 +- src/librustc_trans/back/write.rs | 2 ++ src/librustc_trans/context.rs | 2 +- src/rustllvm/RustWrapper.cpp | 8 +++++++- src/rustllvm/rustllvm.h | 2 +- 8 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/librustc/session/config.rs b/src/librustc/session/config.rs index 6ad9bd94bf25c..05b1d584e9c4e 100644 --- a/src/librustc/session/config.rs +++ b/src/librustc/session/config.rs @@ -1082,6 +1082,8 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options, "gather borrowck statistics"), no_landing_pads: bool = (false, parse_bool, [TRACKED], "omit landing pads for unwinding"), + fewer_names: bool = (false, parse_bool, [TRACKED], + "reduce memory use by retaining fewer names within compilation artifacts (LLVM-IR)"), debug_llvm: bool = (false, parse_bool, [UNTRACKED], "enable debug output from LLVM"), meta_stats: bool = (false, parse_bool, [UNTRACKED], @@ -2811,6 +2813,10 @@ mod tests { opts.debugging_opts.no_landing_pads = true; assert!(reference.dep_tracking_hash() != opts.dep_tracking_hash()); + opts = reference.clone(); + opts.debugging_opts.fewer_names = true; + assert!(reference.dep_tracking_hash() != opts.dep_tracking_hash()); + opts = reference.clone(); opts.debugging_opts.no_trans = true; assert!(reference.dep_tracking_hash() != opts.dep_tracking_hash()); diff --git a/src/librustc/session/mod.rs b/src/librustc/session/mod.rs index 54bcc64d0685d..9e09a5d8fbe5e 100644 --- a/src/librustc/session/mod.rs +++ b/src/librustc/session/mod.rs @@ -18,7 +18,7 @@ use lint; use middle::allocator::AllocatorKind; use middle::dependency_format; use session::search_paths::PathKind; -use session::config::{BorrowckMode, DebugInfoLevel}; +use session::config::{BorrowckMode, DebugInfoLevel, OutputType}; use ty::tls; use util::nodemap::{FxHashMap, FxHashSet}; use util::common::{duration_to_secs_str, ErrorReported}; @@ -504,6 +504,13 @@ impl Session { pub fn linker_flavor(&self) -> LinkerFlavor { self.opts.debugging_opts.linker_flavor.unwrap_or(self.target.target.linker_flavor) } + + pub fn fewer_names(&self) -> bool { + let more_names = self.opts.output_types.contains_key(&OutputType::LlvmAssembly) || + self.opts.output_types.contains_key(&OutputType::Bitcode); + self.opts.debugging_opts.fewer_names || !more_names + } + pub fn no_landing_pads(&self) -> bool { self.opts.debugging_opts.no_landing_pads || self.panic_strategy() == PanicStrategy::Abort } diff --git a/src/librustc_llvm/ffi.rs b/src/librustc_llvm/ffi.rs index 7d65349446516..274a0d7cca8f0 100644 --- a/src/librustc_llvm/ffi.rs +++ b/src/librustc_llvm/ffi.rs @@ -514,7 +514,7 @@ pub enum ModuleBuffer {} #[link(name = "rustllvm", kind = "static")] extern "C" { // Create and destroy contexts. - pub fn LLVMContextCreate() -> ContextRef; + pub fn LLVMRustContextCreate(shouldDiscardNames: bool) -> ContextRef; pub fn LLVMContextDispose(C: ContextRef); pub fn LLVMGetMDKindIDInContext(C: ContextRef, Name: *const c_char, SLen: c_uint) -> c_uint; diff --git a/src/librustc_trans/back/lto.rs b/src/librustc_trans/back/lto.rs index 298716840926a..60b24a578c6b0 100644 --- a/src/librustc_trans/back/lto.rs +++ b/src/librustc_trans/back/lto.rs @@ -607,7 +607,7 @@ impl ThinModule { // into that context. One day, however, we may do this for upstream // crates but for locally translated modules we may be able to reuse // that LLVM Context and Module. - let llcx = llvm::LLVMContextCreate(); + let llcx = llvm::LLVMRustContextCreate(cgcx.fewer_names); let llmod = llvm::LLVMRustParseBitcodeForThinLTO( llcx, self.data().as_ptr(), diff --git a/src/librustc_trans/back/write.rs b/src/librustc_trans/back/write.rs index d8e95cd2cf2e0..4d1bcd9bf467d 100644 --- a/src/librustc_trans/back/write.rs +++ b/src/librustc_trans/back/write.rs @@ -323,6 +323,7 @@ pub struct CodegenContext { pub thinlto: bool, pub no_landing_pads: bool, pub save_temps: bool, + pub fewer_names: bool, pub exported_symbols: Arc, pub opts: Arc, pub crate_types: Vec, @@ -1407,6 +1408,7 @@ fn start_executing_work(tcx: TyCtxt, unsafe { llvm::LLVMRustThinLTOAvailable() }, no_landing_pads: sess.no_landing_pads(), + fewer_names: sess.fewer_names(), save_temps: sess.opts.cg.save_temps, opts: Arc::new(sess.opts.clone()), time_passes: sess.time_passes(), diff --git a/src/librustc_trans/context.rs b/src/librustc_trans/context.rs index d5e71062f74d7..248b37c43b42e 100644 --- a/src/librustc_trans/context.rs +++ b/src/librustc_trans/context.rs @@ -197,7 +197,7 @@ pub fn is_pie_binary(sess: &Session) -> bool { } pub unsafe fn create_context_and_module(sess: &Session, mod_name: &str) -> (ContextRef, ModuleRef) { - let llcx = llvm::LLVMContextCreate(); + let llcx = llvm::LLVMRustContextCreate(sess.fewer_names()); let mod_name = CString::new(mod_name).unwrap(); let llmod = llvm::LLVMModuleCreateWithNameInContext(mod_name.as_ptr(), llcx); diff --git a/src/rustllvm/RustWrapper.cpp b/src/rustllvm/RustWrapper.cpp index 6f51ea67cb1d1..1ebbd73e6feb8 100644 --- a/src/rustllvm/RustWrapper.cpp +++ b/src/rustllvm/RustWrapper.cpp @@ -76,11 +76,17 @@ extern "C" char *LLVMRustGetLastError(void) { return Ret; } -void LLVMRustSetLastError(const char *Err) { +extern "C" void LLVMRustSetLastError(const char *Err) { free((void *)LastError); LastError = strdup(Err); } +extern "C" LLVMContextRef LLVMRustContextCreate(bool shouldDiscardNames) { + auto ctx = new LLVMContext(); + ctx->setDiscardValueNames(shouldDiscardNames); + return wrap(ctx); +} + extern "C" void LLVMRustSetNormalizedTarget(LLVMModuleRef M, const char *Triple) { unwrap(M)->setTargetTriple(Triple::normalize(Triple)); diff --git a/src/rustllvm/rustllvm.h b/src/rustllvm/rustllvm.h index 8c2f855c226ba..714173f86020d 100644 --- a/src/rustllvm/rustllvm.h +++ b/src/rustllvm/rustllvm.h @@ -71,7 +71,7 @@ #include "llvm/IR/IRPrintingPasses.h" #include "llvm/Linker/Linker.h" -void LLVMRustSetLastError(const char *); +extern "C" void LLVMRustSetLastError(const char *); enum class LLVMRustResult { Success, Failure };