OSDN Git Service

* m68k.h: Declare more functions used in macros.
[pf3gnuchains/gcc-fork.git] / gcc / dbxout.c
1 /* Output dbx-format symbol table information from GNU compiler.
2    Copyright (C) 1987, 88, 92-97, 1998 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
22 /* Output dbx-format symbol table data.
23    This consists of many symbol table entries, each of them
24    a .stabs assembler pseudo-op with four operands:
25    a "name" which is really a description of one symbol and its type,
26    a "code", which is a symbol defined in stab.h whose name starts with N_,
27    an unused operand always 0,
28    and a "value" which is an address or an offset.
29    The name is enclosed in doublequote characters.
30
31    Each function, variable, typedef, and structure tag
32    has a symbol table entry to define it.
33    The beginning and end of each level of name scoping within
34    a function are also marked by special symbol table entries.
35
36    The "name" consists of the symbol name, a colon, a kind-of-symbol letter,
37    and a data type number.  The data type number may be followed by
38    "=" and a type definition; normally this will happen the first time
39    the type number is mentioned.  The type definition may refer to
40    other types by number, and those type numbers may be followed
41    by "=" and nested definitions.
42
43    This can make the "name" quite long.
44    When a name is more than 80 characters, we split the .stabs pseudo-op
45    into two .stabs pseudo-ops, both sharing the same "code" and "value".
46    The first one is marked as continued with a double-backslash at the
47    end of its "name".
48
49    The kind-of-symbol letter distinguished function names from global
50    variables from file-scope variables from parameters from auto
51    variables in memory from typedef names from register variables.
52    See `dbxout_symbol'.
53
54    The "code" is mostly redundant with the kind-of-symbol letter
55    that goes in the "name", but not entirely: for symbols located
56    in static storage, the "code" says which segment the address is in,
57    which controls how it is relocated.
58
59    The "value" for a symbol in static storage
60    is the core address of the symbol (actually, the assembler
61    label for the symbol).  For a symbol located in a stack slot
62    it is the stack offset; for one in a register, the register number.
63    For a typedef symbol, it is zero.
64
65    If DEBUG_SYMS_TEXT is defined, all debugging symbols must be
66    output while in the text section.
67
68    For more on data type definitions, see `dbxout_type'.  */
69
70 #include "config.h"
71 #include "system.h"
72
73 #include "tree.h"
74 #include "rtl.h"
75 #include "flags.h"
76 #include "regs.h"
77 #include "insn-config.h"
78 #include "reload.h"
79 #include "defaults.h"
80 #include "output.h" /* ASM_OUTPUT_SOURCE_LINE may refer to sdb functions.  */
81 #include "dbxout.h"
82 #include "toplev.h"
83
84 #ifdef XCOFF_DEBUGGING_INFO
85 #include "xcoffout.h"
86 #endif
87
88 #ifndef ASM_STABS_OP
89 #define ASM_STABS_OP ".stabs"
90 #endif
91
92 #ifndef ASM_STABN_OP
93 #define ASM_STABN_OP ".stabn"
94 #endif
95
96 #ifndef DBX_TYPE_DECL_STABS_CODE
97 #define DBX_TYPE_DECL_STABS_CODE N_LSYM
98 #endif
99
100 #ifndef DBX_STATIC_CONST_VAR_CODE
101 #define DBX_STATIC_CONST_VAR_CODE N_FUN
102 #endif
103
104 #ifndef DBX_REGPARM_STABS_CODE
105 #define DBX_REGPARM_STABS_CODE N_RSYM
106 #endif
107
108 #ifndef DBX_REGPARM_STABS_LETTER
109 #define DBX_REGPARM_STABS_LETTER 'P'
110 #endif
111
112 /* This is used for parameters passed by invisible reference in a register.  */
113 #ifndef GDB_INV_REF_REGPARM_STABS_LETTER
114 #define GDB_INV_REF_REGPARM_STABS_LETTER 'a'
115 #endif
116
117 #ifndef DBX_MEMPARM_STABS_LETTER
118 #define DBX_MEMPARM_STABS_LETTER 'p'
119 #endif
120
121 #ifndef FILE_NAME_JOINER
122 #define FILE_NAME_JOINER "/"
123 #endif
124
125 /* Nonzero means if the type has methods, only output debugging
126    information if methods are actually written to the asm file.  This
127    optimization only works if the debugger can detect the special C++
128    marker.  */
129
130 #define MINIMAL_DEBUG 1
131
132 #ifdef NO_DOLLAR_IN_LABEL
133 #ifdef NO_DOT_IN_LABEL
134 #undef MINIMAL_DEBUG
135 #define MINIMAL_DEBUG 0
136 #endif
137 #endif
138
139 char *getpwd ();
140
141 /* Typical USG systems don't have stab.h, and they also have
142    no use for DBX-format debugging info.  */
143
144 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
145
146 static int flag_minimal_debug = MINIMAL_DEBUG;
147
148 /* Nonzero if we have actually used any of the GDB extensions
149    to the debugging format.  The idea is that we use them for the
150    first time only if there's a strong reason, but once we have done that,
151    we use them whenever convenient.  */
152
153 static int have_used_extensions = 0;
154
155 /* Number for the next N_SOL filename stabs label.  The number 0 is reserved
156    for the N_SO filename stabs label.  */
157
158 static int source_label_number = 1;
159
160 #ifdef DEBUG_SYMS_TEXT
161 #define FORCE_TEXT text_section ();
162 #else
163 #define FORCE_TEXT
164 #endif
165
166 /* If there is a system stabs.h, use it.  Otherwise, use our own.  */
167
168 #ifndef HAVE_STABS_H
169 #include "gstab.h"
170 #else
171 #include <stab.h>
172
173 /* This is a GNU extension we need to reference in this file.  */
174 #ifndef N_CATCH
175 #define N_CATCH 0x54
176 #endif
177 #endif
178
179 #ifdef __GNU_STAB__
180 #define STAB_CODE_TYPE enum __stab_debug_code
181 #else
182 #define STAB_CODE_TYPE int
183 #endif
184
185 /* 1 if PARM is passed to this function in memory.  */
186
187 #define PARM_PASSED_IN_MEMORY(PARM) \
188  (GET_CODE (DECL_INCOMING_RTL (PARM)) == MEM)
189
190 /* A C expression for the integer offset value of an automatic variable
191    (N_LSYM) having address X (an RTX).  */
192 #ifndef DEBUGGER_AUTO_OFFSET
193 #define DEBUGGER_AUTO_OFFSET(X) \
194   (GET_CODE (X) == PLUS ? INTVAL (XEXP (X, 1)) : 0)
195 #endif
196
197 /* A C expression for the integer offset value of an argument (N_PSYM)
198    having address X (an RTX).  The nominal offset is OFFSET.  */
199 #ifndef DEBUGGER_ARG_OFFSET
200 #define DEBUGGER_ARG_OFFSET(OFFSET, X) (OFFSET)
201 #endif
202
203 /* Stream for writing to assembler file.  */
204
205 static FILE *asmfile;
206
207 /* Last source file name mentioned in a NOTE insn.  */
208
209 static char *lastfile;
210
211 /* Current working directory.  */
212
213 static char *cwd;
214
215 enum typestatus {TYPE_UNSEEN, TYPE_XREF, TYPE_DEFINED};
216
217 /* Structure recording information about a C data type.
218    The status element says whether we have yet output
219    the definition of the type.  TYPE_XREF says we have
220    output it as a cross-reference only.
221    The file_number and type_number elements are used if DBX_USE_BINCL
222    is defined.  */
223
224 struct typeinfo
225 {
226   enum typestatus status;
227 #ifdef DBX_USE_BINCL
228   int file_number;
229   int type_number;
230 #endif
231 };
232
233 /* Vector recording information about C data types.
234    When we first notice a data type (a tree node),
235    we assign it a number using next_type_number.
236    That is its index in this vector.  */
237
238 struct typeinfo *typevec;
239
240 /* Number of elements of space allocated in `typevec'.  */
241
242 static int typevec_len;
243
244 /* In dbx output, each type gets a unique number.
245    This is the number for the next type output.
246    The number, once assigned, is in the TYPE_SYMTAB_ADDRESS field.  */
247
248 static int next_type_number;
249
250 #ifdef DBX_USE_BINCL
251
252 /* When using N_BINCL in dbx output, each type number is actually a
253    pair of the file number and the type number within the file.
254    This is a stack of input files.  */
255
256 struct dbx_file
257 {
258   struct dbx_file *next;
259   int file_number;
260   int next_type_number;
261 };
262
263 /* This is the top of the stack.  */
264
265 static struct dbx_file *current_file;
266
267 /* This is the next file number to use.  */
268
269 static int next_file_number;
270
271 #endif /* DBX_USE_BINCL */
272
273 /* In dbx output, we must assign symbol-blocks id numbers
274    in the order in which their beginnings are encountered.
275    We output debugging info that refers to the beginning and
276    end of the ranges of code in each block
277    with assembler labels LBBn and LBEn, where n is the block number.
278    The labels are generated in final, which assigns numbers to the
279    blocks in the same way.  */
280
281 static int next_block_number;
282
283 /* These variables are for dbxout_symbol to communicate to
284    dbxout_finish_symbol.
285    current_sym_code is the symbol-type-code, a symbol N_... define in stab.h.
286    current_sym_value and current_sym_addr are two ways to address the
287    value to store in the symtab entry.
288    current_sym_addr if nonzero represents the value as an rtx.
289    If that is zero, current_sym_value is used.  This is used
290    when the value is an offset (such as for auto variables,
291    register variables and parms).  */
292
293 static STAB_CODE_TYPE current_sym_code;
294 static int current_sym_value;
295 static rtx current_sym_addr;
296
297 /* Number of chars of symbol-description generated so far for the
298    current symbol.  Used by CHARS and CONTIN.  */
299
300 static int current_sym_nchars;
301
302 /* Report having output N chars of the current symbol-description.  */
303
304 #define CHARS(N) (current_sym_nchars += (N))
305
306 /* Break the current symbol-description, generating a continuation,
307    if it has become long.  */
308
309 #ifndef DBX_CONTIN_LENGTH
310 #define DBX_CONTIN_LENGTH 80
311 #endif
312
313 #if DBX_CONTIN_LENGTH > 0
314 #define CONTIN  \
315   do {if (current_sym_nchars > DBX_CONTIN_LENGTH) dbxout_continue ();} while (0)
316 #else
317 #define CONTIN
318 #endif
319
320 void dbxout_types ();
321 void dbxout_args ();
322 void dbxout_symbol ();
323
324 #if defined(ASM_OUTPUT_SECTION_NAME)
325 static void dbxout_function_end         PROTO((void));
326 #endif
327 static void dbxout_typedefs             PROTO((tree));
328 static void dbxout_type_index           PROTO((tree));
329 #if DBX_CONTIN_LENGTH > 0
330 static void dbxout_continue             PROTO((void));
331 #endif
332 static void dbxout_type_fields          PROTO((tree));
333 static void dbxout_type_method_1        PROTO((tree, char *));
334 static void dbxout_type_methods         PROTO((tree));
335 static void dbxout_range_type           PROTO((tree));
336 static void dbxout_type                 PROTO((tree, int, int));
337 static void print_int_cst_octal         PROTO((tree));
338 static void print_octal                 PROTO((unsigned HOST_WIDE_INT, int));
339 static void dbxout_type_name            PROTO((tree));
340 static void dbxout_symbol_location      PROTO((tree, tree, char *, rtx));
341 static void dbxout_symbol_name          PROTO((tree, char *, int));
342 static void dbxout_prepare_symbol       PROTO((tree));
343 static void dbxout_finish_symbol        PROTO((tree));
344 static void dbxout_block                PROTO((tree, int, tree));
345 static void dbxout_really_begin_function PROTO((tree));
346 \f
347 #if defined(ASM_OUTPUT_SECTION_NAME)
348 static void
349 dbxout_function_end ()
350 {
351   static int scope_labelno = 0;
352   char lscope_label_name[100];
353   /* Convert Ltext into the appropriate format for local labels in case
354      the system doesn't insert underscores in front of user generated
355      labels.  */
356   ASM_GENERATE_INTERNAL_LABEL (lscope_label_name, "Lscope", scope_labelno);
357   ASM_OUTPUT_INTERNAL_LABEL (asmfile, "Lscope", scope_labelno);
358   scope_labelno++;
359
360   /* By convention, GCC will mark the end of a function with an N_FUN
361      symbol and an empty string.  */
362   fprintf (asmfile, "%s \"\",%d,0,0,", ASM_STABS_OP, N_FUN);
363   assemble_name (asmfile, lscope_label_name);
364   fputc ('-', asmfile);
365   assemble_name (asmfile, XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0));
366   fprintf (asmfile, "\n");
367 }
368 #endif /* ! NO_DBX_FUNCTION_END */
369
370 /* At the beginning of compilation, start writing the symbol table.
371    Initialize `typevec' and output the standard data types of C.  */
372
373 void
374 dbxout_init (asm_file, input_file_name, syms)
375      FILE *asm_file;
376      char *input_file_name;
377      tree syms;
378 {
379   char ltext_label_name[100];
380
381   asmfile = asm_file;
382
383   typevec_len = 100;
384   typevec = (struct typeinfo *) xmalloc (typevec_len * sizeof typevec[0]);
385   bzero ((char *) typevec, typevec_len * sizeof typevec[0]);
386
387   /* Convert Ltext into the appropriate format for local labels in case
388      the system doesn't insert underscores in front of user generated
389      labels.  */
390   ASM_GENERATE_INTERNAL_LABEL (ltext_label_name, "Ltext", 0);
391
392   /* Put the current working directory in an N_SO symbol.  */
393 #ifndef DBX_WORKING_DIRECTORY /* Only some versions of DBX want this,
394                                  but GDB always does.  */
395   if (use_gnu_debug_info_extensions)
396 #endif
397     {
398       if (!cwd && (cwd = getpwd ()) && (!*cwd || cwd[strlen (cwd) - 1] != '/'))
399         {
400           char *wdslash = xmalloc (strlen (cwd) + sizeof (FILE_NAME_JOINER));
401           sprintf (wdslash, "%s%s", cwd, FILE_NAME_JOINER);
402           cwd = wdslash;
403         }
404       if (cwd)
405         {
406 #ifdef DBX_OUTPUT_MAIN_SOURCE_DIRECTORY
407           DBX_OUTPUT_MAIN_SOURCE_DIRECTORY (asmfile, cwd);
408 #else /* no DBX_OUTPUT_MAIN_SOURCE_DIRECTORY */
409           fprintf (asmfile, "%s ", ASM_STABS_OP);
410           output_quoted_string (asmfile, cwd);
411           fprintf (asmfile, ",%d,0,0,%s\n", N_SO, &ltext_label_name[1]);
412 #endif /* no DBX_OUTPUT_MAIN_SOURCE_DIRECTORY */
413         }
414     }
415
416 #ifdef DBX_OUTPUT_MAIN_SOURCE_FILENAME
417   /* This should NOT be DBX_OUTPUT_SOURCE_FILENAME. That
418      would give us an N_SOL, and we want an N_SO.  */
419   DBX_OUTPUT_MAIN_SOURCE_FILENAME (asmfile, input_file_name);
420 #else /* no DBX_OUTPUT_MAIN_SOURCE_FILENAME */
421   /* We include outputting `Ltext:' here,
422      because that gives you a way to override it.  */
423   /* Used to put `Ltext:' before the reference, but that loses on sun 4.  */
424   fprintf (asmfile, "%s ", ASM_STABS_OP);
425   output_quoted_string (asmfile, input_file_name);
426   fprintf (asmfile, ",%d,0,0,%s\n", 
427            N_SO, &ltext_label_name[1]);
428   text_section ();
429   ASM_OUTPUT_INTERNAL_LABEL (asmfile, "Ltext", 0);
430 #endif /* no DBX_OUTPUT_MAIN_SOURCE_FILENAME */
431
432   /* Possibly output something to inform GDB that this compilation was by
433      GCC.  It's easier for GDB to parse it when after the N_SO's.  This
434      is used in Solaris 2.  */
435 #ifdef ASM_IDENTIFY_GCC_AFTER_SOURCE
436   ASM_IDENTIFY_GCC_AFTER_SOURCE (asmfile);
437 #endif
438
439   lastfile = input_file_name;
440
441   next_type_number = 1;
442   next_block_number = 2;
443
444 #ifdef DBX_USE_BINCL
445   current_file = (struct dbx_file *) xmalloc (sizeof *current_file);
446   current_file->next = NULL;
447   current_file->file_number = 0;
448   current_file->next_type_number = 1;
449   next_file_number = 1;
450 #endif
451
452   /* Make sure that types `int' and `char' have numbers 1 and 2.
453      Definitions of other integer types will refer to those numbers.
454      (Actually it should no longer matter what their numbers are.
455      Also, if any types with tags have been defined, dbxout_symbol
456      will output them first, so the numbers won't be 1 and 2.  That
457      happens in C++.  So it's a good thing it should no longer matter).  */
458
459 #ifdef DBX_OUTPUT_STANDARD_TYPES
460   DBX_OUTPUT_STANDARD_TYPES (syms);
461 #else
462   dbxout_symbol (TYPE_NAME (integer_type_node), 0);
463   dbxout_symbol (TYPE_NAME (char_type_node), 0);
464 #endif
465
466   /* Get all permanent types that have typedef names,
467      and output them all, except for those already output.  */
468
469   dbxout_typedefs (syms);
470 }
471
472 /* Output any typedef names for types described by TYPE_DECLs in SYMS,
473    in the reverse order from that which is found in SYMS.  */
474
475 static void
476 dbxout_typedefs (syms)
477      tree syms;
478 {
479   if (syms)
480     {
481       dbxout_typedefs (TREE_CHAIN (syms));
482       if (TREE_CODE (syms) == TYPE_DECL)
483         {
484           tree type = TREE_TYPE (syms);
485           if (TYPE_NAME (type)
486               && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
487               && TYPE_SIZE (type) != NULL_TREE
488               && ! TREE_ASM_WRITTEN (TYPE_NAME (type)))
489             dbxout_symbol (TYPE_NAME (type), 0);
490         }
491     }
492 }
493
494 /* Change to reading from a new source file.  Generate a N_BINCL stab.  */
495
496 void
497 dbxout_start_new_source_file (filename)
498      char *filename;
499 {
500 #ifdef DBX_USE_BINCL
501   struct dbx_file *n = (struct dbx_file *) xmalloc (sizeof *n);
502
503   n->next = current_file;
504   n->file_number = next_file_number++;
505   n->next_type_number = 1;
506   current_file = n;
507   fprintf (asmfile, "%s ", ASM_STABS_OP);
508   output_quoted_string (asmfile, filename);
509   fprintf (asmfile, ",%d,0,0,0\n", N_BINCL);
510 #endif
511 }
512
513 /* Revert to reading a previous source file.  Generate a N_EINCL stab.  */
514
515 void
516 dbxout_resume_previous_source_file ()
517 {
518 #ifdef DBX_USE_BINCL
519   struct dbx_file *next;
520
521   fprintf (asmfile, "%s %d,0,0,0\n", ASM_STABN_OP, N_EINCL);
522   next = current_file->next;
523   free (current_file);
524   current_file = next;
525 #endif
526 }
527
528 /* Output debugging info to FILE to switch to sourcefile FILENAME.  */
529
530 void
531 dbxout_source_file (file, filename)
532      FILE *file;
533      char *filename;
534 {
535   char ltext_label_name[100];
536
537   if (filename && (lastfile == 0 || strcmp (filename, lastfile)))
538     {
539 #ifdef DBX_OUTPUT_SOURCE_FILENAME
540       DBX_OUTPUT_SOURCE_FILENAME (file, filename);
541 #else
542       ASM_GENERATE_INTERNAL_LABEL (ltext_label_name, "Ltext",
543                                    source_label_number);
544       fprintf (file, "%s ", ASM_STABS_OP);
545       output_quoted_string (file, filename);
546       fprintf (file, ",%d,0,0,%s\n", N_SOL, &ltext_label_name[1]);
547       if (current_function_decl != NULL_TREE
548           && DECL_SECTION_NAME (current_function_decl) != NULL_TREE)
549         ; /* Don't change section amid function.  */
550       else
551         text_section ();
552       ASM_OUTPUT_INTERNAL_LABEL (file, "Ltext", source_label_number);
553       source_label_number++;
554 #endif
555       lastfile = filename;
556     }
557 }
558
559 /* Output a line number symbol entry into output stream FILE, 
560    for source file FILENAME and line number LINENO.  */
561
562 void
563 dbxout_source_line (file, filename, lineno)
564      FILE *file;
565      char *filename;
566      int lineno;
567 {
568   dbxout_source_file (file, filename);
569
570 #ifdef ASM_OUTPUT_SOURCE_LINE
571   ASM_OUTPUT_SOURCE_LINE (file, lineno);
572 #else
573   fprintf (file, "\t%s %d,0,%d\n", ASM_STABD_OP, N_SLINE, lineno);
574 #endif
575 }
576
577 /* At the end of compilation, finish writing the symbol table.
578    Unless you define DBX_OUTPUT_MAIN_SOURCE_FILE_END, the default is
579    to do nothing.  */
580
581 void
582 dbxout_finish (file, filename)
583      FILE *file;
584      char *filename;
585 {
586 #ifdef DBX_OUTPUT_MAIN_SOURCE_FILE_END
587   DBX_OUTPUT_MAIN_SOURCE_FILE_END (file, filename);
588 #endif /* DBX_OUTPUT_MAIN_SOURCE_FILE_END */
589 }
590
591 /* Output the index of a type.  */
592
593 static void
594 dbxout_type_index (type)
595      tree type;
596 {
597 #ifndef DBX_USE_BINCL
598   fprintf (asmfile, "%d", TYPE_SYMTAB_ADDRESS (type));
599   CHARS (3);
600 #else
601   struct typeinfo *t = &typevec[TYPE_SYMTAB_ADDRESS (type)];
602   fprintf (asmfile, "(%d,%d)", t->file_number, t->type_number);
603   CHARS (7);
604 #endif
605 }
606
607 #if DBX_CONTIN_LENGTH > 0
608 /* Continue a symbol-description that gets too big.
609    End one symbol table entry with a double-backslash
610    and start a new one, eventually producing something like
611    .stabs "start......\\",code,0,value
612    .stabs "...rest",code,0,value   */
613
614 static void
615 dbxout_continue ()
616 {
617 #ifdef DBX_CONTIN_CHAR
618   fprintf (asmfile, "%c", DBX_CONTIN_CHAR);
619 #else
620   fprintf (asmfile, "\\\\");
621 #endif
622   dbxout_finish_symbol (NULL_TREE);
623   fprintf (asmfile, "%s \"", ASM_STABS_OP);
624   current_sym_nchars = 0;
625 }
626 #endif /* DBX_CONTIN_LENGTH > 0 */
627 \f
628 /* Subroutine of `dbxout_type'.  Output the type fields of TYPE.
629    This must be a separate function because anonymous unions require
630    recursive calls.  */
631
632 static void
633 dbxout_type_fields (type)
634      tree type;
635 {
636   tree tem;
637   /* Output the name, type, position (in bits), size (in bits) of each
638      field.  */
639   for (tem = TYPE_FIELDS (type); tem; tem = TREE_CHAIN (tem))
640     {
641       /* Omit here local type decls until we know how to support them.  */
642       if (TREE_CODE (tem) == TYPE_DECL)
643         continue;
644       /* Omit fields whose position or size are variable.  */
645       else if (TREE_CODE (tem) == FIELD_DECL
646                && (TREE_CODE (DECL_FIELD_BITPOS (tem)) != INTEGER_CST
647                    || TREE_CODE (DECL_SIZE (tem)) != INTEGER_CST))
648         continue;
649       /* Omit here the nameless fields that are used to skip bits.  */
650       else if (DECL_IGNORED_P (tem))
651         continue;
652       else if (TREE_CODE (tem) != CONST_DECL)
653         {
654           /* Continue the line if necessary,
655              but not before the first field.  */
656           if (tem != TYPE_FIELDS (type))
657             {
658               CONTIN;
659             }
660
661           if (use_gnu_debug_info_extensions
662               && flag_minimal_debug
663               && TREE_CODE (tem) == FIELD_DECL
664               && DECL_VIRTUAL_P (tem)
665               && DECL_ASSEMBLER_NAME (tem))
666             {
667               have_used_extensions = 1;
668               CHARS (3 + IDENTIFIER_LENGTH (DECL_ASSEMBLER_NAME (tem)));
669               fputs (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (tem)), asmfile);
670               dbxout_type (DECL_FCONTEXT (tem), 0, 0);
671               fprintf (asmfile, ":");
672               dbxout_type (TREE_TYPE (tem), 0, 0);
673               fputc (',', asmfile);
674               fprintf (asmfile, HOST_WIDE_INT_PRINT_DEC,
675                        TREE_INT_CST_LOW (DECL_FIELD_BITPOS (tem)));
676               fputc (';', asmfile);
677               continue;
678             }
679
680           if (DECL_NAME (tem))
681             {
682               fprintf (asmfile, "%s:", IDENTIFIER_POINTER (DECL_NAME (tem)));
683               CHARS (2 + IDENTIFIER_LENGTH (DECL_NAME (tem)));
684             }
685           else
686             {
687               fprintf (asmfile, ":");
688               CHARS (2);
689             }
690
691           if (use_gnu_debug_info_extensions
692               && (TREE_PRIVATE (tem) || TREE_PROTECTED (tem)
693                   || TREE_CODE (tem) != FIELD_DECL))
694             {
695               have_used_extensions = 1;
696               putc ('/', asmfile);
697               putc ((TREE_PRIVATE (tem) ? '0'
698                      : TREE_PROTECTED (tem) ? '1' : '2'),
699                     asmfile);
700               CHARS (2);
701             }
702
703           dbxout_type ((TREE_CODE (tem) == FIELD_DECL
704                         && DECL_BIT_FIELD_TYPE (tem))
705                        ? DECL_BIT_FIELD_TYPE (tem)
706                        : TREE_TYPE (tem), 0, 0);
707
708           if (TREE_CODE (tem) == VAR_DECL)
709             {
710               if (TREE_STATIC (tem) && use_gnu_debug_info_extensions)
711                 {
712                   char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (tem));
713                   have_used_extensions = 1;
714                   fprintf (asmfile, ":%s;", name);
715                   CHARS (strlen (name));
716                 }
717               else
718                 {
719                   /* If TEM is non-static, GDB won't understand it.  */
720                   fprintf (asmfile, ",0,0;");
721                 }
722             }
723           else if (TREE_CODE (DECL_FIELD_BITPOS (tem)) == INTEGER_CST)
724             {
725               fputc (',', asmfile);
726               fprintf (asmfile, HOST_WIDE_INT_PRINT_DEC,
727                        TREE_INT_CST_LOW (DECL_FIELD_BITPOS (tem)));
728               fputc (',', asmfile);
729               fprintf (asmfile, HOST_WIDE_INT_PRINT_DEC,
730                        TREE_INT_CST_LOW (DECL_SIZE (tem)));
731               fputc (';', asmfile);
732             }
733           CHARS (23);
734         }
735     }
736 }
737 \f
738 /* Subroutine of `dbxout_type_methods'.  Output debug info about the
739    method described DECL.  DEBUG_NAME is an encoding of the method's
740    type signature.  ??? We may be able to do without DEBUG_NAME altogether
741    now.  */
742
743 static void
744 dbxout_type_method_1 (decl, debug_name)
745      tree decl;
746      char *debug_name;
747 {
748   char c1 = 'A', c2;
749
750   if (TREE_CODE (TREE_TYPE (decl)) == FUNCTION_TYPE)
751     c2 = '?';
752   else /* it's a METHOD_TYPE.  */
753     {
754       tree firstarg = TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (decl)));
755       /* A for normal functions.
756          B for `const' member functions.
757          C for `volatile' member functions.
758          D for `const volatile' member functions.  */
759       if (TYPE_READONLY (TREE_TYPE (firstarg)))
760         c1 += 1;
761       if (TYPE_VOLATILE (TREE_TYPE (firstarg)))
762         c1 += 2;
763
764       if (DECL_VINDEX (decl))
765         c2 = '*';
766       else
767         c2 = '.';
768     }
769
770   fprintf (asmfile, ":%s;%c%c%c", debug_name,
771            TREE_PRIVATE (decl) ? '0' : TREE_PROTECTED (decl) ? '1' : '2', c1, c2);
772   CHARS (IDENTIFIER_LENGTH (DECL_ASSEMBLER_NAME (decl)) + 6
773          - (debug_name - IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl))));
774   if (DECL_VINDEX (decl))
775     {
776       fprintf (asmfile, HOST_WIDE_INT_PRINT_DEC,
777                TREE_INT_CST_LOW (DECL_VINDEX (decl)));
778       fputc (';', asmfile);
779       dbxout_type (DECL_CONTEXT (decl), 0, 0);
780       fprintf (asmfile, ";");
781       CHARS (8);
782     }
783 }
784 \f
785 /* Subroutine of `dbxout_type'.  Output debug info about the methods defined
786    in TYPE.  */
787
788 static void
789 dbxout_type_methods (type)
790      register tree type;
791 {
792   /* C++: put out the method names and their parameter lists */
793   tree methods = TYPE_METHODS (type);
794   tree type_encoding;
795   register tree fndecl;
796   register tree last;
797   char formatted_type_identifier_length[16];
798   register int type_identifier_length;
799
800   if (methods == NULL_TREE)
801     return;
802
803   type_encoding = DECL_NAME (TYPE_NAME (type));
804
805 #if 0
806   /* C++: Template classes break some assumptions made by this code about
807      the class names, constructor names, and encodings for assembler
808      label names.  For now, disable output of dbx info for them.  */
809   {
810     char *ptr = IDENTIFIER_POINTER (type_encoding);
811     /* This should use index.  (mrs) */
812     while (*ptr && *ptr != '<') ptr++;
813     if (*ptr != 0)
814       {
815         static int warned;
816         if (!warned)
817           {
818             warned = 1;
819 #ifdef HAVE_TEMPLATES
820             if (warn_template_debugging)
821               warning ("dbx info for template class methods not yet supported");
822 #endif
823           }
824         return;
825       }
826   }
827 #endif
828
829   type_identifier_length = IDENTIFIER_LENGTH (type_encoding);
830
831   sprintf(formatted_type_identifier_length, "%d", type_identifier_length);
832
833   if (TREE_CODE (methods) != TREE_VEC)
834     fndecl = methods;
835   else if (TREE_VEC_ELT (methods, 0) != NULL_TREE)
836     fndecl = TREE_VEC_ELT (methods, 0);
837   else
838     fndecl = TREE_VEC_ELT (methods, 1);
839
840   while (fndecl)
841     {
842       tree name = DECL_NAME (fndecl);
843       int need_prefix = 1;
844
845       /* Group together all the methods for the same operation.
846          These differ in the types of the arguments.  */
847       for (last = NULL_TREE;
848            fndecl && (last == NULL_TREE || DECL_NAME (fndecl) == DECL_NAME (last));
849            fndecl = TREE_CHAIN (fndecl))
850         /* Output the name of the field (after overloading), as
851            well as the name of the field before overloading, along
852            with its parameter list */
853         {
854           /* This is the "mangled" name of the method.
855              It encodes the argument types.  */
856           char *debug_name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (fndecl));
857           int show_arg_types = 0;
858
859           CONTIN;
860
861           last = fndecl;
862
863           if (DECL_IGNORED_P (fndecl))
864             continue;
865
866           if (flag_minimal_debug)
867             {
868               char marker;
869
870               /* We can't optimize a method which uses an anonymous
871                  class, because the debugger will not be able to
872                  associate the arbitrary class name with the actual
873                  class.  */
874 #ifndef NO_DOLLAR_IN_LABEL
875               marker = '$';
876 #else
877               marker = '.';
878 #endif
879               if (strchr (debug_name, marker))
880                 show_arg_types = 1;
881               /* Detect ordinary methods because their mangled names
882                  start with the operation name.  */
883               else if (!strncmp (IDENTIFIER_POINTER (name), debug_name,
884                                  IDENTIFIER_LENGTH (name)))
885                 {
886                   debug_name += IDENTIFIER_LENGTH (name);
887                   if (debug_name[0] == '_' && debug_name[1] == '_')
888                     {
889                       char *method_name = debug_name + 2;
890                       char *length_ptr = formatted_type_identifier_length;
891                       /* Get past const and volatile qualifiers.  */
892                       while (*method_name == 'C' || *method_name == 'V')
893                         method_name++;
894                       /* Skip digits for length of type_encoding.  */
895                       while (*method_name == *length_ptr && *length_ptr)
896                           length_ptr++, method_name++;
897                       if (! strncmp (method_name,
898                                      IDENTIFIER_POINTER (type_encoding),
899                                      type_identifier_length))
900                         method_name += type_identifier_length;
901                       debug_name = method_name;
902                     }
903                 }
904               /* Detect constructors by their style of name mangling.  */
905               else if (debug_name[0] == '_' && debug_name[1] == '_')
906                 {
907                   char *ctor_name = debug_name + 2;
908                   char *length_ptr = formatted_type_identifier_length;
909                   while (*ctor_name == 'C' || *ctor_name == 'V')
910                     ctor_name++;
911                   /* Skip digits for length of type_encoding.  */
912                   while (*ctor_name == *length_ptr && *length_ptr)
913                       length_ptr++, ctor_name++;
914                   if (!strncmp (IDENTIFIER_POINTER (type_encoding), ctor_name,
915                                 type_identifier_length))
916                     debug_name = ctor_name + type_identifier_length;
917                 }
918               /* The other alternative is a destructor.  */
919               else
920                 show_arg_types = 1;
921
922               /* Output the operation name just once, for the first method
923                  that we output.  */
924               if (need_prefix)
925                 {
926                   fprintf (asmfile, "%s::", IDENTIFIER_POINTER (name));
927                   CHARS (IDENTIFIER_LENGTH (name) + 2);
928                   need_prefix = 0;
929                 }
930             }
931
932           dbxout_type (TREE_TYPE (fndecl), 0, show_arg_types);
933
934           dbxout_type_method_1 (fndecl, debug_name);
935         }
936       if (!need_prefix)
937         {
938           putc (';', asmfile);
939           CHARS (1);
940         }
941     }
942 }
943
944 /* Emit a "range" type specification, which has the form:
945    "r<index type>;<lower bound>;<upper bound>;".
946    TYPE is an INTEGER_TYPE.  */
947
948 static void
949 dbxout_range_type (type)
950      tree type;
951 {
952   fprintf (asmfile, "r");
953   if (TREE_TYPE (type))
954     dbxout_type (TREE_TYPE (type), 0, 0);
955   else if (TREE_CODE (type) != INTEGER_TYPE)
956     dbxout_type (type, 0, 0); /* E.g. Pascal's ARRAY [BOOLEAN] of INTEGER */
957   else
958     {
959       /* Traditionally, we made sure 'int' was type 1, and builtin types
960          were defined to be sub-ranges of int.  Unfortunately, this
961          does not allow us to distinguish true sub-ranges from integer
962          types.  So, instead we define integer (non-sub-range) types as
963          sub-ranges of themselves.  */
964       dbxout_type_index (type);
965     }
966   if (TREE_CODE (TYPE_MIN_VALUE (type)) == INTEGER_CST)
967     {
968       fputc (';', asmfile);
969       fprintf (asmfile, HOST_WIDE_INT_PRINT_DEC,
970                TREE_INT_CST_LOW (TYPE_MIN_VALUE (type)));
971     }
972   else
973     fprintf (asmfile, ";0");
974   if (TYPE_MAX_VALUE (type) 
975       && TREE_CODE (TYPE_MAX_VALUE (type)) == INTEGER_CST)
976     {
977       fputc (';', asmfile);
978       fprintf (asmfile, HOST_WIDE_INT_PRINT_DEC,
979                TREE_INT_CST_LOW (TYPE_MAX_VALUE (type)));
980       fputc (';', asmfile);
981     }
982   else
983     fprintf (asmfile, ";-1;");
984 }
985 \f
986 /* Output a reference to a type.  If the type has not yet been
987    described in the dbx output, output its definition now.
988    For a type already defined, just refer to its definition
989    using the type number.
990
991    If FULL is nonzero, and the type has been described only with
992    a forward-reference, output the definition now.
993    If FULL is zero in this case, just refer to the forward-reference
994    using the number previously allocated.
995
996    If SHOW_ARG_TYPES is nonzero, we output a description of the argument
997    types for a METHOD_TYPE.  */
998
999 static void
1000 dbxout_type (type, full, show_arg_types)
1001      tree type;
1002      int full;
1003      int show_arg_types;
1004 {
1005   register tree tem;
1006   static int anonymous_type_number = 0;
1007
1008   /* If there was an input error and we don't really have a type,
1009      avoid crashing and write something that is at least valid
1010      by assuming `int'.  */
1011   if (type == error_mark_node)
1012     type = integer_type_node;
1013   else
1014     {
1015       /* Try to find the "main variant" with the same name but not const
1016          or volatile.  (Since stabs does not distinguish const and volatile,
1017          there is no need to make them separate types.  But types with
1018          different names are usefully distinguished.) */
1019          
1020       for (tem = TYPE_MAIN_VARIANT (type); tem; tem = TYPE_NEXT_VARIANT (tem))
1021         if (!TYPE_READONLY (tem) && !TYPE_VOLATILE (tem)
1022             && TYPE_NAME (tem) == TYPE_NAME (type))
1023           {
1024             type = tem;
1025             break;
1026           }
1027       if (TYPE_NAME (type)
1028           && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
1029           && TYPE_DECL_SUPPRESS_DEBUG (TYPE_NAME (type)))
1030         full = 0;
1031     }
1032
1033   if (TYPE_SYMTAB_ADDRESS (type) == 0)
1034     {
1035       /* Type has no dbx number assigned.  Assign next available number.  */
1036       TYPE_SYMTAB_ADDRESS (type) = next_type_number++;
1037
1038       /* Make sure type vector is long enough to record about this type.  */
1039
1040       if (next_type_number == typevec_len)
1041         {
1042           typevec
1043             = (struct typeinfo *) xrealloc (typevec,
1044                                             typevec_len * 2 * sizeof typevec[0]);
1045           bzero ((char *) (typevec + typevec_len),
1046                  typevec_len * sizeof typevec[0]);
1047           typevec_len *= 2;
1048         }
1049
1050 #ifdef DBX_USE_BINCL
1051       typevec[TYPE_SYMTAB_ADDRESS (type)].file_number
1052         = current_file->file_number;
1053       typevec[TYPE_SYMTAB_ADDRESS (type)].type_number
1054         = current_file->next_type_number++;
1055 #endif
1056     }
1057
1058   /* Output the number of this type, to refer to it.  */
1059   dbxout_type_index (type);
1060
1061 #ifdef DBX_TYPE_DEFINED
1062   if (DBX_TYPE_DEFINED (type))
1063     return;
1064 #endif
1065
1066   /* If this type's definition has been output or is now being output,
1067      that is all.  */
1068
1069   switch (typevec[TYPE_SYMTAB_ADDRESS (type)].status)
1070     {
1071     case TYPE_UNSEEN:
1072       break;
1073     case TYPE_XREF:
1074       /* If we have already had a cross reference,
1075          and either that's all we want or that's the best we could do,
1076          don't repeat the cross reference.
1077          Sun dbx crashes if we do.  */
1078       if (! full || TYPE_SIZE (type) == 0
1079           /* No way in DBX fmt to describe a variable size.  */
1080           || TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
1081         return;
1082       break;
1083     case TYPE_DEFINED:
1084       return;
1085     }
1086
1087 #ifdef DBX_NO_XREFS
1088   /* For systems where dbx output does not allow the `=xsNAME:' syntax,
1089      leave the type-number completely undefined rather than output
1090      a cross-reference.  If we have already used GNU debug info extensions,
1091      then it is OK to output a cross reference.  This is necessary to get
1092      proper C++ debug output.  */
1093   if ((TREE_CODE (type) == RECORD_TYPE || TREE_CODE (type) == UNION_TYPE
1094        || TREE_CODE (type) == QUAL_UNION_TYPE
1095        || TREE_CODE (type) == ENUMERAL_TYPE)
1096       && ! use_gnu_debug_info_extensions)
1097     /* We must use the same test here as we use twice below when deciding
1098        whether to emit a cross-reference.  */
1099     if ((TYPE_NAME (type) != 0
1100          && ! (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
1101                && DECL_IGNORED_P (TYPE_NAME (type)))
1102          && !full)
1103         || TYPE_SIZE (type) == 0
1104         /* No way in DBX fmt to describe a variable size.  */
1105         || TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
1106       {
1107         typevec[TYPE_SYMTAB_ADDRESS (type)].status = TYPE_XREF;
1108         return;
1109       }
1110 #endif
1111
1112   /* Output a definition now.  */
1113
1114   fprintf (asmfile, "=");
1115   CHARS (1);
1116
1117   /* Mark it as defined, so that if it is self-referent
1118      we will not get into an infinite recursion of definitions.  */
1119
1120   typevec[TYPE_SYMTAB_ADDRESS (type)].status = TYPE_DEFINED;
1121
1122   if (TYPE_NAME (type) && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
1123       && DECL_ORIGINAL_TYPE (TYPE_NAME (type)))
1124     { 
1125       dbxout_type (DECL_ORIGINAL_TYPE (TYPE_NAME (type)), 0, 0);
1126       return;
1127     }
1128
1129   switch (TREE_CODE (type))
1130     {
1131     case VOID_TYPE:
1132     case LANG_TYPE:
1133       /* For a void type, just define it as itself; ie, "5=5".
1134          This makes us consider it defined
1135          without saying what it is.  The debugger will make it
1136          a void type when the reference is seen, and nothing will
1137          ever override that default.  */
1138       dbxout_type_index (type);
1139       break;
1140
1141     case INTEGER_TYPE:
1142       if (type == char_type_node && ! TREE_UNSIGNED (type))
1143         {
1144           /* Output the type `char' as a subrange of itself!
1145              I don't understand this definition, just copied it
1146              from the output of pcc.
1147              This used to use `r2' explicitly and we used to
1148              take care to make sure that `char' was type number 2.  */
1149           fprintf (asmfile, "r");
1150           dbxout_type_index (type);
1151           fprintf (asmfile, ";0;127;");
1152         }
1153       /* This used to check if the type's precision was more than
1154          HOST_BITS_PER_WIDE_INT.  That is wrong since gdb uses a
1155          long (it has no concept of HOST_BITS_PER_WIDE_INT).  */
1156       else if (use_gnu_debug_info_extensions
1157                && (TYPE_PRECISION (type) > TYPE_PRECISION (integer_type_node)
1158                    || TYPE_PRECISION (type) >= HOST_BITS_PER_LONG))
1159         {
1160           /* This used to say `r1' and we used to take care
1161              to make sure that `int' was type number 1.  */
1162           fprintf (asmfile, "r");
1163           dbxout_type_index (integer_type_node);
1164           fprintf (asmfile, ";");
1165           print_int_cst_octal (TYPE_MIN_VALUE (type));
1166           fprintf (asmfile, ";");
1167           print_int_cst_octal (TYPE_MAX_VALUE (type));
1168           fprintf (asmfile, ";");
1169         }
1170       else /* Output other integer types as subranges of `int'.  */
1171         dbxout_range_type (type);
1172       CHARS (22);
1173       break;
1174
1175     case REAL_TYPE:
1176       /* This used to say `r1' and we used to take care
1177          to make sure that `int' was type number 1.  */
1178       fprintf (asmfile, "r");
1179       dbxout_type_index (integer_type_node);
1180       fputc (';', asmfile);
1181       fprintf (asmfile, HOST_WIDE_INT_PRINT_DEC, int_size_in_bytes (type));
1182       fputs (";0;", asmfile);
1183       CHARS (13);
1184       break;
1185
1186     case CHAR_TYPE:
1187       if (use_gnu_debug_info_extensions)
1188         {
1189           fputs ("@s", asmfile);
1190           fprintf (asmfile, HOST_WIDE_INT_PRINT_DEC,
1191                    BITS_PER_UNIT * int_size_in_bytes (type));
1192           fputs (";-20;", asmfile);
1193         }
1194       else
1195         {
1196           /* Output the type `char' as a subrange of itself.
1197              That is what pcc seems to do.  */
1198           fprintf (asmfile, "r");
1199           dbxout_type_index (char_type_node);
1200           fprintf (asmfile, ";0;%d;", TREE_UNSIGNED (type) ? 255 : 127);
1201         }
1202       CHARS (9);
1203       break;
1204
1205     case BOOLEAN_TYPE:
1206       if (use_gnu_debug_info_extensions)
1207         {
1208           fputs ("@s", asmfile);
1209           fprintf (asmfile, HOST_WIDE_INT_PRINT_DEC,
1210                    BITS_PER_UNIT * int_size_in_bytes (type));
1211           fputs (";-16;", asmfile);
1212         }
1213       else /* Define as enumeral type (False, True) */
1214         fprintf (asmfile, "eFalse:0,True:1,;");
1215       CHARS (17);
1216       break;
1217
1218     case FILE_TYPE:
1219       putc ('d', asmfile);
1220       CHARS (1);
1221       dbxout_type (TREE_TYPE (type), 0, 0);
1222       break;
1223
1224     case COMPLEX_TYPE:
1225       /* Differs from the REAL_TYPE by its new data type number */
1226
1227       if (TREE_CODE (TREE_TYPE (type)) == REAL_TYPE)
1228         {
1229           fprintf (asmfile, "r");
1230           dbxout_type_index (type);
1231           fputc (';', asmfile);
1232           fprintf (asmfile, HOST_WIDE_INT_PRINT_DEC,
1233                    int_size_in_bytes (TREE_TYPE (type)));
1234           fputs (";0;", asmfile);
1235           CHARS (12);           /* The number is probably incorrect here.  */
1236         }
1237       else
1238         {
1239           /* Output a complex integer type as a structure,
1240              pending some other way to do it.  */
1241           fputc ('s', asmfile);
1242           fprintf (asmfile, HOST_WIDE_INT_PRINT_DEC, int_size_in_bytes (type));
1243
1244           fprintf (asmfile, "real:");
1245           CHARS (10);
1246           dbxout_type (TREE_TYPE (type), 0, 0);
1247           fprintf (asmfile, ",%d,%d;",
1248                    0, TYPE_PRECISION (TREE_TYPE (type)));
1249           CHARS (8);
1250           fprintf (asmfile, "imag:");
1251           CHARS (5);
1252           dbxout_type (TREE_TYPE (type), 0, 0);
1253           fprintf (asmfile, ",%d,%d;;",
1254                    TYPE_PRECISION (TREE_TYPE (type)),
1255                    TYPE_PRECISION (TREE_TYPE (type)));
1256           CHARS (9);
1257         }
1258       break;
1259
1260     case SET_TYPE:
1261       if (use_gnu_debug_info_extensions)
1262         {
1263           have_used_extensions = 1;
1264           fputs ("@s", asmfile);
1265           fprintf (asmfile, HOST_WIDE_INT_PRINT_DEC,
1266                    BITS_PER_UNIT * int_size_in_bytes (type));
1267           fputc (';', asmfile);
1268           /* Check if a bitstring type, which in Chill is
1269              different from a [power]set.  */
1270           if (TYPE_STRING_FLAG (type))
1271             fprintf (asmfile, "@S;");
1272         }
1273       putc ('S', asmfile);
1274       CHARS (1);
1275       dbxout_type (TYPE_DOMAIN (type), 0, 0);
1276       break;
1277
1278     case ARRAY_TYPE:
1279       /* Output "a" followed by a range type definition
1280          for the index type of the array
1281          followed by a reference to the target-type.
1282          ar1;0;N;M for a C array of type M and size N+1.  */
1283       /* Check if a character string type, which in Chill is
1284          different from an array of characters.  */
1285       if (TYPE_STRING_FLAG (type) && use_gnu_debug_info_extensions)
1286         {
1287           have_used_extensions = 1;
1288           fprintf (asmfile, "@S;");
1289         }
1290       tem = TYPE_DOMAIN (type);
1291       if (tem == NULL)
1292         {
1293           fprintf (asmfile, "ar");
1294           dbxout_type_index (integer_type_node);
1295           fprintf (asmfile, ";0;-1;");
1296         }
1297       else
1298         {
1299           fprintf (asmfile, "a");
1300           dbxout_range_type (tem);
1301         }
1302       CHARS (14);
1303       dbxout_type (TREE_TYPE (type), 0, 0);
1304       break;
1305
1306     case RECORD_TYPE:
1307     case UNION_TYPE:
1308     case QUAL_UNION_TYPE:
1309       {
1310         int i, n_baseclasses = 0;
1311
1312         if (TYPE_BINFO (type) != 0
1313             && TREE_CODE (TYPE_BINFO (type)) == TREE_VEC
1314             && TYPE_BINFO_BASETYPES (type) != 0)
1315           n_baseclasses = TREE_VEC_LENGTH (TYPE_BINFO_BASETYPES (type));
1316
1317         /* Output a structure type.  We must use the same test here as we
1318            use in the DBX_NO_XREFS case above.  */
1319         if ((TYPE_NAME (type) != 0
1320              && ! (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
1321                    && DECL_IGNORED_P (TYPE_NAME (type)))
1322              && !full)
1323             || TYPE_SIZE (type) == 0
1324             /* No way in DBX fmt to describe a variable size.  */
1325             || TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
1326           {
1327             /* If the type is just a cross reference, output one
1328                and mark the type as partially described.
1329                If it later becomes defined, we will output
1330                its real definition.
1331                If the type has a name, don't nest its definition within
1332                another type's definition; instead, output an xref
1333                and let the definition come when the name is defined.  */
1334             fprintf (asmfile, (TREE_CODE (type) == RECORD_TYPE) ? "xs" : "xu");
1335             CHARS (3);
1336 #if 0 /* This assertion is legitimately false in C++.  */
1337             /* We shouldn't be outputting a reference to a type before its
1338                definition unless the type has a tag name.
1339                A typedef name without a tag name should be impossible.  */
1340             if (TREE_CODE (TYPE_NAME (type)) != IDENTIFIER_NODE)
1341               abort ();
1342 #endif
1343             if (TYPE_NAME (type) != 0)
1344               dbxout_type_name (type);
1345             else
1346               fprintf (asmfile, "$$%d", anonymous_type_number++);
1347             fprintf (asmfile, ":");
1348             typevec[TYPE_SYMTAB_ADDRESS (type)].status = TYPE_XREF;
1349             break;
1350           }
1351
1352         /* Identify record or union, and print its size.  */
1353         fputc (((TREE_CODE (type) == RECORD_TYPE) ? 's' : 'u'), asmfile);
1354         fprintf (asmfile, HOST_WIDE_INT_PRINT_DEC,
1355                  int_size_in_bytes (type));
1356
1357         if (use_gnu_debug_info_extensions)
1358           {
1359             if (n_baseclasses)
1360               {
1361                 have_used_extensions = 1;
1362                 fprintf (asmfile, "!%d,", n_baseclasses);
1363                 CHARS (8);
1364               }
1365           }
1366         for (i = 0; i < n_baseclasses; i++)
1367           {
1368             tree child = TREE_VEC_ELT (BINFO_BASETYPES (TYPE_BINFO (type)), i);
1369             if (use_gnu_debug_info_extensions)
1370               {
1371                 have_used_extensions = 1;
1372                 putc (TREE_VIA_VIRTUAL (child) ? '1'
1373                       : '0',
1374                       asmfile);
1375                 putc (TREE_VIA_PUBLIC (child) ? '2'
1376                       : '0',
1377                       asmfile);
1378                 fprintf (asmfile, HOST_WIDE_INT_PRINT_DEC,
1379                          TREE_INT_CST_LOW (BINFO_OFFSET (child)) * BITS_PER_UNIT);
1380                 fputc (',', asmfile);
1381                 CHARS (15);
1382                 dbxout_type (BINFO_TYPE (child), 0, 0);
1383                 putc (';', asmfile);
1384               }
1385             else
1386               {
1387                 /* Print out the base class information with fields
1388                    which have the same names at the types they hold.  */
1389                 dbxout_type_name (BINFO_TYPE (child));
1390                 putc (':', asmfile);
1391                 dbxout_type (BINFO_TYPE (child), full, 0);
1392                 fputc (',', asmfile);
1393                 fprintf (asmfile, HOST_WIDE_INT_PRINT_DEC,
1394                          TREE_INT_CST_LOW (BINFO_OFFSET (child)) * BITS_PER_UNIT);
1395                 fputc (',', asmfile);
1396                 fprintf (asmfile, HOST_WIDE_INT_PRINT_DEC,
1397                          TREE_INT_CST_LOW (DECL_SIZE (TYPE_NAME (BINFO_TYPE (child)))) * BITS_PER_UNIT);
1398                 fputc (';', asmfile);
1399                 CHARS (20);
1400               }
1401           }
1402       }
1403
1404       CHARS (11);
1405
1406       /* Write out the field declarations.  */
1407       dbxout_type_fields (type);
1408       if (use_gnu_debug_info_extensions && TYPE_METHODS (type) != NULL_TREE)
1409         {
1410           have_used_extensions = 1;
1411           dbxout_type_methods (type);
1412         }
1413       putc (';', asmfile);
1414
1415       if (use_gnu_debug_info_extensions && TREE_CODE (type) == RECORD_TYPE
1416           /* Avoid the ~ if we don't really need it--it confuses dbx.  */
1417           && TYPE_VFIELD (type))
1418         {
1419           have_used_extensions = 1;
1420
1421           /* Tell GDB+ that it may keep reading.  */
1422           putc ('~', asmfile);
1423
1424           /* We need to write out info about what field this class
1425              uses as its "main" vtable pointer field, because if this
1426              field is inherited from a base class, GDB cannot necessarily
1427              figure out which field it's using in time.  */
1428           if (TYPE_VFIELD (type))
1429             {
1430               putc ('%', asmfile);
1431               dbxout_type (DECL_FCONTEXT (TYPE_VFIELD (type)), 0, 0);
1432             }
1433           putc (';', asmfile);
1434           CHARS (3);
1435         }
1436       break;
1437
1438     case ENUMERAL_TYPE:
1439       /* We must use the same test here as we use in the DBX_NO_XREFS case
1440          above.  We simplify it a bit since an enum will never have a variable
1441          size.  */
1442       if ((TYPE_NAME (type) != 0
1443            && ! (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
1444                  && DECL_IGNORED_P (TYPE_NAME (type)))
1445            && !full)
1446           || TYPE_SIZE (type) == 0)
1447         {
1448           fprintf (asmfile, "xe");
1449           CHARS (3);
1450           dbxout_type_name (type);
1451           typevec[TYPE_SYMTAB_ADDRESS (type)].status = TYPE_XREF;
1452           fprintf (asmfile, ":");
1453           return;
1454         }
1455 #ifdef DBX_OUTPUT_ENUM
1456       DBX_OUTPUT_ENUM (asmfile, type);
1457 #else
1458       if (use_gnu_debug_info_extensions
1459           && TYPE_PRECISION (type) != TYPE_PRECISION (integer_type_node))
1460         fprintf (asmfile, "@s%d;", TYPE_PRECISION (type));
1461       putc ('e', asmfile);
1462       CHARS (1);
1463       for (tem = TYPE_VALUES (type); tem; tem = TREE_CHAIN (tem))
1464         {
1465           fprintf (asmfile, "%s:", IDENTIFIER_POINTER (TREE_PURPOSE (tem)));
1466           if (TREE_INT_CST_HIGH (TREE_VALUE (tem)) == 0)
1467             fprintf (asmfile, HOST_WIDE_INT_PRINT_UNSIGNED,
1468                      TREE_INT_CST_LOW (TREE_VALUE (tem)));
1469           else if (TREE_INT_CST_HIGH (TREE_VALUE (tem)) == -1
1470                    && TREE_INT_CST_LOW (TREE_VALUE (tem)) < 0)
1471             fprintf (asmfile, HOST_WIDE_INT_PRINT_DEC,
1472                      TREE_INT_CST_LOW (TREE_VALUE (tem)));
1473           else
1474             print_int_cst_octal (TREE_VALUE (tem));
1475           fprintf (asmfile, ",");
1476           CHARS (20 + IDENTIFIER_LENGTH (TREE_PURPOSE (tem)));
1477           if (TREE_CHAIN (tem) != 0)
1478             {
1479               CONTIN;
1480             }
1481         }
1482       putc (';', asmfile);
1483       CHARS (1);
1484 #endif
1485       break;
1486
1487     case POINTER_TYPE:
1488       putc ('*', asmfile);
1489       CHARS (1);
1490       dbxout_type (TREE_TYPE (type), 0, 0);
1491       break;
1492
1493     case METHOD_TYPE:
1494       if (use_gnu_debug_info_extensions)
1495         {
1496           have_used_extensions = 1;
1497           putc ('#', asmfile);
1498           CHARS (1);
1499           if (flag_minimal_debug && !show_arg_types)
1500             {
1501               /* Normally, just output the return type.
1502                  The argument types are encoded in the method name.  */
1503               putc ('#', asmfile);
1504               CHARS (1);
1505               dbxout_type (TREE_TYPE (type), 0, 0);
1506               putc (';', asmfile);
1507               CHARS (1);
1508             }
1509           else
1510             {
1511               /* When outputting destructors, we need to write
1512                  the argument types out longhand.  */
1513               dbxout_type (TYPE_METHOD_BASETYPE (type), 0, 0);
1514               putc (',', asmfile);
1515               CHARS (1);
1516               dbxout_type (TREE_TYPE (type), 0, 0);
1517               dbxout_args (TYPE_ARG_TYPES (type));
1518               putc (';', asmfile);
1519               CHARS (1);
1520             }
1521         }
1522       else
1523         {
1524           /* Treat it as a function type.  */
1525           dbxout_type (TREE_TYPE (type), 0, 0);
1526         }
1527       break;
1528
1529     case OFFSET_TYPE:
1530       if (use_gnu_debug_info_extensions)
1531         {
1532           have_used_extensions = 1;
1533           putc ('@', asmfile);
1534           CHARS (1);
1535           dbxout_type (TYPE_OFFSET_BASETYPE (type), 0, 0);
1536           putc (',', asmfile);
1537           CHARS (1);
1538           dbxout_type (TREE_TYPE (type), 0, 0);
1539         }
1540       else
1541         {
1542           /* Should print as an int, because it is really
1543              just an offset.  */
1544           dbxout_type (integer_type_node, 0, 0);
1545         }
1546       break;
1547
1548     case REFERENCE_TYPE:
1549       if (use_gnu_debug_info_extensions)
1550         have_used_extensions = 1;
1551       putc (use_gnu_debug_info_extensions ? '&' : '*', asmfile);
1552       CHARS (1);
1553       dbxout_type (TREE_TYPE (type), 0, 0);
1554       break;
1555
1556     case FUNCTION_TYPE:
1557       putc ('f', asmfile);
1558       CHARS (1);
1559       dbxout_type (TREE_TYPE (type), 0, 0);
1560       break;
1561
1562     default:
1563       abort ();
1564     }
1565 }
1566
1567 /* Print the value of integer constant C, in octal,
1568    handling double precision.  */
1569
1570 static void
1571 print_int_cst_octal (c)
1572      tree c;
1573 {
1574   unsigned HOST_WIDE_INT high = TREE_INT_CST_HIGH (c);
1575   unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (c);
1576   int excess = (3 - (HOST_BITS_PER_WIDE_INT % 3));
1577   int width = TYPE_PRECISION (TREE_TYPE (c));
1578
1579   /* GDB wants constants with no extra leading "1" bits, so
1580      we need to remove any sign-extension that might be
1581      present.  */
1582   if (width == HOST_BITS_PER_WIDE_INT * 2)
1583     ;
1584   else if (width > HOST_BITS_PER_WIDE_INT)
1585     high &= (((HOST_WIDE_INT) 1 << (width - HOST_BITS_PER_WIDE_INT)) - 1);
1586   else if (width == HOST_BITS_PER_WIDE_INT)
1587     high = 0;
1588   else
1589     high = 0, low &= (((HOST_WIDE_INT) 1 << width) - 1);
1590
1591   fprintf (asmfile, "0");
1592
1593   if (excess == 3)
1594     {
1595       print_octal (high, HOST_BITS_PER_WIDE_INT / 3);
1596       print_octal (low, HOST_BITS_PER_WIDE_INT / 3);
1597     }
1598   else
1599     {
1600       unsigned HOST_WIDE_INT beg = high >> excess;
1601       unsigned HOST_WIDE_INT middle
1602         = ((high & (((HOST_WIDE_INT) 1 << excess) - 1)) << (3 - excess)
1603            | (low >> (HOST_BITS_PER_WIDE_INT / 3 * 3)));
1604       unsigned HOST_WIDE_INT end
1605         = low & (((unsigned HOST_WIDE_INT) 1
1606                   << (HOST_BITS_PER_WIDE_INT / 3 * 3))
1607                  - 1);
1608
1609       fprintf (asmfile, "%o%01o", (int)beg, (int)middle);
1610       print_octal (end, HOST_BITS_PER_WIDE_INT / 3);
1611     }
1612 }
1613
1614 static void
1615 print_octal (value, digits)
1616      unsigned HOST_WIDE_INT value;
1617      int digits;
1618 {
1619   int i;
1620
1621   for (i = digits - 1; i >= 0; i--)
1622     fprintf (asmfile, "%01o", (int)((value >> (3 * i)) & 7));
1623 }
1624
1625 /* Output the name of type TYPE, with no punctuation.
1626    Such names can be set up either by typedef declarations
1627    or by struct, enum and union tags.  */
1628
1629 static void
1630 dbxout_type_name (type)
1631      register tree type;
1632 {
1633   tree t;
1634   if (TYPE_NAME (type) == 0)
1635     abort ();
1636   if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE)
1637     {
1638       t = TYPE_NAME (type);
1639     }
1640   else if (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL)
1641     {
1642       t = DECL_NAME (TYPE_NAME (type));
1643     }
1644   else
1645     abort ();
1646
1647   fprintf (asmfile, "%s", IDENTIFIER_POINTER (t));
1648   CHARS (IDENTIFIER_LENGTH (t));
1649 }
1650 \f
1651 /* Output a .stabs for the symbol defined by DECL,
1652    which must be a ..._DECL node in the normal namespace.
1653    It may be a CONST_DECL, a FUNCTION_DECL, a PARM_DECL or a VAR_DECL.
1654    LOCAL is nonzero if the scope is less than the entire file.  */
1655
1656 void
1657 dbxout_symbol (decl, local)
1658      tree decl;
1659      int local;
1660 {
1661   tree type = TREE_TYPE (decl);
1662   tree context = NULL_TREE;
1663
1664   /* Cast avoids warning in old compilers.  */
1665   current_sym_code = (STAB_CODE_TYPE) 0;
1666   current_sym_value = 0;
1667   current_sym_addr = 0;
1668
1669   /* Ignore nameless syms, but don't ignore type tags.  */
1670
1671   if ((DECL_NAME (decl) == 0 && TREE_CODE (decl) != TYPE_DECL)
1672       || DECL_IGNORED_P (decl))
1673     return;
1674
1675   dbxout_prepare_symbol (decl);
1676
1677   /* The output will always start with the symbol name,
1678      so always count that in the length-output-so-far.  */
1679
1680   if (DECL_NAME (decl) != 0)
1681     current_sym_nchars = 2 + IDENTIFIER_LENGTH (DECL_NAME (decl));
1682
1683   switch (TREE_CODE (decl))
1684     {
1685     case CONST_DECL:
1686       /* Enum values are defined by defining the enum type.  */
1687       break;
1688
1689     case FUNCTION_DECL:
1690       if (DECL_RTL (decl) == 0)
1691         return;
1692       if (DECL_EXTERNAL (decl))
1693         break;
1694       /* Don't mention a nested function under its parent.  */
1695       context = decl_function_context (decl);
1696       if (context == current_function_decl)
1697         break;
1698       if (GET_CODE (DECL_RTL (decl)) != MEM
1699           || GET_CODE (XEXP (DECL_RTL (decl), 0)) != SYMBOL_REF)
1700         break;
1701       FORCE_TEXT;
1702
1703       fprintf (asmfile, "%s \"%s:%c", ASM_STABS_OP,
1704                IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)),
1705                TREE_PUBLIC (decl) ? 'F' : 'f');
1706
1707       current_sym_code = N_FUN;
1708       current_sym_addr = XEXP (DECL_RTL (decl), 0);
1709
1710       if (TREE_TYPE (type))
1711         dbxout_type (TREE_TYPE (type), 0, 0);
1712       else
1713         dbxout_type (void_type_node, 0, 0);
1714
1715       /* For a nested function, when that function is compiled,
1716          mention the containing function name
1717          as well as (since dbx wants it) our own assembler-name.  */
1718       if (context != 0)
1719         fprintf (asmfile, ",%s,%s",
1720                  IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)),
1721                  IDENTIFIER_POINTER (DECL_NAME (context)));
1722
1723       dbxout_finish_symbol (decl);
1724       break;
1725
1726     case TYPE_DECL:
1727 #if 0
1728       /* This seems all wrong.  Outputting most kinds of types gives no name
1729          at all.  A true definition gives no name; a cross-ref for a
1730          structure can give the tag name, but not a type name.
1731          It seems that no typedef name is defined by outputting a type.  */
1732
1733       /* If this typedef name was defined by outputting the type,
1734          don't duplicate it.  */
1735       if (typevec[TYPE_SYMTAB_ADDRESS (type)].status == TYPE_DEFINED
1736           && TYPE_NAME (TREE_TYPE (decl)) == decl)
1737         return;
1738 #endif
1739       /* Don't output the same typedef twice.
1740          And don't output what language-specific stuff doesn't want output.  */
1741       if (TREE_ASM_WRITTEN (decl) || TYPE_DECL_SUPPRESS_DEBUG (decl))
1742         return;
1743
1744       FORCE_TEXT;
1745
1746       {
1747         int tag_needed = 1;
1748         int did_output = 0;
1749
1750         if (DECL_NAME (decl))
1751           {
1752             /* Nonzero means we must output a tag as well as a typedef.  */
1753             tag_needed = 0;
1754
1755             /* Handle the case of a C++ structure or union
1756                where the TYPE_NAME is a TYPE_DECL
1757                which gives both a typedef name and a tag.  */
1758             /* dbx requires the tag first and the typedef second.  */
1759             if ((TREE_CODE (type) == RECORD_TYPE
1760                  || TREE_CODE (type) == UNION_TYPE
1761                  || TREE_CODE (type) == QUAL_UNION_TYPE)
1762                 && TYPE_NAME (type) == decl
1763                 && !(use_gnu_debug_info_extensions && have_used_extensions)
1764                 && !TREE_ASM_WRITTEN (TYPE_NAME (type))
1765                 /* Distinguish the implicit typedefs of C++
1766                    from explicit ones that might be found in C.  */
1767                 && DECL_ARTIFICIAL (decl))
1768               {
1769                 tree name = TYPE_NAME (type);
1770                 if (TREE_CODE (name) == TYPE_DECL)
1771                   name = DECL_NAME (name);
1772
1773                 current_sym_code = DBX_TYPE_DECL_STABS_CODE;
1774                 current_sym_value = 0;
1775                 current_sym_addr = 0;
1776                 current_sym_nchars = 2 + IDENTIFIER_LENGTH (name);
1777
1778                 fprintf (asmfile, "%s \"%s:T", ASM_STABS_OP,
1779                          IDENTIFIER_POINTER (name));
1780                 dbxout_type (type, 1, 0);
1781                 dbxout_finish_symbol (NULL_TREE);
1782               }
1783
1784             /* Output typedef name.  */
1785             fprintf (asmfile, "%s \"%s:", ASM_STABS_OP,
1786                      IDENTIFIER_POINTER (DECL_NAME (decl)));
1787
1788             /* Short cut way to output a tag also.  */
1789             if ((TREE_CODE (type) == RECORD_TYPE
1790                  || TREE_CODE (type) == UNION_TYPE
1791                  || TREE_CODE (type) == QUAL_UNION_TYPE)
1792                 && TYPE_NAME (type) == decl
1793                 /* Distinguish the implicit typedefs of C++
1794                    from explicit ones that might be found in C.  */
1795                 && DECL_ARTIFICIAL (decl))
1796               {
1797                 if (use_gnu_debug_info_extensions && have_used_extensions)
1798                   {
1799                     putc ('T', asmfile);
1800                     TREE_ASM_WRITTEN (TYPE_NAME (type)) = 1;
1801                   }
1802 #if 0 /* Now we generate the tag for this case up above.  */
1803                 else
1804                   tag_needed = 1;
1805 #endif
1806               }
1807
1808             putc ('t', asmfile);
1809             current_sym_code = DBX_TYPE_DECL_STABS_CODE;
1810
1811             dbxout_type (type, 1, 0);
1812             dbxout_finish_symbol (decl);
1813             did_output = 1;
1814           }
1815
1816         /* Don't output a tag if this is an incomplete type (TYPE_SIZE is
1817            zero).  This prevents the sun4 Sun OS 4.x dbx from crashing.  */ 
1818
1819         if (tag_needed && TYPE_NAME (type) != 0
1820             && (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE
1821                 || (DECL_NAME (TYPE_NAME (type)) != 0))
1822             && TYPE_SIZE (type) != 0
1823             && !TREE_ASM_WRITTEN (TYPE_NAME (type)))
1824           {
1825             /* For a TYPE_DECL with no name, but the type has a name,
1826                output a tag.
1827                This is what represents `struct foo' with no typedef.  */
1828             /* In C++, the name of a type is the corresponding typedef.
1829                In C, it is an IDENTIFIER_NODE.  */
1830             tree name = TYPE_NAME (type);
1831             if (TREE_CODE (name) == TYPE_DECL)
1832               name = DECL_NAME (name);
1833
1834             current_sym_code = DBX_TYPE_DECL_STABS_CODE;
1835             current_sym_value = 0;
1836             current_sym_addr = 0;
1837             current_sym_nchars = 2 + IDENTIFIER_LENGTH (name);
1838
1839             fprintf (asmfile, "%s \"%s:T", ASM_STABS_OP,
1840                      IDENTIFIER_POINTER (name));
1841             dbxout_type (type, 1, 0);
1842             dbxout_finish_symbol (NULL_TREE);
1843             did_output = 1;
1844           }
1845
1846         /* If an enum type has no name, it cannot be referred to,
1847            but we must output it anyway, since the enumeration constants
1848            can be referred to.  */
1849         if (!did_output && TREE_CODE (type) == ENUMERAL_TYPE)
1850           {
1851             current_sym_code = DBX_TYPE_DECL_STABS_CODE;
1852             current_sym_value = 0;
1853             current_sym_addr = 0;
1854             current_sym_nchars = 2;
1855
1856             /* Some debuggers fail when given NULL names, so give this a
1857                harmless name of ` '.  */
1858             fprintf (asmfile, "%s \" :T", ASM_STABS_OP);
1859             dbxout_type (type, 1, 0);
1860             dbxout_finish_symbol (NULL_TREE);
1861           }
1862
1863         /* Prevent duplicate output of a typedef.  */
1864         TREE_ASM_WRITTEN (decl) = 1;
1865         break;
1866       }
1867
1868     case PARM_DECL:
1869       /* Parm decls go in their own separate chains
1870          and are output by dbxout_reg_parms and dbxout_parms.  */
1871       abort ();
1872
1873     case RESULT_DECL:
1874       /* Named return value, treat like a VAR_DECL.  */
1875     case VAR_DECL:
1876       if (DECL_RTL (decl) == 0)
1877         return;
1878       /* Don't mention a variable that is external.
1879          Let the file that defines it describe it.  */
1880       if (DECL_EXTERNAL (decl))
1881         break;
1882
1883       /* If the variable is really a constant
1884          and not written in memory, inform the debugger.  */
1885       if (TREE_STATIC (decl) && TREE_READONLY (decl)
1886           && DECL_INITIAL (decl) != 0
1887           && ! TREE_ASM_WRITTEN (decl)
1888           && (DECL_FIELD_CONTEXT (decl) == NULL_TREE
1889               || TREE_CODE (DECL_FIELD_CONTEXT (decl)) == BLOCK))
1890         {
1891           if (TREE_PUBLIC (decl) == 0)
1892             {
1893               /* The sun4 assembler does not grok this.  */
1894               char *name = IDENTIFIER_POINTER (DECL_NAME (decl));
1895               if (TREE_CODE (TREE_TYPE (decl)) == INTEGER_TYPE
1896                   || TREE_CODE (TREE_TYPE (decl)) == ENUMERAL_TYPE)
1897                 {
1898                   HOST_WIDE_INT ival = TREE_INT_CST_LOW (DECL_INITIAL (decl));
1899 #ifdef DBX_OUTPUT_CONSTANT_SYMBOL
1900                   DBX_OUTPUT_CONSTANT_SYMBOL (asmfile, name, ival);
1901 #else
1902                   fprintf (asmfile, "%s \"%s:c=i", ASM_STABS_OP, name);
1903
1904                   fprintf (asmfile, HOST_WIDE_INT_PRINT_DEC, ival);
1905                   fprintf (asmfile, "\",0x%x,0,0,0\n", N_LSYM);
1906 #endif
1907                   return;
1908                 }
1909               else if (TREE_CODE (TREE_TYPE (decl)) == REAL_TYPE)
1910                 {
1911                   /* don't know how to do this yet.  */
1912                 }
1913               break;
1914             }
1915           /* else it is something we handle like a normal variable.  */
1916         }
1917
1918       DECL_RTL (decl) = eliminate_regs (DECL_RTL (decl), 0, NULL_RTX);
1919 #ifdef LEAF_REG_REMAP
1920       if (leaf_function)
1921         leaf_renumber_regs_insn (DECL_RTL (decl));
1922 #endif
1923
1924       dbxout_symbol_location (decl, type, 0, DECL_RTL (decl));
1925       break;
1926       
1927     default:
1928       break;
1929     }
1930 }
1931 \f
1932 /* Output the stab for DECL, a VAR_DECL, RESULT_DECL or PARM_DECL.
1933    Add SUFFIX to its name, if SUFFIX is not 0.
1934    Describe the variable as residing in HOME
1935    (usually HOME is DECL_RTL (DECL), but not always).  */
1936
1937 static void
1938 dbxout_symbol_location (decl, type, suffix, home)
1939      tree decl, type;
1940      char *suffix;
1941      rtx home;
1942 {
1943   int letter = 0;
1944   int regno = -1;
1945
1946   /* Don't mention a variable at all
1947      if it was completely optimized into nothingness.
1948      
1949      If the decl was from an inline function, then it's rtl
1950      is not identically the rtl that was used in this
1951      particular compilation.  */
1952   if (GET_CODE (home) == REG)
1953     {
1954       regno = REGNO (home);
1955       if (regno >= FIRST_PSEUDO_REGISTER)
1956         return;
1957     }
1958   else if (GET_CODE (home) == SUBREG)
1959     {
1960       rtx value = home;
1961       int offset = 0;
1962       while (GET_CODE (value) == SUBREG)
1963         {
1964           offset += SUBREG_WORD (value);
1965           value = SUBREG_REG (value);
1966         }
1967       if (GET_CODE (value) == REG)
1968         {
1969           regno = REGNO (value);
1970           if (regno >= FIRST_PSEUDO_REGISTER)
1971             return;
1972           regno += offset;
1973         }
1974       alter_subreg (home);
1975     }
1976
1977   /* The kind-of-variable letter depends on where
1978      the variable is and on the scope of its name:
1979      G and N_GSYM for static storage and global scope,
1980      S for static storage and file scope,
1981      V for static storage and local scope,
1982      for those two, use N_LCSYM if data is in bss segment,
1983      N_STSYM if in data segment, N_FUN otherwise.
1984      (We used N_FUN originally, then changed to N_STSYM
1985      to please GDB.  However, it seems that confused ld.
1986      Now GDB has been fixed to like N_FUN, says Kingdon.)
1987      no letter at all, and N_LSYM, for auto variable,
1988      r and N_RSYM for register variable.  */
1989
1990   if (GET_CODE (home) == MEM
1991       && GET_CODE (XEXP (home, 0)) == SYMBOL_REF)
1992     {
1993       if (TREE_PUBLIC (decl))
1994         {
1995           letter = 'G';
1996           current_sym_code = N_GSYM;
1997         }
1998       else
1999         {
2000           current_sym_addr = XEXP (home, 0);
2001
2002           letter = decl_function_context (decl) ? 'V' : 'S';
2003
2004           /* This should be the same condition as in assemble_variable, but
2005              we don't have access to dont_output_data here.  So, instead,
2006              we rely on the fact that error_mark_node initializers always
2007              end up in bss for C++ and never end up in bss for C.  */
2008           if (DECL_INITIAL (decl) == 0
2009               || (!strcmp (lang_identify (), "cplusplus")
2010                   && DECL_INITIAL (decl) == error_mark_node))
2011             current_sym_code = N_LCSYM;
2012           else if (DECL_IN_TEXT_SECTION (decl))
2013             /* This is not quite right, but it's the closest
2014                of all the codes that Unix defines.  */
2015             current_sym_code = DBX_STATIC_CONST_VAR_CODE;
2016           else
2017             {
2018               /* Ultrix `as' seems to need this.  */
2019 #ifdef DBX_STATIC_STAB_DATA_SECTION
2020               data_section ();
2021 #endif
2022               current_sym_code = N_STSYM;
2023             }
2024         }
2025     }
2026   else if (regno >= 0)
2027     {
2028       letter = 'r';
2029       current_sym_code = N_RSYM;
2030       current_sym_value = DBX_REGISTER_NUMBER (regno);
2031     }
2032   else if (GET_CODE (home) == MEM
2033            && (GET_CODE (XEXP (home, 0)) == MEM
2034                || (GET_CODE (XEXP (home, 0)) == REG
2035                    && REGNO (XEXP (home, 0)) != HARD_FRAME_POINTER_REGNUM
2036                    && REGNO (XEXP (home, 0)) != STACK_POINTER_REGNUM
2037 #if ARG_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
2038                    && REGNO (XEXP (home, 0)) != ARG_POINTER_REGNUM
2039 #endif
2040                    )))
2041     /* If the value is indirect by memory or by a register
2042        that isn't the frame pointer
2043        then it means the object is variable-sized and address through
2044        that register or stack slot.  DBX has no way to represent this
2045        so all we can do is output the variable as a pointer.
2046        If it's not a parameter, ignore it.
2047        (VAR_DECLs like this can be made by integrate.c.)  */
2048     {
2049       if (GET_CODE (XEXP (home, 0)) == REG)
2050         {
2051           letter = 'r';
2052           current_sym_code = N_RSYM;
2053           current_sym_value = DBX_REGISTER_NUMBER (REGNO (XEXP (home, 0)));
2054         }
2055       else
2056         {
2057           current_sym_code = N_LSYM;
2058           /* RTL looks like (MEM (MEM (PLUS (REG...) (CONST_INT...)))).
2059              We want the value of that CONST_INT.  */
2060           current_sym_value
2061             = DEBUGGER_AUTO_OFFSET (XEXP (XEXP (home, 0), 0));
2062         }
2063
2064       /* Effectively do build_pointer_type, but don't cache this type,
2065          since it might be temporary whereas the type it points to
2066          might have been saved for inlining.  */
2067       /* Don't use REFERENCE_TYPE because dbx can't handle that.  */
2068       type = make_node (POINTER_TYPE);
2069       TREE_TYPE (type) = TREE_TYPE (decl);
2070     }
2071   else if (GET_CODE (home) == MEM
2072            && GET_CODE (XEXP (home, 0)) == REG)
2073     {
2074       current_sym_code = N_LSYM;
2075       current_sym_value = DEBUGGER_AUTO_OFFSET (XEXP (home, 0));
2076     }
2077   else if (GET_CODE (home) == MEM
2078            && GET_CODE (XEXP (home, 0)) == PLUS
2079            && GET_CODE (XEXP (XEXP (home, 0), 1)) == CONST_INT)
2080     {
2081       current_sym_code = N_LSYM;
2082       /* RTL looks like (MEM (PLUS (REG...) (CONST_INT...)))
2083          We want the value of that CONST_INT.  */
2084       current_sym_value = DEBUGGER_AUTO_OFFSET (XEXP (home, 0));
2085     }
2086   else if (GET_CODE (home) == MEM
2087            && GET_CODE (XEXP (home, 0)) == CONST)
2088     {
2089       /* Handle an obscure case which can arise when optimizing and
2090          when there are few available registers.  (This is *always*
2091          the case for i386/i486 targets).  The RTL looks like
2092          (MEM (CONST ...)) even though this variable is a local `auto'
2093          or a local `register' variable.  In effect, what has happened
2094          is that the reload pass has seen that all assignments and
2095          references for one such a local variable can be replaced by
2096          equivalent assignments and references to some static storage
2097          variable, thereby avoiding the need for a register.  In such
2098          cases we're forced to lie to debuggers and tell them that
2099          this variable was itself `static'.  */
2100       current_sym_code = N_LCSYM;
2101       letter = 'V';
2102       current_sym_addr = XEXP (XEXP (home, 0), 0);
2103     }
2104   else if (GET_CODE (home) == CONCAT)
2105     {
2106       tree subtype = TREE_TYPE (type);
2107
2108       /* If the variable's storage is in two parts,
2109          output each as a separate stab with a modified name.  */
2110       if (WORDS_BIG_ENDIAN)
2111         dbxout_symbol_location (decl, subtype, "$imag", XEXP (home, 0));
2112       else
2113         dbxout_symbol_location (decl, subtype, "$real", XEXP (home, 0));
2114
2115       /* Cast avoids warning in old compilers.  */
2116       current_sym_code = (STAB_CODE_TYPE) 0;
2117       current_sym_value = 0;
2118       current_sym_addr = 0;
2119       dbxout_prepare_symbol (decl);
2120
2121       if (WORDS_BIG_ENDIAN)
2122         dbxout_symbol_location (decl, subtype, "$real", XEXP (home, 1));
2123       else
2124         dbxout_symbol_location (decl, subtype, "$imag", XEXP (home, 1));
2125       return;
2126     }
2127   else
2128     /* Address might be a MEM, when DECL is a variable-sized object.
2129        Or it might be const0_rtx, meaning previous passes
2130        want us to ignore this variable.  */
2131     return;
2132
2133   /* Ok, start a symtab entry and output the variable name.  */
2134   FORCE_TEXT;
2135
2136 #ifdef DBX_STATIC_BLOCK_START
2137   DBX_STATIC_BLOCK_START (asmfile, current_sym_code);
2138 #endif
2139
2140   dbxout_symbol_name (decl, suffix, letter);
2141   dbxout_type (type, 0, 0);
2142   dbxout_finish_symbol (decl);
2143
2144 #ifdef DBX_STATIC_BLOCK_END
2145   DBX_STATIC_BLOCK_END (asmfile, current_sym_code);
2146 #endif
2147 }
2148 \f
2149 /* Output the symbol name of DECL for a stabs, with suffix SUFFIX.
2150    Then output LETTER to indicate the kind of location the symbol has.  */
2151
2152 static void
2153 dbxout_symbol_name (decl, suffix, letter)
2154      tree decl;
2155      char *suffix;
2156      int letter;
2157 {
2158   /* One slight hitch: if this is a VAR_DECL which is a static
2159      class member, we must put out the mangled name instead of the
2160      DECL_NAME.  Note also that static member (variable) names DO NOT begin
2161      with underscores in .stabs directives.  */
2162   char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
2163   if (name == 0)
2164     name = "(anon)";
2165   fprintf (asmfile, "%s \"%s%s:", ASM_STABS_OP, name,
2166            (suffix ? suffix : ""));
2167
2168   if (letter) putc (letter, asmfile);
2169 }
2170
2171 static void
2172 dbxout_prepare_symbol (decl)
2173      tree decl;
2174 {
2175 #ifdef WINNING_GDB
2176   char *filename = DECL_SOURCE_FILE (decl);
2177
2178   dbxout_source_file (asmfile, filename);
2179 #endif
2180 }
2181
2182 static void
2183 dbxout_finish_symbol (sym)
2184      tree sym;
2185 {
2186 #ifdef DBX_FINISH_SYMBOL
2187   DBX_FINISH_SYMBOL (sym);
2188 #else
2189   int line = 0;
2190   if (use_gnu_debug_info_extensions && sym != 0)
2191     line = DECL_SOURCE_LINE (sym);
2192
2193   fprintf (asmfile, "\",%d,0,%d,", current_sym_code, line);
2194   if (current_sym_addr)
2195     output_addr_const (asmfile, current_sym_addr);
2196   else
2197     fprintf (asmfile, "%d", current_sym_value);
2198   putc ('\n', asmfile);
2199 #endif
2200 }
2201
2202 /* Output definitions of all the decls in a chain.  */
2203
2204 void
2205 dbxout_syms (syms)
2206      tree syms;
2207 {
2208   while (syms)
2209     {
2210       dbxout_symbol (syms, 1);
2211       syms = TREE_CHAIN (syms);
2212     }
2213 }
2214 \f
2215 /* The following two functions output definitions of function parameters.
2216    Each parameter gets a definition locating it in the parameter list.
2217    Each parameter that is a register variable gets a second definition
2218    locating it in the register.
2219
2220    Printing or argument lists in gdb uses the definitions that
2221    locate in the parameter list.  But reference to the variable in
2222    expressions uses preferentially the definition as a register.  */
2223
2224 /* Output definitions, referring to storage in the parmlist,
2225    of all the parms in PARMS, which is a chain of PARM_DECL nodes.  */
2226
2227 void
2228 dbxout_parms (parms)
2229      tree parms;
2230 {
2231   for (; parms; parms = TREE_CHAIN (parms))
2232     if (DECL_NAME (parms) && TREE_TYPE (parms) != error_mark_node)
2233       {
2234         dbxout_prepare_symbol (parms);
2235
2236         /* Perform any necessary register eliminations on the parameter's rtl,
2237            so that the debugging output will be accurate.  */
2238         DECL_INCOMING_RTL (parms)
2239           = eliminate_regs (DECL_INCOMING_RTL (parms), 0, NULL_RTX);
2240         DECL_RTL (parms) = eliminate_regs (DECL_RTL (parms), 0, NULL_RTX);
2241 #ifdef LEAF_REG_REMAP
2242         if (leaf_function)
2243           {
2244             leaf_renumber_regs_insn (DECL_INCOMING_RTL (parms));
2245             leaf_renumber_regs_insn (DECL_RTL (parms));
2246           }
2247 #endif
2248
2249         if (PARM_PASSED_IN_MEMORY (parms))
2250           {
2251             rtx addr = XEXP (DECL_INCOMING_RTL (parms), 0);
2252
2253             /* ??? Here we assume that the parm address is indexed
2254                off the frame pointer or arg pointer.
2255                If that is not true, we produce meaningless results,
2256                but do not crash.  */
2257             if (GET_CODE (addr) == PLUS
2258                 && GET_CODE (XEXP (addr, 1)) == CONST_INT)
2259               current_sym_value = INTVAL (XEXP (addr, 1));
2260             else
2261               current_sym_value = 0;
2262
2263             current_sym_code = N_PSYM;
2264             current_sym_addr = 0;
2265
2266             FORCE_TEXT;
2267             if (DECL_NAME (parms))
2268               {
2269                 current_sym_nchars = 2 + IDENTIFIER_LENGTH (DECL_NAME (parms));
2270
2271                 fprintf (asmfile, "%s \"%s:%c", ASM_STABS_OP,
2272                          IDENTIFIER_POINTER (DECL_NAME (parms)),
2273                          DBX_MEMPARM_STABS_LETTER);
2274               }
2275             else
2276               {
2277                 current_sym_nchars = 8;
2278                 fprintf (asmfile, "%s \"(anon):%c", ASM_STABS_OP,
2279                          DBX_MEMPARM_STABS_LETTER);
2280               }
2281
2282             /* It is quite tempting to use:
2283                
2284                    dbxout_type (TREE_TYPE (parms), 0, 0);
2285
2286                as the next statement, rather than using DECL_ARG_TYPE(), so
2287                that gcc reports the actual type of the parameter, rather
2288                than the promoted type.  This certainly makes GDB's life
2289                easier, at least for some ports.  The change is a bad idea
2290                however, since GDB expects to be able access the type without
2291                performing any conversions.  So for example, if we were
2292                passing a float to an unprototyped function, gcc will store a
2293                double on the stack, but if we emit a stab saying the type is a
2294                float, then gdb will only read in a single value, and this will
2295                produce an erropneous value.  */
2296             dbxout_type (DECL_ARG_TYPE (parms), 0, 0);
2297             current_sym_value = DEBUGGER_ARG_OFFSET (current_sym_value, addr);
2298             dbxout_finish_symbol (parms);
2299           }
2300         else if (GET_CODE (DECL_RTL (parms)) == REG)
2301           {
2302             rtx best_rtl;
2303             char regparm_letter;
2304             tree parm_type;
2305             /* Parm passed in registers and lives in registers or nowhere.  */
2306
2307             current_sym_code = DBX_REGPARM_STABS_CODE;
2308             regparm_letter = DBX_REGPARM_STABS_LETTER;
2309             current_sym_addr = 0;
2310
2311             /* If parm lives in a register, use that register;
2312                pretend the parm was passed there.  It would be more consistent
2313                to describe the register where the parm was passed,
2314                but in practice that register usually holds something else.
2315
2316                If we use DECL_RTL, then we must use the declared type of
2317                the variable, not the type that it arrived in.  */
2318             if (REGNO (DECL_RTL (parms)) >= 0
2319                 && REGNO (DECL_RTL (parms)) < FIRST_PSEUDO_REGISTER)
2320               {
2321                 best_rtl = DECL_RTL (parms);
2322                 parm_type = TREE_TYPE (parms);
2323               }
2324             /* If the parm lives nowhere, use the register where it was
2325                passed.  It is also better to use the declared type here.  */
2326             else
2327               {
2328                 best_rtl = DECL_INCOMING_RTL (parms);
2329                 parm_type = TREE_TYPE (parms);
2330               }
2331             current_sym_value = DBX_REGISTER_NUMBER (REGNO (best_rtl));
2332
2333             FORCE_TEXT;
2334             if (DECL_NAME (parms))
2335               {
2336                 current_sym_nchars = 2 + IDENTIFIER_LENGTH (DECL_NAME (parms));
2337                 fprintf (asmfile, "%s \"%s:%c", ASM_STABS_OP,
2338                          IDENTIFIER_POINTER (DECL_NAME (parms)),
2339                          regparm_letter);
2340               }
2341             else
2342               {
2343                 current_sym_nchars = 8;
2344                 fprintf (asmfile, "%s \"(anon):%c", ASM_STABS_OP,
2345                          regparm_letter);
2346               }
2347
2348             dbxout_type (parm_type, 0, 0);
2349             dbxout_finish_symbol (parms);
2350           }
2351         else if (GET_CODE (DECL_RTL (parms)) == MEM
2352                  && GET_CODE (XEXP (DECL_RTL (parms), 0)) == REG
2353                  && REGNO (XEXP (DECL_RTL (parms), 0)) != HARD_FRAME_POINTER_REGNUM
2354                  && REGNO (XEXP (DECL_RTL (parms), 0)) != STACK_POINTER_REGNUM
2355 #if ARG_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
2356                  && REGNO (XEXP (DECL_RTL (parms), 0)) != ARG_POINTER_REGNUM
2357 #endif
2358                  )
2359           {
2360             /* Parm was passed via invisible reference.
2361                That is, its address was passed in a register.
2362                Output it as if it lived in that register.
2363                The debugger will know from the type
2364                that it was actually passed by invisible reference.  */
2365
2366             char regparm_letter;
2367             /* Parm passed in registers and lives in registers or nowhere.  */
2368
2369             current_sym_code = DBX_REGPARM_STABS_CODE;
2370             if (use_gnu_debug_info_extensions)
2371               regparm_letter = GDB_INV_REF_REGPARM_STABS_LETTER;
2372             else
2373               regparm_letter = DBX_REGPARM_STABS_LETTER;
2374
2375             /* DECL_RTL looks like (MEM (REG...).  Get the register number.
2376                If it is an unallocated pseudo-reg, then use the register where
2377                it was passed instead.  */
2378             if (REGNO (XEXP (DECL_RTL (parms), 0)) >= 0
2379                 && REGNO (XEXP (DECL_RTL (parms), 0)) < FIRST_PSEUDO_REGISTER)
2380               current_sym_value = REGNO (XEXP (DECL_RTL (parms), 0));
2381             else
2382               current_sym_value = REGNO (DECL_INCOMING_RTL (parms));
2383
2384             current_sym_addr = 0;
2385
2386             FORCE_TEXT;
2387             if (DECL_NAME (parms))
2388               {
2389                 current_sym_nchars = 2 + strlen (IDENTIFIER_POINTER (DECL_NAME (parms)));
2390
2391                 fprintf (asmfile, "%s \"%s:%c", ASM_STABS_OP,
2392                          IDENTIFIER_POINTER (DECL_NAME (parms)),
2393                          regparm_letter);
2394               }
2395             else
2396               {
2397                 current_sym_nchars = 8;
2398                 fprintf (asmfile, "%s \"(anon):%c", ASM_STABS_OP,
2399                          regparm_letter);
2400               }
2401
2402             dbxout_type (TREE_TYPE (parms), 0, 0);
2403             dbxout_finish_symbol (parms);
2404           }
2405         else if (GET_CODE (DECL_RTL (parms)) == MEM
2406                  && XEXP (DECL_RTL (parms), 0) != const0_rtx
2407                  /* ??? A constant address for a parm can happen
2408                     when the reg it lives in is equiv to a constant in memory.
2409                     Should make this not happen, after 2.4.  */
2410                  && ! CONSTANT_P (XEXP (DECL_RTL (parms), 0)))
2411           {
2412             /* Parm was passed in registers but lives on the stack.  */
2413
2414             current_sym_code = N_PSYM;
2415             /* DECL_RTL looks like (MEM (PLUS (REG...) (CONST_INT...))),
2416                in which case we want the value of that CONST_INT,
2417                or (MEM (REG ...)) or (MEM (MEM ...)),
2418                in which case we use a value of zero.  */
2419             if (GET_CODE (XEXP (DECL_RTL (parms), 0)) == REG
2420                 || GET_CODE (XEXP (DECL_RTL (parms), 0)) == MEM)
2421               current_sym_value = 0;
2422             else
2423               current_sym_value = INTVAL (XEXP (XEXP (DECL_RTL (parms), 0), 1));
2424             current_sym_addr = 0;
2425
2426             /* Make a big endian correction if the mode of the type of the
2427                parameter is not the same as the mode of the rtl.  */
2428             if (BYTES_BIG_ENDIAN
2429                 && TYPE_MODE (TREE_TYPE (parms)) != GET_MODE (DECL_RTL (parms))
2430                 && GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (parms))) < UNITS_PER_WORD)
2431               {
2432                 current_sym_value += UNITS_PER_WORD - GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (parms)));
2433               }
2434
2435             FORCE_TEXT;
2436             if (DECL_NAME (parms))
2437               {
2438                 current_sym_nchars = 2 + strlen (IDENTIFIER_POINTER (DECL_NAME (parms)));
2439
2440                 fprintf (asmfile, "%s \"%s:%c", ASM_STABS_OP,
2441                          IDENTIFIER_POINTER (DECL_NAME (parms)),
2442                          DBX_MEMPARM_STABS_LETTER);
2443               }
2444             else
2445               {
2446                 current_sym_nchars = 8;
2447                 fprintf (asmfile, "%s \"(anon):%c", ASM_STABS_OP,
2448                 DBX_MEMPARM_STABS_LETTER);
2449               }
2450
2451             current_sym_value
2452               = DEBUGGER_ARG_OFFSET (current_sym_value,
2453                                      XEXP (DECL_RTL (parms), 0));
2454             dbxout_type (TREE_TYPE (parms), 0, 0);
2455             dbxout_finish_symbol (parms);
2456           }
2457       }
2458 }
2459
2460 /* Output definitions for the places where parms live during the function,
2461    when different from where they were passed, when the parms were passed
2462    in memory.
2463
2464    It is not useful to do this for parms passed in registers
2465    that live during the function in different registers, because it is
2466    impossible to look in the passed register for the passed value,
2467    so we use the within-the-function register to begin with.
2468
2469    PARMS is a chain of PARM_DECL nodes.  */
2470
2471 void
2472 dbxout_reg_parms (parms)
2473      tree parms;
2474 {
2475   for (; parms; parms = TREE_CHAIN (parms))
2476     if (DECL_NAME (parms) && PARM_PASSED_IN_MEMORY (parms))
2477       {
2478         dbxout_prepare_symbol (parms);
2479
2480         /* Report parms that live in registers during the function
2481            but were passed in memory.  */
2482         if (GET_CODE (DECL_RTL (parms)) == REG
2483             && REGNO (DECL_RTL (parms)) >= 0
2484             && REGNO (DECL_RTL (parms)) < FIRST_PSEUDO_REGISTER)
2485           dbxout_symbol_location (parms, TREE_TYPE (parms),
2486                                   0, DECL_RTL (parms));
2487         else if (GET_CODE (DECL_RTL (parms)) == CONCAT)
2488           dbxout_symbol_location (parms, TREE_TYPE (parms),
2489                                   0, DECL_RTL (parms));
2490         /* Report parms that live in memory but not where they were passed.  */
2491         else if (GET_CODE (DECL_RTL (parms)) == MEM
2492                  && ! rtx_equal_p (DECL_RTL (parms), DECL_INCOMING_RTL (parms)))
2493           dbxout_symbol_location (parms, TREE_TYPE (parms),
2494                                   0, DECL_RTL (parms));
2495       }
2496 }
2497 \f
2498 /* Given a chain of ..._TYPE nodes (as come in a parameter list),
2499    output definitions of those names, in raw form */
2500
2501 void
2502 dbxout_args (args)
2503      tree args;
2504 {
2505   while (args)
2506     {
2507       putc (',', asmfile);
2508       dbxout_type (TREE_VALUE (args), 0, 0);
2509       CHARS (1);
2510       args = TREE_CHAIN (args);
2511     }
2512 }
2513 \f
2514 /* Given a chain of ..._TYPE nodes,
2515    find those which have typedef names and output those names.
2516    This is to ensure those types get output.  */
2517
2518 void
2519 dbxout_types (types)
2520      register tree types;
2521 {
2522   while (types)
2523     {
2524       if (TYPE_NAME (types)
2525           && TREE_CODE (TYPE_NAME (types)) == TYPE_DECL
2526           && ! TREE_ASM_WRITTEN (TYPE_NAME (types)))
2527         dbxout_symbol (TYPE_NAME (types), 1);
2528       types = TREE_CHAIN (types);
2529     }
2530 }
2531 \f
2532 /* Output everything about a symbol block (a BLOCK node
2533    that represents a scope level),
2534    including recursive output of contained blocks.
2535
2536    BLOCK is the BLOCK node.
2537    DEPTH is its depth within containing symbol blocks.
2538    ARGS is usually zero; but for the outermost block of the
2539    body of a function, it is a chain of PARM_DECLs for the function parameters.
2540    We output definitions of all the register parms
2541    as if they were local variables of that block.
2542
2543    If -g1 was used, we count blocks just the same, but output nothing
2544    except for the outermost block.
2545
2546    Actually, BLOCK may be several blocks chained together.
2547    We handle them all in sequence.  */
2548
2549 static void
2550 dbxout_block (block, depth, args)
2551      register tree block;
2552      int depth;
2553      tree args;
2554 {
2555   int blocknum;
2556
2557   while (block)
2558     {
2559       /* Ignore blocks never expanded or otherwise marked as real.  */
2560       if (TREE_USED (block))
2561         {
2562 #ifndef DBX_LBRAC_FIRST
2563           /* In dbx format, the syms of a block come before the N_LBRAC.  */
2564           if (debug_info_level != DINFO_LEVEL_TERSE || depth == 0)
2565             dbxout_syms (BLOCK_VARS (block));
2566           if (args)
2567             dbxout_reg_parms (args);
2568 #endif
2569
2570           /* Now output an N_LBRAC symbol to represent the beginning of
2571              the block.  Use the block's tree-walk order to generate
2572              the assembler symbols LBBn and LBEn
2573              that final will define around the code in this block.  */
2574           if (depth > 0 && debug_info_level != DINFO_LEVEL_TERSE)
2575             {
2576               char buf[20];
2577               blocknum = next_block_number++;
2578               ASM_GENERATE_INTERNAL_LABEL (buf, "LBB", blocknum);
2579
2580               if (BLOCK_HANDLER_BLOCK (block))
2581                 {
2582                   /* A catch block.  Must precede N_LBRAC.  */
2583                   tree decl = BLOCK_VARS (block);
2584                   while (decl)
2585                     {
2586 #ifdef DBX_OUTPUT_CATCH
2587                       DBX_OUTPUT_CATCH (asmfile, decl, buf);
2588 #else
2589                       fprintf (asmfile, "%s \"%s:C1\",%d,0,0,", ASM_STABS_OP,
2590                                IDENTIFIER_POINTER (DECL_NAME (decl)), N_CATCH);
2591                       assemble_name (asmfile, buf);
2592                       fprintf (asmfile, "\n");
2593 #endif
2594                       decl = TREE_CHAIN (decl);
2595                     }
2596                 }
2597
2598 #ifdef DBX_OUTPUT_LBRAC
2599               DBX_OUTPUT_LBRAC (asmfile, buf);
2600 #else
2601               fprintf (asmfile, "%s %d,0,0,", ASM_STABN_OP, N_LBRAC);
2602               assemble_name (asmfile, buf);
2603 #if DBX_BLOCKS_FUNCTION_RELATIVE
2604               fputc ('-', asmfile);
2605               assemble_name (asmfile, XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0));
2606 #endif
2607               fprintf (asmfile, "\n");
2608 #endif
2609             }
2610           else if (depth > 0)
2611             /* Count blocks the same way regardless of debug_info_level.  */
2612             next_block_number++;
2613
2614 #ifdef DBX_LBRAC_FIRST
2615           /* On some weird machines, the syms of a block
2616              come after the N_LBRAC.  */
2617           if (debug_info_level != DINFO_LEVEL_TERSE || depth == 0)
2618             dbxout_syms (BLOCK_VARS (block));
2619           if (args)
2620             dbxout_reg_parms (args);
2621 #endif
2622
2623           /* Output the subblocks.  */
2624           dbxout_block (BLOCK_SUBBLOCKS (block), depth + 1, NULL_TREE);
2625
2626           /* Refer to the marker for the end of the block.  */
2627           if (depth > 0 && debug_info_level != DINFO_LEVEL_TERSE)
2628             {
2629               char buf[20];
2630               ASM_GENERATE_INTERNAL_LABEL (buf, "LBE", blocknum);
2631 #ifdef DBX_OUTPUT_RBRAC
2632               DBX_OUTPUT_RBRAC (asmfile, buf);
2633 #else
2634               fprintf (asmfile, "%s %d,0,0,", ASM_STABN_OP, N_RBRAC);
2635               assemble_name (asmfile, buf);
2636 #if DBX_BLOCKS_FUNCTION_RELATIVE
2637               fputc ('-', asmfile);
2638               assemble_name (asmfile, XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0));
2639 #endif
2640               fprintf (asmfile, "\n");
2641 #endif
2642             }
2643         }
2644       block = BLOCK_CHAIN (block);
2645     }
2646 }
2647
2648 /* Output the information about a function and its arguments and result.
2649    Usually this follows the function's code,
2650    but on some systems, it comes before.  */
2651
2652 static void
2653 dbxout_really_begin_function (decl)
2654      tree decl;
2655 {
2656   dbxout_symbol (decl, 0);
2657   dbxout_parms (DECL_ARGUMENTS (decl));
2658   if (DECL_NAME (DECL_RESULT (decl)) != 0)
2659     dbxout_symbol (DECL_RESULT (decl), 1);
2660 }
2661
2662 /* Called at beginning of output of function definition.  */
2663
2664 void
2665 dbxout_begin_function (decl)
2666      tree decl;
2667 {
2668 #ifdef DBX_FUNCTION_FIRST
2669   dbxout_really_begin_function (decl);
2670 #endif
2671 }
2672
2673 /* Output dbx data for a function definition.
2674    This includes a definition of the function name itself (a symbol),
2675    definitions of the parameters (locating them in the parameter list)
2676    and then output the block that makes up the function's body
2677    (including all the auto variables of the function).  */
2678
2679 void
2680 dbxout_function (decl)
2681      tree decl;
2682 {
2683 #ifndef DBX_FUNCTION_FIRST
2684   dbxout_really_begin_function (decl);
2685 #endif
2686   dbxout_block (DECL_INITIAL (decl), 0, DECL_ARGUMENTS (decl));
2687 #ifdef DBX_OUTPUT_FUNCTION_END
2688   DBX_OUTPUT_FUNCTION_END (asmfile, decl);
2689 #endif
2690 #if defined(ASM_OUTPUT_SECTION_NAME)
2691   if (use_gnu_debug_info_extensions
2692 #if defined(NO_DBX_FUNCTION_END)
2693       && ! NO_DBX_FUNCTION_END
2694 #endif
2695       )
2696     dbxout_function_end ();
2697 #endif
2698 }
2699 #endif /* DBX_DEBUGGING_INFO */