Move aarch64 CIE code to aarch64 backend
[deliverable/binutils-gdb.git] / gas / config / tc-aarch64.h
1 /* tc-aarch64.h -- Header file for tc-aarch64.c.
2 Copyright (C) 2009-2018 Free Software Foundation, Inc.
3 Contributed by ARM Ltd.
4
5 This file is part of GAS.
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 of the license, or
10 (at your option) 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 this program; see the file COPYING3. If not,
19 see <http://www.gnu.org/licenses/>. */
20
21 #ifndef TC_AARCH64
22 #define TC_AARCH64 1
23
24 #include "opcode/aarch64.h"
25
26 #ifndef TARGET_BYTES_BIG_ENDIAN
27 #define TARGET_BYTES_BIG_ENDIAN 0
28 #endif
29
30 #define WORKING_DOT_WORD
31
32 #define TARGET_ARCH bfd_arch_aarch64
33
34 #define DIFF_EXPR_OK
35
36 /* Permit // comments. */
37 #define DOUBLESLASH_LINE_COMMENTS
38
39 #ifdef LITTLE_ENDIAN
40 #undef LITTLE_ENDIAN
41 #endif
42
43 #ifdef BIG_ENDIAN
44 #undef BIG_ENDIAN
45 #endif
46
47 #define LITTLE_ENDIAN 1234
48 #define BIG_ENDIAN 4321
49
50 #define SWAP_32(n) \
51 ((((n) & 0xff) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) \
52 | (((n) >> 24) & 0xff))
53
54 struct fix;
55
56 struct aarch64_fix
57 {
58 struct aarch64_inst *inst;
59 enum aarch64_opnd opnd;
60 };
61
62 #if defined OBJ_ELF
63 # define AARCH64_BI_ENDIAN
64 # define TARGET_FORMAT elf64_aarch64_target_format ()
65 #endif
66
67 #define TC_FORCE_RELOCATION(FIX) aarch64_force_relocation (FIX)
68
69 /* Currently there is no machine specific frags generated. */
70 #define md_convert_frag(b,s,f) as_fatal ("aarch64 convert_frag called\n")
71
72 #define md_cleanup() aarch64_cleanup ()
73
74 #define md_start_line_hook() aarch64_start_line_hook ()
75
76 #define tc_frob_label(S) aarch64_frob_label (S)
77
78 /* We also need to mark assembler created symbols: */
79 #define tc_frob_fake_label(S) aarch64_frob_label (S)
80
81 #define tc_frob_section(S) aarch64_frob_section (S)
82
83 /* The key used to sign a function's return address. */
84 enum pointer_auth_key {
85 AARCH64_PAUTH_KEY_A,
86 AARCH64_PAUTH_KEY_B
87 };
88
89 /* The extra fields required by AArch64 in fde_entry and cie_entry. Currently
90 only used to store the key used to sign the frame's return address. */
91 #define tc_fde_entry_extras enum pointer_auth_key pauth_key;
92 #define tc_cie_entry_extras enum pointer_auth_key pauth_key;
93
94 /* The extra initialisation steps needed by AArch64 in alloc_fde_entry.
95 Currently only used to initialise the key used to sign the return
96 address. */
97 #define tc_fde_entry_init_extra(fde) fde->pauth_key = AARCH64_PAUTH_KEY_A;
98
99 /* Extra checks required by AArch64 when outputting the current cie_entry.
100 Currently only used to output a 'B' if the return address is signed with the
101 B key. */
102 #define tc_output_cie_extra(cie) \
103 do \
104 { \
105 if (cie->pauth_key == AARCH64_PAUTH_KEY_B) \
106 out_one ('B'); \
107 } \
108 while (0)
109
110 /* Extra equivalence checks required by AArch64 when selecting the correct cie
111 for some fde. Currently only used to check for quivalence between keys used
112 to sign ther return address. */
113 #define tc_cie_fde_equivalent_extra(cie, fde) (cie->pauth_key == fde->pauth_key)
114
115 /* The extra initialisation steps needed by AArch64 in select_cie_for_fde.
116 Currently only used to initialise the key used to sign the return
117 address. */
118 #define tc_cie_entry_init_extra(cie, fde) cie->pauth_key = fde->pauth_key;
119
120 #define TC_FIX_TYPE struct aarch64_fix
121 #define TC_INIT_FIX_DATA(FIX) { (FIX)->tc_fix_data.inst = NULL; \
122 (FIX)->tc_fix_data.opnd = AARCH64_OPND_NIL; }
123
124 #define TC_SYMFIELD_TYPE unsigned int
125 #define AARCH64_GET_FLAG(s) (*symbol_get_tc (s))
126
127 void aarch64_copy_symbol_attributes (symbolS *, symbolS *);
128 #ifndef TC_COPY_SYMBOL_ATTRIBUTES
129 #define TC_COPY_SYMBOL_ATTRIBUTES(DEST, SRC) \
130 (aarch64_copy_symbol_attributes (DEST, SRC))
131 #endif
132
133 #define TC_START_LABEL(STR, NUL_CHAR, NEXT_CHAR) \
134 (NEXT_CHAR == ':' || (NEXT_CHAR == '/' && aarch64_data_in_code ()))
135 #define tc_canonicalize_symbol_name(str) aarch64_canonicalize_symbol_name (str);
136 #define obj_adjust_symtab() aarch64_adjust_symtab ()
137
138 #define LISTING_HEADER "AARCH64 GAS "
139
140 #define LOCAL_LABEL(name) (name[0] == '.' && name[1] == 'L')
141 #define LOCAL_LABELS_FB 1
142
143 /* This expression evaluates to true if the relocation is for a local
144 object for which we still want to do the relocation at runtime.
145 False if we are willing to perform this relocation while building
146 the .o file. GOTOFF does not need to be checked here because it is
147 not pcrel. I am not sure if some of the others are ever used with
148 pcrel, but it is easier to be safe than sorry. */
149
150 #define TC_FORCE_RELOCATION_LOCAL(FIX) \
151 (GENERIC_FORCE_RELOCATION_LOCAL (FIX) \
152 || (FIX)->fx_r_type == BFD_RELOC_64 \
153 || (FIX)->fx_r_type == BFD_RELOC_32)
154
155 #define TC_CONS_FIX_NEW(f,w,s,e,r) cons_fix_new_aarch64 ((f), (w), (s), (e))
156
157 /* Max space for a rs_align_code fragment is 3 unaligned bytes
158 (fr_fix) plus 4 bytes to contain the repeating NOP (fr_var). */
159 #define MAX_MEM_FOR_RS_ALIGN_CODE 7
160
161 /* For frags in code sections we need to record whether they contain
162 code or data. */
163 struct aarch64_frag_type
164 {
165 int recorded;
166 #ifdef OBJ_ELF
167 /* If there is a mapping symbol at offset 0 in this frag,
168 it will be saved in FIRST_MAP. If there are any mapping
169 symbols in this frag, the last one will be saved in
170 LAST_MAP. */
171 symbolS *first_map, *last_map;
172 #endif
173 };
174
175 #define TC_FRAG_TYPE struct aarch64_frag_type
176 /* NOTE: max_chars is a local variable from frag_var / frag_variant. */
177 #define TC_FRAG_INIT(fragp) aarch64_init_frag (fragp, max_chars)
178 #define HANDLE_ALIGN(fragp) aarch64_handle_align (fragp)
179
180 #define md_do_align(N, FILL, LEN, MAX, LABEL) \
181 if (FILL == NULL && (N) != 0 && ! need_pass_2 && subseg_text_p (now_seg)) \
182 { \
183 frag_align_code (N, MAX); \
184 goto LABEL; \
185 }
186
187 #define SUB_SEGMENT_ALIGN(SEG, FRCHAIN) 0
188
189 #define DWARF2_LINE_MIN_INSN_LENGTH 4
190
191 /* The lr register is r30. */
192 #define DWARF2_DEFAULT_RETURN_COLUMN 30
193
194 /* Registers are generally saved at negative offsets to the CFA. */
195 #define DWARF2_CIE_DATA_ALIGNMENT (-8)
196
197 extern int aarch64_dwarf2_addr_size (void);
198 #define DWARF2_ADDR_SIZE(bfd) aarch64_dwarf2_addr_size ()
199
200 #ifdef OBJ_ELF
201 # define obj_frob_symbol(sym, punt) aarch64elf_frob_symbol ((sym), & (punt))
202
203 # define GLOBAL_OFFSET_TABLE_NAME "_GLOBAL_OFFSET_TABLE_"
204 # define TC_SEGMENT_INFO_TYPE struct aarch64_segment_info_type
205
206 /* This is not really an alignment operation, but it's something we
207 need to do at the same time: whenever we are figuring out the
208 alignment for data, we should check whether a $d symbol is
209 necessary. */
210 # define md_cons_align(nbytes) mapping_state (MAP_DATA)
211
212 enum mstate
213 {
214 MAP_UNDEFINED = 0, /* Must be zero, for seginfo in new sections. */
215 MAP_DATA,
216 MAP_INSN,
217 };
218
219 void mapping_state (enum mstate);
220
221 struct aarch64_segment_info_type
222 {
223 enum mstate mapstate;
224 unsigned int marked_pr_dependency;
225 aarch64_instr_sequence insn_sequence;
226 };
227
228 /* We want .cfi_* pseudo-ops for generating unwind info. */
229 #define TARGET_USE_CFIPOP 1
230
231 /* CFI hooks. */
232 #define tc_regname_to_dw2regnum tc_aarch64_regname_to_dw2regnum
233 #define tc_cfi_frame_initial_instructions tc_aarch64_frame_initial_instructions
234
235 extern void aarch64_after_parse_args (void);
236 #define md_after_parse_args() aarch64_after_parse_args ()
237
238 #else /* Not OBJ_ELF. */
239 #define GLOBAL_OFFSET_TABLE_NAME "__GLOBAL_OFFSET_TABLE_"
240 #endif
241
242 #if defined OBJ_ELF || defined OBJ_COFF
243
244 # define EXTERN_FORCE_RELOC 1
245 # define tc_fix_adjustable(FIX) 1
246 /* Values passed to md_apply_fix don't include the symbol value. */
247 # define MD_APPLY_SYM_VALUE(FIX) 0
248
249 #endif
250
251 #define MD_PCREL_FROM_SECTION(F,S) md_pcrel_from_section(F,S)
252
253 extern long md_pcrel_from_section (struct fix *, segT);
254 extern void aarch64_frag_align_code (int, int);
255 extern const char * elf64_aarch64_target_format (void);
256 extern int aarch64_force_relocation (struct fix *);
257 extern void aarch64_cleanup (void);
258 extern void aarch64_start_line_hook (void);
259 extern void aarch64_frob_label (symbolS *);
260 extern void aarch64_frob_section (asection *sec);
261 extern int aarch64_data_in_code (void);
262 extern char * aarch64_canonicalize_symbol_name (char *);
263 extern void aarch64_adjust_symtab (void);
264 extern void aarch64elf_frob_symbol (symbolS *, int *);
265 extern void cons_fix_new_aarch64 (fragS *, int, int, expressionS *);
266 extern void aarch64_init_frag (struct frag *, int);
267 extern void aarch64_handle_align (struct frag *);
268 extern int tc_aarch64_regname_to_dw2regnum (char *regname);
269 extern void tc_aarch64_frame_initial_instructions (void);
270
271 #ifdef TE_PE
272
273 #define O_secrel O_md1
274
275 #define TC_DWARF2_EMIT_OFFSET tc_pe_dwarf2_emit_offset
276 void tc_pe_dwarf2_emit_offset (symbolS *, unsigned int);
277
278 #endif /* TE_PE */
279
280 #endif /* TC_AARCH64 */
This page took 0.037813 seconds and 4 git commands to generate.