OSDN Git Service

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