[BACK]Return to tc-sh.h CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / external / gpl3 / binutils.old / dist / gas / config

Annotation of src/external/gpl3/binutils.old/dist/gas/config/tc-sh.h, Revision 1.1.1.5

1.1       christos    1: /* This file is tc-sh.h
1.1.1.5 ! christos    2:    Copyright (C) 1993-2020 Free Software Foundation, Inc.
1.1       christos    3:
                      4:    This file is part of GAS, the GNU Assembler.
                      5:
                      6:    GAS is free software; you can redistribute it and/or modify
                      7:    it under the terms of the GNU General Public License as published by
                      8:    the Free Software Foundation; either version 3, or (at your option)
                      9:    any later version.
                     10:
                     11:    GAS is distributed in the hope that it will be useful,
                     12:    but WITHOUT ANY WARRANTY; without even the implied warranty of
                     13:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     14:    GNU General Public License for more details.
                     15:
                     16:    You should have received a copy of the GNU General Public License
                     17:    along with GAS; see the file COPYING.  If not, write to
                     18:    the Free Software Foundation, 51 Franklin Street - Fifth Floor,
                     19:    Boston, MA 02110-1301, USA.  */
                     20:
                     21: #define TC_SH
                     22:
                     23: #define TARGET_ARCH bfd_arch_sh
                     24:
                     25: /* The type fixS is defined (to struct fix) in write.h, but write.h uses
                     26:    definitions from this file.  To avoid problems with including write.h
                     27:    after the "right" definitions, don't; just forward-declare struct fix
                     28:    here.  */
                     29: struct fix;
                     30: struct segment_info_struct;
                     31: struct internal_reloc;
                     32:
                     33: /* Whether -relax was used.  */
                     34: extern int sh_relax;
                     35:
                     36: /* Whether -small was used.  */
                     37: extern int sh_small;
                     38:
                     39: /* Don't try to break words.  */
                     40: #define WORKING_DOT_WORD
                     41:
                     42: /* We require .long, et. al., to be aligned correctly.  */
                     43: #define md_cons_align(nbytes) sh_cons_align (nbytes)
                     44: extern void sh_cons_align (int);
                     45:
                     46: /* We need to optimize expr with taking account of rs_align_test
                     47:    frags.  */
                     48:
                     49: #ifdef OBJ_ELF
                     50: #define md_optimize_expr(l,o,r) sh_optimize_expr (l, o, r)
                     51: extern int sh_optimize_expr (expressionS *, operatorT, expressionS *);
                     52: #endif
                     53:
                     54: /* When relaxing, we need to generate relocations for alignment
                     55:    directives.  */
                     56: #define HANDLE_ALIGN(frag) sh_handle_align (frag)
                     57: extern void sh_handle_align (fragS *);
                     58:
                     59: #define MAX_MEM_FOR_RS_ALIGN_CODE (1 + 2)
                     60:
                     61: /* We need to force out some relocations when relaxing.  */
                     62: #define TC_FORCE_RELOCATION(fix) sh_force_relocation (fix)
                     63: extern int sh_force_relocation (struct fix *);
                     64:
                     65: /* This macro decides whether a particular reloc is an entry in a
                     66:    switch table.  It is used when relaxing, because the linker needs
                     67:    to know about all such entries so that it can adjust them if
                     68:    necessary.  */
                     69:
                     70: #define SWITCH_TABLE(FIX)                              \
                     71:   ((FIX)->fx_addsy != NULL                             \
                     72:    && (FIX)->fx_subsy != NULL                          \
                     73:    && S_GET_SEGMENT ((FIX)->fx_addsy) == text_section  \
                     74:    && S_GET_SEGMENT ((FIX)->fx_subsy) == text_section  \
                     75:    && ((FIX)->fx_r_type == BFD_RELOC_32                        \
                     76:        || (FIX)->fx_r_type == BFD_RELOC_16             \
                     77:        || (FIX)->fx_r_type == BFD_RELOC_8))
                     78:
                     79: #define TC_FORCE_RELOCATION_SUB_SAME(FIX, SEC)         \
