X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gas%2Fconfig%2Ftc-mn10300.h;h=d7162d497578426ed892c49efcdd4539c40bbc6a;hb=ea1562b345338540cf9a3c8fa28fbcb6da78fd3e;hp=c09ddad6723247a98b6c2799739e84b6becf770c;hpb=2ee563b53258d390d7446e90a67f465d504ae44c;p=binutils-gdb.git diff --git a/gas/config/tc-mn10300.h b/gas/config/tc-mn10300.h index c09ddad6723..d7162d49757 100644 --- a/gas/config/tc-mn10300.h +++ b/gas/config/tc-mn10300.h @@ -1,5 +1,6 @@ /* tc-mn10300.h -- Header file for tc-mn10300.c. - Copyright 1996, 1997, 2000, 2001 Free Software Foundation, Inc. + Copyright 1996, 1997, 2000, 2001, 2002, 2003, 2004 + Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -26,19 +27,68 @@ #error MN10300 support requires BFD_ASSEMBLER #endif +#define DIFF_EXPR_OK +#define GLOBAL_OFFSET_TABLE_NAME "_GLOBAL_OFFSET_TABLE_" + +#define TC_RELOC_RTSYM_LOC_FIXUP(FIX) \ + ((FIX)->fx_r_type != BFD_RELOC_32_PLT_PCREL \ + && (FIX)->fx_r_type != BFD_RELOC_MN10300_GOT32 \ + && (FIX)->fx_r_type != BFD_RELOC_32_GOT_PCREL \ + && ((FIX)->fx_addsy == NULL \ + || (! S_IS_EXTERNAL ((FIX)->fx_addsy) \ + && ! S_IS_WEAK ((FIX)->fx_addsy) \ + && S_IS_DEFINED ((FIX)->fx_addsy) \ + && ! S_IS_COMMON ((FIX)->fx_addsy)))) + +#define md_parse_name(name, exprP, nextcharP) \ + mn10300_parse_name ((name), (exprP), (nextcharP)) +int mn10300_parse_name PARAMS ((char const *, expressionS *, char *)); + +#define TC_CONS_FIX_NEW(FRAG, OFF, LEN, EXP) \ + mn10300_cons_fix_new ((FRAG), (OFF), (LEN), (EXP)) +void mn10300_cons_fix_new PARAMS ((fragS *, int, int, expressionS *)); + +/* This is used to construct expressions out of @GOTOFF, @PLT and @GOT + symbols. The relocation type is stored in X_md. */ +#define O_PIC_reloc O_md1 + /* The target BFD architecture. */ #define TARGET_ARCH bfd_arch_mn10300 +#ifdef TE_LINUX +#define TARGET_FORMAT "elf32-am33lin" +#else #define TARGET_FORMAT "elf32-mn10300" +#endif -/* For fixup and relocation handling. */ -#define TC_FORCE_RELOCATION(fixp) mn10300_force_relocation (fixp) -extern int mn10300_force_relocation PARAMS ((struct fix *)); - -#define obj_fix_adjustable(fixP) mn10300_fix_adjustable (fixP) -extern boolean mn10300_fix_adjustable PARAMS ((struct fix *)); -/* Fixup debug sections since we will never relax them. */ +/* Do not adjust relocations involving symbols in code sections, + because it breaks linker relaxations. This could be fixed in the + linker, but this fix is simpler, and it pretty much only affects + object size a little bit. */ +#define TC_FORCE_RELOCATION_SUB_SAME(FIX, SEC) \ + (((SEC)->flags & SEC_CODE) != 0 \ + || ! SEG_NORMAL (SEC) \ + || TC_FORCE_RELOCATION (FIX)) + +/* We validate subtract arguments within tc_gen_reloc(), so don't + report errors at this point. */ +#define TC_VALIDATE_FIX_SUB(FIX) 1 + +/* Fixup debug sections since we will never relax them. Ideally, we + could do away with this and instead check every single fixup with + TC_FORCE_RELOCATION and TC_FORCE_RELOCATION_SUB_NAME, verifying + that the sections of the referenced symbols (and not the sections + in which the fixup appears) may be subject to relaxation. We'd + still have to check the section in which the fixup appears, because + we want to do some simplifications in debugging info that might + break in real code. + + Using the infrastructure in write.c to simplify subtraction fixups + would enable us to remove a lot of code from tc_gen_reloc(), but + this is simpler, faster, and produces almost the same effect. + Also, in the macros above, we can't check whether the fixup is in a + debugging section or not, so we have to use this for now. */ #define TC_LINKRELAX_FIXUP(seg) (seg->flags & SEC_ALLOC) #define md_operand(x) @@ -52,7 +102,9 @@ extern boolean mn10300_fix_adjustable PARAMS ((struct fix *)); #define md_number_to_chars number_to_chars_littleendian /* Don't bother to adjust relocs. */ -#define tc_fix_adjustable(FIX) 0 +/* #define tc_fix_adjustable(FIX) 0 */ +#define tc_fix_adjustable(FIX) mn10300_fix_adjustable (FIX) +extern bfd_boolean mn10300_fix_adjustable PARAMS ((struct fix *)); /* We do relaxing in the assembler as well as the linker. */ extern const struct relax_type md_relax_table[];