OSDN Git Service

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