]>
Commit | Line | Data |
---|---|---|
1b4a979b | 1 | /* Base configuration file for all OpenBSD targets. |
a5544970 | 2 | Copyright (C) 1999-2019 Free Software Foundation, Inc. |
1b4a979b | 3 | |
7ec022b2 | 4 | This file is part of GCC. |
1b4a979b | 5 | |
7ec022b2 | 6 | GCC is free software; you can redistribute it and/or modify |
1b4a979b | 7 | it under the terms of the GNU General Public License as published by |
2f83c7d6 | 8 | the Free Software Foundation; either version 3, or (at your option) |
1b4a979b ME |
9 | any later version. |
10 | ||
7ec022b2 | 11 | GCC is distributed in the hope that it will be useful, |
1b4a979b ME |
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 | GNU General Public License for more details. | |
15 | ||
16 | You should have received a copy of the GNU General Public License | |
2f83c7d6 NC |
17 | along with GCC; see the file COPYING3. If not see |
18 | <http://www.gnu.org/licenses/>. */ | |
1b4a979b ME |
19 | |
20 | /* Common OpenBSD configuration. | |
21 | All OpenBSD architectures include this file, which is intended as | |
22 | a repository for common defines. | |
23 | ||
24 | Some defines are common to all architectures, a few of them are | |
25 | triggered by OBSD_* guards, so that we won't override architecture | |
26 | defaults by mistakes. | |
27 | ||
28 | OBSD_HAS_CORRECT_SPECS: | |
29 | another mechanism provides correct specs already. | |
30 | OBSD_NO_DYNAMIC_LIBRARIES: | |
31 | no implementation of dynamic libraries. | |
32 | OBSD_OLD_GAS: | |
33 | older flavor of gas which needs help for PIC. | |
34 | OBSD_HAS_DECLARE_FUNCTION_NAME, OBSD_HAS_DECLARE_FUNCTION_SIZE, | |
35 | OBSD_HAS_DECLARE_OBJECT: | |
36 | PIC support, FUNCTION_NAME/FUNCTION_SIZE are independent, whereas | |
37 | the corresponding logic for OBJECTS is necessarily coupled. | |
38 | ||
39 | There are also a few `default' defines such as ASM_WEAKEN_LABEL, | |
40 | intended as common ground for arch that don't provide | |
41 | anything suitable. */ | |
42 | ||
43 | /* OPENBSD_NATIVE is defined only when gcc is configured as part of | |
44 | the OpenBSD source tree, specifically through Makefile.bsd-wrapper. | |
45 | ||
46 | In such a case the include path can be trimmed as there is no | |
47 | distinction between system includes and gcc includes. */ | |
48 | ||
49 | /* This configuration method, namely Makefile.bsd-wrapper and | |
50 | OPENBSD_NATIVE is NOT recommended for building cross-compilers. */ | |
51 | ||
52 | #ifdef OPENBSD_NATIVE | |
53 | ||
1b4a979b ME |
54 | /* The compiler is configured with ONLY the gcc/g++ standard headers. */ |
55 | #undef INCLUDE_DEFAULTS | |
56 | #define INCLUDE_DEFAULTS \ | |
57 | { \ | |
58 | { GPLUSPLUS_INCLUDE_DIR, "G++", 1, 1 }, \ | |
378b66d4 ME |
59 | { GPLUSPLUS_TOOL_INCLUDE_DIR, "G++", 1, 1 }, \ |
60 | { GPLUSPLUS_BACKWARD_INCLUDE_DIR, "G++", 1, 1 }, \ | |
08b2bad2 | 61 | { NATIVE_SYSTEM_HEADER_DIR, NATIVE_SYSTEM_HEADER_COMPONENT, 0, 0 }, \ |
1b4a979b ME |
62 | { 0, 0, 0, 0 } \ |
63 | } | |
64 | ||
65 | /* Under OpenBSD, the normal location of the various *crt*.o files is the | |
66 | /usr/lib directory. */ | |
378b66d4 ME |
67 | #undef STANDARD_STARTFILE_PREFIX |
68 | #define STANDARD_STARTFILE_PREFIX "/usr/local/lib/" | |
1b4a979b ME |
69 | |
70 | #endif | |
71 | ||
72 | \f | |
73 | /* Controlling the compilation driver. */ | |
378b66d4 ME |
74 | /* TARGET_OS_CPP_BUILTINS() common to all OpenBSD targets. */ |
75 | #define OPENBSD_OS_CPP_BUILTINS() \ | |
76 | do \ | |
77 | { \ | |
78 | builtin_define ("__OpenBSD__"); \ | |
79 | builtin_define ("__unix__"); \ | |
80 | builtin_define ("__ANSI_COMPAT"); \ | |
81 | builtin_assert ("system=unix"); \ | |
82 | builtin_assert ("system=bsd"); \ | |
83 | builtin_assert ("system=OpenBSD"); \ | |
84 | } \ | |
85 | while (0) | |
1b4a979b | 86 | |
aa58f943 JG |
87 | /* TARGET_OS_CPP_BUILTINS() common to all OpenBSD ELF targets. */ |
88 | #define OPENBSD_OS_CPP_BUILTINS_ELF() \ | |
89 | do \ | |
90 | { \ | |
91 | OPENBSD_OS_CPP_BUILTINS(); \ | |
92 | builtin_define ("__ELF__"); \ | |
93 | } \ | |
94 | while (0) | |
95 | ||
96 | /* TARGET_OS_CPP_BUILTINS() common to all LP64 OpenBSD targets. */ | |
97 | #define OPENBSD_OS_CPP_BUILTINS_LP64() \ | |
98 | do \ | |
99 | { \ | |
100 | builtin_define ("_LP64"); \ | |
101 | builtin_define ("__LP64__"); \ | |
102 | } \ | |
103 | while (0) | |
104 | ||
1b4a979b | 105 | /* CPP_SPEC appropriate for OpenBSD. We deal with -posix and -pthread. |
378b66d4 | 106 | XXX the way threads are handled currently is not very satisfying, |
1b4a979b ME |
107 | since all code must be compiled with -pthread to work. |
108 | This two-stage defines makes it easy to pick that for targets that | |
109 | have subspecs. */ | |
f1cf4606 ME |
110 | #ifdef CPP_CPU_SPEC |
111 | #define OBSD_CPP_SPEC "%(cpp_cpu) %{posix:-D_POSIX_SOURCE} %{pthread:-D_POSIX_THREADS}" | |
112 | #else | |
1b4a979b | 113 | #define OBSD_CPP_SPEC "%{posix:-D_POSIX_SOURCE} %{pthread:-D_POSIX_THREADS}" |
f1cf4606 | 114 | #endif |
1b4a979b | 115 | |
aa58f943 JG |
116 | #undef LIB_SPEC |
117 | #define LIB_SPEC OBSD_LIB_SPEC | |
1b4a979b ME |
118 | |
119 | #ifndef OBSD_HAS_CORRECT_SPECS | |
120 | ||
1b4a979b ME |
121 | #undef CPP_SPEC |
122 | #define CPP_SPEC OBSD_CPP_SPEC | |
123 | ||
124 | #ifdef OBSD_OLD_GAS | |
125 | /* ASM_SPEC appropriate for OpenBSD. For some architectures, OpenBSD | |
126 | still uses a special flavor of gas that needs to be told when generating | |
127 | pic code. */ | |
128 | #undef ASM_SPEC | |
428b3812 | 129 | #define ASM_SPEC "%{" FPIE1_OR_FPIC1_SPEC ":-k} %{" FPIE2_OR_FPIC2_SPEC ":-k -K}" |
1b4a979b ME |
130 | #endif |
131 | ||
4977bab6 ZW |
132 | /* Since we use gas, stdin -> - is a good idea. */ |
133 | #define AS_NEEDS_DASH_FOR_PIPED_INPUT | |
134 | ||
aa58f943 JG |
135 | #undef LIB_SPEC |
136 | #define LIB_SPEC OBSD_LIB_SPEC | |
137 | ||
138 | #if defined(HAVE_LD_EH_FRAME_HDR) | |
8c6562e1 | 139 | #define LINK_EH_SPEC "%{!static|static-pie:--eh-frame-hdr} " |
1b4a979b ME |
140 | #endif |
141 | ||
142 | #undef LIB_SPEC | |
143 | #define LIB_SPEC OBSD_LIB_SPEC | |
144 | #endif | |
145 | ||
9c0c4ec7 | 146 | #define TARGET_POSIX_IO |
613061fd | 147 | |
d33d9e47 AI |
148 | /* All new versions of OpenBSD have C99 functions. We redefine this hook |
149 | so the version from elfos.h header won't be used. */ | |
150 | #undef TARGET_LIBC_HAS_FUNCTION | |
151 | #define TARGET_LIBC_HAS_FUNCTION default_libc_has_function | |
613061fd | 152 | |
1b4a979b ME |
153 | \f |
154 | /* Runtime target specification. */ | |
155 | ||
1b4a979b ME |
156 | /* Miscellaneous parameters. */ |
157 | ||
1b4a979b ME |
158 | /* Controlling debugging info: dbx options. */ |
159 | ||
160 | /* Don't use the `xsTAG;' construct in DBX output; OpenBSD systems that | |
161 | use DBX don't support it. */ | |
162 | #define DBX_NO_XREFS | |
163 | ||
164 | \f | |
57809813 | 165 | /* - we use . - _func instead of a local label, |
1b4a979b ME |
166 | - we put extra spaces in expressions such as |
167 | .type _func , @function | |
168 | This is more readable for a human being and confuses c++filt less. */ | |
169 | ||
170 | /* Assembler format: output and generation of labels. */ | |
171 | ||
172 | /* Define the strings used for the .type and .size directives. | |
173 | These strings generally do not vary from one system running OpenBSD | |
174 | to another, but if a given system needs to use different pseudo-op | |
175 | names for these, they may be overridden in the arch specific file. */ | |
176 | ||
177 | /* OpenBSD assembler is hacked to have .type & .size support even in a.out | |
178 | format object files. Functions size are supported but not activated | |
203cb4ef ME |
179 | yet (look for GRACE_PERIOD_EXPIRED in gas/config/obj-aout.c). |
180 | SET_ASM_OP is needed for attribute alias to work. */ | |
1b4a979b ME |
181 | |
182 | #undef TYPE_ASM_OP | |
183 | #undef SIZE_ASM_OP | |
203cb4ef | 184 | #undef SET_ASM_OP |
506a61b1 | 185 | #undef GLOBAL_ASM_OP |
1b4a979b | 186 | |
e662a129 HPN |
187 | #define TYPE_ASM_OP "\t.type\t" |
188 | #define SIZE_ASM_OP "\t.size\t" | |
189 | #define SET_ASM_OP "\t.set\t" | |
506a61b1 | 190 | #define GLOBAL_ASM_OP "\t.globl\t" |
1b4a979b ME |
191 | |
192 | /* The following macro defines the format used to output the second | |
193 | operand of the .type assembler directive. */ | |
194 | #undef TYPE_OPERAND_FMT | |
195 | #define TYPE_OPERAND_FMT "@%s" | |
196 | ||
197 | /* Provision if extra assembler code is needed to declare a function's result | |
198 | (taken from svr4, not needed yet actually). */ | |
199 | #ifndef ASM_DECLARE_RESULT | |
200 | #define ASM_DECLARE_RESULT(FILE, RESULT) | |
201 | #endif | |
202 | ||
203 | /* These macros generate the special .type and .size directives which | |
204 | are used to set the corresponding fields of the linker symbol table | |
205 | entries under OpenBSD. These macros also have to output the starting | |
206 | labels for the relevant functions/objects. */ | |
207 | ||
208 | #ifndef OBSD_HAS_DECLARE_FUNCTION_NAME | |
209 | /* Extra assembler code needed to declare a function properly. | |
210 | Some assemblers may also need to also have something extra said | |
211 | about the function's return value. We allow for that here. */ | |
212 | #undef ASM_DECLARE_FUNCTION_NAME | |
213 | #define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \ | |
214 | do { \ | |
2be2ac70 | 215 | ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "function"); \ |
1b4a979b | 216 | ASM_DECLARE_RESULT (FILE, DECL_RESULT (DECL)); \ |
135a687e | 217 | ASM_OUTPUT_FUNCTION_LABEL (FILE, NAME, DECL); \ |
1b4a979b ME |
218 | } while (0) |
219 | #endif | |
220 | ||
221 | #ifndef OBSD_HAS_DECLARE_FUNCTION_SIZE | |
222 | /* Declare the size of a function. */ | |
223 | #undef ASM_DECLARE_FUNCTION_SIZE | |
99086d59 ZW |
224 | #define ASM_DECLARE_FUNCTION_SIZE(FILE, FNAME, DECL) \ |
225 | do { \ | |
226 | if (!flag_inhibit_size_directive) \ | |
227 | ASM_OUTPUT_MEASURED_SIZE (FILE, FNAME); \ | |
1b4a979b ME |
228 | } while (0) |
229 | #endif | |
230 | ||
231 | #ifndef OBSD_HAS_DECLARE_OBJECT | |
232 | /* Extra assembler code needed to declare an object properly. */ | |
233 | #undef ASM_DECLARE_OBJECT_NAME | |
2be2ac70 ZW |
234 | #define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL) \ |
235 | do { \ | |
236 | HOST_WIDE_INT size; \ | |
237 | ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "object"); \ | |
238 | size_directive_output = 0; \ | |
239 | if (!flag_inhibit_size_directive \ | |
240 | && (DECL) && DECL_SIZE (DECL)) \ | |
241 | { \ | |
242 | size_directive_output = 1; \ | |
243 | size = int_size_in_bytes (TREE_TYPE (DECL)); \ | |
244 | ASM_OUTPUT_SIZE_DIRECTIVE (FILE, NAME, size); \ | |
245 | } \ | |
246 | ASM_OUTPUT_LABEL (FILE, NAME); \ | |
1b4a979b ME |
247 | } while (0) |
248 | ||
249 | /* Output the size directive for a decl in rest_of_decl_compilation | |
250 | in the case where we did not do so before the initializer. | |
251 | Once we find the error_mark_node, we know that the value of | |
252 | size_directive_output was set by ASM_DECLARE_OBJECT_NAME | |
253 | when it was run for the same decl. */ | |
254 | #undef ASM_FINISH_DECLARE_OBJECT | |
255 | #define ASM_FINISH_DECLARE_OBJECT(FILE, DECL, TOP_LEVEL, AT_END) \ | |
256 | do { \ | |
3cce094d | 257 | const char *name = XSTR (XEXP (DECL_RTL (DECL), 0), 0); \ |
2be2ac70 | 258 | HOST_WIDE_INT size; \ |
1b4a979b ME |
259 | if (!flag_inhibit_size_directive && DECL_SIZE (DECL) \ |
260 | && ! AT_END && TOP_LEVEL \ | |
261 | && DECL_INITIAL (DECL) == error_mark_node \ | |
262 | && !size_directive_output) \ | |
263 | { \ | |
264 | size_directive_output = 1; \ | |
2be2ac70 ZW |
265 | size = int_size_in_bytes (TREE_TYPE (DECL)); \ |
266 | ASM_OUTPUT_SIZE_DIRECTIVE (FILE, name, size); \ | |
1b4a979b ME |
267 | } \ |
268 | } while (0) | |
269 | #endif | |
270 | ||
271 | \f | |
272 | /* Those are `generic' ways to weaken/globalize a label. We shouldn't need | |
273 | to override a processor specific definition. Hence, #ifndef ASM_* | |
274 | In case overriding turns out to be needed, one can always #undef ASM_* | |
275 | before including this file. */ | |
276 | ||
277 | /* Tell the assembler that a symbol is weak. */ | |
278 | /* Note: netbsd arm32 assembler needs a .globl here. An override may | |
279 | be needed when/if we go for arm32 support. */ | |
280 | #ifndef ASM_WEAKEN_LABEL | |
281 | #define ASM_WEAKEN_LABEL(FILE,NAME) \ | |
282 | do { fputs ("\t.weak\t", FILE); assemble_name (FILE, NAME); \ | |
283 | fputc ('\n', FILE); } while (0) | |
284 | #endif | |
1b4a979b ME |
285 | \f |
286 | /* Storage layout. */ | |
287 | ||
1b4a979b | 288 | \f |
10e48e39 | 289 | #define HAVE_ENABLE_EXECUTE_STACK |