* 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.
This commit is contained in:
Alan Modra 2002-12-05 11:46:50 +00:00
parent d1973055b8
commit 114424c6b3
3 changed files with 38 additions and 25 deletions

View file

@ -1,3 +1,11 @@
2002-12-05 Alan Modra <amodra@bigpond.net.au>
* 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 <davidm@hpl.hp.com>
* config/tc-ia64.c (pseudo_func): Add "@pause" constant for "hint"

View file

@ -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 ()
{

View file

@ -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 ()