[BACK]Return to tc-ppc.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-ppc.h, Revision 1.1.1.4

1.1       christos    1: /* tc-ppc.h -- Header file for tc-ppc.c.
1.1.1.4 ! christos    2:    Copyright (C) 1994-2018 Free Software Foundation, Inc.
1.1       christos    3:    Written by Ian Lance Taylor, Cygnus Support.
                      4:
                      5:    This file is part of GAS, the GNU Assembler.
                      6:
                      7:    GAS is free software; you can redistribute it and/or modify
                      8:    it under the terms of the GNU General Public License as published by
                      9:    the Free Software Foundation; either version 3, or (at your option)
                     10:    any later version.
                     11:
                     12:    GAS is distributed in the hope that it will be useful,
                     13:    but WITHOUT ANY WARRANTY; without even the implied warranty of
                     14:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     15:    GNU General Public License for more details.
                     16:
                     17:    You should have received a copy of the GNU General Public License
                     18:    along with GAS; see the file COPYING.  If not, write to the Free
                     19:    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
                     20:    02110-1301, USA.  */
                     21:
                     22: #define TC_PPC
                     23:
                     24: #include "opcode/ppc.h"
                     25:
                     26: struct fix;
                     27:
                     28: /* Set the endianness we are using.  Default to big endian.  */
                     29: #ifndef TARGET_BYTES_BIG_ENDIAN
                     30: #define TARGET_BYTES_BIG_ENDIAN 1
                     31: #endif
                     32:
                     33: /* If OBJ_COFF is defined, and TE_PE is not defined, we are assembling
                     34:    XCOFF for AIX or PowerMac.  If TE_PE is defined, we are assembling
                     35:    COFF for Windows NT.  */
                     36:
                     37: #ifdef OBJ_COFF
                     38: #ifndef TE_PE
                     39: #define OBJ_XCOFF
                     40: #endif
                     41: #endif
                     42:
                     43: /* The target BFD architecture.  */
                     44: #define TARGET_ARCH (ppc_arch ())
                     45: #define TARGET_MACH (ppc_mach ())
                     46: extern enum bfd_architecture ppc_arch (void);
                     47: extern unsigned long ppc_mach (void);
                     48:
                     49: /* Whether or not the target is big endian */
                     50: extern int target_big_endian;
                     51:
                     52: /* The target BFD format.  */
                     53: #define TARGET_FORMAT (ppc_target_format ())
1.1.1.3   christos   54: extern const char *ppc_target_format (void);
1.1       christos   55:
                     56: /* Permit temporary numeric labels.  */
                     57: #define LOCAL_LABELS_FB 1
                     58:
                     59: /* $ is used to refer to the current location.  */
                     60: #define DOLLAR_DOT
                     61:
                     62: /* Strings do not use backslash escapes under COFF.  */
                     63: #ifdef OBJ_COFF
                     64: #define NO_STRING_ESCAPES
                     65: #endif
                     66:
                     67: #ifdef OBJ_ELF
                     68: #define DIFF_EXPR_OK           /* foo-. gets turned into PC relative relocs */
                     69: #endif
                     70:
                     71: #if TARGET_BYTES_BIG_ENDIAN
                     72: #define PPC_BIG_ENDIAN 1
                     73: #else
                     74: #define PPC_BIG_ENDIAN 0
                     75: #endif
                     76:
                     77: /* We don't need to handle .word strangely.  */
                     78: #define WORKING_DOT_WORD
                     79:
                     80: #define MAX_MEM_FOR_RS_ALIGN_CODE 4
                     81: #define HANDLE_ALIGN(FRAGP)                                            \
                     82:   if ((FRAGP)->fr_type == rs_align_code)                               \
                     83:     ppc_handle_align (FRAGP);
                     84:
                     85: extern void ppc_handle_align (struct frag *);
                     86: extern void ppc_frag_check (struct frag *);
                     87:
