aboutsummaryrefslogtreecommitdiff
path: root/binutils
diff options
context:
space:
mode:
authorPat Bernardi <bernardi@adacore.com>2020-06-25 16:05:38 -0400
committerAlan Modra <amodra@gmail.com>2020-06-26 14:42:19 +0930
commit85f7484a3a1921649029c4a4fcf3247c3f3bc13c (patch)
treed8cec9b624c9984936c00c9f3389d0c3a757750d /binutils
parentba9b3ef5ee666467b67780e81f868c432f4fc56d (diff)
downloadgdb-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/ChangeLog5
-rw-r--r--binutils/readelf.c42
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,