mirror of
https://github.com/rust-lang/rust.git
synced 2025-01-25 14:13:38 +00:00
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.
This commit is contained in:
parent
a32a9e4544
commit
334ef6246d
@ -1082,6 +1082,8 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options,
|
|||||||
"gather borrowck statistics"),
|
"gather borrowck statistics"),
|
||||||
no_landing_pads: bool = (false, parse_bool, [TRACKED],
|
no_landing_pads: bool = (false, parse_bool, [TRACKED],
|
||||||
"omit landing pads for unwinding"),
|
"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],
|
debug_llvm: bool = (false, parse_bool, [UNTRACKED],
|
||||||
"enable debug output from LLVM"),
|
"enable debug output from LLVM"),
|
||||||
meta_stats: bool = (false, parse_bool, [UNTRACKED],
|
meta_stats: bool = (false, parse_bool, [UNTRACKED],
|
||||||
@ -2813,6 +2815,10 @@ mod tests {
|
|||||||
opts.debugging_opts.no_landing_pads = true;
|
opts.debugging_opts.no_landing_pads = true;
|
||||||
assert!(reference.dep_tracking_hash() != opts.dep_tracking_hash());
|
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 = reference.clone();
|
||||||
opts.debugging_opts.no_trans = true;
|
opts.debugging_opts.no_trans = true;
|
||||||
assert!(reference.dep_tracking_hash() != opts.dep_tracking_hash());
|
assert!(reference.dep_tracking_hash() != opts.dep_tracking_hash());
|
||||||
|
@ -18,7 +18,7 @@ use lint;
|
|||||||
use middle::allocator::AllocatorKind;
|
use middle::allocator::AllocatorKind;
|
||||||
use middle::dependency_format;
|
use middle::dependency_format;
|
||||||
use session::search_paths::PathKind;
|
use session::search_paths::PathKind;
|
||||||
use session::config::{BorrowckMode, DebugInfoLevel};
|
use session::config::{BorrowckMode, DebugInfoLevel, OutputType};
|
||||||
use ty::tls;
|
use ty::tls;
|
||||||
use util::nodemap::{FxHashMap, FxHashSet};
|
use util::nodemap::{FxHashMap, FxHashSet};
|
||||||
use util::common::{duration_to_secs_str, ErrorReported};
|
use util::common::{duration_to_secs_str, ErrorReported};
|
||||||
@ -504,6 +504,13 @@ impl Session {
|
|||||||
pub fn linker_flavor(&self) -> LinkerFlavor {
|
pub fn linker_flavor(&self) -> LinkerFlavor {
|
||||||
self.opts.debugging_opts.linker_flavor.unwrap_or(self.target.target.linker_flavor)
|
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 {
|
pub fn no_landing_pads(&self) -> bool {
|
||||||
self.opts.debugging_opts.no_landing_pads || self.panic_strategy() == PanicStrategy::Abort
|
self.opts.debugging_opts.no_landing_pads || self.panic_strategy() == PanicStrategy::Abort
|
||||||
}
|
}
|
||||||
|
@ -514,7 +514,7 @@ pub enum ModuleBuffer {}
|
|||||||
#[link(name = "rustllvm", kind = "static")]
|
#[link(name = "rustllvm", kind = "static")]
|
||||||
extern "C" {
|
extern "C" {
|
||||||
// Create and destroy contexts.
|
// Create and destroy contexts.
|
||||||
pub fn LLVMContextCreate() -> ContextRef;
|
pub fn LLVMRustContextCreate(shouldDiscardNames: bool) -> ContextRef;
|
||||||
pub fn LLVMContextDispose(C: ContextRef);
|
pub fn LLVMContextDispose(C: ContextRef);
|
||||||
pub fn LLVMGetMDKindIDInContext(C: ContextRef, Name: *const c_char, SLen: c_uint) -> c_uint;
|
pub fn LLVMGetMDKindIDInContext(C: ContextRef, Name: *const c_char, SLen: c_uint) -> c_uint;
|
||||||
|
|
||||||
|
@ -607,7 +607,7 @@ impl ThinModule {
|
|||||||
// into that context. One day, however, we may do this for upstream
|
// into that context. One day, however, we may do this for upstream
|
||||||
// crates but for locally translated modules we may be able to reuse
|
// crates but for locally translated modules we may be able to reuse
|
||||||
// that LLVM Context and Module.
|
// that LLVM Context and Module.
|
||||||
let llcx = llvm::LLVMContextCreate();
|
let llcx = llvm::LLVMRustContextCreate(cgcx.fewer_names);
|
||||||
let llmod = llvm::LLVMRustParseBitcodeForThinLTO(
|
let llmod = llvm::LLVMRustParseBitcodeForThinLTO(
|
||||||
llcx,
|
llcx,
|
||||||
self.data().as_ptr(),
|
self.data().as_ptr(),
|
||||||
|
@ -323,6 +323,7 @@ pub struct CodegenContext {
|
|||||||
pub thinlto: bool,
|
pub thinlto: bool,
|
||||||
pub no_landing_pads: bool,
|
pub no_landing_pads: bool,
|
||||||
pub save_temps: bool,
|
pub save_temps: bool,
|
||||||
|
pub fewer_names: bool,
|
||||||
pub exported_symbols: Arc<ExportedSymbols>,
|
pub exported_symbols: Arc<ExportedSymbols>,
|
||||||
pub opts: Arc<config::Options>,
|
pub opts: Arc<config::Options>,
|
||||||
pub crate_types: Vec<config::CrateType>,
|
pub crate_types: Vec<config::CrateType>,
|
||||||
@ -1407,6 +1408,7 @@ fn start_executing_work(tcx: TyCtxt,
|
|||||||
unsafe { llvm::LLVMRustThinLTOAvailable() },
|
unsafe { llvm::LLVMRustThinLTOAvailable() },
|
||||||
|
|
||||||
no_landing_pads: sess.no_landing_pads(),
|
no_landing_pads: sess.no_landing_pads(),
|
||||||
|
fewer_names: sess.fewer_names(),
|
||||||
save_temps: sess.opts.cg.save_temps,
|
save_temps: sess.opts.cg.save_temps,
|
||||||
opts: Arc::new(sess.opts.clone()),
|
opts: Arc::new(sess.opts.clone()),
|
||||||
time_passes: sess.time_passes(),
|
time_passes: sess.time_passes(),
|
||||||
|
@ -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) {
|
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 mod_name = CString::new(mod_name).unwrap();
|
||||||
let llmod = llvm::LLVMModuleCreateWithNameInContext(mod_name.as_ptr(), llcx);
|
let llmod = llvm::LLVMModuleCreateWithNameInContext(mod_name.as_ptr(), llcx);
|
||||||
|
|
||||||
|
@ -76,11 +76,17 @@ extern "C" char *LLVMRustGetLastError(void) {
|
|||||||
return Ret;
|
return Ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void LLVMRustSetLastError(const char *Err) {
|
extern "C" void LLVMRustSetLastError(const char *Err) {
|
||||||
free((void *)LastError);
|
free((void *)LastError);
|
||||||
LastError = strdup(Err);
|
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,
|
extern "C" void LLVMRustSetNormalizedTarget(LLVMModuleRef M,
|
||||||
const char *Triple) {
|
const char *Triple) {
|
||||||
unwrap(M)->setTargetTriple(Triple::normalize(Triple));
|
unwrap(M)->setTargetTriple(Triple::normalize(Triple));
|
||||||
|
@ -71,7 +71,7 @@
|
|||||||
#include "llvm/IR/IRPrintingPasses.h"
|
#include "llvm/IR/IRPrintingPasses.h"
|
||||||
#include "llvm/Linker/Linker.h"
|
#include "llvm/Linker/Linker.h"
|
||||||
|
|
||||||
void LLVMRustSetLastError(const char *);
|
extern "C" void LLVMRustSetLastError(const char *);
|
||||||
|
|
||||||
enum class LLVMRustResult { Success, Failure };
|
enum class LLVMRustResult { Success, Failure };
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user