Skip to content

Commit f455f0c

Browse files
jrtc27resistor
authored andcommitted
[NFC][clang] Add test showing getSizeOfUnwindException is wrong for purecap
1 parent 0e00de1 commit f455f0c

File tree

1 file changed

+144
-0
lines changed

1 file changed

+144
-0
lines changed
Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 2
2+
// RUN: %cheri128_purecap_cc1 -fexceptions -fcxx-exceptions -disable-O0-optnone -emit-llvm %s -o - \
3+
// RUN: | opt -S -passes=mem2reg | FileCheck %s --check-prefix=CHECK-MIPS
4+
// RUN: %riscv32_cheri_purecap_cc1 -fexceptions -fcxx-exceptions -disable-O0-optnone -emit-llvm %s -o - \
5+
// RUN: | opt -S -passes=mem2reg | FileCheck %s --check-prefix=CHECK-RV32
6+
// RUN: %riscv64_cheri_purecap_cc1 -fexceptions -fcxx-exceptions -disable-O0-optnone -emit-llvm %s -o - \
7+
// RUN: | opt -S -passes=mem2reg | FileCheck %s --check-prefix=CHECK-RV64
8+
9+
/// Check that we use the correct size for struct _Unwind_Exception
10+
/// TODO: 64-bit CHERI architectures use the wrong size
11+
12+
void foo();
13+
void bar(int *&);
14+
15+
// CHECK-MIPS-LABEL: define dso_local void @_Z3bazv
16+
// CHECK-MIPS-SAME: () addrspace(200) #[[ATTR0:[0-9]+]] personality ptr addrspace(200) @__gxx_personality_v0 {
17+
// CHECK-MIPS-NEXT: entry:
18+
// CHECK-MIPS-NEXT: invoke void @_Z3foov()
19+
// CHECK-MIPS-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[LPAD:%.*]]
20+
// CHECK-MIPS: invoke.cont:
21+
// CHECK-MIPS-NEXT: br label [[TRY_CONT:%.*]]
22+
// CHECK-MIPS: lpad:
23+
// CHECK-MIPS-NEXT: [[TMP0:%.*]] = landingpad { ptr addrspace(200), i32 }
24+
// CHECK-MIPS-NEXT: catch ptr addrspace(200) @_ZTIPi
25+
// CHECK-MIPS-NEXT: [[TMP1:%.*]] = extractvalue { ptr addrspace(200), i32 } [[TMP0]], 0
26+
// CHECK-MIPS-NEXT: [[TMP2:%.*]] = extractvalue { ptr addrspace(200), i32 } [[TMP0]], 1
27+
// CHECK-MIPS-NEXT: br label [[CATCH_DISPATCH:%.*]]
28+
// CHECK-MIPS: catch.dispatch:
29+
// CHECK-MIPS-NEXT: [[TMP3:%.*]] = call i32 @llvm.eh.typeid.for(ptr addrspacecast (ptr addrspace(200) @_ZTIPi to ptr)) #[[ATTR3:[0-9]+]]
30+
// CHECK-MIPS-NEXT: [[MATCHES:%.*]] = icmp eq i32 [[TMP2]], [[TMP3]]
31+
// CHECK-MIPS-NEXT: br i1 [[MATCHES]], label [[CATCH:%.*]], label [[EH_RESUME:%.*]]
32+
// CHECK-MIPS: catch:
33+
// CHECK-MIPS-NEXT: [[TMP4:%.*]] = call ptr addrspace(200) @__cxa_begin_catch(ptr addrspace(200) [[TMP1]]) #[[ATTR3]]
34+
// CHECK-MIPS-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr addrspace(200) [[TMP1]], i32 32
35+
// CHECK-MIPS-NEXT: invoke void @_Z3barRPi(ptr addrspace(200) noundef nonnull align 16 dereferenceable(16) [[TMP5]])
36+
// CHECK-MIPS-NEXT: to label [[INVOKE_CONT2:%.*]] unwind label [[LPAD1:%.*]]
37+
// CHECK-MIPS: invoke.cont2:
38+
// CHECK-MIPS-NEXT: call void @__cxa_end_catch() #[[ATTR3]]
39+
// CHECK-MIPS-NEXT: br label [[TRY_CONT]]
40+
// CHECK-MIPS: try.cont:
41+
// CHECK-MIPS-NEXT: ret void
42+
// CHECK-MIPS: lpad1:
43+
// CHECK-MIPS-NEXT: [[TMP6:%.*]] = landingpad { ptr addrspace(200), i32 }
44+
// CHECK-MIPS-NEXT: cleanup
45+
// CHECK-MIPS-NEXT: [[TMP7:%.*]] = extractvalue { ptr addrspace(200), i32 } [[TMP6]], 0
46+
// CHECK-MIPS-NEXT: [[TMP8:%.*]] = extractvalue { ptr addrspace(200), i32 } [[TMP6]], 1
47+
// CHECK-MIPS-NEXT: call void @__cxa_end_catch() #[[ATTR3]]
48+
// CHECK-MIPS-NEXT: br label [[EH_RESUME]]
49+
// CHECK-MIPS: eh.resume:
50+
// CHECK-MIPS-NEXT: [[EHSELECTOR_SLOT_0:%.*]] = phi i32 [ [[TMP8]], [[LPAD1]] ], [ [[TMP2]], [[CATCH_DISPATCH]] ]
51+
// CHECK-MIPS-NEXT: [[EXN_SLOT_0:%.*]] = phi ptr addrspace(200) [ [[TMP7]], [[LPAD1]] ], [ [[TMP1]], [[CATCH_DISPATCH]] ]
52+
// CHECK-MIPS-NEXT: [[LPAD_VAL:%.*]] = insertvalue { ptr addrspace(200), i32 } poison, ptr addrspace(200) [[EXN_SLOT_0]], 0
53+
// CHECK-MIPS-NEXT: [[LPAD_VAL5:%.*]] = insertvalue { ptr addrspace(200), i32 } [[LPAD_VAL]], i32 [[EHSELECTOR_SLOT_0]], 1
54+
// CHECK-MIPS-NEXT: resume { ptr addrspace(200), i32 } [[LPAD_VAL5]]
55+
//
56+
// CHECK-RV32-LABEL: define dso_local void @_Z3bazv
57+
// CHECK-RV32-SAME: () addrspace(200) #[[ATTR0:[0-9]+]] personality ptr addrspace(200) @__gxx_personality_v0 {
58+
// CHECK-RV32-NEXT: entry:
59+
// CHECK-RV32-NEXT: invoke void @_Z3foov()
60+
// CHECK-RV32-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[LPAD:%.*]]
61+
// CHECK-RV32: invoke.cont:
62+
// CHECK-RV32-NEXT: br label [[TRY_CONT:%.*]]
63+
// CHECK-RV32: lpad:
64+
// CHECK-RV32-NEXT: [[TMP0:%.*]] = landingpad { ptr addrspace(200), i32 }
65+
// CHECK-RV32-NEXT: catch ptr addrspace(200) @_ZTIPi
66+
// CHECK-RV32-NEXT: [[TMP1:%.*]] = extractvalue { ptr addrspace(200), i32 } [[TMP0]], 0
67+
// CHECK-RV32-NEXT: [[TMP2:%.*]] = extractvalue { ptr addrspace(200), i32 } [[TMP0]], 1
68+
// CHECK-RV32-NEXT: br label [[CATCH_DISPATCH:%.*]]
69+
// CHECK-RV32: catch.dispatch:
70+
// CHECK-RV32-NEXT: [[TMP3:%.*]] = call i32 @llvm.eh.typeid.for(ptr addrspacecast (ptr addrspace(200) @_ZTIPi to ptr)) #[[ATTR3:[0-9]+]]
71+
// CHECK-RV32-NEXT: [[MATCHES:%.*]] = icmp eq i32 [[TMP2]], [[TMP3]]
72+
// CHECK-RV32-NEXT: br i1 [[MATCHES]], label [[CATCH:%.*]], label [[EH_RESUME:%.*]]
73+
// CHECK-RV32: catch:
74+
// CHECK-RV32-NEXT: [[TMP4:%.*]] = call ptr addrspace(200) @__cxa_begin_catch(ptr addrspace(200) [[TMP1]]) #[[ATTR3]]
75+
// CHECK-RV32-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr addrspace(200) [[TMP1]], i32 32
76+
// CHECK-RV32-NEXT: invoke void @_Z3barRPi(ptr addrspace(200) noundef nonnull align 8 dereferenceable(8) [[TMP5]])
77+
// CHECK-RV32-NEXT: to label [[INVOKE_CONT2:%.*]] unwind label [[LPAD1:%.*]]
78+
// CHECK-RV32: invoke.cont2:
79+
// CHECK-RV32-NEXT: call void @__cxa_end_catch() #[[ATTR3]]
80+
// CHECK-RV32-NEXT: br label [[TRY_CONT]]
81+
// CHECK-RV32: try.cont:
82+
// CHECK-RV32-NEXT: ret void
83+
// CHECK-RV32: lpad1:
84+
// CHECK-RV32-NEXT: [[TMP6:%.*]] = landingpad { ptr addrspace(200), i32 }
85+
// CHECK-RV32-NEXT: cleanup
86+
// CHECK-RV32-NEXT: [[TMP7:%.*]] = extractvalue { ptr addrspace(200), i32 } [[TMP6]], 0
87+
// CHECK-RV32-NEXT: [[TMP8:%.*]] = extractvalue { ptr addrspace(200), i32 } [[TMP6]], 1
88+
// CHECK-RV32-NEXT: call void @__cxa_end_catch() #[[ATTR3]]
89+
// CHECK-RV32-NEXT: br label [[EH_RESUME]]
90+
// CHECK-RV32: eh.resume:
91+
// CHECK-RV32-NEXT: [[EHSELECTOR_SLOT_0:%.*]] = phi i32 [ [[TMP8]], [[LPAD1]] ], [ [[TMP2]], [[CATCH_DISPATCH]] ]
92+
// CHECK-RV32-NEXT: [[EXN_SLOT_0:%.*]] = phi ptr addrspace(200) [ [[TMP7]], [[LPAD1]] ], [ [[TMP1]], [[CATCH_DISPATCH]] ]
93+
// CHECK-RV32-NEXT: [[LPAD_VAL:%.*]] = insertvalue { ptr addrspace(200), i32 } poison, ptr addrspace(200) [[EXN_SLOT_0]], 0
94+
// CHECK-RV32-NEXT: [[LPAD_VAL5:%.*]] = insertvalue { ptr addrspace(200), i32 } [[LPAD_VAL]], i32 [[EHSELECTOR_SLOT_0]], 1
95+
// CHECK-RV32-NEXT: resume { ptr addrspace(200), i32 } [[LPAD_VAL5]]
96+
//
97+
// CHECK-RV64-LABEL: define dso_local void @_Z3bazv
98+
// CHECK-RV64-SAME: () addrspace(200) #[[ATTR0:[0-9]+]] personality ptr addrspace(200) @__gxx_personality_v0 {
99+
// CHECK-RV64-NEXT: entry:
100+
// CHECK-RV64-NEXT: invoke void @_Z3foov()
101+
// CHECK-RV64-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[LPAD:%.*]]
102+
// CHECK-RV64: invoke.cont:
103+
// CHECK-RV64-NEXT: br label [[TRY_CONT:%.*]]
104+
// CHECK-RV64: lpad:
105+
// CHECK-RV64-NEXT: [[TMP0:%.*]] = landingpad { ptr addrspace(200), i32 }
106+
// CHECK-RV64-NEXT: catch ptr addrspace(200) @_ZTIPi
107+
// CHECK-RV64-NEXT: [[TMP1:%.*]] = extractvalue { ptr addrspace(200), i32 } [[TMP0]], 0
108+
// CHECK-RV64-NEXT: [[TMP2:%.*]] = extractvalue { ptr addrspace(200), i32 } [[TMP0]], 1
109+
// CHECK-RV64-NEXT: br label [[CATCH_DISPATCH:%.*]]
110+
// CHECK-RV64: catch.dispatch:
111+
// CHECK-RV64-NEXT: [[TMP3:%.*]] = call i32 @llvm.eh.typeid.for(ptr addrspacecast (ptr addrspace(200) @_ZTIPi to ptr)) #[[ATTR3:[0-9]+]]
112+
// CHECK-RV64-NEXT: [[MATCHES:%.*]] = icmp eq i32 [[TMP2]], [[TMP3]]
113+
// CHECK-RV64-NEXT: br i1 [[MATCHES]], label [[CATCH:%.*]], label [[EH_RESUME:%.*]]
114+
// CHECK-RV64: catch:
115+
// CHECK-RV64-NEXT: [[TMP4:%.*]] = call ptr addrspace(200) @__cxa_begin_catch(ptr addrspace(200) [[TMP1]]) #[[ATTR3]]
116+
// CHECK-RV64-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr addrspace(200) [[TMP1]], i32 32
117+
// CHECK-RV64-NEXT: invoke void @_Z3barRPi(ptr addrspace(200) noundef nonnull align 16 dereferenceable(16) [[TMP5]])
118+
// CHECK-RV64-NEXT: to label [[INVOKE_CONT2:%.*]] unwind label [[LPAD1:%.*]]
119+
// CHECK-RV64: invoke.cont2:
120+
// CHECK-RV64-NEXT: call void @__cxa_end_catch() #[[ATTR3]]
121+
// CHECK-RV64-NEXT: br label [[TRY_CONT]]
122+
// CHECK-RV64: try.cont:
123+
// CHECK-RV64-NEXT: ret void
124+
// CHECK-RV64: lpad1:
125+
// CHECK-RV64-NEXT: [[TMP6:%.*]] = landingpad { ptr addrspace(200), i32 }
126+
// CHECK-RV64-NEXT: cleanup
127+
// CHECK-RV64-NEXT: [[TMP7:%.*]] = extractvalue { ptr addrspace(200), i32 } [[TMP6]], 0
128+
// CHECK-RV64-NEXT: [[TMP8:%.*]] = extractvalue { ptr addrspace(200), i32 } [[TMP6]], 1
129+
// CHECK-RV64-NEXT: call void @__cxa_end_catch() #[[ATTR3]]
130+
// CHECK-RV64-NEXT: br label [[EH_RESUME]]
131+
// CHECK-RV64: eh.resume:
132+
// CHECK-RV64-NEXT: [[EHSELECTOR_SLOT_0:%.*]] = phi i32 [ [[TMP8]], [[LPAD1]] ], [ [[TMP2]], [[CATCH_DISPATCH]] ]
133+
// CHECK-RV64-NEXT: [[EXN_SLOT_0:%.*]] = phi ptr addrspace(200) [ [[TMP7]], [[LPAD1]] ], [ [[TMP1]], [[CATCH_DISPATCH]] ]
134+
// CHECK-RV64-NEXT: [[LPAD_VAL:%.*]] = insertvalue { ptr addrspace(200), i32 } poison, ptr addrspace(200) [[EXN_SLOT_0]], 0
135+
// CHECK-RV64-NEXT: [[LPAD_VAL5:%.*]] = insertvalue { ptr addrspace(200), i32 } [[LPAD_VAL]], i32 [[EHSELECTOR_SLOT_0]], 1
136+
// CHECK-RV64-NEXT: resume { ptr addrspace(200), i32 } [[LPAD_VAL5]]
137+
//
138+
void baz() {
139+
try {
140+
foo();
141+
} catch (int *&p) {
142+
bar(p);
143+
}
144+
}

0 commit comments

Comments
 (0)