diff options
author | Alan Modra <amodra@gmail.com> | 2007-03-23 00:42:26 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2007-03-23 00:42:26 +0000 |
commit | 840edabd6d37b1b00d04e339e019b97ec5543265 (patch) | |
tree | 38cc6b7bcdb640f15e4adda8220d80d6c0af1a81 /gas/config/tc-spu.h | |
parent | aa7a0635f3a0b331b9c9f15925241f6c2e0b9f8f (diff) | |
download | gdb-840edabd6d37b1b00d04e339e019b97ec5543265.zip gdb-840edabd6d37b1b00d04e339e019b97ec5543265.tar.gz gdb-840edabd6d37b1b00d04e339e019b97ec5543265.tar.bz2 |
* config/tc-spu.c: Don't include opcode/spu.h.
(md_assemble): Set tc_fix_data.insn_tag and arg_format.
(md_apply_fix): Adjust.
* config/tc-spu.h: Include opcode/spu.h.
(struct tc_fix_info): New.
(TC_FIX_TYPE, TC_INIT_FIX_DATA): Adjust.
(TC_FORCE_RELOCATION): Define.
Diffstat (limited to 'gas/config/tc-spu.h')
-rw-r--r-- | gas/config/tc-spu.h | 30 |
1 files changed, 27 insertions, 3 deletions
diff --git a/gas/config/tc-spu.h b/gas/config/tc-spu.h index fadf456..490177f 100644 --- a/gas/config/tc-spu.h +++ b/gas/config/tc-spu.h @@ -21,6 +21,8 @@ #define TC_SPU +#include "opcode/spu.h" + #ifdef OBJ_ELF #define TARGET_FORMAT "elf32-spu" #define TARGET_ARCH bfd_arch_spu @@ -44,13 +46,35 @@ #define TC_KEEP_FX_OFFSET /* #define TC_CONS_RELOC RELOC_32 */ -/* If defined, fixS will have a member named tc_fix_data of this type. */ -#define TC_FIX_TYPE int -#define TC_INIT_FIX_DATA(FIXP) ((FIXP)->tc_fix_data = 0) +struct tc_fix_info { + unsigned short arg_format; + unsigned short insn_tag; +}; + +/* fixS will have a member named tc_fix_data of this type. */ +#define TC_FIX_TYPE struct tc_fix_info +#define TC_INIT_FIX_DATA(FIXP) \ + do \ + { \ + (FIXP)->tc_fix_data.arg_format = 0; \ + (FIXP)->tc_fix_data.insn_tag = 0; \ + } \ + while (0) /* Don't reduce function symbols to section symbols. */ #define tc_fix_adjustable(FIXP) (!S_IS_FUNCTION ((FIXP)->fx_addsy)) +/* Keep relocs on calls. Branches to function symbols are tail or + sibling calls. */ +#define TC_FORCE_RELOCATION(FIXP) \ + ((FIXP)->tc_fix_data.insn_tag == M_BRSL \ + || (FIXP)->tc_fix_data.insn_tag == M_BRASL \ + || (((FIXP)->tc_fix_data.insn_tag == M_BR \ + || (FIXP)->tc_fix_data.insn_tag == M_BRA) \ + && (FIXP)->fx_addsy != NULL \ + && S_IS_FUNCTION ((FIXP)->fx_addsy)) \ + || generic_force_reloc (FIXP)) + /* Values passed to md_apply_fix don't include symbol values. */ #define MD_APPLY_SYM_VALUE(FIX) 0 |