1.1.1.4   christos   80:   (GENERIC_FORCE_RELOCATION_SUB_SAME (FIX, SEC)                \
1.1       christos   81:    || TC_FORCE_RELOCATION (FIX)                                \
                     82:    || (sh_relax && SWITCH_TABLE (FIX)))
                     83:
                     84: /* Don't complain when we leave fx_subsy around.  */
                     85: #define TC_VALIDATE_FIX_SUB(FIX, SEG)                  \
                     86:   ((md_register_arithmetic || (SEG) != reg_section)    \
                     87:    && sh_relax && SWITCH_TABLE (FIX))
                     88:
                     89: #define MD_PCREL_FROM_SECTION(FIX, SEC) md_pcrel_from_section (FIX, SEC)
                     90: extern long md_pcrel_from_section (struct fix *, segT);
                     91:
                     92: /* SH_COUNT relocs are allowed outside of frag.
                     93:    The target is also buggy and sets fix size too large for other relocs.  */
                     94: #define TC_FX_SIZE_SLACK(FIX) \
                     95:   ((FIX)->fx_r_type == BFD_RELOC_SH_COUNT ? -1 : 2)
                     96:
                     97: #define IGNORE_NONSTANDARD_ESCAPES
                     98:
                     99: #define LISTING_HEADER \
                    100:   (!target_big_endian \
                    101:    ? "Renesas / SuperH SH GAS Little Endian" \
                    102:    : "Renesas / SuperH SH GAS Big Endian")
                    103:
                    104: #define md_operand(x)
                    105:
                    106: extern const struct relax_type md_relax_table[];
                    107: #define TC_GENERIC_RELAX_TABLE md_relax_table
                    108:
                    109: /* We record, for each section, whether we have most recently output a
                    110:    CODE reloc or a DATA reloc.  */
                    111: struct sh_segment_info_type
                    112: {
                    113:   int in_code : 1;
                    114: };
                    115: #define TC_SEGMENT_INFO_TYPE struct sh_segment_info_type
                    116:
                    117: /* We call a routine to emit a reloc for a label, so that the linker
                    118:    can align loads and stores without crossing a label.  */
                    119: extern void sh_frob_label (symbolS *);
                    120: #define tc_frob_label(sym) sh_frob_label (sym)
                    121:
                    122: /* We call a routine to flush pending output in order to output a DATA
                    123:    reloc when required.  */
                    124: extern void sh_flush_pending_output (void);
                    125: #define md_flush_pending_output() sh_flush_pending_output ()
                    126:
                    127: #define tc_frob_file_before_adjust sh_frob_file
                    128: extern void sh_frob_file (void);
                    129:
                    130:
                    131: #ifdef OBJ_COFF
                    132: /* COFF specific definitions.  */
                    133:
                    134: #define COFF_MAGIC (!target_big_endian ? SH_ARCH_MAGIC_LITTLE : SH_ARCH_MAGIC_BIG)
                    135:
                    136: #define tc_coff_symbol_emit_hook(a) ; /* Not used.  */
                    137:
                    138: #define TC_KEEP_FX_OFFSET 1
                    139:
                    140: #define SEG_NAME(SEG) segment_name (SEG)
                    141:
                    142: /* We align most sections to a 16 byte boundary.  */
                    143: #define SUB_SEGMENT_ALIGN(SEG, FRCHAIN)                        \
                    144:   (strncmp (SEG_NAME (SEG), ".stabstr", 8) == 0                \
                    145:    ? 0                                                 \
                    146:    : ((strncmp (SEG_NAME (SEG), ".stab", 5) == 0       \
                    147:        || strcmp (SEG_NAME (SEG), ".ctors") == 0       \
                    148:        || strcmp (SEG_NAME (SEG), ".dtors") == 0)      \
                    149:       ? 2                                              \
                    150:       : (sh_small ? 2 : 4)))
                    151:
                    152: #endif /* OBJ_COFF */
                    153:
                    154: #ifdef OBJ_ELF
                    155: /* ELF specific definitions.  */
                    156:
                    157: /* Whether or not the target is big endian.  */
                    158: extern int target_big_endian;
                    159: #ifdef TE_LINUX
                    160: #define TARGET_FORMAT (!target_big_endian ? "elf32-sh-linux" : "elf32-shbig-linux")
                    161: #elif defined(TE_NetBSD)
                    162: #define TARGET_FORMAT (!target_big_endian ? "elf32-shl-nbsd" : "elf32-sh-nbsd")
                    163: #elif defined (TE_VXWORKS)
                    164: #define TARGET_FORMAT (!target_big_endian ? "elf32-shl-vxworks" : "elf32-sh-vxworks")
                    165: #elif defined (TE_UCLINUX)
                    166: #define TARGET_FORMAT sh_uclinux_target_format ()
                    167: extern const char * sh_uclinux_target_format (void);
                    168: #else
                    169: #define TARGET_FORMAT (!target_big_endian ? "elf32-shl" : "elf32-sh")
                    170: #endif
                    171:
                    172: #define elf_tc_final_processing sh_elf_final_processing
                    173: extern void sh_elf_final_processing (void);
                    174:
                    175: #define DIFF_EXPR_OK           /* foo-. gets turned into PC relative relocs.  */
                    176:
                    177: #define GLOBAL_OFFSET_TABLE_NAME "_GLOBAL_OFFSET_TABLE_"
                    178:
                    179: /* This is the relocation type for direct references to
                    180:    GLOBAL_OFFSET_TABLE.  It comes up in complicated expressions such
                    181:    as _GLOBAL_OFFSET_TABLE_+[.-.L284], which cannot be expressed
                    182:    normally with the regular expressions.  The fixup specified here
                    183:    when used at runtime implies that we should add the address of the
                    184:    GOT to the specified location, and as a result we have simplified
                    185:    the expression into something we can use.  */
                    186: #define TC_RELOC_GLOBAL_OFFSET_TABLE BFD_RELOC_SH_GOTPC
                    187:
                    188: #define tc_fix_adjustable(FIX) sh_fix_adjustable(FIX)
                    189: extern bfd_boolean sh_fix_adjustable (struct fix *);
                    190:
                    191: /* Values passed to md_apply_fix don't include symbol values.  */
                    192: #define MD_APPLY_SYM_VALUE(FIX) 0
                    193:
                    194: /* This expression evaluates to true if the relocation is for a local object
                    195:    for which we still want to do the relocation at runtime.  False if we
                    196:    are willing to perform this relocation while building the .o file.
                    197:
                    198:    We can't resolve references to the GOT or the PLT when creating the
                    199:    object file, since these tables are only created by the linker.
                    200:    Also, if the symbol is global, weak, common or not defined, the
                    201:    assembler can't compute the appropriate reloc, since its location
                    202:    can only be determined at link time.  */
                    203:
                    204: #define TC_FORCE_RELOCATION_LOCAL(FIX)                 \
