]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gas/config/tc-ia64.h
*** empty log message ***
[thirdparty/binutils-gdb.git] / gas / config / tc-ia64.h
CommitLineData
800eeca4 1/* tc-ia64.h -- Header file for tc-ia64.c.
1cd8ff38 2 Copyright 1998, 1999, 2000, 2001, 2002 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
9 the Free Software Foundation; either version 2, or (at your option)
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
19 the Free Software Foundation, 59 Temple Place - Suite 330,
4a4f25cf 20 Boston, MA 02111-1307, 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
10a98291
L
36extern void (*ia64_number_to_chars) PARAMS ((char *, valueT, int));
37#define md_number_to_chars (*ia64_number_to_chars)
38
39extern void ia64_elf_section_change_hook PARAMS ((void));
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
35f5df7f
L
51extern void ia64_adjust_symtab PARAMS ((void));
52#define tc_adjust_symtab() ia64_adjust_symtab ()
53
54extern void ia64_frob_file PARAMS ((void));
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
514829c3 63extern void ia64_init PARAMS ((int, char **));
44f5c83a
JW
64
65#define TARGET_FORMAT ia64_target_format()
66extern const char *ia64_target_format PARAMS ((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"' */
77#define LEX_AT LEX_NAME /* allow `@' inside name */
78#define LEX_QM LEX_NAME /* allow `?' inside name */
79#define LEX_HASH LEX_END_NAME /* allow `#' ending a name */
80
bf57c3c9
L
81#define SUB_SEGMENT_ALIGN(SEG, FRCHAIN) 0
82
800eeca4
JW
83struct ia64_fix
84 {
85 int bigendian; /* byte order at fix location */
86 enum ia64_opnd opnd;
87 };
88
800eeca4
JW
89extern void ia64_end_of_source PARAMS((void));
90extern void ia64_start_line PARAMS((void));
91extern int ia64_unrecognized_line PARAMS((int ch));
92extern void ia64_frob_label PARAMS((struct symbol *sym));
936cf02e
JW
93#ifdef TE_HPUX
94extern int ia64_frob_symbol PARAMS((struct symbol *sym));
95#endif
800eeca4
JW
96extern void ia64_flush_pending_output PARAMS((void));
97extern int ia64_parse_name (char *name, expressionS *e);
98extern int ia64_optimize_expr PARAMS((expressionS *l, operatorT op,
99 expressionS *r));
100extern void ia64_cons_align PARAMS((int));
101extern void ia64_flush_insns PARAMS((void));
102extern int ia64_fix_adjustable PARAMS((struct fix *fix));
103extern int ia64_force_relocation PARAMS((struct fix *));
104extern void ia64_cons_fix_new PARAMS ((fragS *f, int where, int nbytes,
105 expressionS *exp));
106extern void ia64_validate_fix PARAMS ((struct fix *fix));
107extern char * ia64_canonicalize_symbol_name PARAMS ((char *));
d61a78a7 108extern int ia64_elf_section_letter PARAMS ((int, char **));
800eeca4 109extern flagword ia64_elf_section_flags PARAMS ((flagword, int, int));
91a2ae2a 110extern int ia64_elf_section_type PARAMS ((const char *, size_t len));
800eeca4 111extern long ia64_pcrel_from_section PARAMS ((struct fix *fix, segT sec));
0a9ef439
RH
112extern void ia64_md_do_align PARAMS ((int, const char *, int, int));
113extern void ia64_handle_align PARAMS ((fragS *f));
acebd4ce 114extern void ia64_after_parse_args PARAMS ((void));
6174d9c8 115extern void ia64_dwarf2_emit_offset PARAMS ((symbolS *, unsigned int));
a645d1eb 116extern void ia64_check_label PARAMS ((symbolS *));
b5e0fabd 117extern int ia64_estimate_size_before_relax (fragS *, asection *);
73f20958 118extern void ia64_convert_frag (fragS *);
800eeca4
JW
119
120#define md_end() ia64_end_of_source ()
121#define md_start_line_hook() ia64_start_line ()
122#define tc_unrecognized_line(ch) ia64_unrecognized_line (ch)
123#define tc_frob_label(s) ia64_frob_label (s)
936cf02e
JW
124#ifdef TE_HPUX
125#define tc_frob_symbol(s,p) p |= ia64_frob_symbol (s)
126#endif /* TE_HPUX */
800eeca4 127#define md_flush_pending_output() ia64_flush_pending_output ()
a8a22e33 128#define md_parse_name(s,e,c) ia64_parse_name (s, e)
800eeca4 129#define tc_canonicalize_symbol_name(s) ia64_canonicalize_symbol_name (s)
612d7b83 130#define tc_canonicalize_section_name(s) ia64_canonicalize_symbol_name (s)
800eeca4
JW
131#define md_optimize_expr(l,o,r) ia64_optimize_expr (l, o, r)
132#define md_cons_align(n) ia64_cons_align (n)
133#define TC_FORCE_RELOCATION(f) ia64_force_relocation (f)
134#define tc_fix_adjustable(f) ia64_fix_adjustable (f)
a161fe53 135#define MD_APPLY_SYM_VALUE(FIX) 0
73f20958 136#define md_convert_frag(b,s,f) ia64_convert_frag (f)
07726851 137#define md_create_long_jump(p,f,t,fr,s) as_fatal ("ia64_create_long_jump")
800eeca4 138#define md_create_short_jump(p,f,t,fr,s) \
07726851 139 as_fatal ("ia64_create_short_jump")
800eeca4 140#define md_estimate_size_before_relax(f,s) \
b5e0fabd 141 ia64_estimate_size_before_relax(f,s)
d61a78a7 142#define md_elf_section_letter ia64_elf_section_letter
800eeca4
JW
143#define md_elf_section_flags ia64_elf_section_flags
144#define TC_FIX_TYPE struct ia64_fix
145#define TC_INIT_FIX_DATA(f) { f->tc_fix_data.opnd = 0; }
146#define TC_CONS_FIX_NEW(f,o,l,e) ia64_cons_fix_new (f, o, l, e)
147#define TC_VALIDATE_FIX(fix,seg,skip) ia64_validate_fix (fix)
148#define MD_PCREL_FROM_SECTION(fix,sec) ia64_pcrel_from_section (fix, sec)
bf57c3c9 149#define md_section_align(seg,size) (size)
0a9ef439
RH
150#define md_do_align(n,f,l,m,j) ia64_md_do_align (n,f,l,m)
151#define HANDLE_ALIGN(f) ia64_handle_align (f)
91a2ae2a 152#define md_elf_section_type(str,len) ia64_elf_section_type (str, len)
acebd4ce 153#define md_after_parse_args() ia64_after_parse_args ()
6174d9c8 154#define TC_DWARF2_EMIT_OFFSET ia64_dwarf2_emit_offset
a645d1eb 155#define tc_check_label(l) ia64_check_label (l)
0a9ef439 156
9545c4ce
L
157/* Record if an alignment frag should end with a stop bit. */
158#define TC_FRAG_TYPE int
159#define TC_FRAG_INIT(FRAGP) do {(FRAGP)->tc_frag_data = 0;}while (0)
160
0a9ef439 161#define MAX_MEM_FOR_RS_ALIGN_CODE (15 + 16)
800eeca4 162
800eeca4
JW
163#define WORKING_DOT_WORD /* don't do broken word processing for now */
164
800eeca4
JW
165#define DWARF2_LINE_MIN_INSN_LENGTH 1 /* so slot-multipliers can be 1 */
166
167/* This is the information required for unwind records in an ia64
4a4f25cf 168 object file. This is required by GAS and the compiler runtime. */
800eeca4
JW
169
170/* These are the starting point masks for the various types of
171 unwind records. To create a record of type R3 for instance, one
4a4f25cf
KH
172 starts by using the value UNW_R3 and or-ing in any other required values.
173 These values are also unique (in context), so they can be used to identify
800eeca4
JW
174 the various record types as well. UNW_Bx and some UNW_Px do have the
175 same value, but Px can only occur in a prologue context, and Bx in
176 a body context. */
177
178#define UNW_R1 0x00
179#define UNW_R2 0x40
180#define UNW_R3 0x60
181#define UNW_P1 0x80
182#define UNW_P2 0xA0
183#define UNW_P3 0xB0
184#define UNW_P4 0xB8
185#define UNW_P5 0xB9
186#define UNW_P6 0xC0
187#define UNW_P7 0xE0
188#define UNW_P8 0xF0
189#define UNW_P9 0xF1
190#define UNW_P10 0xFF
191#define UNW_X1 0xF9
192#define UNW_X2 0xFA
193#define UNW_X3 0xFB
194#define UNW_X4 0xFC
195#define UNW_B1 0x80
196#define UNW_B2 0xC0
197#define UNW_B3 0xE0
198#define UNW_B4 0xF0
199
200/* These are all the various types of unwind records. */
201
202typedef enum
203{
204 prologue, prologue_gr, body, mem_stack_f, mem_stack_v, psp_gr, psp_sprel,
205 rp_when, rp_gr, rp_br, rp_psprel, rp_sprel, pfs_when, pfs_gr, pfs_psprel,
206 pfs_sprel, preds_when, preds_gr, preds_psprel, preds_sprel,
207 fr_mem, frgr_mem, gr_gr, gr_mem, br_mem, br_gr, spill_base, spill_mask,
208 unat_when, unat_gr, unat_psprel, unat_sprel, lc_when, lc_gr, lc_psprel,
4a4f25cf
KH
209 lc_sprel, fpsr_when, fpsr_gr, fpsr_psprel, fpsr_sprel,
210 priunat_when_gr, priunat_when_mem, priunat_gr, priunat_psprel,
800eeca4
JW
211 priunat_sprel, bsp_when, bsp_gr, bsp_psprel, bsp_sprel, bspstore_when,
212 bspstore_gr, bspstore_psprel, bspstore_sprel, rnat_when, rnat_gr,
213 rnat_psprel, rnat_sprel, epilogue, label_state, copy_state,
214 spill_psprel, spill_sprel, spill_reg, spill_psprel_p, spill_sprel_p,
5738bc24 215 spill_reg_p, unwabi, endp
800eeca4
JW
216} unw_record_type;
217
4a4f25cf 218/* These structures declare the fields that can be used in each of the
800eeca4
JW
219 4 record formats, R, P, B and X. */
220
221typedef struct unw_r_record
222{
223 unsigned long rlen;
e0c9811a 224 unsigned short grmask;
800eeca4 225 unsigned short grsave;
e0c9811a
JW
226 /* masks to represent the union of save.g, save.f, save.b, and
227 save.gf: */
228 unsigned long imask_size;
229 struct
230 {
231 unsigned char *i;
232 unsigned long fr_mem;
233 unsigned char gr_mem;
234 unsigned char br_mem;
235 } mask;
800eeca4
JW
236} unw_r_record;
237
238typedef struct unw_p_record
239{
240 void *imask;
241 unsigned long t;
242 unsigned long size;
243 unsigned long spoff;
244 unsigned long br;
245 unsigned long pspoff;
246 unsigned short gr;
247 unsigned short rmask;
248 unsigned short grmask;
249 unsigned long frmask;
250 unsigned short brmask;
e0c9811a
JW
251 unsigned char abi;
252 unsigned char context;
800eeca4
JW
253} unw_p_record;
254
255typedef struct unw_b_record
256{
257 unsigned long t;
258 unsigned long label;
259 unsigned short ecount;
260} unw_b_record;
261
262typedef struct unw_x_record
263{
264 unsigned long t;
265 unsigned long spoff;
266 unsigned long pspoff;
267 unsigned short reg;
268 unsigned short treg;
269 unsigned short qp;
e0c9811a
JW
270 unsigned short ab; /* Value of the AB field.. */
271 unsigned short xy; /* Value of the XY field.. */
800eeca4
JW
272} unw_x_record;
273
4a4f25cf 274/* This structure is used to determine the specific record type and
800eeca4
JW
275 its fields. */
276typedef struct unwind_record
277{
278 unw_record_type type;
279 union {
280 unw_r_record r;
281 unw_p_record p;
282 unw_b_record b;
283 unw_x_record x;
284 } record;
285} unwind_record;
85b40035 286
a161fe53 287/* This expression evaluates to true if the relocation is for a local
85b40035 288 object for which we still want to do the relocation at runtime.
a161fe53
AM
289 False if we are willing to perform this relocation while building
290 the .o file. */
85b40035 291
fa1cb89c
JW
292/* If the reloc type is BFD_RELOC_UNUSED, then this is for a TAG13/TAG13b field
293 which has no external reloc, so we must resolve the value now. */
294
a161fe53
AM
295#define TC_FORCE_RELOCATION_LOCAL(FIX) \
296 ((FIX)->fx_r_type != BFD_RELOC_UNUSED \
297 && (!(FIX)->fx_pcrel \
298 || (FIX)->fx_plt \
299 || TC_FORCE_RELOCATION (FIX)))