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>
5 This file is part of GAS, the GNU Assembler.
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)
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.
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. */
22 #include <opcode/ia64.h>
27 /* Linux is little endian by default. HPUX is big endian by default. */
29 #define md_number_to_chars number_to_chars_bigendian
30 #define TARGET_BYTES_BIG_ENDIAN 1
32 #define md_number_to_chars number_to_chars_littleendian
33 #define TARGET_BYTES_BIG_ENDIAN 0
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
41 #define HOST_SPECIAL_INIT ia64_init
42 extern void ia64_init
PARAMS ((int, char **));
44 #define TARGET_FORMAT ia64_target_format()
45 extern const char *ia64_target_format
PARAMS ((void));
47 #define TARGET_ARCH bfd_arch_ia64
48 #define DOUBLESLASH_LINE_COMMENTS /* allow //-style comments */
50 #define NEED_LITERAL_POOL /* need gp literal pool */
51 #define RELOC_REQUIRES_SYMBOL
52 #define DIFF_EXPR_OK /* foo-. gets turned into PC relative relocs */
53 #define NEED_INDEX_OPERATOR /* [ ] is index operator */
55 #define QUOTES_IN_INSN /* allow `string "foo;bar"' */
56 #define LEX_AT LEX_NAME /* allow `@' inside name */
57 #define LEX_QM LEX_NAME /* allow `?' inside name */
58 #define LEX_HASH LEX_END_NAME /* allow `#' ending a name */
62 int bigendian
; /* byte order at fix location */
66 extern void ia64_do_align
PARAMS((int n
));
67 extern void ia64_end_of_source
PARAMS((void));
68 extern void ia64_start_line
PARAMS((void));
69 extern int ia64_unrecognized_line
PARAMS((int ch
));
70 extern void ia64_frob_label
PARAMS((struct symbol
*sym
));
71 extern void ia64_flush_pending_output
PARAMS((void));
72 extern int ia64_parse_name (char *name
, expressionS
*e
);
73 extern int ia64_optimize_expr
PARAMS((expressionS
*l
, operatorT op
,
75 extern void ia64_cons_align
PARAMS((int));
76 extern void ia64_flush_insns
PARAMS((void));
77 extern int ia64_fix_adjustable
PARAMS((struct fix
*fix
));
78 extern int ia64_force_relocation
PARAMS((struct fix
*));
79 extern void ia64_cons_fix_new
PARAMS ((fragS
*f
, int where
, int nbytes
,
81 extern void ia64_validate_fix
PARAMS ((struct fix
*fix
));
82 extern char * ia64_canonicalize_symbol_name
PARAMS ((char *));
83 extern int ia64_elf_section_letter
PARAMS ((int, 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 extern void ia64_after_parse_args
PARAMS ((void));
91 #define md_end() ia64_end_of_source ()
92 #define md_start_line_hook() ia64_start_line ()
93 #define tc_unrecognized_line(ch) ia64_unrecognized_line (ch)
94 #define tc_frob_label(s) ia64_frob_label (s)
95 #define md_flush_pending_output() ia64_flush_pending_output ()
96 #define md_parse_name(s,e,c) ia64_parse_name (s, e)
97 #define tc_canonicalize_symbol_name(s) ia64_canonicalize_symbol_name (s)
98 #define md_optimize_expr(l,o,r) ia64_optimize_expr (l, o, r)
99 #define md_cons_align(n) ia64_cons_align (n)
100 #define TC_FORCE_RELOCATION(f) ia64_force_relocation (f)
101 #define tc_fix_adjustable(f) ia64_fix_adjustable (f)
102 #define md_convert_frag(b,s,f) as_fatal ("ia64_convert_frag")
103 #define md_create_long_jump(p,f,t,fr,s) as_fatal ("ia64_create_long_jump")
104 #define md_create_short_jump(p,f,t,fr,s) \
105 as_fatal ("ia64_create_short_jump")
106 #define md_estimate_size_before_relax(f,s) \
107 (as_fatal ("ia64_estimate_size_before_relax"), 1)
108 #define md_elf_section_letter ia64_elf_section_letter
109 #define md_elf_section_flags ia64_elf_section_flags
110 #define TC_FIX_TYPE struct ia64_fix
111 #define TC_INIT_FIX_DATA(f) { f->tc_fix_data.opnd = 0; }
112 #define TC_CONS_FIX_NEW(f,o,l,e) ia64_cons_fix_new (f, o, l, e)
113 #define TC_VALIDATE_FIX(fix,seg,skip) ia64_validate_fix (fix)
114 #define MD_PCREL_FROM_SECTION(fix,sec) ia64_pcrel_from_section (fix, sec)
115 #define md_do_align(n,f,l,m,j) ia64_md_do_align (n,f,l,m)
116 #define HANDLE_ALIGN(f) ia64_handle_align (f)
117 #define md_elf_section_type(str,len) ia64_elf_section_type (str, len)
118 #define md_after_parse_args() ia64_after_parse_args ()
120 #define MAX_MEM_FOR_RS_ALIGN_CODE (15 + 16)
122 #define WORKING_DOT_WORD /* don't do broken word processing for now */
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 },
128 #define DWARF2_LINE_MIN_INSN_LENGTH 1 /* so slot-multipliers can be 1 */
130 /* This is the information required for unwind records in an ia64
131 object file. This is required by GAS and the compiler runtime. */
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
163 /* These are all the various types of unwind records. */
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
,
181 /* These structures declare the fields that can be used in each of the
182 4 record formats, R, P, B and X. */
184 typedef struct unw_r_record
187 unsigned short grmask
;
188 unsigned short grsave
;
189 /* masks to represent the union of save.g, save.f, save.b, and
191 unsigned long imask_size
;
195 unsigned long fr_mem
;
196 unsigned char gr_mem
;
197 unsigned char br_mem
;
201 typedef struct unw_p_record
208 unsigned long pspoff
;
210 unsigned short rmask
;
211 unsigned short grmask
;
212 unsigned long frmask
;
213 unsigned short brmask
;
215 unsigned char context
;
218 typedef struct unw_b_record
222 unsigned short ecount
;
225 typedef struct unw_x_record
229 unsigned long pspoff
;
233 unsigned short ab
; /* Value of the AB field.. */
234 unsigned short xy
; /* Value of the XY field.. */
237 /* This structure is used to determine the specific record type and
239 typedef struct unwind_record
241 unw_record_type type
;
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. */
255 /* If the reloc type is BFD_RELOC_UNUSED, then this is for a TAG13/TAG13b field
256 which has no external reloc, so we must resolve the value now. */
258 #define TC_RELOC_RTSYM_LOC_FIXUP(FIX) \
259 ((FIX)->fx_addsy == NULL \
260 || (FIX)->fx_r_type == BFD_RELOC_UNUSED \
261 || (! S_IS_EXTERNAL ((FIX)->fx_addsy) \
262 && ! S_IS_WEAK ((FIX)->fx_addsy) \
263 && S_IS_DEFINED ((FIX)->fx_addsy) \
264 && ! S_IS_COMMON ((FIX)->fx_addsy)))