]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gas/config/tc-ppc.h
Update year range in copyright notice of binutils files
[thirdparty/binutils-gdb.git] / gas / config / tc-ppc.h
CommitLineData
252b5132 1/* tc-ppc.h -- Header file for tc-ppc.c.
250d07de 2 Copyright (C) 1994-2021 Free Software Foundation, Inc.
252b5132
RH
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
ec2655a6 9 the Free Software Foundation; either version 3, or (at your option)
252b5132
RH
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
4b4da160
NC
19 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
20 02110-1301, USA. */
252b5132
RH
21
22#define TC_PPC
23
fa452fa6
PB
24#include "opcode/ppc.h"
25
252b5132 26struct fix;
252b5132
RH
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
fe49679d 33/* If OBJ_COFF is defined we are assembling XCOFF for AIX or PowerMac. */
252b5132 34#ifdef OBJ_COFF
252b5132
RH
35#define OBJ_XCOFF
36#endif
252b5132
RH
37
38/* The target BFD architecture. */
39#define TARGET_ARCH (ppc_arch ())
7f6d05e8 40#define TARGET_MACH (ppc_mach ())
98027b10
AM
41extern enum bfd_architecture ppc_arch (void);
42extern unsigned long ppc_mach (void);
252b5132
RH
43
44/* Whether or not the target is big endian */
45extern int target_big_endian;
46
47/* The target BFD format. */
7f6d05e8 48#define TARGET_FORMAT (ppc_target_format ())
e0471c16 49extern const char *ppc_target_format (void);
252b5132
RH
50
51/* Permit temporary numeric labels. */
52#define LOCAL_LABELS_FB 1
53
54/* $ is used to refer to the current location. */
55#define DOLLAR_DOT
56
57/* Strings do not use backslash escapes under COFF. */
58#ifdef OBJ_COFF
16d87673 59#define TC_STRING_ESCAPES 0
252b5132
RH
60#endif
61
62#ifdef OBJ_ELF
63#define DIFF_EXPR_OK /* foo-. gets turned into PC relative relocs */
64#endif
65
66#if TARGET_BYTES_BIG_ENDIAN
67#define PPC_BIG_ENDIAN 1
68#else
69#define PPC_BIG_ENDIAN 0
70#endif
71
72/* We don't need to handle .word strangely. */
73#define WORKING_DOT_WORD
74
0baf16f2
AM
75#define MAX_MEM_FOR_RS_ALIGN_CODE 4
76#define HANDLE_ALIGN(FRAGP) \
3aeeedbb
AM
77 if ((FRAGP)->fr_type == rs_align_code) \
78 ppc_handle_align (FRAGP);
79
22f72c48
AM
80extern unsigned int ppc_nop_select (void);
81#define NOP_OPCODE ppc_nop_select ()
82
3aeeedbb 83extern void ppc_handle_align (struct frag *);
b9c361e0 84extern void ppc_frag_check (struct frag *);
3aeeedbb 85
f29cf775 86#ifdef OBJ_ELF
3aeeedbb 87#define SUB_SEGMENT_ALIGN(SEG, FRCHAIN) 0
f29cf775 88#endif
0baf16f2 89
b9c361e0 90#define md_frag_check(FRAGP) ppc_frag_check (FRAGP)
783de163
AM
91
92/* Arrange to store the value of ppc_cpu at the site of a fixup
93 for later use in md_apply_fix. */
94struct _ppc_fix_extra
95{
fa452fa6 96 ppc_cpu_t ppc_cpu;
783de163
AM
97};
98
fa452fa6 99extern ppc_cpu_t ppc_cpu;
783de163
AM
100
101#define TC_FIX_TYPE struct _ppc_fix_extra
102#define TC_INIT_FIX_DATA(FIXP) \
103 do { (FIXP)->tc_fix_data.ppc_cpu = ppc_cpu; } while (0)
252b5132 104\f
252b5132
RH
105#ifdef OBJ_XCOFF
106
107/* Declarations needed when generating XCOFF code. XCOFF is an
108 extension of COFF, used only on the RS/6000. Rather than create an
109 obj-xcoff, we just use obj-coff, and handle the extensions here in
110 tc-ppc. */
111
112/* We need to keep some information for symbols. */
113struct ppc_tc_sy
114{
115 /* We keep a few linked lists of symbols. */
49309057 116 symbolS *next;
85645aed
TG
117 /* The real name, if the symbol was renamed. */
118 char *real_name;
252b5132
RH
119 /* Non-zero if the symbol should be output. The RS/6000 assembler
120 only outputs symbols that are external or are mentioned in a
121 .globl or .lglobl statement. */
85645aed 122 unsigned char output;
252b5132 123 /* The symbol class. */
85645aed
TG
124 short symbol_class;
125 /* For a csect or common symbol, the alignment to use. */
126 unsigned char align;
252b5132
RH
127 /* For a csect symbol, the subsegment we are using. This is zero
128 for symbols that are not csects. */
129 subsegT subseg;
252b5132 130 /* For a csect symbol, the last symbol which has been defined in
2fb4b302
TG
131 this csect, or NULL if none have been defined so far.
132 For a .bs symbol, the referenced csect symbol.
133 For a label, the enclosing csect. */
49309057 134 symbolS *within;
85645aed
TG
135 union
136 {
137 /* For a function symbol, a symbol whose value is the size. The
138 field is NULL if there is no size. */
139 symbolS *size;
140 /* For a dwarf symbol, the corresponding dwarf subsection. */
141 struct dw_subsection *dw;
142 } u;
252b5132
RH
143};
144
145#define TC_SYMFIELD_TYPE struct ppc_tc_sy
146
147/* We need an additional auxent for function symbols. */
148#define OBJ_COFF_MAX_AUXENTRIES 2
149
150/* Square and curly brackets are permitted in symbol names. */
151#define LEX_BR 3
152
153/* Canonicalize the symbol name. */
154#define tc_canonicalize_symbol_name(name) ppc_canonicalize_symbol_name (name)
98027b10 155extern char *ppc_canonicalize_symbol_name (char *);
252b5132
RH
156
157/* Get the symbol class from the name. */
158#define tc_symbol_new_hook(sym) ppc_symbol_new_hook (sym)
98027b10 159extern void ppc_symbol_new_hook (symbolS *);
252b5132 160
252b5132 161/* TOC relocs requires special handling. */
a161fe53 162#define tc_fix_adjustable(FIX) ppc_fix_adjustable (FIX)
98027b10 163extern int ppc_fix_adjustable (struct fix *);
252b5132 164
252b5132
RH
165/* We need to set the section VMA. */
166#define tc_frob_section(sec) ppc_frob_section (sec)
98027b10 167extern void ppc_frob_section (asection *);
252b5132
RH
168
169/* Finish up the symbol. */
170#define tc_frob_symbol(sym, punt) punt = ppc_frob_symbol (sym)
98027b10 171extern int ppc_frob_symbol (symbolS *);
252b5132
RH
172
173/* Finish up the entire symtab. */
174#define tc_adjust_symtab() ppc_adjust_symtab ()
98027b10 175extern void ppc_adjust_symtab (void);
252b5132 176
2c1c4c62
GK
177/* We also need to copy, in particular, the class of the symbol,
178 over what obj-coff would otherwise have copied. */
179#define OBJ_COPY_SYMBOL_ATTRIBUTES(dest,src) \
180do { \
181 if (SF_GET_GET_SEGMENT (dest)) \
182 S_SET_SEGMENT (dest, S_GET_SEGMENT (src)); \
85645aed 183 symbol_get_tc (dest)->u = symbol_get_tc (src)->u; \
2c1c4c62 184 symbol_get_tc (dest)->align = symbol_get_tc (src)->align; \
96d56e9f 185 symbol_get_tc (dest)->symbol_class = symbol_get_tc (src)->symbol_class; \
2c1c4c62
GK
186 symbol_get_tc (dest)->within = symbol_get_tc (src)->within; \
187} while (0)
188
85645aed
TG
189extern void ppc_xcoff_end (void);
190#define md_end ppc_xcoff_end
191
dd7efa79
PB
192#endif /* OBJ_XCOFF */
193
2fb4b302
TG
194#define tc_new_dot_label(sym) ppc_new_dot_label (sym)
195extern void ppc_new_dot_label (symbolS *);
196
5ce8663f
NC
197extern const char ppc_symbol_chars[];
198#define tc_symbol_chars ppc_symbol_chars
199
252b5132
RH
200#ifdef OBJ_ELF
201
18ae9cc1 202/* Support for SHT_ORDERED */
98027b10 203extern int ppc_section_type (char *, size_t);
01e1a5bc 204extern int ppc_section_flags (flagword, bfd_vma, int);
252b5132 205
9de8d8f1 206#define md_elf_section_type(STR, LEN) ppc_section_type (STR, LEN)
252b5132
RH
207#define md_elf_section_flags(FLAGS, ATTR, TYPE) ppc_section_flags (FLAGS, ATTR, TYPE)
208
252b5132
RH
209#define tc_comment_chars ppc_comment_chars
210extern const char *ppc_comment_chars;
211
83eef883
AFB
212#define md_elf_section_letter ppc_elf_section_letter
213extern bfd_vma ppc_elf_section_letter (int, const char **);
214
81d4177b 215/* Keep relocations relative to the GOT, or non-PC relative. */
a161fe53 216#define tc_fix_adjustable(FIX) ppc_fix_adjustable (FIX)
98027b10 217extern int ppc_fix_adjustable (struct fix *);
252b5132 218
55cf6793 219/* Values passed to md_apply_fix don't include symbol values. */
a161fe53 220#define MD_APPLY_SYM_VALUE(FIX) 0
252b5132 221
62ebcb5c
AM
222#define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) \
223 ppc_elf_parse_cons (EXP, NBYTES)
224extern bfd_reloc_code_real_type ppc_elf_parse_cons (expressionS *,
225 unsigned int);
bf7279d5
AM
226#define TC_CONS_FIX_CHECK(EXP, NBYTES, FIX) \
227 ppc_elf_cons_fix_check (EXP, NBYTES, FIX)
228extern void ppc_elf_cons_fix_check (expressionS *, unsigned int, struct fix *);
229
7e8d4ab4 230#define tc_frob_file_before_adjust ppc_frob_file_before_adjust
98027b10 231extern void ppc_frob_file_before_adjust (void);
0baf16f2 232
a38a07e0
AM
233#define tc_adjust_symtab() ppc_elf_adjust_symtab ()
234extern void ppc_elf_adjust_symtab (void);
235
ee67d69a
AM
236extern void ppc_elf_end (void);
237#define md_end ppc_elf_end
238
252b5132
RH
239#endif /* OBJ_ELF */
240
5f5c1f75 241#if defined (OBJ_ELF) || defined (OBJ_XCOFF)
a161fe53 242#define TC_FORCE_RELOCATION(FIX) ppc_force_relocation (FIX)
98027b10 243extern int ppc_force_relocation (struct fix *);
5f5c1f75 244#endif
a161fe53 245
7ba71655
AM
246#ifdef OBJ_ELF
247/* Don't allow the generic code to convert fixups involving the
248 subtraction of a label in the current section to pc-relative if we
249 don't have the necessary pc-relative relocation. */
4a969973
AM
250#define TC_FORCE_RELOCATION_SUB_LOCAL(FIX, SEG) \
251 (!((FIX)->fx_r_type == BFD_RELOC_64 \
252 || (FIX)->fx_r_type == BFD_RELOC_32 \
253 || (FIX)->fx_r_type == BFD_RELOC_16 \
254 || (FIX)->fx_r_type == BFD_RELOC_LO16 \
255 || (FIX)->fx_r_type == BFD_RELOC_HI16 \
256 || (FIX)->fx_r_type == BFD_RELOC_HI16_S \
257 || (FIX)->fx_r_type == BFD_RELOC_PPC64_ADDR16_HIGH \
258 || (FIX)->fx_r_type == BFD_RELOC_PPC64_ADDR16_HIGHA \
259 || (FIX)->fx_r_type == BFD_RELOC_PPC64_HIGHER \
260 || (FIX)->fx_r_type == BFD_RELOC_PPC64_HIGHER_S \
261 || (FIX)->fx_r_type == BFD_RELOC_PPC64_HIGHEST \
262 || (FIX)->fx_r_type == BFD_RELOC_PPC64_HIGHEST_S \
5663e321
AM
263 || (FIX)->fx_r_type == BFD_RELOC_PPC64_ADDR16_HIGHER34 \
264 || (FIX)->fx_r_type == BFD_RELOC_PPC64_ADDR16_HIGHERA34 \
265 || (FIX)->fx_r_type == BFD_RELOC_PPC64_ADDR16_HIGHEST34 \
266 || (FIX)->fx_r_type == BFD_RELOC_PPC64_ADDR16_HIGHESTA34 \
267 || (FIX)->fx_r_type == BFD_RELOC_PPC_16DX_HA \
268 || (FIX)->fx_r_type == BFD_RELOC_PPC64_D34 \
269 || (FIX)->fx_r_type == BFD_RELOC_PPC64_D28))
7ba71655
AM
270#endif
271
272#define TC_VALIDATE_FIX_SUB(FIX, SEG) 0
273
dd7efa79
PB
274/* Various frobbings of labels and their addresses. */
275#define md_start_line_hook() ppc_start_line_hook ()
276extern void ppc_start_line_hook (void);
277
278/* Set the symbol class of a label based on the csect. */
279#define tc_frob_label(sym) ppc_frob_label (sym)
280extern void ppc_frob_label (symbolS *);
281
252b5132 282/* call md_pcrel_from_section, not md_pcrel_from */
a161fe53 283#define MD_PCREL_FROM_SECTION(FIX, SEC) md_pcrel_from_section(FIX, SEC)
252b5132 284
9497f5ac 285#define md_parse_name(name, exp, mode, c) ppc_parse_name (name, exp)
98027b10 286extern int ppc_parse_name (const char *, struct expressionS *);
252b5132 287
7e0de605
AM
288#define md_optimize_expr(left, op, right) ppc_optimize_expr (left, op, right)
289extern int ppc_optimize_expr (expressionS *, operatorT, expressionS *);
290
252b5132 291#define md_operand(x)
6a0c61b7
EZ
292
293#define md_cleanup() ppc_cleanup ()
98027b10 294extern void ppc_cleanup (void);
75e21f08 295
c322dea4
AM
296#if (defined TE_AIX5 || defined TE_AIX \
297 || defined TE_FreeBSD || defined TE_NetBSD || defined TE_LYNX)
38462edf
JJ
298/* ppc uses different register numbers between .eh_frame and .debug_frame.
299 This macro translates the .eh_frame register numbers to .debug_frame
300 register numbers. */
c322dea4
AM
301#define md_reg_eh_frame_to_debug_frame(regno) \
302 ((regno) == 70 ? 64 /* cr2 */ \
303 : (regno) == 65 ? 108 /* lr */ \
304 : (regno) == 66 ? 109 /* ctr */ \
305 : (regno) >= 68 && (regno) <= 75 ? (regno) + 86 - 68 /* crN */ \
306 : (regno) == 76 ? 101 /* xer */ \
307 : (regno) >= 77 && (regno) <= 108 ? (regno) + 1124 - 77 /* vrN */ \
308 : (regno) == 109 ? 356 /* vrsave */ \
309 : (regno) == 110 ? 67 /* vscr */ \
310 : (regno) == 111 ? 99 /* spe_acc */ \
311 : (regno) == 112 ? 612 /* spefscr */ \
312 : (regno))
313#endif
38462edf 314
75e21f08
JJ
315#define TARGET_USE_CFIPOP 1
316
317#define tc_cfi_frame_initial_instructions ppc_cfi_frame_initial_instructions
98027b10 318extern void ppc_cfi_frame_initial_instructions (void);
75e21f08
JJ
319
320#define tc_regname_to_dw2regnum tc_ppc_regname_to_dw2regnum
98027b10 321extern int tc_ppc_regname_to_dw2regnum (char *);
75e21f08
JJ
322
323extern int ppc_cie_data_alignment;
324
8fbf7334
JL
325extern int ppc_dwarf2_line_min_insn_length;
326
327#define DWARF2_LINE_MIN_INSN_LENGTH ppc_dwarf2_line_min_insn_length
75e21f08
JJ
328#define DWARF2_DEFAULT_RETURN_COLUMN 0x41
329#define DWARF2_CIE_DATA_ALIGNMENT ppc_cie_data_alignment
ba52cbb9 330#define EH_FRAME_ALIGNMENT 2