110d565efSmrg /* Target definitions for GNU compiler for PowerPC running System V.4
2*ec02198aSmrg    Copyright (C) 1995-2020 Free Software Foundation, Inc.
310d565efSmrg    Contributed by Cygnus Support.
410d565efSmrg 
510d565efSmrg    This file is part of GCC.
610d565efSmrg 
710d565efSmrg    GCC is free software; you can redistribute it and/or modify it
810d565efSmrg    under the terms of the GNU General Public License as published
910d565efSmrg    by the Free Software Foundation; either version 3, or (at your
1010d565efSmrg    option) any later version.
1110d565efSmrg 
1210d565efSmrg    GCC is distributed in the hope that it will be useful, but WITHOUT
1310d565efSmrg    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
1410d565efSmrg    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
1510d565efSmrg    License for more details.
1610d565efSmrg 
1710d565efSmrg    Under Section 7 of GPL version 3, you are granted additional
1810d565efSmrg    permissions described in the GCC Runtime Library Exception, version
1910d565efSmrg    3.1, as published by the Free Software Foundation.
2010d565efSmrg 
2110d565efSmrg    You should have received a copy of the GNU General Public License and
2210d565efSmrg    a copy of the GCC Runtime Library Exception along with this program;
2310d565efSmrg    see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
2410d565efSmrg    <http://www.gnu.org/licenses/>.  */
2510d565efSmrg 
260fc04c29Smrg #undef GNU_USER_TARGET_CRTI
270fc04c29Smrg #define GNU_USER_TARGET_CRTI "%{mnewlib:ecrti.o%s;:crti.o%s}"
280fc04c29Smrg #undef GNU_USER_TARGET_CRTN
290fc04c29Smrg #define GNU_USER_TARGET_CRTN "%{mnewlib:ecrtn.o%s;:crtn.o%s}"
3010d565efSmrg 
3110d565efSmrg /* Yes!  We are ELF.  */
3210d565efSmrg #define	TARGET_OBJECT_FORMAT OBJECT_ELF
3310d565efSmrg 
3410d565efSmrg /* Default ABI to compile code for.  */
3510d565efSmrg #define DEFAULT_ABI rs6000_current_abi
3610d565efSmrg 
3710d565efSmrg /* Default ABI to use.  */
3810d565efSmrg #define RS6000_ABI_NAME "sysv"
3910d565efSmrg 
4010d565efSmrg /* Override rs6000.h definition.  */
4110d565efSmrg #undef	ASM_DEFAULT_SPEC
42*ec02198aSmrg #define	ASM_DEFAULT_SPEC "-mppc%{m64:64}"
4310d565efSmrg 
44*ec02198aSmrg #define	TARGET_HAS_TOC		(TARGET_64BIT				\
4510d565efSmrg 				 || (TARGET_MINIMAL_TOC			\
4610d565efSmrg 				     && flag_pic > 1)			\
4710d565efSmrg 				 || DEFAULT_ABI != ABI_V4)
4810d565efSmrg 
4910d565efSmrg #define	TARGET_BITFIELD_TYPE	(! TARGET_NO_BITFIELD_TYPE)
5010d565efSmrg #define	TARGET_BIG_ENDIAN	(! TARGET_LITTLE_ENDIAN)
5110d565efSmrg #define	TARGET_PROTOTYPE	target_prototype
5210d565efSmrg #define	TARGET_NO_PROTOTYPE	(! TARGET_PROTOTYPE)
5310d565efSmrg #define	TARGET_NO_EABI		(! TARGET_EABI)
5410d565efSmrg #define	TARGET_REGNAMES		rs6000_regnames
5510d565efSmrg 
5610d565efSmrg #ifdef HAVE_AS_REL16
5710d565efSmrg #undef TARGET_SECURE_PLT
5810d565efSmrg #define TARGET_SECURE_PLT	secure_plt
5910d565efSmrg #endif
6010d565efSmrg 
610fc04c29Smrg #if HAVE_AS_PLTSEQ
620fc04c29Smrg #undef TARGET_PLTSEQ
630fc04c29Smrg #define TARGET_PLTSEQ rs6000_pltseq
640fc04c29Smrg #endif
650fc04c29Smrg 
6610d565efSmrg #define SDATA_DEFAULT_SIZE 8
6710d565efSmrg 
6810d565efSmrg /* The macro SUBTARGET_OVERRIDE_OPTIONS is provided for subtargets, to
6910d565efSmrg    get control in TARGET_OPTION_OVERRIDE.  */
7010d565efSmrg 
7110d565efSmrg #define SUBTARGET_OVERRIDE_OPTIONS					\
7210d565efSmrg do {									\
7310d565efSmrg   if (!global_options_set.x_g_switch_value)				\
7410d565efSmrg     g_switch_value = SDATA_DEFAULT_SIZE;				\
7510d565efSmrg 									\
7610d565efSmrg   if (rs6000_abi_name == NULL)						\
7710d565efSmrg     rs6000_abi_name = RS6000_ABI_NAME;					\
7810d565efSmrg 									\
7910d565efSmrg   if (!strcmp (rs6000_abi_name, "sysv"))				\
8010d565efSmrg     rs6000_current_abi = ABI_V4;					\
8110d565efSmrg   else if (!strcmp (rs6000_abi_name, "sysv-noeabi"))			\
8210d565efSmrg     {									\
8310d565efSmrg       rs6000_current_abi = ABI_V4;					\
8410d565efSmrg       rs6000_isa_flags &= ~ OPTION_MASK_EABI;				\
8510d565efSmrg     }									\
8610d565efSmrg   else if (!strcmp (rs6000_abi_name, "sysv-eabi")			\
8710d565efSmrg 	   || !strcmp (rs6000_abi_name, "eabi"))			\
8810d565efSmrg     {									\
8910d565efSmrg       rs6000_current_abi = ABI_V4;					\
9010d565efSmrg       rs6000_isa_flags |= OPTION_MASK_EABI;				\
9110d565efSmrg     }									\
9210d565efSmrg   else if (!strcmp (rs6000_abi_name, "aixdesc"))			\
9310d565efSmrg     rs6000_current_abi = ABI_AIX;					\
9410d565efSmrg   else if (!strcmp (rs6000_abi_name, "freebsd")				\
9510d565efSmrg 	   || !strcmp (rs6000_abi_name, "netbsd")			\
9610d565efSmrg 	   || !strcmp (rs6000_abi_name, "linux"))			\
9710d565efSmrg     {									\
9810d565efSmrg       if (TARGET_64BIT)							\
9910d565efSmrg 	rs6000_current_abi = ABI_AIX;					\
10010d565efSmrg       else								\
10110d565efSmrg 	rs6000_current_abi = ABI_V4;					\
10210d565efSmrg     }									\
10310d565efSmrg   else if (!strcmp (rs6000_abi_name, "openbsd"))			\
10410d565efSmrg     rs6000_current_abi = ABI_V4;					\
10510d565efSmrg   else if (!strcmp (rs6000_abi_name, "i960-old"))			\
10610d565efSmrg     {									\
10710d565efSmrg       rs6000_current_abi = ABI_V4;					\
10810d565efSmrg       rs6000_isa_flags |= (OPTION_MASK_LITTLE_ENDIAN | OPTION_MASK_EABI); \
10910d565efSmrg       rs6000_isa_flags &= ~OPTION_MASK_STRICT_ALIGN;			\
11010d565efSmrg       TARGET_NO_BITFIELD_WORD = 1;					\
11110d565efSmrg     }									\
11210d565efSmrg   else									\
11310d565efSmrg     {									\
11410d565efSmrg       rs6000_current_abi = ABI_V4;					\
115c7a68eb7Smrg       error ("bad value for %<%s-%s%>", "-mcall", rs6000_abi_name);	\
11610d565efSmrg     }									\
11710d565efSmrg 									\
11810d565efSmrg   if (rs6000_sdata_name)						\
11910d565efSmrg     {									\
12010d565efSmrg       if (!strcmp (rs6000_sdata_name, "none"))				\
12110d565efSmrg 	rs6000_sdata = SDATA_NONE;					\
12210d565efSmrg       else if (!strcmp (rs6000_sdata_name, "data"))			\
12310d565efSmrg 	rs6000_sdata = SDATA_DATA;					\
12410d565efSmrg       else if (!strcmp (rs6000_sdata_name, "default"))			\
12510d565efSmrg 	rs6000_sdata = (TARGET_EABI) ? SDATA_EABI : SDATA_SYSV;		\
12610d565efSmrg       else if (!strcmp (rs6000_sdata_name, "sysv"))			\
12710d565efSmrg 	rs6000_sdata = SDATA_SYSV;					\
12810d565efSmrg       else if (!strcmp (rs6000_sdata_name, "eabi"))			\
12910d565efSmrg 	rs6000_sdata = SDATA_EABI;					\
13010d565efSmrg       else								\
131c7a68eb7Smrg 	error ("bad value for %<%s=%s%>", "-msdata", rs6000_sdata_name);\
13210d565efSmrg     }									\
13310d565efSmrg   else if (DEFAULT_ABI == ABI_V4)					\
13410d565efSmrg     {									\
13510d565efSmrg       rs6000_sdata = SDATA_DATA;					\
13610d565efSmrg       rs6000_sdata_name = "data";					\
13710d565efSmrg     }									\
13810d565efSmrg   else									\
13910d565efSmrg     {									\
14010d565efSmrg       rs6000_sdata = SDATA_NONE;					\
14110d565efSmrg       rs6000_sdata_name = "none";					\
14210d565efSmrg     }									\
14310d565efSmrg 									\
14410d565efSmrg   if (TARGET_RELOCATABLE &&						\
14510d565efSmrg       (rs6000_sdata == SDATA_EABI || rs6000_sdata == SDATA_SYSV))	\
14610d565efSmrg     {									\
14710d565efSmrg       rs6000_sdata = SDATA_DATA;					\
148c7a68eb7Smrg       error ("%qs and %<%s=%s%> are incompatible", rs6000_sdata_name,	\
149c7a68eb7Smrg 	     "-mrelocatable", "-msdata");				\
15010d565efSmrg     }									\
15110d565efSmrg 									\
15210d565efSmrg   else if (flag_pic && DEFAULT_ABI == ABI_V4				\
15310d565efSmrg 	   && (rs6000_sdata == SDATA_EABI				\
15410d565efSmrg 	       || rs6000_sdata == SDATA_SYSV))				\
15510d565efSmrg     {									\
15610d565efSmrg       rs6000_sdata = SDATA_DATA;					\
157c7a68eb7Smrg       error ("%<-f%s%> and %<%s=%s%> are incompatible",			\
15810d565efSmrg 	     (flag_pic > 1) ? "PIC" : "pic",				\
159c7a68eb7Smrg 	     "-msdata", rs6000_sdata_name);				\
16010d565efSmrg     }									\
16110d565efSmrg 									\
16210d565efSmrg   if ((rs6000_sdata != SDATA_NONE && DEFAULT_ABI != ABI_V4)		\
16310d565efSmrg       || (rs6000_sdata == SDATA_EABI && !TARGET_EABI))			\
16410d565efSmrg     {									\
16510d565efSmrg       rs6000_sdata = SDATA_NONE;					\
166c7a68eb7Smrg       error ("%<%s=%s%> and %<%s-%s%> are incompatible",		\
167c7a68eb7Smrg 	     "-msdata", rs6000_sdata_name, "-mcall", rs6000_abi_name);	\
16810d565efSmrg     }									\
16910d565efSmrg 									\
17010d565efSmrg   targetm.have_srodata_section = rs6000_sdata == SDATA_EABI;		\
17110d565efSmrg 									\
17210d565efSmrg   if (TARGET_RELOCATABLE && !TARGET_MINIMAL_TOC)			\
17310d565efSmrg     {									\
17410d565efSmrg       rs6000_isa_flags |= OPTION_MASK_MINIMAL_TOC;			\
175c7a68eb7Smrg       error ("%qs and %qs are incompatible", "-mrelocatable",		\
176c7a68eb7Smrg 	     "-mno-minimal-toc");					\
17710d565efSmrg     }									\
17810d565efSmrg 									\
17910d565efSmrg   if (TARGET_RELOCATABLE && rs6000_current_abi != ABI_V4)		\
18010d565efSmrg     {									\
18110d565efSmrg       rs6000_isa_flags &= ~OPTION_MASK_RELOCATABLE;			\
182c7a68eb7Smrg       error ("%qs and %<%s-%s%> are incompatible",			\
183c7a68eb7Smrg 	     "-mrelocatable", "-mcall", rs6000_abi_name);		\
18410d565efSmrg     }									\
18510d565efSmrg 									\
18610d565efSmrg   if (!TARGET_64BIT && flag_pic > 1 && rs6000_current_abi != ABI_V4)	\
18710d565efSmrg     {									\
18810d565efSmrg       flag_pic = 0;							\
189c7a68eb7Smrg       error ("%qs and %<%s-%s%> are incompatible",			\
190c7a68eb7Smrg 	     "-fPIC", "-mcall", rs6000_abi_name);			\
19110d565efSmrg     }									\
19210d565efSmrg 									\
19310d565efSmrg   if (TARGET_SECURE_PLT != secure_plt)					\
19410d565efSmrg     {									\
195c7a68eb7Smrg       error ("%qs not supported by your assembler", "-msecure-plt");	\
19610d565efSmrg     }									\
19710d565efSmrg 									\
1980fc04c29Smrg   if (TARGET_PLTSEQ != rs6000_pltseq					\
1990fc04c29Smrg       && global_options_set.x_rs6000_pltseq)				\
2000fc04c29Smrg     {									\
2010fc04c29Smrg       error ("%qs not supported by your assembler", "-mpltseq");	\
2020fc04c29Smrg     }									\
2030fc04c29Smrg 									\
2040fc04c29Smrg   if (DEFAULT_ABI == ABI_V4 && TARGET_PLTSEQ && !TARGET_SECURE_PLT)	\
2050fc04c29Smrg     {									\
2060fc04c29Smrg       if (global_options_set.x_rs6000_pltseq)				\
2070fc04c29Smrg 	{								\
2080fc04c29Smrg 	  if (global_options_set.x_secure_plt)				\
2090fc04c29Smrg 	    error ("%qs and %qs are incompatible",			\
2100fc04c29Smrg 		   "-mpltseq", "-mbss-plt");				\
2110fc04c29Smrg 	  else								\
2120fc04c29Smrg 	    secure_plt = true;						\
2130fc04c29Smrg 	}								\
2140fc04c29Smrg       if (!TARGET_SECURE_PLT)						\
2150fc04c29Smrg 	rs6000_pltseq = false;						\
2160fc04c29Smrg     }									\
2170fc04c29Smrg 									\
21810d565efSmrg   if (flag_pic > 1 && DEFAULT_ABI == ABI_V4)				\
21910d565efSmrg     {									\
22010d565efSmrg       /* Note: flag_pic should not change any option flags that would	\
22110d565efSmrg 	 be invalid with or pessimise -fno-PIC code.  LTO turns off	\
22210d565efSmrg 	 flag_pic when linking/recompiling a fixed position executable. \
22310d565efSmrg 	 However, if the objects were originally compiled with -fPIC,	\
22410d565efSmrg 	 then other target options forced on here by -fPIC are restored \
22510d565efSmrg 	 when recompiling those objects without -fPIC.  In particular	\
22610d565efSmrg 	 TARGET_RELOCATABLE must not be enabled here by flag_pic.  */	\
22710d565efSmrg       rs6000_isa_flags |= OPTION_MASK_MINIMAL_TOC;			\
22810d565efSmrg       TARGET_NO_FP_IN_TOC = 1;						\
22910d565efSmrg     }									\
23010d565efSmrg 									\
23110d565efSmrg   if (TARGET_RELOCATABLE)						\
23210d565efSmrg     {									\
23310d565efSmrg       if (!flag_pic)							\
23410d565efSmrg 	flag_pic = 2;							\
23510d565efSmrg       TARGET_NO_FP_IN_TOC = 1;						\
23610d565efSmrg     }									\
23710d565efSmrg } while (0)
23810d565efSmrg 
23910d565efSmrg #ifndef RS6000_BI_ARCH
24010d565efSmrg # define SUBSUBTARGET_OVERRIDE_OPTIONS					\
24110d565efSmrg do {									\
24210d565efSmrg   if ((TARGET_DEFAULT ^ rs6000_isa_flags) & OPTION_MASK_64BIT)		\
243c7a68eb7Smrg     error ("%<-m%s%> not supported in this configuration",		\
24410d565efSmrg 	   (rs6000_isa_flags & OPTION_MASK_64BIT) ? "64" : "32");	\
24510d565efSmrg } while (0)
24610d565efSmrg #endif
24710d565efSmrg 
24810d565efSmrg /* Override rs6000.h definition.  */
24910d565efSmrg #undef	TARGET_DEFAULT
25010d565efSmrg #define	TARGET_DEFAULT 0
25110d565efSmrg 
25210d565efSmrg /* Override rs6000.h definition.  */
25310d565efSmrg #undef	PROCESSOR_DEFAULT
25410d565efSmrg #define	PROCESSOR_DEFAULT PROCESSOR_PPC750
25510d565efSmrg 
25610d565efSmrg #define FIXED_R2 1
25710d565efSmrg /* System V.4 uses register 13 as a pointer to the small data area,
25810d565efSmrg    so it is not available to the normal user.  */
25910d565efSmrg #define FIXED_R13 1
26010d565efSmrg 
26110d565efSmrg /* Override default big endianism definitions in rs6000.h.  */
26210d565efSmrg #undef	BYTES_BIG_ENDIAN
26310d565efSmrg #undef	WORDS_BIG_ENDIAN
26410d565efSmrg #define	BYTES_BIG_ENDIAN (TARGET_BIG_ENDIAN)
26510d565efSmrg #define	WORDS_BIG_ENDIAN (TARGET_BIG_ENDIAN)
26610d565efSmrg 
26710d565efSmrg /* Put jump tables in read-only memory, rather than in .text.  */
26810d565efSmrg #define JUMP_TABLES_IN_TEXT_SECTION 0
26910d565efSmrg 
27010d565efSmrg /* Prefix and suffix to use to saving floating point.  */
27110d565efSmrg #define	SAVE_FP_PREFIX "_savefpr_"
27210d565efSmrg #define SAVE_FP_SUFFIX ""
27310d565efSmrg 
27410d565efSmrg /* Prefix and suffix to use to restoring floating point.  */
27510d565efSmrg #define	RESTORE_FP_PREFIX "_restfpr_"
27610d565efSmrg #define RESTORE_FP_SUFFIX ""
27710d565efSmrg 
27810d565efSmrg /* Type used for size_t, as a string used in a declaration.  */
27910d565efSmrg #undef  SIZE_TYPE
28010d565efSmrg #define SIZE_TYPE "unsigned int"
28110d565efSmrg 
28210d565efSmrg /* Type used for ptrdiff_t, as a string used in a declaration.  */
28310d565efSmrg #define PTRDIFF_TYPE "int"
28410d565efSmrg 
28510d565efSmrg #undef	WCHAR_TYPE
28610d565efSmrg #define WCHAR_TYPE "long int"
28710d565efSmrg 
28810d565efSmrg #undef	WCHAR_TYPE_SIZE
28910d565efSmrg #define WCHAR_TYPE_SIZE 32
29010d565efSmrg 
29110d565efSmrg /* Make int foo : 8 not cause structures to be aligned to an int boundary.  */
29210d565efSmrg /* Override elfos.h definition.  */
29310d565efSmrg #undef	PCC_BITFIELD_TYPE_MATTERS
29410d565efSmrg #define	PCC_BITFIELD_TYPE_MATTERS (TARGET_BITFIELD_TYPE)
29510d565efSmrg 
29610d565efSmrg #undef	BITFIELD_NBYTES_LIMITED
29710d565efSmrg #define	BITFIELD_NBYTES_LIMITED (TARGET_NO_BITFIELD_WORD)
29810d565efSmrg 
29910d565efSmrg /* Define this macro to be the value 1 if instructions will fail to
30010d565efSmrg    work if given data not on the nominal alignment.  If instructions
30110d565efSmrg    will merely go slower in that case, define this macro as 0.  */
30210d565efSmrg #undef	STRICT_ALIGNMENT
30310d565efSmrg #define	STRICT_ALIGNMENT (TARGET_STRICT_ALIGN)
30410d565efSmrg 
30510d565efSmrg /* Define this macro if you wish to preserve a certain alignment for
30610d565efSmrg    the stack pointer, greater than what the hardware enforces.  The
30710d565efSmrg    definition is a C expression for the desired alignment (measured
30810d565efSmrg    in bits).  This macro must evaluate to a value equal to or larger
30910d565efSmrg    than STACK_BOUNDARY.
31010d565efSmrg    For the SYSV ABI and variants the alignment of the stack pointer
31110d565efSmrg    is usually controlled manually in rs6000.c. However, to maintain
31210d565efSmrg    alignment across alloca () in all circumstances,
31310d565efSmrg    PREFERRED_STACK_BOUNDARY needs to be set as well.
31410d565efSmrg    This has the additional advantage of allowing a bigger maximum
31510d565efSmrg    alignment of user objects on the stack.  */
31610d565efSmrg 
31710d565efSmrg #undef PREFERRED_STACK_BOUNDARY
31810d565efSmrg #define PREFERRED_STACK_BOUNDARY 128
31910d565efSmrg 
32010d565efSmrg /* Real stack boundary as mandated by the appropriate ABI.  */
32110d565efSmrg #define ABI_STACK_BOUNDARY \
32210d565efSmrg   ((TARGET_EABI && !TARGET_ALTIVEC && !TARGET_ALTIVEC_ABI) ? 64 : 128)
32310d565efSmrg 
32410d565efSmrg /* An expression for the alignment of a structure field FIELD if the
32510d565efSmrg    alignment computed in the usual way is COMPUTED.  */
32610d565efSmrg #define ADJUST_FIELD_ALIGN(FIELD, TYPE, COMPUTED)			      \
32710d565efSmrg 	(rs6000_special_adjust_field_align_p ((TYPE), (COMPUTED))	      \
32810d565efSmrg 	 ? 128 : COMPUTED)
32910d565efSmrg 
33010d565efSmrg #undef  BIGGEST_FIELD_ALIGNMENT
33110d565efSmrg 
33210d565efSmrg /* Use ELF style section commands.  */
33310d565efSmrg 
33410d565efSmrg #define	TEXT_SECTION_ASM_OP	"\t.section\t\".text\""
33510d565efSmrg 
33610d565efSmrg #define	DATA_SECTION_ASM_OP	"\t.section\t\".data\""
33710d565efSmrg 
33810d565efSmrg #define	BSS_SECTION_ASM_OP	"\t.section\t\".bss\""
33910d565efSmrg 
34010d565efSmrg /* Override elfos.h definition.  */
34110d565efSmrg #undef	INIT_SECTION_ASM_OP
34210d565efSmrg #define	INIT_SECTION_ASM_OP "\t.section\t\".init\",\"ax\""
34310d565efSmrg 
34410d565efSmrg /* Override elfos.h definition.  */
34510d565efSmrg #undef	FINI_SECTION_ASM_OP
34610d565efSmrg #define	FINI_SECTION_ASM_OP "\t.section\t\".fini\",\"ax\""
34710d565efSmrg 
34810d565efSmrg #define	TOC_SECTION_ASM_OP "\t.section\t\".got\",\"aw\""
34910d565efSmrg 
35010d565efSmrg /* Put PC relative got entries in .got2.  */
35110d565efSmrg #define	MINIMAL_TOC_SECTION_ASM_OP \
35210d565efSmrg   (flag_pic ? "\t.section\t\".got2\",\"aw\"" : "\t.section\t\".got1\",\"aw\"")
35310d565efSmrg 
35410d565efSmrg #define	SDATA_SECTION_ASM_OP "\t.section\t\".sdata\",\"aw\""
35510d565efSmrg #define	SDATA2_SECTION_ASM_OP "\t.section\t\".sdata2\",\"a\""
35610d565efSmrg #define	SBSS_SECTION_ASM_OP "\t.section\t\".sbss\",\"aw\",@nobits"
35710d565efSmrg 
35810d565efSmrg /* Override default elf definitions.  */
35910d565efSmrg #define TARGET_ASM_INIT_SECTIONS rs6000_elf_asm_init_sections
36010d565efSmrg #undef  TARGET_ASM_RELOC_RW_MASK
36110d565efSmrg #define TARGET_ASM_RELOC_RW_MASK rs6000_elf_reloc_rw_mask
36210d565efSmrg #undef	TARGET_ASM_SELECT_RTX_SECTION
36310d565efSmrg #define	TARGET_ASM_SELECT_RTX_SECTION rs6000_elf_select_rtx_section
36410d565efSmrg 
36510d565efSmrg /* Return nonzero if this entry is to be written into the constant pool
36610d565efSmrg    in a special way.  We do so if this is a SYMBOL_REF, LABEL_REF or a CONST
36710d565efSmrg    containing one of them.  If -mfp-in-toc (the default), we also do
36810d565efSmrg    this for floating-point constants.  We actually can only do this
36910d565efSmrg    if the FP formats of the target and host machines are the same, but
37010d565efSmrg    we can't check that since not every file that uses these target macros
37110d565efSmrg    includes real.h.
37210d565efSmrg 
37310d565efSmrg    Unlike AIX, we don't key off of -mminimal-toc, but instead do not
37410d565efSmrg    allow floating point constants in the TOC if -mrelocatable.  */
37510d565efSmrg 
37610d565efSmrg #undef	ASM_OUTPUT_SPECIAL_POOL_ENTRY_P
37710d565efSmrg #define	ASM_OUTPUT_SPECIAL_POOL_ENTRY_P(X, MODE)			\
37810d565efSmrg   (TARGET_TOC								\
3790fc04c29Smrg    && (SYMBOL_REF_P (X)							\
38010d565efSmrg        || (GET_CODE (X) == CONST && GET_CODE (XEXP (X, 0)) == PLUS	\
3810fc04c29Smrg 	   && SYMBOL_REF_P (XEXP (XEXP (X, 0), 0)))			\
38210d565efSmrg        || GET_CODE (X) == LABEL_REF					\
3830fc04c29Smrg        || (CONST_INT_P (X)						\
38410d565efSmrg 	   && GET_MODE_BITSIZE (MODE) <= GET_MODE_BITSIZE (Pmode))	\
38510d565efSmrg        || (!TARGET_NO_FP_IN_TOC						\
3860fc04c29Smrg 	   && CONST_DOUBLE_P (X)					\
38710d565efSmrg 	   && SCALAR_FLOAT_MODE_P (GET_MODE (X))			\
38810d565efSmrg 	   && BITS_PER_WORD == HOST_BITS_PER_INT)))
38910d565efSmrg 
39010d565efSmrg /* These macros generate the special .type and .size directives which
39110d565efSmrg    are used to set the corresponding fields of the linker symbol table
39210d565efSmrg    entries in an ELF object file under SVR4.  These macros also output
39310d565efSmrg    the starting labels for the relevant functions/objects.  */
39410d565efSmrg 
39510d565efSmrg /* Write the extra assembler code needed to declare a function properly.
39610d565efSmrg    Some svr4 assemblers need to also have something extra said about the
39710d565efSmrg    function's return value.  We allow for that here.  */
39810d565efSmrg 
39910d565efSmrg /* Override elfos.h definition.  */
40010d565efSmrg #undef	ASM_DECLARE_FUNCTION_NAME
40110d565efSmrg #define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL)			\
40210d565efSmrg   rs6000_elf_declare_function_name ((FILE), (NAME), (DECL))
40310d565efSmrg 
40410d565efSmrg /* The USER_LABEL_PREFIX stuff is affected by the -fleading-underscore
40510d565efSmrg    flag.  The LOCAL_LABEL_PREFIX variable is used by dbxelf.h.  */
40610d565efSmrg 
40710d565efSmrg #define	LOCAL_LABEL_PREFIX "."
40810d565efSmrg #define	USER_LABEL_PREFIX ""
40910d565efSmrg 
41010d565efSmrg #define	ASM_OUTPUT_INTERNAL_LABEL_PREFIX(FILE,PREFIX)	\
41110d565efSmrg   asm_fprintf (FILE, "%L%s", PREFIX)
41210d565efSmrg 
41310d565efSmrg /* Globalizing directive for a label.  */
41410d565efSmrg #define GLOBAL_ASM_OP "\t.globl "
41510d565efSmrg 
41610d565efSmrg /* This says how to output assembler code to declare an
41710d565efSmrg    uninitialized internal linkage data object.  Under SVR4,
41810d565efSmrg    the linker seems to want the alignment of data objects
41910d565efSmrg    to depend on their types.  We do exactly that here.  */
42010d565efSmrg 
42110d565efSmrg #define	LOCAL_ASM_OP	"\t.local\t"
42210d565efSmrg 
42310d565efSmrg #define	LCOMM_ASM_OP	"\t.lcomm\t"
42410d565efSmrg 
42510d565efSmrg /* Describe how to emit uninitialized local items.  */
42610d565efSmrg #define	ASM_OUTPUT_ALIGNED_DECL_LOCAL(FILE, DECL, NAME, SIZE, ALIGN)	\
42710d565efSmrg do {									\
42810d565efSmrg   if ((DECL) && rs6000_elf_in_small_data_p (DECL))			\
42910d565efSmrg     {									\
43010d565efSmrg       switch_to_section (sbss_section);					\
43110d565efSmrg       ASM_OUTPUT_ALIGN (FILE, exact_log2 (ALIGN / BITS_PER_UNIT));	\
43210d565efSmrg       ASM_OUTPUT_LABEL (FILE, NAME);					\
43310d565efSmrg       ASM_OUTPUT_SKIP (FILE, SIZE);					\
43410d565efSmrg       if (!flag_inhibit_size_directive && (SIZE) > 0)			\
43510d565efSmrg 	ASM_OUTPUT_SIZE_DIRECTIVE (FILE, NAME, SIZE);			\
43610d565efSmrg     }									\
43710d565efSmrg   else									\
43810d565efSmrg     {									\
43910d565efSmrg       fprintf (FILE, "%s", LCOMM_ASM_OP);				\
44010d565efSmrg       assemble_name ((FILE), (NAME));					\
44110d565efSmrg       fprintf ((FILE), "," HOST_WIDE_INT_PRINT_UNSIGNED",%u\n",		\
44210d565efSmrg 	       (SIZE), (ALIGN) / BITS_PER_UNIT);			\
44310d565efSmrg     }									\
44410d565efSmrg   ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "object");			\
44510d565efSmrg } while (0)
44610d565efSmrg 
44710d565efSmrg /* Describe how to emit uninitialized external linkage items.  */
44810d565efSmrg #define	ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN)		\
44910d565efSmrg do {									\
45010d565efSmrg   ASM_OUTPUT_ALIGNED_DECL_LOCAL (FILE, DECL, NAME, SIZE, ALIGN);	\
45110d565efSmrg } while (0)
45210d565efSmrg 
45310d565efSmrg #ifdef HAVE_GAS_MAX_SKIP_P2ALIGN
45410d565efSmrg /* To support -falign-* switches we need to use .p2align so
45510d565efSmrg    that alignment directives in code sections will be padded
45610d565efSmrg    with no-op instructions, rather than zeroes.  */
45710d565efSmrg #define ASM_OUTPUT_MAX_SKIP_ALIGN(FILE,LOG,MAX_SKIP)			\
45810d565efSmrg   if ((LOG) != 0)							\
45910d565efSmrg     {									\
46010d565efSmrg       if ((MAX_SKIP) == 0)						\
46110d565efSmrg 	fprintf ((FILE), "\t.p2align %d\n", (LOG));			\
46210d565efSmrg       else								\
46310d565efSmrg 	fprintf ((FILE), "\t.p2align %d,,%d\n",	(LOG), (MAX_SKIP));	\
46410d565efSmrg     }
46510d565efSmrg #endif
46610d565efSmrg 
46710d565efSmrg /* This is how to output code to push a register on the stack.
46810d565efSmrg    It need not be very fast code.
46910d565efSmrg 
47010d565efSmrg    On the rs6000, we must keep the backchain up to date.  In order
47110d565efSmrg    to simplify things, always allocate 16 bytes for a push (System V
47210d565efSmrg    wants to keep stack aligned to a 16 byte boundary).  */
47310d565efSmrg 
47410d565efSmrg #define	ASM_OUTPUT_REG_PUSH(FILE, REGNO)				\
47510d565efSmrg do {									\
47610d565efSmrg   if (DEFAULT_ABI == ABI_V4)						\
47710d565efSmrg     asm_fprintf (FILE,							\
47810d565efSmrg 		 "\tstwu %s,-16(%s)\n\tstw %s,12(%s)\n",	\
47910d565efSmrg 		 reg_names[1], reg_names[1], reg_names[REGNO],		\
48010d565efSmrg 		 reg_names[1]);						\
48110d565efSmrg } while (0)
48210d565efSmrg 
48310d565efSmrg /* This is how to output an insn to pop a register from the stack.
48410d565efSmrg    It need not be very fast code.  */
48510d565efSmrg 
48610d565efSmrg #define	ASM_OUTPUT_REG_POP(FILE, REGNO)					\
48710d565efSmrg do {									\
48810d565efSmrg   if (DEFAULT_ABI == ABI_V4)						\
48910d565efSmrg     asm_fprintf (FILE,							\
49010d565efSmrg 		 "\tlwz %s,12(%s)\n\taddi %s,%s,16\n",	\
49110d565efSmrg 		 reg_names[REGNO], reg_names[1], reg_names[1],		\
49210d565efSmrg 		 reg_names[1]);						\
49310d565efSmrg } while (0)
49410d565efSmrg 
49510d565efSmrg extern int fixuplabelno;
49610d565efSmrg 
49710d565efSmrg /* Handle constructors specially for -mrelocatable.  */
49810d565efSmrg #define TARGET_ASM_CONSTRUCTOR  rs6000_elf_asm_out_constructor
49910d565efSmrg #define TARGET_ASM_DESTRUCTOR   rs6000_elf_asm_out_destructor
50010d565efSmrg 
50110d565efSmrg /* This is the end of what might become sysv4.h.  */
50210d565efSmrg 
50310d565efSmrg /* Use DWARF 2 debugging information by default.  */
50410d565efSmrg #undef  PREFERRED_DEBUGGING_TYPE
50510d565efSmrg #define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
50610d565efSmrg 
50710d565efSmrg /* Historically we have also supported stabs debugging.  */
50810d565efSmrg #define DBX_DEBUGGING_INFO 1
50910d565efSmrg 
51010d565efSmrg #define TARGET_ENCODE_SECTION_INFO  rs6000_elf_encode_section_info
51110d565efSmrg #define TARGET_IN_SMALL_DATA_P  rs6000_elf_in_small_data_p
51210d565efSmrg 
51310d565efSmrg /* The ELF version doesn't encode [DS] or whatever at the end of symbols.  */
51410d565efSmrg 
51510d565efSmrg #define	RS6000_OUTPUT_BASENAME(FILE, NAME)	\
51610d565efSmrg     assemble_name (FILE, NAME)
51710d565efSmrg 
51810d565efSmrg /* We have to output the stabs for the function name *first*, before
51910d565efSmrg    outputting its label.  */
52010d565efSmrg 
52110d565efSmrg #define	DBX_FUNCTION_FIRST
52210d565efSmrg 
52310d565efSmrg /* This is the end of what might become sysv4dbx.h.  */
52410d565efSmrg 
52510d565efSmrg #define TARGET_OS_SYSV_CPP_BUILTINS()		\
52610d565efSmrg   do						\
52710d565efSmrg     {						\
52810d565efSmrg       if (rs6000_isa_flags_explicit		\
52910d565efSmrg 	  & OPTION_MASK_RELOCATABLE)		\
53010d565efSmrg 	builtin_define ("_RELOCATABLE");	\
53110d565efSmrg     }						\
53210d565efSmrg   while (0)
53310d565efSmrg 
53410d565efSmrg #ifndef	TARGET_OS_CPP_BUILTINS
53510d565efSmrg #define TARGET_OS_CPP_BUILTINS()		\
53610d565efSmrg   do						\
53710d565efSmrg     {						\
53810d565efSmrg       builtin_define_std ("PPC");		\
53910d565efSmrg       builtin_define_std ("unix");		\
54010d565efSmrg       builtin_define ("__svr4__");		\
54110d565efSmrg       builtin_assert ("system=unix");		\
54210d565efSmrg       builtin_assert ("system=svr4");		\
54310d565efSmrg       builtin_assert ("cpu=powerpc");		\
54410d565efSmrg       builtin_assert ("machine=powerpc");	\
54510d565efSmrg       TARGET_OS_SYSV_CPP_BUILTINS ();		\
54610d565efSmrg     }						\
54710d565efSmrg   while (0)
54810d565efSmrg #endif
54910d565efSmrg 
55010d565efSmrg /* Select one of BIG_OPT, LITTLE_OPT or DEFAULT_OPT depending
55110d565efSmrg    on various -mbig, -mlittle and -mcall- options.  */
55210d565efSmrg #define ENDIAN_SELECT(BIG_OPT, LITTLE_OPT, DEFAULT_OPT)	\
55310d565efSmrg "%{mlittle|mlittle-endian:"	LITTLE_OPT ";"	\
55410d565efSmrg   "mbig|mbig-endian:"		BIG_OPT    ";"	\
55510d565efSmrg   "mcall-i960-old:"		LITTLE_OPT ";"	\
55610d565efSmrg   ":"				DEFAULT_OPT "}"
55710d565efSmrg 
55810d565efSmrg #define DEFAULT_ASM_ENDIAN " -mbig"
55910d565efSmrg 
56010d565efSmrg #undef	ASM_SPEC
56110d565efSmrg #define	ASM_SPEC "%(asm_cpu) \
56210d565efSmrg %{,assembler|,assembler-with-cpp: %{mregnames} %{mno-regnames}} \
56310d565efSmrg %{mrelocatable} %{mrelocatable-lib} %{" FPIE_OR_FPIC_SPEC ":-K PIC} \
56410d565efSmrg %{memb|msdata=eabi: -memb}" \
56510d565efSmrg ENDIAN_SELECT(" -mbig", " -mlittle", DEFAULT_ASM_ENDIAN)
56610d565efSmrg 
56710d565efSmrg #ifndef CC1_SECURE_PLT_DEFAULT_SPEC
56810d565efSmrg #define CC1_SECURE_PLT_DEFAULT_SPEC ""
56910d565efSmrg #endif
57010d565efSmrg #ifndef LINK_SECURE_PLT_DEFAULT_SPEC
57110d565efSmrg #define LINK_SECURE_PLT_DEFAULT_SPEC ""
57210d565efSmrg #endif
57310d565efSmrg 
57410d565efSmrg /* Pass -G xxx to the compiler.  */
57510d565efSmrg #undef CC1_SPEC
57610d565efSmrg #define	CC1_SPEC "%{G*} %(cc1_cpu)" \
57710d565efSmrg "%{meabi: %{!mcall-*: -mcall-sysv }} \
57810d565efSmrg %{!meabi: %{!mno-eabi: \
57910d565efSmrg     %{mrelocatable: -meabi } \
58010d565efSmrg     %{mcall-freebsd: -mno-eabi } \
58110d565efSmrg     %{mcall-i960-old: -meabi } \
58210d565efSmrg     %{mcall-linux: -mno-eabi } \
58310d565efSmrg     %{mcall-netbsd: -mno-eabi } \
58410d565efSmrg     %{mcall-openbsd: -mno-eabi }}} \
58510d565efSmrg %{msdata: -msdata=default} \
58610d565efSmrg %{mno-sdata: -msdata=none} \
58710d565efSmrg %{!mbss-plt: %{!msecure-plt: %(cc1_secure_plt_default)}} \
5880fc04c29Smrg %(cc1_os_netbsd)" \
5890fc04c29Smrg GNU_USER_TARGET_CC1_SPEC
59010d565efSmrg 
59110d565efSmrg /* Default starting address if specified.  */
59210d565efSmrg #define LINK_START_SPEC "\
59310d565efSmrg %{mads         : %(link_start_ads)         ; \
59410d565efSmrg   myellowknife : %(link_start_yellowknife) ; \
59510d565efSmrg   mmvme        : %(link_start_mvme)        ; \
59610d565efSmrg   msim         : %(link_start_sim)         ; \
59710d565efSmrg   mcall-freebsd: %(link_start_freebsd)     ; \
59810d565efSmrg   mcall-linux  : %(link_start_linux)       ; \
59910d565efSmrg   mcall-netbsd : %(link_start_netbsd)      ; \
60010d565efSmrg   mcall-openbsd: %(link_start_openbsd)     ; \
60110d565efSmrg                : %(link_start_default)     }"
60210d565efSmrg 
60310d565efSmrg #define LINK_START_DEFAULT_SPEC ""
60410d565efSmrg #define LINK_SECURE_PLT_SPEC LINK_SECURE_PLT_DEFAULT_SPEC
60510d565efSmrg 
60610d565efSmrg #undef	LINK_SPEC
60710d565efSmrg #define	LINK_SPEC "\
60810d565efSmrg %{h*} %{v:-V} %{!msdata=none:%{G*}} %{msdata=none:-G0} \
60910d565efSmrg %{R*} \
61010d565efSmrg %(link_shlib) \
61110d565efSmrg %{!T*: %(link_start) } \
61210d565efSmrg %{!static: %{!mbss-plt: %(link_secure_plt)}} \
61310d565efSmrg %(link_os)"
61410d565efSmrg 
61510d565efSmrg /* Shared libraries are not default.  */
61610d565efSmrg #define LINK_SHLIB_SPEC "\
61710d565efSmrg %{!mshlib: %{!shared: %{!symbolic: -dn -Bstatic}}} \
61810d565efSmrg %{static: } \
61910d565efSmrg %{shared:-G -dy -z text } \
62010d565efSmrg %{symbolic:-Bsymbolic -G -dy -z text }"
62110d565efSmrg 
62210d565efSmrg /* Any specific OS flags.  */
62310d565efSmrg #define LINK_OS_SPEC "\
62410d565efSmrg %{mads         : %(link_os_ads)         ; \
62510d565efSmrg   myellowknife : %(link_os_yellowknife) ; \
62610d565efSmrg   mmvme        : %(link_os_mvme)        ; \
62710d565efSmrg   msim         : %(link_os_sim)         ; \
62810d565efSmrg   mcall-freebsd: %(link_os_freebsd)     ; \
62910d565efSmrg   mcall-linux  : %(link_os_linux)       ; \
63010d565efSmrg   mcall-netbsd : %(link_os_netbsd)      ; \
63110d565efSmrg   mcall-openbsd: %(link_os_openbsd)     ; \
63210d565efSmrg                : %(link_os_default)     }"
63310d565efSmrg 
63410d565efSmrg #define LINK_OS_DEFAULT_SPEC ""
63510d565efSmrg 
63610d565efSmrg /* Override rs6000.h definition.  */
63710d565efSmrg #undef	CPP_SPEC
63810d565efSmrg #define	CPP_SPEC "%{posix: -D_POSIX_SOURCE} \
63910d565efSmrg %{mads         : %(cpp_os_ads)         ; \
64010d565efSmrg   myellowknife : %(cpp_os_yellowknife) ; \
64110d565efSmrg   mmvme        : %(cpp_os_mvme)        ; \
64210d565efSmrg   msim         : %(cpp_os_sim)         ; \
64310d565efSmrg   mcall-freebsd: %(cpp_os_freebsd)     ; \
64410d565efSmrg   mcall-linux  : %(cpp_os_linux)       ; \
64510d565efSmrg   mcall-netbsd : %(cpp_os_netbsd)      ; \
64610d565efSmrg   mcall-openbsd: %(cpp_os_openbsd)     ; \
64710d565efSmrg                : %(cpp_os_default)     }"
64810d565efSmrg 
64910d565efSmrg #define	CPP_OS_DEFAULT_SPEC ""
65010d565efSmrg 
65110d565efSmrg #undef	STARTFILE_SPEC
65210d565efSmrg #define	STARTFILE_SPEC "\
65310d565efSmrg %{mads         : %(startfile_ads)         ; \
65410d565efSmrg   myellowknife : %(startfile_yellowknife) ; \
65510d565efSmrg   mmvme        : %(startfile_mvme)        ; \
65610d565efSmrg   msim         : %(startfile_sim)         ; \
65710d565efSmrg   mcall-freebsd: %(startfile_freebsd)     ; \
65810d565efSmrg   mcall-linux  : %(startfile_linux)       ; \
65910d565efSmrg   mcall-netbsd : %(startfile_netbsd)      ; \
66010d565efSmrg   mcall-openbsd: %(startfile_openbsd)     ; \
66110d565efSmrg                : %(startfile_default)     }"
66210d565efSmrg 
66310d565efSmrg #define	STARTFILE_DEFAULT_SPEC "ecrti.o%s crtbegin.o%s"
66410d565efSmrg 
66510d565efSmrg #undef	LIB_SPEC
66610d565efSmrg #define	LIB_SPEC "\
66710d565efSmrg %{mads         : %(lib_ads)         ; \
66810d565efSmrg   myellowknife : %(lib_yellowknife) ; \
66910d565efSmrg   mmvme        : %(lib_mvme)        ; \
67010d565efSmrg   msim         : %(lib_sim)         ; \
67110d565efSmrg   mcall-freebsd: %(lib_freebsd)     ; \
67210d565efSmrg   mcall-linux  : %(lib_linux)       ; \
67310d565efSmrg   mcall-netbsd : %(lib_netbsd)      ; \
67410d565efSmrg   mcall-openbsd: %(lib_openbsd)     ; \
67510d565efSmrg                : %(lib_default)     }"
67610d565efSmrg 
67710d565efSmrg #define LIB_DEFAULT_SPEC "-lc"
67810d565efSmrg 
67910d565efSmrg #undef	ENDFILE_SPEC
68010d565efSmrg #define	ENDFILE_SPEC "\
68110d565efSmrg %{mads         : %(endfile_ads)         ; \
68210d565efSmrg   myellowknife : %(endfile_yellowknife) ; \
68310d565efSmrg   mmvme        : %(endfile_mvme)        ; \
68410d565efSmrg   msim         : %(endfile_sim)         ; \
68510d565efSmrg   mcall-freebsd: %(endfile_freebsd)     ; \
68610d565efSmrg   mcall-linux  : %(endfile_linux)       ; \
68710d565efSmrg   mcall-netbsd : %(endfile_netbsd)      ; \
68810d565efSmrg   mcall-openbsd: %(endfile_openbsd)     ; \
68910d565efSmrg                : %(crtsavres_default) %(endfile_default)     }"
69010d565efSmrg 
69110d565efSmrg #define CRTSAVRES_DEFAULT_SPEC ""
69210d565efSmrg 
69310d565efSmrg #define	ENDFILE_DEFAULT_SPEC "crtend.o%s ecrtn.o%s"
69410d565efSmrg 
69510d565efSmrg /* Motorola ADS support.  */
69610d565efSmrg #define LIB_ADS_SPEC "--start-group -lads -lc --end-group"
69710d565efSmrg 
69810d565efSmrg #define	STARTFILE_ADS_SPEC "ecrti.o%s crt0.o%s crtbegin.o%s"
69910d565efSmrg 
70010d565efSmrg #define	ENDFILE_ADS_SPEC "crtend.o%s ecrtn.o%s"
70110d565efSmrg 
70210d565efSmrg #define LINK_START_ADS_SPEC "-T ads.ld%s"
70310d565efSmrg 
70410d565efSmrg #define LINK_OS_ADS_SPEC ""
70510d565efSmrg 
70610d565efSmrg #define CPP_OS_ADS_SPEC ""
70710d565efSmrg 
70810d565efSmrg /* Motorola Yellowknife support.  */
70910d565efSmrg #define LIB_YELLOWKNIFE_SPEC "--start-group -lyk -lc --end-group"
71010d565efSmrg 
71110d565efSmrg #define	STARTFILE_YELLOWKNIFE_SPEC "ecrti.o%s crt0.o%s crtbegin.o%s"
71210d565efSmrg 
71310d565efSmrg #define	ENDFILE_YELLOWKNIFE_SPEC "crtend.o%s ecrtn.o%s"
71410d565efSmrg 
71510d565efSmrg #define LINK_START_YELLOWKNIFE_SPEC "-T yellowknife.ld%s"
71610d565efSmrg 
71710d565efSmrg #define LINK_OS_YELLOWKNIFE_SPEC ""
71810d565efSmrg 
71910d565efSmrg #define CPP_OS_YELLOWKNIFE_SPEC ""
72010d565efSmrg 
72110d565efSmrg /* Motorola MVME support.  */
72210d565efSmrg #define LIB_MVME_SPEC "--start-group -lmvme -lc --end-group"
72310d565efSmrg 
72410d565efSmrg #define	STARTFILE_MVME_SPEC "ecrti.o%s crt0.o%s crtbegin.o%s"
72510d565efSmrg 
72610d565efSmrg #define	ENDFILE_MVME_SPEC "crtend.o%s ecrtn.o%s"
72710d565efSmrg 
72810d565efSmrg #define LINK_START_MVME_SPEC "-Ttext 0x40000"
72910d565efSmrg 
73010d565efSmrg #define LINK_OS_MVME_SPEC ""
73110d565efSmrg 
73210d565efSmrg #define CPP_OS_MVME_SPEC ""
73310d565efSmrg 
73410d565efSmrg /* PowerPC simulator based on netbsd system calls support.  */
73510d565efSmrg #define LIB_SIM_SPEC "--start-group -lsim -lc --end-group"
73610d565efSmrg 
73710d565efSmrg #define	STARTFILE_SIM_SPEC "ecrti.o%s sim-crt0.o%s crtbegin.o%s"
73810d565efSmrg 
73910d565efSmrg #define	ENDFILE_SIM_SPEC "crtend.o%s ecrtn.o%s"
74010d565efSmrg 
74110d565efSmrg #define LINK_START_SIM_SPEC ""
74210d565efSmrg 
74310d565efSmrg #define LINK_OS_SIM_SPEC "-m elf32ppcsim"
74410d565efSmrg 
74510d565efSmrg #define CPP_OS_SIM_SPEC ""
74610d565efSmrg 
74710d565efSmrg /* FreeBSD support.  */
74810d565efSmrg 
74910d565efSmrg #define CPP_OS_FREEBSD_SPEC	"\
75010d565efSmrg   -D__PPC__ -D__ppc__ -D__PowerPC__ -D__powerpc__ \
75110d565efSmrg   -Acpu=powerpc -Amachine=powerpc"
75210d565efSmrg 
75310d565efSmrg #define	STARTFILE_FREEBSD_SPEC	FBSD_STARTFILE_SPEC
75410d565efSmrg #define ENDFILE_FREEBSD_SPEC	FBSD_ENDFILE_SPEC
75510d565efSmrg #define LIB_FREEBSD_SPEC	FBSD_LIB_SPEC
75610d565efSmrg #define LINK_START_FREEBSD_SPEC	""
75710d565efSmrg 
75810d565efSmrg #define LINK_OS_FREEBSD_SPEC "\
75910d565efSmrg   %{p:%nconsider using '-pg' instead of '-p' with gprof(1)} \
76010d565efSmrg   %{v:-V} \
76110d565efSmrg   %{assert*} %{R*} %{rpath*} %{defsym*} \
76210d565efSmrg   %{shared:-Bshareable %{h*} %{soname*}} \
76310d565efSmrg   %{!shared: \
76410d565efSmrg     %{!static: \
76510d565efSmrg       %{rdynamic: -export-dynamic} \
76610d565efSmrg       -dynamic-linker %(fbsd_dynamic_linker) } \
76710d565efSmrg     %{static:-Bstatic}} \
76810d565efSmrg   %{symbolic:-Bsymbolic}"
76910d565efSmrg 
77010d565efSmrg /* GNU/Linux support.  */
7710fc04c29Smrg #define LIB_LINUX_SPEC \
7720fc04c29Smrg   "%{mnewlib: --start-group -llinux -lc --end-group; \
7730fc04c29Smrg      :" GNU_USER_TARGET_LIB_SPEC "}"
77410d565efSmrg 
7750fc04c29Smrg #define	STARTFILE_LINUX_SPEC GNU_USER_TARGET_STARTFILE_SPEC
77610d565efSmrg 
7770fc04c29Smrg #define ENDFILE_LINUX_SPEC GNU_USER_TARGET_ENDFILE_SPEC
77810d565efSmrg 
77910d565efSmrg #define LINK_START_LINUX_SPEC ""
78010d565efSmrg 
78110d565efSmrg #define MUSL_DYNAMIC_LINKER_E ENDIAN_SELECT("","le","")
78210d565efSmrg 
78310d565efSmrg #define GLIBC_DYNAMIC_LINKER "/lib/ld.so.1"
7840fc04c29Smrg #undef MUSL_DYNAMIC_LINKER
78510d565efSmrg #define MUSL_DYNAMIC_LINKER \
78610d565efSmrg   "/lib/ld-musl-powerpc" MUSL_DYNAMIC_LINKER_E "%{msoft-float:-sf}.so.1"
7870fc04c29Smrg 
7880fc04c29Smrg #ifndef GNU_USER_DYNAMIC_LINKER
7890fc04c29Smrg #define GNU_USER_DYNAMIC_LINKER GLIBC_DYNAMIC_LINKER
79010d565efSmrg #endif
79110d565efSmrg 
79210d565efSmrg #define LINK_OS_LINUX_SPEC "-m elf32ppclinux %{!shared: %{!static: \
79310d565efSmrg   %{rdynamic:-export-dynamic} \
79410d565efSmrg   -dynamic-linker " GNU_USER_DYNAMIC_LINKER "}}"
79510d565efSmrg 
7960fc04c29Smrg #define CPP_OS_LINUX_SPEC "%{pthread:-D_REENTRANT}"
79710d565efSmrg 
79810d565efSmrg /* NetBSD support.  */
79910d565efSmrg #define LIB_NETBSD_SPEC NETBSD_LIB_SPEC
80010d565efSmrg 
80110d565efSmrg #define	STARTFILE_NETBSD_SPEC NETBSD_STARTFILE_SPEC
80210d565efSmrg 
80310d565efSmrg #define ENDFILE_NETBSD_SPEC NETBSD_ENDFILE_SPEC
80410d565efSmrg 
80510d565efSmrg #define LINK_START_NETBSD_SPEC "\
80610d565efSmrg "
80710d565efSmrg 
80810d565efSmrg #define LINK_OS_NETBSD_SPEC NETBSD_LINK_SPEC_ELF
80910d565efSmrg 
81010d565efSmrg #define CPP_OS_NETBSD_SPEC "\
81110d565efSmrg -D__powerpc__ -D__NetBSD__ -D__KPRINTF_ATTRIBUTE__"
81210d565efSmrg 
81310d565efSmrg #define CC1_OS_NETBSD_SPEC "\
81410d565efSmrg %{cxx-isystem}"
81510d565efSmrg 
81610d565efSmrg /* OpenBSD support.  */
81710d565efSmrg #ifndef	LIB_OPENBSD_SPEC
81810d565efSmrg #define LIB_OPENBSD_SPEC "%{!shared:%{pthread:-lpthread%{p:_p}%{!p:%{pg:_p}}}} %{!shared:-lc%{p:_p}%{!p:%{pg:_p}}}"
81910d565efSmrg #endif
82010d565efSmrg 
82110d565efSmrg #ifndef	STARTFILE_OPENBSD_SPEC
82210d565efSmrg #define	STARTFILE_OPENBSD_SPEC "\
82310d565efSmrg %{!shared: %{pg:gcrt0.o%s} %{!pg:%{p:gcrt0.o%s} %{!p:crt0.o%s}}} \
82410d565efSmrg %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}"
82510d565efSmrg #endif
82610d565efSmrg 
82710d565efSmrg #ifndef	ENDFILE_OPENBSD_SPEC
82810d565efSmrg #define	ENDFILE_OPENBSD_SPEC "\
82910d565efSmrg %{!shared:crtend.o%s} %{shared:crtendS.o%s}"
83010d565efSmrg #endif
83110d565efSmrg 
83210d565efSmrg #ifndef LINK_START_OPENBSD_SPEC
83310d565efSmrg #define LINK_START_OPENBSD_SPEC "-Ttext 0x400074"
83410d565efSmrg #endif
83510d565efSmrg 
83610d565efSmrg #ifndef LINK_OS_OPENBSD_SPEC
83710d565efSmrg #define LINK_OS_OPENBSD_SPEC ""
83810d565efSmrg #endif
83910d565efSmrg 
84010d565efSmrg #ifndef CPP_OS_OPENBSD_SPEC
84110d565efSmrg #define CPP_OS_OPENBSD_SPEC "%{posix:-D_POSIX_SOURCE} %{pthread:-D_POSIX_THREADS}"
84210d565efSmrg #endif
84310d565efSmrg 
84410d565efSmrg /* Define any extra SPECS that the compiler needs to generate.  */
84510d565efSmrg /* Override rs6000.h definition.  */
84610d565efSmrg #undef	SUBTARGET_EXTRA_SPECS
84710d565efSmrg #define	SUBTARGET_EXTRA_SPECS						\
84810d565efSmrg   { "crtsavres_default",	CRTSAVRES_DEFAULT_SPEC },		\
84910d565efSmrg   { "lib_ads",			LIB_ADS_SPEC },				\
85010d565efSmrg   { "lib_yellowknife",		LIB_YELLOWKNIFE_SPEC },			\
85110d565efSmrg   { "lib_mvme",			LIB_MVME_SPEC },			\
85210d565efSmrg   { "lib_sim",			LIB_SIM_SPEC },				\
85310d565efSmrg   { "lib_freebsd",		LIB_FREEBSD_SPEC },			\
85410d565efSmrg   { "lib_linux",		LIB_LINUX_SPEC },			\
85510d565efSmrg   { "lib_netbsd",		LIB_NETBSD_SPEC },			\
85610d565efSmrg   { "lib_openbsd",		LIB_OPENBSD_SPEC },			\
85710d565efSmrg   { "lib_default",		LIB_DEFAULT_SPEC },			\
85810d565efSmrg   { "startfile_ads",		STARTFILE_ADS_SPEC },			\
85910d565efSmrg   { "startfile_yellowknife",	STARTFILE_YELLOWKNIFE_SPEC },		\
86010d565efSmrg   { "startfile_mvme",		STARTFILE_MVME_SPEC },			\
86110d565efSmrg   { "startfile_sim",		STARTFILE_SIM_SPEC },			\
86210d565efSmrg   { "startfile_freebsd",	STARTFILE_FREEBSD_SPEC },		\
86310d565efSmrg   { "startfile_linux",		STARTFILE_LINUX_SPEC },			\
86410d565efSmrg   { "startfile_netbsd",		STARTFILE_NETBSD_SPEC },		\
86510d565efSmrg   { "startfile_openbsd",	STARTFILE_OPENBSD_SPEC },		\
86610d565efSmrg   { "startfile_default",	STARTFILE_DEFAULT_SPEC },		\
86710d565efSmrg   { "endfile_ads",		ENDFILE_ADS_SPEC },			\
86810d565efSmrg   { "endfile_yellowknife",	ENDFILE_YELLOWKNIFE_SPEC },		\
86910d565efSmrg   { "endfile_mvme",		ENDFILE_MVME_SPEC },			\
87010d565efSmrg   { "endfile_sim",		ENDFILE_SIM_SPEC },			\
87110d565efSmrg   { "endfile_freebsd",		ENDFILE_FREEBSD_SPEC },			\
87210d565efSmrg   { "endfile_linux",		ENDFILE_LINUX_SPEC },			\
87310d565efSmrg   { "endfile_netbsd",		ENDFILE_NETBSD_SPEC },			\
87410d565efSmrg   { "endfile_openbsd",		ENDFILE_OPENBSD_SPEC },			\
87510d565efSmrg   { "endfile_default",		ENDFILE_DEFAULT_SPEC },			\
87610d565efSmrg   { "link_shlib",		LINK_SHLIB_SPEC },			\
87710d565efSmrg   { "link_start",		LINK_START_SPEC },			\
87810d565efSmrg   { "link_start_ads",		LINK_START_ADS_SPEC },			\
87910d565efSmrg   { "link_start_yellowknife",	LINK_START_YELLOWKNIFE_SPEC },		\
88010d565efSmrg   { "link_start_mvme",		LINK_START_MVME_SPEC },			\
88110d565efSmrg   { "link_start_sim",		LINK_START_SIM_SPEC },			\
88210d565efSmrg   { "link_start_freebsd",	LINK_START_FREEBSD_SPEC },		\
88310d565efSmrg   { "link_start_linux",		LINK_START_LINUX_SPEC },		\
88410d565efSmrg   { "link_start_netbsd",	LINK_START_NETBSD_SPEC },		\
88510d565efSmrg   { "link_start_openbsd",	LINK_START_OPENBSD_SPEC },		\
88610d565efSmrg   { "link_start_default",	LINK_START_DEFAULT_SPEC },		\
88710d565efSmrg   { "link_os",			LINK_OS_SPEC },				\
88810d565efSmrg   { "link_os_ads",		LINK_OS_ADS_SPEC },			\
88910d565efSmrg   { "link_os_yellowknife",	LINK_OS_YELLOWKNIFE_SPEC },		\
89010d565efSmrg   { "link_os_mvme",		LINK_OS_MVME_SPEC },			\
89110d565efSmrg   { "link_os_sim",		LINK_OS_SIM_SPEC },			\
89210d565efSmrg   { "link_os_freebsd",		LINK_OS_FREEBSD_SPEC },			\
89310d565efSmrg   { "link_os_linux",		LINK_OS_LINUX_SPEC },			\
89410d565efSmrg   { "link_os_netbsd",		LINK_OS_NETBSD_SPEC },			\
89510d565efSmrg   { "link_os_openbsd",		LINK_OS_OPENBSD_SPEC },			\
89610d565efSmrg   { "link_os_default",		LINK_OS_DEFAULT_SPEC },			\
89710d565efSmrg   { "cc1_secure_plt_default",	CC1_SECURE_PLT_DEFAULT_SPEC },		\
89810d565efSmrg   { "cc1_os_netbsd",		CC1_OS_NETBSD_SPEC },			\
89910d565efSmrg   { "link_secure_plt",		LINK_SECURE_PLT_SPEC },			\
90010d565efSmrg   { "cpp_os_ads",		CPP_OS_ADS_SPEC },			\
90110d565efSmrg   { "cpp_os_yellowknife",	CPP_OS_YELLOWKNIFE_SPEC },		\
90210d565efSmrg   { "cpp_os_mvme",		CPP_OS_MVME_SPEC },			\
90310d565efSmrg   { "cpp_os_sim",		CPP_OS_SIM_SPEC },			\
90410d565efSmrg   { "cpp_os_freebsd",		CPP_OS_FREEBSD_SPEC },			\
90510d565efSmrg   { "cpp_os_linux",		CPP_OS_LINUX_SPEC },			\
90610d565efSmrg   { "cpp_os_netbsd",		CPP_OS_NETBSD_SPEC },			\
90710d565efSmrg   { "cpp_os_openbsd",		CPP_OS_OPENBSD_SPEC },			\
90810d565efSmrg   { "cpp_os_default",		CPP_OS_DEFAULT_SPEC },			\
90910d565efSmrg   { "fbsd_dynamic_linker",	FBSD_DYNAMIC_LINKER },			\
91010d565efSmrg   SUBSUBTARGET_EXTRA_SPECS
91110d565efSmrg 
91210d565efSmrg #define	SUBSUBTARGET_EXTRA_SPECS
91310d565efSmrg 
91410d565efSmrg /* Define this macro as a C expression for the initializer of an
91510d565efSmrg    array of string to tell the driver program which options are
91610d565efSmrg    defaults for this target and thus do not need to be handled
91710d565efSmrg    specially when using `MULTILIB_OPTIONS'.
91810d565efSmrg 
91910d565efSmrg    Do not define this macro if `MULTILIB_OPTIONS' is not defined in
92010d565efSmrg    the target makefile fragment or if none of the options listed in
92110d565efSmrg    `MULTILIB_OPTIONS' are set by default.  *Note Target Fragment::.  */
92210d565efSmrg 
92310d565efSmrg #define	MULTILIB_DEFAULTS { "mbig", "mcall-sysv" }
92410d565efSmrg 
92510d565efSmrg /* Define this macro if the code for function profiling should come
92610d565efSmrg    before the function prologue.  Normally, the profiling code comes
92710d565efSmrg    after.  */
92810d565efSmrg #define PROFILE_BEFORE_PROLOGUE 1
92910d565efSmrg 
93010d565efSmrg /* Function name to call to do profiling.  */
93110d565efSmrg #define RS6000_MCOUNT "_mcount"
93210d565efSmrg 
93310d565efSmrg /* Select a format to encode pointers in exception handling data.  CODE
93410d565efSmrg    is 0 for data, 1 for code labels, 2 for function pointers.  GLOBAL is
93510d565efSmrg    true if the symbol may be affected by dynamic relocations.  */
93610d565efSmrg #define ASM_PREFERRED_EH_DATA_FORMAT(CODE, GLOBAL)			\
93710d565efSmrg   (flag_pic								\
93810d565efSmrg    ? (((GLOBAL) ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel		\
93910d565efSmrg       | DW_EH_PE_sdata4)						\
94010d565efSmrg    : DW_EH_PE_absptr)
94110d565efSmrg 
94210d565efSmrg #define DOUBLE_INT_ASM_OP "\t.quad\t"
94310d565efSmrg 
94410d565efSmrg /* Generate entries in .fixup for relocatable addresses.  */
94510d565efSmrg #define RELOCATABLE_NEEDS_FIXUP 1
94610d565efSmrg 
94710d565efSmrg #define TARGET_ASM_FILE_END rs6000_elf_file_end
94810d565efSmrg 
94910d565efSmrg #undef TARGET_ASAN_SHADOW_OFFSET
95010d565efSmrg #define TARGET_ASAN_SHADOW_OFFSET rs6000_asan_shadow_offset
95110d565efSmrg 
95210d565efSmrg /* This target uses the sysv4.opt file.  */
95310d565efSmrg #define TARGET_USES_SYSV4_OPT 1
95410d565efSmrg 
95510d565efSmrg /* Include order changes for musl, same as in generic linux.h.  */
95610d565efSmrg #if DEFAULT_LIBC == LIBC_MUSL
95710d565efSmrg #define INCLUDE_DEFAULTS_MUSL_GPP			\
95810d565efSmrg     { GPLUSPLUS_INCLUDE_DIR, "G++", 1, 1,		\
95910d565efSmrg       GPLUSPLUS_INCLUDE_DIR_ADD_SYSROOT, 0 },		\
96010d565efSmrg     { GPLUSPLUS_TOOL_INCLUDE_DIR, "G++", 1, 1,		\
96110d565efSmrg       GPLUSPLUS_INCLUDE_DIR_ADD_SYSROOT, 1 },		\
96210d565efSmrg     { GPLUSPLUS_BACKWARD_INCLUDE_DIR, "G++", 1, 1,	\
96310d565efSmrg       GPLUSPLUS_INCLUDE_DIR_ADD_SYSROOT, 0 },
96410d565efSmrg 
96510d565efSmrg #ifdef LOCAL_INCLUDE_DIR
96610d565efSmrg #define INCLUDE_DEFAULTS_MUSL_LOCAL			\
96710d565efSmrg     { LOCAL_INCLUDE_DIR, 0, 0, 1, 1, 2 },		\
96810d565efSmrg     { LOCAL_INCLUDE_DIR, 0, 0, 1, 1, 0 },
96910d565efSmrg #else
97010d565efSmrg #define INCLUDE_DEFAULTS_MUSL_LOCAL
97110d565efSmrg #endif
97210d565efSmrg 
97310d565efSmrg #ifdef PREFIX_INCLUDE_DIR
97410d565efSmrg #define INCLUDE_DEFAULTS_MUSL_PREFIX			\
97510d565efSmrg     { PREFIX_INCLUDE_DIR, 0, 0, 1, 0, 0},
97610d565efSmrg #else
97710d565efSmrg #define INCLUDE_DEFAULTS_MUSL_PREFIX
97810d565efSmrg #endif
97910d565efSmrg 
98010d565efSmrg #ifdef CROSS_INCLUDE_DIR
98110d565efSmrg #define INCLUDE_DEFAULTS_MUSL_CROSS			\
98210d565efSmrg     { CROSS_INCLUDE_DIR, "GCC", 0, 0, 0, 0},
98310d565efSmrg #else
98410d565efSmrg #define INCLUDE_DEFAULTS_MUSL_CROSS
98510d565efSmrg #endif
98610d565efSmrg 
98710d565efSmrg #ifdef TOOL_INCLUDE_DIR
98810d565efSmrg #define INCLUDE_DEFAULTS_MUSL_TOOL			\
98910d565efSmrg     { TOOL_INCLUDE_DIR, "BINUTILS", 0, 1, 0, 0},
99010d565efSmrg #else
99110d565efSmrg #define INCLUDE_DEFAULTS_MUSL_TOOL
99210d565efSmrg #endif
99310d565efSmrg 
99410d565efSmrg #ifdef NATIVE_SYSTEM_HEADER_DIR
99510d565efSmrg #define INCLUDE_DEFAULTS_MUSL_NATIVE			\
99610d565efSmrg     { NATIVE_SYSTEM_HEADER_DIR, 0, 0, 0, 1, 2 },	\
99710d565efSmrg     { NATIVE_SYSTEM_HEADER_DIR, 0, 0, 0, 1, 0 },
99810d565efSmrg #else
99910d565efSmrg #define INCLUDE_DEFAULTS_MUSL_NATIVE
100010d565efSmrg #endif
100110d565efSmrg 
100210d565efSmrg #if defined (CROSS_DIRECTORY_STRUCTURE) && !defined (TARGET_SYSTEM_ROOT)
100310d565efSmrg # undef INCLUDE_DEFAULTS_MUSL_LOCAL
100410d565efSmrg # define INCLUDE_DEFAULTS_MUSL_LOCAL
100510d565efSmrg # undef INCLUDE_DEFAULTS_MUSL_NATIVE
100610d565efSmrg # define INCLUDE_DEFAULTS_MUSL_NATIVE
100710d565efSmrg #else
100810d565efSmrg # undef INCLUDE_DEFAULTS_MUSL_CROSS
100910d565efSmrg # define INCLUDE_DEFAULTS_MUSL_CROSS
101010d565efSmrg #endif
101110d565efSmrg 
101210d565efSmrg #undef INCLUDE_DEFAULTS
101310d565efSmrg #define INCLUDE_DEFAULTS				\
101410d565efSmrg   {							\
101510d565efSmrg     INCLUDE_DEFAULTS_MUSL_GPP				\
101610d565efSmrg     INCLUDE_DEFAULTS_MUSL_LOCAL				\
101710d565efSmrg     INCLUDE_DEFAULTS_MUSL_PREFIX			\
101810d565efSmrg     INCLUDE_DEFAULTS_MUSL_CROSS				\
101910d565efSmrg     INCLUDE_DEFAULTS_MUSL_TOOL				\
102010d565efSmrg     INCLUDE_DEFAULTS_MUSL_NATIVE			\
102110d565efSmrg     { GCC_INCLUDE_DIR, "GCC", 0, 1, 0, 0 },		\
102210d565efSmrg     { 0, 0, 0, 0, 0, 0 }				\
102310d565efSmrg   }
102410d565efSmrg #endif
1025