freebsd.h revision 52112
1/* Definitions for Intel 386 running FreeBSD with either a.out or ELF format
2   Copyright (C) 1996 Free Software Foundation, Inc.
3   Contributed by Eric Youngdale.
4   Modified for stabs-in-ELF by H.J. Lu.
5   Adapted from GNU/Linux version by John Polstra.
6   Added support for generating "old a.out gas" on the fly by Peter Wemm.
7   Continued development by David O'Brien <obrien@freebsd.org>
8
9This file is part of GNU CC.
10
11GNU CC is free software; you can redistribute it and/or modify
12it under the terms of the GNU General Public License as published by
13the Free Software Foundation; either version 2, or (at your option)
14any later version.
15
16GNU CC is distributed in the hope that it will be useful,
17but WITHOUT ANY WARRANTY; without even the implied warranty of
18MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19GNU General Public License for more details.
20
21You should have received a copy of the GNU General Public License
22along with GNU CC; see the file COPYING.  If not, write to
23the Free Software Foundation, 59 Temple Place - Suite 330,
24Boston, MA 02111-1307, USA.  */
25
26/* $FreeBSD: head/contrib/gcc/config/i386/freebsd.h 52112 1999-10-10 22:33:40Z obrien $ */
27
28
29#undef TARGET_VERSION
30#define TARGET_VERSION fprintf (stderr, " (i386 FreeBSD/ELF)");
31
32#define MASK_PROFILER_EPILOGUE	010000000000
33#define MASK_AOUT		004000000000	/* a.out not elf */
34#define MASK_UNDERSCORES	002000000000	/* use leading _ */
35
36#define TARGET_PROFILER_EPILOGUE	(target_flags & MASK_PROFILER_EPILOGUE)
37#define TARGET_AOUT			(target_flags & MASK_AOUT)
38#define TARGET_ELF			((target_flags & MASK_AOUT) == 0)
39#define TARGET_UNDERSCORES		((target_flags & MASK_UNDERSCORES) != 0)
40
41#undef	SUBTARGET_SWITCHES
42#define SUBTARGET_SWITCHES						\
43     { "profiler-epilogue",	 MASK_PROFILER_EPILOGUE},		\
44     { "no-profiler-epilogue",	-MASK_PROFILER_EPILOGUE},		\
45     { "aout",			 MASK_AOUT},				\
46     { "no-aout",		-MASK_AOUT},				\
47     { "underscores",		 MASK_UNDERSCORES},			\
48     { "no-underscores",	-MASK_UNDERSCORES},
49
50/* Prefix for internally generated assembler labels.  If we aren't using
51   underscores, we are using prefix `.'s to identify labels that should
52   be ignored, as in `i386/gas.h' --karl@cs.umb.edu  */
53#undef  LPREFIX
54#define LPREFIX ((TARGET_UNDERSCORES) ? "L" : ".L")
55
56/* Override the default comment-starter of "/".  */
57#undef ASM_COMMENT_START
58#define ASM_COMMENT_START "#"
59
60#undef ASM_APP_ON
61#define ASM_APP_ON "#APP\n"
62
63#undef ASM_APP_OFF
64#define ASM_APP_OFF "#NO_APP\n"
65
66#undef SET_ASM_OP
67#define SET_ASM_OP	".set"
68
69/* Output at beginning of assembler file.  */
70/* The .file command should always begin the output.  */
71
72#undef ASM_FILE_START
73#define ASM_FILE_START(FILE)						\
74  do {									\
75        output_file_directive ((FILE), main_input_filename);		\
76	if (TARGET_ELF)							\
77          fprintf ((FILE), "\t.version\t\"01.01\"\n");			\
78  } while (0)
79
80/* Identify the front-end which produced this file.  To keep symbol
81   space down, and not confuse kdb, only do this if the language is
82   not C. (svr4.h defines ASM_IDENTIFY_GCC but neglects this) */
83#undef ASM_IDENTIFY_LANGUAGE
84#define ASM_IDENTIFY_LANGUAGE(STREAM)					\
85{									\
86  if (strcmp (lang_identify (), "c") != 0)				\
87    output_lang_identify (STREAM);					\
88}
89
90/* This is how to store into the string BUF
91   the symbol_ref name of an internal numbered label where
92   PREFIX is the class of label and NUM is the number within the class.
93   This is suitable for output with `assemble_name'.  */
94#undef	ASM_GENERATE_INTERNAL_LABEL
95#define ASM_GENERATE_INTERNAL_LABEL(BUF,PREFIX,NUMBER)			\
96    sprintf ((BUF), "*%s%s%d", (TARGET_UNDERSCORES) ? "" : ".",		\
97	     (PREFIX), (NUMBER))
98
99/* This is how to output an internal numbered label where
100   PREFIX is the class of label and NUM is the number within the class.  */
101#undef	ASM_OUTPUT_INTERNAL_LABEL
102#define	ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM)			\
103  fprintf ((FILE), "%s%s%d:\n", (TARGET_UNDERSCORES) ? "" : ".",	\
104	   (PREFIX), (NUM))
105
106/* This is how to output a reference to a user-level label named NAME.  */
107#undef  ASM_OUTPUT_LABELREF
108#define ASM_OUTPUT_LABELREF(FILE, NAME)					\
109  fprintf ((FILE), "%s%s", (TARGET_UNDERSCORES) ? "_" : "", (NAME))
110
111
112/* This is how to output an element of a case-vector that is relative.
113   This is only used for PIC code.  See comments by the `casesi' insn in
114   i386.md for an explanation of the expression this outputs. */
115#undef ASM_OUTPUT_ADDR_DIFF_ELT
116#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \
117  fprintf ((FILE), "\t.long _GLOBAL_OFFSET_TABLE_+[.-%s%d]\n", LPREFIX, (VALUE))
118
119#undef ASM_OUTPUT_ALIGN
120#define ASM_OUTPUT_ALIGN(FILE, LOG)      				\
121  if ((LOG)!=0) {							\
122    if (in_text_section())						\
123      fprintf ((FILE), "\t.p2align %d,0x90\n", (LOG));			\
124    else								\
125      fprintf ((FILE), "\t.p2align %d\n", (LOG));			\
126  }
127
128/* conditionalize the use of ".section rodata" on elf mode - otherwise .text */
129#undef USE_CONST_SECTION
130#define USE_CONST_SECTION	TARGET_ELF
131
132/* The a.out tools do not support "linkonce" sections. */
133#undef SUPPORTS_ONE_ONLY
134#define SUPPORTS_ONE_ONLY	TARGET_ELF
135
136/* The a.out tools do not support "Lscope" .stabs symbols. */
137#undef NO_DBX_FUNCTION_END
138#define NO_DBX_FUNCTION_END	TARGET_AOUT
139
140/* A C statement (sans semicolon) to output an element in the table of
141   global constructors.  */
142#undef ASM_OUTPUT_CONSTRUCTOR
143#define ASM_OUTPUT_CONSTRUCTOR(FILE, NAME)				\
144  do {									\
145    if (TARGET_ELF) {							\
146      ctors_section ();							\
147      fprintf ((FILE), "\t%s\t ", INT_ASM_OP);				\
148      assemble_name ((FILE), (NAME));					\
149      fprintf ((FILE), "\n");						\
150    } else {								\
151      fprintf (asm_out_file, "%s \"%s__CTOR_LIST__\",22,0,0,", ASM_STABS_OP, \
152	       (TARGET_UNDERSCORES) ? "_" : "");			\
153      assemble_name (asm_out_file, name);				\
154      fputc ('\n', asm_out_file);					\
155    }									\
156  } while (0)
157
158/* A C statement (sans semicolon) to output an element in the table of
159   global destructors.  */
160#undef ASM_OUTPUT_DESTRUCTOR
161#define ASM_OUTPUT_DESTRUCTOR(FILE, NAME)				\
162  do {									\
163    if (TARGET_ELF) {							\
164      dtors_section ();							\
165      fprintf ((FILE), "\t%s\t ", INT_ASM_OP);				\
166      assemble_name ((FILE), (NAME));					\
167      fprintf ((FILE), "\n");						\
168    } else {								\
169      fprintf (asm_out_file, "%s \"%s__DTOR_LIST__\",22,0,0,", ASM_STABS_OP, \
170	       (TARGET_UNDERSCORES) ? "_" : "");			\
171      assemble_name (asm_out_file, name);				\
172      fputc ('\n', asm_out_file);					\
173    }									\
174  } while (0)
175
176/* This says how to output assembler code to declare an
177   uninitialized internal linkage data object.  Under SVR4,
178   the linker seems to want the alignment of data objects
179   to depend on their types.  We do exactly that here.  */
180
181#undef ASM_OUTPUT_ALIGNED_LOCAL
182#define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN)		\
183do {									\
184  if (TARGET_ELF) {							\
185    fprintf ((FILE), "\t%s\t", LOCAL_ASM_OP);				\
186    assemble_name ((FILE), (NAME));					\
187    fprintf ((FILE), "\n");						\
188    ASM_OUTPUT_ALIGNED_COMMON ((FILE), (NAME), (SIZE), (ALIGN));	\
189  } else {								\
190    int rounded = (SIZE);						\
191    if (rounded == 0) rounded = 1;					\
192    rounded += (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1;			\
193    rounded = (rounded / (BIGGEST_ALIGNMENT / BITS_PER_UNIT)		\
194			   * (BIGGEST_ALIGNMENT / BITS_PER_UNIT));	\
195    fputs (".lcomm ", (FILE));						\
196    assemble_name ((FILE), (NAME));					\
197    fprintf ((FILE), ",%u\n", (rounded));				\
198  }									\
199} while (0)
200
201#undef ASM_OUTPUT_ALIGNED_COMMON
202#define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN)		\
203do {									\
204  if (TARGET_ELF) {							\
205    fprintf ((FILE), "\t%s\t", COMMON_ASM_OP);				\
206    assemble_name ((FILE), (NAME));					\
207    fprintf ((FILE), ",%u,%u\n", (SIZE), (ALIGN) / BITS_PER_UNIT);	\
208  } else {								\
209    int rounded = (SIZE);						\
210    if (rounded == 0) rounded = 1;					\
211    rounded += (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1;			\
212    rounded = (rounded / (BIGGEST_ALIGNMENT / BITS_PER_UNIT)		\
213			   * (BIGGEST_ALIGNMENT / BITS_PER_UNIT));	\
214    fputs (".comm ", (FILE));						\
215    assemble_name ((FILE), (NAME));					\
216    fprintf ((FILE), ",%u\n", (rounded));				\
217  }									\
218} while (0)
219
220/* Turn off svr4.h version, it chokes the old gas.  The old layout
221   works fine under new gas anyway. */
222#undef ASM_OUTPUT_ASCII
223
224/* How to output some space */
225#undef ASM_OUTPUT_SKIP
226#define ASM_OUTPUT_SKIP(FILE, SIZE) 					\
227do {									\
228  if (TARGET_ELF) {							\
229    fprintf ((FILE), "\t%s\t%u\n", SKIP_ASM_OP, (SIZE));		\
230  } else {								\
231    fprintf ((FILE), "\t.space %u\n", (SIZE));				\
232  }									\
233} while (0)
234
235#undef ASM_OUTPUT_SOURCE_LINE
236#define ASM_OUTPUT_SOURCE_LINE(FILE, LINE)				\
237do {									\
238  static int sym_lineno = 1;						\
239  if (TARGET_ELF) {							\
240    fprintf ((FILE), ".stabn 68,0,%d,.LM%d-", (LINE), sym_lineno);	\
241    assemble_name ((FILE), XSTR (XEXP (DECL_RTL (current_function_decl),\
242                   0), 0));						\
243    fprintf ((FILE), "\n.LM%d:\n", sym_lineno);				\
244    sym_lineno += 1;							\
245  } else {								\
246    fprintf ((FILE), "\t%s %d,0,%d\n", ASM_STABD_OP, N_SLINE, lineno);	\
247  }									\
248} while (0)
249
250/* in elf, the function stabs come first, before the relative offsets */
251#undef DBX_FUNCTION_FIRST
252#define DBX_CHECK_FUNCTION_FIRST TARGET_ELF
253
254/* tag end of file in elf mode */
255#undef DBX_OUTPUT_MAIN_SOURCE_FILE_END
256#define DBX_OUTPUT_MAIN_SOURCE_FILE_END(FILE, FILENAME)			\
257do {									\
258  if (TARGET_ELF) {							\
259    fprintf ((FILE), "\t.text\n\t.stabs \"\",%d,0,0,.Letext\n.Letext:\n", \
260             N_SO);							\
261  }									\
262} while (0)
263
264/* stabs-in-elf has offsets relative to function beginning */
265#undef DBX_OUTPUT_LBRAC
266#define DBX_OUTPUT_LBRAC(FILE, NAME)					\
267do {									\
268  fprintf (asmfile, "%s %d,0,0,", ASM_STABN_OP, N_LBRAC);		\
269  assemble_name (asmfile, buf);						\
270  if (TARGET_ELF) {							\
271    fputc ('-', asmfile);						\
272    assemble_name (asmfile, XSTR (XEXP (DECL_RTL (current_function_decl),\
273                   0), 0));						\
274  }									\
275  fprintf (asmfile, "\n");						\
276} while (0)
277
278#undef DBX_OUTPUT_RBRAC
279#define DBX_OUTPUT_RBRAC(FILE, NAME)					\
280do {									\
281  fprintf (asmfile, "%s %d,0,0,", ASM_STABN_OP, N_RBRAC);		\
282  assemble_name (asmfile, buf);						\
283  if (TARGET_ELF) {							\
284    fputc ('-', asmfile);						\
285    assemble_name (asmfile, XSTR (XEXP (DECL_RTL (current_function_decl),\
286                   0), 0));						\
287  }									\
288  fprintf (asmfile, "\n");						\
289} while (0)
290
291
292/* Define macro used to output shift-double opcodes when the shift
293   count is in %cl.  Some assemblers require %cl as an argument;
294   some don't.
295
296   *OLD* GAS requires the %cl argument, so override i386/unix.h. */
297
298#undef AS3_SHIFT_DOUBLE
299#define AS3_SHIFT_DOUBLE(a,b,c,d) AS3 (a,b,c,d)
300
301/* Indicate that jump tables go in the text section.  This is
302   necessary when compiling PIC code.  */
303#undef JUMP_TABLES_IN_TEXT_SECTION
304#define JUMP_TABLES_IN_TEXT_SECTION (flag_pic)
305
306/* override the exception table positioning */
307#undef EXCEPTION_SECTION
308#define EXCEPTION_SECTION() \
309do {									\
310  if (TARGET_ELF) {							\
311    named_section (NULL_TREE, ".gcc_except_table", 0);			\
312  } else {								\
313    if (flag_pic)							\
314      data_section ();							\
315    else								\
316      readonly_data_section ();						\
317  }									\
318} while (0);
319
320/* supply our own hook for calling __main() from main() */
321#undef GEN_CALL__MAIN
322#define GEN_CALL__MAIN \
323  do {									\
324    if (!(TARGET_ELF))							\
325      emit_library_call (gen_rtx (SYMBOL_REF, Pmode, NAME__MAIN), 0,	\
326			 VOIDmode, 0);					\
327  } while (0)
328
329/* Copy this from the svr4 specifications... */
330/* Define the register numbers to be used in Dwarf debugging information.
331   The SVR4 reference port C compiler uses the following register numbers
332   in its Dwarf output code:
333	0 for %eax (gnu regno = 0)
334	1 for %ecx (gnu regno = 2)
335	2 for %edx (gnu regno = 1)
336	3 for %ebx (gnu regno = 3)
337	4 for %esp (gnu regno = 7)
338	5 for %ebp (gnu regno = 6)
339	6 for %esi (gnu regno = 4)
340	7 for %edi (gnu regno = 5)
341   The following three DWARF register numbers are never generated by
342   the SVR4 C compiler or by the GNU compilers, but SDB on x86/svr4
343   believes these numbers have these meanings.
344	8  for %eip    (no gnu equivalent)
345	9  for %eflags (no gnu equivalent)
346	10 for %trapno (no gnu equivalent)
347   It is not at all clear how we should number the FP stack registers
348   for the x86 architecture.  If the version of SDB on x86/svr4 were
349   a bit less brain dead with respect to floating-point then we would
350   have a precedent to follow with respect to DWARF register numbers
351   for x86 FP registers, but the SDB on x86/svr4 is so completely
352   broken with respect to FP registers that it is hardly worth thinking
353   of it as something to strive for compatibility with.
354   The version of x86/svr4 SDB I have at the moment does (partially)
355   seem to believe that DWARF register number 11 is associated with
356   the x86 register %st(0), but that's about all.  Higher DWARF
357   register numbers don't seem to be associated with anything in
358   particular, and even for DWARF regno 11, SDB only seems to under-
359   stand that it should say that a variable lives in %st(0) (when
360   asked via an `=' command) if we said it was in DWARF regno 11,
361   but SDB still prints garbage when asked for the value of the
362   variable in question (via a `/' command).
363   (Also note that the labels SDB prints for various FP stack regs
364   when doing an `x' command are all wrong.)
365   Note that these problems generally don't affect the native SVR4
366   C compiler because it doesn't allow the use of -O with -g and
367   because when it is *not* optimizing, it allocates a memory
368   location for each floating-point variable, and the memory
369   location is what gets described in the DWARF AT_location
370   attribute for the variable in question.
371   Regardless of the severe mental illness of the x86/svr4 SDB, we
372   do something sensible here and we use the following DWARF
373   register numbers.  Note that these are all stack-top-relative
374   numbers.
375	11 for %st(0) (gnu regno = 8)
376	12 for %st(1) (gnu regno = 9)
377	13 for %st(2) (gnu regno = 10)
378	14 for %st(3) (gnu regno = 11)
379	15 for %st(4) (gnu regno = 12)
380	16 for %st(5) (gnu regno = 13)
381	17 for %st(6) (gnu regno = 14)
382	18 for %st(7) (gnu regno = 15)
383*/
384#undef DWARF_DBX_REGISTER_NUMBER
385#define DWARF_DBX_REGISTER_NUMBER(n) \
386((n) == 0 ? 0 \
387 : (n) == 1 ? 2 \
388 : (n) == 2 ? 1 \
389 : (n) == 3 ? 3 \
390 : (n) == 4 ? 6 \
391 : (n) == 5 ? 7 \
392 : (n) == 6 ? 5 \
393 : (n) == 7 ? 4 \
394 : ((n) >= FIRST_STACK_REG && (n) <= LAST_STACK_REG) ? (n)+3 \
395 : (-1))
396
397/* Now what stabs expects in the register.  */
398#undef STABS_DBX_REGISTER_NUMBER
399#define STABS_DBX_REGISTER_NUMBER(n) \
400((n) == 0 ? 0 : \
401 (n) == 1 ? 2 : \
402 (n) == 2 ? 1 : \
403 (n) == 3 ? 3 : \
404 (n) == 4 ? 6 : \
405 (n) == 5 ? 7 : \
406 (n) == 6 ? 4 : \
407 (n) == 7 ? 5 : \
408 (n) + 4)
409
410#undef  DBX_REGISTER_NUMBER
411#define DBX_REGISTER_NUMBER(n)	((write_symbols == DWARF_DEBUG)	\
412				? DWARF_DBX_REGISTER_NUMBER(n)	\
413				: STABS_DBX_REGISTER_NUMBER(n))
414
415/* Tell final.c that we don't need a label passed to mcount.  */
416#define NO_PROFILE_DATA
417
418/* Output assembler code to FILE to increment profiler label # LABELNO
419   for profiling a function entry.  */
420/* Redefine this to not pass an unused label in %edx.  */
421
422#undef FUNCTION_PROFILER
423#define FUNCTION_PROFILER(FILE, LABELNO)  \
424{									\
425  if (flag_pic)								\
426    {									\
427      fprintf ((FILE), "\tcall *%s@GOT(%%ebx)\n",			\
428      TARGET_AOUT ? "mcount" : ".mcount");				\
429    }									\
430  else									\
431    {									\
432      fprintf ((FILE), "\tcall %s\n", TARGET_AOUT ? "mcount" : ".mcount"); \
433    }									\
434}
435
436#undef FUNCTION_PROFILER_EPILOGUE
437#define FUNCTION_PROFILER_EPILOGUE(FILE)  \
438{									\
439  if (TARGET_PROFILER_EPILOGUE)						\
440    {									\
441      if (flag_pic)							\
442	fprintf ((FILE), "\tcall *%s@GOT(%%ebx)\n",			\
443	  TARGET_AOUT ? "mexitcount" : ".mexitcount");			\
444      else								\
445	fprintf ((FILE), "\tcall %s\n",					\
446	  TARGET_AOUT ? "mexitcount" : ".mexitcount");			\
447    }									\
448}
449
450#undef SIZE_TYPE
451#define SIZE_TYPE "unsigned int"
452
453#undef PTRDIFF_TYPE
454#define PTRDIFF_TYPE "int"
455
456#undef WCHAR_TYPE
457#define WCHAR_TYPE "int"
458
459#undef WCHAR_UNSIGNED
460#define WCHAR_UNSIGNED 0
461
462#undef WCHAR_TYPE_SIZE
463#define WCHAR_TYPE_SIZE BITS_PER_WORD
464
465#undef CPP_PREDEFINES
466#define CPP_PREDEFINES "-Di386 -Acpu(i386) -Amachine(i386)" CPP_FBSD_PREDEFINES
467
468#undef CPP_SPEC
469#if TARGET_CPU_DEFAULT == 2
470#define CPP_SPEC "\
471%{!maout: -D__ELF__} \
472%{munderscores: -D__UNDERSCORES__} \
473%{maout: %{!mno-underscores: -D__UNDERSCORES__}} \
474%{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{!m386:-D__i486__}"
475#else
476#define CPP_SPEC "\
477%{!maout: -D__ELF__} \
478%{munderscores: -D__UNDERSCORES__} \
479%{maout: %{!mno-underscores: -D__UNDERSCORES__}} \
480%{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{m486:-D__i486__}"
481#endif
482
483#undef CC1_SPEC
484#define CC1_SPEC "\
485%{gline:%{!g:%{!g0:%{!g1:%{!g2: -g1}}}}} \
486%{maout: %{!mno-underscores: %{!munderscores: -munderscores }}}"
487
488#undef  ASM_SPEC
489#define ASM_SPEC	"%{v*: -v} %{maout: %{fpic:-k} %{fPIC:-k}}"
490
491/* Provide a LINK_SPEC appropriate for FreeBSD.  Here we provide support
492   for the special GCC options -static and -shared, which allow us to
493   link things in one of these three modes by applying the appropriate
494   combinations of options at link-time. We like to support here for
495   as many of the other GNU linker options as possible. But I don't
496   have the time to search for those flags. I am sure how to add
497   support for -soname shared_object_name. H.J.
498
499   I took out %{v:%{!V:-V}}. It is too much :-(. They can use
500   -Wl,-V.
501
502   When the -shared link option is used a final link is not being
503   done.  */
504
505#undef	LINK_SPEC
506#define LINK_SPEC "\
507 %{p:%e`-p' not supported; use `-pg' and gprof(1)} \
508  %{maout: %{shared:-Bshareable} \
509    %{!shared:%{!nostdlib:%{!r:%{!e*:-e start}}} -dc -dp %{static:-Bstatic} \
510      %{pg:-Bstatic} %{Z}} \
511    %{assert*} %{R*}} \
512  %{!maout: \
513    -m elf_i386 \
514    %{Wl,*:%*} \
515    %{assert*} %{R*} %{rpath*} %{defsym*} \
516    %{shared:-Bshareable %{h*} %{soname*}} \
517    %{symbolic:-Bsymbolic} \
518    %{!shared: \
519      %{!static: \
520	%{rdynamic: -export-dynamic} \
521	%{!dynamic-linker: -dynamic-linker /usr/libexec/ld-elf.so.1}} \
522      %{static:-Bstatic}}}"
523
524/* A C statement to output to the stdio stream FILE an assembler
525   command to advance the location counter to a multiple of 1<<LOG
526   bytes if it is within MAX_SKIP bytes.
527
528   This is used to align code labels according to Intel recommendations.  */
529
530#ifdef HAVE_GAS_MAX_SKIP_P2ALIGN
531#error "we don't have this for the aout gas"
532#define ASM_OUTPUT_MAX_SKIP_ALIGN(FILE, LOG, MAX_SKIP) 			\
533  if ((LOG)!=0)								\
534    if ((MAX_SKIP)==0) fprintf ((FILE), "\t.p2align %d\n", (LOG));	\
535    else fprintf ((FILE), "\t.p2align %d,,%d\n", (LOG), (MAX_SKIP))
536#endif
537
538#undef STARTFILE_SPEC
539#define STARTFILE_SPEC "\
540  %{maout: %{shared:c++rt0.o%s} \
541    %{!shared:%{pg:gcrt0.o%s}%{!pg:%{static:scrt0.o%s}%{!static:crt0.o%s}}}} \
542  %{!maout:  %{!shared: \
543    %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:crt1.o%s}}} \
544    crti.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}}"
545
546#undef  ENDFILE_SPEC
547#define ENDFILE_SPEC \
548  "%{!maout: %{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s}"
549
550/* This goes away when the math emulator is fixed.  */
551#undef TARGET_DEFAULT
552#define TARGET_DEFAULT	(MASK_NO_FANCY_MATH_387 | 0301)
553
554/* FreeBSD ELF using our home-grown crtbegin.o/crtend.o does not support the
555   DWARF2 unwinding mechanisms.  Once `make world' bootstraping problems with
556   the EGCS crtstuff.c is overcome, we will switch to the non-sjlj-exceptions
557   type exception machanism.  */
558#define DWARF2_UNWIND_INFO 0
559