]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gas/config/tc-ppc.h
RISC-V: Fix U insn; replace opcode6 with opcode7 in gas/doc/c-riscv.texi
[thirdparty/binutils-gdb.git] / gas / config / tc-ppc.h
CommitLineData
252b5132 1/* tc-ppc.h -- Header file for tc-ppc.c.
fd67aa11 2 Copyright (C) 1994-2024 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.
cd026728 133 For a C_STSYM symbol, the containing block (.bs symbol).
2fb4b302 134 For a label, the enclosing csect. */
49309057 135 symbolS *within;
85645aed
TG
136 union
137 {
138 /* For a function symbol, a symbol whose value is the size. The
139 field is NULL if there is no size. */
140 symbolS *size;
141 /* For a dwarf symbol, the corresponding dwarf subsection. */
142 struct dw_subsection *dw;
143 } u;
252b5132
RH
144};
145
146#define TC_SYMFIELD_TYPE struct ppc_tc_sy
147
148/* We need an additional auxent for function symbols. */
e86fc4a5 149#define OBJ_COFF_MAX_AUXENTRIES 4
252b5132
RH
150
151/* Square and curly brackets are permitted in symbol names. */
152#define LEX_BR 3
153
154/* Canonicalize the symbol name. */
155#define tc_canonicalize_symbol_name(name) ppc_canonicalize_symbol_name (name)
98027b10 156extern char *ppc_canonicalize_symbol_name (char *);
252b5132
RH
157
158/* Get the symbol class from the name. */
159#define tc_symbol_new_hook(sym) ppc_symbol_new_hook (sym)
98027b10 160extern void ppc_symbol_new_hook (symbolS *);
252b5132 161
252b5132 162/* TOC relocs requires special handling. */
a161fe53 163#define tc_fix_adjustable(FIX) ppc_fix_adjustable (FIX)
98027b10 164extern int ppc_fix_adjustable (struct fix *);
252b5132 165
252b5132
RH
166/* We need to set the section VMA. */
167#define tc_frob_section(sec) ppc_frob_section (sec)
98027b10 168extern void ppc_frob_section (asection *);
252b5132
RH
169
170/* Finish up the symbol. */
171#define tc_frob_symbol(sym, punt) punt = ppc_frob_symbol (sym)
98027b10 172extern int ppc_frob_symbol (symbolS *);
252b5132
RH
173
174/* Finish up the entire symtab. */
175#define tc_adjust_symtab() ppc_adjust_symtab ()
98027b10 176extern void ppc_adjust_symtab (void);
252b5132 177
2c1c4c62
GK
178/* We also need to copy, in particular, the class of the symbol,
179 over what obj-coff would otherwise have copied. */
180#define OBJ_COPY_SYMBOL_ATTRIBUTES(dest,src) \
181do { \
182 if (SF_GET_GET_SEGMENT (dest)) \
183 S_SET_SEGMENT (dest, S_GET_SEGMENT (src)); \
85645aed 184 symbol_get_tc (dest)->u = symbol_get_tc (src)->u; \
2c1c4c62 185 symbol_get_tc (dest)->align = symbol_get_tc (src)->align; \
96d56e9f 186 symbol_get_tc (dest)->symbol_class = symbol_get_tc (src)->symbol_class; \
2c1c4c62
GK
187 symbol_get_tc (dest)->within = symbol_get_tc (src)->within; \
188} while (0)
189
ed2917de
AM
190extern void ppc_xcoff_md_finish (void);
191#define md_finish ppc_xcoff_md_finish
85645aed 192
1b2cb8e2
CC
193#define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) \
194 ppc_xcoff_parse_cons (EXP, NBYTES)
195extern bfd_reloc_code_real_type ppc_xcoff_parse_cons (expressionS *,
196 unsigned int);
197/* XCOFF format allows only few predefined sections. Gather all
198 information in a common structure. */
199struct ppc_xcoff_section {
200 /* Main segment of the section. */
201 segT segment;
202
203 /* Next subsegment to allocate within the segment. */
204 subsegT next_subsegment;
205
206 /* Linked list of csects in the section. */
207 symbolS *csects;
208};
209
dd7efa79
PB
210#endif /* OBJ_XCOFF */
211
2fb4b302
TG
212#define tc_new_dot_label(sym) ppc_new_dot_label (sym)
213extern void ppc_new_dot_label (symbolS *);
214
5ce8663f
NC
215extern const char ppc_symbol_chars[];
216#define tc_symbol_chars ppc_symbol_chars
217
252b5132
RH
218#ifdef OBJ_ELF
219
18ae9cc1 220/* Support for SHT_ORDERED */
98027b10 221extern int ppc_section_type (char *, size_t);
01e1a5bc 222extern int ppc_section_flags (flagword, bfd_vma, int);
252b5132 223
9de8d8f1 224#define md_elf_section_type(STR, LEN) ppc_section_type (STR, LEN)
252b5132
RH
225#define md_elf_section_flags(FLAGS, ATTR, TYPE) ppc_section_flags (FLAGS, ATTR, TYPE)
226
252b5132
RH
227#define tc_comment_chars ppc_comment_chars
228extern const char *ppc_comment_chars;
229
83eef883
AFB
230#define md_elf_section_letter ppc_elf_section_letter
231extern bfd_vma ppc_elf_section_letter (int, const char **);
232
81d4177b 233/* Keep relocations relative to the GOT, or non-PC relative. */
a161fe53 234#define tc_fix_adjustable(FIX) ppc_fix_adjustable (FIX)
98027b10 235extern int ppc_fix_adjustable (struct fix *);
252b5132 236
55cf6793 237/* Values passed to md_apply_fix don't include symbol values. */
a161fe53 238#define MD_APPLY_SYM_VALUE(FIX) 0
252b5132 239
62ebcb5c
AM
240#define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) \
241 ppc_elf_parse_cons (EXP, NBYTES)
242extern bfd_reloc_code_real_type ppc_elf_parse_cons (expressionS *,
243 unsigned int);
bf7279d5
AM
244#define TC_CONS_FIX_CHECK(EXP, NBYTES, FIX) \
245 ppc_elf_cons_fix_check (EXP, NBYTES, FIX)
246extern void ppc_elf_cons_fix_check (expressionS *, unsigned int, struct fix *);
247
7e8d4ab4 248#define tc_frob_file_before_adjust ppc_frob_file_before_adjust
98027b10 249extern void ppc_frob_file_before_adjust (void);
0baf16f2 250
a38a07e0
AM
251#define tc_adjust_symtab() ppc_elf_adjust_symtab ()
252extern void ppc_elf_adjust_symtab (void);
253
ed2917de
AM
254extern void ppc_elf_md_finish (void);
255#define md_finish ppc_elf_md_finish
ee67d69a 256
252b5132
RH
257#endif /* OBJ_ELF */
258
a887be69
AM
259extern void ppc_md_end (void);
260#define md_end ppc_md_end
261
5f5c1f75 262#if defined (OBJ_ELF) || defined (OBJ_XCOFF)
a161fe53 263#define TC_FORCE_RELOCATION(FIX) ppc_force_relocation (FIX)
98027b10 264extern int ppc_force_relocation (struct fix *);
5f5c1f75 265#endif
a161fe53 266
7ba71655
AM
267#ifdef OBJ_ELF
268/* Don't allow the generic code to convert fixups involving the
269 subtraction of a label in the current section to pc-relative if we
270 don't have the necessary pc-relative relocation. */
4a969973
AM
271#define TC_FORCE_RELOCATION_SUB_LOCAL(FIX, SEG) \
272 (!((FIX)->fx_r_type == BFD_RELOC_64 \
273 || (FIX)->fx_r_type == BFD_RELOC_32 \
274 || (FIX)->fx_r_type == BFD_RELOC_16 \
275 || (FIX)->fx_r_type == BFD_RELOC_LO16 \
276 || (FIX)->fx_r_type == BFD_RELOC_HI16 \
277 || (FIX)->fx_r_type == BFD_RELOC_HI16_S \
278 || (FIX)->fx_r_type == BFD_RELOC_PPC64_ADDR16_HIGH \
279 || (FIX)->fx_r_type == BFD_RELOC_PPC64_ADDR16_HIGHA \
280 || (FIX)->fx_r_type == BFD_RELOC_PPC64_HIGHER \
281 || (FIX)->fx_r_type == BFD_RELOC_PPC64_HIGHER_S \
282 || (FIX)->fx_r_type == BFD_RELOC_PPC64_HIGHEST \
283 || (FIX)->fx_r_type == BFD_RELOC_PPC64_HIGHEST_S \
5663e321
AM
284 || (FIX)->fx_r_type == BFD_RELOC_PPC64_ADDR16_HIGHER34 \
285 || (FIX)->fx_r_type == BFD_RELOC_PPC64_ADDR16_HIGHERA34 \
286 || (FIX)->fx_r_type == BFD_RELOC_PPC64_ADDR16_HIGHEST34 \
287 || (FIX)->fx_r_type == BFD_RELOC_PPC64_ADDR16_HIGHESTA34 \
288 || (FIX)->fx_r_type == BFD_RELOC_PPC_16DX_HA \
289 || (FIX)->fx_r_type == BFD_RELOC_PPC64_D34 \
290 || (FIX)->fx_r_type == BFD_RELOC_PPC64_D28))
7ba71655 291
c5df7e44
CC
292#endif /* OBJ_ELF */
293
294#define RELOC_EXPANSION_POSSIBLE
295#define MAX_RELOC_EXPANSION 2
296
297#if defined (OBJ_XCOFF)
298/* Force a relocation when the fix is negative. */
299#define TC_FORCE_RELOCATION_SUB_SAME(FIX, SEG) \
300 (GENERIC_FORCE_RELOCATION_SUB_SAME(FIX, SEG) \
301 || (((SEG)->flags & SEC_DEBUGGING) == 0 \
302 && (FIX)->fx_addsy && (FIX)->fx_subsy \
303 && (S_GET_VALUE (fixP->fx_addsy) < S_GET_VALUE (fixP->fx_subsy))))
304
305/* XCOFF allows undefined differences which will be encoded with
306 R_NEG relocations. */
307#define UNDEFINED_DIFFERENCE_OK
9cce9fab
AM
308
309#define TC_VALIDATE_FIX_SUB(FIX, SEG) \
310 (md_register_arithmetic || (SEG) != reg_section)
311
c5df7e44
CC
312#endif /* OBJ_XCOFF */
313
dd7efa79
PB
314/* Various frobbings of labels and their addresses. */
315#define md_start_line_hook() ppc_start_line_hook ()
316extern void ppc_start_line_hook (void);
317
318/* Set the symbol class of a label based on the csect. */
319#define tc_frob_label(sym) ppc_frob_label (sym)
320extern void ppc_frob_label (symbolS *);
321
252b5132 322/* call md_pcrel_from_section, not md_pcrel_from */
a161fe53 323#define MD_PCREL_FROM_SECTION(FIX, SEC) md_pcrel_from_section(FIX, SEC)
252b5132 324
5f6c9229
AM
325#define md_parse_name(name, exp, mode, c) \
326 (ppc_parse_name (name, exp, mode), true)
327extern void ppc_parse_name (const char *, struct expressionS *, enum expr_mode);
252b5132 328
7e0de605
AM
329#define md_optimize_expr(left, op, right) ppc_optimize_expr (left, op, right)
330extern int ppc_optimize_expr (expressionS *, operatorT, expressionS *);
331
6a0c61b7 332#define md_cleanup() ppc_cleanup ()
98027b10 333extern void ppc_cleanup (void);
75e21f08 334
c322dea4
AM
335#if (defined TE_AIX5 || defined TE_AIX \
336 || defined TE_FreeBSD || defined TE_NetBSD || defined TE_LYNX)
38462edf
JJ
337/* ppc uses different register numbers between .eh_frame and .debug_frame.
338 This macro translates the .eh_frame register numbers to .debug_frame
339 register numbers. */
c322dea4
AM
340#define md_reg_eh_frame_to_debug_frame(regno) \
341 ((regno) == 70 ? 64 /* cr2 */ \
342 : (regno) == 65 ? 108 /* lr */ \
343 : (regno) == 66 ? 109 /* ctr */ \
344 : (regno) >= 68 && (regno) <= 75 ? (regno) + 86 - 68 /* crN */ \
345 : (regno) == 76 ? 101 /* xer */ \
346 : (regno) >= 77 && (regno) <= 108 ? (regno) + 1124 - 77 /* vrN */ \
347 : (regno) == 109 ? 356 /* vrsave */ \
348 : (regno) == 110 ? 67 /* vscr */ \
349 : (regno) == 111 ? 99 /* spe_acc */ \
350 : (regno) == 112 ? 612 /* spefscr */ \
351 : (regno))
352#endif
38462edf 353
75e21f08
JJ
354#define TARGET_USE_CFIPOP 1
355
356#define tc_cfi_frame_initial_instructions ppc_cfi_frame_initial_instructions
98027b10 357extern void ppc_cfi_frame_initial_instructions (void);
75e21f08
JJ
358
359#define tc_regname_to_dw2regnum tc_ppc_regname_to_dw2regnum
98027b10 360extern int tc_ppc_regname_to_dw2regnum (char *);
75e21f08
JJ
361
362extern int ppc_cie_data_alignment;
363
8fbf7334
JL
364extern int ppc_dwarf2_line_min_insn_length;
365
366#define DWARF2_LINE_MIN_INSN_LENGTH ppc_dwarf2_line_min_insn_length
75e21f08
JJ
367#define DWARF2_DEFAULT_RETURN_COLUMN 0x41
368#define DWARF2_CIE_DATA_ALIGNMENT ppc_cie_data_alignment
ba52cbb9 369#define EH_FRAME_ALIGNMENT 2