11// 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
55
66
77// CHECK-LABEL: define dso_local i32 @div(
1818// CHECK-NEXT: [[TMP4:%.*]] = icmp ne i32 [[TMP1]], -1, !nosanitize [[META2]]
1919// CHECK-NEXT: [[OR:%.*]] = or i1 [[TMP3]], [[TMP4]], !nosanitize [[META2]]
2020// 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]]
2225// 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]]
2629// CHECK-NEXT: unreachable, !nosanitize [[META2]]
2730// CHECK: cont:
2831// CHECK-NEXT: [[DIV:%.*]] = sdiv i32 [[TMP0]], [[TMP1]]
4245// TRAP-NEXT: [[TMP4:%.*]] = icmp ne i32 [[TMP1]], -1, !nosanitize [[META2]]
4346// TRAP-NEXT: [[OR:%.*]] = or i1 [[TMP3]], [[TMP4]], !nosanitize [[META2]]
4447// 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]]
4652// 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]]
4854// TRAP-NEXT: unreachable, !nosanitize [[META2]]
4955// TRAP: cont:
5056// TRAP-NEXT: [[DIV:%.*]] = sdiv i32 [[TMP0]], [[TMP1]]
6470// RECOVER-NEXT: [[TMP4:%.*]] = icmp ne i32 [[TMP1]], -1, !nosanitize [[META2]]
6571// RECOVER-NEXT: [[OR:%.*]] = or i1 [[TMP3]], [[TMP4]], !nosanitize [[META2]]
6672// 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]]
6877// 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]]
7281// RECOVER-NEXT: br label [[CONT]], !nosanitize [[META2]]
7382// RECOVER: cont:
7483// RECOVER-NEXT: [[DIV:%.*]] = sdiv i32 [[TMP0]], [[TMP1]]
@@ -85,14 +94,17 @@ int div(int x, int y) {
8594// CHECK-NEXT: store ptr [[X]], ptr [[X_ADDR]], align 8
8695// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X_ADDR]], align 8
8796// 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]]
89101// 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]]
92104// CHECK-NEXT: unreachable, !nosanitize [[META2]]
93105// 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 ]]
96108//
97109// TRAP-LABEL: define dso_local i32 @null(
98110// TRAP-SAME: ptr noundef [[X:%.*]]) #[[ATTR0]] {
@@ -101,13 +113,16 @@ int div(int x, int y) {
101113// TRAP-NEXT: store ptr [[X]], ptr [[X_ADDR]], align 8
102114// TRAP-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X_ADDR]], align 8
103115// 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]]
105120// 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]]
107122// TRAP-NEXT: unreachable, !nosanitize [[META2]]
108123// 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 ]]
111126//
112127// RECOVER-LABEL: define dso_local i32 @null(
113128// RECOVER-SAME: ptr noundef [[X:%.*]]) #[[ATTR0]] {
@@ -116,14 +131,17 @@ int div(int x, int y) {
116131// RECOVER-NEXT: store ptr [[X]], ptr [[X_ADDR]], align 8
117132// RECOVER-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X_ADDR]], align 8
118133// 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]]
120138// 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]]
123141// RECOVER-NEXT: br label [[CONT]], !nosanitize [[META2]]
124142// 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 ]]
127145//
128146int null (int * x ) {
129147 return * x ;
@@ -142,11 +160,14 @@ int null(int* x) {
142160// CHECK-NEXT: [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP2]], 0, !nosanitize [[META2]]
143161// CHECK-NEXT: [[TMP4:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1, !nosanitize [[META2]]
144162// 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]]
146167// 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]]
150171// CHECK-NEXT: unreachable, !nosanitize [[META2]]
151172// CHECK: cont:
152173// CHECK-NEXT: ret i32 [[TMP3]]
@@ -164,9 +185,12 @@ int null(int* x) {
164185// TRAP-NEXT: [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP2]], 0, !nosanitize [[META2]]
165186// TRAP-NEXT: [[TMP4:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1, !nosanitize [[META2]]
166187// 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]]
168192// 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]]
170194// TRAP-NEXT: unreachable, !nosanitize [[META2]]
171195// TRAP: cont:
172196// TRAP-NEXT: ret i32 [[TMP3]]
@@ -184,11 +208,14 @@ int null(int* x) {
184208// RECOVER-NEXT: [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP2]], 0, !nosanitize [[META2]]
185209// RECOVER-NEXT: [[TMP4:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1, !nosanitize [[META2]]
186210// 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]]
188215// 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]]
192219// RECOVER-NEXT: br label [[CONT]], !nosanitize [[META2]]
193220// RECOVER: cont:
194221// RECOVER-NEXT: ret i32 [[TMP3]]
0 commit comments