xref: /openbsd/gnu/gcc/gcc/config/mips/openbsd.h (revision 1107cbef)
1f5121176Skettenis /* Configuration file for a mips64 OpenBSD target.
2f5121176Skettenis    Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
3f5121176Skettenis    Free Software Foundation, Inc.
4404b540aSrobert 
5404b540aSrobert This file is part of GCC.
6404b540aSrobert 
7404b540aSrobert GCC is free software; you can redistribute it and/or modify
8404b540aSrobert it under the terms of the GNU General Public License as published by
9404b540aSrobert the Free Software Foundation; either version 2, or (at your option)
10404b540aSrobert any later version.
11404b540aSrobert 
12404b540aSrobert GCC is distributed in the hope that it will be useful,
13404b540aSrobert but WITHOUT ANY WARRANTY; without even the implied warranty of
14404b540aSrobert MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15404b540aSrobert GNU General Public License for more details.
16404b540aSrobert 
17404b540aSrobert You should have received a copy of the GNU General Public License
18404b540aSrobert along with GCC; see the file COPYING.  If not, write to
19404b540aSrobert the Free Software Foundation, 51 Franklin Street, Fifth Floor,
20404b540aSrobert Boston, MA 02110-1301, USA.  */
21404b540aSrobert 
22f5121176Skettenis /* This must agree with <machine/_types.h> */
23404b540aSrobert #undef SIZE_TYPE
24f5121176Skettenis #define SIZE_TYPE "long unsigned int"
25404b540aSrobert 
26404b540aSrobert #undef PTRDIFF_TYPE
27f5121176Skettenis #define PTRDIFF_TYPE "long int"
28f5121176Skettenis 
29f5121176Skettenis #undef INTMAX_TYPE
30f5121176Skettenis #define INTMAX_TYPE "long long int"
31f5121176Skettenis 
32f5121176Skettenis #undef UINTMAX_TYPE
33f5121176Skettenis #define UINTMAX_TYPE "long long unsigned int"
34404b540aSrobert 
35404b540aSrobert #undef WCHAR_TYPE
36404b540aSrobert #define WCHAR_TYPE "int"
37404b540aSrobert 
38404b540aSrobert #undef WCHAR_TYPE_SIZE
39404b540aSrobert #define WCHAR_TYPE_SIZE 32
40404b540aSrobert 
41f5121176Skettenis /* If defined, a C expression whose value is a string containing the
42f5121176Skettenis    assembler operation to identify the following data as
43f5121176Skettenis    uninitialized global data.  If not defined, and neither
44f5121176Skettenis    `ASM_OUTPUT_BSS' nor `ASM_OUTPUT_ALIGNED_BSS' are defined,
45f5121176Skettenis    uninitialized global data will be output in the data section if
46f5121176Skettenis    `-fno-common' is passed, otherwise `ASM_OUTPUT_COMMON' will be
47f5121176Skettenis    used.  */
48f5121176Skettenis #define BSS_SECTION_ASM_OP	"\t.section\t.bss"
49404b540aSrobert 
50f5121176Skettenis #define ASM_OUTPUT_ALIGNED_BSS mips_output_aligned_bss
51404b540aSrobert 
52f5121176Skettenis #undef ASM_DECLARE_OBJECT_NAME
53f5121176Skettenis #define ASM_DECLARE_OBJECT_NAME mips_declare_object_name
54f5121176Skettenis 
55f5121176Skettenis #undef MD_EXEC_PREFIX
56f5121176Skettenis #undef MD_STARTFILE_PREFIX
57f5121176Skettenis 
58f5121176Skettenis /* If we don't set MASK_ABICALLS, we can't default to PIC.  */
59f5121176Skettenis #undef TARGET_DEFAULT
60f5121176Skettenis #define TARGET_DEFAULT MASK_ABICALLS
61f5121176Skettenis 
62f5121176Skettenis #define TARGET_OS_CPP_BUILTINS()				\
63f5121176Skettenis   do {								\
64f5121176Skettenis     OPENBSD_OS_CPP_BUILTINS();					\
65f5121176Skettenis 								\
66f5121176Skettenis     if (TARGET_64BIT)						\
67f5121176Skettenis       builtin_define ("__mips64__");				\
68f5121176Skettenis 								\
69f5121176Skettenis     if (TARGET_ABICALLS)					\
70f5121176Skettenis       builtin_define ("__ABICALLS__");				\
71f5121176Skettenis 								\
72f5121176Skettenis     if (mips_abi == ABI_EABI)					\
73f5121176Skettenis       builtin_define ("__mips_eabi");				\
74f5121176Skettenis     else if (mips_abi == ABI_N32)				\
75f5121176Skettenis       builtin_define ("__mips_n32");				\
76f5121176Skettenis     else if (mips_abi == ABI_64)				\
77f5121176Skettenis       builtin_define ("__mips_n64");				\
78f5121176Skettenis     else if (mips_abi == ABI_O64)				\
79f5121176Skettenis       builtin_define ("__mips_o64");				\
80f5121176Skettenis     								\
81f5121176Skettenis     if (mips_abi == ABI_N32)					\
82f5121176Skettenis       {								\
83f5121176Skettenis         builtin_define ("_ABIN32=2");				\
84f5121176Skettenis         builtin_define ("_MIPS_SIM=_ABIN32");			\
85f5121176Skettenis         builtin_define ("_MIPS_SZLONG=32");			\
86f5121176Skettenis         builtin_define ("_MIPS_SZPTR=32");			\
87f5121176Skettenis       }								\
88f5121176Skettenis     else if (mips_abi == ABI_64)				\
89f5121176Skettenis       {								\
90f5121176Skettenis         builtin_define ("_ABI64=3");				\
91f5121176Skettenis         builtin_define ("_MIPS_SIM=_ABI64");			\
92f5121176Skettenis         builtin_define ("_MIPS_SZLONG=64");			\
93f5121176Skettenis         builtin_define ("_MIPS_SZPTR=64");			\
94f5121176Skettenis       }								\
95f5121176Skettenis     else							\
96f5121176Skettenis       {								\
97f5121176Skettenis 	builtin_define ("_ABIO32=1");				\
98f5121176Skettenis 	builtin_define ("_MIPS_SIM=_ABIO32");			\
99f5121176Skettenis         builtin_define ("_MIPS_SZLONG=32");			\
100f5121176Skettenis         builtin_define ("_MIPS_SZPTR=32");			\
101f5121176Skettenis       }								\
102f5121176Skettenis     if (TARGET_FLOAT64)						\
103f5121176Skettenis       builtin_define ("_MIPS_FPSET=32");			\
104f5121176Skettenis     else							\
105f5121176Skettenis       builtin_define ("_MIPS_FPSET=16");			\
106f5121176Skettenis     								\
107f5121176Skettenis     builtin_define ("_MIPS_SZINT=32");				\
108f5121176Skettenis   } while (0)
109f5121176Skettenis 
110f5121176Skettenis #undef SUBTARGET_CPP_SPEC
111f5121176Skettenis #define SUBTARGET_CPP_SPEC OBSD_CPP_SPEC
112f5121176Skettenis 
113f5121176Skettenis /* A standard GNU/Linux mapping.  On most targets, it is included in
114f5121176Skettenis    CC1_SPEC itself by config/linux.h, but mips.h overrides CC1_SPEC
115f5121176Skettenis    and provides this hook instead.  */
116f5121176Skettenis #undef SUBTARGET_CC1_SPEC
117f5121176Skettenis #define SUBTARGET_CC1_SPEC "%{profile:-p}"
118f5121176Skettenis 
119f5121176Skettenis /* From iris5.h */
120404b540aSrobert /* -G is incompatible with -KPIC which is the default, so only allow objects
121404b540aSrobert    in the small data section if the user explicitly asks for it.  */
122404b540aSrobert #undef MIPS_DEFAULT_GVALUE
123404b540aSrobert #define MIPS_DEFAULT_GVALUE 0
124404b540aSrobert 
125f5121176Skettenis /* Borrowed from sparc/linux.h */
126f5121176Skettenis #undef LINK_SPEC
127f5121176Skettenis #define LINK_SPEC \
128f5121176Skettenis   "%(endian_spec) \
129f5121176Skettenis    %{!shared:%{!nostdlib:%{!r*:%{!e*:-e __start}}}} \
130f5121176Skettenis    %{shared:-shared} %{R*} \
131f5121176Skettenis    %{static:-Bstatic} \
132f5121176Skettenis    %{!static:-Bdynamic} \
133ae784e91Sjsg    %{rdynamic:-export-dynamic} \
134f5121176Skettenis    %{assert*} \
135*1107cbefSmillert    %{!static:%{!dynamic-linker:-dynamic-linker /usr/libexec/ld.so}}"
136f5121176Skettenis 
137f5121176Skettenis /* As an elf system, we need crtbegin/crtend stuff.  */
138404b540aSrobert #undef STARTFILE_SPEC
139f5121176Skettenis #define STARTFILE_SPEC "\
1405face465Skettenis 	%{!shared: %{pg:gcrt0%O%s} %{!pg:%{p:gcrt0%O%s} \
141c3b5dcdcSpascal 	%{!p:%{!static:crt0%O%s} %{static:%{nopie:crt0%O%s} \
142c3b5dcdcSpascal 	%{!nopie:rcrt0%O%s}}}} \
143f5121176Skettenis         crtbegin%O%s} %{shared:crtbeginS%O%s}"
144f5121176Skettenis #undef ENDFILE_SPEC
145f5121176Skettenis #define ENDFILE_SPEC "%{!shared:crtend%O%s} %{shared:crtendS%O%s}"
146404b540aSrobert 
147f5121176Skettenis #undef SUBTARGET_ASM_SPEC
148f5121176Skettenis #define SUBTARGET_ASM_SPEC "%{mabi=64: -64} %{!mno-abicalls:-KPIC}"
149f5121176Skettenis 
150f5121176Skettenis /* The MIPS assembler has different syntax for .set. We set it to
151f5121176Skettenis    .dummy to trap any errors.  */
152f5121176Skettenis #undef SET_ASM_OP
153f5121176Skettenis #define SET_ASM_OP "\t.dummy\t"
154f5121176Skettenis 
155f5121176Skettenis #undef ASM_OUTPUT_DEF
156f5121176Skettenis #define ASM_OUTPUT_DEF(FILE,LABEL1,LABEL2)				\
157f5121176Skettenis  do {									\
158f5121176Skettenis 	fputc ( '\t', FILE);						\
159f5121176Skettenis 	assemble_name (FILE, LABEL1);					\
160f5121176Skettenis 	fputs ( " = ", FILE);						\
161f5121176Skettenis 	assemble_name (FILE, LABEL2);					\
162f5121176Skettenis 	fputc ( '\n', FILE);						\
163f5121176Skettenis  } while (0)
164f5121176Skettenis 
165f5121176Skettenis #undef ASM_DECLARE_FUNCTION_NAME
166f5121176Skettenis #define ASM_DECLARE_FUNCTION_NAME(STREAM, NAME, DECL)			\
167f5121176Skettenis   do {									\
168f5121176Skettenis     if (!flag_inhibit_size_directive)					\
169f5121176Skettenis       {									\
170f5121176Skettenis 	fputs ("\t.ent\t", STREAM);					\
171f5121176Skettenis 	assemble_name (STREAM, NAME);					\
172f5121176Skettenis 	putc ('\n', STREAM);						\
173f5121176Skettenis       }									\
174f5121176Skettenis     ASM_OUTPUT_TYPE_DIRECTIVE (STREAM, NAME, "function");		\
175f5121176Skettenis     assemble_name (STREAM, NAME);					\
176f5121176Skettenis     fputs (":\n", STREAM);						\
177f5121176Skettenis   } while (0)
178f5121176Skettenis 
179f5121176Skettenis #undef ASM_DECLARE_FUNCTION_SIZE
180f5121176Skettenis #define ASM_DECLARE_FUNCTION_SIZE(STREAM, NAME, DECL)			\
181f5121176Skettenis   do {									\
182f5121176Skettenis     if (!flag_inhibit_size_directive)					\
183f5121176Skettenis       {									\
184f5121176Skettenis 	fputs ("\t.end\t", STREAM);					\
185f5121176Skettenis 	assemble_name (STREAM, NAME);					\
186f5121176Skettenis 	putc ('\n', STREAM);						\
187f5121176Skettenis       }									\
188f5121176Skettenis   } while (0)
189f5121176Skettenis 
190f5121176Skettenis /* Tell function_prologue in mips.c that we have already output the .ent/.end
191f5121176Skettenis    pseudo-ops.  */
192f5121176Skettenis #undef FUNCTION_NAME_ALREADY_DECLARED
193f5121176Skettenis #define FUNCTION_NAME_ALREADY_DECLARED 1
194f5121176Skettenis 
195f5121176Skettenis #undef LOCAL_LABEL_PREFIX
196f5121176Skettenis #define LOCAL_LABEL_PREFIX	"."
197f5121176Skettenis 
198f5121176Skettenis /* The glibc _mcount stub will save $v0 for us.  Don't mess with saving
199f5121176Skettenis    it, since ASM_OUTPUT_REG_PUSH/ASM_OUTPUT_REG_POP do not work in the
200f5121176Skettenis    presence of $gp-relative calls.  */
201f5121176Skettenis #undef ASM_OUTPUT_REG_PUSH
202f5121176Skettenis #undef ASM_OUTPUT_REG_POP
203f5121176Skettenis 
204f5121176Skettenis #undef LIB_SPEC
205f5121176Skettenis #define LIB_SPEC OBSD_LIB_SPEC
206f5121176Skettenis 
207f5121176Skettenis #undef ENABLE_EXECUTE_STACK
208bc3a335eSmiod 
209bc3a335eSmiod /* Default to -mfix-r4000 -mfix-r4400 when compiling big endian.  */
210bc3a335eSmiod #undef OVERRIDE_OPTIONS
211bc3a335eSmiod #define OVERRIDE_OPTIONS						\
212bc3a335eSmiod   do {									\
213bc3a335eSmiod     if (TARGET_BIG_ENDIAN)						\
214bc3a335eSmiod       {									\
215bc3a335eSmiod 	target_flags |= MASK_FIX_R4000 | MASK_FIX_R4400;		\
216bc3a335eSmiod       }									\
217bc3a335eSmiod     override_options ();						\
218bc3a335eSmiod   } while (0)
219