Change the system name from 'FreeBSD' to 'DragonFly'. We are now officially
[dragonfly.git] / contrib / gcc / config / dragonfly.h
1 /* Base configuration file for all FreeBSD targets.
2    Copyright (C) 1999, 2000 Free Software Foundation, Inc.
3
4 This file is part of GNU CC.
5
6 GNU CC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10
11 GNU CC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GNU CC; see the file COPYING.  If not, write to
18 the Free Software Foundation, 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA.  */
20
21 /* Common FreeBSD configuration. 
22    All FreeBSD architectures should include this file, which will specify
23    their commonalities.
24    Adapted from /usr/src/contrib/gcc/config/i386/freebsd.h,
25    /usr/src/contrib/gcc/config/svr4.h & 
26    egcs/gcc/config/i386/freebsd-elf.h by
27    David O'Brien <obrien@FreeBSD.org>.  */
28
29 /* $FreeBSD: src/contrib/gcc/config/freebsd.h,v 1.25.2.10 2002/06/20 23:12:36 obrien Exp $ */
30 /* $DragonFly: src/contrib/gcc/config/Attic/dragonfly.h,v 1.1 2003/11/19 00:51:31 dillon Exp $ */
31
32
33 /* Cpp, assembler, linker, library, and startfile spec's.  */
34
35 /* This defines which switch letters take arguments.  On FreeBSD, most of
36    the normal cases (defined in gcc.c) apply, and we also have -h* and
37    -z* options (for the linker) (coming from SVR4).
38    We also have -R (alias --rpath), no -z, --soname (-h), --assert etc.  */
39
40 #define FBSD_SWITCH_TAKES_ARG(CHAR)                                     \
41   (DEFAULT_SWITCH_TAKES_ARG (CHAR)                                      \
42     || (CHAR) == 'h'                                                    \
43     || (CHAR) == 'z' /* ignored by ld */                                \
44     || (CHAR) == 'R')
45
46 #undef  SWITCH_TAKES_ARG
47 #define SWITCH_TAKES_ARG(CHAR) (FBSD_SWITCH_TAKES_ARG(CHAR))
48
49 /* This defines which multi-letter switches take arguments.  */
50
51 #define FBSD_WORD_SWITCH_TAKES_ARG(STR)                                 \
52   (DEFAULT_WORD_SWITCH_TAKES_ARG (STR)                                  \
53    || !strcmp ((STR), "rpath") || !strcmp ((STR), "rpath-link")         \
54    || !strcmp ((STR), "soname") || !strcmp ((STR), "defsym")            \
55    || !strcmp ((STR), "assert") || !strcmp ((STR), "dynamic-linker"))
56
57 #undef  WORD_SWITCH_TAKES_ARG
58 #define WORD_SWITCH_TAKES_ARG(STR) (FBSD_WORD_SWITCH_TAKES_ARG(STR))
59
60 /* Place spaces around this string.  We depend on string splicing to produce
61    the final CPP_PREDEFINES value.  */
62
63 #define FBSD_CPP_PREDEFINES \
64   " -D__DragonFly__=1 -D__DragonFly_cc_version=100001 -D__FreeBSD__=4 -D__FreeBSD_cc_version=460001 -Dunix -Asystem(unix) -Asystem(FreeBSD) -Asystem(DragonFly) "
65
66 #define FBSD_CPP_SPEC "                                                 \
67   %(cpp_cpu)                                                            \
68   %{!maout: -D__ELF__}                                                  \
69   %{munderscores: -D__UNDERSCORES__}                                    \
70   %{maout: %{!mno-underscores: -D__UNDERSCORES__}}                      \
71   %{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__}               \
72   %{posix:-D_POSIX_SOURCE}                                              \
73   %{pthread:-D_THREAD_SAFE}"
74
75 #undef  CPP_SPEC
76 #define CPP_SPEC FBSD_CPP_SPEC
77
78 /* Provide a LIB_SPEC appropriate for FreeBSD.  Before
79    __FreeBSD_version 500016, select the appropriate libc, depending on
80    whether we're doing profiling or need threads support.  (similar to
81    the default, except no -lg, and no -p).  At __FreeBSD_version
82    500016 and later, when threads support is requested include both
83    -lc and -lc_r instead of only -lc_r.  */
84
85 #undef  LIB_SPEC
86 #include <sys/param.h>
87 #if __FreeBSD_version >= 500016
88 #define LIB_SPEC "                                                      \
89   %{!shared:                                                            \
90     %{!pg: %{pthread:-lc_r} -lc}                                        \
91     %{pg:  %{pthread:-lc_r_p} -lc_p}                                    \
92   }"
93 #else
94 #define LIB_SPEC "                                                      \
95   %{!shared:                                                            \
96     %{!pg:                                                              \
97       %{!pthread:-lc}                                                   \
98       %{pthread:-lc_r}}                                                 \
99     %{pg:                                                               \
100       %{!pthread:-lc_p}                                                 \
101       %{pthread:-lc_r_p}}                                               \
102   }"
103 #endif
104
105
106 /************************[  Target stuff  ]***********************************/
107
108 /* All FreeBSD Architectures support the ELF object file format.  */
109 #undef  OBJECT_FORMAT_ELF
110 #define OBJECT_FORMAT_ELF
111
112 /* Don't assume anything about the header files.  */
113 #undef  NO_IMPLICIT_EXTERN_C
114 #define NO_IMPLICIT_EXTERN_C
115
116 /* Implicit library calls should use memcpy, not bcopy, etc.  */
117 #undef  TARGET_MEM_FUNCTIONS
118 #define TARGET_MEM_FUNCTIONS
119
120 /* Allow #sccs in preprocessor.  */
121 #undef  SCCS_DIRECTIVE
122 #define SCCS_DIRECTIVE
123
124 #undef  HAVE_ATEXIT
125 #define HAVE_ATEXIT
126
127 /* Code generation parameters.  */
128
129 /* Don't default to pcc-struct-return, because gcc is the only compiler, and
130    we want to retain compatibility with older gcc versions
131    (even though the SVR4 ABI for the i386 says that records and unions are
132    returned in memory).  */
133 #undef  DEFAULT_PCC_STRUCT_RETURN
134 #define DEFAULT_PCC_STRUCT_RETURN 0
135
136 /* Writing `int' for a bitfield forces int alignment for the structure.  */
137 /* XXX: ok for Alpha??  */
138 #undef  PCC_BITFIELD_TYPE_MATTERS
139 #define PCC_BITFIELD_TYPE_MATTERS 1
140
141 /* Use periods rather than dollar signs in special g++ assembler names.
142    This ensures the configuration knows our system correctly so we can link
143    with libraries compiled with the native cc.  */
144 #undef NO_DOLLAR_IN_LABEL
145
146 /* The prefix to add to user-visible assembler symbols.
147    For System V Release 4 & ELF the convention is *not* to prepend a leading
148    underscore onto user-level symbol names.  */
149
150 #undef  USER_LABEL_PREFIX
151 #define USER_LABEL_PREFIX ""
152
153 /* Handle #pragma weak and #pragma pack.  */
154 #undef  HANDLE_SYSV_PRAGMA
155 #define HANDLE_SYSV_PRAGMA
156
157 /* While FreeBSD ELF no longer uses our home-grown crtbegin.o/crtend.o and thus
158    could switch to the DWARF2 unwinding mechanisms.  I don't want to make the
159    switch mid-branch.  So continue to use sjlj-exceptions.  */
160 #ifdef WANT_DWARF2_UNWIND
161 /* FreeBSD ELF will use DWARF2 unwinding in 5.0+, as some psABI requires it.  */
162 #define DWARF2_UNWIND_INFO 1
163 #else
164 /* Maintain compatibility with the FreeBSD {3,4}.x C++ ABI.  */
165 #define DWARF2_UNWIND_INFO 0
166 #endif
167
168 /* Do not use ``thunks'' to implement C++ vtables.  This method still has
169    fatal bugs.  Also, GCC 3.0 will have a new C++ ABI that may not even
170    support `thunks'.  */
171 #undef DEFAULT_VTABLE_THUNKS
172
173
174 /************************[  Assembler stuff  ]********************************/
175
176 /* Override the default comment-starter of "/".  */
177 #undef  ASM_COMMENT_START
178 #define ASM_COMMENT_START       "#"
179
180 /* Attach a special .ident directive to the end of the file to identify
181    the version of GCC which compiled this code.  The format of the .ident
182    string is patterned after the ones produced by native SVR4 C compilers.  */
183
184 #undef  IDENT_ASM_OP
185 #define IDENT_ASM_OP    "\t.ident\t"
186
187 /* Output #ident as a .ident.  */
188
189 #undef  ASM_OUTPUT_IDENT
190 #define ASM_OUTPUT_IDENT(FILE, NAME)                                    \
191   fprintf ((FILE), "%s\"%s\"\n", IDENT_ASM_OP, (NAME));
192
193 /* Identify the front-end which produced this file.  To keep symbol
194    space down, and not confuse kdb, only do this if the language is
195    not C. (svr4.h defines ASM_IDENTIFY_GCC but neglects this) */
196
197 #undef  ASM_IDENTIFY_LANGUAGE
198 #define ASM_IDENTIFY_LANGUAGE(FILE)                                     \
199   {                                                                     \
200     if (strcmp (lang_identify (), "c") != 0)                            \
201         output_lang_identify (FILE);                                    \
202   }
203
204 #undef  ASM_FILE_END
205 #define ASM_FILE_END(FILE)                                              \
206   do {                                                                  \
207     if (!flag_no_ident)                                                 \
208       fprintf ((FILE), "%s\"GCC: (GNU) %s %s\"\n",                      \
209                IDENT_ASM_OP, lang_identify(), version_string);          \
210   } while (0)
211
212 /* This is the pseudo-op used to generate a contiguous sequence of byte
213    values from a double-quoted string WITHOUT HAVING A TERMINATING NUL
214    AUTOMATICALLY APPENDED.  This is the same for most SVR4 assemblers.  */
215
216 #undef  ASCII_DATA_ASM_OP
217 #define ASCII_DATA_ASM_OP       "\t.ascii\t"
218
219 #undef  ASM_BYTE_OP
220 #define ASM_BYTE_OP             "\t.byte\t"
221
222 /* This is how to allocate empty space in some section.  The .zero
223    pseudo-op is used for this on most ELF assemblers.  */
224
225 #undef  SKIP_ASM_OP
226 #define SKIP_ASM_OP             "\t.zero\t"
227
228 /* A table of bytes codes used by the ASM_OUTPUT_ASCII and
229    ASM_OUTPUT_LIMITED_STRING macros.  Each byte in the table
230    corresponds to a particular byte value [0..255].  For any
231    given byte value, if the value in the corresponding table
232    position is zero, the given character can be output directly.
233    If the table value is 1, the byte must be output as a \ooo
234    octal escape.  If the tables value is anything else, then the
235    byte value should be output as a \ followed by the value
236    in the table.  Note that we can use standard UN*X escape
237    sequences for many control characters, but we don't use
238    \a to represent BEL because some SVR4 assemblers (e.g. on
239    the i386) don't know about that.  Also, we don't use \v
240    since some versions of gas, such as 2.2 did not accept it.  */
241
242 #define ESCAPES \
243 "\1\1\1\1\1\1\1\1btn\1fr\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
244 \0\0\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
245 \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\\\0\0\0\
246 \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\
247 \1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
248 \1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
249 \1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
250 \1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1"
251
252 /* Some SVR4 assemblers have a limit on the number of characters which
253    can appear in the operand of a .string directive.  If your assembler
254    has such a limitation, you should define STRING_LIMIT to reflect that
255    limit.  Note that at least some SVR4 assemblers have a limit on the
256    actual number of bytes in the double-quoted string, and that they
257    count each character in an escape sequence as one byte.  Thus, an
258    escape sequence like \377 would count as four bytes.
259
260    If your target assembler doesn't support the .string directive, you
261    should define this to zero.
262 */
263
264 #undef  STRING_LIMIT
265 #define STRING_LIMIT    ((unsigned) 256)
266
267 #undef  STRING_ASM_OP
268 #define STRING_ASM_OP   "\t.string\t"
269
270 /* Output the label which precedes a jumptable.  Note that for all svr4/ELF
271    systems where we actually generate jumptables (which is to say every
272    SVR4 target except i386, where we use casesi instead) we put the jump-
273    tables into the .rodata section and since other stuff could have been
274    put into the .rodata section prior to any given jumptable, we have to
275    make sure that the location counter for the .rodata section gets pro-
276    perly re-aligned prior to the actual beginning of the jump table.  */
277
278 #undef  ALIGN_ASM_OP
279 #define ALIGN_ASM_OP    "\t.align\t"
280
281 /* This says how to output assembler code to declare an
282    uninitialized external linkage data object.  Under SVR4/ELF,
283    the linker seems to want the alignment of data objects
284    to depend on their types.  We do exactly that here.  */
285
286 #undef  COMMON_ASM_OP
287 #define COMMON_ASM_OP   "\t.comm\t"
288
289 /* This says how to output assembler code to declare an
290    uninitialized internal linkage data object.  Under SVR4/ELF,
291    the linker seems to want the alignment of data objects
292    to depend on their types.  We do exactly that here.  */
293
294 #undef  LOCAL_ASM_OP
295 #define LOCAL_ASM_OP    "\t.local\t"
296
297 #undef  ASM_OUTPUT_BEFORE_CASE_LABEL
298 #define ASM_OUTPUT_BEFORE_CASE_LABEL(FILE, PREFIX, NUM, TABLE)          \
299   ASM_OUTPUT_ALIGN ((FILE), 2);
300
301 #undef  ASM_OUTPUT_CASE_LABEL
302 #define ASM_OUTPUT_CASE_LABEL(FILE, PREFIX, NUM, JUMPTABLE)             \
303   do {                                                                  \
304     ASM_OUTPUT_BEFORE_CASE_LABEL ((FILE), (PREFIX), (NUM), (JUMPTABLE)) \
305     ASM_OUTPUT_INTERNAL_LABEL ((FILE), (PREFIX), (NUM));                \
306   } while (0)
307
308 /* The standard SVR4/ELF assembler seems to require that certain builtin
309    library routines (e.g. .udiv) be explicitly declared as .globl
310    in each assembly file where they are referenced.  */
311
312 #undef  ASM_OUTPUT_EXTERNAL_LIBCALL
313 #define ASM_OUTPUT_EXTERNAL_LIBCALL(FILE, FUN)                          \
314   ASM_GLOBALIZE_LABEL ((FILE), XSTR ((FUN), 0))
315
316 /* Support const sections and the ctors and dtors sections for g++.
317    Note that there appears to be two different ways to support const
318    sections at the moment.  You can either #define the symbol
319    READONLY_DATA_SECTION (giving it some code which switches to the
320    readonly data section) or else you can #define the symbols
321    EXTRA_SECTIONS, EXTRA_SECTION_FUNCTIONS, SELECT_SECTION, and
322    SELECT_RTX_SECTION.  We do both here just to be on the safe side.  
323    FreeBSD conditionalizes the use of ".section rodata" depending on
324    ELF mode - otherwise .text.  */
325
326 #undef  USE_CONST_SECTION
327 #define USE_CONST_SECTION       TARGET_ELF
328
329 #undef  CONST_SECTION_ASM_OP
330 #define CONST_SECTION_ASM_OP    "\t.section\t.rodata"
331
332 /* Define the pseudo-ops used to switch to the .ctors and .dtors sections.
333
334    Note that we want to give these sections the SHF_WRITE attribute
335    because these sections will actually contain data (i.e. tables of
336    addresses of functions in the current root executable or shared library
337    file) and, in the case of a shared library, the relocatable addresses
338    will have to be properly resolved/relocated (and then written into) by
339    the dynamic linker when it actually attaches the given shared library
340    to the executing process.  (Note that on SVR4, you may wish to use the
341    `-z text' option to the ELF linker, when building a shared library, as
342    an additional check that you are doing everything right.  But if you do
343    use the `-z text' option when building a shared library, you will get
344    errors unless the .ctors and .dtors sections are marked as writable
345    via the SHF_WRITE attribute.)  */
346
347 #undef  CTORS_SECTION_ASM_OP
348 #define CTORS_SECTION_ASM_OP    "\t.section\t.ctors,\"aw\""
349 #undef  DTORS_SECTION_ASM_OP
350 #define DTORS_SECTION_ASM_OP    "\t.section\t.dtors,\"aw\""
351
352 /* On SVR4, we *do* have support for the .init and .fini sections, and we
353    can put stuff in there to be executed before and after `main'.  We let
354    crtstuff.c and other files know this by defining the following symbols.
355    The definitions say how to change sections to the .init and .fini
356    sections.  This is the same for all known SVR4 assemblers.  */
357
358 #undef  INIT_SECTION_ASM_OP
359 #define INIT_SECTION_ASM_OP     "\t.section\t.init"
360 #undef  FINI_SECTION_ASM_OP
361 #define FINI_SECTION_ASM_OP     "\t.section\t.fini"
362
363 /* A default list of other sections which we might be "in" at any given
364    time.  For targets that use additional sections (e.g. .tdesc) you
365    should override this definition in the target-specific file which
366    includes this file.  */
367
368 #undef  EXTRA_SECTIONS
369 #define EXTRA_SECTIONS  in_const, in_ctors, in_dtors
370
371 /* A default list of extra section function definitions.  For targets
372    that use additional sections (e.g. .tdesc) you should override this
373    definition in the target-specific file which includes this file.  */
374
375 #undef  EXTRA_SECTION_FUNCTIONS
376 #define EXTRA_SECTION_FUNCTIONS                                         \
377   CONST_SECTION_FUNCTION                                                \
378   CTORS_SECTION_FUNCTION                                                \
379   DTORS_SECTION_FUNCTION
380
381 #undef  READONLY_DATA_SECTION
382 #define READONLY_DATA_SECTION() const_section ()
383
384 extern void text_section ();
385
386 #undef  CONST_SECTION_FUNCTION
387 #define CONST_SECTION_FUNCTION                                          \
388   void                                                                  \
389   const_section ()                                                      \
390   {                                                                     \
391     if (!USE_CONST_SECTION)                                             \
392       text_section();                                                   \
393     else if (in_section != in_const)                                    \
394       {                                                                 \
395         fprintf (asm_out_file, "%s\n", CONST_SECTION_ASM_OP);           \
396         in_section = in_const;                                          \
397       }                                                                 \
398   }
399
400 #undef  CTORS_SECTION_FUNCTION
401 #define CTORS_SECTION_FUNCTION                                          \
402   void                                                                  \
403   ctors_section ()                                                      \
404   {                                                                     \
405     if (in_section != in_ctors)                                         \
406       {                                                                 \
407         fprintf (asm_out_file, "%s\n", CTORS_SECTION_ASM_OP);           \
408         in_section = in_ctors;                                          \
409       }                                                                 \
410   }
411
412 #undef  DTORS_SECTION_FUNCTION
413 #define DTORS_SECTION_FUNCTION                                          \
414   void                                                                  \
415   dtors_section ()                                                      \
416   {                                                                     \
417     if (in_section != in_dtors)                                         \
418       {                                                                 \
419         fprintf (asm_out_file, "%s\n", DTORS_SECTION_ASM_OP);           \
420         in_section = in_dtors;                                          \
421       }                                                                 \
422   }
423
424 /* A C statement or statements to switch to the appropriate
425    section for output of RTX in mode MODE.  RTX is some kind
426    of constant in RTL.  The argument MODE is redundant except
427    in the case of a `const_int' rtx.  Currently, these always
428    go into the const section.  */
429
430 #undef  SELECT_RTX_SECTION
431 #define SELECT_RTX_SECTION(MODE, RTX)   const_section()
432
433 /* Define the strings used for the special svr4/ELF .type and .size
434    directives.  These strings generally do not vary from one svr4/ELF
435    system to another.  */
436
437 #undef  TYPE_ASM_OP
438 #define TYPE_ASM_OP     "\t.type\t"
439 #undef  SIZE_ASM_OP
440 #define SIZE_ASM_OP     "\t.size\t"
441
442 /* This is how we tell the assembler that a symbol is weak.  */
443
444 #undef  ASM_WEAKEN_LABEL
445 #define ASM_WEAKEN_LABEL(FILE, NAME)                                    \
446   do {                                                                  \
447     fputs ("\t.globl\t", (FILE)); assemble_name ((FILE), (NAME));       \
448     fputc ('\n', (FILE));                                               \
449     fputs ("\t.weak\t", (FILE)); assemble_name ((FILE), (NAME));        \
450     fputc ('\n', (FILE));                                               \
451   } while (0)
452
453 /* The following macro defines the [default] format used with ELF to output
454    the second operand of the .type assembler directive.  */
455
456 #undef  TYPE_OPERAND_FMT
457 #define TYPE_OPERAND_FMT        "@%s"
458
459 /* Write the extra assembler code needed to declare a function's result.
460    Most svr4/ELF assemblers don't require any special declaration of the
461    result value.  */
462
463 #undef  ASM_DECLARE_RESULT
464 #define ASM_DECLARE_RESULT(FILE, RESULT)
465
466 /* These macros generate the special .type and .size directives which
467    are used to set the corresponding fields of the linker symbol table
468    entries in an ELF object file under SVR4/ELF.  These macros also output
469    the starting labels for the relevant functions/objects.  */
470
471 /* Write the extra assembler code needed to declare an object properly.  */
472
473 #undef  ASM_DECLARE_OBJECT_NAME
474 #define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL)                       \
475   do {                                                                  \
476     fprintf (FILE, "%s ", TYPE_ASM_OP);                                 \
477     assemble_name (FILE, NAME);                                         \
478     putc (',', FILE);                                                   \
479     fprintf (FILE, TYPE_OPERAND_FMT, "object");                         \
480     putc ('\n', FILE);                                                  \
481     size_directive_output = 0;                                          \
482     if (!flag_inhibit_size_directive && DECL_SIZE (DECL))               \
483       {                                                                 \
484         size_directive_output = 1;                                      \
485         fprintf (FILE, "%s ", SIZE_ASM_OP);                             \
486         assemble_name (FILE, NAME);                                     \
487         putc (',', FILE);                                               \
488         fprintf (FILE, HOST_WIDE_INT_PRINT_DEC,                         \
489                  int_size_in_bytes (TREE_TYPE (DECL)));                 \
490         fputc ('\n', FILE);                                             \
491       }                                                                 \
492     ASM_OUTPUT_LABEL(FILE, NAME);                                       \
493   } while (0)
494
495 /* Output the size directive for a decl in rest_of_decl_compilation
496    in the case where we did not do so before the initializer.
497    Once we find the error_mark_node, we know that the value of
498    size_directive_output was set
499    by ASM_DECLARE_OBJECT_NAME when it was run for the same decl.  */
500
501 #undef  ASM_FINISH_DECLARE_OBJECT
502 #define ASM_FINISH_DECLARE_OBJECT(FILE, DECL, TOP_LEVEL, AT_END)        \
503   do {                                                                  \
504     char *name = XSTR (XEXP (DECL_RTL (DECL), 0), 0);                   \
505     if (!flag_inhibit_size_directive && DECL_SIZE (DECL)                \
506         && ! AT_END && TOP_LEVEL                                        \
507         && DECL_INITIAL (DECL) == error_mark_node                       \
508         && !size_directive_output)                                      \
509       {                                                                 \
510         size_directive_output = 1;                                      \
511         fprintf (FILE, "%s ", SIZE_ASM_OP);                             \
512         assemble_name (FILE, name);                                     \
513         putc (',', FILE);                                               \
514         fprintf (FILE, HOST_WIDE_INT_PRINT_DEC,                         \
515                 int_size_in_bytes (TREE_TYPE (DECL)));                  \
516         fputc ('\n', FILE);                                             \
517       }                                                                 \
518   } while (0)
519
520
521 /************************[  Debugger stuff  ]*********************************/
522
523 /* All ELF targets can support DWARF-2.  */
524 #undef  DWARF2_DEBUGGING_INFO
525 #define DWARF2_DEBUGGING_INFO
526
527 /* This is BSD, so we want the DBX format.  */
528 #undef  DBX_DEBUGGING_INFO
529 #define DBX_DEBUGGING_INFO
530
531 /* This is BSD, so use stabs instead of DWARF debug format.  */
532 #undef  PREFERRED_DEBUGGING_TYPE
533 #define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
534
535 /* But allow STABS to be supported as well.
536         Note that we want to override some definition settings done for some
537         architecture's native OS's tools that don't apply to us.  */
538 #undef ASM_IDENTIFY_GCC
539 #undef ASM_IDENTIFY_LANGUAGE