Skip to content

Commit a48051b

Browse files
committed
[cfi][NFCI] Precommit tests to show nomerge functionality
llvm#120464 (and earlier CLs) added -fsanitize-merge functionality, which is intended to work for all "sanitizers". It is nearly correct for CFI. This patch precommits some tests for CFI, to track the progress of future -fsanitize-merge fixes.
1 parent 90c001a commit a48051b

File tree

3 files changed

+569
-0
lines changed

3 files changed

+569
-0
lines changed
Lines changed: 232 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,232 @@
1+
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --include-generated-funcs --version 5
2+
//
3+
// N.B. although the clang driver defaults to merge, clang_cc1 defaults to non-merge.
4+
// (This is similar to -fsanitize-recover, for which the default is also applied
5+
// at the driver level only.)
6+
// If optimization is disabled, merging is disabled (overrides -fsanitize-merge).
7+
8+
// RUN: %clang_cc1 -O3 -triple x86_64-unknown-linux -fsanitize-cfi-cross-dso \
9+
// RUN: -fsanitize=cfi-icall,cfi-nvcall,cfi-vcall,cfi-unrelated-cast,cfi-derived-cast \
10+
// RUN: -fsanitize-trap=cfi-icall,cfi-nvcall \
11+
// RUN: -fsanitize-merge=cfi-icall,cfi-nvcall \
12+
// RUN: -emit-llvm -o - %s | FileCheck %s --check-prefix=MERGE
13+
14+
// RUN: %clang_cc1 -O3 -triple x86_64-unknown-linux -fsanitize-cfi-cross-dso \
15+
// RUN: -fsanitize=cfi-icall,cfi-nvcall,cfi-vcall,cfi-unrelated-cast,cfi-derived-cast \
16+
// RUN: -fsanitize-trap=cfi-icall,cfi-nvcall \
17+
// RUN: -emit-llvm -o - %s | FileCheck %s --check-prefix=NO-MERGE
18+
19+
// NOMERGE-LABEL: define dso_local void @caller(
20+
// NOMERGE-SAME: ptr noundef [[F:%.*]]) #[[ATTR0:[0-9]+]] !type [[META4:![0-9]+]] !type [[META5:![0-9]+]] !type [[META6:![0-9]+]] {
21+
// NOMERGE-NEXT: [[ENTRY:.*:]]
22+
// NOMERGE-NEXT: [[F_ADDR:%.*]] = alloca ptr, align 8
23+
// NOMERGE-NEXT: store ptr [[F]], ptr [[F_ADDR]], align 8
24+
// NOMERGE-NEXT: [[TMP0:%.*]] = load ptr, ptr [[F_ADDR]], align 8
25+
// NOMERGE-NEXT: [[TMP1:%.*]] = call i1 @llvm.type.test(ptr [[TMP0]], metadata !"_ZTSFvvE"), !nosanitize [[META7:![0-9]+]]
26+
// NOMERGE-NEXT: br i1 [[TMP1]], label %[[CFI_CONT:.*]], label %[[CFI_SLOWPATH:.*]], !prof [[PROF8:![0-9]+]], !nosanitize [[META7]]
27+
// NOMERGE: [[CFI_SLOWPATH]]:
28+
// NOMERGE-NEXT: call void @__cfi_slowpath(i64 9080559750644022485, ptr [[TMP0]]) #[[ATTR7:[0-9]+]], !nosanitize [[META7]]
29+
// NOMERGE-NEXT: br label %[[CFI_CONT]], !nosanitize [[META7]]
30+
// NOMERGE: [[CFI_CONT]]:
31+
// NOMERGE-NEXT: call void [[TMP0]]()
32+
// NOMERGE-NEXT: ret void
33+
void caller(void (*f)(void)) {
34+
f();
35+
}
36+
37+
38+
39+
// MERGE-LABEL: define dso_local void @caller(
40+
// MERGE-SAME: ptr noundef [[F:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] !type [[META4:![0-9]+]] !type [[META5:![0-9]+]] !type [[META6:![0-9]+]] {
41+
// MERGE-NEXT: [[ENTRY:.*:]]
42+
// MERGE-NEXT: [[TMP0:%.*]] = tail call i1 @llvm.type.test(ptr [[F]], metadata !"_ZTSFvvE"), !nosanitize [[META7:![0-9]+]]
43+
// MERGE-NEXT: br i1 [[TMP0]], label %[[CFI_CONT:.*]], label %[[CFI_SLOWPATH:.*]], !prof [[PROF8:![0-9]+]], !nosanitize [[META7]]
44+
// MERGE: [[CFI_SLOWPATH]]:
45+
// MERGE-NEXT: tail call void @__cfi_slowpath(i64 9080559750644022485, ptr [[F]]) #[[ATTR5:[0-9]+]], !nosanitize [[META7]]
46+
// MERGE-NEXT: br label %[[CFI_CONT]], !nosanitize [[META7]]
47+
// MERGE: [[CFI_CONT]]:
48+
// MERGE-NEXT: tail call void [[F]]() #[[ATTR5]]
49+
// MERGE-NEXT: ret void
50+
//
51+
//
52+
// MERGE-LABEL: define weak_odr hidden void @__cfi_check_fail(
53+
// MERGE-SAME: ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR0]] {
54+
// MERGE-NEXT: [[ENTRY:.*:]]
55+
// MERGE-NEXT: [[DOTNOT:%.*]] = icmp eq ptr [[TMP0]], null, !nosanitize [[META7]]
56+
// MERGE-NEXT: br i1 [[DOTNOT]], label %[[TRAP:.*]], label %[[CONT:.*]], !prof [[PROF9:![0-9]+]], !nosanitize [[META7]]
57+
// MERGE: [[TRAP]]:
58+
// MERGE-NEXT: tail call void @llvm.ubsantrap(i8 2) #[[ATTR6:[0-9]+]], !nosanitize [[META7]]
59+
// MERGE-NEXT: unreachable, !nosanitize [[META7]]
60+
// MERGE: [[CONT]]:
61+
// MERGE-NEXT: [[TMP2:%.*]] = load i8, ptr [[TMP0]], align 4, !nosanitize [[META7]]
62+
// MERGE-NEXT: [[TMP3:%.*]] = tail call i1 @llvm.type.test(ptr [[TMP1]], metadata !"all-vtables"), !nosanitize [[META7]]
63+
// MERGE-NEXT: [[TMP4:%.*]] = zext i1 [[TMP3]] to i64, !nosanitize [[META7]]
64+
// MERGE-NEXT: switch i8 [[TMP2]], label %[[CONT8:.*]] [
65+
// MERGE-NEXT: i8 0, label %[[HANDLER_CFI_CHECK_FAIL:.*]]
66+
// MERGE-NEXT: i8 1, label %[[TRAP]]
67+
// MERGE-NEXT: i8 2, label %[[HANDLER_CFI_CHECK_FAIL4:.*]]
68+
// MERGE-NEXT: i8 3, label %[[HANDLER_CFI_CHECK_FAIL6:.*]]
69+
// MERGE-NEXT: i8 4, label %[[TRAP]]
70+
// MERGE-NEXT: ], !prof [[PROF10:![0-9]+]]
71+
// MERGE: [[HANDLER_CFI_CHECK_FAIL]]:
72+
// MERGE-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[TMP0]] to i64, !nosanitize [[META7]]
73+
// MERGE-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[TMP1]] to i64, !nosanitize [[META7]]
74+
// MERGE-NEXT: tail call void @__ubsan_handle_cfi_check_fail_abort(i64 [[TMP5]], i64 [[TMP6]], i64 [[TMP4]]) #[[ATTR7:[0-9]+]], !nosanitize [[META7]]
75+
// MERGE-NEXT: unreachable, !nosanitize [[META7]]
76+
// MERGE: [[HANDLER_CFI_CHECK_FAIL4]]:
77+
// MERGE-NEXT: [[TMP7:%.*]] = ptrtoint ptr [[TMP0]] to i64, !nosanitize [[META7]]
78+
// MERGE-NEXT: [[TMP8:%.*]] = ptrtoint ptr [[TMP1]] to i64, !nosanitize [[META7]]
79+
// MERGE-NEXT: tail call void @__ubsan_handle_cfi_check_fail_abort(i64 [[TMP7]], i64 [[TMP8]], i64 [[TMP4]]) #[[ATTR7]], !nosanitize [[META7]]
80+
// MERGE-NEXT: unreachable, !nosanitize [[META7]]
81+
// MERGE: [[HANDLER_CFI_CHECK_FAIL6]]:
82+
// MERGE-NEXT: [[TMP9:%.*]] = ptrtoint ptr [[TMP0]] to i64, !nosanitize [[META7]]
83+
// MERGE-NEXT: [[TMP10:%.*]] = ptrtoint ptr [[TMP1]] to i64, !nosanitize [[META7]]
84+
// MERGE-NEXT: tail call void @__ubsan_handle_cfi_check_fail_abort(i64 [[TMP9]], i64 [[TMP10]], i64 [[TMP4]]) #[[ATTR7]], !nosanitize [[META7]]
85+
// MERGE-NEXT: unreachable, !nosanitize [[META7]]
86+
// MERGE: [[CONT8]]:
87+
// MERGE-NEXT: ret void, !nosanitize [[META7]]
88+
//
89+
//
90+
// MERGE-LABEL: define weak void @__cfi_check(
91+
// MERGE-SAME: i64 noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]], ptr noundef [[TMP2:%.*]]) local_unnamed_addr #[[ATTR4:[0-9]+]] align 4096 {
92+
// MERGE-NEXT: [[ENTRY:.*:]]
93+
// MERGE-NEXT: [[DOTNOT_I:%.*]] = icmp eq ptr [[TMP2]], null, !nosanitize [[META7]]
94+
// MERGE-NEXT: br i1 [[DOTNOT_I]], label %[[TRAP_I:.*]], label %[[CONT_I:.*]], !prof [[PROF9]], !nosanitize [[META7]]
95+
// MERGE: [[TRAP_I]]:
96+
// MERGE-NEXT: tail call void @llvm.ubsantrap(i8 2) #[[ATTR6]], !nosanitize [[META7]]
97+
// MERGE-NEXT: unreachable, !nosanitize [[META7]]
98+
// MERGE: [[CONT_I]]:
99+
// MERGE-NEXT: [[TMP3:%.*]] = load i8, ptr [[TMP2]], align 4, !nosanitize [[META7]]
100+
// MERGE-NEXT: [[TMP4:%.*]] = tail call i1 @llvm.type.test(ptr [[TMP1]], metadata !"all-vtables"), !nosanitize [[META7]]
101+
// MERGE-NEXT: [[TMP5:%.*]] = zext i1 [[TMP4]] to i64, !nosanitize [[META7]]
102+
// MERGE-NEXT: switch i8 [[TMP3]], label %[[__CFI_CHECK_FAIL_EXIT:.*]] [
103+
// MERGE-NEXT: i8 0, label %[[HANDLER_CFI_CHECK_FAIL_I:.*]]
104+
// MERGE-NEXT: i8 1, label %[[TRAP_I]]
105+
// MERGE-NEXT: i8 2, label %[[HANDLER_CFI_CHECK_FAIL4_I:.*]]
106+
// MERGE-NEXT: i8 3, label %[[HANDLER_CFI_CHECK_FAIL6_I:.*]]
107+
// MERGE-NEXT: i8 4, label %[[TRAP_I]]
108+
// MERGE-NEXT: ], !prof [[PROF10]]
109+
// MERGE: [[HANDLER_CFI_CHECK_FAIL_I]]:
110+
// MERGE-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[TMP2]] to i64, !nosanitize [[META7]]
111+
// MERGE-NEXT: [[TMP7:%.*]] = ptrtoint ptr [[TMP1]] to i64, !nosanitize [[META7]]
112+
// MERGE-NEXT: tail call void @__ubsan_handle_cfi_check_fail_abort(i64 [[TMP6]], i64 [[TMP7]], i64 [[TMP5]]) #[[ATTR7]], !nosanitize [[META7]]
113+
// MERGE-NEXT: unreachable, !nosanitize [[META7]]
114+
// MERGE: [[HANDLER_CFI_CHECK_FAIL4_I]]:
115+
// MERGE-NEXT: [[TMP8:%.*]] = ptrtoint ptr [[TMP2]] to i64, !nosanitize [[META7]]
116+
// MERGE-NEXT: [[TMP9:%.*]] = ptrtoint ptr [[TMP1]] to i64, !nosanitize [[META7]]
117+
// MERGE-NEXT: tail call void @__ubsan_handle_cfi_check_fail_abort(i64 [[TMP8]], i64 [[TMP9]], i64 [[TMP5]]) #[[ATTR7]], !nosanitize [[META7]]
118+
// MERGE-NEXT: unreachable, !nosanitize [[META7]]
119+
// MERGE: [[HANDLER_CFI_CHECK_FAIL6_I]]:
120+
// MERGE-NEXT: [[TMP10:%.*]] = ptrtoint ptr [[TMP2]] to i64, !nosanitize [[META7]]
121+
// MERGE-NEXT: [[TMP11:%.*]] = ptrtoint ptr [[TMP1]] to i64, !nosanitize [[META7]]
122+
// MERGE-NEXT: tail call void @__ubsan_handle_cfi_check_fail_abort(i64 [[TMP10]], i64 [[TMP11]], i64 [[TMP5]]) #[[ATTR7]], !nosanitize [[META7]]
123+
// MERGE-NEXT: unreachable, !nosanitize [[META7]]
124+
// MERGE: [[__CFI_CHECK_FAIL_EXIT]]:
125+
// MERGE-NEXT: ret void
126+
//
127+
//
128+
// NO-MERGE-LABEL: define dso_local void @caller(
129+
// NO-MERGE-SAME: ptr noundef [[F:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] !type [[META4:![0-9]+]] !type [[META5:![0-9]+]] !type [[META6:![0-9]+]] {
130+
// NO-MERGE-NEXT: [[ENTRY:.*:]]
131+
// NO-MERGE-NEXT: [[TMP0:%.*]] = tail call i1 @llvm.type.test(ptr [[F]], metadata !"_ZTSFvvE"), !nosanitize [[META7:![0-9]+]]
132+
// NO-MERGE-NEXT: br i1 [[TMP0]], label %[[CFI_CONT:.*]], label %[[CFI_SLOWPATH:.*]], !prof [[PROF8:![0-9]+]], !nosanitize [[META7]]
133+
// NO-MERGE: [[CFI_SLOWPATH]]:
134+
// NO-MERGE-NEXT: tail call void @__cfi_slowpath(i64 9080559750644022485, ptr [[F]]) #[[ATTR5:[0-9]+]], !nosanitize [[META7]]
135+
// NO-MERGE-NEXT: br label %[[CFI_CONT]], !nosanitize [[META7]]
136+
// NO-MERGE: [[CFI_CONT]]:
137+
// NO-MERGE-NEXT: tail call void [[F]]() #[[ATTR5]]
138+
// NO-MERGE-NEXT: ret void
139+
//
140+
//
141+
// NO-MERGE-LABEL: define weak_odr hidden void @__cfi_check_fail(
142+
// NO-MERGE-SAME: ptr noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]]) #[[ATTR0]] {
143+
// NO-MERGE-NEXT: [[ENTRY:.*:]]
144+
// NO-MERGE-NEXT: [[DOTNOT:%.*]] = icmp eq ptr [[TMP0]], null, !nosanitize [[META7]]
145+
// NO-MERGE-NEXT: br i1 [[DOTNOT]], label %[[TRAP:.*]], label %[[CONT:.*]], !prof [[PROF9:![0-9]+]], !nosanitize [[META7]]
146+
// NO-MERGE: [[TRAP]]:
147+
// NO-MERGE-NEXT: tail call void @llvm.ubsantrap(i8 2) #[[ATTR6:[0-9]+]], !nosanitize [[META7]]
148+
// NO-MERGE-NEXT: unreachable, !nosanitize [[META7]]
149+
// NO-MERGE: [[CONT]]:
150+
// NO-MERGE-NEXT: [[TMP2:%.*]] = load i8, ptr [[TMP0]], align 4, !nosanitize [[META7]]
151+
// NO-MERGE-NEXT: [[TMP3:%.*]] = tail call i1 @llvm.type.test(ptr [[TMP1]], metadata !"all-vtables"), !nosanitize [[META7]]
152+
// NO-MERGE-NEXT: [[TMP4:%.*]] = zext i1 [[TMP3]] to i64, !nosanitize [[META7]]
153+
// NO-MERGE-NEXT: switch i8 [[TMP2]], label %[[CONT10:.*]] [
154+
// NO-MERGE-NEXT: i8 0, label %[[HANDLER_CFI_CHECK_FAIL:.*]]
155+
// NO-MERGE-NEXT: i8 1, label %[[TRAP3:.*]]
156+
// NO-MERGE-NEXT: i8 2, label %[[HANDLER_CFI_CHECK_FAIL5:.*]]
157+
// NO-MERGE-NEXT: i8 3, label %[[HANDLER_CFI_CHECK_FAIL7:.*]]
158+
// NO-MERGE-NEXT: i8 4, label %[[TRAP9:.*]]
159+
// NO-MERGE-NEXT: ], !prof [[PROF10:![0-9]+]]
160+
// NO-MERGE: [[HANDLER_CFI_CHECK_FAIL]]:
161+
// NO-MERGE-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[TMP0]] to i64, !nosanitize [[META7]]
162+
// NO-MERGE-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[TMP1]] to i64, !nosanitize [[META7]]
163+
// NO-MERGE-NEXT: tail call void @__ubsan_handle_cfi_check_fail_abort(i64 [[TMP5]], i64 [[TMP6]], i64 [[TMP4]]) #[[ATTR7:[0-9]+]], !nosanitize [[META7]]
164+
// NO-MERGE-NEXT: unreachable, !nosanitize [[META7]]
165+
// NO-MERGE: [[TRAP3]]:
166+
// NO-MERGE-NEXT: tail call void @llvm.ubsantrap(i8 2) #[[ATTR7]], !nosanitize [[META7]]
167+
// NO-MERGE-NEXT: unreachable, !nosanitize [[META7]]
168+
// NO-MERGE: [[HANDLER_CFI_CHECK_FAIL5]]:
169+
// NO-MERGE-NEXT: [[TMP7:%.*]] = ptrtoint ptr [[TMP0]] to i64, !nosanitize [[META7]]
170+
// NO-MERGE-NEXT: [[TMP8:%.*]] = ptrtoint ptr [[TMP1]] to i64, !nosanitize [[META7]]
171+
// NO-MERGE-NEXT: tail call void @__ubsan_handle_cfi_check_fail_abort(i64 [[TMP7]], i64 [[TMP8]], i64 [[TMP4]]) #[[ATTR7]], !nosanitize [[META7]]
172+
// NO-MERGE-NEXT: unreachable, !nosanitize [[META7]]
173+
// NO-MERGE: [[HANDLER_CFI_CHECK_FAIL7]]:
174+
// NO-MERGE-NEXT: [[TMP9:%.*]] = ptrtoint ptr [[TMP0]] to i64, !nosanitize [[META7]]
175+
// NO-MERGE-NEXT: [[TMP10:%.*]] = ptrtoint ptr [[TMP1]] to i64, !nosanitize [[META7]]
176+
// NO-MERGE-NEXT: tail call void @__ubsan_handle_cfi_check_fail_abort(i64 [[TMP9]], i64 [[TMP10]], i64 [[TMP4]]) #[[ATTR7]], !nosanitize [[META7]]
177+
// NO-MERGE-NEXT: unreachable, !nosanitize [[META7]]
178+
// NO-MERGE: [[TRAP9]]:
179+
// NO-MERGE-NEXT: tail call void @llvm.ubsantrap(i8 2) #[[ATTR7]], !nosanitize [[META7]]
180+
// NO-MERGE-NEXT: unreachable, !nosanitize [[META7]]
181+
// NO-MERGE: [[CONT10]]:
182+
// NO-MERGE-NEXT: ret void, !nosanitize [[META7]]
183+
//
184+
//
185+
// NO-MERGE-LABEL: define weak void @__cfi_check(
186+
// NO-MERGE-SAME: i64 noundef [[TMP0:%.*]], ptr noundef [[TMP1:%.*]], ptr noundef [[TMP2:%.*]]) local_unnamed_addr #[[ATTR4:[0-9]+]] align 4096 {
187+
// NO-MERGE-NEXT: [[ENTRY:.*:]]
188+
// NO-MERGE-NEXT: [[DOTNOT_I:%.*]] = icmp eq ptr [[TMP2]], null, !nosanitize [[META7]]
189+
// NO-MERGE-NEXT: br i1 [[DOTNOT_I]], label %[[TRAP_I:.*]], label %[[CONT_I:.*]], !prof [[PROF9]], !nosanitize [[META7]]
190+
// NO-MERGE: [[TRAP_I]]:
191+
// NO-MERGE-NEXT: tail call void @llvm.ubsantrap(i8 2) #[[ATTR6]], !nosanitize [[META7]]
192+
// NO-MERGE-NEXT: unreachable, !nosanitize [[META7]]
193+
// NO-MERGE: [[CONT_I]]:
194+
// NO-MERGE-NEXT: [[TMP3:%.*]] = load i8, ptr [[TMP2]], align 4, !nosanitize [[META7]]
195+
// NO-MERGE-NEXT: [[TMP4:%.*]] = tail call i1 @llvm.type.test(ptr [[TMP1]], metadata !"all-vtables"), !nosanitize [[META7]]
196+
// NO-MERGE-NEXT: [[TMP5:%.*]] = zext i1 [[TMP4]] to i64, !nosanitize [[META7]]
197+
// NO-MERGE-NEXT: switch i8 [[TMP3]], label %[[__CFI_CHECK_FAIL_EXIT:.*]] [
198+
// NO-MERGE-NEXT: i8 0, label %[[HANDLER_CFI_CHECK_FAIL_I:.*]]
199+
// NO-MERGE-NEXT: i8 1, label %[[TRAP3_I:.*]]
200+
// NO-MERGE-NEXT: i8 2, label %[[HANDLER_CFI_CHECK_FAIL5_I:.*]]
201+
// NO-MERGE-NEXT: i8 3, label %[[HANDLER_CFI_CHECK_FAIL7_I:.*]]
202+
// NO-MERGE-NEXT: i8 4, label %[[TRAP9_I:.*]]
203+
// NO-MERGE-NEXT: ], !prof [[PROF10]]
204+
// NO-MERGE: [[HANDLER_CFI_CHECK_FAIL_I]]:
205+
// NO-MERGE-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[TMP2]] to i64, !nosanitize [[META7]]
206+
// NO-MERGE-NEXT: [[TMP7:%.*]] = ptrtoint ptr [[TMP1]] to i64, !nosanitize [[META7]]
207+
// NO-MERGE-NEXT: tail call void @__ubsan_handle_cfi_check_fail_abort(i64 [[TMP6]], i64 [[TMP7]], i64 [[TMP5]]) #[[ATTR7]], !nosanitize [[META7]]
208+
// NO-MERGE-NEXT: unreachable, !nosanitize [[META7]]
209+
// NO-MERGE: [[TRAP3_I]]:
210+
// NO-MERGE-NEXT: tail call void @llvm.ubsantrap(i8 2) #[[ATTR7]], !nosanitize [[META7]]
211+
// NO-MERGE-NEXT: unreachable, !nosanitize [[META7]]
212+
// NO-MERGE: [[HANDLER_CFI_CHECK_FAIL5_I]]:
213+
// NO-MERGE-NEXT: [[TMP8:%.*]] = ptrtoint ptr [[TMP2]] to i64, !nosanitize [[META7]]
214+
// NO-MERGE-NEXT: [[TMP9:%.*]] = ptrtoint ptr [[TMP1]] to i64, !nosanitize [[META7]]
215+
// NO-MERGE-NEXT: tail call void @__ubsan_handle_cfi_check_fail_abort(i64 [[TMP8]], i64 [[TMP9]], i64 [[TMP5]]) #[[ATTR7]], !nosanitize [[META7]]
216+
// NO-MERGE-NEXT: unreachable, !nosanitize [[META7]]
217+
// NO-MERGE: [[HANDLER_CFI_CHECK_FAIL7_I]]:
218+
// NO-MERGE-NEXT: [[TMP10:%.*]] = ptrtoint ptr [[TMP2]] to i64, !nosanitize [[META7]]
219+
// NO-MERGE-NEXT: [[TMP11:%.*]] = ptrtoint ptr [[TMP1]] to i64, !nosanitize [[META7]]
220+
// NO-MERGE-NEXT: tail call void @__ubsan_handle_cfi_check_fail_abort(i64 [[TMP10]], i64 [[TMP11]], i64 [[TMP5]]) #[[ATTR7]], !nosanitize [[META7]]
221+
// NO-MERGE-NEXT: unreachable, !nosanitize [[META7]]
222+
// NO-MERGE: [[TRAP9_I]]:
223+
// NO-MERGE-NEXT: tail call void @llvm.ubsantrap(i8 2) #[[ATTR7]], !nosanitize [[META7]]
224+
// NO-MERGE-NEXT: unreachable, !nosanitize [[META7]]
225+
// NO-MERGE: [[__CFI_CHECK_FAIL_EXIT]]:
226+
// NO-MERGE-NEXT: ret void
227+
228+
// MERGE: [[ATTR5]] = { nounwind }
229+
// MERGE: [[ATTR6]] = { noreturn nounwind }
230+
231+
// NO-MERGE: [[ATTR6]] = { noreturn nounwind }
232+
// NO-MERGE: [[ATTR7]] = { nomerge noreturn nounwind }

0 commit comments

Comments
 (0)