freebsd.h revision 95810
134229Speter/* Definitions for Intel 386 running FreeBSD with either a.out or ELF format
295349Sobrien   Copyright (C) 1996, 2000, 2002 Free Software Foundation, Inc.
334229Speter   Contributed by Eric Youngdale.
434229Speter   Modified for stabs-in-ELF by H.J. Lu.
551408Sobrien   Adapted from GNU/Linux version by John Polstra.
634229Speter   Added support for generating "old a.out gas" on the fly by Peter Wemm.
752112Sobrien   Continued development by David O'Brien <obrien@freebsd.org>
818334Speter
918334SpeterThis file is part of GNU CC.
1018334Speter
1118334SpeterGNU CC is free software; you can redistribute it and/or modify
1218334Speterit under the terms of the GNU General Public License as published by
1318334Speterthe Free Software Foundation; either version 2, or (at your option)
1418334Speterany later version.
1518334Speter
1618334SpeterGNU CC is distributed in the hope that it will be useful,
1718334Speterbut WITHOUT ANY WARRANTY; without even the implied warranty of
1818334SpeterMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1918334SpeterGNU General Public License for more details.
2018334Speter
2118334SpeterYou should have received a copy of the GNU General Public License
2218334Speteralong with GNU CC; see the file COPYING.  If not, write to
2318334Speterthe Free Software Foundation, 59 Temple Place - Suite 330,
2418334SpeterBoston, MA 02111-1307, USA.  */
2518334Speter
2651408Sobrien/* $FreeBSD: head/contrib/gcc/config/i386/freebsd.h 95810 2002-04-30 17:15:01Z obrien $ */
2718334Speter
2895810Sobrien#undef  TARGET_VERSION
2995810Sobrien#define TARGET_VERSION fprintf (stderr, " (i386 FreeBSD/ELF)");
3051408Sobrien
3158478Sobrien#undef  CC1_SPEC
3295810Sobrien#define CC1_SPEC "%(cc1_cpu) %{profile:-p} \
3358478Sobrien  %{gline:%{!g:%{!g0:%{!g1:%{!g2: -g1}}}}} \
3458478Sobrien  %{maout: %{!mno-underscores: %{!munderscores: -munderscores }}}"
3551408Sobrien
3658478Sobrien#undef  ASM_SPEC
3758478Sobrien#define ASM_SPEC	"%{v*: -v} %{maout: %{fpic:-k} %{fPIC:-k}}"
3858478Sobrien
3995349Sobrien#undef  ASM_FINAL_SPEC
4058478Sobrien#define ASM_FINAL_SPEC	"%|"
4158478Sobrien
4258478Sobrien/* Provide a LINK_SPEC appropriate for FreeBSD.  Here we provide support
4358478Sobrien   for the special GCC options -static and -shared, which allow us to
4458478Sobrien   link things in one of these three modes by applying the appropriate
4558478Sobrien   combinations of options at link-time. We like to support here for
4658478Sobrien   as many of the other GNU linker options as possible. But I don't
4758478Sobrien   have the time to search for those flags. I am sure how to add
4858478Sobrien   support for -soname shared_object_name. H.J.
4958478Sobrien
5058478Sobrien   When the -shared link option is used a final link is not being
5158478Sobrien   done.  */
5258478Sobrien
5358478Sobrien#undef	LINK_SPEC
5458478Sobrien#define LINK_SPEC "\
5558478Sobrien %{p:%e`-p' not supported; use `-pg' and gprof(1)} \
5658478Sobrien  %{maout: %{shared:-Bshareable} \
5758478Sobrien    %{!shared:%{!nostdlib:%{!r:%{!e*:-e start}}} -dc -dp %{static:-Bstatic} \
5858478Sobrien      %{pg:-Bstatic} %{Z}} \
5958478Sobrien    %{assert*} %{R*}} \
6058478Sobrien  %{!maout: \
6158478Sobrien    %{Wl,*:%*} \
6295349Sobrien    %{v:-V} \
6358478Sobrien    %{assert*} %{R*} %{rpath*} %{defsym*} \
6458478Sobrien    %{shared:-Bshareable %{h*} %{soname*}} \
6558478Sobrien    %{!shared: \
6658478Sobrien      %{!static: \
6758478Sobrien	%{rdynamic: -export-dynamic} \
6858478Sobrien	%{!dynamic-linker: -dynamic-linker /usr/libexec/ld-elf.so.1}} \
6995349Sobrien      %{static:-Bstatic}} \
7095349Sobrien    %{symbolic:-Bsymbolic}}"
7158478Sobrien
7295349Sobrien/* Provide a STARTFILE_SPEC appropriate for FreeBSD.  Here we add the magical
7395349Sobrien   crtbegin.o file (see crtstuff.c) which provides part of the support for
7495349Sobrien   getting C++ file-scope static object constructed before entering `main'.  */
7595349Sobrien
7658478Sobrien#undef STARTFILE_SPEC
7758478Sobrien#define STARTFILE_SPEC "\
7858478Sobrien  %{maout: %{shared:c++rt0.o%s} \
7958478Sobrien    %{!shared: \
8058478Sobrien      %{pg:gcrt0.o%s}%{!pg: \
8158478Sobrien	%{static:scrt0.o%s} \
8258478Sobrien	%{!static:crt0.o%s}}}} \
8358478Sobrien  %{!maout: \
8458478Sobrien    %{!shared: \
8558478Sobrien      %{pg:gcrt1.o%s} \
8658478Sobrien      %{!pg: \
8758478Sobrien	%{p:gcrt1.o%s} \
8858478Sobrien	%{!p:crt1.o%s}}} \
8995349Sobrien    crti.o%s \
9095349Sobrien    %{!shared:crtbegin.o%s} \
9195349Sobrien    %{shared:crtbeginS.o%s}}"
9258478Sobrien
9358478Sobrien/* Provide an ENDFILE_SPEC appropriate for FreeBSD/i386.  Here we tack on our
9495349Sobrien   own magical crtend.o file (see crtstuff.c) which provides part of the
9558478Sobrien   support for getting C++ file-scope static object constructed before
9658478Sobrien   entering `main', followed by the normal "finalizer" file, `crtn.o'.  */
9758478Sobrien
9858478Sobrien#undef  ENDFILE_SPEC
9958478Sobrien#define ENDFILE_SPEC "\
10058478Sobrien  %{!maout: \
10158478Sobrien    %{!shared:crtend.o%s} \
10258478Sobrien    %{shared:crtendS.o%s} crtn.o%s}"
10358478Sobrien
10458478Sobrien
10558478Sobrien/************************[  Target stuff  ]***********************************/
10658478Sobrien
10795349Sobrien/* Define the actual types of some ANSI-mandated types.
10858478Sobrien   Needs to agree with <machine/ansi.h>.  GCC defaults come from c-decl.c,
10958478Sobrien   c-common.c, and config/<arch>/<arch>.h.  */
11058478Sobrien
11195349Sobrien#undef  SIZE_TYPE
11258478Sobrien#define SIZE_TYPE	"unsigned int"
11395349Sobrien
11495349Sobrien#undef  PTRDIFF_TYPE
11558478Sobrien#define PTRDIFF_TYPE	"int"
11658478Sobrien
11795349Sobrien#undef  WCHAR_TYPE_SIZE
11895349Sobrien#define WCHAR_TYPE_SIZE	BITS_PER_WORD
11995349Sobrien
12058478Sobrien#undef  TARGET_VERSION
12158478Sobrien#define TARGET_VERSION	fprintf (stderr, " (i386 FreeBSD/ELF)");
12258478Sobrien
12334229Speter#define MASK_PROFILER_EPILOGUE	010000000000
12434229Speter#define MASK_AOUT		004000000000	/* a.out not elf */
12534229Speter#define MASK_UNDERSCORES	002000000000	/* use leading _ */
12618349Speter
12734229Speter#define TARGET_PROFILER_EPILOGUE	(target_flags & MASK_PROFILER_EPILOGUE)
12834229Speter#define TARGET_AOUT			(target_flags & MASK_AOUT)
12934229Speter#define TARGET_ELF			((target_flags & MASK_AOUT) == 0)
13034229Speter#define TARGET_UNDERSCORES		((target_flags & MASK_UNDERSCORES) != 0)
13118349Speter
13234229Speter#undef	SUBTARGET_SWITCHES
13352112Sobrien#define SUBTARGET_SWITCHES						\
13468601Sobrien  { "profiler-epilogue",	 MASK_PROFILER_EPILOGUE, "Function profiler epilogue"}, \
13568601Sobrien  { "no-profiler-epilogue",	-MASK_PROFILER_EPILOGUE, "No function profiler epilogue"}, \
13668601Sobrien  { "aout",			 MASK_AOUT, "Generate an a.out (vs. ELF) binary"}, \
13768601Sobrien  { "no-aout",			-MASK_AOUT, "Do not generate an a.out binary"}, \
13868601Sobrien  { "underscores",		 MASK_UNDERSCORES, "Add leading underscores to symbols"}, \
13968601Sobrien  { "no-underscores",		-MASK_UNDERSCORES, "Do not add leading underscores to symbols"},
14018349Speter
14158478Sobrien/* This goes away when the math emulator is fixed.  */
14295810Sobrien#undef  TARGET_SUBTARGET_DEFAULT
14395810Sobrien#define TARGET_SUBTARGET_DEFAULT \
14458478Sobrien  (MASK_80387 | MASK_IEEE_FP | MASK_FLOAT_RETURNS | MASK_NO_FANCY_MATH_387)
14558478Sobrien
14695349Sobrien/* Don't default to pcc-struct-return, we want to retain compatibility with
14795349Sobrien   older gcc versions AND pcc-struct-return is nonreentrant.
14895349Sobrien   (even though the SVR4 ABI for the i386 says that records and unions are
14995349Sobrien   returned in memory).  */
15018349Speter
15195349Sobrien#undef  DEFAULT_PCC_STRUCT_RETURN
15295349Sobrien#define DEFAULT_PCC_STRUCT_RETURN 0
15395349Sobrien
15458478Sobrien/* The a.out tools do not support "linkonce" sections. */
15558478Sobrien#undef  SUPPORTS_ONE_ONLY
15658478Sobrien#define SUPPORTS_ONE_ONLY	TARGET_ELF
15718349Speter
15895349Sobrien/* Prefix for internally generated assembler labels.  If we aren't using
15995349Sobrien   underscores, we are using prefix `.'s to identify labels that should
16095349Sobrien   be ignored, as in `i386/gas.h' --karl@cs.umb.edu  */
16195349Sobrien#undef  LPREFIX
16295349Sobrien#define LPREFIX ((TARGET_UNDERSCORES) ? "L" : ".L")
16318349Speter
16458478Sobrien/* supply our own hook for calling __main() from main() */
16558478Sobrien#undef  INVOKE__main
16658478Sobrien#define INVOKE__main
16758478Sobrien#undef  GEN_CALL__MAIN
16858478Sobrien#define GEN_CALL__MAIN							\
16958478Sobrien  do {									\
17058478Sobrien    if (!(TARGET_ELF))							\
17158478Sobrien      emit_library_call (gen_rtx (SYMBOL_REF, Pmode, NAME__MAIN), 0,	\
17258478Sobrien			 VOIDmode, 0);					\
17358478Sobrien  } while (0)
17458478Sobrien
17558478Sobrien/* Tell final.c that we don't need a label passed to mcount.  */
17695810Sobrien#define NO_PROFILE_COUNTERS	1
17758478Sobrien
17858478Sobrien/* Output assembler code to FILE to begin profiling of the current function.
17958478Sobrien   LABELNO is an optional label.  */
18058478Sobrien
18158478Sobrien#undef  FUNCTION_PROFILER
18258478Sobrien#define FUNCTION_PROFILER(FILE, LABELNO)  \
18358478Sobrien  do {									\
18458478Sobrien    char *_name = TARGET_AOUT ? "mcount" : ".mcount";			\
18558478Sobrien    if (flag_pic)							\
18658478Sobrien      fprintf ((FILE), "\tcall *%s@GOT(%%ebx)\n", _name);		\
18758478Sobrien    else								\
18858478Sobrien      fprintf ((FILE), "\tcall %s\n", _name);				\
18958478Sobrien  } while (0)
19058478Sobrien
19158478Sobrien/* Output assembler code to FILE to end profiling of the current function.  */
19258478Sobrien
19395810Sobrien#undef  FUNCTION_PROFILER_EPILOGUE	/* BDE will need to fix this. */
19458478Sobrien
19558478Sobrien
19658478Sobrien/************************[  Assembler stuff  ]********************************/
19758478Sobrien
19895348Sobrien/* Override the default comment-starter of "/" from unix.h.  */
19995348Sobrien#undef  ASM_COMMENT_START
20095348Sobrien#define ASM_COMMENT_START "#"
20195348Sobrien
20258478Sobrien#undef  ASM_APP_ON
20358478Sobrien#define ASM_APP_ON	"#APP\n"
20458478Sobrien
20558478Sobrien#undef  ASM_APP_OFF
20695349Sobrien#define ASM_APP_OFF	"#NO_APP\n"
20758478Sobrien
20834229Speter/* This is how to store into the string BUF
20995349Sobrien   the symbol_ref name of an internal numbered label where
21095349Sobrien   PREFIX is the class of label and NUM is the number within the class.
21134229Speter   This is suitable for output with `assemble_name'.  */
21234229Speter#undef	ASM_GENERATE_INTERNAL_LABEL
21395810Sobrien#define ASM_GENERATE_INTERNAL_LABEL(LABEL, PREFIX, NUM)			\
21495810Sobrien  sprintf ((LABEL), "*%s%s%u", (TARGET_UNDERSCORES) ? "" : ".",		\
21595810Sobrien	   (PREFIX), (unsigned) (NUM))
21618349Speter
21734229Speter/* This is how to output an internal numbered label where
21858478Sobrien   PREFIX is the class of label and NUM is the number within the class.
21958478Sobrien   For most svr4/ELF systems, the convention is that any symbol which begins
22058478Sobrien   with a period is not put into the linker symbol table by the assembler.  */
22134229Speter#undef	ASM_OUTPUT_INTERNAL_LABEL
22295810Sobrien#define	ASM_OUTPUT_INTERNAL_LABEL(FILE, PREFIX, NUM)			\
22395810Sobrien  fprintf ((FILE), "%s%s%u:\n", (TARGET_UNDERSCORES) ? "" : ".",	\
22495810Sobrien	   (PREFIX), (unsigned) (NUM))
22518334Speter
22658478Sobrien/* This is how to output a reference to a user-level label named NAME.  */
22758478Sobrien#undef  ASM_OUTPUT_LABELREF
22858478Sobrien#define ASM_OUTPUT_LABELREF(FILE, NAME)					\
22958478Sobrien  do {									\
23058478Sobrien    char *_name = (NAME);						\
23158478Sobrien    /* Hack to avoid writing lots of rtl in				\
23258478Sobrien       FUNCTION_PROFILER_EPILOGUE ().  */				\
23358478Sobrien    if (*_name == '.' && strcmp(_name + 1, "mexitcount") == 0)		\
23458478Sobrien      {									\
23558478Sobrien	if (TARGET_AOUT)						\
23658478Sobrien	  _name++;							\
23758478Sobrien	if (flag_pic)							\
23858478Sobrien	  fprintf ((FILE), "*%s@GOT(%%ebx)", _name);			\
23958478Sobrien	else								\
24058478Sobrien	  fprintf ((FILE), "%s", _name);				\
24158478Sobrien      }									\
24258478Sobrien    else								\
24358478Sobrien      fprintf (FILE, "%s%s", TARGET_UNDERSCORES ? "_" : "", _name);	\
24458478Sobrien} while (0)
24558478Sobrien
24656810Sobrien/* This is how to hack on the symbol code of certain relcalcitrant
24756810Sobrien   symbols to modify their output in output_pic_addr_const ().  */
24856810Sobrien
24995810Sobrien#undef  ASM_HACK_SYMBOLREF_CODE	/* BDE will need to fix this. */
25056810Sobrien
25134229Speter/* This is how to output an element of a case-vector that is relative.
25234229Speter   This is only used for PIC code.  See comments by the `casesi' insn in
25334229Speter   i386.md for an explanation of the expression this outputs. */
25458478Sobrien#undef  ASM_OUTPUT_ADDR_DIFF_ELT
25558478Sobrien#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL)		\
25652112Sobrien  fprintf ((FILE), "\t.long _GLOBAL_OFFSET_TABLE_+[.-%s%d]\n", LPREFIX, (VALUE))
25718349Speter
25858478Sobrien#undef  ASM_OUTPUT_ALIGN
25952112Sobrien#define ASM_OUTPUT_ALIGN(FILE, LOG)      				\
26051408Sobrien  if ((LOG)!=0) {							\
26151408Sobrien    if (in_text_section())						\
26251408Sobrien      fprintf ((FILE), "\t.p2align %d,0x90\n", (LOG));			\
26351408Sobrien    else								\
26451408Sobrien      fprintf ((FILE), "\t.p2align %d\n", (LOG));			\
26551408Sobrien  }
26618349Speter
26773305Sobrien#undef  ASM_OUTPUT_ALIGNED_COMMON
26873305Sobrien#define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN)		\
26973305Sobrien  do {									\
27073305Sobrien    if (TARGET_ELF)							\
27173305Sobrien      {									\
27273305Sobrien	fprintf ((FILE), "%s", COMMON_ASM_OP);				\
27373305Sobrien	assemble_name ((FILE), (NAME));					\
27473305Sobrien	fprintf ((FILE), ",%u,%u\n", (SIZE), (ALIGN) / BITS_PER_UNIT);	\
27573305Sobrien      }									\
27673305Sobrien    else								\
27773305Sobrien      {									\
27873305Sobrien	int rounded = (SIZE);						\
27973305Sobrien	if (rounded == 0) rounded = 1;					\
28073305Sobrien	rounded += (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1;		\
28173305Sobrien	rounded = (rounded / (BIGGEST_ALIGNMENT / BITS_PER_UNIT)	\
28273305Sobrien		   * (BIGGEST_ALIGNMENT / BITS_PER_UNIT));		\
28373305Sobrien	fprintf ((FILE), "%s ", COMMON_ASM_OP);				\
28473305Sobrien	assemble_name ((FILE), (NAME));					\
28573305Sobrien	fprintf ((FILE), ",%u\n", (rounded));				\
28673305Sobrien      }									\
28773305Sobrien  } while (0)
28873305Sobrien
28973305Sobrien/* This says how to output assembler code to declare an
29073305Sobrien   uninitialized internal linkage data object.  Under SVR4,
29173305Sobrien   the linker seems to want the alignment of data objects
29273305Sobrien   to depend on their types.  We do exactly that here.  */
29373305Sobrien
29473305Sobrien#undef  ASM_OUTPUT_ALIGNED_LOCAL
29573305Sobrien#define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN)		\
29673305Sobrien  do {									\
29773305Sobrien    if (TARGET_ELF)							\
29873305Sobrien      {									\
29973305Sobrien	fprintf ((FILE), "%s", LOCAL_ASM_OP);				\
30073305Sobrien	assemble_name ((FILE), (NAME));					\
30173305Sobrien	fprintf ((FILE), "\n");						\
30273305Sobrien	ASM_OUTPUT_ALIGNED_COMMON ((FILE), (NAME), (SIZE), (ALIGN));	\
30373305Sobrien      }									\
30473305Sobrien    else								\
30573305Sobrien      {									\
30673305Sobrien	int rounded = (SIZE);						\
30773305Sobrien	if (rounded == 0) rounded = 1;					\
30873305Sobrien	rounded += (BIGGEST_ALIGNMENT / BITS_PER_UNIT) - 1;		\
30973305Sobrien	rounded = (rounded / (BIGGEST_ALIGNMENT / BITS_PER_UNIT)	\
31073305Sobrien		   * (BIGGEST_ALIGNMENT / BITS_PER_UNIT));		\
31173305Sobrien	fputs ("\t.lcomm\t", (FILE));					\
31273305Sobrien	assemble_name ((FILE), (NAME));					\
31373305Sobrien	fprintf ((FILE), ",%u\n", (rounded));				\
31473305Sobrien      }									\
31573305Sobrien  } while (0)
31673305Sobrien
31773305Sobrien/* How to output some space.  The rules are different depending on the
31873305Sobrien   object format.  */
31973305Sobrien#undef  ASM_OUTPUT_SKIP
32073305Sobrien#define ASM_OUTPUT_SKIP(FILE, SIZE) 					\
32173305Sobrien  do {									\
32273305Sobrien    if (TARGET_ELF)							\
32373305Sobrien      {									\
32473305Sobrien        fprintf ((FILE), "%s%u\n", SKIP_ASM_OP, (SIZE));		\
32573305Sobrien      }									\
32673305Sobrien    else								\
32773305Sobrien      {									\
32873305Sobrien        fprintf ((FILE), "\t.space\t%u\n", (SIZE));			\
32973305Sobrien      }									\
33073305Sobrien  } while (0)
33173305Sobrien
33258478Sobrien#undef  ASM_OUTPUT_SOURCE_LINE
33358478Sobrien#define ASM_OUTPUT_SOURCE_LINE(FILE, LINE)				\
33458478Sobrien  do {									\
33558478Sobrien    static int sym_lineno = 1;						\
33658478Sobrien    if (TARGET_ELF)							\
33758478Sobrien      {									\
33858478Sobrien	fprintf ((FILE), ".stabn 68,0,%d,.LM%d-", (LINE), sym_lineno);	\
33958478Sobrien	assemble_name ((FILE), 						\
34058478Sobrien		XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0));	\
34158478Sobrien	fprintf ((FILE), "\n.LM%d:\n", sym_lineno);			\
34258478Sobrien	sym_lineno += 1;						\
34358478Sobrien      }									\
34458478Sobrien    else								\
34558478Sobrien      {									\
34658478Sobrien	fprintf ((FILE), "\t%s %d,0,%d\n", ASM_STABD_OP, N_SLINE,	\
34758478Sobrien		lineno);						\
34858478Sobrien      }									\
34958478Sobrien  } while (0)
35018334Speter
35195810Sobrien/* A C statement to output to the stdio stream FILE an assembler
35295810Sobrien   command to advance the location counter to a multiple of 1<<LOG
35395810Sobrien   bytes if it is within MAX_SKIP bytes.
35451408Sobrien
35595810Sobrien   This is used to align code labels according to Intel recommendations.  */
35651408Sobrien
35795810Sobrien#ifdef HAVE_GAS_MAX_SKIP_P2ALIGN
35895810Sobrien#define ASM_OUTPUT_MAX_SKIP_ALIGN(FILE, LOG, MAX_SKIP)					\
35995810Sobrien  if ((LOG) != 0) {														\
36095810Sobrien    if ((MAX_SKIP) == 0) fprintf ((FILE), "\t.p2align %d\n", (LOG));	\
36195810Sobrien    else fprintf ((FILE), "\t.p2align %d,,%d\n", (LOG), (MAX_SKIP));	\
36258478Sobrien  }
36395810Sobrien#endif
36458478Sobrien
36573305Sobrien
36658478Sobrien/************************[  Debugger stuff  ]*********************************/
36718334Speter
36895349Sobrien/* The a.out tools do not support "Lscope" .stabs symbols. */
36995349Sobrien#undef  NO_DBX_FUNCTION_END
37095349Sobrien#define NO_DBX_FUNCTION_END	TARGET_AOUT
37195349Sobrien
37295349Sobrien/* In ELF, the function stabs come first, before the relative offsets.  */
37395349Sobrien#undef  DBX_FUNCTION_FIRST
37495349Sobrien#define DBX_CHECK_FUNCTION_FIRST TARGET_ELF
37595349Sobrien
37634229Speter#undef  DBX_REGISTER_NUMBER
37795810Sobrien#define DBX_REGISTER_NUMBER(n)	(TARGET_64BIT ? dbx64_register_map[n]	\
37895810Sobrien				: (write_symbols == DWARF2_DEBUG	\
37993263Sobrien	    			  || write_symbols == DWARF_DEBUG)	\
38095810Sobrien				  ? svr4_dbx_register_map[(n)]		\
38195810Sobrien				  : dbx_register_map[(n)])
38234229Speter
38358478Sobrien/* tag end of file in elf mode */
38458478Sobrien#undef  DBX_OUTPUT_MAIN_SOURCE_FILE_END
38558478Sobrien#define DBX_OUTPUT_MAIN_SOURCE_FILE_END(FILE, FILENAME)			\
38658478Sobrien  do {									\
38758478Sobrien    if (TARGET_ELF) {							\
38895810Sobrien      fprintf ((FILE), "\t.text\n\t.stabs \"\",%d,0,0,%LLetext\n%LLetext:\n", \
38958478Sobrien		N_SO);							\
39018334Speter    }									\
39158478Sobrien  } while (0)
39218334Speter
39358478Sobrien/* stabs-in-elf has offsets relative to function beginning */
39458478Sobrien#undef  DBX_OUTPUT_LBRAC
39558478Sobrien#define DBX_OUTPUT_LBRAC(FILE, NAME)					\
39658478Sobrien  do {									\
39758478Sobrien    fprintf (asmfile, "%s %d,0,0,", ASM_STABN_OP, N_LBRAC);		\
39858478Sobrien    assemble_name (asmfile, buf);					\
39958478Sobrien    if (TARGET_ELF)							\
40058478Sobrien      {									\
40158478Sobrien        fputc ('-', asmfile);						\
40258478Sobrien        assemble_name (asmfile,						\
40358478Sobrien	      	 XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0));	\
40458478Sobrien      }									\
40558478Sobrien    fprintf (asmfile, "\n");						\
40658478Sobrien  } while (0)
40752112Sobrien
40858478Sobrien#undef  DBX_OUTPUT_RBRAC
40958478Sobrien#define DBX_OUTPUT_RBRAC(FILE, NAME)					\
41058478Sobrien  do {									\
41158478Sobrien    fprintf (asmfile, "%s %d,0,0,", ASM_STABN_OP, N_RBRAC);		\
41258478Sobrien    assemble_name (asmfile, buf);					\
41358478Sobrien    if (TARGET_ELF)							\
41458478Sobrien      {									\
41558478Sobrien        fputc ('-', asmfile);						\
41658478Sobrien        assemble_name (asmfile,						\
41758478Sobrien		 XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0));	\
41858478Sobrien      }									\
41958478Sobrien    fprintf (asmfile, "\n");						\
42058478Sobrien  } while (0)
421