Skip to content

Commit ef92e6b

Browse files
authored
[BoundsChecking] Update ubsantrap to use GuardKind (#124613)
This change makes it consistent with other uses of ubsantrap. This also updates the tests. Notably, BoundsChecking/runtimes.ll had guard=3 which passed only because the method of calculating the parameter (`IRB.GetInsertBlock()->getParent()->size()`) happened to give the same answer.
1 parent f388ca3 commit ef92e6b

File tree

3 files changed

+33
-23
lines changed

3 files changed

+33
-23
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ void use(double*);
202202
// TR-NEXT: [[TMP5:%.*]] = load double, ptr [[ARRAYIDX]], align 8, !tbaa [[TBAA7:![0-9]+]]
203203
// TR-NEXT: ret double [[TMP5]]
204204
// TR: [[TRAP]]:
205-
// TR-NEXT: call void @llvm.ubsantrap(i8 3) #[[ATTR5]], !nosanitize [[META2]]
205+
// TR-NEXT: call void @llvm.ubsantrap(i8 71) #[[ATTR5]], !nosanitize [[META2]]
206206
// TR-NEXT: unreachable, !nosanitize [[META2]]
207207
//
208208
// REC-LABEL: define dso_local double @lbounds(

llvm/lib/Transforms/Instrumentation/BoundsChecking.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -108,14 +108,17 @@ static Value *getBoundsCheckCond(Value *Ptr, Value *InstVal,
108108
return Or;
109109
}
110110

111-
static CallInst *InsertTrap(BuilderTy &IRB, bool DebugTrapBB) {
111+
static CallInst *InsertTrap(BuilderTy &IRB, bool DebugTrapBB,
112+
std::optional<int8_t> GuardKind) {
112113
if (!DebugTrapBB)
113114
return IRB.CreateIntrinsic(Intrinsic::trap, {}, {});
114-
// FIXME: Ideally we would use the SanitizerHandler::OutOfBounds constant.
115+
115116
return IRB.CreateIntrinsic(
116117
Intrinsic::ubsantrap, {},
117118
ConstantInt::get(IRB.getInt8Ty(),
118-
IRB.GetInsertBlock()->getParent()->size()));
119+
GuardKind.has_value()
120+
? GuardKind.value()
121+
: IRB.GetInsertBlock()->getParent()->size()));
119122
}
120123

