https://github.com/thurstond updated https://github.com/llvm/llvm-project/pull/138577
>From 1cb28ef0b3313c3fd60667cc7928f0fed8d1838a Mon Sep 17 00:00:00 2001 From: Thurston Dang <thurs...@google.com> Date: Mon, 5 May 2025 20:11:09 +0000 Subject: [PATCH 1/9] [sanitizer] Add plumbing for -fsanitize-add-pseudo-functions and partly replace '-mllvm -array-bounds-pseudofn' Florian1 introduced '-mllvm -array-bounds-pseudofn' (https://github.com/llvm/llvm-project/pull/128977/) to make it easier to see why crashes occurred, and to estimate with a profiler the cycles spent on these array-bounds checks. This functionality could be usefully generalized to other checks in future work. This patch adds the plumbing for -fsanitize-add-pseudo-functions, and connects it to the existing array-bounds-pseudo-fn functionality i.e., -fsanitize-add-pseudo-functions=array-bounds can be used as a replacement for '-mllvm -array-bounds-pseudofn', though we do not yet delete the latter. Note: we replaced '-mllvm -array-bounds-pseudofn' in clang/test/CodeGen/bounds-checking-debuginfo.c, because adding test cases would modify the line numbers in the test assertions, and therefore obscure that the test output is the same between '-mllvm -array-bounds-pseudofn' and -fsanitize-add-pseudo-functions=array-bounds. --- clang/include/clang/Basic/CodeGenOptions.h | 3 + clang/include/clang/Driver/Options.td | 15 +++++ clang/include/clang/Driver/SanitizerArgs.h | 1 + clang/lib/CodeGen/CGExpr.cpp | 2 +- clang/lib/Driver/SanitizerArgs.cpp | 18 +++++- clang/lib/Frontend/CompilerInvocation.cpp | 8 +++ .../test/CodeGen/bounds-checking-debuginfo.c | 4 +- clang/test/Driver/fsanitize.c | 58 +++++++++++++++++++ 8 files changed, 105 insertions(+), 4 deletions(-) diff --git a/clang/include/clang/Basic/CodeGenOptions.h b/clang/include/clang/Basic/CodeGenOptions.h index e39a73bdb13ac..be17c81876ddf 100644 --- a/clang/include/clang/Basic/CodeGenOptions.h +++ b/clang/include/clang/Basic/CodeGenOptions.h @@ -399,6 +399,9 @@ class CodeGenOptions : public CodeGenOptionsBase { /// (0.0 [default] to skip none, 1.0 to skip all). SanitizerMaskCutoffs SanitizeSkipHotCutoffs; + /// Set of sanitizer checks that will be wrapped inside pseudofunctions. + SanitizerSet SanitizeAddPseudoFunctions; + /// List of backend command-line options for -fembed-bitcode. std::vector<uint8_t> CmdArgs; diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 11677626dbf1f..c06bc5cfcbfa8 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -2533,6 +2533,21 @@ def fno_sanitize_merge_handlers : Flag<["-"], "fno-sanitize-merge">, Group<f_cla Alias<fno_sanitize_merge_handlers_EQ>, AliasArgs<["all"]>, Visibility<[ClangOption, CLOption]>, HelpText<"Do not allow compiler to merge handlers for any sanitizers">; +def fsanitize_add_pseudo_functions_EQ + : CommaJoined<["-"], "fsanitize-add-pseudo-functions=">, + Group<f_clang_Group>, + HelpText<"Add pseudo-functions to checks for specified sanitizers">; +def fno_sanitize_add_pseudo_functions_EQ + : CommaJoined<["-"], "fno-sanitize-add-pseudo-functions=">, + Group<f_clang_Group>, + HelpText<"Do not allow compiler to add pseudo-functions to checks for specified sanitizers">; +def fsanitize_add_pseudo_functions : Flag<["-"], "fsanitize-add-pseudo-functions">, Group<f_clang_Group>, + Alias<fsanitize_add_pseudo_functions_EQ>, AliasArgs<["all"]>, + HelpText<"Allow compiler to add pseudo-functions to checks for all sanitizers">; +def fno_sanitize_add_pseudo_functions : Flag<["-"], "fno-sanitize-add-pseudo-functions">, Group<f_clang_Group>, + Alias<fno_sanitize_add_pseudo_functions_EQ>, AliasArgs<["all"]>, + Visibility<[ClangOption, CLOption]>, + HelpText<"Do not allow compiler to add pseudo-functions to checks for any sanitizers">; def fsanitize_undefined_trap_on_error : Flag<["-"], "fsanitize-undefined-trap-on-error">, Group<f_clang_Group>, Alias<fsanitize_trap_EQ>, AliasArgs<["undefined"]>; diff --git a/clang/include/clang/Driver/SanitizerArgs.h b/clang/include/clang/Driver/SanitizerArgs.h index 528e3b400f3dc..1c11706639aba 100644 --- a/clang/include/clang/Driver/SanitizerArgs.h +++ b/clang/include/clang/Driver/SanitizerArgs.h @@ -27,6 +27,7 @@ class SanitizerArgs { SanitizerSet TrapSanitizers; SanitizerSet MergeHandlers; SanitizerMaskCutoffs SkipHotCutoffs; + SanitizerSet AddPseudoFunctions; std::vector<std::string> UserIgnorelistFiles; std::vector<std::string> SystemIgnorelistFiles; diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index 2e01adc51fdf0..4ea41662af296 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -1228,7 +1228,7 @@ void CodeGenFunction::EmitBoundsCheckImpl(const Expr *E, llvm::Value *Bound, SanitizerScope SanScope(this); llvm::DILocation *CheckDI = Builder.getCurrentDebugLocation(); - if (ClArrayBoundsPseudoFn && CheckDI) { + if ((ClArrayBoundsPseudoFn || CGM.getCodeGenOpts().SanitizeAddPseudoFunctions.has(SanitizerKind::SO_ArrayBounds)) && CheckDI) { CheckDI = getDebugInfo()->CreateSyntheticInlineAt( Builder.getCurrentDebugLocation(), "__ubsan_check_array_bounds"); } diff --git a/clang/lib/Driver/SanitizerArgs.cpp b/clang/lib/Driver/SanitizerArgs.cpp index ff08bffdbde1f..fd456ea0674af 100644 --- a/clang/lib/Driver/SanitizerArgs.cpp +++ b/clang/lib/Driver/SanitizerArgs.cpp @@ -76,6 +76,7 @@ static const SanitizerMask MergeDefault = SanitizerKind::Undefined | SanitizerKind::Vptr; static const SanitizerMask TrappingDefault = SanitizerKind::CFI | SanitizerKind::LocalBounds; +static const SanitizerMask AddPseudoFunctionsDefault; static const SanitizerMask CFIClasses = SanitizerKind::CFIVCall | SanitizerKind::CFINVCall | SanitizerKind::CFIMFCall | SanitizerKind::CFIDerivedCast | @@ -738,6 +739,13 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC, // Parse -fno-sanitize-top-hot flags SkipHotCutoffs = parseSanitizeSkipHotCutoffArgs(D, Args, DiagnoseErrors); + // Parse -f(no-)?sanitize-add-pseudo-functions flags + SanitizerMask AddPseudoFunctionsKinds = + parseSanitizeArgs(D, Args, DiagnoseErrors, AddPseudoFunctionsDefault, {}, {}, + options::OPT_fsanitize_add_pseudo_functions_EQ, + options::OPT_fno_sanitize_add_pseudo_functions_EQ); + AddPseudoFunctionsKinds &= Kinds; + // Setup ignorelist files. // Add default ignorelist from resource directory for activated sanitizers, // and validate special case lists format. @@ -1157,6 +1165,8 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC, MergeHandlers.Mask |= MergeKinds; + AddPseudoFunctions.Mask |= AddPseudoFunctionsKinds; + // Zero out SkipHotCutoffs for unused sanitizers SkipHotCutoffs.clear(~Sanitizers.Mask); } @@ -1335,6 +1345,10 @@ void SanitizerArgs::addArgs(const ToolChain &TC, const llvm::opt::ArgList &Args, CmdArgs.push_back( Args.MakeArgString("-fsanitize-skip-hot-cutoff=" + SkipHotCutoffsStr)); + if (!AddPseudoFunctions.empty()) + CmdArgs.push_back( + Args.MakeArgString("-fsanitize-add-pseudo-functions=" + toString(AddPseudoFunctions))); + addSpecialCaseListOpt(Args, CmdArgs, "-fsanitize-ignorelist=", UserIgnorelistFiles); addSpecialCaseListOpt(Args, CmdArgs, @@ -1518,7 +1532,9 @@ SanitizerMask parseArgValues(const Driver &D, const llvm::opt::Arg *A, A->getOption().matches(options::OPT_fsanitize_trap_EQ) || A->getOption().matches(options::OPT_fno_sanitize_trap_EQ) || A->getOption().matches(options::OPT_fsanitize_merge_handlers_EQ) || - A->getOption().matches(options::OPT_fno_sanitize_merge_handlers_EQ)) && + A->getOption().matches(options::OPT_fno_sanitize_merge_handlers_EQ) || + A->getOption().matches(options::OPT_fsanitize_add_pseudo_functions_EQ) || + A->getOption().matches(options::OPT_fno_sanitize_add_pseudo_functions_EQ)) && "Invalid argument in parseArgValues!"); SanitizerMask Kinds; for (int i = 0, n = A->getNumValues(); i != n; ++i) { diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index c7d11e6027ccf..d79b0546d41ce 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -1838,6 +1838,10 @@ void CompilerInvocationBase::GenerateCodeGenArgs(const CodeGenOptions &Opts, for (std::string Sanitizer : Values) GenerateArg(Consumer, OPT_fsanitize_skip_hot_cutoff_EQ, Sanitizer); + for (StringRef Sanitizer : + serializeSanitizerKinds(Opts.SanitizeAddPseudoFunctions)) + GenerateArg(Consumer, OPT_fsanitize_add_pseudo_functions_EQ, Sanitizer); + if (!Opts.EmitVersionIdentMetadata) GenerateArg(Consumer, OPT_Qn); @@ -2332,6 +2336,10 @@ bool CompilerInvocation::ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, "-fsanitize-skip-hot-cutoff=", Args.getAllArgValues(OPT_fsanitize_skip_hot_cutoff_EQ), Diags); + parseSanitizerKinds("-fsanitize-add-pseudo-functions=", + Args.getAllArgValues(OPT_fsanitize_add_pseudo_functions_EQ), + Diags, Opts.SanitizeAddPseudoFunctions); + Opts.EmitVersionIdentMetadata = Args.hasFlag(OPT_Qy, OPT_Qn, true); if (!LangOpts->CUDAIsDevice) diff --git a/clang/test/CodeGen/bounds-checking-debuginfo.c b/clang/test/CodeGen/bounds-checking-debuginfo.c index 4f5ba2b76eeeb..f31a40d86dac4 100644 --- a/clang/test/CodeGen/bounds-checking-debuginfo.c +++ b/clang/test/CodeGen/bounds-checking-debuginfo.c @@ -1,7 +1,7 @@ // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5 -// RUN: %clang_cc1 -mllvm -array-bounds-pseudofn -emit-llvm -fdebug-prefix-map=%S/= -fno-ident -fdebug-compilation-dir=%S -fsanitize=array-bounds -fsanitize-trap=array-bounds -triple x86_64 -debug-info-kind=limited %s -o - | FileCheck --check-prefix=CHECK-TRAP %s -// RUN: %clang_cc1 -mllvm -array-bounds-pseudofn -emit-llvm -fdebug-prefix-map=%S/= -fno-ident -fdebug-compilation-dir=%S -fsanitize=array-bounds -triple x86_64 -debug-info-kind=limited %s -o - | FileCheck --check-prefix=CHECK-NOTRAP %s +// RUN: %clang_cc1 -emit-llvm -fdebug-prefix-map=%S/= -fno-ident -fdebug-compilation-dir=%S -fsanitize=array-bounds -fsanitize-trap=array-bounds -fsanitize-add-pseudo-functions=array-bounds -triple x86_64 -debug-info-kind=limited %s -o - | FileCheck --check-prefix=CHECK-TRAP %s +// RUN: %clang_cc1 -emit-llvm -fdebug-prefix-map=%S/= -fno-ident -fdebug-compilation-dir=%S -fsanitize=array-bounds -fsanitize-add-pseudo-functions=array-bounds -triple x86_64 -debug-info-kind=limited %s -o - | FileCheck --check-prefix=CHECK-NOTRAP %s int f(); void d(double*); diff --git a/clang/test/Driver/fsanitize.c b/clang/test/Driver/fsanitize.c index eb72140fb1315..ca58d4a50bc79 100644 --- a/clang/test/Driver/fsanitize.c +++ b/clang/test/Driver/fsanitize.c @@ -1,3 +1,5 @@ +// * Test -fsanitize-trap */ + // RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-TRAP // RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-trap=signed-integer-overflow %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-TRAP2 // RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-undefined-trap-on-error %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-TRAP @@ -9,6 +11,9 @@ // CHECK-UNDEFINED-TRAP: "-fsanitize-trap=alignment,array-bounds,bool,builtin,enum,float-cast-overflow,function,integer-divide-by-zero,nonnull-attribute,null,pointer-overflow,return,returns-nonnull-attribute,shift-base,shift-exponent,signed-integer-overflow,unreachable,vla-bound" // CHECK-UNDEFINED-TRAP2: "-fsanitize-trap=alignment,array-bounds,bool,builtin,enum,float-cast-overflow,function,integer-divide-by-zero,nonnull-attribute,null,pointer-overflow,return,returns-nonnull-attribute,shift-base,shift-exponent,unreachable,vla-bound" + +// * Test -fsanitize-merge * + // The trailing -fsanitize-merge takes precedence // RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-MERGE // RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-merge %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-MERGE @@ -62,6 +67,59 @@ // RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-merge=signed-integer-overflow -fno-sanitize-merge=undefined -fsanitize-merge=alignment,null %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-MERGE5 // CHECK-UNDEFINED-MERGE5: "-fsanitize-merge=alignment,null" + +// * Test -fsanitize-add-pseudo-functions * + +// The trailing -fsanitize-add-pseudo-functions takes precedence +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-add-pseudo-functions %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-add-pseudo-functions=undefined %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-add-pseudo-functions -fsanitize-add-pseudo-functions %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-add-pseudo-functions -fsanitize-add-pseudo-functions=undefined %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-add-pseudo-functions=undefined -fsanitize-add-pseudo-functions %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-add-pseudo-functions=undefined -fsanitize-add-pseudo-functions=undefined %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-add-pseudo-functions=signed-integer-overflow -fsanitize-add-pseudo-functions %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-add-pseudo-functions=bool -fsanitize-add-pseudo-functions=undefined %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-add-pseudo-functions=undefined -fsanitize-add-pseudo-functions=bool %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO +// CHECK-UNDEFINED-PSEUDO: "-fsanitize-add-pseudo-functions=alignment,array-bounds,bool,builtin,enum,float-cast-overflow,function,integer-divide-by-zero,nonnull-attribute,null,pointer-overflow,return,returns-nonnull-attribute,shift-base,shift-exponent,signed-integer-overflow,unreachable,vla-bound" + +// The trailing arguments (-fsanitize-add-pseudo-functions -fno-sanitize-add-pseudo-functions=signed-integer-overflow) take precedence +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-add-pseudo-functions -fno-sanitize-add-pseudo-functions=signed-integer-overflow %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO2 +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-add-pseudo-functions=undefined -fno-sanitize-add-pseudo-functions=signed-integer-overflow %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO2 +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-add-pseudo-functions -fsanitize-add-pseudo-functions -fno-sanitize-add-pseudo-functions=signed-integer-overflow %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO2 +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-add-pseudo-functions -fsanitize-add-pseudo-functions=undefined -fno-sanitize-add-pseudo-functions=signed-integer-overflow %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO2 +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-add-pseudo-functions=signed-integer-overflow -fsanitize-add-pseudo-functions -fno-sanitize-add-pseudo-functions=signed-integer-overflow %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO2 +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-add-pseudo-functions=signed-integer-overflow -fsanitize-add-pseudo-functions=undefined -fno-sanitize-add-pseudo-functions=signed-integer-overflow %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO2 +// CHECK-UNDEFINED-PSEUDO2: "-fsanitize-add-pseudo-functions=alignment,array-bounds,bool,builtin,enum,float-cast-overflow,function,integer-divide-by-zero,nonnull-attribute,null,pointer-overflow,return,returns-nonnull-attribute,shift-base,shift-exponent,unreachable,vla-bound" + +// The trailing -fno-sanitize-add-pseudo-functions takes precedence +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-add-pseudo-functions %s -### 2>&1 | not FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO3 +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-add-pseudo-functions=undefined %s -### 2>&1 | not FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO3 +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-add-pseudo-functions -fno-sanitize-add-pseudo-functions=bool %s -### 2>&1 | not FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO3 +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-add-pseudo-functions=undefined -fno-sanitize-add-pseudo-functions=bool %s -### 2>&1 | not FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO3 +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-add-pseudo-functions -fno-sanitize-add-pseudo-functions %s -### 2>&1 | not FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO3 +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-add-pseudo-functions -fno-sanitize-add-pseudo-functions=undefined %s -### 2>&1 | not FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO3 +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-add-pseudo-functions=undefined -fno-sanitize-add-pseudo-functions %s -### 2>&1 | not FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO3 +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-add-pseudo-functions=undefined -fno-sanitize-add-pseudo-functions=undefined %s -### 2>&1 | not FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO3 +// CHECK-UNDEFINED-PSEUDO3: "-fsanitize-add-pseudo-functions" + +// The trailing arguments (-fsanitize-add-pseudo-functions -fno-sanitize-add-pseudo-functions=alignment,null) take precedence +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-add-pseudo-functions -fno-sanitize-add-pseudo-functions=alignment,null %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO4 +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-add-pseudo-functions=undefined -fno-sanitize-add-pseudo-functions=alignment,null %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO4 +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-add-pseudo-functions -fsanitize-add-pseudo-functions -fno-sanitize-add-pseudo-functions=alignment,null %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO4 +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-add-pseudo-functions -fsanitize-add-pseudo-functions=undefined -fno-sanitize-add-pseudo-functions=alignment,null %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO4 +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-add-pseudo-functions=signed-integer-overflow -fsanitize-add-pseudo-functions -fno-sanitize-add-pseudo-functions=alignment,null %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO4 +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-add-pseudo-functions=signed-integer-overflow -fsanitize-add-pseudo-functions=undefined -fno-sanitize-add-pseudo-functions=alignment,null %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO4 +// CHECK-UNDEFINED-PSEUDO4: "-fsanitize-add-pseudo-functions=array-bounds,bool,builtin,enum,float-cast-overflow,function,integer-divide-by-zero,nonnull-attribute,pointer-overflow,return,returns-nonnull-attribute,shift-base,shift-exponent,signed-integer-overflow,unreachable,vla-bound" + +// The trailing arguments (-fno-sanitize-add-pseudo-functions -fsanitize-add-pseudo-functions=alignment,null) take precedence +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-add-pseudo-functions=undefined -fsanitize-add-pseudo-functions=alignment,null %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO5 +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-add-pseudo-functions -fno-sanitize-add-pseudo-functions -fsanitize-add-pseudo-functions=alignment,null %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO5 +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-add-pseudo-functions -fno-sanitize-add-pseudo-functions=undefined -fsanitize-add-pseudo-functions=alignment,null %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO5 +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-add-pseudo-functions=signed-integer-overflow -fno-sanitize-add-pseudo-functions -fsanitize-add-pseudo-functions=alignment,null %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO5 +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-add-pseudo-functions=signed-integer-overflow -fno-sanitize-add-pseudo-functions=undefined -fsanitize-add-pseudo-functions=alignment,null %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO5 +// CHECK-UNDEFINED-PSEUDO5: "-fsanitize-add-pseudo-functions=alignment,null" + + // RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED // CHECK-UNDEFINED: "-fsanitize={{((signed-integer-overflow|integer-divide-by-zero|function|shift-base|shift-exponent|unreachable|return|vla-bound|alignment|null|pointer-overflow|float-cast-overflow|array-bounds|enum|bool|builtin|returns-nonnull-attribute|nonnull-attribute),?){18}"}} >From 959cbe0e989bda99914fb4c16e229ecdfc692403 Mon Sep 17 00:00:00 2001 From: Thurston Dang <thurs...@google.com> Date: Mon, 5 May 2025 20:28:39 +0000 Subject: [PATCH 2/9] clang-format --- clang/include/clang/Driver/Options.td | 25 +++++++++++++++-------- clang/lib/CodeGen/CGExpr.cpp | 5 ++++- clang/lib/Driver/SanitizerArgs.cpp | 11 +++++----- clang/lib/Frontend/CompilerInvocation.cpp | 7 ++++--- 4 files changed, 31 insertions(+), 17 deletions(-) diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index c06bc5cfcbfa8..e559a772494fe 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -2540,14 +2540,23 @@ def fsanitize_add_pseudo_functions_EQ def fno_sanitize_add_pseudo_functions_EQ : CommaJoined<["-"], "fno-sanitize-add-pseudo-functions=">, Group<f_clang_Group>, - HelpText<"Do not allow compiler to add pseudo-functions to checks for specified sanitizers">; -def fsanitize_add_pseudo_functions : Flag<["-"], "fsanitize-add-pseudo-functions">, Group<f_clang_Group>, - Alias<fsanitize_add_pseudo_functions_EQ>, AliasArgs<["all"]>, - HelpText<"Allow compiler to add pseudo-functions to checks for all sanitizers">; -def fno_sanitize_add_pseudo_functions : Flag<["-"], "fno-sanitize-add-pseudo-functions">, Group<f_clang_Group>, - Alias<fno_sanitize_add_pseudo_functions_EQ>, AliasArgs<["all"]>, - Visibility<[ClangOption, CLOption]>, - HelpText<"Do not allow compiler to add pseudo-functions to checks for any sanitizers">; + HelpText<"Do not allow compiler to add pseudo-functions to checks for " + "specified sanitizers">; +def fsanitize_add_pseudo_functions + : Flag<["-"], "fsanitize-add-pseudo-functions">, + Group<f_clang_Group>, + Alias<fsanitize_add_pseudo_functions_EQ>, + AliasArgs<["all"]>, + HelpText<"Allow compiler to add pseudo-functions to checks for all " + "sanitizers">; +def fno_sanitize_add_pseudo_functions + : Flag<["-"], "fno-sanitize-add-pseudo-functions">, + Group<f_clang_Group>, + Alias<fno_sanitize_add_pseudo_functions_EQ>, + AliasArgs<["all"]>, + Visibility<[ClangOption, CLOption]>, + HelpText<"Do not allow compiler to add pseudo-functions to checks for " + "any sanitizers">; def fsanitize_undefined_trap_on_error : Flag<["-"], "fsanitize-undefined-trap-on-error">, Group<f_clang_Group>, Alias<fsanitize_trap_EQ>, AliasArgs<["undefined"]>; diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index 4ea41662af296..43694dbf4151c 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -1228,7 +1228,10 @@ void CodeGenFunction::EmitBoundsCheckImpl(const Expr *E, llvm::Value *Bound, SanitizerScope SanScope(this); llvm::DILocation *CheckDI = Builder.getCurrentDebugLocation(); - if ((ClArrayBoundsPseudoFn || CGM.getCodeGenOpts().SanitizeAddPseudoFunctions.has(SanitizerKind::SO_ArrayBounds)) && CheckDI) { + if ((ClArrayBoundsPseudoFn || + CGM.getCodeGenOpts().SanitizeAddPseudoFunctions.has( + SanitizerKind::SO_ArrayBounds)) && + CheckDI) { CheckDI = getDebugInfo()->CreateSyntheticInlineAt( Builder.getCurrentDebugLocation(), "__ubsan_check_array_bounds"); } diff --git a/clang/lib/Driver/SanitizerArgs.cpp b/clang/lib/Driver/SanitizerArgs.cpp index fd456ea0674af..453b035385a31 100644 --- a/clang/lib/Driver/SanitizerArgs.cpp +++ b/clang/lib/Driver/SanitizerArgs.cpp @@ -741,8 +741,8 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC, // Parse -f(no-)?sanitize-add-pseudo-functions flags SanitizerMask AddPseudoFunctionsKinds = - parseSanitizeArgs(D, Args, DiagnoseErrors, AddPseudoFunctionsDefault, {}, {}, - options::OPT_fsanitize_add_pseudo_functions_EQ, + parseSanitizeArgs(D, Args, DiagnoseErrors, AddPseudoFunctionsDefault, {}, + {}, options::OPT_fsanitize_add_pseudo_functions_EQ, options::OPT_fno_sanitize_add_pseudo_functions_EQ); AddPseudoFunctionsKinds &= Kinds; @@ -1346,8 +1346,8 @@ void SanitizerArgs::addArgs(const ToolChain &TC, const llvm::opt::ArgList &Args, Args.MakeArgString("-fsanitize-skip-hot-cutoff=" + SkipHotCutoffsStr)); if (!AddPseudoFunctions.empty()) - CmdArgs.push_back( - Args.MakeArgString("-fsanitize-add-pseudo-functions=" + toString(AddPseudoFunctions))); + CmdArgs.push_back(Args.MakeArgString("-fsanitize-add-pseudo-functions=" + + toString(AddPseudoFunctions))); addSpecialCaseListOpt(Args, CmdArgs, "-fsanitize-ignorelist=", UserIgnorelistFiles); @@ -1534,7 +1534,8 @@ SanitizerMask parseArgValues(const Driver &D, const llvm::opt::Arg *A, A->getOption().matches(options::OPT_fsanitize_merge_handlers_EQ) || A->getOption().matches(options::OPT_fno_sanitize_merge_handlers_EQ) || A->getOption().matches(options::OPT_fsanitize_add_pseudo_functions_EQ) || - A->getOption().matches(options::OPT_fno_sanitize_add_pseudo_functions_EQ)) && + A->getOption().matches( + options::OPT_fno_sanitize_add_pseudo_functions_EQ)) && "Invalid argument in parseArgValues!"); SanitizerMask Kinds; for (int i = 0, n = A->getNumValues(); i != n; ++i) { diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index d79b0546d41ce..d1fda794db52f 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -2336,9 +2336,10 @@ bool CompilerInvocation::ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, "-fsanitize-skip-hot-cutoff=", Args.getAllArgValues(OPT_fsanitize_skip_hot_cutoff_EQ), Diags); - parseSanitizerKinds("-fsanitize-add-pseudo-functions=", - Args.getAllArgValues(OPT_fsanitize_add_pseudo_functions_EQ), - Diags, Opts.SanitizeAddPseudoFunctions); + parseSanitizerKinds( + "-fsanitize-add-pseudo-functions=", + Args.getAllArgValues(OPT_fsanitize_add_pseudo_functions_EQ), Diags, + Opts.SanitizeAddPseudoFunctions); Opts.EmitVersionIdentMetadata = Args.hasFlag(OPT_Qy, OPT_Qn, true); >From 31cdd179a6aed320e5c83da4c15f5777f41b4443 Mon Sep 17 00:00:00 2001 From: Thurston Dang <thurs...@google.com> Date: Mon, 5 May 2025 20:42:13 +0000 Subject: [PATCH 3/9] Add commentary --- clang/include/clang/Driver/Options.td | 5 +++-- clang/lib/CodeGen/CGExpr.cpp | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index e559a772494fe..523b810cb6869 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -2536,7 +2536,8 @@ def fno_sanitize_merge_handlers : Flag<["-"], "fno-sanitize-merge">, Group<f_cla def fsanitize_add_pseudo_functions_EQ : CommaJoined<["-"], "fsanitize-add-pseudo-functions=">, Group<f_clang_Group>, - HelpText<"Add pseudo-functions to checks for specified sanitizers">; + HelpText<"Add pseudo-functions to checks for specified sanitizers, if " + "supported.">; def fno_sanitize_add_pseudo_functions_EQ : CommaJoined<["-"], "fno-sanitize-add-pseudo-functions=">, Group<f_clang_Group>, @@ -2548,7 +2549,7 @@ def fsanitize_add_pseudo_functions Alias<fsanitize_add_pseudo_functions_EQ>, AliasArgs<["all"]>, HelpText<"Allow compiler to add pseudo-functions to checks for all " - "sanitizers">; + "sanitizers, if supported">; def fno_sanitize_add_pseudo_functions : Flag<["-"], "fno-sanitize-add-pseudo-functions">, Group<f_clang_Group>, diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index 43694dbf4151c..7c64d29a5ea52 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -1228,6 +1228,7 @@ void CodeGenFunction::EmitBoundsCheckImpl(const Expr *E, llvm::Value *Bound, SanitizerScope SanScope(this); llvm::DILocation *CheckDI = Builder.getCurrentDebugLocation(); + // TODO: deprecate ClArrayBoundsPseudoFn if ((ClArrayBoundsPseudoFn || CGM.getCodeGenOpts().SanitizeAddPseudoFunctions.has( SanitizerKind::SO_ArrayBounds)) && >From 8cdce5eb431b6442b92502a2a48763805efd23be Mon Sep 17 00:00:00 2001 From: Thurston Dang <thurs...@google.com> Date: Mon, 5 May 2025 20:43:31 +0000 Subject: [PATCH 4/9] if -> where --- clang/include/clang/Driver/Options.td | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 523b810cb6869..c28af0de1bb69 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -2549,7 +2549,7 @@ def fsanitize_add_pseudo_functions Alias<fsanitize_add_pseudo_functions_EQ>, AliasArgs<["all"]>, HelpText<"Allow compiler to add pseudo-functions to checks for all " - "sanitizers, if supported">; + "sanitizers, where supported">; def fno_sanitize_add_pseudo_functions : Flag<["-"], "fno-sanitize-add-pseudo-functions">, Group<f_clang_Group>, >From 9380a10757f03701f75a98567fb554bac7082c93 Mon Sep 17 00:00:00 2001 From: Thurston Dang <thurs...@google.com> Date: Mon, 5 May 2025 23:11:33 +0000 Subject: [PATCH 5/9] Rename add-pseudo-functions to annotate-debug-info --- clang/include/clang/Basic/CodeGenOptions.h | 4 +- clang/include/clang/Driver/Options.td | 30 +++--- clang/include/clang/Driver/SanitizerArgs.h | 2 +- clang/lib/CodeGen/CGExpr.cpp | 6 +- clang/lib/Driver/SanitizerArgs.cpp | 26 ++--- clang/lib/Frontend/CompilerInvocation.cpp | 10 +- .../test/CodeGen/bounds-checking-debuginfo.c | 4 +- clang/test/Driver/fsanitize.c | 100 +++++++++--------- 8 files changed, 91 insertions(+), 91 deletions(-) diff --git a/clang/include/clang/Basic/CodeGenOptions.h b/clang/include/clang/Basic/CodeGenOptions.h index be17c81876ddf..0c31fd24dabab 100644 --- a/clang/include/clang/Basic/CodeGenOptions.h +++ b/clang/include/clang/Basic/CodeGenOptions.h @@ -399,8 +399,8 @@ class CodeGenOptions : public CodeGenOptionsBase { /// (0.0 [default] to skip none, 1.0 to skip all). SanitizerMaskCutoffs SanitizeSkipHotCutoffs; - /// Set of sanitizer checks that will be wrapped inside pseudofunctions. - SanitizerSet SanitizeAddPseudoFunctions; + /// Set of sanitizer checks that will be annotated with debug info. + SanitizerSet SanitizeAnnotateDebugInfo; /// List of backend command-line options for -fembed-bitcode. std::vector<uint8_t> CmdArgs; diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index c28af0de1bb69..857183274b81d 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -2533,30 +2533,30 @@ def fno_sanitize_merge_handlers : Flag<["-"], "fno-sanitize-merge">, Group<f_cla Alias<fno_sanitize_merge_handlers_EQ>, AliasArgs<["all"]>, Visibility<[ClangOption, CLOption]>, HelpText<"Do not allow compiler to merge handlers for any sanitizers">; -def fsanitize_add_pseudo_functions_EQ - : CommaJoined<["-"], "fsanitize-add-pseudo-functions=">, +def fsanitize_annotate_debug_info_EQ + : CommaJoined<["-"], "fsanitize-annotate-debug-info=">, Group<f_clang_Group>, - HelpText<"Add pseudo-functions to checks for specified sanitizers, if " - "supported.">; -def fno_sanitize_add_pseudo_functions_EQ - : CommaJoined<["-"], "fno-sanitize-add-pseudo-functions=">, + HelpText<"Annotate checks with debug info for specified sanitizers, if " + "supported">; +def fno_sanitize_annotate_debug_info_EQ + : CommaJoined<["-"], "fno-sanitize-annotate-debug-info=">, Group<f_clang_Group>, - HelpText<"Do not allow compiler to add pseudo-functions to checks for " + HelpText<"Do not allow compiler to annotate checks with debug info for " "specified sanitizers">; -def fsanitize_add_pseudo_functions - : Flag<["-"], "fsanitize-add-pseudo-functions">, +def fsanitize_annotate_debug_info + : Flag<["-"], "fsanitize-annotate_debug_info">, Group<f_clang_Group>, - Alias<fsanitize_add_pseudo_functions_EQ>, + Alias<fsanitize_annotate_debug_info_EQ>, AliasArgs<["all"]>, - HelpText<"Allow compiler to add pseudo-functions to checks for all " + HelpText<"Allow compiler to annotate checks with debug info for all " "sanitizers, where supported">; -def fno_sanitize_add_pseudo_functions - : Flag<["-"], "fno-sanitize-add-pseudo-functions">, +def fno_sanitize_annotate_debug_info + : Flag<["-"], "fno-sanitize-annotate_debug_info">, Group<f_clang_Group>, - Alias<fno_sanitize_add_pseudo_functions_EQ>, + Alias<fno_sanitize_annotate_debug_info_EQ>, AliasArgs<["all"]>, Visibility<[ClangOption, CLOption]>, - HelpText<"Do not allow compiler to add pseudo-functions to checks for " + HelpText<"Do not allow compiler to annotate checks with debug info for " "any sanitizers">; def fsanitize_undefined_trap_on_error : Flag<["-"], "fsanitize-undefined-trap-on-error">, Group<f_clang_Group>, diff --git a/clang/include/clang/Driver/SanitizerArgs.h b/clang/include/clang/Driver/SanitizerArgs.h index 1c11706639aba..e6cb43f13031a 100644 --- a/clang/include/clang/Driver/SanitizerArgs.h +++ b/clang/include/clang/Driver/SanitizerArgs.h @@ -27,7 +27,7 @@ class SanitizerArgs { SanitizerSet TrapSanitizers; SanitizerSet MergeHandlers; SanitizerMaskCutoffs SkipHotCutoffs; - SanitizerSet AddPseudoFunctions; + SanitizerSet AnnotateDebugInfo; std::vector<std::string> UserIgnorelistFiles; std::vector<std::string> SystemIgnorelistFiles; diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index 7c64d29a5ea52..2787cab547f2f 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -1228,10 +1228,10 @@ void CodeGenFunction::EmitBoundsCheckImpl(const Expr *E, llvm::Value *Bound, SanitizerScope SanScope(this); llvm::DILocation *CheckDI = Builder.getCurrentDebugLocation(); + auto CurrentCheckKind = SanitizerKind::SO_ArrayBounds; // TODO: deprecate ClArrayBoundsPseudoFn if ((ClArrayBoundsPseudoFn || - CGM.getCodeGenOpts().SanitizeAddPseudoFunctions.has( - SanitizerKind::SO_ArrayBounds)) && + CGM.getCodeGenOpts().SanitizeAnnotateDebugInfo.has(CurrentCheckKind)) && CheckDI) { CheckDI = getDebugInfo()->CreateSyntheticInlineAt( Builder.getCurrentDebugLocation(), "__ubsan_check_array_bounds"); @@ -1249,7 +1249,7 @@ void CodeGenFunction::EmitBoundsCheckImpl(const Expr *E, llvm::Value *Bound, }; llvm::Value *Check = Accessed ? Builder.CreateICmpULT(IndexVal, BoundVal) : Builder.CreateICmpULE(IndexVal, BoundVal); - EmitCheck(std::make_pair(Check, SanitizerKind::SO_ArrayBounds), + EmitCheck(std::make_pair(Check, CurrentCheckKind), SanitizerHandler::OutOfBounds, StaticData, Index); } diff --git a/clang/lib/Driver/SanitizerArgs.cpp b/clang/lib/Driver/SanitizerArgs.cpp index 453b035385a31..aea22c1acf19e 100644 --- a/clang/lib/Driver/SanitizerArgs.cpp +++ b/clang/lib/Driver/SanitizerArgs.cpp @@ -76,7 +76,7 @@ static const SanitizerMask MergeDefault = SanitizerKind::Undefined | SanitizerKind::Vptr; static const SanitizerMask TrappingDefault = SanitizerKind::CFI | SanitizerKind::LocalBounds; -static const SanitizerMask AddPseudoFunctionsDefault; +static const SanitizerMask AnnotateDebugInfoDefault; static const SanitizerMask CFIClasses = SanitizerKind::CFIVCall | SanitizerKind::CFINVCall | SanitizerKind::CFIMFCall | SanitizerKind::CFIDerivedCast | @@ -739,12 +739,12 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC, // Parse -fno-sanitize-top-hot flags SkipHotCutoffs = parseSanitizeSkipHotCutoffArgs(D, Args, DiagnoseErrors); - // Parse -f(no-)?sanitize-add-pseudo-functions flags - SanitizerMask AddPseudoFunctionsKinds = - parseSanitizeArgs(D, Args, DiagnoseErrors, AddPseudoFunctionsDefault, {}, - {}, options::OPT_fsanitize_add_pseudo_functions_EQ, - options::OPT_fno_sanitize_add_pseudo_functions_EQ); - AddPseudoFunctionsKinds &= Kinds; + // Parse -f(no-)?sanitize-annotate-debug-info flags + SanitizerMask AnnotateDebugInfoKinds = + parseSanitizeArgs(D, Args, DiagnoseErrors, AnnotateDebugInfoDefault, {}, + {}, options::OPT_fsanitize_annotate_debug_info_EQ, + options::OPT_fno_sanitize_annotate_debug_info_EQ); + AnnotateDebugInfoKinds &= Kinds; // Setup ignorelist files. // Add default ignorelist from resource directory for activated sanitizers, @@ -1165,7 +1165,7 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC, MergeHandlers.Mask |= MergeKinds; - AddPseudoFunctions.Mask |= AddPseudoFunctionsKinds; + AnnotateDebugInfo.Mask |= AnnotateDebugInfoKinds; // Zero out SkipHotCutoffs for unused sanitizers SkipHotCutoffs.clear(~Sanitizers.Mask); @@ -1345,9 +1345,9 @@ void SanitizerArgs::addArgs(const ToolChain &TC, const llvm::opt::ArgList &Args, CmdArgs.push_back( Args.MakeArgString("-fsanitize-skip-hot-cutoff=" + SkipHotCutoffsStr)); - if (!AddPseudoFunctions.empty()) - CmdArgs.push_back(Args.MakeArgString("-fsanitize-add-pseudo-functions=" + - toString(AddPseudoFunctions))); + if (!AnnotateDebugInfo.empty()) + CmdArgs.push_back(Args.MakeArgString("-fsanitize-annotate-debug-info=" + + toString(AnnotateDebugInfo))); addSpecialCaseListOpt(Args, CmdArgs, "-fsanitize-ignorelist=", UserIgnorelistFiles); @@ -1533,9 +1533,9 @@ SanitizerMask parseArgValues(const Driver &D, const llvm::opt::Arg *A, A->getOption().matches(options::OPT_fno_sanitize_trap_EQ) || A->getOption().matches(options::OPT_fsanitize_merge_handlers_EQ) || A->getOption().matches(options::OPT_fno_sanitize_merge_handlers_EQ) || - A->getOption().matches(options::OPT_fsanitize_add_pseudo_functions_EQ) || + A->getOption().matches(options::OPT_fsanitize_annotate_debug_info_EQ) || A->getOption().matches( - options::OPT_fno_sanitize_add_pseudo_functions_EQ)) && + options::OPT_fno_sanitize_annotate_debug_info_EQ)) && "Invalid argument in parseArgValues!"); SanitizerMask Kinds; for (int i = 0, n = A->getNumValues(); i != n; ++i) { diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index d1fda794db52f..a0b8bbf9d827f 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -1839,8 +1839,8 @@ void CompilerInvocationBase::GenerateCodeGenArgs(const CodeGenOptions &Opts, GenerateArg(Consumer, OPT_fsanitize_skip_hot_cutoff_EQ, Sanitizer); for (StringRef Sanitizer : - serializeSanitizerKinds(Opts.SanitizeAddPseudoFunctions)) - GenerateArg(Consumer, OPT_fsanitize_add_pseudo_functions_EQ, Sanitizer); + serializeSanitizerKinds(Opts.SanitizeAnnotateDebugInfo)) + GenerateArg(Consumer, OPT_fsanitize_annotate_debug_info_EQ, Sanitizer); if (!Opts.EmitVersionIdentMetadata) GenerateArg(Consumer, OPT_Qn); @@ -2337,9 +2337,9 @@ bool CompilerInvocation::ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, Args.getAllArgValues(OPT_fsanitize_skip_hot_cutoff_EQ), Diags); parseSanitizerKinds( - "-fsanitize-add-pseudo-functions=", - Args.getAllArgValues(OPT_fsanitize_add_pseudo_functions_EQ), Diags, - Opts.SanitizeAddPseudoFunctions); + "-fsanitize-annotate-debug-info=", + Args.getAllArgValues(OPT_fsanitize_annotate_debug_info_EQ), Diags, + Opts.SanitizeAnnotateDebugInfo); Opts.EmitVersionIdentMetadata = Args.hasFlag(OPT_Qy, OPT_Qn, true); diff --git a/clang/test/CodeGen/bounds-checking-debuginfo.c b/clang/test/CodeGen/bounds-checking-debuginfo.c index f31a40d86dac4..74c06665dfe02 100644 --- a/clang/test/CodeGen/bounds-checking-debuginfo.c +++ b/clang/test/CodeGen/bounds-checking-debuginfo.c @@ -1,7 +1,7 @@ // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5 -// RUN: %clang_cc1 -emit-llvm -fdebug-prefix-map=%S/= -fno-ident -fdebug-compilation-dir=%S -fsanitize=array-bounds -fsanitize-trap=array-bounds -fsanitize-add-pseudo-functions=array-bounds -triple x86_64 -debug-info-kind=limited %s -o - | FileCheck --check-prefix=CHECK-TRAP %s -// RUN: %clang_cc1 -emit-llvm -fdebug-prefix-map=%S/= -fno-ident -fdebug-compilation-dir=%S -fsanitize=array-bounds -fsanitize-add-pseudo-functions=array-bounds -triple x86_64 -debug-info-kind=limited %s -o - | FileCheck --check-prefix=CHECK-NOTRAP %s +// RUN: %clang_cc1 -emit-llvm -fdebug-prefix-map=%S/= -fno-ident -fdebug-compilation-dir=%S -fsanitize=array-bounds -fsanitize-trap=array-bounds -fsanitize-annotate-debug-info=array-bounds -triple x86_64 -debug-info-kind=limited %s -o - | FileCheck --check-prefix=CHECK-TRAP %s +// RUN: %clang_cc1 -emit-llvm -fdebug-prefix-map=%S/= -fno-ident -fdebug-compilation-dir=%S -fsanitize=array-bounds -fsanitize-annotate-debug-info=array-bounds -triple x86_64 -debug-info-kind=limited %s -o - | FileCheck --check-prefix=CHECK-NOTRAP %s int f(); void d(double*); diff --git a/clang/test/Driver/fsanitize.c b/clang/test/Driver/fsanitize.c index ca58d4a50bc79..24d64c94c0956 100644 --- a/clang/test/Driver/fsanitize.c +++ b/clang/test/Driver/fsanitize.c @@ -68,56 +68,56 @@ // CHECK-UNDEFINED-MERGE5: "-fsanitize-merge=alignment,null" -// * Test -fsanitize-add-pseudo-functions * - -// The trailing -fsanitize-add-pseudo-functions takes precedence -// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-add-pseudo-functions %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO -// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-add-pseudo-functions=undefined %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO -// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-add-pseudo-functions -fsanitize-add-pseudo-functions %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO -// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-add-pseudo-functions -fsanitize-add-pseudo-functions=undefined %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO -// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-add-pseudo-functions=undefined -fsanitize-add-pseudo-functions %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO -// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-add-pseudo-functions=undefined -fsanitize-add-pseudo-functions=undefined %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO -// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-add-pseudo-functions=signed-integer-overflow -fsanitize-add-pseudo-functions %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO -// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-add-pseudo-functions=bool -fsanitize-add-pseudo-functions=undefined %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO -// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-add-pseudo-functions=undefined -fsanitize-add-pseudo-functions=bool %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO -// CHECK-UNDEFINED-PSEUDO: "-fsanitize-add-pseudo-functions=alignment,array-bounds,bool,builtin,enum,float-cast-overflow,function,integer-divide-by-zero,nonnull-attribute,null,pointer-overflow,return,returns-nonnull-attribute,shift-base,shift-exponent,signed-integer-overflow,unreachable,vla-bound" - -// The trailing arguments (-fsanitize-add-pseudo-functions -fno-sanitize-add-pseudo-functions=signed-integer-overflow) take precedence -// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-add-pseudo-functions -fno-sanitize-add-pseudo-functions=signed-integer-overflow %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO2 -// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-add-pseudo-functions=undefined -fno-sanitize-add-pseudo-functions=signed-integer-overflow %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO2 -// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-add-pseudo-functions -fsanitize-add-pseudo-functions -fno-sanitize-add-pseudo-functions=signed-integer-overflow %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO2 -// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-add-pseudo-functions -fsanitize-add-pseudo-functions=undefined -fno-sanitize-add-pseudo-functions=signed-integer-overflow %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO2 -// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-add-pseudo-functions=signed-integer-overflow -fsanitize-add-pseudo-functions -fno-sanitize-add-pseudo-functions=signed-integer-overflow %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO2 -// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-add-pseudo-functions=signed-integer-overflow -fsanitize-add-pseudo-functions=undefined -fno-sanitize-add-pseudo-functions=signed-integer-overflow %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO2 -// CHECK-UNDEFINED-PSEUDO2: "-fsanitize-add-pseudo-functions=alignment,array-bounds,bool,builtin,enum,float-cast-overflow,function,integer-divide-by-zero,nonnull-attribute,null,pointer-overflow,return,returns-nonnull-attribute,shift-base,shift-exponent,unreachable,vla-bound" - -// The trailing -fno-sanitize-add-pseudo-functions takes precedence -// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-add-pseudo-functions %s -### 2>&1 | not FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO3 -// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-add-pseudo-functions=undefined %s -### 2>&1 | not FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO3 -// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-add-pseudo-functions -fno-sanitize-add-pseudo-functions=bool %s -### 2>&1 | not FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO3 -// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-add-pseudo-functions=undefined -fno-sanitize-add-pseudo-functions=bool %s -### 2>&1 | not FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO3 -// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-add-pseudo-functions -fno-sanitize-add-pseudo-functions %s -### 2>&1 | not FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO3 -// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-add-pseudo-functions -fno-sanitize-add-pseudo-functions=undefined %s -### 2>&1 | not FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO3 -// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-add-pseudo-functions=undefined -fno-sanitize-add-pseudo-functions %s -### 2>&1 | not FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO3 -// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-add-pseudo-functions=undefined -fno-sanitize-add-pseudo-functions=undefined %s -### 2>&1 | not FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO3 -// CHECK-UNDEFINED-PSEUDO3: "-fsanitize-add-pseudo-functions" - -// The trailing arguments (-fsanitize-add-pseudo-functions -fno-sanitize-add-pseudo-functions=alignment,null) take precedence -// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-add-pseudo-functions -fno-sanitize-add-pseudo-functions=alignment,null %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO4 -// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-add-pseudo-functions=undefined -fno-sanitize-add-pseudo-functions=alignment,null %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO4 -// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-add-pseudo-functions -fsanitize-add-pseudo-functions -fno-sanitize-add-pseudo-functions=alignment,null %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO4 -// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-add-pseudo-functions -fsanitize-add-pseudo-functions=undefined -fno-sanitize-add-pseudo-functions=alignment,null %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO4 -// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-add-pseudo-functions=signed-integer-overflow -fsanitize-add-pseudo-functions -fno-sanitize-add-pseudo-functions=alignment,null %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO4 -// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-add-pseudo-functions=signed-integer-overflow -fsanitize-add-pseudo-functions=undefined -fno-sanitize-add-pseudo-functions=alignment,null %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO4 -// CHECK-UNDEFINED-PSEUDO4: "-fsanitize-add-pseudo-functions=array-bounds,bool,builtin,enum,float-cast-overflow,function,integer-divide-by-zero,nonnull-attribute,pointer-overflow,return,returns-nonnull-attribute,shift-base,shift-exponent,signed-integer-overflow,unreachable,vla-bound" - -// The trailing arguments (-fno-sanitize-add-pseudo-functions -fsanitize-add-pseudo-functions=alignment,null) take precedence -// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-add-pseudo-functions=undefined -fsanitize-add-pseudo-functions=alignment,null %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO5 -// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-add-pseudo-functions -fno-sanitize-add-pseudo-functions -fsanitize-add-pseudo-functions=alignment,null %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO5 -// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-add-pseudo-functions -fno-sanitize-add-pseudo-functions=undefined -fsanitize-add-pseudo-functions=alignment,null %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO5 -// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-add-pseudo-functions=signed-integer-overflow -fno-sanitize-add-pseudo-functions -fsanitize-add-pseudo-functions=alignment,null %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO5 -// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-add-pseudo-functions=signed-integer-overflow -fno-sanitize-add-pseudo-functions=undefined -fsanitize-add-pseudo-functions=alignment,null %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO5 -// CHECK-UNDEFINED-PSEUDO5: "-fsanitize-add-pseudo-functions=alignment,null" +// * Test -fsanitize-annotate-debug-info * + +// The trailing -fsanitize-annotate-debug-info takes precedence +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-annotate-debug-info %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-annotate-debug-info=undefined %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-annotate-debug-info -fsanitize-annotate-debug-info %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-annotate-debug-info -fsanitize-annotate-debug-info=undefined %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-annotate-debug-info=undefined -fsanitize-annotate-debug-info %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-annotate-debug-info=undefined -fsanitize-annotate-debug-info=undefined %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-annotate-debug-info=signed-integer-overflow -fsanitize-annotate-debug-info %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-annotate-debug-info=bool -fsanitize-annotate-debug-info=undefined %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-annotate-debug-info=undefined -fsanitize-annotate-debug-info=bool %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO +// CHECK-UNDEFINED-PSEUDO: "-fsanitize-annotate-debug-info=alignment,array-bounds,bool,builtin,enum,float-cast-overflow,function,integer-divide-by-zero,nonnull-attribute,null,pointer-overflow,return,returns-nonnull-attribute,shift-base,shift-exponent,signed-integer-overflow,unreachable,vla-bound" + +// The trailing arguments (-fsanitize-annotate-debug-info -fno-sanitize-annotate-debug-info=signed-integer-overflow) take precedence +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-annotate-debug-info -fno-sanitize-annotate-debug-info=signed-integer-overflow %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO2 +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-annotate-debug-info=undefined -fno-sanitize-annotate-debug-info=signed-integer-overflow %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO2 +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-annotate-debug-info -fsanitize-annotate-debug-info -fno-sanitize-annotate-debug-info=signed-integer-overflow %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO2 +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-annotate-debug-info -fsanitize-annotate-debug-info=undefined -fno-sanitize-annotate-debug-info=signed-integer-overflow %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO2 +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-annotate-debug-info=signed-integer-overflow -fsanitize-annotate-debug-info -fno-sanitize-annotate-debug-info=signed-integer-overflow %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO2 +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-annotate-debug-info=signed-integer-overflow -fsanitize-annotate-debug-info=undefined -fno-sanitize-annotate-debug-info=signed-integer-overflow %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO2 +// CHECK-UNDEFINED-PSEUDO2: "-fsanitize-annotate-debug-info=alignment,array-bounds,bool,builtin,enum,float-cast-overflow,function,integer-divide-by-zero,nonnull-attribute,null,pointer-overflow,return,returns-nonnull-attribute,shift-base,shift-exponent,unreachable,vla-bound" + +// The trailing -fno-sanitize-annotate-debug-info takes precedence +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-annotate-debug-info %s -### 2>&1 | not FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO3 +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-annotate-debug-info=undefined %s -### 2>&1 | not FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO3 +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-annotate-debug-info -fno-sanitize-annotate-debug-info=bool %s -### 2>&1 | not FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO3 +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-annotate-debug-info=undefined -fno-sanitize-annotate-debug-info=bool %s -### 2>&1 | not FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO3 +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-annotate-debug-info -fno-sanitize-annotate-debug-info %s -### 2>&1 | not FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO3 +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-annotate-debug-info -fno-sanitize-annotate-debug-info=undefined %s -### 2>&1 | not FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO3 +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-annotate-debug-info=undefined -fno-sanitize-annotate-debug-info %s -### 2>&1 | not FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO3 +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-annotate-debug-info=undefined -fno-sanitize-annotate-debug-info=undefined %s -### 2>&1 | not FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO3 +// CHECK-UNDEFINED-PSEUDO3: "-fsanitize-annotate-debug-info" + +// The trailing arguments (-fsanitize-annotate-debug-info -fno-sanitize-annotate-debug-info=alignment,null) take precedence +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-annotate-debug-info -fno-sanitize-annotate-debug-info=alignment,null %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO4 +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-annotate-debug-info=undefined -fno-sanitize-annotate-debug-info=alignment,null %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO4 +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-annotate-debug-info -fsanitize-annotate-debug-info -fno-sanitize-annotate-debug-info=alignment,null %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO4 +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-annotate-debug-info -fsanitize-annotate-debug-info=undefined -fno-sanitize-annotate-debug-info=alignment,null %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO4 +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-annotate-debug-info=signed-integer-overflow -fsanitize-annotate-debug-info -fno-sanitize-annotate-debug-info=alignment,null %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO4 +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-annotate-debug-info=signed-integer-overflow -fsanitize-annotate-debug-info=undefined -fno-sanitize-annotate-debug-info=alignment,null %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO4 +// CHECK-UNDEFINED-PSEUDO4: "-fsanitize-annotate-debug-info=array-bounds,bool,builtin,enum,float-cast-overflow,function,integer-divide-by-zero,nonnull-attribute,pointer-overflow,return,returns-nonnull-attribute,shift-base,shift-exponent,signed-integer-overflow,unreachable,vla-bound" + +// The trailing arguments (-fno-sanitize-annotate-debug-info -fsanitize-annotate-debug-info=alignment,null) take precedence +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fno-sanitize-annotate-debug-info=undefined -fsanitize-annotate-debug-info=alignment,null %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO5 +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-annotate-debug-info -fno-sanitize-annotate-debug-info -fsanitize-annotate-debug-info=alignment,null %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO5 +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-annotate-debug-info -fno-sanitize-annotate-debug-info=undefined -fsanitize-annotate-debug-info=alignment,null %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO5 +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-annotate-debug-info=signed-integer-overflow -fno-sanitize-annotate-debug-info -fsanitize-annotate-debug-info=alignment,null %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO5 +// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -fsanitize-trap=undefined -fsanitize-annotate-debug-info=signed-integer-overflow -fno-sanitize-annotate-debug-info=undefined -fsanitize-annotate-debug-info=alignment,null %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED-PSEUDO5 +// CHECK-UNDEFINED-PSEUDO5: "-fsanitize-annotate-debug-info=alignment,null" // RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UNDEFINED >From 74cd26a7279d2fd8fe763c4c80aee437834a2b1c Mon Sep 17 00:00:00 2001 From: Thurston Dang <thurs...@google.com> Date: Tue, 6 May 2025 21:14:37 +0000 Subject: [PATCH 6/9] Rename to CheckKind --- clang/lib/CodeGen/CGExpr.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index 2787cab547f2f..eadc1741bc788 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -1228,10 +1228,10 @@ void CodeGenFunction::EmitBoundsCheckImpl(const Expr *E, llvm::Value *Bound, SanitizerScope SanScope(this); llvm::DILocation *CheckDI = Builder.getCurrentDebugLocation(); - auto CurrentCheckKind = SanitizerKind::SO_ArrayBounds; + auto CheckKind = SanitizerKind::SO_ArrayBounds; // TODO: deprecate ClArrayBoundsPseudoFn if ((ClArrayBoundsPseudoFn || - CGM.getCodeGenOpts().SanitizeAnnotateDebugInfo.has(CurrentCheckKind)) && + CGM.getCodeGenOpts().SanitizeAnnotateDebugInfo.has(CheckKind)) && CheckDI) { CheckDI = getDebugInfo()->CreateSyntheticInlineAt( Builder.getCurrentDebugLocation(), "__ubsan_check_array_bounds"); @@ -1249,7 +1249,7 @@ void CodeGenFunction::EmitBoundsCheckImpl(const Expr *E, llvm::Value *Bound, }; llvm::Value *Check = Accessed ? Builder.CreateICmpULT(IndexVal, BoundVal) : Builder.CreateICmpULE(IndexVal, BoundVal); - EmitCheck(std::make_pair(Check, CurrentCheckKind), + EmitCheck(std::make_pair(Check, CheckKind), SanitizerHandler::OutOfBounds, StaticData, Index); } >From de25ccefbdeb80a58a77ccffa8509a7688640562 Mon Sep 17 00:00:00 2001 From: Thurston Dang <thurs...@google.com> Date: Tue, 6 May 2025 21:26:25 +0000 Subject: [PATCH 7/9] Update description to "Annotate sanitizer instrumentation with extra debug info for the specified sanitizers ..." per delcypher's feedback --- clang/include/clang/Basic/CodeGenOptions.h | 3 ++- clang/include/clang/Driver/Options.td | 16 ++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/clang/include/clang/Basic/CodeGenOptions.h b/clang/include/clang/Basic/CodeGenOptions.h index 0c31fd24dabab..e3fa6a55e7608 100644 --- a/clang/include/clang/Basic/CodeGenOptions.h +++ b/clang/include/clang/Basic/CodeGenOptions.h @@ -399,7 +399,8 @@ class CodeGenOptions : public CodeGenOptionsBase { /// (0.0 [default] to skip none, 1.0 to skip all). SanitizerMaskCutoffs SanitizeSkipHotCutoffs; - /// Set of sanitizer checks that will be annotated with debug info. + /// Set of sanitizer checks, for which the instrumentation will be annotated + /// with extra debug info. SanitizerSet SanitizeAnnotateDebugInfo; /// List of backend command-line options for -fembed-bitcode. diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 857183274b81d..6d8acbe9ba677 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -2536,28 +2536,28 @@ def fno_sanitize_merge_handlers : Flag<["-"], "fno-sanitize-merge">, Group<f_cla def fsanitize_annotate_debug_info_EQ : CommaJoined<["-"], "fsanitize-annotate-debug-info=">, Group<f_clang_Group>, - HelpText<"Annotate checks with debug info for specified sanitizers, if " - "supported">; + HelpText<"Annotate sanitizer instrumentation with extra debug info for " + the specified sanitizers, if supported">; def fno_sanitize_annotate_debug_info_EQ : CommaJoined<["-"], "fno-sanitize-annotate-debug-info=">, Group<f_clang_Group>, - HelpText<"Do not allow compiler to annotate checks with debug info for " - "specified sanitizers">; + HelpText<"Do not allow compiler to annotate sanitizer instrumentation " + "with extra debug info for the specified sanitizers">; def fsanitize_annotate_debug_info : Flag<["-"], "fsanitize-annotate_debug_info">, Group<f_clang_Group>, Alias<fsanitize_annotate_debug_info_EQ>, AliasArgs<["all"]>, - HelpText<"Allow compiler to annotate checks with debug info for all " - "sanitizers, where supported">; + HelpText<"Allow compiler to annotate sanitizer instrumentation with " + "extra debug info for all sanitizers, where supported">; def fno_sanitize_annotate_debug_info : Flag<["-"], "fno-sanitize-annotate_debug_info">, Group<f_clang_Group>, Alias<fno_sanitize_annotate_debug_info_EQ>, AliasArgs<["all"]>, Visibility<[ClangOption, CLOption]>, - HelpText<"Do not allow compiler to annotate checks with debug info for " - "any sanitizers">; + HelpText<"Do not allow compiler to annotate sanitizer instrumentation " + "with extra debug info for any sanitizers">; def fsanitize_undefined_trap_on_error : Flag<["-"], "fsanitize-undefined-trap-on-error">, Group<f_clang_Group>, Alias<fsanitize_trap_EQ>, AliasArgs<["undefined"]>; >From d25206a040758453dd23b3bce398b7f3fd5ac0be Mon Sep 17 00:00:00 2001 From: Thurston Dang <thurs...@google.com> Date: Tue, 6 May 2025 21:39:59 +0000 Subject: [PATCH 8/9] Fix formatting --- clang/include/clang/Driver/Options.td | 2 +- clang/lib/CodeGen/CGExpr.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 6d8acbe9ba677..12d2ae473ea95 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -2537,7 +2537,7 @@ def fsanitize_annotate_debug_info_EQ : CommaJoined<["-"], "fsanitize-annotate-debug-info=">, Group<f_clang_Group>, HelpText<"Annotate sanitizer instrumentation with extra debug info for " - the specified sanitizers, if supported">; + "the specified sanitizers, if supported">; def fno_sanitize_annotate_debug_info_EQ : CommaJoined<["-"], "fno-sanitize-annotate-debug-info=">, Group<f_clang_Group>, diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index eadc1741bc788..6f5ead78f2b23 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -1249,8 +1249,8 @@ void CodeGenFunction::EmitBoundsCheckImpl(const Expr *E, llvm::Value *Bound, }; llvm::Value *Check = Accessed ? Builder.CreateICmpULT(IndexVal, BoundVal) : Builder.CreateICmpULE(IndexVal, BoundVal); - EmitCheck(std::make_pair(Check, CheckKind), - SanitizerHandler::OutOfBounds, StaticData, Index); + EmitCheck(std::make_pair(Check, CheckKind), SanitizerHandler::OutOfBounds, + StaticData, Index); } CodeGenFunction::ComplexPairTy CodeGenFunction:: >From 25c3fce0ab3aa10507a5941de9fd78ea6a0f5166 Mon Sep 17 00:00:00 2001 From: Thurston Dang <thurs...@google.com> Date: Tue, 6 May 2025 22:29:13 +0000 Subject: [PATCH 9/9] Fix typos --- clang/include/clang/Driver/Options.td | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 12d2ae473ea95..c9a002746345c 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -2544,14 +2544,14 @@ def fno_sanitize_annotate_debug_info_EQ HelpText<"Do not allow compiler to annotate sanitizer instrumentation " "with extra debug info for the specified sanitizers">; def fsanitize_annotate_debug_info - : Flag<["-"], "fsanitize-annotate_debug_info">, + : Flag<["-"], "fsanitize-annotate-debug-info">, Group<f_clang_Group>, Alias<fsanitize_annotate_debug_info_EQ>, AliasArgs<["all"]>, HelpText<"Allow compiler to annotate sanitizer instrumentation with " "extra debug info for all sanitizers, where supported">; def fno_sanitize_annotate_debug_info - : Flag<["-"], "fno-sanitize-annotate_debug_info">, + : Flag<["-"], "fno-sanitize-annotate-debug-info">, Group<f_clang_Group>, Alias<fno_sanitize_annotate_debug_info_EQ>, AliasArgs<["all"]>, _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits