Skip to content

Commit 409ca49

Browse files
authored
[ubsan] Pass fsanitize-skip-hot-cutoff into -fsanitize=bounds (llvm#122576)
1 parent 2d2fc4e commit 409ca49

File tree

3 files changed

+37
-17
lines changed

3 files changed

+37
-17
lines changed

clang/lib/CodeGen/BackendUtil.cpp

+12
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@
8585
#include "llvm/Transforms/Scalar/JumpThreading.h"
8686
#include "llvm/Transforms/Utils/Debugify.h"
8787
#include "llvm/Transforms/Utils/ModuleUtils.h"
88+
#include <limits>
8889
#include <memory>
8990
#include <optional>
9091
using namespace clang;
@@ -119,6 +120,9 @@ static cl::opt<PGOOptions::ColdFuncOpt> ClPGOColdFuncAttr(
119120

120121
extern cl::opt<InstrProfCorrelator::ProfCorrelatorKind> ProfileCorrelate;
121122
} // namespace llvm
123+
namespace clang {
124+
extern llvm::cl::opt<bool> ClSanitizeGuardChecks;
125+
}
122126

123127
namespace {
124128

@@ -1023,6 +1027,14 @@ void EmitAssemblyHelper::RunOptimizationPipeline(
10231027
PB.registerScalarOptimizerLateEPCallback([this](FunctionPassManager &FPM,
10241028
OptimizationLevel Level) {
10251029
BoundsCheckingPass::Options Options;
1030+
if (CodeGenOpts.SanitizeSkipHotCutoffs[SanitizerKind::SO_LocalBounds] ||
1031+
ClSanitizeGuardChecks) {
1032+
static_assert(SanitizerKind::SO_LocalBounds <=
1033+
std::numeric_limits<
1034+
decltype(Options.GuardKind)::value_type>::max(),
1035+
"Update type of llvm.allow.ubsan.check.");
1036+
Options.GuardKind = SanitizerKind::SO_LocalBounds;
1037+
}
10261038
Options.Merge =
10271039
CodeGenOpts.SanitizeMergeHandlers.has(SanitizerKind::LocalBounds);
10281040
if (!CodeGenOpts.SanitizeTrap.has(SanitizerKind::LocalBounds)) {

clang/lib/CodeGen/CGExpr.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,13 @@
5252
using namespace clang;
5353
using namespace CodeGen;
5454

55+
namespace clang {
5556
// TODO: Introduce frontend options to enabled per sanitizers, similar to
5657
// `fsanitize-trap`.
57-
static llvm::cl::opt<bool> ClSanitizeGuardChecks(
58+
llvm::cl::opt<bool> ClSanitizeGuardChecks(
5859
"ubsan-guard-checks", llvm::cl::Optional,
5960
llvm::cl::desc("Guard UBSAN checks with `llvm.allow.ubsan.check()`."));
61+
} // namespace clang
6062

6163
//===--------------------------------------------------------------------===//
6264
// Defines for metadata

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

+22-16
Original file line numberDiff line numberDiff line change
@@ -174,12 +174,14 @@ void use(double*);
174174
// CHECK-NEXT: [[VLA:%.*]] = alloca double, i64 [[TMP0]], align 16
175175
// CHECK-NEXT: call void @use(ptr noundef nonnull [[VLA]]) #[[ATTR7:[0-9]+]]
176176
// CHECK-NEXT: [[IDXPROM:%.*]] = sext i32 [[I]] to i64
177-
// CHECK-NEXT: [[DOTNOT:%.*]] = icmp ugt i64 [[TMP0]], [[IDXPROM]]
178-
// CHECK-NEXT: br i1 [[DOTNOT]], label %[[BB1:.*]], label %[[TRAP:.*]]
179-
// CHECK: [[BB1]]:
177+
// CHECK-NEXT: [[TMP1:%.*]] = icmp ule i64 [[TMP0]], [[IDXPROM]]
178+
// CHECK-NEXT: [[TMP2:%.*]] = call i1 @llvm.allow.ubsan.check(i8 71), !nosanitize [[META2]]
179+
// CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]], !nosanitize [[META2]]
180+
// CHECK-NEXT: br i1 [[TMP3]], label %[[TRAP:.*]], label %[[BB4:.*]]
181+
// CHECK: [[BB4]]:
180182
// CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds double, ptr [[VLA]], i64 [[IDXPROM]]
181-
// CHECK-NEXT: [[TMP2:%.*]] = load double, ptr [[ARRAYIDX]], align 8, !tbaa [[TBAA8:![0-9]+]]
182-
// CHECK-NEXT: ret double [[TMP2]]
183+
// CHECK-NEXT: [[TMP5:%.*]] = load double, ptr [[ARRAYIDX]], align 8, !tbaa [[TBAA8:![0-9]+]]
184+
// CHECK-NEXT: ret double [[TMP5]]
183185
// CHECK: [[TRAP]]:
184186
// CHECK-NEXT: call void @__ubsan_handle_local_out_of_bounds_abort() #[[ATTR6]], !nosanitize [[META2]]
185187
// CHECK-NEXT: unreachable, !nosanitize [[META2]]
@@ -191,12 +193,14 @@ void use(double*);
191193
// TR-NEXT: [[VLA:%.*]] = alloca double, i64 [[TMP0]], align 16
192194
// TR-NEXT: call void @use(ptr noundef nonnull [[VLA]]) #[[ATTR6:[0-9]+]]
193195
// TR-NEXT: [[IDXPROM:%.*]] = sext i32 [[I]] to i64
194-
// TR-NEXT: [[DOTNOT:%.*]] = icmp ugt i64 [[TMP0]], [[IDXPROM]]
195-
// TR-NEXT: br i1 [[DOTNOT]], label %[[BB1:.*]], label %[[TRAP:.*]]
196-
// TR: [[BB1]]:
196+
// TR-NEXT: [[TMP1:%.*]] = icmp ule i64 [[TMP0]], [[IDXPROM]]
197+
// TR-NEXT: [[TMP2:%.*]] = call i1 @llvm.allow.ubsan.check(i8 71), !nosanitize [[META2]]
198+
// TR-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]], !nosanitize [[META2]]
199+
// TR-NEXT: br i1 [[TMP3]], label %[[TRAP:.*]], label %[[BB4:.*]]
200+
// TR: [[BB4]]:
197201
// TR-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds double, ptr [[VLA]], i64 [[IDXPROM]]
198-
// TR-NEXT: [[TMP2:%.*]] = load double, ptr [[ARRAYIDX]], align 8, !tbaa [[TBAA7:![0-9]+]]
199-
// TR-NEXT: ret double [[TMP2]]
202+
// TR-NEXT: [[TMP5:%.*]] = load double, ptr [[ARRAYIDX]], align 8, !tbaa [[TBAA7:![0-9]+]]
203+
// TR-NEXT: ret double [[TMP5]]
200204
// TR: [[TRAP]]:
201205
// TR-NEXT: call void @llvm.ubsantrap(i8 3) #[[ATTR5]], !nosanitize [[META2]]
202206
// TR-NEXT: unreachable, !nosanitize [[META2]]
@@ -208,15 +212,17 @@ void use(double*);
208212
// REC-NEXT: [[VLA:%.*]] = alloca double, i64 [[TMP0]], align 16
209213
// REC-NEXT: call void @use(ptr noundef nonnull [[VLA]]) #[[ATTR5:[0-9]+]]
210214
// REC-NEXT: [[IDXPROM:%.*]] = sext i32 [[I]] to i64
211-
// REC-NEXT: [[DOTNOT:%.*]] = icmp ugt i64 [[TMP0]], [[IDXPROM]]
212-
// REC-NEXT: br i1 [[DOTNOT]], label %[[BB1:.*]], label %[[TRAP:.*]]
213-
// REC: [[BB1]]:
215+
// REC-NEXT: [[TMP1:%.*]] = icmp ule i64 [[TMP0]], [[IDXPROM]]
216+
// REC-NEXT: [[TMP2:%.*]] = call i1 @llvm.allow.ubsan.check(i8 71), !nosanitize [[META2]]
217+
// REC-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]], !nosanitize [[META2]]
218+
// REC-NEXT: br i1 [[TMP3]], label %[[TRAP:.*]], label %[[BB4:.*]]
219+
// REC: [[BB4]]:
214220
// REC-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds double, ptr [[VLA]], i64 [[IDXPROM]]
215-
// REC-NEXT: [[TMP2:%.*]] = load double, ptr [[ARRAYIDX]], align 8, !tbaa [[TBAA8:![0-9]+]]
216-
// REC-NEXT: ret double [[TMP2]]
221+
// REC-NEXT: [[TMP5:%.*]] = load double, ptr [[ARRAYIDX]], align 8, !tbaa [[TBAA8:![0-9]+]]
222+
// REC-NEXT: ret double [[TMP5]]
217223
// REC: [[TRAP]]:
218224
// REC-NEXT: call void @__ubsan_handle_local_out_of_bounds() #[[ATTR6]], !nosanitize [[META2]]
219-
// REC-NEXT: br label %[[BB1]], !nosanitize [[META2]]
225+
// REC-NEXT: br label %[[BB4]], !nosanitize [[META2]]
220226
//
221227
double lbounds(int b, int i) {
222228
double a[b];

0 commit comments

Comments
 (0)