1.1.1.4   christos  205:   (GENERIC_FORCE_RELOCATION_LOCAL (FIX)                        \
1.1       christos  206:    || (FIX)->fx_r_type == BFD_RELOC_32_PLT_PCREL       \
                    207:    || (FIX)->fx_r_type == BFD_RELOC_32_GOT_PCREL       \
1.1.1.4   christos  208:    || (FIX)->fx_r_type == BFD_RELOC_SH_GOTPC)
1.1       christos  209:
                    210: #define TC_FORCE_RELOCATION_SUB_LOCAL(FIX, SEG)                \
                    211:   ((!md_register_arithmetic && (SEG) == reg_section)   \
                    212:    || (sh_relax && SWITCH_TABLE (FIX)))
                    213:
                    214: /* This keeps the subtracted symbol around, for use by PLT_PCREL
                    215:    relocs.  */
                    216: #define TC_FORCE_RELOCATION_SUB_ABS(FIX, SEG)          \
                    217:   ((FIX)->fx_r_type == BFD_RELOC_32_PLT_PCREL          \
                    218:    || (!md_register_arithmetic && (SEG) == reg_section))
                    219:
                    220: /* Don't complain when we leave fx_subsy around.  */
                    221: #undef TC_VALIDATE_FIX_SUB
                    222: #define TC_VALIDATE_FIX_SUB(FIX, SEG)                  \
                    223:   ((md_register_arithmetic || (SEG) != reg_section)    \
                    224:    && ((FIX)->fx_r_type == BFD_RELOC_32_PLT_PCREL      \
                    225:        || (sh_relax && SWITCH_TABLE (FIX))))
                    226:
                    227: #define md_parse_name(name, exprP, mode, nextcharP) \
                    228:   sh_parse_name ((name), (exprP), (mode), (nextcharP))
                    229: int sh_parse_name (char const *, expressionS *,
                    230:                   enum expr_mode, char *);
                    231:
1.1.1.2   christos  232: #define TC_CONS_FIX_NEW(FRAG, OFF, LEN, EXP, RELOC)    \
                    233:   sh_cons_fix_new ((FRAG), (OFF), (LEN), (EXP), (RELOC))
                    234: void sh_cons_fix_new (fragS *, int, int, expressionS *,
                    235:                      bfd_reloc_code_real_type);
1.1       christos  236:
                    237: /* This is used to construct expressions out of @GOTOFF, @PLT and @GOT
                    238:    symbols.  The relocation type is stored in X_md.  */
                    239: #define O_PIC_reloc O_md1
                    240:
                    241: #define TARGET_USE_CFIPOP 1
                    242:
                    243: #define tc_cfi_frame_initial_instructions sh_cfi_frame_initial_instructions
                    244: extern void sh_cfi_frame_initial_instructions (void);
                    245:
                    246: #define tc_regname_to_dw2regnum sh_regname_to_dw2regnum
                    247: extern int sh_regname_to_dw2regnum (char *);
                    248:
                    249: /* All SH instructions are multiples of 16 bits.  */
                    250: #define DWARF2_LINE_MIN_INSN_LENGTH 2
                    251: #define DWARF2_DEFAULT_RETURN_COLUMN 17
                    252: #define DWARF2_CIE_DATA_ALIGNMENT (-4)
                    253:
                    254: #endif /* OBJ_ELF */
                    255:
                    256: #define H_TICK_HEX 1

CVSweb <webmaster@jp.NetBSD.org>