tc-ia64.h revision 94536
1295367Sdes/* 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{ ".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 167typedef 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 186typedef 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 203typedef 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 220typedef struct unw_b_record 221{ 222 unsigned long t; 223 unsigned long label; 224 unsigned short ecount; 225} unw_b_record; 226 227typedef 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. */ 241typedef 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))) 267