1.1.1.3   christos   88: #ifdef OBJ_ELF
1.1       christos   89: #define SUB_SEGMENT_ALIGN(SEG, FRCHAIN) 0
1.1.1.3   christos   90: #endif
1.1       christos   91:
                     92: #define md_frag_check(FRAGP) ppc_frag_check (FRAGP)
                     93:
                     94: /* Arrange to store the value of ppc_cpu at the site of a fixup
                     95:    for later use in md_apply_fix.  */
                     96: struct _ppc_fix_extra
                     97: {
                     98:   ppc_cpu_t ppc_cpu;
                     99: };
                    100:
                    101: extern ppc_cpu_t ppc_cpu;
                    102:
                    103: #define TC_FIX_TYPE struct _ppc_fix_extra
                    104: #define TC_INIT_FIX_DATA(FIXP) \
                    105:   do { (FIXP)->tc_fix_data.ppc_cpu = ppc_cpu; } while (0)
                    106: 
                    107: #ifdef TE_PE
                    108:
                    109: /* Question marks are permitted in symbol names.  */
                    110: #define LEX_QM 1
                    111:
                    112: /* Don't adjust TOC relocs.  */
                    113: #define tc_fix_adjustable(FIX) ppc_pe_fix_adjustable (FIX)
                    114: extern int ppc_pe_fix_adjustable (struct fix *);
                    115:
                    116: #endif
                    117:
                    118: #ifdef OBJ_XCOFF
                    119:
                    120: /* Declarations needed when generating XCOFF code.  XCOFF is an
                    121:    extension of COFF, used only on the RS/6000.  Rather than create an
                    122:    obj-xcoff, we just use obj-coff, and handle the extensions here in
                    123:    tc-ppc.  */
                    124:
                    125: /* We need to keep some information for symbols.  */
                    126: struct ppc_tc_sy
                    127: {
                    128:   /* We keep a few linked lists of symbols.  */
                    129:   symbolS *next;
                    130:   /* The real name, if the symbol was renamed.  */
                    131:   char *real_name;
                    132:   /* Non-zero if the symbol should be output.  The RS/6000 assembler
                    133:      only outputs symbols that are external or are mentioned in a
                    134:      .globl or .lglobl statement.  */
                    135:   unsigned char output;
                    136:   /* The symbol class.  */
                    137:   short symbol_class;
                    138:   /* For a csect or common symbol, the alignment to use.  */
                    139:   unsigned char align;
                    140:   /* For a csect symbol, the subsegment we are using.  This is zero
                    141:      for symbols that are not csects.  */
                    142:   subsegT subseg;
                    143:   /* For a csect symbol, the last symbol which has been defined in
                    144:      this csect, or NULL if none have been defined so far.
                    145:      For a .bs symbol, the referenced csect symbol.
                    146:      For a label, the enclosing csect.  */
                    147:   symbolS *within;
                    148:   union
                    149:   {
                    150:     /* For a function symbol, a symbol whose value is the size.  The
                    151:        field is NULL if there is no size.  */
                    152:     symbolS *size;
                    153:     /* For a dwarf symbol, the corresponding dwarf subsection.  */
                    154:     struct dw_subsection *dw;
                    155:   } u;
                    156: };
                    157:
                    158: #define TC_SYMFIELD_TYPE struct ppc_tc_sy
                    159:
                    160: /* We need an additional auxent for function symbols.  */
                    161: #define OBJ_COFF_MAX_AUXENTRIES 2
                    162:
                    163: /* Square and curly brackets are permitted in symbol names.  */
                    164: #define LEX_BR 3
                    165:
                    166: /* Canonicalize the symbol name.  */
                    167: #define tc_canonicalize_symbol_name(name) ppc_canonicalize_symbol_name (name)
                    168: extern char *ppc_canonicalize_symbol_name (char *);
                    169:
                    170: /* Get the symbol class from the name.  */
                    171: #define tc_symbol_new_hook(sym) ppc_symbol_new_hook (sym)
                    172: extern void ppc_symbol_new_hook (symbolS *);
                    173:
                    174: /* Set the symbol class of a label based on the csect.  */
                    175: #define tc_frob_label(sym) ppc_frob_label (sym)
                    176: extern void ppc_frob_label (symbolS *);
                    177:
                    178: /* TOC relocs requires special handling.  */
                    179: #define tc_fix_adjustable(FIX) ppc_fix_adjustable (FIX)
                    180: extern int ppc_fix_adjustable (struct fix *);
                    181:
                    182: /* We need to set the section VMA.  */
                    183: #define tc_frob_section(sec) ppc_frob_section (sec)
                    184: extern void ppc_frob_section (asection *);
                    185:
                    186: /* Finish up the symbol.  */
                    187: #define tc_frob_symbol(sym, punt) punt = ppc_frob_symbol (sym)
                    188: extern int ppc_frob_symbol (symbolS *);
                    189:
                    190: /* Finish up the entire symtab.  */
                    191: #define tc_adjust_symtab() ppc_adjust_symtab ()
                    192: extern void ppc_adjust_symtab (void);
                    193:
                    194: /* We also need to copy, in particular, the class of the symbol,
                    195:    over what obj-coff would otherwise have copied.  */
                    196: #define OBJ_COPY_SYMBOL_ATTRIBUTES(dest,src)                   \
                    197: do {                                                           \
                    198:   if (SF_GET_GET_SEGMENT (dest))                               \
                    199:     S_SET_SEGMENT (dest, S_GET_SEGMENT (src));                 \
                    200:   symbol_get_tc (dest)->u = symbol_get_tc (src)->u;            \
                    201:   symbol_get_tc (dest)->align = symbol_get_tc (src)->align;    \
                    202:   symbol_get_tc (dest)->symbol_class = symbol_get_tc (src)->symbol_class;      \
                    203:   symbol_get_tc (dest)->within = symbol_get_tc (src)->within;  \
                    204: } while (0)
                    205:
                    206: extern void ppc_xcoff_end (void);
                    207: #define md_end ppc_xcoff_end
                    208:
                    209: #define tc_new_dot_label(sym) ppc_new_dot_label (sym)
                    210: extern void ppc_new_dot_label (symbolS *);
                    211:
                    212: #endif /* OBJ_XCOFF */
                    213:
                    214: extern const char       ppc_symbol_chars[];
                    215: #define tc_symbol_chars ppc_symbol_chars
                    216:
                    217: #ifdef OBJ_ELF
                    218:
                    219: /* Support for SHT_ORDERED */
                    220: extern int ppc_section_type (char *, size_t);
                    221: extern int ppc_section_flags (flagword, bfd_vma, int);
                    222:
                    223: #define md_elf_section_type(STR, LEN)          ppc_section_type (STR, LEN)
                    224: #define md_elf_section_flags(FLAGS, ATTR, TYPE)        ppc_section_flags (FLAGS, ATTR, TYPE)
                    225:
                    226: #define tc_comment_chars ppc_comment_chars
                    227: extern const char *ppc_comment_chars;
                    228:
