xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/config/rs6000/linux.h (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
1 /* Definitions of target machine for GNU compiler,
2    for PowerPC machines running Linux.
3    Copyright (C) 1996-2020 Free Software Foundation, Inc.
4    Contributed by Michael Meissner (meissner@cygnus.com).
5 
6    This file is part of GCC.
7 
8    GCC is free software; you can redistribute it and/or modify it
9    under the terms of the GNU General Public License as published
10    by the Free Software Foundation; either version 3, or (at your
11    option) any later version.
12 
13    GCC is distributed in the hope that it will be useful, but WITHOUT
14    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
16    License for more details.
17 
18    You should have received a copy of the GNU General Public License
19    along with GCC; see the file COPYING3.  If not see
20    <http://www.gnu.org/licenses/>.  */
21 
22 /* Linux doesn't support saving and restoring 64-bit regs in a 32-bit
23    process.  */
24 #define OS_MISSING_POWERPC64 1
25 
26 /* We use glibc _mcount for profiling.  */
27 #define NO_PROFILE_COUNTERS 1
28 
29 #ifdef SINGLE_LIBC
30 #define OPTION_GLIBC  (DEFAULT_LIBC == LIBC_GLIBC)
31 #define OPTION_UCLIBC (DEFAULT_LIBC == LIBC_UCLIBC)
32 #define OPTION_BIONIC (DEFAULT_LIBC == LIBC_BIONIC)
33 #undef OPTION_MUSL
34 #define OPTION_MUSL   (DEFAULT_LIBC == LIBC_MUSL)
35 #else
36 #define OPTION_GLIBC  (linux_libc == LIBC_GLIBC)
37 #define OPTION_UCLIBC (linux_libc == LIBC_UCLIBC)
38 #define OPTION_BIONIC (linux_libc == LIBC_BIONIC)
39 #undef OPTION_MUSL
40 #define OPTION_MUSL   (linux_libc == LIBC_MUSL)
41 #endif
42 
43 /* Determine what functions are present at the runtime;
44    this includes full c99 runtime and sincos.  */
45 #undef TARGET_LIBC_HAS_FUNCTION
46 #define TARGET_LIBC_HAS_FUNCTION linux_libc_has_function
47 
48 #undef  TARGET_OS_CPP_BUILTINS
49 #define TARGET_OS_CPP_BUILTINS()			\
50   do							\
51     {							\
52       if (strcmp (rs6000_abi_name, "linux") == 0)	\
53 	GNU_USER_TARGET_OS_CPP_BUILTINS();		\
54       builtin_define_std ("PPC");			\
55       builtin_define_std ("powerpc");			\
56       builtin_assert ("cpu=powerpc");			\
57       builtin_assert ("machine=powerpc");		\
58       TARGET_OS_SYSV_CPP_BUILTINS ();			\
59     }							\
60   while (0)
61 
62 #undef	CPP_OS_DEFAULT_SPEC
63 #define CPP_OS_DEFAULT_SPEC "%(cpp_os_linux)"
64 
65 #undef  LINK_SHLIB_SPEC
66 #define LINK_SHLIB_SPEC "%{shared:-shared} %{!shared: %{static:-static}} \
67   %{static-pie:-static -pie --no-dynamic-linker -z text}"
68 
69 #undef	LIB_DEFAULT_SPEC
70 #define LIB_DEFAULT_SPEC "%(lib_linux)"
71 
72 #undef	STARTFILE_DEFAULT_SPEC
73 #define STARTFILE_DEFAULT_SPEC "%(startfile_linux)"
74 
75 #undef	ENDFILE_DEFAULT_SPEC
76 #define ENDFILE_DEFAULT_SPEC "%(endfile_linux)"
77 
78 #undef	LINK_START_DEFAULT_SPEC
79 #define LINK_START_DEFAULT_SPEC "%(link_start_linux)"
80 
81 #undef	LINK_OS_DEFAULT_SPEC
82 #define LINK_OS_DEFAULT_SPEC "%(link_os_linux)"
83 
84 #undef  DEFAULT_ASM_ENDIAN
85 #if (TARGET_DEFAULT & MASK_LITTLE_ENDIAN)
86 #define DEFAULT_ASM_ENDIAN " -mlittle"
87 #define LINK_OS_LINUX_EMUL ENDIAN_SELECT(" -m elf32ppclinux",	\
88 					 " -m elf32lppclinux",	\
89 					 " -m elf32lppclinux")
90 #else
91 #define DEFAULT_ASM_ENDIAN " -mbig"
92 #define LINK_OS_LINUX_EMUL ENDIAN_SELECT(" -m elf32ppclinux",	\
93 					 " -m elf32lppclinux",	\
94 					 " -m elf32ppclinux")
95 #endif
96 
97 #undef LINK_OS_LINUX_SPEC
98 #define LINK_OS_LINUX_SPEC LINK_OS_LINUX_EMUL " %{!shared: %{!static: \
99   %{!static-pie: \
100     %{rdynamic:-export-dynamic} \
101     -dynamic-linker " GNU_USER_DYNAMIC_LINKER "}}}"
102 
103 /* For backward compatibility, we must continue to use the AIX
104    structure return convention.  */
105 #undef  DRAFT_V4_STRUCT_RET
106 #define DRAFT_V4_STRUCT_RET 1
107 
108 /* We are 32-bit all the time, so optimize a little.  */
109 #undef TARGET_64BIT
110 #define TARGET_64BIT 0
111 
112 /* We don't need to generate entries in .fixup, except when
113    -mrelocatable or -mrelocatable-lib is given.  */
114 #undef RELOCATABLE_NEEDS_FIXUP
115 #define RELOCATABLE_NEEDS_FIXUP \
116   (rs6000_isa_flags & rs6000_isa_flags_explicit & OPTION_MASK_RELOCATABLE)
117 
118 #undef	RS6000_ABI_NAME
119 #define	RS6000_ABI_NAME "linux"
120 
121 #ifdef TARGET_LIBC_PROVIDES_SSP
122 /* ppc32 glibc provides __stack_chk_guard in -0x7008(2).  */
123 #define TARGET_THREAD_SSP_OFFSET	-0x7008
124 #endif
125 
126 #define POWERPC_LINUX
127 
128 /* ppc linux has 128-bit long double support in glibc 2.4 and later.  */
129 #ifdef TARGET_DEFAULT_LONG_DOUBLE_128
130 #define RS6000_DEFAULT_LONG_DOUBLE_SIZE 128
131 #endif
132 
133 /* Static stack checking is supported by means of probes.  */
134 #define STACK_CHECK_STATIC_BUILTIN 1
135 
136 /* Software floating point support for exceptions and rounding modes
137    depends on the C library in use.  */
138 #undef TARGET_FLOAT_EXCEPTIONS_ROUNDING_SUPPORTED_P
139 #define TARGET_FLOAT_EXCEPTIONS_ROUNDING_SUPPORTED_P \
140   rs6000_linux_float_exceptions_rounding_supported_p
141 
142 /* Support for TARGET_ATOMIC_ASSIGN_EXPAND_FENV without FPRs depends
143    on glibc 2.19 or greater.  */
144 #if TARGET_GLIBC_MAJOR > 2 \
145   || (TARGET_GLIBC_MAJOR == 2 && TARGET_GLIBC_MINOR >= 19)
146 #define RS6000_GLIBC_ATOMIC_FENV 1
147 #endif
148