Fix PR gas/22738 (.dc.a directive has wrong size on SPARC 64-bit).

The .dc.a directive has wrong size (32 bits) on SPARC 64-bit because
the assembler sets the correct BFD architecture only at the very end
of the processing and it's too late for the directive.  It's fixed by
defining TARGET_MACH and making it return a sensible default value.

gas/
	* config/tc-sparc.h (sparc_mach): Declare.
	(TARGET_MACH): Define to above.
	* config/tc-sparc.c (sparc_mach): New function.
	(sparc_md_end): Minor tweak.
ld/
	* testsuite/ld-elf/pr22450.d: Remove reference to SPARC64.
This commit is contained in:
Eric Botcazou
2018-01-30 00:13:51 +01:00
parent 86b24e15c4
commit d85815e2d1
5 changed files with 31 additions and 3 deletions

View File

@@ -1,3 +1,11 @@
2018-01-29 Eric Botcazou <ebotcazou@adacore.com>
PR gas/22738
* config/tc-sparc.h (sparc_mach): Declare.
(TARGET_MACH): Define to above.
* config/tc-sparc.c (sparc_mach): New function.
(sparc_md_end): Minor tweak.
2018-01-29 Nick Clifton <nickc@redhat.com>
* po/ru.po: Updated Russian translation.

View File

@@ -325,6 +325,19 @@ init_default_arch (void)
default_arch_type = sa->arch_type;
}
/* Called by TARGET_MACH. */
unsigned long
sparc_mach (void)
{
/* We don't get a chance to initialize anything before we're called,
so handle that now. */
if (! default_init_p)
init_default_arch ();
return sparc_arch_size == 64 ? bfd_mach_sparc_v9 : bfd_mach_sparc;
}
/* Called by TARGET_FORMAT. */
const char *
@@ -1148,7 +1161,7 @@ md_begin (void)
void
sparc_md_end (void)
{
unsigned long mach = bfd_mach_sparc;
unsigned long mach;
#if defined(OBJ_ELF) && !defined(TE_SOLARIS)
int hwcaps, hwcaps2;
#endif
@@ -1182,7 +1195,7 @@ sparc_md_end (void)
/* The sparclite is treated like a normal sparc. Perhaps it shouldn't
be but for now it is (since that's the way it's always been
treated). */
default: break;
default: mach = bfd_mach_sparc; break;
}
bfd_set_arch_mach (stdoutput, bfd_arch_sparc, mach);

View File

@@ -30,6 +30,9 @@ struct frag;
#define TARGET_ARCH bfd_arch_sparc
extern unsigned long sparc_mach (void);
#define TARGET_MACH sparc_mach ()
#ifdef TE_FreeBSD
#define ELF_TARGET_FORMAT "elf32-sparc"
#define ELF64_TARGET_FORMAT "elf64-sparc-freebsd"

View File

@@ -1,3 +1,7 @@
2018-01-29 Eric Botcazou <ebotcazou@adacore.com>
* testsuite/ld-elf/pr22450.d: Remove reference to SPARC64.
2018-01-29 Maciej W. Rozycki <macro@mips.com>
* testsuite/ld-mips-elf/comm-data.exp: Correct support for

View File

@@ -2,7 +2,7 @@
#readelf: --notes --wide
#ld: -r
# Fails on H8300 because it does not generate the correct relocs for the size fields.
# Fails on AVR, IP2K, M68HC11, SPARC64, XC16C because the assembler does not calculate the correct values for the differences of local symbols.
# Fails on AVR, IP2K, M68HC11, XC16C because the assembler does not calculate the correct values for the differences of local symbols.
# Fails on CRX because readelf does not know how to apply CRX reloc number 20 (R_CRX_SWITCH32).
#...