linux64.h revision 117395
1/* Definitions of target machine for GNU compiler, 2 for 64 bit PowerPC linux. 3 Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc. 4 5This file is part of GNU CC. 6 7GNU CC is free software; you can redistribute it and/or modify 8it under the terms of the GNU General Public License as published by 9the Free Software Foundation; either version 2, or (at your option) 10any later version. 11 12GNU CC is distributed in the hope that it will be useful, 13but WITHOUT ANY WARRANTY; without even the implied warranty of 14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15GNU General Public License for more details. 16 17You should have received a copy of the GNU General Public License 18along with GNU CC; see the file COPYING. If not, write to 19the Free Software Foundation, 59 Temple Place - Suite 330, 20Boston, MA 02111-1307, USA. */ 21 22/* Yes! We are AIX! Err. Wait. We're Linux!. No, wait, we're a 23 combo of both!*/ 24#undef DEFAULT_ABI 25#define DEFAULT_ABI ABI_AIX 26 27#undef TARGET_AIX 28#define TARGET_AIX 1 29 30#undef TARGET_DEFAULT 31#define TARGET_DEFAULT \ 32 (MASK_POWERPC | MASK_POWERPC64 | MASK_64BIT | MASK_NEW_MNEMONICS) 33 34#undef PROCESSOR_DEFAULT 35#define PROCESSOR_DEFAULT PROCESSOR_PPC630 36#undef PROCESSOR_DEFAULT64 37#define PROCESSOR_DEFAULT64 PROCESSOR_PPC630 38 39#undef ASM_DEFAULT_SPEC 40#define ASM_DEFAULT_SPEC "-mppc64" 41 42#undef ASM_SPEC 43#define ASM_SPEC "%{.s: %{mregnames} %{mno-regnames}} \ 44%{.S: %{mregnames} %{mno-regnames}} \ 45%{mlittle} %{mlittle-endian} %{mbig} %{mbig-endian} \ 46%{v:-V} %{Qy:} %{!Qn:-Qy} -a64 %(asm_cpu) %{Wa,*:%*}" 47 48/* 64-bit PowerPC Linux always has a TOC. */ 49#undef TARGET_NO_TOC 50#define TARGET_NO_TOC 0 51#undef TARGET_TOC 52#define TARGET_TOC 1 53 54/* We use glibc _mcount for profiling. */ 55#define NO_PROFILE_COUNTERS 1 56#undef PROFILE_BEFORE_PROLOGUE 57 58/* Define this for kernel profiling, which just saves LR then calls 59 _mcount without worrying about arg saves. The idea is to change 60 the function prologue as little as possible as it isn't easy to 61 account for arg save/restore code added just for _mcount. */ 62/* #define PROFILE_KERNEL 1 */ 63#if PROFILE_KERNEL 64#define PROFILE_BEFORE_PROLOGUE 1 65#undef PROFILE_HOOK 66#else 67#define PROFILE_HOOK(LABEL) output_profile_hook (LABEL) 68#endif 69 70/* We don't need to generate entries in .fixup. */ 71#undef RELOCATABLE_NEEDS_FIXUP 72 73#define USER_LABEL_PREFIX "" 74 75/* AIX word-aligns FP doubles but doubleword-aligns 64-bit ints. */ 76#undef ADJUST_FIELD_ALIGN 77#define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \ 78 (TYPE_MODE (TREE_CODE (TREE_TYPE (FIELD)) == ARRAY_TYPE \ 79 ? get_inner_array_type (FIELD) \ 80 : TREE_TYPE (FIELD)) == DFmode \ 81 ? MIN ((COMPUTED), 32) : (COMPUTED)) 82 83/* AIX increases natural record alignment to doubleword if the first 84 field is an FP double while the FP fields remain word aligned. */ 85#undef ROUND_TYPE_ALIGN 86#define ROUND_TYPE_ALIGN(STRUCT, COMPUTED, SPECIFIED) \ 87 ((TREE_CODE (STRUCT) == RECORD_TYPE \ 88 || TREE_CODE (STRUCT) == UNION_TYPE \ 89 || TREE_CODE (STRUCT) == QUAL_UNION_TYPE) \ 90 && TYPE_FIELDS (STRUCT) != 0 \ 91 && DECL_MODE (TYPE_FIELDS (STRUCT)) == DFmode \ 92 ? MAX (MAX ((COMPUTED), (SPECIFIED)), 64) \ 93 : MAX ((COMPUTED), (SPECIFIED))) 94 95/* Indicate that jump tables go in the text section. */ 96#undef JUMP_TABLES_IN_TEXT_SECTION 97#define JUMP_TABLES_IN_TEXT_SECTION 1 98 99/* 64-bit PowerPC Linux always has GPR13 fixed. */ 100#define FIXED_R13 1 101 102/* __throw will restore its own return address to be the same as the 103 return address of the function that the throw is being made to. 104 This is unfortunate, because we want to check the original 105 return address to see if we need to restore the TOC. 106 So we have to squirrel it away with this. */ 107#define SETUP_FRAME_ADDRESSES() rs6000_aix_emit_builtin_unwind_init () 108 109/* Override svr4.h */ 110#undef MD_EXEC_PREFIX 111#undef MD_STARTFILE_PREFIX 112 113#undef TARGET_OS_CPP_BUILTINS 114#define TARGET_OS_CPP_BUILTINS() \ 115 do \ 116 { \ 117 builtin_define ("__PPC__"); \ 118 builtin_define ("__PPC64__"); \ 119 builtin_define ("__powerpc__"); \ 120 builtin_define ("__powerpc64__"); \ 121 builtin_define ("__PIC__"); \ 122 builtin_define ("__ELF__"); \ 123 builtin_assert ("cpu=powerpc64"); \ 124 builtin_assert ("machine=powerpc64"); \ 125 } \ 126 while (0) 127 128#undef CPP_OS_DEFAULT_SPEC 129#define CPP_OS_DEFAULT_SPEC "%(cpp_os_linux)" 130 131/* The GNU C++ standard library currently requires _GNU_SOURCE being 132 defined on glibc-based systems. This temporary hack accomplishes this, 133 it should go away as soon as libstdc++-v3 has a real fix. */ 134#undef CPLUSPLUS_CPP_SPEC 135#define CPLUSPLUS_CPP_SPEC "-D_GNU_SOURCE %(cpp)" 136 137#undef LINK_SHLIB_SPEC 138#define LINK_SHLIB_SPEC "%{shared:-shared} %{!shared: %{static:-static}}" 139 140#undef LIB_DEFAULT_SPEC 141#define LIB_DEFAULT_SPEC "%(lib_linux)" 142 143#undef STARTFILE_DEFAULT_SPEC 144#define STARTFILE_DEFAULT_SPEC "%(startfile_linux)" 145 146#undef ENDFILE_DEFAULT_SPEC 147#define ENDFILE_DEFAULT_SPEC "%(endfile_linux)" 148 149#undef LINK_START_DEFAULT_SPEC 150#define LINK_START_DEFAULT_SPEC "%(link_start_linux)" 151 152#undef LINK_OS_DEFAULT_SPEC 153#define LINK_OS_DEFAULT_SPEC "%(link_os_linux)" 154 155#undef LINK_OS_LINUX_SPEC 156#define LINK_OS_LINUX_SPEC "-m elf64ppc %{!shared: %{!static: \ 157 %{rdynamic:-export-dynamic} \ 158 %{!dynamic-linker:-dynamic-linker /lib64/ld64.so.1}}}" 159 160#ifdef NATIVE_CROSS 161#define STARTFILE_PREFIX_SPEC "/usr/local/lib64/ /lib64/ /usr/lib64/" 162#endif 163 164#undef STARTFILE_LINUX_SPEC 165#define STARTFILE_LINUX_SPEC "\ 166%{!shared: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:crt1.o%s}}} crti.o%s \ 167%{static:crtbeginT.o%s} \ 168%{!static:%{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}}" 169 170#undef ENDFILE_LINUX_SPEC 171#define ENDFILE_LINUX_SPEC "\ 172%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s" 173 174#undef TOC_SECTION_ASM_OP 175#define TOC_SECTION_ASM_OP "\t.section\t\".toc\",\"aw\"" 176 177#undef MINIMAL_TOC_SECTION_ASM_OP 178#define MINIMAL_TOC_SECTION_ASM_OP "\t.section\t\".toc1\",\"aw\"" 179 180#undef TARGET_VERSION 181#define TARGET_VERSION fprintf (stderr, " (PowerPC64 GNU/Linux)"); 182 183/* Must be at least as big as our pointer type. */ 184#undef SIZE_TYPE 185#define SIZE_TYPE "long unsigned int" 186 187#undef PTRDIFF_TYPE 188#define PTRDIFF_TYPE "long int" 189 190#undef WCHAR_TYPE 191#define WCHAR_TYPE "int" 192#undef WCHAR_TYPE_SIZE 193#define WCHAR_TYPE_SIZE 32 194 195/* Override rs6000.h definition. */ 196#undef ASM_APP_ON 197#define ASM_APP_ON "#APP\n" 198 199/* Override rs6000.h definition. */ 200#undef ASM_APP_OFF 201#define ASM_APP_OFF "#NO_APP\n" 202 203/* PowerPC no-op instruction. */ 204#undef RS6000_CALL_GLUE 205#define RS6000_CALL_GLUE "nop" 206 207#undef RS6000_MCOUNT 208#define RS6000_MCOUNT "_mcount" 209 210#ifdef __powerpc64__ 211/* _init and _fini functions are built from bits spread across many 212 object files, each potentially with a different TOC pointer. For 213 that reason, place a nop after the call so that the linker can 214 restore the TOC pointer if a TOC adjusting call stub is needed. */ 215#define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC) \ 216 asm (SECTION_OP "\n" \ 217" bl ." #FUNC "\n" \ 218" nop\n" \ 219" .previous"); 220#endif 221 222/* FP save and restore routines. */ 223#undef SAVE_FP_PREFIX 224#define SAVE_FP_PREFIX "._savef" 225#undef SAVE_FP_SUFFIX 226#define SAVE_FP_SUFFIX "" 227#undef RESTORE_FP_PREFIX 228#define RESTORE_FP_PREFIX "._restf" 229#undef RESTORE_FP_SUFFIX 230#define RESTORE_FP_SUFFIX "" 231 232/* Dwarf2 debugging. */ 233#undef PREFERRED_DEBUGGING_TYPE 234#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG 235 236#undef TARGET_ENCODE_SECTION_INFO 237#define TARGET_ENCODE_SECTION_INFO rs6000_xcoff_encode_section_info 238 239/* This is how to output a reference to a user-level label named NAME. 240 `assemble_name' uses this. */ 241 242/* Override elfos.h definition. */ 243#undef ASM_OUTPUT_LABELREF 244#define ASM_OUTPUT_LABELREF(FILE,NAME) \ 245do { \ 246 const char *_name = NAME; \ 247 if (*_name == '@') \ 248 _name++; \ 249 \ 250 if (*_name == '*') \ 251 fprintf (FILE, "%s", _name + 1); \ 252 else \ 253 asm_fprintf (FILE, "%U%s", _name); \ 254} while (0) 255 256#undef ASM_DECLARE_FUNCTION_NAME 257#define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \ 258 do \ 259 { \ 260 fputs ("\t.section\t\".opd\",\"aw\"\n\t.align 3\n", (FILE)); \ 261 ASM_OUTPUT_LABEL ((FILE), (NAME)); \ 262 fputs (DOUBLE_INT_ASM_OP, (FILE)); \ 263 putc ('.', (FILE)); \ 264 assemble_name ((FILE), (NAME)); \ 265 fputs (",.TOC.@tocbase,0\n\t.previous\n\t.size\t", (FILE)); \ 266 assemble_name ((FILE), (NAME)); \ 267 fputs (",24\n\t.type\t.", (FILE)); \ 268 assemble_name ((FILE), (NAME)); \ 269 fputs (",@function\n", (FILE)); \ 270 if (TREE_PUBLIC (DECL) && ! DECL_WEAK (DECL)) \ 271 { \ 272 fputs ("\t.globl\t.", (FILE)); \ 273 assemble_name ((FILE), (NAME)); \ 274 putc ('\n', (FILE)); \ 275 } \ 276 ASM_DECLARE_RESULT ((FILE), DECL_RESULT (DECL)); \ 277 putc ('.', (FILE)); \ 278 ASM_OUTPUT_LABEL ((FILE), (NAME)); \ 279 } \ 280 while (0) 281 282/* This is how to declare the size of a function. */ 283#undef ASM_DECLARE_FUNCTION_SIZE 284#define ASM_DECLARE_FUNCTION_SIZE(FILE, FNAME, DECL) \ 285 do \ 286 { \ 287 if (!flag_inhibit_size_directive) \ 288 { \ 289 fputs ("\t.size\t.", (FILE)); \ 290 assemble_name ((FILE), (FNAME)); \ 291 fputs (",.-.", (FILE)); \ 292 assemble_name ((FILE), (FNAME)); \ 293 putc ('\n', (FILE)); \ 294 } \ 295 } \ 296 while (0) 297 298/* Return nonzero if this entry is to be written into the constant 299 pool in a special way. We do so if this is a SYMBOL_REF, LABEL_REF 300 or a CONST containing one of them. If -mfp-in-toc (the default), 301 we also do this for floating-point constants. We actually can only 302 do this if the FP formats of the target and host machines are the 303 same, but we can't check that since not every file that uses 304 GO_IF_LEGITIMATE_ADDRESS_P includes real.h. We also do this when 305 we can write the entry into the TOC and the entry is not larger 306 than a TOC entry. */ 307 308#undef ASM_OUTPUT_SPECIAL_POOL_ENTRY_P 309#define ASM_OUTPUT_SPECIAL_POOL_ENTRY_P(X, MODE) \ 310 (TARGET_TOC \ 311 && (GET_CODE (X) == SYMBOL_REF \ 312 || (GET_CODE (X) == CONST && GET_CODE (XEXP (X, 0)) == PLUS \ 313 && GET_CODE (XEXP (XEXP (X, 0), 0)) == SYMBOL_REF) \ 314 || GET_CODE (X) == LABEL_REF \ 315 || (GET_CODE (X) == CONST_INT \ 316 && GET_MODE_BITSIZE (MODE) <= GET_MODE_BITSIZE (Pmode)) \ 317 || (GET_CODE (X) == CONST_DOUBLE \ 318 && (TARGET_POWERPC64 \ 319 || TARGET_MINIMAL_TOC \ 320 || (GET_MODE_CLASS (GET_MODE (X)) == MODE_FLOAT \ 321 && ! TARGET_NO_FP_IN_TOC))))) 322 323/* This is the same as the dbxelf.h version, except that we need to 324 use the function code label, not the function descriptor. */ 325#undef ASM_OUTPUT_SOURCE_LINE 326#define ASM_OUTPUT_SOURCE_LINE(FILE, LINE) \ 327do \ 328 { \ 329 static int sym_lineno = 1; \ 330 char temp[256]; \ 331 ASM_GENERATE_INTERNAL_LABEL (temp, "LM", sym_lineno); \ 332 fprintf (FILE, "\t.stabn 68,0,%d,", LINE); \ 333 assemble_name (FILE, temp); \ 334 fputs ("-.", FILE); \ 335 assemble_name (FILE, \ 336 XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0));\ 337 putc ('\n', FILE); \ 338 ASM_OUTPUT_INTERNAL_LABEL (FILE, "LM", sym_lineno); \ 339 sym_lineno += 1; \ 340 } \ 341while (0) 342 343/* Similarly, we want the function code label here. */ 344#define DBX_OUTPUT_BRAC(FILE, NAME, BRAC) \ 345 do \ 346 { \ 347 const char *flab; \ 348 fprintf (FILE, "%s%d,0,0,", ASM_STABN_OP, BRAC); \ 349 assemble_name (FILE, NAME); \ 350 putc ('-', FILE); \ 351 if (current_function_func_begin_label != NULL_TREE) \ 352 flab = IDENTIFIER_POINTER (current_function_func_begin_label); \ 353 else \ 354 { \ 355 putc ('.', FILE); \ 356 flab = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0); \ 357 } \ 358 assemble_name (FILE, flab); \ 359 putc ('\n', FILE); \ 360 } \ 361 while (0) 362 363#define DBX_OUTPUT_LBRAC(FILE, NAME) DBX_OUTPUT_BRAC (FILE, NAME, N_LBRAC) 364#define DBX_OUTPUT_RBRAC(FILE, NAME) DBX_OUTPUT_BRAC (FILE, NAME, N_RBRAC) 365 366/* Another case where we want the dot name. */ 367#define DBX_OUTPUT_NFUN(FILE, LSCOPE, DECL) \ 368 do \ 369 { \ 370 fprintf (FILE, "%s\"\",%d,0,0,", ASM_STABS_OP, N_FUN); \ 371 assemble_name (FILE, LSCOPE); \ 372 fputs ("-.", FILE); \ 373 assemble_name (FILE, XSTR (XEXP (DECL_RTL (DECL), 0), 0)); \ 374 putc ('\n', FILE); \ 375 } \ 376 while (0) 377 378/* Override sysv4.h as these are ABI_V4 only. */ 379#undef ASM_OUTPUT_REG_PUSH 380#undef ASM_OUTPUT_REG_POP 381 382/* Select a format to encode pointers in exception handling data. CODE 383 is 0 for data, 1 for code labels, 2 for function pointers. GLOBAL is 384 true if the symbol may be affected by dynamic relocations. */ 385#undef ASM_PREFERRED_EH_DATA_FORMAT 386#define ASM_PREFERRED_EH_DATA_FORMAT(CODE, GLOBAL) \ 387 (((GLOBAL) ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel | DW_EH_PE_udata8) 388