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