1.1.1.4 ! christos  229: #define md_elf_section_letter          ppc_elf_section_letter
        !           230: extern bfd_vma ppc_elf_section_letter (int, const char **);
        !           231:
1.1       christos  232: /* Keep relocations relative to the GOT, or non-PC relative.  */
                    233: #define tc_fix_adjustable(FIX) ppc_fix_adjustable (FIX)
                    234: extern int ppc_fix_adjustable (struct fix *);
                    235:
                    236: /* Values passed to md_apply_fix don't include symbol values.  */
                    237: #define MD_APPLY_SYM_VALUE(FIX) 0
                    238:
1.1.1.2   christos  239: #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) \
                    240:   ppc_elf_parse_cons (EXP, NBYTES)
                    241: extern bfd_reloc_code_real_type ppc_elf_parse_cons (expressionS *,
                    242:                                                    unsigned int);
                    243: #define TC_CONS_FIX_CHECK(EXP, NBYTES, FIX) \
                    244:   ppc_elf_cons_fix_check (EXP, NBYTES, FIX)
                    245: extern void ppc_elf_cons_fix_check (expressionS *, unsigned int, struct fix *);
                    246:
1.1       christos  247: #define tc_frob_file_before_adjust ppc_frob_file_before_adjust
                    248: extern void ppc_frob_file_before_adjust (void);
                    249:
1.1.1.2   christos  250: #define tc_adjust_symtab() ppc_elf_adjust_symtab ()
                    251: extern void ppc_elf_adjust_symtab (void);
                    252:
                    253: extern void ppc_elf_end (void);
                    254: #define md_end ppc_elf_end
                    255:
1.1       christos  256: #endif /* OBJ_ELF */
                    257:
                    258: #if defined (OBJ_ELF) || defined (OBJ_XCOFF)
                    259: #define TC_FORCE_RELOCATION(FIX) ppc_force_relocation (FIX)
                    260: extern int ppc_force_relocation (struct fix *);
                    261: #endif
                    262:
