1 /* tc-ia64.h -- Header file for tc-ia64.c.
2    Copyright 1998, 1999, 2000, 2001 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 #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
42 extern void ia64_init PARAMS ((int, char **));
43 
44 #define TARGET_FORMAT ia64_target_format()
45 extern const char *ia64_target_format PARAMS ((void));
46 
47 #define TARGET_ARCH			bfd_arch_ia64
48 #define DOUBLESLASH_LINE_COMMENTS	/* allow //-style comments */
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 
61 struct ia64_fix
62   {
63     int bigendian;			/* byte order at fix location */
64     enum ia64_opnd opnd;
65   };
66 
67 extern void ia64_do_align PARAMS((int n));
68 extern void ia64_end_of_source PARAMS((void));
69 extern void ia64_start_line PARAMS((void));
70 extern int ia64_unrecognized_line PARAMS((int ch));
71 extern void ia64_frob_label PARAMS((struct symbol *sym));
72 extern void ia64_flush_pending_output PARAMS((void));
73 extern int ia64_parse_name (char *name, expressionS *e);
74 extern int ia64_optimize_expr PARAMS((expressionS *l, operatorT op,
75 				      expressionS *r));
76 extern void ia64_cons_align PARAMS((int));
77 extern void ia64_flush_insns PARAMS((void));
78 extern int ia64_fix_adjustable PARAMS((struct fix *fix));
79 extern int ia64_force_relocation PARAMS((struct fix *));
80 extern void ia64_cons_fix_new PARAMS ((fragS *f, int where, int nbytes,
81 				       expressionS *exp));
82 extern void ia64_validate_fix PARAMS ((struct fix *fix));
83 extern char * ia64_canonicalize_symbol_name PARAMS ((char *));
84 extern flagword ia64_elf_section_flags PARAMS ((flagword, int, int));
85 extern int ia64_elf_section_type PARAMS ((const char *, size_t len));
86 extern long ia64_pcrel_from_section PARAMS ((struct fix *fix, segT sec));
87 extern void ia64_md_do_align PARAMS ((int, const char *, int, int));
88 extern void ia64_handle_align PARAMS ((fragS *f));
89 
90 #define md_end()       			ia64_end_of_source ()
91 #define md_start_line_hook()		ia64_start_line ()
92 #define tc_unrecognized_line(ch)	ia64_unrecognized_line (ch)
93 #define tc_frob_label(s)		ia64_frob_label (s)
94 #define md_flush_pending_output()	ia64_flush_pending_output ()
95 #define md_parse_name(s,e)		ia64_parse_name (s, e)
96 #define tc_canonicalize_symbol_name(s)	ia64_canonicalize_symbol_name (s)
97 #define md_optimize_expr(l,o,r)		ia64_optimize_expr (l, o, r)
98 #define md_cons_align(n)		ia64_cons_align (n)
99 #define TC_FORCE_RELOCATION(f)		ia64_force_relocation (f)
100 #define tc_fix_adjustable(f)		ia64_fix_adjustable (f)
101 #define md_convert_frag(b,s,f)		as_fatal ("ia64_convert_frag")
102 #define md_create_long_jump(p,f,t,fr,s)	as_fatal("ia64_create_long_jump")
103 #define md_create_short_jump(p,f,t,fr,s) \
104 					as_fatal("ia64_create_short_jump")
105 #define md_estimate_size_before_relax(f,s) \
106 			(as_fatal ("ia64_estimate_size_before_relax"), 1)
107 #define md_elf_section_flags		ia64_elf_section_flags
108 #define TC_FIX_TYPE			struct ia64_fix
109 #define TC_INIT_FIX_DATA(f)		{ f->tc_fix_data.opnd = 0; }
110 #define TC_CONS_FIX_NEW(f,o,l,e)	ia64_cons_fix_new (f, o, l, e)
111 #define TC_VALIDATE_FIX(fix,seg,skip)	ia64_validate_fix (fix)
112 #define MD_PCREL_FROM_SECTION(fix,sec)	ia64_pcrel_from_section (fix, sec)
113 #define md_do_align(n,f,l,m,j)		ia64_md_do_align (n,f,l,m)
114 #define HANDLE_ALIGN(f)			ia64_handle_align (f)
115 #define md_elf_section_type(str,len)	ia64_elf_section_type (str, len)
116 
117 #define MAX_MEM_FOR_RS_ALIGN_CODE  (15 + 16)
118 
119 /* Call md_apply_fix3 with segment instead of md_apply_fix.  */
120 #define MD_APPLY_FIX3
121 
122 #define WORKING_DOT_WORD	/* don't do broken word processing for now */
123 
124 #define ELF_TC_SPECIAL_SECTIONS						   \
125 { ".sbss",	SHT_NOBITS,	SHF_ALLOC + SHF_WRITE + SHF_IA_64_SHORT }, \
126 { ".sdata",	SHT_PROGBITS,	SHF_ALLOC + SHF_WRITE + SHF_IA_64_SHORT },
127 
128 #define DWARF2_LINE_MIN_INSN_LENGTH 1	/* so slot-multipliers can be 1 */
129 
130 /* This is the information required for unwind records in an ia64
131    object file. This is required by GAS and the compiler runtime.  */
132 
133 /* These are the starting point masks for the various types of
134    unwind records. To create a record of type R3 for instance, one
135    starts by using the value UNW_R3 and or-ing in any other required values.
136    These values are also unique (in context), so they can be used to identify
137    the various record types as well. UNW_Bx and some UNW_Px do have the
138    same value, but Px can only occur in a prologue context, and Bx in
139    a body context.  */
140 
141 #define UNW_R1	0x00
142 #define UNW_R2	0x40
143 #define UNW_R3	0x60
144 #define UNW_P1	0x80
145 #define UNW_P2	0xA0
146 #define UNW_P3	0xB0
147 #define UNW_P4	0xB8
148 #define UNW_P5	0xB9
149 #define UNW_P6	0xC0
150 #define UNW_P7	0xE0
151 #define UNW_P8	0xF0
152 #define UNW_P9	0xF1
153 #define UNW_P10	0xFF
154 #define UNW_X1	0xF9
155 #define UNW_X2	0xFA
156 #define UNW_X3	0xFB
157 #define UNW_X4	0xFC
158 #define UNW_B1	0x80
159 #define UNW_B2	0xC0
160 #define UNW_B3	0xE0
161 #define UNW_B4	0xF0
162 
163 /* These are all the various types of unwind records.  */
164 
165 typedef enum
166 {
167   prologue, prologue_gr, body, mem_stack_f, mem_stack_v, psp_gr, psp_sprel,
168   rp_when, rp_gr, rp_br, rp_psprel, rp_sprel, pfs_when, pfs_gr, pfs_psprel,
169   pfs_sprel, preds_when, preds_gr, preds_psprel, preds_sprel,
170   fr_mem, frgr_mem, gr_gr, gr_mem, br_mem, br_gr, spill_base, spill_mask,
171   unat_when, unat_gr, unat_psprel, unat_sprel, lc_when, lc_gr, lc_psprel,
172   lc_sprel, fpsr_when, fpsr_gr, fpsr_psprel, fpsr_sprel,
173   priunat_when_gr, priunat_when_mem, priunat_gr, priunat_psprel,
174   priunat_sprel, bsp_when, bsp_gr, bsp_psprel, bsp_sprel, bspstore_when,
175   bspstore_gr, bspstore_psprel, bspstore_sprel, rnat_when, rnat_gr,
176   rnat_psprel, rnat_sprel, epilogue, label_state, copy_state,
177   spill_psprel, spill_sprel, spill_reg, spill_psprel_p, spill_sprel_p,
178   spill_reg_p, unwabi
179 } unw_record_type;
180 
181 /* These structures declare the fields that can be used in each of the
182    4 record formats, R, P, B and X.  */
183 
184 typedef struct unw_r_record
185 {
186   unsigned long rlen;
187   unsigned short grmask;
188   unsigned short grsave;
189   /* masks to represent the union of save.g, save.f, save.b, and
190      save.gf: */
191   unsigned long imask_size;
192   struct
193   {
194     unsigned char *i;
195     unsigned long fr_mem;
196     unsigned char gr_mem;
197     unsigned char br_mem;
198   } mask;
199 } unw_r_record;
200 
201 typedef struct unw_p_record
202 {
203   void *imask;
204   unsigned long t;
205   unsigned long size;
206   unsigned long spoff;
207   unsigned long br;
208   unsigned long pspoff;
209   unsigned short gr;
210   unsigned short rmask;
211   unsigned short grmask;
212   unsigned long frmask;
213   unsigned short brmask;
214   unsigned char abi;
215   unsigned char context;
216 } unw_p_record;
217 
218 typedef struct unw_b_record
219 {
220   unsigned long t;
221   unsigned long label;
222   unsigned short ecount;
223 } unw_b_record;
224 
225 typedef struct unw_x_record
226 {
227   unsigned long t;
228   unsigned long spoff;
229   unsigned long pspoff;
230   unsigned short reg;
231   unsigned short treg;
232   unsigned short qp;
233   unsigned short ab;	/* Value of the AB field..  */
234   unsigned short xy;	/* Value of the XY field..  */
235 } unw_x_record;
236 
237 /* This structure is used to determine the specific record type and
238    its fields.  */
239 typedef struct unwind_record
240 {
241   unw_record_type type;
242   union {
243     unw_r_record r;
244     unw_p_record p;
245     unw_b_record b;
246     unw_x_record x;
247   } record;
248 } unwind_record;
249 
250 /* This expression evaluates to false if the relocation is for a local
251    object for which we still want to do the relocation at runtime.
252    True if we are willing to perform this relocation while building
253    the .o file.  This is only used for pcrel relocations.  */
254 
255 #define TC_RELOC_RTSYM_LOC_FIXUP(FIX)				\
256   ((FIX)->fx_addsy == NULL					\
257    || (FIX)->fx_r_type == 0					\
258    || (! S_IS_EXTERNAL ((FIX)->fx_addsy)			\
259        && ! S_IS_WEAK ((FIX)->fx_addsy)				\
260        && S_IS_DEFINED ((FIX)->fx_addsy)			\
261        && ! S_IS_COMMON ((FIX)->fx_addsy)))
262