OSDN Git Service

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