Add v850e debug registers.
[deliverable/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
29#define md_number_to_chars number_to_chars_bigendian
30#define TARGET_BYTES_BIG_ENDIAN 1
1cd8ff38 31#define MD_FLAGS_DEFAULT EF_IA_64_BE
44f5c83a
JW
32#else
33#define md_number_to_chars number_to_chars_littleendian
34#define TARGET_BYTES_BIG_ENDIAN 0
1cd8ff38 35#define MD_FLAGS_DEFAULT EF_IA_64_ABI64
44f5c83a
JW
36#endif /* TE_HPUX */
37
38/* We need to set the default object file format in ia64_init and not in
39 md_begin. This is because parse_args is called before md_begin, and we
40 do not want md_begin to wipe out the flag settings set by options parsed in
41 md_parse_args. */
42
43#define HOST_SPECIAL_INIT ia64_init
514829c3 44extern void ia64_init PARAMS ((int, char **));
44f5c83a
JW
45
46#define TARGET_FORMAT ia64_target_format()
47extern const char *ia64_target_format PARAMS ((void));
800eeca4
JW
48
49#define TARGET_ARCH bfd_arch_ia64
800eeca4 50#define DOUBLESLASH_LINE_COMMENTS /* allow //-style comments */
800eeca4
JW
51
52#define NEED_LITERAL_POOL /* need gp literal pool */
53#define RELOC_REQUIRES_SYMBOL
54#define DIFF_EXPR_OK /* foo-. gets turned into PC relative relocs */
55#define NEED_INDEX_OPERATOR /* [ ] is index operator */
56
57#define QUOTES_IN_INSN /* allow `string "foo;bar"' */
58#define LEX_AT LEX_NAME /* allow `@' inside name */
59#define LEX_QM LEX_NAME /* allow `?' inside name */
60#define LEX_HASH LEX_END_NAME /* allow `#' ending a name */
61
62struct ia64_fix
63 {
64 int bigendian; /* byte order at fix location */
65 enum ia64_opnd opnd;
66 };
67
68extern void ia64_do_align PARAMS((int n));
69extern void ia64_end_of_source PARAMS((void));
70extern void ia64_start_line PARAMS((void));
71extern int ia64_unrecognized_line PARAMS((int ch));
72extern void ia64_frob_label PARAMS((struct symbol *sym));
73extern void ia64_flush_pending_output PARAMS((void));
74extern int ia64_parse_name (char *name, expressionS *e);
75extern int ia64_optimize_expr PARAMS((expressionS *l, operatorT op,
76 expressionS *r));
77extern void ia64_cons_align PARAMS((int));
78extern void ia64_flush_insns PARAMS((void));
79extern int ia64_fix_adjustable PARAMS((struct fix *fix));
80extern int ia64_force_relocation PARAMS((struct fix *));
81extern void ia64_cons_fix_new PARAMS ((fragS *f, int where, int nbytes,
82 expressionS *exp));
83extern void ia64_validate_fix PARAMS ((struct fix *fix));
84extern char * ia64_canonicalize_symbol_name PARAMS ((char *));
d61a78a7 85extern int ia64_elf_section_letter PARAMS ((int, char **));
800eeca4 86extern flagword ia64_elf_section_flags PARAMS ((flagword, int, int));
91a2ae2a 87extern int ia64_elf_section_type PARAMS ((const char *, size_t len));
800eeca4 88extern long ia64_pcrel_from_section PARAMS ((struct fix *fix, segT sec));
0a9ef439
RH
89extern void ia64_md_do_align PARAMS ((int, const char *, int, int));
90extern void ia64_handle_align PARAMS ((fragS *f));
acebd4ce 91extern void ia64_after_parse_args PARAMS ((void));
800eeca4
JW
92
93#define md_end() ia64_end_of_source ()
94#define md_start_line_hook() ia64_start_line ()
95#define tc_unrecognized_line(ch) ia64_unrecognized_line (ch)
96#define tc_frob_label(s) ia64_frob_label (s)
97#define md_flush_pending_output() ia64_flush_pending_output ()
a8a22e33 98#define md_parse_name(s,e,c) ia64_parse_name (s, e)
800eeca4
JW
99#define tc_canonicalize_symbol_name(s) ia64_canonicalize_symbol_name (s)
100#define md_optimize_expr(l,o,r) ia64_optimize_expr (l, o, r)
101#define md_cons_align(n) ia64_cons_align (n)
102#define TC_FORCE_RELOCATION(f) ia64_force_relocation (f)
103#define tc_fix_adjustable(f) ia64_fix_adjustable (f)
a161fe53 104#define MD_APPLY_SYM_VALUE(FIX) 0
800eeca4 105#define md_convert_frag(b,s,f) as_fatal ("ia64_convert_frag")
07726851 106#define md_create_long_jump(p,f,t,fr,s) as_fatal ("ia64_create_long_jump")
800eeca4 107#define md_create_short_jump(p,f,t,fr,s) \
07726851 108 as_fatal ("ia64_create_short_jump")
800eeca4
JW
109#define md_estimate_size_before_relax(f,s) \
110 (as_fatal ("ia64_estimate_size_before_relax"), 1)
d61a78a7 111#define md_elf_section_letter ia64_elf_section_letter
800eeca4
JW
112#define md_elf_section_flags ia64_elf_section_flags
113#define TC_FIX_TYPE struct ia64_fix
114#define TC_INIT_FIX_DATA(f) { f->tc_fix_data.opnd = 0; }
115#define TC_CONS_FIX_NEW(f,o,l,e) ia64_cons_fix_new (f, o, l, e)
116#define TC_VALIDATE_FIX(fix,seg,skip) ia64_validate_fix (fix)
117#define MD_PCREL_FROM_SECTION(fix,sec) ia64_pcrel_from_section (fix, sec)
0a9ef439
RH
118#define md_do_align(n,f,l,m,j) ia64_md_do_align (n,f,l,m)
119#define HANDLE_ALIGN(f) ia64_handle_align (f)
91a2ae2a 120#define md_elf_section_type(str,len) ia64_elf_section_type (str, len)
acebd4ce 121#define md_after_parse_args() ia64_after_parse_args ()
0a9ef439
RH
122
123#define MAX_MEM_FOR_RS_ALIGN_CODE (15 + 16)
800eeca4 124
800eeca4
JW
125#define WORKING_DOT_WORD /* don't do broken word processing for now */
126
127#define ELF_TC_SPECIAL_SECTIONS \
128{ ".sbss", SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_IA_64_SHORT }, \
91a2ae2a 129{ ".sdata", SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_IA_64_SHORT },
800eeca4
JW
130
131#define DWARF2_LINE_MIN_INSN_LENGTH 1 /* so slot-multipliers can be 1 */
132
133/* This is the information required for unwind records in an ia64
4a4f25cf 134 object file. This is required by GAS and the compiler runtime. */
800eeca4
JW
135
136/* These are the starting point masks for the various types of
137 unwind records. To create a record of type R3 for instance, one
4a4f25cf
KH
138 starts by using the value UNW_R3 and or-ing in any other required values.
139 These values are also unique (in context), so they can be used to identify
800eeca4
JW
140 the various record types as well. UNW_Bx and some UNW_Px do have the
141 same value, but Px can only occur in a prologue context, and Bx in
142 a body context. */
143
144#define UNW_R1 0x00
145#define UNW_R2 0x40
146#define UNW_R3 0x60
147#define UNW_P1 0x80
148#define UNW_P2 0xA0
149#define UNW_P3 0xB0
150#define UNW_P4 0xB8
151#define UNW_P5 0xB9
152#define UNW_P6 0xC0
153#define UNW_P7 0xE0
154#define UNW_P8 0xF0
155#define UNW_P9 0xF1
156#define UNW_P10 0xFF
157#define UNW_X1 0xF9
158#define UNW_X2 0xFA
159#define UNW_X3 0xFB
160#define UNW_X4 0xFC
161#define UNW_B1 0x80
162#define UNW_B2 0xC0
163#define UNW_B3 0xE0
164#define UNW_B4 0xF0
165
166/* These are all the various types of unwind records. */
167
168typedef enum
169{
170 prologue, prologue_gr, body, mem_stack_f, mem_stack_v, psp_gr, psp_sprel,
171 rp_when, rp_gr, rp_br, rp_psprel, rp_sprel, pfs_when, pfs_gr, pfs_psprel,
172 pfs_sprel, preds_when, preds_gr, preds_psprel, preds_sprel,
173 fr_mem, frgr_mem, gr_gr, gr_mem, br_mem, br_gr, spill_base, spill_mask,
174 unat_when, unat_gr, unat_psprel, unat_sprel, lc_when, lc_gr, lc_psprel,
4a4f25cf
KH
175 lc_sprel, fpsr_when, fpsr_gr, fpsr_psprel, fpsr_sprel,
176 priunat_when_gr, priunat_when_mem, priunat_gr, priunat_psprel,
800eeca4
JW
177 priunat_sprel, bsp_when, bsp_gr, bsp_psprel, bsp_sprel, bspstore_when,
178 bspstore_gr, bspstore_psprel, bspstore_sprel, rnat_when, rnat_gr,
179 rnat_psprel, rnat_sprel, epilogue, label_state, copy_state,
180 spill_psprel, spill_sprel, spill_reg, spill_psprel_p, spill_sprel_p,
e0c9811a 181 spill_reg_p, unwabi
800eeca4
JW
182} unw_record_type;
183
4a4f25cf 184/* These structures declare the fields that can be used in each of the
800eeca4
JW
185 4 record formats, R, P, B and X. */
186
187typedef struct unw_r_record
188{
189 unsigned long rlen;
e0c9811a 190 unsigned short grmask;
800eeca4 191 unsigned short grsave;
e0c9811a
JW
192 /* masks to represent the union of save.g, save.f, save.b, and
193 save.gf: */
194 unsigned long imask_size;
195 struct
196 {
197 unsigned char *i;
198 unsigned long fr_mem;
199 unsigned char gr_mem;
200 unsigned char br_mem;
201 } mask;
800eeca4
JW
202} unw_r_record;
203
204typedef struct unw_p_record
205{
206 void *imask;
207 unsigned long t;
208 unsigned long size;
209 unsigned long spoff;
210 unsigned long br;
211 unsigned long pspoff;
212 unsigned short gr;
213 unsigned short rmask;
214 unsigned short grmask;
215 unsigned long frmask;
216 unsigned short brmask;
e0c9811a
JW
217 unsigned char abi;
218 unsigned char context;
800eeca4
JW
219} unw_p_record;
220
221typedef struct unw_b_record
222{
223 unsigned long t;
224 unsigned long label;
225 unsigned short ecount;
226} unw_b_record;
227
228typedef struct unw_x_record
229{
230 unsigned long t;
231 unsigned long spoff;
232 unsigned long pspoff;
233 unsigned short reg;
234 unsigned short treg;
235 unsigned short qp;
e0c9811a
JW
236 unsigned short ab; /* Value of the AB field.. */
237 unsigned short xy; /* Value of the XY field.. */
800eeca4
JW
238} unw_x_record;
239
4a4f25cf 240/* This structure is used to determine the specific record type and
800eeca4
JW
241 its fields. */
242typedef struct unwind_record
243{
244 unw_record_type type;
245 union {
246 unw_r_record r;
247 unw_p_record p;
248 unw_b_record b;
249 unw_x_record x;
250 } record;
251} unwind_record;
85b40035 252
a161fe53 253/* This expression evaluates to true if the relocation is for a local
85b40035 254 object for which we still want to do the relocation at runtime.
a161fe53
AM
255 False if we are willing to perform this relocation while building
256 the .o file. */
85b40035 257
fa1cb89c
JW
258/* If the reloc type is BFD_RELOC_UNUSED, then this is for a TAG13/TAG13b field
259 which has no external reloc, so we must resolve the value now. */
260
a161fe53
AM
261#define TC_FORCE_RELOCATION_LOCAL(FIX) \
262 ((FIX)->fx_r_type != BFD_RELOC_UNUSED \
263 && (!(FIX)->fx_pcrel \
264 || (FIX)->fx_plt \
265 || TC_FORCE_RELOCATION (FIX)))
This page took 0.150378 seconds and 4 git commands to generate.