diff options
author | Pat Bernardi <bernardi@adacore.com> | 2020-06-25 16:05:38 -0400 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2020-06-26 14:42:19 +0930 |
commit | 85f7484a3a1921649029c4a4fcf3247c3f3bc13c (patch) | |
tree | d8cec9b624c9984936c00c9f3389d0c3a757750d /binutils | |
parent | ba9b3ef5ee666467b67780e81f868c432f4fc56d (diff) | |
download | gdb-85f7484a3a1921649029c4a4fcf3247c3f3bc13c.zip gdb-85f7484a3a1921649029c4a4fcf3247c3f3bc13c.tar.gz gdb-85f7484a3a1921649029c4a4fcf3247c3f3bc13c.tar.bz2 |
m68k: tag floating-point ABI used
This patch adds GNU attribute support to m68k and utilises it to tag the
floating-point calling convention used (hard-float or soft-float). It enables
the linker to ensure linked objects use a consistent floating-point ABI and
allows tools like GDB to infer the ABI used from the ELF file. It is based on
similar work done for PowerPC.
bfd/
* elf32-m68k.c (m68k_elf_merge_obj_attributes): New function.
(elf32_m68k_merge_private_bfd_data): Merge GNU attributes.
binutils/
* readelf.c (display_m68k_gnu_attribute): New function.
(process_arch_specific): Call display_m68k_gnu_attribute for EM_68K.
gas/
* config/tc-m68k.c (m68k_elf_gnu_attribute): New function.
(md_pseudo_table): Handle "gnu_attribute".
* doc/as.texi: Document GNU attribute for M68K.
include/
* elf/m68k.h: Add enum for GNU object attribute with floating point
tag name and values.
ld/
* testsuite/ld-m68k/attr-gnu-4-0.s: New file.
* testsuite/ld-m68k/attr-gnu-4-1.s: Likewise.
* testsuite/ld-m68k/attr-gnu-4-2.s: Likewise.
* testsuite/ld-m68k/attr-gnu-4-00.d: Likewise.
* testsuite/ld-m68k/attr-gnu-4-01.d: Likewise.
* testsuite/ld-m68k/attr-gnu-4-02.d: Likewise.
* testsuite/ld-m68k/attr-gnu-4-10.d: Likewise.
* testsuite/ld-m68k/attr-gnu-4-11.d: Likewise.
* testsuite/ld-m68k/attr-gnu-4-12.d: Likewise.
* testsuite/ld-m68k/attr-gnu-4-20.d: Likewise.
* testsuite/ld-m68k/attr-gnu-4-21.d: Likewise.
* testsuite/ld-m68k/attr-gnu-4-22.d: Likewise.
* testsuite/ld-m68k/m68k.exp: Run the new tests.
Diffstat (limited to 'binutils')
-rw-r--r-- | binutils/ChangeLog | 5 | ||||
-rw-r--r-- | binutils/readelf.c | 42 |
2 files changed, 47 insertions, 0 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 722e563..2009fc1 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,8 @@ +2020-06-26 Pat Bernardi <bernardi@adacore.com> + + * readelf.c (display_m68k_gnu_attribute): New function. + (process_arch_specific): Call display_m68k_gnu_attribute for EM_68K. + 2020-06-23 H.J. Lu <hongjiu.lu@intel.com> PR binutils/26160 diff --git a/binutils/readelf.c b/binutils/readelf.c index 9e4fa33..25f0e23 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -15368,6 +15368,44 @@ display_gnu_attribute (unsigned char * p, } static unsigned char * +display_m68k_gnu_attribute (unsigned char * p, + unsigned int tag, + const unsigned char * const end) +{ + unsigned int val; + + if (tag == Tag_GNU_M68K_ABI_FP) + { + printf (" Tag_GNU_M68K_ABI_FP: "); + if (p == end) + { + printf (_("<corrupt>\n")); + return p; + } + READ_ULEB (val, p, end); + + if (val > 3) + printf ("(%#x), ", val); + + switch (val & 3) + { + case 0: + printf (_("unspecified hard/soft float\n")); + break; + case 1: + printf (_("hard float\n")); + break; + case 2: + printf (_("soft float\n")); + break; + } + return p; + } + + return display_tag_value (tag & 1, p, end); +} + +static unsigned char * display_power_gnu_attribute (unsigned char * p, unsigned int tag, const unsigned char * const end) @@ -19928,6 +19966,10 @@ process_arch_specific (Filedata * filedata) case EM_NDS32: return process_nds32_specific (filedata); + case EM_68K: + return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL, + display_m68k_gnu_attribute); + case EM_PPC: case EM_PPC64: return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL, |