1
1
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 4
2
- // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -emit-llvm -o - %s -fsanitize=signed-integer-overflow,integer-divide-by-zero,null | FileCheck %s
3
- // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -emit-llvm -o - %s -fsanitize=signed-integer-overflow,integer-divide-by-zero,null -fsanitize-trap=signed-integer-overflow,integer-divide-by-zero,null | FileCheck %s --check-prefixes=TRAP
4
- // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -emit-llvm -o - %s -fsanitize=signed-integer-overflow,integer-divide-by-zero,null -fsanitize-recover=signed-integer-overflow,integer-divide-by-zero,null | FileCheck %s --check-prefixes=RECOVER
2
+ // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -emit-llvm -o - %s -fsanitize=signed-integer-overflow,integer-divide-by-zero,null -mllvm -ubsan-guard-checks | FileCheck %s
3
+ // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -emit-llvm -o - %s -fsanitize=signed-integer-overflow,integer-divide-by-zero,null -mllvm -ubsan-guard-checks - fsanitize-trap=signed-integer-overflow,integer-divide-by-zero,null | FileCheck %s --check-prefixes=TRAP
4
+ // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -emit-llvm -o - %s -fsanitize=signed-integer-overflow,integer-divide-by-zero,null -mllvm -ubsan-guard-checks - fsanitize-recover=signed-integer-overflow,integer-divide-by-zero,null | FileCheck %s --check-prefixes=RECOVER
5
5
6
6
7
7
// CHECK-LABEL: define dso_local i32 @div(
18
18
// CHECK-NEXT: [[TMP4:%.*]] = icmp ne i32 [[TMP1]], -1, !nosanitize [[META2]]
19
19
// CHECK-NEXT: [[OR:%.*]] = or i1 [[TMP3]], [[TMP4]], !nosanitize [[META2]]
20
20
// CHECK-NEXT: [[TMP5:%.*]] = and i1 [[TMP2]], [[OR]], !nosanitize [[META2]]
21
- // CHECK-NEXT: br i1 [[TMP5]], label [[CONT:%.*]], label [[HANDLER_DIVREM_OVERFLOW:%.*]], !prof [[PROF3:![0-9]+]], !nosanitize [[META2]]
21
+ // CHECK-NEXT: [[TMP6:%.*]] = call i1 @llvm.allow.ubsan.check(i8 3), !nosanitize [[META2]]
22
+ // CHECK-NEXT: [[TMP7:%.*]] = xor i1 [[TMP6]], true, !nosanitize [[META2]]
23
+ // CHECK-NEXT: [[TMP8:%.*]] = or i1 [[TMP5]], [[TMP7]], !nosanitize [[META2]]
24
+ // CHECK-NEXT: br i1 [[TMP8]], label [[CONT:%.*]], label [[HANDLER_DIVREM_OVERFLOW:%.*]], !prof [[PROF3:![0-9]+]], !nosanitize [[META2]]
22
25
// CHECK: handler.divrem_overflow:
23
- // CHECK-NEXT: [[TMP6 :%.*]] = zext i32 [[TMP0]] to i64, !nosanitize [[META2]]
24
- // CHECK-NEXT: [[TMP7 :%.*]] = zext i32 [[TMP1]] to i64, !nosanitize [[META2]]
25
- // CHECK-NEXT: call void @__ubsan_handle_divrem_overflow_abort(ptr @[[GLOB1:[0-9]+]], i64 [[TMP6 ]], i64 [[TMP7 ]]) #[[ATTR3 :[0-9]+]], !nosanitize [[META2]]
26
+ // CHECK-NEXT: [[TMP9 :%.*]] = zext i32 [[TMP0]] to i64, !nosanitize [[META2]]
27
+ // CHECK-NEXT: [[TMP10 :%.*]] = zext i32 [[TMP1]] to i64, !nosanitize [[META2]]
28
+ // CHECK-NEXT: call void @__ubsan_handle_divrem_overflow_abort(ptr @[[GLOB1:[0-9]+]], i64 [[TMP9 ]], i64 [[TMP10 ]]) #[[ATTR4 :[0-9]+]], !nosanitize [[META2]]
26
29
// CHECK-NEXT: unreachable, !nosanitize [[META2]]
27
30
// CHECK: cont:
28
31
// CHECK-NEXT: [[DIV:%.*]] = sdiv i32 [[TMP0]], [[TMP1]]
42
45
// TRAP-NEXT: [[TMP4:%.*]] = icmp ne i32 [[TMP1]], -1, !nosanitize [[META2]]
43
46
// TRAP-NEXT: [[OR:%.*]] = or i1 [[TMP3]], [[TMP4]], !nosanitize [[META2]]
44
47
// TRAP-NEXT: [[TMP5:%.*]] = and i1 [[TMP2]], [[OR]], !nosanitize [[META2]]
45
- // TRAP-NEXT: br i1 [[TMP5]], label [[CONT:%.*]], label [[TRAP:%.*]], !nosanitize [[META2]]
48
+ // TRAP-NEXT: [[TMP6:%.*]] = call i1 @llvm.allow.ubsan.check(i8 3), !nosanitize [[META2]]
49
+ // TRAP-NEXT: [[TMP7:%.*]] = xor i1 [[TMP6]], true, !nosanitize [[META2]]
50
+ // TRAP-NEXT: [[TMP8:%.*]] = or i1 [[TMP5]], [[TMP7]], !nosanitize [[META2]]
51
+ // TRAP-NEXT: br i1 [[TMP8]], label [[CONT:%.*]], label [[TRAP:%.*]], !nosanitize [[META2]]
46
52
// TRAP: trap:
47
- // TRAP-NEXT: call void @llvm.ubsantrap(i8 3) #[[ATTR3 :[0-9]+]], !nosanitize [[META2]]
53
+ // TRAP-NEXT: call void @llvm.ubsantrap(i8 3) #[[ATTR4 :[0-9]+]], !nosanitize [[META2]]
48
54
// TRAP-NEXT: unreachable, !nosanitize [[META2]]
49
55
// TRAP: cont:
50
56
// TRAP-NEXT: [[DIV:%.*]] = sdiv i32 [[TMP0]], [[TMP1]]
64
70
// RECOVER-NEXT: [[TMP4:%.*]] = icmp ne i32 [[TMP1]], -1, !nosanitize [[META2]]
65
71
// RECOVER-NEXT: [[OR:%.*]] = or i1 [[TMP3]], [[TMP4]], !nosanitize [[META2]]
66
72
// RECOVER-NEXT: [[TMP5:%.*]] = and i1 [[TMP2]], [[OR]], !nosanitize [[META2]]
67
- // RECOVER-NEXT: br i1 [[TMP5]], label [[CONT:%.*]], label [[HANDLER_DIVREM_OVERFLOW:%.*]], !prof [[PROF3:![0-9]+]], !nosanitize [[META2]]
73
+ // RECOVER-NEXT: [[TMP6:%.*]] = call i1 @llvm.allow.ubsan.check(i8 3), !nosanitize [[META2]]
74
+ // RECOVER-NEXT: [[TMP7:%.*]] = xor i1 [[TMP6]], true, !nosanitize [[META2]]
75
+ // RECOVER-NEXT: [[TMP8:%.*]] = or i1 [[TMP5]], [[TMP7]], !nosanitize [[META2]]
76
+ // RECOVER-NEXT: br i1 [[TMP8]], label [[CONT:%.*]], label [[HANDLER_DIVREM_OVERFLOW:%.*]], !prof [[PROF3:![0-9]+]], !nosanitize [[META2]]
68
77
// RECOVER: handler.divrem_overflow:
69
- // RECOVER-NEXT: [[TMP6 :%.*]] = zext i32 [[TMP0]] to i64, !nosanitize [[META2]]
70
- // RECOVER-NEXT: [[TMP7 :%.*]] = zext i32 [[TMP1]] to i64, !nosanitize [[META2]]
71
- // RECOVER-NEXT: call void @__ubsan_handle_divrem_overflow(ptr @[[GLOB1:[0-9]+]], i64 [[TMP6 ]], i64 [[TMP7 ]]) #[[ATTR3 :[0-9]+]], !nosanitize [[META2]]
78
+ // RECOVER-NEXT: [[TMP9 :%.*]] = zext i32 [[TMP0]] to i64, !nosanitize [[META2]]
79
+ // RECOVER-NEXT: [[TMP10 :%.*]] = zext i32 [[TMP1]] to i64, !nosanitize [[META2]]
80
+ // RECOVER-NEXT: call void @__ubsan_handle_divrem_overflow(ptr @[[GLOB1:[0-9]+]], i64 [[TMP9 ]], i64 [[TMP10 ]]) #[[ATTR4 :[0-9]+]], !nosanitize [[META2]]
72
81
// RECOVER-NEXT: br label [[CONT]], !nosanitize [[META2]]
73
82
// RECOVER: cont:
74
83
// RECOVER-NEXT: [[DIV:%.*]] = sdiv i32 [[TMP0]], [[TMP1]]
@@ -85,14 +94,17 @@ int div(int x, int y) {
85
94
// CHECK-NEXT: store ptr [[X]], ptr [[X_ADDR]], align 8
86
95
// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X_ADDR]], align 8
87
96
// CHECK-NEXT: [[TMP1:%.*]] = icmp ne ptr [[TMP0]], null, !nosanitize [[META2]]
88
- // CHECK-NEXT: br i1 [[TMP1]], label [[CONT:%.*]], label [[HANDLER_TYPE_MISMATCH:%.*]], !prof [[PROF3]], !nosanitize [[META2]]
97
+ // CHECK-NEXT: [[TMP2:%.*]] = call i1 @llvm.allow.ubsan.check(i8 22), !nosanitize [[META2]]
98
+ // CHECK-NEXT: [[TMP3:%.*]] = xor i1 [[TMP2]], true, !nosanitize [[META2]]
99
+ // CHECK-NEXT: [[TMP4:%.*]] = or i1 [[TMP1]], [[TMP3]], !nosanitize [[META2]]
100
+ // CHECK-NEXT: br i1 [[TMP4]], label [[CONT:%.*]], label [[HANDLER_TYPE_MISMATCH:%.*]], !prof [[PROF3]], !nosanitize [[META2]]
89
101
// CHECK: handler.type_mismatch:
90
- // CHECK-NEXT: [[TMP2 :%.*]] = ptrtoint ptr [[TMP0]] to i64, !nosanitize [[META2]]
91
- // CHECK-NEXT: call void @__ubsan_handle_type_mismatch_v1_abort(ptr @[[GLOB2:[0-9]+]], i64 [[TMP2 ]]) #[[ATTR3 ]], !nosanitize [[META2]]
102
+ // CHECK-NEXT: [[TMP5 :%.*]] = ptrtoint ptr [[TMP0]] to i64, !nosanitize [[META2]]
103
+ // CHECK-NEXT: call void @__ubsan_handle_type_mismatch_v1_abort(ptr @[[GLOB2:[0-9]+]], i64 [[TMP5 ]]) #[[ATTR4 ]], !nosanitize [[META2]]
92
104
// CHECK-NEXT: unreachable, !nosanitize [[META2]]
93
105
// CHECK: cont:
94
- // CHECK-NEXT: [[TMP3 :%.*]] = load i32, ptr [[TMP0]], align 4
95
- // CHECK-NEXT: ret i32 [[TMP3 ]]
106
+ // CHECK-NEXT: [[TMP6 :%.*]] = load i32, ptr [[TMP0]], align 4
107
+ // CHECK-NEXT: ret i32 [[TMP6 ]]
96
108
//
97
109
// TRAP-LABEL: define dso_local i32 @null(
98
110
// TRAP-SAME: ptr noundef [[X:%.*]]) #[[ATTR0]] {
@@ -101,13 +113,16 @@ int div(int x, int y) {
101
113
// TRAP-NEXT: store ptr [[X]], ptr [[X_ADDR]], align 8
102
114
// TRAP-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X_ADDR]], align 8
103
115
// TRAP-NEXT: [[TMP1:%.*]] = icmp ne ptr [[TMP0]], null, !nosanitize [[META2]]
104
- // TRAP-NEXT: br i1 [[TMP1]], label [[CONT:%.*]], label [[TRAP:%.*]], !nosanitize [[META2]]
116
+ // TRAP-NEXT: [[TMP2:%.*]] = call i1 @llvm.allow.ubsan.check(i8 22), !nosanitize [[META2]]
117
+ // TRAP-NEXT: [[TMP3:%.*]] = xor i1 [[TMP2]], true, !nosanitize [[META2]]
118
+ // TRAP-NEXT: [[TMP4:%.*]] = or i1 [[TMP1]], [[TMP3]], !nosanitize [[META2]]
119
+ // TRAP-NEXT: br i1 [[TMP4]], label [[CONT:%.*]], label [[TRAP:%.*]], !nosanitize [[META2]]
105
120
// TRAP: trap:
106
- // TRAP-NEXT: call void @llvm.ubsantrap(i8 22) #[[ATTR3 ]], !nosanitize [[META2]]
121
+ // TRAP-NEXT: call void @llvm.ubsantrap(i8 22) #[[ATTR4 ]], !nosanitize [[META2]]
107
122
// TRAP-NEXT: unreachable, !nosanitize [[META2]]
108
123
// TRAP: cont:
109
- // TRAP-NEXT: [[TMP2 :%.*]] = load i32, ptr [[TMP0]], align 4
110
- // TRAP-NEXT: ret i32 [[TMP2 ]]
124
+ // TRAP-NEXT: [[TMP5 :%.*]] = load i32, ptr [[TMP0]], align 4
125
+ // TRAP-NEXT: ret i32 [[TMP5 ]]
111
126
//
112
127
// RECOVER-LABEL: define dso_local i32 @null(
113
128
// RECOVER-SAME: ptr noundef [[X:%.*]]) #[[ATTR0]] {
@@ -116,14 +131,17 @@ int div(int x, int y) {
116
131
// RECOVER-NEXT: store ptr [[X]], ptr [[X_ADDR]], align 8
117
132
// RECOVER-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X_ADDR]], align 8
118
133
// RECOVER-NEXT: [[TMP1:%.*]] = icmp ne ptr [[TMP0]], null, !nosanitize [[META2]]
119
- // RECOVER-NEXT: br i1 [[TMP1]], label [[CONT:%.*]], label [[HANDLER_TYPE_MISMATCH:%.*]], !prof [[PROF3]], !nosanitize [[META2]]
134
+ // RECOVER-NEXT: [[TMP2:%.*]] = call i1 @llvm.allow.ubsan.check(i8 22), !nosanitize [[META2]]
135
+ // RECOVER-NEXT: [[TMP3:%.*]] = xor i1 [[TMP2]], true, !nosanitize [[META2]]
136
+ // RECOVER-NEXT: [[TMP4:%.*]] = or i1 [[TMP1]], [[TMP3]], !nosanitize [[META2]]
137
+ // RECOVER-NEXT: br i1 [[TMP4]], label [[CONT:%.*]], label [[HANDLER_TYPE_MISMATCH:%.*]], !prof [[PROF3]], !nosanitize [[META2]]
120
138
// RECOVER: handler.type_mismatch:
121
- // RECOVER-NEXT: [[TMP2 :%.*]] = ptrtoint ptr [[TMP0]] to i64, !nosanitize [[META2]]
122
- // RECOVER-NEXT: call void @__ubsan_handle_type_mismatch_v1(ptr @[[GLOB2:[0-9]+]], i64 [[TMP2 ]]) #[[ATTR3 ]], !nosanitize [[META2]]
139
+ // RECOVER-NEXT: [[TMP5 :%.*]] = ptrtoint ptr [[TMP0]] to i64, !nosanitize [[META2]]
140
+ // RECOVER-NEXT: call void @__ubsan_handle_type_mismatch_v1(ptr @[[GLOB2:[0-9]+]], i64 [[TMP5 ]]) #[[ATTR4 ]], !nosanitize [[META2]]
123
141
// RECOVER-NEXT: br label [[CONT]], !nosanitize [[META2]]
124
142
// RECOVER: cont:
125
- // RECOVER-NEXT: [[TMP3 :%.*]] = load i32, ptr [[TMP0]], align 4
126
- // RECOVER-NEXT: ret i32 [[TMP3 ]]
143
+ // RECOVER-NEXT: [[TMP6 :%.*]] = load i32, ptr [[TMP0]], align 4
144
+ // RECOVER-NEXT: ret i32 [[TMP6 ]]
127
145
//
128
146
int null (int * x ) {
129
147
return * x ;
@@ -142,11 +160,14 @@ int null(int* x) {
142
160
// CHECK-NEXT: [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP2]], 0, !nosanitize [[META2]]
143
161
// CHECK-NEXT: [[TMP4:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1, !nosanitize [[META2]]
144
162
// CHECK-NEXT: [[TMP5:%.*]] = xor i1 [[TMP4]], true, !nosanitize [[META2]]
145
- // CHECK-NEXT: br i1 [[TMP5]], label [[CONT:%.*]], label [[HANDLER_ADD_OVERFLOW:%.*]], !prof [[PROF3]], !nosanitize [[META2]]
163
+ // CHECK-NEXT: [[TMP6:%.*]] = call i1 @llvm.allow.ubsan.check(i8 0), !nosanitize [[META2]]
164
+ // CHECK-NEXT: [[TMP7:%.*]] = xor i1 [[TMP6]], true, !nosanitize [[META2]]
165
+ // CHECK-NEXT: [[TMP8:%.*]] = or i1 [[TMP5]], [[TMP7]], !nosanitize [[META2]]
166
+ // CHECK-NEXT: br i1 [[TMP8]], label [[CONT:%.*]], label [[HANDLER_ADD_OVERFLOW:%.*]], !prof [[PROF3]], !nosanitize [[META2]]
146
167
// CHECK: handler.add_overflow:
147
- // CHECK-NEXT: [[TMP6 :%.*]] = zext i32 [[TMP0]] to i64, !nosanitize [[META2]]
148
- // CHECK-NEXT: [[TMP7 :%.*]] = zext i32 [[TMP1]] to i64, !nosanitize [[META2]]
149
- // CHECK-NEXT: call void @__ubsan_handle_add_overflow_abort(ptr @[[GLOB3:[0-9]+]], i64 [[TMP6 ]], i64 [[TMP7 ]]) #[[ATTR3 ]], !nosanitize [[META2]]
168
+ // CHECK-NEXT: [[TMP9 :%.*]] = zext i32 [[TMP0]] to i64, !nosanitize [[META2]]
169
+ // CHECK-NEXT: [[TMP10 :%.*]] = zext i32 [[TMP1]] to i64, !nosanitize [[META2]]
170
+ // CHECK-NEXT: call void @__ubsan_handle_add_overflow_abort(ptr @[[GLOB3:[0-9]+]], i64 [[TMP9 ]], i64 [[TMP10 ]]) #[[ATTR4 ]], !nosanitize [[META2]]
150
171
// CHECK-NEXT: unreachable, !nosanitize [[META2]]
151
172
// CHECK: cont:
152
173
// CHECK-NEXT: ret i32 [[TMP3]]
@@ -164,9 +185,12 @@ int null(int* x) {
164
185
// TRAP-NEXT: [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP2]], 0, !nosanitize [[META2]]
165
186
// TRAP-NEXT: [[TMP4:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1, !nosanitize [[META2]]
166
187
// TRAP-NEXT: [[TMP5:%.*]] = xor i1 [[TMP4]], true, !nosanitize [[META2]]
167
- // TRAP-NEXT: br i1 [[TMP5]], label [[CONT:%.*]], label [[TRAP:%.*]], !nosanitize [[META2]]
188
+ // TRAP-NEXT: [[TMP6:%.*]] = call i1 @llvm.allow.ubsan.check(i8 0), !nosanitize [[META2]]
189
+ // TRAP-NEXT: [[TMP7:%.*]] = xor i1 [[TMP6]], true, !nosanitize [[META2]]
190
+ // TRAP-NEXT: [[TMP8:%.*]] = or i1 [[TMP5]], [[TMP7]], !nosanitize [[META2]]
191
+ // TRAP-NEXT: br i1 [[TMP8]], label [[CONT:%.*]], label [[TRAP:%.*]], !nosanitize [[META2]]
168
192
// TRAP: trap:
169
- // TRAP-NEXT: call void @llvm.ubsantrap(i8 0) #[[ATTR3 ]], !nosanitize [[META2]]
193
+ // TRAP-NEXT: call void @llvm.ubsantrap(i8 0) #[[ATTR4 ]], !nosanitize [[META2]]
170
194
// TRAP-NEXT: unreachable, !nosanitize [[META2]]
171
195
// TRAP: cont:
172
196
// TRAP-NEXT: ret i32 [[TMP3]]
@@ -184,11 +208,14 @@ int null(int* x) {
184
208
// RECOVER-NEXT: [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP2]], 0, !nosanitize [[META2]]
185
209
// RECOVER-NEXT: [[TMP4:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1, !nosanitize [[META2]]
186
210
// RECOVER-NEXT: [[TMP5:%.*]] = xor i1 [[TMP4]], true, !nosanitize [[META2]]
187
- // RECOVER-NEXT: br i1 [[TMP5]], label [[CONT:%.*]], label [[HANDLER_ADD_OVERFLOW:%.*]], !prof [[PROF3]], !nosanitize [[META2]]
211
+ // RECOVER-NEXT: [[TMP6:%.*]] = call i1 @llvm.allow.ubsan.check(i8 0), !nosanitize [[META2]]
212
+ // RECOVER-NEXT: [[TMP7:%.*]] = xor i1 [[TMP6]], true, !nosanitize [[META2]]
213
+ // RECOVER-NEXT: [[TMP8:%.*]] = or i1 [[TMP5]], [[TMP7]], !nosanitize [[META2]]
214
+ // RECOVER-NEXT: br i1 [[TMP8]], label [[CONT:%.*]], label [[HANDLER_ADD_OVERFLOW:%.*]], !prof [[PROF3]], !nosanitize [[META2]]
188
215
// RECOVER: handler.add_overflow:
189
- // RECOVER-NEXT: [[TMP6 :%.*]] = zext i32 [[TMP0]] to i64, !nosanitize [[META2]]
190
- // RECOVER-NEXT: [[TMP7 :%.*]] = zext i32 [[TMP1]] to i64, !nosanitize [[META2]]
191
- // RECOVER-NEXT: call void @__ubsan_handle_add_overflow(ptr @[[GLOB3:[0-9]+]], i64 [[TMP6 ]], i64 [[TMP7 ]]) #[[ATTR3 ]], !nosanitize [[META2]]
216
+ // RECOVER-NEXT: [[TMP9 :%.*]] = zext i32 [[TMP0]] to i64, !nosanitize [[META2]]
217
+ // RECOVER-NEXT: [[TMP10 :%.*]] = zext i32 [[TMP1]] to i64, !nosanitize [[META2]]
218
+ // RECOVER-NEXT: call void @__ubsan_handle_add_overflow(ptr @[[GLOB3:[0-9]+]], i64 [[TMP9 ]], i64 [[TMP10 ]]) #[[ATTR4 ]], !nosanitize [[META2]]
192
219
// RECOVER-NEXT: br label [[CONT]], !nosanitize [[META2]]
193
220
// RECOVER: cont:
194
221
// RECOVER-NEXT: ret i32 [[TMP3]]
0 commit comments