diff options
| author | bors <bors@rust-lang.org> | 2018-07-11 12:12:13 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2018-07-11 12:12:13 +0000 |
| commit | 11432ba98043ee0ade961bdedb4b785bf06c086e (patch) | |
| tree | fa90a01c30de78430012adcf37f54c2d55ea5462 | |
| parent | 989fa053895a27fd40896335224b619843b7e58a (diff) | |
| parent | 3f18a41333aabf515d6d343c07f3bbbd154f6018 (diff) | |
| download | rust-11432ba98043ee0ade961bdedb4b785bf06c086e.tar.gz rust-11432ba98043ee0ade961bdedb4b785bf06c086e.zip | |
Auto merge of #51230 - nikic:no-verify-lto, r=pnkfelix
Disable LLVM verification by default Currently -Z no-verify only controls IR verification prior to LLVM codegen, while verification is performed unconditionally both before and after linking with (Thin)LTO. Also wondering what the sentiment is on disabling verification by default (and e.g. only enabling it on ALT builds with assertions). This does not seem terribly useful outside of rustc development and it does seem to show up in profiles (at something like 3%). **EDIT:** A table showing the various configurations and what is enabled when. | Configuration | Dynamic verification performed | LLVM static assertions compiled in | | --- | --- | --- | | alt builds | | yes | | nightly builds | | no | | stable builds | | no | | CI builds | | | | dev builds in a checkout | | |
| -rw-r--r-- | config.toml.example | 3 | ||||
| -rw-r--r-- | src/bootstrap/bin/rustc.rs | 4 | ||||
| -rw-r--r-- | src/bootstrap/builder.rs | 4 | ||||
| -rw-r--r-- | src/bootstrap/config.rs | 3 | ||||
| -rw-r--r-- | src/librustc/session/config.rs | 6 | ||||
| -rw-r--r-- | src/librustc/session/mod.rs | 4 | ||||
| -rw-r--r-- | src/librustc_codegen_llvm/back/lto.rs | 17 | ||||
| -rw-r--r-- | src/librustc_codegen_llvm/back/write.rs | 8 |
8 files changed, 34 insertions, 15 deletions
diff --git a/config.toml.example b/config.toml.example index 0578f929224..99073416334 100644 --- a/config.toml.example +++ b/config.toml.example @@ -360,6 +360,9 @@ # Print backtrace on internal compiler errors during bootstrap #backtrace-on-ice = false +# Whether to verify generated LLVM IR +#verify-llvm-ir = false + # ============================================================================= # Options for specific targets # diff --git a/src/bootstrap/bin/rustc.rs b/src/bootstrap/bin/rustc.rs index 4607ca5cf9f..e81595a8c62 100644 --- a/src/bootstrap/bin/rustc.rs +++ b/src/bootstrap/bin/rustc.rs @@ -283,6 +283,10 @@ fn main() { cmd.arg("--cfg").arg("parallel_queries"); } + if env::var_os("RUSTC_VERIFY_LLVM_IR").is_some() { + cmd.arg("-Z").arg("verify-llvm-ir"); + } + let color = match env::var("RUSTC_COLOR") { Ok(s) => usize::from_str(&s).expect("RUSTC_COLOR should be an integer"), Err(_) => 0, diff --git a/src/bootstrap/builder.rs b/src/bootstrap/builder.rs index fad0a553802..6c3a476d084 100644 --- a/src/bootstrap/builder.rs +++ b/src/bootstrap/builder.rs @@ -922,6 +922,10 @@ impl<'a> Builder<'a> { cargo.env("RUSTC_BACKTRACE_ON_ICE", "1"); } + if self.config.rust_verify_llvm_ir { + cargo.env("RUSTC_VERIFY_LLVM_IR", "1"); + } + cargo.env("RUSTC_VERBOSE", format!("{}", self.verbosity)); // in std, we want to avoid denying warnings for stage 0 as that makes cfg's painful. diff --git a/src/bootstrap/config.rs b/src/bootstrap/config.rs index b3ed10257bd..420ae1f349c 100644 --- a/src/bootstrap/config.rs +++ b/src/bootstrap/config.rs @@ -105,6 +105,7 @@ pub struct Config { pub rust_dist_src: bool, pub rust_codegen_backends: Vec<Interned<String>>, pub rust_codegen_backends_dir: String, + pub rust_verify_llvm_ir: bool, pub build: Interned<String>, pub hosts: Vec<Interned<String>>, @@ -312,6 +313,7 @@ struct Rust { llvm_tools: Option<bool>, deny_warnings: Option<bool>, backtrace_on_ice: Option<bool>, + verify_llvm_ir: Option<bool>, } /// TOML representation of how each build target is configured. @@ -543,6 +545,7 @@ impl Config { config.save_toolstates = rust.save_toolstates.clone().map(PathBuf::from); set(&mut config.deny_warnings, rust.deny_warnings.or(flags.warnings)); set(&mut config.backtrace_on_ice, rust.backtrace_on_ice); + set(&mut config.rust_verify_llvm_ir, rust.verify_llvm_ir); if let Some(ref backends) = rust.codegen_backends { config.rust_codegen_backends = backends.iter() diff --git a/src/librustc/session/config.rs b/src/librustc/session/config.rs index 9810e8bf34f..55752141e30 100644 --- a/src/librustc/session/config.rs +++ b/src/librustc/session/config.rs @@ -1151,8 +1151,8 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options, "gather codegen statistics"), asm_comments: bool = (false, parse_bool, [TRACKED], "generate comments into the assembly (may change behavior)"), - no_verify: bool = (false, parse_bool, [TRACKED], - "skip LLVM verification"), + verify_llvm_ir: bool = (false, parse_bool, [TRACKED], + "verify LLVM IR"), borrowck_stats: bool = (false, parse_bool, [UNTRACKED], "gather borrowck statistics"), no_landing_pads: bool = (false, parse_bool, [TRACKED], @@ -3114,7 +3114,7 @@ mod tests { assert!(reference.dep_tracking_hash() != opts.dep_tracking_hash()); opts = reference.clone(); - opts.debugging_opts.no_verify = true; + opts.debugging_opts.verify_llvm_ir = true; assert!(reference.dep_tracking_hash() != opts.dep_tracking_hash()); opts = reference.clone(); diff --git a/src/librustc/session/mod.rs b/src/librustc/session/mod.rs index 180c5867e93..ad1df0a1348 100644 --- a/src/librustc/session/mod.rs +++ b/src/librustc/session/mod.rs @@ -516,8 +516,8 @@ impl Session { pub fn asm_comments(&self) -> bool { self.opts.debugging_opts.asm_comments } - pub fn no_verify(&self) -> bool { - self.opts.debugging_opts.no_verify + pub fn verify_llvm_ir(&self) -> bool { + self.opts.debugging_opts.verify_llvm_ir } pub fn borrowck_stats(&self) -> bool { self.opts.debugging_opts.borrowck_stats diff --git a/src/librustc_codegen_llvm/back/lto.rs b/src/librustc_codegen_llvm/back/lto.rs index 96eda50d788..a33f8b569d0 100644 --- a/src/librustc_codegen_llvm/back/lto.rs +++ b/src/librustc_codegen_llvm/back/lto.rs @@ -461,9 +461,12 @@ fn run_pass_manager(cgcx: &CodegenContext, unsafe { let pm = llvm::LLVMCreatePassManager(); llvm::LLVMRustAddAnalysisPasses(tm, pm, llmod); - let pass = llvm::LLVMRustFindAndCreatePass("verify\0".as_ptr() as *const _); - assert!(!pass.is_null()); - llvm::LLVMRustAddPass(pm, pass); + + if config.verify_llvm_ir { + let pass = llvm::LLVMRustFindAndCreatePass("verify\0".as_ptr() as *const _); + assert!(!pass.is_null()); + llvm::LLVMRustAddPass(pm, pass); + } // When optimizing for LTO we don't actually pass in `-O0`, but we force // it to always happen at least with `-O1`. @@ -494,9 +497,11 @@ fn run_pass_manager(cgcx: &CodegenContext, } }); - let pass = llvm::LLVMRustFindAndCreatePass("verify\0".as_ptr() as *const _); - assert!(!pass.is_null()); - llvm::LLVMRustAddPass(pm, pass); + if config.verify_llvm_ir { + let pass = llvm::LLVMRustFindAndCreatePass("verify\0".as_ptr() as *const _); + assert!(!pass.is_null()); + llvm::LLVMRustAddPass(pm, pass); + } time_ext(cgcx.time_passes, None, "LTO passes", || llvm::LLVMRunPassManager(pm, llmod)); diff --git a/src/librustc_codegen_llvm/back/write.rs b/src/librustc_codegen_llvm/back/write.rs index 42b772b8a5d..5382bbafcf4 100644 --- a/src/librustc_codegen_llvm/back/write.rs +++ b/src/librustc_codegen_llvm/back/write.rs @@ -232,7 +232,7 @@ pub struct ModuleConfig { emit_obj: bool, // Miscellaneous flags. These are mostly copied from command-line // options. - no_verify: bool, + pub verify_llvm_ir: bool, no_prepopulate_passes: bool, no_builtins: bool, time_passes: bool, @@ -271,7 +271,7 @@ impl ModuleConfig { embed_bitcode_marker: false, no_integrated_as: false, - no_verify: false, + verify_llvm_ir: false, no_prepopulate_passes: false, no_builtins: false, time_passes: false, @@ -283,7 +283,7 @@ impl ModuleConfig { } fn set_flags(&mut self, sess: &Session, no_builtins: bool) { - self.no_verify = sess.no_verify(); + self.verify_llvm_ir = sess.verify_llvm_ir(); self.no_prepopulate_passes = sess.opts.cg.no_prepopulate_passes; self.no_builtins = no_builtins || sess.target.target.options.no_builtins; self.time_passes = sess.time_passes(); @@ -542,7 +542,7 @@ unsafe fn optimize(cgcx: &CodegenContext, true }; - if !config.no_verify { assert!(addpass("verify")); } + if config.verify_llvm_ir { assert!(addpass("verify")); } if !config.no_prepopulate_passes { llvm::LLVMRustAddAnalysisPasses(tm, fpm, llmod); llvm::LLVMRustAddAnalysisPasses(tm, mpm, llmod); |
