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 -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
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
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: [[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]]
21
+ // CHECK-NEXT: br i1 [[TMP5]], label [[CONT:%.*]], label [[HANDLER_DIVREM_OVERFLOW:%.*]], !prof [[PROF3:![0-9]+]], !nosanitize [[META2]]
25
22
// CHECK: handler.divrem_overflow:
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]]
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]]
29
26
// CHECK-NEXT: unreachable, !nosanitize [[META2]]
30
27
// CHECK: cont:
31
28
// CHECK-NEXT: [[DIV:%.*]] = sdiv i32 [[TMP0]], [[TMP1]]
45
42
// TRAP-NEXT: [[TMP4:%.*]] = icmp ne i32 [[TMP1]], -1, !nosanitize [[META2]]
46
43
// TRAP-NEXT: [[OR:%.*]] = or i1 [[TMP3]], [[TMP4]], !nosanitize [[META2]]
47
44
// TRAP-NEXT: [[TMP5:%.*]] = and i1 [[TMP2]], [[OR]], !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]]
45
+ // TRAP-NEXT: br i1 [[TMP5]], label [[CONT:%.*]], label [[TRAP:%.*]], !nosanitize [[META2]]
52
46
// TRAP: trap:
53
- // TRAP-NEXT: call void @llvm.ubsantrap(i8 3) #[[ATTR4 :[0-9]+]], !nosanitize [[META2]]
47
+ // TRAP-NEXT: call void @llvm.ubsantrap(i8 3) #[[ATTR3 :[0-9]+]], !nosanitize [[META2]]
54
48
// TRAP-NEXT: unreachable, !nosanitize [[META2]]
55
49
// TRAP: cont:
56
50
// TRAP-NEXT: [[DIV:%.*]] = sdiv i32 [[TMP0]], [[TMP1]]
70
64
// RECOVER-NEXT: [[TMP4:%.*]] = icmp ne i32 [[TMP1]], -1, !nosanitize [[META2]]
71
65
// RECOVER-NEXT: [[OR:%.*]] = or i1 [[TMP3]], [[TMP4]], !nosanitize [[META2]]
72
66
// RECOVER-NEXT: [[TMP5:%.*]] = and i1 [[TMP2]], [[OR]], !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]]
67
+ // RECOVER-NEXT: br i1 [[TMP5]], label [[CONT:%.*]], label [[HANDLER_DIVREM_OVERFLOW:%.*]], !prof [[PROF3:![0-9]+]], !nosanitize [[META2]]
77
68
// RECOVER: handler.divrem_overflow:
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]]
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]]
81
72
// RECOVER-NEXT: br label [[CONT]], !nosanitize [[META2]]
82
73
// RECOVER: cont:
83
74
// RECOVER-NEXT: [[DIV:%.*]] = sdiv i32 [[TMP0]], [[TMP1]]
@@ -94,17 +85,14 @@ int div(int x, int y) {
94
85
// CHECK-NEXT: store ptr [[X]], ptr [[X_ADDR]], align 8
95
86
// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X_ADDR]], align 8
96
87
// CHECK-NEXT: [[TMP1:%.*]] = icmp ne ptr [[TMP0]], null, !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]]
88
+ // CHECK-NEXT: br i1 [[TMP1]], label [[CONT:%.*]], label [[HANDLER_TYPE_MISMATCH:%.*]], !prof [[PROF3]], !nosanitize [[META2]]
101
89
// CHECK: handler.type_mismatch:
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]]
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]]
104
92
// CHECK-NEXT: unreachable, !nosanitize [[META2]]
105
93
// CHECK: cont:
106
- // CHECK-NEXT: [[TMP6 :%.*]] = load i32, ptr [[TMP0]], align 4
107
- // CHECK-NEXT: ret i32 [[TMP6 ]]
94
+ // CHECK-NEXT: [[TMP3 :%.*]] = load i32, ptr [[TMP0]], align 4
95
+ // CHECK-NEXT: ret i32 [[TMP3 ]]
108
96
//
109
97
// TRAP-LABEL: define dso_local i32 @null(
110
98
// TRAP-SAME: ptr noundef [[X:%.*]]) #[[ATTR0]] {
@@ -113,16 +101,13 @@ int div(int x, int y) {
113
101
// TRAP-NEXT: store ptr [[X]], ptr [[X_ADDR]], align 8
114
102
// TRAP-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X_ADDR]], align 8
115
103
// TRAP-NEXT: [[TMP1:%.*]] = icmp ne ptr [[TMP0]], null, !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]]
104
+ // TRAP-NEXT: br i1 [[TMP1]], label [[CONT:%.*]], label [[TRAP:%.*]], !nosanitize [[META2]]
120
105
// TRAP: trap:
121
- // TRAP-NEXT: call void @llvm.ubsantrap(i8 22) #[[ATTR4 ]], !nosanitize [[META2]]
106
+ // TRAP-NEXT: call void @llvm.ubsantrap(i8 22) #[[ATTR3 ]], !nosanitize [[META2]]
122
107
// TRAP-NEXT: unreachable, !nosanitize [[META2]]
123
108
// TRAP: cont:
124
- // TRAP-NEXT: [[TMP5 :%.*]] = load i32, ptr [[TMP0]], align 4
125
- // TRAP-NEXT: ret i32 [[TMP5 ]]
109
+ // TRAP-NEXT: [[TMP2 :%.*]] = load i32, ptr [[TMP0]], align 4
110
+ // TRAP-NEXT: ret i32 [[TMP2 ]]
126
111
//
127
112
// RECOVER-LABEL: define dso_local i32 @null(
128
113
// RECOVER-SAME: ptr noundef [[X:%.*]]) #[[ATTR0]] {
@@ -131,17 +116,14 @@ int div(int x, int y) {
131
116
// RECOVER-NEXT: store ptr [[X]], ptr [[X_ADDR]], align 8
132
117
// RECOVER-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X_ADDR]], align 8
133
118
// RECOVER-NEXT: [[TMP1:%.*]] = icmp ne ptr [[TMP0]], null, !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]]
119
+ // RECOVER-NEXT: br i1 [[TMP1]], label [[CONT:%.*]], label [[HANDLER_TYPE_MISMATCH:%.*]], !prof [[PROF3]], !nosanitize [[META2]]
138
120
// RECOVER: handler.type_mismatch:
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]]
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]]
141
123
// RECOVER-NEXT: br label [[CONT]], !nosanitize [[META2]]
142
124
// RECOVER: cont:
143
- // RECOVER-NEXT: [[TMP6 :%.*]] = load i32, ptr [[TMP0]], align 4
144
- // RECOVER-NEXT: ret i32 [[TMP6 ]]
125
+ // RECOVER-NEXT: [[TMP3 :%.*]] = load i32, ptr [[TMP0]], align 4
126
+ // RECOVER-NEXT: ret i32 [[TMP3 ]]
145
127
//
146
128
int null (int * x ) {
147
129
return * x ;
@@ -160,14 +142,11 @@ int null(int* x) {
160
142
// CHECK-NEXT: [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP2]], 0, !nosanitize [[META2]]
161
143
// CHECK-NEXT: [[TMP4:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1, !nosanitize [[META2]]
162
144
// CHECK-NEXT: [[TMP5:%.*]] = xor i1 [[TMP4]], true, !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]]
145
+ // CHECK-NEXT: br i1 [[TMP5]], label [[CONT:%.*]], label [[HANDLER_ADD_OVERFLOW:%.*]], !prof [[PROF3]], !nosanitize [[META2]]
167
146
// CHECK: handler.add_overflow:
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]]
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]]
171
150
// CHECK-NEXT: unreachable, !nosanitize [[META2]]
172
151
// CHECK: cont:
173
152
// CHECK-NEXT: ret i32 [[TMP3]]
@@ -185,12 +164,9 @@ int null(int* x) {
185
164
// TRAP-NEXT: [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP2]], 0, !nosanitize [[META2]]
186
165
// TRAP-NEXT: [[TMP4:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1, !nosanitize [[META2]]
187
166
// TRAP-NEXT: [[TMP5:%.*]] = xor i1 [[TMP4]], true, !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]]
167
+ // TRAP-NEXT: br i1 [[TMP5]], label [[CONT:%.*]], label [[TRAP:%.*]], !nosanitize [[META2]]
192
168
// TRAP: trap:
193
- // TRAP-NEXT: call void @llvm.ubsantrap(i8 0) #[[ATTR4 ]], !nosanitize [[META2]]
169
+ // TRAP-NEXT: call void @llvm.ubsantrap(i8 0) #[[ATTR3 ]], !nosanitize [[META2]]
194
170
// TRAP-NEXT: unreachable, !nosanitize [[META2]]
195
171
// TRAP: cont:
196
172
// TRAP-NEXT: ret i32 [[TMP3]]
@@ -208,14 +184,11 @@ int null(int* x) {
208
184
// RECOVER-NEXT: [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP2]], 0, !nosanitize [[META2]]
209
185
// RECOVER-NEXT: [[TMP4:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1, !nosanitize [[META2]]
210
186
// RECOVER-NEXT: [[TMP5:%.*]] = xor i1 [[TMP4]], true, !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]]
187
+ // RECOVER-NEXT: br i1 [[TMP5]], label [[CONT:%.*]], label [[HANDLER_ADD_OVERFLOW:%.*]], !prof [[PROF3]], !nosanitize [[META2]]
215
188
// RECOVER: handler.add_overflow:
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]]
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]]
219
192
// RECOVER-NEXT: br label [[CONT]], !nosanitize [[META2]]
220
193
// RECOVER: cont:
221
194
// RECOVER-NEXT: ret i32 [[TMP3]]
0 commit comments