| ; RUN: llc -mtriple s390x-ibm-zos < %s | FileCheck %s | |
| define i32 @leaf(i32 signext %arg) { | |
| ; CHECK: DS 0B | |
| ; CHECK-NEXT: * @leaf | |
| ; CHECK-NEXT: * XPLINK Routine Layout Entry | |
| ; CHECK-NEXT: L#EPM_leaf_0 DS 0H | |
| ; CHECK-NEXT: * Eyecatcher 0x00C300C500C500 | |
| ; CHECK-NEXT: DC XL7'00C300C500C500' | |
| ; CHECK-NEXT: * Mark Type C'1' | |
| ; CHECK-NEXT: DC XL1'F1' | |
| ; CHECK-NEXT: * Offset to PPA1 | |
| ; CHECK-NEXT: DC AD(L#PPA1_leaf_0-L#EPM_leaf_0) | |
| ; CHECK-NEXT: * DSA Size 0x0 | |
| ; CHECK-NEXT: * Entry Flags | |
| ; CHECK-NEXT: * Bit 1: 1 = Leaf function | |
| ; CHECK-NEXT: * Bit 2: 0 = Does not use alloca | |
| ; CHECK-NEXT: DC XL4'00000008' | |
| ; CHECK-NEXT: ENTRY leaf | |
| ; CHECK-NOT: stack_update | |
| ; CHECK-NOT: *FENCE | |
| ; CHECK-NOT: end_of_prologue | |
| entry: | |
| %sum = add i32 1, %arg | |
| ret i32 %sum | |
| } | |
| define i32 @nonleaf(i32 signext %arg) { | |
| ; CHECK: DS 0B | |
| ; CHECK-NEXT: * @nonleaf | |
| ; CHECK-NEXT: * XPLINK Routine Layout Entry | |
| ; CHECK-NEXT: L#EPM_nonleaf_0 DS 0H | |
| ; CHECK-NEXT: * Eyecatcher 0x00C300C500C500 | |
| ; CHECK-NEXT: DC XL7'00C300C500C500' | |
| ; CHECK-NEXT: * Mark Type C'1' | |
| ; CHECK-NEXT: DC XL1'F1' | |
| ; CHECK-NEXT: * Offset to PPA1 | |
| ; CHECK-NEXT: DC AD(L#PPA1_nonleaf_0-L#EPM_nonleaf_0) | |
| ; CHECK-NEXT: * DSA Size 0xc0 | |
| ; CHECK-NEXT: * Entry Flags | |
| ; CHECK-NEXT: * Bit 1: 0 = Non-leaf function | |
| ; CHECK-NEXT: * Bit 2: 0 = Does not use alloca | |
| ; CHECK-NEXT: DC XL4'000000C0' | |
| ; CHECK-NEXT: ENTRY nonleaf | |
| ; CHECK: stmg 6,7,1872(4) | |
| ; CHECK-NEXT: L#stack_update0 DS 0H | |
| ; CHECK-NEXT: aghi 4,-192 | |
| ; CHECK-NEXT: *FENCE | |
| ; CHECK-NEXT: L#end_of_prologue0 DS 0H | |
| entry: | |
| %res = call i32 @leaf(i32 %arg) | |
| ret i32 %res | |
| } | |
| define i32 @withalloca(i32 signext %arg) { | |
| ; CHECK: DS 0B | |
| ; CHECK-NEXT: * @withalloca | |
| ; CHECK-NEXT: * XPLINK Routine Layout Entry | |
| ; CHECK-NEXT: L#EPM_withalloca_0 DS 0H | |
| ; CHECK-NEXT: * Eyecatcher 0x00C300C500C500 | |
| ; CHECK-NEXT: DC XL7'00C300C500C500' | |
| ; CHECK-NEXT: * Mark Type C'1' | |
| ; CHECK-NEXT: DC XL1'F1' | |
| ; CHECK-NEXT: * Offset to PPA1 | |
| ; CHECK-NEXT: DC AD(L#PPA1_withalloca_0-L#EPM_withalloca_0) | |
| ; CHECK-NEXT: * DSA Size 0xc0 | |
| ; CHECK-NEXT: * Entry Flags | |
| ; CHECK-NEXT: * Bit 1: 0 = Non-leaf function | |
| ; CHECK-NEXT: * Bit 2: 1 = Uses alloca | |
| ; CHECK-NEXT: DC XL4'000000C4' | |
| ; CHECK-NEXT: ENTRY withalloca | |
| ; CHECK: stmg 4,10,1856(4) | |
| ; CHECK-NEXT: L#stack_update1 DS 0H | |
| ; CHECK-NEXT: aghi 4,-192 | |
| ; CHECK-NEXT: lgr 8,4 | |
| ; CHECK-NEXT: *FENCE | |
| ; CHECK-NEXT: L#end_of_prologue1 DS 0H | |
| entry: | |
| %p = alloca i8, i32 %arg | |
| %res = call i32 @other(ptr %p, i32 %arg) | |
| ret i32 %res | |
| } | |
| declare i32 @other(ptr, i32) | |
| ; CHECK: * PPA1 | |
| ; CHECK-NEXT: L#PPA1_leaf_0 DS 0H | |
| ; CHECK-NEXT: * Version | |
| ; CHECK-NEXT: DC XL1'02' | |
| ; CHECK-NEXT: * LE Signature X'CE' | |
| ; CHECK-NEXT: DC XL1'CE' | |
| ; CHECK-NEXT: * Saved GPR Mask | |
| ; CHECK-NEXT: DC XL2'0000' | |
| ; CHECK-NEXT: * Offset to PPA2 | |
| ; CHECK-NEXT: DC AD(L#PPA2-L#PPA1_leaf_0) | |
| ; CHECK-NEXT: * PPA1 Flags 1 | |
| ; CHECK-NEXT: * Bit 0: 1 = 64-bit DSA | |
| ; CHECK-NEXT: DC XL1'80' | |
| ; CHECK-NEXT: * PPA1 Flags 2 | |
| ; CHECK-NEXT: * Bit 0: 1 = External procedure | |
| ; CHECK-NEXT: * Bit 3: 0 = STACKPROTECT is not enabled | |
| ; CHECK-NEXT: DC XL1'80' | |
| ; CHECK-NEXT: * PPA1 Flags 3 | |
| ; CHECK-NEXT: DC XL1'00' | |
| ; CHECK-NEXT: * PPA1 Flags 4 | |
| ; CHECK-NEXT: * Bit 7: 1 = Name Length and Name | |
| ; CHECK-NEXT: DC XL1'81' | |
| ; CHECK-NEXT: * Length/4 of Parms | |
| ; CHECK-NEXT: DC XL2'0002' | |
| ; CHECK-NEXT: * Length/2 of Prolog | |
| ; CHECK-NEXT: DC XL1'00' | |
| ; CHECK-NEXT: * Alloca Reg + Offset/2 to SP Update | |
| ; CHECK-NEXT: * Bit 0-3: Register R0 | |
| ; CHECK-NEXT: * Bit 4-8: Offset | |
| ; CHECK-NEXT: DC XL1'00' | |
| ; CHECK-NEXT: * Length of Code | |
| ; CHECK-NEXT: DC AD(L#leaf_end_0-L#EPM_leaf_0) | |
| ; CHECK-NEXT: * Length of Name | |
| ; CHECK-NEXT: DC XL2'0004' | |
| ; CHECK-NEXT: * Name of Function | |
| ; CHECK-NEXT: DC XL4'93858186' | |
| ; CHECK-NEXT: DC 2XL1'00' | |
| ; CHECK-NEXT: DC AD(L#EPM_leaf_0-L#PPA1_leaf_0) | |
| ; CHECK-NEXT: DS 0B | |
| ; CHECK-NEXT: * PPA1 | |
| ; CHECK-NEXT: L#PPA1_nonleaf_0 DS 0H | |
| ; CHECK-NEXT: * Version | |
| ; CHECK-NEXT: DC XL1'02' | |
| ; CHECK-NEXT: * LE Signature X'CE' | |
| ; CHECK-NEXT: DC XL1'CE' | |
| ; CHECK-NEXT: * Saved GPR Mask | |
| ; CHECK-NEXT: DC XL2'0300' | |
| ; CHECK-NEXT: * Offset to PPA2 | |
| ; CHECK-NEXT: DC AD(L#PPA2-L#PPA1_nonleaf_0) | |
| ; CHECK-NEXT: * PPA1 Flags 1 | |
| ; CHECK-NEXT: * Bit 0: 1 = 64-bit DSA | |
| ; CHECK-NEXT: DC XL1'80' | |
| ; CHECK-NEXT: * PPA1 Flags 2 | |
| ; CHECK-NEXT: * Bit 0: 1 = External procedure | |
| ; CHECK-NEXT: * Bit 3: 0 = STACKPROTECT is not enabled | |
| ; CHECK-NEXT: DC XL1'80' | |
| ; CHECK-NEXT: * PPA1 Flags 3 | |
| ; CHECK-NEXT: DC XL1'00' | |
| ; CHECK-NEXT: * PPA1 Flags 4 | |
| ; CHECK-NEXT: * Bit 7: 1 = Name Length and Name | |
| ; CHECK-NEXT: DC XL1'81' | |
| ; CHECK-NEXT: * Length/4 of Parms | |
| ; CHECK-NEXT: DC XL2'0002' | |
| ; CHECK-NEXT: L#tmp0 EQU L#end_of_prologue0-nonleaf | |
| ; CHECK-NEXT: * Length/2 of Prolog | |
| ; CHECK-NEXT: DC AD(L#tmp0/2) | |
| ; CHECK-NEXT: L#tmp1 EQU L#stack_update0-nonleaf | |
| ; CHECK-NEXT: * Alloca Reg + Offset/2 to SP Update | |
| ; CHECK-NEXT: * Bit 0-3: Register R0 | |
| ; CHECK-NEXT: * Bit 4-8: Offset | |
| ; CHECK-NEXT: DC AD(L#tmp1/2),XL1'00' | |
| ; CHECK-NEXT: * Length of Code | |
| ; CHECK-NEXT: DC AD(L#nonleaf_end_0-L#EPM_nonleaf_0) | |
| ; CHECK-NEXT: * Length of Name | |
| ; CHECK-NEXT: DC XL2'0007' | |
| ; CHECK-NEXT: * Name of Function | |
| ; CHECK-NEXT: DC XL7'95969593858186' | |
| ; CHECK-NEXT: DC 3XL1'00' | |
| ; CHECK-NEXT: DC AD(L#EPM_nonleaf_0-L#PPA1_nonleaf_0) | |
| ; CHECK-NEXT: DS 0B | |
| ; CHECK-NEXT: * PPA1 | |
| ; CHECK-NEXT: L#PPA1_withalloca_0 DS 0H | |
| ; CHECK-NEXT: * Version | |
| ; CHECK-NEXT: DC XL1'02' | |
| ; CHECK-NEXT: * LE Signature X'CE' | |
| ; CHECK-NEXT: DC XL1'CE' | |
| ; CHECK-NEXT: * Saved GPR Mask | |
| ; CHECK-NEXT: DC XL2'0FE0' | |
| ; CHECK-NEXT: * Offset to PPA2 | |
| ; CHECK-NEXT: DC AD(L#PPA2-L#PPA1_withalloca_0) | |
| ; CHECK-NEXT: * PPA1 Flags 1 | |
| ; CHECK-NEXT: * Bit 0: 1 = 64-bit DSA | |
| ; CHECK-NEXT: DC XL1'80' | |
| ; CHECK-NEXT: * PPA1 Flags 2 | |
| ; CHECK-NEXT: * Bit 0: 1 = External procedure | |
| ; CHECK-NEXT: * Bit 3: 0 = STACKPROTECT is not enabled | |
| ; CHECK-NEXT: DC XL1'80' | |
| ; CHECK-NEXT: * PPA1 Flags 3 | |
| ; CHECK-NEXT: * Bit 1: 1 = Argument Area Length is in optional area | |
| ; CHECK-NEXT: DC XL1'40' | |
| ; CHECK-NEXT: * PPA1 Flags 4 | |
| ; CHECK-NEXT: * Bit 7: 1 = Name Length and Name | |
| ; CHECK-NEXT: DC XL1'81' | |
| ; CHECK-NEXT: * Length/4 of Parms | |
| ; CHECK-NEXT: DC XL2'0002' | |
| ; CHECK-NEXT: L#tmp2 EQU L#end_of_prologue1-withalloca | |
| ; CHECK-NEXT: * Length/2 of Prolog | |
| ; CHECK-NEXT: DC AD(L#tmp2/2) | |
| ; CHECK-NEXT: L#tmp3 EQU L#stack_update1-withalloca | |
| ; CHECK-NEXT: * Alloca Reg + Offset/2 to SP Update | |
| ; CHECK-NEXT: * Bit 0-3: Register R8 | |
| ; CHECK-NEXT: * Bit 4-8: Offset | |
| ; CHECK-NEXT: DC AD(L#tmp3/2),XL1'80' | |
| ; CHECK-NEXT: * Length of Code | |
| ; CHECK-NEXT: DC AD(L#withalloca_end_0-L#EPM_withalloca_0) | |
| ; CHECK-NEXT: * Argument Area Length | |
| ; CHECK-NEXT: DC XL4'00000040' | |
| ; CHECK-NEXT: * Length of Name | |
| ; CHECK-NEXT: DC XL2'000A' | |
| ; CHECK-NEXT: * Name of Function | |
| ; CHECK-NEXT: DC XL10'A689A388819393968381' | |
| ; CHECK-NEXT: DC 4XL1'00' | |
| ; CHECK-NEXT: DC AD(L#EPM_withalloca_0-L#PPA1_withalloca_0) | |
| ; Attribute "zos-ppa1-name"="" removes the function name from PPA1. | |
| ; CHECK: * PPA1 | |
| ; CHECK-NEXT: L#PPA1_no_name_0 DS 0H | |
| ; CHECK: * PPA1 Flags 4 | |
| ; CHECK-NEXT: DC XL1'80' | |
| ; CHECK-NEXT: * Length/4 of Parms | |
| ; CHECK-NEXT: DC XL2'0000' | |
| ; CHECK-NEXT: * Length/2 of Prolog | |
| ; CHECK-NEXT: DC XL1'00' | |
| ; CHECK-NEXT: * Alloca Reg + Offset/2 to SP Update | |
| ; CHECK-NEXT: * Bit 0-3: Register R0 | |
| ; CHECK-NEXT: * Bit 4-8: Offset | |
| ; CHECK-NEXT: DC XL1'00' | |
| ; CHECK-NEXT: * Length of Code | |
| ; CHECK-NEXT: DC AD(L#no_name_end_0-L#EPM_no_name_0) | |
| ; CHECK-NEXT: DC AD(L#EPM_no_name_0-L#PPA1_no_name_0) | |
| define void @no_name() #0 { | |
| entry: | |
| ret void | |
| } | |
| attributes #0 = { "zos-ppa1-name" } |