forked from OSchip/llvm-project
81 lines
2.5 KiB
ArmAsm
81 lines
2.5 KiB
ArmAsm
# REQUIRES: x86
|
|
# RUN: rm -rf %t; split-file %s %t
|
|
|
|
## Test that we correctly handle the sdata4 DWARF pointer encoding. llvm-mc's
|
|
## CFI directives always generate EH frames using the absptr (i.e. system
|
|
## pointer size) encoding, but it is possible to hand-roll your own EH frames
|
|
## that use the sdata4 encoding. For instance, libffi does this.
|
|
|
|
# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-macos10.15 %t/sdata4.s -o %t/sdata4.o
|
|
# RUN: %lld -lSystem %t/sdata4.o -o %t/sdata4
|
|
# RUN: llvm-objdump --macho --syms --dwarf=frames %t/sdata4 | FileCheck %s
|
|
|
|
# CHECK: SYMBOL TABLE:
|
|
# CHECK: [[#%.16x,MAIN:]] g F __TEXT,__text _main
|
|
|
|
# CHECK: .eh_frame contents:
|
|
# CHECK: 00000000 00000010 00000000 CIE
|
|
# CHECK: Format: DWARF32
|
|
# CHECK: Version: 1
|
|
# CHECK: Augmentation: "zR"
|
|
# CHECK: Code alignment factor: 1
|
|
# CHECK: Data alignment factor: 1
|
|
# CHECK: Return address column: 1
|
|
# CHECK: Augmentation data: 1B
|
|
# CHECK: DW_CFA_def_cfa: reg7 +8
|
|
# CHECK: CFA=reg7+8
|
|
|
|
# CHECK: 00000014 00000010 00000018 FDE cie=00000000 pc=[[#%x,MAIN]]...[[#%x,MAIN+1]]
|
|
# CHECK: Format: DWARF32
|
|
# CHECK: DW_CFA_GNU_args_size: +16
|
|
# CHECK: DW_CFA_nop:
|
|
# CHECK: 0x[[#%x,MAIN]]: CFA=reg7+8
|
|
|
|
#--- sdata4.s
|
|
.globl _main
|
|
_main:
|
|
retq
|
|
LmainEnd:
|
|
|
|
.balign 4
|
|
.section __TEXT,__eh_frame
|
|
# Although we don't reference this EhFrame symbol directly, we must have at
|
|
# least one non-local symbol in this section, otherwise llvm-mc generates bogus
|
|
# subtractor relocations.
|
|
EhFrame:
|
|
LCieHdr:
|
|
.long LCieEnd - LCieStart
|
|
LCieStart:
|
|
.long 0 # CIE ID
|
|
.byte 1 # CIE version
|
|
.ascii "zR\0"
|
|
.byte 1 # Code alignment
|
|
.byte 1 # Data alignment
|
|
.byte 1 # RA column
|
|
.byte 1 # Augmentation size
|
|
.byte 0x1b # FDE pointer encoding (pcrel | sdata4)
|
|
.byte 0xc, 7, 8 # DW_CFA_def_cfa reg7 +8
|
|
.balign 4
|
|
LCieEnd:
|
|
|
|
LFdeHdr:
|
|
.long LFdeEnd - LFdeStart
|
|
LFdeStart:
|
|
.long LFdeStart - LCieHdr
|
|
# The next two fields are longs instead of quads because of the sdata4
|
|
# encoding.
|
|
.long _main - . # Function address
|
|
.long LmainEnd - _main # Function length
|
|
.byte 0
|
|
## Insert DW_CFA_GNU_args_size to prevent ld64 from creating a compact unwind
|
|
## entry to replace this FDE. Makes it easier for us to cross-check behavior
|
|
## across the two linkers (LLD never bothers trying to synthesize compact
|
|
## unwind if it is not already present).
|
|
.byte 0x2e, 0x10 # DW_CFA_GNU_args_size
|
|
.balign 4
|
|
LFdeEnd:
|
|
|
|
.long 0 # terminator
|
|
|
|
.subsections_via_symbols
|