Skip to content

Commit 30f2e92

Browse files
authored
[clang] [sanitizer] predict trap checks succeed (#134310)
Trap checks fail at most once (when the program crashes).
1 parent b6b0257 commit 30f2e92

File tree

6 files changed

+52
-38
lines changed

6 files changed

+52
-38
lines changed

clang/lib/CodeGen/CGExpr.cpp

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

3970+
llvm::MDBuilder MDHelper(getLLVMContext());
39703971
if (TrapBB && !NoMerge) {
39713972
auto Call = TrapBB->begin();
39723973
assert(isa<llvm::CallInst>(Call) && "Expected call in trap BB");
39733974

39743975
Call->applyMergedLocation(Call->getDebugLoc(),
39753976
Builder.getCurrentDebugLocation());
3976-
Builder.CreateCondBr(Checked, Cont, TrapBB);
3977+
Builder.CreateCondBr(Checked, Cont, TrapBB,
3978+
MDHelper.createLikelyBranchWeights());
39773979
} else {
39783980
TrapBB = createBasicBlock("trap");
3979-
Builder.CreateCondBr(Checked, Cont, TrapBB);
3981+
Builder.CreateCondBr(Checked, Cont, TrapBB,
3982+
MDHelper.createLikelyBranchWeights());
39803983
EmitBlock(TrapBB);
39813984

39823985
llvm::CallInst *TrapCall =

clang/test/CodeGen/allow-ubsan-check.c

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
// TR-NEXT: [[TMP7:%.*]] = xor i1 [[TMP6]], true, !nosanitize [[META2]]
5050
// TR-NEXT: [[TMP8:%.*]] = or i1 [[OR]], [[TMP7]], !nosanitize [[META2]]
5151
// TR-NEXT: [[TMP9:%.*]] = and i1 [[TMP5]], [[TMP8]], !nosanitize [[META2]]
52-
// TR-NEXT: br i1 [[TMP9]], label %[[CONT:.*]], label %[[TRAP:.*]], !nosanitize [[META2]]
52+
// TR-NEXT: br i1 [[TMP9]], label %[[CONT:.*]], label %[[TRAP:.*]], !prof [[PROF3:![0-9]+]], !nosanitize [[META2]]
5353
// TR: [[TRAP]]:
5454
// TR-NEXT: tail call void @llvm.ubsantrap(i8 3) #[[ATTR5:[0-9]+]], !nosanitize [[META2]]
5555
// TR-NEXT: unreachable, !nosanitize [[META2]]
@@ -107,12 +107,12 @@ int div(int x, int y) {
107107
// TR-NEXT: [[TMP0:%.*]] = icmp eq ptr [[X]], null, !nosanitize [[META2]]
108108
// TR-NEXT: [[TMP1:%.*]] = tail call i1 @llvm.allow.ubsan.check(i8 29), !nosanitize [[META2]]
109109
// TR-NEXT: [[DOTNOT1:%.*]] = and i1 [[TMP0]], [[TMP1]]
110-
// TR-NEXT: br i1 [[DOTNOT1]], label %[[TRAP:.*]], label %[[CONT:.*]], !nosanitize [[META2]]
110+
// TR-NEXT: br i1 [[DOTNOT1]], label %[[TRAP:.*]], label %[[CONT:.*]], !prof [[PROF4:![0-9]+]], !nosanitize [[META2]]
111111
// TR: [[TRAP]]:
112112
// TR-NEXT: tail call void @llvm.ubsantrap(i8 22) #[[ATTR5]], !nosanitize [[META2]]
113113
// TR-NEXT: unreachable, !nosanitize [[META2]]
114114
// TR: [[CONT]]:
115-
// TR-NEXT: [[TMP2:%.*]] = load i32, ptr [[X]], align 4, !tbaa [[TBAA3:![0-9]+]]
115+
// TR-NEXT: [[TMP2:%.*]] = load i32, ptr [[X]], align 4, !tbaa [[TBAA5:![0-9]+]]
116116
// TR-NEXT: ret i32 [[TMP2]]
117117
//
118118
// REC-LABEL: define dso_local i32 @null(
@@ -159,7 +159,7 @@ int null(int* x) {
159159
// TR-NEXT: [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
160160
// TR-NEXT: [[TMP2:%.*]] = tail call i1 @llvm.allow.ubsan.check(i8 41), !nosanitize [[META2]]
161161
// TR-NEXT: [[DOTDEMORGAN:%.*]] = and i1 [[TMP1]], [[TMP2]]
162-
// TR-NEXT: br i1 [[DOTDEMORGAN]], label %[[TRAP:.*]], label %[[CONT:.*]], !nosanitize [[META2]]
162+
// TR-NEXT: br i1 [[DOTDEMORGAN]], label %[[TRAP:.*]], label %[[CONT:.*]], !prof [[PROF4]], !nosanitize [[META2]]
163163
// TR: [[TRAP]]:
164164
// TR-NEXT: tail call void @llvm.ubsantrap(i8 0) #[[ATTR5]], !nosanitize [[META2]]
165165
// TR-NEXT: unreachable, !nosanitize [[META2]]
@@ -224,7 +224,7 @@ void use(double*);
224224
// TR-NEXT: br i1 [[TMP3]], label %[[TRAP:.*]], label %[[BB4:.*]]
225225
// TR: [[BB4]]:
226226
// TR-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds double, ptr [[VLA]], i64 [[IDXPROM]]
227-
// TR-NEXT: [[TMP5:%.*]] = load double, ptr [[ARRAYIDX]], align 8, !tbaa [[TBAA7:![0-9]+]]
227+
// TR-NEXT: [[TMP5:%.*]] = load double, ptr [[ARRAYIDX]], align 8, !tbaa [[TBAA9:![0-9]+]]
228228
// TR-NEXT: ret double [[TMP5]]
229229
// TR: [[TRAP]]:
230230
// TR-NEXT: call void @llvm.ubsantrap(i8 71) #[[ATTR5]], !nosanitize [[META2]]
@@ -267,12 +267,14 @@ double lbounds(int b, int i) {
267267
// CHECK: [[META10]] = !{!"double", [[META7]], i64 0}
268268
//.
269269
// TR: [[META2]] = !{}
270-
// TR: [[TBAA3]] = !{[[META4:![0-9]+]], [[META4]], i64 0}
271-
// TR: [[META4]] = !{!"int", [[META5:![0-9]+]], i64 0}
272-
// TR: [[META5]] = !{!"omnipotent char", [[META6:![0-9]+]], i64 0}
273-
// TR: [[META6]] = !{!"Simple C/C++ TBAA"}
274-
// TR: [[TBAA7]] = !{[[META8:![0-9]+]], [[META8]], i64 0}
275-
// TR: [[META8]] = !{!"double", [[META5]], i64 0}
270+
// TR: [[PROF3]] = !{!"branch_weights", i32 1048575, i32 1}
271+
// TR: [[PROF4]] = !{!"branch_weights", i32 1, i32 1048575}
272+
// TR: [[TBAA5]] = !{[[META6:![0-9]+]], [[META6]], i64 0}
273+
// TR: [[META6]] = !{!"int", [[META7:![0-9]+]], i64 0}
274+
// TR: [[META7]] = !{!"omnipotent char", [[META8:![0-9]+]], i64 0}
275+
// TR: [[META8]] = !{!"Simple C/C++ TBAA"}
276+
// TR: [[TBAA9]] = !{[[META10:![0-9]+]], [[META10]], i64 0}
277+
// TR: [[META10]] = !{!"double", [[META7]], i64 0}
276278
//.
277279
// REC: [[META2]] = !{}
278280
// REC: [[PROF3]] = !{!"branch_weights", i32 1048575, i32 1}

clang/test/CodeGen/bounds-checking-debuginfo.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,15 @@ void d(double*);
2323
// CHECK-TRAP-NEXT: [[CALL:%.*]] = call i32 (...) @f(), !dbg [[DBG22:![0-9]+]]
2424
// CHECK-TRAP-NEXT: [[TMP0:%.*]] = sext i32 [[CALL]] to i64, !dbg [[DBG23:![0-9]+]], !nosanitize [[META10:![0-9]+]]
2525
// CHECK-TRAP-NEXT: [[TMP1:%.*]] = icmp ult i64 [[TMP0]], 10, !dbg [[DBG23]], !nosanitize [[META10]]
26-
// CHECK-TRAP-NEXT: br i1 [[TMP1]], label %[[CONT:.*]], label %[[TRAP:.*]], !dbg [[DBG23]], !nosanitize [[META10]]
26+
// CHECK-TRAP-NEXT: br i1 [[TMP1]], label %[[CONT:.*]], label %[[TRAP:.*]], !dbg [[DBG23]], !prof [[PROF27:![0-9]+]], !nosanitize [[META10]]
2727
// CHECK-TRAP: [[TRAP]]:
2828
// CHECK-TRAP-NEXT: call void @llvm.ubsantrap(i8 18) #[[ATTR3:[0-9]+]], !dbg [[DBG23]], !nosanitize [[META10]]
2929
// CHECK-TRAP-NEXT: unreachable, !dbg [[DBG23]], !nosanitize [[META10]]
3030
// CHECK-TRAP: [[CONT]]:
3131
// CHECK-TRAP-NEXT: [[IDXPROM:%.*]] = sext i32 [[CALL]] to i64, !dbg [[DBG26:![0-9]+]]
3232
// CHECK-TRAP-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x double], ptr [[A]], i64 0, i64 [[IDXPROM]], !dbg [[DBG26]]
3333
// CHECK-TRAP-NEXT: [[TMP2:%.*]] = load double, ptr [[ARRAYIDX]], align 8, !dbg [[DBG26]]
34-
// CHECK-TRAP-NEXT: ret double [[TMP2]], !dbg [[DBG27:![0-9]+]]
34+
// CHECK-TRAP-NEXT: ret double [[TMP2]], !dbg [[DBG28:![0-9]+]]
3535
//
3636
// CHECK-NOTRAP-LABEL: define dso_local double @f1(
3737
// CHECK-NOTRAP-SAME: i32 noundef [[B:%.*]], i32 noundef [[I:%.*]]) #[[ATTR0:[0-9]+]] !dbg [[DBG4:![0-9]+]] {
@@ -92,7 +92,8 @@ double f1(int b, int i) {
9292
// CHECK-TRAP: [[META24]] = distinct !DISubprogram(name: "__ubsan_check_array_bounds", scope: [[META5]], file: [[META5]], type: [[META25:![0-9]+]], flags: DIFlagArtificial, spFlags: DISPFlagDefinition, unit: [[META0]])
9393
// CHECK-TRAP: [[META25]] = !DISubroutineType(types: null)
9494
// CHECK-TRAP: [[DBG26]] = !DILocation(line: 66, column: 10, scope: [[DBG4]])
95-
// CHECK-TRAP: [[DBG27]] = !DILocation(line: 66, column: 3, scope: [[DBG4]])
95+
// CHECK-TRAP: [[PROF27]] = !{!"branch_weights", i32 1048575, i32 1}
96+
// CHECK-TRAP: [[DBG28]] = !DILocation(line: 66, column: 3, scope: [[DBG4]])
9697
//.
9798
// CHECK-NOTRAP: [[META0:![0-9]+]] = distinct !DICompileUnit(language: DW_LANG_C11, file: [[META1:![0-9]+]], isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: None)
9899
// CHECK-NOTRAP: [[META1]] = !DIFile(filename: "<stdin>", directory: {{.*}})

clang/test/CodeGen/cfi-check-fail.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ void caller(void (*f)(void)) {
1313
// CHECK: %[[DATA:.*]] = load ptr, ptr %[[ALLOCA0]], align 8
1414
// CHECK: %[[ADDR:.*]] = load ptr, ptr %[[ALLOCA1]], align 8
1515
// CHECK: %[[ICMP_NOT_NULL:.*]] = icmp ne ptr %[[DATA]], null
16-
// CHECK: br i1 %[[ICMP_NOT_NULL]], label %[[CONT0:.*]], label %[[TRAP:.*]],
16+
// CHECK: br i1 %[[ICMP_NOT_NULL]], label %[[CONT0:.*]], label %[[TRAP:.*]], !prof
1717

1818
// CHECK: [[TRAP]]:
1919
// CHECK-NEXT: call void @llvm.ubsantrap(i8 2)
@@ -35,7 +35,7 @@ void caller(void (*f)(void)) {
3535

3636
// CHECK: [[CONT1]]:
3737
// CHECK: %[[NOT_1:.*]] = icmp ne i8 %[[KIND]], 1
38-
// CHECK: br i1 %[[NOT_1]], label %[[CONT2:.*]], label %[[HANDLE1:.*]], !nosanitize
38+
// CHECK: br i1 %[[NOT_1]], label %[[CONT2:.*]], label %[[HANDLE1:.*]], !prof !{{[0-9]+}}, !nosanitize
3939

4040
// CHECK: [[HANDLE1]]:
4141
// CHECK-NEXT: call void @llvm.ubsantrap(i8 2)
@@ -63,7 +63,7 @@ void caller(void (*f)(void)) {
6363

6464
// CHECK: [[CONT4]]:
6565
// CHECK: %[[NOT_4:.*]] = icmp ne i8 %[[KIND]], 4
66-
// CHECK: br i1 %[[NOT_4]], label %[[CONT5:.*]], label %[[HANDLE4:.*]], !nosanitize
66+
// CHECK: br i1 %[[NOT_4]], label %[[CONT5:.*]], label %[[HANDLE4:.*]], !prof !{{[0-9]+}}, !nosanitize
6767

6868
// CHECK: [[HANDLE4]]:
6969
// CHECK-NEXT: call void @llvm.ubsantrap(i8 2)

clang/test/CodeGen/cfi-check-fail2.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ void caller(void (*f)(void)) {
1919
// CHECK: %[[DATA:.*]] = load ptr, ptr %[[ALLOCA0]], align 8
2020
// CHECK: %[[ADDR:.*]] = load ptr, ptr %[[ALLOCA1]], align 8
2121
// CHECK: %[[ICMP_NOT_NULL:.*]] = icmp ne ptr %[[DATA]], null
22-
// CHECK: br i1 %[[ICMP_NOT_NULL]], label %[[CONT0:.*]], label %[[TRAP:.*]],
22+
// CHECK: br i1 %[[ICMP_NOT_NULL]], label %[[CONT0:.*]], label %[[TRAP:.*]], !prof
2323

2424
// CHECK: [[TRAP]]:
2525
// CHECK-NEXT: call void @llvm.ubsantrap(i8 2)
@@ -41,31 +41,31 @@ void caller(void (*f)(void)) {
4141

4242
// CHECK: [[CONT1]]:
4343
// CHECK: %[[NOT_1:.*]] = icmp ne i8 %[[KIND]], 1
44-
// CHECK: br i1 %[[NOT_1]], label %[[CONT2:.*]], label %[[HANDLE1:.*]], !nosanitize
44+
// CHECK: br i1 %[[NOT_1]], label %[[CONT2:.*]], label %[[HANDLE1:.*]], !prof
4545

4646
// CHECK: [[HANDLE1]]:
4747
// CHECK-NEXT: call void @llvm.ubsantrap(i8 2)
4848
// CHECK-NEXT: unreachable
4949

5050
// CHECK: [[CONT2]]:
5151
// CHECK: %[[NOT_2:.*]] = icmp ne i8 %[[KIND]], 2
52-
// CHECK: br i1 %[[NOT_2]], label %[[CONT3:.*]], label %[[HANDLE2:.*]], !nosanitize
52+
// CHECK: br i1 %[[NOT_2]], label %[[CONT3:.*]], label %[[HANDLE2:.*]], !prof
5353

5454
// CHECK: [[HANDLE2]]:
5555
// CHECK-NEXT: call void @llvm.ubsantrap(i8 2)
5656
// CHECK-NEXT: unreachable
5757

5858
// CHECK: [[CONT3]]:
5959
// CHECK: %[[NOT_3:.*]] = icmp ne i8 %[[KIND]], 3
60-
// CHECK: br i1 %[[NOT_3]], label %[[CONT4:.*]], label %[[HANDLE3:.*]], !nosanitize
60+
// CHECK: br i1 %[[NOT_3]], label %[[CONT4:.*]], label %[[HANDLE3:.*]], !prof
6161

6262
// CHECK: [[HANDLE3]]:
6363
// CHECK-NEXT: call void @llvm.ubsantrap(i8 2)
6464
// CHECK-NEXT: unreachable
6565

6666
// CHECK: [[CONT4]]:
6767
// CHECK: %[[NOT_4:.*]] = icmp ne i8 %[[KIND]], 4
68-
// CHECK: br i1 %[[NOT_4]], label %[[CONT5:.*]], label %[[HANDLE4:.*]], !nosanitize
68+
// CHECK: br i1 %[[NOT_4]], label %[[CONT5:.*]], label %[[HANDLE4:.*]], !prof
6969

7070
// CHECK: [[HANDLE4]]:
7171
// CHECK-NEXT: call void @llvm.ubsantrap(i8 2)

0 commit comments

Comments
 (0)