Skip to content

Commit 44f9ccd

Browse files
committed
[𝘀𝗽𝗿] initial version
Created using spr 1.3.4
1 parent c0952a9 commit 44f9ccd

File tree

2 files changed

+20
-19
lines changed

2 files changed

+20
-19
lines changed

clang/lib/CodeGen/CGExpr.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3977,16 +3977,19 @@ void CodeGenFunction::EmitTrapCheck(llvm::Value *Checked,
39773977
NoMerge = NoMerge || !CGM.getCodeGenOpts().OptimizationLevel ||
39783978
(CurCodeDecl && CurCodeDecl->hasAttr<OptimizeNoneAttr>());
39793979

3980+
llvm::MDBuilder MDHelper(getLLVMContext());
39803981
if (TrapBB && !NoMerge) {
39813982
auto Call = TrapBB->begin();
39823983
assert(isa<llvm::CallInst>(Call) && "Expected call in trap BB");
39833984

39843985
Call->applyMergedLocation(Call->getDebugLoc(),
39853986
Builder.getCurrentDebugLocation());
3986-
Builder.CreateCondBr(Checked, Cont, TrapBB);
3987+
Builder.CreateCondBr(Checked, Cont, TrapBB,
3988+
MDHelper.createLikelyBranchWeights());
39873989
} else {
39883990
TrapBB = createBasicBlock("trap");
3989-
Builder.CreateCondBr(Checked, Cont, TrapBB);
3991+
Builder.CreateCondBr(Checked, Cont, TrapBB,
3992+
MDHelper.createLikelyBranchWeights());
39903993
EmitBlock(TrapBB);
39913994

39923995
llvm::CallInst *TrapCall =

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

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5
12
// NOTE: Assertions have mostly been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5
23
// The most important assertions are the attributes at the end of the file, which
34
// show whether -ubsan-unique-traps and -fno-sanitize-merge attach 'nomerge'
@@ -64,7 +65,7 @@
6465
// TRAP-NOMERGE-NEXT: [[ENTRY:.*:]]
6566
// TRAP-NOMERGE-NEXT: [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 125), !nosanitize [[META2:![0-9]+]]
6667
// TRAP-NOMERGE-NEXT: [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
67-
// TRAP-NOMERGE-NEXT: br i1 [[TMP1]], label %[[TRAP:.*]], label %[[CONT:.*]], !nosanitize [[META2]]
68+
// TRAP-NOMERGE-NEXT: br i1 [[TMP1]], label %[[TRAP:.*]], label %[[CONT:.*]], !prof [[PROF3:![0-9]+]], !nosanitize [[META2]]
6869
// TRAP-NOMERGE: [[TRAP]]:
6970
// TRAP-NOMERGE-NEXT: tail call void @llvm.ubsantrap(i8 0) #[[ATTR4:[0-9]+]], !nosanitize [[META2]]
7071
// TRAP-NOMERGE-NEXT: unreachable, !nosanitize [[META2]]
@@ -104,7 +105,7 @@
104105
// TRAP-MERGE-NEXT: [[ENTRY:.*:]]
105106
// TRAP-MERGE-NEXT: [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 125), !nosanitize [[META2:![0-9]+]]
106107
// TRAP-MERGE-NEXT: [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
107-
// TRAP-MERGE-NEXT: br i1 [[TMP1]], label %[[TRAP:.*]], label %[[CONT:.*]], !nosanitize [[META2]]
108+
// TRAP-MERGE-NEXT: br i1 [[TMP1]], label %[[TRAP:.*]], label %[[CONT:.*]], !prof [[PROF3:![0-9]+]], !nosanitize [[META2]]
108109
// TRAP-MERGE: [[TRAP]]:
109110
// TRAP-MERGE-NEXT: tail call void @llvm.ubsantrap(i8 0) #[[ATTR4:[0-9]+]], !nosanitize [[META2]]
110111
// TRAP-MERGE-NEXT: unreachable, !nosanitize [[META2]]
@@ -187,7 +188,7 @@ int f(int x) {
187188
// TRAP-NOMERGE-NEXT: [[ENTRY:.*:]]
188189
// TRAP-NOMERGE-NEXT: [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 127), !nosanitize [[META2]]
189190
// TRAP-NOMERGE-NEXT: [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
190-
// TRAP-NOMERGE-NEXT: br i1 [[TMP1]], label %[[TRAP:.*]], label %[[CONT:.*]], !nosanitize [[META2]]
191+
// TRAP-NOMERGE-NEXT: br i1 [[TMP1]], label %[[TRAP:.*]], label %[[CONT:.*]], !prof [[PROF3]], !nosanitize [[META2]]
191192
// TRAP-NOMERGE: [[TRAP]]:
192193
// TRAP-NOMERGE-NEXT: tail call void @llvm.ubsantrap(i8 0) #[[ATTR4]], !nosanitize [[META2]]
193194
// TRAP-NOMERGE-NEXT: unreachable, !nosanitize [[META2]]
@@ -227,7 +228,7 @@ int f(int x) {
227228
// TRAP-MERGE-NEXT: [[ENTRY:.*:]]
228229
// TRAP-MERGE-NEXT: [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 127), !nosanitize [[META2]]
229230
// TRAP-MERGE-NEXT: [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
230-
// TRAP-MERGE-NEXT: br i1 [[TMP1]], label %[[TRAP:.*]], label %[[CONT:.*]], !nosanitize [[META2]]
231+
// TRAP-MERGE-NEXT: br i1 [[TMP1]], label %[[TRAP:.*]], label %[[CONT:.*]], !prof [[PROF3]], !nosanitize [[META2]]
231232
// TRAP-MERGE: [[TRAP]]:
232233
// TRAP-MERGE-NEXT: tail call void @llvm.ubsantrap(i8 0) #[[ATTR4]], !nosanitize [[META2]]
233234
// TRAP-MERGE-NEXT: unreachable, !nosanitize [[META2]]
@@ -317,14 +318,14 @@ int g(int x) {
317318
// TRAP-NOMERGE-NEXT: [[ENTRY:.*:]]
318319
// TRAP-NOMERGE-NEXT: [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 127), !nosanitize [[META2]]
319320
// TRAP-NOMERGE-NEXT: [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
320-
// TRAP-NOMERGE-NEXT: br i1 [[TMP1]], label %[[TRAP:.*]], label %[[CONT:.*]], !nosanitize [[META2]]
321+
// TRAP-NOMERGE-NEXT: br i1 [[TMP1]], label %[[TRAP:.*]], label %[[CONT:.*]], !prof [[PROF3]], !nosanitize [[META2]]
321322
// TRAP-NOMERGE: [[TRAP]]:
322323
// TRAP-NOMERGE-NEXT: tail call void @llvm.ubsantrap(i8 0) #[[ATTR4]], !nosanitize [[META2]]
323324
// TRAP-NOMERGE-NEXT: unreachable, !nosanitize [[META2]]
324325
// TRAP-NOMERGE: [[CONT]]:
325326
// TRAP-NOMERGE-NEXT: [[TMP2:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[Y]], i32 129), !nosanitize [[META2]]
326327
// TRAP-NOMERGE-NEXT: [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1, !nosanitize [[META2]]
327-
// TRAP-NOMERGE-NEXT: br i1 [[TMP3]], label %[[TRAP1:.*]], label %[[CONT2:.*]], !nosanitize [[META2]]
328+
// TRAP-NOMERGE-NEXT: br i1 [[TMP3]], label %[[TRAP1:.*]], label %[[CONT2:.*]], !prof [[PROF3]], !nosanitize [[META2]]
328329
// TRAP-NOMERGE: [[TRAP1]]:
329330
// TRAP-NOMERGE-NEXT: tail call void @llvm.ubsantrap(i8 0) #[[ATTR4]], !nosanitize [[META2]]
330331
// TRAP-NOMERGE-NEXT: unreachable, !nosanitize [[META2]]
@@ -385,14 +386,14 @@ int g(int x) {
385386
// TRAP-MERGE-NEXT: [[ENTRY:.*:]]
386387
// TRAP-MERGE-NEXT: [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 127), !nosanitize [[META2]]
387388
// TRAP-MERGE-NEXT: [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
388-
// TRAP-MERGE-NEXT: br i1 [[TMP1]], label %[[TRAP:.*]], label %[[CONT:.*]], !nosanitize [[META2]]
389+
// TRAP-MERGE-NEXT: br i1 [[TMP1]], label %[[TRAP:.*]], label %[[CONT:.*]], !prof [[PROF3]], !nosanitize [[META2]]
389390
// TRAP-MERGE: [[TRAP]]:
390391
// TRAP-MERGE-NEXT: tail call void @llvm.ubsantrap(i8 0) #[[ATTR4]], !nosanitize [[META2]]
391392
// TRAP-MERGE-NEXT: unreachable, !nosanitize [[META2]]
392393
// TRAP-MERGE: [[CONT]]:
393394
// TRAP-MERGE-NEXT: [[TMP2:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[Y]], i32 129), !nosanitize [[META2]]
394395
// TRAP-MERGE-NEXT: [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1, !nosanitize [[META2]]
395-
// TRAP-MERGE-NEXT: br i1 [[TMP3]], label %[[TRAP]], label %[[CONT1:.*]], !nosanitize [[META2]]
396+
// TRAP-MERGE-NEXT: br i1 [[TMP3]], label %[[TRAP]], label %[[CONT1:.*]], !prof [[PROF3]], !nosanitize [[META2]]
396397
// TRAP-MERGE: [[CONT1]]:
397398
// TRAP-MERGE-NEXT: [[TMP4:%.*]] = extractvalue { i32, i1 } [[TMP2]], 0, !nosanitize [[META2]]
398399
// TRAP-MERGE-NEXT: [[TMP5:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2]]
@@ -546,14 +547,14 @@ int h(int x, int y) {
546547
// TRAP-NOMERGE-NEXT: [[ENTRY:.*:]]
547548
// TRAP-NOMERGE-NEXT: [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 125), !nosanitize [[META2]]
548549
// TRAP-NOMERGE-NEXT: [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
549-
// TRAP-NOMERGE-NEXT: br i1 [[TMP1]], label %[[TRAP_I:.*]], label %[[F_EXIT:.*]], !nosanitize [[META2]]
550+
// TRAP-NOMERGE-NEXT: br i1 [[TMP1]], label %[[TRAP_I:.*]], label %[[F_EXIT:.*]], !prof [[PROF3]], !nosanitize [[META2]]
550551
// TRAP-NOMERGE: [[TRAP_I]]:
551552
// TRAP-NOMERGE-NEXT: tail call void @llvm.ubsantrap(i8 0) #[[ATTR4]], !nosanitize [[META2]]
552553
// TRAP-NOMERGE-NEXT: unreachable, !nosanitize [[META2]]
553554
// TRAP-NOMERGE: [[F_EXIT]]:
554555
// TRAP-NOMERGE-NEXT: [[TMP2:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[Y]], i32 127), !nosanitize [[META2]]
555556
// TRAP-NOMERGE-NEXT: [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1, !nosanitize [[META2]]
556-
// TRAP-NOMERGE-NEXT: br i1 [[TMP3]], label %[[TRAP_I2:.*]], label %[[G_EXIT:.*]], !nosanitize [[META2]]
557+
// TRAP-NOMERGE-NEXT: br i1 [[TMP3]], label %[[TRAP_I2:.*]], label %[[G_EXIT:.*]], !prof [[PROF3]], !nosanitize [[META2]]
557558
// TRAP-NOMERGE: [[TRAP_I2]]:
558559
// TRAP-NOMERGE-NEXT: tail call void @llvm.ubsantrap(i8 0) #[[ATTR4]], !nosanitize [[META2]]
559560
// TRAP-NOMERGE-NEXT: unreachable, !nosanitize [[META2]]
@@ -562,7 +563,7 @@ int h(int x, int y) {
562563
// TRAP-NOMERGE-NEXT: [[TMP5:%.*]] = extractvalue { i32, i1 } [[TMP2]], 0, !nosanitize [[META2]]
563564
// TRAP-NOMERGE-NEXT: [[TMP6:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[TMP4]], i32 [[TMP5]]), !nosanitize [[META2]]
564565
// TRAP-NOMERGE-NEXT: [[TMP7:%.*]] = extractvalue { i32, i1 } [[TMP6]], 1, !nosanitize [[META2]]
565-
// TRAP-NOMERGE-NEXT: br i1 [[TMP7]], label %[[TRAP:.*]], label %[[CONT:.*]], !nosanitize [[META2]]
566+
// TRAP-NOMERGE-NEXT: br i1 [[TMP7]], label %[[TRAP:.*]], label %[[CONT:.*]], !prof [[PROF3]], !nosanitize [[META2]]
566567
// TRAP-NOMERGE: [[TRAP]]:
567568
// TRAP-NOMERGE-NEXT: tail call void @llvm.ubsantrap(i8 0) #[[ATTR4]], !nosanitize [[META2]]
568569
// TRAP-NOMERGE-NEXT: unreachable, !nosanitize [[META2]]
@@ -637,14 +638,14 @@ int h(int x, int y) {
637638
// TRAP-MERGE-NEXT: [[ENTRY:.*:]]
638639
// TRAP-MERGE-NEXT: [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 125), !nosanitize [[META2]]
639640
// TRAP-MERGE-NEXT: [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
640-
// TRAP-MERGE-NEXT: br i1 [[TMP1]], label %[[TRAP_I:.*]], label %[[F_EXIT:.*]], !nosanitize [[META2]]
641+
// TRAP-MERGE-NEXT: br i1 [[TMP1]], label %[[TRAP_I:.*]], label %[[F_EXIT:.*]], !prof [[PROF3]], !nosanitize [[META2]]
641642
// TRAP-MERGE: [[TRAP_I]]:
642643
// TRAP-MERGE-NEXT: tail call void @llvm.ubsantrap(i8 0) #[[ATTR4]], !nosanitize [[META2]]
643644
// TRAP-MERGE-NEXT: unreachable, !nosanitize [[META2]]
644645
// TRAP-MERGE: [[F_EXIT]]:
645646
// TRAP-MERGE-NEXT: [[TMP2:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[Y]], i32 127), !nosanitize [[META2]]
646647
// TRAP-MERGE-NEXT: [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1, !nosanitize [[META2]]
647-
// TRAP-MERGE-NEXT: br i1 [[TMP3]], label %[[TRAP_I2:.*]], label %[[G_EXIT:.*]], !nosanitize [[META2]]
648+
// TRAP-MERGE-NEXT: br i1 [[TMP3]], label %[[TRAP_I2:.*]], label %[[G_EXIT:.*]], !prof [[PROF3]], !nosanitize [[META2]]
648649
// TRAP-MERGE: [[TRAP_I2]]:
649650
// TRAP-MERGE-NEXT: tail call void @llvm.ubsantrap(i8 0) #[[ATTR4]], !nosanitize [[META2]]
650651
// TRAP-MERGE-NEXT: unreachable, !nosanitize [[META2]]
@@ -653,7 +654,7 @@ int h(int x, int y) {
653654
// TRAP-MERGE-NEXT: [[TMP5:%.*]] = extractvalue { i32, i1 } [[TMP2]], 0, !nosanitize [[META2]]
654655
// TRAP-MERGE-NEXT: [[TMP6:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[TMP4]], i32 [[TMP5]]), !nosanitize [[META2]]
655656
// TRAP-MERGE-NEXT: [[TMP7:%.*]] = extractvalue { i32, i1 } [[TMP6]], 1, !nosanitize [[META2]]
656-
// TRAP-MERGE-NEXT: br i1 [[TMP7]], label %[[TRAP:.*]], label %[[CONT:.*]], !nosanitize [[META2]]
657+
// TRAP-MERGE-NEXT: br i1 [[TMP7]], label %[[TRAP:.*]], label %[[CONT:.*]], !prof [[PROF3]], !nosanitize [[META2]]
657658
// TRAP-MERGE: [[TRAP]]:
658659
// TRAP-MERGE-NEXT: tail call void @llvm.ubsantrap(i8 0) #[[ATTR4]], !nosanitize [[META2]]
659660
// TRAP-MERGE-NEXT: unreachable, !nosanitize [[META2]]
@@ -727,9 +728,6 @@ int m(int x, int y) {
727728
return f(x) + g(y);
728729
}
729730

730-
// TRAP-MERGE: attributes #[[ATTR4]] = { noreturn nounwind }
731-
// HANDLER-MERGE: attributes #[[ATTR4]] = { noreturn nounwind }
732-
// MINRT-MERGE: attributes #[[ATTR4]] = { noreturn nounwind }
733731

734732
// TRAP-NOMERGE: attributes #[[ATTR4]] = { nomerge noreturn nounwind }
735733
// HANDLER-NOMERGE: attributes #[[ATTR4]] = { nomerge noreturn nounwind }

0 commit comments

Comments
 (0)