OSDN Git Service

* dwarf2out.c (die_struct): Remove die_attr_last and die_child_last.
[pf3gnuchains/gcc-fork.git] / gcc / dwarf2out.c
1 /* Output Dwarf2 format symbol table information from the GNU C compiler.
2    Copyright (C) 1992, 93, 95-98, 1999 Free Software Foundation, Inc.
3    Contributed by Gary Funck (gary@intrepid.com).
4    Derived from DWARF 1 implementation of Ron Guilmette (rfg@monkeys.com).
5    Extensively modified by Jason Merrill (jason@cygnus.com).
6
7 This file is part of GNU CC.
8
9 GNU CC is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2, or (at your option)
12 any later version.
13
14 GNU CC is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with GNU CC; see the file COPYING.  If not, write to
21 the Free Software Foundation, 59 Temple Place - Suite 330,
22 Boston, MA 02111-1307, USA.  */
23
24 /* TODO: Implement .debug_str handling, and share entries somehow.
25          Eliminate duplicates by putting common info in a separate section
26            to be collected by the linker and referring to it with
27            DW_FORM_ref_addr.
28          Emit .debug_line header even when there are no functions, since
29            the file numbers are used by .debug_info.  Alternately, leave
30            out locations for types and decls.
31          Avoid talking about ctors and op= for PODs.
32          Factor out common prologue sequences into multiple CIEs.  */
33
34 /* The first part of this file deals with the DWARF 2 frame unwind
35    information, which is also used by the GCC efficient exception handling
36    mechanism.  The second part, controlled only by an #ifdef
37    DWARF2_DEBUGGING_INFO, deals with the other DWARF 2 debugging
38    information.  */
39
40 #include "config.h"
41 #include "system.h"
42 #include "defaults.h"
43 #include "tree.h"
44 #include "flags.h"
45 #include "rtl.h"
46 #include "hard-reg-set.h"
47 #include "regs.h"
48 #include "insn-config.h"
49 #include "reload.h"
50 #include "output.h"
51 #include "expr.h"
52 #include "except.h"
53 #include "dwarf2.h"
54 #include "dwarf2out.h"
55 #include "toplev.h"
56 #include "dyn-string.h"
57 #include "ggc.h"
58
59 /* We cannot use <assert.h> in GCC source, since that would include
60    GCC's assert.h, which may not be compatible with the host compiler.  */
61 #undef assert
62 #ifdef NDEBUG
63 # define assert(e)
64 #else
65 # define assert(e) do { if (! (e)) abort (); } while (0)
66 #endif
67
68 #ifndef DIR_SEPARATOR
69 #define DIR_SEPARATOR '/'
70 #endif
71
72 /* Decide whether we want to emit frame unwind information for the current
73    translation unit.  */
74
75 int
76 dwarf2out_do_frame ()
77 {
78   return (write_symbols == DWARF2_DEBUG
79 #ifdef DWARF2_FRAME_INFO
80           || DWARF2_FRAME_INFO
81 #endif
82 #ifdef DWARF2_UNWIND_INFO
83           || flag_unwind_tables
84           || (flag_exceptions && ! exceptions_via_longjmp)
85 #endif
86           );
87 }
88
89 #if defined (DWARF2_DEBUGGING_INFO) || defined (DWARF2_UNWIND_INFO)
90
91 /* How to start an assembler comment.  */
92 #ifndef ASM_COMMENT_START
93 #define ASM_COMMENT_START ";#"
94 #endif
95
96 typedef struct dw_cfi_struct *dw_cfi_ref;
97 typedef struct dw_fde_struct *dw_fde_ref;
98 typedef union  dw_cfi_oprnd_struct *dw_cfi_oprnd_ref;
99
100 /* Call frames are described using a sequence of Call Frame
101    Information instructions.  The register number, offset
102    and address fields are provided as possible operands;
103    their use is selected by the opcode field.  */
104
105 typedef union dw_cfi_oprnd_struct
106 {
107   unsigned long dw_cfi_reg_num;
108   long int dw_cfi_offset;
109   char *dw_cfi_addr;
110 }
111 dw_cfi_oprnd;
112
113 typedef struct dw_cfi_struct
114 {
115   dw_cfi_ref dw_cfi_next;
116   enum dwarf_call_frame_info dw_cfi_opc;
117   dw_cfi_oprnd dw_cfi_oprnd1;
118   dw_cfi_oprnd dw_cfi_oprnd2;
119 }
120 dw_cfi_node;
121
122 /* All call frame descriptions (FDE's) in the GCC generated DWARF
123    refer to a single Common Information Entry (CIE), defined at
124    the beginning of the .debug_frame section.  This used of a single
125    CIE obviates the need to keep track of multiple CIE's
126    in the DWARF generation routines below.  */
127
128 typedef struct dw_fde_struct
129 {
130   char *dw_fde_begin;
131   char *dw_fde_current_label;
132   char *dw_fde_end;
133   dw_cfi_ref dw_fde_cfi;
134 }
135 dw_fde_node;
136
137 /* Maximum size (in bytes) of an artificially generated label.   */
138 #define MAX_ARTIFICIAL_LABEL_BYTES      30
139
140 /* Make sure we know the sizes of the various types dwarf can describe. These
141    are only defaults.  If the sizes are different for your target, you should
142    override these values by defining the appropriate symbols in your tm.h
143    file.  */
144
145 #ifndef CHAR_TYPE_SIZE
146 #define CHAR_TYPE_SIZE BITS_PER_UNIT
147 #endif
148 #ifndef PTR_SIZE
149 #define PTR_SIZE (POINTER_SIZE / BITS_PER_UNIT)
150 #endif
151
152 /* The size in bytes of a DWARF field indicating an offset or length
153    relative to a debug info section, specified to be 4 bytes in the DWARF-2
154    specification.  The SGI/MIPS ABI defines it to be the same as PTR_SIZE.  */
155
156 #ifndef DWARF_OFFSET_SIZE
157 #define DWARF_OFFSET_SIZE 4
158 #endif
159
160 #define DWARF_VERSION 2
161
162 /* Round SIZE up to the nearest BOUNDARY.  */
163 #define DWARF_ROUND(SIZE,BOUNDARY) \
164   (((SIZE) + (BOUNDARY) - 1) & ~((BOUNDARY) - 1))
165
166 /* Offsets recorded in opcodes are a multiple of this alignment factor.  */
167 #ifdef STACK_GROWS_DOWNWARD
168 #define DWARF_CIE_DATA_ALIGNMENT (-UNITS_PER_WORD)
169 #else
170 #define DWARF_CIE_DATA_ALIGNMENT UNITS_PER_WORD
171 #endif
172
173 /* A pointer to the base of a table that contains frame description
174    information for each routine.  */
175 static dw_fde_ref fde_table;
176
177 /* Number of elements currently allocated for fde_table.  */
178 static unsigned fde_table_allocated;
179
180 /* Number of elements in fde_table currently in use.  */
181 static unsigned fde_table_in_use;
182
183 /* Size (in elements) of increments by which we may expand the
184    fde_table.  */
185 #define FDE_TABLE_INCREMENT 256
186
187 /* A list of call frame insns for the CIE.  */
188 static dw_cfi_ref cie_cfi_head;
189
190 /* The number of the current function definition for which debugging
191    information is being generated.  These numbers range from 1 up to the
192    maximum number of function definitions contained within the current
193    compilation unit.  These numbers are used to create unique label id's
194    unique to each function definition.  */
195 static unsigned current_funcdef_number = 0;
196
197 /* Some DWARF extensions (e.g., MIPS/SGI) implement a subprogram
198    attribute that accelerates the lookup of the FDE associated
199    with the subprogram.  This variable holds the table index of the FDE 
200    associated with the current function (body) definition.  */
201 static unsigned current_funcdef_fde;
202
203 /* Forward declarations for functions defined in this file.  */
204
205 static char *stripattributes            PROTO((const char *));
206 static const char *dwarf_cfi_name       PROTO((unsigned));
207 static dw_cfi_ref new_cfi               PROTO((void));
208 static void add_cfi                     PROTO((dw_cfi_ref *, dw_cfi_ref));
209 static unsigned long size_of_uleb128    PROTO((unsigned long));
210 static unsigned long size_of_sleb128    PROTO((long));
211 static void output_uleb128              PROTO((unsigned long));
212 static void output_sleb128              PROTO((long));
213 static void add_fde_cfi                 PROTO((char *, dw_cfi_ref));
214 static void lookup_cfa_1                PROTO((dw_cfi_ref, unsigned long *,
215                                                long *));
216 static void lookup_cfa                  PROTO((unsigned long *, long *));
217 static void reg_save                    PROTO((char *, unsigned, unsigned,
218                                                long));
219 static void initial_return_save         PROTO((rtx));
220 static void output_cfi                  PROTO((dw_cfi_ref, dw_fde_ref));
221 static void output_call_frame_info      PROTO((int));
222 static unsigned reg_number              PROTO((rtx));
223 static void dwarf2out_stack_adjust      PROTO((rtx));
224 static void dwarf2out_frame_debug_expr  PROTO((rtx, char *));
225
226 /* Definitions of defaults for assembler-dependent names of various
227    pseudo-ops and section names.
228    Theses may be overridden in the tm.h file (if necessary) for a particular
229    assembler.  */
230
231 #ifdef OBJECT_FORMAT_ELF
232 #ifndef UNALIGNED_SHORT_ASM_OP
233 #define UNALIGNED_SHORT_ASM_OP  ".2byte"
234 #endif
235 #ifndef UNALIGNED_INT_ASM_OP
236 #define UNALIGNED_INT_ASM_OP    ".4byte"
237 #endif
238 #ifndef UNALIGNED_DOUBLE_INT_ASM_OP
239 #define UNALIGNED_DOUBLE_INT_ASM_OP     ".8byte"
240 #endif
241 #endif /* OBJECT_FORMAT_ELF */
242
243 #ifndef ASM_BYTE_OP
244 #define ASM_BYTE_OP             ".byte"
245 #endif
246
247 /* Data and reference forms for relocatable data.  */
248 #define DW_FORM_data (DWARF_OFFSET_SIZE == 8 ? DW_FORM_data8 : DW_FORM_data4)
249 #define DW_FORM_ref (DWARF_OFFSET_SIZE == 8 ? DW_FORM_ref8 : DW_FORM_ref4)
250
251 /* Pseudo-op for defining a new section.  */
252 #ifndef SECTION_ASM_OP
253 #define SECTION_ASM_OP  ".section"
254 #endif
255
256 /* The default format used by the ASM_OUTPUT_SECTION macro (see below) to
257    print the SECTION_ASM_OP and the section name.  The default here works for
258    almost all svr4 assemblers, except for the sparc, where the section name
259    must be enclosed in double quotes.  (See sparcv4.h).  */
260 #ifndef SECTION_FORMAT
261 #ifdef PUSHSECTION_FORMAT
262 #define SECTION_FORMAT PUSHSECTION_FORMAT
263 #else
264 #define SECTION_FORMAT          "\t%s\t%s\n"
265 #endif
266 #endif
267
268 #ifndef FRAME_SECTION
269 #define FRAME_SECTION           ".debug_frame"
270 #endif
271
272 #ifndef FUNC_BEGIN_LABEL
273 #define FUNC_BEGIN_LABEL        "LFB"
274 #endif
275 #ifndef FUNC_END_LABEL
276 #define FUNC_END_LABEL          "LFE"
277 #endif
278 #define CIE_AFTER_SIZE_LABEL    "LSCIE"
279 #define CIE_END_LABEL           "LECIE"
280 #define CIE_LENGTH_LABEL        "LLCIE"
281 #define FDE_AFTER_SIZE_LABEL    "LSFDE"
282 #define FDE_END_LABEL           "LEFDE"
283 #define FDE_LENGTH_LABEL        "LLFDE"
284
285 /* Definitions of defaults for various types of primitive assembly language
286    output operations.  These may be overridden from within the tm.h file,
287    but typically, that is unnecessary.  */
288
289 #ifndef ASM_OUTPUT_SECTION
290 #define ASM_OUTPUT_SECTION(FILE, SECTION) \
291   fprintf ((FILE), SECTION_FORMAT, SECTION_ASM_OP, SECTION)
292 #endif
293
294 #ifndef ASM_OUTPUT_DWARF_DATA1
295 #define ASM_OUTPUT_DWARF_DATA1(FILE,VALUE) \
296   fprintf ((FILE), "\t%s\t0x%x", ASM_BYTE_OP, (unsigned) (VALUE))
297 #endif
298
299 #ifndef ASM_OUTPUT_DWARF_DELTA1
300 #define ASM_OUTPUT_DWARF_DELTA1(FILE,LABEL1,LABEL2)                     \
301  do {   fprintf ((FILE), "\t%s\t", ASM_BYTE_OP);                        \
302         assemble_name (FILE, LABEL1);                                   \
303         fprintf (FILE, "-");                                            \
304         assemble_name (FILE, LABEL2);                                   \
305   } while (0)
306 #endif
307
308 #ifdef UNALIGNED_INT_ASM_OP
309
310 #ifndef UNALIGNED_OFFSET_ASM_OP
311 #define UNALIGNED_OFFSET_ASM_OP \
312   (DWARF_OFFSET_SIZE == 8 ? UNALIGNED_DOUBLE_INT_ASM_OP : UNALIGNED_INT_ASM_OP)
313 #endif
314
315 #ifndef UNALIGNED_WORD_ASM_OP
316 #define UNALIGNED_WORD_ASM_OP \
317   (PTR_SIZE == 8 ? UNALIGNED_DOUBLE_INT_ASM_OP : UNALIGNED_INT_ASM_OP)
318 #endif
319
320 #ifndef ASM_OUTPUT_DWARF_DELTA2
321 #define ASM_OUTPUT_DWARF_DELTA2(FILE,LABEL1,LABEL2)                     \
322  do {   fprintf ((FILE), "\t%s\t", UNALIGNED_SHORT_ASM_OP);             \
323         assemble_name (FILE, LABEL1);                                   \
324         fprintf (FILE, "-");                                            \
325         assemble_name (FILE, LABEL2);                                   \
326   } while (0)
327 #endif
328
329 #ifndef ASM_OUTPUT_DWARF_DELTA4
330 #define ASM_OUTPUT_DWARF_DELTA4(FILE,LABEL1,LABEL2)                     \
331  do {   fprintf ((FILE), "\t%s\t", UNALIGNED_INT_ASM_OP);               \
332         assemble_name (FILE, LABEL1);                                   \
333         fprintf (FILE, "-");                                            \
334         assemble_name (FILE, LABEL2);                                   \
335   } while (0)
336 #endif
337
338 #ifndef ASM_OUTPUT_DWARF_DELTA
339 #define ASM_OUTPUT_DWARF_DELTA(FILE,LABEL1,LABEL2)                      \
340  do {   fprintf ((FILE), "\t%s\t", UNALIGNED_OFFSET_ASM_OP);            \
341         assemble_name (FILE, LABEL1);                                   \
342         fprintf (FILE, "-");                                            \
343         assemble_name (FILE, LABEL2);                                   \
344   } while (0)
345 #endif
346
347 #ifndef ASM_OUTPUT_DWARF_ADDR_DELTA
348 #define ASM_OUTPUT_DWARF_ADDR_DELTA(FILE,LABEL1,LABEL2)                 \
349  do {   fprintf ((FILE), "\t%s\t", UNALIGNED_WORD_ASM_OP);              \
350         assemble_name (FILE, LABEL1);                                   \
351         fprintf (FILE, "-");                                            \
352         assemble_name (FILE, LABEL2);                                   \
353   } while (0)
354 #endif
355
356 #ifndef ASM_OUTPUT_DWARF_ADDR
357 #define ASM_OUTPUT_DWARF_ADDR(FILE,LABEL)                               \
358  do {   fprintf ((FILE), "\t%s\t", UNALIGNED_WORD_ASM_OP);              \
359         assemble_name (FILE, LABEL);                                    \
360   } while (0)
361 #endif
362
363 /* ??? This macro takes an RTX in dwarfout.c and a string in dwarf2out.c.
364    We resolve the conflict by creating a new macro ASM_OUTPUT_DWARF2_ADDR_CONST
365    for ports that want to support both DWARF1 and DWARF2.  This needs a better
366    solution.  See also the comments in sparc/sp64-elf.h.  */
367 #ifdef ASM_OUTPUT_DWARF2_ADDR_CONST
368 #undef ASM_OUTPUT_DWARF_ADDR_CONST
369 #define ASM_OUTPUT_DWARF_ADDR_CONST(FILE,ADDR) \
370   ASM_OUTPUT_DWARF2_ADDR_CONST (FILE, ADDR)
371 #endif
372
373 #ifndef ASM_OUTPUT_DWARF_ADDR_CONST
374 #define ASM_OUTPUT_DWARF_ADDR_CONST(FILE,ADDR)                          \
375   fprintf ((FILE), "\t%s\t%s", UNALIGNED_WORD_ASM_OP, (ADDR))
376 #endif
377
378 #ifndef ASM_OUTPUT_DWARF_OFFSET4
379 #define ASM_OUTPUT_DWARF_OFFSET4(FILE,LABEL) \
380  do {   fprintf ((FILE), "\t%s\t", UNALIGNED_INT_ASM_OP);               \
381         assemble_name (FILE, LABEL);                                    \
382   } while (0)
383 #endif
384
385 #ifndef ASM_OUTPUT_DWARF_OFFSET
386 #define ASM_OUTPUT_DWARF_OFFSET(FILE,LABEL)                             \
387  do {   fprintf ((FILE), "\t%s\t", UNALIGNED_OFFSET_ASM_OP);            \
388         assemble_name (FILE, LABEL);                                    \
389   } while (0)
390 #endif
391
392 #ifndef ASM_OUTPUT_DWARF_DATA2
393 #define ASM_OUTPUT_DWARF_DATA2(FILE,VALUE) \
394   fprintf ((FILE), "\t%s\t0x%x", UNALIGNED_SHORT_ASM_OP, (unsigned) (VALUE))
395 #endif
396
397 #ifndef ASM_OUTPUT_DWARF_DATA4
398 #define ASM_OUTPUT_DWARF_DATA4(FILE,VALUE) \
399   fprintf ((FILE), "\t%s\t0x%x", UNALIGNED_INT_ASM_OP, (unsigned) (VALUE))
400 #endif
401
402 #ifndef ASM_OUTPUT_DWARF_DATA
403 #define ASM_OUTPUT_DWARF_DATA(FILE,VALUE) \
404   fprintf ((FILE), "\t%s\t0x%lx", UNALIGNED_OFFSET_ASM_OP, \
405            (unsigned long) (VALUE))
406 #endif
407
408 #ifndef ASM_OUTPUT_DWARF_ADDR_DATA
409 #define ASM_OUTPUT_DWARF_ADDR_DATA(FILE,VALUE) \
410   fprintf ((FILE), "\t%s\t0x%lx", UNALIGNED_WORD_ASM_OP, \
411            (unsigned long) (VALUE))
412 #endif
413
414 #ifndef ASM_OUTPUT_DWARF_DATA8
415 #define ASM_OUTPUT_DWARF_DATA8(FILE,HIGH_VALUE,LOW_VALUE)               \
416   do {                                                                  \
417     if (WORDS_BIG_ENDIAN)                                               \
418       {                                                                 \
419         fprintf ((FILE), "\t%s\t0x%lx\n", UNALIGNED_INT_ASM_OP, (HIGH_VALUE));\
420         fprintf ((FILE), "\t%s\t0x%lx", UNALIGNED_INT_ASM_OP, (LOW_VALUE));\
421       }                                                                 \
422     else                                                                \
423       {                                                                 \
424         fprintf ((FILE), "\t%s\t0x%lx\n", UNALIGNED_INT_ASM_OP, (LOW_VALUE)); \
425         fprintf ((FILE), "\t%s\t0x%lx", UNALIGNED_INT_ASM_OP, (HIGH_VALUE)); \
426       }                                                                 \
427   } while (0)
428 #endif
429
430 #else /* UNALIGNED_INT_ASM_OP */
431
432 /* We don't have unaligned support, let's hope the normal output works for
433    .debug_frame.  */
434
435 #define ASM_OUTPUT_DWARF_ADDR(FILE,LABEL) \
436   assemble_integer (gen_rtx_SYMBOL_REF (Pmode, LABEL), PTR_SIZE, 1)
437
438 #define ASM_OUTPUT_DWARF_OFFSET4(FILE,LABEL) \
439   assemble_integer (gen_rtx_SYMBOL_REF (SImode, LABEL), 4, 1)
440
441 #define ASM_OUTPUT_DWARF_OFFSET(FILE,LABEL) \
442   assemble_integer (gen_rtx_SYMBOL_REF (SImode, LABEL), 4, 1)
443
444 #define ASM_OUTPUT_DWARF_DELTA2(FILE,LABEL1,LABEL2)                     \
445   assemble_integer (gen_rtx_MINUS (HImode,                              \
446                                    gen_rtx_SYMBOL_REF (Pmode, LABEL1),  \
447                                    gen_rtx_SYMBOL_REF (Pmode, LABEL2)), \
448                     2, 1)
449   
450 #define ASM_OUTPUT_DWARF_DELTA4(FILE,LABEL1,LABEL2)                     \
451   assemble_integer (gen_rtx_MINUS (SImode,                              \
452                                    gen_rtx_SYMBOL_REF (Pmode, LABEL1),  \
453                                    gen_rtx_SYMBOL_REF (Pmode, LABEL2)), \
454                     4, 1)
455
456 #define ASM_OUTPUT_DWARF_ADDR_DELTA(FILE,LABEL1,LABEL2)                 \
457   assemble_integer (gen_rtx_MINUS (Pmode,                               \
458                                    gen_rtx_SYMBOL_REF (Pmode, LABEL1),  \
459                                    gen_rtx_SYMBOL_REF (Pmode, LABEL2)), \
460                     PTR_SIZE, 1)
461
462 #define ASM_OUTPUT_DWARF_DELTA(FILE,LABEL1,LABEL2) \
463   ASM_OUTPUT_DWARF_DELTA4 (FILE,LABEL1,LABEL2)
464
465 #define ASM_OUTPUT_DWARF_DATA4(FILE,VALUE) \
466   assemble_integer (GEN_INT (VALUE), 4, 1)
467
468 #endif /* UNALIGNED_INT_ASM_OP */
469
470 #ifdef SET_ASM_OP
471 #ifndef ASM_OUTPUT_DEFINE_LABEL_DIFFERENCE_SYMBOL
472 #define ASM_OUTPUT_DEFINE_LABEL_DIFFERENCE_SYMBOL(FILE, SY, HI, LO)     \
473  do {                                                                   \
474   fprintf (FILE, "\t%s\t", SET_ASM_OP);                                 \
475   assemble_name (FILE, SY);                                             \
476   fputc (',', FILE);                                                    \
477   assemble_name (FILE, HI);                                             \
478   fputc ('-', FILE);                                                    \
479   assemble_name (FILE, LO);                                             \
480  } while (0)
481 #endif
482 #endif /* SET_ASM_OP */
483
484 /* This is similar to the default ASM_OUTPUT_ASCII, except that no trailing
485    newline is produced.  When flag_debug_asm is asserted, we add commentary
486    at the end of the line, so we must avoid output of a newline here.  */
487 #ifndef ASM_OUTPUT_DWARF_STRING
488 #define ASM_OUTPUT_DWARF_STRING(FILE,P) \
489   do {                                                                        \
490     register int slen = strlen(P);                                            \
491     register const char *p = (P);                                             \
492     register int i;                                                           \
493     fprintf (FILE, "\t.ascii \"");                                            \
494     for (i = 0; i < slen; i++)                                                \
495       {                                                                       \
496           register int c = p[i];                                              \
497           if (c == '\"' || c == '\\')                                         \
498             putc ('\\', FILE);                                                \
499           if (ISPRINT(c))                                                     \
500             putc (c, FILE);                                                   \
501           else                                                                \
502             {                                                                 \
503               fprintf (FILE, "\\%o", c);                                      \
504             }                                                                 \
505       }                                                                       \
506     fprintf (FILE, "\\0\"");                                                  \
507   }                                                                           \
508   while (0)
509 #endif
510
511 /* The DWARF 2 CFA column which tracks the return address.  Normally this
512    is the column for PC, or the first column after all of the hard
513    registers.  */
514 #ifndef DWARF_FRAME_RETURN_COLUMN
515 #ifdef PC_REGNUM
516 #define DWARF_FRAME_RETURN_COLUMN       DWARF_FRAME_REGNUM (PC_REGNUM)
517 #else
518 #define DWARF_FRAME_RETURN_COLUMN       FIRST_PSEUDO_REGISTER
519 #endif
520 #endif
521
522 /* The mapping from gcc register number to DWARF 2 CFA column number.  By
523    default, we just provide columns for all registers.  */
524 #ifndef DWARF_FRAME_REGNUM
525 #define DWARF_FRAME_REGNUM(REG) DBX_REGISTER_NUMBER (REG)
526 #endif
527
528 /* Hook used by __throw.  */
529
530 rtx
531 expand_builtin_dwarf_fp_regnum ()
532 {
533   return GEN_INT (DWARF_FRAME_REGNUM (HARD_FRAME_POINTER_REGNUM));
534 }
535
536 /* The offset from the incoming value of %sp to the top of the stack frame
537    for the current function.  */
538 #ifndef INCOMING_FRAME_SP_OFFSET
539 #define INCOMING_FRAME_SP_OFFSET 0
540 #endif
541
542 /* Return a pointer to a copy of the section string name S with all
543    attributes stripped off, and an asterisk prepended (for assemble_name).  */
544
545 static inline char *
546 stripattributes (s)
547      const char *s;
548 {
549   char *stripped = xmalloc (strlen (s) + 2);
550   char *p = stripped;
551
552   *p++ = '*';
553
554   while (*s && *s != ',')
555     *p++ = *s++;
556
557   *p = '\0';
558   return stripped;
559 }
560
561 /* Return the register number described by a given RTL node.  */
562
563 static unsigned
564 reg_number (rtl)
565      register rtx rtl;
566 {
567   register unsigned regno = REGNO (rtl);
568
569   if (regno >= FIRST_PSEUDO_REGISTER)
570     {
571       warning ("internal regno botch: regno = %d\n", regno);
572       regno = 0;
573     }
574
575   regno = DBX_REGISTER_NUMBER (regno);
576   return regno;
577 }
578
579 /* Generate code to initialize the register size table.  */
580
581 void
582 expand_builtin_init_dwarf_reg_sizes (address)
583      tree address;
584 {
585   int i;
586   enum machine_mode mode = TYPE_MODE (char_type_node);
587   rtx addr = expand_expr (address, NULL_RTX, VOIDmode, 0);
588   rtx mem = gen_rtx_MEM (mode, addr);
589
590   for (i = 0; i < FIRST_PSEUDO_REGISTER; ++i)
591     {
592       int offset = i * GET_MODE_SIZE (mode);
593       int size = GET_MODE_SIZE (reg_raw_mode[i]);
594
595       emit_move_insn (change_address (mem, mode,
596                                       plus_constant (addr, offset)),
597                       GEN_INT (size));
598     }
599 }
600
601 /* Convert a DWARF call frame info. operation to its string name */
602
603 static const char *
604 dwarf_cfi_name (cfi_opc)
605      register unsigned cfi_opc;
606 {
607   switch (cfi_opc)
608     {
609     case DW_CFA_advance_loc:
610       return "DW_CFA_advance_loc";
611     case DW_CFA_offset:
612       return "DW_CFA_offset";
613     case DW_CFA_restore:
614       return "DW_CFA_restore";
615     case DW_CFA_nop:
616       return "DW_CFA_nop";
617     case DW_CFA_set_loc:
618       return "DW_CFA_set_loc";
619     case DW_CFA_advance_loc1:
620       return "DW_CFA_advance_loc1";
621     case DW_CFA_advance_loc2:
622       return "DW_CFA_advance_loc2";
623     case DW_CFA_advance_loc4:
624       return "DW_CFA_advance_loc4";
625     case DW_CFA_offset_extended:
626       return "DW_CFA_offset_extended";
627     case DW_CFA_restore_extended:
628       return "DW_CFA_restore_extended";
629     case DW_CFA_undefined:
630       return "DW_CFA_undefined";
631     case DW_CFA_same_value:
632       return "DW_CFA_same_value";
633     case DW_CFA_register:
634       return "DW_CFA_register";
635     case DW_CFA_remember_state:
636       return "DW_CFA_remember_state";
637     case DW_CFA_restore_state:
638       return "DW_CFA_restore_state";
639     case DW_CFA_def_cfa:
640       return "DW_CFA_def_cfa";
641     case DW_CFA_def_cfa_register:
642       return "DW_CFA_def_cfa_register";
643     case DW_CFA_def_cfa_offset:
644       return "DW_CFA_def_cfa_offset";
645
646     /* SGI/MIPS specific */
647     case DW_CFA_MIPS_advance_loc8:
648       return "DW_CFA_MIPS_advance_loc8";
649
650     /* GNU extensions */
651     case DW_CFA_GNU_window_save:
652       return "DW_CFA_GNU_window_save";
653     case DW_CFA_GNU_args_size:
654       return "DW_CFA_GNU_args_size";
655
656     default:
657       return "DW_CFA_<unknown>";
658     }
659 }
660
661 /* Return a pointer to a newly allocated Call Frame Instruction.  */
662
663 static inline dw_cfi_ref
664 new_cfi ()
665 {
666   register dw_cfi_ref cfi = (dw_cfi_ref) xmalloc (sizeof (dw_cfi_node));
667
668   cfi->dw_cfi_next = NULL;
669   cfi->dw_cfi_oprnd1.dw_cfi_reg_num = 0;
670   cfi->dw_cfi_oprnd2.dw_cfi_reg_num = 0;
671
672   return cfi;
673 }
674
675 /* Add a Call Frame Instruction to list of instructions.  */
676
677 static inline void
678 add_cfi (list_head, cfi)
679      register dw_cfi_ref *list_head;
680      register dw_cfi_ref cfi;
681 {
682   register dw_cfi_ref *p;
683
684   /* Find the end of the chain.  */
685   for (p = list_head; (*p) != NULL; p = &(*p)->dw_cfi_next)
686     ;
687
688   *p = cfi;
689 }
690
691 /* Generate a new label for the CFI info to refer to.  */
692
693 char *
694 dwarf2out_cfi_label ()
695 {
696   static char label[20];
697   static unsigned long label_num = 0;
698   
699   ASM_GENERATE_INTERNAL_LABEL (label, "LCFI", label_num++);
700   ASM_OUTPUT_LABEL (asm_out_file, label);
701
702   return label;
703 }
704
705 /* Add CFI to the current fde at the PC value indicated by LABEL if specified,
706    or to the CIE if LABEL is NULL.  */
707
708 static void
709 add_fde_cfi (label, cfi)
710      register char *label;
711      register dw_cfi_ref cfi;
712 {
713   if (label)
714     {
715       register dw_fde_ref fde = &fde_table[fde_table_in_use - 1];
716
717       if (*label == 0)
718         label = dwarf2out_cfi_label ();
719
720       if (fde->dw_fde_current_label == NULL
721           || strcmp (label, fde->dw_fde_current_label) != 0)
722         {
723           register dw_cfi_ref xcfi;
724
725           fde->dw_fde_current_label = label = xstrdup (label);
726
727           /* Set the location counter to the new label.  */
728           xcfi = new_cfi ();
729           xcfi->dw_cfi_opc = DW_CFA_advance_loc4;
730           xcfi->dw_cfi_oprnd1.dw_cfi_addr = label;
731           add_cfi (&fde->dw_fde_cfi, xcfi);
732         }
733
734       add_cfi (&fde->dw_fde_cfi, cfi);
735     }
736
737   else
738     add_cfi (&cie_cfi_head, cfi);
739 }
740
741 /* Subroutine of lookup_cfa.  */
742
743 static inline void
744 lookup_cfa_1 (cfi, regp, offsetp)
745      register dw_cfi_ref cfi;
746      register unsigned long *regp;
747      register long *offsetp;
748 {
749   switch (cfi->dw_cfi_opc)
750     {
751     case DW_CFA_def_cfa_offset:
752       *offsetp = cfi->dw_cfi_oprnd1.dw_cfi_offset;
753       break;
754     case DW_CFA_def_cfa_register:
755       *regp = cfi->dw_cfi_oprnd1.dw_cfi_reg_num;
756       break;
757     case DW_CFA_def_cfa:
758       *regp = cfi->dw_cfi_oprnd1.dw_cfi_reg_num;
759       *offsetp = cfi->dw_cfi_oprnd2.dw_cfi_offset;
760       break;
761     default:
762       break;
763     }
764 }
765
766 /* Find the previous value for the CFA.  */
767
768 static void
769 lookup_cfa (regp, offsetp)
770      register unsigned long *regp;
771      register long *offsetp;
772 {
773   register dw_cfi_ref cfi;
774
775   *regp = (unsigned long) -1;
776   *offsetp = 0;
777
778   for (cfi = cie_cfi_head; cfi; cfi = cfi->dw_cfi_next)
779     lookup_cfa_1 (cfi, regp, offsetp);
780
781   if (fde_table_in_use)
782     {
783       register dw_fde_ref fde = &fde_table[fde_table_in_use - 1];
784       for (cfi = fde->dw_fde_cfi; cfi; cfi = cfi->dw_cfi_next)
785         lookup_cfa_1 (cfi, regp, offsetp);
786     }
787 }
788
789 /* The current rule for calculating the DWARF2 canonical frame address.  */
790 static unsigned long cfa_reg;
791 static long cfa_offset;
792
793 /* The register used for saving registers to the stack, and its offset
794    from the CFA.  */
795 static unsigned cfa_store_reg;
796 static long cfa_store_offset;
797
798 /* The running total of the size of arguments pushed onto the stack.  */
799 static long args_size;
800
801 /* The last args_size we actually output.  */
802 static long old_args_size;
803
804 /* Entry point to update the canonical frame address (CFA).
805    LABEL is passed to add_fde_cfi.  The value of CFA is now to be
806    calculated from REG+OFFSET.  */
807
808 void
809 dwarf2out_def_cfa (label, reg, offset)
810      register char *label;
811      register unsigned reg;
812      register long offset;
813 {
814   register dw_cfi_ref cfi;
815   unsigned long old_reg;
816   long old_offset;
817
818   cfa_reg = reg;
819   cfa_offset = offset;
820   if (cfa_store_reg == reg)
821     cfa_store_offset = offset;
822
823   reg = DWARF_FRAME_REGNUM (reg);
824   lookup_cfa (&old_reg, &old_offset);
825
826   if (reg == old_reg && offset == old_offset)
827     return;
828
829   cfi = new_cfi ();
830
831   if (reg == old_reg)
832     {
833       cfi->dw_cfi_opc = DW_CFA_def_cfa_offset;
834       cfi->dw_cfi_oprnd1.dw_cfi_offset = offset;
835     }
836
837 #ifndef MIPS_DEBUGGING_INFO  /* SGI dbx thinks this means no offset.  */
838   else if (offset == old_offset && old_reg != (unsigned long) -1)
839     {
840       cfi->dw_cfi_opc = DW_CFA_def_cfa_register;
841       cfi->dw_cfi_oprnd1.dw_cfi_reg_num = reg;
842     }
843 #endif
844
845   else
846     {
847       cfi->dw_cfi_opc = DW_CFA_def_cfa;
848       cfi->dw_cfi_oprnd1.dw_cfi_reg_num = reg;
849       cfi->dw_cfi_oprnd2.dw_cfi_offset = offset;
850     }
851
852   add_fde_cfi (label, cfi);
853 }
854
855 /* Add the CFI for saving a register.  REG is the CFA column number.
856    LABEL is passed to add_fde_cfi.
857    If SREG is -1, the register is saved at OFFSET from the CFA;
858    otherwise it is saved in SREG.  */
859
860 static void
861 reg_save (label, reg, sreg, offset)
862      register char * label;
863      register unsigned reg;
864      register unsigned sreg;
865      register long offset;
866 {
867   register dw_cfi_ref cfi = new_cfi ();
868
869   cfi->dw_cfi_oprnd1.dw_cfi_reg_num = reg;
870
871   /* The following comparison is correct. -1 is used to indicate that
872      the value isn't a register number.  */
873   if (sreg == (unsigned int) -1)
874     {
875       if (reg & ~0x3f)
876         /* The register number won't fit in 6 bits, so we have to use
877            the long form.  */
878         cfi->dw_cfi_opc = DW_CFA_offset_extended;
879       else
880         cfi->dw_cfi_opc = DW_CFA_offset;
881
882       offset /= DWARF_CIE_DATA_ALIGNMENT;
883       if (offset < 0)
884         abort ();
885       cfi->dw_cfi_oprnd2.dw_cfi_offset = offset;
886     }
887   else
888     {
889       cfi->dw_cfi_opc = DW_CFA_register;
890       cfi->dw_cfi_oprnd2.dw_cfi_reg_num = sreg;
891     }
892
893   add_fde_cfi (label, cfi);
894 }
895
896 /* Add the CFI for saving a register window.  LABEL is passed to reg_save.
897    This CFI tells the unwinder that it needs to restore the window registers
898    from the previous frame's window save area.
899    
900    ??? Perhaps we should note in the CIE where windows are saved (instead of
901    assuming 0(cfa)) and what registers are in the window.  */
902
903 void
904 dwarf2out_window_save (label)
905      register char * label;
906 {
907   register dw_cfi_ref cfi = new_cfi ();
908   cfi->dw_cfi_opc = DW_CFA_GNU_window_save;
909   add_fde_cfi (label, cfi);
910 }
911
912 /* Add a CFI to update the running total of the size of arguments
913    pushed onto the stack.  */
914
915 void
916 dwarf2out_args_size (label, size)
917      char *label;
918      long size;
919 {
920   register dw_cfi_ref cfi;
921
922   if (size == old_args_size)
923     return;
924   old_args_size = size;
925
926   cfi = new_cfi ();
927   cfi->dw_cfi_opc = DW_CFA_GNU_args_size;
928   cfi->dw_cfi_oprnd1.dw_cfi_offset = size;
929   add_fde_cfi (label, cfi);
930 }
931
932 /* Entry point for saving a register to the stack.  REG is the GCC register
933    number.  LABEL and OFFSET are passed to reg_save.  */
934
935 void
936 dwarf2out_reg_save (label, reg, offset)
937      register char * label;
938      register unsigned reg;
939      register long offset;
940 {
941   reg_save (label, DWARF_FRAME_REGNUM (reg), -1, offset);
942 }
943
944 /* Entry point for saving the return address in the stack.
945    LABEL and OFFSET are passed to reg_save.  */
946
947 void
948 dwarf2out_return_save (label, offset)
949      register char * label;
950      register long offset;
951 {
952   reg_save (label, DWARF_FRAME_RETURN_COLUMN, -1, offset);
953 }
954
955 /* Entry point for saving the return address in a register.
956    LABEL and SREG are passed to reg_save.  */
957
958 void
959 dwarf2out_return_reg (label, sreg)
960      register char * label;
961      register unsigned sreg;
962 {
963   reg_save (label, DWARF_FRAME_RETURN_COLUMN, sreg, 0);
964 }
965
966 /* Record the initial position of the return address.  RTL is
967    INCOMING_RETURN_ADDR_RTX.  */
968
969 static void
970 initial_return_save (rtl)
971      register rtx rtl;
972 {
973   unsigned int reg = (unsigned int) -1;
974   long offset = 0;
975
976   switch (GET_CODE (rtl))
977     {
978     case REG:
979       /* RA is in a register.  */
980       reg = reg_number (rtl);
981       break;
982     case MEM:
983       /* RA is on the stack.  */
984       rtl = XEXP (rtl, 0);
985       switch (GET_CODE (rtl))
986         {
987         case REG:
988           if (REGNO (rtl) != STACK_POINTER_REGNUM)
989             abort ();
990           offset = 0;
991           break;
992         case PLUS:
993           if (REGNO (XEXP (rtl, 0)) != STACK_POINTER_REGNUM)
994             abort ();
995           offset = INTVAL (XEXP (rtl, 1));
996           break;
997         case MINUS:
998           if (REGNO (XEXP (rtl, 0)) != STACK_POINTER_REGNUM)
999             abort ();
1000           offset = -INTVAL (XEXP (rtl, 1));
1001           break;
1002         default:
1003           abort ();
1004         }
1005       break;
1006     case PLUS:
1007       /* The return address is at some offset from any value we can
1008          actually load.  For instance, on the SPARC it is in %i7+8. Just
1009          ignore the offset for now; it doesn't matter for unwinding frames.  */
1010       if (GET_CODE (XEXP (rtl, 1)) != CONST_INT)
1011         abort ();
1012       initial_return_save (XEXP (rtl, 0));
1013       return;
1014     default:
1015       abort ();
1016     }
1017
1018   reg_save (NULL, DWARF_FRAME_RETURN_COLUMN, reg, offset - cfa_offset);
1019 }
1020
1021 /* Check INSN to see if it looks like a push or a stack adjustment, and
1022    make a note of it if it does.  EH uses this information to find out how
1023    much extra space it needs to pop off the stack.  */
1024
1025 static void
1026 dwarf2out_stack_adjust (insn)
1027      rtx insn;
1028 {
1029   long offset;
1030   char *label;
1031
1032   if (! asynchronous_exceptions && GET_CODE (insn) == CALL_INSN)
1033     {
1034       /* Extract the size of the args from the CALL rtx itself.  */
1035
1036       insn = PATTERN (insn);
1037       if (GET_CODE (insn) == PARALLEL)
1038         insn = XVECEXP (insn, 0, 0);
1039       if (GET_CODE (insn) == SET)
1040         insn = SET_SRC (insn);
1041       assert (GET_CODE (insn) == CALL);
1042       dwarf2out_args_size ("", INTVAL (XEXP (insn, 1)));
1043       return;
1044     }
1045
1046   /* If only calls can throw, and we have a frame pointer,
1047      save up adjustments until we see the CALL_INSN.  */
1048   else if (! asynchronous_exceptions
1049            && cfa_reg != STACK_POINTER_REGNUM)
1050     return;
1051
1052   if (GET_CODE (insn) == BARRIER)
1053     {
1054       /* When we see a BARRIER, we know to reset args_size to 0.  Usually
1055          the compiler will have already emitted a stack adjustment, but
1056          doesn't bother for calls to noreturn functions.  */
1057 #ifdef STACK_GROWS_DOWNWARD
1058       offset = -args_size;
1059 #else
1060       offset = args_size;
1061 #endif
1062     }
1063   else if (GET_CODE (PATTERN (insn)) == SET)
1064     {
1065       rtx src, dest;
1066       enum rtx_code code;
1067
1068       insn = PATTERN (insn);
1069       src = SET_SRC (insn);
1070       dest = SET_DEST (insn);
1071
1072       if (dest == stack_pointer_rtx)
1073         {
1074           /* (set (reg sp) (plus (reg sp) (const_int))) */
1075           code = GET_CODE (src);
1076           if (! (code == PLUS || code == MINUS)
1077               || XEXP (src, 0) != stack_pointer_rtx
1078               || GET_CODE (XEXP (src, 1)) != CONST_INT)
1079             return;
1080
1081           offset = INTVAL (XEXP (src, 1));
1082         }
1083       else if (GET_CODE (dest) == MEM)
1084         {
1085           /* (set (mem (pre_dec (reg sp))) (foo)) */
1086           src = XEXP (dest, 0);
1087           code = GET_CODE (src);
1088
1089           if (! (code == PRE_DEC || code == PRE_INC)
1090               || XEXP (src, 0) != stack_pointer_rtx)
1091             return;
1092
1093           offset = GET_MODE_SIZE (GET_MODE (dest));
1094         }
1095       else
1096         return;
1097
1098       if (code == PLUS || code == PRE_INC)
1099         offset = -offset;
1100     }
1101   else
1102     return;
1103
1104   if (offset == 0)
1105     return;
1106
1107   if (cfa_reg == STACK_POINTER_REGNUM)
1108     cfa_offset += offset;
1109
1110 #ifndef STACK_GROWS_DOWNWARD
1111   offset = -offset;
1112 #endif
1113   args_size += offset;
1114   if (args_size < 0)
1115     args_size = 0;
1116
1117   label = dwarf2out_cfi_label ();
1118   dwarf2out_def_cfa (label, cfa_reg, cfa_offset);
1119   dwarf2out_args_size (label, args_size);
1120 }
1121
1122 /* A temporary register used in adjusting SP or setting up the store_reg.  */
1123 static unsigned cfa_temp_reg;
1124
1125 /* A temporary value used in adjusting SP or setting up the store_reg.  */
1126 static long cfa_temp_value;
1127
1128 /* Record call frame debugging information for an expression, which either
1129    sets SP or FP (adjusting how we calculate the frame address) or saves a
1130    register to the stack. */
1131
1132 static void
1133 dwarf2out_frame_debug_expr (expr, label)
1134      rtx expr;
1135      char *label;
1136 {
1137   rtx src, dest;
1138   long offset;
1139     
1140   /* If RTX_FRAME_RELATED_P is set on a PARALLEL, process each member of 
1141      the PARALLEL independantly. The first element is always processed if 
1142      it is a SET. This is for backward compatability.   Other elements 
1143      are processed only if they are SETs and the RTX_FRAME_RELATED_P 
1144      flag is set in them. */
1145
1146   if (GET_CODE (expr) == PARALLEL)
1147     { 
1148       int par_index;
1149       int limit = XVECLEN (expr, 0);
1150
1151       for (par_index = 0; par_index < limit; par_index++)
1152         {
1153           rtx x = XVECEXP (expr, 0, par_index);
1154           
1155           if (GET_CODE (x) == SET &&
1156               (RTX_FRAME_RELATED_P (x) || par_index == 0))
1157             dwarf2out_frame_debug_expr (x, label);
1158         }
1159       return;
1160     }
1161   
1162   if (GET_CODE (expr) != SET)
1163     abort ();
1164
1165   src = SET_SRC (expr);
1166   dest = SET_DEST (expr);
1167
1168   switch (GET_CODE (dest))
1169     {
1170     case REG:
1171       /* Update the CFA rule wrt SP or FP.  Make sure src is
1172          relative to the current CFA register.  */
1173       switch (GET_CODE (src))
1174         {
1175           /* Setting FP from SP.  */
1176         case REG:
1177           if (cfa_reg != (unsigned) REGNO (src))
1178             abort ();
1179           if (REGNO (dest) != STACK_POINTER_REGNUM
1180               && !(frame_pointer_needed
1181                    && REGNO (dest) == HARD_FRAME_POINTER_REGNUM))
1182             abort ();
1183           cfa_reg = REGNO (dest);
1184           break;
1185
1186         case PLUS:
1187         case MINUS:
1188           if (dest == stack_pointer_rtx)
1189             {
1190               /* Adjusting SP.  */
1191               switch (GET_CODE (XEXP (src, 1)))
1192                 {
1193                 case CONST_INT:
1194                   offset = INTVAL (XEXP (src, 1));
1195                   break;
1196                 case REG:
1197                   if ((unsigned) REGNO (XEXP (src, 1)) != cfa_temp_reg)
1198                     abort ();
1199                   offset = cfa_temp_value;
1200                   break;
1201                 default:
1202                   abort ();
1203                 }
1204
1205               if (XEXP (src, 0) == hard_frame_pointer_rtx)
1206                 {
1207                   /* Restoring SP from FP in the epilogue.  */
1208                   if (cfa_reg != (unsigned) HARD_FRAME_POINTER_REGNUM)
1209                     abort ();
1210                   cfa_reg = STACK_POINTER_REGNUM;
1211                 }
1212               else if (XEXP (src, 0) != stack_pointer_rtx)
1213                 abort ();
1214
1215               if (GET_CODE (src) == PLUS)
1216                 offset = -offset;
1217               if (cfa_reg == STACK_POINTER_REGNUM)
1218                 cfa_offset += offset;
1219               if (cfa_store_reg == STACK_POINTER_REGNUM)
1220                 cfa_store_offset += offset;
1221             }
1222           else if (dest == hard_frame_pointer_rtx)
1223             {
1224               /* Either setting the FP from an offset of the SP,
1225                  or adjusting the FP */
1226               if (! frame_pointer_needed
1227                   || REGNO (dest) != HARD_FRAME_POINTER_REGNUM)
1228                 abort ();
1229
1230               if (XEXP (src, 0) == stack_pointer_rtx
1231                   && GET_CODE (XEXP (src, 1)) == CONST_INT)
1232                 {
1233                   if (cfa_reg != STACK_POINTER_REGNUM)
1234                     abort ();
1235                   offset = INTVAL (XEXP (src, 1));
1236                   if (GET_CODE (src) == PLUS)
1237                     offset = -offset;
1238                   cfa_offset += offset;
1239                   cfa_reg = HARD_FRAME_POINTER_REGNUM;
1240                 }
1241               else if (XEXP (src, 0) == hard_frame_pointer_rtx
1242                        && GET_CODE (XEXP (src, 1)) == CONST_INT)
1243                 {
1244                   if (cfa_reg != (unsigned) HARD_FRAME_POINTER_REGNUM)
1245                     abort ();
1246                   offset = INTVAL (XEXP (src, 1));
1247                   if (GET_CODE (src) == PLUS)
1248                     offset = -offset;
1249                   cfa_offset += offset;
1250                 }
1251
1252               else 
1253                 abort();
1254             }
1255           else
1256             {
1257               if (GET_CODE (src) != PLUS
1258                   || XEXP (src, 1) != stack_pointer_rtx)
1259                 abort ();
1260               if (GET_CODE (XEXP (src, 0)) != REG
1261                   || (unsigned) REGNO (XEXP (src, 0)) != cfa_temp_reg)
1262                 abort ();
1263               if (cfa_reg != STACK_POINTER_REGNUM)
1264                 abort ();
1265               cfa_store_reg = REGNO (dest);
1266               cfa_store_offset = cfa_offset - cfa_temp_value;
1267             }
1268           break;
1269
1270         case CONST_INT:
1271           cfa_temp_reg = REGNO (dest);
1272           cfa_temp_value = INTVAL (src);
1273           break;
1274
1275         case IOR:
1276           if (GET_CODE (XEXP (src, 0)) != REG
1277               || (unsigned) REGNO (XEXP (src, 0)) != cfa_temp_reg
1278               || (unsigned) REGNO (dest) != cfa_temp_reg
1279               || GET_CODE (XEXP (src, 1)) != CONST_INT)
1280             abort ();
1281           cfa_temp_value |= INTVAL (XEXP (src, 1));
1282           break;
1283
1284         default:
1285           abort ();
1286         }
1287       dwarf2out_def_cfa (label, cfa_reg, cfa_offset);
1288       break;
1289
1290     case MEM:
1291       /* Saving a register to the stack.  Make sure dest is relative to the
1292          CFA register.  */
1293       if (GET_CODE (src) != REG)
1294         abort ();
1295       switch (GET_CODE (XEXP (dest, 0)))
1296         {
1297           /* With a push.  */
1298         case PRE_INC:
1299         case PRE_DEC:
1300           offset = GET_MODE_SIZE (GET_MODE (dest));
1301           if (GET_CODE (XEXP (dest, 0)) == PRE_INC)
1302             offset = -offset;
1303
1304           if (REGNO (XEXP (XEXP (dest, 0), 0)) != STACK_POINTER_REGNUM
1305               || cfa_store_reg != STACK_POINTER_REGNUM)
1306             abort ();
1307           cfa_store_offset += offset;
1308           if (cfa_reg == STACK_POINTER_REGNUM)
1309             cfa_offset = cfa_store_offset;
1310
1311           offset = -cfa_store_offset;
1312           break;
1313
1314           /* With an offset.  */
1315         case PLUS:
1316         case MINUS:
1317           offset = INTVAL (XEXP (XEXP (dest, 0), 1));
1318           if (GET_CODE (XEXP (dest, 0)) == MINUS)
1319             offset = -offset;
1320
1321           if (cfa_store_reg != (unsigned) REGNO (XEXP (XEXP (dest, 0), 0)))
1322             abort ();
1323           offset -= cfa_store_offset;
1324           break;
1325
1326           /* Without an offset.  */
1327         case REG:
1328           if (cfa_store_reg != (unsigned) REGNO (XEXP (dest, 0)))
1329             abort();
1330           offset = -cfa_store_offset;
1331           break;
1332
1333         default:
1334           abort ();
1335         }
1336       dwarf2out_def_cfa (label, cfa_reg, cfa_offset);
1337       dwarf2out_reg_save (label, REGNO (src), offset);
1338       break;
1339
1340     default:
1341       abort ();
1342     }
1343 }
1344
1345
1346 /* Record call frame debugging information for INSN, which either
1347    sets SP or FP (adjusting how we calculate the frame address) or saves a
1348    register to the stack.  If INSN is NULL_RTX, initialize our state.  */
1349
1350 void
1351 dwarf2out_frame_debug (insn)
1352      rtx insn;
1353 {
1354   char *label;
1355   rtx src;
1356
1357   if (insn == NULL_RTX)
1358     {
1359       /* Set up state for generating call frame debug info.  */
1360       lookup_cfa (&cfa_reg, &cfa_offset);
1361       if (cfa_reg != DWARF_FRAME_REGNUM (STACK_POINTER_REGNUM))
1362         abort ();
1363       cfa_reg = STACK_POINTER_REGNUM;
1364       cfa_store_reg = cfa_reg;
1365       cfa_store_offset = cfa_offset;
1366       cfa_temp_reg = -1;
1367       cfa_temp_value = 0;
1368       return;
1369     }
1370
1371   if (! RTX_FRAME_RELATED_P (insn))
1372     {
1373       dwarf2out_stack_adjust (insn);
1374       return;
1375     }
1376
1377   label = dwarf2out_cfi_label ();
1378     
1379   src = find_reg_note (insn, REG_FRAME_RELATED_EXPR, NULL_RTX);
1380   if (src)
1381     insn = XEXP (src, 0);
1382   else 
1383     insn = PATTERN (insn);
1384
1385   dwarf2out_frame_debug_expr (insn, label);
1386 }
1387
1388 /* Return the size of an unsigned LEB128 quantity.  */
1389
1390 static inline unsigned long
1391 size_of_uleb128 (value)
1392      register unsigned long value;
1393 {
1394   register unsigned long size = 0;
1395   register unsigned byte;
1396
1397   do
1398     {
1399       byte = (value & 0x7f);
1400       value >>= 7;
1401       size += 1;
1402     }
1403   while (value != 0);
1404
1405   return size;
1406 }
1407
1408 /* Return the size of a signed LEB128 quantity.  */
1409
1410 static inline unsigned long
1411 size_of_sleb128 (value)
1412      register long value;
1413 {
1414   register unsigned long size = 0;
1415   register unsigned byte;
1416
1417   do
1418     {
1419       byte = (value & 0x7f);
1420       value >>= 7;
1421       size += 1;
1422     }
1423   while (!(((value == 0) && ((byte & 0x40) == 0))
1424            || ((value == -1) && ((byte & 0x40) != 0))));
1425
1426   return size;
1427 }
1428
1429 /* Output an unsigned LEB128 quantity.  */
1430
1431 static void
1432 output_uleb128 (value)
1433      register unsigned long value;
1434 {
1435   unsigned long save_value = value;
1436
1437   fprintf (asm_out_file, "\t%s\t", ASM_BYTE_OP);
1438   do
1439     {
1440       register unsigned byte = (value & 0x7f);
1441       value >>= 7;
1442       if (value != 0)
1443         /* More bytes to follow.  */
1444         byte |= 0x80;
1445
1446       fprintf (asm_out_file, "0x%x", byte);
1447       if (value != 0)
1448         fprintf (asm_out_file, ",");
1449     }
1450   while (value != 0);
1451
1452   if (flag_debug_asm)
1453     fprintf (asm_out_file, "\t%s ULEB128 0x%lx", ASM_COMMENT_START, save_value);
1454 }
1455
1456 /* Output an signed LEB128 quantity.  */
1457
1458 static void
1459 output_sleb128 (value)
1460      register long value;
1461 {
1462   register int more;
1463   register unsigned byte;
1464   long save_value = value;
1465
1466   fprintf (asm_out_file, "\t%s\t", ASM_BYTE_OP);
1467   do
1468     {
1469       byte = (value & 0x7f);
1470       /* arithmetic shift */
1471       value >>= 7;
1472       more = !((((value == 0) && ((byte & 0x40) == 0))
1473                 || ((value == -1) && ((byte & 0x40) != 0))));
1474       if (more)
1475         byte |= 0x80;
1476
1477       fprintf (asm_out_file, "0x%x", byte);
1478       if (more)
1479         fprintf (asm_out_file, ",");
1480     }
1481
1482   while (more);
1483   if (flag_debug_asm)
1484     fprintf (asm_out_file, "\t%s SLEB128 %ld", ASM_COMMENT_START, save_value);
1485 }
1486
1487 /* Output a Call Frame Information opcode and its operand(s).  */
1488
1489 static void
1490 output_cfi (cfi, fde)
1491      register dw_cfi_ref cfi;
1492      register dw_fde_ref fde;
1493 {
1494   if (cfi->dw_cfi_opc == DW_CFA_advance_loc)
1495     {
1496       ASM_OUTPUT_DWARF_DATA1 (asm_out_file,
1497                               cfi->dw_cfi_opc
1498                               | (cfi->dw_cfi_oprnd1.dw_cfi_offset & 0x3f));
1499       if (flag_debug_asm)
1500         fprintf (asm_out_file, "\t%s DW_CFA_advance_loc 0x%lx",
1501                  ASM_COMMENT_START, cfi->dw_cfi_oprnd1.dw_cfi_offset);
1502       fputc ('\n', asm_out_file);
1503     }
1504
1505   else if (cfi->dw_cfi_opc == DW_CFA_offset)
1506     {
1507       ASM_OUTPUT_DWARF_DATA1 (asm_out_file,
1508                               cfi->dw_cfi_opc
1509                               | (cfi->dw_cfi_oprnd1.dw_cfi_reg_num & 0x3f));
1510       if (flag_debug_asm)
1511         fprintf (asm_out_file, "\t%s DW_CFA_offset, column 0x%lx",
1512                  ASM_COMMENT_START, cfi->dw_cfi_oprnd1.dw_cfi_reg_num);
1513
1514       fputc ('\n', asm_out_file);
1515       output_uleb128 (cfi->dw_cfi_oprnd2.dw_cfi_offset);
1516       fputc ('\n', asm_out_file);
1517     }
1518   else if (cfi->dw_cfi_opc == DW_CFA_restore)
1519     {
1520       ASM_OUTPUT_DWARF_DATA1 (asm_out_file,
1521                               cfi->dw_cfi_opc
1522                               | (cfi->dw_cfi_oprnd1.dw_cfi_reg_num & 0x3f));
1523       if (flag_debug_asm)
1524         fprintf (asm_out_file, "\t%s DW_CFA_restore, column 0x%lx",
1525                  ASM_COMMENT_START, cfi->dw_cfi_oprnd1.dw_cfi_reg_num);
1526
1527       fputc ('\n', asm_out_file);
1528     }
1529   else
1530     {
1531       ASM_OUTPUT_DWARF_DATA1 (asm_out_file, cfi->dw_cfi_opc);
1532       if (flag_debug_asm)
1533         fprintf (asm_out_file, "\t%s %s", ASM_COMMENT_START,
1534                  dwarf_cfi_name (cfi->dw_cfi_opc));
1535
1536       fputc ('\n', asm_out_file);
1537       switch (cfi->dw_cfi_opc)
1538         {
1539         case DW_CFA_set_loc:
1540           ASM_OUTPUT_DWARF_ADDR (asm_out_file, cfi->dw_cfi_oprnd1.dw_cfi_addr);
1541           fputc ('\n', asm_out_file);
1542           break;
1543         case DW_CFA_advance_loc1:
1544           ASM_OUTPUT_DWARF_DELTA1 (asm_out_file,
1545                                    cfi->dw_cfi_oprnd1.dw_cfi_addr,
1546                                    fde->dw_fde_current_label);
1547           fputc ('\n', asm_out_file);
1548           fde->dw_fde_current_label = cfi->dw_cfi_oprnd1.dw_cfi_addr;
1549           break;
1550         case DW_CFA_advance_loc2:
1551           ASM_OUTPUT_DWARF_DELTA2 (asm_out_file,
1552                                    cfi->dw_cfi_oprnd1.dw_cfi_addr,
1553                                    fde->dw_fde_current_label);
1554           fputc ('\n', asm_out_file);
1555           fde->dw_fde_current_label = cfi->dw_cfi_oprnd1.dw_cfi_addr;
1556           break;
1557         case DW_CFA_advance_loc4:
1558           ASM_OUTPUT_DWARF_DELTA4 (asm_out_file,
1559                                    cfi->dw_cfi_oprnd1.dw_cfi_addr,
1560                                    fde->dw_fde_current_label);
1561           fputc ('\n', asm_out_file);
1562           fde->dw_fde_current_label = cfi->dw_cfi_oprnd1.dw_cfi_addr;
1563           break;
1564 #ifdef MIPS_DEBUGGING_INFO
1565         case DW_CFA_MIPS_advance_loc8:
1566           /* TODO: not currently implemented.  */
1567           abort ();
1568           break;
1569 #endif
1570         case DW_CFA_offset_extended:
1571         case DW_CFA_def_cfa:
1572           output_uleb128 (cfi->dw_cfi_oprnd1.dw_cfi_reg_num);
1573           fputc ('\n', asm_out_file);
1574           output_uleb128 (cfi->dw_cfi_oprnd2.dw_cfi_offset);
1575           fputc ('\n', asm_out_file);
1576           break;
1577         case DW_CFA_restore_extended:
1578         case DW_CFA_undefined:
1579           output_uleb128 (cfi->dw_cfi_oprnd1.dw_cfi_reg_num);
1580           fputc ('\n', asm_out_file);
1581           break;
1582         case DW_CFA_same_value:
1583         case DW_CFA_def_cfa_register:
1584           output_uleb128 (cfi->dw_cfi_oprnd1.dw_cfi_reg_num);
1585           fputc ('\n', asm_out_file);
1586           break;
1587         case DW_CFA_register:
1588           output_uleb128 (cfi->dw_cfi_oprnd1.dw_cfi_reg_num);
1589           fputc ('\n', asm_out_file);
1590           output_uleb128 (cfi->dw_cfi_oprnd2.dw_cfi_reg_num);
1591           fputc ('\n', asm_out_file);
1592           break;
1593         case DW_CFA_def_cfa_offset:
1594           output_uleb128 (cfi->dw_cfi_oprnd1.dw_cfi_offset);
1595           fputc ('\n', asm_out_file);
1596           break;
1597         case DW_CFA_GNU_window_save:
1598           break;
1599         case DW_CFA_GNU_args_size:
1600           output_uleb128 (cfi->dw_cfi_oprnd1.dw_cfi_offset);
1601           fputc ('\n', asm_out_file);
1602           break;
1603         default:
1604           break;
1605         }
1606      }
1607 }
1608
1609 /* Output the call frame information used to used to record information
1610    that relates to calculating the frame pointer, and records the
1611    location of saved registers.  */
1612
1613 static void
1614 output_call_frame_info (for_eh)
1615      int for_eh;
1616 {
1617   register unsigned long i;
1618   register dw_fde_ref fde;
1619   register dw_cfi_ref cfi;
1620   char l1[20], l2[20];
1621 #ifdef ASM_OUTPUT_DEFINE_LABEL_DIFFERENCE_SYMBOL
1622   char ld[20];
1623 #endif
1624
1625   /* Do we want to include a pointer to the exception table?  */
1626   int eh_ptr = for_eh && exception_table_p ();
1627
1628   fputc ('\n', asm_out_file);
1629
1630   /* We're going to be generating comments, so turn on app.  */
1631   if (flag_debug_asm)
1632     app_enable ();
1633
1634   if (for_eh)
1635     {
1636 #ifdef EH_FRAME_SECTION
1637       EH_FRAME_SECTION ();
1638 #else
1639       tree label = get_file_function_name ('F');
1640
1641       force_data_section ();
1642       ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (PTR_SIZE));
1643       ASM_GLOBALIZE_LABEL (asm_out_file, IDENTIFIER_POINTER (label));
1644       ASM_OUTPUT_LABEL (asm_out_file, IDENTIFIER_POINTER (label));
1645 #endif
1646       assemble_label ("__FRAME_BEGIN__");
1647     }
1648   else
1649     ASM_OUTPUT_SECTION (asm_out_file, FRAME_SECTION);
1650
1651   /* Output the CIE. */
1652   ASM_GENERATE_INTERNAL_LABEL (l1, CIE_AFTER_SIZE_LABEL, for_eh);
1653   ASM_GENERATE_INTERNAL_LABEL (l2, CIE_END_LABEL, for_eh);
1654 #ifdef ASM_OUTPUT_DEFINE_LABEL_DIFFERENCE_SYMBOL
1655   ASM_GENERATE_INTERNAL_LABEL (ld, CIE_LENGTH_LABEL, for_eh);
1656   if (for_eh)
1657     ASM_OUTPUT_DWARF_OFFSET4 (asm_out_file, ld);
1658   else
1659     ASM_OUTPUT_DWARF_OFFSET (asm_out_file, ld);
1660 #else
1661   if (for_eh)
1662     ASM_OUTPUT_DWARF_DELTA4 (asm_out_file, l2, l1);
1663   else
1664     ASM_OUTPUT_DWARF_DELTA (asm_out_file, l2, l1);
1665 #endif
1666   if (flag_debug_asm)
1667     fprintf (asm_out_file, "\t%s Length of Common Information Entry",
1668              ASM_COMMENT_START);
1669
1670   fputc ('\n', asm_out_file);
1671   ASM_OUTPUT_LABEL (asm_out_file, l1);
1672
1673   if (for_eh)
1674     /* Now that the CIE pointer is PC-relative for EH,
1675        use 0 to identify the CIE.  */
1676     ASM_OUTPUT_DWARF_DATA4 (asm_out_file, 0);
1677   else
1678     ASM_OUTPUT_DWARF_DATA4 (asm_out_file, DW_CIE_ID);
1679
1680   if (flag_debug_asm)
1681     fprintf (asm_out_file, "\t%s CIE Identifier Tag", ASM_COMMENT_START);
1682
1683   fputc ('\n', asm_out_file);
1684   if (! for_eh && DWARF_OFFSET_SIZE == 8)
1685     {
1686       ASM_OUTPUT_DWARF_DATA4 (asm_out_file, DW_CIE_ID);
1687       fputc ('\n', asm_out_file);
1688     }
1689
1690   ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_CIE_VERSION);
1691   if (flag_debug_asm)
1692     fprintf (asm_out_file, "\t%s CIE Version", ASM_COMMENT_START);
1693
1694   fputc ('\n', asm_out_file);
1695   if (eh_ptr)
1696     {
1697       /* The CIE contains a pointer to the exception region info for the
1698          frame.  Make the augmentation string three bytes (including the
1699          trailing null) so the pointer is 4-byte aligned.  The Solaris ld
1700          can't handle unaligned relocs.  */
1701       if (flag_debug_asm)
1702         {
1703           ASM_OUTPUT_DWARF_STRING (asm_out_file, "eh");
1704           fprintf (asm_out_file, "\t%s CIE Augmentation", ASM_COMMENT_START);
1705         }
1706       else
1707         {
1708           ASM_OUTPUT_ASCII (asm_out_file, "eh", 3);
1709         }
1710       fputc ('\n', asm_out_file);
1711
1712       ASM_OUTPUT_DWARF_ADDR (asm_out_file, "__EXCEPTION_TABLE__");
1713       if (flag_debug_asm)
1714         fprintf (asm_out_file, "\t%s pointer to exception region info",
1715                  ASM_COMMENT_START);
1716     }
1717   else
1718     {
1719       ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 0);
1720       if (flag_debug_asm)
1721         fprintf (asm_out_file, "\t%s CIE Augmentation (none)",
1722                  ASM_COMMENT_START);
1723     }
1724
1725   fputc ('\n', asm_out_file);
1726   output_uleb128 (1);
1727   if (flag_debug_asm)
1728     fprintf (asm_out_file, " (CIE Code Alignment Factor)");
1729
1730   fputc ('\n', asm_out_file);
1731   output_sleb128 (DWARF_CIE_DATA_ALIGNMENT);
1732   if (flag_debug_asm)
1733     fprintf (asm_out_file, " (CIE Data Alignment Factor)");
1734
1735   fputc ('\n', asm_out_file);
1736   ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DWARF_FRAME_RETURN_COLUMN);
1737   if (flag_debug_asm)
1738     fprintf (asm_out_file, "\t%s CIE RA Column", ASM_COMMENT_START);
1739
1740   fputc ('\n', asm_out_file);
1741
1742   for (cfi = cie_cfi_head; cfi != NULL; cfi = cfi->dw_cfi_next)
1743     output_cfi (cfi, NULL);
1744
1745   /* Pad the CIE out to an address sized boundary.  */
1746   ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (PTR_SIZE));
1747   ASM_OUTPUT_LABEL (asm_out_file, l2);
1748 #ifdef ASM_OUTPUT_DEFINE_LABEL_DIFFERENCE_SYMBOL
1749   ASM_OUTPUT_DEFINE_LABEL_DIFFERENCE_SYMBOL (asm_out_file, ld, l2, l1);
1750   if (flag_debug_asm)
1751     fprintf (asm_out_file, "\t%s CIE Length Symbol", ASM_COMMENT_START);
1752   fputc ('\n', asm_out_file);
1753 #endif
1754
1755   /* Loop through all of the FDE's.  */
1756   for (i = 0; i < fde_table_in_use; ++i)
1757     {
1758       fde = &fde_table[i];
1759
1760       ASM_GENERATE_INTERNAL_LABEL (l1, FDE_AFTER_SIZE_LABEL, for_eh + i*2);
1761       ASM_GENERATE_INTERNAL_LABEL (l2, FDE_END_LABEL, for_eh + i*2);
1762 #ifdef ASM_OUTPUT_DEFINE_LABEL_DIFFERENCE_SYMBOL
1763       ASM_GENERATE_INTERNAL_LABEL (ld, FDE_LENGTH_LABEL, for_eh + i*2);
1764       if (for_eh)
1765         ASM_OUTPUT_DWARF_OFFSET4 (asm_out_file, ld);
1766       else
1767         ASM_OUTPUT_DWARF_OFFSET (asm_out_file, ld);
1768 #else
1769       if (for_eh)
1770         ASM_OUTPUT_DWARF_DELTA4 (asm_out_file, l2, l1);
1771       else
1772         ASM_OUTPUT_DWARF_DELTA (asm_out_file, l2, l1);
1773 #endif
1774       if (flag_debug_asm)
1775         fprintf (asm_out_file, "\t%s FDE Length", ASM_COMMENT_START);
1776       fputc ('\n', asm_out_file);
1777       ASM_OUTPUT_LABEL (asm_out_file, l1);
1778
1779       /* ??? This always emits a 4 byte offset when for_eh is true, but it
1780          emits a target dependent sized offset when for_eh is not true.
1781          This inconsistency may confuse gdb.  The only case where we need a
1782          non-4 byte offset is for the Irix6 N64 ABI, so we may lose SGI
1783          compatibility if we emit a 4 byte offset.  We need a 4 byte offset
1784          though in order to be compatible with the dwarf_fde struct in frame.c.
1785          If the for_eh case is changed, then the struct in frame.c has
1786          to be adjusted appropriately.  */
1787       if (for_eh)
1788         ASM_OUTPUT_DWARF_DELTA4 (asm_out_file, l1, "__FRAME_BEGIN__");
1789       else
1790         ASM_OUTPUT_DWARF_OFFSET (asm_out_file, stripattributes (FRAME_SECTION));
1791       if (flag_debug_asm)
1792         fprintf (asm_out_file, "\t%s FDE CIE offset", ASM_COMMENT_START);
1793
1794       fputc ('\n', asm_out_file);
1795       ASM_OUTPUT_DWARF_ADDR (asm_out_file, fde->dw_fde_begin);
1796       if (flag_debug_asm)
1797         fprintf (asm_out_file, "\t%s FDE initial location", ASM_COMMENT_START);
1798
1799       fputc ('\n', asm_out_file);
1800       ASM_OUTPUT_DWARF_ADDR_DELTA (asm_out_file,
1801                                    fde->dw_fde_end, fde->dw_fde_begin);
1802       if (flag_debug_asm)
1803         fprintf (asm_out_file, "\t%s FDE address range", ASM_COMMENT_START);
1804
1805       fputc ('\n', asm_out_file);
1806
1807       /* Loop through the Call Frame Instructions associated with
1808          this FDE.  */
1809       fde->dw_fde_current_label = fde->dw_fde_begin;
1810       for (cfi = fde->dw_fde_cfi; cfi != NULL; cfi = cfi->dw_cfi_next)
1811         output_cfi (cfi, fde);
1812
1813       /* Pad the FDE out to an address sized boundary.  */
1814       ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (PTR_SIZE));
1815       ASM_OUTPUT_LABEL (asm_out_file, l2);
1816 #ifdef ASM_OUTPUT_DEFINE_LABEL_DIFFERENCE_SYMBOL
1817       ASM_OUTPUT_DEFINE_LABEL_DIFFERENCE_SYMBOL (asm_out_file, ld, l2, l1);
1818       if (flag_debug_asm)
1819         fprintf (asm_out_file, "\t%s FDE Length Symbol", ASM_COMMENT_START);
1820       fputc ('\n', asm_out_file);
1821 #endif
1822     }
1823 #ifndef EH_FRAME_SECTION
1824   if (for_eh)
1825     {
1826       /* Emit terminating zero for table.  */
1827       ASM_OUTPUT_DWARF_DATA4 (asm_out_file, 0);
1828       fputc ('\n', asm_out_file);
1829     }
1830 #endif
1831 #ifdef MIPS_DEBUGGING_INFO
1832   /* Work around Irix 6 assembler bug whereby labels at the end of a section
1833      get a value of 0.  Putting .align 0 after the label fixes it.  */
1834   ASM_OUTPUT_ALIGN (asm_out_file, 0);
1835 #endif
1836
1837   /* Turn off app to make assembly quicker.  */
1838   if (flag_debug_asm)
1839     app_disable ();
1840 }
1841
1842 /* Output a marker (i.e. a label) for the beginning of a function, before
1843    the prologue.  */
1844
1845 void
1846 dwarf2out_begin_prologue ()
1847 {
1848   char label[MAX_ARTIFICIAL_LABEL_BYTES];
1849   register dw_fde_ref fde;
1850
1851   ++current_funcdef_number;
1852
1853   function_section (current_function_decl);
1854   ASM_GENERATE_INTERNAL_LABEL (label, FUNC_BEGIN_LABEL,
1855                                current_funcdef_number);
1856   ASM_OUTPUT_LABEL (asm_out_file, label);
1857
1858   /* Expand the fde table if necessary.  */
1859   if (fde_table_in_use == fde_table_allocated)
1860     {
1861       fde_table_allocated += FDE_TABLE_INCREMENT;
1862       fde_table
1863         = (dw_fde_ref) xrealloc (fde_table,
1864                                  fde_table_allocated * sizeof (dw_fde_node));
1865     }
1866
1867   /* Record the FDE associated with this function.  */
1868   current_funcdef_fde = fde_table_in_use;
1869
1870   /* Add the new FDE at the end of the fde_table.  */
1871   fde = &fde_table[fde_table_in_use++];
1872   fde->dw_fde_begin = xstrdup (label);
1873   fde->dw_fde_current_label = NULL;
1874   fde->dw_fde_end = NULL;
1875   fde->dw_fde_cfi = NULL;
1876
1877   args_size = old_args_size = 0;
1878 }
1879
1880 /* Output a marker (i.e. a label) for the absolute end of the generated code
1881    for a function definition.  This gets called *after* the epilogue code has
1882    been generated.  */
1883
1884 void
1885 dwarf2out_end_epilogue ()
1886 {
1887   dw_fde_ref fde;
1888   char label[MAX_ARTIFICIAL_LABEL_BYTES];
1889
1890   /* Output a label to mark the endpoint of the code generated for this
1891      function.        */
1892   ASM_GENERATE_INTERNAL_LABEL (label, FUNC_END_LABEL, current_funcdef_number);
1893   ASM_OUTPUT_LABEL (asm_out_file, label);
1894   fde = &fde_table[fde_table_in_use - 1];
1895   fde->dw_fde_end = xstrdup (label);
1896 }
1897
1898 void
1899 dwarf2out_frame_init ()
1900 {
1901   /* Allocate the initial hunk of the fde_table.  */
1902   fde_table = (dw_fde_ref) xcalloc (FDE_TABLE_INCREMENT, sizeof (dw_fde_node));
1903   fde_table_allocated = FDE_TABLE_INCREMENT;
1904   fde_table_in_use = 0;
1905
1906   /* Generate the CFA instructions common to all FDE's.  Do it now for the
1907      sake of lookup_cfa.  */
1908
1909 #ifdef DWARF2_UNWIND_INFO
1910   /* On entry, the Canonical Frame Address is at SP.  */
1911   dwarf2out_def_cfa (NULL, STACK_POINTER_REGNUM, INCOMING_FRAME_SP_OFFSET);
1912   initial_return_save (INCOMING_RETURN_ADDR_RTX);
1913 #endif
1914 }
1915
1916 void
1917 dwarf2out_frame_finish ()
1918 {
1919   /* Output call frame information.  */
1920 #ifdef MIPS_DEBUGGING_INFO
1921   if (write_symbols == DWARF2_DEBUG)
1922     output_call_frame_info (0);
1923   if (flag_unwind_tables || (flag_exceptions && ! exceptions_via_longjmp))
1924     output_call_frame_info (1);
1925 #else
1926   if (write_symbols == DWARF2_DEBUG
1927       || flag_unwind_tables || (flag_exceptions && ! exceptions_via_longjmp))
1928     output_call_frame_info (1);  
1929 #endif
1930 }  
1931
1932 #endif /* .debug_frame support */
1933
1934 /* And now, the support for symbolic debugging information.  */
1935 #ifdef DWARF2_DEBUGGING_INFO
1936
1937 /* NOTE: In the comments in this file, many references are made to
1938    "Debugging Information Entries".  This term is abbreviated as `DIE'
1939    throughout the remainder of this file.  */
1940
1941 /* An internal representation of the DWARF output is built, and then
1942    walked to generate the DWARF debugging info.  The walk of the internal
1943    representation is done after the entire program has been compiled.
1944    The types below are used to describe the internal representation.  */
1945
1946 /* Each DIE may have a series of attribute/value pairs.  Values
1947    can take on several forms.  The forms that are used in this
1948    implementation are listed below.  */
1949
1950 typedef enum
1951 {
1952   dw_val_class_addr,
1953   dw_val_class_loc,
1954   dw_val_class_const,
1955   dw_val_class_unsigned_const,
1956   dw_val_class_long_long,
1957   dw_val_class_float,
1958   dw_val_class_flag,
1959   dw_val_class_die_ref,
1960   dw_val_class_fde_ref,
1961   dw_val_class_lbl_id,
1962   dw_val_class_lbl_offset,
1963   dw_val_class_str
1964 }
1965 dw_val_class;
1966
1967 /* Various DIE's use offsets relative to the beginning of the
1968    .debug_info section to refer to each other.  */
1969
1970 typedef long int dw_offset;
1971
1972 /* Define typedefs here to avoid circular dependencies.  */
1973
1974 typedef struct die_struct *dw_die_ref;
1975 typedef struct dw_attr_struct *dw_attr_ref;
1976 typedef struct dw_val_struct *dw_val_ref;
1977 typedef struct dw_line_info_struct *dw_line_info_ref;
1978 typedef struct dw_separate_line_info_struct *dw_separate_line_info_ref;
1979 typedef struct dw_loc_descr_struct *dw_loc_descr_ref;
1980 typedef struct pubname_struct *pubname_ref;
1981 typedef dw_die_ref *arange_ref;
1982
1983 /* Describe a double word constant value.  */
1984
1985 typedef struct dw_long_long_struct
1986 {
1987   unsigned long hi;
1988   unsigned long low;
1989 }
1990 dw_long_long_const;
1991
1992 /* Describe a floating point constant value.  */
1993
1994 typedef struct dw_fp_struct
1995 {
1996   long *array;
1997   unsigned length;
1998 }
1999 dw_float_const;
2000
2001 /* Each entry in the line_info_table maintains the file and
2002    line number associated with the label generated for that
2003    entry.  The label gives the PC value associated with
2004    the line number entry.  */
2005
2006 typedef struct dw_line_info_struct
2007 {
2008   unsigned long dw_file_num;
2009   unsigned long dw_line_num;
2010 }
2011 dw_line_info_entry;
2012
2013 /* Line information for functions in separate sections; each one gets its
2014    own sequence.  */
2015 typedef struct dw_separate_line_info_struct
2016 {
2017   unsigned long dw_file_num;
2018   unsigned long dw_line_num;
2019   unsigned long function;
2020 }
2021 dw_separate_line_info_entry;
2022
2023 /* The dw_val_node describes an attribute's value, as it is
2024    represented internally.  */
2025
2026 typedef struct dw_val_struct
2027 {
2028   dw_val_class val_class;
2029   union
2030     {
2031       char *val_addr;
2032       dw_loc_descr_ref val_loc;
2033       long int val_int;
2034       long unsigned val_unsigned;
2035       dw_long_long_const val_long_long;
2036       dw_float_const val_float;
2037       dw_die_ref val_die_ref;
2038       unsigned val_fde_index;
2039       char *val_str;
2040       char *val_lbl_id;
2041       unsigned char val_flag;
2042     }
2043   v;
2044 }
2045 dw_val_node;
2046
2047 /* Locations in memory are described using a sequence of stack machine
2048    operations.  */
2049
2050 typedef struct dw_loc_descr_struct
2051 {
2052   dw_loc_descr_ref dw_loc_next;
2053   enum dwarf_location_atom dw_loc_opc;
2054   dw_val_node dw_loc_oprnd1;
2055   dw_val_node dw_loc_oprnd2;
2056 }
2057 dw_loc_descr_node;
2058
2059 /* Each DIE attribute has a field specifying the attribute kind,
2060    a link to the next attribute in the chain, and an attribute value.
2061    Attributes are typically linked below the DIE they modify.  */
2062
2063 typedef struct dw_attr_struct
2064 {
2065   enum dwarf_attribute dw_attr;
2066   dw_attr_ref dw_attr_next;
2067   dw_val_node dw_attr_val;
2068 }
2069 dw_attr_node;
2070
2071 /* The Debugging Information Entry (DIE) structure */
2072
2073 typedef struct die_struct
2074 {
2075   enum dwarf_tag die_tag;
2076   dw_attr_ref die_attr;
2077   dw_die_ref die_parent;
2078   dw_die_ref die_child;
2079   dw_die_ref die_sib;
2080   dw_offset die_offset;
2081   unsigned long die_abbrev;
2082 }
2083 die_node;
2084
2085 /* The pubname structure */
2086
2087 typedef struct pubname_struct
2088 {
2089   dw_die_ref die;
2090   char * name;
2091 }
2092 pubname_entry;
2093
2094 /* The limbo die list structure.  */
2095 typedef struct limbo_die_struct
2096 {
2097   dw_die_ref die;
2098   struct limbo_die_struct *next;
2099 }
2100 limbo_die_node;
2101
2102 /* How to start an assembler comment.  */
2103 #ifndef ASM_COMMENT_START
2104 #define ASM_COMMENT_START ";#"
2105 #endif
2106
2107 /* Define a macro which returns non-zero for a TYPE_DECL which was
2108    implicitly generated for a tagged type.
2109
2110    Note that unlike the gcc front end (which generates a NULL named
2111    TYPE_DECL node for each complete tagged type, each array type, and
2112    each function type node created) the g++ front end generates a
2113    _named_ TYPE_DECL node for each tagged type node created.
2114    These TYPE_DECLs have DECL_ARTIFICIAL set, so we know not to
2115    generate a DW_TAG_typedef DIE for them.  */
2116
2117 #define TYPE_DECL_IS_STUB(decl)                         \
2118   (DECL_NAME (decl) == NULL_TREE                        \
2119    || (DECL_ARTIFICIAL (decl)                           \
2120        && is_tagged_type (TREE_TYPE (decl))             \
2121        && ((decl == TYPE_STUB_DECL (TREE_TYPE (decl)))  \
2122            /* This is necessary for stub decls that     \
2123               appear in nested inline functions.  */    \
2124            || (DECL_ABSTRACT_ORIGIN (decl) != NULL_TREE \
2125                && (decl_ultimate_origin (decl)          \
2126                    == TYPE_STUB_DECL (TREE_TYPE (decl)))))))
2127
2128 /* Information concerning the compilation unit's programming
2129    language, and compiler version.  */
2130
2131 extern int flag_traditional;
2132 extern char *version_string;
2133
2134 /* Fixed size portion of the DWARF compilation unit header.  */
2135 #define DWARF_COMPILE_UNIT_HEADER_SIZE (2 * DWARF_OFFSET_SIZE + 3)
2136
2137 /* Fixed size portion of debugging line information prolog.  */
2138 #define DWARF_LINE_PROLOG_HEADER_SIZE 5
2139
2140 /* Fixed size portion of public names info.  */
2141 #define DWARF_PUBNAMES_HEADER_SIZE (2 * DWARF_OFFSET_SIZE + 2)
2142
2143 /* Fixed size portion of the address range info.  */
2144 #define DWARF_ARANGES_HEADER_SIZE \
2145   (DWARF_ROUND (2 * DWARF_OFFSET_SIZE + 4, PTR_SIZE * 2) - DWARF_OFFSET_SIZE)
2146
2147 /* The default is to have gcc emit the line number tables.  */
2148 #ifndef DWARF2_ASM_LINE_DEBUG_INFO
2149 #define DWARF2_ASM_LINE_DEBUG_INFO 0
2150 #endif
2151
2152 /* Define the architecture-dependent minimum instruction length (in bytes).
2153    In this implementation of DWARF, this field is used for information
2154    purposes only.  Since GCC generates assembly language, we have
2155    no a priori knowledge of how many instruction bytes are generated
2156    for each source line, and therefore can use only the  DW_LNE_set_address
2157    and DW_LNS_fixed_advance_pc line information commands.  */
2158
2159 #ifndef DWARF_LINE_MIN_INSTR_LENGTH
2160 #define DWARF_LINE_MIN_INSTR_LENGTH 4
2161 #endif
2162
2163 /* Minimum line offset in a special line info. opcode.
2164    This value was chosen to give a reasonable range of values.  */
2165 #define DWARF_LINE_BASE  -10
2166
2167 /* First special line opcde - leave room for the standard opcodes.  */
2168 #define DWARF_LINE_OPCODE_BASE  10
2169
2170 /* Range of line offsets in a special line info. opcode.  */
2171 #define DWARF_LINE_RANGE  (254-DWARF_LINE_OPCODE_BASE+1)
2172
2173 /* Flag that indicates the initial value of the is_stmt_start flag.
2174    In the present implementation, we do not mark any lines as
2175    the beginning of a source statement, because that information
2176    is not made available by the GCC front-end.  */
2177 #define DWARF_LINE_DEFAULT_IS_STMT_START 1
2178
2179 /* This location is used by calc_die_sizes() to keep track
2180    the offset of each DIE within the .debug_info section.  */
2181 static unsigned long next_die_offset;
2182
2183 /* Record the root of the DIE's built for the current compilation unit.  */
2184 static dw_die_ref comp_unit_die;
2185
2186 /* A list of DIEs with a NULL parent waiting to be relocated.  */
2187 static limbo_die_node *limbo_die_list = 0;
2188
2189 /* Pointer to an array of filenames referenced by this compilation unit.  */
2190 static char **file_table;
2191
2192 /* Total number of entries in the table (i.e. array) pointed to by
2193    `file_table'.  This is the *total* and includes both used and unused
2194    slots.  */
2195 static unsigned file_table_allocated;
2196
2197 /* Number of entries in the file_table which are actually in use.  */
2198 static unsigned file_table_in_use;
2199
2200 /* Size (in elements) of increments by which we may expand the filename
2201    table.  */
2202 #define FILE_TABLE_INCREMENT 64
2203
2204 /* Local pointer to the name of the main input file.  Initialized in
2205    dwarf2out_init.  */
2206 static char *primary_filename;
2207
2208 /* For Dwarf output, we must assign lexical-blocks id numbers in the order in
2209    which their beginnings are encountered. We output Dwarf debugging info
2210    that refers to the beginnings and ends of the ranges of code for each
2211    lexical block.  The labels themselves are generated in final.c, which
2212    assigns numbers to the blocks in the same way.  */
2213 static unsigned next_block_number = 2;
2214
2215 /* A pointer to the base of a table of references to DIE's that describe
2216    declarations.  The table is indexed by DECL_UID() which is a unique
2217    number identifying each decl.  */
2218 static dw_die_ref *decl_die_table;
2219
2220 /* Number of elements currently allocated for the decl_die_table.  */
2221 static unsigned decl_die_table_allocated;
2222
2223 /* Number of elements in decl_die_table currently in use.  */
2224 static unsigned decl_die_table_in_use;
2225
2226 /* Size (in elements) of increments by which we may expand the
2227    decl_die_table.  */
2228 #define DECL_DIE_TABLE_INCREMENT 256
2229
2230 /* Structure used for the decl_scope table.  scope is the current declaration
2231    scope, and previous is the entry that is the parent of this scope.  This
2232    is usually but not always the immediately preceeding entry.  */
2233
2234 typedef struct decl_scope_struct
2235 {
2236   tree scope;
2237   int previous;
2238 }
2239 decl_scope_node;
2240
2241 /* A pointer to the base of a table of references to declaration
2242    scopes.  This table is a display which tracks the nesting
2243    of declaration scopes at the current scope and containing
2244    scopes.  This table is used to find the proper place to
2245    define type declaration DIE's.  */
2246 static decl_scope_node *decl_scope_table;
2247
2248 /* Number of elements currently allocated for the decl_scope_table.  */
2249 static int decl_scope_table_allocated;
2250
2251 /* Current level of nesting of declaration scopes.  */
2252 static int decl_scope_depth;
2253
2254 /* Size (in elements) of increments by which we may expand the
2255    decl_scope_table.  */
2256 #define DECL_SCOPE_TABLE_INCREMENT 64
2257
2258 /* A pointer to the base of a list of references to DIE's that
2259    are uniquely identified by their tag, presence/absence of
2260    children DIE's, and list of attribute/value pairs.  */
2261 static dw_die_ref *abbrev_die_table;
2262
2263 /* Number of elements currently allocated for abbrev_die_table.  */
2264 static unsigned abbrev_die_table_allocated;
2265
2266 /* Number of elements in type_die_table currently in use.  */
2267 static unsigned abbrev_die_table_in_use;
2268
2269 /* Size (in elements) of increments by which we may expand the
2270    abbrev_die_table.  */
2271 #define ABBREV_DIE_TABLE_INCREMENT 256
2272
2273 /* A pointer to the base of a table that contains line information
2274    for each source code line in .text in the compilation unit.  */
2275 static dw_line_info_ref line_info_table;
2276
2277 /* Number of elements currently allocated for line_info_table.  */
2278 static unsigned line_info_table_allocated;
2279
2280 /* Number of elements in separate_line_info_table currently in use.  */
2281 static unsigned separate_line_info_table_in_use;
2282
2283 /* A pointer to the base of a table that contains line information
2284    for each source code line outside of .text in the compilation unit.  */
2285 static dw_separate_line_info_ref separate_line_info_table;
2286
2287 /* Number of elements currently allocated for separate_line_info_table.  */
2288 static unsigned separate_line_info_table_allocated;
2289
2290 /* Number of elements in line_info_table currently in use.  */
2291 static unsigned line_info_table_in_use;
2292
2293 /* Size (in elements) of increments by which we may expand the
2294    line_info_table.  */
2295 #define LINE_INFO_TABLE_INCREMENT 1024
2296
2297 /* A pointer to the base of a table that contains a list of publicly
2298    accessible names.  */
2299 static pubname_ref pubname_table;
2300
2301 /* Number of elements currently allocated for pubname_table.  */
2302 static unsigned pubname_table_allocated;
2303
2304 /* Number of elements in pubname_table currently in use.  */
2305 static unsigned pubname_table_in_use;
2306
2307 /* Size (in elements) of increments by which we may expand the
2308    pubname_table.  */
2309 #define PUBNAME_TABLE_INCREMENT 64
2310
2311 /* A pointer to the base of a table that contains a list of publicly
2312    accessible names.  */
2313 static arange_ref arange_table;
2314
2315 /* Number of elements currently allocated for arange_table.  */
2316 static unsigned arange_table_allocated;
2317
2318 /* Number of elements in arange_table currently in use.  */
2319 static unsigned arange_table_in_use;
2320
2321 /* Size (in elements) of increments by which we may expand the
2322    arange_table.  */
2323 #define ARANGE_TABLE_INCREMENT 64
2324
2325 /* A pointer to the base of a list of pending types which we haven't
2326    generated DIEs for yet, but which we will have to come back to
2327    later on.  */
2328
2329 static tree *pending_types_list;
2330
2331 /* Number of elements currently allocated for the pending_types_list.  */
2332 static unsigned pending_types_allocated;
2333
2334 /* Number of elements of pending_types_list currently in use.  */
2335 static unsigned pending_types;
2336
2337 /* Size (in elements) of increments by which we may expand the pending
2338    types list.  Actually, a single hunk of space of this size should
2339    be enough for most typical programs.  */
2340 #define PENDING_TYPES_INCREMENT 64
2341
2342 /* A pointer to the base of a list of incomplete types which might be
2343    completed at some later time.  */
2344
2345 static tree *incomplete_types_list;
2346
2347 /* Number of elements currently allocated for the incomplete_types_list.  */
2348 static unsigned incomplete_types_allocated;
2349
2350 /* Number of elements of incomplete_types_list currently in use.  */
2351 static unsigned incomplete_types;
2352
2353 /* Size (in elements) of increments by which we may expand the incomplete
2354    types list.  Actually, a single hunk of space of this size should
2355    be enough for most typical programs.  */
2356 #define INCOMPLETE_TYPES_INCREMENT 64
2357
2358 /* Record whether the function being analyzed contains inlined functions.  */
2359 static int current_function_has_inlines;
2360 #if 0 && defined (MIPS_DEBUGGING_INFO)
2361 static int comp_unit_has_inlines;
2362 #endif
2363
2364 /* Forward declarations for functions defined in this file.  */
2365
2366 static void addr_const_to_string        PROTO((dyn_string_t, rtx));
2367 static char *addr_to_string             PROTO((rtx));
2368 static int is_pseudo_reg                PROTO((rtx));
2369 static tree type_main_variant           PROTO((tree));
2370 static int is_tagged_type               PROTO((tree));
2371 static const char *dwarf_tag_name       PROTO((unsigned));
2372 static const char *dwarf_attr_name      PROTO((unsigned));
2373 static const char *dwarf_form_name      PROTO((unsigned));
2374 static const char *dwarf_stack_op_name  PROTO((unsigned));
2375 #if 0
2376 static const char *dwarf_type_encoding_name PROTO((unsigned));
2377 #endif
2378 static tree decl_ultimate_origin        PROTO((tree));
2379 static tree block_ultimate_origin       PROTO((tree));
2380 static tree decl_class_context          PROTO((tree));
2381 static void add_dwarf_attr              PROTO((dw_die_ref, dw_attr_ref));
2382 static void add_AT_flag                 PROTO((dw_die_ref,
2383                                                enum dwarf_attribute,
2384                                                unsigned));
2385 static void add_AT_int                  PROTO((dw_die_ref,
2386                                                enum dwarf_attribute, long));
2387 static void add_AT_unsigned             PROTO((dw_die_ref,
2388                                                enum dwarf_attribute,
2389                                                unsigned long));
2390 static void add_AT_long_long            PROTO((dw_die_ref,
2391                                                enum dwarf_attribute,
2392                                                unsigned long, unsigned long));
2393 static void add_AT_float                PROTO((dw_die_ref,
2394                                                enum dwarf_attribute,
2395                                                unsigned, long *));
2396 static void add_AT_string               PROTO((dw_die_ref,
2397                                                enum dwarf_attribute,
2398                                                const char *));
2399 static void add_AT_die_ref              PROTO((dw_die_ref,
2400                                                enum dwarf_attribute,
2401                                                dw_die_ref));
2402 static void add_AT_fde_ref              PROTO((dw_die_ref,
2403                                                enum dwarf_attribute,
2404                                                unsigned));
2405 static void add_AT_loc                  PROTO((dw_die_ref,
2406                                                enum dwarf_attribute,
2407                                                dw_loc_descr_ref));
2408 static void add_AT_addr                 PROTO((dw_die_ref,
2409                                                enum dwarf_attribute, char *));
2410 static void add_AT_lbl_id               PROTO((dw_die_ref,
2411                                                enum dwarf_attribute, char *));
2412 static void add_AT_lbl_offset           PROTO((dw_die_ref,
2413                                                enum dwarf_attribute, char *));
2414 static dw_attr_ref get_AT               PROTO((dw_die_ref,
2415                                                enum dwarf_attribute));
2416 static const char *get_AT_low_pc        PROTO((dw_die_ref));
2417 static const char *get_AT_hi_pc         PROTO((dw_die_ref));
2418 static const char *get_AT_string        PROTO((dw_die_ref,
2419                                                enum dwarf_attribute));
2420 static int get_AT_flag                  PROTO((dw_die_ref,
2421                                                enum dwarf_attribute));
2422 static unsigned get_AT_unsigned         PROTO((dw_die_ref,
2423                                                enum dwarf_attribute));
2424 static int is_c_family                  PROTO((void));
2425 static int is_fortran                   PROTO((void));
2426 static void remove_AT                   PROTO((dw_die_ref,
2427                                                enum dwarf_attribute));
2428 static void remove_children             PROTO((dw_die_ref));
2429 static void add_child_die               PROTO((dw_die_ref, dw_die_ref));
2430 static dw_die_ref new_die               PROTO((enum dwarf_tag, dw_die_ref));
2431 static dw_die_ref lookup_type_die       PROTO((tree));
2432 static void equate_type_number_to_die   PROTO((tree, dw_die_ref));
2433 static dw_die_ref lookup_decl_die       PROTO((tree));
2434 static void equate_decl_number_to_die   PROTO((tree, dw_die_ref));
2435 static dw_loc_descr_ref new_loc_descr   PROTO((enum dwarf_location_atom,
2436                                                unsigned long, unsigned long));
2437 static void add_loc_descr               PROTO((dw_loc_descr_ref *,
2438                                                dw_loc_descr_ref));
2439 static void print_spaces                PROTO((FILE *));
2440 static void print_die                   PROTO((dw_die_ref, FILE *));
2441 static void print_dwarf_line_table      PROTO((FILE *));
2442 static void add_sibling_attributes      PROTO((dw_die_ref));
2443 static void build_abbrev_table          PROTO((dw_die_ref));
2444 static unsigned long size_of_string     PROTO((const char *));
2445 static unsigned long size_of_loc_descr  PROTO((dw_loc_descr_ref));
2446 static unsigned long size_of_locs       PROTO((dw_loc_descr_ref));
2447 static int constant_size                PROTO((long unsigned));
2448 static unsigned long size_of_die        PROTO((dw_die_ref));
2449 static void calc_die_sizes              PROTO((dw_die_ref));
2450 static unsigned long size_of_line_prolog        PROTO((void));
2451 static unsigned long size_of_pubnames   PROTO((void));
2452 static unsigned long size_of_aranges    PROTO((void));
2453 static enum dwarf_form value_format     PROTO((dw_attr_ref));
2454 static void output_value_format         PROTO((dw_attr_ref));
2455 static void output_abbrev_section       PROTO((void));
2456 static void output_loc_operands         PROTO((dw_loc_descr_ref));
2457 static void output_die                  PROTO((dw_die_ref));
2458 static void output_compilation_unit_header PROTO((void));
2459 static const char *dwarf2_name          PROTO((tree, int));
2460 static void add_pubname                 PROTO((tree, dw_die_ref));
2461 static void output_pubnames             PROTO((void));
2462 static void add_arange                  PROTO((tree, dw_die_ref));
2463 static void output_aranges              PROTO((void));
2464 static void output_line_info            PROTO((void));
2465 static int is_body_block                PROTO((tree));
2466 static dw_die_ref base_type_die         PROTO((tree));
2467 static tree root_type                   PROTO((tree));
2468 static int is_base_type                 PROTO((tree));
2469 static dw_die_ref modified_type_die     PROTO((tree, int, int, dw_die_ref));
2470 static int type_is_enum                 PROTO((tree));
2471 static dw_loc_descr_ref reg_loc_descriptor PROTO((rtx));
2472 static dw_loc_descr_ref based_loc_descr PROTO((unsigned, long));
2473 static int is_based_loc                 PROTO((rtx));
2474 static dw_loc_descr_ref mem_loc_descriptor PROTO((rtx, enum machine_mode mode));
2475 static dw_loc_descr_ref concat_loc_descriptor PROTO((rtx, rtx));
2476 static dw_loc_descr_ref loc_descriptor  PROTO((rtx));
2477 static unsigned ceiling                 PROTO((unsigned, unsigned));
2478 static tree field_type                  PROTO((tree));
2479 static unsigned simple_type_align_in_bits PROTO((tree));
2480 static unsigned simple_type_size_in_bits PROTO((tree));
2481 static unsigned field_byte_offset               PROTO((tree));
2482 static void add_AT_location_description PROTO((dw_die_ref,
2483                                                enum dwarf_attribute, rtx));
2484 static void add_data_member_location_attribute PROTO((dw_die_ref, tree));
2485 static void add_const_value_attribute   PROTO((dw_die_ref, rtx));
2486 static void add_location_or_const_value_attribute PROTO((dw_die_ref, tree));
2487 static void add_name_attribute          PROTO((dw_die_ref, const char *));
2488 static void add_bound_info              PROTO((dw_die_ref,
2489                                                enum dwarf_attribute, tree));
2490 static void add_subscript_info          PROTO((dw_die_ref, tree));
2491 static void add_byte_size_attribute     PROTO((dw_die_ref, tree));
2492 static void add_bit_offset_attribute    PROTO((dw_die_ref, tree));
2493 static void add_bit_size_attribute      PROTO((dw_die_ref, tree));
2494 static void add_prototyped_attribute    PROTO((dw_die_ref, tree));
2495 static void add_abstract_origin_attribute PROTO((dw_die_ref, tree));
2496 static void add_pure_or_virtual_attribute PROTO((dw_die_ref, tree));
2497 static void add_src_coords_attributes   PROTO((dw_die_ref, tree));
2498 static void add_name_and_src_coords_attributes PROTO((dw_die_ref, tree));
2499 static void push_decl_scope             PROTO((tree));
2500 static dw_die_ref scope_die_for         PROTO((tree, dw_die_ref));
2501 static void pop_decl_scope              PROTO((void));
2502 static void add_type_attribute          PROTO((dw_die_ref, tree, int, int,
2503                                                dw_die_ref));
2504 static char *type_tag                   PROTO((tree));
2505 static tree member_declared_type        PROTO((tree));
2506 #if 0
2507 static char *decl_start_label           PROTO((tree));
2508 #endif
2509 static void gen_array_type_die          PROTO((tree, dw_die_ref));
2510 static void gen_set_type_die            PROTO((tree, dw_die_ref));
2511 #if 0
2512 static void gen_entry_point_die         PROTO((tree, dw_die_ref));
2513 #endif
2514 static void pend_type                   PROTO((tree));
2515 static void output_pending_types_for_scope PROTO((dw_die_ref));
2516 static void gen_inlined_enumeration_type_die PROTO((tree, dw_die_ref));
2517 static void gen_inlined_structure_type_die PROTO((tree, dw_die_ref));
2518 static void gen_inlined_union_type_die  PROTO((tree, dw_die_ref));
2519 static void gen_enumeration_type_die    PROTO((tree, dw_die_ref));
2520 static dw_die_ref gen_formal_parameter_die PROTO((tree, dw_die_ref));
2521 static void gen_unspecified_parameters_die PROTO((tree, dw_die_ref));
2522 static void gen_formal_types_die        PROTO((tree, dw_die_ref));
2523 static void gen_subprogram_die          PROTO((tree, dw_die_ref));
2524 static void gen_variable_die            PROTO((tree, dw_die_ref));
2525 static void gen_label_die               PROTO((tree, dw_die_ref));
2526 static void gen_lexical_block_die       PROTO((tree, dw_die_ref, int));
2527 static void gen_inlined_subroutine_die  PROTO((tree, dw_die_ref, int));
2528 static void gen_field_die               PROTO((tree, dw_die_ref));
2529 static void gen_ptr_to_mbr_type_die     PROTO((tree, dw_die_ref));
2530 static dw_die_ref gen_compile_unit_die  PROTO((const char *));
2531 static void gen_string_type_die         PROTO((tree, dw_die_ref));
2532 static void gen_inheritance_die         PROTO((tree, dw_die_ref));
2533 static void gen_member_die              PROTO((tree, dw_die_ref));
2534 static void gen_struct_or_union_type_die PROTO((tree, dw_die_ref));
2535 static void gen_subroutine_type_die     PROTO((tree, dw_die_ref));
2536 static void gen_typedef_die             PROTO((tree, dw_die_ref));
2537 static void gen_type_die                PROTO((tree, dw_die_ref));
2538 static void gen_tagged_type_instantiation_die PROTO((tree, dw_die_ref));
2539 static void gen_block_die               PROTO((tree, dw_die_ref, int));
2540 static void decls_for_scope             PROTO((tree, dw_die_ref, int));
2541 static int is_redundant_typedef         PROTO((tree));
2542 static void gen_decl_die                PROTO((tree, dw_die_ref));
2543 static unsigned lookup_filename         PROTO((const char *));
2544 static void add_incomplete_type         PROTO((tree));
2545 static void retry_incomplete_types      PROTO((void));
2546
2547 /* Section names used to hold DWARF debugging information.  */
2548 #ifndef DEBUG_INFO_SECTION
2549 #define DEBUG_INFO_SECTION      ".debug_info"
2550 #endif
2551 #ifndef ABBREV_SECTION
2552 #define ABBREV_SECTION          ".debug_abbrev"
2553 #endif
2554 #ifndef ARANGES_SECTION
2555 #define ARANGES_SECTION         ".debug_aranges"
2556 #endif
2557 #ifndef DW_MACINFO_SECTION
2558 #define DW_MACINFO_SECTION      ".debug_macinfo"
2559 #endif
2560 #ifndef DEBUG_LINE_SECTION
2561 #define DEBUG_LINE_SECTION      ".debug_line"
2562 #endif
2563 #ifndef LOC_SECTION
2564 #define LOC_SECTION             ".debug_loc"
2565 #endif
2566 #ifndef PUBNAMES_SECTION
2567 #define PUBNAMES_SECTION        ".debug_pubnames"
2568 #endif
2569 #ifndef STR_SECTION
2570 #define STR_SECTION             ".debug_str"
2571 #endif
2572
2573 /* Standard ELF section names for compiled code and data.  */
2574 #ifndef TEXT_SECTION
2575 #define TEXT_SECTION            ".text"
2576 #endif
2577 #ifndef DATA_SECTION
2578 #define DATA_SECTION            ".data"
2579 #endif
2580 #ifndef BSS_SECTION
2581 #define BSS_SECTION             ".bss"
2582 #endif
2583
2584 /* Labels we insert at beginning sections we can reference instead of
2585    the section names themselves. */
2586
2587 #ifndef TEXT_SECTION_LABEL
2588 #define TEXT_SECTION_LABEL       "Ltext"
2589 #endif
2590 #ifndef DEBUG_LINE_SECTION_LABEL
2591 #define DEBUG_LINE_SECTION_LABEL "Ldebug_line"
2592 #endif
2593 #ifndef DEBUG_INFO_SECTION_LABEL
2594 #define DEBUG_INFO_SECTION_LABEL "Ldebug_info"
2595 #endif
2596 #ifndef ABBREV_SECTION_LABEL
2597 #define ABBREV_SECTION_LABEL     "Ldebug_abbrev"
2598 #endif
2599
2600
2601 /* Definitions of defaults for formats and names of various special
2602    (artificial) labels which may be generated within this file (when the -g
2603    options is used and DWARF_DEBUGGING_INFO is in effect.
2604    If necessary, these may be overridden from within the tm.h file, but
2605    typically, overriding these defaults is unnecessary.  */
2606
2607 static char text_end_label[MAX_ARTIFICIAL_LABEL_BYTES];
2608 static char text_section_label[MAX_ARTIFICIAL_LABEL_BYTES];
2609 static char abbrev_section_label[MAX_ARTIFICIAL_LABEL_BYTES];
2610 static char debug_info_section_label[MAX_ARTIFICIAL_LABEL_BYTES];
2611 static char debug_line_section_label[MAX_ARTIFICIAL_LABEL_BYTES];
2612
2613 #ifndef TEXT_END_LABEL
2614 #define TEXT_END_LABEL          "Letext"
2615 #endif
2616 #ifndef DATA_END_LABEL
2617 #define DATA_END_LABEL          "Ledata"
2618 #endif
2619 #ifndef BSS_END_LABEL
2620 #define BSS_END_LABEL           "Lebss"
2621 #endif
2622 #ifndef INSN_LABEL_FMT
2623 #define INSN_LABEL_FMT          "LI%u_"
2624 #endif
2625 #ifndef BLOCK_BEGIN_LABEL
2626 #define BLOCK_BEGIN_LABEL       "LBB"
2627 #endif
2628 #ifndef BLOCK_END_LABEL
2629 #define BLOCK_END_LABEL         "LBE"
2630 #endif
2631 #ifndef BODY_BEGIN_LABEL
2632 #define BODY_BEGIN_LABEL        "Lbb"
2633 #endif
2634 #ifndef BODY_END_LABEL
2635 #define BODY_END_LABEL          "Lbe"
2636 #endif
2637 #ifndef LINE_CODE_LABEL
2638 #define LINE_CODE_LABEL         "LM"
2639 #endif
2640 #ifndef SEPARATE_LINE_CODE_LABEL
2641 #define SEPARATE_LINE_CODE_LABEL        "LSM"
2642 #endif
2643
2644 /* Convert a reference to the assembler name of a C-level name.  This
2645    macro has the same effect as ASM_OUTPUT_LABELREF, but copies to
2646    a string rather than writing to a file.  */
2647 #ifndef ASM_NAME_TO_STRING
2648 #define ASM_NAME_TO_STRING(STR, NAME)                   \
2649   do {                                                  \
2650       if ((NAME)[0] == '*')                             \
2651         dyn_string_append (STR, NAME + 1);              \
2652       else                                              \
2653         {                                               \
2654           const char *newstr;                           \
2655           STRIP_NAME_ENCODING (newstr, NAME);           \
2656           dyn_string_append (STR, user_label_prefix);   \
2657           dyn_string_append (STR, newstr);              \
2658         }                                               \
2659   }                                                     \
2660   while (0)
2661 #endif
2662 \f
2663 /* We allow a language front-end to designate a function that is to be
2664    called to "demangle" any name before it it put into a DIE.  */
2665
2666 static const char *(*demangle_name_func) PROTO((const char *));
2667
2668 void
2669 dwarf2out_set_demangle_name_func (func)
2670      const char *(*func) PROTO((const char *));
2671 {
2672   demangle_name_func = func;
2673 }
2674 \f
2675 /* Convert an integer constant expression into assembler syntax.  Addition
2676    and subtraction are the only arithmetic that may appear in these
2677    expressions.   This is an adaptation of output_addr_const in final.c.
2678    Here, the target of the conversion is a string buffer.  We can't use
2679    output_addr_const directly, because it writes to a file.  */
2680
2681 static void
2682 addr_const_to_string (str, x)
2683      dyn_string_t str;
2684      rtx x;
2685 {
2686   char buf1[256];
2687
2688 restart:
2689   switch (GET_CODE (x))
2690     {
2691     case PC:
2692       if (flag_pic)
2693         dyn_string_append (str, ",");
2694       else
2695         abort ();
2696       break;
2697
2698     case SYMBOL_REF:
2699       ASM_NAME_TO_STRING (str, XSTR (x, 0));
2700       break;
2701
2702     case LABEL_REF:
2703       ASM_GENERATE_INTERNAL_LABEL (buf1, "L", CODE_LABEL_NUMBER (XEXP (x, 0)));
2704       ASM_NAME_TO_STRING (str, buf1);
2705       break;
2706
2707     case CODE_LABEL:
2708       ASM_GENERATE_INTERNAL_LABEL (buf1, "L", CODE_LABEL_NUMBER (x));
2709       ASM_NAME_TO_STRING (str, buf1);
2710       break;
2711
2712     case CONST_INT:
2713       sprintf (buf1, HOST_WIDE_INT_PRINT_DEC, INTVAL (x));
2714       dyn_string_append (str, buf1);
2715       break;
2716
2717     case CONST:
2718       /* This used to output parentheses around the expression, but that does 
2719          not work on the 386 (either ATT or BSD assembler).  */
2720       addr_const_to_string (str, XEXP (x, 0));
2721       break;
2722
2723     case CONST_DOUBLE:
2724       if (GET_MODE (x) == VOIDmode)
2725         {
2726           /* We can use %d if the number is one word and positive.  */
2727           if (CONST_DOUBLE_HIGH (x))
2728             sprintf (buf1, HOST_WIDE_INT_PRINT_DOUBLE_HEX,
2729                      CONST_DOUBLE_HIGH (x), CONST_DOUBLE_LOW (x));
2730           else if (CONST_DOUBLE_LOW (x) < 0)
2731             sprintf (buf1, HOST_WIDE_INT_PRINT_HEX, CONST_DOUBLE_LOW (x));
2732           else
2733             sprintf (buf1, HOST_WIDE_INT_PRINT_DEC,
2734                      CONST_DOUBLE_LOW (x));
2735           dyn_string_append (str, buf1);
2736         }
2737       else
2738         /* We can't handle floating point constants; PRINT_OPERAND must
2739            handle them.  */
2740         output_operand_lossage ("floating constant misused");
2741       break;
2742
2743     case PLUS:
2744       /* Some assemblers need integer constants to appear last (eg masm).  */
2745       if (GET_CODE (XEXP (x, 0)) == CONST_INT)
2746         {
2747           addr_const_to_string (str, XEXP (x, 1));
2748           if (INTVAL (XEXP (x, 0)) >= 0)
2749             dyn_string_append (str, "+");
2750
2751           addr_const_to_string (str, XEXP (x, 0));
2752         }
2753       else
2754         {
2755           addr_const_to_string (str, XEXP (x, 0));
2756           if (INTVAL (XEXP (x, 1)) >= 0)
2757             dyn_string_append (str, "+");
2758
2759           addr_const_to_string (str, XEXP (x, 1));
2760         }
2761       break;
2762
2763     case MINUS:
2764       /* Avoid outputting things like x-x or x+5-x, since some assemblers
2765          can't handle that.  */
2766       x = simplify_subtraction (x);
2767       if (GET_CODE (x) != MINUS)
2768         goto restart;
2769
2770       addr_const_to_string (str, XEXP (x, 0));
2771       dyn_string_append (str, "-");
2772       if (GET_CODE (XEXP (x, 1)) == CONST_INT
2773           && INTVAL (XEXP (x, 1)) < 0)
2774         {
2775           dyn_string_append (str, ASM_OPEN_PAREN);
2776           addr_const_to_string (str, XEXP (x, 1));
2777           dyn_string_append (str, ASM_CLOSE_PAREN);
2778         }
2779       else
2780         addr_const_to_string (str, XEXP (x, 1));
2781       break;
2782
2783     case ZERO_EXTEND:
2784     case SIGN_EXTEND:
2785       addr_const_to_string (str, XEXP (x, 0));
2786       break;
2787
2788     default:
2789       output_operand_lossage ("invalid expression as operand");
2790     }
2791 }
2792
2793 /* Convert an address constant to a string, and return a pointer to
2794    a copy of the result, located on the heap.  */
2795
2796 static char *
2797 addr_to_string (x)
2798      rtx x;
2799 {
2800   dyn_string_t ds = dyn_string_new (256);
2801   char *s;
2802
2803   addr_const_to_string (ds, x);
2804   
2805   /* Return the dynamically allocated string, but free the
2806      dyn_string_t itself.  */
2807   s = ds->s;
2808   free (ds);
2809   return s;
2810 }
2811
2812 /* Test if rtl node points to a pseudo register.  */
2813
2814 static inline int
2815 is_pseudo_reg (rtl)
2816      register rtx rtl;
2817 {
2818   return (((GET_CODE (rtl) == REG) && (REGNO (rtl) >= FIRST_PSEUDO_REGISTER))
2819           || ((GET_CODE (rtl) == SUBREG)
2820               && (REGNO (XEXP (rtl, 0)) >= FIRST_PSEUDO_REGISTER)));
2821 }
2822
2823 /* Return a reference to a type, with its const and volatile qualifiers
2824    removed.  */
2825
2826 static inline tree
2827 type_main_variant (type)
2828      register tree type;
2829 {
2830   type = TYPE_MAIN_VARIANT (type);
2831
2832   /* There really should be only one main variant among any group of variants 
2833      of a given type (and all of the MAIN_VARIANT values for all members of
2834      the group should point to that one type) but sometimes the C front-end
2835      messes this up for array types, so we work around that bug here.  */
2836
2837   if (TREE_CODE (type) == ARRAY_TYPE)
2838     while (type != TYPE_MAIN_VARIANT (type))
2839       type = TYPE_MAIN_VARIANT (type);
2840
2841   return type;
2842 }
2843
2844 /* Return non-zero if the given type node represents a tagged type.  */
2845
2846 static inline int
2847 is_tagged_type (type)
2848      register tree type;
2849 {
2850   register enum tree_code code = TREE_CODE (type);
2851
2852   return (code == RECORD_TYPE || code == UNION_TYPE
2853           || code == QUAL_UNION_TYPE || code == ENUMERAL_TYPE);
2854 }
2855
2856 /* Convert a DIE tag into its string name.  */
2857
2858 static const char *
2859 dwarf_tag_name (tag)
2860      register unsigned tag;
2861 {
2862   switch (tag)
2863     {
2864     case DW_TAG_padding:
2865       return "DW_TAG_padding";
2866     case DW_TAG_array_type:
2867       return "DW_TAG_array_type";
2868     case DW_TAG_class_type:
2869       return "DW_TAG_class_type";
2870     case DW_TAG_entry_point:
2871       return "DW_TAG_entry_point";
2872     case DW_TAG_enumeration_type:
2873       return "DW_TAG_enumeration_type";
2874     case DW_TAG_formal_parameter:
2875       return "DW_TAG_formal_parameter";
2876     case DW_TAG_imported_declaration:
2877       return "DW_TAG_imported_declaration";
2878     case DW_TAG_label:
2879       return "DW_TAG_label";
2880     case DW_TAG_lexical_block:
2881       return "DW_TAG_lexical_block";
2882     case DW_TAG_member:
2883       return "DW_TAG_member";
2884     case DW_TAG_pointer_type:
2885       return "DW_TAG_pointer_type";
2886     case DW_TAG_reference_type:
2887       return "DW_TAG_reference_type";
2888     case DW_TAG_compile_unit:
2889       return "DW_TAG_compile_unit";
2890     case DW_TAG_string_type:
2891       return "DW_TAG_string_type";
2892     case DW_TAG_structure_type:
2893       return "DW_TAG_structure_type";
2894     case DW_TAG_subroutine_type:
2895       return "DW_TAG_subroutine_type";
2896     case DW_TAG_typedef:
2897       return "DW_TAG_typedef";
2898     case DW_TAG_union_type:
2899       return "DW_TAG_union_type";
2900     case DW_TAG_unspecified_parameters:
2901       return "DW_TAG_unspecified_parameters";
2902     case DW_TAG_variant:
2903       return "DW_TAG_variant";
2904     case DW_TAG_common_block:
2905       return "DW_TAG_common_block";
2906     case DW_TAG_common_inclusion:
2907       return "DW_TAG_common_inclusion";
2908     case DW_TAG_inheritance:
2909       return "DW_TAG_inheritance";
2910     case DW_TAG_inlined_subroutine:
2911       return "DW_TAG_inlined_subroutine";
2912     case DW_TAG_module:
2913       return "DW_TAG_module";
2914     case DW_TAG_ptr_to_member_type:
2915       return "DW_TAG_ptr_to_member_type";
2916     case DW_TAG_set_type:
2917       return "DW_TAG_set_type";
2918     case DW_TAG_subrange_type:
2919       return "DW_TAG_subrange_type";
2920     case DW_TAG_with_stmt:
2921       return "DW_TAG_with_stmt";
2922     case DW_TAG_access_declaration:
2923       return "DW_TAG_access_declaration";
2924     case DW_TAG_base_type:
2925       return "DW_TAG_base_type";
2926     case DW_TAG_catch_block:
2927       return "DW_TAG_catch_block";
2928     case DW_TAG_const_type:
2929       return "DW_TAG_const_type";
2930     case DW_TAG_constant:
2931       return "DW_TAG_constant";
2932     case DW_TAG_enumerator:
2933       return "DW_TAG_enumerator";
2934     case DW_TAG_file_type:
2935       return "DW_TAG_file_type";
2936     case DW_TAG_friend:
2937       return "DW_TAG_friend";
2938     case DW_TAG_namelist:
2939       return "DW_TAG_namelist";
2940     case DW_TAG_namelist_item:
2941       return "DW_TAG_namelist_item";
2942     case DW_TAG_packed_type:
2943       return "DW_TAG_packed_type";
2944     case DW_TAG_subprogram:
2945       return "DW_TAG_subprogram";
2946     case DW_TAG_template_type_param:
2947       return "DW_TAG_template_type_param";
2948     case DW_TAG_template_value_param:
2949       return "DW_TAG_template_value_param";
2950     case DW_TAG_thrown_type:
2951       return "DW_TAG_thrown_type";
2952     case DW_TAG_try_block:
2953       return "DW_TAG_try_block";
2954     case DW_TAG_variant_part:
2955       return "DW_TAG_variant_part";
2956     case DW_TAG_variable:
2957       return "DW_TAG_variable";
2958     case DW_TAG_volatile_type:
2959       return "DW_TAG_volatile_type";
2960     case DW_TAG_MIPS_loop:
2961       return "DW_TAG_MIPS_loop";
2962     case DW_TAG_format_label:
2963       return "DW_TAG_format_label";
2964     case DW_TAG_function_template:
2965       return "DW_TAG_function_template";
2966     case DW_TAG_class_template:
2967       return "DW_TAG_class_template";
2968     default:
2969       return "DW_TAG_<unknown>";
2970     }
2971 }
2972
2973 /* Convert a DWARF attribute code into its string name.  */
2974
2975 static const char *
2976 dwarf_attr_name (attr)
2977      register unsigned attr;
2978 {
2979   switch (attr)
2980     {
2981     case DW_AT_sibling:
2982       return "DW_AT_sibling";
2983     case DW_AT_location:
2984       return "DW_AT_location";
2985     case DW_AT_name:
2986       return "DW_AT_name";
2987     case DW_AT_ordering:
2988       return "DW_AT_ordering";
2989     case DW_AT_subscr_data:
2990       return "DW_AT_subscr_data";
2991     case DW_AT_byte_size:
2992       return "DW_AT_byte_size";
2993     case DW_AT_bit_offset:
2994       return "DW_AT_bit_offset";
2995     case DW_AT_bit_size:
2996       return "DW_AT_bit_size";
2997     case DW_AT_element_list:
2998       return "DW_AT_element_list";
2999     case DW_AT_stmt_list:
3000       return "DW_AT_stmt_list";
3001     case DW_AT_low_pc:
3002       return "DW_AT_low_pc";
3003     case DW_AT_high_pc:
3004       return "DW_AT_high_pc";
3005     case DW_AT_language:
3006       return "DW_AT_language";
3007     case DW_AT_member:
3008       return "DW_AT_member";
3009     case DW_AT_discr:
3010       return "DW_AT_discr";
3011     case DW_AT_discr_value:
3012       return "DW_AT_discr_value";
3013     case DW_AT_visibility:
3014       return "DW_AT_visibility";
3015     case DW_AT_import:
3016       return "DW_AT_import";
3017     case DW_AT_string_length:
3018       return "DW_AT_string_length";
3019     case DW_AT_common_reference:
3020       return "DW_AT_common_reference";
3021     case DW_AT_comp_dir:
3022       return "DW_AT_comp_dir";
3023     case DW_AT_const_value:
3024       return "DW_AT_const_value";
3025     case DW_AT_containing_type:
3026       return "DW_AT_containing_type";
3027     case DW_AT_default_value:
3028       return "DW_AT_default_value";
3029     case DW_AT_inline:
3030       return "DW_AT_inline";
3031     case DW_AT_is_optional:
3032       return "DW_AT_is_optional";
3033     case DW_AT_lower_bound:
3034       return "DW_AT_lower_bound";
3035     case DW_AT_producer:
3036       return "DW_AT_producer";
3037     case DW_AT_prototyped:
3038       return "DW_AT_prototyped";
3039     case DW_AT_return_addr:
3040       return "DW_AT_return_addr";
3041     case DW_AT_start_scope:
3042       return "DW_AT_start_scope";
3043     case DW_AT_stride_size:
3044       return "DW_AT_stride_size";
3045     case DW_AT_upper_bound:
3046       return "DW_AT_upper_bound";
3047     case DW_AT_abstract_origin:
3048       return "DW_AT_abstract_origin";
3049     case DW_AT_accessibility:
3050       return "DW_AT_accessibility";
3051     case DW_AT_address_class:
3052       return "DW_AT_address_class";
3053     case DW_AT_artificial:
3054       return "DW_AT_artificial";
3055     case DW_AT_base_types:
3056       return "DW_AT_base_types";
3057     case DW_AT_calling_convention:
3058       return "DW_AT_calling_convention";
3059     case DW_AT_count:
3060       return "DW_AT_count";
3061     case DW_AT_data_member_location:
3062       return "DW_AT_data_member_location";
3063     case DW_AT_decl_column:
3064       return "DW_AT_decl_column";
3065     case DW_AT_decl_file:
3066       return "DW_AT_decl_file";
3067     case DW_AT_decl_line:
3068       return "DW_AT_decl_line";
3069     case DW_AT_declaration:
3070       return "DW_AT_declaration";
3071     case DW_AT_discr_list:
3072       return "DW_AT_discr_list";
3073     case DW_AT_encoding:
3074       return "DW_AT_encoding";
3075     case DW_AT_external:
3076       return "DW_AT_external";
3077     case DW_AT_frame_base:
3078       return "DW_AT_frame_base";
3079     case DW_AT_friend:
3080       return "DW_AT_friend";
3081     case DW_AT_identifier_case:
3082       return "DW_AT_identifier_case";
3083     case DW_AT_macro_info:
3084       return "DW_AT_macro_info";
3085     case DW_AT_namelist_items:
3086       return "DW_AT_namelist_items";
3087     case DW_AT_priority:
3088       return "DW_AT_priority";
3089     case DW_AT_segment:
3090       return "DW_AT_segment";
3091     case DW_AT_specification:
3092       return "DW_AT_specification";
3093     case DW_AT_static_link:
3094       return "DW_AT_static_link";
3095     case DW_AT_type:
3096       return "DW_AT_type";
3097     case DW_AT_use_location:
3098       return "DW_AT_use_location";
3099     case DW_AT_variable_parameter:
3100       return "DW_AT_variable_parameter";
3101     case DW_AT_virtuality:
3102       return "DW_AT_virtuality";
3103     case DW_AT_vtable_elem_location:
3104       return "DW_AT_vtable_elem_location";
3105
3106     case DW_AT_MIPS_fde:
3107       return "DW_AT_MIPS_fde";
3108     case DW_AT_MIPS_loop_begin:
3109       return "DW_AT_MIPS_loop_begin";
3110     case DW_AT_MIPS_tail_loop_begin:
3111       return "DW_AT_MIPS_tail_loop_begin";
3112     case DW_AT_MIPS_epilog_begin:
3113       return "DW_AT_MIPS_epilog_begin";
3114     case DW_AT_MIPS_loop_unroll_factor:
3115       return "DW_AT_MIPS_loop_unroll_factor";
3116     case DW_AT_MIPS_software_pipeline_depth:
3117       return "DW_AT_MIPS_software_pipeline_depth";
3118     case DW_AT_MIPS_linkage_name:
3119       return "DW_AT_MIPS_linkage_name";
3120     case DW_AT_MIPS_stride:
3121       return "DW_AT_MIPS_stride";
3122     case DW_AT_MIPS_abstract_name:
3123       return "DW_AT_MIPS_abstract_name";
3124     case DW_AT_MIPS_clone_origin:
3125       return "DW_AT_MIPS_clone_origin";
3126     case DW_AT_MIPS_has_inlines:
3127       return "DW_AT_MIPS_has_inlines";
3128
3129     case DW_AT_sf_names:
3130       return "DW_AT_sf_names";
3131     case DW_AT_src_info:
3132       return "DW_AT_src_info";
3133     case DW_AT_mac_info:
3134       return "DW_AT_mac_info";
3135     case DW_AT_src_coords:
3136       return "DW_AT_src_coords";
3137     case DW_AT_body_begin:
3138       return "DW_AT_body_begin";
3139     case DW_AT_body_end:
3140       return "DW_AT_body_end";
3141     default:
3142       return "DW_AT_<unknown>";
3143     }
3144 }
3145
3146 /* Convert a DWARF value form code into its string name.  */
3147
3148 static const char *
3149 dwarf_form_name (form)
3150      register unsigned form;
3151 {
3152   switch (form)
3153     {
3154     case DW_FORM_addr:
3155       return "DW_FORM_addr";
3156     case DW_FORM_block2:
3157       return "DW_FORM_block2";
3158     case DW_FORM_block4:
3159       return "DW_FORM_block4";
3160     case DW_FORM_data2:
3161       return "DW_FORM_data2";
3162     case DW_FORM_data4:
3163       return "DW_FORM_data4";
3164     case DW_FORM_data8:
3165       return "DW_FORM_data8";
3166     case DW_FORM_string:
3167       return "DW_FORM_string";
3168     case DW_FORM_block:
3169       return "DW_FORM_block";
3170     case DW_FORM_block1:
3171       return "DW_FORM_block1";
3172     case DW_FORM_data1:
3173       return "DW_FORM_data1";
3174     case DW_FORM_flag:
3175       return "DW_FORM_flag";
3176     case DW_FORM_sdata:
3177       return "DW_FORM_sdata";
3178     case DW_FORM_strp:
3179       return "DW_FORM_strp";
3180     case DW_FORM_udata:
3181       return "DW_FORM_udata";
3182     case DW_FORM_ref_addr:
3183       return "DW_FORM_ref_addr";
3184     case DW_FORM_ref1:
3185       return "DW_FORM_ref1";
3186     case DW_FORM_ref2:
3187       return "DW_FORM_ref2";
3188     case DW_FORM_ref4:
3189       return "DW_FORM_ref4";
3190     case DW_FORM_ref8:
3191       return "DW_FORM_ref8";
3192     case DW_FORM_ref_udata:
3193       return "DW_FORM_ref_udata";
3194     case DW_FORM_indirect:
3195       return "DW_FORM_indirect";
3196     default:
3197       return "DW_FORM_<unknown>";
3198     }
3199 }
3200
3201 /* Convert a DWARF stack opcode into its string name.  */
3202
3203 static const char *
3204 dwarf_stack_op_name (op)
3205      register unsigned op;
3206 {
3207   switch (op)
3208     {
3209     case DW_OP_addr:
3210       return "DW_OP_addr";
3211     case DW_OP_deref:
3212       return "DW_OP_deref";
3213     case DW_OP_const1u:
3214       return "DW_OP_const1u";
3215     case DW_OP_const1s:
3216       return "DW_OP_const1s";
3217     case DW_OP_const2u:
3218       return "DW_OP_const2u";
3219     case DW_OP_const2s:
3220       return "DW_OP_const2s";
3221     case DW_OP_const4u:
3222       return "DW_OP_const4u";
3223     case DW_OP_const4s:
3224       return "DW_OP_const4s";
3225     case DW_OP_const8u:
3226       return "DW_OP_const8u";
3227     case DW_OP_const8s:
3228       return "DW_OP_const8s";
3229     case DW_OP_constu:
3230       return "DW_OP_constu";
3231     case DW_OP_consts:
3232       return "DW_OP_consts";
3233     case DW_OP_dup:
3234       return "DW_OP_dup";
3235     case DW_OP_drop:
3236       return "DW_OP_drop";
3237     case DW_OP_over:
3238       return "DW_OP_over";
3239     case DW_OP_pick:
3240       return "DW_OP_pick";
3241     case DW_OP_swap:
3242       return "DW_OP_swap";
3243     case DW_OP_rot:
3244       return "DW_OP_rot";
3245     case DW_OP_xderef:
3246       return "DW_OP_xderef";
3247     case DW_OP_abs:
3248       return "DW_OP_abs";
3249     case DW_OP_and:
3250       return "DW_OP_and";
3251     case DW_OP_div:
3252       return "DW_OP_div";
3253     case DW_OP_minus:
3254       return "DW_OP_minus";
3255     case DW_OP_mod:
3256       return "DW_OP_mod";
3257     case DW_OP_mul:
3258       return "DW_OP_mul";
3259     case DW_OP_neg:
3260       return "DW_OP_neg";
3261     case DW_OP_not:
3262       return "DW_OP_not";
3263     case DW_OP_or:
3264       return "DW_OP_or";
3265     case DW_OP_plus:
3266       return "DW_OP_plus";
3267     case DW_OP_plus_uconst:
3268       return "DW_OP_plus_uconst";
3269     case DW_OP_shl:
3270       return "DW_OP_shl";
3271     case DW_OP_shr:
3272       return "DW_OP_shr";
3273     case DW_OP_shra:
3274       return "DW_OP_shra";
3275     case DW_OP_xor:
3276       return "DW_OP_xor";
3277     case DW_OP_bra:
3278       return "DW_OP_bra";
3279     case DW_OP_eq:
3280       return "DW_OP_eq";
3281     case DW_OP_ge:
3282       return "DW_OP_ge";
3283     case DW_OP_gt:
3284       return "DW_OP_gt";
3285     case DW_OP_le:
3286       return "DW_OP_le";
3287     case DW_OP_lt:
3288       return "DW_OP_lt";
3289     case DW_OP_ne:
3290       return "DW_OP_ne";
3291     case DW_OP_skip:
3292       return "DW_OP_skip";
3293     case DW_OP_lit0:
3294       return "DW_OP_lit0";
3295     case DW_OP_lit1:
3296       return "DW_OP_lit1";
3297     case DW_OP_lit2:
3298       return "DW_OP_lit2";
3299     case DW_OP_lit3:
3300       return "DW_OP_lit3";
3301     case DW_OP_lit4:
3302       return "DW_OP_lit4";
3303     case DW_OP_lit5:
3304       return "DW_OP_lit5";
3305     case DW_OP_lit6:
3306       return "DW_OP_lit6";
3307     case DW_OP_lit7:
3308       return "DW_OP_lit7";
3309     case DW_OP_lit8:
3310       return "DW_OP_lit8";
3311     case DW_OP_lit9:
3312       return "DW_OP_lit9";
3313     case DW_OP_lit10:
3314       return "DW_OP_lit10";
3315     case DW_OP_lit11:
3316       return "DW_OP_lit11";
3317     case DW_OP_lit12:
3318       return "DW_OP_lit12";
3319     case DW_OP_lit13:
3320       return "DW_OP_lit13";
3321     case DW_OP_lit14:
3322       return "DW_OP_lit14";
3323     case DW_OP_lit15:
3324       return "DW_OP_lit15";
3325     case DW_OP_lit16:
3326       return "DW_OP_lit16";
3327     case DW_OP_lit17:
3328       return "DW_OP_lit17";
3329     case DW_OP_lit18:
3330       return "DW_OP_lit18";
3331     case DW_OP_lit19:
3332       return "DW_OP_lit19";
3333     case DW_OP_lit20:
3334       return "DW_OP_lit20";
3335     case DW_OP_lit21:
3336       return "DW_OP_lit21";
3337     case DW_OP_lit22:
3338       return "DW_OP_lit22";
3339     case DW_OP_lit23:
3340       return "DW_OP_lit23";
3341     case DW_OP_lit24:
3342       return "DW_OP_lit24";
3343     case DW_OP_lit25:
3344       return "DW_OP_lit25";
3345     case DW_OP_lit26:
3346       return "DW_OP_lit26";
3347     case DW_OP_lit27:
3348       return "DW_OP_lit27";
3349     case DW_OP_lit28:
3350       return "DW_OP_lit28";
3351     case DW_OP_lit29:
3352       return "DW_OP_lit29";
3353     case DW_OP_lit30:
3354       return "DW_OP_lit30";
3355     case DW_OP_lit31:
3356       return "DW_OP_lit31";
3357     case DW_OP_reg0:
3358       return "DW_OP_reg0";
3359     case DW_OP_reg1:
3360       return "DW_OP_reg1";
3361     case DW_OP_reg2:
3362       return "DW_OP_reg2";
3363     case DW_OP_reg3:
3364       return "DW_OP_reg3";
3365     case DW_OP_reg4:
3366       return "DW_OP_reg4";
3367     case DW_OP_reg5:
3368       return "DW_OP_reg5";
3369     case DW_OP_reg6:
3370       return "DW_OP_reg6";
3371     case DW_OP_reg7:
3372       return "DW_OP_reg7";
3373     case DW_OP_reg8:
3374       return "DW_OP_reg8";
3375     case DW_OP_reg9:
3376       return "DW_OP_reg9";
3377     case DW_OP_reg10:
3378       return "DW_OP_reg10";
3379     case DW_OP_reg11:
3380       return "DW_OP_reg11";
3381     case DW_OP_reg12:
3382       return "DW_OP_reg12";
3383     case DW_OP_reg13:
3384       return "DW_OP_reg13";
3385     case DW_OP_reg14:
3386       return "DW_OP_reg14";
3387     case DW_OP_reg15:
3388       return "DW_OP_reg15";
3389     case DW_OP_reg16:
3390       return "DW_OP_reg16";
3391     case DW_OP_reg17:
3392       return "DW_OP_reg17";
3393     case DW_OP_reg18:
3394       return "DW_OP_reg18";
3395     case DW_OP_reg19:
3396       return "DW_OP_reg19";
3397     case DW_OP_reg20:
3398       return "DW_OP_reg20";
3399     case DW_OP_reg21:
3400       return "DW_OP_reg21";
3401     case DW_OP_reg22:
3402       return "DW_OP_reg22";
3403     case DW_OP_reg23:
3404       return "DW_OP_reg23";
3405     case DW_OP_reg24:
3406       return "DW_OP_reg24";
3407     case DW_OP_reg25:
3408       return "DW_OP_reg25";
3409     case DW_OP_reg26:
3410       return "DW_OP_reg26";
3411     case DW_OP_reg27:
3412       return "DW_OP_reg27";
3413     case DW_OP_reg28:
3414       return "DW_OP_reg28";
3415     case DW_OP_reg29:
3416       return "DW_OP_reg29";
3417     case DW_OP_reg30:
3418       return "DW_OP_reg30";
3419     case DW_OP_reg31:
3420       return "DW_OP_reg31";
3421     case DW_OP_breg0:
3422       return "DW_OP_breg0";
3423     case DW_OP_breg1:
3424       return "DW_OP_breg1";
3425     case DW_OP_breg2:
3426       return "DW_OP_breg2";
3427     case DW_OP_breg3:
3428       return "DW_OP_breg3";
3429     case DW_OP_breg4:
3430       return "DW_OP_breg4";
3431     case DW_OP_breg5:
3432       return "DW_OP_breg5";
3433     case DW_OP_breg6:
3434       return "DW_OP_breg6";
3435     case DW_OP_breg7:
3436       return "DW_OP_breg7";
3437     case DW_OP_breg8:
3438       return "DW_OP_breg8";
3439     case DW_OP_breg9:
3440       return "DW_OP_breg9";
3441     case DW_OP_breg10:
3442       return "DW_OP_breg10";
3443     case DW_OP_breg11:
3444       return "DW_OP_breg11";
3445     case DW_OP_breg12:
3446       return "DW_OP_breg12";
3447     case DW_OP_breg13:
3448       return "DW_OP_breg13";
3449     case DW_OP_breg14:
3450       return "DW_OP_breg14";
3451     case DW_OP_breg15:
3452       return "DW_OP_breg15";
3453     case DW_OP_breg16:
3454       return "DW_OP_breg16";
3455     case DW_OP_breg17:
3456       return "DW_OP_breg17";
3457     case DW_OP_breg18:
3458       return "DW_OP_breg18";
3459     case DW_OP_breg19:
3460       return "DW_OP_breg19";
3461     case DW_OP_breg20:
3462       return "DW_OP_breg20";
3463     case DW_OP_breg21:
3464       return "DW_OP_breg21";
3465     case DW_OP_breg22:
3466       return "DW_OP_breg22";
3467     case DW_OP_breg23:
3468       return "DW_OP_breg23";
3469     case DW_OP_breg24:
3470       return "DW_OP_breg24";
3471     case DW_OP_breg25:
3472       return "DW_OP_breg25";
3473     case DW_OP_breg26:
3474       return "DW_OP_breg26";
3475     case DW_OP_breg27:
3476       return "DW_OP_breg27";
3477     case DW_OP_breg28:
3478       return "DW_OP_breg28";
3479     case DW_OP_breg29:
3480       return "DW_OP_breg29";
3481     case DW_OP_breg30:
3482       return "DW_OP_breg30";
3483     case DW_OP_breg31:
3484       return "DW_OP_breg31";
3485     case DW_OP_regx:
3486       return "DW_OP_regx";
3487     case DW_OP_fbreg:
3488       return "DW_OP_fbreg";
3489     case DW_OP_bregx:
3490       return "DW_OP_bregx";
3491     case DW_OP_piece:
3492       return "DW_OP_piece";
3493     case DW_OP_deref_size:
3494       return "DW_OP_deref_size";
3495     case DW_OP_xderef_size:
3496       return "DW_OP_xderef_size";
3497     case DW_OP_nop:
3498       return "DW_OP_nop";
3499     default:
3500       return "OP_<unknown>";
3501     }
3502 }
3503
3504 /* Convert a DWARF type code into its string name.  */
3505
3506 #if 0
3507 static const char *
3508 dwarf_type_encoding_name (enc)
3509      register unsigned enc;
3510 {
3511   switch (enc)
3512     {
3513     case DW_ATE_address:
3514       return "DW_ATE_address";
3515     case DW_ATE_boolean:
3516       return "DW_ATE_boolean";
3517     case DW_ATE_complex_float:
3518       return "DW_ATE_complex_float";
3519     case DW_ATE_float:
3520       return "DW_ATE_float";
3521     case DW_ATE_signed:
3522       return "DW_ATE_signed";
3523     case DW_ATE_signed_char:
3524       return "DW_ATE_signed_char";
3525     case DW_ATE_unsigned:
3526       return "DW_ATE_unsigned";
3527     case DW_ATE_unsigned_char:
3528       return "DW_ATE_unsigned_char";
3529     default:
3530       return "DW_ATE_<unknown>";
3531     }
3532 }
3533 #endif
3534 \f
3535 /* Determine the "ultimate origin" of a decl.  The decl may be an inlined
3536    instance of an inlined instance of a decl which is local to an inline
3537    function, so we have to trace all of the way back through the origin chain
3538    to find out what sort of node actually served as the original seed for the
3539    given block.  */
3540
3541 static tree
3542 decl_ultimate_origin (decl)
3543      register tree decl;
3544 {
3545 #ifdef ENABLE_CHECKING 
3546   if (DECL_FROM_INLINE (DECL_ORIGIN (decl)))
3547     /* Since the DECL_ABSTRACT_ORIGIN for a DECL is supposed to be the
3548        most distant ancestor, this should never happen.  */
3549     abort ();
3550 #endif
3551
3552   return DECL_ABSTRACT_ORIGIN (decl);
3553 }
3554
3555 /* Determine the "ultimate origin" of a block.  The block may be an inlined
3556    instance of an inlined instance of a block which is local to an inline
3557    function, so we have to trace all of the way back through the origin chain
3558    to find out what sort of node actually served as the original seed for the
3559    given block.  */
3560
3561 static tree
3562 block_ultimate_origin (block)
3563      register tree block;
3564 {
3565   register tree immediate_origin = BLOCK_ABSTRACT_ORIGIN (block);
3566
3567   if (immediate_origin == NULL_TREE)
3568     return NULL_TREE;
3569   else
3570     {
3571       register tree ret_val;
3572       register tree lookahead = immediate_origin;
3573
3574       do
3575         {
3576           ret_val = lookahead;
3577           lookahead = (TREE_CODE (ret_val) == BLOCK)
3578             ? BLOCK_ABSTRACT_ORIGIN (ret_val)
3579             : NULL;
3580         }
3581       while (lookahead != NULL && lookahead != ret_val);
3582
3583       return ret_val;
3584     }
3585 }
3586
3587 /* Get the class to which DECL belongs, if any.  In g++, the DECL_CONTEXT
3588    of a virtual function may refer to a base class, so we check the 'this'
3589    parameter.  */
3590
3591 static tree
3592 decl_class_context (decl)
3593      tree decl;
3594 {
3595   tree context = NULL_TREE;
3596
3597   if (TREE_CODE (decl) != FUNCTION_DECL || ! DECL_VINDEX (decl))
3598     context = DECL_CONTEXT (decl);
3599   else
3600     context = TYPE_MAIN_VARIANT
3601       (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (decl)))));
3602
3603   if (context && TREE_CODE_CLASS (TREE_CODE (context)) != 't')
3604     context = NULL_TREE;
3605
3606   return context;
3607 }
3608 \f
3609 /* Add an attribute/value pair to a DIE.  We build the lists up in reverse
3610    addition order, and correct that in add_sibling_attributes.  */
3611
3612 static inline void
3613 add_dwarf_attr (die, attr)
3614      register dw_die_ref die;
3615      register dw_attr_ref attr;
3616 {
3617   if (die != NULL && attr != NULL)
3618     {
3619       attr->dw_attr_next = die->die_attr;
3620       die->die_attr = attr;
3621     }
3622 }
3623
3624 static inline dw_val_class
3625 AT_class (a)
3626      dw_attr_ref a;
3627 {
3628   return a->dw_attr_val.val_class;
3629 }
3630
3631 /* Add a flag value attribute to a DIE.  */
3632
3633 static inline void
3634 add_AT_flag (die, attr_kind, flag)
3635      register dw_die_ref die;
3636      register enum dwarf_attribute attr_kind;
3637      register unsigned flag;
3638 {
3639   register dw_attr_ref attr = (dw_attr_ref) xmalloc (sizeof (dw_attr_node));
3640
3641   attr->dw_attr_next = NULL;
3642   attr->dw_attr = attr_kind;
3643   attr->dw_attr_val.val_class = dw_val_class_flag;
3644   attr->dw_attr_val.v.val_flag = flag;
3645   add_dwarf_attr (die, attr);
3646 }
3647
3648 static inline unsigned
3649 AT_flag (a)
3650      register dw_attr_ref a;
3651 {
3652   if (a && AT_class (a) == dw_val_class_flag)
3653     return a->dw_attr_val.v.val_flag;
3654
3655   return 0;
3656 }
3657
3658 /* Add a signed integer attribute value to a DIE.  */
3659
3660 static inline void
3661 add_AT_int (die, attr_kind, int_val)
3662      register dw_die_ref die;
3663      register enum dwarf_attribute attr_kind;
3664      register long int int_val;
3665 {
3666   register dw_attr_ref attr = (dw_attr_ref) xmalloc (sizeof (dw_attr_node));
3667
3668   attr->dw_attr_next = NULL;
3669   attr->dw_attr = attr_kind;
3670   attr->dw_attr_val.val_class = dw_val_class_const;
3671   attr->dw_attr_val.v.val_int = int_val;
3672   add_dwarf_attr (die, attr);
3673 }
3674
3675 static inline long int
3676 AT_int (a)
3677      register dw_attr_ref a;
3678 {
3679   if (a && AT_class (a) == dw_val_class_const)
3680     return a->dw_attr_val.v.val_int;
3681
3682   return 0;
3683 }
3684
3685 /* Add an unsigned integer attribute value to a DIE.  */
3686
3687 static inline void
3688 add_AT_unsigned (die, attr_kind, unsigned_val)
3689      register dw_die_ref die;
3690      register enum dwarf_attribute attr_kind;
3691      register unsigned long unsigned_val;
3692 {
3693   register dw_attr_ref attr = (dw_attr_ref) xmalloc (sizeof (dw_attr_node));
3694
3695   attr->dw_attr_next = NULL;
3696   attr->dw_attr = attr_kind;
3697   attr->dw_attr_val.val_class = dw_val_class_unsigned_const;
3698   attr->dw_attr_val.v.val_unsigned = unsigned_val;
3699   add_dwarf_attr (die, attr);
3700 }
3701
3702 static inline unsigned long
3703 AT_unsigned (a)
3704      register dw_attr_ref a;
3705 {
3706   if (a && AT_class (a) == dw_val_class_unsigned_const)
3707     return a->dw_attr_val.v.val_unsigned;
3708
3709   return 0;
3710 }
3711
3712 /* Add an unsigned double integer attribute value to a DIE.  */
3713
3714 static inline void
3715 add_AT_long_long (die, attr_kind, val_hi, val_low)
3716      register dw_die_ref die;
3717      register enum dwarf_attribute attr_kind;
3718      register unsigned long val_hi;
3719      register unsigned long val_low;
3720 {
3721   register dw_attr_ref attr = (dw_attr_ref) xmalloc (sizeof (dw_attr_node));
3722
3723   attr->dw_attr_next = NULL;
3724   attr->dw_attr = attr_kind;
3725   attr->dw_attr_val.val_class = dw_val_class_long_long;
3726   attr->dw_attr_val.v.val_long_long.hi = val_hi;
3727   attr->dw_attr_val.v.val_long_long.low = val_low;
3728   add_dwarf_attr (die, attr);
3729 }
3730
3731 /* Add a floating point attribute value to a DIE and return it.  */
3732
3733 static inline void
3734 add_AT_float (die, attr_kind, length, array)
3735      register dw_die_ref die;
3736      register enum dwarf_attribute attr_kind;
3737      register unsigned length;
3738      register long *array;
3739 {
3740   register dw_attr_ref attr = (dw_attr_ref) xmalloc (sizeof (dw_attr_node));
3741
3742   attr->dw_attr_next = NULL;
3743   attr->dw_attr = attr_kind;
3744   attr->dw_attr_val.val_class = dw_val_class_float;
3745   attr->dw_attr_val.v.val_float.length = length;
3746   attr->dw_attr_val.v.val_float.array = array;
3747   add_dwarf_attr (die, attr);
3748 }
3749
3750 /* Add a string attribute value to a DIE.  */
3751
3752 static inline void
3753 add_AT_string (die, attr_kind, str)
3754      register dw_die_ref die;
3755      register enum dwarf_attribute attr_kind;
3756      register const char *str;
3757 {
3758   register dw_attr_ref attr = (dw_attr_ref) xmalloc (sizeof (dw_attr_node));
3759
3760   attr->dw_attr_next = NULL;
3761   attr->dw_attr = attr_kind;
3762   attr->dw_attr_val.val_class = dw_val_class_str;
3763   attr->dw_attr_val.v.val_str = xstrdup (str);
3764   add_dwarf_attr (die, attr);
3765 }
3766
3767 static inline const char *
3768 AT_string (a)
3769      register dw_attr_ref a;
3770 {
3771   if (a && AT_class (a) == dw_val_class_str)
3772     return a->dw_attr_val.v.val_str;
3773
3774   return NULL;
3775 }
3776
3777 /* Add a DIE reference attribute value to a DIE.  */
3778
3779 static inline void
3780 add_AT_die_ref (die, attr_kind, targ_die)
3781      register dw_die_ref die;
3782      register enum dwarf_attribute attr_kind;
3783      register dw_die_ref targ_die;
3784 {
3785   register dw_attr_ref attr = (dw_attr_ref) xmalloc (sizeof (dw_attr_node));
3786
3787   attr->dw_attr_next = NULL;
3788   attr->dw_attr = attr_kind;
3789   attr->dw_attr_val.val_class = dw_val_class_die_ref;
3790   attr->dw_attr_val.v.val_die_ref = targ_die;
3791   add_dwarf_attr (die, attr);
3792 }
3793
3794 static inline dw_die_ref
3795 AT_ref (a)
3796      register dw_attr_ref a;
3797 {
3798   if (a && AT_class (a) == dw_val_class_die_ref)
3799     return a->dw_attr_val.v.val_die_ref;
3800
3801   return NULL;
3802 }
3803
3804 /* Add an FDE reference attribute value to a DIE.  */
3805
3806 static inline void
3807 add_AT_fde_ref (die, attr_kind, targ_fde)
3808      register dw_die_ref die;
3809      register enum dwarf_attribute attr_kind;
3810      register unsigned targ_fde;
3811 {
3812   register dw_attr_ref attr = (dw_attr_ref) xmalloc (sizeof (dw_attr_node));
3813
3814   attr->dw_attr_next = NULL;
3815   attr->dw_attr = attr_kind;
3816   attr->dw_attr_val.val_class = dw_val_class_fde_ref;
3817   attr->dw_attr_val.v.val_fde_index = targ_fde;
3818   add_dwarf_attr (die, attr);
3819 }
3820
3821 /* Add a location description attribute value to a DIE.  */
3822
3823 static inline void
3824 add_AT_loc (die, attr_kind, loc)
3825      register dw_die_ref die;
3826      register enum dwarf_attribute attr_kind;
3827      register dw_loc_descr_ref loc;
3828 {
3829   register dw_attr_ref attr = (dw_attr_ref) xmalloc (sizeof (dw_attr_node));
3830
3831   attr->dw_attr_next = NULL;
3832   attr->dw_attr = attr_kind;
3833   attr->dw_attr_val.val_class = dw_val_class_loc;
3834   attr->dw_attr_val.v.val_loc = loc;
3835   add_dwarf_attr (die, attr);
3836 }
3837
3838 static inline dw_loc_descr_ref
3839 AT_loc (a)
3840      register dw_attr_ref a;
3841 {
3842   if (a && AT_class (a) == dw_val_class_loc)
3843     return a->dw_attr_val.v.val_loc;
3844
3845   return NULL;
3846 }
3847
3848 /* Add an address constant attribute value to a DIE.  */
3849
3850 static inline void
3851 add_AT_addr (die, attr_kind, addr)
3852      register dw_die_ref die;
3853      register enum dwarf_attribute attr_kind;
3854      char *addr;
3855 {
3856   register dw_attr_ref attr = (dw_attr_ref) xmalloc (sizeof (dw_attr_node));
3857
3858   attr->dw_attr_next = NULL;
3859   attr->dw_attr = attr_kind;
3860   attr->dw_attr_val.val_class = dw_val_class_addr;
3861   attr->dw_attr_val.v.val_addr = addr;
3862   add_dwarf_attr (die, attr);
3863 }
3864
3865 static inline const char *
3866 AT_addr (a)
3867      register dw_attr_ref a;
3868 {
3869   if (a && AT_class (a) == dw_val_class_addr)
3870     return a->dw_attr_val.v.val_addr;
3871
3872   return NULL;
3873 }
3874
3875 /* Add a label identifier attribute value to a DIE.  */
3876
3877 static inline void
3878 add_AT_lbl_id (die, attr_kind, lbl_id)
3879      register dw_die_ref die;
3880      register enum dwarf_attribute attr_kind;
3881      register char *lbl_id;
3882 {
3883   register dw_attr_ref attr = (dw_attr_ref) xmalloc (sizeof (dw_attr_node));
3884
3885   attr->dw_attr_next = NULL;
3886   attr->dw_attr = attr_kind;
3887   attr->dw_attr_val.val_class = dw_val_class_lbl_id;
3888   attr->dw_attr_val.v.val_lbl_id = xstrdup (lbl_id);
3889   add_dwarf_attr (die, attr);
3890 }
3891
3892 /* Add a section offset attribute value to a DIE.  */
3893
3894 static inline void
3895 add_AT_lbl_offset (die, attr_kind, label)
3896      register dw_die_ref die;
3897      register enum dwarf_attribute attr_kind;
3898      register char *label;
3899 {
3900   register dw_attr_ref attr = (dw_attr_ref) xmalloc (sizeof (dw_attr_node));
3901
3902   attr->dw_attr_next = NULL;
3903   attr->dw_attr = attr_kind;
3904   attr->dw_attr_val.val_class = dw_val_class_lbl_offset;
3905   attr->dw_attr_val.v.val_lbl_id = xstrdup (label);
3906   add_dwarf_attr (die, attr);
3907   
3908 }
3909
3910 static inline const char *
3911 AT_lbl (a)
3912      register dw_attr_ref a;
3913 {
3914   if (a && (AT_class (a) == dw_val_class_lbl_id
3915             || AT_class (a) == dw_val_class_lbl_offset))
3916     return a->dw_attr_val.v.val_lbl_id;
3917
3918   return NULL;
3919 }
3920
3921 /* Get the attribute of type attr_kind.  */
3922
3923 static inline dw_attr_ref
3924 get_AT (die, attr_kind)
3925      register dw_die_ref die;
3926      register enum dwarf_attribute attr_kind;
3927 {
3928   register dw_attr_ref a;
3929   register dw_die_ref spec = NULL;
3930   
3931   if (die != NULL)
3932     {
3933       for (a = die->die_attr; a != NULL; a = a->dw_attr_next)
3934         {
3935           if (a->dw_attr == attr_kind)
3936             return a;
3937
3938           if (a->dw_attr == DW_AT_specification
3939               || a->dw_attr == DW_AT_abstract_origin)
3940             spec = AT_ref (a);
3941         }
3942
3943       if (spec)
3944         return get_AT (spec, attr_kind);
3945     }
3946
3947   return NULL;
3948 }
3949
3950 /* Return the "low pc" attribute value, typically associated with
3951    a subprogram DIE.  Return null if the "low pc" attribute is
3952    either not prsent, or if it cannot be represented as an
3953    assembler label identifier.  */
3954
3955 static inline const char *
3956 get_AT_low_pc (die)
3957      register dw_die_ref die;
3958 {
3959   register dw_attr_ref a = get_AT (die, DW_AT_low_pc);
3960   return AT_lbl (a);
3961 }
3962
3963 /* Return the "high pc" attribute value, typically associated with
3964    a subprogram DIE.  Return null if the "high pc" attribute is
3965    either not prsent, or if it cannot be represented as an
3966    assembler label identifier.  */
3967
3968 static inline const char *
3969 get_AT_hi_pc (die)
3970      register dw_die_ref die;
3971 {
3972   register dw_attr_ref a = get_AT (die, DW_AT_high_pc);
3973   return AT_lbl (a);
3974 }
3975
3976 /* Return the value of the string attribute designated by ATTR_KIND, or
3977    NULL if it is not present.  */
3978
3979 static inline const char *
3980 get_AT_string (die, attr_kind)
3981      register dw_die_ref die;
3982      register enum dwarf_attribute attr_kind;
3983 {
3984   register dw_attr_ref a = get_AT (die, attr_kind);
3985   return AT_string (a);
3986 }
3987
3988 /* Return the value of the flag attribute designated by ATTR_KIND, or -1
3989    if it is not present.  */
3990
3991 static inline int
3992 get_AT_flag (die, attr_kind)
3993      register dw_die_ref die;
3994      register enum dwarf_attribute attr_kind;
3995 {
3996   register dw_attr_ref a = get_AT (die, attr_kind);
3997   return AT_flag (a);
3998 }
3999
4000 /* Return the value of the unsigned attribute designated by ATTR_KIND, or 0
4001    if it is not present.  */
4002
4003 static inline unsigned
4004 get_AT_unsigned (die, attr_kind)
4005      register dw_die_ref die;
4006      register enum dwarf_attribute attr_kind;
4007 {
4008   register dw_attr_ref a = get_AT (die, attr_kind);
4009   return AT_unsigned (a);
4010 }
4011
4012 static inline dw_die_ref
4013 get_AT_ref (die, attr_kind)
4014      dw_die_ref die;
4015      register enum dwarf_attribute attr_kind;
4016 {
4017   register dw_attr_ref a = get_AT (die, attr_kind);
4018   return AT_ref (a);
4019 }
4020
4021 static inline int
4022 is_c_family ()
4023 {
4024   register unsigned lang = get_AT_unsigned (comp_unit_die, DW_AT_language);
4025
4026   return (lang == DW_LANG_C || lang == DW_LANG_C89
4027           || lang == DW_LANG_C_plus_plus);
4028
4029
4030 static inline int
4031 is_fortran ()
4032 {
4033   register unsigned lang = get_AT_unsigned (comp_unit_die, DW_AT_language);
4034
4035   return (lang == DW_LANG_Fortran77 || lang == DW_LANG_Fortran90);
4036
4037
4038 /* Remove the specified attribute if present.  */
4039
4040 static inline void
4041 remove_AT (die, attr_kind)
4042      register dw_die_ref die;
4043      register enum dwarf_attribute attr_kind;
4044 {
4045   register dw_attr_ref *p;
4046   register dw_attr_ref removed = NULL;
4047
4048   if (die != NULL)
4049     {
4050       for (p = &(die->die_attr); *p; p = &((*p)->dw_attr_next))
4051         if ((*p)->dw_attr == attr_kind)
4052           {
4053             removed = *p;
4054             *p = (*p)->dw_attr_next;
4055             break;
4056           }
4057
4058       if (removed != 0)
4059         {
4060           switch (AT_class (removed))
4061             {
4062             case dw_val_class_addr:
4063             case dw_val_class_str:
4064             case dw_val_class_lbl_id:
4065             case dw_val_class_lbl_offset:
4066               free (removed->dw_attr_val.v.val_str);
4067               break;
4068
4069             default:
4070               break;
4071             }
4072
4073           free (removed);
4074         }
4075     }
4076 }
4077
4078 /* Discard the children of this DIE.  */
4079
4080 static inline void
4081 remove_children (die)
4082      register dw_die_ref die;
4083 {
4084   register dw_die_ref child_die = die->die_child;
4085
4086   die->die_child = NULL;
4087
4088   while (child_die != NULL)
4089     {
4090       register dw_die_ref tmp_die = child_die;
4091       register dw_attr_ref a;
4092
4093       child_die = child_die->die_sib;
4094       
4095       for (a = tmp_die->die_attr; a != NULL; )
4096         {
4097           register dw_attr_ref tmp_a = a;
4098
4099           a = a->dw_attr_next;
4100           free (tmp_a);
4101         }
4102
4103       free (tmp_die);
4104     }
4105 }
4106
4107 /* Add a child DIE below its parent.  We build the lists up in reverse
4108    addition order, and correct that in add_sibling_attributes.  */
4109
4110 static inline void
4111 add_child_die (die, child_die)
4112      register dw_die_ref die;
4113      register dw_die_ref child_die;
4114 {
4115   if (die != NULL && child_die != NULL)
4116     {
4117       if (die == child_die)
4118         abort ();
4119       child_die->die_parent = die;
4120       child_die->die_sib = die->die_child;
4121       die->die_child = child_die;
4122     }
4123 }
4124
4125 /* Return a pointer to a newly created DIE node.  */
4126
4127 static inline dw_die_ref
4128 new_die (tag_value, parent_die)
4129      register enum dwarf_tag tag_value;
4130      register dw_die_ref parent_die;
4131 {
4132   register dw_die_ref die = (dw_die_ref) xmalloc (sizeof (die_node));
4133
4134   die->die_tag = tag_value;
4135   die->die_abbrev = 0;
4136   die->die_offset = 0;
4137   die->die_child = NULL;
4138   die->die_parent = NULL;
4139   die->die_sib = NULL;
4140   die->die_attr = NULL;
4141
4142   if (parent_die != NULL)
4143     add_child_die (parent_die, die);
4144   else
4145     {
4146       limbo_die_node *limbo_node;
4147
4148       limbo_node = (limbo_die_node *) xmalloc (sizeof (limbo_die_node));
4149       limbo_node->die = die;
4150       limbo_node->next = limbo_die_list;
4151       limbo_die_list = limbo_node;
4152     }
4153
4154   return die;
4155 }
4156
4157 /* Return the DIE associated with the given type specifier.  */
4158
4159 static inline dw_die_ref
4160 lookup_type_die (type)
4161      register tree type;
4162 {
4163   return (dw_die_ref) TYPE_SYMTAB_POINTER (type);
4164 }
4165
4166 /* Equate a DIE to a given type specifier.  */
4167
4168 static void
4169 equate_type_number_to_die (type, type_die)
4170      register tree type;
4171      register dw_die_ref type_die;
4172 {
4173   TYPE_SYMTAB_POINTER (type) = (char *) type_die;
4174 }
4175
4176 /* Return the DIE associated with a given declaration.  */
4177
4178 static inline dw_die_ref
4179 lookup_decl_die (decl)
4180      register tree decl;
4181 {
4182   register unsigned decl_id = DECL_UID (decl);
4183
4184   return (decl_id < decl_die_table_in_use
4185           ? decl_die_table[decl_id] : NULL);
4186 }
4187
4188 /* Equate a DIE to a particular declaration.  */
4189
4190 static void
4191 equate_decl_number_to_die (decl, decl_die)
4192      register tree decl;
4193      register dw_die_ref decl_die;
4194 {
4195   register unsigned decl_id = DECL_UID (decl);
4196   register unsigned num_allocated;
4197
4198   if (decl_id >= decl_die_table_allocated)
4199     {
4200       num_allocated
4201         = ((decl_id + 1 + DECL_DIE_TABLE_INCREMENT - 1)
4202            / DECL_DIE_TABLE_INCREMENT)
4203           * DECL_DIE_TABLE_INCREMENT;
4204
4205       decl_die_table
4206         = (dw_die_ref *) xrealloc (decl_die_table,
4207                                    sizeof (dw_die_ref) * num_allocated);
4208
4209       bzero ((char *) &decl_die_table[decl_die_table_allocated],
4210              (num_allocated - decl_die_table_allocated) * sizeof (dw_die_ref));
4211       decl_die_table_allocated = num_allocated;
4212     }
4213
4214   if (decl_id >= decl_die_table_in_use)
4215     decl_die_table_in_use = (decl_id + 1);
4216
4217   decl_die_table[decl_id] = decl_die;
4218 }
4219
4220 /* Return a pointer to a newly allocated location description.  Location
4221    descriptions are simple expression terms that can be strung
4222    together to form more complicated location (address) descriptions.  */
4223
4224 static inline dw_loc_descr_ref
4225 new_loc_descr (op, oprnd1, oprnd2)
4226      register enum dwarf_location_atom op;
4227      register unsigned long oprnd1;
4228      register unsigned long oprnd2;
4229 {
4230   register dw_loc_descr_ref descr
4231     = (dw_loc_descr_ref) xmalloc (sizeof (dw_loc_descr_node));
4232
4233   descr->dw_loc_next = NULL;
4234   descr->dw_loc_opc = op;
4235   descr->dw_loc_oprnd1.val_class = dw_val_class_unsigned_const;
4236   descr->dw_loc_oprnd1.v.val_unsigned = oprnd1;
4237   descr->dw_loc_oprnd2.val_class = dw_val_class_unsigned_const;
4238   descr->dw_loc_oprnd2.v.val_unsigned = oprnd2;
4239
4240   return descr;
4241 }
4242
4243 /* Add a location description term to a location description expression.  */
4244
4245 static inline void
4246 add_loc_descr (list_head, descr)
4247      register dw_loc_descr_ref *list_head;
4248      register dw_loc_descr_ref descr;
4249 {
4250   register dw_loc_descr_ref *d;
4251
4252   /* Find the end of the chain.  */
4253   for (d = list_head; (*d) != NULL; d = &(*d)->dw_loc_next)
4254     ;
4255
4256   *d = descr;
4257 }
4258 \f
4259 /* Keep track of the number of spaces used to indent the
4260    output of the debugging routines that print the structure of
4261    the DIE internal representation.  */
4262 static int print_indent;
4263
4264 /* Indent the line the number of spaces given by print_indent.  */
4265
4266 static inline void
4267 print_spaces (outfile)
4268      FILE *outfile;
4269 {
4270   fprintf (outfile, "%*s", print_indent, "");
4271 }
4272
4273 /* Print the information associated with a given DIE, and its children.
4274    This routine is a debugging aid only.  */
4275
4276 static void
4277 print_die (die, outfile)
4278      dw_die_ref die;
4279      FILE *outfile;
4280 {
4281   register dw_attr_ref a;
4282   register dw_die_ref c;
4283
4284   print_spaces (outfile);
4285   fprintf (outfile, "DIE %4lu: %s\n",
4286            die->die_offset, dwarf_tag_name (die->die_tag));
4287   print_spaces (outfile);
4288   fprintf (outfile, "  abbrev id: %lu", die->die_abbrev);
4289   fprintf (outfile, " offset: %lu\n", die->die_offset);
4290
4291   for (a = die->die_attr; a != NULL; a = a->dw_attr_next)
4292     {
4293       print_spaces (outfile);
4294       fprintf (outfile, "  %s: ", dwarf_attr_name (a->dw_attr));
4295
4296       switch (AT_class (a))
4297         {
4298         case dw_val_class_addr:
4299           fprintf (outfile, "address");
4300           break;
4301         case dw_val_class_loc:
4302           fprintf (outfile, "location descriptor");
4303           break;
4304         case dw_val_class_const:
4305           fprintf (outfile, "%ld", AT_int (a));
4306           break;
4307         case dw_val_class_unsigned_const:
4308           fprintf (outfile, "%lu", AT_unsigned (a));
4309           break;
4310         case dw_val_class_long_long:
4311           fprintf (outfile, "constant (%lu,%lu)",
4312                   a->dw_attr_val.v.val_long_long.hi,
4313                   a->dw_attr_val.v.val_long_long.low);
4314           break;
4315         case dw_val_class_float:
4316           fprintf (outfile, "floating-point constant");
4317           break;
4318         case dw_val_class_flag:
4319           fprintf (outfile, "%u", AT_flag (a));
4320           break;
4321         case dw_val_class_die_ref:
4322           if (AT_ref (a) != NULL)
4323             fprintf (outfile, "die -> %lu", AT_ref (a)->die_offset);
4324           else
4325             fprintf (outfile, "die -> <null>");
4326           break;
4327         case dw_val_class_lbl_id:
4328         case dw_val_class_lbl_offset:
4329           fprintf (outfile, "label: %s", AT_lbl (a));
4330           break;
4331         case dw_val_class_str:
4332           if (AT_string (a) != NULL)
4333             fprintf (outfile, "\"%s\"", AT_string (a));
4334           else
4335             fprintf (outfile, "<null>");
4336           break;
4337         default:
4338           break;
4339         }
4340
4341       fprintf (outfile, "\n");
4342     }
4343
4344   if (die->die_child != NULL)
4345     {
4346       print_indent += 4;
4347       for (c = die->die_child; c != NULL; c = c->die_sib)
4348         print_die (c, outfile);
4349
4350       print_indent -= 4;
4351     }
4352 }
4353
4354 /* Print the contents of the source code line number correspondence table.
4355    This routine is a debugging aid only.  */
4356
4357 static void
4358 print_dwarf_line_table (outfile)
4359      FILE *outfile;
4360 {
4361   register unsigned i;
4362   register dw_line_info_ref line_info;
4363
4364   fprintf (outfile, "\n\nDWARF source line information\n");
4365   for (i = 1; i < line_info_table_in_use; ++i)
4366     {
4367       line_info = &line_info_table[i];
4368       fprintf (outfile, "%5d: ", i);
4369       fprintf (outfile, "%-20s", file_table[line_info->dw_file_num]);
4370       fprintf (outfile, "%6ld", line_info->dw_line_num);
4371       fprintf (outfile, "\n");
4372     }
4373
4374   fprintf (outfile, "\n\n");
4375 }
4376
4377 /* Print the information collected for a given DIE.  */
4378
4379 void
4380 debug_dwarf_die (die)
4381      dw_die_ref die;
4382 {
4383   print_die (die, stderr);
4384 }
4385
4386 /* Print all DWARF information collected for the compilation unit.
4387    This routine is a debugging aid only.  */
4388
4389 void
4390 debug_dwarf ()
4391 {
4392   print_indent = 0;
4393   print_die (comp_unit_die, stderr);
4394   if (! DWARF2_ASM_LINE_DEBUG_INFO)
4395     print_dwarf_line_table (stderr);
4396 }
4397 \f
4398 /* We build up the lists of children and attributes by pushing new ones
4399    onto the beginning of the list.  Reverse the lists for DIE so that
4400    they are in order of addition.  */
4401
4402 static void
4403 reverse_die_lists (die)
4404      register dw_die_ref die;
4405 {
4406   register dw_die_ref c, cp, cn;
4407   register dw_attr_ref a, ap, an;
4408
4409   for (a = die->die_attr, ap = 0; a; a = an)
4410     {
4411       an = a->dw_attr_next;
4412       a->dw_attr_next = ap;
4413       ap = a;
4414     }
4415   die->die_attr = ap;
4416
4417   for (c = die->die_child, cp = 0; c; c = cn)
4418     {
4419       cn = c->die_sib;
4420       c->die_sib = cp;
4421       cp = c;
4422     }
4423   die->die_child = cp;
4424 }
4425
4426 /* Traverse the DIE, reverse its lists of attributes and children, and
4427    add a sibling attribute if it may have the effect of speeding up
4428    access to siblings.  To save some space, avoid generating sibling
4429    attributes for DIE's without children.  */
4430
4431 static void
4432 add_sibling_attributes (die)
4433      register dw_die_ref die;
4434 {
4435   register dw_die_ref c;
4436
4437   reverse_die_lists (die);
4438
4439   if (die != comp_unit_die && die->die_sib && die->die_child != NULL)
4440     /* Add the sibling link to the front of the attribute list.  */
4441     add_AT_die_ref (die, DW_AT_sibling, die->die_sib);
4442
4443   for (c = die->die_child; c != NULL; c = c->die_sib)
4444     add_sibling_attributes (c);
4445 }
4446
4447 /* The format of each DIE (and its attribute value pairs)
4448    is encoded in an abbreviation table.  This routine builds the
4449    abbreviation table and assigns a unique abbreviation id for
4450    each abbreviation entry.  The children of each die are visited
4451    recursively.  */
4452
4453 static void
4454 build_abbrev_table (die)
4455      register dw_die_ref die;
4456 {
4457   register unsigned long abbrev_id;
4458   register unsigned long n_alloc;
4459   register dw_die_ref c;
4460   register dw_attr_ref d_attr, a_attr;
4461   for (abbrev_id = 1; abbrev_id < abbrev_die_table_in_use; ++abbrev_id)
4462     {
4463       register dw_die_ref abbrev = abbrev_die_table[abbrev_id];
4464
4465       if (abbrev->die_tag == die->die_tag)
4466         {
4467           if ((abbrev->die_child != NULL) == (die->die_child != NULL))
4468             {
4469               a_attr = abbrev->die_attr;
4470               d_attr = die->die_attr;
4471
4472               while (a_attr != NULL && d_attr != NULL)
4473                 {
4474                   if ((a_attr->dw_attr != d_attr->dw_attr)
4475                       || (value_format (a_attr) != value_format (d_attr)))
4476                     break;
4477
4478                   a_attr = a_attr->dw_attr_next;
4479                   d_attr = d_attr->dw_attr_next;
4480                 }
4481
4482               if (a_attr == NULL && d_attr == NULL)
4483                 break;
4484             }
4485         }
4486     }
4487
4488   if (abbrev_id >= abbrev_die_table_in_use)
4489     {
4490       if (abbrev_die_table_in_use >= abbrev_die_table_allocated)
4491         {
4492           n_alloc = abbrev_die_table_allocated + ABBREV_DIE_TABLE_INCREMENT;
4493           abbrev_die_table 
4494             = (dw_die_ref *) xrealloc (abbrev_die_table,
4495                                        sizeof (dw_die_ref) * n_alloc);
4496
4497           bzero ((char *) &abbrev_die_table[abbrev_die_table_allocated],
4498                  (n_alloc - abbrev_die_table_allocated) * sizeof (dw_die_ref));
4499           abbrev_die_table_allocated = n_alloc;
4500         }
4501
4502       ++abbrev_die_table_in_use;
4503       abbrev_die_table[abbrev_id] = die;
4504     }
4505
4506   die->die_abbrev = abbrev_id;
4507   for (c = die->die_child; c != NULL; c = c->die_sib)
4508     build_abbrev_table (c);
4509 }
4510 \f
4511 /* Return the size of a string, including the null byte.
4512
4513    This used to treat backslashes as escapes, and hence they were not included
4514    in the count.  However, that conflicts with what ASM_OUTPUT_ASCII does,
4515    which treats a backslash as a backslash, escaping it if necessary, and hence
4516    we must include them in the count.  */
4517
4518 static unsigned long
4519 size_of_string (str)
4520      register const char *str;
4521 {
4522   return strlen (str) + 1;
4523 }
4524
4525 /* Return the size of a location descriptor.  */
4526
4527 static unsigned long
4528 size_of_loc_descr (loc)
4529      register dw_loc_descr_ref loc;
4530 {
4531   register unsigned long size = 1;
4532
4533   switch (loc->dw_loc_opc)
4534     {
4535     case DW_OP_addr:
4536       size += PTR_SIZE;
4537       break;
4538     case DW_OP_const1u:
4539     case DW_OP_const1s:
4540       size += 1;
4541       break;
4542     case DW_OP_const2u:
4543     case DW_OP_const2s:
4544       size += 2;
4545       break;
4546     case DW_OP_const4u:
4547     case DW_OP_const4s:
4548       size += 4;
4549       break;
4550     case DW_OP_const8u:
4551     case DW_OP_const8s:
4552       size += 8;
4553       break;
4554     case DW_OP_constu:
4555       size += size_of_uleb128 (loc->dw_loc_oprnd1.v.val_unsigned);
4556       break;
4557     case DW_OP_consts:
4558       size += size_of_sleb128 (loc->dw_loc_oprnd1.v.val_int);
4559       break;
4560     case DW_OP_pick:
4561       size += 1;
4562       break;
4563     case DW_OP_plus_uconst:
4564       size += size_of_uleb128 (loc->dw_loc_oprnd1.v.val_unsigned);
4565       break;
4566     case DW_OP_skip:
4567     case DW_OP_bra:
4568       size += 2;
4569       break;
4570     case DW_OP_breg0:
4571     case DW_OP_breg1:
4572     case DW_OP_breg2:
4573     case DW_OP_breg3:
4574     case DW_OP_breg4:
4575     case DW_OP_breg5:
4576     case DW_OP_breg6:
4577     case DW_OP_breg7:
4578     case DW_OP_breg8:
4579     case DW_OP_breg9:
4580     case DW_OP_breg10:
4581     case DW_OP_breg11:
4582     case DW_OP_breg12:
4583     case DW_OP_breg13:
4584     case DW_OP_breg14:
4585     case DW_OP_breg15:
4586     case DW_OP_breg16:
4587     case DW_OP_breg17:
4588     case DW_OP_breg18:
4589     case DW_OP_breg19:
4590     case DW_OP_breg20:
4591     case DW_OP_breg21:
4592     case DW_OP_breg22:
4593     case DW_OP_breg23:
4594     case DW_OP_breg24:
4595     case DW_OP_breg25:
4596     case DW_OP_breg26:
4597     case DW_OP_breg27:
4598     case DW_OP_breg28:
4599     case DW_OP_breg29:
4600     case DW_OP_breg30:
4601     case DW_OP_breg31:
4602       size += size_of_sleb128 (loc->dw_loc_oprnd1.v.val_int);
4603       break;
4604     case DW_OP_regx:
4605       size += size_of_uleb128 (loc->dw_loc_oprnd1.v.val_unsigned);
4606       break;
4607     case DW_OP_fbreg:
4608       size += size_of_sleb128 (loc->dw_loc_oprnd1.v.val_int);
4609       break;
4610     case DW_OP_bregx:
4611       size += size_of_uleb128 (loc->dw_loc_oprnd1.v.val_unsigned);
4612       size += size_of_sleb128 (loc->dw_loc_oprnd2.v.val_int);
4613       break;
4614     case DW_OP_piece:
4615       size += size_of_uleb128 (loc->dw_loc_oprnd1.v.val_unsigned);
4616       break;
4617     case DW_OP_deref_size:
4618     case DW_OP_xderef_size:
4619       size += 1;
4620       break;
4621     default:
4622       break;
4623     }
4624
4625   return size;
4626 }
4627
4628 /* Return the size of a series of location descriptors.  */
4629
4630 static unsigned long
4631 size_of_locs (loc)
4632      register dw_loc_descr_ref loc;
4633 {
4634   register unsigned long size = 0;
4635
4636   for (; loc != NULL; loc = loc->dw_loc_next)
4637     size += size_of_loc_descr (loc);
4638
4639   return size;
4640 }
4641
4642 /* Return the power-of-two number of bytes necessary to represent VALUE.  */
4643
4644 static int
4645 constant_size (value)
4646      long unsigned value;
4647 {
4648   int log;
4649
4650   if (value == 0)
4651     log = 0;
4652   else
4653     log = floor_log2 (value);
4654
4655   log = log / 8;
4656   log = 1 << (floor_log2 (log) + 1);
4657
4658   return log;
4659 }
4660
4661 /* Return the size of a DIE, as it is represented in the
4662    .debug_info section.  */
4663
4664 static unsigned long
4665 size_of_die (die)
4666      register dw_die_ref die;
4667 {
4668   register unsigned long size = 0;
4669   register dw_attr_ref a;
4670
4671   size += size_of_uleb128 (die->die_abbrev);
4672   for (a = die->die_attr; a != NULL; a = a->dw_attr_next)
4673     {
4674       switch (AT_class (a))
4675         {
4676         case dw_val_class_addr:
4677           size += PTR_SIZE;
4678           break;
4679         case dw_val_class_loc:
4680           {
4681             register unsigned long lsize = size_of_locs (AT_loc (a));
4682
4683             /* Block length.  */
4684             size += constant_size (lsize);
4685             size += lsize;
4686           }
4687           break;
4688         case dw_val_class_const:
4689           size += 4;
4690           break;
4691         case dw_val_class_unsigned_const:
4692           size += constant_size (AT_unsigned (a));
4693           break;
4694         case dw_val_class_long_long:
4695           size += 1 + 8; /* block */
4696           break;
4697         case dw_val_class_float:
4698           size += 1 + a->dw_attr_val.v.val_float.length * 4; /* block */
4699           break;
4700         case dw_val_class_flag:
4701           size += 1;
4702           break;
4703         case dw_val_class_die_ref:
4704           size += DWARF_OFFSET_SIZE;
4705           break;
4706         case dw_val_class_fde_ref:
4707           size += DWARF_OFFSET_SIZE;
4708           break;
4709         case dw_val_class_lbl_id:
4710           size += PTR_SIZE;
4711           break;
4712         case dw_val_class_lbl_offset:
4713           size += DWARF_OFFSET_SIZE;
4714           break;
4715         case dw_val_class_str:
4716           size += size_of_string (AT_string (a));
4717           break;
4718         default:
4719           abort ();
4720         }
4721     }
4722
4723   return size;
4724 }
4725
4726 /* Size the debugging information associated with a given DIE.
4727    Visits the DIE's children recursively.  Updates the global
4728    variable next_die_offset, on each time through.  Uses the
4729    current value of next_die_offset to update the die_offset
4730    field in each DIE.  */
4731
4732 static void
4733 calc_die_sizes (die)
4734      dw_die_ref die;
4735 {
4736   register dw_die_ref c;
4737   die->die_offset = next_die_offset;
4738   next_die_offset += size_of_die (die);
4739
4740   for (c = die->die_child; c != NULL; c = c->die_sib)
4741     calc_die_sizes (c);
4742
4743   if (die->die_child != NULL)
4744     /* Count the null byte used to terminate sibling lists.  */
4745     next_die_offset += 1;
4746 }
4747
4748 /* Return the size of the line information prolog generated for the
4749    compilation unit.  */
4750
4751 static unsigned long
4752 size_of_line_prolog ()
4753 {
4754   register unsigned long size;
4755   register unsigned long ft_index;
4756
4757   size = DWARF_LINE_PROLOG_HEADER_SIZE;
4758
4759   /* Count the size of the table giving number of args for each
4760      standard opcode.  */
4761   size += DWARF_LINE_OPCODE_BASE - 1;
4762
4763   /* Include directory table is empty (at present).  Count only the
4764      null byte used to terminate the table.  */
4765   size += 1;
4766
4767   for (ft_index = 1; ft_index < file_table_in_use; ++ft_index)
4768     {
4769       /* File name entry.  */
4770       size += size_of_string (file_table[ft_index]);
4771
4772       /* Include directory index.  */
4773       size += size_of_uleb128 (0);
4774
4775       /* Modification time.  */
4776       size += size_of_uleb128 (0);
4777
4778       /* File length in bytes.  */
4779       size += size_of_uleb128 (0);
4780     }
4781
4782   /* Count the file table terminator.  */
4783   size += 1;
4784   return size;
4785 }
4786
4787 /* Return the size of the .debug_pubnames table  generated for the
4788    compilation unit.  */
4789
4790 static unsigned long
4791 size_of_pubnames ()
4792 {
4793   register unsigned long size;
4794   register unsigned i;
4795
4796   size = DWARF_PUBNAMES_HEADER_SIZE;
4797   for (i = 0; i < pubname_table_in_use; ++i)
4798     {
4799       register pubname_ref p = &pubname_table[i];
4800       size += DWARF_OFFSET_SIZE + size_of_string (p->name);
4801     }
4802
4803   size += DWARF_OFFSET_SIZE;
4804   return size;
4805 }
4806
4807 /* Return the size of the information in the .debug_aranges section.  */
4808
4809 static unsigned long
4810 size_of_aranges ()
4811 {
4812   register unsigned long size;
4813
4814   size = DWARF_ARANGES_HEADER_SIZE;
4815
4816   /* Count the address/length pair for this compilation unit.  */
4817   size += 2 * PTR_SIZE;
4818   size += 2 * PTR_SIZE * arange_table_in_use;
4819
4820   /* Count the two zero words used to terminated the address range table.  */
4821   size += 2 * PTR_SIZE;
4822   return size;
4823 }
4824 \f
4825 /* Select the encoding of an attribute value.  */
4826
4827 static enum dwarf_form
4828 value_format (a)
4829      dw_attr_ref a;
4830 {
4831   switch (a->dw_attr_val.val_class)
4832     {
4833     case dw_val_class_addr:
4834       return DW_FORM_addr;
4835     case dw_val_class_loc:
4836       switch (constant_size (size_of_locs (AT_loc (a))))
4837         {
4838         case 1:
4839           return DW_FORM_block1;
4840         case 2:
4841           return DW_FORM_block2;
4842         default:
4843           abort ();
4844         }
4845     case dw_val_class_const:
4846       return DW_FORM_data4;
4847     case dw_val_class_unsigned_const:
4848       switch (constant_size (AT_unsigned (a)))
4849         {
4850         case 1:
4851           return DW_FORM_data1;
4852         case 2:
4853           return DW_FORM_data2;
4854         case 4:
4855           return DW_FORM_data4;
4856         case 8:
4857           return DW_FORM_data8;
4858         default:
4859           abort ();
4860         }
4861     case dw_val_class_long_long:
4862       return DW_FORM_block1;
4863     case dw_val_class_float:
4864       return DW_FORM_block1;
4865     case dw_val_class_flag:
4866       return DW_FORM_flag;
4867     case dw_val_class_die_ref:
4868       return DW_FORM_ref;
4869     case dw_val_class_fde_ref:
4870       return DW_FORM_data;
4871     case dw_val_class_lbl_id:
4872       return DW_FORM_addr;
4873     case dw_val_class_lbl_offset:
4874       return DW_FORM_data;
4875     case dw_val_class_str:
4876       return DW_FORM_string;
4877     default:
4878       abort ();
4879     }
4880 }
4881
4882 /* Output the encoding of an attribute value.  */
4883
4884 static void
4885 output_value_format (a)
4886      dw_attr_ref a;
4887 {
4888   enum dwarf_form form = value_format (a);
4889
4890   output_uleb128 (form);
4891   if (flag_debug_asm)
4892     fprintf (asm_out_file, " (%s)", dwarf_form_name (form));
4893
4894   fputc ('\n', asm_out_file);
4895 }
4896
4897 /* Output the .debug_abbrev section which defines the DIE abbreviation
4898    table.  */
4899
4900 static void
4901 output_abbrev_section ()
4902 {
4903   unsigned long abbrev_id;
4904
4905   dw_attr_ref a_attr;
4906   for (abbrev_id = 1; abbrev_id < abbrev_die_table_in_use; ++abbrev_id)
4907     {
4908       register dw_die_ref abbrev = abbrev_die_table[abbrev_id];
4909
4910       output_uleb128 (abbrev_id);
4911       if (flag_debug_asm)
4912         fprintf (asm_out_file, " (abbrev code)");
4913
4914       fputc ('\n', asm_out_file);
4915       output_uleb128 (abbrev->die_tag);
4916       if (flag_debug_asm)
4917         fprintf (asm_out_file, " (TAG: %s)",
4918                  dwarf_tag_name (abbrev->die_tag));
4919
4920       fputc ('\n', asm_out_file);
4921       fprintf (asm_out_file, "\t%s\t0x%x", ASM_BYTE_OP,
4922                abbrev->die_child != NULL ? DW_children_yes : DW_children_no);
4923
4924       if (flag_debug_asm)
4925         fprintf (asm_out_file, "\t%s %s",
4926                  ASM_COMMENT_START,
4927                  (abbrev->die_child != NULL
4928                   ? "DW_children_yes" : "DW_children_no"));
4929
4930       fputc ('\n', asm_out_file);
4931
4932       for (a_attr = abbrev->die_attr; a_attr != NULL;
4933            a_attr = a_attr->dw_attr_next)
4934         {
4935           output_uleb128 (a_attr->dw_attr);
4936           if (flag_debug_asm)
4937             fprintf (asm_out_file, " (%s)",
4938                      dwarf_attr_name (a_attr->dw_attr));
4939
4940           fputc ('\n', asm_out_file);
4941           output_value_format (a_attr);
4942         }
4943
4944       fprintf (asm_out_file, "\t%s\t0,0\n", ASM_BYTE_OP);
4945     }
4946
4947   /* Terminate the table.  */
4948   fprintf (asm_out_file, "\t%s\t0\n", ASM_BYTE_OP);
4949 }
4950
4951 /* Output location description stack opcode's operands (if any).  */
4952
4953 static void
4954 output_loc_operands (loc)
4955      register dw_loc_descr_ref loc;
4956 {
4957   register dw_val_ref val1 = &loc->dw_loc_oprnd1;
4958   register dw_val_ref val2 = &loc->dw_loc_oprnd2;
4959
4960   switch (loc->dw_loc_opc)
4961     {
4962     case DW_OP_addr:
4963       ASM_OUTPUT_DWARF_ADDR_CONST (asm_out_file, val1->v.val_addr);
4964       fputc ('\n', asm_out_file);
4965       break;
4966     case DW_OP_const1u:
4967     case DW_OP_const1s:
4968       ASM_OUTPUT_DWARF_DATA1 (asm_out_file, val1->v.val_flag);
4969       fputc ('\n', asm_out_file);
4970       break;
4971     case DW_OP_const2u:
4972     case DW_OP_const2s:
4973       ASM_OUTPUT_DWARF_DATA2 (asm_out_file, val1->v.val_int);
4974       fputc ('\n', asm_out_file);
4975       break;
4976     case DW_OP_const4u:
4977     case DW_OP_const4s:
4978       ASM_OUTPUT_DWARF_DATA4 (asm_out_file, val1->v.val_int);
4979       fputc ('\n', asm_out_file);
4980       break;
4981     case DW_OP_const8u:
4982     case DW_OP_const8s:
4983       abort ();
4984       fputc ('\n', asm_out_file);
4985       break;
4986     case DW_OP_constu:
4987       output_uleb128 (val1->v.val_unsigned);
4988       fputc ('\n', asm_out_file);
4989       break;
4990     case DW_OP_consts:
4991       output_sleb128 (val1->v.val_int);
4992       fputc ('\n', asm_out_file);
4993       break;
4994     case DW_OP_pick:
4995       ASM_OUTPUT_DWARF_DATA1 (asm_out_file, val1->v.val_int);
4996       fputc ('\n', asm_out_file);
4997       break;
4998     case DW_OP_plus_uconst:
4999       output_uleb128 (val1->v.val_unsigned);
5000       fputc ('\n', asm_out_file);
5001       break;
5002     case DW_OP_skip:
5003     case DW_OP_bra:
5004       ASM_OUTPUT_DWARF_DATA2 (asm_out_file, val1->v.val_int);
5005       fputc ('\n', asm_out_file);
5006       break;
5007     case DW_OP_breg0:
5008     case DW_OP_breg1:
5009     case DW_OP_breg2:
5010     case DW_OP_breg3:
5011     case DW_OP_breg4:
5012     case DW_OP_breg5:
5013     case DW_OP_breg6:
5014     case DW_OP_breg7:
5015     case DW_OP_breg8:
5016     case DW_OP_breg9:
5017     case DW_OP_breg10:
5018     case DW_OP_breg11:
5019     case DW_OP_breg12:
5020     case DW_OP_breg13:
5021     case DW_OP_breg14:
5022     case DW_OP_breg15:
5023     case DW_OP_breg16:
5024     case DW_OP_breg17:
5025     case DW_OP_breg18:
5026     case DW_OP_breg19:
5027     case DW_OP_breg20:
5028     case DW_OP_breg21:
5029     case DW_OP_breg22:
5030     case DW_OP_breg23:
5031     case DW_OP_breg24:
5032     case DW_OP_breg25:
5033     case DW_OP_breg26:
5034     case DW_OP_breg27:
5035     case DW_OP_breg28:
5036     case DW_OP_breg29:
5037     case DW_OP_breg30:
5038     case DW_OP_breg31:
5039       output_sleb128 (val1->v.val_int);
5040       fputc ('\n', asm_out_file);
5041       break;
5042     case DW_OP_regx:
5043       output_uleb128 (val1->v.val_unsigned);
5044       fputc ('\n', asm_out_file);
5045       break;
5046     case DW_OP_fbreg:
5047       output_sleb128 (val1->v.val_int);
5048       fputc ('\n', asm_out_file);
5049       break;
5050     case DW_OP_bregx:
5051       output_uleb128 (val1->v.val_unsigned);
5052       fputc ('\n', asm_out_file);
5053       output_sleb128 (val2->v.val_int);
5054       fputc ('\n', asm_out_file);
5055       break;
5056     case DW_OP_piece:
5057       output_uleb128 (val1->v.val_unsigned);
5058       fputc ('\n', asm_out_file);
5059       break;
5060     case DW_OP_deref_size:
5061     case DW_OP_xderef_size:
5062       ASM_OUTPUT_DWARF_DATA1 (asm_out_file, val1->v.val_flag);
5063       fputc ('\n', asm_out_file);
5064       break;
5065     default:
5066       break;
5067     }
5068 }
5069
5070 /* Output the DIE and its attributes.  Called recursively to generate
5071    the definitions of each child DIE.  */
5072
5073 static void
5074 output_die (die)
5075      register dw_die_ref die;
5076 {
5077   register dw_attr_ref a;
5078   register dw_die_ref c;
5079   register unsigned long size;
5080   register dw_loc_descr_ref loc;
5081
5082   output_uleb128 (die->die_abbrev);
5083   if (flag_debug_asm)
5084     fprintf (asm_out_file, " (DIE (0x%lx) %s)",
5085              die->die_offset, dwarf_tag_name (die->die_tag));
5086
5087   fputc ('\n', asm_out_file);
5088
5089   for (a = die->die_attr; a != NULL; a = a->dw_attr_next)
5090     {
5091       switch (AT_class (a))
5092         {
5093         case dw_val_class_addr:
5094           ASM_OUTPUT_DWARF_ADDR_CONST (asm_out_file, AT_addr (a));
5095           break;
5096
5097         case dw_val_class_loc:
5098           size = size_of_locs (AT_loc (a));
5099
5100           /* Output the block length for this list of location operations.  */
5101           switch (constant_size (size))
5102             {
5103             case 1:
5104               ASM_OUTPUT_DWARF_DATA1 (asm_out_file, size);
5105               break;
5106             case 2:
5107               ASM_OUTPUT_DWARF_DATA2 (asm_out_file, size);
5108               break;
5109             default:
5110               abort ();
5111             }
5112
5113           if (flag_debug_asm)
5114             fprintf (asm_out_file, "\t%s %s",
5115                      ASM_COMMENT_START, dwarf_attr_name (a->dw_attr));
5116
5117           fputc ('\n', asm_out_file);
5118           for (loc = AT_loc (a); loc != NULL; loc = loc->dw_loc_next)
5119             {
5120               /* Output the opcode.  */
5121               ASM_OUTPUT_DWARF_DATA1 (asm_out_file, loc->dw_loc_opc);
5122               if (flag_debug_asm)
5123                 fprintf (asm_out_file, "\t%s %s", ASM_COMMENT_START,
5124                          dwarf_stack_op_name (loc->dw_loc_opc));
5125
5126               fputc ('\n', asm_out_file);
5127
5128               /* Output the operand(s) (if any).  */
5129               output_loc_operands (loc);
5130             }
5131           break;
5132
5133         case dw_val_class_const:
5134           ASM_OUTPUT_DWARF_DATA4 (asm_out_file, AT_int (a));
5135           break;
5136
5137         case dw_val_class_unsigned_const:
5138           switch (constant_size (AT_unsigned (a)))
5139             {
5140             case 1:
5141               ASM_OUTPUT_DWARF_DATA1 (asm_out_file, AT_unsigned (a));
5142               break;
5143             case 2:
5144               ASM_OUTPUT_DWARF_DATA2 (asm_out_file, AT_unsigned (a));
5145               break;
5146             case 4:
5147               ASM_OUTPUT_DWARF_DATA4 (asm_out_file, AT_unsigned (a));
5148               break;
5149             case 8:
5150               ASM_OUTPUT_DWARF_DATA8 (asm_out_file,
5151                                       a->dw_attr_val.v.val_long_long.hi,
5152                                       a->dw_attr_val.v.val_long_long.low);
5153               break;
5154             default:
5155               abort ();
5156             }
5157           break;
5158
5159         case dw_val_class_long_long:
5160           ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 8);
5161           if (flag_debug_asm)
5162             fprintf (asm_out_file, "\t%s %s",
5163                    ASM_COMMENT_START, dwarf_attr_name (a->dw_attr));
5164
5165           fputc ('\n', asm_out_file);
5166           ASM_OUTPUT_DWARF_DATA8 (asm_out_file,
5167                                   a->dw_attr_val.v.val_long_long.hi,
5168                                   a->dw_attr_val.v.val_long_long.low);
5169
5170           if (flag_debug_asm)
5171             fprintf (asm_out_file,
5172                      "\t%s long long constant", ASM_COMMENT_START);
5173           
5174           fputc ('\n', asm_out_file);
5175           break;
5176
5177         case dw_val_class_float:
5178           {
5179             register unsigned int i;
5180             ASM_OUTPUT_DWARF_DATA1 (asm_out_file,
5181                                     a->dw_attr_val.v.val_float.length * 4);
5182             if (flag_debug_asm)
5183               fprintf (asm_out_file, "\t%s %s",
5184                        ASM_COMMENT_START, dwarf_attr_name (a->dw_attr));
5185
5186             fputc ('\n', asm_out_file);
5187             for (i = 0; i < a->dw_attr_val.v.val_float.length; ++i)
5188               {
5189                 ASM_OUTPUT_DWARF_DATA4 (asm_out_file,
5190                                         a->dw_attr_val.v.val_float.array[i]);
5191                 if (flag_debug_asm)
5192                   fprintf (asm_out_file, "\t%s fp constant word %u",
5193                            ASM_COMMENT_START, i);
5194
5195                 fputc ('\n', asm_out_file);
5196               }
5197           break;
5198           }
5199
5200         case dw_val_class_flag:
5201           ASM_OUTPUT_DWARF_DATA1 (asm_out_file, AT_flag (a));
5202           break;
5203
5204         case dw_val_class_die_ref:
5205           ASM_OUTPUT_DWARF_DATA (asm_out_file, AT_ref (a)->die_offset);
5206           break;
5207
5208         case dw_val_class_fde_ref:
5209           {
5210             char l1[20];
5211             ASM_GENERATE_INTERNAL_LABEL
5212               (l1, FDE_AFTER_SIZE_LABEL, a->dw_attr_val.v.val_fde_index * 2);
5213             ASM_OUTPUT_DWARF_OFFSET (asm_out_file, l1);
5214             fprintf (asm_out_file, " - %d", DWARF_OFFSET_SIZE);
5215           }
5216           break;
5217
5218         case dw_val_class_lbl_id:
5219           ASM_OUTPUT_DWARF_ADDR (asm_out_file, AT_lbl (a));
5220           break;
5221
5222         case dw_val_class_lbl_offset:
5223           ASM_OUTPUT_DWARF_OFFSET (asm_out_file, AT_lbl (a));
5224           break;
5225
5226         case dw_val_class_str:
5227           if (flag_debug_asm)
5228             ASM_OUTPUT_DWARF_STRING (asm_out_file, AT_string (a));
5229           else
5230             ASM_OUTPUT_ASCII (asm_out_file, AT_string (a),
5231                               (int) strlen (AT_string (a)) + 1);
5232           break;
5233
5234         default:
5235           abort ();
5236         }
5237
5238       if (AT_class (a) != dw_val_class_loc
5239           && AT_class (a) != dw_val_class_long_long
5240           && AT_class (a) != dw_val_class_float)
5241         {
5242           if (flag_debug_asm)
5243             fprintf (asm_out_file, "\t%s %s",
5244                      ASM_COMMENT_START, dwarf_attr_name (a->dw_attr));
5245
5246           fputc ('\n', asm_out_file);
5247         }
5248     }
5249
5250   for (c = die->die_child; c != NULL; c = c->die_sib)
5251     output_die (c);
5252
5253   if (die->die_child != NULL)
5254     {
5255       /* Add null byte to terminate sibling list. */
5256       ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 0);
5257       if (flag_debug_asm)
5258         fprintf (asm_out_file, "\t%s end of children of DIE 0x%lx",
5259                  ASM_COMMENT_START, die->die_offset);
5260
5261       fputc ('\n', asm_out_file);
5262     }
5263 }
5264
5265 /* Output the compilation unit that appears at the beginning of the
5266    .debug_info section, and precedes the DIE descriptions.  */
5267
5268 static void
5269 output_compilation_unit_header ()
5270 {
5271   ASM_OUTPUT_DWARF_DATA (asm_out_file, next_die_offset - DWARF_OFFSET_SIZE);
5272   if (flag_debug_asm)
5273     fprintf (asm_out_file, "\t%s Length of Compilation Unit Info.",
5274              ASM_COMMENT_START);
5275
5276   fputc ('\n', asm_out_file);
5277   ASM_OUTPUT_DWARF_DATA2 (asm_out_file, DWARF_VERSION);
5278   if (flag_debug_asm)
5279     fprintf (asm_out_file, "\t%s DWARF version number", ASM_COMMENT_START);
5280
5281   fputc ('\n', asm_out_file);
5282   ASM_OUTPUT_DWARF_OFFSET (asm_out_file, abbrev_section_label);
5283   if (flag_debug_asm)
5284     fprintf (asm_out_file, "\t%s Offset Into Abbrev. Section",
5285              ASM_COMMENT_START);
5286
5287   fputc ('\n', asm_out_file);
5288   ASM_OUTPUT_DWARF_DATA1 (asm_out_file, PTR_SIZE);
5289   if (flag_debug_asm)
5290     fprintf (asm_out_file, "\t%s Pointer Size (in bytes)", ASM_COMMENT_START);
5291
5292   fputc ('\n', asm_out_file);
5293 }
5294
5295 /* The DWARF2 pubname for a nested thingy looks like "A::f".  The output
5296    of decl_printable_name for C++ looks like "A::f(int)".  Let's drop the
5297    argument list, and maybe the scope.  */
5298
5299 static const char *
5300 dwarf2_name (decl, scope)
5301      tree decl;
5302      int scope;
5303 {
5304   return (*decl_printable_name) (decl, scope ? 1 : 0);
5305 }
5306
5307 /* Add a new entry to .debug_pubnames if appropriate.  */
5308
5309 static void
5310 add_pubname (decl, die)
5311      tree decl;
5312      dw_die_ref die;
5313 {
5314   pubname_ref p;
5315
5316   if (! TREE_PUBLIC (decl))
5317     return;
5318
5319   if (pubname_table_in_use == pubname_table_allocated)
5320     {
5321       pubname_table_allocated += PUBNAME_TABLE_INCREMENT;
5322       pubname_table = (pubname_ref) xrealloc
5323         (pubname_table, pubname_table_allocated * sizeof (pubname_entry));
5324     }
5325
5326   p = &pubname_table[pubname_table_in_use++];
5327   p->die = die;
5328
5329   p->name = xstrdup (dwarf2_name (decl, 1));
5330 }
5331
5332 /* Output the public names table used to speed up access to externally
5333    visible names.  For now, only generate entries for externally
5334    visible procedures.  */
5335
5336 static void
5337 output_pubnames ()
5338 {
5339   register unsigned i;
5340   register unsigned long pubnames_length = size_of_pubnames ();
5341
5342   ASM_OUTPUT_DWARF_DATA (asm_out_file, pubnames_length);
5343
5344   if (flag_debug_asm)
5345     fprintf (asm_out_file, "\t%s Length of Public Names Info.",
5346              ASM_COMMENT_START);
5347
5348   fputc ('\n', asm_out_file);
5349   ASM_OUTPUT_DWARF_DATA2 (asm_out_file, DWARF_VERSION);
5350
5351   if (flag_debug_asm)
5352     fprintf (asm_out_file, "\t%s DWARF Version", ASM_COMMENT_START);
5353
5354   fputc ('\n', asm_out_file);
5355   ASM_OUTPUT_DWARF_OFFSET (asm_out_file, debug_info_section_label);
5356   if (flag_debug_asm)
5357     fprintf (asm_out_file, "\t%s Offset of Compilation Unit Info.",
5358              ASM_COMMENT_START);
5359
5360   fputc ('\n', asm_out_file);
5361   ASM_OUTPUT_DWARF_DATA (asm_out_file, next_die_offset);
5362   if (flag_debug_asm)
5363     fprintf (asm_out_file, "\t%s Compilation Unit Length", ASM_COMMENT_START);
5364
5365   fputc ('\n', asm_out_file);
5366   for (i = 0; i < pubname_table_in_use; ++i)
5367     {
5368       register pubname_ref pub = &pubname_table[i];
5369
5370       ASM_OUTPUT_DWARF_DATA (asm_out_file, pub->die->die_offset);
5371       if (flag_debug_asm)
5372         fprintf (asm_out_file, "\t%s DIE offset", ASM_COMMENT_START);
5373
5374       fputc ('\n', asm_out_file);
5375
5376       if (flag_debug_asm)
5377         {
5378           ASM_OUTPUT_DWARF_STRING (asm_out_file, pub->name);
5379           fprintf (asm_out_file, "%s external name", ASM_COMMENT_START);
5380         }
5381       else
5382         {
5383           ASM_OUTPUT_ASCII (asm_out_file, pub->name,
5384                             (int) strlen (pub->name) + 1);
5385         }
5386
5387       fputc ('\n', asm_out_file);
5388     }
5389
5390   ASM_OUTPUT_DWARF_DATA (asm_out_file, 0);
5391   fputc ('\n', asm_out_file);
5392 }
5393
5394 /* Add a new entry to .debug_aranges if appropriate.  */
5395
5396 static void
5397 add_arange (decl, die)
5398      tree decl;
5399      dw_die_ref die;
5400 {
5401   if (! DECL_SECTION_NAME (decl))
5402     return;
5403
5404   if (arange_table_in_use == arange_table_allocated)
5405     {
5406       arange_table_allocated += ARANGE_TABLE_INCREMENT;
5407       arange_table
5408         = (arange_ref) xrealloc (arange_table,
5409                                  arange_table_allocated * sizeof (dw_die_ref));
5410     }
5411
5412   arange_table[arange_table_in_use++] = die;
5413 }
5414
5415 /* Output the information that goes into the .debug_aranges table.
5416    Namely, define the beginning and ending address range of the
5417    text section generated for this compilation unit.  */
5418
5419 static void
5420 output_aranges ()
5421 {
5422   register unsigned i;
5423   register unsigned long aranges_length = size_of_aranges ();
5424
5425   ASM_OUTPUT_DWARF_DATA (asm_out_file, aranges_length);
5426   if (flag_debug_asm)
5427     fprintf (asm_out_file, "\t%s Length of Address Ranges Info.",
5428              ASM_COMMENT_START);
5429
5430   fputc ('\n', asm_out_file);
5431   ASM_OUTPUT_DWARF_DATA2 (asm_out_file, DWARF_VERSION);
5432   if (flag_debug_asm)
5433     fprintf (asm_out_file, "\t%s DWARF Version", ASM_COMMENT_START);
5434
5435   fputc ('\n', asm_out_file);
5436   ASM_OUTPUT_DWARF_OFFSET (asm_out_file, debug_info_section_label);
5437   if (flag_debug_asm)
5438     fprintf (asm_out_file, "\t%s Offset of Compilation Unit Info.",
5439              ASM_COMMENT_START);
5440
5441   fputc ('\n', asm_out_file);
5442   ASM_OUTPUT_DWARF_DATA1 (asm_out_file, PTR_SIZE);
5443   if (flag_debug_asm)
5444     fprintf (asm_out_file, "\t%s Size of Address", ASM_COMMENT_START);
5445
5446   fputc ('\n', asm_out_file);
5447   ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 0);
5448   if (flag_debug_asm)
5449     fprintf (asm_out_file, "\t%s Size of Segment Descriptor",
5450              ASM_COMMENT_START);
5451
5452   fputc ('\n', asm_out_file);
5453   /* We need to align to twice the pointer size here.
5454      If DWARF_OFFSET_SIZE == 4, then we have emitted 12 bytes, and need 4
5455      bytes of padding to align for either 4 or 8 byte pointers.  */
5456   ASM_OUTPUT_DWARF_DATA4 (asm_out_file, 0);
5457   /* If DWARF_OFFSET_SIZE == 8, then we have emitted 20 bytes, and need 12
5458      bytes of padding to align for 8 byte pointers.  We have already emitted
5459      4 bytes of padding, so emit 8 more here.  */
5460   if (DWARF_OFFSET_SIZE == 8)
5461     fprintf (asm_out_file, ",0,0");
5462
5463   if (flag_debug_asm)
5464     fprintf (asm_out_file, "\t%s Pad to %d byte boundary",
5465              ASM_COMMENT_START, 2 * PTR_SIZE);
5466
5467   fputc ('\n', asm_out_file);
5468   ASM_OUTPUT_DWARF_ADDR (asm_out_file, text_section_label);
5469   if (flag_debug_asm)
5470     fprintf (asm_out_file, "\t%s Address", ASM_COMMENT_START);
5471
5472   fputc ('\n', asm_out_file);
5473   ASM_OUTPUT_DWARF_ADDR_DELTA (asm_out_file, text_end_label,
5474                                text_section_label);
5475   if (flag_debug_asm)
5476     fprintf (asm_out_file, "%s Length", ASM_COMMENT_START);
5477
5478   fputc ('\n', asm_out_file);
5479   for (i = 0; i < arange_table_in_use; ++i)
5480     {
5481       dw_die_ref die = arange_table[i];
5482
5483       if (die->die_tag == DW_TAG_subprogram)
5484         ASM_OUTPUT_DWARF_ADDR (asm_out_file, get_AT_low_pc (die));
5485       else
5486         {
5487           /* A static variable; extract the symbol from DW_AT_location.
5488              Note that this code isn't currently hit, as we only emit
5489              aranges for functions (jason 9/23/99).  */
5490
5491           dw_attr_ref a = get_AT (die, DW_AT_location);
5492           dw_loc_descr_ref loc;
5493           if (! a || AT_class (a) != dw_val_class_loc)
5494             abort ();
5495
5496           loc = AT_loc (a);
5497           if (loc->dw_loc_opc != DW_OP_addr)
5498             abort ();
5499
5500           ASM_OUTPUT_DWARF_ADDR (asm_out_file, loc->dw_loc_oprnd1.v.val_addr);
5501         }
5502
5503       if (flag_debug_asm)
5504         fprintf (asm_out_file, "\t%s Address", ASM_COMMENT_START);
5505
5506       fputc ('\n', asm_out_file);
5507       if (die->die_tag == DW_TAG_subprogram)
5508         ASM_OUTPUT_DWARF_ADDR_DELTA (asm_out_file, get_AT_hi_pc (die),
5509                                      get_AT_low_pc (die));
5510       else
5511         ASM_OUTPUT_DWARF_ADDR_DATA (asm_out_file,
5512                                     get_AT_unsigned (die, DW_AT_byte_size));
5513
5514       if (flag_debug_asm)
5515         fprintf (asm_out_file, "%s Length", ASM_COMMENT_START);
5516
5517       fputc ('\n', asm_out_file);
5518     }
5519
5520   /* Output the terminator words.  */
5521   ASM_OUTPUT_DWARF_ADDR_DATA (asm_out_file, 0);
5522   fputc ('\n', asm_out_file);
5523   ASM_OUTPUT_DWARF_ADDR_DATA (asm_out_file, 0);
5524   fputc ('\n', asm_out_file);
5525 }
5526
5527 /* Output the source line number correspondence information.  This
5528    information goes into the .debug_line section.  */
5529
5530 static void
5531 output_line_info ()
5532 {
5533   char line_label[MAX_ARTIFICIAL_LABEL_BYTES];
5534   char prev_line_label[MAX_ARTIFICIAL_LABEL_BYTES];
5535   register unsigned opc;
5536   register unsigned n_op_args;
5537   register unsigned long ft_index;
5538   register unsigned long lt_index;
5539   register unsigned long current_line;
5540   register long line_offset;
5541   register long line_delta;
5542   register unsigned long current_file;
5543   register unsigned long function;
5544
5545   ASM_OUTPUT_DWARF_DELTA (asm_out_file, ".LTEND", ".LTSTART");
5546   if (flag_debug_asm)
5547     fprintf (asm_out_file, "\t%s Length of Source Line Info.",
5548              ASM_COMMENT_START);
5549
5550   fputc ('\n', asm_out_file);
5551   ASM_OUTPUT_LABEL (asm_out_file, ".LTSTART");
5552   ASM_OUTPUT_DWARF_DATA2 (asm_out_file, DWARF_VERSION);
5553   if (flag_debug_asm)
5554     fprintf (asm_out_file, "\t%s DWARF Version", ASM_COMMENT_START);
5555
5556   fputc ('\n', asm_out_file);
5557   ASM_OUTPUT_DWARF_DATA (asm_out_file, size_of_line_prolog ());
5558   if (flag_debug_asm)
5559     fprintf (asm_out_file, "\t%s Prolog Length", ASM_COMMENT_START);
5560
5561   fputc ('\n', asm_out_file);
5562   ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DWARF_LINE_MIN_INSTR_LENGTH);
5563   if (flag_debug_asm)
5564     fprintf (asm_out_file, "\t%s Minimum Instruction Length",
5565              ASM_COMMENT_START);
5566
5567   fputc ('\n', asm_out_file);
5568   ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DWARF_LINE_DEFAULT_IS_STMT_START);
5569   if (flag_debug_asm)
5570     fprintf (asm_out_file, "\t%s Default is_stmt_start flag",
5571              ASM_COMMENT_START);
5572
5573   fputc ('\n', asm_out_file);
5574   fprintf (asm_out_file, "\t%s\t%d", ASM_BYTE_OP, DWARF_LINE_BASE);
5575   if (flag_debug_asm)
5576     fprintf (asm_out_file, "\t%s Line Base Value (Special Opcodes)",
5577              ASM_COMMENT_START);
5578
5579   fputc ('\n', asm_out_file);
5580   fprintf (asm_out_file, "\t%s\t%u", ASM_BYTE_OP, DWARF_LINE_RANGE);
5581   if (flag_debug_asm)
5582     fprintf (asm_out_file, "\t%s Line Range Value (Special Opcodes)",
5583              ASM_COMMENT_START);
5584
5585   fputc ('\n', asm_out_file);
5586   fprintf (asm_out_file, "\t%s\t%u", ASM_BYTE_OP, DWARF_LINE_OPCODE_BASE);
5587   if (flag_debug_asm)
5588     fprintf (asm_out_file, "\t%s Special Opcode Base", ASM_COMMENT_START);
5589
5590   fputc ('\n', asm_out_file);
5591   for (opc = 1; opc < DWARF_LINE_OPCODE_BASE; ++opc)
5592     {
5593       switch (opc)
5594         {
5595         case DW_LNS_advance_pc:
5596         case DW_LNS_advance_line:
5597         case DW_LNS_set_file:
5598         case DW_LNS_set_column:
5599         case DW_LNS_fixed_advance_pc:
5600           n_op_args = 1;
5601           break;
5602         default:
5603           n_op_args = 0;
5604           break;
5605         }
5606       ASM_OUTPUT_DWARF_DATA1 (asm_out_file, n_op_args);
5607       if (flag_debug_asm)
5608         fprintf (asm_out_file, "\t%s opcode: 0x%x has %d args",
5609                  ASM_COMMENT_START, opc, n_op_args);
5610       fputc ('\n', asm_out_file);
5611     }
5612
5613   if (flag_debug_asm)
5614     fprintf (asm_out_file, "%s Include Directory Table\n", ASM_COMMENT_START);
5615
5616   /* Include directory table is empty, at present */
5617   ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 0);
5618   fputc ('\n', asm_out_file);
5619   if (flag_debug_asm)
5620     fprintf (asm_out_file, "%s File Name Table\n", ASM_COMMENT_START);
5621
5622   for (ft_index = 1; ft_index < file_table_in_use; ++ft_index)
5623     {
5624       if (flag_debug_asm)
5625         {
5626           ASM_OUTPUT_DWARF_STRING (asm_out_file, file_table[ft_index]);
5627           fprintf (asm_out_file, "%s File Entry: 0x%lx",
5628                    ASM_COMMENT_START, ft_index);
5629         }
5630       else
5631         {
5632           ASM_OUTPUT_ASCII (asm_out_file,
5633                             file_table[ft_index],
5634                             (int) strlen (file_table[ft_index]) + 1);
5635         }
5636
5637       fputc ('\n', asm_out_file);
5638
5639       /* Include directory index */
5640       output_uleb128 (0);
5641       fputc ('\n', asm_out_file);
5642
5643       /* Modification time */
5644       output_uleb128 (0);
5645       fputc ('\n', asm_out_file);
5646
5647       /* File length in bytes */
5648       output_uleb128 (0);
5649       fputc ('\n', asm_out_file);
5650     }
5651
5652   /* Terminate the file name table */
5653   ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 0);
5654   fputc ('\n', asm_out_file);
5655
5656   /* We used to set the address register to the first location in the text
5657      section here, but that didn't accomplish anything since we already
5658      have a line note for the opening brace of the first function.  */
5659
5660   /* Generate the line number to PC correspondence table, encoded as
5661      a series of state machine operations.  */
5662   current_file = 1;
5663   current_line = 1;
5664   strcpy (prev_line_label, text_section_label);
5665   for (lt_index = 1; lt_index < line_info_table_in_use; ++lt_index)
5666     {
5667       register dw_line_info_ref line_info = &line_info_table[lt_index];
5668
5669       /* Don't emit anything for redundant notes.  Just updating the
5670          address doesn't accomplish anything, because we already assume
5671          that anything after the last address is this line.  */
5672       if (line_info->dw_line_num == current_line
5673           && line_info->dw_file_num == current_file)
5674         continue;
5675
5676       /* Emit debug info for the address of the current line, choosing
5677          the encoding that uses the least amount of space.  */
5678       /* ??? Unfortunately, we have little choice here currently, and must
5679          always use the most general form.  Gcc does not know the address
5680          delta itself, so we can't use DW_LNS_advance_pc.  There are no known
5681          dwarf2 aware assemblers at this time, so we can't use any special
5682          pseudo ops that would allow the assembler to optimally encode this for
5683          us.  Many ports do have length attributes which will give an upper
5684          bound on the address range.  We could perhaps use length attributes
5685          to determine when it is safe to use DW_LNS_fixed_advance_pc.  */
5686       ASM_GENERATE_INTERNAL_LABEL (line_label, LINE_CODE_LABEL, lt_index);
5687       if (0)
5688         {
5689           /* This can handle deltas up to 0xffff.  This takes 3 bytes.  */
5690           ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNS_fixed_advance_pc);
5691           if (flag_debug_asm)
5692             fprintf (asm_out_file, "\t%s DW_LNS_fixed_advance_pc",
5693                      ASM_COMMENT_START);
5694
5695           fputc ('\n', asm_out_file);
5696           ASM_OUTPUT_DWARF_DELTA2 (asm_out_file, line_label, prev_line_label);
5697           fputc ('\n', asm_out_file);
5698         }
5699       else
5700         {
5701           /* This can handle any delta.  This takes 4+PTR_SIZE bytes.  */
5702           ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 0);
5703           if (flag_debug_asm)
5704             fprintf (asm_out_file, "\t%s DW_LNE_set_address",
5705                      ASM_COMMENT_START);
5706           fputc ('\n', asm_out_file);
5707           output_uleb128 (1 + PTR_SIZE);
5708           fputc ('\n', asm_out_file);
5709           ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNE_set_address);
5710           fputc ('\n', asm_out_file);
5711           ASM_OUTPUT_DWARF_ADDR (asm_out_file, line_label);
5712           fputc ('\n', asm_out_file);
5713         }
5714       strcpy (prev_line_label, line_label);
5715
5716       /* Emit debug info for the source file of the current line, if
5717          different from the previous line.  */
5718       if (line_info->dw_file_num != current_file)
5719         {
5720           current_file = line_info->dw_file_num;
5721           ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNS_set_file);
5722           if (flag_debug_asm)
5723             fprintf (asm_out_file, "\t%s DW_LNS_set_file", ASM_COMMENT_START);
5724
5725           fputc ('\n', asm_out_file);
5726           output_uleb128 (current_file);
5727           if (flag_debug_asm)
5728             fprintf (asm_out_file, " (\"%s\")", file_table[current_file]);
5729
5730           fputc ('\n', asm_out_file);
5731         }
5732
5733       /* Emit debug info for the current line number, choosing the encoding
5734          that uses the least amount of space.  */
5735       if (line_info->dw_line_num != current_line)
5736         {
5737           line_offset = line_info->dw_line_num - current_line;
5738           line_delta = line_offset - DWARF_LINE_BASE;
5739           current_line = line_info->dw_line_num;
5740           if (line_delta >= 0 && line_delta < (DWARF_LINE_RANGE - 1))
5741             {
5742               /* This can handle deltas from -10 to 234, using the current
5743                  definitions of DWARF_LINE_BASE and DWARF_LINE_RANGE.  This
5744                  takes 1 byte.  */
5745               ASM_OUTPUT_DWARF_DATA1 (asm_out_file,
5746                                       DWARF_LINE_OPCODE_BASE + line_delta);
5747               if (flag_debug_asm)
5748                 fprintf (asm_out_file,
5749                          "\t%s line %ld", ASM_COMMENT_START, current_line);
5750
5751               fputc ('\n', asm_out_file);
5752             }
5753           else
5754             {
5755               /* This can handle any delta.  This takes at least 4 bytes,
5756                  depending on the value being encoded.  */
5757               ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNS_advance_line);
5758               if (flag_debug_asm)
5759                 fprintf (asm_out_file, "\t%s advance to line %ld",
5760                          ASM_COMMENT_START, current_line);
5761
5762               fputc ('\n', asm_out_file);
5763               output_sleb128 (line_offset);
5764               fputc ('\n', asm_out_file);
5765               ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNS_copy);
5766               if (flag_debug_asm)
5767                 fprintf (asm_out_file, "\t%s DW_LNS_copy", ASM_COMMENT_START);
5768               fputc ('\n', asm_out_file);
5769             }
5770         }
5771       else
5772         {
5773           /* We still need to start a new row, so output a copy insn.  */
5774           ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNS_copy);
5775           if (flag_debug_asm)
5776             fprintf (asm_out_file, "\t%s DW_LNS_copy", ASM_COMMENT_START);
5777           fputc ('\n', asm_out_file);
5778         }
5779     }
5780
5781   /* Emit debug info for the address of the end of the function.  */
5782   if (0)
5783     {
5784       ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNS_fixed_advance_pc);
5785       if (flag_debug_asm)
5786         fprintf (asm_out_file, "\t%s DW_LNS_fixed_advance_pc",
5787                  ASM_COMMENT_START);
5788
5789       fputc ('\n', asm_out_file);
5790       ASM_OUTPUT_DWARF_DELTA2 (asm_out_file, text_end_label, prev_line_label);
5791       fputc ('\n', asm_out_file);
5792     }
5793   else
5794     {
5795       ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 0);
5796       if (flag_debug_asm)
5797         fprintf (asm_out_file, "\t%s DW_LNE_set_address", ASM_COMMENT_START);
5798       fputc ('\n', asm_out_file);
5799       output_uleb128 (1 + PTR_SIZE);
5800       fputc ('\n', asm_out_file);
5801       ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNE_set_address);
5802       fputc ('\n', asm_out_file);
5803       ASM_OUTPUT_DWARF_ADDR (asm_out_file, text_end_label);
5804       fputc ('\n', asm_out_file);
5805     }
5806
5807   /* Output the marker for the end of the line number info.  */
5808   ASM_OUTPUT_LABEL (asm_out_file, ".LTEND");
5809   ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 0);
5810   if (flag_debug_asm)
5811     fprintf (asm_out_file, "\t%s DW_LNE_end_sequence", ASM_COMMENT_START);
5812
5813   fputc ('\n', asm_out_file);
5814   output_uleb128 (1);
5815   fputc ('\n', asm_out_file);
5816   ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNE_end_sequence);
5817   fputc ('\n', asm_out_file);
5818
5819   function = 0;
5820   current_file = 1;
5821   current_line = 1;
5822   for (lt_index = 0; lt_index < separate_line_info_table_in_use; )
5823     {
5824       register dw_separate_line_info_ref line_info
5825         = &separate_line_info_table[lt_index];
5826
5827       /* Don't emit anything for redundant notes.  */
5828       if (line_info->dw_line_num == current_line
5829           && line_info->dw_file_num == current_file
5830           && line_info->function == function)
5831         goto cont;
5832
5833       /* Emit debug info for the address of the current line.  If this is
5834          a new function, or the first line of a function, then we need
5835          to handle it differently.  */
5836       ASM_GENERATE_INTERNAL_LABEL (line_label, SEPARATE_LINE_CODE_LABEL,
5837                                    lt_index);
5838       if (function != line_info->function)
5839         {
5840           function = line_info->function;
5841
5842           /* Set the address register to the first line in the function */
5843           ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 0);
5844           if (flag_debug_asm)
5845             fprintf (asm_out_file, "\t%s DW_LNE_set_address",
5846                      ASM_COMMENT_START);
5847
5848           fputc ('\n', asm_out_file);
5849           output_uleb128 (1 + PTR_SIZE);
5850           fputc ('\n', asm_out_file);
5851           ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNE_set_address);
5852           fputc ('\n', asm_out_file);
5853           ASM_OUTPUT_DWARF_ADDR (asm_out_file, line_label);
5854           fputc ('\n', asm_out_file);
5855         }
5856       else
5857         {
5858           /* ??? See the DW_LNS_advance_pc comment above.  */
5859           if (0)
5860             {
5861               ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNS_fixed_advance_pc);
5862               if (flag_debug_asm)
5863                 fprintf (asm_out_file, "\t%s DW_LNS_fixed_advance_pc",
5864                          ASM_COMMENT_START);
5865
5866               fputc ('\n', asm_out_file);
5867               ASM_OUTPUT_DWARF_DELTA2 (asm_out_file, line_label,
5868                                        prev_line_label);
5869               fputc ('\n', asm_out_file);
5870             }
5871           else
5872             {
5873               ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 0);
5874               if (flag_debug_asm)
5875                 fprintf (asm_out_file, "\t%s DW_LNE_set_address",
5876                          ASM_COMMENT_START);
5877               fputc ('\n', asm_out_file);
5878               output_uleb128 (1 + PTR_SIZE);
5879               fputc ('\n', asm_out_file);
5880               ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNE_set_address);
5881               fputc ('\n', asm_out_file);
5882               ASM_OUTPUT_DWARF_ADDR (asm_out_file, line_label);
5883               fputc ('\n', asm_out_file);
5884             }
5885         }
5886       strcpy (prev_line_label, line_label);
5887
5888       /* Emit debug info for the source file of the current line, if
5889          different from the previous line.  */
5890       if (line_info->dw_file_num != current_file)
5891         {
5892           current_file = line_info->dw_file_num;
5893           ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNS_set_file);
5894           if (flag_debug_asm)
5895             fprintf (asm_out_file, "\t%s DW_LNS_set_file", ASM_COMMENT_START);
5896
5897           fputc ('\n', asm_out_file);
5898           output_uleb128 (current_file);
5899           if (flag_debug_asm)
5900             fprintf (asm_out_file, " (\"%s\")", file_table[current_file]);
5901
5902           fputc ('\n', asm_out_file);
5903         }
5904
5905       /* Emit debug info for the current line number, choosing the encoding
5906          that uses the least amount of space.  */
5907       if (line_info->dw_line_num != current_line)
5908         {
5909           line_offset = line_info->dw_line_num - current_line;
5910           line_delta = line_offset - DWARF_LINE_BASE;
5911           current_line = line_info->dw_line_num;
5912           if (line_delta >= 0 && line_delta < (DWARF_LINE_RANGE - 1))
5913             {
5914               ASM_OUTPUT_DWARF_DATA1 (asm_out_file,
5915                                       DWARF_LINE_OPCODE_BASE + line_delta);
5916               if (flag_debug_asm)
5917                 fprintf (asm_out_file,
5918                          "\t%s line %ld", ASM_COMMENT_START, current_line);
5919
5920               fputc ('\n', asm_out_file);
5921             }
5922           else
5923             {
5924               ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNS_advance_line);
5925               if (flag_debug_asm)
5926                 fprintf (asm_out_file, "\t%s advance to line %ld",
5927                          ASM_COMMENT_START, current_line);
5928
5929               fputc ('\n', asm_out_file);
5930               output_sleb128 (line_offset);
5931               fputc ('\n', asm_out_file);
5932               ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNS_copy);
5933               if (flag_debug_asm)
5934                 fprintf (asm_out_file, "\t%s DW_LNS_copy", ASM_COMMENT_START);
5935               fputc ('\n', asm_out_file);
5936             }
5937         }
5938       else
5939         {
5940           /* We still need to start a new row, so output a copy insn.  */
5941           ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNS_copy);
5942           if (flag_debug_asm)
5943             fprintf (asm_out_file, "\t%s DW_LNS_copy", ASM_COMMENT_START);
5944           fputc ('\n', asm_out_file);
5945         }
5946
5947     cont:
5948       ++lt_index;
5949
5950       /* If we're done with a function, end its sequence.  */
5951       if (lt_index == separate_line_info_table_in_use
5952           || separate_line_info_table[lt_index].function != function)
5953         {
5954           current_file = 1;
5955           current_line = 1;
5956
5957           /* Emit debug info for the address of the end of the function.  */
5958           ASM_GENERATE_INTERNAL_LABEL (line_label, FUNC_END_LABEL, function);
5959           if (0)
5960             {
5961               ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNS_fixed_advance_pc);
5962               if (flag_debug_asm)
5963                 fprintf (asm_out_file, "\t%s DW_LNS_fixed_advance_pc",
5964                          ASM_COMMENT_START);
5965
5966               fputc ('\n', asm_out_file);
5967               ASM_OUTPUT_DWARF_DELTA2 (asm_out_file, line_label,
5968                                        prev_line_label);
5969               fputc ('\n', asm_out_file);
5970             }
5971           else
5972             {
5973               ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 0);
5974               if (flag_debug_asm)
5975                 fprintf (asm_out_file, "\t%s DW_LNE_set_address",
5976                          ASM_COMMENT_START);
5977               fputc ('\n', asm_out_file);
5978               output_uleb128 (1 + PTR_SIZE);
5979               fputc ('\n', asm_out_file);
5980               ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNE_set_address);
5981               fputc ('\n', asm_out_file);
5982               ASM_OUTPUT_DWARF_ADDR (asm_out_file, line_label);
5983               fputc ('\n', asm_out_file);
5984             }
5985
5986           /* Output the marker for the end of this sequence.  */
5987           ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 0);
5988           if (flag_debug_asm)
5989             fprintf (asm_out_file, "\t%s DW_LNE_end_sequence",
5990                      ASM_COMMENT_START);
5991
5992           fputc ('\n', asm_out_file);
5993           output_uleb128 (1);
5994           fputc ('\n', asm_out_file);
5995           ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNE_end_sequence);
5996           fputc ('\n', asm_out_file);
5997         }
5998     }
5999 }
6000 \f
6001 /* Given a pointer to a BLOCK node return non-zero if (and only if) the node
6002    in question represents the outermost pair of curly braces (i.e. the "body
6003    block") of a function or method.
6004
6005    For any BLOCK node representing a "body block" of a function or method, the
6006    BLOCK_SUPERCONTEXT of the node will point to another BLOCK node which
6007    represents the outermost (function) scope for the function or method (i.e.
6008    the one which includes the formal parameters).  The BLOCK_SUPERCONTEXT of
6009    *that* node in turn will point to the relevant FUNCTION_DECL node. */
6010
6011 static inline int
6012 is_body_block (stmt)
6013      register tree stmt;
6014 {
6015   if (TREE_CODE (stmt) == BLOCK)
6016     {
6017       register tree parent = BLOCK_SUPERCONTEXT (stmt);
6018
6019       if (TREE_CODE (parent) == BLOCK)
6020         {
6021           register tree grandparent = BLOCK_SUPERCONTEXT (parent);
6022
6023           if (TREE_CODE (grandparent) == FUNCTION_DECL)
6024             return 1;
6025         }
6026     }
6027
6028   return 0;
6029 }
6030
6031 /* Given a pointer to a tree node for some base type, return a pointer to
6032    a DIE that describes the given type.
6033
6034    This routine must only be called for GCC type nodes that correspond to
6035    Dwarf base (fundamental) types.  */
6036
6037 static dw_die_ref
6038 base_type_die (type)
6039      register tree type;
6040 {
6041   register dw_die_ref base_type_result;
6042   register const char *type_name;
6043   register enum dwarf_type encoding;
6044   register tree name = TYPE_NAME (type);
6045
6046   if (TREE_CODE (type) == ERROR_MARK
6047       || TREE_CODE (type) == VOID_TYPE)
6048     return 0;
6049
6050   if (name)
6051     {
6052       if (TREE_CODE (name) == TYPE_DECL)
6053         name = DECL_NAME (name);
6054
6055       type_name = IDENTIFIER_POINTER (name);
6056     }
6057   else
6058     type_name = "__unknown__";
6059
6060   switch (TREE_CODE (type))
6061     {
6062     case INTEGER_TYPE:
6063       /* Carefully distinguish the C character types, without messing
6064          up if the language is not C. Note that we check only for the names
6065          that contain spaces; other names might occur by coincidence in other 
6066          languages.  */
6067       if (! (TYPE_PRECISION (type) == CHAR_TYPE_SIZE
6068              && (type == char_type_node
6069                  || ! strcmp (type_name, "signed char")
6070                  || ! strcmp (type_name, "unsigned char"))))
6071         {
6072           if (TREE_UNSIGNED (type))
6073             encoding = DW_ATE_unsigned;
6074           else
6075             encoding = DW_ATE_signed;
6076           break;
6077         }
6078       /* else fall through */
6079
6080     case CHAR_TYPE:
6081       /* GNU Pascal/Ada CHAR type.  Not used in C.  */
6082       if (TREE_UNSIGNED (type))
6083         encoding = DW_ATE_unsigned_char;
6084       else
6085         encoding = DW_ATE_signed_char;
6086       break;
6087
6088     case REAL_TYPE:
6089       encoding = DW_ATE_float;
6090       break;
6091
6092       /* Dwarf2 doesn't know anything about complex ints, so use
6093          a user defined type for it.  */
6094     case COMPLEX_TYPE:
6095       if (TREE_CODE (TREE_TYPE (type)) == REAL_TYPE)
6096         encoding = DW_ATE_complex_float;
6097       else
6098         encoding = DW_ATE_lo_user;
6099       break;
6100
6101     case BOOLEAN_TYPE:
6102       /* GNU FORTRAN/Ada/C++ BOOLEAN type.  */
6103       encoding = DW_ATE_boolean;
6104       break;
6105
6106     default:
6107       abort (); /* No other TREE_CODEs are Dwarf fundamental types.  */
6108     }
6109
6110   base_type_result = new_die (DW_TAG_base_type, comp_unit_die);
6111   if (demangle_name_func)
6112     type_name = (*demangle_name_func) (type_name);
6113
6114   add_AT_string (base_type_result, DW_AT_name, type_name);
6115   add_AT_unsigned (base_type_result, DW_AT_byte_size,
6116                    int_size_in_bytes (type));
6117   add_AT_unsigned (base_type_result, DW_AT_encoding, encoding);
6118
6119   return base_type_result;
6120 }
6121
6122 /* Given a pointer to an arbitrary ..._TYPE tree node, return a pointer to
6123    the Dwarf "root" type for the given input type.  The Dwarf "root" type of
6124    a given type is generally the same as the given type, except that if the
6125    given type is a pointer or reference type, then the root type of the given
6126    type is the root type of the "basis" type for the pointer or reference
6127    type.  (This definition of the "root" type is recursive.) Also, the root
6128    type of a `const' qualified type or a `volatile' qualified type is the
6129    root type of the given type without the qualifiers.  */
6130
6131 static tree
6132 root_type (type)
6133      register tree type;
6134 {
6135   if (TREE_CODE (type) == ERROR_MARK)
6136     return error_mark_node;
6137
6138   switch (TREE_CODE (type))
6139     {
6140     case ERROR_MARK:
6141       return error_mark_node;
6142
6143     case POINTER_TYPE:
6144     case REFERENCE_TYPE:
6145       return type_main_variant (root_type (TREE_TYPE (type)));
6146
6147     default:
6148       return type_main_variant (type);
6149     }
6150 }
6151
6152 /* Given a pointer to an arbitrary ..._TYPE tree node, return non-zero if the
6153    given input type is a Dwarf "fundamental" type.  Otherwise return null.  */
6154
6155 static inline int
6156 is_base_type (type)
6157      register tree type;
6158 {
6159   switch (TREE_CODE (type))
6160     {
6161     case ERROR_MARK:
6162     case VOID_TYPE:
6163     case INTEGER_TYPE:
6164     case REAL_TYPE:
6165     case COMPLEX_TYPE:
6166     case BOOLEAN_TYPE:
6167     case CHAR_TYPE:
6168       return 1;
6169
6170     case SET_TYPE:
6171     case ARRAY_TYPE:
6172     case RECORD_TYPE:
6173     case UNION_TYPE:
6174     case QUAL_UNION_TYPE:
6175     case ENUMERAL_TYPE:
6176     case FUNCTION_TYPE:
6177     case METHOD_TYPE:
6178     case POINTER_TYPE:
6179     case REFERENCE_TYPE:
6180     case FILE_TYPE:
6181     case OFFSET_TYPE:
6182     case LANG_TYPE:
6183       return 0;
6184
6185     default:
6186       abort ();
6187     }
6188
6189   return 0;
6190 }
6191
6192 /* Given a pointer to an arbitrary ..._TYPE tree node, return a debugging
6193    entry that chains various modifiers in front of the given type.  */
6194
6195 static dw_die_ref
6196 modified_type_die (type, is_const_type, is_volatile_type, context_die)
6197      register tree type;
6198      register int is_const_type;
6199      register int is_volatile_type;
6200      register dw_die_ref context_die;
6201 {
6202   register enum tree_code code = TREE_CODE (type);
6203   register dw_die_ref mod_type_die = NULL;
6204   register dw_die_ref sub_die = NULL;
6205   register tree item_type = NULL;
6206
6207   if (code != ERROR_MARK)
6208     {
6209       type = build_type_variant (type, is_const_type, is_volatile_type);
6210
6211       mod_type_die = lookup_type_die (type);
6212       if (mod_type_die)
6213         return mod_type_die;
6214
6215       /* Handle C typedef types. */
6216       if (TYPE_NAME (type) && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
6217           && DECL_ORIGINAL_TYPE (TYPE_NAME (type)))
6218         {
6219           tree dtype = TREE_TYPE (TYPE_NAME (type));
6220           if (type == dtype)
6221             {
6222               /* For a named type, use the typedef.  */
6223               gen_type_die (type, context_die);
6224               mod_type_die = lookup_type_die (type);
6225             }
6226
6227           else if (is_const_type < TYPE_READONLY (dtype)
6228                    || is_volatile_type < TYPE_VOLATILE (dtype))
6229             /* cv-unqualified version of named type.  Just use the unnamed
6230                type to which it refers.  */
6231             mod_type_die
6232               = modified_type_die (DECL_ORIGINAL_TYPE (TYPE_NAME (type)),
6233                                    is_const_type, is_volatile_type,
6234                                    context_die);
6235           /* Else cv-qualified version of named type; fall through.  */
6236         }
6237
6238       if (mod_type_die)
6239         /* OK */;
6240       else if (is_const_type)
6241         {
6242           mod_type_die = new_die (DW_TAG_const_type, comp_unit_die);
6243           sub_die = modified_type_die (type, 0, is_volatile_type, context_die);
6244         }
6245       else if (is_volatile_type)
6246         {
6247           mod_type_die = new_die (DW_TAG_volatile_type, comp_unit_die);
6248           sub_die = modified_type_die (type, 0, 0, context_die);
6249         }
6250       else if (code == POINTER_TYPE)
6251         {
6252           mod_type_die = new_die (DW_TAG_pointer_type, comp_unit_die);
6253           add_AT_unsigned (mod_type_die, DW_AT_byte_size, PTR_SIZE);
6254 #if 0
6255           add_AT_unsigned (mod_type_die, DW_AT_address_class, 0);
6256 #endif
6257           item_type = TREE_TYPE (type);
6258         }
6259       else if (code == REFERENCE_TYPE)
6260         {
6261           mod_type_die = new_die (DW_TAG_reference_type, comp_unit_die);
6262           add_AT_unsigned (mod_type_die, DW_AT_byte_size, PTR_SIZE);
6263 #if 0
6264           add_AT_unsigned (mod_type_die, DW_AT_address_class, 0);
6265 #endif 
6266           item_type = TREE_TYPE (type);
6267         }
6268       else if (is_base_type (type))
6269         mod_type_die = base_type_die (type);
6270       else
6271         {
6272           gen_type_die (type, context_die);
6273
6274           /* We have to get the type_main_variant here (and pass that to the
6275              `lookup_type_die' routine) because the ..._TYPE node we have
6276              might simply be a *copy* of some original type node (where the
6277              copy was created to help us keep track of typedef names) and
6278              that copy might have a different TYPE_UID from the original
6279              ..._TYPE node.  */
6280           mod_type_die = lookup_type_die (type_main_variant (type));
6281           if (mod_type_die == NULL)
6282             abort ();
6283         }
6284     }
6285
6286   equate_type_number_to_die (type, mod_type_die);
6287   if (item_type)
6288     /* We must do this after the equate_type_number_to_die call, in case
6289        this is a recursive type.  This ensures that the modified_type_die
6290        recursion will terminate even if the type is recursive.  Recursive
6291        types are possible in Ada.  */
6292     sub_die = modified_type_die (item_type,
6293                                  TYPE_READONLY (item_type),
6294                                  TYPE_VOLATILE (item_type),
6295                                  context_die);
6296
6297   if (sub_die != NULL)
6298     add_AT_die_ref (mod_type_die, DW_AT_type, sub_die);
6299
6300   return mod_type_die;
6301 }
6302
6303 /* Given a pointer to an arbitrary ..._TYPE tree node, return true if it is
6304    an enumerated type.   */
6305
6306 static inline int
6307 type_is_enum (type)
6308      register tree type;
6309 {
6310   return TREE_CODE (type) == ENUMERAL_TYPE;
6311 }
6312
6313 /* Return a location descriptor that designates a machine register.  */
6314
6315 static dw_loc_descr_ref
6316 reg_loc_descriptor (rtl)
6317      register rtx rtl;
6318 {
6319   register dw_loc_descr_ref loc_result = NULL;
6320   register unsigned reg = reg_number (rtl);
6321
6322   if (reg <= 31)
6323     loc_result = new_loc_descr (DW_OP_reg0 + reg, 0, 0);
6324   else
6325     loc_result = new_loc_descr (DW_OP_regx, reg, 0);
6326
6327   return loc_result;
6328 }
6329
6330 /* Return a location descriptor that designates a base+offset location.  */
6331
6332 static dw_loc_descr_ref
6333 based_loc_descr (reg, offset)
6334      unsigned reg;
6335      long int offset;
6336 {
6337   register dw_loc_descr_ref loc_result;
6338   /* For the "frame base", we use the frame pointer or stack pointer
6339      registers, since the RTL for local variables is relative to one of
6340      them.  */
6341   register unsigned fp_reg = DBX_REGISTER_NUMBER (frame_pointer_needed
6342                                                   ? HARD_FRAME_POINTER_REGNUM
6343                                                   : STACK_POINTER_REGNUM);
6344
6345   if (reg == fp_reg)
6346     loc_result = new_loc_descr (DW_OP_fbreg, offset, 0);
6347   else if (reg <= 31)
6348     loc_result = new_loc_descr (DW_OP_breg0 + reg, offset, 0);
6349   else
6350     loc_result = new_loc_descr (DW_OP_bregx, reg, offset);
6351
6352   return loc_result;
6353 }
6354
6355 /* Return true if this RTL expression describes a base+offset calculation.  */
6356
6357 static inline int
6358 is_based_loc (rtl)
6359      register rtx rtl;
6360 {
6361     return (GET_CODE (rtl) == PLUS
6362             && ((GET_CODE (XEXP (rtl, 0)) == REG
6363                  && GET_CODE (XEXP (rtl, 1)) == CONST_INT)));
6364 }
6365
6366 /* The following routine converts the RTL for a variable or parameter
6367    (resident in memory) into an equivalent Dwarf representation of a
6368    mechanism for getting the address of that same variable onto the top of a
6369    hypothetical "address evaluation" stack.
6370
6371    When creating memory location descriptors, we are effectively transforming
6372    the RTL for a memory-resident object into its Dwarf postfix expression
6373    equivalent.  This routine recursively descends an RTL tree, turning
6374    it into Dwarf postfix code as it goes.
6375
6376    MODE is the mode of the memory reference, needed to handle some
6377    autoincrement addressing modes.  */
6378
6379 static dw_loc_descr_ref
6380 mem_loc_descriptor (rtl, mode)
6381      register rtx rtl;
6382      enum machine_mode mode;
6383 {
6384   dw_loc_descr_ref mem_loc_result = NULL;
6385   /* Note that for a dynamically sized array, the location we will generate a 
6386      description of here will be the lowest numbered location which is
6387      actually within the array.  That's *not* necessarily the same as the
6388      zeroth element of the array.  */
6389
6390   switch (GET_CODE (rtl))
6391     {
6392     case POST_INC:
6393     case POST_DEC:
6394       /* POST_INC and POST_DEC can be handled just like a SUBREG.  So we
6395          just fall into the SUBREG code.  */
6396
6397       /* ... fall through ... */
6398
6399     case SUBREG:
6400       /* The case of a subreg may arise when we have a local (register)
6401          variable or a formal (register) parameter which doesn't quite fill
6402          up an entire register.  For now, just assume that it is
6403          legitimate to make the Dwarf info refer to the whole register which
6404          contains the given subreg.  */
6405       rtl = XEXP (rtl, 0);
6406
6407       /* ... fall through ... */
6408
6409     case REG:
6410       /* Whenever a register number forms a part of the description of the
6411          method for calculating the (dynamic) address of a memory resident
6412          object, DWARF rules require the register number be referred to as 
6413          a "base register".  This distinction is not based in any way upon
6414          what category of register the hardware believes the given register
6415          belongs to.  This is strictly DWARF terminology we're dealing with
6416          here. Note that in cases where the location of a memory-resident
6417          data object could be expressed as: OP_ADD (OP_BASEREG (basereg),
6418          OP_CONST (0)) the actual DWARF location descriptor that we generate
6419          may just be OP_BASEREG (basereg).  This may look deceptively like
6420          the object in question was allocated to a register (rather than in
6421          memory) so DWARF consumers need to be aware of the subtle
6422          distinction between OP_REG and OP_BASEREG.  */
6423       mem_loc_result = based_loc_descr (reg_number (rtl), 0);
6424       break;
6425
6426     case MEM:
6427       mem_loc_result = mem_loc_descriptor (XEXP (rtl, 0), mode);
6428       add_loc_descr (&mem_loc_result, new_loc_descr (DW_OP_deref, 0, 0));
6429       break;
6430
6431      case LABEL_REF:
6432        /* Some ports can transform a symbol ref into a label ref, because
6433          the symbol ref is too far away and has to be dumped into a constant
6434          pool.  */
6435     case CONST:
6436     case SYMBOL_REF:
6437       mem_loc_result = new_loc_descr (DW_OP_addr, 0, 0);
6438       mem_loc_result->dw_loc_oprnd1.val_class = dw_val_class_addr;
6439       mem_loc_result->dw_loc_oprnd1.v.val_addr = addr_to_string (rtl);
6440       break;
6441
6442     case PRE_INC:
6443     case PRE_DEC:
6444       /* Turn these into a PLUS expression and fall into the PLUS code
6445          below.  */
6446       rtl = gen_rtx_PLUS (word_mode, XEXP (rtl, 0),
6447                           GEN_INT (GET_CODE (rtl) == PRE_INC
6448                                    ? GET_MODE_UNIT_SIZE (mode) 
6449                                    : - GET_MODE_UNIT_SIZE (mode)));
6450                           
6451       /* ... fall through ... */
6452
6453     case PLUS:
6454       if (is_based_loc (rtl))
6455         mem_loc_result = based_loc_descr (reg_number (XEXP (rtl, 0)),
6456                                           INTVAL (XEXP (rtl, 1)));
6457       else
6458         {
6459           add_loc_descr (&mem_loc_result, mem_loc_descriptor (XEXP (rtl, 0),
6460                                                               mode));
6461           add_loc_descr (&mem_loc_result, mem_loc_descriptor (XEXP (rtl, 1),
6462                                                               mode));
6463           add_loc_descr (&mem_loc_result, new_loc_descr (DW_OP_plus, 0, 0));
6464         }
6465       break;
6466
6467     case MULT:
6468       /* If a pseudo-reg is optimized away, it is possible for it to
6469          be replaced with a MEM containing a multiply.  */
6470       add_loc_descr (&mem_loc_result, mem_loc_descriptor (XEXP (rtl, 0), mode));
6471       add_loc_descr (&mem_loc_result, mem_loc_descriptor (XEXP (rtl, 1), mode));
6472       add_loc_descr (&mem_loc_result, new_loc_descr (DW_OP_mul, 0, 0));
6473       break;
6474
6475     case CONST_INT:
6476       mem_loc_result = new_loc_descr (DW_OP_constu, INTVAL (rtl), 0);
6477       break;
6478
6479     default:
6480       abort ();
6481     }
6482
6483   return mem_loc_result;
6484 }
6485
6486 /* Return a descriptor that describes the concatenation of two locations.
6487    This is typically a complex variable.  */
6488
6489 static dw_loc_descr_ref
6490 concat_loc_descriptor (x0, x1)
6491      register rtx x0, x1;
6492 {
6493   dw_loc_descr_ref cc_loc_result = NULL;
6494
6495   if (!is_pseudo_reg (x0)
6496       && (GET_CODE (x0) != MEM || !is_pseudo_reg (XEXP (x0, 0))))
6497     add_loc_descr (&cc_loc_result, loc_descriptor (x0));
6498   add_loc_descr (&cc_loc_result,
6499                  new_loc_descr (DW_OP_piece, GET_MODE_SIZE (GET_MODE (x0)), 0));
6500
6501   if (!is_pseudo_reg (x1)
6502       && (GET_CODE (x1) != MEM || !is_pseudo_reg (XEXP (x1, 0))))
6503     add_loc_descr (&cc_loc_result, loc_descriptor (x1));
6504   add_loc_descr (&cc_loc_result,
6505                  new_loc_descr (DW_OP_piece, GET_MODE_SIZE (GET_MODE (x1)), 0));
6506
6507   return cc_loc_result;
6508 }
6509
6510 /* Output a proper Dwarf location descriptor for a variable or parameter
6511    which is either allocated in a register or in a memory location.  For a
6512    register, we just generate an OP_REG and the register number.  For a
6513    memory location we provide a Dwarf postfix expression describing how to
6514    generate the (dynamic) address of the object onto the address stack.  */
6515
6516 static dw_loc_descr_ref
6517 loc_descriptor (rtl)
6518      register rtx rtl;
6519 {
6520   dw_loc_descr_ref loc_result = NULL;
6521   switch (GET_CODE (rtl))
6522     {
6523     case SUBREG:
6524       /* The case of a subreg may arise when we have a local (register)
6525          variable or a formal (register) parameter which doesn't quite fill
6526          up an entire register.  For now, just assume that it is
6527          legitimate to make the Dwarf info refer to the whole register which
6528          contains the given subreg.  */
6529       rtl = XEXP (rtl, 0);
6530
6531       /* ... fall through ... */
6532
6533     case REG:
6534       loc_result = reg_loc_descriptor (rtl);
6535       break;
6536
6537     case MEM:
6538       loc_result = mem_loc_descriptor (XEXP (rtl, 0), GET_MODE (rtl));
6539       break;
6540
6541     case CONCAT:
6542       loc_result = concat_loc_descriptor (XEXP (rtl, 0), XEXP (rtl, 1));
6543       break;
6544
6545     default:
6546       abort ();
6547     }
6548
6549   return loc_result;
6550 }
6551
6552 /* Given an unsigned value, round it up to the lowest multiple of `boundary'
6553    which is not less than the value itself.  */
6554
6555 static inline unsigned
6556 ceiling (value, boundary)
6557      register unsigned value;
6558      register unsigned boundary;
6559 {
6560   return (((value + boundary - 1) / boundary) * boundary);
6561 }
6562
6563 /* Given a pointer to what is assumed to be a FIELD_DECL node, return a
6564    pointer to the declared type for the relevant field variable, or return
6565    `integer_type_node' if the given node turns out to be an
6566    ERROR_MARK node.  */
6567
6568 static inline tree
6569 field_type (decl)
6570      register tree decl;
6571 {
6572   register tree type;
6573
6574   if (TREE_CODE (decl) == ERROR_MARK)
6575     return integer_type_node;
6576
6577   type = DECL_BIT_FIELD_TYPE (decl);
6578   if (type == NULL_TREE)
6579     type = TREE_TYPE (decl);
6580
6581   return type;
6582 }
6583
6584 /* Given a pointer to a tree node, assumed to be some kind of a ..._TYPE
6585    node, return the alignment in bits for the type, or else return
6586    BITS_PER_WORD if the node actually turns out to be an
6587    ERROR_MARK node.  */
6588
6589 static inline unsigned
6590 simple_type_align_in_bits (type)
6591      register tree type;
6592 {
6593   return (TREE_CODE (type) != ERROR_MARK) ? TYPE_ALIGN (type) : BITS_PER_WORD;
6594 }
6595
6596 /* Given a pointer to a tree node, assumed to be some kind of a ..._TYPE
6597    node, return the size in bits for the type if it is a constant, or else
6598    return the alignment for the type if the type's size is not constant, or
6599    else return BITS_PER_WORD if the type actually turns out to be an
6600    ERROR_MARK node.  */
6601
6602 static inline unsigned
6603 simple_type_size_in_bits (type)
6604      register tree type;
6605 {
6606   if (TREE_CODE (type) == ERROR_MARK)
6607     return BITS_PER_WORD;
6608   else
6609     {
6610       register tree type_size_tree = TYPE_SIZE (type);
6611
6612       if (TREE_CODE (type_size_tree) != INTEGER_CST)
6613         return TYPE_ALIGN (type);
6614
6615       return (unsigned) TREE_INT_CST_LOW (type_size_tree);
6616     }
6617 }
6618
6619 /* Given a pointer to what is assumed to be a FIELD_DECL node, compute and
6620    return the byte offset of the lowest addressed byte of the "containing
6621    object" for the given FIELD_DECL, or return 0 if we are unable to
6622    determine what that offset is, either because the argument turns out to
6623    be a pointer to an ERROR_MARK node, or because the offset is actually
6624    variable.  (We can't handle the latter case just yet).  */
6625
6626 static unsigned
6627 field_byte_offset (decl)
6628      register tree decl;
6629 {
6630   register unsigned type_align_in_bytes;
6631   register unsigned type_align_in_bits;
6632   register unsigned type_size_in_bits;
6633   register unsigned object_offset_in_align_units;
6634   register unsigned object_offset_in_bits;
6635   register unsigned object_offset_in_bytes;
6636   register tree type;
6637   register tree bitpos_tree;
6638   register tree field_size_tree;
6639   register unsigned bitpos_int;
6640   register unsigned deepest_bitpos;
6641   register unsigned field_size_in_bits;
6642
6643   if (TREE_CODE (decl) == ERROR_MARK)
6644     return 0;
6645
6646   if (TREE_CODE (decl) != FIELD_DECL)
6647     abort ();
6648
6649   type = field_type (decl);
6650
6651   bitpos_tree = DECL_FIELD_BITPOS (decl);
6652   field_size_tree = DECL_SIZE (decl);
6653
6654   /* We cannot yet cope with fields whose positions are variable, so 
6655      for now, when we see such things, we simply return 0.  Someday, we may
6656      be able to handle such cases, but it will be damn difficult.  */
6657   if (TREE_CODE (bitpos_tree) != INTEGER_CST)
6658     return 0;
6659
6660   bitpos_int = (unsigned) TREE_INT_CST_LOW (bitpos_tree);
6661
6662     /* If we don't know the size of the field, pretend it's a full word.  */
6663   if (TREE_CODE (field_size_tree) == INTEGER_CST)
6664     field_size_in_bits = (unsigned) TREE_INT_CST_LOW (field_size_tree);
6665   else
6666     field_size_in_bits = BITS_PER_WORD;
6667
6668   type_size_in_bits = simple_type_size_in_bits (type);
6669   type_align_in_bits = simple_type_align_in_bits (type);
6670   type_align_in_bytes = type_align_in_bits / BITS_PER_UNIT;
6671
6672   /* Note that the GCC front-end doesn't make any attempt to keep track of
6673      the starting bit offset (relative to the start of the containing
6674      structure type) of the hypothetical "containing object" for a bit-
6675      field.  Thus, when computing the byte offset value for the start of the
6676      "containing object" of a bit-field, we must deduce this information on 
6677      our own. This can be rather tricky to do in some cases.  For example,
6678      handling the following structure type definition when compiling for an
6679      i386/i486 target (which only aligns long long's to 32-bit boundaries)
6680      can be very tricky:
6681
6682          struct S { int field1; long long field2:31; };
6683
6684      Fortunately, there is a simple rule-of-thumb which can be
6685      used in such cases.  When compiling for an i386/i486, GCC will allocate
6686      8 bytes for the structure shown above.  It decides to do this based upon 
6687      one simple rule for bit-field allocation.  Quite simply, GCC allocates
6688      each "containing object" for each bit-field at the first (i.e. lowest
6689      addressed) legitimate alignment boundary (based upon the required
6690      minimum alignment for the declared type of the field) which it can
6691      possibly use, subject to the condition that there is still enough
6692      available space remaining in the containing object (when allocated at
6693      the selected point) to fully accommodate all of the bits of the
6694      bit-field itself.  This simple rule makes it obvious why GCC allocates
6695      8 bytes for each object of the structure type shown above.  When looking
6696      for a place to allocate the "containing object" for `field2', the
6697      compiler simply tries to allocate a 64-bit "containing object" at each
6698      successive 32-bit boundary (starting at zero) until it finds a place to
6699      allocate that 64- bit field such that at least 31 contiguous (and
6700      previously unallocated) bits remain within that selected 64 bit field.
6701      (As it turns out, for the example above, the compiler finds that it is
6702      OK to allocate the "containing object" 64-bit field at bit-offset zero
6703      within the structure type.) Here we attempt to work backwards from the
6704      limited set of facts we're given, and we try to deduce from those facts, 
6705      where GCC must have believed that the containing object started (within
6706      the structure type). The value we deduce is then used (by the callers of 
6707      this routine) to generate DW_AT_location and DW_AT_bit_offset attributes 
6708      for fields (both bit-fields and, in the case of DW_AT_location, regular
6709      fields as well).  */
6710
6711   /* Figure out the bit-distance from the start of the structure to the
6712      "deepest" bit of the bit-field.  */
6713   deepest_bitpos = bitpos_int + field_size_in_bits;
6714
6715   /* This is the tricky part.  Use some fancy footwork to deduce where the
6716      lowest addressed bit of the containing object must be.  */
6717   object_offset_in_bits
6718     = ceiling (deepest_bitpos, type_align_in_bits) - type_size_in_bits;
6719
6720   /* Compute the offset of the containing object in "alignment units".  */
6721   object_offset_in_align_units = object_offset_in_bits / type_align_in_bits;
6722
6723   /* Compute the offset of the containing object in bytes.  */
6724   object_offset_in_bytes = object_offset_in_align_units * type_align_in_bytes;
6725
6726   return object_offset_in_bytes;
6727 }
6728 \f
6729 /* The following routines define various Dwarf attributes and any data
6730    associated with them.  */
6731
6732 /* Add a location description attribute value to a DIE.
6733
6734    This emits location attributes suitable for whole variables and
6735    whole parameters.  Note that the location attributes for struct fields are
6736    generated by the routine `data_member_location_attribute' below.  */
6737
6738 static void
6739 add_AT_location_description (die, attr_kind, rtl)
6740      dw_die_ref die;
6741      enum dwarf_attribute attr_kind;
6742      register rtx rtl;
6743 {
6744   /* Handle a special case.  If we are about to output a location descriptor
6745      for a variable or parameter which has been optimized out of existence,
6746      don't do that.  A variable which has been optimized out
6747      of existence will have a DECL_RTL value which denotes a pseudo-reg.
6748      Currently, in some rare cases, variables can have DECL_RTL values which
6749      look like (MEM (REG pseudo-reg#)).  These cases are due to bugs
6750      elsewhere in the compiler.  We treat such cases as if the variable(s) in 
6751      question had been optimized out of existence.  */
6752
6753   if (is_pseudo_reg (rtl)
6754       || (GET_CODE (rtl) == MEM
6755           && is_pseudo_reg (XEXP (rtl, 0)))
6756       /* This can happen for a PARM_DECL with a DECL_INCOMING_RTL which 
6757          references the internal argument pointer (a pseudo) in a function
6758          where all references to the internal argument pointer were
6759          eliminated via the optimizers.  */
6760       || (GET_CODE (rtl) == MEM
6761           && GET_CODE (XEXP (rtl, 0)) == PLUS
6762           && is_pseudo_reg (XEXP (XEXP (rtl, 0), 0)))
6763       || (GET_CODE (rtl) == CONCAT
6764           && is_pseudo_reg (XEXP (rtl, 0))
6765           && is_pseudo_reg (XEXP (rtl, 1))))
6766     return;
6767
6768   add_AT_loc (die, attr_kind, loc_descriptor (rtl));
6769 }
6770
6771 /* Attach the specialized form of location attribute used for data
6772    members of struct and union types.  In the special case of a
6773    FIELD_DECL node which represents a bit-field, the "offset" part
6774    of this special location descriptor must indicate the distance
6775    in bytes from the lowest-addressed byte of the containing struct
6776    or union type to the lowest-addressed byte of the "containing
6777    object" for the bit-field.  (See the `field_byte_offset' function
6778    above).. For any given bit-field, the "containing object" is a
6779    hypothetical object (of some integral or enum type) within which
6780    the given bit-field lives.  The type of this hypothetical
6781    "containing object" is always the same as the declared type of
6782    the individual bit-field itself (for GCC anyway... the DWARF
6783    spec doesn't actually mandate this).  Note that it is the size
6784    (in bytes) of the hypothetical "containing object" which will
6785    be given in the DW_AT_byte_size attribute for this bit-field.
6786    (See the `byte_size_attribute' function below.)  It is also used
6787    when calculating the value of the DW_AT_bit_offset attribute.
6788    (See the `bit_offset_attribute' function below).  */
6789
6790 static void
6791 add_data_member_location_attribute (die, decl)
6792      register dw_die_ref die;
6793      register tree decl;
6794 {
6795   register unsigned long offset;
6796   register dw_loc_descr_ref loc_descr;
6797   register enum dwarf_location_atom op;
6798
6799   if (TREE_CODE (decl) == TREE_VEC)
6800     offset = TREE_INT_CST_LOW (BINFO_OFFSET (decl));
6801   else
6802     offset = field_byte_offset (decl);
6803
6804   /* The DWARF2 standard says that we should assume that the structure address
6805      is already on the stack, so we can specify a structure field address
6806      by using DW_OP_plus_uconst.  */
6807
6808 #ifdef MIPS_DEBUGGING_INFO
6809   /* ??? The SGI dwarf reader does not handle the DW_OP_plus_uconst operator
6810      correctly.  It works only if we leave the offset on the stack.  */
6811   op = DW_OP_constu;
6812 #else
6813   op = DW_OP_plus_uconst;
6814 #endif
6815
6816   loc_descr = new_loc_descr (op, offset, 0);
6817   add_AT_loc (die, DW_AT_data_member_location, loc_descr);
6818 }
6819
6820 /* Attach an DW_AT_const_value attribute for a variable or a parameter which
6821    does not have a "location" either in memory or in a register.  These
6822    things can arise in GNU C when a constant is passed as an actual parameter
6823    to an inlined function.  They can also arise in C++ where declared
6824    constants do not necessarily get memory "homes".  */
6825
6826 static void
6827 add_const_value_attribute (die, rtl)
6828      register dw_die_ref die;
6829      register rtx rtl;
6830 {
6831   switch (GET_CODE (rtl))
6832     {
6833     case CONST_INT:
6834       /* Note that a CONST_INT rtx could represent either an integer or a
6835          floating-point constant.  A CONST_INT is used whenever the constant
6836          will fit into a single word.  In all such cases, the original mode
6837          of the constant value is wiped out, and the CONST_INT rtx is
6838          assigned VOIDmode.  */
6839       add_AT_unsigned (die, DW_AT_const_value, (unsigned) INTVAL (rtl));
6840       break;
6841
6842     case CONST_DOUBLE:
6843       /* Note that a CONST_DOUBLE rtx could represent either an integer or a
6844          floating-point constant.  A CONST_DOUBLE is used whenever the
6845          constant requires more than one word in order to be adequately
6846          represented.  We output CONST_DOUBLEs as blocks.  */
6847       {
6848         register enum machine_mode mode = GET_MODE (rtl);
6849
6850         if (GET_MODE_CLASS (mode) == MODE_FLOAT)
6851           {
6852             register unsigned length = GET_MODE_SIZE (mode) / sizeof (long);
6853             long array[4];
6854             REAL_VALUE_TYPE rv;
6855
6856             REAL_VALUE_FROM_CONST_DOUBLE (rv, rtl);
6857             switch (mode)
6858               {
6859               case SFmode:
6860                 REAL_VALUE_TO_TARGET_SINGLE (rv, array[0]);
6861                 break;
6862
6863               case DFmode:
6864                 REAL_VALUE_TO_TARGET_DOUBLE (rv, array);
6865                 break;
6866
6867               case XFmode:
6868               case TFmode:
6869                 REAL_VALUE_TO_TARGET_LONG_DOUBLE (rv, array);
6870                 break;
6871
6872               default:
6873                 abort ();
6874               }
6875
6876             add_AT_float (die, DW_AT_const_value, length, array);
6877           }
6878         else
6879           add_AT_long_long (die, DW_AT_const_value,
6880                             CONST_DOUBLE_HIGH (rtl), CONST_DOUBLE_LOW (rtl));
6881       }
6882       break;
6883
6884     case CONST_STRING:
6885       add_AT_string (die, DW_AT_const_value, XSTR (rtl, 0));
6886       break;
6887
6888     case SYMBOL_REF:
6889     case LABEL_REF:
6890     case CONST:
6891       add_AT_addr (die, DW_AT_const_value, addr_to_string (rtl));
6892       break;
6893
6894     case PLUS:
6895       /* In cases where an inlined instance of an inline function is passed
6896          the address of an `auto' variable (which is local to the caller) we
6897          can get a situation where the DECL_RTL of the artificial local
6898          variable (for the inlining) which acts as a stand-in for the
6899          corresponding formal parameter (of the inline function) will look
6900          like (plus:SI (reg:SI FRAME_PTR) (const_int ...)).  This is not
6901          exactly a compile-time constant expression, but it isn't the address 
6902          of the (artificial) local variable either.  Rather, it represents the 
6903          *value* which the artificial local variable always has during its
6904          lifetime.  We currently have no way to represent such quasi-constant 
6905          values in Dwarf, so for now we just punt and generate nothing.  */
6906       break;
6907
6908     default:
6909       /* No other kinds of rtx should be possible here.  */
6910       abort ();
6911     }
6912
6913 }
6914
6915 /* Generate *either* an DW_AT_location attribute or else an DW_AT_const_value
6916    data attribute for a variable or a parameter.  We generate the
6917    DW_AT_const_value attribute only in those cases where the given variable
6918    or parameter does not have a true "location" either in memory or in a
6919    register.  This can happen (for example) when a constant is passed as an
6920    actual argument in a call to an inline function.  (It's possible that
6921    these things can crop up in other ways also.)  Note that one type of
6922    constant value which can be passed into an inlined function is a constant
6923    pointer.  This can happen for example if an actual argument in an inlined
6924    function call evaluates to a compile-time constant address.  */
6925
6926 static void
6927 add_location_or_const_value_attribute (die, decl)
6928      register dw_die_ref die;
6929      register tree decl;
6930 {
6931   register rtx rtl;
6932   register tree declared_type;
6933   register tree passed_type;
6934
6935   if (TREE_CODE (decl) == ERROR_MARK)
6936     return;
6937
6938   if (TREE_CODE (decl) != VAR_DECL && TREE_CODE (decl) != PARM_DECL)
6939     abort ();
6940
6941   /* Here we have to decide where we are going to say the parameter "lives"
6942      (as far as the debugger is concerned).  We only have a couple of
6943      choices.  GCC provides us with DECL_RTL and with DECL_INCOMING_RTL.
6944
6945      DECL_RTL normally indicates where the parameter lives during most of the 
6946      activation of the function.  If optimization is enabled however, this
6947      could be either NULL or else a pseudo-reg.  Both of those cases indicate 
6948      that the parameter doesn't really live anywhere (as far as the code
6949      generation parts of GCC are concerned) during most of the function's
6950      activation.  That will happen (for example) if the parameter is never
6951      referenced within the function.
6952
6953      We could just generate a location descriptor here for all non-NULL
6954      non-pseudo values of DECL_RTL and ignore all of the rest, but we can be
6955      a little nicer than that if we also consider DECL_INCOMING_RTL in cases
6956      where DECL_RTL is NULL or is a pseudo-reg.
6957
6958      Note however that we can only get away with using DECL_INCOMING_RTL as
6959      a backup substitute for DECL_RTL in certain limited cases.  In cases
6960      where DECL_ARG_TYPE (decl) indicates the same type as TREE_TYPE (decl),
6961      we can be sure that the parameter was passed using the same type as it is
6962      declared to have within the function, and that its DECL_INCOMING_RTL
6963      points us to a place where a value of that type is passed.
6964
6965      In cases where DECL_ARG_TYPE (decl) and TREE_TYPE (decl) are different,
6966      we cannot (in general) use DECL_INCOMING_RTL as a substitute for DECL_RTL
6967      because in these cases DECL_INCOMING_RTL points us to a value of some
6968      type which is *different* from the type of the parameter itself.  Thus,
6969      if we tried to use DECL_INCOMING_RTL to generate a location attribute in
6970      such cases, the debugger would end up (for example) trying to fetch a
6971      `float' from a place which actually contains the first part of a
6972      `double'.  That would lead to really incorrect and confusing
6973      output at debug-time.
6974
6975      So, in general, we *do not* use DECL_INCOMING_RTL as a backup for DECL_RTL
6976      in cases where DECL_ARG_TYPE (decl) != TREE_TYPE (decl).  There
6977      are a couple of exceptions however.  On little-endian machines we can
6978      get away with using DECL_INCOMING_RTL even when DECL_ARG_TYPE (decl) is
6979      not the same as TREE_TYPE (decl), but only when DECL_ARG_TYPE (decl) is
6980      an integral type that is smaller than TREE_TYPE (decl). These cases arise
6981      when (on a little-endian machine) a non-prototyped function has a
6982      parameter declared to be of type `short' or `char'.  In such cases,
6983      TREE_TYPE (decl) will be `short' or `char', DECL_ARG_TYPE (decl) will
6984      be `int', and DECL_INCOMING_RTL will point to the lowest-order byte of the
6985      passed `int' value.  If the debugger then uses that address to fetch
6986      a `short' or a `char' (on a little-endian machine) the result will be
6987      the correct data, so we allow for such exceptional cases below.
6988
6989      Note that our goal here is to describe the place where the given formal
6990      parameter lives during most of the function's activation (i.e. between
6991      the end of the prologue and the start of the epilogue).  We'll do that
6992      as best as we can. Note however that if the given formal parameter is
6993      modified sometime during the execution of the function, then a stack
6994      backtrace (at debug-time) will show the function as having been
6995      called with the *new* value rather than the value which was
6996      originally passed in.  This happens rarely enough that it is not
6997      a major problem, but it *is* a problem, and I'd like to fix it.
6998
6999      A future version of dwarf2out.c may generate two additional
7000      attributes for any given DW_TAG_formal_parameter DIE which will
7001      describe the "passed type" and the "passed location" for the
7002      given formal parameter in addition to the attributes we now
7003      generate to indicate the "declared type" and the "active
7004      location" for each parameter.  This additional set of attributes
7005      could be used by debuggers for stack backtraces. Separately, note
7006      that sometimes DECL_RTL can be NULL and DECL_INCOMING_RTL can be
7007      NULL also.  This happens (for example) for inlined-instances of
7008      inline function formal parameters which are never referenced.
7009      This really shouldn't be happening.  All PARM_DECL nodes should
7010      get valid non-NULL DECL_INCOMING_RTL values, but integrate.c
7011      doesn't currently generate these values for inlined instances of
7012      inline function parameters, so when we see such cases, we are
7013      just out-of-luck for the time being (until integrate.c
7014      gets fixed).  */
7015
7016   /* Use DECL_RTL as the "location" unless we find something better.  */
7017   rtl = DECL_RTL (decl);
7018
7019   if (TREE_CODE (decl) == PARM_DECL)
7020     {
7021       if (rtl == NULL_RTX || is_pseudo_reg (rtl))
7022         {
7023           declared_type = type_main_variant (TREE_TYPE (decl));
7024           passed_type = type_main_variant (DECL_ARG_TYPE (decl));
7025
7026           /* This decl represents a formal parameter which was optimized out.
7027              Note that DECL_INCOMING_RTL may be NULL in here, but we handle
7028              all* cases where (rtl == NULL_RTX) just below.  */
7029           if (declared_type == passed_type)
7030             rtl = DECL_INCOMING_RTL (decl);
7031           else if (! BYTES_BIG_ENDIAN
7032                    && TREE_CODE (declared_type) == INTEGER_TYPE
7033                    && (GET_MODE_SIZE (TYPE_MODE (declared_type))
7034                        <= GET_MODE_SIZE (TYPE_MODE (passed_type))))
7035                 rtl = DECL_INCOMING_RTL (decl);
7036         }
7037
7038       /* If the parm was passed in registers, but lives on the stack, then
7039          make a big endian correction if the mode of the type of the
7040          parameter is not the same as the mode of the rtl.  */
7041       /* ??? This is the same series of checks that are made in dbxout.c before
7042          we reach the big endian correction code there.  It isn't clear if all
7043          of these checks are necessary here, but keeping them all is the safe
7044          thing to do.  */
7045       else if (GET_CODE (rtl) == MEM
7046                && XEXP (rtl, 0) != const0_rtx
7047                && ! CONSTANT_P (XEXP (rtl, 0))
7048                /* Not passed in memory.  */
7049                && GET_CODE (DECL_INCOMING_RTL (decl)) != MEM
7050                /* Not passed by invisible reference.  */
7051                && (GET_CODE (XEXP (rtl, 0)) != REG
7052                    || REGNO (XEXP (rtl, 0)) == HARD_FRAME_POINTER_REGNUM
7053                    || REGNO (XEXP (rtl, 0)) == STACK_POINTER_REGNUM
7054 #if ARG_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
7055                    || REGNO (XEXP (rtl, 0)) == ARG_POINTER_REGNUM
7056 #endif
7057                      )
7058                /* Big endian correction check.  */
7059                && BYTES_BIG_ENDIAN
7060                && TYPE_MODE (TREE_TYPE (decl)) != GET_MODE (rtl)
7061                && (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (decl)))
7062                    < UNITS_PER_WORD))
7063         {
7064           int offset = (UNITS_PER_WORD
7065                         - GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (decl))));
7066           rtl = gen_rtx_MEM (TYPE_MODE (TREE_TYPE (decl)),
7067                              plus_constant (XEXP (rtl, 0), offset));
7068         }
7069     }
7070
7071   if (rtl == NULL_RTX)
7072     return;
7073
7074   rtl = eliminate_regs (rtl, 0, NULL_RTX);
7075 #ifdef LEAF_REG_REMAP
7076   if (current_function_uses_only_leaf_regs)
7077     leaf_renumber_regs_insn (rtl);
7078 #endif
7079
7080   switch (GET_CODE (rtl))
7081     {
7082     case ADDRESSOF:
7083       /* The address of a variable that was optimized away; don't emit
7084          anything.  */
7085       break;
7086
7087     case CONST_INT:
7088     case CONST_DOUBLE:
7089     case CONST_STRING:
7090     case SYMBOL_REF:
7091     case LABEL_REF:
7092     case CONST:
7093     case PLUS:
7094       /* DECL_RTL could be (plus (reg ...) (const_int ...)) */
7095       add_const_value_attribute (die, rtl);
7096       break;
7097
7098     case MEM:
7099     case REG:
7100     case SUBREG:
7101     case CONCAT:
7102       add_AT_location_description (die, DW_AT_location, rtl);
7103       break;
7104
7105     default:
7106       abort ();
7107     }
7108 }
7109
7110 /* Generate an DW_AT_name attribute given some string value to be included as
7111    the value of the attribute.  */
7112
7113 static inline void
7114 add_name_attribute (die, name_string)
7115      register dw_die_ref die;
7116      register const char *name_string;
7117 {
7118   if (name_string != NULL && *name_string != 0)
7119     {
7120       if (demangle_name_func)
7121         name_string = (*demangle_name_func) (name_string);
7122
7123       add_AT_string (die, DW_AT_name, name_string);
7124     }
7125 }
7126
7127 /* Given a tree node describing an array bound (either lower or upper) output
7128    a representation for that bound.  */
7129
7130 static void
7131 add_bound_info (subrange_die, bound_attr, bound)
7132      register dw_die_ref subrange_die;
7133      register enum dwarf_attribute bound_attr;
7134      register tree bound;
7135 {
7136   register unsigned bound_value = 0;
7137
7138   /* If this is an Ada unconstrained array type, then don't emit any debug
7139      info because the array bounds are unknown.  They are parameterized when
7140      the type is instantiated.  */
7141   if (contains_placeholder_p (bound))
7142     return;
7143
7144   switch (TREE_CODE (bound))
7145     {
7146     case ERROR_MARK:
7147       return;
7148
7149     /* All fixed-bounds are represented by INTEGER_CST nodes.        */
7150     case INTEGER_CST:
7151       bound_value = TREE_INT_CST_LOW (bound);
7152       if (bound_attr == DW_AT_lower_bound
7153           && ((is_c_family () && bound_value == 0)
7154               || (is_fortran () && bound_value == 1)))
7155         /* use the default */;
7156       else
7157         add_AT_unsigned (subrange_die, bound_attr, bound_value);
7158       break;
7159
7160     case CONVERT_EXPR:
7161     case NOP_EXPR:
7162     case NON_LVALUE_EXPR:
7163       add_bound_info (subrange_die, bound_attr, TREE_OPERAND (bound, 0));
7164       break;
7165       
7166     case SAVE_EXPR:
7167       /* If optimization is turned on, the SAVE_EXPRs that describe how to
7168          access the upper bound values may be bogus.  If they refer to a
7169          register, they may only describe how to get at these values at the
7170          points in the generated code right after they have just been
7171          computed.  Worse yet, in the typical case, the upper bound values
7172          will not even *be* computed in the optimized code (though the
7173          number of elements will), so these SAVE_EXPRs are entirely
7174          bogus. In order to compensate for this fact, we check here to see
7175          if optimization is enabled, and if so, we don't add an attribute
7176          for the (unknown and unknowable) upper bound.  This should not
7177          cause too much trouble for existing (stupid?)  debuggers because
7178          they have to deal with empty upper bounds location descriptions
7179          anyway in order to be able to deal with incomplete array types.
7180          Of course an intelligent debugger (GDB?)  should be able to
7181          comprehend that a missing upper bound specification in a array
7182          type used for a storage class `auto' local array variable
7183          indicates that the upper bound is both unknown (at compile- time)
7184          and unknowable (at run-time) due to optimization.
7185
7186          We assume that a MEM rtx is safe because gcc wouldn't put the
7187          value there unless it was going to be used repeatedly in the
7188          function, i.e. for cleanups.  */
7189       if (! optimize || GET_CODE (SAVE_EXPR_RTL (bound)) == MEM)
7190         {
7191           register dw_die_ref ctx = lookup_decl_die (current_function_decl);
7192           register dw_die_ref decl_die = new_die (DW_TAG_variable, ctx);
7193           register rtx loc = SAVE_EXPR_RTL (bound);
7194
7195           /* If the RTL for the SAVE_EXPR is memory, handle the case where
7196              it references an outer function's frame.  */
7197
7198           if (GET_CODE (loc) == MEM)
7199             {
7200               rtx new_addr = fix_lexical_addr (XEXP (loc, 0), bound);
7201
7202               if (XEXP (loc, 0) != new_addr)
7203                 loc = gen_rtx_MEM (GET_MODE (loc), new_addr);
7204             }
7205
7206           add_AT_flag (decl_die, DW_AT_artificial, 1);
7207           add_type_attribute (decl_die, TREE_TYPE (bound), 1, 0, ctx);
7208           add_AT_location_description (decl_die, DW_AT_location, loc);
7209           add_AT_die_ref (subrange_die, bound_attr, decl_die);
7210         }
7211
7212       /* Else leave out the attribute.  */
7213       break;
7214
7215     case MAX_EXPR:
7216     case VAR_DECL:
7217     case COMPONENT_REF:
7218       /* ??? These types of bounds can be created by the Ada front end,
7219          and it isn't clear how to emit debug info for them.  */
7220       break;
7221
7222     default:
7223       abort ();
7224     }
7225 }
7226
7227 /* Note that the block of subscript information for an array type also
7228    includes information about the element type of type given array type.  */
7229
7230 static void
7231 add_subscript_info (type_die, type)
7232      register dw_die_ref type_die;
7233      register tree type;
7234 {
7235 #ifndef MIPS_DEBUGGING_INFO
7236   register unsigned dimension_number;
7237 #endif
7238   register tree lower, upper;
7239   register dw_die_ref subrange_die;
7240
7241   /* The GNU compilers represent multidimensional array types as sequences of 
7242      one dimensional array types whose element types are themselves array
7243      types.  Here we squish that down, so that each multidimensional array
7244      type gets only one array_type DIE in the Dwarf debugging info. The draft 
7245      Dwarf specification say that we are allowed to do this kind of
7246      compression in C (because there is no difference between an array or
7247      arrays and a multidimensional array in C) but for other source languages 
7248      (e.g. Ada) we probably shouldn't do this.  */
7249
7250   /* ??? The SGI dwarf reader fails for multidimensional arrays with a
7251      const enum type.  E.g. const enum machine_mode insn_operand_mode[2][10].
7252      We work around this by disabling this feature.  See also
7253      gen_array_type_die.  */
7254 #ifndef MIPS_DEBUGGING_INFO
7255   for (dimension_number = 0;
7256        TREE_CODE (type) == ARRAY_TYPE;
7257        type = TREE_TYPE (type), dimension_number++)
7258     {
7259 #endif
7260       register tree domain = TYPE_DOMAIN (type);
7261
7262       /* Arrays come in three flavors: Unspecified bounds, fixed bounds,
7263          and (in GNU C only) variable bounds.  Handle all three forms 
7264          here.  */
7265       subrange_die = new_die (DW_TAG_subrange_type, type_die);
7266       if (domain)
7267         {
7268           /* We have an array type with specified bounds.  */
7269           lower = TYPE_MIN_VALUE (domain);
7270           upper = TYPE_MAX_VALUE (domain);
7271
7272           /* define the index type.  */
7273           if (TREE_TYPE (domain))
7274             {
7275               /* ??? This is probably an Ada unnamed subrange type.  Ignore the
7276                  TREE_TYPE field.  We can't emit debug info for this
7277                  because it is an unnamed integral type.  */
7278               if (TREE_CODE (domain) == INTEGER_TYPE
7279                   && TYPE_NAME (domain) == NULL_TREE
7280                   && TREE_CODE (TREE_TYPE (domain)) == INTEGER_TYPE
7281                   && TYPE_NAME (TREE_TYPE (domain)) == NULL_TREE)
7282                 ;       
7283               else
7284                 add_type_attribute (subrange_die, TREE_TYPE (domain), 0, 0,
7285                                     type_die);
7286             }
7287
7288           /* ??? If upper is NULL, the array has unspecified length,
7289              but it does have a lower bound.  This happens with Fortran
7290                dimension arr(N:*)
7291              Since the debugger is definitely going to need to know N
7292              to produce useful results, go ahead and output the lower
7293              bound solo, and hope the debugger can cope.  */
7294
7295           add_bound_info (subrange_die, DW_AT_lower_bound, lower);
7296           if (upper)
7297             add_bound_info (subrange_die, DW_AT_upper_bound, upper);
7298         }
7299       else
7300         /* We have an array type with an unspecified length.  The DWARF-2
7301              spec does not say how to handle this; let's just leave out the
7302              bounds.  */
7303         {;}
7304       
7305
7306 #ifndef MIPS_DEBUGGING_INFO
7307     }
7308 #endif
7309 }
7310
7311 static void
7312 add_byte_size_attribute (die, tree_node)
7313      dw_die_ref die;
7314      register tree tree_node;
7315 {
7316   register unsigned size;
7317
7318   switch (TREE_CODE (tree_node))
7319     {
7320     case ERROR_MARK:
7321       size = 0;
7322       break;
7323     case ENUMERAL_TYPE:
7324     case RECORD_TYPE:
7325     case UNION_TYPE:
7326     case QUAL_UNION_TYPE:
7327       size = int_size_in_bytes (tree_node);
7328       break;
7329     case FIELD_DECL:
7330       /* For a data member of a struct or union, the DW_AT_byte_size is
7331          generally given as the number of bytes normally allocated for an
7332          object of the *declared* type of the member itself.  This is true
7333          even for bit-fields.  */
7334       size = simple_type_size_in_bits (field_type (tree_node)) / BITS_PER_UNIT;
7335       break;
7336     default:
7337       abort ();
7338     }
7339
7340   /* Note that `size' might be -1 when we get to this point.  If it is, that
7341      indicates that the byte size of the entity in question is variable.  We
7342      have no good way of expressing this fact in Dwarf at the present time,
7343      so just let the -1 pass on through.  */
7344
7345   add_AT_unsigned (die, DW_AT_byte_size, size);
7346 }
7347
7348 /* For a FIELD_DECL node which represents a bit-field, output an attribute
7349    which specifies the distance in bits from the highest order bit of the
7350    "containing object" for the bit-field to the highest order bit of the
7351    bit-field itself.
7352
7353    For any given bit-field, the "containing object" is a hypothetical
7354    object (of some integral or enum type) within which the given bit-field
7355    lives.  The type of this hypothetical "containing object" is always the
7356    same as the declared type of the individual bit-field itself.  The
7357    determination of the exact location of the "containing object" for a
7358    bit-field is rather complicated.  It's handled by the
7359    `field_byte_offset' function (above).
7360
7361    Note that it is the size (in bytes) of the hypothetical "containing object"
7362    which will be given in the DW_AT_byte_size attribute for this bit-field.
7363    (See `byte_size_attribute' above).  */
7364
7365 static inline void
7366 add_bit_offset_attribute (die, decl)
7367      register dw_die_ref die;
7368      register tree decl;
7369 {
7370   register unsigned object_offset_in_bytes = field_byte_offset (decl);
7371   register tree type = DECL_BIT_FIELD_TYPE (decl);
7372   register tree bitpos_tree = DECL_FIELD_BITPOS (decl);
7373   register unsigned bitpos_int;
7374   register unsigned highest_order_object_bit_offset;
7375   register unsigned highest_order_field_bit_offset;
7376   register unsigned bit_offset;
7377
7378   /* Must be a field and a bit field.  */
7379   if (!type
7380       || TREE_CODE (decl) != FIELD_DECL)
7381     abort ();
7382
7383   /* We can't yet handle bit-fields whose offsets are variable, so if we
7384      encounter such things, just return without generating any attribute
7385      whatsoever.  */
7386   if (TREE_CODE (bitpos_tree) != INTEGER_CST)
7387     return;
7388
7389   bitpos_int = (unsigned) TREE_INT_CST_LOW (bitpos_tree);
7390
7391   /* Note that the bit offset is always the distance (in bits) from the
7392      highest-order bit of the "containing object" to the highest-order bit of 
7393      the bit-field itself.  Since the "high-order end" of any object or field 
7394      is different on big-endian and little-endian machines, the computation
7395      below must take account of these differences.  */
7396   highest_order_object_bit_offset = object_offset_in_bytes * BITS_PER_UNIT;
7397   highest_order_field_bit_offset = bitpos_int;
7398
7399   if (! BYTES_BIG_ENDIAN)
7400     {
7401       highest_order_field_bit_offset
7402         += (unsigned) TREE_INT_CST_LOW (DECL_SIZE (decl));
7403
7404       highest_order_object_bit_offset += simple_type_size_in_bits (type);
7405     }
7406
7407   bit_offset
7408     = (! BYTES_BIG_ENDIAN
7409        ? highest_order_object_bit_offset - highest_order_field_bit_offset
7410        : highest_order_field_bit_offset - highest_order_object_bit_offset);
7411
7412   add_AT_unsigned (die, DW_AT_bit_offset, bit_offset);
7413 }
7414
7415 /* For a FIELD_DECL node which represents a bit field, output an attribute
7416    which specifies the length in bits of the given field.  */
7417
7418 static inline void
7419 add_bit_size_attribute (die, decl)
7420      register dw_die_ref die;
7421      register tree decl;
7422 {
7423   /* Must be a field and a bit field.  */
7424   if (TREE_CODE (decl) != FIELD_DECL
7425       || ! DECL_BIT_FIELD_TYPE (decl))
7426     abort ();
7427   add_AT_unsigned (die, DW_AT_bit_size,
7428                    (unsigned) TREE_INT_CST_LOW (DECL_SIZE (decl)));
7429 }
7430
7431 /* If the compiled language is ANSI C, then add a 'prototyped'
7432    attribute, if arg types are given for the parameters of a function.  */
7433
7434 static inline void
7435 add_prototyped_attribute (die, func_type)
7436      register dw_die_ref die;
7437      register tree func_type;
7438 {
7439   if (get_AT_unsigned (comp_unit_die, DW_AT_language) == DW_LANG_C89
7440       && TYPE_ARG_TYPES (func_type) != NULL)
7441     add_AT_flag (die, DW_AT_prototyped, 1);
7442 }
7443
7444
7445 /* Add an 'abstract_origin' attribute below a given DIE.  The DIE is found
7446    by looking in either the type declaration or object declaration
7447    equate table.  */
7448
7449 static inline void
7450 add_abstract_origin_attribute (die, origin)
7451      register dw_die_ref die;
7452      register tree origin;
7453 {
7454   dw_die_ref origin_die = NULL;
7455
7456   if (TREE_CODE_CLASS (TREE_CODE (origin)) == 'd')
7457     origin_die = lookup_decl_die (origin);
7458   else if (TREE_CODE_CLASS (TREE_CODE (origin)) == 't')
7459     origin_die = lookup_type_die (origin);
7460
7461   if (origin_die == NULL)
7462     abort ();
7463   
7464   add_AT_die_ref (die, DW_AT_abstract_origin, origin_die);
7465 }
7466
7467 /* We do not currently support the pure_virtual attribute.  */
7468
7469 static inline void
7470 add_pure_or_virtual_attribute (die, func_decl)
7471      register dw_die_ref die;
7472      register tree func_decl;
7473 {
7474   if (DECL_VINDEX (func_decl))
7475     {
7476       add_AT_unsigned (die, DW_AT_virtuality, DW_VIRTUALITY_virtual);
7477       add_AT_loc (die, DW_AT_vtable_elem_location,
7478                   new_loc_descr (DW_OP_constu,
7479                                  TREE_INT_CST_LOW (DECL_VINDEX (func_decl)),
7480                                  0));
7481
7482       /* GNU extension: Record what type this method came from originally.  */
7483       if (debug_info_level > DINFO_LEVEL_TERSE)
7484         add_AT_die_ref (die, DW_AT_containing_type,
7485                         lookup_type_die (DECL_CONTEXT (func_decl)));
7486     }
7487 }
7488 \f
7489 /* Add source coordinate attributes for the given decl.  */
7490
7491 static void
7492 add_src_coords_attributes (die, decl)
7493      register dw_die_ref die;
7494      register tree decl;
7495 {
7496   register unsigned file_index = lookup_filename (DECL_SOURCE_FILE (decl));
7497
7498   add_AT_unsigned (die, DW_AT_decl_file, file_index);
7499   add_AT_unsigned (die, DW_AT_decl_line, DECL_SOURCE_LINE (decl));
7500 }
7501
7502 /* Add an DW_AT_name attribute and source coordinate attribute for the
7503    given decl, but only if it actually has a name.  */
7504
7505 static void
7506 add_name_and_src_coords_attributes (die, decl)
7507      register dw_die_ref die;
7508      register tree decl;
7509 {
7510   register tree decl_name;
7511
7512   decl_name = DECL_NAME (decl); 
7513   if (decl_name != NULL && IDENTIFIER_POINTER (decl_name) != NULL)
7514     {
7515       add_name_attribute (die, dwarf2_name (decl, 0));
7516       if (! DECL_ARTIFICIAL (decl))
7517         add_src_coords_attributes (die, decl);
7518
7519       if ((TREE_CODE (decl) == FUNCTION_DECL || TREE_CODE (decl) == VAR_DECL)
7520           && DECL_ASSEMBLER_NAME (decl) != DECL_NAME (decl))
7521         add_AT_string (die, DW_AT_MIPS_linkage_name,
7522                        IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)));
7523     }
7524 }
7525
7526 /* Push a new declaration scope. */
7527
7528 static void
7529 push_decl_scope (scope)
7530      tree scope;
7531 {
7532   /* Make room in the decl_scope_table, if necessary.  */
7533   if (decl_scope_table_allocated == decl_scope_depth)
7534     {
7535       decl_scope_table_allocated += DECL_SCOPE_TABLE_INCREMENT;
7536       decl_scope_table
7537         = (decl_scope_node *) xrealloc (decl_scope_table,
7538                                         (decl_scope_table_allocated
7539                                          * sizeof (decl_scope_node)));
7540     }
7541
7542   decl_scope_table[decl_scope_depth].scope = scope;
7543
7544   /* If we're starting to emit a global class while we're in the middle
7545      of emitting a function, we need to find the proper .previous.  */
7546
7547   if (AGGREGATE_TYPE_P (scope))
7548     {
7549       tree containing_scope = TYPE_CONTEXT (scope);
7550       int i;
7551
7552       for (i = decl_scope_depth - 1; i >= 0; --i)
7553         if (decl_scope_table[i].scope == containing_scope)
7554           break;
7555
7556       decl_scope_table[decl_scope_depth].previous = i;
7557     }
7558   else
7559     decl_scope_table[decl_scope_depth].previous = decl_scope_depth - 1;
7560
7561   decl_scope_depth++;
7562 }
7563
7564 /* Return the DIE for the scope that immediately contains this declaration.  */
7565
7566 static dw_die_ref
7567 scope_die_for (t, context_die)
7568     register tree t; 
7569     register dw_die_ref context_die;
7570 {
7571   register dw_die_ref scope_die = NULL;
7572   register tree containing_scope;
7573   register int i;
7574
7575   /* Walk back up the declaration tree looking for a place to define
7576      this type.  */
7577   if (TREE_CODE_CLASS (TREE_CODE (t)) == 't')
7578     containing_scope = TYPE_CONTEXT (t);
7579   else if (TREE_CODE (t) == FUNCTION_DECL && DECL_VINDEX (t))
7580     containing_scope = decl_class_context (t);
7581   else
7582     containing_scope = DECL_CONTEXT (t);
7583
7584   /* Ignore namespaces for the moment.  */
7585   if (containing_scope && TREE_CODE (containing_scope) == NAMESPACE_DECL)
7586     containing_scope = NULL_TREE;
7587
7588   /* Ignore function type "scopes" from the C frontend.  They mean that
7589      a tagged type is local to a parmlist of a function declarator, but
7590      that isn't useful to DWARF.  */
7591   if (containing_scope && TREE_CODE (containing_scope) == FUNCTION_TYPE)
7592     containing_scope = NULL_TREE;
7593
7594   /* Function-local tags and functions get stuck in limbo until they are
7595      fixed up by decls_for_scope.  */
7596   if (context_die == NULL && containing_scope != NULL_TREE
7597       && (TREE_CODE (t) == FUNCTION_DECL || is_tagged_type (t)))
7598     return NULL;
7599
7600   if (containing_scope == NULL_TREE)
7601     scope_die = comp_unit_die;
7602   else if (TYPE_P (containing_scope) || DECL_P (containing_scope))
7603     {
7604       /* For types and decls, we can just look up the appropriate DIE.  But
7605          first we check to see if we're in the middle of emitting it so we
7606          know where the new DIE should go.  */
7607
7608       for (i = decl_scope_depth - 1; i >= 0; --i)
7609         if (decl_scope_table[i].scope == containing_scope)
7610           break;
7611
7612       if (i < 0)
7613         {
7614           /* Function-local tags and functions get stuck in limbo
7615              until they are fixed up by decls_for_scope.  */
7616           if (TREE_CODE (containing_scope) == FUNCTION_DECL
7617               && (TREE_CODE (t) == FUNCTION_DECL || is_tagged_type (t)))
7618             return NULL;
7619             
7620           if (! TYPE_P (containing_scope))
7621             abort ();
7622           if (debug_info_level > DINFO_LEVEL_TERSE
7623               && !TREE_ASM_WRITTEN (containing_scope))
7624             abort ();
7625
7626           /* If none of the current dies are suitable, we get file scope.  */
7627           scope_die = comp_unit_die;
7628         }
7629       else
7630         {
7631           if (TYPE_P (containing_scope))
7632             scope_die = lookup_type_die (containing_scope);
7633           else
7634             scope_die = lookup_decl_die (containing_scope);
7635         }
7636     }
7637   else
7638     {
7639       /* Something that we can't just look up the DIE for, such as a
7640          BLOCK.  */
7641
7642       for (i = decl_scope_depth - 1, scope_die = context_die;
7643            i >= 0 && decl_scope_table[i].scope != containing_scope;
7644            (scope_die = scope_die->die_parent,
7645             i = decl_scope_table[i].previous))
7646         ;
7647
7648       /* ??? Integrate_decl_tree does not handle BLOCK_TYPE_TAGS, nor
7649          does it try to handle types defined by TYPE_DECLs.  Such types
7650          thus have an incorrect TYPE_CONTEXT, which points to the block
7651          they were originally defined in, instead of the current block
7652          created by function inlining.  We try to detect that here and
7653          work around it.  */
7654
7655       if (i < 0 && scope_die == comp_unit_die
7656           && TREE_CODE (containing_scope) == BLOCK
7657           && is_tagged_type (t)
7658           && (block_ultimate_origin (decl_scope_table[decl_scope_depth - 1].scope)
7659               == containing_scope))
7660         {
7661           scope_die = context_die;
7662           /* Since the checks below are no longer applicable.  */
7663           i = 0;
7664         }
7665
7666       if (i < 0)
7667         abort ();
7668     }
7669
7670   return scope_die;
7671 }
7672
7673 /* Pop a declaration scope.  */
7674 static inline void
7675 pop_decl_scope ()
7676 {
7677   if (decl_scope_depth <= 0)
7678     abort ();
7679   --decl_scope_depth;
7680 }
7681
7682 /* Many forms of DIEs require a "type description" attribute.  This
7683    routine locates the proper "type descriptor" die for the type given
7684    by 'type', and adds an DW_AT_type attribute below the given die.  */
7685
7686 static void
7687 add_type_attribute (object_die, type, decl_const, decl_volatile, context_die)
7688      register dw_die_ref object_die;
7689      register tree type;
7690      register int decl_const;
7691      register int decl_volatile;
7692      register dw_die_ref context_die;
7693 {
7694   register enum tree_code code  = TREE_CODE (type);
7695   register dw_die_ref type_die  = NULL;
7696
7697   /* ??? If this type is an unnamed subrange type of an integral or
7698      floating-point type, use the inner type.  This is because we have no
7699      support for unnamed types in base_type_die.  This can happen if this is
7700      an Ada subrange type.  Correct solution is emit a subrange type die.  */
7701   if ((code == INTEGER_TYPE || code == REAL_TYPE)
7702       && TREE_TYPE (type) != 0 && TYPE_NAME (type) == 0)
7703     type = TREE_TYPE (type), code = TREE_CODE (type);
7704
7705   if (code == ERROR_MARK)
7706     return;
7707
7708   /* Handle a special case.  For functions whose return type is void, we
7709      generate *no* type attribute.  (Note that no object may have type
7710      `void', so this only applies to function return types).  */
7711   if (code == VOID_TYPE)
7712     return;
7713
7714   type_die = modified_type_die (type,
7715                                 decl_const || TYPE_READONLY (type),
7716                                 decl_volatile || TYPE_VOLATILE (type),
7717                                 context_die);
7718   if (type_die != NULL)
7719     add_AT_die_ref (object_die, DW_AT_type, type_die);
7720 }
7721
7722 /* Given a tree pointer to a struct, class, union, or enum type node, return
7723    a pointer to the (string) tag name for the given type, or zero if the type
7724    was declared without a tag.  */
7725
7726 static char *
7727 type_tag (type)
7728      register tree type;
7729 {
7730   register char *name = 0;
7731
7732   if (TYPE_NAME (type) != 0)
7733     {
7734       register tree t = 0;
7735
7736       /* Find the IDENTIFIER_NODE for the type name.  */
7737       if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE)
7738         t = TYPE_NAME (type);
7739
7740       /* The g++ front end makes the TYPE_NAME of *each* tagged type point to 
7741          a TYPE_DECL node, regardless of whether or not a `typedef' was
7742          involved.  */
7743       else if (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
7744                && ! DECL_IGNORED_P (TYPE_NAME (type)))
7745         t = DECL_NAME (TYPE_NAME (type));
7746
7747       /* Now get the name as a string, or invent one.  */
7748       if (t != 0)
7749         name = IDENTIFIER_POINTER (t);
7750     }
7751
7752   return (name == 0 || *name == '\0') ? 0 : name;
7753 }
7754
7755 /* Return the type associated with a data member, make a special check
7756    for bit field types.  */
7757
7758 static inline tree
7759 member_declared_type (member)
7760      register tree member;
7761 {
7762   return (DECL_BIT_FIELD_TYPE (member)
7763           ? DECL_BIT_FIELD_TYPE (member)
7764           : TREE_TYPE (member));
7765 }
7766
7767 /* Get the decl's label, as described by its RTL. This may be different
7768    from the DECL_NAME name used in the source file.  */
7769
7770 #if 0
7771 static char *
7772 decl_start_label (decl)
7773      register tree decl;
7774 {
7775   rtx x;
7776   char *fnname;
7777   x = DECL_RTL (decl);
7778   if (GET_CODE (x) != MEM)
7779     abort ();
7780
7781   x = XEXP (x, 0);
7782   if (GET_CODE (x) != SYMBOL_REF)
7783     abort ();
7784
7785   fnname = XSTR (x, 0);
7786   return fnname;
7787 }
7788 #endif
7789 \f
7790 /* These routines generate the internal representation of the DIE's for
7791    the compilation unit.  Debugging information is collected by walking
7792    the declaration trees passed in from dwarf2out_decl().  */
7793
7794 static void
7795 gen_array_type_die (type, context_die)
7796      register tree type;
7797      register dw_die_ref context_die;
7798 {
7799   register dw_die_ref scope_die = scope_die_for (type, context_die);
7800   register dw_die_ref array_die;
7801   register tree element_type;
7802
7803   /* ??? The SGI dwarf reader fails for array of array of enum types unless
7804      the inner array type comes before the outer array type.  Thus we must
7805      call gen_type_die before we call new_die.  See below also.  */
7806 #ifdef MIPS_DEBUGGING_INFO
7807   gen_type_die (TREE_TYPE (type), context_die);
7808 #endif
7809
7810   array_die = new_die (DW_TAG_array_type, scope_die);
7811
7812 #if 0
7813   /* We default the array ordering.  SDB will probably do
7814      the right things even if DW_AT_ordering is not present.  It's not even
7815      an issue until we start to get into multidimensional arrays anyway.  If
7816      SDB is ever caught doing the Wrong Thing for multi-dimensional arrays,
7817      then we'll have to put the DW_AT_ordering attribute back in.  (But if
7818      and when we find out that we need to put these in, we will only do so
7819      for multidimensional arrays.  */
7820   add_AT_unsigned (array_die, DW_AT_ordering, DW_ORD_row_major);
7821 #endif
7822
7823 #ifdef MIPS_DEBUGGING_INFO
7824   /* The SGI compilers handle arrays of unknown bound by setting
7825      AT_declaration and not emitting any subrange DIEs.  */
7826   if (! TYPE_DOMAIN (type))
7827     add_AT_unsigned (array_die, DW_AT_declaration, 1);
7828   else
7829 #endif
7830     add_subscript_info (array_die, type);
7831
7832   add_name_attribute (array_die, type_tag (type));
7833   equate_type_number_to_die (type, array_die);
7834
7835   /* Add representation of the type of the elements of this array type.  */
7836   element_type = TREE_TYPE (type);
7837
7838   /* ??? The SGI dwarf reader fails for multidimensional arrays with a
7839      const enum type.  E.g. const enum machine_mode insn_operand_mode[2][10].
7840      We work around this by disabling this feature.  See also
7841      add_subscript_info.  */
7842 #ifndef MIPS_DEBUGGING_INFO
7843   while (TREE_CODE (element_type) == ARRAY_TYPE)
7844     element_type = TREE_TYPE (element_type);
7845
7846   gen_type_die (element_type, context_die);
7847 #endif
7848
7849   add_type_attribute (array_die, element_type, 0, 0, context_die);
7850 }
7851
7852 static void
7853 gen_set_type_die (type, context_die)
7854      register tree type;
7855      register dw_die_ref context_die;
7856 {
7857   register dw_die_ref type_die
7858     = new_die (DW_TAG_set_type, scope_die_for (type, context_die));
7859
7860   equate_type_number_to_die (type, type_die);
7861   add_type_attribute (type_die, TREE_TYPE (type), 0, 0, context_die);
7862 }
7863
7864 #if 0
7865 static void
7866 gen_entry_point_die (decl, context_die)
7867      register tree decl;
7868      register dw_die_ref context_die;
7869 {
7870   register tree origin = decl_ultimate_origin (decl);
7871   register dw_die_ref decl_die = new_die (DW_TAG_entry_point, context_die);
7872   if (origin != NULL)
7873     add_abstract_origin_attribute (decl_die, origin);
7874   else
7875     {
7876       add_name_and_src_coords_attributes (decl_die, decl);
7877       add_type_attribute (decl_die, TREE_TYPE (TREE_TYPE (decl)),
7878                           0, 0, context_die);
7879     }
7880
7881   if (DECL_ABSTRACT (decl))
7882     equate_decl_number_to_die (decl, decl_die);
7883   else
7884     add_AT_lbl_id (decl_die, DW_AT_low_pc, decl_start_label (decl));
7885 }
7886 #endif
7887
7888 /* Remember a type in the pending_types_list.  */
7889
7890 static void
7891 pend_type (type)
7892      register tree type;
7893 {
7894   if (pending_types == pending_types_allocated)
7895     {
7896       pending_types_allocated += PENDING_TYPES_INCREMENT;
7897       pending_types_list
7898         = (tree *) xrealloc (pending_types_list,
7899                              sizeof (tree) * pending_types_allocated);
7900     }
7901
7902   pending_types_list[pending_types++] = type;
7903 }
7904
7905 /* Output any pending types (from the pending_types list) which we can output
7906    now (taking into account the scope that we are working on now).
7907
7908    For each type output, remove the given type from the pending_types_list
7909    *before* we try to output it.  */
7910
7911 static void
7912 output_pending_types_for_scope (context_die)
7913      register dw_die_ref context_die;
7914 {
7915   register tree type;
7916
7917   while (pending_types)
7918     {
7919       --pending_types;
7920       type = pending_types_list[pending_types];
7921       gen_type_die (type, context_die);
7922       if (!TREE_ASM_WRITTEN (type))
7923         abort ();
7924     }
7925 }
7926
7927 /* Remember a type in the incomplete_types_list.  */
7928
7929 static void
7930 add_incomplete_type (type)
7931      tree type;
7932 {
7933   if (incomplete_types == incomplete_types_allocated)
7934     {
7935       incomplete_types_allocated += INCOMPLETE_TYPES_INCREMENT;
7936       incomplete_types_list
7937         = (tree *) xrealloc (incomplete_types_list,
7938                              sizeof (tree) * incomplete_types_allocated);
7939     }
7940
7941   incomplete_types_list[incomplete_types++] = type;
7942 }
7943
7944 /* Walk through the list of incomplete types again, trying once more to
7945    emit full debugging info for them.  */
7946
7947 static void
7948 retry_incomplete_types ()
7949 {
7950   register tree type;
7951
7952   while (incomplete_types)
7953     {
7954       --incomplete_types;
7955       type = incomplete_types_list[incomplete_types];
7956       gen_type_die (type, comp_unit_die);
7957     }
7958 }
7959
7960 /* Generate a DIE to represent an inlined instance of an enumeration type.  */
7961
7962 static void
7963 gen_inlined_enumeration_type_die (type, context_die)
7964      register tree type;
7965      register dw_die_ref context_die;
7966 {
7967   register dw_die_ref type_die = new_die (DW_TAG_enumeration_type,
7968                                           scope_die_for (type, context_die));
7969   /* We do not check for TREE_ASM_WRITTEN (type) being set, as the type may
7970      be incomplete and such types are not marked.  */
7971   add_abstract_origin_attribute (type_die, type);
7972 }
7973
7974 /* Generate a DIE to represent an inlined instance of a structure type.  */
7975
7976 static void
7977 gen_inlined_structure_type_die (type, context_die)
7978      register tree type;
7979      register dw_die_ref context_die;
7980 {
7981   register dw_die_ref type_die = new_die (DW_TAG_structure_type,
7982                                           scope_die_for (type, context_die));
7983   /* We do not check for TREE_ASM_WRITTEN (type) being set, as the type may
7984      be incomplete and such types are not marked.  */
7985   add_abstract_origin_attribute (type_die, type);
7986 }
7987
7988 /* Generate a DIE to represent an inlined instance of a union type.  */
7989
7990 static void
7991 gen_inlined_union_type_die (type, context_die)
7992      register tree type;
7993      register dw_die_ref context_die;
7994 {
7995   register dw_die_ref type_die = new_die (DW_TAG_union_type,
7996                                           scope_die_for (type, context_die));
7997   /* We do not check for TREE_ASM_WRITTEN (type) being set, as the type may
7998      be incomplete and such types are not marked.  */
7999   add_abstract_origin_attribute (type_die, type);
8000 }
8001
8002 /* Generate a DIE to represent an enumeration type.  Note that these DIEs
8003    include all of the information about the enumeration values also. Each
8004    enumerated type name/value is listed as a child of the enumerated type
8005    DIE.  */
8006
8007 static void
8008 gen_enumeration_type_die (type, context_die)
8009      register tree type;
8010      register dw_die_ref context_die;
8011 {
8012   register dw_die_ref type_die = lookup_type_die (type);
8013
8014   if (type_die == NULL)
8015     {
8016       type_die = new_die (DW_TAG_enumeration_type,
8017                           scope_die_for (type, context_die));
8018       equate_type_number_to_die (type, type_die);
8019       add_name_attribute (type_die, type_tag (type));
8020     }
8021   else if (! TYPE_SIZE (type))
8022     return;
8023   else
8024     remove_AT (type_die, DW_AT_declaration);
8025
8026   /* Handle a GNU C/C++ extension, i.e. incomplete enum types.  If the
8027      given enum type is incomplete, do not generate the DW_AT_byte_size
8028      attribute or the DW_AT_element_list attribute.  */
8029   if (TYPE_SIZE (type))
8030     {
8031       register tree link;
8032
8033       TREE_ASM_WRITTEN (type) = 1;
8034       add_byte_size_attribute (type_die, type);
8035       if (TYPE_STUB_DECL (type) != NULL_TREE)
8036         add_src_coords_attributes (type_die, TYPE_STUB_DECL (type));
8037
8038       /* If the first reference to this type was as the return type of an
8039          inline function, then it may not have a parent.  Fix this now.  */
8040       if (type_die->die_parent == NULL)
8041         add_child_die (scope_die_for (type, context_die), type_die);
8042
8043       for (link = TYPE_FIELDS (type);
8044            link != NULL; link = TREE_CHAIN (link))
8045         {
8046           register dw_die_ref enum_die = new_die (DW_TAG_enumerator, type_die);
8047
8048           add_name_attribute (enum_die,
8049                               IDENTIFIER_POINTER (TREE_PURPOSE (link)));
8050           add_AT_unsigned (enum_die, DW_AT_const_value,
8051                            (unsigned) TREE_INT_CST_LOW (TREE_VALUE (link)));
8052         }
8053     }
8054   else
8055     add_AT_flag (type_die, DW_AT_declaration, 1);
8056 }
8057
8058
8059 /* Generate a DIE to represent either a real live formal parameter decl or to
8060    represent just the type of some formal parameter position in some function
8061    type.
8062
8063    Note that this routine is a bit unusual because its argument may be a
8064    ..._DECL node (i.e. either a PARM_DECL or perhaps a VAR_DECL which
8065    represents an inlining of some PARM_DECL) or else some sort of a ..._TYPE
8066    node.  If it's the former then this function is being called to output a
8067    DIE to represent a formal parameter object (or some inlining thereof).  If
8068    it's the latter, then this function is only being called to output a
8069    DW_TAG_formal_parameter DIE to stand as a placeholder for some formal
8070    argument type of some subprogram type.  */
8071
8072 static dw_die_ref
8073 gen_formal_parameter_die (node, context_die)
8074      register tree node;
8075      register dw_die_ref context_die;
8076 {
8077   register dw_die_ref parm_die
8078     = new_die (DW_TAG_formal_parameter, context_die);
8079   register tree origin;
8080
8081   switch (TREE_CODE_CLASS (TREE_CODE (node)))
8082     {
8083     case 'd':
8084       origin = decl_ultimate_origin (node);
8085       if (origin != NULL)
8086         add_abstract_origin_attribute (parm_die, origin);
8087       else
8088         {
8089           add_name_and_src_coords_attributes (parm_die, node);
8090           add_type_attribute (parm_die, TREE_TYPE (node),
8091                               TREE_READONLY (node),
8092                               TREE_THIS_VOLATILE (node),
8093                               context_die);
8094           if (DECL_ARTIFICIAL (node))
8095             add_AT_flag (parm_die, DW_AT_artificial, 1);
8096         }
8097
8098       equate_decl_number_to_die (node, parm_die);
8099       if (! DECL_ABSTRACT (node))
8100         add_location_or_const_value_attribute (parm_die, node);
8101
8102       break;
8103
8104     case 't':
8105       /* We were called with some kind of a ..._TYPE node.  */
8106       add_type_attribute (parm_die, node, 0, 0, context_die);
8107       break;
8108
8109     default:
8110       abort ();
8111     }
8112
8113   return parm_die;
8114 }
8115
8116 /* Generate a special type of DIE used as a stand-in for a trailing ellipsis
8117    at the end of an (ANSI prototyped) formal parameters list.  */
8118
8119 static void
8120 gen_unspecified_parameters_die (decl_or_type, context_die)
8121      register tree decl_or_type ATTRIBUTE_UNUSED;
8122      register dw_die_ref context_die;
8123 {
8124   new_die (DW_TAG_unspecified_parameters, context_die);
8125 }
8126
8127 /* Generate a list of nameless DW_TAG_formal_parameter DIEs (and perhaps a
8128    DW_TAG_unspecified_parameters DIE) to represent the types of the formal
8129    parameters as specified in some function type specification (except for
8130    those which appear as part of a function *definition*).
8131
8132    Note we must be careful here to output all of the parameter DIEs before*
8133    we output any DIEs needed to represent the types of the formal parameters.
8134    This keeps svr4 SDB happy because it (incorrectly) thinks that the first
8135    non-parameter DIE it sees ends the formal parameter list.  */
8136
8137 static void
8138 gen_formal_types_die (function_or_method_type, context_die)
8139      register tree function_or_method_type;
8140      register dw_die_ref context_die;
8141 {
8142   register tree link;
8143   register tree formal_type = NULL;
8144   register tree first_parm_type = TYPE_ARG_TYPES (function_or_method_type);
8145
8146 #if 0
8147   /* In the case where we are generating a formal types list for a C++
8148      non-static member function type, skip over the first thing on the
8149      TYPE_ARG_TYPES list because it only represents the type of the hidden
8150      `this pointer'.  The debugger should be able to figure out (without
8151      being explicitly told) that this non-static member function type takes a 
8152      `this pointer' and should be able to figure what the type of that hidden 
8153      parameter is from the DW_AT_member attribute of the parent
8154      DW_TAG_subroutine_type DIE.  */
8155   if (TREE_CODE (function_or_method_type) == METHOD_TYPE)
8156     first_parm_type = TREE_CHAIN (first_parm_type);
8157 #endif
8158
8159   /* Make our first pass over the list of formal parameter types and output a 
8160      DW_TAG_formal_parameter DIE for each one.  */
8161   for (link = first_parm_type; link; link = TREE_CHAIN (link))
8162     {
8163       register dw_die_ref parm_die;
8164       
8165       formal_type = TREE_VALUE (link);
8166       if (formal_type == void_type_node)
8167         break;
8168
8169       /* Output a (nameless) DIE to represent the formal parameter itself.  */
8170       parm_die = gen_formal_parameter_die (formal_type, context_die);
8171       if (TREE_CODE (function_or_method_type) == METHOD_TYPE
8172           && link == first_parm_type)
8173         add_AT_flag (parm_die, DW_AT_artificial, 1);
8174     }
8175
8176   /* If this function type has an ellipsis, add a
8177      DW_TAG_unspecified_parameters DIE to the end of the parameter list.  */
8178   if (formal_type != void_type_node)
8179     gen_unspecified_parameters_die (function_or_method_type, context_die);
8180
8181   /* Make our second (and final) pass over the list of formal parameter types 
8182      and output DIEs to represent those types (as necessary).  */
8183   for (link = TYPE_ARG_TYPES (function_or_method_type);
8184        link;
8185        link = TREE_CHAIN (link))
8186     {
8187       formal_type = TREE_VALUE (link);
8188       if (formal_type == void_type_node)
8189         break;
8190
8191       gen_type_die (formal_type, context_die);
8192     }
8193 }
8194
8195 /* Generate a DIE to represent a declared function (either file-scope or
8196    block-local).  */
8197
8198 static void
8199 gen_subprogram_die (decl, context_die)
8200      register tree decl;
8201      register dw_die_ref context_die;
8202 {
8203   char label_id[MAX_ARTIFICIAL_LABEL_BYTES];
8204   register tree origin = decl_ultimate_origin (decl);
8205   register dw_die_ref subr_die;
8206   register rtx fp_reg;
8207   register tree fn_arg_types;
8208   register tree outer_scope;
8209   register dw_die_ref old_die = lookup_decl_die (decl);
8210   register int declaration
8211     = (current_function_decl != decl
8212        || (context_die
8213            && (context_die->die_tag == DW_TAG_structure_type
8214                || context_die->die_tag == DW_TAG_union_type)));
8215
8216   if (origin != NULL)
8217     {
8218       subr_die = new_die (DW_TAG_subprogram, context_die);
8219       add_abstract_origin_attribute (subr_die, origin);
8220     }
8221   else if (old_die && DECL_ABSTRACT (decl)
8222            && get_AT_unsigned (old_die, DW_AT_inline))
8223     {
8224       /* This must be a redefinition of an extern inline function.
8225          We can just reuse the old die here.  */
8226       subr_die = old_die;
8227
8228       /* Clear out the inlined attribute and parm types.  */
8229       remove_AT (subr_die, DW_AT_inline);
8230       remove_children (subr_die);
8231     }
8232   else if (old_die)
8233     {
8234       register unsigned file_index
8235         = lookup_filename (DECL_SOURCE_FILE (decl));
8236
8237       if (get_AT_flag (old_die, DW_AT_declaration) != 1)
8238         {
8239           /* ??? This can happen if there is a bug in the program, for
8240              instance, if it has duplicate function definitions.  Ideally,
8241              we should detect this case and ignore it.  For now, if we have
8242              already reported an error, any error at all, then assume that
8243              we got here because of a input error, not a dwarf2 bug.  */
8244           if (errorcount)
8245             return;
8246           abort ();
8247         }
8248
8249       /* If the definition comes from the same place as the declaration,
8250          maybe use the old DIE.  We always want the DIE for this function
8251          that has the *_pc attributes to be under comp_unit_die so the
8252          debugger can find it.  For inlines, that is the concrete instance,
8253          so we can use the old DIE here.  For non-inline methods, we want a
8254          specification DIE at toplevel, so we need a new DIE.  For local
8255          class methods, this doesn't apply; we just use the old DIE.  */
8256       if ((DECL_ABSTRACT (decl) || old_die->die_parent == comp_unit_die
8257            || context_die == NULL)
8258           && (DECL_ARTIFICIAL (decl)
8259               || (get_AT_unsigned (old_die, DW_AT_decl_file) == file_index
8260                   && (get_AT_unsigned (old_die, DW_AT_decl_line)
8261                       == (unsigned)DECL_SOURCE_LINE (decl)))))
8262         {
8263           subr_die = old_die;
8264
8265           /* Clear out the declaration attribute and the parm types.  */
8266           remove_AT (subr_die, DW_AT_declaration);
8267           remove_children (subr_die);
8268         }
8269       else
8270         {
8271           subr_die = new_die (DW_TAG_subprogram, context_die);
8272           add_AT_die_ref (subr_die, DW_AT_specification, old_die);
8273           if (get_AT_unsigned (old_die, DW_AT_decl_file) != file_index)
8274             add_AT_unsigned (subr_die, DW_AT_decl_file, file_index);
8275           if (get_AT_unsigned (old_die, DW_AT_decl_line)
8276               != (unsigned)DECL_SOURCE_LINE (decl))
8277             add_AT_unsigned
8278               (subr_die, DW_AT_decl_line, DECL_SOURCE_LINE (decl));
8279         }
8280     }
8281   else
8282     {
8283       register dw_die_ref scope_die;
8284
8285       if (DECL_CONTEXT (decl))
8286         scope_die = scope_die_for (decl, context_die);
8287       else
8288         /* Don't put block extern declarations under comp_unit_die.  */
8289         scope_die = context_die;
8290
8291       subr_die = new_die (DW_TAG_subprogram, scope_die);
8292                          
8293       if (TREE_PUBLIC (decl))
8294         add_AT_flag (subr_die, DW_AT_external, 1);
8295
8296       add_name_and_src_coords_attributes (subr_die, decl);
8297       if (debug_info_level > DINFO_LEVEL_TERSE)
8298         {
8299           register tree type = TREE_TYPE (decl);
8300
8301           add_prototyped_attribute (subr_die, type);
8302           add_type_attribute (subr_die, TREE_TYPE (type), 0, 0, context_die);
8303         }
8304
8305       add_pure_or_virtual_attribute (subr_die, decl);
8306       if (DECL_ARTIFICIAL (decl))
8307         add_AT_flag (subr_die, DW_AT_artificial, 1);
8308       if (TREE_PROTECTED (decl))
8309         add_AT_unsigned (subr_die, DW_AT_accessibility, DW_ACCESS_protected);
8310       else if (TREE_PRIVATE (decl))
8311         add_AT_unsigned (subr_die, DW_AT_accessibility, DW_ACCESS_private);
8312     }
8313
8314   if (declaration)
8315     {
8316       add_AT_flag (subr_die, DW_AT_declaration, 1);
8317
8318       /* The first time we see a member function, it is in the context of
8319          the class to which it belongs.  We make sure of this by emitting
8320          the class first.  The next time is the definition, which is
8321          handled above.  The two may come from the same source text.  */
8322       if (DECL_CONTEXT (decl))
8323         equate_decl_number_to_die (decl, subr_die);
8324     }
8325   else if (DECL_ABSTRACT (decl))
8326     {
8327       /* ??? Checking DECL_DEFER_OUTPUT is correct for static inline functions,
8328          but not for extern inline functions.  We can't get this completely
8329          correct because information about whether the function was declared
8330          inline is not saved anywhere.  */
8331       if (DECL_DEFER_OUTPUT (decl))
8332         {
8333           if (DECL_INLINE (decl) && !flag_no_inline)
8334             add_AT_unsigned (subr_die, DW_AT_inline, DW_INL_declared_inlined);
8335           else
8336             add_AT_unsigned (subr_die, DW_AT_inline,
8337                              DW_INL_declared_not_inlined);
8338         }
8339       else if (DECL_INLINE (decl) && !flag_no_inline)
8340         add_AT_unsigned (subr_die, DW_AT_inline, DW_INL_inlined);
8341       else
8342         abort ();
8343
8344       equate_decl_number_to_die (decl, subr_die);
8345     }
8346   else if (!DECL_EXTERNAL (decl))
8347     {
8348       if (origin == NULL_TREE)
8349         equate_decl_number_to_die (decl, subr_die);
8350
8351       ASM_GENERATE_INTERNAL_LABEL (label_id, FUNC_BEGIN_LABEL,
8352                                    current_funcdef_number);
8353       add_AT_lbl_id (subr_die, DW_AT_low_pc, label_id);
8354       ASM_GENERATE_INTERNAL_LABEL (label_id, FUNC_END_LABEL,
8355                                    current_funcdef_number);
8356       add_AT_lbl_id (subr_die, DW_AT_high_pc, label_id);
8357
8358       add_pubname (decl, subr_die);
8359       add_arange (decl, subr_die);
8360
8361 #ifdef MIPS_DEBUGGING_INFO
8362       /* Add a reference to the FDE for this routine.  */
8363       add_AT_fde_ref (subr_die, DW_AT_MIPS_fde, current_funcdef_fde);
8364 #endif
8365
8366       /* Define the "frame base" location for this routine.  We use the
8367          frame pointer or stack pointer registers, since the RTL for local
8368          variables is relative to one of them.  */
8369       fp_reg
8370         = frame_pointer_needed ? hard_frame_pointer_rtx : stack_pointer_rtx;
8371       add_AT_loc (subr_die, DW_AT_frame_base, reg_loc_descriptor (fp_reg));
8372
8373 #if 0
8374       /* ??? This fails for nested inline functions, because context_display
8375          is not part of the state saved/restored for inline functions.  */
8376       if (current_function_needs_context)
8377         add_AT_location_description (subr_die, DW_AT_static_link,
8378                                      lookup_static_chain (decl));
8379 #endif
8380     }
8381
8382   /* Now output descriptions of the arguments for this function. This gets
8383      (unnecessarily?) complex because of the fact that the DECL_ARGUMENT list 
8384      for a FUNCTION_DECL doesn't indicate cases where there was a trailing
8385      `...' at the end of the formal parameter list.  In order to find out if
8386      there was a trailing ellipsis or not, we must instead look at the type
8387      associated with the FUNCTION_DECL.  This will be a node of type
8388      FUNCTION_TYPE. If the chain of type nodes hanging off of this
8389      FUNCTION_TYPE node ends with a void_type_node then there should *not* be 
8390      an ellipsis at the end.  */
8391   push_decl_scope (decl);
8392
8393   /* In the case where we are describing a mere function declaration, all we
8394      need to do here (and all we *can* do here) is to describe the *types* of 
8395      its formal parameters.  */
8396   if (debug_info_level <= DINFO_LEVEL_TERSE)
8397     ;
8398   else if (declaration)
8399     gen_formal_types_die (TREE_TYPE (decl), subr_die);
8400   else
8401     {
8402       /* Generate DIEs to represent all known formal parameters */
8403       register tree arg_decls = DECL_ARGUMENTS (decl);
8404       register tree parm;
8405
8406       /* When generating DIEs, generate the unspecified_parameters DIE
8407          instead if we come across the arg "__builtin_va_alist" */
8408       for (parm = arg_decls; parm; parm = TREE_CHAIN (parm))
8409         if (TREE_CODE (parm) == PARM_DECL)
8410           {
8411             if (DECL_NAME (parm)
8412                 && !strcmp (IDENTIFIER_POINTER (DECL_NAME (parm)),
8413                             "__builtin_va_alist"))
8414               gen_unspecified_parameters_die (parm, subr_die);
8415             else
8416               gen_decl_die (parm, subr_die);
8417           }
8418
8419       /* Decide whether we need a unspecified_parameters DIE at the end.
8420          There are 2 more cases to do this for: 1) the ansi ... declaration - 
8421          this is detectable when the end of the arg list is not a
8422          void_type_node 2) an unprototyped function declaration (not a
8423          definition).  This just means that we have no info about the
8424          parameters at all.  */
8425       fn_arg_types = TYPE_ARG_TYPES (TREE_TYPE (decl));
8426       if (fn_arg_types != NULL)
8427         {
8428           /* this is the prototyped case, check for ...  */
8429           if (TREE_VALUE (tree_last (fn_arg_types)) != void_type_node)
8430             gen_unspecified_parameters_die (decl, subr_die);
8431         }
8432       else if (DECL_INITIAL (decl) == NULL_TREE)
8433         gen_unspecified_parameters_die (decl, subr_die);
8434     }
8435
8436   /* Output Dwarf info for all of the stuff within the body of the function
8437      (if it has one - it may be just a declaration).  */
8438   outer_scope = DECL_INITIAL (decl);
8439
8440   /* Note that here, `outer_scope' is a pointer to the outermost BLOCK
8441      node created to represent a function. This outermost BLOCK actually
8442      represents the outermost binding contour for the function, i.e. the
8443      contour in which the function's formal parameters and labels get
8444      declared. Curiously, it appears that the front end doesn't actually
8445      put the PARM_DECL nodes for the current function onto the BLOCK_VARS
8446      list for this outer scope.  (They are strung off of the DECL_ARGUMENTS
8447      list for the function instead.) The BLOCK_VARS list for the
8448      `outer_scope' does provide us with a list of the LABEL_DECL nodes for
8449      the function however, and we output DWARF info for those in
8450      decls_for_scope.  Just within the `outer_scope' there will be a BLOCK
8451      node representing the function's outermost pair of curly braces, and
8452      any blocks used for the base and member initializers of a C++
8453      constructor function.  */
8454   if (! declaration && TREE_CODE (outer_scope) != ERROR_MARK)
8455     {
8456       current_function_has_inlines = 0;
8457       decls_for_scope (outer_scope, subr_die, 0);
8458
8459 #if 0 && defined (MIPS_DEBUGGING_INFO)
8460       if (current_function_has_inlines)
8461         {
8462           add_AT_flag (subr_die, DW_AT_MIPS_has_inlines, 1);
8463           if (! comp_unit_has_inlines)
8464             {
8465               add_AT_flag (comp_unit_die, DW_AT_MIPS_has_inlines, 1);
8466               comp_unit_has_inlines = 1;
8467             }
8468         }
8469 #endif
8470     }
8471
8472   pop_decl_scope ();
8473 }
8474
8475 /* Generate a DIE to represent a declared data object.  */
8476
8477 static void
8478 gen_variable_die (decl, context_die)
8479      register tree decl;
8480      register dw_die_ref context_die;
8481 {
8482   register tree origin = decl_ultimate_origin (decl);
8483   register dw_die_ref var_die = new_die (DW_TAG_variable, context_die);
8484
8485   dw_die_ref old_die = lookup_decl_die (decl);
8486   int declaration
8487     = (DECL_EXTERNAL (decl)
8488        || current_function_decl != decl_function_context (decl)
8489        || context_die->die_tag == DW_TAG_structure_type
8490        || context_die->die_tag == DW_TAG_union_type);
8491
8492   if (origin != NULL)
8493     add_abstract_origin_attribute (var_die, origin);
8494   /* Loop unrolling can create multiple blocks that refer to the same
8495      static variable, so we must test for the DW_AT_declaration flag.  */
8496   /* ??? Loop unrolling/reorder_blocks should perhaps be rewritten to
8497      copy decls and set the DECL_ABSTRACT flag on them instead of
8498      sharing them.  */
8499   else if (old_die && TREE_STATIC (decl)
8500            && get_AT_flag (old_die, DW_AT_declaration) == 1)
8501     {
8502       /* This is a definition of a C++ class level static.  */
8503       add_AT_die_ref (var_die, DW_AT_specification, old_die);
8504       if (DECL_NAME (decl))
8505         {
8506           register unsigned file_index
8507             = lookup_filename (DECL_SOURCE_FILE (decl));
8508
8509           if (get_AT_unsigned (old_die, DW_AT_decl_file) != file_index)
8510             add_AT_unsigned (var_die, DW_AT_decl_file, file_index);
8511
8512           if (get_AT_unsigned (old_die, DW_AT_decl_line)
8513               != (unsigned)DECL_SOURCE_LINE (decl))
8514
8515             add_AT_unsigned (var_die, DW_AT_decl_line,
8516                              DECL_SOURCE_LINE (decl));
8517         }
8518     }
8519   else
8520     {
8521       add_name_and_src_coords_attributes (var_die, decl);
8522       add_type_attribute (var_die, TREE_TYPE (decl),
8523                           TREE_READONLY (decl),
8524                           TREE_THIS_VOLATILE (decl), context_die);
8525
8526       if (TREE_PUBLIC (decl))
8527         add_AT_flag (var_die, DW_AT_external, 1);
8528
8529       if (DECL_ARTIFICIAL (decl))
8530         add_AT_flag (var_die, DW_AT_artificial, 1);
8531
8532       if (TREE_PROTECTED (decl))
8533         add_AT_unsigned (var_die, DW_AT_accessibility, DW_ACCESS_protected);
8534
8535       else if (TREE_PRIVATE (decl))
8536         add_AT_unsigned (var_die, DW_AT_accessibility, DW_ACCESS_private);
8537     }
8538
8539   if (declaration)
8540     add_AT_flag (var_die, DW_AT_declaration, 1);
8541   
8542   if ((declaration && decl_class_context (decl)) || DECL_ABSTRACT (decl))
8543     equate_decl_number_to_die (decl, var_die);
8544
8545   if (! declaration && ! DECL_ABSTRACT (decl))
8546     {
8547       equate_decl_number_to_die (decl, var_die);
8548       add_location_or_const_value_attribute (var_die, decl);
8549       add_pubname (decl, var_die);
8550     }
8551 }
8552
8553 /* Generate a DIE to represent a label identifier.  */
8554
8555 static void
8556 gen_label_die (decl, context_die)
8557      register tree decl;
8558      register dw_die_ref context_die;
8559 {
8560   register tree origin = decl_ultimate_origin (decl);
8561   register dw_die_ref lbl_die = new_die (DW_TAG_label, context_die);
8562   register rtx insn;
8563   char label[MAX_ARTIFICIAL_LABEL_BYTES];
8564   char label2[MAX_ARTIFICIAL_LABEL_BYTES];
8565
8566   if (origin != NULL)
8567     add_abstract_origin_attribute (lbl_die, origin);
8568   else
8569     add_name_and_src_coords_attributes (lbl_die, decl);
8570
8571   if (DECL_ABSTRACT (decl))
8572     equate_decl_number_to_die (decl, lbl_die);
8573   else
8574     {
8575       insn = DECL_RTL (decl);
8576
8577       /* Deleted labels are programmer specified labels which have been
8578          eliminated because of various optimisations.  We still emit them
8579          here so that it is possible to put breakpoints on them.  */
8580       if (GET_CODE (insn) == CODE_LABEL
8581           || ((GET_CODE (insn) == NOTE
8582                && NOTE_LINE_NUMBER (insn) == NOTE_INSN_DELETED_LABEL)))
8583         {
8584           /* When optimization is enabled (via -O) some parts of the compiler 
8585              (e.g. jump.c and cse.c) may try to delete CODE_LABEL insns which 
8586              represent source-level labels which were explicitly declared by
8587              the user.  This really shouldn't be happening though, so catch
8588              it if it ever does happen.  */
8589           if (INSN_DELETED_P (insn))
8590             abort ();
8591
8592           sprintf (label2, INSN_LABEL_FMT, current_funcdef_number);
8593           ASM_GENERATE_INTERNAL_LABEL (label, label2,
8594                                        (unsigned) INSN_UID (insn));
8595           add_AT_lbl_id (lbl_die, DW_AT_low_pc, label);
8596         }
8597     }
8598 }
8599
8600 /* Generate a DIE for a lexical block.  */
8601
8602 static void
8603 gen_lexical_block_die (stmt, context_die, depth)
8604      register tree stmt;
8605      register dw_die_ref context_die;
8606      int depth;
8607 {
8608   register dw_die_ref stmt_die = new_die (DW_TAG_lexical_block, context_die);
8609   char label[MAX_ARTIFICIAL_LABEL_BYTES];
8610
8611   if (! BLOCK_ABSTRACT (stmt))
8612     {
8613       ASM_GENERATE_INTERNAL_LABEL (label, BLOCK_BEGIN_LABEL,
8614                                    next_block_number);
8615       add_AT_lbl_id (stmt_die, DW_AT_low_pc, label);
8616       ASM_GENERATE_INTERNAL_LABEL (label, BLOCK_END_LABEL, next_block_number);
8617       add_AT_lbl_id (stmt_die, DW_AT_high_pc, label);
8618     }
8619
8620   push_decl_scope (stmt);
8621   decls_for_scope (stmt, stmt_die, depth);
8622   pop_decl_scope ();
8623 }
8624
8625 /* Generate a DIE for an inlined subprogram.  */
8626
8627 static void
8628 gen_inlined_subroutine_die (stmt, context_die, depth)
8629      register tree stmt;
8630      register dw_die_ref context_die;
8631      int depth;
8632 {
8633   if (! BLOCK_ABSTRACT (stmt))
8634     {
8635       register dw_die_ref subr_die
8636         = new_die (DW_TAG_inlined_subroutine, context_die);
8637       register tree decl = block_ultimate_origin (stmt);
8638       char label[MAX_ARTIFICIAL_LABEL_BYTES];
8639
8640       add_abstract_origin_attribute (subr_die, decl);
8641       ASM_GENERATE_INTERNAL_LABEL (label, BLOCK_BEGIN_LABEL,
8642                                    next_block_number);
8643       add_AT_lbl_id (subr_die, DW_AT_low_pc, label);
8644       ASM_GENERATE_INTERNAL_LABEL (label, BLOCK_END_LABEL, next_block_number);
8645       add_AT_lbl_id (subr_die, DW_AT_high_pc, label);
8646       push_decl_scope (decl);
8647       decls_for_scope (stmt, subr_die, depth);
8648       pop_decl_scope ();
8649       current_function_has_inlines = 1;
8650     }
8651 }
8652
8653 /* Generate a DIE for a field in a record, or structure.  */
8654
8655 static void
8656 gen_field_die (decl, context_die)
8657      register tree decl;
8658      register dw_die_ref context_die;
8659 {
8660   register dw_die_ref decl_die = new_die (DW_TAG_member, context_die);
8661
8662   add_name_and_src_coords_attributes (decl_die, decl);
8663   add_type_attribute (decl_die, member_declared_type (decl),
8664                       TREE_READONLY (decl), TREE_THIS_VOLATILE (decl),
8665                       context_die);
8666
8667   /* If this is a bit field...  */
8668   if (DECL_BIT_FIELD_TYPE (decl))
8669     {
8670       add_byte_size_attribute (decl_die, decl);
8671       add_bit_size_attribute (decl_die, decl);
8672       add_bit_offset_attribute (decl_die, decl);
8673     }
8674
8675   if (TREE_CODE (DECL_FIELD_CONTEXT (decl)) != UNION_TYPE)
8676     add_data_member_location_attribute (decl_die, decl);
8677
8678   if (DECL_ARTIFICIAL (decl))
8679     add_AT_flag (decl_die, DW_AT_artificial, 1);
8680
8681   if (TREE_PROTECTED (decl))
8682     add_AT_unsigned (decl_die, DW_AT_accessibility, DW_ACCESS_protected);
8683
8684   else if (TREE_PRIVATE (decl))
8685     add_AT_unsigned (decl_die, DW_AT_accessibility, DW_ACCESS_private);
8686 }
8687
8688 #if 0
8689 /* Don't generate either pointer_type DIEs or reference_type DIEs here.
8690    Use modified_type_die instead.
8691    We keep this code here just in case these types of DIEs may be needed to
8692    represent certain things in other languages (e.g. Pascal) someday.  */
8693 static void
8694 gen_pointer_type_die (type, context_die)
8695      register tree type;
8696      register dw_die_ref context_die;
8697 {
8698   register dw_die_ref ptr_die
8699     = new_die (DW_TAG_pointer_type, scope_die_for (type, context_die));
8700
8701   equate_type_number_to_die (type, ptr_die);
8702   add_type_attribute (ptr_die, TREE_TYPE (type), 0, 0, context_die);
8703   add_AT_unsigned (mod_type_die, DW_AT_byte_size, PTR_SIZE);
8704 }
8705
8706 /* Don't generate either pointer_type DIEs or reference_type DIEs here.
8707    Use modified_type_die instead.
8708    We keep this code here just in case these types of DIEs may be needed to
8709    represent certain things in other languages (e.g. Pascal) someday.  */
8710 static void
8711 gen_reference_type_die (type, context_die)
8712      register tree type;
8713      register dw_die_ref context_die;
8714 {
8715   register dw_die_ref ref_die
8716     = new_die (DW_TAG_reference_type, scope_die_for (type, context_die));
8717
8718   equate_type_number_to_die (type, ref_die);
8719   add_type_attribute (ref_die, TREE_TYPE (type), 0, 0, context_die);
8720   add_AT_unsigned (mod_type_die, DW_AT_byte_size, PTR_SIZE);
8721 }
8722 #endif
8723
8724 /* Generate a DIE for a pointer to a member type.  */
8725 static void
8726 gen_ptr_to_mbr_type_die (type, context_die)
8727      register tree type;
8728      register dw_die_ref context_die;
8729 {
8730   register dw_die_ref ptr_die
8731     = new_die (DW_TAG_ptr_to_member_type, scope_die_for (type, context_die));
8732
8733   equate_type_number_to_die (type, ptr_die);
8734   add_AT_die_ref (ptr_die, DW_AT_containing_type,
8735                   lookup_type_die (TYPE_OFFSET_BASETYPE (type)));
8736   add_type_attribute (ptr_die, TREE_TYPE (type), 0, 0, context_die);
8737 }
8738
8739 /* Generate the DIE for the compilation unit.  */
8740
8741 static dw_die_ref
8742 gen_compile_unit_die (filename)
8743      register const char *filename;
8744 {
8745   register dw_die_ref die;
8746   char producer[250];
8747   char *wd = getpwd ();
8748   int language;
8749
8750   die = new_die (DW_TAG_compile_unit, NULL);
8751   add_name_attribute (die, filename);
8752
8753   if (wd != NULL && filename[0] != DIR_SEPARATOR)
8754     add_AT_string (die, DW_AT_comp_dir, wd);
8755
8756   sprintf (producer, "%s %s", language_string, version_string);
8757
8758 #ifdef MIPS_DEBUGGING_INFO
8759   /* The MIPS/SGI compilers place the 'cc' command line options in the producer
8760      string.  The SGI debugger looks for -g, -g1, -g2, or -g3; if they do
8761      not appear in the producer string, the debugger reaches the conclusion
8762      that the object file is stripped and has no debugging information.
8763      To get the MIPS/SGI debugger to believe that there is debugging
8764      information in the object file, we add a -g to the producer string.  */
8765   if (debug_info_level > DINFO_LEVEL_TERSE)
8766     strcat (producer, " -g");
8767 #endif
8768
8769   add_AT_string (die, DW_AT_producer, producer);
8770
8771   if (strcmp (language_string, "GNU C++") == 0)
8772     language = DW_LANG_C_plus_plus;
8773   else if (strcmp (language_string, "GNU Ada") == 0)
8774     language = DW_LANG_Ada83;
8775   else if (strcmp (language_string, "GNU F77") == 0)
8776     language = DW_LANG_Fortran77;
8777   else if (strcmp (language_string, "GNU Pascal") == 0)
8778     language = DW_LANG_Pascal83;
8779   else if (flag_traditional)
8780     language = DW_LANG_C;
8781   else
8782     language = DW_LANG_C89;
8783
8784   add_AT_unsigned (die, DW_AT_language, language);
8785
8786   return die;
8787 }
8788
8789 /* Generate a DIE for a string type.  */
8790
8791 static void
8792 gen_string_type_die (type, context_die)
8793      register tree type;
8794      register dw_die_ref context_die;
8795 {
8796   register dw_die_ref type_die
8797     = new_die (DW_TAG_string_type, scope_die_for (type, context_die));
8798
8799   equate_type_number_to_die (type, type_die);
8800
8801   /* Fudge the string length attribute for now.  */
8802   
8803   /* TODO: add string length info.
8804    string_length_attribute (TYPE_MAX_VALUE (TYPE_DOMAIN (type)));
8805                               bound_representation (upper_bound, 0, 'u'); */
8806 }
8807
8808 /* Generate the DIE for a base class.  */
8809
8810 static void
8811 gen_inheritance_die (binfo, context_die)
8812      register tree binfo;
8813      register dw_die_ref context_die;
8814 {
8815   dw_die_ref die = new_die (DW_TAG_inheritance, context_die);
8816
8817   add_type_attribute (die, BINFO_TYPE (binfo), 0, 0, context_die);
8818   add_data_member_location_attribute (die, binfo);
8819
8820   if (TREE_VIA_VIRTUAL (binfo))
8821     add_AT_unsigned (die, DW_AT_virtuality, DW_VIRTUALITY_virtual);
8822   if (TREE_VIA_PUBLIC (binfo))
8823     add_AT_unsigned (die, DW_AT_accessibility, DW_ACCESS_public);
8824   else if (TREE_VIA_PROTECTED (binfo))
8825     add_AT_unsigned (die, DW_AT_accessibility, DW_ACCESS_protected);
8826 }
8827
8828 /* Generate a DIE for a class member.  */
8829
8830 static void
8831 gen_member_die (type, context_die)
8832      register tree type;
8833      register dw_die_ref context_die;
8834 {
8835   register tree member;
8836
8837   /* If this is not an incomplete type, output descriptions of each of its
8838      members. Note that as we output the DIEs necessary to represent the
8839      members of this record or union type, we will also be trying to output
8840      DIEs to represent the *types* of those members. However the `type'
8841      function (above) will specifically avoid generating type DIEs for member 
8842      types *within* the list of member DIEs for this (containing) type execpt 
8843      for those types (of members) which are explicitly marked as also being
8844      members of this (containing) type themselves.  The g++ front- end can
8845      force any given type to be treated as a member of some other
8846      (containing) type by setting the TYPE_CONTEXT of the given (member) type 
8847      to point to the TREE node representing the appropriate (containing)
8848      type.  */
8849
8850   /* First output info about the base classes.  */
8851   if (TYPE_BINFO (type) && TYPE_BINFO_BASETYPES (type))
8852     {
8853       register tree bases = TYPE_BINFO_BASETYPES (type);
8854       register int n_bases = TREE_VEC_LENGTH (bases);
8855       register int i;
8856
8857       for (i = 0; i < n_bases; i++)
8858         gen_inheritance_die (TREE_VEC_ELT (bases, i), context_die);
8859     }
8860
8861   /* Now output info about the data members and type members.  */
8862   for (member = TYPE_FIELDS (type); member; member = TREE_CHAIN (member))
8863     gen_decl_die (member, context_die);
8864
8865   /* Now output info about the function members (if any).  */
8866   for (member = TYPE_METHODS (type); member; member = TREE_CHAIN (member))
8867     gen_decl_die (member, context_die);
8868 }
8869
8870 /* Generate a DIE for a structure or union type.  */
8871
8872 static void
8873 gen_struct_or_union_type_die (type, context_die)
8874      register tree type;
8875      register dw_die_ref context_die;
8876 {
8877   register dw_die_ref type_die = lookup_type_die (type);
8878   register dw_die_ref scope_die = 0;
8879   register int nested = 0;
8880
8881   if (type_die && ! TYPE_SIZE (type))
8882     return;
8883
8884   if (TYPE_CONTEXT (type) != NULL_TREE
8885       && AGGREGATE_TYPE_P (TYPE_CONTEXT (type)))
8886     nested = 1;
8887
8888   scope_die = scope_die_for (type, context_die);
8889
8890   if (! type_die || (nested && scope_die == comp_unit_die))
8891     /* First occurrence of type or toplevel definition of nested class.  */
8892     {
8893       register dw_die_ref old_die = type_die;
8894
8895       type_die = new_die (TREE_CODE (type) == RECORD_TYPE
8896                           ? DW_TAG_structure_type : DW_TAG_union_type,
8897                           scope_die);
8898       equate_type_number_to_die (type, type_die);
8899       add_name_attribute (type_die, type_tag (type));
8900       if (old_die)
8901         add_AT_die_ref (type_die, DW_AT_specification, old_die);
8902     }
8903   else
8904     remove_AT (type_die, DW_AT_declaration);
8905
8906   /* If we're not in the right context to be defining this type, defer to
8907      avoid tricky recursion.  */
8908   if (TYPE_SIZE (type) && decl_scope_depth > 0 && scope_die == comp_unit_die)
8909     {
8910       add_AT_flag (type_die, DW_AT_declaration, 1);
8911       pend_type (type);
8912     }
8913   /* If this type has been completed, then give it a byte_size attribute and
8914      then give a list of members.  */
8915   else if (TYPE_SIZE (type))
8916     {
8917       /* Prevent infinite recursion in cases where the type of some member of 
8918          this type is expressed in terms of this type itself.  */
8919       TREE_ASM_WRITTEN (type) = 1;
8920       add_byte_size_attribute (type_die, type);
8921       if (TYPE_STUB_DECL (type) != NULL_TREE)
8922         add_src_coords_attributes (type_die, TYPE_STUB_DECL (type));
8923
8924       /* If the first reference to this type was as the return type of an
8925          inline function, then it may not have a parent.  Fix this now.  */
8926       if (type_die->die_parent == NULL)
8927         add_child_die (scope_die, type_die);
8928
8929       push_decl_scope (type);
8930       gen_member_die (type, type_die);
8931       pop_decl_scope ();
8932
8933       /* GNU extension: Record what type our vtable lives in.  */
8934       if (TYPE_VFIELD (type))
8935         {
8936           tree vtype = DECL_FCONTEXT (TYPE_VFIELD (type));
8937
8938           if (vtype != type)
8939             {
8940               gen_type_die (vtype, context_die);
8941               add_AT_die_ref (type_die, DW_AT_containing_type,
8942                               lookup_type_die (vtype));
8943             }
8944         }
8945     }
8946   else
8947     {
8948       add_AT_flag (type_die, DW_AT_declaration, 1);
8949
8950       /* We can't do this for function-local types, and we don't need to.  */
8951       if (! decl_function_context (TYPE_STUB_DECL (type)))
8952         add_incomplete_type (type);
8953     }
8954 }
8955
8956 /* Generate a DIE for a subroutine _type_.  */
8957
8958 static void
8959 gen_subroutine_type_die (type, context_die)
8960      register tree type;
8961      register dw_die_ref context_die;
8962 {
8963   register tree return_type = TREE_TYPE (type);
8964   register dw_die_ref subr_die
8965     = new_die (DW_TAG_subroutine_type, scope_die_for (type, context_die));
8966
8967   equate_type_number_to_die (type, subr_die);
8968   add_prototyped_attribute (subr_die, type);
8969   add_type_attribute (subr_die, return_type, 0, 0, context_die);
8970   gen_formal_types_die (type, subr_die);
8971 }
8972
8973 /* Generate a DIE for a type definition */
8974
8975 static void
8976 gen_typedef_die (decl, context_die)
8977      register tree decl;
8978      register dw_die_ref context_die;
8979 {
8980   register dw_die_ref type_die;
8981   register tree origin;
8982
8983   if (TREE_ASM_WRITTEN (decl))
8984     return;
8985   TREE_ASM_WRITTEN (decl) = 1;
8986
8987   type_die = new_die (DW_TAG_typedef, scope_die_for (decl, context_die));
8988   origin = decl_ultimate_origin (decl);
8989   if (origin != NULL)
8990     add_abstract_origin_attribute (type_die, origin);
8991   else
8992     {
8993       register tree type;
8994       add_name_and_src_coords_attributes (type_die, decl);
8995       if (DECL_ORIGINAL_TYPE (decl))
8996         {
8997           type = DECL_ORIGINAL_TYPE (decl);
8998           equate_type_number_to_die (TREE_TYPE (decl), type_die);
8999         }
9000       else
9001         type = TREE_TYPE (decl);
9002       add_type_attribute (type_die, type, TREE_READONLY (decl),
9003                           TREE_THIS_VOLATILE (decl), context_die);
9004     }
9005
9006   if (DECL_ABSTRACT (decl))
9007     equate_decl_number_to_die (decl, type_die);
9008 }
9009
9010 /* Generate a type description DIE.  */
9011
9012 static void
9013 gen_type_die (type, context_die)
9014      register tree type;
9015      register dw_die_ref context_die;
9016 {
9017   int need_pop;
9018
9019   if (type == NULL_TREE || type == error_mark_node)
9020     return;
9021
9022   /* We are going to output a DIE to represent the unqualified version of
9023      this type (i.e. without any const or volatile qualifiers) so get the
9024      main variant (i.e. the unqualified version) of this type now.  */
9025   type = type_main_variant (type);
9026
9027   if (TREE_ASM_WRITTEN (type))
9028     return;
9029
9030   if (TYPE_NAME (type) && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
9031       && DECL_ORIGINAL_TYPE (TYPE_NAME (type)))
9032     { 
9033       TREE_ASM_WRITTEN (type) = 1;
9034       gen_decl_die (TYPE_NAME (type), context_die);
9035       return;
9036     }
9037
9038   switch (TREE_CODE (type))
9039     {
9040     case ERROR_MARK:
9041       break;
9042
9043     case POINTER_TYPE:
9044     case REFERENCE_TYPE:
9045       /* We must set TREE_ASM_WRITTEN in case this is a recursive type.  This
9046          ensures that the gen_type_die recursion will terminate even if the
9047          type is recursive.  Recursive types are possible in Ada.  */
9048       /* ??? We could perhaps do this for all types before the switch
9049          statement.  */
9050       TREE_ASM_WRITTEN (type) = 1;
9051
9052       /* For these types, all that is required is that we output a DIE (or a
9053          set of DIEs) to represent the "basis" type.  */
9054       gen_type_die (TREE_TYPE (type), context_die);
9055       break;
9056
9057     case OFFSET_TYPE:
9058       /* This code is used for C++ pointer-to-data-member types. 
9059          Output a description of the relevant class type.  */
9060       gen_type_die (TYPE_OFFSET_BASETYPE (type), context_die);
9061
9062       /* Output a description of the type of the object pointed to.  */
9063       gen_type_die (TREE_TYPE (type), context_die);
9064
9065       /* Now output a DIE to represent this pointer-to-data-member type
9066          itself.  */
9067       gen_ptr_to_mbr_type_die (type, context_die);
9068       break;
9069
9070     case SET_TYPE:
9071       gen_type_die (TYPE_DOMAIN (type), context_die);
9072       gen_set_type_die (type, context_die);
9073       break;
9074
9075     case FILE_TYPE:
9076       gen_type_die (TREE_TYPE (type), context_die);
9077       abort ();                 /* No way to represent these in Dwarf yet!  */
9078       break;
9079
9080     case FUNCTION_TYPE:
9081       /* Force out return type (in case it wasn't forced out already).  */
9082       gen_type_die (TREE_TYPE (type), context_die);
9083       gen_subroutine_type_die (type, context_die);
9084       break;
9085
9086     case METHOD_TYPE:
9087       /* Force out return type (in case it wasn't forced out already).  */
9088       gen_type_die (TREE_TYPE (type), context_die);
9089       gen_subroutine_type_die (type, context_die);
9090       break;
9091
9092     case ARRAY_TYPE:
9093       if (TYPE_STRING_FLAG (type) && TREE_CODE (TREE_TYPE (type)) == CHAR_TYPE)
9094         {
9095           gen_type_die (TREE_TYPE (type), context_die);
9096           gen_string_type_die (type, context_die);
9097         }
9098       else
9099         gen_array_type_die (type, context_die);
9100       break;
9101
9102     case ENUMERAL_TYPE:
9103     case RECORD_TYPE:
9104     case UNION_TYPE:
9105     case QUAL_UNION_TYPE:
9106       /* If this is a nested type whose containing class hasn't been
9107          written out yet, writing it out will cover this one, too.
9108          This does not apply to instantiations of member class templates;
9109          they need to be added to the containing class as they are
9110          generated.  FIXME: This breaks the idea of combining type decls
9111          from multiple TUs, since we can't predict what set of template
9112          instantiations we'll get.  */
9113       if (TYPE_CONTEXT (type)
9114           && AGGREGATE_TYPE_P (TYPE_CONTEXT (type))
9115           && ! TREE_ASM_WRITTEN (TYPE_CONTEXT (type)))
9116         {
9117           gen_type_die (TYPE_CONTEXT (type), context_die);
9118
9119           if (TREE_ASM_WRITTEN (type))
9120             return;
9121
9122           /* If that failed, attach ourselves to the stub.  */
9123           push_decl_scope (TYPE_CONTEXT (type));
9124           context_die = lookup_type_die (TYPE_CONTEXT (type));
9125           need_pop = 1;
9126         }
9127       else
9128         need_pop = 0;
9129
9130       if (TREE_CODE (type) == ENUMERAL_TYPE)
9131         gen_enumeration_type_die (type, context_die);
9132       else
9133         gen_struct_or_union_type_die (type, context_die);
9134
9135       if (need_pop)
9136         pop_decl_scope ();
9137
9138       /* Don't set TREE_ASM_WRITTEN on an incomplete struct; we want to fix
9139          it up if it is ever completed.  gen_*_type_die will set it for us
9140          when appropriate.  */
9141       return;
9142
9143     case VOID_TYPE:
9144     case INTEGER_TYPE:
9145     case REAL_TYPE:
9146     case COMPLEX_TYPE:
9147     case BOOLEAN_TYPE:
9148     case CHAR_TYPE:
9149       /* No DIEs needed for fundamental types.  */
9150       break;
9151
9152     case LANG_TYPE:
9153       /* No Dwarf representation currently defined.  */
9154       break;
9155
9156     default:
9157       abort ();
9158     }
9159
9160   TREE_ASM_WRITTEN (type) = 1;
9161 }
9162
9163 /* Generate a DIE for a tagged type instantiation.  */
9164
9165 static void
9166 gen_tagged_type_instantiation_die (type, context_die)
9167      register tree type;
9168      register dw_die_ref context_die;
9169 {
9170   if (type == NULL_TREE || type == error_mark_node)
9171     return;
9172
9173   /* We are going to output a DIE to represent the unqualified version of
9174      this type (i.e. without any const or volatile qualifiers) so make sure
9175      that we have the main variant (i.e. the unqualified version) of this
9176      type now.  */
9177   if (type != type_main_variant (type))
9178     abort ();
9179
9180   /* Do not check TREE_ASM_WRITTEN(type) as it may not be set if this is
9181      an instance of an unresolved type.  */
9182   
9183   switch (TREE_CODE (type))
9184     {
9185     case ERROR_MARK:
9186       break;
9187
9188     case ENUMERAL_TYPE:
9189       gen_inlined_enumeration_type_die (type, context_die);
9190       break;
9191
9192     case RECORD_TYPE:
9193       gen_inlined_structure_type_die (type, context_die);
9194       break;
9195
9196     case UNION_TYPE:
9197     case QUAL_UNION_TYPE:
9198       gen_inlined_union_type_die (type, context_die);
9199       break;
9200
9201     default:
9202       abort ();
9203     }
9204 }
9205
9206 /* Generate a DW_TAG_lexical_block DIE followed by DIEs to represent all of the
9207    things which are local to the given block.  */
9208
9209 static void
9210 gen_block_die (stmt, context_die, depth)
9211      register tree stmt;
9212      register dw_die_ref context_die;
9213      int depth;
9214 {
9215   register int must_output_die = 0;
9216   register tree origin;
9217   register tree decl;
9218   register enum tree_code origin_code;
9219
9220   /* Ignore blocks never really used to make RTL.  */
9221
9222   if (stmt == NULL_TREE || !TREE_USED (stmt))
9223     return;
9224
9225   /* Determine the "ultimate origin" of this block.  This block may be an
9226      inlined instance of an inlined instance of inline function, so we have
9227      to trace all of the way back through the origin chain to find out what
9228      sort of node actually served as the original seed for the creation of
9229      the current block.  */
9230   origin = block_ultimate_origin (stmt);
9231   origin_code = (origin != NULL) ? TREE_CODE (origin) : ERROR_MARK;
9232
9233   /* Determine if we need to output any Dwarf DIEs at all to represent this
9234      block.  */
9235   if (origin_code == FUNCTION_DECL)
9236     /* The outer scopes for inlinings *must* always be represented.  We
9237        generate DW_TAG_inlined_subroutine DIEs for them.  (See below.) */
9238     must_output_die = 1;
9239   else
9240     {
9241       /* In the case where the current block represents an inlining of the
9242          "body block" of an inline function, we must *NOT* output any DIE for 
9243          this block because we have already output a DIE to represent the
9244          whole inlined function scope and the "body block" of any function
9245          doesn't really represent a different scope according to ANSI C
9246          rules.  So we check here to make sure that this block does not
9247          represent a "body block inlining" before trying to set the
9248          `must_output_die' flag.  */
9249       if (! is_body_block (origin ? origin : stmt))
9250         {
9251           /* Determine if this block directly contains any "significant"
9252              local declarations which we will need to output DIEs for.  */
9253           if (debug_info_level > DINFO_LEVEL_TERSE)
9254             /* We are not in terse mode so *any* local declaration counts
9255                as being a "significant" one.  */
9256             must_output_die = (BLOCK_VARS (stmt) != NULL);
9257           else
9258             /* We are in terse mode, so only local (nested) function
9259                definitions count as "significant" local declarations.  */
9260             for (decl = BLOCK_VARS (stmt);
9261                  decl != NULL; decl = TREE_CHAIN (decl))
9262               if (TREE_CODE (decl) == FUNCTION_DECL
9263                   && DECL_INITIAL (decl))
9264                 {
9265                   must_output_die = 1;
9266                   break;
9267                 }
9268         }
9269     }
9270
9271   /* It would be a waste of space to generate a Dwarf DW_TAG_lexical_block
9272      DIE for any block which contains no significant local declarations at
9273      all.  Rather, in such cases we just call `decls_for_scope' so that any
9274      needed Dwarf info for any sub-blocks will get properly generated. Note
9275      that in terse mode, our definition of what constitutes a "significant"
9276      local declaration gets restricted to include only inlined function
9277      instances and local (nested) function definitions.  */
9278   if (must_output_die)
9279     {
9280       if (origin_code == FUNCTION_DECL)
9281         gen_inlined_subroutine_die (stmt, context_die, depth);
9282       else
9283         gen_lexical_block_die (stmt, context_die, depth);
9284     }
9285   else
9286     decls_for_scope (stmt, context_die, depth);
9287 }
9288
9289 /* Generate all of the decls declared within a given scope and (recursively)
9290    all of its sub-blocks.  */
9291
9292 static void
9293 decls_for_scope (stmt, context_die, depth)
9294      register tree stmt;
9295      register dw_die_ref context_die;
9296      int depth;
9297 {
9298   register tree decl;
9299   register tree subblocks;
9300
9301   /* Ignore blocks never really used to make RTL.  */
9302   if (stmt == NULL_TREE || ! TREE_USED (stmt))
9303     return;
9304
9305   if (!BLOCK_ABSTRACT (stmt) && depth > 0)
9306     next_block_number++;
9307
9308   /* Output the DIEs to represent all of the data objects and typedefs
9309      declared directly within this block but not within any nested
9310      sub-blocks.  Also, nested function and tag DIEs have been
9311      generated with a parent of NULL; fix that up now.  */
9312   for (decl = BLOCK_VARS (stmt);
9313        decl != NULL; decl = TREE_CHAIN (decl))
9314     {
9315       register dw_die_ref die;
9316
9317       if (TREE_CODE (decl) == FUNCTION_DECL)
9318         die = lookup_decl_die (decl);
9319       else if (TREE_CODE (decl) == TYPE_DECL && TYPE_DECL_IS_STUB (decl))
9320         die = lookup_type_die (TREE_TYPE (decl));
9321       else
9322         die = NULL;
9323
9324       if (die != NULL && die->die_parent == NULL)
9325         add_child_die (context_die, die);
9326       else
9327         gen_decl_die (decl, context_die);
9328     }
9329
9330   /* Output the DIEs to represent all sub-blocks (and the items declared
9331      therein) of this block.  */
9332   for (subblocks = BLOCK_SUBBLOCKS (stmt);
9333        subblocks != NULL;
9334        subblocks = BLOCK_CHAIN (subblocks))
9335     gen_block_die (subblocks, context_die, depth + 1);
9336 }
9337
9338 /* Is this a typedef we can avoid emitting?  */
9339
9340 static inline int
9341 is_redundant_typedef (decl)
9342      register tree decl;
9343 {
9344   if (TYPE_DECL_IS_STUB (decl))
9345     return 1;
9346
9347   if (DECL_ARTIFICIAL (decl)
9348       && DECL_CONTEXT (decl)
9349       && is_tagged_type (DECL_CONTEXT (decl))
9350       && TREE_CODE (TYPE_NAME (DECL_CONTEXT (decl))) == TYPE_DECL
9351       && DECL_NAME (decl) == DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl))))
9352     /* Also ignore the artificial member typedef for the class name.  */
9353     return 1;
9354
9355   return 0;
9356 }
9357
9358 /* Generate Dwarf debug information for a decl described by DECL.  */
9359
9360 static void
9361 gen_decl_die (decl, context_die)
9362      register tree decl;
9363      register dw_die_ref context_die;
9364 {
9365   register tree origin;
9366
9367   if (TREE_CODE (decl) == ERROR_MARK)
9368     return;
9369
9370   /* If this ..._DECL node is marked to be ignored, then ignore it. But don't 
9371      ignore a function definition, since that would screw up our count of
9372      blocks, and that in turn will completely screw up the labels we will 
9373      reference in subsequent DW_AT_low_pc and DW_AT_high_pc attributes (for
9374      subsequent blocks).  */
9375   if (DECL_IGNORED_P (decl) && TREE_CODE (decl) != FUNCTION_DECL)
9376     return;
9377
9378   switch (TREE_CODE (decl))
9379     {
9380     case CONST_DECL:
9381       /* The individual enumerators of an enum type get output when we output 
9382          the Dwarf representation of the relevant enum type itself.  */
9383       break;
9384
9385     case FUNCTION_DECL:
9386       /* Don't output any DIEs to represent mere function declarations,
9387          unless they are class members or explicit block externs.  */
9388       if (DECL_INITIAL (decl) == NULL_TREE && DECL_CONTEXT (decl) == NULL_TREE
9389           && (current_function_decl == NULL_TREE || ! DECL_ARTIFICIAL (decl)))
9390         break;
9391
9392       if (debug_info_level > DINFO_LEVEL_TERSE)
9393         {
9394           /* Before we describe the FUNCTION_DECL itself, make sure that we
9395              have described its return type.  */
9396           gen_type_die (TREE_TYPE (TREE_TYPE (decl)), context_die);
9397
9398           /* And its containing type.  */
9399           origin = decl_class_context (decl);
9400           if (origin != NULL_TREE)
9401             gen_type_die (origin, context_die);
9402
9403           /* And its virtual context.  */
9404           if (DECL_VINDEX (decl) != NULL_TREE)
9405             gen_type_die (DECL_CONTEXT (decl), context_die);
9406         }
9407
9408       /* Now output a DIE to represent the function itself.  */
9409       gen_subprogram_die (decl, context_die);
9410       break;
9411
9412     case TYPE_DECL:
9413       /* If we are in terse mode, don't generate any DIEs to represent any
9414          actual typedefs.  */
9415       if (debug_info_level <= DINFO_LEVEL_TERSE)
9416         break;
9417
9418       /* In the special case of a TYPE_DECL node representing the 
9419          declaration of some type tag, if the given TYPE_DECL is marked as
9420          having been instantiated from some other (original) TYPE_DECL node
9421          (e.g. one which was generated within the original definition of an
9422          inline function) we have to generate a special (abbreviated)
9423          DW_TAG_structure_type, DW_TAG_union_type, or DW_TAG_enumeration_type 
9424          DIE here.  */
9425       if (TYPE_DECL_IS_STUB (decl) && DECL_ABSTRACT_ORIGIN (decl) != NULL_TREE)
9426         {
9427           gen_tagged_type_instantiation_die (TREE_TYPE (decl), context_die);
9428           break;
9429         }
9430
9431       if (is_redundant_typedef (decl))
9432         gen_type_die (TREE_TYPE (decl), context_die);
9433       else
9434         /* Output a DIE to represent the typedef itself.  */
9435         gen_typedef_die (decl, context_die);
9436       break;
9437
9438     case LABEL_DECL:
9439       if (debug_info_level >= DINFO_LEVEL_NORMAL)
9440         gen_label_die (decl, context_die);
9441       break;
9442
9443     case VAR_DECL:
9444       /* If we are in terse mode, don't generate any DIEs to represent any
9445          variable declarations or definitions.  */
9446       if (debug_info_level <= DINFO_LEVEL_TERSE)
9447         break;
9448
9449       /* Output any DIEs that are needed to specify the type of this data
9450          object.  */
9451       gen_type_die (TREE_TYPE (decl), context_die);
9452
9453       /* And its containing type.  */
9454       origin = decl_class_context (decl);
9455       if (origin != NULL_TREE)
9456         gen_type_die (origin, context_die);
9457
9458       /* Now output the DIE to represent the data object itself.  This gets
9459          complicated because of the possibility that the VAR_DECL really
9460          represents an inlined instance of a formal parameter for an inline
9461          function.  */
9462       origin = decl_ultimate_origin (decl);
9463       if (origin != NULL_TREE && TREE_CODE (origin) == PARM_DECL)
9464         gen_formal_parameter_die (decl, context_die);
9465       else
9466         gen_variable_die (decl, context_die);
9467       break;
9468
9469     case FIELD_DECL:
9470       /* Ignore the nameless fields that are used to skip bits, but
9471          handle C++ anonymous unions.  */
9472       if (DECL_NAME (decl) != NULL_TREE
9473           || TREE_CODE (TREE_TYPE (decl)) == UNION_TYPE)
9474         {
9475           gen_type_die (member_declared_type (decl), context_die);
9476           gen_field_die (decl, context_die);
9477         }
9478       break;
9479
9480     case PARM_DECL:
9481       gen_type_die (TREE_TYPE (decl), context_die);
9482       gen_formal_parameter_die (decl, context_die);
9483       break;
9484
9485     case NAMESPACE_DECL:
9486       /* Ignore for now.  */
9487       break;
9488
9489     default:
9490       abort ();
9491     }
9492 }
9493 \f
9494 /* Add Ada "use" clause information for SGI Workshop debugger.  */
9495
9496 void
9497 dwarf2out_add_library_unit_info (filename, context_list)
9498      char *filename;
9499      char *context_list;
9500 {
9501   unsigned int file_index;
9502
9503   if (filename != NULL)
9504     {
9505       dw_die_ref unit_die = new_die (DW_TAG_module, comp_unit_die);
9506       tree context_list_decl 
9507         = build_decl (LABEL_DECL, get_identifier (context_list),
9508                       void_type_node);
9509
9510       TREE_PUBLIC (context_list_decl) = TRUE;
9511       add_name_attribute (unit_die, context_list);
9512       file_index = lookup_filename (filename);
9513       add_AT_unsigned (unit_die, DW_AT_decl_file, file_index);
9514       add_pubname (context_list_decl, unit_die);
9515     }
9516 }
9517
9518 /* Write the debugging output for DECL.  */
9519
9520 void
9521 dwarf2out_decl (decl)
9522      register tree decl;
9523 {
9524   register dw_die_ref context_die = comp_unit_die;
9525
9526   if (TREE_CODE (decl) == ERROR_MARK)
9527     return;
9528
9529   /* If this ..._DECL node is marked to be ignored, then ignore it.  We gotta 
9530      hope that the node in question doesn't represent a function definition.
9531      If it does, then totally ignoring it is bound to screw up our count of
9532      blocks, and that in turn will completely screw up the labels we will 
9533      reference in subsequent DW_AT_low_pc and DW_AT_high_pc attributes (for
9534      subsequent blocks).  (It's too bad that BLOCK nodes don't carry their
9535      own sequence numbers with them!) */
9536   if (DECL_IGNORED_P (decl))
9537     {
9538       if (TREE_CODE (decl) == FUNCTION_DECL
9539           && DECL_INITIAL (decl) != NULL)
9540         abort ();
9541
9542       return;
9543     }
9544
9545   switch (TREE_CODE (decl))
9546     {
9547     case FUNCTION_DECL:
9548       /* Ignore this FUNCTION_DECL if it refers to a builtin declaration of a 
9549          builtin function.  Explicit programmer-supplied declarations of
9550          these same functions should NOT be ignored however.  */
9551       if (DECL_EXTERNAL (decl) && DECL_FUNCTION_CODE (decl))
9552         return;
9553
9554       /* What we would really like to do here is to filter out all mere
9555          file-scope declarations of file-scope functions which are never
9556          referenced later within this translation unit (and keep all of ones
9557          that *are* referenced later on) but we aren't clairvoyant, so we have 
9558          no idea which functions will be referenced in the future (i.e. later 
9559          on within the current translation unit). So here we just ignore all
9560          file-scope function declarations which are not also definitions.  If 
9561          and when the debugger needs to know something about these functions,
9562          it will have to hunt around and find the DWARF information associated 
9563          with the definition of the function.  Note that we can't just check
9564          `DECL_EXTERNAL' to find out which FUNCTION_DECL nodes represent
9565          definitions and which ones represent mere declarations.  We have to
9566          check `DECL_INITIAL' instead. That's because the C front-end
9567          supports some weird semantics for "extern inline" function
9568          definitions.  These can get inlined within the current translation
9569          unit (an thus, we need to generate DWARF info for their abstract
9570          instances so that the DWARF info for the concrete inlined instances
9571          can have something to refer to) but the compiler never generates any 
9572          out-of-lines instances of such things (despite the fact that they
9573          *are* definitions).  The important point is that the C front-end
9574          marks these "extern inline" functions as DECL_EXTERNAL, but we need
9575          to generate DWARF for them anyway. Note that the C++ front-end also
9576          plays some similar games for inline function definitions appearing
9577          within include files which also contain 
9578          `#pragma interface' pragmas.  */
9579       if (DECL_INITIAL (decl) == NULL_TREE)
9580         return;
9581
9582       /* If we're a nested function, initially use a parent of NULL; if we're
9583          a plain function, this will be fixed up in decls_for_scope.  If
9584          we're a method, it will be ignored, since we already have a DIE.  */
9585       if (decl_function_context (decl))
9586         context_die = NULL;
9587
9588       break;
9589
9590     case VAR_DECL:
9591       /* Ignore this VAR_DECL if it refers to a file-scope extern data object 
9592          declaration and if the declaration was never even referenced from
9593          within this entire compilation unit.  We suppress these DIEs in
9594          order to save space in the .debug section (by eliminating entries
9595          which are probably useless).  Note that we must not suppress
9596          block-local extern declarations (whether used or not) because that
9597          would screw-up the debugger's name lookup mechanism and cause it to
9598          miss things which really ought to be in scope at a given point.  */
9599       if (DECL_EXTERNAL (decl) && !TREE_USED (decl))
9600         return;
9601
9602       /* If we are in terse mode, don't generate any DIEs to represent any
9603          variable declarations or definitions.  */
9604       if (debug_info_level <= DINFO_LEVEL_TERSE)
9605         return;
9606       break;
9607
9608     case TYPE_DECL:
9609       /* Don't bother trying to generate any DIEs to represent any of the
9610          normal built-in types for the language we are compiling.  */
9611       if (DECL_SOURCE_LINE (decl) == 0)
9612         {
9613           /* OK, we need to generate one for `bool' so GDB knows what type
9614              comparisons have.  */
9615           if ((get_AT_unsigned (comp_unit_die, DW_AT_language)
9616                == DW_LANG_C_plus_plus)
9617               && TREE_CODE (TREE_TYPE (decl)) == BOOLEAN_TYPE)
9618             modified_type_die (TREE_TYPE (decl), 0, 0, NULL);
9619
9620           return;
9621         }
9622
9623       /* If we are in terse mode, don't generate any DIEs for types.  */
9624       if (debug_info_level <= DINFO_LEVEL_TERSE)
9625         return;
9626
9627       /* If we're a function-scope tag, initially use a parent of NULL;
9628          this will be fixed up in decls_for_scope.  */
9629       if (decl_function_context (decl))
9630         context_die = NULL;
9631
9632       break;
9633
9634     default:
9635       return;
9636     }
9637
9638   gen_decl_die (decl, context_die);
9639   output_pending_types_for_scope (comp_unit_die);
9640 }
9641
9642 /* Output a marker (i.e. a label) for the beginning of the generated code for
9643    a lexical block.  */
9644
9645 void
9646 dwarf2out_begin_block (blocknum)
9647      register unsigned blocknum;
9648 {
9649   function_section (current_function_decl);
9650   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, BLOCK_BEGIN_LABEL, blocknum);
9651 }
9652
9653 /* Output a marker (i.e. a label) for the end of the generated code for a
9654    lexical block.  */
9655
9656 void
9657 dwarf2out_end_block (blocknum)
9658      register unsigned blocknum;
9659 {
9660   function_section (current_function_decl);
9661   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, BLOCK_END_LABEL, blocknum);
9662 }
9663
9664 /* Output a marker (i.e. a label) at a point in the assembly code which
9665    corresponds to a given source level label.  */
9666
9667 void
9668 dwarf2out_label (insn)
9669      register rtx insn;
9670 {
9671   char label[MAX_ARTIFICIAL_LABEL_BYTES];
9672
9673   if (debug_info_level >= DINFO_LEVEL_NORMAL)
9674     {
9675       function_section (current_function_decl);
9676       sprintf (label, INSN_LABEL_FMT, current_funcdef_number);
9677       ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, label,
9678                                  (unsigned) INSN_UID (insn));
9679     }
9680 }
9681
9682 /* Lookup a filename (in the list of filenames that we know about here in
9683    dwarf2out.c) and return its "index".  The index of each (known) filename is
9684    just a unique number which is associated with only that one filename.
9685    We need such numbers for the sake of generating labels
9686    (in the .debug_sfnames section) and references to those
9687    files  numbers (in the .debug_srcinfo and.debug_macinfo sections).
9688    If the filename given as an argument is not found in our current list,
9689    add it to the list and assign it the next available unique index number.
9690    In order to speed up searches, we remember the index of the filename
9691    was looked up last.  This handles the majority of all searches.  */
9692
9693 static unsigned
9694 lookup_filename (file_name)
9695      const char *file_name;
9696 {
9697   static unsigned last_file_lookup_index = 0;
9698   register unsigned i;
9699
9700   /* Check to see if the file name that was searched on the previous call
9701      matches this file name. If so, return the index.  */
9702   if (last_file_lookup_index != 0)
9703     if (strcmp (file_name, file_table[last_file_lookup_index]) == 0)
9704       return last_file_lookup_index;
9705
9706   /* Didn't match the previous lookup, search the table */
9707   for (i = 1; i < file_table_in_use; ++i)
9708     if (strcmp (file_name, file_table[i]) == 0)
9709       {
9710         last_file_lookup_index = i;
9711         return i;
9712       }
9713
9714   /* Prepare to add a new table entry by making sure there is enough space in 
9715      the table to do so.  If not, expand the current table.  */
9716   if (file_table_in_use == file_table_allocated)
9717     {
9718       file_table_allocated += FILE_TABLE_INCREMENT;
9719       file_table
9720         = (char **) xrealloc (file_table,
9721                               file_table_allocated * sizeof (char *));
9722     }
9723
9724   /* Add the new entry to the end of the filename table.  */
9725   file_table[file_table_in_use] = xstrdup (file_name);
9726   last_file_lookup_index = file_table_in_use++;
9727
9728   return last_file_lookup_index;
9729 }
9730
9731 /* Output a label to mark the beginning of a source code line entry
9732    and record information relating to this source line, in
9733    'line_info_table' for later output of the .debug_line section.  */
9734
9735 void
9736 dwarf2out_line (filename, line)
9737      register const char *filename;
9738      register unsigned line;
9739 {
9740   if (debug_info_level >= DINFO_LEVEL_NORMAL)
9741     {
9742       function_section (current_function_decl);
9743
9744       if (DWARF2_ASM_LINE_DEBUG_INFO)
9745         {
9746           static const char *lastfile;
9747
9748           /* Emit the .file and .loc directives understood by GNU as.  */
9749           if (lastfile == 0 || strcmp (filename, lastfile))
9750             {
9751               if (lastfile == 0)
9752                 ggc_add_string_root ((char **) &lastfile, 1);
9753
9754               fprintf (asm_out_file, "\t.file 0 \"%s\"\n", filename);
9755               lastfile = filename;
9756             }
9757
9758           fprintf (asm_out_file, "\t.loc 0 %d 0\n", line);
9759
9760           /* Indicate that line number info exists.  */
9761           ++line_info_table_in_use;
9762
9763           /* Indicate that multiple line number tables exist.  */
9764           if (DECL_SECTION_NAME (current_function_decl))
9765             ++separate_line_info_table_in_use;
9766         }
9767       else if (DECL_SECTION_NAME (current_function_decl))
9768         {
9769           register dw_separate_line_info_ref line_info;
9770           ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, SEPARATE_LINE_CODE_LABEL,
9771                                      separate_line_info_table_in_use);
9772           if (flag_debug_asm)
9773             fprintf (asm_out_file, "\t%s line %d", ASM_COMMENT_START, line);
9774           fputc ('\n', asm_out_file);
9775
9776           /* expand the line info table if necessary */
9777           if (separate_line_info_table_in_use
9778               == separate_line_info_table_allocated)
9779             {
9780               separate_line_info_table_allocated += LINE_INFO_TABLE_INCREMENT;
9781               separate_line_info_table
9782                 = (dw_separate_line_info_ref)
9783                   xrealloc (separate_line_info_table,
9784                             separate_line_info_table_allocated
9785                             * sizeof (dw_separate_line_info_entry));
9786             }
9787
9788           /* Add the new entry at the end of the line_info_table.  */
9789           line_info
9790             = &separate_line_info_table[separate_line_info_table_in_use++];
9791           line_info->dw_file_num = lookup_filename (filename);
9792           line_info->dw_line_num = line;
9793           line_info->function = current_funcdef_number;
9794         }
9795       else
9796         {
9797           register dw_line_info_ref line_info;
9798
9799           ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, LINE_CODE_LABEL,
9800                                      line_info_table_in_use);
9801           if (flag_debug_asm)
9802             fprintf (asm_out_file, "\t%s line %d", ASM_COMMENT_START, line);
9803           fputc ('\n', asm_out_file);
9804
9805           /* Expand the line info table if necessary.  */
9806           if (line_info_table_in_use == line_info_table_allocated)
9807             {
9808               line_info_table_allocated += LINE_INFO_TABLE_INCREMENT;
9809               line_info_table
9810                 = (dw_line_info_ref)
9811                   xrealloc (line_info_table,
9812                             (line_info_table_allocated
9813                              * sizeof (dw_line_info_entry)));
9814             }
9815
9816           /* Add the new entry at the end of the line_info_table.  */
9817           line_info = &line_info_table[line_info_table_in_use++];
9818           line_info->dw_file_num = lookup_filename (filename);
9819           line_info->dw_line_num = line;
9820         }
9821     }
9822 }
9823
9824 /* Record the beginning of a new source file, for later output
9825    of the .debug_macinfo section.  At present, unimplemented.  */
9826
9827 void
9828 dwarf2out_start_source_file (filename)
9829      register const char *filename ATTRIBUTE_UNUSED;
9830 {
9831 }
9832
9833 /* Record the end of a source file, for later output
9834    of the .debug_macinfo section.  At present, unimplemented.  */
9835
9836 void
9837 dwarf2out_end_source_file ()
9838 {
9839 }
9840
9841 /* Called from check_newline in c-parse.y.  The `buffer' parameter contains
9842    the tail part of the directive line, i.e. the part which is past the
9843    initial whitespace, #, whitespace, directive-name, whitespace part.  */
9844
9845 void
9846 dwarf2out_define (lineno, buffer)
9847      register unsigned lineno ATTRIBUTE_UNUSED;
9848      register const char *buffer ATTRIBUTE_UNUSED;
9849 {
9850   static int initialized = 0;
9851   if (!initialized)
9852     {
9853       dwarf2out_start_source_file (primary_filename);
9854       initialized = 1;
9855     }
9856 }
9857
9858 /* Called from check_newline in c-parse.y.  The `buffer' parameter contains
9859    the tail part of the directive line, i.e. the part which is past the
9860    initial whitespace, #, whitespace, directive-name, whitespace part.  */
9861
9862 void
9863 dwarf2out_undef (lineno, buffer)
9864      register unsigned lineno ATTRIBUTE_UNUSED;
9865      register const char *buffer ATTRIBUTE_UNUSED;
9866 {
9867 }
9868
9869 /* Set up for Dwarf output at the start of compilation.  */
9870
9871 void
9872 dwarf2out_init (asm_out_file, main_input_filename)
9873      register FILE *asm_out_file;
9874      register char *main_input_filename;
9875 {
9876   /* Remember the name of the primary input file.  */
9877   primary_filename = main_input_filename;
9878
9879   /* Allocate the initial hunk of the file_table.  */
9880   file_table = (char **) xcalloc (FILE_TABLE_INCREMENT, sizeof (char *));
9881   file_table_allocated = FILE_TABLE_INCREMENT;
9882
9883   /* Skip the first entry - file numbers begin at 1.  */
9884   file_table_in_use = 1;
9885
9886   /* Allocate the initial hunk of the decl_die_table.  */
9887   decl_die_table
9888     = (dw_die_ref *) xcalloc (DECL_DIE_TABLE_INCREMENT, sizeof (dw_die_ref));
9889   decl_die_table_allocated = DECL_DIE_TABLE_INCREMENT;
9890   decl_die_table_in_use = 0;
9891
9892   /* Allocate the initial hunk of the decl_scope_table.  */
9893   decl_scope_table
9894     = (decl_scope_node *) xcalloc (DECL_SCOPE_TABLE_INCREMENT,
9895                                    sizeof (decl_scope_node));
9896   decl_scope_table_allocated = DECL_SCOPE_TABLE_INCREMENT;
9897   decl_scope_depth = 0;
9898
9899   /* Allocate the initial hunk of the abbrev_die_table.  */
9900   abbrev_die_table
9901     = (dw_die_ref *) xcalloc (ABBREV_DIE_TABLE_INCREMENT,
9902                               sizeof (dw_die_ref));
9903   abbrev_die_table_allocated = ABBREV_DIE_TABLE_INCREMENT;
9904   /* Zero-th entry is allocated, but unused */
9905   abbrev_die_table_in_use = 1;
9906
9907   /* Allocate the initial hunk of the line_info_table.  */
9908   line_info_table
9909     = (dw_line_info_ref) xcalloc (LINE_INFO_TABLE_INCREMENT,
9910                                   sizeof (dw_line_info_entry));
9911   line_info_table_allocated = LINE_INFO_TABLE_INCREMENT;
9912   /* Zero-th entry is allocated, but unused */
9913   line_info_table_in_use = 1;
9914
9915   /* Generate the initial DIE for the .debug section.  Note that the (string) 
9916      value given in the DW_AT_name attribute of the DW_TAG_compile_unit DIE
9917      will (typically) be a relative pathname and that this pathname should be 
9918      taken as being relative to the directory from which the compiler was
9919      invoked when the given (base) source file was compiled.  */
9920   comp_unit_die = gen_compile_unit_die (main_input_filename);
9921
9922   ASM_GENERATE_INTERNAL_LABEL (text_end_label, TEXT_END_LABEL, 0);
9923   ASM_GENERATE_INTERNAL_LABEL (abbrev_section_label, ABBREV_SECTION_LABEL, 0);
9924   if (DWARF2_GENERATE_TEXT_SECTION_LABEL)
9925     ASM_GENERATE_INTERNAL_LABEL (text_section_label, TEXT_SECTION_LABEL, 0);
9926   else
9927     strcpy (text_section_label, stripattributes (TEXT_SECTION));
9928   ASM_GENERATE_INTERNAL_LABEL (debug_info_section_label, 
9929                                DEBUG_INFO_SECTION_LABEL, 0);
9930   ASM_GENERATE_INTERNAL_LABEL (debug_line_section_label, 
9931                                DEBUG_LINE_SECTION_LABEL, 0);
9932
9933   ASM_OUTPUT_SECTION (asm_out_file, ABBREV_SECTION);
9934   ASM_OUTPUT_LABEL (asm_out_file, abbrev_section_label);
9935   if (DWARF2_GENERATE_TEXT_SECTION_LABEL)
9936     {
9937       ASM_OUTPUT_SECTION (asm_out_file, TEXT_SECTION);
9938       ASM_OUTPUT_LABEL (asm_out_file, text_section_label);
9939     }
9940   ASM_OUTPUT_SECTION (asm_out_file, DEBUG_INFO_SECTION);
9941   ASM_OUTPUT_LABEL (asm_out_file, debug_info_section_label);
9942   ASM_OUTPUT_SECTION (asm_out_file, DEBUG_LINE_SECTION);
9943   ASM_OUTPUT_LABEL (asm_out_file, debug_line_section_label);
9944 }
9945
9946 /* Output stuff that dwarf requires at the end of every file,
9947    and generate the DWARF-2 debugging info.  */
9948
9949 void
9950 dwarf2out_finish ()
9951 {
9952   limbo_die_node *node, *next_node;
9953   dw_die_ref die;
9954
9955   /* Traverse the limbo die list, and add parent/child links.  The only
9956      dies without parents that should be here are concrete instances of
9957      inline functions, and the comp_unit_die.  We can ignore the comp_unit_die.
9958      For concrete instances, we can get the parent die from the abstract
9959      instance.  */
9960   for (node = limbo_die_list; node; node = next_node)
9961     {
9962       next_node = node->next;
9963       die = node->die;
9964
9965       if (die->die_parent == NULL)
9966         {
9967           dw_die_ref origin = get_AT_ref (die, DW_AT_abstract_origin);
9968           if (origin)
9969             add_child_die (origin->die_parent, die);
9970           else if (die == comp_unit_die)
9971             ;
9972           else
9973             abort ();
9974         }
9975       free (node);
9976     }
9977   limbo_die_list = NULL;
9978
9979   /* Walk through the list of incomplete types again, trying once more to
9980      emit full debugging info for them.  */
9981   retry_incomplete_types ();
9982
9983   /* Traverse the DIE's, reverse their lists of attributes and children,
9984      and add add sibling attributes to those DIE's that have children.  */
9985   add_sibling_attributes (comp_unit_die);
9986
9987   /* Output a terminator label for the .text section.  */
9988   fputc ('\n', asm_out_file);
9989   ASM_OUTPUT_SECTION (asm_out_file, TEXT_SECTION);
9990   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, TEXT_END_LABEL, 0);
9991
9992 #if 0
9993   /* Output a terminator label for the .data section.  */
9994   fputc ('\n', asm_out_file);
9995   ASM_OUTPUT_SECTION (asm_out_file, DATA_SECTION);
9996   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, DATA_END_LABEL, 0);
9997
9998   /* Output a terminator label for the .bss section.  */
9999   fputc ('\n', asm_out_file);
10000   ASM_OUTPUT_SECTION (asm_out_file, BSS_SECTION);
10001   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, BSS_END_LABEL, 0);
10002 #endif
10003
10004   /* Output the source line correspondence table.  */
10005   if (line_info_table_in_use > 1 || separate_line_info_table_in_use)
10006     {
10007       if (! DWARF2_ASM_LINE_DEBUG_INFO)
10008         {
10009           fputc ('\n', asm_out_file);
10010           ASM_OUTPUT_SECTION (asm_out_file, DEBUG_LINE_SECTION);
10011           output_line_info ();
10012         }
10013
10014       /* We can only use the low/high_pc attributes if all of the code
10015          was in .text.  */
10016       if (separate_line_info_table_in_use == 0)
10017         {
10018           add_AT_lbl_id (comp_unit_die, DW_AT_low_pc, text_section_label);
10019           add_AT_lbl_id (comp_unit_die, DW_AT_high_pc, text_end_label);
10020         }
10021
10022       add_AT_lbl_offset (comp_unit_die, DW_AT_stmt_list,
10023                          debug_line_section_label);
10024     }
10025
10026 #if 0 /* unimplemented */
10027   if (debug_info_level >= DINFO_LEVEL_VERBOSE && primary)
10028     add_AT_unsigned (die, DW_AT_macro_info, 0);
10029 #endif
10030
10031   /* Output the abbreviation table.  */
10032   fputc ('\n', asm_out_file);
10033   ASM_OUTPUT_SECTION (asm_out_file, ABBREV_SECTION);
10034   build_abbrev_table (comp_unit_die);
10035   output_abbrev_section ();
10036
10037   /* Initialize the beginning DIE offset - and calculate sizes/offsets.   */
10038   next_die_offset = DWARF_COMPILE_UNIT_HEADER_SIZE;
10039   calc_die_sizes (comp_unit_die);
10040
10041   /* Output debugging information.  */
10042   fputc ('\n', asm_out_file);
10043   ASM_OUTPUT_SECTION (asm_out_file, DEBUG_INFO_SECTION);
10044   output_compilation_unit_header ();
10045   output_die (comp_unit_die);
10046
10047   if (pubname_table_in_use)
10048     {
10049       /* Output public names table.  */
10050       fputc ('\n', asm_out_file);
10051       ASM_OUTPUT_SECTION (asm_out_file, PUBNAMES_SECTION);
10052       output_pubnames ();
10053     }
10054
10055   /* We only put functions in the arange table, so don't write it out if
10056      we don't have any.  */
10057   if (fde_table_in_use)
10058     {
10059       /* Output the address range information.  */
10060       fputc ('\n', asm_out_file);
10061       ASM_OUTPUT_SECTION (asm_out_file, ARANGES_SECTION);
10062       output_aranges ();
10063     }
10064 }
10065 #endif /* DWARF2_DEBUGGING_INFO */