1 /* nextstep.h -- operating system specific defines to be used when
2 targeting GCC for NeXTSTEP.
3 Copyright (C) 1989, 1990, 1991, 1992, 1993 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, 675 Mass Ave, Cambridge, MA 02139, USA. */
21 /* Use new NeXT include file search path.
22 In a cross compiler with NeXT as target, don't expect
23 the host to use Next's directory scheme. */
26 #undef INCLUDE_DEFAULTS
27 #define INCLUDE_DEFAULTS \
29 { GPLUSPLUS_INCLUDE_DIR, 1}, \
30 { GCC_INCLUDE_DIR, 0}, \
31 { LOCAL_INCLUDE_DIR, 0}, \
32 { "/NextDeveloper/Headers", 0}, \
33 { "/NextDeveloper/Headers/ansi", 0}, \
34 { "/NextDeveloper/Headers/bsd", 0}, \
35 { "/LocalDeveloper/Headers", 0}, \
36 { "/LocalDeveloper/Headers/ansi", 0}, \
37 { "/LocalDeveloper/Headers/bsd", 0}, \
38 { "/NextDeveloper/2.0CompatibleHeaders", 0}, \
39 { STANDARD_INCLUDE_DIR, 0}, \
40 { "/usr/include/bsd", 0} \
43 #endif /* CROSS_COMPILE */
45 #undef EXTRA_FORMAT_FUNCTIONS
46 #define EXTRA_FORMAT_FUNCTIONS \
47 "NXPrintf", FALSE, 2, FALSE, \
48 "NXScanf", TRUE, 2, FALSE, \
49 "NXVPrintf", FALSE, 2, TRUE, \
50 "NXVScanf", TRUE, 2, TRUE, \
51 "DPSPrintf", FALSE, 2, FALSE, \
52 "bsd_sprintf", FALSE, 2, FALSE, \
53 "bsd_vsprintf", FALSE, 2, TRUE,
55 /* Make -fnext-runtime the default. */
57 #define NEXT_OBJC_RUNTIME
63 /* Enable recent gcc to compile under the old gcc in Next release 1.0. */
65 #define __inline inline
67 /* wchar_t is unsigned short */
70 #define WCHAR_TYPE "short unsigned int"
71 #undef WCHAR_TYPE_SIZE
72 #define WCHAR_TYPE_SIZE (BITS_PER_WORD / 2)
74 /* Don't default to pcc-struct-return, because gcc is the only compiler, and
75 we want to retain compatibility with older gcc versions. */
77 #undef DEFAULT_PCC_STRUCT_RETURN
78 #define DEFAULT_PCC_STRUCT_RETURN 0
80 /* These compiler options take n arguments. */
82 #undef WORD_SWITCH_TAKES_ARG
83 #define WORD_SWITCH_TAKES_ARG(STR) \
84 (DEFAULT_WORD_SWITCH_TAKES_ARG (STR) ? 1 : \
85 !strcmp (STR, "segalign") ? 1 : \
86 !strcmp (STR, "seg1addr") ? 1 : \
87 !strcmp (STR, "segaddr") ? 2 : \
88 !strcmp (STR, "sectobjectsymbols") ? 2 : \
89 !strcmp (STR, "segprot") ? 3 : \
90 !strcmp (STR, "sectcreate") ? 3 : \
91 !strcmp (STR, "sectalign") ? 3 : \
92 !strcmp (STR, "segcreate") ? 3 : \
93 !strcmp (STR, "sectorder") ? 3 : \
94 !strcmp (STR, "siff-mask") ? 1 : \
95 !strcmp (STR, "siff-filter") ? 1 : \
96 !strcmp (STR, "siff-warning") ? 1 : \
97 !strcmp (STR, "arch") ? 1 : \
98 !strcmp (STR, "pagezero_size") ? 1 : \
102 #define WORD_SWITCH(STR) \
103 (WORD_SWITCH_TAKES_ARG (STR) \
104 || !strcmp (STR, "bsd") \
105 || !strcmp (STR, "object") \
106 || !strcmp (STR, "ObjC") \
107 || !strcmp (STR, "all_load"))
109 /* Machine dependent ccp options. */
112 #define CPP_SPEC "%{!traditional: -D__STDC__} \
113 %{posixstrict:-D_POSIX_SOURCE} \
114 %{!posixstrict:%{bsd:-D__STRICT_BSD__} \
115 %{posix:-D_POSIX_SOURCE} \
116 %{!ansi:-D_NEXT_SOURCE}} \
117 %{MD:-MD %M} %{MMD:-MMD %M}"
119 /* Machine dependent ld options. */
122 #define LINK_SPEC "%{Z} %{M} \
123 %{execute*} %{preload*} %{fvmlib*} \
124 %{segalign*} %{seg1addr*} %{segaddr*} %{segprot*} \
126 %{seglinkedit*} %{noseglinkedit*} \
127 %{sectcreate*} %{sectalign*} %{sectobjectsymbols}\
128 %{segcreate*} %{Mach*} %{whyload} %{w} \
129 %{sectorder*} %{whatsloaded} %{ObjC} %{all_load} %{object}"
131 /* Machine dependent libraries. */
134 #define LIB_SPEC "%{!posix*:-lsys_s} %{posix*:-lposix}"
136 /* We specify crt0.o as -lcrt0.o so that ld will search the library path. */
138 #undef STARTFILE_SPEC
139 #define STARTFILE_SPEC \
140 "%{!posix*:%{pg:-lgcrt0.o}%{!pg: \
141 %{p:%e-p profiling is no longer supported. Use -pg instead.} \
143 %{posix*:%{pg:-lgposixcrt0.o}%{!pg: \
144 %{p:%e-p profiling is no longer supported. Use -pg instead.} \
145 %{!p:-lposixcrt0.o}}}"
149 #undef DOLLARS_IN_IDENTIFIERS
150 #define DOLLARS_IN_IDENTIFIERS 2
152 /* Allow #sscs (but don't do anything). */
154 #define SCCS_DIRECTIVE
156 /* We use Dbx symbol format. */
158 #undef SDB_DEBUGGING_INFO
159 #undef XCOFF_DEBUGGING_INFO
160 #define DBX_DEBUGGING_INFO
162 /* This saves a fair amount of space. */
164 #undef DBX_CONTIN_LENGTH
165 #define DBX_CONTIN_LENGTH 0
167 /* These screw up NeXT's gdb at the moment, so don't use them. */
169 #undef DBX_OUTPUT_MAIN_SOURCE_DIRECTORY
170 #define DBX_OUTPUT_MAIN_SOURCE_DIRECTORY(FILE, FILENAME)
172 /* These come from bsd386.h, but are specific to sequent, so make sure
173 they don't bite us. */
176 #undef DBX_CONTIN_LENGTH
178 /* gdb needs a null N_SO at the end of each file for scattered loading. */
180 #undef DBX_OUTPUT_MAIN_SOURCE_FILE_END
181 #define DBX_OUTPUT_MAIN_SOURCE_FILE_END(FILE, FILENAME) \
183 "\t.text\n\t.stabs \"%s\",%d,0,0,Letext\nLetext:\n", \
186 /* Don't use .gcc_compiled symbols to communicate with GDB;
187 They interfere with numerically sorted symbol lists. */
189 #undef ASM_IDENTIFY_GCC
190 #define ASM_IDENTIFY_GCC(asm_out_file)
191 #undef INIT_SECTION_ASM_OP
192 #define INIT_SECTION_ASM_OP
195 #undef ASM_OUTPUT_CONSTRUCTOR
196 #define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME) \
197 do { constructor_section (); \
198 ASM_OUTPUT_ALIGN (FILE, 1); \
199 fprintf (FILE, "\t.long "); \
200 assemble_name (FILE, NAME); \
201 fprintf (FILE, "\n"); \
202 fprintf (FILE, ".reference .constructors_used\n"); \
205 #undef ASM_OUTPUT_DESTRUCTOR
206 #define ASM_OUTPUT_DESTRUCTOR(FILE,NAME) \
207 do { destructor_section (); \
208 ASM_OUTPUT_ALIGN (FILE, 1); \
209 fprintf (FILE, "\t.long "); \
210 assemble_name (FILE, NAME); \
211 fprintf (FILE, "\n"); \
212 fprintf (FILE, ".reference .destructors_used\n"); \
215 /* Don't output a .file directive. That is only used by the assembler for
217 #undef ASM_FILE_START
218 #define ASM_FILE_START(FILE)
221 #define ASM_FILE_END(FILE) \
223 extern char *language_string; \
224 if (strcmp (language_string, "GNU C++") == 0) \
226 constructor_section (); \
227 destructor_section (); \
228 ASM_OUTPUT_ALIGN (FILE, 1); \
232 /* How to parse #pragma's */
235 #define HANDLE_PRAGMA(finput) handle_pragma (finput, &get_directive_line)
237 /* Give methods pretty symbol names on NeXT. */
239 #undef OBJC_GEN_METHOD_LABEL
240 #define OBJC_GEN_METHOD_LABEL(BUF,IS_INST,CLASS_NAME,CAT_NAME,SEL_NAME,NUM) \
242 sprintf (BUF, "%c[%s(%s) %s]", (IS_INST) ? '-' : '+', \
243 (CLASS_NAME), (CAT_NAME), (SEL_NAME)); \
245 sprintf (BUF, "%c[%s %s]", (IS_INST) ? '-' : '+', \
246 (CLASS_NAME), (SEL_NAME)); \
249 /* Wrap new method names in quotes so the assembler doesn't gag.
250 Make Objective-C internal symbols local. */
252 #undef ASM_OUTPUT_LABELREF
253 #define ASM_OUTPUT_LABELREF(FILE,NAME) \
254 do { if (NAME[0] == '+' || NAME[0] == '-') fprintf (FILE, "\"%s\"", NAME); \
255 else if (!strncmp (NAME, "_OBJC_", 6)) fprintf (FILE, "L%s", NAME); \
256 else if (!strncmp (NAME, ".objc_class_name_", 17)) \
257 fprintf (FILE, "%s", NAME); \
258 else fprintf (FILE, "_%s", NAME); } while (0)
261 #define ALIGN_ASM_OP ".align"
263 #undef ASM_OUTPUT_ALIGN
264 #define ASM_OUTPUT_ALIGN(FILE,LOG) \
266 fprintf (FILE, "\t%s %d\n", ALIGN_ASM_OP, (LOG))
268 /* Ensure correct alignment of bss data. */
270 #undef ASM_OUTPUT_ALIGNED_LOCAL
271 #define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \
272 ( fputs (".lcomm ", (FILE)), \
273 assemble_name ((FILE), (NAME)), \
274 fprintf ((FILE), ",%u,%u\n", (SIZE), floor_log2 ((ALIGN) / BITS_PER_UNIT)))
276 /* Output #ident as a .ident. */
278 #undef ASM_OUTPUT_IDENT
279 #define ASM_OUTPUT_IDENT(FILE, NAME) fprintf (FILE, "\t.ident \"%s\"\n", NAME);
281 /* The maximum alignment which the object file format can support.
282 For NeXT's Mach-O format, this is 2^15. */
284 #undef MAX_OFILE_ALIGNMENT
285 #define MAX_OFILE_ALIGNMENT 0x8000
287 /* Create new Mach-O sections. */
289 #undef SECTION_FUNCTION
290 #define SECTION_FUNCTION(FUNCTION, SECTION, DIRECTIVE, WAS_TEXT, OBJC) \
294 extern void text_section (); \
295 extern void objc_section_init (); \
296 extern int flag_no_mach_text_sections; \
298 if (WAS_TEXT && flag_no_mach_text_sections) \
300 else if (in_section != SECTION) \
303 objc_section_init (); \
304 fprintf (asm_out_file, "%s\n", DIRECTIVE); \
305 in_section = SECTION; \
309 #undef EXTRA_SECTIONS
310 #define EXTRA_SECTIONS \
311 in_const, in_cstring, in_literal4, in_literal8, \
312 in_constructor, in_destructor, \
313 in_objc_class, in_objc_meta_class, in_objc_category, \
314 in_objc_class_vars, in_objc_instance_vars, \
315 in_objc_cls_meth, in_objc_inst_meth, \
316 in_objc_cat_cls_meth, in_objc_cat_inst_meth, \
317 in_objc_selector_refs, \
318 in_objc_symbols, in_objc_module_info, \
319 in_objc_protocol, in_objc_string_object, \
320 in_objc_class_names, in_objc_meth_var_names, \
321 in_objc_meth_var_types, in_objc_cls_refs
323 #undef EXTRA_SECTION_FUNCTIONS
324 #define EXTRA_SECTION_FUNCTIONS \
325 SECTION_FUNCTION (const_section, \
328 SECTION_FUNCTION (cstring_section, \
331 SECTION_FUNCTION (literal4_section, \
334 SECTION_FUNCTION (literal8_section, \
337 SECTION_FUNCTION (constructor_section, \
339 ".constructor", 0, 0) \
340 SECTION_FUNCTION (destructor_section, \
342 ".destructor", 0, 0) \
343 SECTION_FUNCTION (objc_class_section, \
345 ".objc_class", 0, 1) \
346 SECTION_FUNCTION (objc_meta_class_section, \
347 in_objc_meta_class, \
348 ".objc_meta_class", 0, 1) \
349 SECTION_FUNCTION (objc_category_section, \
351 ".objc_category", 0, 1) \
352 SECTION_FUNCTION (objc_class_vars_section, \
353 in_objc_class_vars, \
354 ".objc_class_vars", 0, 1) \
355 SECTION_FUNCTION (objc_instance_vars_section, \
356 in_objc_instance_vars, \
357 ".objc_instance_vars", 0, 1) \
358 SECTION_FUNCTION (objc_cls_meth_section, \
360 ".objc_cls_meth", 0, 1) \
361 SECTION_FUNCTION (objc_inst_meth_section, \
363 ".objc_inst_meth", 0, 1) \
364 SECTION_FUNCTION (objc_cat_cls_meth_section, \
365 in_objc_cat_cls_meth, \
366 ".objc_cat_cls_meth", 0, 1) \
367 SECTION_FUNCTION (objc_cat_inst_meth_section, \
368 in_objc_cat_inst_meth, \
369 ".objc_cat_inst_meth", 0, 1) \
370 SECTION_FUNCTION (objc_selector_refs_section, \
371 in_objc_selector_refs, \
372 ".objc_message_refs", 0, 1) \
373 SECTION_FUNCTION (objc_symbols_section, \
375 ".objc_symbols", 0, 1) \
376 SECTION_FUNCTION (objc_module_info_section, \
377 in_objc_module_info, \
378 ".objc_module_info", 0, 1) \
379 SECTION_FUNCTION (objc_protocol_section, \
381 ".objc_protocol", 0, 1) \
382 SECTION_FUNCTION (objc_string_object_section, \
383 in_objc_string_object, \
384 ".objc_string_object", 0, 1) \
385 SECTION_FUNCTION (objc_class_names_section, \
386 in_objc_class_names, \
387 ".objc_class_names", 0, 1) \
388 SECTION_FUNCTION (objc_meth_var_names_section, \
389 in_objc_meth_var_names, \
390 ".objc_meth_var_names", 0, 1) \
391 SECTION_FUNCTION (objc_meth_var_types_section, \
392 in_objc_meth_var_types, \
393 ".objc_meth_var_types", 0, 1) \
394 SECTION_FUNCTION (objc_cls_refs_section, \
396 ".objc_cls_refs", 0, 1) \
399 objc_section_init () \
401 static int been_here = 0; \
403 if (been_here == 0) \
406 objc_class_section (); \
407 objc_meta_class_section (); \
408 objc_cat_cls_meth_section (); \
409 objc_cat_inst_meth_section (); \
410 objc_cls_meth_section (); \
411 objc_inst_meth_section (); \
412 objc_selector_refs_section (); \
413 objc_symbols_section (); \
414 objc_category_section (); \
415 objc_protocol_section (); \
416 objc_class_vars_section (); \
417 objc_instance_vars_section (); \
418 objc_module_info_section (); \
419 objc_string_object_section (); \
420 objc_class_names_section (); \
421 objc_meth_var_names_section (); \
422 objc_meth_var_types_section (); \
423 objc_cls_refs_section (); \
427 #undef READONLY_DATA_SECTION
428 #define READONLY_DATA_SECTION const_section
430 #undef SELECT_SECTION
431 #define SELECT_SECTION(exp,reloc) \
434 if (TREE_CODE (exp) == STRING_CST) \
436 if (flag_writable_strings) \
438 else if (TREE_STRING_LENGTH (exp) != \
439 strlen (TREE_STRING_POINTER (exp)) + 1) \
440 readonly_data_section (); \
442 cstring_section (); \
444 else if (TREE_CODE (exp) == INTEGER_CST \
445 || TREE_CODE (exp) == REAL_CST) \
447 tree size = TYPE_SIZE (TREE_TYPE (exp)); \
449 if (TREE_CODE (size) == INTEGER_CST && \
450 TREE_INT_CST_LOW (size) == 4 && \
451 TREE_INT_CST_HIGH (size) == 0) \
452 literal4_section (); \
453 else if (TREE_CODE (size) == INTEGER_CST && \
454 TREE_INT_CST_LOW (size) == 8 && \
455 TREE_INT_CST_HIGH (size) == 0) \
456 literal8_section (); \
458 readonly_data_section (); \
460 else if (TREE_CODE (exp) == CONSTRUCTOR \
462 && TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE \
463 && TYPE_NAME (TREE_TYPE (exp)) \
464 && TREE_CODE (TYPE_NAME (TREE_TYPE (exp))) == IDENTIFIER_NODE \
465 && IDENTIFIER_POINTER (TYPE_NAME (TREE_TYPE (exp)))) \
467 if (!strcmp (IDENTIFIER_POINTER (TYPE_NAME (TREE_TYPE (exp))), \
468 "NXConstantString")) \
469 objc_string_object_section (); \
470 else if ((TREE_READONLY (exp) || TREE_CONSTANT (exp)) \
471 && !TREE_SIDE_EFFECTS (exp)) \
472 readonly_data_section (); \
476 else if (TREE_CODE (exp) == VAR_DECL && \
478 TREE_CODE (DECL_NAME (exp)) == IDENTIFIER_NODE && \
479 IDENTIFIER_POINTER (DECL_NAME (exp)) && \
480 !strncmp (IDENTIFIER_POINTER (DECL_NAME (exp)), "_OBJC_", 6)) \
482 const char *name = IDENTIFIER_POINTER (DECL_NAME (exp)); \
484 if (!strncmp (name, "_OBJC_CLASS_METHODS_", 20)) \
485 objc_cls_meth_section (); \
486 else if (!strncmp (name, "_OBJC_INSTANCE_METHODS_", 23)) \
487 objc_inst_meth_section (); \
488 else if (!strncmp (name, "_OBJC_CATEGORY_CLASS_METHODS_", 20)) \
489 objc_cat_cls_meth_section (); \
490 else if (!strncmp (name, "_OBJC_CATEGORY_INSTANCE_METHODS_", 23)) \
491 objc_cat_inst_meth_section (); \
492 else if (!strncmp (name, "_OBJC_CLASS_VARIABLES_", 22)) \
493 objc_class_vars_section (); \
494 else if (!strncmp (name, "_OBJC_INSTANCE_VARIABLES_", 25)) \
495 objc_instance_vars_section (); \
496 else if (!strncmp (name, "_OBJC_CLASS_PROTOCOLS_", 22)) \
497 objc_cat_cls_meth_section (); \
498 else if (!strncmp (name, "_OBJC_CLASS_NAME_", 17)) \
499 objc_class_names_section (); \
500 else if (!strncmp (name, "_OBJC_METH_VAR_NAME_", 20)) \
501 objc_meth_var_names_section (); \
502 else if (!strncmp (name, "_OBJC_METH_VAR_TYPE_", 20)) \
503 objc_meth_var_types_section (); \
504 else if (!strncmp (name, "_OBJC_CLASS_REFERENCES", 22)) \
505 objc_cls_refs_section (); \
506 else if (!strncmp (name, "_OBJC_CLASS_", 12)) \
507 objc_class_section (); \
508 else if (!strncmp (name, "_OBJC_METACLASS_", 16)) \
509 objc_meta_class_section (); \
510 else if (!strncmp (name, "_OBJC_CATEGORY_", 15)) \
511 objc_category_section (); \
512 else if (!strncmp (name, "_OBJC_SELECTOR_REFERENCES", 25)) \
513 objc_selector_refs_section (); \
514 else if (!strncmp (name, "_OBJC_SYMBOLS", 13)) \
515 objc_symbols_section (); \
516 else if (!strncmp (name, "_OBJC_MODULES", 13)) \
517 objc_module_info_section (); \
518 else if (!strncmp (name, "_OBJC_PROTOCOL_INSTANCE_METHODS_", 32)) \
519 objc_cat_inst_meth_section (); \
520 else if (!strncmp (name, "_OBJC_PROTOCOL_CLASS_METHODS_", 29)) \
521 objc_cat_cls_meth_section (); \
522 else if (!strncmp (name, "_OBJC_PROTOCOL_REFS_", 20)) \
523 objc_cat_cls_meth_section (); \
524 else if (!strncmp (name, "_OBJC_PROTOCOL_", 15)) \
525 objc_protocol_section (); \
526 else if ((TREE_READONLY (exp) || TREE_CONSTANT (exp)) \
527 && !TREE_SIDE_EFFECTS (exp)) \
528 readonly_data_section (); \
532 else if ((TREE_READONLY (exp) || TREE_CONSTANT (exp)) \
533 && !TREE_SIDE_EFFECTS (exp)) \
534 readonly_data_section (); \
540 #undef SELECT_RTX_SECTION
541 #define SELECT_RTX_SECTION(mode, rtx) \
544 if (GET_MODE_SIZE(mode) == 8) \
545 literal8_section(); \
546 else if (GET_MODE_SIZE(mode) == 4) \
547 literal4_section(); \