]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gas/config/tc-ia64.h
Update year range in copyright notice of binutils files
[thirdparty/binutils-gdb.git] / gas / config / tc-ia64.h
CommitLineData
800eeca4 1/* tc-ia64.h -- Header file for tc-ia64.c.
a2c58332 2 Copyright (C) 1998-2022 Free Software Foundation, Inc.
800eeca4
JW
3 Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
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)
800eeca4
JW
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
4b4da160
NC
19 the Free Software Foundation, 51 Franklin Street - Fifth Floor,
20 Boston, MA 02110-1301, USA. */
800eeca4 21
29589b0c
AM
22#include "opcode/ia64.h"
23#include "elf/ia64.h"
800eeca4
JW
24
25#define TC_IA64
26
44f5c83a
JW
27/* Linux is little endian by default. HPUX is big endian by default. */
28#ifdef TE_HPUX
44f5c83a 29#define TARGET_BYTES_BIG_ENDIAN 1
1cd8ff38 30#define MD_FLAGS_DEFAULT EF_IA_64_BE
44f5c83a 31#else
44f5c83a 32#define TARGET_BYTES_BIG_ENDIAN 0
1cd8ff38 33#define MD_FLAGS_DEFAULT EF_IA_64_ABI64
44f5c83a
JW
34#endif /* TE_HPUX */
35
5a49b8ac 36extern void (*ia64_number_to_chars) (char *, valueT, int);
10a98291
L
37#define md_number_to_chars (*ia64_number_to_chars)
38
5a49b8ac 39extern void ia64_elf_section_change_hook (void);
10a98291
L
40#define md_elf_section_change_hook ia64_elf_section_change_hook
41
42/* We record the endian for this section. 0 means default, 1 means
43 big endian and 2 means little endian. */
44struct ia64_segment_info_type
45{
46 unsigned int endian : 2;
47};
48
49#define TC_SEGMENT_INFO_TYPE struct ia64_segment_info_type
50
5a49b8ac 51extern void ia64_adjust_symtab (void);
35f5df7f
L
52#define tc_adjust_symtab() ia64_adjust_symtab ()
53
5a49b8ac 54extern void ia64_frob_file (void);
35f5df7f
L
55#define tc_frob_file() ia64_frob_file ()
56
44f5c83a
JW
57/* We need to set the default object file format in ia64_init and not in
58 md_begin. This is because parse_args is called before md_begin, and we
59 do not want md_begin to wipe out the flag settings set by options parsed in
60 md_parse_args. */
61
62#define HOST_SPECIAL_INIT ia64_init
5a49b8ac 63extern void ia64_init (int, char **);
44f5c83a
JW
64
65#define TARGET_FORMAT ia64_target_format()
5a49b8ac 66extern const char *ia64_target_format (void);
800eeca4
JW
67
68#define TARGET_ARCH bfd_arch_ia64
800eeca4 69#define DOUBLESLASH_LINE_COMMENTS /* allow //-style comments */
800eeca4
JW
70
71#define NEED_LITERAL_POOL /* need gp literal pool */
72#define RELOC_REQUIRES_SYMBOL
73#define DIFF_EXPR_OK /* foo-. gets turned into PC relative relocs */
74#define NEED_INDEX_OPERATOR /* [ ] is index operator */
75
76#define QUOTES_IN_INSN /* allow `string "foo;bar"' */
16a48f83
JB
77#define LEX_AT (LEX_NAME|LEX_BEGIN_NAME) /* allow `@' inside name */
78#define LEX_QM (LEX_NAME|LEX_BEGIN_NAME) /* allow `?' inside name */
800eeca4
JW
79#define LEX_HASH LEX_END_NAME /* allow `#' ending a name */
80
40b36596
JM
81#define TC_PREDICATE_START_CHAR '('
82#define TC_PREDICATE_END_CHAR ')'
83
2fac3d48
JB
84extern const char ia64_symbol_chars[];
85#define tc_symbol_chars ia64_symbol_chars
86
bf57c3c9
L
87#define SUB_SEGMENT_ALIGN(SEG, FRCHAIN) 0
88
800eeca4
JW
89struct ia64_fix
90 {
91 int bigendian; /* byte order at fix location */
92 enum ia64_opnd opnd;
93 };
94
5a49b8ac
AM
95extern void ia64_end_of_source (void);
96extern void ia64_start_line (void);
97extern int ia64_unrecognized_line (int);
98extern void ia64_frob_label (struct symbol *);
936cf02e 99#ifdef TE_HPUX
5a49b8ac 100extern int ia64_frob_symbol (struct symbol *);
936cf02e 101#endif
5a49b8ac
AM
102extern void ia64_flush_pending_output (void);
103extern int ia64_parse_name (char *, expressionS *, char *);
104extern int ia64_optimize_expr (expressionS *, operatorT, expressionS *);
105extern void ia64_cons_align (int);
106extern void ia64_flush_insns (void);
107extern int ia64_fix_adjustable (struct fix *);
108extern int ia64_force_relocation (struct fix *);
62ebcb5c
AM
109extern void ia64_cons_fix_new (fragS *, int, int, expressionS *,
110 bfd_reloc_code_real_type);
5a49b8ac
AM
111extern void ia64_validate_fix (struct fix *);
112extern char * ia64_canonicalize_symbol_name (char *);
6d4af3c2 113extern bfd_vma ia64_elf_section_letter (int, const char **);
01e1a5bc 114extern flagword ia64_elf_section_flags (flagword, bfd_vma, int);
5a49b8ac
AM
115extern int ia64_elf_section_type (const char *, size_t);
116extern long ia64_pcrel_from_section (struct fix *, segT);
117extern void ia64_md_do_align (int, const char *, int, int);
118extern void ia64_handle_align (fragS *);
119extern void ia64_after_parse_args (void);
120extern void ia64_dwarf2_emit_offset (symbolS *, unsigned int);
121extern void ia64_check_label (symbolS *);
b5e0fabd 122extern int ia64_estimate_size_before_relax (fragS *, asection *);
73f20958 123extern void ia64_convert_frag (fragS *);
800eeca4
JW
124
125#define md_end() ia64_end_of_source ()
126#define md_start_line_hook() ia64_start_line ()
127#define tc_unrecognized_line(ch) ia64_unrecognized_line (ch)
128#define tc_frob_label(s) ia64_frob_label (s)
936cf02e
JW
129#ifdef TE_HPUX
130#define tc_frob_symbol(s,p) p |= ia64_frob_symbol (s)
131#endif /* TE_HPUX */
800eeca4 132#define md_flush_pending_output() ia64_flush_pending_output ()
9497f5ac 133#define md_parse_name(s,e,m,c) ia64_parse_name (s, e, c)
5a918ce7 134#define md_register_arithmetic 0
800eeca4 135#define tc_canonicalize_symbol_name(s) ia64_canonicalize_symbol_name (s)
612d7b83 136#define tc_canonicalize_section_name(s) ia64_canonicalize_symbol_name (s)
800eeca4
JW
137#define md_optimize_expr(l,o,r) ia64_optimize_expr (l, o, r)
138#define md_cons_align(n) ia64_cons_align (n)
139#define TC_FORCE_RELOCATION(f) ia64_force_relocation (f)
140#define tc_fix_adjustable(f) ia64_fix_adjustable (f)
a161fe53 141#define MD_APPLY_SYM_VALUE(FIX) 0
73f20958 142#define md_convert_frag(b,s,f) ia64_convert_frag (f)
07726851 143#define md_create_long_jump(p,f,t,fr,s) as_fatal ("ia64_create_long_jump")
800eeca4 144#define md_create_short_jump(p,f,t,fr,s) \
07726851 145 as_fatal ("ia64_create_short_jump")
800eeca4 146#define md_estimate_size_before_relax(f,s) \
b5e0fabd 147 ia64_estimate_size_before_relax(f,s)
d61a78a7 148#define md_elf_section_letter ia64_elf_section_letter
800eeca4
JW
149#define md_elf_section_flags ia64_elf_section_flags
150#define TC_FIX_TYPE struct ia64_fix
151#define TC_INIT_FIX_DATA(f) { f->tc_fix_data.opnd = 0; }
62ebcb5c 152#define TC_CONS_FIX_NEW(f,o,l,e,r) ia64_cons_fix_new (f, o, l, e, r)
800eeca4
JW
153#define TC_VALIDATE_FIX(fix,seg,skip) ia64_validate_fix (fix)
154#define MD_PCREL_FROM_SECTION(fix,sec) ia64_pcrel_from_section (fix, sec)
bf57c3c9 155#define md_section_align(seg,size) (size)
0a9ef439
RH
156#define md_do_align(n,f,l,m,j) ia64_md_do_align (n,f,l,m)
157#define HANDLE_ALIGN(f) ia64_handle_align (f)
91a2ae2a 158#define md_elf_section_type(str,len) ia64_elf_section_type (str, len)
acebd4ce 159#define md_after_parse_args() ia64_after_parse_args ()
6174d9c8 160#define TC_DWARF2_EMIT_OFFSET ia64_dwarf2_emit_offset
a645d1eb 161#define tc_check_label(l) ia64_check_label (l)
01e1a5bc
NC
162#ifdef TE_VMS
163#define tc_init_after_args() ia64_vms_note ()
164void ia64_vms_note (void);
165#endif
0a9ef439 166
9545c4ce
L
167/* Record if an alignment frag should end with a stop bit. */
168#define TC_FRAG_TYPE int
db222310 169#define TC_FRAG_INIT(FRAGP, MAX_BYTES) do {(FRAGP)->tc_frag_data = 0;}while (0)
9545c4ce 170
5a9ff93d
JW
171/* Give an error if a frag containing code is not aligned to a 16 byte
172 boundary. */
173#define md_frag_check(FRAGP) \
174 if ((FRAGP)->has_code \
175 && (((FRAGP)->fr_address + (FRAGP)->insn_addr) & 15) != 0) \
176 as_bad_where ((FRAGP)->fr_file, (FRAGP)->fr_line, \
177 _("instruction address is not a multiple of 16"));
178
0a9ef439 179#define MAX_MEM_FOR_RS_ALIGN_CODE (15 + 16)
800eeca4 180
800eeca4
JW
181#define WORKING_DOT_WORD /* don't do broken word processing for now */
182
800eeca4
JW
183#define DWARF2_LINE_MIN_INSN_LENGTH 1 /* so slot-multipliers can be 1 */
184
185/* This is the information required for unwind records in an ia64
4a4f25cf 186 object file. This is required by GAS and the compiler runtime. */
800eeca4
JW
187
188/* These are the starting point masks for the various types of
189 unwind records. To create a record of type R3 for instance, one
4a4f25cf
KH
190 starts by using the value UNW_R3 and or-ing in any other required values.
191 These values are also unique (in context), so they can be used to identify
800eeca4
JW
192 the various record types as well. UNW_Bx and some UNW_Px do have the
193 same value, but Px can only occur in a prologue context, and Bx in
194 a body context. */
195
196#define UNW_R1 0x00
197#define UNW_R2 0x40
198#define UNW_R3 0x60
199#define UNW_P1 0x80
200#define UNW_P2 0xA0
201#define UNW_P3 0xB0
202#define UNW_P4 0xB8
203#define UNW_P5 0xB9
204#define UNW_P6 0xC0
205#define UNW_P7 0xE0
206#define UNW_P8 0xF0
207#define UNW_P9 0xF1
208#define UNW_P10 0xFF
209#define UNW_X1 0xF9
210#define UNW_X2 0xFA
211#define UNW_X3 0xFB
212#define UNW_X4 0xFC
213#define UNW_B1 0x80
214#define UNW_B2 0xC0
215#define UNW_B3 0xE0
216#define UNW_B4 0xF0
217
218/* These are all the various types of unwind records. */
219
220typedef enum
221{
222 prologue, prologue_gr, body, mem_stack_f, mem_stack_v, psp_gr, psp_sprel,
223 rp_when, rp_gr, rp_br, rp_psprel, rp_sprel, pfs_when, pfs_gr, pfs_psprel,
224 pfs_sprel, preds_when, preds_gr, preds_psprel, preds_sprel,
225 fr_mem, frgr_mem, gr_gr, gr_mem, br_mem, br_gr, spill_base, spill_mask,
226 unat_when, unat_gr, unat_psprel, unat_sprel, lc_when, lc_gr, lc_psprel,
4a4f25cf
KH
227 lc_sprel, fpsr_when, fpsr_gr, fpsr_psprel, fpsr_sprel,
228 priunat_when_gr, priunat_when_mem, priunat_gr, priunat_psprel,
800eeca4
JW
229 priunat_sprel, bsp_when, bsp_gr, bsp_psprel, bsp_sprel, bspstore_when,
230 bspstore_gr, bspstore_psprel, bspstore_sprel, rnat_when, rnat_gr,
231 rnat_psprel, rnat_sprel, epilogue, label_state, copy_state,
232 spill_psprel, spill_sprel, spill_reg, spill_psprel_p, spill_sprel_p,
5738bc24 233 spill_reg_p, unwabi, endp
800eeca4
JW
234} unw_record_type;
235
4a4f25cf 236/* These structures declare the fields that can be used in each of the
800eeca4
JW
237 4 record formats, R, P, B and X. */
238
239typedef struct unw_r_record
240{
241 unsigned long rlen;
e0c9811a 242 unsigned short grmask;
800eeca4 243 unsigned short grsave;
e0c9811a
JW
244 /* masks to represent the union of save.g, save.f, save.b, and
245 save.gf: */
246 unsigned long imask_size;
247 struct
248 {
249 unsigned char *i;
ba825241 250 unsigned int fr_mem;
e0c9811a
JW
251 unsigned char gr_mem;
252 unsigned char br_mem;
253 } mask;
800eeca4
JW
254} unw_r_record;
255
256typedef struct unw_p_record
257{
ba825241 258 struct unw_rec_list *next;
800eeca4
JW
259 unsigned long t;
260 unsigned long size;
ba825241
JB
261 union
262 {
263 unsigned long sp;
264 unsigned long psp;
265 } off;
266 union
267 {
268 unsigned short gr;
269 unsigned short br;
270 } r;
271 unsigned char grmask;
272 unsigned char brmask;
273 unsigned int frmask;
e0c9811a
JW
274 unsigned char abi;
275 unsigned char context;
800eeca4
JW
276} unw_p_record;
277
278typedef struct unw_b_record
279{
280 unsigned long t;
281 unsigned long label;
282 unsigned short ecount;
283} unw_b_record;
284
285typedef struct unw_x_record
286{
287 unsigned long t;
ba825241
JB
288 union
289 {
290 unsigned long spoff;
291 unsigned long pspoff;
292 unsigned int reg;
293 } where;
800eeca4 294 unsigned short reg;
800eeca4 295 unsigned short qp;
e0c9811a
JW
296 unsigned short ab; /* Value of the AB field.. */
297 unsigned short xy; /* Value of the XY field.. */
800eeca4
JW
298} unw_x_record;
299
4a4f25cf 300/* This structure is used to determine the specific record type and
800eeca4
JW
301 its fields. */
302typedef struct unwind_record
303{
304 unw_record_type type;
305 union {
306 unw_r_record r;
307 unw_p_record p;
308 unw_b_record b;
309 unw_x_record x;
310 } record;
311} unwind_record;
85b40035 312
a161fe53 313/* This expression evaluates to true if the relocation is for a local
85b40035 314 object for which we still want to do the relocation at runtime.
a161fe53
AM
315 False if we are willing to perform this relocation while building
316 the .o file. */
85b40035 317
fa1cb89c
JW
318/* If the reloc type is BFD_RELOC_UNUSED, then this is for a TAG13/TAG13b field
319 which has no external reloc, so we must resolve the value now. */
320
a161fe53
AM
321#define TC_FORCE_RELOCATION_LOCAL(FIX) \
322 ((FIX)->fx_r_type != BFD_RELOC_UNUSED \
91cb9803
AM
323 && (GENERIC_FORCE_RELOCATION_LOCAL (FIX) \
324 || (FIX)->fx_r_type == BFD_RELOC_IA64_PLTOFF22))
fc0eebac
TG
325
326/* VMS backtraces expect dwarf version 3. */
327#ifdef TE_VMS
84d9ab33 328#define DWARF2_VERSION (dwarf_level < 3 ? 3 : dwarf_level)
fc0eebac 329#endif
2ddc8f01
NC
330
331#define md_single_noop_insn "nop 0"