Skip to content

Commit 2691b96

Browse files
committed
Revert "[ubsan] Add -fsanitize-merge (and -fno-sanitize-merge) (#120464)"
This reverts commit 7eaf470. Reason: buildbot breakage (e.g., https://lab.llvm.org/buildbot/#/builders/144/builds/14299/steps/6/logs/FAIL__Clang__ubsan-trap-debugloc_c)
1 parent e698079 commit 2691b96

File tree

9 files changed

+22
-129
lines changed

9 files changed

+22
-129
lines changed

clang/include/clang/Basic/CodeGenOptions.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -380,10 +380,6 @@ class CodeGenOptions : public CodeGenOptionsBase {
380380
/// Set of sanitizer checks that trap rather than diagnose.
381381
SanitizerSet SanitizeTrap;
382382

383-
/// Set of sanitizer checks that can merge handlers (smaller code size at
384-
/// the expense of debuggability).
385-
SanitizerSet SanitizeMergeHandlers;
386-
387383
/// List of backend command-line options for -fembed-bitcode.
388384
std::vector<uint8_t> CmdArgs;
389385

clang/include/clang/Driver/Options.td

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2555,21 +2555,6 @@ def fno_sanitize_trap : Flag<["-"], "fno-sanitize-trap">, Group<f_clang_Group>,
25552555
Alias<fno_sanitize_trap_EQ>, AliasArgs<["all"]>,
25562556
Visibility<[ClangOption, CLOption]>,
25572557
HelpText<"Disable trapping for all sanitizers">;
2558-
def fsanitize_merge_handlers_EQ
2559-
: CommaJoined<["-"], "fsanitize-merge=">,
2560-
Group<f_clang_Group>,
2561-
HelpText<"Allow compiler to merge handlers for specified sanitizers">;
2562-
def fno_sanitize_merge_handlers_EQ
2563-
: CommaJoined<["-"], "fno-sanitize-merge=">,
2564-
Group<f_clang_Group>,
2565-
HelpText<"Do not allow compiler to merge handlers for specified sanitizers">;
2566-
def fsanitize_merge_handlers : Flag<["-"], "fsanitize-merge">, Group<f_clang_Group>,
2567-
Alias<fsanitize_merge_handlers_EQ>, AliasArgs<["all"]>,
2568-
HelpText<"Allow compiler to merge handlers for all sanitizers">;
2569-
def fno_sanitize_merge_handlers : Flag<["-"], "fno-sanitize-merge">, Group<f_clang_Group>,
2570-
Alias<fno_sanitize_merge_handlers_EQ>, AliasArgs<["all"]>,
2571-
Visibility<[ClangOption, CLOption]>,
2572-
HelpText<"Do not allow compiler to merge handlers for any sanitizers">;
25732558
def fsanitize_undefined_trap_on_error
25742559
: Flag<["-"], "fsanitize-undefined-trap-on-error">, Group<f_clang_Group>,
25752560
Alias<fsanitize_trap_EQ>, AliasArgs<["undefined"]>;

clang/include/clang/Driver/SanitizerArgs.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ class SanitizerArgs {
2525
SanitizerSet Sanitizers;
2626
SanitizerSet RecoverableSanitizers;
2727
SanitizerSet TrapSanitizers;
28-
SanitizerSet MergeHandlers;
2928

3029
std::vector<std::string> UserIgnorelistFiles;
3130
std::vector<std::string> SystemIgnorelistFiles;

clang/lib/CodeGen/CGExpr.cpp

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3546,7 +3546,7 @@ static void emitCheckHandlerCall(CodeGenFunction &CGF,
35463546
ArrayRef<llvm::Value *> FnArgs,
35473547
SanitizerHandler CheckHandler,
35483548
CheckRecoverableKind RecoverKind, bool IsFatal,
3549-
llvm::BasicBlock *ContBB, bool NoMerge) {
3549+
llvm::BasicBlock *ContBB) {
35503550
assert(IsFatal || RecoverKind != CheckRecoverableKind::Unrecoverable);
35513551
std::optional<ApplyDebugLocation> DL;
35523552
if (!CGF.Builder.getCurrentDebugLocation()) {
@@ -3581,9 +3581,10 @@ static void emitCheckHandlerCall(CodeGenFunction &CGF,
35813581
llvm::AttributeList::FunctionIndex, B),
35823582
/*Local=*/true);
35833583
llvm::CallInst *HandlerCall = CGF.EmitNounwindRuntimeCall(Fn, FnArgs);
3584-
NoMerge = NoMerge || ClSanitizeDebugDeoptimization ||
3585-
!CGF.CGM.getCodeGenOpts().OptimizationLevel ||
3586-
(CGF.CurCodeDecl && CGF.CurCodeDecl->hasAttr<OptimizeNoneAttr>());
3584+
bool NoMerge =
3585+
ClSanitizeDebugDeoptimization ||
3586+
!CGF.CGM.getCodeGenOpts().OptimizationLevel ||
3587+
(CGF.CurCodeDecl && CGF.CurCodeDecl->hasAttr<OptimizeNoneAttr>());
35873588
if (NoMerge)
35883589
HandlerCall->addFnAttr(llvm::Attribute::NoMerge);
35893590
if (!MayReturn) {
@@ -3607,7 +3608,6 @@ void CodeGenFunction::EmitCheck(
36073608
llvm::Value *FatalCond = nullptr;
36083609
llvm::Value *RecoverableCond = nullptr;
36093610
llvm::Value *TrapCond = nullptr;
3610-
bool NoMerge = false;
36113611
for (int i = 0, n = Checked.size(); i < n; ++i) {
36123612
llvm::Value *Check = Checked[i].first;
36133613
// -fsanitize-trap= overrides -fsanitize-recover=.
@@ -3618,9 +3618,6 @@ void CodeGenFunction::EmitCheck(
36183618
? RecoverableCond
36193619
: FatalCond;
36203620
Cond = Cond ? Builder.CreateAnd(Cond, Check) : Check;
3621-
3622-
if (!CGM.getCodeGenOpts().SanitizeMergeHandlers.has(Checked[i].second))
3623-
NoMerge = true;
36243621
}
36253622

36263623
if (ClSanitizeGuardChecks) {
@@ -3635,7 +3632,7 @@ void CodeGenFunction::EmitCheck(
36353632
}
36363633

36373634
if (TrapCond)
3638-
EmitTrapCheck(TrapCond, CheckHandler, NoMerge);
3635+
EmitTrapCheck(TrapCond, CheckHandler);
36393636
if (!FatalCond && !RecoverableCond)
36403637
return;
36413638

@@ -3701,7 +3698,7 @@ void CodeGenFunction::EmitCheck(
37013698
// Simple case: we need to generate a single handler call, either
37023699
// fatal, or non-fatal.
37033700
emitCheckHandlerCall(*this, FnType, Args, CheckHandler, RecoverKind,
3704-
(FatalCond != nullptr), Cont, NoMerge);
3701+
(FatalCond != nullptr), Cont);
37053702
} else {
37063703
// Emit two handler calls: first one for set of unrecoverable checks,
37073704
// another one for recoverable.
@@ -3711,10 +3708,10 @@ void CodeGenFunction::EmitCheck(
37113708
Builder.CreateCondBr(FatalCond, NonFatalHandlerBB, FatalHandlerBB);
37123709
EmitBlock(FatalHandlerBB);
37133710
emitCheckHandlerCall(*this, FnType, Args, CheckHandler, RecoverKind, true,
3714-
NonFatalHandlerBB, NoMerge);
3711+
NonFatalHandlerBB);
37153712
EmitBlock(NonFatalHandlerBB);
37163713
emitCheckHandlerCall(*this, FnType, Args, CheckHandler, RecoverKind, false,
3717-
Cont, NoMerge);
3714+
Cont);
37183715
}
37193716

37203717
EmitBlock(Cont);
@@ -3904,8 +3901,7 @@ void CodeGenFunction::EmitUnreachable(SourceLocation Loc) {
39043901
}
39053902

39063903
void CodeGenFunction::EmitTrapCheck(llvm::Value *Checked,
3907-
SanitizerHandler CheckHandlerID,
3908-
bool NoMerge) {
3904+
SanitizerHandler CheckHandlerID) {
39093905
llvm::BasicBlock *Cont = createBasicBlock("cont");
39103906

39113907
// If we're optimizing, collapse all calls to trap down to just one per
@@ -3915,9 +3911,9 @@ void CodeGenFunction::EmitTrapCheck(llvm::Value *Checked,
39153911

39163912
llvm::BasicBlock *&TrapBB = TrapBBs[CheckHandlerID];
39173913

3918-
NoMerge = NoMerge || ClSanitizeDebugDeoptimization ||
3919-
!CGM.getCodeGenOpts().OptimizationLevel ||
3920-
(CurCodeDecl && CurCodeDecl->hasAttr<OptimizeNoneAttr>());
3914+
bool NoMerge = ClSanitizeDebugDeoptimization ||
3915+
!CGM.getCodeGenOpts().OptimizationLevel ||
3916+
(CurCodeDecl && CurCodeDecl->hasAttr<OptimizeNoneAttr>());
39213917

39223918
if (TrapBB && !NoMerge) {
39233919
auto Call = TrapBB->begin();

clang/lib/CodeGen/CodeGenFunction.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5171,8 +5171,7 @@ class CodeGenFunction : public CodeGenTypeCache {
51715171

51725172
/// Create a basic block that will call the trap intrinsic, and emit a
51735173
/// conditional branch to it, for the -ftrapv checks.
5174-
void EmitTrapCheck(llvm::Value *Checked, SanitizerHandler CheckHandlerID,
5175-
bool NoMerge = false);
5174+
void EmitTrapCheck(llvm::Value *Checked, SanitizerHandler CheckHandlerID);
51765175

51775176
/// Emit a call to trap or debugtrap and attach function attribute
51785177
/// "trap-func-name" if specified.

clang/lib/Driver/SanitizerArgs.cpp

Lines changed: 7 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,6 @@ static const SanitizerMask TrappingSupported =
6868
SanitizerKind::ImplicitConversion | SanitizerKind::Nullability |
6969
SanitizerKind::LocalBounds | SanitizerKind::CFI |
7070
SanitizerKind::FloatDivideByZero | SanitizerKind::ObjCCast;
71-
static const SanitizerMask MergeDefault = SanitizerKind::Undefined;
7271
static const SanitizerMask TrappingDefault = SanitizerKind::CFI;
7372
static const SanitizerMask CFIClasses =
7473
SanitizerKind::CFIVCall | SanitizerKind::CFINVCall |
@@ -697,13 +696,6 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC,
697696
TrappingKinds &= Kinds;
698697
RecoverableKinds &= ~TrappingKinds;
699698

700-
// Parse -f(no-)?sanitize-nonmerged-handlers flags
701-
SanitizerMask MergeKinds =
702-
parseSanitizeArgs(D, Args, DiagnoseErrors, MergeDefault, {}, {},
703-
options::OPT_fsanitize_merge_handlers_EQ,
704-
options::OPT_fno_sanitize_merge_handlers_EQ);
705-
MergeKinds &= Kinds;
706-
707699
// Setup ignorelist files.
708700
// Add default ignorelist from resource directory for activated sanitizers,
709701
// and validate special case lists format.
@@ -1122,8 +1114,6 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC,
11221114
TrapSanitizers.Mask |= TrappingKinds;
11231115
assert(!(RecoverableKinds & TrappingKinds) &&
11241116
"Overlap between recoverable and trapping sanitizers");
1125-
1126-
MergeHandlers.Mask |= MergeKinds;
11271117
}
11281118

11291119
static std::string toString(const clang::SanitizerSet &Sanitizers) {
@@ -1285,10 +1275,6 @@ void SanitizerArgs::addArgs(const ToolChain &TC, const llvm::opt::ArgList &Args,
12851275
CmdArgs.push_back(
12861276
Args.MakeArgString("-fsanitize-trap=" + toString(TrapSanitizers)));
12871277

1288-
if (!MergeHandlers.empty())
1289-
CmdArgs.push_back(
1290-
Args.MakeArgString("-fsanitize-merge=" + toString(MergeHandlers)));
1291-
12921278
addSpecialCaseListOpt(Args, CmdArgs,
12931279
"-fsanitize-ignorelist=", UserIgnorelistFiles);
12941280
addSpecialCaseListOpt(Args, CmdArgs,
@@ -1456,16 +1442,13 @@ void SanitizerArgs::addArgs(const ToolChain &TC, const llvm::opt::ArgList &Args,
14561442

14571443
SanitizerMask parseArgValues(const Driver &D, const llvm::opt::Arg *A,
14581444
bool DiagnoseErrors) {
1459-
assert(
1460-
(A->getOption().matches(options::OPT_fsanitize_EQ) ||
1461-
A->getOption().matches(options::OPT_fno_sanitize_EQ) ||
1462-
A->getOption().matches(options::OPT_fsanitize_recover_EQ) ||
1463-
A->getOption().matches(options::OPT_fno_sanitize_recover_EQ) ||
1464-
A->getOption().matches(options::OPT_fsanitize_trap_EQ) ||
1465-
A->getOption().matches(options::OPT_fno_sanitize_trap_EQ) ||
1466-
A->getOption().matches(options::OPT_fsanitize_merge_handlers_EQ) ||
1467-
A->getOption().matches(options::OPT_fno_sanitize_merge_handlers_EQ)) &&
1468-
"Invalid argument in parseArgValues!");
1445+
assert((A->getOption().matches(options::OPT_fsanitize_EQ) ||
1446+
A->getOption().matches(options::OPT_fno_sanitize_EQ) ||
1447+
A->getOption().matches(options::OPT_fsanitize_recover_EQ) ||
1448+
A->getOption().matches(options::OPT_fno_sanitize_recover_EQ) ||
1449+
A->getOption().matches(options::OPT_fsanitize_trap_EQ) ||
1450+
A->getOption().matches(options::OPT_fno_sanitize_trap_EQ)) &&
1451+
"Invalid argument in parseArgValues!");
14691452
SanitizerMask Kinds;
14701453
for (int i = 0, n = A->getNumValues(); i != n; ++i) {
14711454
const char *Value = A->getValue(i);

clang/lib/Frontend/CompilerInvocation.cpp

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1792,10 +1792,6 @@ void CompilerInvocationBase::GenerateCodeGenArgs(const CodeGenOptions &Opts,
17921792
for (StringRef Sanitizer : serializeSanitizerKinds(Opts.SanitizeTrap))
17931793
GenerateArg(Consumer, OPT_fsanitize_trap_EQ, Sanitizer);
17941794

1795-
for (StringRef Sanitizer :
1796-
serializeSanitizerKinds(Opts.SanitizeMergeHandlers))
1797-
GenerateArg(Consumer, OPT_fsanitize_merge_handlers_EQ, Sanitizer);
1798-
17991795
if (!Opts.EmitVersionIdentMetadata)
18001796
GenerateArg(Consumer, OPT_Qn);
18011797

@@ -2273,9 +2269,6 @@ bool CompilerInvocation::ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args,
22732269
parseSanitizerKinds("-fsanitize-trap=",
22742270
Args.getAllArgValues(OPT_fsanitize_trap_EQ), Diags,
22752271
Opts.SanitizeTrap);
2276-
parseSanitizerKinds("-fsanitize-merge=",
2277-
Args.getAllArgValues(OPT_fsanitize_merge_handlers_EQ),
2278-
Diags, Opts.SanitizeMergeHandlers);
22792272

22802273
Opts.EmitVersionIdentMetadata = Args.hasFlag(OPT_Qy, OPT_Qn, true);
22812274

clang/test/CodeGen/ubsan-trap-merge.c

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,11 @@
11
// NOTE: Assertions have mostly been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5
22
// The most important assertion is the attributes at the end of the file, which
3-
// shows whether -ubsan-unique-traps and -fno-sanitize-merge attach 'nomerge'
4-
// to each ubsan call.
3+
// shows whether -ubsan-unique-traps attaches 'nomerge' to each ubsan call.
54
//
65
// RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -fsanitize=signed-integer-overflow -O3 -mllvm -ubsan-unique-traps %s -o - -fsanitize-trap=signed-integer-overflow | FileCheck %s --check-prefix=TRAP
76
// RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -fsanitize=signed-integer-overflow -O3 -mllvm -ubsan-unique-traps %s -o - | FileCheck %s --check-prefix=HANDLER
87
// RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -fsanitize=signed-integer-overflow -O3 -mllvm -ubsan-unique-traps %s -o - -fsanitize-minimal-runtime | FileCheck %s --check-prefix=MINRT
98
//
10-
// RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -fsanitize=signed-integer-overflow -O3 -fno-sanitize-merge=signed-integer-overflow %s -o - -fsanitize-trap=signed-integer-overflow | FileCheck %s --check-prefix=TRAP
11-
// RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -fsanitize=signed-integer-overflow -O3 -fno-sanitize-merge=signed-integer-overflow %s -o - | FileCheck %s --check-prefix=HANDLER
12-
// RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -fsanitize=signed-integer-overflow -O3 -fno-sanitize-merge=signed-integer-overflow %s -o - -fsanitize-minimal-runtime | FileCheck %s --check-prefix=MINRT
13-
//
149
// REQUIRES: x86-registered-target
1510

1611
// TRAP-LABEL: define dso_local range(i32 -2147483523, -2147483648) i32 @f(

0 commit comments

Comments
 (0)