* elf.c (_bfd_elf_make_section_from_shdr): Set SEC_THREAD_LOCAL
[platform/upstream/binutils.git] / gas / config / tc-ia64.h
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
44 extern void ia64_init PARAMS ((int, char **));
45
46 #define TARGET_FORMAT ia64_target_format()
47 extern 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
62 struct ia64_fix
63   {
64     int bigendian;                      /* byte order at fix location */
65     enum ia64_opnd opnd;
66   };
67
68 extern void ia64_do_align PARAMS((int n));
69 extern void ia64_end_of_source PARAMS((void));
70 extern void ia64_start_line PARAMS((void));
71 extern int ia64_unrecognized_line PARAMS((int ch));
72 extern void ia64_frob_label PARAMS((struct symbol *sym));
73 extern void ia64_flush_pending_output PARAMS((void));
74 extern int ia64_parse_name (char *name, expressionS *e);
75 extern int ia64_optimize_expr PARAMS((expressionS *l, operatorT op,
76                                       expressionS *r));
77 extern void ia64_cons_align PARAMS((int));
78 extern void ia64_flush_insns PARAMS((void));
79 extern int ia64_fix_adjustable PARAMS((struct fix *fix));
80 extern int ia64_force_relocation PARAMS((struct fix *));
81 extern void ia64_cons_fix_new PARAMS ((fragS *f, int where, int nbytes,
82                                        expressionS *exp));
83 extern void ia64_validate_fix PARAMS ((struct fix *fix));
84 extern char * ia64_canonicalize_symbol_name PARAMS ((char *));
85 extern int ia64_elf_section_letter PARAMS ((int, char **));
86 extern flagword ia64_elf_section_flags PARAMS ((flagword, int, int));
87 extern int ia64_elf_section_type PARAMS ((const char *, size_t len));
88 extern long ia64_pcrel_from_section PARAMS ((struct fix *fix, segT sec));
89 extern void ia64_md_do_align PARAMS ((int, const char *, int, int));
90 extern void ia64_handle_align PARAMS ((fragS *f));
91 extern 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 { ".sbss",      SHT_NOBITS,     SHF_ALLOC + SHF_WRITE + SHF_IA_64_SHORT }, \
128 { ".sdata",     SHT_PROGBITS,   SHF_ALLOC + SHF_WRITE + SHF_IA_64_SHORT },
129
130 #define DWARF2_LINE_MIN_INSN_LENGTH 1   /* so slot-multipliers can be 1 */
131
132 /* This is the information required for unwind records in an ia64
133    object file. This is required by GAS and the compiler runtime.  */
134
135 /* These are the starting point masks for the various types of
136    unwind records. To create a record of type R3 for instance, one
137    starts by using the value UNW_R3 and or-ing in any other required values.
138    These values are also unique (in context), so they can be used to identify
139    the various record types as well. UNW_Bx and some UNW_Px do have the
140    same value, but Px can only occur in a prologue context, and Bx in
141    a body context.  */
142
143 #define UNW_R1  0x00
144 #define UNW_R2  0x40
145 #define UNW_R3  0x60
146 #define UNW_P1  0x80
147 #define UNW_P2  0xA0
148 #define UNW_P3  0xB0
149 #define UNW_P4  0xB8
150 #define UNW_P5  0xB9
151 #define UNW_P6  0xC0
152 #define UNW_P7  0xE0
153 #define UNW_P8  0xF0
154 #define UNW_P9  0xF1
155 #define UNW_P10 0xFF
156 #define UNW_X1  0xF9
157 #define UNW_X2  0xFA
158 #define UNW_X3  0xFB
159 #define UNW_X4  0xFC
160 #define UNW_B1  0x80
161 #define UNW_B2  0xC0
162 #define UNW_B3  0xE0
163 #define UNW_B4  0xF0
164
165 /* These are all the various types of unwind records.  */
166
167 typedef enum
168 {
169   prologue, prologue_gr, body, mem_stack_f, mem_stack_v, psp_gr, psp_sprel,
170   rp_when, rp_gr, rp_br, rp_psprel, rp_sprel, pfs_when, pfs_gr, pfs_psprel,
171   pfs_sprel, preds_when, preds_gr, preds_psprel, preds_sprel,
172   fr_mem, frgr_mem, gr_gr, gr_mem, br_mem, br_gr, spill_base, spill_mask,
173   unat_when, unat_gr, unat_psprel, unat_sprel, lc_when, lc_gr, lc_psprel,
174   lc_sprel, fpsr_when, fpsr_gr, fpsr_psprel, fpsr_sprel,
175   priunat_when_gr, priunat_when_mem, priunat_gr, priunat_psprel,
176   priunat_sprel, bsp_when, bsp_gr, bsp_psprel, bsp_sprel, bspstore_when,
177   bspstore_gr, bspstore_psprel, bspstore_sprel, rnat_when, rnat_gr,
178   rnat_psprel, rnat_sprel, epilogue, label_state, copy_state,
179   spill_psprel, spill_sprel, spill_reg, spill_psprel_p, spill_sprel_p,
180   spill_reg_p, unwabi
181 } unw_record_type;
182
183 /* These structures declare the fields that can be used in each of the
184    4 record formats, R, P, B and X.  */
185
186 typedef struct unw_r_record
187 {
188   unsigned long rlen;
189   unsigned short grmask;
190   unsigned short grsave;
191   /* masks to represent the union of save.g, save.f, save.b, and
192      save.gf: */
193   unsigned long imask_size;
194   struct
195   {
196     unsigned char *i;
197     unsigned long fr_mem;
198     unsigned char gr_mem;
199     unsigned char br_mem;
200   } mask;
201 } unw_r_record;
202
203 typedef struct unw_p_record
204 {
205   void *imask;
206   unsigned long t;
207   unsigned long size;
208   unsigned long spoff;
209   unsigned long br;
210   unsigned long pspoff;
211   unsigned short gr;
212   unsigned short rmask;
213   unsigned short grmask;
214   unsigned long frmask;
215   unsigned short brmask;
216   unsigned char abi;
217   unsigned char context;
218 } unw_p_record;
219
220 typedef struct unw_b_record
221 {
222   unsigned long t;
223   unsigned long label;
224   unsigned short ecount;
225 } unw_b_record;
226
227 typedef struct unw_x_record
228 {
229   unsigned long t;
230   unsigned long spoff;
231   unsigned long pspoff;
232   unsigned short reg;
233   unsigned short treg;
234   unsigned short qp;
235   unsigned short ab;    /* Value of the AB field..  */
236   unsigned short xy;    /* Value of the XY field..  */
237 } unw_x_record;
238
239 /* This structure is used to determine the specific record type and
240    its fields.  */
241 typedef struct unwind_record
242 {
243   unw_record_type type;
244   union {
245     unw_r_record r;
246     unw_p_record p;
247     unw_b_record b;
248     unw_x_record x;
249   } record;
250 } unwind_record;
251
252 /* This expression evaluates to false if the relocation is for a local
253    object for which we still want to do the relocation at runtime.
254    True if we are willing to perform this relocation while building
255    the .o file.  This is only used for pcrel relocations.  */
256
257 /* If the reloc type is BFD_RELOC_UNUSED, then this is for a TAG13/TAG13b field
258    which has no external reloc, so we must resolve the value now.  */
259
260 #define TC_RELOC_RTSYM_LOC_FIXUP(FIX)                           \
261   ((FIX)->fx_addsy == NULL                                      \
262    || (FIX)->fx_r_type == BFD_RELOC_UNUSED                      \
263    || (! S_IS_EXTERNAL ((FIX)->fx_addsy)                        \
264        && ! S_IS_WEAK ((FIX)->fx_addsy)                         \
265        && S_IS_DEFINED ((FIX)->fx_addsy)                        \
266        && ! S_IS_COMMON ((FIX)->fx_addsy)))