unwind_test_x86_64.s [plain text]
#
# This is a generic function to test that restoring registers during unwinding work correctly.
#
.text
.globl _unwind_tester
_unwind_tester:
LFB3:
pushq %rbp
LCFI45:
movq %rsp, %rbp
LCFI46:
movq %rbx, -40(%rbp)
LCFI47:
movq %r12, -32(%rbp)
LCFI48:
movq %r13, -24(%rbp)
LCFI49:
movq %r14, -16(%rbp)
LCFI50:
movq %r15, -8(%rbp)
LCFI51:
subq $48, %rsp
LCFI52:
# load magic values into non-volatile registers
movq $0x1234567887654321, %rbx
movq $0x02468ACEECA86420, %r12
movq $0x13579BDFFDB97531, %r13
movq $0x1122334455667788, %r14
movq $0x0022446688AACCEE, %r15
# call test function which will invoke unwinder which "returns" here
call *%rdi
# verify that non-volatile registers still contain magic values
movq $0x1234567887654321, %rax
cmpq %rax, %rbx
jne L2
movq $0x02468ACEECA86420, %rax
cmpq %rax, %r12
jne L2
movq $0x13579BDFFDB97531, %rax
cmpq %rax, %r13
jne L2
movq $0x1122334455667788, %rax
cmpq %rax, %r14
jne L2
movq $0x0022446688AACCEE, %rax
cmpq %rax, %r15
jne L2
movl $0, %eax
jmp L3
L2: movl $1, %eax
L3:
movq -40(%rbp), %rbx
movq -32(%rbp), %r12
movq -24(%rbp), %r13
movq -16(%rbp), %r14
movq -8(%rbp), %r15
leave
ret
LFE3:
.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support
EH_frame1:
.set L$set$0,LECIE1-LSCIE1
.long L$set$0 # Length of Common Information Entry
LSCIE1:
.long 0x0 # CIE Identifier Tag
.byte 0x1 # CIE Version
.ascii "zR\0" # CIE Augmentation
.byte 0x1 # uleb128 0x1 .byte 0x10 # CIE RA Column
.byte 0x1 # uleb128 0x1 .byte 0xc # DW_CFA_def_cfa
.byte 0x7 # uleb128 0x7
.byte 0x8 # uleb128 0x8
.byte 0x90 # DW_CFA_offset, column 0x10
.byte 0x1 # uleb128 0x1
.align 3
LECIE1:
.globl _unwind_tester.eh
_unwind_tester.eh:
LSFDE23:
.set L$set$52,LEFDE23-LASFDE23
.long L$set$52 # FDE Length
LASFDE23:
.long LASFDE23-EH_frame1 # FDE CIE offset
.quad LFB3-. # FDE initial location
.set L$set$53,LFE3-LFB3
.quad L$set$53 # FDE address range
.byte 0x0 # uleb128 0x0 .set L$set$54,LCFI45-LFB3
.long L$set$54
.byte 0xe # DW_CFA_def_cfa_offset
.byte 0x10 # uleb128 0x10
.byte 0x86 # DW_CFA_offset, column 0x6
.byte 0x2 # uleb128 0x2
.byte 0x4 # DW_CFA_advance_loc4
.set L$set$55,LCFI46-LCFI45
.long L$set$55
.byte 0xd # DW_CFA_def_cfa_register
.byte 0x6 # uleb128 0x6
.byte 0x4 # DW_CFA_advance_loc4
.set L$set$56,LCFI52-LCFI46
.long L$set$56
.byte 0x8f # DW_CFA_offset, column 0xf
.byte 0x3 # uleb128 0x3
.byte 0x8e # DW_CFA_offset, column 0xe
.byte 0x4 # uleb128 0x4
.byte 0x8d # DW_CFA_offset, column 0xd
.byte 0x5 # uleb128 0x5
.byte 0x8c # DW_CFA_offset, column 0xc
.byte 0x6 # uleb128 0x6
.byte 0x83 # DW_CFA_offset, column 0x3
.byte 0x7 # uleb128 0x7
.align 3
LEFDE23: