tc-aarch64.h revision 1.1.1.2 1 1.1 christos /* tc-aarch64.h -- Header file for tc-aarch64.c.
2 1.1.1.2 christos Copyright (C) 2009-2015 Free Software Foundation, Inc.
3 1.1 christos Contributed by ARM Ltd.
4 1.1 christos
5 1.1 christos This file is part of GAS.
6 1.1 christos
7 1.1 christos GAS is free software; you can redistribute it and/or modify
8 1.1 christos it under the terms of the GNU General Public License as published by
9 1.1 christos the Free Software Foundation; either version 3 of the license, or
10 1.1 christos (at your option) any later version.
11 1.1 christos
12 1.1 christos GAS is distributed in the hope that it will be useful,
13 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of
14 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 1.1 christos GNU General Public License for more details.
16 1.1 christos
17 1.1 christos You should have received a copy of the GNU General Public License
18 1.1 christos along with this program; see the file COPYING3. If not,
19 1.1 christos see <http://www.gnu.org/licenses/>. */
20 1.1 christos
21 1.1 christos #ifndef TC_AARCH64
22 1.1 christos #define TC_AARCH64 1
23 1.1 christos
24 1.1 christos #include "opcode/aarch64.h"
25 1.1 christos
26 1.1 christos #ifndef TARGET_BYTES_BIG_ENDIAN
27 1.1 christos #define TARGET_BYTES_BIG_ENDIAN 0
28 1.1 christos #endif
29 1.1 christos
30 1.1 christos #define WORKING_DOT_WORD
31 1.1 christos
32 1.1 christos #define TARGET_ARCH bfd_arch_aarch64
33 1.1 christos
34 1.1 christos #define DIFF_EXPR_OK
35 1.1 christos
36 1.1 christos /* Permit // comments. */
37 1.1 christos #define DOUBLESLASH_LINE_COMMENTS
38 1.1 christos
39 1.1 christos #ifdef LITTLE_ENDIAN
40 1.1 christos #undef LITTLE_ENDIAN
41 1.1 christos #endif
42 1.1 christos
43 1.1 christos #ifdef BIG_ENDIAN
44 1.1 christos #undef BIG_ENDIAN
45 1.1 christos #endif
46 1.1 christos
47 1.1 christos #define LITTLE_ENDIAN 1234
48 1.1 christos #define BIG_ENDIAN 4321
49 1.1 christos
50 1.1 christos #define SWAP_32(n) \
51 1.1 christos ((((n) & 0xff) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) \
52 1.1 christos | (((n) >> 24) & 0xff))
53 1.1 christos
54 1.1 christos struct fix;
55 1.1 christos
56 1.1 christos struct aarch64_fix
57 1.1 christos {
58 1.1 christos struct aarch64_inst *inst;
59 1.1 christos enum aarch64_opnd opnd;
60 1.1 christos };
61 1.1 christos
62 1.1 christos #if defined OBJ_ELF
63 1.1 christos # define AARCH64_BI_ENDIAN
64 1.1 christos # define TARGET_FORMAT elf64_aarch64_target_format ()
65 1.1 christos #endif
66 1.1 christos
67 1.1 christos #define TC_FORCE_RELOCATION(FIX) aarch64_force_relocation (FIX)
68 1.1 christos
69 1.1 christos /* Currently there is no machine specific frags generated. */
70 1.1 christos #define md_convert_frag(b,s,f) as_fatal ("aarch64 convert_frag called\n")
71 1.1 christos
72 1.1 christos #define md_cleanup() aarch64_cleanup ()
73 1.1 christos
74 1.1 christos #define md_start_line_hook() aarch64_start_line_hook ()
75 1.1 christos
76 1.1 christos #define tc_frob_label(S) aarch64_frob_label (S)
77 1.1 christos
78 1.1 christos /* We also need to mark assembler created symbols: */
79 1.1 christos #define tc_frob_fake_label(S) aarch64_frob_label (S)
80 1.1 christos
81 1.1 christos #define TC_FIX_TYPE struct aarch64_fix
82 1.1 christos #define TC_INIT_FIX_DATA(FIX) { (FIX)->tc_fix_data.inst = NULL; \
83 1.1 christos (FIX)->tc_fix_data.opnd = AARCH64_OPND_NIL; }
84 1.1 christos
85 1.1 christos #define TC_SYMFIELD_TYPE unsigned int
86 1.1 christos #define AARCH64_GET_FLAG(s) (*symbol_get_tc (s))
87 1.1 christos
88 1.1 christos void aarch64_copy_symbol_attributes (symbolS *, symbolS *);
89 1.1 christos #ifndef TC_COPY_SYMBOL_ATTRIBUTES
90 1.1 christos #define TC_COPY_SYMBOL_ATTRIBUTES(DEST, SRC) \
91 1.1 christos (aarch64_copy_symbol_attributes (DEST, SRC))
92 1.1 christos #endif
93 1.1 christos
94 1.1.1.2 christos #define TC_START_LABEL(STR, NUL_CHAR, NEXT_CHAR) \
95 1.1.1.2 christos (NEXT_CHAR == ':' || (NEXT_CHAR == '/' && aarch64_data_in_code ()))
96 1.1 christos #define tc_canonicalize_symbol_name(str) aarch64_canonicalize_symbol_name (str);
97 1.1 christos #define obj_adjust_symtab() aarch64_adjust_symtab ()
98 1.1 christos
99 1.1 christos #define LISTING_HEADER "AARCH64 GAS "
100 1.1 christos
101 1.1 christos #define LOCAL_LABEL(name) (name[0] == '.' && name[1] == 'L')
102 1.1 christos #define LOCAL_LABELS_FB 1
103 1.1 christos
104 1.1 christos /* This expression evaluates to true if the relocation is for a local
105 1.1 christos object for which we still want to do the relocation at runtime.
106 1.1 christos False if we are willing to perform this relocation while building
107 1.1 christos the .o file. GOTOFF does not need to be checked here because it is
108 1.1 christos not pcrel. I am not sure if some of the others are ever used with
109 1.1 christos pcrel, but it is easier to be safe than sorry. */
110 1.1 christos
111 1.1 christos #define TC_FORCE_RELOCATION_LOCAL(FIX) \
112 1.1 christos (!(FIX)->fx_pcrel \
113 1.1 christos || (FIX)->fx_r_type == BFD_RELOC_64 \
114 1.1 christos || (FIX)->fx_r_type == BFD_RELOC_32 \
115 1.1 christos || TC_FORCE_RELOCATION (FIX))
116 1.1 christos
117 1.1.1.2 christos #define TC_CONS_FIX_NEW(f,w,s,e,r) cons_fix_new_aarch64 ((f), (w), (s), (e))
118 1.1 christos
119 1.1.1.2 christos /* Max space for a rs_align_code fragment is 3 unaligned bytes
120 1.1.1.2 christos (fr_fix) plus 4 bytes to contain the repeating NOP (fr_var). */
121 1.1.1.2 christos #define MAX_MEM_FOR_RS_ALIGN_CODE 7
122 1.1 christos
123 1.1 christos /* For frags in code sections we need to record whether they contain
124 1.1 christos code or data. */
125 1.1 christos struct aarch64_frag_type
126 1.1 christos {
127 1.1 christos int recorded;
128 1.1 christos #ifdef OBJ_ELF
129 1.1 christos /* If there is a mapping symbol at offset 0 in this frag,
130 1.1 christos it will be saved in FIRST_MAP. If there are any mapping
131 1.1 christos symbols in this frag, the last one will be saved in
132 1.1 christos LAST_MAP. */
133 1.1 christos symbolS *first_map, *last_map;
134 1.1 christos #endif
135 1.1 christos };
136 1.1 christos
137 1.1 christos #define TC_FRAG_TYPE struct aarch64_frag_type
138 1.1 christos /* NOTE: max_chars is a local variable from frag_var / frag_variant. */
139 1.1 christos #define TC_FRAG_INIT(fragp) aarch64_init_frag (fragp, max_chars)
140 1.1 christos #define HANDLE_ALIGN(fragp) aarch64_handle_align (fragp)
141 1.1 christos
142 1.1 christos #define md_do_align(N, FILL, LEN, MAX, LABEL) \
143 1.1 christos if (FILL == NULL && (N) != 0 && ! need_pass_2 && subseg_text_p (now_seg)) \
144 1.1 christos { \
145 1.1.1.2 christos frag_align_code (N, MAX); \
146 1.1 christos goto LABEL; \
147 1.1 christos }
148 1.1 christos
149 1.1.1.2 christos #define SUB_SEGMENT_ALIGN(SEG, FRCHAIN) 0
150 1.1.1.2 christos
151 1.1.1.2 christos #define DWARF2_LINE_MIN_INSN_LENGTH 4
152 1.1 christos
153 1.1 christos /* The lr register is r30. */
154 1.1 christos #define DWARF2_DEFAULT_RETURN_COLUMN 30
155 1.1 christos
156 1.1 christos /* Registers are generally saved at negative offsets to the CFA. */
157 1.1.1.2 christos #define DWARF2_CIE_DATA_ALIGNMENT (-8)
158 1.1.1.2 christos
159 1.1.1.2 christos extern int aarch64_dwarf2_addr_size (void);
160 1.1.1.2 christos #define DWARF2_ADDR_SIZE(bfd) aarch64_dwarf2_addr_size ()
161 1.1 christos
162 1.1 christos #ifdef OBJ_ELF
163 1.1 christos # define obj_frob_symbol(sym, punt) aarch64elf_frob_symbol ((sym), & (punt))
164 1.1 christos
165 1.1 christos # define GLOBAL_OFFSET_TABLE_NAME "_GLOBAL_OFFSET_TABLE_"
166 1.1 christos # define TC_SEGMENT_INFO_TYPE struct aarch64_segment_info_type
167 1.1 christos
168 1.1 christos /* This is not really an alignment operation, but it's something we
169 1.1 christos need to do at the same time: whenever we are figuring out the
170 1.1 christos alignment for data, we should check whether a $d symbol is
171 1.1 christos necessary. */
172 1.1 christos # define md_cons_align(nbytes) mapping_state (MAP_DATA)
173 1.1 christos
174 1.1 christos enum mstate
175 1.1 christos {
176 1.1 christos MAP_UNDEFINED = 0, /* Must be zero, for seginfo in new sections. */
177 1.1 christos MAP_DATA,
178 1.1 christos MAP_INSN,
179 1.1 christos };
180 1.1 christos
181 1.1 christos void mapping_state (enum mstate);
182 1.1 christos
183 1.1 christos struct aarch64_segment_info_type
184 1.1 christos {
185 1.1 christos enum mstate mapstate;
186 1.1 christos unsigned int marked_pr_dependency;
187 1.1 christos };
188 1.1 christos
189 1.1 christos /* We want .cfi_* pseudo-ops for generating unwind info. */
190 1.1 christos #define TARGET_USE_CFIPOP 1
191 1.1 christos
192 1.1 christos /* CFI hooks. */
193 1.1 christos #define tc_regname_to_dw2regnum tc_aarch64_regname_to_dw2regnum
194 1.1 christos #define tc_cfi_frame_initial_instructions tc_aarch64_frame_initial_instructions
195 1.1 christos
196 1.1 christos #else /* Not OBJ_ELF. */
197 1.1 christos #define GLOBAL_OFFSET_TABLE_NAME "__GLOBAL_OFFSET_TABLE_"
198 1.1 christos #endif
199 1.1 christos
200 1.1 christos #if defined OBJ_ELF || defined OBJ_COFF
201 1.1 christos
202 1.1 christos # define EXTERN_FORCE_RELOC 1
203 1.1 christos # define tc_fix_adjustable(FIX) 1
204 1.1 christos /* Values passed to md_apply_fix don't include the symbol value. */
205 1.1 christos # define MD_APPLY_SYM_VALUE(FIX) 0
206 1.1 christos
207 1.1 christos #endif
208 1.1 christos
209 1.1 christos #define MD_PCREL_FROM_SECTION(F,S) md_pcrel_from_section(F,S)
210 1.1 christos
211 1.1 christos extern long md_pcrel_from_section (struct fix *, segT);
212 1.1 christos extern void aarch64_frag_align_code (int, int);
213 1.1 christos extern const char * elf64_aarch64_target_format (void);
214 1.1 christos extern int aarch64_force_relocation (struct fix *);
215 1.1 christos extern void aarch64_cleanup (void);
216 1.1 christos extern void aarch64_start_line_hook (void);
217 1.1 christos extern void aarch64_frob_label (symbolS *);
218 1.1 christos extern int aarch64_data_in_code (void);
219 1.1 christos extern char * aarch64_canonicalize_symbol_name (char *);
220 1.1 christos extern void aarch64_adjust_symtab (void);
221 1.1 christos extern void aarch64elf_frob_symbol (symbolS *, int *);
222 1.1 christos extern void cons_fix_new_aarch64 (fragS *, int, int, expressionS *);
223 1.1 christos extern void aarch64_init_frag (struct frag *, int);
224 1.1 christos extern void aarch64_handle_align (struct frag *);
225 1.1 christos extern int tc_aarch64_regname_to_dw2regnum (char *regname);
226 1.1 christos extern void tc_aarch64_frame_initial_instructions (void);
227 1.1 christos
228 1.1 christos #ifdef TE_PE
229 1.1 christos
230 1.1 christos #define O_secrel O_md1
231 1.1 christos
232 1.1 christos #define TC_DWARF2_EMIT_OFFSET tc_pe_dwarf2_emit_offset
233 1.1 christos void tc_pe_dwarf2_emit_offset (symbolS *, unsigned int);
234 1.1 christos
235 1.1 christos #endif /* TE_PE */
236 1.1 christos
237 1.1 christos #endif /* TC_AARCH64 */
238