| ; RUN: llc < %s -mtriple=s390x-none-zos -mcpu=z10 | FileCheck %s | |
| ; | |
| ; Ensures that landingpad instructions use the right Exception Pointer | |
| ; and Exception Selector registers, and that the exception table is emitted. | |
| declare void @callee() | |
| declare void @passeh(ptr, i32) noreturn | |
| declare i32 @__zos_cxx_personality_v2(...) | |
| define void @test1() uwtable personality ptr @__zos_cxx_personality_v2 { | |
| entry: | |
| %ehptr = alloca ptr, align 8 | |
| %ehsel = alloca i32, align 8 | |
| invoke void @callee() to label %done unwind label %lpad | |
| done: | |
| ret void | |
| ; Match the return instruction. | |
| ; CHECK: b 2(7) | |
| lpad: | |
| %0 = landingpad { ptr, i32 } cleanup | |
| ; The Exception Pointer is %r1; the Exception Selector, %r2. | |
| ; CHECK: L#BB{{[^%]*}} DS 0H | |
| ; CHECK-DAG: stg 1,{{.*}} | |
| ; CHECK-DAG: st 2,{{.*}} | |
| %1 = extractvalue { ptr, i32 } %0, 0 | |
| %2 = extractvalue { ptr, i32 } %0, 1 | |
| store ptr %1, ptr %ehptr, align 8 | |
| store i32 %2, ptr %ehsel, align 8 | |
| call void @passeh(ptr %1, i32 %2) | |
| unreachable | |
| } | |
| ; Check that the exception table is emitted into .lsda section. | |
| ; CHECK: GCC_except.test1 CSECT | |
| ; CHECK: C_WSA64 CATTR ALIGN(3),FILL(0),DEFLOAD,NOTEXECUTABLE,RMODE(64),PART(GCC_ | |
| ; CHECK: _except.test1) | |
| ; CHECK: GCC_except.test1 XATTR LINKAGE(XPLINK),REFERENCE(DATA),SCOPE(SECTION) | |
| ; Check that offsets to the FD of the personality routine and LSDA are emitted in PPA1 | |
| ; CHECK: * PPA1 Flags 4 | |
| ; CHECK: * Bit 3: 1 = C++ EH block | |
| ; CHECK: * Bit 7: 1 = Name Length and Name | |
| ; CHECK: DC XL1'91' | |
| ; CHECK: * Personality routine | |
| ; CHECK: DC XL8'0000000000000000' | |
| ; CHECK: * LSDA location | |
| ; CHECK: DC XL8'0000000000000008' |