Skip to content

Commit

Permalink
[Clang][Driver] Add new flags to control IR verification (#68172)
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
mizvekov committed Oct 4, 2023
1 parent 4ee8c67 commit 6da382d
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 2 deletions.
7 changes: 7 additions & 0 deletions clang/docs/ReleaseNotes.rst
Expand Up @@ -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
-------------------------
Expand Down
6 changes: 6 additions & 0 deletions clang/include/clang/Driver/Options.td
Expand Up @@ -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]>;
Expand Down
6 changes: 4 additions & 2 deletions clang/lib/Driver/ToolChains/Clang.cpp
Expand Up @@ -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,
Expand Down
5 changes: 5 additions & 0 deletions clang/test/Driver/clang_f_opts.c
Expand Up @@ -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"
Expand Down

0 comments on commit 6da382d

Please sign in to comment.