OSDN Git Service

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