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