OSDN Git Service

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