Rollup merge of #128970 - DianQK:lint-llvm-ir, r=nikic
Add `-Zlint-llvm-ir` This flag is similar to `-Zverify-llvm-ir` and allows us to lint the generated IR. r? compiler
This commit is contained in:
commit
d5c40d03dc
@ -571,6 +571,7 @@ pub(crate) unsafe fn llvm_optimize(
|
||||
cgcx.opts.cg.linker_plugin_lto.enabled(),
|
||||
config.no_prepopulate_passes,
|
||||
config.verify_llvm_ir,
|
||||
config.lint_llvm_ir,
|
||||
using_thin_buffers,
|
||||
config.merge_functions,
|
||||
unroll_loops,
|
||||
|
@ -2225,6 +2225,7 @@ pub fn LLVMRustOptimize<'a>(
|
||||
IsLinkerPluginLTO: bool,
|
||||
NoPrepopulatePasses: bool,
|
||||
VerifyIR: bool,
|
||||
LintIR: bool,
|
||||
UseThinLTOBuffers: bool,
|
||||
MergeFunctions: bool,
|
||||
UnrollLoops: bool,
|
||||
|
@ -112,6 +112,7 @@ pub struct ModuleConfig {
|
||||
// Miscellaneous flags. These are mostly copied from command-line
|
||||
// options.
|
||||
pub verify_llvm_ir: bool,
|
||||
pub lint_llvm_ir: bool,
|
||||
pub no_prepopulate_passes: bool,
|
||||
pub no_builtins: bool,
|
||||
pub time_module: bool,
|
||||
@ -237,6 +238,7 @@ macro_rules! if_regular {
|
||||
bc_cmdline: sess.target.bitcode_llvm_cmdline.to_string(),
|
||||
|
||||
verify_llvm_ir: sess.verify_llvm_ir(),
|
||||
lint_llvm_ir: sess.opts.unstable_opts.lint_llvm_ir,
|
||||
no_prepopulate_passes: sess.opts.cg.no_prepopulate_passes,
|
||||
no_builtins: no_builtins || sess.target.no_builtins,
|
||||
|
||||
|
@ -795,6 +795,7 @@ macro_rules! tracked {
|
||||
tracked!(instrument_xray, Some(InstrumentXRay::default()));
|
||||
tracked!(link_directives, false);
|
||||
tracked!(link_only, true);
|
||||
tracked!(lint_llvm_ir, true);
|
||||
tracked!(llvm_module_flag, vec![("bar".to_string(), 123, "max".to_string())]);
|
||||
tracked!(llvm_plugins, vec![String::from("plugin_name")]);
|
||||
tracked!(location_detail, LocationDetail { file: true, line: false, column: false });
|
||||
|
@ -713,7 +713,7 @@ extern "C" LLVMRustResult LLVMRustOptimize(
|
||||
LLVMModuleRef ModuleRef, LLVMTargetMachineRef TMRef,
|
||||
LLVMRustPassBuilderOptLevel OptLevelRust, LLVMRustOptStage OptStage,
|
||||
bool IsLinkerPluginLTO, bool NoPrepopulatePasses, bool VerifyIR,
|
||||
bool UseThinLTOBuffers, bool MergeFunctions, bool UnrollLoops,
|
||||
bool LintIR, bool UseThinLTOBuffers, bool MergeFunctions, bool UnrollLoops,
|
||||
bool SLPVectorize, bool LoopVectorize, bool DisableSimplifyLibCalls,
|
||||
bool EmitLifetimeMarkers, LLVMRustSanitizerOptions *SanitizerOptions,
|
||||
const char *PGOGenPath, const char *PGOUsePath, bool InstrumentCoverage,
|
||||
@ -842,6 +842,13 @@ extern "C" LLVMRustResult LLVMRustOptimize(
|
||||
});
|
||||
}
|
||||
|
||||
if (LintIR) {
|
||||
PipelineStartEPCallbacks.push_back(
|
||||
[](ModulePassManager &MPM, OptimizationLevel Level) {
|
||||
MPM.addPass(createModuleToFunctionPassAdaptor(LintPass()));
|
||||
});
|
||||
}
|
||||
|
||||
if (InstrumentGCOV) {
|
||||
PipelineStartEPCallbacks.push_back(
|
||||
[](ModulePassManager &MPM, OptimizationLevel Level) {
|
||||
|
@ -1811,6 +1811,8 @@ pub(crate) fn parse_wasm_c_abi(slot: &mut WasmCAbi, v: Option<&str>) -> bool {
|
||||
"link the `.rlink` file generated by `-Z no-link` (default: no)"),
|
||||
linker_features: LinkerFeaturesCli = (LinkerFeaturesCli::default(), parse_linker_features, [UNTRACKED],
|
||||
"a comma-separated list of linker features to enable (+) or disable (-): `lld`"),
|
||||
lint_llvm_ir: bool = (false, parse_bool, [TRACKED],
|
||||
"lint LLVM IR (default: no)"),
|
||||
lint_mir: bool = (false, parse_bool, [UNTRACKED],
|
||||
"lint MIR before and after each transformation"),
|
||||
llvm_module_flag: Vec<(String, u32, String)> = (Vec::new(), parse_llvm_module_flag, [TRACKED],
|
||||
|
7
src/doc/unstable-book/src/compiler-flags/lint-llvm-ir.md
Normal file
7
src/doc/unstable-book/src/compiler-flags/lint-llvm-ir.md
Normal file
@ -0,0 +1,7 @@
|
||||
# `lint-llvm-ir`
|
||||
|
||||
---------------------
|
||||
|
||||
This flag will add `LintPass` to the start of the pipeline.
|
||||
You can use it to check for common errors in the LLVM IR generated by `rustc`.
|
||||
You can add `-Cllvm-args=-lint-abort-on-error` to abort the process if errors were found.
|
@ -1,7 +1,7 @@
|
||||
// ignore-tidy-linelength
|
||||
//@ revisions:aarch64 loongarch64 powerpc64 sparc64 x86_64
|
||||
// FIXME: Add `-Cllvm-args=--lint-abort-on-error` after LLVM 19
|
||||
//@ compile-flags: -O -C no-prepopulate-passes -C passes=lint
|
||||
//@ min-llvm-version: 19
|
||||
//@ compile-flags: -O -Cno-prepopulate-passes -Zlint-llvm-ir -Cllvm-args=-lint-abort-on-error
|
||||
|
||||
//@[aarch64] compile-flags: --target aarch64-unknown-linux-gnu
|
||||
//@[aarch64] needs-llvm-components: arm
|
||||
|
@ -1,5 +1,6 @@
|
||||
//@ revisions: linux apple
|
||||
//@ compile-flags: -C opt-level=0 -C no-prepopulate-passes -C passes=lint
|
||||
//@ min-llvm-version: 19
|
||||
//@ compile-flags: -Copt-level=0 -Cno-prepopulate-passes -Zlint-llvm-ir -Cllvm-args=-lint-abort-on-error
|
||||
|
||||
//@[linux] compile-flags: --target x86_64-unknown-linux-gnu
|
||||
//@[linux] needs-llvm-components: x86
|
||||
|
Loading…
Reference in New Issue
Block a user