# RUN: llc -o - %s -mtriple=x86_64-- -verify-cfiinstrs \ # RUN: -run-pass=cfi-instr-inserter 2>&1 | FileCheck %s # Test that CFI inserter inserts .cfi_offset/.cfi_register/.cfi_rel_offset # properly for callee saved registers. --- | define void @foo() { ret void } ... --- # CHECK: bb.3: # CHECK: CFI_INSTRUCTION offset $rbp, -16 # CHECK-NEXT: CFI_INSTRUCTION offset $r12, -24 # CHECK-NEXT: CFI_INSTRUCTION register $r13, $rcx # CHECK-NEXT: CFI_INSTRUCTION offset $r14, -40 name: foo alignment: 16 tracksRegLiveness: true liveins: - { reg: '$edi' } frameInfo: stackSize: 16 offsetAdjustment: -16 maxAlignment: 16 hasCalls: true maxCallFrameSize: 0 cvBytesOfCalleeSavedRegisters: 8 fixedStack: - { id: 0, type: spill-slot, offset: -40, size: 8, alignment: 8, callee-saved-register: '$r14' } - { id: 1, type: spill-slot, offset: -24, size: 8, alignment: 8, callee-saved-register: '$r12' } - { id: 2, type: spill-slot, offset: -16, size: 8, alignment: 16 } - { id: 3, type: spill-slot, offset: -16, size: 8, alignment: 16 } - { id: 4, type: spill-slot, offset: -24, size: 8, alignment: 8 } machineFunctionInfo: {} body: | bb.0: successors: %bb.2(0x40000000), %bb.1(0x40000000) liveins: $edi, $r12, $r13, $r14 frame-setup PUSH64r killed $rbp, implicit-def $rsp, implicit $rsp CFI_INSTRUCTION def_cfa_offset 16 CFI_INSTRUCTION offset $rbp, -16 $rbp = frame-setup MOV64rr $rsp CFI_INSTRUCTION def_cfa_register $rbp frame-setup PUSH64r killed $r12, implicit-def $rsp, implicit $rsp $rcx = frame-setup COPY $r13 frame-setup PUSH64r killed $r14, implicit-def $rsp, implicit $rsp CFI_INSTRUCTION offset $r12, -24 CFI_INSTRUCTION register $r13, $rcx CFI_INSTRUCTION rel_offset $r14, -24 TEST8rr renamable $dil, renamable $dil, implicit-def $eflags, implicit killed $edi JCC_1 %bb.2, 4, implicit killed $eflags JMP_1 %bb.1 bb.1: successors: %bb.3(0x80000000) renamable $r12 = IMPLICIT_DEF renamable $r13 = IMPLICIT_DEF renamable $r14 = IMPLICIT_DEF JMP_1 %bb.3 bb.2: liveins: $rcx dead $eax = MOV32r0 implicit-def dead $eflags, implicit-def $rax $r12 = frame-destroy POP64r implicit-def $rsp, implicit $rsp $r13 = frame-destroy COPY $rcx $r14 = frame-destroy POP64r implicit-def $rsp, implicit $rsp $rbp = frame-destroy POP64r implicit-def $rsp, implicit $rsp CFI_INSTRUCTION restore $rbp CFI_INSTRUCTION restore $r12 CFI_INSTRUCTION restore $r13 CFI_INSTRUCTION restore $r14 CFI_INSTRUCTION def_cfa $rsp, 8 RET 0, killed $rax bb.3: successors: %bb.4(0x80000000) renamable $rdi = IMPLICIT_DEF renamable $rsi = IMPLICIT_DEF bb.4: liveins: $rcx dead $eax = MOV32r0 implicit-def dead $eflags, implicit-def $rax $r12 = frame-destroy POP64r implicit-def $rsp, implicit $rsp $r13 = frame-destroy COPY $rcx $r14 = frame-destroy POP64r implicit-def $rsp, implicit $rsp $rbp = frame-destroy POP64r implicit-def $rsp, implicit $rsp CFI_INSTRUCTION restore $rbp CFI_INSTRUCTION restore $r12 CFI_INSTRUCTION restore $r13 CFI_INSTRUCTION restore $r14 CFI_INSTRUCTION def_cfa $rsp, 8 RET 0, killed $rax ...