Home | History | Annotate | Line # | Download | only in rs6000
netbsd64.h revision 1.1
      1  1.1  mrg /* Definitions of target machine for GNU compiler,
      2  1.1  mrg    for 64 bit PowerPC NetBSD.
      3  1.1  mrg    Copyright (C) 2006 Free Software Foundation, Inc.
      4  1.1  mrg    Contributed by Matthew Green (mrg (at) eterna.com.au).
      5  1.1  mrg 
      6  1.1  mrg    This file is part of GCC.
      7  1.1  mrg 
      8  1.1  mrg    GCC is free software; you can redistribute it and/or modify it
      9  1.1  mrg    under the terms of the GNU General Public License as published
     10  1.1  mrg    by the Free Software Foundation; either version 2, or (at your
     11  1.1  mrg    option) any later version.
     12  1.1  mrg 
     13  1.1  mrg    GCC is distributed in the hope that it will be useful, but WITHOUT
     14  1.1  mrg    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
     15  1.1  mrg    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
     16  1.1  mrg    License for more details.
     17  1.1  mrg 
     18  1.1  mrg    You should have received a copy of the GNU General Public License
     19  1.1  mrg    along with GCC; see the file COPYING.  If not, write to the
     20  1.1  mrg    Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
     21  1.1  mrg    MA 02110-1301, USA.  */
     22  1.1  mrg 
     23  1.1  mrg #ifndef RS6000_BI_ARCH
     24  1.1  mrg 
     25  1.1  mrg #undef	DEFAULT_ABI
     26  1.1  mrg #define	DEFAULT_ABI ABI_AIX
     27  1.1  mrg 
     28  1.1  mrg #undef	TARGET_64BIT
     29  1.1  mrg #define	TARGET_64BIT 1
     30  1.1  mrg 
     31  1.1  mrg #define	DEFAULT_ARCH64_P 1
     32  1.1  mrg #define	RS6000_BI_ARCH_P 0
     33  1.1  mrg 
     34  1.1  mrg #else
     35  1.1  mrg 
     36  1.1  mrg #define	DEFAULT_ARCH64_P (TARGET_DEFAULT & MASK_64BIT)
     37  1.1  mrg #define	RS6000_BI_ARCH_P 1
     38  1.1  mrg 
     39  1.1  mrg #endif
     40  1.1  mrg 
     41  1.1  mrg #ifdef IN_LIBGCC2
     42  1.1  mrg #undef TARGET_64BIT
     43  1.1  mrg #ifdef __powerpc64__
     44  1.1  mrg #define TARGET_64BIT 1
     45  1.1  mrg #else
     46  1.1  mrg #define TARGET_64BIT 0
     47  1.1  mrg #endif
     48  1.1  mrg #endif
     49  1.1  mrg 
     50  1.1  mrg #undef	TARGET_AIX
     51  1.1  mrg #define	TARGET_AIX TARGET_64BIT
     52  1.1  mrg 
     53  1.1  mrg #ifdef HAVE_LD_NO_DOT_SYMS
     54  1.1  mrg /* New ABI uses a local sym for the function entry point.  */
     55  1.1  mrg extern int dot_symbols;
     56  1.1  mrg #undef DOT_SYMBOLS
     57  1.1  mrg #define DOT_SYMBOLS dot_symbols
     58  1.1  mrg #endif
     59  1.1  mrg 
     60  1.1  mrg #define TARGET_PROFILE_KERNEL profile_kernel
     61  1.1  mrg 
     62  1.1  mrg #undef  PROCESSOR_DEFAULT
     63  1.1  mrg #define PROCESSOR_DEFAULT PROCESSOR_POWER4
     64  1.1  mrg #undef  PROCESSOR_DEFAULT64
     65  1.1  mrg #define PROCESSOR_DEFAULT64 PROCESSOR_POWER4
     66  1.1  mrg 
     67  1.1  mrg /* We don't need to generate entries in .fixup, except when
     68  1.1  mrg    -mrelocatable or -mrelocatable-lib is given.  */
     69  1.1  mrg #undef RELOCATABLE_NEEDS_FIXUP
     70  1.1  mrg #define RELOCATABLE_NEEDS_FIXUP \
     71  1.1  mrg   (target_flags & target_flags_explicit & MASK_RELOCATABLE)
     72  1.1  mrg 
     73  1.1  mrg #undef	RS6000_ABI_NAME
     74  1.1  mrg #define	RS6000_ABI_NAME "netbsd"
     75  1.1  mrg 
     76  1.1  mrg #define INVALID_64BIT "-m%s not supported in this configuration"
     77  1.1  mrg #define INVALID_32BIT INVALID_64BIT
     78  1.1  mrg 
     79  1.1  mrg #undef	SUBSUBTARGET_OVERRIDE_OPTIONS
     80  1.1  mrg #define	SUBSUBTARGET_OVERRIDE_OPTIONS				\
     81  1.1  mrg   do								\
     82  1.1  mrg     {								\
     83  1.1  mrg       if (!rs6000_explicit_options.alignment)			\
     84  1.1  mrg 	rs6000_alignment_flags = MASK_ALIGN_NATURAL;		\
     85  1.1  mrg       if (TARGET_64BIT)						\
     86  1.1  mrg 	{							\
     87  1.1  mrg 	  if (DEFAULT_ABI != ABI_AIX)				\
     88  1.1  mrg 	    {							\
     89  1.1  mrg 	      rs6000_current_abi = ABI_AIX;			\
     90  1.1  mrg 	      error (INVALID_64BIT, "call");			\
     91  1.1  mrg 	    }							\
     92  1.1  mrg 	  dot_symbols = !strcmp (rs6000_abi_name, "aixdesc");	\
     93  1.1  mrg 	  if (target_flags & MASK_RELOCATABLE)			\
     94  1.1  mrg 	    {							\
     95  1.1  mrg 	      target_flags &= ~MASK_RELOCATABLE;		\
     96  1.1  mrg 	      error (INVALID_64BIT, "relocatable");		\
     97  1.1  mrg 	    }							\
     98  1.1  mrg 	  if (target_flags & MASK_EABI)				\
     99  1.1  mrg 	    {							\
    100  1.1  mrg 	      target_flags &= ~MASK_EABI;			\
    101  1.1  mrg 	      error (INVALID_64BIT, "eabi");			\
    102  1.1  mrg 	    }							\
    103  1.1  mrg 	  if (TARGET_PROTOTYPE)					\
    104  1.1  mrg 	    {							\
    105  1.1  mrg 	      target_prototype = 0;				\
    106  1.1  mrg 	      error (INVALID_64BIT, "prototype");		\
    107  1.1  mrg 	    }							\
    108  1.1  mrg 	  if ((target_flags & MASK_POWERPC64) == 0)		\
    109  1.1  mrg 	    {							\
    110  1.1  mrg 	      target_flags |= MASK_POWERPC64;			\
    111  1.1  mrg 	      error ("-m64 requires a PowerPC64 cpu");		\
    112  1.1  mrg 	    }							\
    113  1.1  mrg 	}							\
    114  1.1  mrg       else							\
    115  1.1  mrg 	{							\
    116  1.1  mrg 	  if (!RS6000_BI_ARCH_P)				\
    117  1.1  mrg 	    error (INVALID_32BIT, "32");			\
    118  1.1  mrg 	  if (TARGET_PROFILE_KERNEL)				\
    119  1.1  mrg 	    {							\
    120  1.1  mrg 	      TARGET_PROFILE_KERNEL = 0;			\
    121  1.1  mrg 	      error (INVALID_32BIT, "profile-kernel");		\
    122  1.1  mrg 	    }							\
    123  1.1  mrg 	}							\
    124  1.1  mrg     }								\
    125  1.1  mrg   while (0)
    126  1.1  mrg 
    127  1.1  mrg #ifdef	RS6000_BI_ARCH
    128  1.1  mrg 
    129  1.1  mrg #undef	OVERRIDE_OPTIONS
    130  1.1  mrg #define	OVERRIDE_OPTIONS \
    131  1.1  mrg   rs6000_override_options (((TARGET_DEFAULT ^ target_flags) & MASK_64BIT) \
    132  1.1  mrg 			   ? (char *) 0 : TARGET_CPU_DEFAULT)
    133  1.1  mrg 
    134  1.1  mrg #endif
    135  1.1  mrg 
    136  1.1  mrg #undef	ASM_DEFAULT_SPEC
    137  1.1  mrg #undef	ASM_SPEC
    138  1.1  mrg #undef	LINK_OS_NETBSD_SPEC
    139  1.1  mrg 
    140  1.1  mrg #ifndef	RS6000_BI_ARCH
    141  1.1  mrg #define	ASM_DEFAULT_SPEC "-mppc64"
    142  1.1  mrg #define	ASM_SPEC	 "%(asm_spec64) %(asm_spec_common)"
    143  1.1  mrg #define	LINK_OS_NETBSD_SPEC "%(link_os_netbsd_spec64)"
    144  1.1  mrg #else
    145  1.1  mrg #if DEFAULT_ARCH64_P
    146  1.1  mrg #define	ASM_DEFAULT_SPEC "-mppc%{!m32:64}"
    147  1.1  mrg #define	ASM_SPEC	 "%{m32:%(asm_spec32)}%{!m32:%(asm_spec64)} %(asm_spec_common)"
    148  1.1  mrg #define	LINK_OS_NETBSD_SPEC "%{m32:%(link_os_netbsd_spec32)}%{!m32:%(link_os_netbsd_spec64)}"
    149  1.1  mrg #else
    150  1.1  mrg #define	ASM_DEFAULT_SPEC "-mppc%{m64:64}"
    151  1.1  mrg #define	ASM_SPEC	 "%{!m64:%(asm_spec32)}%{m64:%(asm_spec64)} %(asm_spec_common)"
    152  1.1  mrg #define	LINK_OS_NETBSD_SPEC "%{!m64:%(link_os_netbsd_spec32)}%{m64:%(link_os_netbsd_spec64)}"
    153  1.1  mrg #endif
    154  1.1  mrg #endif
    155  1.1  mrg 
    156  1.1  mrg #define ASM_SPEC32 "-a32 %{n} %{T} %{Ym,*} %{Yd,*} \
    157  1.1  mrg %{mrelocatable} %{mrelocatable-lib} %{fpic:-K PIC} %{fPIC:-K PIC} \
    158  1.1  mrg %{memb} %{!memb: %{msdata: -memb} %{msdata=eabi: -memb}} \
    159  1.1  mrg %{!mlittle: %{!mlittle-endian: %{!mbig: %{!mbig-endian: \
    160  1.1  mrg     %{mcall-freebsd: -mbig} \
    161  1.1  mrg     %{mcall-i960-old: -mlittle} \
    162  1.1  mrg     %{mcall-linux: -mbig} \
    163  1.1  mrg     %{mcall-gnu: -mbig} \
    164  1.1  mrg     %{mcall-netbsd: -mbig} \
    165  1.1  mrg }}}}"
    166  1.1  mrg 
    167  1.1  mrg #define ASM_SPEC64 "-a64"
    168  1.1  mrg 
    169  1.1  mrg #define ASM_SPEC_COMMON "%(asm_cpu) \
    170  1.1  mrg %{.s: %{mregnames} %{mno-regnames}} %{.S: %{mregnames} %{mno-regnames}} \
    171  1.1  mrg %{v:-V} %{Qy:} %{!Qn:-Qy} %{Wa,*:%*} \
    172  1.1  mrg %{mlittle} %{mlittle-endian} %{mbig} %{mbig-endian}"
    173  1.1  mrg 
    174  1.1  mrg #undef	SUBSUBTARGET_EXTRA_SPECS
    175  1.1  mrg #define SUBSUBTARGET_EXTRA_SPECS \
    176  1.1  mrg   { "asm_spec_common",		ASM_SPEC_COMMON },			\
    177  1.1  mrg   { "asm_spec32",		ASM_SPEC32 },				\
    178  1.1  mrg   { "asm_spec64",		ASM_SPEC64 },				\
    179  1.1  mrg   { "link_os_netbsd_spec32",	LINK_OS_NETBSD_SPEC32 },			\
    180  1.1  mrg   { "link_os_netbsd_spec64",	LINK_OS_NETBSD_SPEC64 },
    181  1.1  mrg 
    182  1.1  mrg #undef	MULTILIB_DEFAULTS
    183  1.1  mrg #if DEFAULT_ARCH64_P
    184  1.1  mrg #define MULTILIB_DEFAULTS { "m64" }
    185  1.1  mrg #else
    186  1.1  mrg #define MULTILIB_DEFAULTS { "m32" }
    187  1.1  mrg #endif
    188  1.1  mrg 
    189  1.1  mrg #ifndef RS6000_BI_ARCH
    190  1.1  mrg 
    191  1.1  mrg /* 64-bit PowerPC NetBSD is always big-endian.  */
    192  1.1  mrg #undef	TARGET_LITTLE_ENDIAN
    193  1.1  mrg #define TARGET_LITTLE_ENDIAN	0
    194  1.1  mrg 
    195  1.1  mrg /* 64-bit PowerPC NetBSD always has a TOC.  */
    196  1.1  mrg #undef  TARGET_TOC
    197  1.1  mrg #define	TARGET_TOC		1
    198  1.1  mrg 
    199  1.1  mrg /* Some things from sysv4.h we don't do when 64 bit.  */
    200  1.1  mrg #undef	TARGET_RELOCATABLE
    201  1.1  mrg #define	TARGET_RELOCATABLE	0
    202  1.1  mrg #undef	TARGET_EABI
    203  1.1  mrg #define	TARGET_EABI		0
    204  1.1  mrg #undef	TARGET_PROTOTYPE
    205  1.1  mrg #define	TARGET_PROTOTYPE	0
    206  1.1  mrg #undef RELOCATABLE_NEEDS_FIXUP
    207  1.1  mrg #define RELOCATABLE_NEEDS_FIXUP 0
    208  1.1  mrg 
    209  1.1  mrg #endif
    210  1.1  mrg 
    211  1.1  mrg /* PowerPC64 NetBSD word-aligns FP doubles when -malign-power is given.  */
    212  1.1  mrg #undef  ADJUST_FIELD_ALIGN
    213  1.1  mrg #define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \
    214  1.1  mrg   ((TARGET_ALTIVEC && TREE_CODE (TREE_TYPE (FIELD)) == VECTOR_TYPE)	\
    215  1.1  mrg    ? 128								\
    216  1.1  mrg    : (TARGET_64BIT							\
    217  1.1  mrg       && TARGET_ALIGN_NATURAL == 0					\
    218  1.1  mrg       && TYPE_MODE (strip_array_types (TREE_TYPE (FIELD))) == DFmode)	\
    219  1.1  mrg    ? MIN ((COMPUTED), 32)						\
    220  1.1  mrg    : (COMPUTED))
    221  1.1  mrg 
    222  1.1  mrg /* PowerPC64 NetBSD increases natural record alignment to doubleword if
    223  1.1  mrg    the first field is an FP double, only if in power alignment mode.  */
    224  1.1  mrg #undef  ROUND_TYPE_ALIGN
    225  1.1  mrg #define ROUND_TYPE_ALIGN(STRUCT, COMPUTED, SPECIFIED)			\
    226  1.1  mrg   ((TARGET_64BIT							\
    227  1.1  mrg     && (TREE_CODE (STRUCT) == RECORD_TYPE				\
    228  1.1  mrg 	|| TREE_CODE (STRUCT) == UNION_TYPE				\
    229  1.1  mrg 	|| TREE_CODE (STRUCT) == QUAL_UNION_TYPE)			\
    230  1.1  mrg     && TARGET_ALIGN_NATURAL == 0)					\
    231  1.1  mrg    ? rs6000_special_round_type_align (STRUCT, COMPUTED, SPECIFIED)	\
    232  1.1  mrg    : MAX ((COMPUTED), (SPECIFIED)))
    233  1.1  mrg 
    234  1.1  mrg /* Use the default for compiling target libs.  */
    235  1.1  mrg #ifdef IN_TARGET_LIBS
    236  1.1  mrg #undef TARGET_ALIGN_NATURAL
    237  1.1  mrg #define TARGET_ALIGN_NATURAL 1
    238  1.1  mrg #endif
    239  1.1  mrg 
    240  1.1  mrg /* Indicate that jump tables go in the text section.  */
    241  1.1  mrg #undef  JUMP_TABLES_IN_TEXT_SECTION
    242  1.1  mrg #define JUMP_TABLES_IN_TEXT_SECTION TARGET_64BIT
    243  1.1  mrg 
    244  1.1  mrg /* The linux ppc64 ABI isn't explicit on whether aggregates smaller
    245  1.1  mrg    than a doubleword should be padded upward or downward.  You could
    246  1.1  mrg    reasonably assume that they follow the normal rules for structure
    247  1.1  mrg    layout treating the parameter area as any other block of memory,
    248  1.1  mrg    then map the reg param area to registers.  i.e. pad upward.
    249  1.1  mrg    Setting both of the following defines results in this behavior.
    250  1.1  mrg    Setting just the first one will result in aggregates that fit in a
    251  1.1  mrg    doubleword being padded downward, and others being padded upward.
    252  1.1  mrg    Not a bad idea as this results in struct { int x; } being passed
    253  1.1  mrg    the same way as an int.  */
    254  1.1  mrg #define AGGREGATE_PADDING_FIXED TARGET_64BIT
    255  1.1  mrg #define AGGREGATES_PAD_UPWARD_ALWAYS 0
    256  1.1  mrg 
    257  1.1  mrg /* Specify padding for the last element of a block move between
    258  1.1  mrg    registers and memory.  FIRST is nonzero if this is the only
    259  1.1  mrg    element.  */
    260  1.1  mrg #define BLOCK_REG_PADDING(MODE, TYPE, FIRST) \
    261  1.1  mrg   (!(FIRST) ? upward : FUNCTION_ARG_PADDING (MODE, TYPE))
    262  1.1  mrg 
    263  1.1  mrg /* Override svr4.h  */
    264  1.1  mrg #undef MD_EXEC_PREFIX
    265  1.1  mrg #undef MD_STARTFILE_PREFIX
    266  1.1  mrg 
    267  1.1  mrg /* NetBSD doesn't support saving and restoring 64-bit regs in a 32-bit
    268  1.1  mrg    process.  XXXMRG?  */
    269  1.1  mrg #define OS_MISSING_POWERPC64 !TARGET_64BIT
    270  1.1  mrg 
    271  1.1  mrg /* NetBSD has float and long double forms of math functions.  */
    272  1.1  mrg #undef  TARGET_C99_FUNCTIONS
    273  1.1  mrg #define TARGET_C99_FUNCTIONS 1
    274  1.1  mrg 
    275  1.1  mrg /* NetBSD doesn't have sincos that follows the GNU extension.  */
    276  1.1  mrg #undef  TARGET_HAS_SINCOS
    277  1.1  mrg 
    278  1.1  mrg #undef  TARGET_OS_CPP_BUILTINS
    279  1.1  mrg #define TARGET_OS_CPP_BUILTINS()			\
    280  1.1  mrg   do							\
    281  1.1  mrg     {							\
    282  1.1  mrg       NETBSD_OS_CPP_BUILTINS_ELF();			\
    283  1.1  mrg       if (TARGET_64BIT)					\
    284  1.1  mrg 	{						\
    285  1.1  mrg 	  builtin_define ("__PPC__");			\
    286  1.1  mrg 	  builtin_define ("__PPC64__");			\
    287  1.1  mrg 	  builtin_define ("__powerpc__");		\
    288  1.1  mrg 	  builtin_define ("__powerpc64__");		\
    289  1.1  mrg 	  builtin_define_with_int_value ("__PIC__", 2);	\
    290  1.1  mrg 	  builtin_assert ("cpu=powerpc64");		\
    291  1.1  mrg 	  builtin_assert ("machine=powerpc64");		\
    292  1.1  mrg 	}						\
    293  1.1  mrg       else						\
    294  1.1  mrg 	{						\
    295  1.1  mrg 	  builtin_define_std ("PPC");			\
    296  1.1  mrg 	  builtin_define_std ("powerpc");		\
    297  1.1  mrg 	  builtin_assert ("cpu=powerpc");		\
    298  1.1  mrg 	  builtin_assert ("machine=powerpc");		\
    299  1.1  mrg 	  TARGET_OS_SYSV_CPP_BUILTINS ();		\
    300  1.1  mrg 	}						\
    301  1.1  mrg     }							\
    302  1.1  mrg   while (0)
    303  1.1  mrg 
    304  1.1  mrg /* Override the default from rs6000.h to avoid conflicts with macros
    305  1.1  mrg    defined in NetBSD header files.  */
    306  1.1  mrg 
    307  1.1  mrg #undef  RS6000_CPU_CPP_ENDIAN_BUILTINS
    308  1.1  mrg #define RS6000_CPU_CPP_ENDIAN_BUILTINS()	\
    309  1.1  mrg   do						\
    310  1.1  mrg     {						\
    311  1.1  mrg       builtin_define ("__BIG_ENDIAN__");	\
    312  1.1  mrg       builtin_assert ("machine=bigendian");	\
    313  1.1  mrg     }						\
    314  1.1  mrg   while (0)
    315  1.1  mrg 
    316  1.1  mrg #undef  CPP_OS_DEFAULT_SPEC
    317  1.1  mrg #define CPP_OS_DEFAULT_SPEC "%(cpp_os_netbsd)"
    318  1.1  mrg 
    319  1.1  mrg #undef  LINK_SHLIB_SPEC
    320  1.1  mrg #define LINK_SHLIB_SPEC "%{shared:-shared} %{!shared: %{static:-static}}"
    321  1.1  mrg 
    322  1.1  mrg #undef  LIB_DEFAULT_SPEC
    323  1.1  mrg #define LIB_DEFAULT_SPEC "%(lib_netbsd)"
    324  1.1  mrg 
    325  1.1  mrg #undef  STARTFILE_DEFAULT_SPEC
    326  1.1  mrg #define STARTFILE_DEFAULT_SPEC "%(startfile_netbsd)"
    327  1.1  mrg 
    328  1.1  mrg #undef	ENDFILE_DEFAULT_SPEC
    329  1.1  mrg #define ENDFILE_DEFAULT_SPEC "%(endfile_netbsd)"
    330  1.1  mrg 
    331  1.1  mrg #undef CRTSAVRES_DEFAULT_SPEC
    332  1.1  mrg #define CRTSAVRES_DEFAULT_SPEC ""
    333  1.1  mrg 
    334  1.1  mrg #undef	LINK_START_DEFAULT_SPEC
    335  1.1  mrg #define LINK_START_DEFAULT_SPEC "%(link_start_netbsd)"
    336  1.1  mrg 
    337  1.1  mrg #undef	LINK_OS_DEFAULT_SPEC
    338  1.1  mrg #define LINK_OS_DEFAULT_SPEC "%(link_os_netbsd)"
    339  1.1  mrg 
    340  1.1  mrg #define LINK_OS_NETBSD_SPEC32 "-m elf32ppc %{!shared: %{!static: \
    341  1.1  mrg   %{rdynamic:-export-dynamic} \
    342  1.1  mrg   %{!dynamic-linker:-dynamic-linker /usr/libexec/ld.elf_so}}}"
    343  1.1  mrg 
    344  1.1  mrg #define LINK_OS_NETBSD_SPEC64 "-m elf64ppc %{!shared: %{!static: \
    345  1.1  mrg   %{rdynamic:-export-dynamic} \
    346  1.1  mrg   %{!dynamic-linker:-dynamic-linker /usr/libexec/ld.elf_so}}}"
    347  1.1  mrg 
    348  1.1  mrg #undef  TOC_SECTION_ASM_OP
    349  1.1  mrg #define TOC_SECTION_ASM_OP \
    350  1.1  mrg   (TARGET_64BIT						\
    351  1.1  mrg    ? "\t.section\t\".toc\",\"aw\""			\
    352  1.1  mrg    : "\t.section\t\".got\",\"aw\"")
    353  1.1  mrg 
    354  1.1  mrg #undef  MINIMAL_TOC_SECTION_ASM_OP
    355  1.1  mrg #define MINIMAL_TOC_SECTION_ASM_OP \
    356  1.1  mrg   (TARGET_64BIT						\
    357  1.1  mrg    ? "\t.section\t\".toc1\",\"aw\""			\
    358  1.1  mrg    : ((TARGET_RELOCATABLE || flag_pic)			\
    359  1.1  mrg       ? "\t.section\t\".got2\",\"aw\""			\
    360  1.1  mrg       : "\t.section\t\".got1\",\"aw\""))
    361  1.1  mrg 
    362  1.1  mrg #undef  TARGET_VERSION
    363  1.1  mrg #define TARGET_VERSION fprintf (stderr, " (PowerPC64 NetBSD)");
    364  1.1  mrg 
    365  1.1  mrg /* Make GCC agree with <machine/ansi.h>.  */
    366  1.1  mrg 
    367  1.1  mrg #undef	SIZE_TYPE
    368  1.1  mrg #define	SIZE_TYPE (TARGET_64BIT ? "long unsigned int" : "unsigned int")
    369  1.1  mrg 
    370  1.1  mrg #undef	PTRDIFF_TYPE
    371  1.1  mrg #define	PTRDIFF_TYPE (TARGET_64BIT ? "long int" : "int")
    372  1.1  mrg 
    373  1.1  mrg #undef	WCHAR_TYPE
    374  1.1  mrg #define	WCHAR_TYPE (TARGET_64BIT ? "int" : "long int")
    375  1.1  mrg #undef  WCHAR_TYPE_SIZE
    376  1.1  mrg #define WCHAR_TYPE_SIZE 32
    377  1.1  mrg 
    378  1.1  mrg /* Override rs6000.h definition.  */
    379  1.1  mrg #undef  ASM_APP_ON
    380  1.1  mrg #define ASM_APP_ON "#APP\n"
    381  1.1  mrg 
    382  1.1  mrg /* Override rs6000.h definition.  */
    383  1.1  mrg #undef  ASM_APP_OFF
    384  1.1  mrg #define ASM_APP_OFF "#NO_APP\n"
    385  1.1  mrg 
    386  1.1  mrg /* PowerPC no-op instruction.  */
    387  1.1  mrg #undef  RS6000_CALL_GLUE
    388  1.1  mrg #define RS6000_CALL_GLUE (TARGET_64BIT ? "nop" : "cror 31,31,31")
    389  1.1  mrg 
    390  1.1  mrg #undef  RS6000_MCOUNT
    391  1.1  mrg #define RS6000_MCOUNT "_mcount"
    392  1.1  mrg 
    393  1.1  mrg #ifdef __powerpc64__
    394  1.1  mrg /* _init and _fini functions are built from bits spread across many
    395  1.1  mrg    object files, each potentially with a different TOC pointer.  For
    396  1.1  mrg    that reason, place a nop after the call so that the linker can
    397  1.1  mrg    restore the TOC pointer if a TOC adjusting call stub is needed.  */
    398  1.1  mrg #if DOT_SYMBOLS
    399  1.1  mrg #define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC)	\
    400  1.1  mrg   asm (SECTION_OP "\n"					\
    401  1.1  mrg "	bl ." #FUNC "\n"				\
    402  1.1  mrg "	nop\n"						\
    403  1.1  mrg "	.previous");
    404  1.1  mrg #else
    405  1.1  mrg #define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC)	\
    406  1.1  mrg   asm (SECTION_OP "\n"					\
    407  1.1  mrg "	bl " #FUNC "\n"					\
    408  1.1  mrg "	nop\n"						\
    409  1.1  mrg "	.previous");
    410  1.1  mrg #endif
    411  1.1  mrg #endif
    412  1.1  mrg 
    413  1.1  mrg /* FP save and restore routines.  */
    414  1.1  mrg #undef  SAVE_FP_PREFIX
    415  1.1  mrg #define SAVE_FP_PREFIX (TARGET_64BIT ? "._savef" : "_savefpr_")
    416  1.1  mrg #undef  SAVE_FP_SUFFIX
    417  1.1  mrg #define SAVE_FP_SUFFIX (TARGET_64BIT ? "" : "_l")
    418  1.1  mrg #undef  RESTORE_FP_PREFIX
    419  1.1  mrg #define RESTORE_FP_PREFIX (TARGET_64BIT ? "._restf" : "_restfpr_")
    420  1.1  mrg #undef  RESTORE_FP_SUFFIX
    421  1.1  mrg #define RESTORE_FP_SUFFIX (TARGET_64BIT ? "" : "_l")
    422  1.1  mrg 
    423  1.1  mrg /* Dwarf2 debugging.  */
    424  1.1  mrg #undef  PREFERRED_DEBUGGING_TYPE
    425  1.1  mrg #define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
    426  1.1  mrg 
    427  1.1  mrg /* This is how to declare the size of a function.  */
    428  1.1  mrg #undef	ASM_DECLARE_FUNCTION_SIZE
    429  1.1  mrg #define	ASM_DECLARE_FUNCTION_SIZE(FILE, FNAME, DECL)			\
    430  1.1  mrg   do									\
    431  1.1  mrg     {									\
    432  1.1  mrg       if (!flag_inhibit_size_directive)					\
    433  1.1  mrg 	{								\
    434  1.1  mrg 	  fputs ("\t.size\t", (FILE));					\
    435  1.1  mrg 	  if (TARGET_64BIT && DOT_SYMBOLS)				\
    436  1.1  mrg 	    putc ('.', (FILE));						\
    437  1.1  mrg 	  assemble_name ((FILE), (FNAME));				\
    438  1.1  mrg 	  fputs (",.-", (FILE));					\
    439  1.1  mrg 	  rs6000_output_function_entry (FILE, FNAME);			\
    440  1.1  mrg 	  putc ('\n', (FILE));						\
    441  1.1  mrg 	}								\
    442  1.1  mrg     }									\
    443  1.1  mrg   while (0)
    444  1.1  mrg 
    445  1.1  mrg /* Return nonzero if this entry is to be written into the constant
    446  1.1  mrg    pool in a special way.  We do so if this is a SYMBOL_REF, LABEL_REF
    447  1.1  mrg    or a CONST containing one of them.  If -mfp-in-toc (the default),
    448  1.1  mrg    we also do this for floating-point constants.  We actually can only
    449  1.1  mrg    do this if the FP formats of the target and host machines are the
    450  1.1  mrg    same, but we can't check that since not every file that uses
    451  1.1  mrg    the macros includes real.h.  We also do this when we can write the
    452  1.1  mrg    entry into the TOC and the entry is not larger than a TOC entry.  */
    453  1.1  mrg 
    454  1.1  mrg #undef  ASM_OUTPUT_SPECIAL_POOL_ENTRY_P
    455  1.1  mrg #define ASM_OUTPUT_SPECIAL_POOL_ENTRY_P(X, MODE)			\
    456  1.1  mrg   (TARGET_TOC								\
    457  1.1  mrg    && (GET_CODE (X) == SYMBOL_REF					\
    458  1.1  mrg        || (GET_CODE (X) == CONST && GET_CODE (XEXP (X, 0)) == PLUS	\
    459  1.1  mrg 	   && GET_CODE (XEXP (XEXP (X, 0), 0)) == SYMBOL_REF)		\
    460  1.1  mrg        || GET_CODE (X) == LABEL_REF					\
    461  1.1  mrg        || (GET_CODE (X) == CONST_INT 					\
    462  1.1  mrg 	   && GET_MODE_BITSIZE (MODE) <= GET_MODE_BITSIZE (Pmode))	\
    463  1.1  mrg        || (GET_CODE (X) == CONST_DOUBLE					\
    464  1.1  mrg 	   && ((TARGET_64BIT						\
    465  1.1  mrg 		&& (TARGET_MINIMAL_TOC					\
    466  1.1  mrg 		    || (SCALAR_FLOAT_MODE_P (GET_MODE (X))		\
    467  1.1  mrg 			&& ! TARGET_NO_FP_IN_TOC)))			\
    468  1.1  mrg 	       || (!TARGET_64BIT					\
    469  1.1  mrg 		   && !TARGET_NO_FP_IN_TOC				\
    470  1.1  mrg 		   && !TARGET_RELOCATABLE				\
    471  1.1  mrg 		   && SCALAR_FLOAT_MODE_P (GET_MODE (X))		\
    472  1.1  mrg 		   && BITS_PER_WORD == HOST_BITS_PER_INT)))))
    473  1.1  mrg 
    474  1.1  mrg /* This ABI cannot use DBX_LINES_FUNCTION_RELATIVE, nor can it use
    475  1.1  mrg    dbxout_stab_value_internal_label_diff, because we must
    476  1.1  mrg    use the function code label, not the function descriptor label.  */
    477  1.1  mrg #define	DBX_OUTPUT_SOURCE_LINE(FILE, LINE, COUNTER)			\
    478  1.1  mrg do									\
    479  1.1  mrg   {									\
    480  1.1  mrg     char temp[256];							\
    481  1.1  mrg     const char *s;							\
    482  1.1  mrg     ASM_GENERATE_INTERNAL_LABEL (temp, "LM", COUNTER);			\
    483  1.1  mrg     dbxout_begin_stabn_sline (LINE);					\
    484  1.1  mrg     assemble_name (FILE, temp);						\
    485  1.1  mrg     putc ('-', FILE);							\
    486  1.1  mrg     s = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);		\
    487  1.1  mrg     rs6000_output_function_entry (FILE, s);				\
    488  1.1  mrg     putc ('\n', FILE);							\
    489  1.1  mrg     targetm.asm_out.internal_label (FILE, "LM", COUNTER);		\
    490  1.1  mrg     COUNTER += 1;							\
    491  1.1  mrg   }									\
    492  1.1  mrg while (0)
    493  1.1  mrg 
    494  1.1  mrg /* Similarly, we want the function code label here.  Cannot use
    495  1.1  mrg    dbxout_stab_value_label_diff, as we have to use
    496  1.1  mrg    rs6000_output_function_entry.  FIXME.  */
    497  1.1  mrg #define DBX_OUTPUT_BRAC(FILE, NAME, BRAC)				\
    498  1.1  mrg   do									\
    499  1.1  mrg     {									\
    500  1.1  mrg       const char *s;							\
    501  1.1  mrg       dbxout_begin_stabn (BRAC);					\
    502  1.1  mrg       s = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);		\
    503  1.1  mrg       /* dbxout_block passes this macro the function name as NAME,	\
    504  1.1  mrg 	 assuming that it is the function code start label.  In our	\
    505  1.1  mrg 	 case, the function name is the OPD entry.  dbxout_block is	\
    506  1.1  mrg 	 broken, hack around it here.  */				\
    507  1.1  mrg       if (NAME == s)							\
    508  1.1  mrg 	putc ('0', FILE);						\
    509  1.1  mrg       else								\
    510  1.1  mrg 	{								\
    511  1.1  mrg 	  assemble_name (FILE, NAME);					\
    512  1.1  mrg 	  putc ('-', FILE);						\
    513  1.1  mrg 	  rs6000_output_function_entry (FILE, s);			\
    514  1.1  mrg 	}								\
    515  1.1  mrg       putc ('\n', FILE);						\
    516  1.1  mrg     }									\
    517  1.1  mrg   while (0)
    518  1.1  mrg 
    519  1.1  mrg #define DBX_OUTPUT_LBRAC(FILE, NAME) DBX_OUTPUT_BRAC (FILE, NAME, N_LBRAC)
    520  1.1  mrg #define DBX_OUTPUT_RBRAC(FILE, NAME) DBX_OUTPUT_BRAC (FILE, NAME, N_RBRAC)
    521  1.1  mrg 
    522  1.1  mrg /* Another case where we want the dot name.  */
    523  1.1  mrg #define	DBX_OUTPUT_NFUN(FILE, LSCOPE, DECL)				\
    524  1.1  mrg   do									\
    525  1.1  mrg     {									\
    526  1.1  mrg       const char *s;							\
    527  1.1  mrg       dbxout_begin_empty_stabs (N_FUN);					\
    528  1.1  mrg       assemble_name (FILE, LSCOPE);					\
    529  1.1  mrg       putc ('-', FILE);							\
    530  1.1  mrg       s = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);		\
    531  1.1  mrg       rs6000_output_function_entry (FILE, s);				\
    532  1.1  mrg       putc ('\n', FILE);						\
    533  1.1  mrg     }									\
    534  1.1  mrg   while (0)
    535  1.1  mrg 
    536  1.1  mrg /* Select a format to encode pointers in exception handling data.  CODE
    537  1.1  mrg    is 0 for data, 1 for code labels, 2 for function pointers.  GLOBAL is
    538  1.1  mrg    true if the symbol may be affected by dynamic relocations.  */
    539  1.1  mrg #undef	ASM_PREFERRED_EH_DATA_FORMAT
    540  1.1  mrg #define	ASM_PREFERRED_EH_DATA_FORMAT(CODE, GLOBAL) \
    541  1.1  mrg   ((TARGET_64BIT || flag_pic || TARGET_RELOCATABLE)			\
    542  1.1  mrg    ? (((GLOBAL) ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel		\
    543  1.1  mrg       | (TARGET_64BIT ? DW_EH_PE_udata8 : DW_EH_PE_sdata4))		\
    544  1.1  mrg    : DW_EH_PE_absptr)
    545  1.1  mrg 
    546  1.1  mrg /* For backward compatibility, we must continue to use the AIX
    547  1.1  mrg    structure return convention.  */
    548  1.1  mrg #undef DRAFT_V4_STRUCT_RET
    549  1.1  mrg #define DRAFT_V4_STRUCT_RET (!TARGET_64BIT)
    550  1.1  mrg 
    551  1.1  mrg #define TARGET_ASM_FILE_END rs6000_elf_end_indicate_exec_stack
    552  1.1  mrg 
    553  1.1  mrg #define TARGET_POSIX_IO
    554  1.1  mrg 
    555  1.1  mrg #define LINK_GCC_C_SEQUENCE_SPEC \
    556  1.1  mrg   "%{static:--start-group} %G %L %{static:--end-group}%{!static:%G}"
    557  1.1  mrg 
    558  1.1  mrg /* Use --as-needed -lgcc_s for eh support.  */
    559  1.1  mrg #ifdef HAVE_LD_AS_NEEDED
    560  1.1  mrg #define USE_LD_AS_NEEDED 1
    561  1.1  mrg #endif
    562  1.1  mrg 
    563  1.1  mrg /* NetBSD ppc64 has 128-bit long double support.  */
    564  1.1  mrg #undef	RS6000_DEFAULT_LONG_DOUBLE_SIZE
    565  1.1  mrg #define RS6000_DEFAULT_LONG_DOUBLE_SIZE 128
    566  1.1  mrg #define POWERPC_NETBSD
    567