aboutsummaryrefslogtreecommitdiff
path: root/ld/testsuite/ld-mips-elf/eh-frame1.s
diff options
context:
space:
mode:
authorRichard Sandiford <rdsandiford@googlemail.com>2004-11-16 10:16:30 +0000
committerRichard Sandiford <rdsandiford@googlemail.com>2004-11-16 10:16:30 +0000
commit353057a53cee99996317c9038f7de664a7d38b4c (patch)
treec4574abd52e50daa44e8f5460740c47f0ac48cbf /ld/testsuite/ld-mips-elf/eh-frame1.s
parentb32d3aa2a05c297fcc8fa04c6b4c1345c6c291ad (diff)
downloadgdb-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.s148
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