From 114424c6b3c664cb3a79d26883771c429633ffd1 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Thu, 5 Dec 2002 11:46:50 +0000 Subject: [PATCH] * config/tc-arm.c (arm_force_relocation): Move out of #if OBJ_ELF. Move OBJ_COFF TC_FORCE_RELOCATION code here so that COFF handles ARM_IMMEDIATE and ARM_ADRL_IMMEDIATE relocs as for ELF. * config/tc-arm.h (TC_FORCE_RELOCATION): Define for both ELF and COFF to call arm_force_relocation. --- gas/ChangeLog | 8 ++++++++ gas/config/tc-arm.c | 47 ++++++++++++++++++++++++++------------------- gas/config/tc-arm.h | 8 +++----- 3 files changed, 38 insertions(+), 25 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index abf40ea1771..4283fea5bfe 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,11 @@ +2002-12-05 Alan Modra + + * config/tc-arm.c (arm_force_relocation): Move out of #if OBJ_ELF. + Move OBJ_COFF TC_FORCE_RELOCATION code here so that COFF handles + ARM_IMMEDIATE and ARM_ADRL_IMMEDIATE relocs as for ELF. + * config/tc-arm.h (TC_FORCE_RELOCATION): Define for both ELF and + COFF to call arm_force_relocation. + 2002-12-04 David Mosberger * config/tc-ia64.c (pseudo_func): Add "@pause" constant for "hint" diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c index f78f1000980..9682141a2a4 100644 --- a/gas/config/tc-arm.c +++ b/gas/config/tc-arm.c @@ -11432,6 +11432,32 @@ arm_validate_fix (fixP) } } +int +arm_force_relocation (fixp) + struct fix * fixp; +{ +#if defined (OBJ_COFF) && defined (TE_PE) + if (fixp->fx_r_type == BFD_RELOC_RVA) + return 1; +#endif +#ifdef OBJ_ELF + if ( fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT + || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY + || fixp->fx_r_type == BFD_RELOC_ARM_PCREL_BRANCH + || fixp->fx_r_type == BFD_RELOC_ARM_PCREL_BLX + || fixp->fx_r_type == BFD_RELOC_THUMB_PCREL_BLX + || fixp->fx_r_type == BFD_RELOC_THUMB_PCREL_BRANCH23) + return 1; +#endif + + /* Resolve these relocations even if the symbol is extern or weak. */ + if (fixp->fx_r_type == BFD_RELOC_ARM_IMMEDIATE + || fixp->fx_r_type == BFD_RELOC_ARM_ADRL_IMMEDIATE) + return 0; + + return S_FORCE_RELOC (fixp->fx_addsy); +} + #ifdef OBJ_COFF /* This is a little hack to help the gas/arm/adrl.s test. It prevents local labels from being added to the output symbol table when they @@ -11448,6 +11474,7 @@ arm_fix_adjustable (fixP) return 0; } #endif + #ifdef OBJ_ELF /* Relocations against Thumb function names must be left unadjusted, so that the linker can use this information to correctly set the @@ -11514,26 +11541,6 @@ armelf_frob_symbol (symp, puntp) elf_frob_symbol (symp, puntp); } -int -arm_force_relocation (fixp) - struct fix * fixp; -{ - if ( fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT - || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY - || fixp->fx_r_type == BFD_RELOC_ARM_PCREL_BRANCH - || fixp->fx_r_type == BFD_RELOC_ARM_PCREL_BLX - || fixp->fx_r_type == BFD_RELOC_THUMB_PCREL_BLX - || fixp->fx_r_type == BFD_RELOC_THUMB_PCREL_BRANCH23) - return 1; - - /* Resolve these relocations even if the symbol is extern or weak. */ - if (fixp->fx_r_type == BFD_RELOC_ARM_IMMEDIATE - || fixp->fx_r_type == BFD_RELOC_ARM_ADRL_IMMEDIATE) - return 0; - - return S_FORCE_RELOC (fixp->fx_addsy); -} - static bfd_reloc_code_real_type arm_parse_reloc () { diff --git a/gas/config/tc-arm.h b/gas/config/tc-arm.h index 441c16f30c3..3b98b334267 100644 --- a/gas/config/tc-arm.h +++ b/gas/config/tc-arm.h @@ -77,8 +77,6 @@ struct fix; #ifdef OBJ_COFF # if defined TE_PE -# define TC_FORCE_RELOCATION(x) \ - ((x)->fx_r_type == BFD_RELOC_RVA || S_FORCE_RELOC ((x)->fx_addsy)) # ifdef TE_EPOC # define TARGET_FORMAT (target_big_endian ? "epoc-pe-arm-big" : "epoc-pe-arm-little") # else @@ -92,11 +90,11 @@ struct fix; #ifdef OBJ_ELF # define TARGET_FORMAT elf32_arm_target_format() extern const char * elf32_arm_target_format PARAMS ((void)); - -# define TC_FORCE_RELOCATION(FIX) arm_force_relocation (FIX) - extern int arm_force_relocation PARAMS ((struct fix *)); #endif +#define TC_FORCE_RELOCATION(FIX) arm_force_relocation (FIX) +extern int arm_force_relocation PARAMS ((struct fix *)); + #define md_convert_frag(b, s, f) {as_fatal (_("arm convert_frag\n"));} #define md_cleanup() arm_cleanup () -- 2.30.2