Skip to content

Commit 94c8083

Browse files
committed
Address Vitaly's feedback
1 parent 77a3e49 commit 94c8083

File tree

4 files changed

+27
-102
lines changed

4 files changed

+27
-102
lines changed

clang/docs/ReleaseNotes.rst

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -445,11 +445,6 @@ New Compiler Flags
445445
- The ``-Warray-compare-cxx26`` warning has been added to warn about array comparison
446446
starting from C++26, this warning is enabled as an error by default.
447447

448-
- ``-fsanitize-merge`` (default) and ``-fno-sanitize-merge`` have been added for
449-
fine-grained, unified control of which UBSan checks can potentially be merged
450-
by the compiler (for example,
451-
``-fno-sanitize-merge=bool,enum,array-bounds,local-bounds``).
452-
453448
Deprecated Compiler Flags
454449
-------------------------
455450

@@ -489,11 +484,6 @@ Removed Compiler Flags
489484
derivatives) is now removed, since it's no longer possible to suppress the
490485
diagnostic (see above). Users can expect an `unknown warning` diagnostic if
491486
it's still in use.
492-
- The experimental flags '-ubsan-unique-traps' and
493-
'-bounds-checking-unique-traps' have been removed. The combination of the
494-
two flags is equivalent to '-fno-sanitize-merge' with no parameters.
495-
'-bounds-checking-unique-traps' can be selectively controlled via
496-
'-f(no-)sanitize-merge=local-bounds'.
497487

498488
Attribute Changes in Clang
499489
--------------------------
@@ -1212,6 +1202,11 @@ Sanitizers
12121202

12131203
- Implemented ``-f[no-]sanitize-trap=local-bounds``, and ``-f[no-]sanitize-recover=local-bounds``.
12141204

1205+
- ``-fsanitize-merge`` (default) and ``-fno-sanitize-merge`` have been added for
1206+
fine-grained, unified control of which UBSan checks can potentially be merged
1207+
by the compiler (for example,
1208+
``-fno-sanitize-merge=bool,enum,array-bounds,local-bounds``).
1209+
12151210
Python Binding Changes
12161211
----------------------
12171212
- Fixed an issue that led to crashes when calling ``Type.get_exception_specification_kind``.

