1 /* Operating system specific defines to be used when targeting GCC
3 Copyright (C) 1989, 1990, 1991, 1992, 1993, 1996, 1997,
4 1999 Free Software Foundation, Inc.
6 This file is part of GNU CC.
8 GNU CC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
13 GNU CC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GNU CC; see the file COPYING. If not, write to
20 the Free Software Foundation, 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */
23 /* Use new NeXT include file search path.
24 In a cross compiler with NeXT as target, don't expect
25 the host to use Next's directory scheme. */
28 #undef INCLUDE_DEFAULTS
29 #define INCLUDE_DEFAULTS \
31 { GPLUSPLUS_INCLUDE_DIR, "G++", 1, 1 }, \
32 { LOCAL_INCLUDE_DIR, 0, 0, 1 }, \
33 { TOOL_INCLUDE_DIR, "BINUTILS", 0, 1 }, \
34 { GCC_INCLUDE_DIR, "GCC", 0, 0 }, \
35 /* These are for fixincludes-fixed ansi/bsd headers \
36 which wouldn't be found otherwise. \
37 (The use of string catenation here is OK since \
38 NeXT's native compiler is derived from GCC.) */ \
39 { GCC_INCLUDE_DIR "/ansi", 0, 0, 0 }, \
40 { GCC_INCLUDE_DIR "/bsd", 0, 0, 0 }, \
41 { "/NextDeveloper/Headers", 0, 0, 0 }, \
42 { "/NextDeveloper/Headers/ansi", 0, 0, 0 }, \
43 { "/NextDeveloper/Headers/bsd", 0, 0, 0 }, \
44 { "/LocalDeveloper/Headers", 0, 0, 0 }, \
45 { "/LocalDeveloper/Headers/ansi", 0, 0, 0 }, \
46 { "/LocalDeveloper/Headers/bsd", 0, 0, 0 }, \
47 { "/NextDeveloper/2.0CompatibleHeaders", 0, 0, 0 }, \
48 { STANDARD_INCLUDE_DIR, 0, 0, 0 }, \
49 { "/usr/include/bsd", 0, 0, 0 }, \
52 #else /* CROSS_COMPILE */
53 #undef INCLUDE_DEFAULTS
54 #define INCLUDE_DEFAULTS \
56 { GPLUSPLUS_INCLUDE_DIR, "G++", 1, 1 }, \
57 { GPLUSPLUS_INCLUDE_DIR, 0, 1, 1 }, \
58 { LOCAL_INCLUDE_DIR, 0, 0, 1 }, \
59 { GCC_INCLUDE_DIR, "GCC", 0, 0 }, \
60 { GCC_INCLUDE_DIR "/ansi", 0, 0, 0 }, \
61 { GCC_INCLUDE_DIR "/bsd", 0, 0, 0 }, \
62 { TOOL_INCLUDE_DIR, "BINUTILS", 0, 1 }, \
63 { TOOL_INCLUDE_DIR "/ansi", 0, 0, 0 }, \
64 { TOOL_INCLUDE_DIR "/bsd", 0, 0, 0 }, \
65 { STANDARD_INCLUDE_DIR, 0, 0, 0 }, \
66 { "/usr/include/bsd", 0, 0, 0 }, \
69 #endif /* CROSS_COMPILE */
71 #undef EXTRA_FORMAT_FUNCTIONS
72 #define EXTRA_FORMAT_FUNCTIONS \
73 "NXPrintf", FALSE, 2, FALSE, \
74 "NXScanf", TRUE, 2, FALSE, \
75 "NXVPrintf", FALSE, 2, TRUE, \
76 "NXVScanf", TRUE, 2, TRUE, \
77 "DPSPrintf", FALSE, 2, FALSE, \
78 "bsd_sprintf", FALSE, 2, FALSE, \
79 "bsd_vsprintf", FALSE, 2, TRUE,
81 /* Make -fnext-runtime the default. */
83 #define NEXT_OBJC_RUNTIME
85 /* Enable recent gcc to compile under the old gcc in Next release 1.0. */
87 #define __inline inline
89 /* wchar_t is unsigned short */
92 #define WCHAR_TYPE "short unsigned int"
93 #undef WCHAR_TYPE_SIZE
94 #define WCHAR_TYPE_SIZE (BITS_PER_WORD / 2)
96 /* Don't default to pcc-struct-return, because gcc is the only compiler, and
97 we want to retain compatibility with older gcc versions. */
99 #undef DEFAULT_PCC_STRUCT_RETURN
100 #define DEFAULT_PCC_STRUCT_RETURN 0
102 /* These compiler options take n arguments. */
104 #undef WORD_SWITCH_TAKES_ARG
105 #define WORD_SWITCH_TAKES_ARG(STR) \
106 (DEFAULT_WORD_SWITCH_TAKES_ARG (STR) ? 1 : \
107 !strcmp (STR, "segalign") ? 1 : \
108 !strcmp (STR, "seg1addr") ? 1 : \
109 !strcmp (STR, "segaddr") ? 2 : \
110 !strcmp (STR, "sectobjectsymbols") ? 2 : \
111 !strcmp (STR, "segprot") ? 3 : \
112 !strcmp (STR, "sectcreate") ? 3 : \
113 !strcmp (STR, "sectalign") ? 3 : \
114 !strcmp (STR, "segcreate") ? 3 : \
115 !strcmp (STR, "sectorder") ? 3 : \
116 !strcmp (STR, "siff-mask") ? 1 : \
117 !strcmp (STR, "siff-filter") ? 1 : \
118 !strcmp (STR, "siff-warning") ? 1 : \
119 !strcmp (STR, "arch") ? 1 : \
120 !strcmp (STR, "pagezero_size") ? 1 : \
124 #define WORD_SWITCH(STR) \
125 (WORD_SWITCH_TAKES_ARG (STR) \
126 || !strcmp (STR, "bsd") \
127 || !strcmp (STR, "object") \
128 || !strcmp (STR, "ObjC") \
129 || !strcmp (STR, "all_load"))
131 /* Machine dependent ccp options. */
134 #define CPP_SPEC "%{!traditional: -D__STDC__} \
135 %{posixstrict:-D_POSIX_SOURCE} \
136 %{!posixstrict:%{bsd:-D__STRICT_BSD__} \
137 %{posix:-D_POSIX_SOURCE} \
138 %{!ansi:-D_NEXT_SOURCE}} \
139 %{MD:-MD %M} %{MMD:-MMD %M}"
141 /* Machine dependent ld options. */
144 #define LINK_SPEC "%{Z} %{M} \
145 %{execute*} %{preload*} %{fvmlib*} \
146 %{segalign*} %{seg1addr*} %{segaddr*} %{segprot*} \
148 %{seglinkedit*} %{noseglinkedit*} \
149 %{sectcreate*} %{sectalign*} %{sectobjectsymbols}\
150 %{segcreate*} %{Mach*} %{whyload} %{w} \
151 %{sectorder*} %{whatsloaded} %{ObjC} %{all_load} %{object}"
153 /* Machine dependent libraries. */
156 #define LIB_SPEC "%{!posix*:-lsys_s} %{posix*:-lposix}"
158 /* We specify crt0.o as -lcrt0.o so that ld will search the library path. */
160 #undef STARTFILE_SPEC
161 #define STARTFILE_SPEC \
162 "%{!posix*:%{pg:-lgcrt0.o}%{!pg: \
163 %{p:%e-p profiling is no longer supported. Use -pg instead.} \
165 %{posix*:%{pg:-lgposixcrt0.o}%{!pg: \
166 %{p:%e-p profiling is no longer supported. Use -pg instead.} \
167 %{!p:-lposixcrt0.o}}} \
171 #define ENDFILE_SPEC \
174 /* Allow #sscs (but don't do anything). */
176 #define SCCS_DIRECTIVE
178 /* We use Dbx symbol format. */
180 #undef SDB_DEBUGGING_INFO
181 #undef XCOFF_DEBUGGING_INFO
182 #define DBX_DEBUGGING_INFO
184 /* This saves a fair amount of space. */
186 #undef DBX_CONTIN_LENGTH
187 #define DBX_CONTIN_LENGTH 0
189 /* These screw up NeXT's gdb at the moment, so don't use them. */
191 #undef DBX_OUTPUT_MAIN_SOURCE_DIRECTORY
192 #define DBX_OUTPUT_MAIN_SOURCE_DIRECTORY(FILE, FILENAME)
194 /* These come from bsd386.h, but are specific to sequent, so make sure
195 they don't bite us. */
198 #undef DBX_CONTIN_LENGTH
200 /* gdb needs a null N_SO at the end of each file for scattered loading. */
202 #undef DBX_OUTPUT_MAIN_SOURCE_FILE_END
203 #define DBX_OUTPUT_MAIN_SOURCE_FILE_END(FILE, FILENAME) \
205 "\t.text\n\t.stabs \"%s\",%d,0,0,Letext\nLetext:\n", \
208 /* Define our object format type for crtstuff.c */
209 #define OBJECT_FORMAT_MACHO
211 #undef INIT_SECTION_ASM_OP
212 #define INIT_SECTION_ASM_OP
215 #define TARGET_ASM_CONSTRUCTOR nextstep_asm_out_constructor
216 #define TARGET_ASM_DESTRUCTOR nextstep_asm_out_destructor
217 extern void nextstep_asm_out_constructor PARAMS ((struct rtx_def *, int));
218 extern void nextstep_asm_out_destructor PARAMS ((struct rtx_def *, int));
220 /* ??? Should be changed to EH_FRAME_SECTION_NAME, but that requires
221 named section support. Based on this definition, it seems clear
222 that the object file format supports named sections, but it has
223 not been implemented in gcc. */
224 #error "Implement named section support"
225 #define EH_FRAME_SECTION_ASM_OP "\t.section __TEXT,__eh_frame,regular"
227 /* Don't output a .file directive. That is only used by the assembler for
229 #undef ASM_FILE_START
230 #define ASM_FILE_START(FILE)
233 #define ASM_FILE_END(FILE) \
235 if (strcmp (language_string, "GNU C++") == 0) \
237 constructor_section (); \
238 destructor_section (); \
239 ASM_OUTPUT_ALIGN (FILE, 1); \
243 /* How to parse #pragma's */
246 #define HANDLE_PRAGMA(GETC, UNGETC, NAME) handle_pragma (GETC, UNGETC, NAME)
247 extern int handle_pragma PARAMS ((int(*)(void), void (*)(int), const char *));
249 /* Give methods pretty symbol names on NeXT. */
251 #undef OBJC_GEN_METHOD_LABEL
252 #define OBJC_GEN_METHOD_LABEL(BUF,IS_INST,CLASS_NAME,CAT_NAME,SEL_NAME,NUM) \
254 sprintf (BUF, "%c[%s(%s) %s]", (IS_INST) ? '-' : '+', \
255 (CLASS_NAME), (CAT_NAME), (SEL_NAME)); \
257 sprintf (BUF, "%c[%s %s]", (IS_INST) ? '-' : '+', \
258 (CLASS_NAME), (SEL_NAME)); \
261 /* The prefix to add to user-visible assembler symbols. */
263 #undef USER_LABEL_PREFIX
264 #define USER_LABEL_PREFIX "_"
266 /* Wrap new method names in quotes so the assembler doesn't gag.
267 Make Objective-C internal symbols local. */
269 #undef ASM_OUTPUT_LABELREF
270 #define ASM_OUTPUT_LABELREF(FILE,NAME) \
271 do { if (NAME[0] == '+' || NAME[0] == '-') fprintf (FILE, "\"%s\"", NAME); \
272 else if (!strncmp (NAME, "_OBJC_", 6)) fprintf (FILE, "L%s", NAME); \
273 else if (!strncmp (NAME, ".objc_class_name_", 17)) \
274 fprintf (FILE, "%s", NAME); \
275 else asm_fprintf (FILE, "%U%s", NAME); } while (0)
278 #define ALIGN_ASM_OP "\t.align\t"
280 #undef ASM_OUTPUT_ALIGN
281 #define ASM_OUTPUT_ALIGN(FILE,LOG) \
283 fprintf (FILE, "%s%d\n", ALIGN_ASM_OP, (LOG))
285 /* Ensure correct alignment of bss data. */
287 #undef ASM_OUTPUT_ALIGNED_LOCAL
288 #define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \
289 ( fputs (".lcomm ", (FILE)), \
290 assemble_name ((FILE), (NAME)), \
291 fprintf ((FILE), ",%u,%u\n", (SIZE), floor_log2 ((ALIGN) / BITS_PER_UNIT)))
293 /* Output #ident as a .ident. */
295 #undef ASM_OUTPUT_IDENT
296 #define ASM_OUTPUT_IDENT(FILE, NAME) fprintf (FILE, "\t.ident \"%s\"\n", NAME);
298 /* The maximum alignment which the object file format can support.
299 For NeXT's Mach-O format, this is 2^15. */
301 #undef MAX_OFILE_ALIGNMENT
302 #define MAX_OFILE_ALIGNMENT 0x8000
304 /* Create new Mach-O sections. */
306 #undef SECTION_FUNCTION
307 #define SECTION_FUNCTION(FUNCTION, SECTION, DIRECTIVE, WAS_TEXT, OBJC) \
308 extern void FUNCTION PARAMS ((void)); \
312 extern int flag_no_mach_text_sections; \
314 if (WAS_TEXT && flag_no_mach_text_sections) \
316 else if (in_section != SECTION) \
319 objc_section_init (); \
320 fprintf (asm_out_file, "%s\n", DIRECTIVE); \
321 in_section = SECTION; \
325 #undef EXTRA_SECTIONS
326 #define EXTRA_SECTIONS \
327 in_const, in_cstring, in_literal4, in_literal8, \
328 in_constructor, in_destructor, \
329 in_objc_class, in_objc_meta_class, in_objc_category, \
330 in_objc_class_vars, in_objc_instance_vars, \
331 in_objc_cls_meth, in_objc_inst_meth, \
332 in_objc_cat_cls_meth, in_objc_cat_inst_meth, \
333 in_objc_selector_refs, \
334 in_objc_symbols, in_objc_module_info, \
335 in_objc_protocol, in_objc_string_object, \
336 in_objc_class_names, in_objc_meth_var_names, \
337 in_objc_meth_var_types, in_objc_cls_refs
339 #undef EXTRA_SECTION_FUNCTIONS
340 #define EXTRA_SECTION_FUNCTIONS \
341 extern void objc_section_init PARAMS ((void)); \
342 SECTION_FUNCTION (const_section, \
345 SECTION_FUNCTION (cstring_section, \
348 SECTION_FUNCTION (literal4_section, \
351 SECTION_FUNCTION (literal8_section, \
354 SECTION_FUNCTION (constructor_section, \
356 ".constructor", 0, 0) \
357 SECTION_FUNCTION (destructor_section, \
359 ".destructor", 0, 0) \
360 SECTION_FUNCTION (objc_class_section, \
362 ".objc_class", 0, 1) \
363 SECTION_FUNCTION (objc_meta_class_section, \
364 in_objc_meta_class, \
365 ".objc_meta_class", 0, 1) \
366 SECTION_FUNCTION (objc_category_section, \
368 ".objc_category", 0, 1) \
369 SECTION_FUNCTION (objc_class_vars_section, \
370 in_objc_class_vars, \
371 ".objc_class_vars", 0, 1) \
372 SECTION_FUNCTION (objc_instance_vars_section, \
373 in_objc_instance_vars, \
374 ".objc_instance_vars", 0, 1) \
375 SECTION_FUNCTION (objc_cls_meth_section, \
377 ".objc_cls_meth", 0, 1) \
378 SECTION_FUNCTION (objc_inst_meth_section, \
380 ".objc_inst_meth", 0, 1) \
381 SECTION_FUNCTION (objc_cat_cls_meth_section, \
382 in_objc_cat_cls_meth, \
383 ".objc_cat_cls_meth", 0, 1) \
384 SECTION_FUNCTION (objc_cat_inst_meth_section, \
385 in_objc_cat_inst_meth, \
386 ".objc_cat_inst_meth", 0, 1) \
387 SECTION_FUNCTION (objc_selector_refs_section, \
388 in_objc_selector_refs, \
389 ".objc_message_refs", 0, 1) \
390 SECTION_FUNCTION (objc_symbols_section, \
392 ".objc_symbols", 0, 1) \
393 SECTION_FUNCTION (objc_module_info_section, \
394 in_objc_module_info, \
395 ".objc_module_info", 0, 1) \
396 SECTION_FUNCTION (objc_protocol_section, \
398 ".objc_protocol", 0, 1) \
399 SECTION_FUNCTION (objc_string_object_section, \
400 in_objc_string_object, \
401 ".objc_string_object", 0, 1) \
402 SECTION_FUNCTION (objc_class_names_section, \
403 in_objc_class_names, \
404 ".objc_class_names", 0, 1) \
405 SECTION_FUNCTION (objc_meth_var_names_section, \
406 in_objc_meth_var_names, \
407 ".objc_meth_var_names", 0, 1) \
408 SECTION_FUNCTION (objc_meth_var_types_section, \
409 in_objc_meth_var_types, \
410 ".objc_meth_var_types", 0, 1) \
411 SECTION_FUNCTION (objc_cls_refs_section, \
413 ".objc_cls_refs", 0, 1) \
416 objc_section_init () \
418 static int been_here = 0; \
420 if (been_here == 0) \
423 objc_class_section (); \
424 objc_meta_class_section (); \
425 objc_cat_cls_meth_section (); \
426 objc_cat_inst_meth_section (); \
427 objc_cls_meth_section (); \
428 objc_inst_meth_section (); \
429 objc_selector_refs_section (); \
430 objc_symbols_section (); \
431 objc_category_section (); \
432 objc_protocol_section (); \
433 objc_class_vars_section (); \
434 objc_instance_vars_section (); \
435 objc_module_info_section (); \
436 objc_string_object_section (); \
437 objc_class_names_section (); \
438 objc_meth_var_names_section (); \
439 objc_meth_var_types_section (); \
440 objc_cls_refs_section (); \
444 #undef READONLY_DATA_SECTION
445 #define READONLY_DATA_SECTION const_section
447 #undef SELECT_SECTION
448 #define SELECT_SECTION(exp,reloc,align) \
451 if (TREE_CODE (exp) == STRING_CST) \
453 if (flag_writable_strings) \
455 else if (TREE_STRING_LENGTH (exp) != \
456 strlen (TREE_STRING_POINTER (exp)) + 1) \
457 readonly_data_section (); \
459 cstring_section (); \
461 else if (TREE_CODE (exp) == INTEGER_CST \
462 || TREE_CODE (exp) == REAL_CST) \
464 tree size = TYPE_SIZE (TREE_TYPE (exp)); \
466 if (TREE_CODE (size) == INTEGER_CST && \
467 TREE_INT_CST_LOW (size) == 4 && \
468 TREE_INT_CST_HIGH (size) == 0) \
469 literal4_section (); \
470 else if (TREE_CODE (size) == INTEGER_CST && \
471 TREE_INT_CST_LOW (size) == 8 && \
472 TREE_INT_CST_HIGH (size) == 0) \
473 literal8_section (); \
475 readonly_data_section (); \
477 else if (TREE_CODE (exp) == CONSTRUCTOR \
479 && TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE \
480 && TYPE_NAME (TREE_TYPE (exp)) \
481 && TREE_CODE (TYPE_NAME (TREE_TYPE (exp))) == IDENTIFIER_NODE \
482 && IDENTIFIER_POINTER (TYPE_NAME (TREE_TYPE (exp)))) \
484 if (!strcmp (IDENTIFIER_POINTER (TYPE_NAME (TREE_TYPE (exp))), \
485 "NXConstantString")) \
486 objc_string_object_section (); \
487 else if ((TREE_READONLY (exp) || TREE_CONSTANT (exp)) \
488 && !TREE_SIDE_EFFECTS (exp)) \
489 readonly_data_section (); \
493 else if (TREE_CODE (exp) == VAR_DECL && \
495 TREE_CODE (DECL_NAME (exp)) == IDENTIFIER_NODE && \
496 IDENTIFIER_POINTER (DECL_NAME (exp)) && \
497 !strncmp (IDENTIFIER_POINTER (DECL_NAME (exp)), "_OBJC_", 6)) \
499 const char *name = IDENTIFIER_POINTER (DECL_NAME (exp)); \
501 if (!strncmp (name, "_OBJC_CLASS_METHODS_", 20)) \
502 objc_cls_meth_section (); \
503 else if (!strncmp (name, "_OBJC_INSTANCE_METHODS_", 23)) \
504 objc_inst_meth_section (); \
505 else if (!strncmp (name, "_OBJC_CATEGORY_CLASS_METHODS_", 20)) \
506 objc_cat_cls_meth_section (); \
507 else if (!strncmp (name, "_OBJC_CATEGORY_INSTANCE_METHODS_", 23)) \
508 objc_cat_inst_meth_section (); \
509 else if (!strncmp (name, "_OBJC_CLASS_VARIABLES_", 22)) \
510 objc_class_vars_section (); \
511 else if (!strncmp (name, "_OBJC_INSTANCE_VARIABLES_", 25)) \
512 objc_instance_vars_section (); \
513 else if (!strncmp (name, "_OBJC_CLASS_PROTOCOLS_", 22)) \
514 objc_cat_cls_meth_section (); \
515 else if (!strncmp (name, "_OBJC_CLASS_NAME_", 17)) \
516 objc_class_names_section (); \
517 else if (!strncmp (name, "_OBJC_METH_VAR_NAME_", 20)) \
518 objc_meth_var_names_section (); \
519 else if (!strncmp (name, "_OBJC_METH_VAR_TYPE_", 20)) \
520 objc_meth_var_types_section (); \
521 else if (!strncmp (name, "_OBJC_CLASS_REFERENCES", 22)) \
522 objc_cls_refs_section (); \
523 else if (!strncmp (name, "_OBJC_CLASS_", 12)) \
524 objc_class_section (); \
525 else if (!strncmp (name, "_OBJC_METACLASS_", 16)) \
526 objc_meta_class_section (); \
527 else if (!strncmp (name, "_OBJC_CATEGORY_", 15)) \
528 objc_category_section (); \
529 else if (!strncmp (name, "_OBJC_SELECTOR_REFERENCES", 25)) \
530 objc_selector_refs_section (); \
531 else if (!strncmp (name, "_OBJC_SYMBOLS", 13)) \
532 objc_symbols_section (); \
533 else if (!strncmp (name, "_OBJC_MODULES", 13)) \
534 objc_module_info_section (); \
535 else if (!strncmp (name, "_OBJC_PROTOCOL_INSTANCE_METHODS_", 32)) \
536 objc_cat_inst_meth_section (); \
537 else if (!strncmp (name, "_OBJC_PROTOCOL_CLASS_METHODS_", 29)) \
538 objc_cat_cls_meth_section (); \
539 else if (!strncmp (name, "_OBJC_PROTOCOL_REFS_", 20)) \
540 objc_cat_cls_meth_section (); \
541 else if (!strncmp (name, "_OBJC_PROTOCOL_", 15)) \
542 objc_protocol_section (); \
543 else if ((TREE_READONLY (exp) || TREE_CONSTANT (exp)) \
544 && !TREE_SIDE_EFFECTS (exp)) \
545 readonly_data_section (); \
549 else if (TREE_CODE (exp) == VAR_DECL) \
551 if ((flag_pic && reloc) \
552 || !TREE_READONLY (exp) || TREE_SIDE_EFFECTS (exp) \
553 || !DECL_INITIAL (exp) \
554 || (DECL_INITIAL (exp) != error_mark_node \
555 && !TREE_CONSTANT (DECL_INITIAL (exp)))) \
558 readonly_data_section (); \
561 readonly_data_section (); \
565 #undef SELECT_RTX_SECTION
566 #define SELECT_RTX_SECTION(mode, rtx, align) \
569 if (GET_MODE_SIZE(mode) == 8) \
570 literal8_section(); \
571 else if (GET_MODE_SIZE(mode) == 4) \
572 literal4_section(); \
578 #ifdef ASM_COMMENT_START
579 # undef ASM_COMMENT_START
582 #define ASM_COMMENT_START ";#"