1 /* tc-ppc.h -- Header file for tc-ppc.c. 2 Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 3 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. 4 Written by Ian Lance Taylor, Cygnus Support. 5 6 This file is part of GAS, the GNU Assembler. 7 8 GAS is free software; you can redistribute it and/or modify 9 it under the terms of the GNU General Public License as published by 10 the Free Software Foundation; either version 3, or (at your option) 11 any later version. 12 13 GAS is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU General Public License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with GAS; see the file COPYING. If not, write to the Free 20 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 21 02110-1301, USA. */ 22 23 #define TC_PPC 24 25 #include "opcode/ppc.h" 26 27 struct fix; 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 /* If OBJ_COFF is defined, and TE_PE is not defined, we are assembling 35 XCOFF for AIX or PowerMac. If TE_PE is defined, we are assembling 36 COFF for Windows NT. */ 37 38 #ifdef OBJ_COFF 39 #ifndef TE_PE 40 #define OBJ_XCOFF 41 #endif 42 #endif 43 44 /* The target BFD architecture. */ 45 #define TARGET_ARCH (ppc_arch ()) 46 #define TARGET_MACH (ppc_mach ()) 47 extern enum bfd_architecture ppc_arch (void); 48 extern unsigned long ppc_mach (void); 49 50 /* Whether or not the target is big endian */ 51 extern int target_big_endian; 52 53 /* The target BFD format. */ 54 #define TARGET_FORMAT (ppc_target_format ()) 55 extern char *ppc_target_format (void); 56 57 /* Permit temporary numeric labels. */ 58 #define LOCAL_LABELS_FB 1 59 60 /* $ is used to refer to the current location. */ 61 #define DOLLAR_DOT 62 63 /* Strings do not use backslash escapes under COFF. */ 64 #ifdef OBJ_COFF 65 #define NO_STRING_ESCAPES 66 #endif 67 68 #ifdef OBJ_ELF 69 #define DIFF_EXPR_OK /* foo-. gets turned into PC relative relocs */ 70 #endif 71 72 #if TARGET_BYTES_BIG_ENDIAN 73 #define PPC_BIG_ENDIAN 1 74 #else 75 #define PPC_BIG_ENDIAN 0 76 #endif 77 78 /* We don't need to handle .word strangely. */ 79 #define WORKING_DOT_WORD 80 81 #define MAX_MEM_FOR_RS_ALIGN_CODE 4 82 #define HANDLE_ALIGN(FRAGP) \ 83 if ((FRAGP)->fr_type == rs_align_code) \ 84 ppc_handle_align (FRAGP); 85 86 extern void ppc_handle_align (struct frag *); 87 88 #define SUB_SEGMENT_ALIGN(SEG, FRCHAIN) 0 89 90 #define md_frag_check(FRAGP) \ 91 if ((FRAGP)->has_code \ 92 && (((FRAGP)->fr_address + (FRAGP)->insn_addr) & 3) != 0) \ 93 as_bad_where ((FRAGP)->fr_file, (FRAGP)->fr_line, \ 94 _("instruction address is not a multiple of 4")); 95 96 /* Arrange to store the value of ppc_cpu at the site of a fixup 97 for later use in md_apply_fix. */ 98 struct _ppc_fix_extra 99 { 100 ppc_cpu_t ppc_cpu; 101 }; 102 103 extern ppc_cpu_t ppc_cpu; 104 105 #define TC_FIX_TYPE struct _ppc_fix_extra 106 #define TC_INIT_FIX_DATA(FIXP) \ 107 do { (FIXP)->tc_fix_data.ppc_cpu = ppc_cpu; } while (0) 108 109 #ifdef TE_PE 110 111 /* Question marks are permitted in symbol names. */ 112 #define LEX_QM 1 113 114 /* Don't adjust TOC relocs. */ 115 #define tc_fix_adjustable(FIX) ppc_pe_fix_adjustable (FIX) 116 extern int ppc_pe_fix_adjustable (struct fix *); 117 118 #endif 119 120 #ifdef OBJ_XCOFF 121 122 /* Declarations needed when generating XCOFF code. XCOFF is an 123 extension of COFF, used only on the RS/6000. Rather than create an 124 obj-xcoff, we just use obj-coff, and handle the extensions here in 125 tc-ppc. */ 126 127 /* We need to keep some information for symbols. */ 128 struct ppc_tc_sy 129 { 130 /* We keep a few linked lists of symbols. */ 131 symbolS *next; 132 /* Non-zero if the symbol should be output. The RS/6000 assembler 133 only outputs symbols that are external or are mentioned in a 134 .globl or .lglobl statement. */ 135 int output; 136 /* The symbol class. */ 137 int class; 138 /* The real name, if the symbol was renamed. */ 139 char *real_name; 140 /* For a csect symbol, the subsegment we are using. This is zero 141 for symbols that are not csects. */ 142 subsegT subseg; 143 /* For a csect or common symbol, the alignment to use. */ 144 int align; 145 /* For a function symbol, a symbol whose value is the size. The 146 field is NULL if there is no size. */ 147 symbolS *size; 148 /* For a csect symbol, the last symbol which has been defined in 149 this csect, or NULL if none have been defined so far. For a .bs 150 symbol, the referenced csect symbol. */ 151 symbolS *within; 152 }; 153 154 #define TC_SYMFIELD_TYPE struct ppc_tc_sy 155 156 /* We need an additional auxent for function symbols. */ 157 #define OBJ_COFF_MAX_AUXENTRIES 2 158 159 /* Square and curly brackets are permitted in symbol names. */ 160 #define LEX_BR 3 161 162 /* Canonicalize the symbol name. */ 163 #define tc_canonicalize_symbol_name(name) ppc_canonicalize_symbol_name (name) 164 extern char *ppc_canonicalize_symbol_name (char *); 165 166 /* Get the symbol class from the name. */ 167 #define tc_symbol_new_hook(sym) ppc_symbol_new_hook (sym) 168 extern void ppc_symbol_new_hook (symbolS *); 169 170 /* Set the symbol class of a label based on the csect. */ 171 #define tc_frob_label(sym) ppc_frob_label (sym) 172 extern void ppc_frob_label (symbolS *); 173 174 /* TOC relocs requires special handling. */ 175 #define tc_fix_adjustable(FIX) ppc_fix_adjustable (FIX) 176 extern int ppc_fix_adjustable (struct fix *); 177 178 /* We need to set the section VMA. */ 179 #define tc_frob_section(sec) ppc_frob_section (sec) 180 extern void ppc_frob_section (asection *); 181 182 /* Finish up the symbol. */ 183 #define tc_frob_symbol(sym, punt) punt = ppc_frob_symbol (sym) 184 extern int ppc_frob_symbol (symbolS *); 185 186 /* Finish up the entire symtab. */ 187 #define tc_adjust_symtab() ppc_adjust_symtab () 188 extern void ppc_adjust_symtab (void); 189 190 /* We also need to copy, in particular, the class of the symbol, 191 over what obj-coff would otherwise have copied. */ 192 #define OBJ_COPY_SYMBOL_ATTRIBUTES(dest,src) \ 193 do { \ 194 if (SF_GET_GET_SEGMENT (dest)) \ 195 S_SET_SEGMENT (dest, S_GET_SEGMENT (src)); \ 196 symbol_get_tc (dest)->size = symbol_get_tc (src)->size; \ 197 symbol_get_tc (dest)->align = symbol_get_tc (src)->align; \ 198 symbol_get_tc (dest)->class = symbol_get_tc (src)->class; \ 199 symbol_get_tc (dest)->within = symbol_get_tc (src)->within; \ 200 } while (0) 201 202 #endif /* OBJ_XCOFF */ 203 204 extern const char ppc_symbol_chars[]; 205 #define tc_symbol_chars ppc_symbol_chars 206 207 #ifdef OBJ_ELF 208 209 /* Support for SHF_EXCLUDE and SHT_ORDERED */ 210 extern int ppc_section_letter (int, char **); 211 extern int ppc_section_type (char *, size_t); 212 extern int ppc_section_word (char *, size_t); 213 extern int ppc_section_flags (int, int, int); 214 215 #define md_elf_section_letter(LETTER, PTR_MSG) ppc_section_letter (LETTER, PTR_MSG) 216 #define md_elf_section_type(STR, LEN) ppc_section_type (STR, LEN) 217 #define md_elf_section_word(STR, LEN) ppc_section_word (STR, LEN) 218 #define md_elf_section_flags(FLAGS, ATTR, TYPE) ppc_section_flags (FLAGS, ATTR, TYPE) 219 220 #define tc_comment_chars ppc_comment_chars 221 extern const char *ppc_comment_chars; 222 223 /* Keep relocations relative to the GOT, or non-PC relative. */ 224 #define tc_fix_adjustable(FIX) ppc_fix_adjustable (FIX) 225 extern int ppc_fix_adjustable (struct fix *); 226 227 /* Values passed to md_apply_fix don't include symbol values. */ 228 #define MD_APPLY_SYM_VALUE(FIX) 0 229 230 #define tc_frob_file_before_adjust ppc_frob_file_before_adjust 231 extern void ppc_frob_file_before_adjust (void); 232 233 #endif /* OBJ_ELF */ 234 235 #if defined (OBJ_ELF) || defined (OBJ_XCOFF) 236 #define TC_FORCE_RELOCATION(FIX) ppc_force_relocation (FIX) 237 extern int ppc_force_relocation (struct fix *); 238 #endif 239 240 /* call md_pcrel_from_section, not md_pcrel_from */ 241 #define MD_PCREL_FROM_SECTION(FIX, SEC) md_pcrel_from_section(FIX, SEC) 242 extern long md_pcrel_from_section (struct fix *, segT); 243 244 #define md_parse_name(name, exp, mode, c) ppc_parse_name (name, exp) 245 extern int ppc_parse_name (const char *, struct expressionS *); 246 247 #define md_operand(x) 248 249 #define md_cleanup() ppc_cleanup () 250 extern void ppc_cleanup (void); 251 252 #define TARGET_USE_CFIPOP 1 253 254 #define tc_cfi_frame_initial_instructions ppc_cfi_frame_initial_instructions 255 extern void ppc_cfi_frame_initial_instructions (void); 256 257 #define tc_regname_to_dw2regnum tc_ppc_regname_to_dw2regnum 258 extern int tc_ppc_regname_to_dw2regnum (char *); 259 260 extern int ppc_cie_data_alignment; 261 262 #define DWARF2_LINE_MIN_INSN_LENGTH 4 263 #define DWARF2_DEFAULT_RETURN_COLUMN 0x41 264 #define DWARF2_CIE_DATA_ALIGNMENT ppc_cie_data_alignment 265