|
|
1.1 root 1: /* next.h: definitions for NeXT.
2:
3: This file is part of GNU CC.
4:
5: GNU CC is free software; you can redistribute it and/or modify
6: it under the terms of the GNU General Public License as published by
7: the Free Software Foundation; either version 2, or (at your option)
8: any later version.
9:
10: GNU CC is distributed in the hope that it will be useful,
11: but WITHOUT ANY WARRANTY; without even the implied warranty of
12: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13: GNU General Public License for more details.
14:
15: You should have received a copy of the GNU General Public License
16: along with GNU CC; see the file COPYING. If not, write to
17: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
18:
19: #include "m68k.h"
20:
1.1.1.3 ! root 21: /* Use new NeXT include file search path. */
! 22:
! 23: #ifndef CROSS_COMPILE /* In a cross compiler with NeXT as target, don't expect
! 24: the host to use Next's directory scheme. */
! 25: #define INCLUDE_DEFAULTS \
! 26: { \
! 27: { GPLUSPLUS_INCLUDE_DIR, 1}, \
! 28: { GCC_INCLUDE_DIR, 0}, \
! 29: { LOCAL_INCLUDE_DIR, 0}, \
! 30: { "/NextDeveloper/Headers", 0}, \
! 31: { "/NextDeveloper/Headers/ansi", 0}, \
! 32: { "/NextDeveloper/Headers/bsd", 0}, \
! 33: { "/LocalDeveloper/Headers", 0}, \
! 34: { "/LocalDeveloper/Headers/ansi", 0}, \
! 35: { "/LocalDeveloper/Headers/bsd", 0}, \
! 36: { "/NextDeveloper/2.0CompatibleHeaders", 0}, \
! 37: { STANDARD_INCLUDE_DIR, 0}, \
! 38: { 0, 0} \
! 39: }
! 40: #endif /* CROSS_COMPILE */
! 41:
1.1 root 42: #define EXTRA_FORMAT_FUNCTIONS \
43: "NXPrintf", FALSE, 2, FALSE, \
44: "NXScanf", TRUE, 2, FALSE, \
45: "NXVPrintf", FALSE, 2, TRUE, \
46: "NXVScanf", TRUE, 2, TRUE, \
47: "DPSPrintf", FALSE, 2, FALSE, \
48: "bsd_sprintf", FALSE, 2, FALSE, \
49: "bsd_vsprintf", FALSE, 2, TRUE,
50:
51: /* Use NeXT's special calling convention for sending an Objc message. */
52: #define NEXT_OBJC_RUNTIME
53:
54: /* We have atexit. */
55: #define HAVE_ATEXIT
56:
57: /* Enable recent gcc to compile under the old gcc in Next release 1.0. */
58: #define __inline inline
59:
60: /* See m68k.h. 0407 means 68040 (or 68030 or 68020, with 68881/2). */
61:
62: #define TARGET_DEFAULT 0407
63:
64: /* wchar_t is unsigned short */
65:
66: #undef WCHAR_TYPE
67: #undef WCHAR_TYPE_SIZE
68: #define WCHAR_TYPE "short unsigned int"
69: #define WCHAR_TYPE_SIZE (BITS_PER_WORD / 2)
70:
71: /* Give methods pretty symbol names on NeXT. */
72:
73: #define OBJC_GEN_METHOD_LABEL(BUF,IS_INST,CLASS_NAME,CAT_NAME,SEL_NAME) \
74: do { if (CAT_NAME) \
75: sprintf (BUF, "%c[%s(%s) %s]", (IS_INST) ? '-' : '+', \
76: (CLASS_NAME), (CAT_NAME), (SEL_NAME)); \
77: else \
78: sprintf (BUF, "%c[%s %s]", (IS_INST) ? '-' : '+', \
79: (CLASS_NAME), (SEL_NAME)); \
80: } while (0)
81:
82: /* Wrap new method names in quotes so the assembler doesn't gag.
1.1.1.2 root 83: Make Objective-C internal symbols local. */
1.1 root 84:
85: #undef ASM_OUTPUT_LABELREF
86: #define ASM_OUTPUT_LABELREF(FILE,NAME) \
87: do { if (NAME[0] == '+' || NAME[0] == '-') fprintf (FILE, "\"%s\"", NAME); \
88: else if (!strncmp (NAME, "_OBJC_", 6)) fprintf (FILE, "L%s", NAME); \
1.1.1.2 root 89: else if (!strncmp (NAME, ".objc_class_name_", 17)) \
90: fprintf (FILE, "%s", NAME); \
1.1 root 91: else fprintf (FILE, "_%s", NAME); } while (0)
92:
93: #undef STACK_BOUNDARY
94: /* Boundary (in *bits*) on which stack pointer should be aligned. */
95: #define STACK_BOUNDARY 32
96:
97: /* These compiler options take n arguments. */
98:
99: #define WORD_SWITCH_TAKES_ARG(STR) \
100: (!strcmp (STR, "Ttext") ? 1 : \
101: !strcmp (STR, "Tdata") ? 1 : \
1.1.1.3 ! root 102: !strcmp (STR, "Tbss") ? 1 : \
1.1 root 103: !strcmp (STR, "include") ? 1 : \
104: !strcmp (STR, "imacros") ? 1 : \
105: !strcmp (STR, "segalign") ? 1 : \
106: !strcmp (STR, "seg1addr") ? 1 : \
107: !strcmp (STR, "segaddr") ? 2 : \
108: !strcmp (STR, "sectobjectsymbols") ? 2 : \
109: !strcmp (STR, "segprot") ? 3 : \
110: !strcmp (STR, "sectcreate") ? 3 : \
111: !strcmp (STR, "sectalign") ? 3 : \
112: !strcmp (STR, "segcreate") ? 3 : \
113: !strcmp (STR, "sectorder") ? 3 : \
1.1.1.2 root 114: !strcmp (STR, "aux-info") ? 1 : \
1.1 root 115: 0)
116:
117: /* Names to predefine in the preprocessor for this target machine. */
118:
1.1.1.3 ! root 119: #define CPP_PREDEFINES "-Dmc68000 -Dm68k -DNeXT -Dunix -D__MACH__ -D__ARCHITECTURE__=\"m68k\""
1.1 root 120:
121: /* Machine dependent ccp options. */
122:
123: /* This option used to be called -bsd, but that conflicts with the
124: general -b option. */
125: #define CPP_SPEC "%{strict-bsd:-D__STRICT_BSD__}"
126:
127: /* Machine dependent ld options. */
128:
129: #define LINK_SPEC "%{Z} %{M} \
130: %{execute*} %{object*} %{preload*} %{fvmlib*} \
131: %{segalign*} %{seg1addr*} %{segaddr*} %{segprot*} \
132: %{seglinkedit*} %{noseglinkedit*} \
133: %{sectcreate*} %{sectalign*} %{sectobjectsymbols}\
134: %{segcreate*} %{Mach*} %{whyload} %{w} \
135: %{sectorder*} %{whatsloaded}"
136:
137: /* Machine dependent libraries. */
138:
139: #define LIB_SPEC "%{!p:%{!pg:-lsys_s}} %{pg:-lsys_p}"
140:
141: /* We specify crt0.o as -lcrt0.o so that ld will search the library path. */
142: #define STARTFILE_SPEC \
143: "%{pg:-lgcrt0.o}%{!pg: \
144: %{p:%e-p profiling is no longer supported. Use -pg instead.} \
145: %{!p:-lcrt0.o}}"
146:
147: /* Every structure or union's size must be a multiple of 2 bytes.
148: (Why isn't this in m68k.h?) */
149:
150: #define STRUCTURE_SIZE_BOUNDARY 16
151:
152: /* Why not? */
153:
154: #define DOLLARS_IN_IDENTIFIERS 2
155:
156: /* Allow #sscs (but don't do anything). */
157:
158: #define SCCS_DIRECTIVE
159:
160: /* We use Dbx symbol format. */
161:
162: #define DBX_DEBUGGING_INFO
163:
164: /* This saves a fair amount of space. */
165:
166: #define DBX_CONTIN_LENGTH 0
167:
168: /* These screw up NeXT's gdb at the moment, so don't use them. */
169:
170: #define DBX_OUTPUT_MAIN_SOURCE_DIRECTORY(FILE, FILENAME)
171:
172: /* gdb needs a null N_SO at the end of each file for scattered loading. */
173:
174: #define DBX_OUTPUT_MAIN_SOURCE_FILE_END(FILE, FILENAME) \
175: fprintf (FILE, \
176: "\t.text\n\t.stabs \"%s\",%d,0,0,Letext\nLetext:\n", \
177: "" , N_SO)
178:
179: /* Don't use .gcc_compiled symbols to communicate with GDB;
180: They interfere with numerically sorted symbol lists. */
181:
182: #define ASM_IDENTIFY_GCC(asm_out_file)
183:
184: /* This is how to output an assembler line defining a `double' constant. */
185:
186: #undef ASM_OUTPUT_DOUBLE
187: #define ASM_OUTPUT_DOUBLE(FILE,VALUE) \
188: (REAL_VALUE_ISINF ((VALUE)) \
189: ? fprintf (FILE, "\t.double 0r%s99e999\n", ((VALUE) > 0 ? "" : "-")) \
190: : fprintf (FILE, "\t.double 0r%.20e\n", (VALUE)))
191:
192: /* This is how to output an assembler line defining a `float' constant. */
193:
194: #undef ASM_OUTPUT_FLOAT
195: #define ASM_OUTPUT_FLOAT(FILE,VALUE) \
196: (REAL_VALUE_ISINF ((VALUE)) \
197: ? fprintf (FILE, "\t.single 0r%s99e999\n", ((VALUE) > 0 ? "" : "-")) \
198: : fprintf (FILE, "\t.single 0r%.20e\n", (VALUE)))
199:
200: #undef ASM_OUTPUT_FLOAT_OPERAND
201: #define ASM_OUTPUT_FLOAT_OPERAND(FILE,VALUE) \
202: (REAL_VALUE_ISINF ((VALUE)) \
203: ? fprintf (FILE, "#0r%s99e999", ((VALUE) > 0 ? "" : "-")) \
204: : fprintf (FILE, "#0r%.9g", (VALUE)))
205:
206: #undef ASM_OUTPUT_DOUBLE_OPERAND
207: #define ASM_OUTPUT_DOUBLE_OPERAND(FILE,VALUE) \
208: (REAL_VALUE_ISINF ((VALUE)) \
209: ? fprintf (FILE, "#0r%s99e999", ((VALUE) > 0 ? "" : "-")) \
210: : fprintf (FILE, "#0r%.20g", (VALUE)))
211:
1.1.1.2 root 212: #if 0 /* This is for system verson 3.0, which isn't out yet. */
1.1 root 213: #define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME) \
214: do { constructor_section (); \
215: ASM_OUTPUT_ALIGN (FILE, 1); \
216: fprintf (FILE, "\t.long "); \
217: assemble_name (FILE, NAME); \
218: fprintf (FILE, "\n"); } while (0)
219:
220: #define ASM_OUTPUT_DESTRUCTOR(FILE,NAME) \
221: do { destructor_section (); \
222: ASM_OUTPUT_ALIGN (FILE, 1); \
223: fprintf (FILE, "\t.long "); \
224: assemble_name (FILE, NAME); \
225: fprintf (FILE, "\n"); } while (0)
1.1.1.2 root 226: #endif
1.1 root 227:
228: /* How to parse #pragma's */
229:
230: #define HANDLE_PRAGMA(finput) handle_pragma (finput)
231:
232: /* Create new Mach-O sections. */
233:
234: #define SECTION_FUNCTION(FUNCTION, SECTION, DIRECTIVE, WAS_TEXT) \
235: void \
236: FUNCTION () \
237: { \
238: extern void text_section (); \
239: extern int flag_no_mach_text_sections; \
240: \
241: if (WAS_TEXT && flag_no_mach_text_sections) \
242: text_section (); \
243: else if (in_section != SECTION) \
244: { \
245: fprintf (asm_out_file, "%s\n", DIRECTIVE); \
246: in_section = SECTION; \
247: } \
248: } \
249:
250: #define EXTRA_SECTIONS \
251: in_const, in_cstring, in_literal4, in_literal8, \
252: in_constructor, in_destructor, \
253: in_objc_class, in_objc_meta_class, in_objc_category, \
254: in_objc_class_vars, in_objc_instance_vars, \
255: in_objc_cls_meth, in_objc_inst_meth, \
256: in_objc_cat_cls_meth, in_objc_cat_inst_meth, \
257: in_objc_selector_strs, in_objc_selector_refs, \
258: in_objc_symbols, in_objc_module_info
259:
260: #define EXTRA_SECTION_FUNCTIONS \
261: SECTION_FUNCTION (const_section, \
262: in_const, \
263: ".const", 1) \
264: SECTION_FUNCTION (cstring_section, \
265: in_cstring, \
266: ".cstring", 1) \
267: SECTION_FUNCTION (literal4_section, \
268: in_literal4, \
269: ".literal4", 1) \
270: SECTION_FUNCTION (literal8_section, \
271: in_literal8, \
272: ".literal8", 1) \
273: SECTION_FUNCTION (constructor_section, \
274: in_constructor, \
275: ".constructor", 0) \
276: SECTION_FUNCTION (destructor_section, \
277: in_destructor, \
278: ".destructor", 0) \
279: SECTION_FUNCTION (objc_class_section, \
280: in_objc_class, \
281: ".objc_class", 0) \
282: SECTION_FUNCTION (objc_meta_class_section, \
283: in_objc_meta_class, \
284: ".objc_meta_class", 0) \
285: SECTION_FUNCTION (objc_category_section, \
286: in_objc_category, \
287: ".objc_category", 0) \
288: SECTION_FUNCTION (objc_class_vars_section, \
289: in_objc_class_vars, \
290: ".objc_class_vars", 0) \
291: SECTION_FUNCTION (objc_instance_vars_section, \
292: in_objc_instance_vars, \
293: ".objc_instance_vars", 0) \
294: SECTION_FUNCTION (objc_cls_meth_section, \
295: in_objc_cls_meth, \
296: ".objc_cls_meth", 0) \
297: SECTION_FUNCTION (objc_inst_meth_section, \
298: in_objc_inst_meth, \
299: ".objc_inst_meth", 0) \
300: SECTION_FUNCTION (objc_cat_cls_meth_section, \
301: in_objc_cat_cls_meth, \
302: ".objc_cat_cls_meth", 0) \
303: SECTION_FUNCTION (objc_cat_inst_meth_section, \
304: in_objc_cat_inst_meth, \
305: ".objc_cat_inst_meth", 0) \
306: SECTION_FUNCTION (objc_selector_strs_section, \
307: in_objc_selector_strs, \
308: ".objc_selector_strs", 0) \
309: SECTION_FUNCTION (objc_selector_refs_section, \
310: in_objc_selector_refs, \
311: ".objc_selector_refs", 0) \
312: SECTION_FUNCTION (objc_symbols_section, \
313: in_objc_symbols, \
314: ".objc_symbols", 0) \
315: SECTION_FUNCTION (objc_module_info_section, \
316: in_objc_module_info, \
317: ".objc_module_info", 0)
318:
319: #define READONLY_DATA_SECTION const_section
320:
321: #define SELECT_SECTION(exp,reloc) \
322: do \
323: { \
324: if (TREE_CODE (exp) == STRING_CST) \
325: { \
326: if (flag_writable_strings) \
327: data_section (); \
328: else if (TREE_STRING_LENGTH (exp) != \
329: strlen (TREE_STRING_POINTER (exp)) + 1) \
330: readonly_data_section (); \
331: else \
332: cstring_section (); \
333: } \
334: else if (TREE_CODE (exp) == INTEGER_CST \
335: || TREE_CODE (exp) == REAL_CST) \
336: { \
337: tree size = TYPE_SIZE (TREE_TYPE (exp)); \
338: \
339: if (TREE_CODE (size) == INTEGER_CST && \
340: TREE_INT_CST_LOW (size) == 4 && \
341: TREE_INT_CST_HIGH (size) == 0) \
342: literal4_section (); \
343: else if (TREE_CODE (size) == INTEGER_CST && \
344: TREE_INT_CST_LOW (size) == 8 && \
345: TREE_INT_CST_HIGH (size) == 0) \
346: literal8_section (); \
347: else \
348: readonly_data_section (); \
349: } \
350: else if ((TREE_READONLY (exp) || TREE_CONSTANT (exp)) \
351: && !TREE_SIDE_EFFECTS (exp)) \
352: readonly_data_section (); \
353: else if (TREE_CODE (exp) == VAR_DECL && \
354: DECL_NAME (exp) && \
355: TREE_CODE (DECL_NAME (exp)) == IDENTIFIER_NODE && \
356: IDENTIFIER_POINTER (DECL_NAME (exp)) && \
357: !strncmp (IDENTIFIER_POINTER (DECL_NAME (exp)), "_OBJC_", 6)) \
358: { \
359: const char *name = IDENTIFIER_POINTER (DECL_NAME (exp)); \
360: \
361: if (!strncmp (name, "_OBJC_CLASS_METHODS_", 20)) \
362: objc_cls_meth_section (); \
363: else if (!strncmp (name, "_OBJC_INSTANCE_METHODS_", 23)) \
364: objc_inst_meth_section (); \
365: else if (!strncmp (name, "_OBJC_CATEGORY_CLASS_METHODS_", 20)) \
366: objc_cat_cls_meth_section (); \
367: else if (!strncmp (name, "_OBJC_CATEGORY_INSTANCE_METHODS_", 23)) \
368: objc_cat_inst_meth_section (); \
369: else if (!strncmp (name, "_OBJC_CLASS_VARIABLES_", 22)) \
370: objc_class_vars_section (); \
371: else if (!strncmp (name, "_OBJC_INSTANCE_VARIABLES_", 25)) \
372: objc_instance_vars_section (); \
373: else if (!strncmp (name, "_OBJC_CLASS_", 12)) \
374: objc_class_section (); \
375: else if (!strncmp (name, "_OBJC_METACLASS_", 16)) \
376: objc_meta_class_section (); \
377: else if (!strncmp (name, "_OBJC_CATEGORY_", 15)) \
378: objc_category_section (); \
379: else if (!strncmp (name, "_OBJC_STRINGS", 13)) \
380: objc_selector_strs_section (); \
381: else if (!strncmp (name, "_OBJC_SELECTOR_REFERENCES", 25)) \
382: objc_selector_refs_section (); \
383: else if (!strncmp (name, "_OBJC_SYMBOLS", 13)) \
384: objc_symbols_section (); \
385: else if (!strncmp (name, "_OBJC_MODULES", 13)) \
386: objc_module_info_section (); \
387: else \
388: data_section (); \
389: } \
390: else \
391: data_section (); \
392: } \
393: while (0)
394:
395: /* Force the assembler to create all the Objective-C sections,
396: so that their order is guaranteed. */
397:
398: #define OBJC_PROLOGUE \
399: do { \
400: extern void objc_class_section (); \
401: extern void objc_meta_class_section (); \
402: extern void objc_cat_cls_meth_section (); \
403: extern void objc_cat_inst_meth_section (); \
404: extern void objc_cls_meth_section (); \
405: extern void objc_inst_meth_section (); \
406: extern void objc_selector_refs_section (); \
407: extern void objc_symbols_section (); \
408: extern void objc_category_section (); \
409: extern void objc_class_vars_section (); \
410: extern void objc_instance_vars_section (); \
411: extern void objc_module_info_section (); \
412: extern void objc_selector_strs_section (); \
413: \
414: objc_class_section (); \
415: objc_meta_class_section (); \
416: objc_cat_cls_meth_section (); \
417: objc_cat_inst_meth_section (); \
418: objc_cls_meth_section (); \
419: objc_inst_meth_section (); \
420: objc_selector_refs_section (); \
421: objc_symbols_section (); \
422: objc_category_section (); \
423: objc_class_vars_section (); \
424: objc_instance_vars_section (); \
425: objc_module_info_section (); \
426: objc_selector_strs_section (); \
427: } while (0)
428:
429: /* We do not define JUMP_TABLES_IN_TEXT_SECTION, since we wish to keep
430: the text section pure. There is no point in addressing the jump
431: tables using pc relative addressing, since they are not in the text
432: section, so we undefine CASE_VECTOR_PC_RELATIVE. This also
433: causes the compiler to use absolute addresses in the jump table,
434: so we redefine CASE_VECTOR_MODE to be SImode. */
435:
436: #undef CASE_VECTOR_MODE
437: #define CASE_VECTOR_MODE SImode
438:
439: #undef CASE_VECTOR_PC_RELATIVE
440:
441: /* Don't treat addresses involving labels differently from symbol names.
1.1.1.2 root 442: Previously, references to labels generated pc-relative addressing modes
1.1 root 443: while references to symbol names generated absolute addressing modes. */
444:
445: #undef GO_IF_INDEXABLE_BASE(X, ADDR)
446: #define GO_IF_INDEXABLE_BASE(X, ADDR) \
447: { if (GET_CODE (X) == REG && REG_OK_FOR_BASE_P (X)) goto ADDR; }
448:
1.1.1.2 root 449: #define ALIGN_ASM_OP ".align"
1.1 root 450:
451: #undef ASM_OUTPUT_ALIGN
452: #define ASM_OUTPUT_ALIGN(FILE,LOG) \
453: if ((LOG) != 0) \
1.1.1.2 root 454: fprintf (FILE, "\t%s %d\n", ALIGN_ASM_OP, (LOG))
1.1 root 455:
456: /* The maximum alignment which the object file format can support.
457: For NeXT's Mach-O format, this is 2^15. */
458:
459: #define MAX_OFILE_ALIGNMENT 0x8000
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.