|
|
1.1 root 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.
4:
5: This file is part of GNU CC.
6:
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)
10: any later version.
11:
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.
16:
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
1.1.1.3 ! root 19: the Free Software Foundation, 59 Temple Place - Suite 330,
! 20: Boston, MA 02111-1307, USA. */
1.1 root 21:
22: /* Use new NeXT include file search path.
23: In a cross compiler with NeXT as target, don't expect
24: the host to use Next's directory scheme. */
25:
26: #ifndef CROSS_COMPILE
27: #undef INCLUDE_DEFAULTS
28: #define INCLUDE_DEFAULTS \
29: { \
1.1.1.2 root 30: { GPLUSPLUS_INCLUDE_DIR, 1, 1 }, \
31: { LOCAL_INCLUDE_DIR, 0, 1 }, \
32: { TOOL_INCLUDE_DIR, 0, 1 }, \
33: { GCC_INCLUDE_DIR, 0, 0 }, \
1.1 root 34: /* These are for fixincludes-fixed ansi/bsd headers \
35: which wouldn't be found otherwise. \
36: (The use of string catenation here is OK since \
37: NeXT's native compiler is derived from GCC.) */ \
1.1.1.2 root 38: { GCC_INCLUDE_DIR "/ansi", 0, 0 }, \
39: { GCC_INCLUDE_DIR "/bsd", 0, 0 }, \
40: { "/NextDeveloper/Headers", 0, 0 }, \
41: { "/NextDeveloper/Headers/ansi", 0, 0 }, \
42: { "/NextDeveloper/Headers/bsd", 0, 0 }, \
43: { "/LocalDeveloper/Headers", 0, 0 }, \
44: { "/LocalDeveloper/Headers/ansi", 0, 0 }, \
45: { "/LocalDeveloper/Headers/bsd", 0, 0 }, \
46: { "/NextDeveloper/2.0CompatibleHeaders", 0, 0 }, \
47: { STANDARD_INCLUDE_DIR, 0, 0 }, \
48: { "/usr/include/bsd", 0, 0 }, \
49: { 0, 0, 0 } \
1.1 root 50: }
51: #endif /* CROSS_COMPILE */
52:
53: #undef EXTRA_FORMAT_FUNCTIONS
54: #define EXTRA_FORMAT_FUNCTIONS \
55: "NXPrintf", FALSE, 2, FALSE, \
56: "NXScanf", TRUE, 2, FALSE, \
57: "NXVPrintf", FALSE, 2, TRUE, \
58: "NXVScanf", TRUE, 2, TRUE, \
59: "DPSPrintf", FALSE, 2, FALSE, \
60: "bsd_sprintf", FALSE, 2, FALSE, \
61: "bsd_vsprintf", FALSE, 2, TRUE,
62:
63: /* Make -fnext-runtime the default. */
64:
65: #define NEXT_OBJC_RUNTIME
66:
67: /* We have atexit. */
68:
69: #define HAVE_ATEXIT
70:
71: /* Enable recent gcc to compile under the old gcc in Next release 1.0. */
72:
73: #define __inline inline
74:
75: /* wchar_t is unsigned short */
76:
77: #undef WCHAR_TYPE
78: #define WCHAR_TYPE "short unsigned int"
79: #undef WCHAR_TYPE_SIZE
80: #define WCHAR_TYPE_SIZE (BITS_PER_WORD / 2)
81:
82: /* Don't default to pcc-struct-return, because gcc is the only compiler, and
83: we want to retain compatibility with older gcc versions. */
84:
85: #undef DEFAULT_PCC_STRUCT_RETURN
86: #define DEFAULT_PCC_STRUCT_RETURN 0
87:
88: /* These compiler options take n arguments. */
89:
90: #undef WORD_SWITCH_TAKES_ARG
91: #define WORD_SWITCH_TAKES_ARG(STR) \
92: (DEFAULT_WORD_SWITCH_TAKES_ARG (STR) ? 1 : \
93: !strcmp (STR, "segalign") ? 1 : \
94: !strcmp (STR, "seg1addr") ? 1 : \
95: !strcmp (STR, "segaddr") ? 2 : \
96: !strcmp (STR, "sectobjectsymbols") ? 2 : \
97: !strcmp (STR, "segprot") ? 3 : \
98: !strcmp (STR, "sectcreate") ? 3 : \
99: !strcmp (STR, "sectalign") ? 3 : \
100: !strcmp (STR, "segcreate") ? 3 : \
101: !strcmp (STR, "sectorder") ? 3 : \
102: !strcmp (STR, "siff-mask") ? 1 : \
103: !strcmp (STR, "siff-filter") ? 1 : \
104: !strcmp (STR, "siff-warning") ? 1 : \
105: !strcmp (STR, "arch") ? 1 : \
106: !strcmp (STR, "pagezero_size") ? 1 : \
107: 0)
108:
109: #undef WORD_SWITCH
110: #define WORD_SWITCH(STR) \
111: (WORD_SWITCH_TAKES_ARG (STR) \
112: || !strcmp (STR, "bsd") \
113: || !strcmp (STR, "object") \
114: || !strcmp (STR, "ObjC") \
115: || !strcmp (STR, "all_load"))
116:
117: /* Machine dependent ccp options. */
118:
119: #undef CPP_SPEC
120: #define CPP_SPEC "%{!traditional: -D__STDC__} \
121: %{posixstrict:-D_POSIX_SOURCE} \
122: %{!posixstrict:%{bsd:-D__STRICT_BSD__} \
123: %{posix:-D_POSIX_SOURCE} \
124: %{!ansi:-D_NEXT_SOURCE}} \
125: %{MD:-MD %M} %{MMD:-MMD %M}"
126:
127: /* Machine dependent ld options. */
128:
129: #undef LINK_SPEC
130: #define LINK_SPEC "%{Z} %{M} \
131: %{execute*} %{preload*} %{fvmlib*} \
132: %{segalign*} %{seg1addr*} %{segaddr*} %{segprot*} \
133: %{pagezero_size*} \
134: %{seglinkedit*} %{noseglinkedit*} \
135: %{sectcreate*} %{sectalign*} %{sectobjectsymbols}\
136: %{segcreate*} %{Mach*} %{whyload} %{w} \
137: %{sectorder*} %{whatsloaded} %{ObjC} %{all_load} %{object}"
138:
139: /* Machine dependent libraries. */
140:
141: #undef LIB_SPEC
142: #define LIB_SPEC "%{!posix*:-lsys_s} %{posix*:-lposix}"
143:
144: /* We specify crt0.o as -lcrt0.o so that ld will search the library path. */
145:
146: #undef STARTFILE_SPEC
147: #define STARTFILE_SPEC \
148: "%{!posix*:%{pg:-lgcrt0.o}%{!pg: \
149: %{p:%e-p profiling is no longer supported. Use -pg instead.} \
150: %{!p:-lcrt0.o}}}\
151: %{posix*:%{pg:-lgposixcrt0.o}%{!pg: \
152: %{p:%e-p profiling is no longer supported. Use -pg instead.} \
153: %{!p:-lposixcrt0.o}}}"
154:
155: /* Why not? */
156:
157: #undef DOLLARS_IN_IDENTIFIERS
158: #define DOLLARS_IN_IDENTIFIERS 2
159:
160: /* Allow #sscs (but don't do anything). */
161:
162: #define SCCS_DIRECTIVE
163:
164: /* We use Dbx symbol format. */
165:
166: #undef SDB_DEBUGGING_INFO
167: #undef XCOFF_DEBUGGING_INFO
168: #define DBX_DEBUGGING_INFO
169:
170: /* This saves a fair amount of space. */
171:
172: #undef DBX_CONTIN_LENGTH
173: #define DBX_CONTIN_LENGTH 0
174:
175: /* These screw up NeXT's gdb at the moment, so don't use them. */
176:
177: #undef DBX_OUTPUT_MAIN_SOURCE_DIRECTORY
178: #define DBX_OUTPUT_MAIN_SOURCE_DIRECTORY(FILE, FILENAME)
179:
180: /* These come from bsd386.h, but are specific to sequent, so make sure
181: they don't bite us. */
182:
183: #undef DBX_NO_XREFS
184: #undef DBX_CONTIN_LENGTH
185:
186: /* gdb needs a null N_SO at the end of each file for scattered loading. */
187:
188: #undef DBX_OUTPUT_MAIN_SOURCE_FILE_END
189: #define DBX_OUTPUT_MAIN_SOURCE_FILE_END(FILE, FILENAME) \
190: fprintf (FILE, \
191: "\t.text\n\t.stabs \"%s\",%d,0,0,Letext\nLetext:\n", \
192: "" , N_SO)
193:
194: /* Don't use .gcc_compiled symbols to communicate with GDB;
195: They interfere with numerically sorted symbol lists. */
196:
197: #undef ASM_IDENTIFY_GCC
198: #define ASM_IDENTIFY_GCC(asm_out_file)
199: #undef INIT_SECTION_ASM_OP
200: #define INIT_SECTION_ASM_OP
201: #undef INVOKE__main
202:
203: #undef ASM_OUTPUT_CONSTRUCTOR
204: #define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME) \
205: do { constructor_section (); \
206: ASM_OUTPUT_ALIGN (FILE, 1); \
207: fprintf (FILE, "\t.long "); \
208: assemble_name (FILE, NAME); \
209: fprintf (FILE, "\n"); \
210: fprintf (FILE, ".reference .constructors_used\n"); \
211: } while (0)
212:
213: #undef ASM_OUTPUT_DESTRUCTOR
214: #define ASM_OUTPUT_DESTRUCTOR(FILE,NAME) \
215: do { destructor_section (); \
216: ASM_OUTPUT_ALIGN (FILE, 1); \
217: fprintf (FILE, "\t.long "); \
218: assemble_name (FILE, NAME); \
219: fprintf (FILE, "\n"); \
220: fprintf (FILE, ".reference .destructors_used\n"); \
221: } while (0)
222:
223: /* Don't output a .file directive. That is only used by the assembler for
224: error reporting. */
225: #undef ASM_FILE_START
226: #define ASM_FILE_START(FILE)
227:
228: #undef ASM_FILE_END
229: #define ASM_FILE_END(FILE) \
230: do { \
231: extern char *language_string; \
232: if (strcmp (language_string, "GNU C++") == 0) \
233: { \
234: constructor_section (); \
235: destructor_section (); \
236: ASM_OUTPUT_ALIGN (FILE, 1); \
237: } \
238: } while (0)
239:
240: /* How to parse #pragma's */
241:
242: #undef HANDLE_PRAGMA
243: #define HANDLE_PRAGMA(finput) handle_pragma (finput, &get_directive_line)
244:
245: /* Give methods pretty symbol names on NeXT. */
246:
247: #undef OBJC_GEN_METHOD_LABEL
248: #define OBJC_GEN_METHOD_LABEL(BUF,IS_INST,CLASS_NAME,CAT_NAME,SEL_NAME,NUM) \
249: do { if (CAT_NAME) \
250: sprintf (BUF, "%c[%s(%s) %s]", (IS_INST) ? '-' : '+', \
251: (CLASS_NAME), (CAT_NAME), (SEL_NAME)); \
252: else \
253: sprintf (BUF, "%c[%s %s]", (IS_INST) ? '-' : '+', \
254: (CLASS_NAME), (SEL_NAME)); \
255: } while (0)
256:
257: /* Wrap new method names in quotes so the assembler doesn't gag.
258: Make Objective-C internal symbols local. */
259:
260: #undef ASM_OUTPUT_LABELREF
261: #define ASM_OUTPUT_LABELREF(FILE,NAME) \
262: do { if (NAME[0] == '+' || NAME[0] == '-') fprintf (FILE, "\"%s\"", NAME); \
263: else if (!strncmp (NAME, "_OBJC_", 6)) fprintf (FILE, "L%s", NAME); \
264: else if (!strncmp (NAME, ".objc_class_name_", 17)) \
265: fprintf (FILE, "%s", NAME); \
266: else fprintf (FILE, "_%s", NAME); } while (0)
267:
268: #undef ALIGN_ASM_OP
269: #define ALIGN_ASM_OP ".align"
270:
271: #undef ASM_OUTPUT_ALIGN
272: #define ASM_OUTPUT_ALIGN(FILE,LOG) \
273: if ((LOG) != 0) \
274: fprintf (FILE, "\t%s %d\n", ALIGN_ASM_OP, (LOG))
275:
276: /* Ensure correct alignment of bss data. */
277:
278: #undef ASM_OUTPUT_ALIGNED_LOCAL
279: #define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \
280: ( fputs (".lcomm ", (FILE)), \
281: assemble_name ((FILE), (NAME)), \
282: fprintf ((FILE), ",%u,%u\n", (SIZE), floor_log2 ((ALIGN) / BITS_PER_UNIT)))
283:
284: /* Output #ident as a .ident. */
285:
286: #undef ASM_OUTPUT_IDENT
287: #define ASM_OUTPUT_IDENT(FILE, NAME) fprintf (FILE, "\t.ident \"%s\"\n", NAME);
288:
289: /* The maximum alignment which the object file format can support.
290: For NeXT's Mach-O format, this is 2^15. */
291:
292: #undef MAX_OFILE_ALIGNMENT
293: #define MAX_OFILE_ALIGNMENT 0x8000
294:
295: /* Create new Mach-O sections. */
296:
297: #undef SECTION_FUNCTION
298: #define SECTION_FUNCTION(FUNCTION, SECTION, DIRECTIVE, WAS_TEXT, OBJC) \
299: void \
300: FUNCTION () \
301: { \
302: extern void text_section (); \
303: extern void objc_section_init (); \
304: extern int flag_no_mach_text_sections; \
305: \
306: if (WAS_TEXT && flag_no_mach_text_sections) \
307: text_section (); \
308: else if (in_section != SECTION) \
309: { \
310: if (OBJC) \
311: objc_section_init (); \
312: fprintf (asm_out_file, "%s\n", DIRECTIVE); \
313: in_section = SECTION; \
314: } \
315: } \
316:
317: #undef EXTRA_SECTIONS
318: #define EXTRA_SECTIONS \
319: in_const, in_cstring, in_literal4, in_literal8, \
320: in_constructor, in_destructor, \
321: in_objc_class, in_objc_meta_class, in_objc_category, \
322: in_objc_class_vars, in_objc_instance_vars, \
323: in_objc_cls_meth, in_objc_inst_meth, \
324: in_objc_cat_cls_meth, in_objc_cat_inst_meth, \
325: in_objc_selector_refs, \
326: in_objc_symbols, in_objc_module_info, \
327: in_objc_protocol, in_objc_string_object, \
328: in_objc_class_names, in_objc_meth_var_names, \
329: in_objc_meth_var_types, in_objc_cls_refs
330:
331: #undef EXTRA_SECTION_FUNCTIONS
332: #define EXTRA_SECTION_FUNCTIONS \
333: SECTION_FUNCTION (const_section, \
334: in_const, \
335: ".const", 1, 0) \
336: SECTION_FUNCTION (cstring_section, \
337: in_cstring, \
338: ".cstring", 1, 0) \
339: SECTION_FUNCTION (literal4_section, \
340: in_literal4, \
341: ".literal4", 1, 0) \
342: SECTION_FUNCTION (literal8_section, \
343: in_literal8, \
344: ".literal8", 1, 0) \
345: SECTION_FUNCTION (constructor_section, \
346: in_constructor, \
347: ".constructor", 0, 0) \
348: SECTION_FUNCTION (destructor_section, \
349: in_destructor, \
350: ".destructor", 0, 0) \
351: SECTION_FUNCTION (objc_class_section, \
352: in_objc_class, \
353: ".objc_class", 0, 1) \
354: SECTION_FUNCTION (objc_meta_class_section, \
355: in_objc_meta_class, \
356: ".objc_meta_class", 0, 1) \
357: SECTION_FUNCTION (objc_category_section, \
358: in_objc_category, \
359: ".objc_category", 0, 1) \
360: SECTION_FUNCTION (objc_class_vars_section, \
361: in_objc_class_vars, \
362: ".objc_class_vars", 0, 1) \
363: SECTION_FUNCTION (objc_instance_vars_section, \
364: in_objc_instance_vars, \
365: ".objc_instance_vars", 0, 1) \
366: SECTION_FUNCTION (objc_cls_meth_section, \
367: in_objc_cls_meth, \
368: ".objc_cls_meth", 0, 1) \
369: SECTION_FUNCTION (objc_inst_meth_section, \
370: in_objc_inst_meth, \
371: ".objc_inst_meth", 0, 1) \
372: SECTION_FUNCTION (objc_cat_cls_meth_section, \
373: in_objc_cat_cls_meth, \
374: ".objc_cat_cls_meth", 0, 1) \
375: SECTION_FUNCTION (objc_cat_inst_meth_section, \
376: in_objc_cat_inst_meth, \
377: ".objc_cat_inst_meth", 0, 1) \
378: SECTION_FUNCTION (objc_selector_refs_section, \
379: in_objc_selector_refs, \
380: ".objc_message_refs", 0, 1) \
381: SECTION_FUNCTION (objc_symbols_section, \
382: in_objc_symbols, \
383: ".objc_symbols", 0, 1) \
384: SECTION_FUNCTION (objc_module_info_section, \
385: in_objc_module_info, \
386: ".objc_module_info", 0, 1) \
387: SECTION_FUNCTION (objc_protocol_section, \
388: in_objc_protocol, \
389: ".objc_protocol", 0, 1) \
390: SECTION_FUNCTION (objc_string_object_section, \
391: in_objc_string_object, \
392: ".objc_string_object", 0, 1) \
393: SECTION_FUNCTION (objc_class_names_section, \
394: in_objc_class_names, \
395: ".objc_class_names", 0, 1) \
396: SECTION_FUNCTION (objc_meth_var_names_section, \
397: in_objc_meth_var_names, \
398: ".objc_meth_var_names", 0, 1) \
399: SECTION_FUNCTION (objc_meth_var_types_section, \
400: in_objc_meth_var_types, \
401: ".objc_meth_var_types", 0, 1) \
402: SECTION_FUNCTION (objc_cls_refs_section, \
403: in_objc_cls_refs, \
404: ".objc_cls_refs", 0, 1) \
405: \
406: void \
407: objc_section_init () \
408: { \
409: static int been_here = 0; \
410: \
411: if (been_here == 0) \
412: { \
413: been_here = 1; \
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_protocol_section (); \
424: objc_class_vars_section (); \
425: objc_instance_vars_section (); \
426: objc_module_info_section (); \
427: objc_string_object_section (); \
428: objc_class_names_section (); \
429: objc_meth_var_names_section (); \
430: objc_meth_var_types_section (); \
431: objc_cls_refs_section (); \
432: } \
433: }
434:
435: #undef READONLY_DATA_SECTION
436: #define READONLY_DATA_SECTION const_section
437:
438: #undef SELECT_SECTION
439: #define SELECT_SECTION(exp,reloc) \
440: do \
441: { \
442: if (TREE_CODE (exp) == STRING_CST) \
443: { \
444: if (flag_writable_strings) \
445: data_section (); \
446: else if (TREE_STRING_LENGTH (exp) != \
447: strlen (TREE_STRING_POINTER (exp)) + 1) \
448: readonly_data_section (); \
449: else \
450: cstring_section (); \
451: } \
452: else if (TREE_CODE (exp) == INTEGER_CST \
453: || TREE_CODE (exp) == REAL_CST) \
454: { \
455: tree size = TYPE_SIZE (TREE_TYPE (exp)); \
456: \
457: if (TREE_CODE (size) == INTEGER_CST && \
458: TREE_INT_CST_LOW (size) == 4 && \
459: TREE_INT_CST_HIGH (size) == 0) \
460: literal4_section (); \
461: else if (TREE_CODE (size) == INTEGER_CST && \
462: TREE_INT_CST_LOW (size) == 8 && \
463: TREE_INT_CST_HIGH (size) == 0) \
464: literal8_section (); \
465: else \
466: readonly_data_section (); \
467: } \
468: else if (TREE_CODE (exp) == CONSTRUCTOR \
469: && TREE_TYPE (exp) \
470: && TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE \
471: && TYPE_NAME (TREE_TYPE (exp)) \
472: && TREE_CODE (TYPE_NAME (TREE_TYPE (exp))) == IDENTIFIER_NODE \
473: && IDENTIFIER_POINTER (TYPE_NAME (TREE_TYPE (exp)))) \
474: { \
475: if (!strcmp (IDENTIFIER_POINTER (TYPE_NAME (TREE_TYPE (exp))), \
476: "NXConstantString")) \
477: objc_string_object_section (); \
478: else if ((TREE_READONLY (exp) || TREE_CONSTANT (exp)) \
479: && !TREE_SIDE_EFFECTS (exp)) \
480: readonly_data_section (); \
481: else \
482: data_section (); \
483: } \
484: else if (TREE_CODE (exp) == VAR_DECL && \
485: DECL_NAME (exp) && \
486: TREE_CODE (DECL_NAME (exp)) == IDENTIFIER_NODE && \
487: IDENTIFIER_POINTER (DECL_NAME (exp)) && \
488: !strncmp (IDENTIFIER_POINTER (DECL_NAME (exp)), "_OBJC_", 6)) \
489: { \
490: const char *name = IDENTIFIER_POINTER (DECL_NAME (exp)); \
491: \
492: if (!strncmp (name, "_OBJC_CLASS_METHODS_", 20)) \
493: objc_cls_meth_section (); \
494: else if (!strncmp (name, "_OBJC_INSTANCE_METHODS_", 23)) \
495: objc_inst_meth_section (); \
496: else if (!strncmp (name, "_OBJC_CATEGORY_CLASS_METHODS_", 20)) \
497: objc_cat_cls_meth_section (); \
498: else if (!strncmp (name, "_OBJC_CATEGORY_INSTANCE_METHODS_", 23)) \
499: objc_cat_inst_meth_section (); \
500: else if (!strncmp (name, "_OBJC_CLASS_VARIABLES_", 22)) \
501: objc_class_vars_section (); \
502: else if (!strncmp (name, "_OBJC_INSTANCE_VARIABLES_", 25)) \
503: objc_instance_vars_section (); \
504: else if (!strncmp (name, "_OBJC_CLASS_PROTOCOLS_", 22)) \
505: objc_cat_cls_meth_section (); \
506: else if (!strncmp (name, "_OBJC_CLASS_NAME_", 17)) \
507: objc_class_names_section (); \
508: else if (!strncmp (name, "_OBJC_METH_VAR_NAME_", 20)) \
509: objc_meth_var_names_section (); \
510: else if (!strncmp (name, "_OBJC_METH_VAR_TYPE_", 20)) \
511: objc_meth_var_types_section (); \
512: else if (!strncmp (name, "_OBJC_CLASS_REFERENCES", 22)) \
513: objc_cls_refs_section (); \
514: else if (!strncmp (name, "_OBJC_CLASS_", 12)) \
515: objc_class_section (); \
516: else if (!strncmp (name, "_OBJC_METACLASS_", 16)) \
517: objc_meta_class_section (); \
518: else if (!strncmp (name, "_OBJC_CATEGORY_", 15)) \
519: objc_category_section (); \
520: else if (!strncmp (name, "_OBJC_SELECTOR_REFERENCES", 25)) \
521: objc_selector_refs_section (); \
522: else if (!strncmp (name, "_OBJC_SYMBOLS", 13)) \
523: objc_symbols_section (); \
524: else if (!strncmp (name, "_OBJC_MODULES", 13)) \
525: objc_module_info_section (); \
526: else if (!strncmp (name, "_OBJC_PROTOCOL_INSTANCE_METHODS_", 32)) \
527: objc_cat_inst_meth_section (); \
528: else if (!strncmp (name, "_OBJC_PROTOCOL_CLASS_METHODS_", 29)) \
529: objc_cat_cls_meth_section (); \
530: else if (!strncmp (name, "_OBJC_PROTOCOL_REFS_", 20)) \
531: objc_cat_cls_meth_section (); \
532: else if (!strncmp (name, "_OBJC_PROTOCOL_", 15)) \
533: objc_protocol_section (); \
534: else if ((TREE_READONLY (exp) || TREE_CONSTANT (exp)) \
535: && !TREE_SIDE_EFFECTS (exp)) \
536: readonly_data_section (); \
537: else \
538: data_section (); \
539: } \
1.1.1.2 root 540: else if (TREE_CODE (exp) == VAR_DECL) \
541: { \
542: if ((flag_pic && reloc) \
543: || !TREE_READONLY (exp) || TREE_SIDE_EFFECTS (exp) \
544: || !DECL_INITIAL (exp) \
545: || (DECL_INITIAL (exp) != error_mark_node \
546: && !TREE_CONSTANT (DECL_INITIAL (exp)))) \
547: data_section (); \
548: else \
549: readonly_data_section (); \
550: } \
1.1 root 551: else \
1.1.1.2 root 552: readonly_data_section (); \
1.1 root 553: } \
554: while (0)
555:
556: #undef SELECT_RTX_SECTION
557: #define SELECT_RTX_SECTION(mode, rtx) \
558: do \
559: { \
560: if (GET_MODE_SIZE(mode) == 8) \
561: literal8_section(); \
562: else if (GET_MODE_SIZE(mode) == 4) \
563: literal4_section(); \
564: else \
565: const_section (); \
566: } \
567: while (0)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.