freebsd.h revision 68601
1/* Definitions for Intel 386 running FreeBSD with either a.out or ELF format
2   Copyright (C) 1996-2000 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 68601 2000-11-11 04:50:51Z obrien $ */
27
28#undef  CPP_PREDEFINES
29#define CPP_PREDEFINES 							\
30  "-Di386 -Acpu(i386) -Amachine(i386)"					\
31  FBSD_CPP_PREDEFINES
32
33#undef  CC1_SPEC
34#define CC1_SPEC "\
35  %{gline:%{!g:%{!g0:%{!g1:%{!g2: -g1}}}}} \
36  %{maout: %{!mno-underscores: %{!munderscores: -munderscores }}}"
37
38#undef  ASM_SPEC
39#define ASM_SPEC	"%{v*: -v} %{maout: %{fpic:-k} %{fPIC:-k}}"
40
41#undef  ASM_FINAL_SPEC
42#define ASM_FINAL_SPEC	"%|"
43
44/* Provide a LINK_SPEC appropriate for FreeBSD.  Here we provide support
45   for the special GCC options -static and -shared, which allow us to
46   link things in one of these three modes by applying the appropriate
47   combinations of options at link-time. We like to support here for
48   as many of the other GNU linker options as possible. But I don't
49   have the time to search for those flags. I am sure how to add
50   support for -soname shared_object_name. H.J.
51
52   I took out %{v:%{!V:-V}}. It is too much :-(. They can use
53   -Wl,-V.
54
55   When the -shared link option is used a final link is not being
56   done.  */
57
58#undef	LINK_SPEC
59#define LINK_SPEC "\
60 %{p:%e`-p' not supported; use `-pg' and gprof(1)} \
61  %{maout: %{shared:-Bshareable} \
62    %{!shared:%{!nostdlib:%{!r:%{!e*:-e start}}} -dc -dp %{static:-Bstatic} \
63      %{pg:-Bstatic} %{Z}} \
64    %{assert*} %{R*}} \
65  %{!maout: \
66    -m elf_i386 \
67    %{Wl,*:%*} \
68    %{assert*} %{R*} %{rpath*} %{defsym*} \
69    %{shared:-Bshareable %{h*} %{soname*}} \
70    %{symbolic:-Bsymbolic} \
71    %{!shared: \
72      %{!static: \
73	%{rdynamic: -export-dynamic} \
74	%{!dynamic-linker: -dynamic-linker /usr/libexec/ld-elf.so.1}} \
75      %{static:-Bstatic}}}"
76
77#undef STARTFILE_SPEC
78#define STARTFILE_SPEC "\
79  %{maout: %{shared:c++rt0.o%s} \
80    %{!shared: \
81      %{pg:gcrt0.o%s}%{!pg: \
82	%{static:scrt0.o%s} \
83	%{!static:crt0.o%s}}}} \
84  %{!maout: \
85    %{!shared: \
86      %{pg:gcrt1.o%s} \
87      %{!pg: \
88	%{p:gcrt1.o%s} \
89	%{!p:crt1.o%s}}} \
90    crti.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}}"
91
92/* Provide an ENDFILE_SPEC appropriate for FreeBSD/i386.  Here we tack on our
93   own magical crtend.o file (compare w/crtstuff.c) which provides part of the
94   support for getting C++ file-scope static object constructed before
95   entering `main', followed by the normal "finalizer" file, `crtn.o'.  */
96
97#undef  ENDFILE_SPEC
98#define ENDFILE_SPEC "\
99  %{!maout: \
100    %{!shared:crtend.o%s} \
101    %{shared:crtendS.o%s} crtn.o%s}"
102
103
104/************************[  Target stuff  ]***********************************/
105
106/* Define the actual types of some ANSI-mandated types.
107   Needs to agree with <machine/ansi.h>.  GCC defaults come from c-decl.c,
108   c-common.c, and config/<arch>/<arch>.h.  */
109
110#undef SIZE_TYPE
111#define SIZE_TYPE	"unsigned int"
112
113#undef PTRDIFF_TYPE
114#define PTRDIFF_TYPE	"int"
115
116/* This is the pseudo-op used to generate a 32-bit word of data with a
117   specific value in some section.  */
118
119#undef INT_ASM_OP
120#define INT_ASM_OP	".long"
121
122/* Biggest alignment supported by the object file format of this
123   machine.  Use this macro to limit the alignment which can be
124   specified using the `__attribute__ ((aligned (N)))' construct.  If
125   not defined, the default value is `BIGGEST_ALIGNMENT'.  */
126
127#define MAX_OFILE_ALIGNMENT (32768*8)
128
129#undef  TARGET_VERSION
130#define TARGET_VERSION	fprintf (stderr, " (i386 FreeBSD/ELF)");
131
132#define MASK_PROFILER_EPILOGUE	010000000000
133#define MASK_AOUT		004000000000	/* a.out not elf */
134#define MASK_UNDERSCORES	002000000000	/* use leading _ */
135
136#define TARGET_PROFILER_EPILOGUE	(target_flags & MASK_PROFILER_EPILOGUE)
137#define TARGET_AOUT			(target_flags & MASK_AOUT)
138#define TARGET_ELF			((target_flags & MASK_AOUT) == 0)
139#define TARGET_UNDERSCORES		((target_flags & MASK_UNDERSCORES) != 0)
140
141#undef	SUBTARGET_SWITCHES
142#define SUBTARGET_SWITCHES						\
143  { "profiler-epilogue",	 MASK_PROFILER_EPILOGUE, "Function profiler epilogue"}, \
144  { "no-profiler-epilogue",	-MASK_PROFILER_EPILOGUE, "No function profiler epilogue"}, \
145  { "aout",			 MASK_AOUT, "Generate an a.out (vs. ELF) binary"}, \
146  { "no-aout",			-MASK_AOUT, "Do not generate an a.out binary"}, \
147  { "underscores",		 MASK_UNDERSCORES, "Add leading underscores to symbols"}, \
148  { "no-underscores",		-MASK_UNDERSCORES, "Do not add leading underscores to symbols"},
149
150/* This goes away when the math emulator is fixed.  */
151#undef  TARGET_DEFAULT
152#define TARGET_DEFAULT \
153  (MASK_80387 | MASK_IEEE_FP | MASK_FLOAT_RETURNS | MASK_NO_FANCY_MATH_387)
154
155/* Prefix for internally generated assembler labels.  If we aren't using
156   underscores, we are using prefix `.'s to identify labels that should
157   be ignored, as in `i386/gas.h' --karl@cs.umb.edu  */
158#undef  LPREFIX
159#define LPREFIX ((TARGET_UNDERSCORES) ? "L" : ".L")
160
161/* The a.out tools do not support "linkonce" sections. */
162#undef  SUPPORTS_ONE_ONLY
163#define SUPPORTS_ONE_ONLY	TARGET_ELF
164
165/* Enable alias attribute support.  */
166#undef  SET_ASM_OP
167#define SET_ASM_OP		".set"
168
169/* The a.out tools do not support "Lscope" .stabs symbols. */
170#undef  NO_DBX_FUNCTION_END
171#define NO_DBX_FUNCTION_END	TARGET_AOUT
172
173/* In ELF, the function stabs come first, before the relative offsets.  */
174#undef  DBX_FUNCTION_FIRST
175#define DBX_CHECK_FUNCTION_FIRST TARGET_ELF
176
177/* supply our own hook for calling __main() from main() */
178#undef  INVOKE__main
179#define INVOKE__main
180#undef  GEN_CALL__MAIN
181#define GEN_CALL__MAIN							\
182  do {									\
183    if (!(TARGET_ELF))							\
184      emit_library_call (gen_rtx (SYMBOL_REF, Pmode, NAME__MAIN), 0,	\
185			 VOIDmode, 0);					\
186  } while (0)
187
188/* Indicate that jump tables go in the text section.  This is
189   necessary when compiling PIC code.  */
190#undef  JUMP_TABLES_IN_TEXT_SECTION
191#define JUMP_TABLES_IN_TEXT_SECTION	(flag_pic)
192
193/* override the exception table positioning */
194#undef  EXCEPTION_SECTION
195#define EXCEPTION_SECTION() \
196  do {									\
197    if (TARGET_ELF)							\
198      {									\
199	named_section (NULL_TREE, ".gcc_except_table", 0);		\
200      }									\
201    else								\
202      {									\
203	if (flag_pic)							\
204	  data_section ();						\
205	else								\
206	  readonly_data_section ();					\
207      }									\
208  } while (0);
209
210/* Tell final.c that we don't need a label passed to mcount.  */
211#undef  NO_PROFILE_DATA
212#define NO_PROFILE_DATA
213
214/* Output assembler code to FILE to begin profiling of the current function.
215   LABELNO is an optional label.  */
216
217#undef  FUNCTION_PROFILER
218#define FUNCTION_PROFILER(FILE, LABELNO)  \
219  do {									\
220    char *_name = TARGET_AOUT ? "mcount" : ".mcount";			\
221    if (flag_pic)							\
222      fprintf ((FILE), "\tcall *%s@GOT(%%ebx)\n", _name);		\
223    else								\
224      fprintf ((FILE), "\tcall %s\n", _name);				\
225  } while (0)
226
227/* Output assembler code to FILE to end profiling of the current function.  */
228
229#undef  FUNCTION_PROFILER_EPILOGUE
230#define FUNCTION_PROFILER_EPILOGUE(FILE, DO_RTL)			\
231  do {									\
232    if (TARGET_PROFILER_EPILOGUE)					\
233      {									\
234	if (DO_RTL)							\
235	  {								\
236	  /* ".mexitcount" is specially handled in			\
237	     ASM_HACK_SYMBOLREF () so that we don't need to handle	\
238	     flag_pic or TARGET_AOUT here.  */				\
239	    rtx xop;							\
240	    xop = gen_rtx_MEM (FUNCTION_MODE,				\
241			    gen_rtx_SYMBOL_REF (Pmode, ".mexitcount"));	\
242	    emit_call_insn (gen_rtx (CALL, VOIDmode, xop, const0_rtx));	\
243	  }								\
244	else								\
245	  {								\
246	  /* XXX this !DO_RTL case is broken but not actually used.  */	\
247	    char *_name = TARGET_AOUT ? "mcount" : ".mcount";		\
248	    if (flag_pic)						\
249	      fprintf (FILE, "\tcall *%s@GOT(%%ebx)\n", _name);		\
250	    else							\
251	      fprintf (FILE, "\tcall %s\n", _name);			\
252	  }								\
253      }									\
254  } while (0)
255
256
257/************************[  Assembler stuff  ]********************************/
258
259#undef  ASM_APP_ON
260#define ASM_APP_ON	"#APP\n"
261
262#undef  ASM_APP_OFF
263#define ASM_APP_OFF	"#NO_APP\n"
264
265/* This is how to begin an assembly language file.
266   The .file command should always begin the output.
267   ELF also needs a .version.  */
268
269#undef  ASM_FILE_START
270#define ASM_FILE_START(FILE)						\
271  do {									\
272    output_file_directive ((FILE), main_input_filename);		\
273    if (TARGET_ELF)							\
274      fprintf ((FILE), "\t.version\t\"01.01\"\n");			\
275  } while (0)
276
277/* This is how to store into the string BUF
278   the symbol_ref name of an internal numbered label where
279   PREFIX is the class of label and NUM is the number within the class.
280   This is suitable for output with `assemble_name'.  */
281#undef	ASM_GENERATE_INTERNAL_LABEL
282#define ASM_GENERATE_INTERNAL_LABEL(BUF, PREFIX, NUMBER)		\
283  sprintf ((BUF), "*%s%s%d", (TARGET_UNDERSCORES) ? "" : ".",		\
284	   (PREFIX), (NUMBER))
285
286/* This is how to output an internal numbered label where
287   PREFIX is the class of label and NUM is the number within the class.
288   For most svr4/ELF systems, the convention is that any symbol which begins
289   with a period is not put into the linker symbol table by the assembler.  */
290#undef	ASM_OUTPUT_INTERNAL_LABEL
291#define	ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM)			\
292  fprintf ((FILE), "%s%s%d:\n", (TARGET_UNDERSCORES) ? "" : ".",	\
293	   (PREFIX), (NUM))
294
295/* This is how to output a reference to a user-level label named NAME.  */
296#undef  ASM_OUTPUT_LABELREF
297#define ASM_OUTPUT_LABELREF(FILE, NAME)					\
298  do {									\
299    char *_name = (NAME);						\
300    /* Hack to avoid writing lots of rtl in				\
301       FUNCTION_PROFILER_EPILOGUE ().  */				\
302    if (*_name == '.' && strcmp(_name + 1, "mexitcount") == 0)		\
303      {									\
304	if (TARGET_AOUT)						\
305	  _name++;							\
306	if (flag_pic)							\
307	  fprintf ((FILE), "*%s@GOT(%%ebx)", _name);			\
308	else								\
309	  fprintf ((FILE), "%s", _name);				\
310      }									\
311    else								\
312      fprintf (FILE, "%s%s", TARGET_UNDERSCORES ? "_" : "", _name);	\
313} while (0)
314
315/* This is how to hack on the symbol code of certain relcalcitrant
316   symbols to modify their output in output_pic_addr_const ().  */
317
318#undef  ASM_HACK_SYMBOLREF_CODE
319#define ASM_HACK_SYMBOLREF_CODE(NAME, CODE)				\
320  do {									\
321    /* Part of hack to avoid writing lots of rtl in			\
322       FUNCTION_PROFILER_EPILOGUE ().  */				\
323    char *_name = (NAME);						\
324    if (*_name == '.' && strcmp(_name + 1, "mexitcount") == 0)		\
325      (CODE) = 'X';							\
326  } while (0)
327
328/* This is how to output an element of a case-vector that is relative.
329   This is only used for PIC code.  See comments by the `casesi' insn in
330   i386.md for an explanation of the expression this outputs. */
331#undef  ASM_OUTPUT_ADDR_DIFF_ELT
332#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL)		\
333  fprintf ((FILE), "\t.long _GLOBAL_OFFSET_TABLE_+[.-%s%d]\n", LPREFIX, (VALUE))
334
335#undef  ASM_OUTPUT_ALIGN
336#define ASM_OUTPUT_ALIGN(FILE, LOG)      				\
337  if ((LOG)!=0) {							\
338    if (in_text_section())						\
339      fprintf ((FILE), "\t.p2align %d,0x90\n", (LOG));			\
340    else								\
341      fprintf ((FILE), "\t.p2align %d\n", (LOG));			\
342  }
343
344#undef  ASM_OUTPUT_SOURCE_LINE
345#define ASM_OUTPUT_SOURCE_LINE(FILE, LINE)				\
346  do {									\
347    static int sym_lineno = 1;						\
348    if (TARGET_ELF)							\
349      {									\
350	fprintf ((FILE), ".stabn 68,0,%d,.LM%d-", (LINE), sym_lineno);	\
351	assemble_name ((FILE), 						\
352		XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0));	\
353	fprintf ((FILE), "\n.LM%d:\n", sym_lineno);			\
354	sym_lineno += 1;						\
355      }									\
356    else								\
357      {									\
358	fprintf ((FILE), "\t%s %d,0,%d\n", ASM_STABD_OP, N_SLINE,	\
359		lineno);						\
360      }									\
361  } while (0)
362
363/* These macros generate the special .type and .size directives which
364   are used to set the corresponding fields of the linker symbol table
365   entries in an ELF object file under SVR4.  These macros also output
366   the starting labels for the relevant functions/objects.  */
367
368/* Write the extra assembler code needed to declare a function properly.
369   Some svr4 assemblers need to also have something extra said about the
370   function's return value.  We allow for that here.  */
371
372#undef  ASM_DECLARE_FUNCTION_NAME
373#define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL)			\
374  do {									\
375    fprintf (FILE, "\t%s\t ", TYPE_ASM_OP);				\
376    assemble_name (FILE, NAME);						\
377    putc (',', FILE);							\
378    fprintf (FILE, TYPE_OPERAND_FMT, "function");			\
379    putc ('\n', FILE);							\
380    ASM_DECLARE_RESULT (FILE, DECL_RESULT (DECL));			\
381    ASM_OUTPUT_LABEL(FILE, NAME);					\
382  } while (0)
383
384/* This is how to declare the size of a function.  */
385
386#undef  ASM_DECLARE_FUNCTION_SIZE
387#define ASM_DECLARE_FUNCTION_SIZE(FILE, FNAME, DECL)			\
388  do {									\
389    if (!flag_inhibit_size_directive)					\
390      {									\
391        char label[256];						\
392	static int labelno;						\
393	labelno++;							\
394	ASM_GENERATE_INTERNAL_LABEL (label, "Lfe", labelno);		\
395	ASM_OUTPUT_INTERNAL_LABEL (FILE, "Lfe", labelno);		\
396	fprintf (FILE, "\t%s\t ", SIZE_ASM_OP);				\
397	assemble_name (FILE, (FNAME));					\
398        fprintf (FILE, ",");						\
399	assemble_name (FILE, label);					\
400        fprintf (FILE, "-");						\
401	assemble_name (FILE, (FNAME));					\
402	putc ('\n', FILE);						\
403      }									\
404  } while (0)
405
406
407/* The routine used to output NUL terminated strings.  We use a special
408   version of this for most svr4 targets because doing so makes the
409   generated assembly code more compact (and thus faster to assemble)
410   as well as more readable, especially for targets like the i386
411   (where the only alternative is to output character sequences as
412   comma separated lists of numbers).   */
413
414#undef  ASM_OUTPUT_LIMITED_STRING
415#define ASM_OUTPUT_LIMITED_STRING(FILE, STR)				\
416  do {									\
417      register unsigned char *_limited_str = (unsigned char *) (STR);	\
418      register unsigned ch;						\
419      fprintf ((FILE), "\t%s\t\"", STRING_ASM_OP);			\
420      for (; (ch = *_limited_str); _limited_str++)			\
421        {								\
422	  register int escape;						\
423	  switch (escape = ESCAPES[ch])					\
424	    {								\
425	    case 0:							\
426	      putc (ch, (FILE));					\
427	      break;							\
428	    case 1:							\
429	      fprintf ((FILE), "\\%03o", ch);				\
430	      break;							\
431	    default:							\
432	      putc ('\\', (FILE));					\
433	      putc (escape, (FILE));					\
434	      break;							\
435	    }								\
436        }								\
437      fprintf ((FILE), "\"\n");						\
438  } while (0)
439
440/* Switch into a generic section.
441
442   We make the section read-only and executable for a function decl,
443   read-only for a const data decl, and writable for a non-const data decl.
444
445   If the section has already been defined, we must not
446   emit the attributes here. The SVR4 assembler does not
447   recognize section redefinitions.
448   If DECL is NULL, no attributes are emitted.  */
449
450#undef  ASM_OUTPUT_SECTION_NAME
451#define ASM_OUTPUT_SECTION_NAME(FILE, DECL, NAME, RELOC)		\
452  do {									\
453    static struct section_info						\
454      {									\
455	struct section_info *next;				        \
456	char *name;						        \
457	enum sect_enum {SECT_RW, SECT_RO, SECT_EXEC} type;		\
458      } *sections;							\
459    struct section_info *s;						\
460    char *mode;								\
461    enum sect_enum type;						\
462									\
463    for (s = sections; s; s = s->next)					\
464      if (!strcmp (NAME, s->name))					\
465	break;								\
466									\
467    if (DECL && TREE_CODE (DECL) == FUNCTION_DECL)			\
468      type = SECT_EXEC, mode = "ax";					\
469    else if (DECL && DECL_READONLY_SECTION (DECL, RELOC))		\
470      type = SECT_RO, mode = "a";					\
471    else								\
472      type = SECT_RW, mode = "aw";					\
473									\
474    if (s == 0)								\
475      {									\
476	s = (struct section_info *) xmalloc (sizeof (struct section_info));  \
477	s->name = xmalloc ((strlen (NAME) + 1) * sizeof (*NAME));	\
478	strcpy (s->name, NAME);						\
479	s->type = type;							\
480	s->next = sections;						\
481	sections = s;							\
482	fprintf (FILE, ".section\t%s,\"%s\",@progbits\n", NAME, mode);	\
483      }									\
484    else								\
485      {									\
486	if (DECL && s->type != type)					\
487	  error_with_decl (DECL, "%s causes a section type conflict");	\
488									\
489	fprintf (FILE, ".section\t%s\n", NAME);				\
490      }									\
491  } while (0)
492
493#undef  MAKE_DECL_ONE_ONLY
494#define MAKE_DECL_ONE_ONLY(DECL)	(DECL_WEAK (DECL) = 1)
495#undef  UNIQUE_SECTION_P
496#define UNIQUE_SECTION_P(DECL)		(DECL_ONE_ONLY (DECL))
497#undef  UNIQUE_SECTION
498#define UNIQUE_SECTION(DECL,RELOC)					\
499  do {									\
500    int len;								\
501    char *name, *string, *prefix;					\
502									\
503    name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (DECL));		\
504									\
505    if (! DECL_ONE_ONLY (DECL))						\
506      {									\
507	prefix = ".";                                             	\
508	if (TREE_CODE (DECL) == FUNCTION_DECL)				\
509	  prefix = ".text.";						\
510	else if (DECL_READONLY_SECTION (DECL, RELOC))			\
511	  prefix = ".rodata.";						\
512	else								\
513	  prefix = ".data.";						\
514      }									\
515    else if (TREE_CODE (DECL) == FUNCTION_DECL)				\
516      prefix = ".gnu.linkonce.t.";					\
517    else if (DECL_READONLY_SECTION (DECL, RELOC))			\
518      prefix = ".gnu.linkonce.r.";					\
519    else								\
520      prefix = ".gnu.linkonce.d.";					\
521									\
522    len = strlen (name) + strlen (prefix);				\
523    string = alloca (len + 1);						\
524    sprintf (string, "%s%s", prefix, name);				\
525									\
526    DECL_SECTION_NAME (DECL) = build_string (len, string);		\
527  } while (0)
528
529/* A C statement or statements to switch to the appropriate
530   section for output of DECL.  DECL is either a `VAR_DECL' node
531   or a constant of some sort.  RELOC indicates whether forming
532   the initial value of DECL requires link-time relocations.  */
533
534#undef  SELECT_SECTION
535#define SELECT_SECTION(DECL,RELOC)					\
536  {									\
537    if (flag_pic && RELOC)						\
538      data_section ();							\
539    else if (TREE_CODE (DECL) == STRING_CST)				\
540      {									\
541	if (! flag_writable_strings)					\
542	  const_section ();						\
543	else								\
544	  data_section ();						\
545      }									\
546    else if (TREE_CODE (DECL) == VAR_DECL)				\
547      {									\
548	if (! DECL_READONLY_SECTION (DECL, RELOC))			\
549	  data_section ();						\
550	else								\
551	  const_section ();						\
552      }									\
553    else								\
554      const_section ();							\
555  }
556
557/* Define macro used to output shift-double opcodes when the shift
558   count is in %cl.  Some assemblers require %cl as an argument;
559   some don't.
560
561   *OLD* GAS requires the %cl argument, so override i386/unix.h. */
562
563#undef  AS3_SHIFT_DOUBLE
564#define AS3_SHIFT_DOUBLE(a,b,c,d)	AS3 (a,b,c,d)
565
566
567/************************[  Debugger stuff  ]*********************************/
568
569/* Copy this from the svr4 specifications... */
570/* Define the register numbers to be used in Dwarf debugging information.
571   The SVR4 reference port C compiler uses the following register numbers
572   in its Dwarf output code:
573	0 for %eax (gnu regno = 0)
574	1 for %ecx (gnu regno = 2)
575	2 for %edx (gnu regno = 1)
576	3 for %ebx (gnu regno = 3)
577	4 for %esp (gnu regno = 7)
578	5 for %ebp (gnu regno = 6)
579	6 for %esi (gnu regno = 4)
580	7 for %edi (gnu regno = 5)
581   The following three DWARF register numbers are never generated by
582   the SVR4 C compiler or by the GNU compilers, but SDB on x86/svr4
583   believes these numbers have these meanings.
584	8  for %eip    (no gnu equivalent)
585	9  for %eflags (no gnu equivalent)
586	10 for %trapno (no gnu equivalent)
587   It is not at all clear how we should number the FP stack registers
588   for the x86 architecture.  If the version of SDB on x86/svr4 were
589   a bit less brain dead with respect to floating-point then we would
590   have a precedent to follow with respect to DWARF register numbers
591   for x86 FP registers, but the SDB on x86/svr4 is so completely
592   broken with respect to FP registers that it is hardly worth thinking
593   of it as something to strive for compatibility with.
594   The version of x86/svr4 SDB I have at the moment does (partially)
595   seem to believe that DWARF register number 11 is associated with
596   the x86 register %st(0), but that's about all.  Higher DWARF
597   register numbers don't seem to be associated with anything in
598   particular, and even for DWARF regno 11, SDB only seems to under-
599   stand that it should say that a variable lives in %st(0) (when
600   asked via an `=' command) if we said it was in DWARF regno 11,
601   but SDB still prints garbage when asked for the value of the
602   variable in question (via a `/' command).
603   (Also note that the labels SDB prints for various FP stack regs
604   when doing an `x' command are all wrong.)
605   Note that these problems generally don't affect the native SVR4
606   C compiler because it doesn't allow the use of -O with -g and
607   because when it is *not* optimizing, it allocates a memory
608   location for each floating-point variable, and the memory
609   location is what gets described in the DWARF AT_location
610   attribute for the variable in question.
611   Regardless of the severe mental illness of the x86/svr4 SDB, we
612   do something sensible here and we use the following DWARF
613   register numbers.  Note that these are all stack-top-relative
614   numbers.
615	11 for %st(0) (gnu regno = 8)
616	12 for %st(1) (gnu regno = 9)
617	13 for %st(2) (gnu regno = 10)
618	14 for %st(3) (gnu regno = 11)
619	15 for %st(4) (gnu regno = 12)
620	16 for %st(5) (gnu regno = 13)
621	17 for %st(6) (gnu regno = 14)
622	18 for %st(7) (gnu regno = 15)
623*/
624#undef  DWARF_DBX_REGISTER_NUMBER
625#define DWARF_DBX_REGISTER_NUMBER(n) \
626((n) == 0 ? 0 \
627 : (n) == 1 ? 2 \
628 : (n) == 2 ? 1 \
629 : (n) == 3 ? 3 \
630 : (n) == 4 ? 6 \
631 : (n) == 5 ? 7 \
632 : (n) == 6 ? 5 \
633 : (n) == 7 ? 4 \
634 : ((n) >= FIRST_STACK_REG && (n) <= LAST_STACK_REG) ? (n)+3 \
635 : (-1))
636
637/* Now what stabs expects in the register.  */
638#undef  STABS_DBX_REGISTER_NUMBER
639#define STABS_DBX_REGISTER_NUMBER(n) \
640((n) == 0 ? 0 : \
641 (n) == 1 ? 2 : \
642 (n) == 2 ? 1 : \
643 (n) == 3 ? 3 : \
644 (n) == 4 ? 6 : \
645 (n) == 5 ? 7 : \
646 (n) == 6 ? 4 : \
647 (n) == 7 ? 5 : \
648 (n) + 4)
649
650#undef  DBX_REGISTER_NUMBER
651#define DBX_REGISTER_NUMBER(n)	((write_symbols == DWARF_DEBUG)		\
652				? DWARF_DBX_REGISTER_NUMBER(n)		\
653				: STABS_DBX_REGISTER_NUMBER(n))
654
655/* tag end of file in elf mode */
656#undef  DBX_OUTPUT_MAIN_SOURCE_FILE_END
657#define DBX_OUTPUT_MAIN_SOURCE_FILE_END(FILE, FILENAME)			\
658  do {									\
659    if (TARGET_ELF) {							\
660      fprintf ((FILE), "\t.text\n\t.stabs \"\",%d,0,0,.Letext\n.Letext:\n", \
661		N_SO);							\
662    }									\
663  } while (0)
664
665/* stabs-in-elf has offsets relative to function beginning */
666#undef  DBX_OUTPUT_LBRAC
667#define DBX_OUTPUT_LBRAC(FILE, NAME)					\
668  do {									\
669    fprintf (asmfile, "%s %d,0,0,", ASM_STABN_OP, N_LBRAC);		\
670    assemble_name (asmfile, buf);					\
671    if (TARGET_ELF)							\
672      {									\
673        fputc ('-', asmfile);						\
674        assemble_name (asmfile,						\
675	      	 XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0));	\
676      }									\
677    fprintf (asmfile, "\n");						\
678  } while (0)
679
680#undef  DBX_OUTPUT_RBRAC
681#define DBX_OUTPUT_RBRAC(FILE, NAME)					\
682  do {									\
683    fprintf (asmfile, "%s %d,0,0,", ASM_STABN_OP, N_RBRAC);		\
684    assemble_name (asmfile, buf);					\
685    if (TARGET_ELF)							\
686      {									\
687        fputc ('-', asmfile);						\
688        assemble_name (asmfile,						\
689		 XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0));	\
690      }									\
691    fprintf (asmfile, "\n");						\
692  } while (0)
693