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