OSDN Git Service

Fix copyrights
[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 /* Don't use .gcc_compiled symbols to communicate with GDB;
212    They interfere with numerically sorted symbol lists. */
213
214 #undef  ASM_IDENTIFY_GCC
215 #define ASM_IDENTIFY_GCC(asm_out_file)
216 #undef  INIT_SECTION_ASM_OP
217 #define INIT_SECTION_ASM_OP
218 #undef  INVOKE__main
219
220 #undef  ASM_OUTPUT_CONSTRUCTOR
221 #define ASM_OUTPUT_CONSTRUCTOR(FILE,NAME)                       \
222   do { constructor_section ();                                  \
223        ASM_OUTPUT_ALIGN (FILE, 1);                              \
224        fprintf (FILE, "\t.long ");                              \
225        assemble_name (FILE, NAME);                              \
226        fprintf (FILE, "\n");                                    \
227        fprintf (FILE, ".reference .constructors_used\n");       \
228       } while (0)
229
230 #undef  ASM_OUTPUT_DESTRUCTOR
231 #define ASM_OUTPUT_DESTRUCTOR(FILE,NAME)                        \
232   do { destructor_section ();                                   \
233        ASM_OUTPUT_ALIGN (FILE, 1);                              \
234        fprintf (FILE, "\t.long ");                              \
235        assemble_name (FILE, NAME);                              \
236        fprintf (FILE, "\n");                                    \
237        fprintf (FILE, ".reference .destructors_used\n");        \
238       } while (0)
239
240 #define EH_FRAME_SECTION_ASM_OP ".section __TEXT,__eh_frame,regular"
241
242 /* Don't output a .file directive.  That is only used by the assembler for
243    error reporting.  */
244 #undef  ASM_FILE_START
245 #define ASM_FILE_START(FILE)
246
247 #undef  ASM_FILE_END
248 #define ASM_FILE_END(FILE)                                      \
249   do {                                                          \
250     if (strcmp (language_string, "GNU C++") == 0)               \
251       {                                                         \
252         constructor_section ();                                 \
253         destructor_section ();                                  \
254         ASM_OUTPUT_ALIGN (FILE, 1);                             \
255       }                                                         \
256   } while (0)
257
258 /* How to parse #pragma's */
259
260 #undef  HANDLE_PRAGMA
261 #define HANDLE_PRAGMA(GETC, UNGETC, NAME) handle_pragma (GETC, UNGETC, NAME)
262 extern int handle_pragma ();
263
264 /* Give methods pretty symbol names on NeXT. */
265
266 #undef  OBJC_GEN_METHOD_LABEL
267 #define OBJC_GEN_METHOD_LABEL(BUF,IS_INST,CLASS_NAME,CAT_NAME,SEL_NAME,NUM) \
268   do { if (CAT_NAME)                                                    \
269          sprintf (BUF, "%c[%s(%s) %s]", (IS_INST) ? '-' : '+',          \
270                   (CLASS_NAME), (CAT_NAME), (SEL_NAME));                \
271        else                                                             \
272          sprintf (BUF, "%c[%s %s]", (IS_INST) ? '-' : '+',              \
273                   (CLASS_NAME), (SEL_NAME));                            \
274      } while (0)
275
276 /* The prefix to add to user-visible assembler symbols. */
277
278 #undef USER_LABEL_PREFIX
279 #define USER_LABEL_PREFIX "_"
280
281 /* Wrap new method names in quotes so the assembler doesn't gag.
282    Make Objective-C internal symbols local.  */
283
284 #undef  ASM_OUTPUT_LABELREF
285 #define ASM_OUTPUT_LABELREF(FILE,NAME)  \
286   do { if (NAME[0] == '+' || NAME[0] == '-') fprintf (FILE, "\"%s\"", NAME); \
287        else if (!strncmp (NAME, "_OBJC_", 6)) fprintf (FILE, "L%s", NAME);   \
288        else if (!strncmp (NAME, ".objc_class_name_", 17))               \
289          fprintf (FILE, "%s", NAME);                                    \
290        else asm_fprintf (FILE, "%U%s", NAME); } while (0)
291
292 #undef  ALIGN_ASM_OP
293 #define ALIGN_ASM_OP            ".align"
294
295 #undef  ASM_OUTPUT_ALIGN
296 #define ASM_OUTPUT_ALIGN(FILE,LOG)      \
297   if ((LOG) != 0)                       \
298     fprintf (FILE, "\t%s %d\n", ALIGN_ASM_OP, (LOG))
299
300 /* Ensure correct alignment of bss data.  */
301
302 #undef  ASM_OUTPUT_ALIGNED_LOCAL
303 #define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \
304 ( fputs (".lcomm ", (FILE)),                            \
305   assemble_name ((FILE), (NAME)),                       \
306   fprintf ((FILE), ",%u,%u\n", (SIZE), floor_log2 ((ALIGN) / BITS_PER_UNIT)))
307
308 /* Output #ident as a .ident.  */
309
310 #undef  ASM_OUTPUT_IDENT
311 #define ASM_OUTPUT_IDENT(FILE, NAME) fprintf (FILE, "\t.ident \"%s\"\n", NAME);
312
313 /* The maximum alignment which the object file format can support.
314    For NeXT's Mach-O format, this is 2^15.  */
315
316 #undef  MAX_OFILE_ALIGNMENT
317 #define MAX_OFILE_ALIGNMENT 0x8000
318
319 /* Create new Mach-O sections. */
320
321 #undef  SECTION_FUNCTION
322 #define SECTION_FUNCTION(FUNCTION, SECTION, DIRECTIVE, WAS_TEXT, OBJC)  \
323 void                                                                    \
324 FUNCTION ()                                                             \
325 {                                                                       \
326   extern void objc_section_init ();                                     \
327   extern int flag_no_mach_text_sections;                                \
328                                                                         \
329   if (WAS_TEXT && flag_no_mach_text_sections)                           \
330     text_section ();                                                    \
331   else if (in_section != SECTION)                                       \
332     {                                                                   \
333       if (OBJC)                                                         \
334         objc_section_init ();                                           \
335       fprintf (asm_out_file, "%s\n", DIRECTIVE);                        \
336       in_section = SECTION;                                             \
337     }                                                                   \
338 }                                                                       \
339
340 #undef  EXTRA_SECTIONS
341 #define EXTRA_SECTIONS                                  \
342   in_const, in_cstring, in_literal4, in_literal8,       \
343   in_constructor, in_destructor,                        \
344   in_objc_class, in_objc_meta_class, in_objc_category,  \
345   in_objc_class_vars, in_objc_instance_vars,            \
346   in_objc_cls_meth, in_objc_inst_meth,                  \
347   in_objc_cat_cls_meth, in_objc_cat_inst_meth,          \
348   in_objc_selector_refs,                                \
349   in_objc_symbols, in_objc_module_info,                 \
350   in_objc_protocol, in_objc_string_object,              \
351   in_objc_class_names, in_objc_meth_var_names,          \
352   in_objc_meth_var_types, in_objc_cls_refs
353
354 #undef  EXTRA_SECTION_FUNCTIONS
355 #define EXTRA_SECTION_FUNCTIONS                 \
356 SECTION_FUNCTION (const_section,                \
357                   in_const,                     \
358                   ".const", 1, 0)               \
359 SECTION_FUNCTION (cstring_section,              \
360                   in_cstring,                   \
361                   ".cstring", 1, 0)             \
362 SECTION_FUNCTION (literal4_section,             \
363                   in_literal4,                  \
364                   ".literal4", 1, 0)            \
365 SECTION_FUNCTION (literal8_section,             \
366                   in_literal8,                  \
367                   ".literal8", 1, 0)            \
368 SECTION_FUNCTION (constructor_section,          \
369                   in_constructor,               \
370                   ".constructor", 0, 0)         \
371 SECTION_FUNCTION (destructor_section,           \
372                   in_destructor,                \
373                   ".destructor", 0, 0)          \
374 SECTION_FUNCTION (objc_class_section,           \
375                   in_objc_class,                \
376                   ".objc_class", 0, 1)          \
377 SECTION_FUNCTION (objc_meta_class_section,      \
378                   in_objc_meta_class,           \
379                   ".objc_meta_class", 0, 1)     \
380 SECTION_FUNCTION (objc_category_section,        \
381                   in_objc_category,             \
382                 ".objc_category", 0, 1)         \
383 SECTION_FUNCTION (objc_class_vars_section,      \
384                   in_objc_class_vars,           \
385                   ".objc_class_vars", 0, 1)     \
386 SECTION_FUNCTION (objc_instance_vars_section,   \
387                   in_objc_instance_vars,        \
388                   ".objc_instance_vars", 0, 1)  \
389 SECTION_FUNCTION (objc_cls_meth_section,        \
390                   in_objc_cls_meth,             \
391                   ".objc_cls_meth", 0, 1)       \
392 SECTION_FUNCTION (objc_inst_meth_section,       \
393                   in_objc_inst_meth,            \
394                   ".objc_inst_meth", 0, 1)      \
395 SECTION_FUNCTION (objc_cat_cls_meth_section,    \
396                   in_objc_cat_cls_meth,         \
397                   ".objc_cat_cls_meth", 0, 1)   \
398 SECTION_FUNCTION (objc_cat_inst_meth_section,   \
399                   in_objc_cat_inst_meth,        \
400                   ".objc_cat_inst_meth", 0, 1)  \
401 SECTION_FUNCTION (objc_selector_refs_section,   \
402                   in_objc_selector_refs,        \
403                   ".objc_message_refs", 0, 1)   \
404 SECTION_FUNCTION (objc_symbols_section,         \
405                   in_objc_symbols,              \
406                   ".objc_symbols", 0, 1)        \
407 SECTION_FUNCTION (objc_module_info_section,     \
408                   in_objc_module_info,          \
409                   ".objc_module_info", 0, 1)    \
410 SECTION_FUNCTION (objc_protocol_section,        \
411                   in_objc_protocol,             \
412                   ".objc_protocol", 0, 1)       \
413 SECTION_FUNCTION (objc_string_object_section,   \
414                   in_objc_string_object,        \
415                   ".objc_string_object", 0, 1)  \
416 SECTION_FUNCTION (objc_class_names_section,     \
417                 in_objc_class_names,            \
418                 ".objc_class_names", 0, 1)      \
419 SECTION_FUNCTION (objc_meth_var_names_section,  \
420                 in_objc_meth_var_names,         \
421                 ".objc_meth_var_names", 0, 1)   \
422 SECTION_FUNCTION (objc_meth_var_types_section,  \
423                 in_objc_meth_var_types,         \
424                 ".objc_meth_var_types", 0, 1)   \
425 SECTION_FUNCTION (objc_cls_refs_section,        \
426                 in_objc_cls_refs,               \
427                 ".objc_cls_refs", 0, 1)         \
428                                                 \
429 void                                            \
430 objc_section_init ()                            \
431 {                                               \
432   static int been_here = 0;                     \
433                                                 \
434   if (been_here == 0)                           \
435     {                                           \
436       been_here = 1;                            \
437       objc_class_section ();                    \
438       objc_meta_class_section ();               \
439       objc_cat_cls_meth_section ();             \
440       objc_cat_inst_meth_section ();            \
441       objc_cls_meth_section ();                 \
442       objc_inst_meth_section ();                \
443       objc_selector_refs_section ();            \
444       objc_symbols_section ();                  \
445       objc_category_section ();                 \
446       objc_protocol_section ();                 \
447       objc_class_vars_section ();               \
448       objc_instance_vars_section ();            \
449       objc_module_info_section ();              \
450       objc_string_object_section ();            \
451       objc_class_names_section ();              \
452       objc_meth_var_names_section ();           \
453       objc_meth_var_types_section ();           \
454       objc_cls_refs_section ();                 \
455     }                                           \
456 }
457
458 #undef  READONLY_DATA_SECTION
459 #define READONLY_DATA_SECTION const_section
460
461 #undef  SELECT_SECTION
462 #define SELECT_SECTION(exp,reloc)                               \
463   do                                                            \
464     {                                                           \
465       if (TREE_CODE (exp) == STRING_CST)                        \
466         {                                                       \
467           if (flag_writable_strings)                            \
468             data_section ();                                    \
469           else if (TREE_STRING_LENGTH (exp) !=                  \
470                    strlen (TREE_STRING_POINTER (exp)) + 1)      \
471             readonly_data_section ();                           \
472           else                                                  \
473             cstring_section ();                                 \
474         }                                                       \
475       else if (TREE_CODE (exp) == INTEGER_CST                   \
476                || TREE_CODE (exp) == REAL_CST)                  \
477         {                                                       \
478           tree size = TYPE_SIZE (TREE_TYPE (exp));              \
479                                                                 \
480           if (TREE_CODE (size) == INTEGER_CST &&                \
481               TREE_INT_CST_LOW (size) == 4 &&                   \
482               TREE_INT_CST_HIGH (size) == 0)                    \
483             literal4_section ();                                \
484           else if (TREE_CODE (size) == INTEGER_CST &&           \
485               TREE_INT_CST_LOW (size) == 8 &&                   \
486               TREE_INT_CST_HIGH (size) == 0)                    \
487             literal8_section ();                                \
488           else                                                  \
489             readonly_data_section ();                           \
490         }                                                       \
491       else if (TREE_CODE (exp) == CONSTRUCTOR                           \
492                && TREE_TYPE (exp)                                       \
493                && TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE            \
494                && TYPE_NAME (TREE_TYPE (exp))                           \
495                && TREE_CODE (TYPE_NAME (TREE_TYPE (exp))) == IDENTIFIER_NODE \
496                && IDENTIFIER_POINTER (TYPE_NAME (TREE_TYPE (exp))))     \
497         {                                                               \
498           if (!strcmp (IDENTIFIER_POINTER (TYPE_NAME (TREE_TYPE (exp))), \
499                         "NXConstantString"))                            \
500           objc_string_object_section ();                                \
501         else if ((TREE_READONLY (exp) || TREE_CONSTANT (exp))           \
502                 && !TREE_SIDE_EFFECTS (exp))                            \
503           readonly_data_section ();                                     \
504         else                                                            \
505           data_section ();                                              \
506       }                                                                 \
507       else if (TREE_CODE (exp) == VAR_DECL &&                           \
508                DECL_NAME (exp) &&                                       \
509                TREE_CODE (DECL_NAME (exp)) == IDENTIFIER_NODE &&        \
510                IDENTIFIER_POINTER (DECL_NAME (exp)) &&                  \
511                !strncmp (IDENTIFIER_POINTER (DECL_NAME (exp)), "_OBJC_", 6)) \
512         {                                                               \
513           const char *name = IDENTIFIER_POINTER (DECL_NAME (exp));      \
514                                                                         \
515           if (!strncmp (name, "_OBJC_CLASS_METHODS_", 20))              \
516             objc_cls_meth_section ();                                   \
517           else if (!strncmp (name, "_OBJC_INSTANCE_METHODS_", 23))      \
518             objc_inst_meth_section ();                                  \
519           else if (!strncmp (name, "_OBJC_CATEGORY_CLASS_METHODS_", 20)) \
520             objc_cat_cls_meth_section ();                               \
521           else if (!strncmp (name, "_OBJC_CATEGORY_INSTANCE_METHODS_", 23)) \
522             objc_cat_inst_meth_section ();                              \
523           else if (!strncmp (name, "_OBJC_CLASS_VARIABLES_", 22))       \
524             objc_class_vars_section ();                                 \
525           else if (!strncmp (name, "_OBJC_INSTANCE_VARIABLES_", 25))    \
526             objc_instance_vars_section ();                              \
527           else if (!strncmp (name, "_OBJC_CLASS_PROTOCOLS_", 22))       \
528             objc_cat_cls_meth_section ();                               \
529           else if (!strncmp (name, "_OBJC_CLASS_NAME_", 17))            \
530             objc_class_names_section ();                                \
531           else if (!strncmp (name, "_OBJC_METH_VAR_NAME_", 20))         \
532             objc_meth_var_names_section ();                             \
533           else if (!strncmp (name, "_OBJC_METH_VAR_TYPE_", 20))         \
534             objc_meth_var_types_section ();                             \
535           else if (!strncmp (name, "_OBJC_CLASS_REFERENCES", 22))       \
536             objc_cls_refs_section ();                                   \
537           else if (!strncmp (name, "_OBJC_CLASS_", 12))                 \
538             objc_class_section ();                                      \
539           else if (!strncmp (name, "_OBJC_METACLASS_", 16))             \
540             objc_meta_class_section ();                                 \
541           else if (!strncmp (name, "_OBJC_CATEGORY_", 15))              \
542             objc_category_section ();                                   \
543           else if (!strncmp (name, "_OBJC_SELECTOR_REFERENCES", 25))    \
544             objc_selector_refs_section ();                              \
545           else if (!strncmp (name, "_OBJC_SYMBOLS", 13))                \
546             objc_symbols_section ();                                    \
547           else if (!strncmp (name, "_OBJC_MODULES", 13))                \
548             objc_module_info_section ();                                \
549           else if (!strncmp (name, "_OBJC_PROTOCOL_INSTANCE_METHODS_", 32)) \
550             objc_cat_inst_meth_section ();                              \
551           else if (!strncmp (name, "_OBJC_PROTOCOL_CLASS_METHODS_", 29)) \
552             objc_cat_cls_meth_section ();                               \
553           else if (!strncmp (name, "_OBJC_PROTOCOL_REFS_", 20))         \
554             objc_cat_cls_meth_section ();                               \
555           else if (!strncmp (name, "_OBJC_PROTOCOL_", 15))              \
556             objc_protocol_section ();                                   \
557           else if ((TREE_READONLY (exp) || TREE_CONSTANT (exp))         \
558                 && !TREE_SIDE_EFFECTS (exp))                            \
559             readonly_data_section ();                                   \
560           else                                                          \
561             data_section ();                                            \
562         }                                                               \
563       else if (TREE_CODE (exp) == VAR_DECL)                             \
564         {                                                               \
565           if ((flag_pic && reloc)                                       \
566               || !TREE_READONLY (exp) || TREE_SIDE_EFFECTS (exp)        \
567               || !DECL_INITIAL (exp)                                    \
568               || (DECL_INITIAL (exp) != error_mark_node                 \
569                   && !TREE_CONSTANT (DECL_INITIAL (exp))))              \
570             data_section ();                                            \
571           else                                                          \
572             readonly_data_section ();                                   \
573         }                                                               \
574       else                                                              \
575         readonly_data_section ();                                       \
576     }                                                                   \
577   while (0)
578
579 #undef  SELECT_RTX_SECTION
580 #define SELECT_RTX_SECTION(mode, rtx)                                   \
581   do                                                                    \
582     {                                                                   \
583       if (GET_MODE_SIZE(mode) == 8)                                     \
584         literal8_section();                                             \
585       else if (GET_MODE_SIZE(mode) == 4)                                \
586         literal4_section();                                             \
587       else                                                              \
588         const_section ();                                               \
589     }                                                                   \
590   while (0)
591
592 #ifdef ASM_COMMENT_START
593 # undef ASM_COMMENT_START
594 #endif
595
596 #define ASM_COMMENT_START ";#"