121124
static CallInst *InsertCall(BuilderTy &IRB, bool MayReturn, StringRef Name) {
@@ -250,7 +253,7 @@ static bool addBoundsChecking(Function &F, TargetLibraryInfo &TLI,
250253

251254
bool DebugTrapBB = !Opts.Merge;
252255
CallInst *TrapCall = Opts.Rt ? InsertCall(IRB, Opts.Rt->MayReturn, Name)
253-
: InsertTrap(IRB, DebugTrapBB);
256+
: InsertTrap(IRB, DebugTrapBB, Opts.GuardKind);
254257
if (DebugTrapBB)
255258
TrapCall->addFnAttr(llvm::Attribute::NoMerge);
256259

llvm/test/Instrumentation/BoundsChecking/runtimes.ll

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
; RUN: opt < %s -passes='bounds-checking<min-rt>' -S | FileCheck %s --check-prefixes=MINRT-NOMERGE
1010
; RUN: opt < %s -passes='bounds-checking<min-rt-abort>' -S | FileCheck %s --check-prefixes=MINRTABORT-NOMERGE
1111
;
12-
; RUN: opt < %s -passes='bounds-checking<trap;guard=3>' -S | FileCheck %s --check-prefixes=TR-GUARD
12+
; RUN: opt < %s -passes='bounds-checking<trap;guard=3>' -S | FileCheck %s --check-prefixes=TR-GUARD-COMMON,TR-GUARD-THREE
13+
; RUN: opt < %s -passes='bounds-checking<trap;guard=13>' -S | FileCheck %s --check-prefixes=TR-GUARD-COMMON,TR-GUARD-THIRTEEN
1314
; RUN: opt < %s -passes='bounds-checking<rt;guard=-5>' -S | FileCheck %s --check-prefixes=RT-GUARD
1415
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
1516

@@ -126,23 +127,29 @@ define void @f1(i64 %x) nounwind {
126127
; MINRTABORT-NOMERGE-NEXT: call void @__ubsan_handle_local_out_of_bounds_minimal_abort() #[[ATTR2:[0-9]+]], !nosanitize [[META0]]
127128
; MINRTABORT-NOMERGE-NEXT: unreachable, !nosanitize [[META0]]
128129
;
129-
; TR-GUARD-LABEL: define void @f1(
130-
; TR-GUARD-SAME: i64 [[X:%.*]]) #[[ATTR0:[0-9]+]] {
131-
; TR-GUARD-NEXT: [[TMP1:%.*]] = mul i64 16, [[X]]
132-
; TR-GUARD-NEXT: [[TMP2:%.*]] = alloca i128, i64 [[X]], align 8
133-
; TR-GUARD-NEXT: [[TMP3:%.*]] = sub i64 [[TMP1]], 0, !nosanitize [[META0:![0-9]+]]
134-
; TR-GUARD-NEXT: [[TMP4:%.*]] = icmp ult i64 [[TMP3]], 16, !nosanitize [[META0]]
135-
; TR-GUARD-NEXT: [[TMP5:%.*]] = or i1 false, [[TMP4]], !nosanitize [[META0]]
136-
; TR-GUARD-NEXT: [[TMP6:%.*]] = or i1 false, [[TMP5]], !nosanitize [[META0]]
137-
; TR-GUARD-NEXT: [[TMP7:%.*]] = call i1 @llvm.allow.ubsan.check(i8 3), !nosanitize [[META0]]
138-
; TR-GUARD-NEXT: [[TMP8:%.*]] = and i1 [[TMP6]], [[TMP7]], !nosanitize [[META0]]
139-
; TR-GUARD-NEXT: br i1 [[TMP8]], label %[[TRAP:.*]], label %[[BB9:.*]]
140-
; TR-GUARD: [[BB9]]:
141-
; TR-GUARD-NEXT: [[TMP10:%.*]] = load i128, ptr [[TMP2]], align 4
142-
; TR-GUARD-NEXT: ret void
143-
; TR-GUARD: [[TRAP]]:
144-
; TR-GUARD-NEXT: call void @llvm.ubsantrap(i8 3) #[[ATTR3:[0-9]+]], !nosanitize [[META0]]
145-
; TR-GUARD-NEXT: unreachable, !nosanitize [[META0]]
130+
; TR-GUARD-COMMON-LABEL: define void @f1(
131+
; TR-GUARD-COMMON-SAME: i64 [[X:%.*]]) #[[ATTR0:[0-9]+]] {
132+
; TR-GUARD-COMMON-NEXT: [[TMP1:%.*]] = mul i64 16, [[X]]
133+
; TR-GUARD-COMMON-NEXT: [[TMP2:%.*]] = alloca i128, i64 [[X]], align 8
134+
; TR-GUARD-COMMON-NEXT: [[TMP3:%.*]] = sub i64 [[TMP1]], 0, !nosanitize [[META0:![0-9]+]]
135+
; TR-GUARD-COMMON-NEXT: [[TMP4:%.*]] = icmp ult i64 [[TMP3]], 16, !nosanitize [[META0]]
136+
; TR-GUARD-COMMON-NEXT: [[TMP5:%.*]] = or i1 false, [[TMP4]], !nosanitize [[META0]]
137+
; TR-GUARD-COMMON-NEXT: [[TMP6:%.*]] = or i1 false, [[TMP5]], !nosanitize [[META0]]
138+
;
139+
; TR-GUARD-THREE: [[TMP7:%.*]] = call i1 @llvm.allow.ubsan.check(i8 3), !nosanitize [[META0]]
140+
; TR-GUARD-THIRTEEN: [[TMP7:%.*]] = call i1 @llvm.allow.ubsan.check(i8 13), !nosanitize [[META0]]
141+
;
142+
; TR-GUARD-COMMON: [[TMP8:%.*]] = and i1 [[TMP6]], [[TMP7]], !nosanitize [[META0]]
143+
; TR-GUARD-COMMON-NEXT: br i1 [[TMP8]], label %[[TRAP:.*]], label %[[BB9:.*]]
144+
; TR-GUARD-COMMON: [[BB9]]:
145+
; TR-GUARD-COMMON-NEXT: [[TMP10:%.*]] = load i128, ptr [[TMP2]], align 4
146+
; TR-GUARD-COMMON-NEXT: ret void
147+
; TR-GUARD-COMMON: [[TRAP]]:
148+
;
149+
; TR-GUARD-THREE: call void @llvm.ubsantrap(i8 3) #[[ATTR3:[0-9]+]], !nosanitize [[META0]]
150+
; TR-GUARD-THIRTEEN: call void @llvm.ubsantrap(i8 13) #[[ATTR3:[0-9]+]], !nosanitize [[META0]]
151+
;
152+
; TR-GUARD-COMMON: unreachable, !nosanitize [[META0]]
146153
;
147154
; RT-GUARD-LABEL: define void @f1(
148155
; RT-GUARD-SAME: i64 [[X:%.*]]) #[[ATTR0:[0-9]+]] {

0 commit comments

Comments
 (0)