llvm/lib/Passes/PassBuilder.cpp

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1284,7 +1284,7 @@ parseRegAllocFastPassOptions(PassBuilder &PB, StringRef Params) {
12841284
Expected<BoundsCheckingPass::BoundsCheckingOptions>
12851285
parseBoundsCheckingOptions(StringRef Params) {
12861286
BoundsCheckingPass::BoundsCheckingOptions Options(
1287-
BoundsCheckingPass::ReportingMode::Trap, true);
1287+
BoundsCheckingPass::ReportingMode::Trap, false);
12881288
while (!Params.empty()) {
12891289
StringRef ParamName;
12901290
std::tie(ParamName, Params) = Params.split(';');
@@ -1298,18 +1298,8 @@ parseBoundsCheckingOptions(StringRef Params) {
12981298
Options.Mode = BoundsCheckingPass::ReportingMode::MinRuntime;
12991299
} else if (ParamName == "min-rt-abort") {
13001300
Options.Mode = BoundsCheckingPass::ReportingMode::MinRuntimeAbort;
1301-
} else if (ParamName.consume_front("merge=")) {
1302-
if (ParamName == "true")
1303-
Options.Merge = true;
1304-
else if (ParamName == "false")
1305-
Options.Merge = false;
1306-
else {
1307-
return make_error<StringError>(
1308-
formatv("invalid BoundsChecking pass merge parameter: '{0}' ",
1309-
ParamName)
1310-
.str(),
1311-
inconvertibleErrorCode());
1312-
}
1301+
} else if (ParamName == "merge") {
1302+
Options.Merge = true;
13131303
} else {
13141304
return make_error<StringError>(
13151305
formatv("invalid BoundsChecking pass parameter '{0}' ", ParamName)

llvm/lib/Transforms/Instrumentation/BoundsChecking.cpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -305,19 +305,22 @@ void BoundsCheckingPass::printPipeline(
305305
OS, MapClassName2PassName);
306306
switch (Options.Mode) {
307307
case ReportingMode::Trap:
308-
OS << "<trap>";
308+
OS << "<trap";
309309
break;
310310
case ReportingMode::MinRuntime:
311-
OS << "<min-rt>";
311+
OS << "<min-rt";
312312
break;
313313
case ReportingMode::MinRuntimeAbort:
314-
OS << "<min-rt-abort>";
314+
OS << "<min-rt-abort";
315315
break;
316316
case ReportingMode::FullRuntime:
317-
OS << "<rt>";
317+
OS << "<rt";
318318
break;
319319
case ReportingMode::FullRuntimeAbort:
320-
OS << "<rt-abort>";
320+
OS << "<rt-abort";
321321
break;
322322
}
323+
if (Options.Merge)
324+
OS << ";merge";
325+
OS << ">";
323326
}

llvm/test/Instrumentation/BoundsChecking/runtimes.ll

Lines changed: 11 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,13 @@
11
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2-
; RUN: opt < %s -passes=bounds-checking -S | FileCheck %s --check-prefixes=TR
3-
; RUN: opt < %s -passes='bounds-checking<trap>' -S | FileCheck %s --check-prefixes=TR
4-
; RUN: opt < %s -passes='bounds-checking<rt>' -S | FileCheck %s --check-prefixes=RT
5-
; RUN: opt < %s -passes='bounds-checking<rt-abort>' -S | FileCheck %s --check-prefixes=RTABORT
6-
; RUN: opt < %s -passes='bounds-checking<min-rt>' -S | FileCheck %s --check-prefixes=MINRT
7-
; RUN: opt < %s -passes='bounds-checking<min-rt-abort>' -S | FileCheck %s --check-prefixes=MINRTABORT
2+
; RUN: opt < %s -passes=bounds-checking -S | FileCheck %s --check-prefixes=TR-NOMERGE
3+
; RUN: opt < %s -passes='bounds-checking<trap>' -S | FileCheck %s --check-prefixes=TR-NOMERGE
4+
; RUN: opt < %s -passes='bounds-checking<rt>' -S | FileCheck %s --check-prefixes=RT-NOMERGE
5+
; RUN: opt < %s -passes='bounds-checking<rt-abort>' -S | FileCheck %s --check-prefixes=RTABORT-NOMERGE
6+
; RUN: opt < %s -passes='bounds-checking<min-rt>' -S | FileCheck %s --check-prefixes=MINRT-NOMERGE
7+
; RUN: opt < %s -passes='bounds-checking<min-rt-abort>' -S | FileCheck %s --check-prefixes=MINRTABORT-NOMERGE
88
;
9-
; merge defaults to true
10-
; RUN: opt < %s -passes='bounds-checking<merge=true>' -S | FileCheck %s --check-prefixes=TR
11-
; RUN: opt < %s -passes='bounds-checking<trap;merge=true>' -S | FileCheck %s --check-prefixes=TR
12-
; RUN: opt < %s -passes='bounds-checking<rt;merge=true>' -S | FileCheck %s --check-prefixes=RT
13-
; RUN: opt < %s -passes='bounds-checking<rt-abort;merge=true>' -S | FileCheck %s --check-prefixes=RTABORT
14-
; RUN: opt < %s -passes='bounds-checking<min-rt;merge=true>' -S | FileCheck %s --check-prefixes=MINRT
15-
; RUN: opt < %s -passes='bounds-checking<min-rt-abort;merge=true>' -S | FileCheck %s --check-prefixes=MINRTABORT
16-
;
17-
; RUN: opt < %s -passes='bounds-checking<merge=false>' -S | FileCheck %s --check-prefixes=TR-NOMERGE
18-
; RUN: opt < %s -passes='bounds-checking<trap;merge=false>' -S | FileCheck %s --check-prefixes=TR-NOMERGE
19-
; RUN: opt < %s -passes='bounds-checking<rt;merge=false>' -S | FileCheck %s --check-prefixes=RT-NOMERGE
20-
; RUN: opt < %s -passes='bounds-checking<rt-abort;merge=false>' -S | FileCheck %s --check-prefixes=RTABORT-NOMERGE
21-
; RUN: opt < %s -passes='bounds-checking<min-rt;merge=false>' -S | FileCheck %s --check-prefixes=MINRT-NOMERGE
22-
; RUN: opt < %s -passes='bounds-checking<min-rt-abort;merge=false>' -S | FileCheck %s --check-prefixes=MINRTABORT-NOMERGE
9+
; RUN: opt < %s -passes='bounds-checking<trap;merge>' -S | FileCheck %s --check-prefixes=TR
10+
; RUN: opt < %s -passes='bounds-checking<rt;merge>' -S | FileCheck %s --check-prefixes=RT
2311

2412
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"
2513

@@ -56,54 +44,6 @@ define void @f1(i64 %x) nounwind {
5644
; RT-NEXT: call void @__ubsan_handle_local_out_of_bounds() #[[ATTR0]]
5745
; RT-NEXT: br label %[[BB7]]
5846
;
59-
; RTABORT-LABEL: define void @f1(
60-
; RTABORT-SAME: i64 [[X:%.*]]) #[[ATTR0:[0-9]+]] {
61-
; RTABORT-NEXT: [[TMP1:%.*]] = mul i64 16, [[X]]
62-
; RTABORT-NEXT: [[TMP2:%.*]] = alloca i128, i64 [[X]], align 8
63-
; RTABORT-NEXT: [[TMP3:%.*]] = sub i64 [[TMP1]], 0
64-
; RTABORT-NEXT: [[TMP4:%.*]] = icmp ult i64 [[TMP3]], 16
65-
; RTABORT-NEXT: [[TMP5:%.*]] = or i1 false, [[TMP4]]
66-
; RTABORT-NEXT: [[TMP6:%.*]] = or i1 false, [[TMP5]]
67-
; RTABORT-NEXT: br i1 [[TMP6]], label %[[TRAP:.*]], label %[[BB7:.*]]
68-
; RTABORT: [[BB7]]:
69-
; RTABORT-NEXT: [[TMP8:%.*]] = load i128, ptr [[TMP2]], align 4
70-
; RTABORT-NEXT: ret void
71-
; RTABORT: [[TRAP]]:
72-
; RTABORT-NEXT: call void @__ubsan_handle_local_out_of_bounds_abort() #[[ATTR1:[0-9]+]]
73-
; RTABORT-NEXT: unreachable
74-
;
75-
; MINRT-LABEL: define void @f1(
76-
; MINRT-SAME: i64 [[X:%.*]]) #[[ATTR0:[0-9]+]] {
77-
; MINRT-NEXT: [[TMP1:%.*]] = mul i64 16, [[X]]
78-
; MINRT-NEXT: [[TMP2:%.*]] = alloca i128, i64 [[X]], align 8
79-
; MINRT-NEXT: [[TMP3:%.*]] = sub i64 [[TMP1]], 0
80-
; MINRT-NEXT: [[TMP4:%.*]] = icmp ult i64 [[TMP3]], 16
81-
; MINRT-NEXT: [[TMP5:%.*]] = or i1 false, [[TMP4]]
82-
; MINRT-NEXT: [[TMP6:%.*]] = or i1 false, [[TMP5]]
83-
; MINRT-NEXT: br i1 [[TMP6]], label %[[TRAP:.*]], label %[[BB7:.*]]
84-
; MINRT: [[BB7]]:
85-
; MINRT-NEXT: [[TMP8:%.*]] = load i128, ptr [[TMP2]], align 4
86-
; MINRT-NEXT: ret void
87-
; MINRT: [[TRAP]]:
88-
; MINRT-NEXT: call void @__ubsan_handle_local_out_of_bounds_minimal() #[[ATTR0]]
89-
; MINRT-NEXT: br label %[[BB7]]
90-
;
91-
; MINRTABORT-LABEL: define void @f1(
92-
; MINRTABORT-SAME: i64 [[X:%.*]]) #[[ATTR0:[0-9]+]] {
93-
; MINRTABORT-NEXT: [[TMP1:%.*]] = mul i64 16, [[X]]
94-
; MINRTABORT-NEXT: [[TMP2:%.*]] = alloca i128, i64 [[X]], align 8
95-
; MINRTABORT-NEXT: [[TMP3:%.*]] = sub i64 [[TMP1]], 0
96-
; MINRTABORT-NEXT: [[TMP4:%.*]] = icmp ult i64 [[TMP3]], 16
97-
; MINRTABORT-NEXT: [[TMP5:%.*]] = or i1 false, [[TMP4]]
98-
; MINRTABORT-NEXT: [[TMP6:%.*]] = or i1 false, [[TMP5]]
99-
; MINRTABORT-NEXT: br i1 [[TMP6]], label %[[TRAP:.*]], label %[[BB7:.*]]
100-
; MINRTABORT: [[BB7]]:
101-
; MINRTABORT-NEXT: [[TMP8:%.*]] = load i128, ptr [[TMP2]], align 4
102-
; MINRTABORT-NEXT: ret void
103-
; MINRTABORT: [[TRAP]]:
104-
; MINRTABORT-NEXT: call void @__ubsan_handle_local_out_of_bounds_minimal_abort() #[[ATTR1:[0-9]+]]
105-
; MINRTABORT-NEXT: unreachable
106-
;
10747
; TR-NOMERGE-LABEL: define void @f1(
10848
; TR-NOMERGE-SAME: i64 [[X:%.*]]) #[[ATTR0:[0-9]+]] {
10949
; TR-NOMERGE-NEXT: [[TMP1:%.*]] = mul i64 16, [[X]]
@@ -189,14 +129,11 @@ define void @f1(i64 %x) nounwind {
189129
ret void
190130
}
191131

192-
; TR: attributes #[[ATTR2]] = { noreturn nounwind }
193-
; RT: attributes #[[ATTR0]] = { nounwind }
194-
; RTABORT: attributes #[[ATTR1]] = { noreturn nounwind }
195-
; MINRT: attributes #[[ATTR0]] = { nounwind }
196-
; MINRTABORT: attributes #[[ATTR1]] = { noreturn nounwind }
197-
198132
; TR-NOMERGE: attributes #[[ATTR2]] = { nomerge noreturn nounwind }
199133
; RT-NOMERGE: attributes #[[ATTR1]] = { nomerge nounwind }
200134
; RTABORT-NOMERGE: attributes #[[ATTR2]] = { nomerge noreturn nounwind }
201135
; MINRT-NOMERGE: attributes #[[ATTR1]] = { nomerge nounwind }
202136
; MINRTABORT-NOMERGE: attributes #[[ATTR2]] = { nomerge noreturn nounwind }
137+
;
138+
; TR: attributes #[[ATTR2]] = { noreturn nounwind }
139+
; RT: attributes #[[ATTR0]] = { nounwind }

0 commit comments

Comments
 (0)