OSDN Git Service

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