OSDN Git Service

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