X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gas%2Fconfig%2Ftc-mn10300.h;h=bf7ef6001d75caac8b47b8bfd60d0f3cf184da52;hb=97f50151221de0a023a8317559b1992a90f9cb8f;hp=ffcb227b0e0a14ecd391a0dc59dd01e825a1bc76;hpb=dc9e099fc0eced486ae2b49455c9da113c11f4ff;p=deliverable%2Fbinutils-gdb.git diff --git a/gas/config/tc-mn10300.h b/gas/config/tc-mn10300.h index ffcb227b0e..bf7ef6001d 100644 --- a/gas/config/tc-mn10300.h +++ b/gas/config/tc-mn10300.h @@ -1,11 +1,11 @@ /* tc-mn10300.h -- Header file for tc-mn10300.c. - Copyright (C) 1996, 1997 Free Software Foundation, Inc. + Copyright (C) 1996-2016 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. GAS is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) + the Free Software Foundation; either version 3, or (at your option) any later version. GAS is distributed in the hope that it will be useful, @@ -15,23 +15,79 @@ You should have received a copy of the GNU General Public License along with GAS; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ + Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA + 02110-1301, USA. */ #define TC_MN10300 #define TARGET_BYTES_BIG_ENDIAN 0 -#ifndef BFD_ASSEMBLER - #error MN10300 support requires BFD_ASSEMBLER -#endif +#define DIFF_EXPR_OK +#define GLOBAL_OFFSET_TABLE_NAME "_GLOBAL_OFFSET_TABLE_" + +#define TC_FORCE_RELOCATION(FIX) mn10300_force_relocation (FIX) +extern bfd_boolean mn10300_force_relocation (struct fix *); + +#define TC_FORCE_RELOCATION_LOCAL(FIX) \ + (!(FIX)->fx_pcrel \ + || (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 \ + || TC_FORCE_RELOCATION (FIX)) + +#define md_parse_name(NAME, EXPRP, MODE, NEXTCHARP) \ + mn10300_parse_name ((NAME), (EXPRP), (MODE), (NEXTCHARP)) +int mn10300_parse_name (char const *, expressionS *, enum expr_mode, char *); + +#define TC_CONS_FIX_NEW(FRAG, OFF, LEN, EXP, RELOC) \ + mn10300_cons_fix_new ((FRAG), (OFF), (LEN), (EXP), (RELOC)) +void mn10300_cons_fix_new (fragS *, int, int, expressionS *, + bfd_reloc_code_real_type); + +/* 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 + + +/* 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) \ + || (FIX)->fx_r_type == BFD_RELOC_MN10300_ALIGN \ + || 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, SEG) 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_APPLY_FIX3 #define md_operand(x) /* Permit temporary numeric labels. */ @@ -42,9 +98,29 @@ #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) mn10300_fix_adjustable (FIX) +extern bfd_boolean mn10300_fix_adjustable (struct fix *); /* We do relaxing in the assembler as well as the linker. */ extern const struct relax_type md_relax_table[]; #define TC_GENERIC_RELAX_TABLE md_relax_table + +#define DWARF2_LINE_MIN_INSN_LENGTH 1 + +/* The difference between same-section symbols may be affected by linker + relaxation, so do not resolve such expressions in the assembler. */ +#define md_allow_local_subtract(l,r,s) mn10300_allow_local_subtract (l, r, s) +extern bfd_boolean mn10300_allow_local_subtract (expressionS *, expressionS *, segT); + +#define RELOC_EXPANSION_POSSIBLE +#define MAX_RELOC_EXPANSION 2 + +#define TC_FRAG_TYPE bfd_boolean + +#define HANDLE_ALIGN(frag) mn10300_handle_align (frag) +extern void mn10300_handle_align (fragS *); + +/* Only allow call frame debug info optimization when linker relaxation is + not enabled as otherwise we could generate the DWARF directives without + the relocs necessary to patch them up. */ +#define md_allow_eh_opt (linkrelax == 0)