1 /* Definitions of target machine for GNU compiler,
2 for 64 bit powerpc linux.
3 Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
5 This file is part of GNU CC.
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
22 /* Yes! We are AIX! Err. Wait. We're Linux!. No, wait, we're a
25 #define DEFAULT_ABI ABI_AIX
31 #define TARGET_DEFAULT \
32 (MASK_POWERPC | MASK_POWERPC64 | MASK_64BIT | MASK_NEW_MNEMONICS)
34 #undef PROCESSOR_DEFAULT
35 #define PROCESSOR_DEFAULT PROCESSOR_PPC630
36 #undef PROCESSOR_DEFAULT64
37 #define PROCESSOR_DEFAULT64 PROCESSOR_PPC630
39 #undef ASM_DEFAULT_SPEC
40 #define ASM_DEFAULT_SPEC "-mppc64"
43 #define ASM_SPEC "%{.s: %{mregnames} %{mno-regnames}} \
44 %{.S: %{mregnames} %{mno-regnames}} \
45 %{mlittle} %{mlittle-endian} %{mbig} %{mbig-endian} \
46 %{v:-V} %{Qy:} %{!Qn:-Qy} -a64 %(asm_cpu) %{Wa,*:%*}"
48 /* 64-bit PowerPC Linux always has a TOC. */
50 #define TARGET_NO_TOC 0
54 /* We use glibc _mcount for profiling. */
55 #define NO_PROFILE_COUNTERS 1
56 #undef PROFILE_BEFORE_PROLOGUE
58 /* Define this for kernel profiling, which just saves LR then calls
59 _mcount without worrying about arg saves. The idea is to change
60 the function prologue as little as possible as it isn't easy to
61 account for arg save/restore code added just for _mcount. */
62 /* #define PROFILE_KERNEL 1 */
64 #define PROFILE_BEFORE_PROLOGUE 1
67 #define PROFILE_HOOK(LABEL) output_profile_hook (LABEL)
70 /* We don't need to generate entries in .fixup. */
71 #undef RELOCATABLE_NEEDS_FIXUP
73 #define USER_LABEL_PREFIX ""
75 /* AIX word-aligns FP doubles but doubleword-aligns 64-bit ints. */
76 #undef ADJUST_FIELD_ALIGN
77 #define ADJUST_FIELD_ALIGN(FIELD, COMPUTED) \
78 (TYPE_MODE (TREE_CODE (TREE_TYPE (FIELD)) == ARRAY_TYPE \
79 ? get_inner_array_type (FIELD) \
80 : TREE_TYPE (FIELD)) == DFmode \
81 ? MIN ((COMPUTED), 32) : (COMPUTED))
83 /* AIX increases natural record alignment to doubleword if the first
84 field is an FP double while the FP fields remain word aligned. */
85 #undef ROUND_TYPE_ALIGN
86 #define ROUND_TYPE_ALIGN(STRUCT, COMPUTED, SPECIFIED) \
87 ((TREE_CODE (STRUCT) == RECORD_TYPE \
88 || TREE_CODE (STRUCT) == UNION_TYPE \
89 || TREE_CODE (STRUCT) == QUAL_UNION_TYPE) \
90 && TYPE_FIELDS (STRUCT) != 0 \
91 && DECL_MODE (TYPE_FIELDS (STRUCT)) == DFmode \
92 ? MAX (MAX ((COMPUTED), (SPECIFIED)), 64) \
93 : MAX ((COMPUTED), (SPECIFIED)))
95 /* Indicate that jump tables go in the text section. */
96 #undef JUMP_TABLES_IN_TEXT_SECTION
97 #define JUMP_TABLES_IN_TEXT_SECTION 1
99 /* 64-bit PowerPC Linux always has GPR13 fixed. */
102 /* __throw will restore its own return address to be the same as the
103 return address of the function that the throw is being made to.
104 This is unfortunate, because we want to check the original
105 return address to see if we need to restore the TOC.
106 So we have to squirrel it away with this. */
107 #define SETUP_FRAME_ADDRESSES() rs6000_aix_emit_builtin_unwind_init ()
109 /* Don't assume anything about the header files. */
110 #define NO_IMPLICIT_EXTERN_C
112 /* Override svr4.h */
113 #undef MD_EXEC_PREFIX
114 #undef MD_STARTFILE_PREFIX
116 #undef TARGET_OS_CPP_BUILTINS
117 #define TARGET_OS_CPP_BUILTINS() \
120 builtin_define ("__PPC__"); \
121 builtin_define ("__PPC64__"); \
122 builtin_define ("__powerpc__"); \
123 builtin_define ("__powerpc64__"); \
124 builtin_define ("__PIC__"); \
125 builtin_define ("__ELF__"); \
126 builtin_assert ("cpu=powerpc64"); \
127 builtin_assert ("machine=powerpc64"); \
131 #undef CPP_OS_DEFAULT_SPEC
132 #define CPP_OS_DEFAULT_SPEC "%(cpp_os_linux)"
134 /* The GNU C++ standard library currently requires _GNU_SOURCE being
135 defined on glibc-based systems. This temporary hack accomplishes this,
136 it should go away as soon as libstdc++-v3 has a real fix. */
137 #undef CPLUSPLUS_CPP_SPEC
138 #define CPLUSPLUS_CPP_SPEC "-D_GNU_SOURCE %(cpp)"
140 #undef LINK_SHLIB_SPEC
141 #define LINK_SHLIB_SPEC "%{shared:-shared} %{!shared: %{static:-static}}"
143 #undef LIB_DEFAULT_SPEC
144 #define LIB_DEFAULT_SPEC "%(lib_linux)"
146 #undef STARTFILE_DEFAULT_SPEC
147 #define STARTFILE_DEFAULT_SPEC "%(startfile_linux)"
149 #undef ENDFILE_DEFAULT_SPEC
150 #define ENDFILE_DEFAULT_SPEC "%(endfile_linux)"
152 #undef LINK_START_DEFAULT_SPEC
153 #define LINK_START_DEFAULT_SPEC "%(link_start_linux)"
155 #undef LINK_OS_DEFAULT_SPEC
156 #define LINK_OS_DEFAULT_SPEC "%(link_os_linux)"
158 #undef LINK_OS_LINUX_SPEC
159 #define LINK_OS_LINUX_SPEC "-m elf64ppc %{!shared: %{!static: \
160 %{rdynamic:-export-dynamic} \
161 %{!dynamic-linker:-dynamic-linker /lib64/ld64.so.1}}}"
164 #define STARTFILE_PREFIX_SPEC "/usr/local/lib64/ /lib64/ /usr/lib64/"
167 #undef STARTFILE_LINUX_SPEC
168 #define STARTFILE_LINUX_SPEC "\
169 %{!shared: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:crt1.o%s}}} crti.o%s \
170 %{static:crtbeginT.o%s} \
171 %{!static:%{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}}"
173 #undef ENDFILE_LINUX_SPEC
174 #define ENDFILE_LINUX_SPEC "\
175 %{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s"
177 #undef TOC_SECTION_ASM_OP
178 #define TOC_SECTION_ASM_OP "\t.section\t\".toc\",\"aw\""
180 #undef MINIMAL_TOC_SECTION_ASM_OP
181 #define MINIMAL_TOC_SECTION_ASM_OP "\t.section\t\".toc1\",\"aw\""
183 #undef TARGET_VERSION
184 #define TARGET_VERSION fprintf (stderr, " (PowerPC64 GNU/Linux)");
186 /* Must be at least as big as our pointer type. */
188 #define SIZE_TYPE "long unsigned int"
191 #define PTRDIFF_TYPE "long int"
194 #define WCHAR_TYPE "int"
195 #undef WCHAR_TYPE_SIZE
196 #define WCHAR_TYPE_SIZE 32
198 /* Override rs6000.h definition. */
200 #define ASM_APP_ON "#APP\n"
202 /* Override rs6000.h definition. */
204 #define ASM_APP_OFF "#NO_APP\n"
206 /* PowerPC no-op instruction. */
207 #undef RS6000_CALL_GLUE
208 #define RS6000_CALL_GLUE "nop"
211 #define RS6000_MCOUNT "_mcount"
213 /* FP save and restore routines. */
214 #undef SAVE_FP_PREFIX
215 #define SAVE_FP_PREFIX "._savef"
216 #undef SAVE_FP_SUFFIX
217 #define SAVE_FP_SUFFIX ""
218 #undef RESTORE_FP_PREFIX
219 #define RESTORE_FP_PREFIX "._restf"
220 #undef RESTORE_FP_SUFFIX
221 #define RESTORE_FP_SUFFIX ""
223 /* Dwarf2 debugging. */
224 #undef PREFERRED_DEBUGGING_TYPE
225 #define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
227 #undef TARGET_ENCODE_SECTION_INFO
228 #define TARGET_ENCODE_SECTION_INFO rs6000_xcoff_encode_section_info
230 /* This is how to output a reference to a user-level label named NAME.
231 `assemble_name' uses this. */
233 /* Override elfos.h definition. */
234 #undef ASM_OUTPUT_LABELREF
235 #define ASM_OUTPUT_LABELREF(FILE,NAME) \
237 const char *_name = NAME; \
242 fprintf (FILE, "%s", _name + 1); \
244 asm_fprintf (FILE, "%U%s", _name); \
247 #undef ASM_DECLARE_FUNCTION_NAME
248 #define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \
251 fputs ("\t.section\t\".opd\",\"aw\"\n\t.align 3\n", (FILE)); \
252 ASM_OUTPUT_LABEL ((FILE), (NAME)); \
253 fputs (DOUBLE_INT_ASM_OP, (FILE)); \
254 putc ('.', (FILE)); \
255 assemble_name ((FILE), (NAME)); \
256 fputs (",.TOC.@tocbase,0\n\t.previous\n\t.size\t", (FILE)); \
257 assemble_name ((FILE), (NAME)); \
258 fputs (",24\n\t.type\t.", (FILE)); \
259 assemble_name ((FILE), (NAME)); \
260 fputs (",@function\n", (FILE)); \
261 if (TREE_PUBLIC (DECL) && ! DECL_WEAK (DECL)) \
263 fputs ("\t.globl\t.", (FILE)); \
264 assemble_name ((FILE), (NAME)); \
265 putc ('\n', (FILE)); \
267 ASM_DECLARE_RESULT ((FILE), DECL_RESULT (DECL)); \
268 putc ('.', (FILE)); \
269 ASM_OUTPUT_LABEL ((FILE), (NAME)); \
273 /* This is how to declare the size of a function. */
274 #undef ASM_DECLARE_FUNCTION_SIZE
275 #define ASM_DECLARE_FUNCTION_SIZE(FILE, FNAME, DECL) \
278 if (!flag_inhibit_size_directive) \
280 fputs ("\t.size\t.", (FILE)); \
281 assemble_name ((FILE), (FNAME)); \
282 fputs (",.-.", (FILE)); \
283 assemble_name ((FILE), (FNAME)); \
284 putc ('\n', (FILE)); \
289 /* Return non-zero if this entry is to be written into the constant
290 pool in a special way. We do so if this is a SYMBOL_REF, LABEL_REF
291 or a CONST containing one of them. If -mfp-in-toc (the default),
292 we also do this for floating-point constants. We actually can only
293 do this if the FP formats of the target and host machines are the
294 same, but we can't check that since not every file that uses
295 GO_IF_LEGITIMATE_ADDRESS_P includes real.h. We also do this when
296 we can write the entry into the TOC and the entry is not larger
299 #undef ASM_OUTPUT_SPECIAL_POOL_ENTRY_P
300 #define ASM_OUTPUT_SPECIAL_POOL_ENTRY_P(X, MODE) \
302 && (GET_CODE (X) == SYMBOL_REF \
303 || (GET_CODE (X) == CONST && GET_CODE (XEXP (X, 0)) == PLUS \
304 && GET_CODE (XEXP (XEXP (X, 0), 0)) == SYMBOL_REF) \
305 || GET_CODE (X) == LABEL_REF \
306 || (GET_CODE (X) == CONST_INT \
307 && GET_MODE_BITSIZE (MODE) <= GET_MODE_BITSIZE (Pmode)) \
308 || (GET_CODE (X) == CONST_DOUBLE \
309 && (TARGET_POWERPC64 \
310 || TARGET_MINIMAL_TOC \
311 || (GET_MODE_CLASS (GET_MODE (X)) == MODE_FLOAT \
312 && ! TARGET_NO_FP_IN_TOC)))))
314 /* This is the same as the dbxelf.h version, except that we need to
315 use the function code label, not the function descriptor. */
316 #undef ASM_OUTPUT_SOURCE_LINE
317 #define ASM_OUTPUT_SOURCE_LINE(FILE, LINE) \
320 static int sym_lineno = 1; \
322 ASM_GENERATE_INTERNAL_LABEL (temp, "LM", sym_lineno); \
323 fprintf (FILE, "\t.stabn 68,0,%d,", LINE); \
324 assemble_name (FILE, temp); \
325 fputs ("-.", FILE); \
326 assemble_name (FILE, \
327 XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0));\
329 ASM_OUTPUT_INTERNAL_LABEL (FILE, "LM", sym_lineno); \
334 /* Similarly, we want the function code label here. */
335 #define DBX_OUTPUT_BRAC(FILE, NAME, BRAC) \
339 fprintf (FILE, "%s%d,0,0,", ASM_STABN_OP, BRAC); \
340 assemble_name (FILE, NAME); \
342 if (current_function_func_begin_label != NULL_TREE) \
343 flab = IDENTIFIER_POINTER (current_function_func_begin_label); \
347 flab = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0); \
349 assemble_name (FILE, flab); \
354 #define DBX_OUTPUT_LBRAC(FILE, NAME) DBX_OUTPUT_BRAC (FILE, NAME, N_LBRAC)
355 #define DBX_OUTPUT_RBRAC(FILE, NAME) DBX_OUTPUT_BRAC (FILE, NAME, N_RBRAC)
357 /* Override sysv4.h as these are ABI_V4 only. */
358 #undef ASM_OUTPUT_REG_PUSH
359 #undef ASM_OUTPUT_REG_POP