190075Sobrien/* Definitions of target machine for GNU compiler, 2117395Skan for 64 bit PowerPC linux. 3169689Skan Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006 4132718Skan Free Software Foundation, Inc. 590075Sobrien 6132718Skan This file is part of GCC. 790075Sobrien 8132718Skan GCC is free software; you can redistribute it and/or modify it 9132718Skan under the terms of the GNU General Public License as published 10132718Skan by the Free Software Foundation; either version 2, or (at your 11132718Skan option) any later version. 1290075Sobrien 13132718Skan GCC is distributed in the hope that it will be useful, but WITHOUT 14132718Skan ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 15132718Skan or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public 16132718Skan License for more details. 1790075Sobrien 18132718Skan You should have received a copy of the GNU General Public License 19132718Skan along with GCC; see the file COPYING. If not, write to the 20169689Skan Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, 21169689Skan MA 02110-1301, USA. */ 2290075Sobrien 23132718Skan#ifndef RS6000_BI_ARCH 2490075Sobrien 25132718Skan#undef DEFAULT_ABI 26132718Skan#define DEFAULT_ABI ABI_AIX 2790075Sobrien 28132718Skan#undef TARGET_64BIT 29132718Skan#define TARGET_64BIT 1 3090075Sobrien 31132718Skan#define DEFAULT_ARCH64_P 1 32132718Skan#define RS6000_BI_ARCH_P 0 33132718Skan 34132718Skan#else 35132718Skan 36132718Skan#define DEFAULT_ARCH64_P (TARGET_DEFAULT & MASK_64BIT) 37132718Skan#define RS6000_BI_ARCH_P 1 38132718Skan 39132718Skan#endif 40132718Skan 41132718Skan#ifdef IN_LIBGCC2 42132718Skan#undef TARGET_64BIT 43132718Skan#ifdef __powerpc64__ 44132718Skan#define TARGET_64BIT 1 45132718Skan#else 46132718Skan#define TARGET_64BIT 0 47132718Skan#endif 48132718Skan#endif 49132718Skan 50132718Skan#undef TARGET_AIX 51132718Skan#define TARGET_AIX TARGET_64BIT 52132718Skan 53169689Skan#ifdef HAVE_LD_NO_DOT_SYMS 54169689Skan/* New ABI uses a local sym for the function entry point. */ 55169689Skanextern int dot_symbols; 56169689Skan#undef DOT_SYMBOLS 57169689Skan#define DOT_SYMBOLS dot_symbols 58169689Skan#endif 5990075Sobrien 60169689Skan#undef PROCESSOR_DEFAULT 61169689Skan#define PROCESSOR_DEFAULT PROCESSOR_POWER4 62169689Skan#undef PROCESSOR_DEFAULT64 63169689Skan#define PROCESSOR_DEFAULT64 PROCESSOR_POWER4 64169689Skan 65146895Skan/* We don't need to generate entries in .fixup, except when 66146895Skan -mrelocatable or -mrelocatable-lib is given. */ 67146895Skan#undef RELOCATABLE_NEEDS_FIXUP 68146895Skan#define RELOCATABLE_NEEDS_FIXUP \ 69146895Skan (target_flags & target_flags_explicit & MASK_RELOCATABLE) 7090075Sobrien 71132718Skan#undef RS6000_ABI_NAME 72169689Skan#define RS6000_ABI_NAME "linux" 73132718Skan 74132718Skan#define INVALID_64BIT "-m%s not supported in this configuration" 75132718Skan#define INVALID_32BIT INVALID_64BIT 76132718Skan 77132718Skan#undef SUBSUBTARGET_OVERRIDE_OPTIONS 78132718Skan#define SUBSUBTARGET_OVERRIDE_OPTIONS \ 79132718Skan do \ 80132718Skan { \ 81169689Skan if (!rs6000_explicit_options.alignment) \ 82132718Skan rs6000_alignment_flags = MASK_ALIGN_NATURAL; \ 83132718Skan if (TARGET_64BIT) \ 84132718Skan { \ 85132718Skan if (DEFAULT_ABI != ABI_AIX) \ 86132718Skan { \ 87132718Skan rs6000_current_abi = ABI_AIX; \ 88132718Skan error (INVALID_64BIT, "call"); \ 89132718Skan } \ 90169689Skan dot_symbols = !strcmp (rs6000_abi_name, "aixdesc"); \ 91132718Skan if (target_flags & MASK_RELOCATABLE) \ 92132718Skan { \ 93132718Skan target_flags &= ~MASK_RELOCATABLE; \ 94132718Skan error (INVALID_64BIT, "relocatable"); \ 95132718Skan } \ 96132718Skan if (target_flags & MASK_EABI) \ 97132718Skan { \ 98132718Skan target_flags &= ~MASK_EABI; \ 99132718Skan error (INVALID_64BIT, "eabi"); \ 100132718Skan } \ 101132718Skan if (target_flags & MASK_PROTOTYPE) \ 102132718Skan { \ 103132718Skan target_flags &= ~MASK_PROTOTYPE; \ 104132718Skan error (INVALID_64BIT, "prototype"); \ 105132718Skan } \ 106169689Skan if ((target_flags & MASK_POWERPC64) == 0) \ 107132718Skan { \ 108132718Skan target_flags |= MASK_POWERPC64; \ 109132718Skan error ("-m64 requires a PowerPC64 cpu"); \ 110132718Skan } \ 111132718Skan } \ 112132718Skan else \ 113132718Skan { \ 114132718Skan if (!RS6000_BI_ARCH_P) \ 115132718Skan error (INVALID_32BIT, "32"); \ 116132718Skan if (TARGET_PROFILE_KERNEL) \ 117132718Skan { \ 118132718Skan target_flags &= ~MASK_PROFILE_KERNEL; \ 119132718Skan error (INVALID_32BIT, "profile-kernel"); \ 120132718Skan } \ 121132718Skan } \ 122132718Skan } \ 123132718Skan while (0) 124132718Skan 125132718Skan#ifdef RS6000_BI_ARCH 126132718Skan 127132718Skan#undef OVERRIDE_OPTIONS 128132718Skan#define OVERRIDE_OPTIONS \ 129132718Skan rs6000_override_options (((TARGET_DEFAULT ^ target_flags) & MASK_64BIT) \ 130132718Skan ? (char *) 0 : TARGET_CPU_DEFAULT) 131132718Skan 132132718Skan#endif 133132718Skan 134132718Skan#undef ASM_DEFAULT_SPEC 135103445Skan#undef ASM_SPEC 136132718Skan#undef LINK_OS_LINUX_SPEC 137103445Skan 138132718Skan#ifndef RS6000_BI_ARCH 139132718Skan#define ASM_DEFAULT_SPEC "-mppc64" 140169689Skan#define ASM_SPEC "%(asm_spec64) %(asm_spec_common)" 141132718Skan#define LINK_OS_LINUX_SPEC "%(link_os_linux_spec64)" 142132718Skan#else 143132718Skan#if DEFAULT_ARCH64_P 144132718Skan#define ASM_DEFAULT_SPEC "-mppc%{!m32:64}" 145169689Skan#define ASM_SPEC "%{m32:%(asm_spec32)}%{!m32:%(asm_spec64)} %(asm_spec_common)" 146132718Skan#define LINK_OS_LINUX_SPEC "%{m32:%(link_os_linux_spec32)}%{!m32:%(link_os_linux_spec64)}" 147132718Skan#else 148132718Skan#define ASM_DEFAULT_SPEC "-mppc%{m64:64}" 149169689Skan#define ASM_SPEC "%{!m64:%(asm_spec32)}%{m64:%(asm_spec64)} %(asm_spec_common)" 150132718Skan#define LINK_OS_LINUX_SPEC "%{!m64:%(link_os_linux_spec32)}%{m64:%(link_os_linux_spec64)}" 151132718Skan#endif 152132718Skan#endif 153132718Skan 154132718Skan#define ASM_SPEC32 "-a32 %{n} %{T} %{Ym,*} %{Yd,*} \ 155132718Skan%{mrelocatable} %{mrelocatable-lib} %{fpic:-K PIC} %{fPIC:-K PIC} \ 156132718Skan%{memb} %{!memb: %{msdata: -memb} %{msdata=eabi: -memb}} \ 157132718Skan%{!mlittle: %{!mlittle-endian: %{!mbig: %{!mbig-endian: \ 158132718Skan %{mcall-freebsd: -mbig} \ 159132718Skan %{mcall-i960-old: -mlittle} \ 160132718Skan %{mcall-linux: -mbig} \ 161132718Skan %{mcall-gnu: -mbig} \ 162132718Skan %{mcall-netbsd: -mbig} \ 163132718Skan}}}}" 164132718Skan 165132718Skan#define ASM_SPEC64 "-a64" 166132718Skan 167132718Skan#define ASM_SPEC_COMMON "%(asm_cpu) \ 168132718Skan%{.s: %{mregnames} %{mno-regnames}} %{.S: %{mregnames} %{mno-regnames}} \ 169132718Skan%{v:-V} %{Qy:} %{!Qn:-Qy} %{Wa,*:%*} \ 170132718Skan%{mlittle} %{mlittle-endian} %{mbig} %{mbig-endian}" 171132718Skan 172132718Skan#undef SUBSUBTARGET_EXTRA_SPECS 173132718Skan#define SUBSUBTARGET_EXTRA_SPECS \ 174132718Skan { "asm_spec_common", ASM_SPEC_COMMON }, \ 175132718Skan { "asm_spec32", ASM_SPEC32 }, \ 176132718Skan { "asm_spec64", ASM_SPEC64 }, \ 177132718Skan { "link_os_linux_spec32", LINK_OS_LINUX_SPEC32 }, \ 178132718Skan { "link_os_linux_spec64", LINK_OS_LINUX_SPEC64 }, 179132718Skan 180132718Skan#undef MULTILIB_DEFAULTS 181132718Skan#if DEFAULT_ARCH64_P 182132718Skan#define MULTILIB_DEFAULTS { "m64" } 183132718Skan#else 184132718Skan#define MULTILIB_DEFAULTS { "m32" } 185132718Skan#endif 186132718Skan 187132718Skan#ifndef RS6000_BI_ARCH 188132718Skan 189132718Skan/* 64-bit PowerPC Linux is always big-endian. */ 190132718Skan#undef TARGET_LITTLE_ENDIAN 191132718Skan#define TARGET_LITTLE_ENDIAN 0 192132718Skan 19390075Sobrien/* 64-bit PowerPC Linux always has a TOC. */ 19490075Sobrien#undef TARGET_TOC 19590075Sobrien#define TARGET_TOC 1 19690075Sobrien 197132718Skan/* Some things from sysv4.h we don't do when 64 bit. */ 198132718Skan#undef TARGET_RELOCATABLE 199132718Skan#define TARGET_RELOCATABLE 0 200132718Skan#undef TARGET_EABI 201132718Skan#define TARGET_EABI 0 202132718Skan#undef TARGET_PROTOTYPE 203132718Skan#define TARGET_PROTOTYPE 0 204146895Skan#undef RELOCATABLE_NEEDS_FIXUP 205146895Skan#define RELOCATABLE_NEEDS_FIXUP 0 20690075Sobrien 207132718Skan#endif 208132718Skan 209132718Skan/* We use glibc _mcount for profiling. */ 210169689Skan#define NO_PROFILE_COUNTERS 1 211132718Skan#define PROFILE_HOOK(LABEL) \ 212132718Skan do { if (TARGET_64BIT) output_profile_hook (LABEL); } while (0) 213132718Skan 214132718Skan/* PowerPC64 Linux word-aligns FP doubles when -malign-power is given. */ 215103445Skan#undef ADJUST_FIELD_ALIGN 21690075Sobrien#define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \ 217132718Skan ((TARGET_ALTIVEC && TREE_CODE (TREE_TYPE (FIELD)) == VECTOR_TYPE) \ 218132718Skan ? 128 \ 219132718Skan : (TARGET_64BIT \ 220132718Skan && TARGET_ALIGN_NATURAL == 0 \ 221132718Skan && TYPE_MODE (TREE_CODE (TREE_TYPE (FIELD)) == ARRAY_TYPE \ 222132718Skan ? get_inner_array_type (FIELD) \ 223132718Skan : TREE_TYPE (FIELD)) == DFmode) \ 224132718Skan ? MIN ((COMPUTED), 32) \ 225132718Skan : (COMPUTED)) 22690075Sobrien 227132718Skan/* PowerPC64 Linux increases natural record alignment to doubleword if 228132718Skan the first field is an FP double, only if in power alignment mode. */ 229132718Skan#undef ROUND_TYPE_ALIGN 230132718Skan#define ROUND_TYPE_ALIGN(STRUCT, COMPUTED, SPECIFIED) \ 231169689Skan ((TARGET_64BIT \ 232169689Skan && (TREE_CODE (STRUCT) == RECORD_TYPE \ 233169689Skan || TREE_CODE (STRUCT) == UNION_TYPE \ 234169689Skan || TREE_CODE (STRUCT) == QUAL_UNION_TYPE) \ 235169689Skan && TARGET_ALIGN_NATURAL == 0) \ 236132718Skan ? rs6000_special_round_type_align (STRUCT, COMPUTED, SPECIFIED) \ 23790075Sobrien : MAX ((COMPUTED), (SPECIFIED))) 23890075Sobrien 239161651Skan/* Use the default for compiling target libs. */ 240161651Skan#ifdef IN_TARGET_LIBS 241161651Skan#undef TARGET_ALIGN_NATURAL 242161651Skan#define TARGET_ALIGN_NATURAL 1 243161651Skan#endif 244161651Skan 24590075Sobrien/* Indicate that jump tables go in the text section. */ 24690075Sobrien#undef JUMP_TABLES_IN_TEXT_SECTION 247132718Skan#define JUMP_TABLES_IN_TEXT_SECTION TARGET_64BIT 24890075Sobrien 249132718Skan/* The linux ppc64 ABI isn't explicit on whether aggregates smaller 250132718Skan than a doubleword should be padded upward or downward. You could 251132718Skan reasonably assume that they follow the normal rules for structure 252132718Skan layout treating the parameter area as any other block of memory, 253169689Skan then map the reg param area to registers. i.e. pad upward. 254132718Skan Setting both of the following defines results in this behavior. 255132718Skan Setting just the first one will result in aggregates that fit in a 256132718Skan doubleword being padded downward, and others being padded upward. 257132718Skan Not a bad idea as this results in struct { int x; } being passed 258132718Skan the same way as an int. */ 259132718Skan#define AGGREGATE_PADDING_FIXED TARGET_64BIT 260132718Skan#define AGGREGATES_PAD_UPWARD_ALWAYS 0 26190075Sobrien 262132718Skan/* Specify padding for the last element of a block move between 263132718Skan registers and memory. FIRST is nonzero if this is the only 264132718Skan element. */ 265132718Skan#define BLOCK_REG_PADDING(MODE, TYPE, FIRST) \ 266132718Skan (!(FIRST) ? upward : FUNCTION_ARG_PADDING (MODE, TYPE)) 267132718Skan 26890075Sobrien/* __throw will restore its own return address to be the same as the 26990075Sobrien return address of the function that the throw is being made to. 27090075Sobrien This is unfortunate, because we want to check the original 27190075Sobrien return address to see if we need to restore the TOC. 27290075Sobrien So we have to squirrel it away with this. */ 273132718Skan#define SETUP_FRAME_ADDRESSES() \ 274132718Skan do { if (TARGET_64BIT) rs6000_aix_emit_builtin_unwind_init (); } while (0) 27590075Sobrien 276117395Skan/* Override svr4.h */ 27790075Sobrien#undef MD_EXEC_PREFIX 27890075Sobrien#undef MD_STARTFILE_PREFIX 27990075Sobrien 280146895Skan/* Linux doesn't support saving and restoring 64-bit regs in a 32-bit 281146895Skan process. */ 282146895Skan#define OS_MISSING_POWERPC64 !TARGET_64BIT 283146895Skan 284146895Skan/* glibc has float and long double forms of math functions. */ 285146895Skan#undef TARGET_C99_FUNCTIONS 286169689Skan#define TARGET_C99_FUNCTIONS (OPTION_GLIBC) 287146895Skan 288132718Skan#undef TARGET_OS_CPP_BUILTINS 289169689Skan#define TARGET_OS_CPP_BUILTINS() \ 290132718Skan do \ 291132718Skan { \ 292132718Skan if (TARGET_64BIT) \ 293132718Skan { \ 294132718Skan builtin_define ("__PPC__"); \ 295132718Skan builtin_define ("__PPC64__"); \ 296132718Skan builtin_define ("__powerpc__"); \ 297132718Skan builtin_define ("__powerpc64__"); \ 298132718Skan builtin_assert ("cpu=powerpc64"); \ 299132718Skan builtin_assert ("machine=powerpc64"); \ 300132718Skan } \ 301132718Skan else \ 302132718Skan { \ 303132718Skan builtin_define_std ("PPC"); \ 304132718Skan builtin_define_std ("powerpc"); \ 305132718Skan builtin_assert ("cpu=powerpc"); \ 306132718Skan builtin_assert ("machine=powerpc"); \ 307132718Skan TARGET_OS_SYSV_CPP_BUILTINS (); \ 308132718Skan } \ 309132718Skan } \ 310117395Skan while (0) 31190075Sobrien 31290075Sobrien#undef CPP_OS_DEFAULT_SPEC 31390075Sobrien#define CPP_OS_DEFAULT_SPEC "%(cpp_os_linux)" 31490075Sobrien 31590075Sobrien/* The GNU C++ standard library currently requires _GNU_SOURCE being 31690075Sobrien defined on glibc-based systems. This temporary hack accomplishes this, 31790075Sobrien it should go away as soon as libstdc++-v3 has a real fix. */ 31890075Sobrien#undef CPLUSPLUS_CPP_SPEC 31990075Sobrien#define CPLUSPLUS_CPP_SPEC "-D_GNU_SOURCE %(cpp)" 32090075Sobrien 32190075Sobrien#undef LINK_SHLIB_SPEC 32290075Sobrien#define LINK_SHLIB_SPEC "%{shared:-shared} %{!shared: %{static:-static}}" 32390075Sobrien 32490075Sobrien#undef LIB_DEFAULT_SPEC 32590075Sobrien#define LIB_DEFAULT_SPEC "%(lib_linux)" 32690075Sobrien 32790075Sobrien#undef STARTFILE_DEFAULT_SPEC 32890075Sobrien#define STARTFILE_DEFAULT_SPEC "%(startfile_linux)" 32990075Sobrien 33090075Sobrien#undef ENDFILE_DEFAULT_SPEC 33190075Sobrien#define ENDFILE_DEFAULT_SPEC "%(endfile_linux)" 33290075Sobrien 33390075Sobrien#undef LINK_START_DEFAULT_SPEC 33490075Sobrien#define LINK_START_DEFAULT_SPEC "%(link_start_linux)" 33590075Sobrien 33690075Sobrien#undef LINK_OS_DEFAULT_SPEC 33790075Sobrien#define LINK_OS_DEFAULT_SPEC "%(link_os_linux)" 33890075Sobrien 339169689Skan#define GLIBC_DYNAMIC_LINKER32 "/lib/ld.so.1" 340169689Skan#define GLIBC_DYNAMIC_LINKER64 "/lib64/ld64.so.1" 341169689Skan#define UCLIBC_DYNAMIC_LINKER32 "/lib/ld-uClibc.so.0" 342169689Skan#define UCLIBC_DYNAMIC_LINKER64 "/lib/ld64-uClibc.so.0" 343169689Skan#if UCLIBC_DEFAULT 344169689Skan#define CHOOSE_DYNAMIC_LINKER(G, U) "%{mglibc:%{muclibc:%e-mglibc and -muclibc used together}" G ";:" U "}" 345169689Skan#else 346169689Skan#define CHOOSE_DYNAMIC_LINKER(G, U) "%{muclibc:%{mglibc:%e-mglibc and -muclibc used together}" U ";:" G "}" 347169689Skan#endif 348169689Skan#define LINUX_DYNAMIC_LINKER32 \ 349169689Skan CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER32, UCLIBC_DYNAMIC_LINKER32) 350169689Skan#define LINUX_DYNAMIC_LINKER64 \ 351169689Skan CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER64, UCLIBC_DYNAMIC_LINKER64) 352169689Skan 353169689Skan 354132718Skan#define LINK_OS_LINUX_SPEC32 "-m elf32ppclinux %{!shared: %{!static: \ 35590075Sobrien %{rdynamic:-export-dynamic} \ 356169689Skan %{!dynamic-linker:-dynamic-linker " LINUX_DYNAMIC_LINKER32 "}}}" 357132718Skan 358132718Skan#define LINK_OS_LINUX_SPEC64 "-m elf64ppc %{!shared: %{!static: \ 359132718Skan %{rdynamic:-export-dynamic} \ 360169689Skan %{!dynamic-linker:-dynamic-linker " LINUX_DYNAMIC_LINKER64 "}}}" 361117395Skan 36290075Sobrien#undef TOC_SECTION_ASM_OP 363132718Skan#define TOC_SECTION_ASM_OP \ 364132718Skan (TARGET_64BIT \ 365132718Skan ? "\t.section\t\".toc\",\"aw\"" \ 366132718Skan : "\t.section\t\".got\",\"aw\"") 36790075Sobrien 36890075Sobrien#undef MINIMAL_TOC_SECTION_ASM_OP 369132718Skan#define MINIMAL_TOC_SECTION_ASM_OP \ 370132718Skan (TARGET_64BIT \ 371132718Skan ? "\t.section\t\".toc1\",\"aw\"" \ 372132718Skan : ((TARGET_RELOCATABLE || flag_pic) \ 373132718Skan ? "\t.section\t\".got2\",\"aw\"" \ 374132718Skan : "\t.section\t\".got1\",\"aw\"")) 37590075Sobrien 37690075Sobrien#undef TARGET_VERSION 37790075Sobrien#define TARGET_VERSION fprintf (stderr, " (PowerPC64 GNU/Linux)"); 37890075Sobrien 37990075Sobrien/* Must be at least as big as our pointer type. */ 380132718Skan#undef SIZE_TYPE 381132718Skan#define SIZE_TYPE (TARGET_64BIT ? "long unsigned int" : "unsigned int") 38290075Sobrien 383132718Skan#undef PTRDIFF_TYPE 384132718Skan#define PTRDIFF_TYPE (TARGET_64BIT ? "long int" : "int") 38590075Sobrien 386132718Skan#undef WCHAR_TYPE 387132718Skan#define WCHAR_TYPE (TARGET_64BIT ? "int" : "long int") 38890075Sobrien#undef WCHAR_TYPE_SIZE 38990075Sobrien#define WCHAR_TYPE_SIZE 32 39090075Sobrien 39190075Sobrien/* Override rs6000.h definition. */ 39290075Sobrien#undef ASM_APP_ON 39390075Sobrien#define ASM_APP_ON "#APP\n" 39490075Sobrien 39590075Sobrien/* Override rs6000.h definition. */ 39690075Sobrien#undef ASM_APP_OFF 39790075Sobrien#define ASM_APP_OFF "#NO_APP\n" 39890075Sobrien 39990075Sobrien/* PowerPC no-op instruction. */ 40090075Sobrien#undef RS6000_CALL_GLUE 401132718Skan#define RS6000_CALL_GLUE (TARGET_64BIT ? "nop" : "cror 31,31,31") 40290075Sobrien 40390075Sobrien#undef RS6000_MCOUNT 40490075Sobrien#define RS6000_MCOUNT "_mcount" 40590075Sobrien 406117395Skan#ifdef __powerpc64__ 407117395Skan/* _init and _fini functions are built from bits spread across many 408117395Skan object files, each potentially with a different TOC pointer. For 409117395Skan that reason, place a nop after the call so that the linker can 410117395Skan restore the TOC pointer if a TOC adjusting call stub is needed. */ 411169689Skan#if DOT_SYMBOLS 412117395Skan#define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC) \ 413117395Skan asm (SECTION_OP "\n" \ 414117395Skan" bl ." #FUNC "\n" \ 415117395Skan" nop\n" \ 416117395Skan" .previous"); 417169689Skan#else 418169689Skan#define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC) \ 419169689Skan asm (SECTION_OP "\n" \ 420169689Skan" bl " #FUNC "\n" \ 421169689Skan" nop\n" \ 422169689Skan" .previous"); 423117395Skan#endif 424169689Skan#endif 425117395Skan 42690075Sobrien/* FP save and restore routines. */ 42790075Sobrien#undef SAVE_FP_PREFIX 428132718Skan#define SAVE_FP_PREFIX (TARGET_64BIT ? "._savef" : "_savefpr_") 42990075Sobrien#undef SAVE_FP_SUFFIX 430132718Skan#define SAVE_FP_SUFFIX (TARGET_64BIT ? "" : "_l") 43190075Sobrien#undef RESTORE_FP_PREFIX 432132718Skan#define RESTORE_FP_PREFIX (TARGET_64BIT ? "._restf" : "_restfpr_") 43390075Sobrien#undef RESTORE_FP_SUFFIX 434132718Skan#define RESTORE_FP_SUFFIX (TARGET_64BIT ? "" : "_l") 43590075Sobrien 43690075Sobrien/* Dwarf2 debugging. */ 43790075Sobrien#undef PREFERRED_DEBUGGING_TYPE 43890075Sobrien#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG 43990075Sobrien 44096263Sobrien/* This is how to declare the size of a function. */ 44196263Sobrien#undef ASM_DECLARE_FUNCTION_SIZE 44296263Sobrien#define ASM_DECLARE_FUNCTION_SIZE(FILE, FNAME, DECL) \ 44396263Sobrien do \ 44496263Sobrien { \ 44596263Sobrien if (!flag_inhibit_size_directive) \ 44696263Sobrien { \ 447132718Skan fputs ("\t.size\t", (FILE)); \ 448169689Skan if (TARGET_64BIT && DOT_SYMBOLS) \ 449132718Skan putc ('.', (FILE)); \ 45096263Sobrien assemble_name ((FILE), (FNAME)); \ 451132718Skan fputs (",.-", (FILE)); \ 452169689Skan rs6000_output_function_entry (FILE, FNAME); \ 45396263Sobrien putc ('\n', (FILE)); \ 45496263Sobrien } \ 45596263Sobrien } \ 45696263Sobrien while (0) 45796263Sobrien 458117395Skan/* Return nonzero if this entry is to be written into the constant 45990075Sobrien pool in a special way. We do so if this is a SYMBOL_REF, LABEL_REF 46090075Sobrien or a CONST containing one of them. If -mfp-in-toc (the default), 46190075Sobrien we also do this for floating-point constants. We actually can only 46290075Sobrien do this if the FP formats of the target and host machines are the 46390075Sobrien same, but we can't check that since not every file that uses 46490075Sobrien GO_IF_LEGITIMATE_ADDRESS_P includes real.h. We also do this when 46590075Sobrien we can write the entry into the TOC and the entry is not larger 46690075Sobrien than a TOC entry. */ 46790075Sobrien 46890075Sobrien#undef ASM_OUTPUT_SPECIAL_POOL_ENTRY_P 46990075Sobrien#define ASM_OUTPUT_SPECIAL_POOL_ENTRY_P(X, MODE) \ 47090075Sobrien (TARGET_TOC \ 47190075Sobrien && (GET_CODE (X) == SYMBOL_REF \ 47290075Sobrien || (GET_CODE (X) == CONST && GET_CODE (XEXP (X, 0)) == PLUS \ 47390075Sobrien && GET_CODE (XEXP (XEXP (X, 0), 0)) == SYMBOL_REF) \ 47490075Sobrien || GET_CODE (X) == LABEL_REF \ 47590075Sobrien || (GET_CODE (X) == CONST_INT \ 47690075Sobrien && GET_MODE_BITSIZE (MODE) <= GET_MODE_BITSIZE (Pmode)) \ 47790075Sobrien || (GET_CODE (X) == CONST_DOUBLE \ 478132718Skan && ((TARGET_64BIT \ 479132718Skan && (TARGET_POWERPC64 \ 480132718Skan || TARGET_MINIMAL_TOC \ 481169689Skan || (SCALAR_FLOAT_MODE_P (GET_MODE (X)) \ 482132718Skan && ! TARGET_NO_FP_IN_TOC))) \ 483132718Skan || (!TARGET_64BIT \ 484132718Skan && !TARGET_NO_FP_IN_TOC \ 485132718Skan && !TARGET_RELOCATABLE \ 486169689Skan && SCALAR_FLOAT_MODE_P (GET_MODE (X)) \ 487132718Skan && BITS_PER_WORD == HOST_BITS_PER_INT))))) 48890075Sobrien 489103445Skan/* Select a format to encode pointers in exception handling data. CODE 490103445Skan is 0 for data, 1 for code labels, 2 for function pointers. GLOBAL is 491103445Skan true if the symbol may be affected by dynamic relocations. */ 492103445Skan#undef ASM_PREFERRED_EH_DATA_FORMAT 493103445Skan#define ASM_PREFERRED_EH_DATA_FORMAT(CODE, GLOBAL) \ 494132718Skan ((TARGET_64BIT || flag_pic || TARGET_RELOCATABLE) \ 495132718Skan ? (((GLOBAL) ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel \ 496132718Skan | (TARGET_64BIT ? DW_EH_PE_udata8 : DW_EH_PE_sdata4)) \ 497132718Skan : DW_EH_PE_absptr) 498132718Skan 499132718Skan/* For backward compatibility, we must continue to use the AIX 500132718Skan structure return convention. */ 501132718Skan#undef DRAFT_V4_STRUCT_RET 502132718Skan#define DRAFT_V4_STRUCT_RET (!TARGET_64BIT) 503132718Skan 504146895Skan#define TARGET_ASM_FILE_END rs6000_elf_end_indicate_exec_stack 505132718Skan 506169689Skan#define TARGET_POSIX_IO 507132718Skan 508132718Skan#define LINK_GCC_C_SEQUENCE_SPEC \ 509132718Skan "%{static:--start-group} %G %L %{static:--end-group}%{!static:%G}" 510132718Skan 511169689Skan/* Use --as-needed -lgcc_s for eh support. */ 512169689Skan#ifdef HAVE_LD_AS_NEEDED 513169689Skan#define USE_LD_AS_NEEDED 1 514132718Skan#endif 515169689Skan 516169689Skan#define MD_UNWIND_SUPPORT "config/rs6000/linux-unwind.h" 517169689Skan 518169689Skan#ifdef TARGET_LIBC_PROVIDES_SSP 519169689Skan/* ppc32 glibc provides __stack_chk_guard in -0x7008(2), 520169689Skan ppc64 glibc provides it at -0x7010(13). */ 521169689Skan#define TARGET_THREAD_SSP_OFFSET (TARGET_64BIT ? -0x7010 : -0x7008) 522169689Skan#endif 523169689Skan 524169689Skan#define POWERPC_LINUX 525169689Skan 526169689Skan/* ppc{32,64} linux has 128-bit long double support in glibc 2.4 and later. */ 527169689Skan#ifdef TARGET_DEFAULT_LONG_DOUBLE_128 528169689Skan#define RS6000_DEFAULT_LONG_DOUBLE_SIZE 128 529169689Skan#endif 530