1.1.1.4 ! christos  263: #ifdef OBJ_ELF
        !           264: /* Don't allow the generic code to convert fixups involving the
        !           265:    subtraction of a label in the current section to pc-relative if we
        !           266:    don't have the necessary pc-relative relocation.  */
        !           267: #define TC_FORCE_RELOCATION_SUB_LOCAL(FIX, SEG)                \
        !           268:   (!((FIX)->fx_r_type == BFD_RELOC_LO16                        \
        !           269:      || (FIX)->fx_r_type == BFD_RELOC_HI16             \
        !           270:      || (FIX)->fx_r_type == BFD_RELOC_HI16_S           \
        !           271:      || (FIX)->fx_r_type == BFD_RELOC_64               \
        !           272:      || (FIX)->fx_r_type == BFD_RELOC_32               \
        !           273:      || (FIX)->fx_r_type == BFD_RELOC_16               \
        !           274:      || (FIX)->fx_r_type == BFD_RELOC_PPC_16DX_HA))
        !           275: #endif
        !           276:
        !           277: #define TC_VALIDATE_FIX_SUB(FIX, SEG) 0
        !           278:
1.1       christos  279: /* call md_pcrel_from_section, not md_pcrel_from */
                    280: #define MD_PCREL_FROM_SECTION(FIX, SEC) md_pcrel_from_section(FIX, SEC)
                    281: extern long md_pcrel_from_section (struct fix *, segT);
                    282:
                    283: #define md_parse_name(name, exp, mode, c) ppc_parse_name (name, exp)
                    284: extern int ppc_parse_name (const char *, struct expressionS *);
                    285:
1.1.1.4 ! christos  286: #define md_optimize_expr(left, op, right) ppc_optimize_expr (left, op, right)
        !           287: extern int ppc_optimize_expr (expressionS *, operatorT, expressionS *);
        !           288:
1.1       christos  289: #define md_operand(x)
                    290:
                    291: #define md_cleanup() ppc_cleanup ()
                    292: extern void ppc_cleanup (void);
                    293:
1.1.1.2   christos  294: #if (defined TE_AIX5 || defined TE_AIX                                 \
                    295:      || defined TE_FreeBSD || defined TE_NetBSD || defined TE_LYNX)
1.1       christos  296: /* ppc uses different register numbers between .eh_frame and .debug_frame.
                    297:    This macro translates the .eh_frame register numbers to .debug_frame
                    298:    register numbers.  */
1.1.1.2   christos  299: #define md_reg_eh_frame_to_debug_frame(regno)                          \
                    300:   ((regno) == 70 ? 64  /* cr2 */                                       \
                    301:    : (regno) == 65 ? 108 /* lr */                                      \
                    302:    : (regno) == 66 ? 109 /* ctr */                                     \
                    303:    : (regno) >= 68 && (regno) <= 75 ? (regno) + 86 - 68 /* crN */      \
                    304:    : (regno) == 76 ? 101 /* xer */                                     \
                    305:    : (regno) >= 77 && (regno) <= 108 ? (regno) + 1124 - 77 /* vrN */   \
                    306:    : (regno) == 109 ? 356 /* vrsave */                                 \
                    307:    : (regno) == 110 ? 67 /* vscr */                                    \
                    308:    : (regno) == 111 ? 99 /* spe_acc */                                 \
                    309:    : (regno) == 112 ? 612 /* spefscr */                                        \
                    310:    : (regno))
                    311: #endif
1.1       christos  312:
                    313: #define TARGET_USE_CFIPOP 1
                    314:
                    315: #define tc_cfi_frame_initial_instructions ppc_cfi_frame_initial_instructions
                    316: extern void ppc_cfi_frame_initial_instructions (void);
                    317:
                    318: #define tc_regname_to_dw2regnum tc_ppc_regname_to_dw2regnum
                    319: extern int tc_ppc_regname_to_dw2regnum (char *);
                    320:
                    321: extern int ppc_cie_data_alignment;
                    322:
                    323: extern int ppc_dwarf2_line_min_insn_length;
                    324:
                    325: #define DWARF2_LINE_MIN_INSN_LENGTH     ppc_dwarf2_line_min_insn_length
                    326: #define DWARF2_DEFAULT_RETURN_COLUMN    0x41
                    327: #define DWARF2_CIE_DATA_ALIGNMENT       ppc_cie_data_alignment
1.1.1.4 ! christos  328: #define EH_FRAME_ALIGNMENT             2

CVSweb <webmaster@jp.NetBSD.org>