diff options
author | Richard Sandiford <rdsandiford@googlemail.com> | 2004-11-16 10:16:30 +0000 |
---|---|---|
committer | Richard Sandiford <rdsandiford@googlemail.com> | 2004-11-16 10:16:30 +0000 |
commit | 353057a53cee99996317c9038f7de664a7d38b4c (patch) | |
tree | c4574abd52e50daa44e8f5460740c47f0ac48cbf /ld/testsuite/ld-mips-elf/eh-frame1.s | |
parent | b32d3aa2a05c297fcc8fa04c6b4c1345c6c291ad (diff) | |
download | gdb-353057a53cee99996317c9038f7de664a7d38b4c.zip gdb-353057a53cee99996317c9038f7de664a7d38b4c.tar.gz gdb-353057a53cee99996317c9038f7de664a7d38b4c.tar.bz2 |
* elf-bfd.h (eh_cie_fde): Add new fields: add_augmentation_size and
add_fde_encoding. Remove need_relative.
* elf-eh-frame.c (extra_augmentation_string_bytes)
(extra_augmentation_data_bytes, size_of_output_cie_fde): New functions.
(_bfd_elf_discard_section_eh_frame): Consider changing the FDE encoding
in cases where the CIE has no existing 'R' augmentation. Use
size_of_output_cie_fde when assigning offsets. Use the final offset
as the new section size.
(_bfd_elf_eh_frame_section_offset): Remove need_relative handling.
Account for any extra augmentation bytes in the returned offset.
(_bfd_elf_write_section_eh_frame): Rework so that the entries are
moved before being modified. Pad growing entries with DW_CFA_nops.
Add 'z' and 'R' augmentations as directed by add_augmentation_size
and add_fde_encoding.
Diffstat (limited to 'ld/testsuite/ld-mips-elf/eh-frame1.s')
-rw-r--r-- | ld/testsuite/ld-mips-elf/eh-frame1.s | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/ld/testsuite/ld-mips-elf/eh-frame1.s b/ld/testsuite/ld-mips-elf/eh-frame1.s new file mode 100644 index 0000000..c8413db --- /dev/null +++ b/ld/testsuite/ld-mips-elf/eh-frame1.s @@ -0,0 +1,148 @@ +#---------------------------------------------------------------------------- +# Macros +#---------------------------------------------------------------------------- + + mask = (1 << alignment) - 1 + + # Output VALUE as an unaligned pointer-sized quantity. + .macro pbyte value + .if alignment == 2 + .4byte \value + .else + .8byte \value + .endif + .endm + + + # Start a new CIE, and emit everything up to the augmentation data. + # Use LABEL to mark the start of the entry and AUG as the augmentation + # string. + .macro start_cie label,aug + .section .eh_frame,"aw",@progbits +\label: + .word 2f-1f # Length +1: + .word 0 # Identifier + .byte 1 # Version + .string "\aug" # Augmentation + .byte 1 # Code alignment + .byte 4 # Data alignment + .byte 31 # Return address column + .endm + + + # Create a dummy function of SIZE bytes in SECTION and emit the + # first four entries of an FDE for it. + .macro start_fde cie,section,size + .section \section,"ax",@progbits +3: + .rept \size / 4 + nop + .endr +4: + .section .eh_frame,"aw",@progbits + .word 2f-1f # Length +1: + .word .-\cie # CIE offset + pbyte 3b # Initial PC + pbyte 4b-3b # Size of code + .endm + + + # Finish a CIE or FDE entry. + .macro end_entry + .p2align alignment,fill +2: + .endm + + + # Start the augmentation data for a CIE that has a 'P' entry + # followed by EXTRA bytes. AUGLEN is the length of augmentation + # string (including zero terminator), ENCODING is the encoding to + # use for the personality routine and VALUE is the value it + # should have. + .macro persaug auglen,extra,encoding,value + .if (\encoding & 0xf0) == 0x50 + .byte (-(9 + \auglen + 3 + 2) & mask) + 2 + mask + \extra + .byte \encoding + .fill -(9 + \auglen + 3 + 2) & mask,1,0 + .else + .byte 2 + mask + \extra + .byte \encoding + .endif + pbyte \value + .endm + + + .macro cie_basic label + start_cie \label,"" + end_entry + .endm + + .macro fde_basic cie,section,size + start_fde \cie,\section,\size + end_entry + .endm + + + .macro cie_zP label,encoding,value + start_cie \label,"zP" + persaug 3,0,\encoding,\value + end_entry + .endm + + .macro fde_zP cie,section,size + start_fde \cie,\section,\size + .byte 0 # Augmentation length + end_entry + .endm + + + .macro cie_zPR label,encoding,value + start_cie \label,"zPR" + persaug 4,1,\encoding,\value + .byte 0 # FDE enconding + end_entry + .endm + + .macro fde_zPR cie,section,size + start_fde \cie,\section,\size + .byte 0 # Augmentation length + end_entry + .endm + +#---------------------------------------------------------------------------- +# Test code +#---------------------------------------------------------------------------- + + cie_basic basic1 + fde_basic basic1,.text,0x10 + fde_basic basic1,.text,0x20 + + cie_basic basic2 + fde_basic basic2,.text,0x30 + + cie_basic basic3 + fde_basic basic3,.text,0x40 + + cie_basic basic4 + fde_basic basic4,.text,0x50 + + cie_zP zP_unalign1,0x00,foo + fde_zP zP_unalign1,.text,0x10 + fde_zP zP_unalign1,.text,0x20 + + cie_zP zP_align1,0x50,foo + fde_zP zP_align1,.text,0x10 + fde_zP zP_align1,.text,0x20 + + cie_zPR zPR1,0x00,foo + fde_zPR zPR1,.text,0x10 + fde_zPR zPR1,.discard,0x20 + + cie_zPR zPR2,0x00,foo + fde_zPR zPR2,.text,0x30 + fde_zPR zPR2,.text,0x40 + + cie_basic basic5 + fde_basic basic5,.text,0x10 |