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>