|
| 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.p200(ptr addrspace(200) @_ZTIPi) #[[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.p200(ptr addrspace(200) @_ZTIPi) #[[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.p200(ptr addrspace(200) @_ZTIPi) #[[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