tc-ia64.h revision 89857
1/* tc-ia64.h -- Header file for tc-ia64.c.
2   Copyright 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
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,
20   Boston, MA 02111-1307, USA.  */
21
22#include <opcode/ia64.h>
23#include <elf/ia64.h>
24
25#define TC_IA64
26
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#define MD_FLAGS_DEFAULT		EF_IA_64_BE
32#else
33#define md_number_to_chars		number_to_chars_littleendian
34#define TARGET_BYTES_BIG_ENDIAN		0
35#define MD_FLAGS_DEFAULT		EF_IA_64_ABI64
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
44extern void ia64_init PARAMS ((int, char **));
45
46#define TARGET_FORMAT ia64_target_format()
47extern const char *ia64_target_format PARAMS ((void));
48
49#define TARGET_ARCH			bfd_arch_ia64
50#define DOUBLESLASH_LINE_COMMENTS	/* allow //-style comments */
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 *));
85extern int ia64_elf_section_letter PARAMS ((int, char **));
86extern flagword ia64_elf_section_flags PARAMS ((flagword, int, int));
87extern int ia64_elf_section_type PARAMS ((const char *, size_t len));
88extern long ia64_pcrel_from_section PARAMS ((struct fix *fix, segT sec));
89extern void ia64_md_do_align PARAMS ((int, const char *, int, int));
90extern void ia64_handle_align PARAMS ((fragS *f));
91extern void ia64_after_parse_args PARAMS ((void));
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 ()
98#define md_parse_name(s,e,c)		ia64_parse_name (s, e)
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)
104#define md_convert_frag(b,s,f)		as_fatal ("ia64_convert_frag")
105#define md_create_long_jump(p,f,t,fr,s)	as_fatal ("ia64_create_long_jump")
106#define md_create_short_jump(p,f,t,fr,s) \
107					as_fatal ("ia64_create_short_jump")
108#define md_estimate_size_before_relax(f,s) \
109			(as_fatal ("ia64_estimate_size_before_relax"), 1)
110#define md_elf_section_letter		ia64_elf_section_letter
111#define md_elf_section_flags		ia64_elf_section_flags
112#define TC_FIX_TYPE			struct ia64_fix
113#define TC_INIT_FIX_DATA(f)		{ f->tc_fix_data.opnd = 0; }
114#define TC_CONS_FIX_NEW(f,o,l,e)	ia64_cons_fix_new (f, o, l, e)
115#define TC_VALIDATE_FIX(fix,seg,skip)	ia64_validate_fix (fix)
116#define MD_PCREL_FROM_SECTION(fix,sec)	ia64_pcrel_from_section (fix, sec)
117#define md_do_align(n,f,l,m,j)		ia64_md_do_align (n,f,l,m)
118#define HANDLE_ALIGN(f)			ia64_handle_align (f)
119#define md_elf_section_type(str,len)	ia64_elf_section_type (str, len)
120#define md_after_parse_args()		ia64_after_parse_args ()
121
122#define MAX_MEM_FOR_RS_ALIGN_CODE  (15 + 16)
123
124#define WORKING_DOT_WORD	/* don't do broken word processing for now */
125
126#define ELF_TC_SPECIAL_SECTIONS						   \
127{ ".init_array",SHT_INIT_ARRAY,	SHF_ALLOC + SHF_WRITE                   }, \
128{ ".fini_array",SHT_FINI_ARRAY,	SHF_ALLOC + SHF_WRITE                   }, \
129{ ".sbss",	SHT_NOBITS,	SHF_ALLOC + SHF_WRITE + SHF_IA_64_SHORT }, \
130{ ".sdata",	SHT_PROGBITS,	SHF_ALLOC + SHF_WRITE + SHF_IA_64_SHORT },
131
132#define DWARF2_LINE_MIN_INSN_LENGTH 1	/* so slot-multipliers can be 1 */
133
134/* This is the information required for unwind records in an ia64
135   object file. This is required by GAS and the compiler runtime.  */
136
137/* These are the starting point masks for the various types of
138   unwind records. To create a record of type R3 for instance, one
139   starts by using the value UNW_R3 and or-ing in any other required values.
140   These values are also unique (in context), so they can be used to identify
141   the various record types as well. UNW_Bx and some UNW_Px do have the
142   same value, but Px can only occur in a prologue context, and Bx in
143   a body context.  */
144
145#define UNW_R1	0x00
146#define UNW_R2	0x40
147#define UNW_R3	0x60
148#define UNW_P1	0x80
149#define UNW_P2	0xA0
150#define UNW_P3	0xB0
151#define UNW_P4	0xB8
152#define UNW_P5	0xB9
153#define UNW_P6	0xC0
154#define UNW_P7	0xE0
155#define UNW_P8	0xF0
156#define UNW_P9	0xF1
157#define UNW_P10	0xFF
158#define UNW_X1	0xF9
159#define UNW_X2	0xFA
160#define UNW_X3	0xFB
161#define UNW_X4	0xFC
162#define UNW_B1	0x80
163#define UNW_B2	0xC0
164#define UNW_B3	0xE0
165#define UNW_B4	0xF0
166
167/* These are all the various types of unwind records.  */
168
169typedef enum
170{
171  prologue, prologue_gr, body, mem_stack_f, mem_stack_v, psp_gr, psp_sprel,
172  rp_when, rp_gr, rp_br, rp_psprel, rp_sprel, pfs_when, pfs_gr, pfs_psprel,
173  pfs_sprel, preds_when, preds_gr, preds_psprel, preds_sprel,
174  fr_mem, frgr_mem, gr_gr, gr_mem, br_mem, br_gr, spill_base, spill_mask,
175  unat_when, unat_gr, unat_psprel, unat_sprel, lc_when, lc_gr, lc_psprel,
176  lc_sprel, fpsr_when, fpsr_gr, fpsr_psprel, fpsr_sprel,
177  priunat_when_gr, priunat_when_mem, priunat_gr, priunat_psprel,
178  priunat_sprel, bsp_when, bsp_gr, bsp_psprel, bsp_sprel, bspstore_when,
179  bspstore_gr, bspstore_psprel, bspstore_sprel, rnat_when, rnat_gr,
180  rnat_psprel, rnat_sprel, epilogue, label_state, copy_state,
181  spill_psprel, spill_sprel, spill_reg, spill_psprel_p, spill_sprel_p,
182  spill_reg_p, unwabi
183} unw_record_type;
184
185/* These structures declare the fields that can be used in each of the
186   4 record formats, R, P, B and X.  */
187
188typedef struct unw_r_record
189{
190  unsigned long rlen;
191  unsigned short grmask;
192  unsigned short grsave;
193  /* masks to represent the union of save.g, save.f, save.b, and
194     save.gf: */
195  unsigned long imask_size;
196  struct
197  {
198    unsigned char *i;
199    unsigned long fr_mem;
200    unsigned char gr_mem;
201    unsigned char br_mem;
202  } mask;
203} unw_r_record;
204
205typedef struct unw_p_record
206{
207  void *imask;
208  unsigned long t;
209  unsigned long size;
210  unsigned long spoff;
211  unsigned long br;
212  unsigned long pspoff;
213  unsigned short gr;
214  unsigned short rmask;
215  unsigned short grmask;
216  unsigned long frmask;
217  unsigned short brmask;
218  unsigned char abi;
219  unsigned char context;
220} unw_p_record;
221
222typedef struct unw_b_record
223{
224  unsigned long t;
225  unsigned long label;
226  unsigned short ecount;
227} unw_b_record;
228
229typedef struct unw_x_record
230{
231  unsigned long t;
232  unsigned long spoff;
233  unsigned long pspoff;
234  unsigned short reg;
235  unsigned short treg;
236  unsigned short qp;
237  unsigned short ab;	/* Value of the AB field..  */
238  unsigned short xy;	/* Value of the XY field..  */
239} unw_x_record;
240
241/* This structure is used to determine the specific record type and
242   its fields.  */
243typedef struct unwind_record
244{
245  unw_record_type type;
246  union {
247    unw_r_record r;
248    unw_p_record p;
249    unw_b_record b;
250    unw_x_record x;
251  } record;
252} unwind_record;
253
254/* This expression evaluates to false if the relocation is for a local
255   object for which we still want to do the relocation at runtime.
256   True if we are willing to perform this relocation while building
257   the .o file.  This is only used for pcrel relocations.  */
258
259/* If the reloc type is BFD_RELOC_UNUSED, then this is for a TAG13/TAG13b field
260   which has no external reloc, so we must resolve the value now.  */
261
262#define TC_RELOC_RTSYM_LOC_FIXUP(FIX)				\
263  ((FIX)->fx_addsy == NULL					\
264   || (FIX)->fx_r_type == BFD_RELOC_UNUSED			\
265   || (! S_IS_EXTERNAL ((FIX)->fx_addsy)			\
266       && ! S_IS_WEAK ((FIX)->fx_addsy)				\
267       && S_IS_DEFINED ((FIX)->fx_addsy)			\
268       && ! S_IS_COMMON ((FIX)->fx_addsy)))
269