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