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