tc-ppc.h revision 89857
1258945Sroberto/* tc-ppc.h -- Header file for tc-ppc.c. 2258945Sroberto Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 3258945Sroberto Free Software Foundation, Inc. 4258945Sroberto Written by Ian Lance Taylor, Cygnus Support. 5258945Sroberto 6258945Sroberto This file is part of GAS, the GNU Assembler. 7258945Sroberto 8258945Sroberto GAS is free software; you can redistribute it and/or modify 9258945Sroberto it under the terms of the GNU General Public License as published by 10258945Sroberto the Free Software Foundation; either version 2, or (at your option) 11258945Sroberto any later version. 12280849Scy 13280849Scy GAS is distributed in the hope that it will be useful, 14280849Scy but WITHOUT ANY WARRANTY; without even the implied warranty of 15280849Scy MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16280849Scy GNU General Public License for more details. 17280849Scy 18258945Sroberto You should have received a copy of the GNU General Public License 19258945Sroberto along with GAS; see the file COPYING. If not, write to the Free 20258945Sroberto Software Foundation, 59 Temple Place - Suite 330, Boston, MA 21 02111-1307, USA. */ 22 23#define TC_PPC 24 25#ifdef ANSI_PROTOTYPES 26struct fix; 27#endif 28 29/* Set the endianness we are using. Default to big endian. */ 30#ifndef TARGET_BYTES_BIG_ENDIAN 31#define TARGET_BYTES_BIG_ENDIAN 1 32#endif 33 34#ifndef BFD_ASSEMBLER 35 #error PowerPC support requires BFD_ASSEMBLER 36#endif 37 38/* If OBJ_COFF is defined, and TE_PE is not defined, we are assembling 39 XCOFF for AIX or PowerMac. If TE_PE is defined, we are assembling 40 COFF for Windows NT. */ 41 42#ifdef OBJ_COFF 43#ifndef TE_PE 44#define OBJ_XCOFF 45#endif 46#endif 47 48/* The target BFD architecture. */ 49#define TARGET_ARCH (ppc_arch ()) 50#define TARGET_MACH (ppc_mach ()) 51extern enum bfd_architecture ppc_arch PARAMS ((void)); 52extern unsigned long ppc_mach PARAMS ((void)); 53 54/* Whether or not the target is big endian */ 55extern int target_big_endian; 56 57/* The target BFD format. */ 58#define TARGET_FORMAT (ppc_target_format ()) 59extern char *ppc_target_format PARAMS ((void)); 60 61/* Permit temporary numeric labels. */ 62#define LOCAL_LABELS_FB 1 63 64/* $ is used to refer to the current location. */ 65#define DOLLAR_DOT 66 67/* Strings do not use backslash escapes under COFF. */ 68#ifdef OBJ_COFF 69#define NO_STRING_ESCAPES 70#endif 71 72#ifdef OBJ_ELF 73#define DIFF_EXPR_OK /* foo-. gets turned into PC relative relocs */ 74#endif 75 76#if TARGET_BYTES_BIG_ENDIAN 77#define PPC_BIG_ENDIAN 1 78#else 79#define PPC_BIG_ENDIAN 0 80#endif 81 82/* We don't need to handle .word strangely. */ 83#define WORKING_DOT_WORD 84 85#define MAX_MEM_FOR_RS_ALIGN_CODE 4 86#define HANDLE_ALIGN(FRAGP) \ 87 if ((FRAGP)->fr_type == rs_align_code) \ 88 { \ 89 valueT count = ((FRAGP)->fr_next->fr_address \ 90 - ((FRAGP)->fr_address + (FRAGP)->fr_fix)); \ 91 if (count != 0 && (count & 3) == 0) \ 92 { \ 93 unsigned char *dest = (FRAGP)->fr_literal + (FRAGP)->fr_fix; \ 94 \ 95 (FRAGP)->fr_var = 4; \ 96 if (target_big_endian) \ 97 { \ 98 *dest++ = 0x60; \ 99 *dest++ = 0; \ 100 *dest++ = 0; \ 101 *dest++ = 0; \ 102 } \ 103 else \ 104 { \ 105 *dest++ = 0; \ 106 *dest++ = 0; \ 107 *dest++ = 0; \ 108 *dest++ = 0x60; \ 109 } \ 110 } \ 111 } 112 113 114#ifdef TE_PE 115 116/* Question marks are permitted in symbol names. */ 117#define LEX_QM 1 118 119/* Don't adjust TOC relocs. */ 120#define tc_fix_adjustable(fixp) ppc_pe_fix_adjustable (fixp) 121extern int ppc_pe_fix_adjustable PARAMS ((struct fix *)); 122 123#endif 124 125#ifdef OBJ_XCOFF 126 127/* Declarations needed when generating XCOFF code. XCOFF is an 128 extension of COFF, used only on the RS/6000. Rather than create an 129 obj-xcoff, we just use obj-coff, and handle the extensions here in 130 tc-ppc. */ 131 132/* We need to keep some information for symbols. */ 133struct ppc_tc_sy 134{ 135 /* We keep a few linked lists of symbols. */ 136 symbolS *next; 137 /* Non-zero if the symbol should be output. The RS/6000 assembler 138 only outputs symbols that are external or are mentioned in a 139 .globl or .lglobl statement. */ 140 int output; 141 /* The symbol class. */ 142 int class; 143 /* The real name, if the symbol was renamed. */ 144 char *real_name; 145 /* For a csect symbol, the subsegment we are using. This is zero 146 for symbols that are not csects. */ 147 subsegT subseg; 148 /* For a csect or common symbol, the alignment to use. */ 149 int align; 150 /* For a function symbol, a symbol whose value is the size. The 151 field is NULL if there is no size. */ 152 symbolS *size; 153 /* For a csect symbol, the last symbol which has been defined in 154 this csect, or NULL if none have been defined so far. For a .bs 155 symbol, the referenced csect symbol. */ 156 symbolS *within; 157}; 158 159#define TC_SYMFIELD_TYPE struct ppc_tc_sy 160 161/* We need an additional auxent for function symbols. */ 162#define OBJ_COFF_MAX_AUXENTRIES 2 163 164/* Square and curly brackets are permitted in symbol names. */ 165#define LEX_BR 3 166 167/* Canonicalize the symbol name. */ 168#define tc_canonicalize_symbol_name(name) ppc_canonicalize_symbol_name (name) 169extern char *ppc_canonicalize_symbol_name PARAMS ((char *)); 170 171/* Get the symbol class from the name. */ 172#define tc_symbol_new_hook(sym) ppc_symbol_new_hook (sym) 173extern void ppc_symbol_new_hook PARAMS ((symbolS *)); 174 175/* Set the symbol class of a label based on the csect. */ 176#define tc_frob_label(sym) ppc_frob_label (sym) 177extern void ppc_frob_label PARAMS ((symbolS *)); 178 179/* TOC relocs requires special handling. */ 180#define tc_fix_adjustable(fixp) ppc_fix_adjustable (fixp) 181extern int ppc_fix_adjustable PARAMS ((struct fix *)); 182 183/* A relocation from one csect to another must be kept. */ 184#define TC_FORCE_RELOCATION(FIXP) ppc_force_relocation (FIXP) 185extern int ppc_force_relocation PARAMS ((struct fix *)); 186 187/* We need to set the section VMA. */ 188#define tc_frob_section(sec) ppc_frob_section (sec) 189extern void ppc_frob_section PARAMS ((asection *)); 190 191/* Finish up the symbol. */ 192#define tc_frob_symbol(sym, punt) punt = ppc_frob_symbol (sym) 193extern int ppc_frob_symbol PARAMS ((symbolS *)); 194 195/* Finish up the entire symtab. */ 196#define tc_adjust_symtab() ppc_adjust_symtab () 197extern void ppc_adjust_symtab PARAMS ((void)); 198 199/* Niclas Andersson <nican@ida.liu.se> says this is needed. */ 200extern int ppc_subseg_align PARAMS ((void)); 201#define SUB_SEGMENT_ALIGN(SEG) ppc_subseg_align() 202 203/* We also need to copy, in particular, the class of the symbol, 204 over what obj-coff would otherwise have copied. */ 205#define OBJ_COPY_SYMBOL_ATTRIBUTES(dest,src) \ 206do { \ 207 if (SF_GET_GET_SEGMENT (dest)) \ 208 S_SET_SEGMENT (dest, S_GET_SEGMENT (src)); \ 209 symbol_get_tc (dest)->size = symbol_get_tc (src)->size; \ 210 symbol_get_tc (dest)->align = symbol_get_tc (src)->align; \ 211 symbol_get_tc (dest)->class = symbol_get_tc (src)->class; \ 212 symbol_get_tc (dest)->within = symbol_get_tc (src)->within; \ 213} while (0) 214 215#endif /* OBJ_XCOFF */ 216 217#ifdef OBJ_ELF 218 219/* Branch prediction relocations must force relocation, as must 220 the vtable description relocs. */ 221#define TC_FORCE_RELOCATION(FIXP) \ 222((FIXP)->fx_r_type == BFD_RELOC_PPC_B16_BRTAKEN \ 223 || (FIXP)->fx_r_type == BFD_RELOC_PPC_B16_BRNTAKEN \ 224 || (FIXP)->fx_r_type == BFD_RELOC_PPC_BA16_BRTAKEN \ 225 || (FIXP)->fx_r_type == BFD_RELOC_PPC_BA16_BRNTAKEN \ 226 || (BFD_DEFAULT_TARGET_SIZE == 64 \ 227 && (FIXP)->fx_r_type == BFD_RELOC_PPC64_TOC) \ 228 || (FIXP)->fx_r_type == BFD_RELOC_VTABLE_INHERIT \ 229 || (FIXP)->fx_r_type == BFD_RELOC_VTABLE_ENTRY) 230 231#define TC_FORCE_RELOCATION_SECTION(FIXP,SEC) \ 232(TC_FORCE_RELOCATION (FIXP) \ 233 || ((FIXP)->fx_addsy && !(FIXP)->fx_subsy \ 234 && S_GET_SEGMENT ((FIXP)->fx_addsy) != SEC)) 235 236/* Support for SHF_EXCLUDE and SHT_ORDERED */ 237extern int ppc_section_letter PARAMS ((int, char **)); 238extern int ppc_section_type PARAMS ((char *, size_t)); 239extern int ppc_section_word PARAMS ((char *, size_t)); 240extern int ppc_section_flags PARAMS ((int, int, int)); 241 242#define md_elf_section_letter(LETTER, PTR_MSG) ppc_section_letter (LETTER, PTR_MSG) 243#define md_elf_section_type(STR, LEN) ppc_section_type (STR, LEN) 244#define md_elf_section_word(STR, LEN) ppc_section_word (STR, LEN) 245#define md_elf_section_flags(FLAGS, ATTR, TYPE) ppc_section_flags (FLAGS, ATTR, TYPE) 246 247#if BFD_DEFAULT_TARGET_SIZE == 64 248/* Extra sections for 64-bit ELF PPC. */ 249#define ELF_TC_SPECIAL_SECTIONS \ 250 { ".toc", SHT_PROGBITS, SHF_ALLOC + SHF_WRITE}, \ 251 { ".tocbss", SHT_NOBITS, SHF_ALLOC + SHF_WRITE}, 252#else 253/* Add extra PPC sections -- Note, for now, make .sbss2 and .PPC.EMB.sbss0 a 254 normal section, and not a bss section so that the linker doesn't crater 255 when trying to make more than 2 sections. */ 256#define ELF_TC_SPECIAL_SECTIONS \ 257 { ".tags", SHT_ORDERED, SHF_ALLOC }, \ 258 { ".sdata", SHT_PROGBITS, SHF_ALLOC + SHF_WRITE }, \ 259 { ".sbss", SHT_NOBITS, SHF_ALLOC + SHF_WRITE }, \ 260 { ".sdata2", SHT_PROGBITS, SHF_ALLOC }, \ 261 { ".sbss2", SHT_PROGBITS, SHF_ALLOC }, \ 262 { ".PPC.EMB.sdata0", SHT_PROGBITS, SHF_ALLOC }, \ 263 { ".PPC.EMB.sbss0", SHT_PROGBITS, SHF_ALLOC }, 264#endif 265 266#define tc_comment_chars ppc_comment_chars 267extern const char *ppc_comment_chars; 268 269/* Keep relocations relative to the GOT, or non-PC relative. */ 270#define tc_fix_adjustable(fixp) ppc_fix_adjustable (fixp) 271extern int ppc_fix_adjustable PARAMS ((struct fix *)); 272 273/* We must never ever try to resolve references to externally visible 274 symbols in the assembler, because the .o file might go into a shared 275 library, and some other shared library might override that symbol. */ 276#define TC_RELOC_RTSYM_LOC_FIXUP(FIX) \ 277 ((FIX)->fx_addsy == NULL \ 278 || (! S_IS_EXTERNAL ((FIX)->fx_addsy) \ 279 && ! S_IS_WEAK ((FIX)->fx_addsy) \ 280 && S_IS_DEFINED ((FIX)->fx_addsy) \ 281 && ! S_IS_COMMON ((FIX)->fx_addsy))) 282 283#if BFD_DEFAULT_TARGET_SIZE == 64 284/* Finish up the symbol. */ 285#define tc_frob_symbol(sym, punt) punt = ppc_elf_frob_symbol (sym) 286extern int ppc_elf_frob_symbol PARAMS ((symbolS *)); 287#endif 288 289#define DWARF2_LINE_MIN_INSN_LENGTH 4 290#endif /* OBJ_ELF */ 291 292/* call md_pcrel_from_section, not md_pcrel_from */ 293#define MD_PCREL_FROM_SECTION(FIXP, SEC) md_pcrel_from_section(FIXP, SEC) 294extern long md_pcrel_from_section PARAMS ((struct fix *, segT)); 295 296#define md_parse_name(name, exp, c) ppc_parse_name (name, exp) 297extern int ppc_parse_name PARAMS ((const char *, struct expressionS *)); 298 299#define md_operand(x) 300