[Clang][Driver] Add new flags to control IR verification (#68172)

Enables or disables verification of the generated LLVM IR.

Users can pass this to turn on extra verification to catch certain types of
compiler bugs at the cost of extra compile time.
This commit is contained in:
Matheus Izvekov 2023-10-05 00:50:30 +02:00 committed by GitHub
parent 4ee8c676ee
commit 6da382d27b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 22 additions and 2 deletions

View File

@ -146,6 +146,13 @@ Non-comprehensive list of changes in this release
New Compiler Flags
------------------
* ``-fverify-intermediate-code`` and its complement ``-fno-verify-intermediate-code``.
Enables or disables verification of the generated LLVM IR.
Users can pass this to turn on extra verification to catch certain types of
compiler bugs at the cost of extra compile time.
Since enabling the verifier adds a non-trivial cost of a few percent impact on
build times, it's disabled by default, unless your LLVM distribution itself is
compiled with runtime checks enabled.
Deprecated Compiler Flags
-------------------------

View File

@ -1909,6 +1909,12 @@ defm safe_buffer_usage_suggestions : BoolFOption<"safe-buffer-usage-suggestions"
PosFlag<SetTrue, [], [ClangOption, CC1Option],
"Display suggestions to update code associated with -Wunsafe-buffer-usage warnings">,
NegFlag<SetFalse>>;
def fverify_intermediate_code : Flag<["-"], "fverify-intermediate-code">,
Group<f_clang_Group>, Visibility<[ClangOption, CLOption, DXCOption]>,
HelpText<"Enable verification of LLVM IR">, Flags<[NoXarchOption]>;
def fno_verify_intermediate_code : Flag<["-"], "fno-verify-intermediate-code">,
Group<f_clang_Group>, Visibility<[ClangOption, CLOption, DXCOption]>,
HelpText<"Disable verification of LLVM IR">, Flags<[NoXarchOption]>;
def fdiscard_value_names : Flag<["-"], "fdiscard-value-names">,
Group<f_clang_Group>, Visibility<[ClangOption, DXCOption]>,
HelpText<"Discard value names in LLVM IR">, Flags<[NoXarchOption]>;

View File

@ -5150,9 +5150,11 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
const bool IsAssertBuild = true;
#endif
// Disable the verification pass in -asserts builds.
if (!IsAssertBuild)
// Disable the verification pass in asserts builds unless otherwise specified.
if (Args.hasFlag(options::OPT_fno_verify_intermediate_code,
options::OPT_fverify_intermediate_code, !IsAssertBuild)) {
CmdArgs.push_back("-disable-llvm-verifier");
}
// Discard value names in assert builds unless otherwise specified.
if (Args.hasFlag(options::OPT_fdiscard_value_names,

View File

@ -520,6 +520,11 @@
// CHECK-COVERAGE-COMPILATION-DIR: "-fcoverage-compilation-dir=."
// CHECK-COVERAGE-COMPILATION-DIR-NOT: "-ffile-compilation-dir=."
// RUN: %clang -### -S -fverify-intermediate-code %s 2>&1 | FileCheck -check-prefix=CHECK-VERIFY-INTERMEDIATE-CODE %s
// RUN: %clang -### -S -fno-verify-intermediate-code %s 2>&1 | FileCheck -check-prefix=CHECK-NO-VERIFY-INTERMEDIATE-CODE %s
// CHECK-VERIFY-INTERMEDIATE-CODE-NOT: "-disable-llvm-verifier"
// CHECK-NO-VERIFY-INTERMEDIATE-CODE: "-disable-llvm-verifier"
// RUN: %clang -### -S -fdiscard-value-names %s 2>&1 | FileCheck -check-prefix=CHECK-DISCARD-NAMES %s
// RUN: %clang -### -S -fno-discard-value-names %s 2>&1 | FileCheck -check-prefix=CHECK-NO-DISCARD-NAMES %s
// CHECK-DISCARD-NAMES: "-discard-value-names"