OSDN Git Service

* dwarf2out.c (add_abstract_origin_attribute): Don't abort when
[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 /* A pointer to the base of a table of references to declaration
2231    scopes.  This table is a display which tracks the nesting
2232    of declaration scopes at the current scope and containing
2233    scopes.  This table is used to find the proper place to
2234    define type declaration DIE's.  */
2235 static tree *decl_scope_table;
2236
2237 /* Number of elements currently allocated for the decl_scope_table.  */
2238 static int decl_scope_table_allocated;
2239
2240 /* Current level of nesting of declaration scopes.  */
2241 static int decl_scope_depth;
2242
2243 /* Size (in elements) of increments by which we may expand the
2244    decl_scope_table.  */
2245 #define DECL_SCOPE_TABLE_INCREMENT 64
2246
2247 /* A pointer to the base of a list of references to DIE's that
2248    are uniquely identified by their tag, presence/absence of
2249    children DIE's, and list of attribute/value pairs.  */
2250 static dw_die_ref *abbrev_die_table;
2251
2252 /* Number of elements currently allocated for abbrev_die_table.  */
2253 static unsigned abbrev_die_table_allocated;
2254
2255 /* Number of elements in type_die_table currently in use.  */
2256 static unsigned abbrev_die_table_in_use;
2257
2258 /* Size (in elements) of increments by which we may expand the
2259    abbrev_die_table.  */
2260 #define ABBREV_DIE_TABLE_INCREMENT 256
2261
2262 /* A pointer to the base of a table that contains line information
2263    for each source code line in .text in the compilation unit.  */
2264 static dw_line_info_ref line_info_table;
2265
2266 /* Number of elements currently allocated for line_info_table.  */
2267 static unsigned line_info_table_allocated;
2268
2269 /* Number of elements in separate_line_info_table currently in use.  */
2270 static unsigned separate_line_info_table_in_use;
2271
2272 /* A pointer to the base of a table that contains line information
2273    for each source code line outside of .text in the compilation unit.  */
2274 static dw_separate_line_info_ref separate_line_info_table;
2275
2276 /* Number of elements currently allocated for separate_line_info_table.  */
2277 static unsigned separate_line_info_table_allocated;
2278
2279 /* Number of elements in line_info_table currently in use.  */
2280 static unsigned line_info_table_in_use;
2281
2282 /* Size (in elements) of increments by which we may expand the
2283    line_info_table.  */
2284 #define LINE_INFO_TABLE_INCREMENT 1024
2285
2286 /* A pointer to the base of a table that contains a list of publicly
2287    accessible names.  */
2288 static pubname_ref pubname_table;
2289
2290 /* Number of elements currently allocated for pubname_table.  */
2291 static unsigned pubname_table_allocated;
2292
2293 /* Number of elements in pubname_table currently in use.  */
2294 static unsigned pubname_table_in_use;
2295
2296 /* Size (in elements) of increments by which we may expand the
2297    pubname_table.  */
2298 #define PUBNAME_TABLE_INCREMENT 64
2299
2300 /* A pointer to the base of a table that contains a list of publicly
2301    accessible names.  */
2302 static arange_ref arange_table;
2303
2304 /* Number of elements currently allocated for arange_table.  */
2305 static unsigned arange_table_allocated;
2306
2307 /* Number of elements in arange_table currently in use.  */
2308 static unsigned arange_table_in_use;
2309
2310 /* Size (in elements) of increments by which we may expand the
2311    arange_table.  */
2312 #define ARANGE_TABLE_INCREMENT 64
2313
2314 /* A pointer to the base of a list of incomplete types which might be
2315    completed at some later time.  */
2316
2317 static tree *incomplete_types_list;
2318
2319 /* Number of elements currently allocated for the incomplete_types_list.  */
2320 static unsigned incomplete_types_allocated;
2321
2322 /* Number of elements of incomplete_types_list currently in use.  */
2323 static unsigned incomplete_types;
2324
2325 /* Size (in elements) of increments by which we may expand the incomplete
2326    types list.  Actually, a single hunk of space of this size should
2327    be enough for most typical programs.  */
2328 #define INCOMPLETE_TYPES_INCREMENT 64
2329
2330 /* Record whether the function being analyzed contains inlined functions.  */
2331 static int current_function_has_inlines;
2332 #if 0 && defined (MIPS_DEBUGGING_INFO)
2333 static int comp_unit_has_inlines;
2334 #endif
2335
2336 /* Forward declarations for functions defined in this file.  */
2337
2338 static void addr_const_to_string        PROTO((dyn_string_t, rtx));
2339 static char *addr_to_string             PROTO((rtx));
2340 static int is_pseudo_reg                PROTO((rtx));
2341 static tree type_main_variant           PROTO((tree));
2342 static int is_tagged_type               PROTO((tree));
2343 static const char *dwarf_tag_name       PROTO((unsigned));
2344 static const char *dwarf_attr_name      PROTO((unsigned));
2345 static const char *dwarf_form_name      PROTO((unsigned));
2346 static const char *dwarf_stack_op_name  PROTO((unsigned));
2347 #if 0
2348 static const char *dwarf_type_encoding_name PROTO((unsigned));
2349 #endif
2350 static tree decl_ultimate_origin        PROTO((tree));
2351 static tree block_ultimate_origin       PROTO((tree));
2352 static tree decl_class_context          PROTO((tree));
2353 static void add_dwarf_attr              PROTO((dw_die_ref, dw_attr_ref));
2354 static void add_AT_flag                 PROTO((dw_die_ref,
2355                                                enum dwarf_attribute,
2356                                                unsigned));
2357 static void add_AT_int                  PROTO((dw_die_ref,
2358                                                enum dwarf_attribute, long));
2359 static void add_AT_unsigned             PROTO((dw_die_ref,
2360                                                enum dwarf_attribute,
2361                                                unsigned long));
2362 static void add_AT_long_long            PROTO((dw_die_ref,
2363                                                enum dwarf_attribute,
2364                                                unsigned long, unsigned long));
2365 static void add_AT_float                PROTO((dw_die_ref,
2366                                                enum dwarf_attribute,
2367                                                unsigned, long *));
2368 static void add_AT_string               PROTO((dw_die_ref,
2369                                                enum dwarf_attribute,
2370                                                const char *));
2371 static void add_AT_die_ref              PROTO((dw_die_ref,
2372                                                enum dwarf_attribute,
2373                                                dw_die_ref));
2374 static void add_AT_fde_ref              PROTO((dw_die_ref,
2375                                                enum dwarf_attribute,
2376                                                unsigned));
2377 static void add_AT_loc                  PROTO((dw_die_ref,
2378                                                enum dwarf_attribute,
2379                                                dw_loc_descr_ref));
2380 static void add_AT_addr                 PROTO((dw_die_ref,
2381                                                enum dwarf_attribute, char *));
2382 static void add_AT_lbl_id               PROTO((dw_die_ref,
2383                                                enum dwarf_attribute, char *));
2384 static void add_AT_lbl_offset           PROTO((dw_die_ref,
2385                                                enum dwarf_attribute, char *));
2386 static dw_attr_ref get_AT               PROTO((dw_die_ref,
2387                                                enum dwarf_attribute));
2388 static const char *get_AT_low_pc        PROTO((dw_die_ref));
2389 static const char *get_AT_hi_pc         PROTO((dw_die_ref));
2390 static const char *get_AT_string        PROTO((dw_die_ref,
2391                                                enum dwarf_attribute));
2392 static int get_AT_flag                  PROTO((dw_die_ref,
2393                                                enum dwarf_attribute));
2394 static unsigned get_AT_unsigned         PROTO((dw_die_ref,
2395                                                enum dwarf_attribute));
2396 static int is_c_family                  PROTO((void));
2397 static int is_fortran                   PROTO((void));
2398 static void remove_AT                   PROTO((dw_die_ref,
2399                                                enum dwarf_attribute));
2400 static void remove_children             PROTO((dw_die_ref));
2401 static void add_child_die               PROTO((dw_die_ref, dw_die_ref));
2402 static dw_die_ref new_die               PROTO((enum dwarf_tag, dw_die_ref));
2403 static dw_die_ref lookup_type_die       PROTO((tree));
2404 static void equate_type_number_to_die   PROTO((tree, dw_die_ref));
2405 static dw_die_ref lookup_decl_die       PROTO((tree));
2406 static void equate_decl_number_to_die   PROTO((tree, dw_die_ref));
2407 static dw_loc_descr_ref new_loc_descr   PROTO((enum dwarf_location_atom,
2408                                                unsigned long, unsigned long));
2409 static void add_loc_descr               PROTO((dw_loc_descr_ref *,
2410                                                dw_loc_descr_ref));
2411 static void print_spaces                PROTO((FILE *));
2412 static void print_die                   PROTO((dw_die_ref, FILE *));
2413 static void print_dwarf_line_table      PROTO((FILE *));
2414 static void add_sibling_attributes      PROTO((dw_die_ref));
2415 static void build_abbrev_table          PROTO((dw_die_ref));
2416 static unsigned long size_of_string     PROTO((const char *));
2417 static unsigned long size_of_loc_descr  PROTO((dw_loc_descr_ref));
2418 static unsigned long size_of_locs       PROTO((dw_loc_descr_ref));
2419 static int constant_size                PROTO((long unsigned));
2420 static unsigned long size_of_die        PROTO((dw_die_ref));
2421 static void calc_die_sizes              PROTO((dw_die_ref));
2422 static unsigned long size_of_line_prolog        PROTO((void));
2423 static unsigned long size_of_pubnames   PROTO((void));
2424 static unsigned long size_of_aranges    PROTO((void));
2425 static enum dwarf_form value_format     PROTO((dw_attr_ref));
2426 static void output_value_format         PROTO((dw_attr_ref));
2427 static void output_abbrev_section       PROTO((void));
2428 static void output_loc_operands         PROTO((dw_loc_descr_ref));
2429 static void output_die                  PROTO((dw_die_ref));
2430 static void output_compilation_unit_header PROTO((void));
2431 static const char *dwarf2_name          PROTO((tree, int));
2432 static void add_pubname                 PROTO((tree, dw_die_ref));
2433 static void output_pubnames             PROTO((void));
2434 static void add_arange                  PROTO((tree, dw_die_ref));
2435 static void output_aranges              PROTO((void));
2436 static void output_line_info            PROTO((void));
2437 static int is_body_block                PROTO((tree));
2438 static dw_die_ref base_type_die         PROTO((tree));
2439 static tree root_type                   PROTO((tree));
2440 static int is_base_type                 PROTO((tree));
2441 static dw_die_ref modified_type_die     PROTO((tree, int, int, dw_die_ref));
2442 static int type_is_enum                 PROTO((tree));
2443 static dw_loc_descr_ref reg_loc_descriptor PROTO((rtx));
2444 static dw_loc_descr_ref based_loc_descr PROTO((unsigned, long));
2445 static int is_based_loc                 PROTO((rtx));
2446 static dw_loc_descr_ref mem_loc_descriptor PROTO((rtx, enum machine_mode mode));
2447 static dw_loc_descr_ref concat_loc_descriptor PROTO((rtx, rtx));
2448 static dw_loc_descr_ref loc_descriptor  PROTO((rtx));
2449 static unsigned ceiling                 PROTO((unsigned, unsigned));
2450 static tree field_type                  PROTO((tree));
2451 static unsigned simple_type_align_in_bits PROTO((tree));
2452 static unsigned simple_type_size_in_bits PROTO((tree));
2453 static unsigned field_byte_offset               PROTO((tree));
2454 static void add_AT_location_description PROTO((dw_die_ref,
2455                                                enum dwarf_attribute, rtx));
2456 static void add_data_member_location_attribute PROTO((dw_die_ref, tree));
2457 static void add_const_value_attribute   PROTO((dw_die_ref, rtx));
2458 static void add_location_or_const_value_attribute PROTO((dw_die_ref, tree));
2459 static void add_name_attribute          PROTO((dw_die_ref, const char *));
2460 static void add_bound_info              PROTO((dw_die_ref,
2461                                                enum dwarf_attribute, tree));
2462 static void add_subscript_info          PROTO((dw_die_ref, tree));
2463 static void add_byte_size_attribute     PROTO((dw_die_ref, tree));
2464 static void add_bit_offset_attribute    PROTO((dw_die_ref, tree));
2465 static void add_bit_size_attribute      PROTO((dw_die_ref, tree));
2466 static void add_prototyped_attribute    PROTO((dw_die_ref, tree));
2467 static void add_abstract_origin_attribute PROTO((dw_die_ref, tree));
2468 static void add_pure_or_virtual_attribute PROTO((dw_die_ref, tree));
2469 static void add_src_coords_attributes   PROTO((dw_die_ref, tree));
2470 static void add_name_and_src_coords_attributes PROTO((dw_die_ref, tree));
2471 static void push_decl_scope             PROTO((tree));
2472 static dw_die_ref scope_die_for         PROTO((tree, dw_die_ref));
2473 static void pop_decl_scope              PROTO((void));
2474 static void add_type_attribute          PROTO((dw_die_ref, tree, int, int,
2475                                                dw_die_ref));
2476 static char *type_tag                   PROTO((tree));
2477 static tree member_declared_type        PROTO((tree));
2478 #if 0
2479 static char *decl_start_label           PROTO((tree));
2480 #endif
2481 static void gen_array_type_die          PROTO((tree, dw_die_ref));
2482 static void gen_set_type_die            PROTO((tree, dw_die_ref));
2483 #if 0
2484 static void gen_entry_point_die         PROTO((tree, dw_die_ref));
2485 #endif
2486 static void gen_inlined_enumeration_type_die PROTO((tree, dw_die_ref));
2487 static void gen_inlined_structure_type_die PROTO((tree, dw_die_ref));
2488 static void gen_inlined_union_type_die  PROTO((tree, dw_die_ref));
2489 static void gen_enumeration_type_die    PROTO((tree, dw_die_ref));
2490 static dw_die_ref gen_formal_parameter_die PROTO((tree, dw_die_ref));
2491 static void gen_unspecified_parameters_die PROTO((tree, dw_die_ref));
2492 static void gen_formal_types_die        PROTO((tree, dw_die_ref));
2493 static void gen_subprogram_die          PROTO((tree, dw_die_ref));
2494 static void gen_variable_die            PROTO((tree, dw_die_ref));
2495 static void gen_label_die               PROTO((tree, dw_die_ref));
2496 static void gen_lexical_block_die       PROTO((tree, dw_die_ref, int));
2497 static void gen_inlined_subroutine_die  PROTO((tree, dw_die_ref, int));
2498 static void gen_field_die               PROTO((tree, dw_die_ref));
2499 static void gen_ptr_to_mbr_type_die     PROTO((tree, dw_die_ref));
2500 static dw_die_ref gen_compile_unit_die  PROTO((const char *));
2501 static void gen_string_type_die         PROTO((tree, dw_die_ref));
2502 static void gen_inheritance_die         PROTO((tree, dw_die_ref));
2503 static void gen_member_die              PROTO((tree, dw_die_ref));
2504 static void gen_struct_or_union_type_die PROTO((tree, dw_die_ref));
2505 static void gen_subroutine_type_die     PROTO((tree, dw_die_ref));
2506 static void gen_typedef_die             PROTO((tree, dw_die_ref));
2507 static void gen_type_die                PROTO((tree, dw_die_ref));
2508 static void gen_tagged_type_instantiation_die PROTO((tree, dw_die_ref));
2509 static void gen_block_die               PROTO((tree, dw_die_ref, int));
2510 static void decls_for_scope             PROTO((tree, dw_die_ref, int));
2511 static int is_redundant_typedef         PROTO((tree));
2512 static void gen_decl_die                PROTO((tree, dw_die_ref));
2513 static unsigned lookup_filename         PROTO((const char *));
2514 static void add_incomplete_type         PROTO((tree));
2515 static void retry_incomplete_types      PROTO((void));
2516 static void gen_type_die_for_member     PROTO((tree, tree, dw_die_ref));
2517 static void gen_abstract_function       PROTO((tree));
2518
2519 /* Section names used to hold DWARF debugging information.  */
2520 #ifndef DEBUG_INFO_SECTION
2521 #define DEBUG_INFO_SECTION      ".debug_info"
2522 #endif
2523 #ifndef ABBREV_SECTION
2524 #define ABBREV_SECTION          ".debug_abbrev"
2525 #endif
2526 #ifndef ARANGES_SECTION
2527 #define ARANGES_SECTION         ".debug_aranges"
2528 #endif
2529 #ifndef DW_MACINFO_SECTION
2530 #define DW_MACINFO_SECTION      ".debug_macinfo"
2531 #endif
2532 #ifndef DEBUG_LINE_SECTION
2533 #define DEBUG_LINE_SECTION      ".debug_line"
2534 #endif
2535 #ifndef LOC_SECTION
2536 #define LOC_SECTION             ".debug_loc"
2537 #endif
2538 #ifndef PUBNAMES_SECTION
2539 #define PUBNAMES_SECTION        ".debug_pubnames"
2540 #endif
2541 #ifndef STR_SECTION
2542 #define STR_SECTION             ".debug_str"
2543 #endif
2544
2545 /* Standard ELF section names for compiled code and data.  */
2546 #ifndef TEXT_SECTION
2547 #define TEXT_SECTION            ".text"
2548 #endif
2549 #ifndef DATA_SECTION
2550 #define DATA_SECTION            ".data"
2551 #endif
2552 #ifndef BSS_SECTION
2553 #define BSS_SECTION             ".bss"
2554 #endif
2555
2556 /* Labels we insert at beginning sections we can reference instead of
2557    the section names themselves. */
2558
2559 #ifndef TEXT_SECTION_LABEL
2560 #define TEXT_SECTION_LABEL       "Ltext"
2561 #endif
2562 #ifndef DEBUG_LINE_SECTION_LABEL
2563 #define DEBUG_LINE_SECTION_LABEL "Ldebug_line"
2564 #endif
2565 #ifndef DEBUG_INFO_SECTION_LABEL
2566 #define DEBUG_INFO_SECTION_LABEL "Ldebug_info"
2567 #endif
2568 #ifndef ABBREV_SECTION_LABEL
2569 #define ABBREV_SECTION_LABEL     "Ldebug_abbrev"
2570 #endif
2571
2572
2573 /* Definitions of defaults for formats and names of various special
2574    (artificial) labels which may be generated within this file (when the -g
2575    options is used and DWARF_DEBUGGING_INFO is in effect.
2576    If necessary, these may be overridden from within the tm.h file, but
2577    typically, overriding these defaults is unnecessary.  */
2578
2579 static char text_end_label[MAX_ARTIFICIAL_LABEL_BYTES];
2580 static char text_section_label[MAX_ARTIFICIAL_LABEL_BYTES];
2581 static char abbrev_section_label[MAX_ARTIFICIAL_LABEL_BYTES];
2582 static char debug_info_section_label[MAX_ARTIFICIAL_LABEL_BYTES];
2583 static char debug_line_section_label[MAX_ARTIFICIAL_LABEL_BYTES];
2584
2585 #ifndef TEXT_END_LABEL
2586 #define TEXT_END_LABEL          "Letext"
2587 #endif
2588 #ifndef DATA_END_LABEL
2589 #define DATA_END_LABEL          "Ledata"
2590 #endif
2591 #ifndef BSS_END_LABEL
2592 #define BSS_END_LABEL           "Lebss"
2593 #endif
2594 #ifndef INSN_LABEL_FMT
2595 #define INSN_LABEL_FMT          "LI%u_"
2596 #endif
2597 #ifndef BLOCK_BEGIN_LABEL
2598 #define BLOCK_BEGIN_LABEL       "LBB"
2599 #endif
2600 #ifndef BLOCK_END_LABEL
2601 #define BLOCK_END_LABEL         "LBE"
2602 #endif
2603 #ifndef BODY_BEGIN_LABEL
2604 #define BODY_BEGIN_LABEL        "Lbb"
2605 #endif
2606 #ifndef BODY_END_LABEL
2607 #define BODY_END_LABEL          "Lbe"
2608 #endif
2609 #ifndef LINE_CODE_LABEL
2610 #define LINE_CODE_LABEL         "LM"
2611 #endif
2612 #ifndef SEPARATE_LINE_CODE_LABEL
2613 #define SEPARATE_LINE_CODE_LABEL        "LSM"
2614 #endif
2615
2616 /* Convert a reference to the assembler name of a C-level name.  This
2617    macro has the same effect as ASM_OUTPUT_LABELREF, but copies to
2618    a string rather than writing to a file.  */
2619 #ifndef ASM_NAME_TO_STRING
2620 #define ASM_NAME_TO_STRING(STR, NAME)                   \
2621   do {                                                  \
2622       if ((NAME)[0] == '*')                             \
2623         dyn_string_append (STR, NAME + 1);              \
2624       else                                              \
2625         {                                               \
2626           const char *newstr;                           \
2627           STRIP_NAME_ENCODING (newstr, NAME);           \
2628           dyn_string_append (STR, user_label_prefix);   \
2629           dyn_string_append (STR, newstr);              \
2630         }                                               \
2631   }                                                     \
2632   while (0)
2633 #endif
2634 \f
2635 /* We allow a language front-end to designate a function that is to be
2636    called to "demangle" any name before it it put into a DIE.  */
2637
2638 static const char *(*demangle_name_func) PROTO((const char *));
2639
2640 void
2641 dwarf2out_set_demangle_name_func (func)
2642      const char *(*func) PROTO((const char *));
2643 {
2644   demangle_name_func = func;
2645 }
2646 \f
2647 /* Convert an integer constant expression into assembler syntax.  Addition
2648    and subtraction are the only arithmetic that may appear in these
2649    expressions.   This is an adaptation of output_addr_const in final.c.
2650    Here, the target of the conversion is a string buffer.  We can't use
2651    output_addr_const directly, because it writes to a file.  */
2652
2653 static void
2654 addr_const_to_string (str, x)
2655      dyn_string_t str;
2656      rtx x;
2657 {
2658   char buf1[256];
2659
2660 restart:
2661   switch (GET_CODE (x))
2662     {
2663     case PC:
2664       if (flag_pic)
2665         dyn_string_append (str, ",");
2666       else
2667         abort ();
2668       break;
2669
2670     case SYMBOL_REF:
2671       ASM_NAME_TO_STRING (str, XSTR (x, 0));
2672       break;
2673
2674     case LABEL_REF:
2675       ASM_GENERATE_INTERNAL_LABEL (buf1, "L", CODE_LABEL_NUMBER (XEXP (x, 0)));
2676       ASM_NAME_TO_STRING (str, buf1);
2677       break;
2678
2679     case CODE_LABEL:
2680       ASM_GENERATE_INTERNAL_LABEL (buf1, "L", CODE_LABEL_NUMBER (x));
2681       ASM_NAME_TO_STRING (str, buf1);
2682       break;
2683
2684     case CONST_INT:
2685       sprintf (buf1, HOST_WIDE_INT_PRINT_DEC, INTVAL (x));
2686       dyn_string_append (str, buf1);
2687       break;
2688
2689     case CONST:
2690       /* This used to output parentheses around the expression, but that does 
2691          not work on the 386 (either ATT or BSD assembler).  */
2692       addr_const_to_string (str, XEXP (x, 0));
2693       break;
2694
2695     case CONST_DOUBLE:
2696       if (GET_MODE (x) == VOIDmode)
2697         {
2698           /* We can use %d if the number is one word and positive.  */
2699           if (CONST_DOUBLE_HIGH (x))
2700             sprintf (buf1, HOST_WIDE_INT_PRINT_DOUBLE_HEX,
2701                      CONST_DOUBLE_HIGH (x), CONST_DOUBLE_LOW (x));
2702           else if (CONST_DOUBLE_LOW (x) < 0)
2703             sprintf (buf1, HOST_WIDE_INT_PRINT_HEX, CONST_DOUBLE_LOW (x));
2704           else
2705             sprintf (buf1, HOST_WIDE_INT_PRINT_DEC,
2706                      CONST_DOUBLE_LOW (x));
2707           dyn_string_append (str, buf1);
2708         }
2709       else
2710         /* We can't handle floating point constants; PRINT_OPERAND must
2711            handle them.  */
2712         output_operand_lossage ("floating constant misused");
2713       break;
2714
2715     case PLUS:
2716       /* Some assemblers need integer constants to appear last (eg masm).  */
2717       if (GET_CODE (XEXP (x, 0)) == CONST_INT)
2718         {
2719           addr_const_to_string (str, XEXP (x, 1));
2720           if (INTVAL (XEXP (x, 0)) >= 0)
2721             dyn_string_append (str, "+");
2722
2723           addr_const_to_string (str, XEXP (x, 0));
2724         }
2725       else
2726         {
2727           addr_const_to_string (str, XEXP (x, 0));
2728           if (INTVAL (XEXP (x, 1)) >= 0)
2729             dyn_string_append (str, "+");
2730
2731           addr_const_to_string (str, XEXP (x, 1));
2732         }
2733       break;
2734
2735     case MINUS:
2736       /* Avoid outputting things like x-x or x+5-x, since some assemblers
2737          can't handle that.  */
2738       x = simplify_subtraction (x);
2739       if (GET_CODE (x) != MINUS)
2740         goto restart;
2741
2742       addr_const_to_string (str, XEXP (x, 0));
2743       dyn_string_append (str, "-");
2744       if (GET_CODE (XEXP (x, 1)) == CONST_INT
2745           && INTVAL (XEXP (x, 1)) < 0)
2746         {
2747           dyn_string_append (str, ASM_OPEN_PAREN);
2748           addr_const_to_string (str, XEXP (x, 1));
2749           dyn_string_append (str, ASM_CLOSE_PAREN);
2750         }
2751       else
2752         addr_const_to_string (str, XEXP (x, 1));
2753       break;
2754
2755     case ZERO_EXTEND:
2756     case SIGN_EXTEND:
2757       addr_const_to_string (str, XEXP (x, 0));
2758       break;
2759
2760     default:
2761       output_operand_lossage ("invalid expression as operand");
2762     }
2763 }
2764
2765 /* Convert an address constant to a string, and return a pointer to
2766    a copy of the result, located on the heap.  */
2767
2768 static char *
2769 addr_to_string (x)
2770      rtx x;
2771 {
2772   dyn_string_t ds = dyn_string_new (256);
2773   char *s;
2774
2775   addr_const_to_string (ds, x);
2776   
2777   /* Return the dynamically allocated string, but free the
2778      dyn_string_t itself.  */
2779   s = ds->s;
2780   free (ds);
2781   return s;
2782 }
2783
2784 /* Test if rtl node points to a pseudo register.  */
2785
2786 static inline int
2787 is_pseudo_reg (rtl)
2788      register rtx rtl;
2789 {
2790   return (((GET_CODE (rtl) == REG) && (REGNO (rtl) >= FIRST_PSEUDO_REGISTER))
2791           || ((GET_CODE (rtl) == SUBREG)
2792               && (REGNO (XEXP (rtl, 0)) >= FIRST_PSEUDO_REGISTER)));
2793 }
2794
2795 /* Return a reference to a type, with its const and volatile qualifiers
2796    removed.  */
2797
2798 static inline tree
2799 type_main_variant (type)
2800      register tree type;
2801 {
2802   type = TYPE_MAIN_VARIANT (type);
2803
2804   /* There really should be only one main variant among any group of variants 
2805      of a given type (and all of the MAIN_VARIANT values for all members of
2806      the group should point to that one type) but sometimes the C front-end
2807      messes this up for array types, so we work around that bug here.  */
2808
2809   if (TREE_CODE (type) == ARRAY_TYPE)
2810     while (type != TYPE_MAIN_VARIANT (type))
2811       type = TYPE_MAIN_VARIANT (type);
2812
2813   return type;
2814 }
2815
2816 /* Return non-zero if the given type node represents a tagged type.  */
2817
2818 static inline int
2819 is_tagged_type (type)
2820      register tree type;
2821 {
2822   register enum tree_code code = TREE_CODE (type);
2823
2824   return (code == RECORD_TYPE || code == UNION_TYPE
2825           || code == QUAL_UNION_TYPE || code == ENUMERAL_TYPE);
2826 }
2827
2828 /* Convert a DIE tag into its string name.  */
2829
2830 static const char *
2831 dwarf_tag_name (tag)
2832      register unsigned tag;
2833 {
2834   switch (tag)
2835     {
2836     case DW_TAG_padding:
2837       return "DW_TAG_padding";
2838     case DW_TAG_array_type:
2839       return "DW_TAG_array_type";
2840     case DW_TAG_class_type:
2841       return "DW_TAG_class_type";
2842     case DW_TAG_entry_point:
2843       return "DW_TAG_entry_point";
2844     case DW_TAG_enumeration_type:
2845       return "DW_TAG_enumeration_type";
2846     case DW_TAG_formal_parameter:
2847       return "DW_TAG_formal_parameter";
2848     case DW_TAG_imported_declaration:
2849       return "DW_TAG_imported_declaration";
2850     case DW_TAG_label:
2851       return "DW_TAG_label";
2852     case DW_TAG_lexical_block:
2853       return "DW_TAG_lexical_block";
2854     case DW_TAG_member:
2855       return "DW_TAG_member";
2856     case DW_TAG_pointer_type:
2857       return "DW_TAG_pointer_type";
2858     case DW_TAG_reference_type:
2859       return "DW_TAG_reference_type";
2860     case DW_TAG_compile_unit:
2861       return "DW_TAG_compile_unit";
2862     case DW_TAG_string_type:
2863       return "DW_TAG_string_type";
2864     case DW_TAG_structure_type:
2865       return "DW_TAG_structure_type";
2866     case DW_TAG_subroutine_type:
2867       return "DW_TAG_subroutine_type";
2868     case DW_TAG_typedef:
2869       return "DW_TAG_typedef";
2870     case DW_TAG_union_type:
2871       return "DW_TAG_union_type";
2872     case DW_TAG_unspecified_parameters:
2873       return "DW_TAG_unspecified_parameters";
2874     case DW_TAG_variant:
2875       return "DW_TAG_variant";
2876     case DW_TAG_common_block:
2877       return "DW_TAG_common_block";
2878     case DW_TAG_common_inclusion:
2879       return "DW_TAG_common_inclusion";
2880     case DW_TAG_inheritance:
2881       return "DW_TAG_inheritance";
2882     case DW_TAG_inlined_subroutine:
2883       return "DW_TAG_inlined_subroutine";
2884     case DW_TAG_module:
2885       return "DW_TAG_module";
2886     case DW_TAG_ptr_to_member_type:
2887       return "DW_TAG_ptr_to_member_type";
2888     case DW_TAG_set_type:
2889       return "DW_TAG_set_type";
2890     case DW_TAG_subrange_type:
2891       return "DW_TAG_subrange_type";
2892     case DW_TAG_with_stmt:
2893       return "DW_TAG_with_stmt";
2894     case DW_TAG_access_declaration:
2895       return "DW_TAG_access_declaration";
2896     case DW_TAG_base_type:
2897       return "DW_TAG_base_type";
2898     case DW_TAG_catch_block:
2899       return "DW_TAG_catch_block";
2900     case DW_TAG_const_type:
2901       return "DW_TAG_const_type";
2902     case DW_TAG_constant:
2903       return "DW_TAG_constant";
2904     case DW_TAG_enumerator:
2905       return "DW_TAG_enumerator";
2906     case DW_TAG_file_type:
2907       return "DW_TAG_file_type";
2908     case DW_TAG_friend:
2909       return "DW_TAG_friend";
2910     case DW_TAG_namelist:
2911       return "DW_TAG_namelist";
2912     case DW_TAG_namelist_item:
2913       return "DW_TAG_namelist_item";
2914     case DW_TAG_packed_type:
2915       return "DW_TAG_packed_type";
2916     case DW_TAG_subprogram:
2917       return "DW_TAG_subprogram";
2918     case DW_TAG_template_type_param:
2919       return "DW_TAG_template_type_param";
2920     case DW_TAG_template_value_param:
2921       return "DW_TAG_template_value_param";
2922     case DW_TAG_thrown_type:
2923       return "DW_TAG_thrown_type";
2924     case DW_TAG_try_block:
2925       return "DW_TAG_try_block";
2926     case DW_TAG_variant_part:
2927       return "DW_TAG_variant_part";
2928     case DW_TAG_variable:
2929       return "DW_TAG_variable";
2930     case DW_TAG_volatile_type:
2931       return "DW_TAG_volatile_type";
2932     case DW_TAG_MIPS_loop:
2933       return "DW_TAG_MIPS_loop";
2934     case DW_TAG_format_label:
2935       return "DW_TAG_format_label";
2936     case DW_TAG_function_template:
2937       return "DW_TAG_function_template";
2938     case DW_TAG_class_template:
2939       return "DW_TAG_class_template";
2940     default:
2941       return "DW_TAG_<unknown>";
2942     }
2943 }
2944
2945 /* Convert a DWARF attribute code into its string name.  */
2946
2947 static const char *
2948 dwarf_attr_name (attr)
2949      register unsigned attr;
2950 {
2951   switch (attr)
2952     {
2953     case DW_AT_sibling:
2954       return "DW_AT_sibling";
2955     case DW_AT_location:
2956       return "DW_AT_location";
2957     case DW_AT_name:
2958       return "DW_AT_name";
2959     case DW_AT_ordering:
2960       return "DW_AT_ordering";
2961     case DW_AT_subscr_data:
2962       return "DW_AT_subscr_data";
2963     case DW_AT_byte_size:
2964       return "DW_AT_byte_size";
2965     case DW_AT_bit_offset:
2966       return "DW_AT_bit_offset";
2967     case DW_AT_bit_size:
2968       return "DW_AT_bit_size";
2969     case DW_AT_element_list:
2970       return "DW_AT_element_list";
2971     case DW_AT_stmt_list:
2972       return "DW_AT_stmt_list";
2973     case DW_AT_low_pc:
2974       return "DW_AT_low_pc";
2975     case DW_AT_high_pc:
2976       return "DW_AT_high_pc";
2977     case DW_AT_language:
2978       return "DW_AT_language";
2979     case DW_AT_member:
2980       return "DW_AT_member";
2981     case DW_AT_discr:
2982       return "DW_AT_discr";
2983     case DW_AT_discr_value:
2984       return "DW_AT_discr_value";
2985     case DW_AT_visibility:
2986       return "DW_AT_visibility";
2987     case DW_AT_import:
2988       return "DW_AT_import";
2989     case DW_AT_string_length:
2990       return "DW_AT_string_length";
2991     case DW_AT_common_reference:
2992       return "DW_AT_common_reference";
2993     case DW_AT_comp_dir:
2994       return "DW_AT_comp_dir";
2995     case DW_AT_const_value:
2996       return "DW_AT_const_value";
2997     case DW_AT_containing_type:
2998       return "DW_AT_containing_type";
2999     case DW_AT_default_value:
3000       return "DW_AT_default_value";
3001     case DW_AT_inline:
3002       return "DW_AT_inline";
3003     case DW_AT_is_optional:
3004       return "DW_AT_is_optional";
3005     case DW_AT_lower_bound:
3006       return "DW_AT_lower_bound";
3007     case DW_AT_producer:
3008       return "DW_AT_producer";
3009     case DW_AT_prototyped:
3010       return "DW_AT_prototyped";
3011     case DW_AT_return_addr:
3012       return "DW_AT_return_addr";
3013     case DW_AT_start_scope:
3014       return "DW_AT_start_scope";
3015     case DW_AT_stride_size:
3016       return "DW_AT_stride_size";
3017     case DW_AT_upper_bound:
3018       return "DW_AT_upper_bound";
3019     case DW_AT_abstract_origin:
3020       return "DW_AT_abstract_origin";
3021     case DW_AT_accessibility:
3022       return "DW_AT_accessibility";
3023     case DW_AT_address_class:
3024       return "DW_AT_address_class";
3025     case DW_AT_artificial:
3026       return "DW_AT_artificial";
3027     case DW_AT_base_types:
3028       return "DW_AT_base_types";
3029     case DW_AT_calling_convention:
3030       return "DW_AT_calling_convention";
3031     case DW_AT_count:
3032       return "DW_AT_count";
3033     case DW_AT_data_member_location:
3034       return "DW_AT_data_member_location";
3035     case DW_AT_decl_column:
3036       return "DW_AT_decl_column";
3037     case DW_AT_decl_file:
3038       return "DW_AT_decl_file";
3039     case DW_AT_decl_line:
3040       return "DW_AT_decl_line";
3041     case DW_AT_declaration:
3042       return "DW_AT_declaration";
3043     case DW_AT_discr_list:
3044       return "DW_AT_discr_list";
3045     case DW_AT_encoding:
3046       return "DW_AT_encoding";
3047     case DW_AT_external:
3048       return "DW_AT_external";
3049     case DW_AT_frame_base:
3050       return "DW_AT_frame_base";
3051     case DW_AT_friend:
3052       return "DW_AT_friend";
3053     case DW_AT_identifier_case:
3054       return "DW_AT_identifier_case";
3055     case DW_AT_macro_info:
3056       return "DW_AT_macro_info";
3057     case DW_AT_namelist_items:
3058       return "DW_AT_namelist_items";
3059     case DW_AT_priority:
3060       return "DW_AT_priority";
3061     case DW_AT_segment:
3062       return "DW_AT_segment";
3063     case DW_AT_specification:
3064       return "DW_AT_specification";
3065     case DW_AT_static_link:
3066       return "DW_AT_static_link";
3067     case DW_AT_type:
3068       return "DW_AT_type";
3069     case DW_AT_use_location:
3070       return "DW_AT_use_location";
3071     case DW_AT_variable_parameter:
3072       return "DW_AT_variable_parameter";
3073     case DW_AT_virtuality:
3074       return "DW_AT_virtuality";
3075     case DW_AT_vtable_elem_location:
3076       return "DW_AT_vtable_elem_location";
3077
3078     case DW_AT_MIPS_fde:
3079       return "DW_AT_MIPS_fde";
3080     case DW_AT_MIPS_loop_begin:
3081       return "DW_AT_MIPS_loop_begin";
3082     case DW_AT_MIPS_tail_loop_begin:
3083       return "DW_AT_MIPS_tail_loop_begin";
3084     case DW_AT_MIPS_epilog_begin:
3085       return "DW_AT_MIPS_epilog_begin";
3086     case DW_AT_MIPS_loop_unroll_factor:
3087       return "DW_AT_MIPS_loop_unroll_factor";
3088     case DW_AT_MIPS_software_pipeline_depth:
3089       return "DW_AT_MIPS_software_pipeline_depth";
3090     case DW_AT_MIPS_linkage_name:
3091       return "DW_AT_MIPS_linkage_name";
3092     case DW_AT_MIPS_stride:
3093       return "DW_AT_MIPS_stride";
3094     case DW_AT_MIPS_abstract_name:
3095       return "DW_AT_MIPS_abstract_name";
3096     case DW_AT_MIPS_clone_origin:
3097       return "DW_AT_MIPS_clone_origin";
3098     case DW_AT_MIPS_has_inlines:
3099       return "DW_AT_MIPS_has_inlines";
3100
3101     case DW_AT_sf_names:
3102       return "DW_AT_sf_names";
3103     case DW_AT_src_info:
3104       return "DW_AT_src_info";
3105     case DW_AT_mac_info:
3106       return "DW_AT_mac_info";
3107     case DW_AT_src_coords:
3108       return "DW_AT_src_coords";
3109     case DW_AT_body_begin:
3110       return "DW_AT_body_begin";
3111     case DW_AT_body_end:
3112       return "DW_AT_body_end";
3113     default:
3114       return "DW_AT_<unknown>";
3115     }
3116 }
3117
3118 /* Convert a DWARF value form code into its string name.  */
3119
3120 static const char *
3121 dwarf_form_name (form)
3122      register unsigned form;
3123 {
3124   switch (form)
3125     {
3126     case DW_FORM_addr:
3127       return "DW_FORM_addr";
3128     case DW_FORM_block2:
3129       return "DW_FORM_block2";
3130     case DW_FORM_block4:
3131       return "DW_FORM_block4";
3132     case DW_FORM_data2:
3133       return "DW_FORM_data2";
3134     case DW_FORM_data4:
3135       return "DW_FORM_data4";
3136     case DW_FORM_data8:
3137       return "DW_FORM_data8";
3138     case DW_FORM_string:
3139       return "DW_FORM_string";
3140     case DW_FORM_block:
3141       return "DW_FORM_block";
3142     case DW_FORM_block1:
3143       return "DW_FORM_block1";
3144     case DW_FORM_data1:
3145       return "DW_FORM_data1";
3146     case DW_FORM_flag:
3147       return "DW_FORM_flag";
3148     case DW_FORM_sdata:
3149       return "DW_FORM_sdata";
3150     case DW_FORM_strp:
3151       return "DW_FORM_strp";
3152     case DW_FORM_udata:
3153       return "DW_FORM_udata";
3154     case DW_FORM_ref_addr:
3155       return "DW_FORM_ref_addr";
3156     case DW_FORM_ref1:
3157       return "DW_FORM_ref1";
3158     case DW_FORM_ref2:
3159       return "DW_FORM_ref2";
3160     case DW_FORM_ref4:
3161       return "DW_FORM_ref4";
3162     case DW_FORM_ref8:
3163       return "DW_FORM_ref8";
3164     case DW_FORM_ref_udata:
3165       return "DW_FORM_ref_udata";
3166     case DW_FORM_indirect:
3167       return "DW_FORM_indirect";
3168     default:
3169       return "DW_FORM_<unknown>";
3170     }
3171 }
3172
3173 /* Convert a DWARF stack opcode into its string name.  */
3174
3175 static const char *
3176 dwarf_stack_op_name (op)
3177      register unsigned op;
3178 {
3179   switch (op)
3180     {
3181     case DW_OP_addr:
3182       return "DW_OP_addr";
3183     case DW_OP_deref:
3184       return "DW_OP_deref";
3185     case DW_OP_const1u:
3186       return "DW_OP_const1u";
3187     case DW_OP_const1s:
3188       return "DW_OP_const1s";
3189     case DW_OP_const2u:
3190       return "DW_OP_const2u";
3191     case DW_OP_const2s:
3192       return "DW_OP_const2s";
3193     case DW_OP_const4u:
3194       return "DW_OP_const4u";
3195     case DW_OP_const4s:
3196       return "DW_OP_const4s";
3197     case DW_OP_const8u:
3198       return "DW_OP_const8u";
3199     case DW_OP_const8s:
3200       return "DW_OP_const8s";
3201     case DW_OP_constu:
3202       return "DW_OP_constu";
3203     case DW_OP_consts:
3204       return "DW_OP_consts";
3205     case DW_OP_dup:
3206       return "DW_OP_dup";
3207     case DW_OP_drop:
3208       return "DW_OP_drop";
3209     case DW_OP_over:
3210       return "DW_OP_over";
3211     case DW_OP_pick:
3212       return "DW_OP_pick";
3213     case DW_OP_swap:
3214       return "DW_OP_swap";
3215     case DW_OP_rot:
3216       return "DW_OP_rot";
3217     case DW_OP_xderef:
3218       return "DW_OP_xderef";
3219     case DW_OP_abs:
3220       return "DW_OP_abs";
3221     case DW_OP_and:
3222       return "DW_OP_and";
3223     case DW_OP_div:
3224       return "DW_OP_div";
3225     case DW_OP_minus:
3226       return "DW_OP_minus";
3227     case DW_OP_mod:
3228       return "DW_OP_mod";
3229     case DW_OP_mul:
3230       return "DW_OP_mul";
3231     case DW_OP_neg:
3232       return "DW_OP_neg";
3233     case DW_OP_not:
3234       return "DW_OP_not";
3235     case DW_OP_or:
3236       return "DW_OP_or";
3237     case DW_OP_plus:
3238       return "DW_OP_plus";
3239     case DW_OP_plus_uconst:
3240       return "DW_OP_plus_uconst";
3241     case DW_OP_shl:
3242       return "DW_OP_shl";
3243     case DW_OP_shr:
3244       return "DW_OP_shr";
3245     case DW_OP_shra:
3246       return "DW_OP_shra";
3247     case DW_OP_xor:
3248       return "DW_OP_xor";
3249     case DW_OP_bra:
3250       return "DW_OP_bra";
3251     case DW_OP_eq:
3252       return "DW_OP_eq";
3253     case DW_OP_ge:
3254       return "DW_OP_ge";
3255     case DW_OP_gt:
3256       return "DW_OP_gt";
3257     case DW_OP_le:
3258       return "DW_OP_le";
3259     case DW_OP_lt:
3260       return "DW_OP_lt";
3261     case DW_OP_ne:
3262       return "DW_OP_ne";
3263     case DW_OP_skip:
3264       return "DW_OP_skip";
3265     case DW_OP_lit0:
3266       return "DW_OP_lit0";
3267     case DW_OP_lit1:
3268       return "DW_OP_lit1";
3269     case DW_OP_lit2:
3270       return "DW_OP_lit2";
3271     case DW_OP_lit3:
3272       return "DW_OP_lit3";
3273     case DW_OP_lit4:
3274       return "DW_OP_lit4";
3275     case DW_OP_lit5:
3276       return "DW_OP_lit5";
3277     case DW_OP_lit6:
3278       return "DW_OP_lit6";
3279     case DW_OP_lit7:
3280       return "DW_OP_lit7";
3281     case DW_OP_lit8:
3282       return "DW_OP_lit8";
3283     case DW_OP_lit9:
3284       return "DW_OP_lit9";
3285     case DW_OP_lit10:
3286       return "DW_OP_lit10";
3287     case DW_OP_lit11:
3288       return "DW_OP_lit11";
3289     case DW_OP_lit12:
3290       return "DW_OP_lit12";
3291     case DW_OP_lit13:
3292       return "DW_OP_lit13";
3293     case DW_OP_lit14:
3294       return "DW_OP_lit14";
3295     case DW_OP_lit15:
3296       return "DW_OP_lit15";
3297     case DW_OP_lit16:
3298       return "DW_OP_lit16";
3299     case DW_OP_lit17:
3300       return "DW_OP_lit17";
3301     case DW_OP_lit18:
3302       return "DW_OP_lit18";
3303     case DW_OP_lit19:
3304       return "DW_OP_lit19";
3305     case DW_OP_lit20:
3306       return "DW_OP_lit20";
3307     case DW_OP_lit21:
3308       return "DW_OP_lit21";
3309     case DW_OP_lit22:
3310       return "DW_OP_lit22";
3311     case DW_OP_lit23:
3312       return "DW_OP_lit23";
3313     case DW_OP_lit24:
3314       return "DW_OP_lit24";
3315     case DW_OP_lit25:
3316       return "DW_OP_lit25";
3317     case DW_OP_lit26:
3318       return "DW_OP_lit26";
3319     case DW_OP_lit27:
3320       return "DW_OP_lit27";
3321     case DW_OP_lit28:
3322       return "DW_OP_lit28";
3323     case DW_OP_lit29:
3324       return "DW_OP_lit29";
3325     case DW_OP_lit30:
3326       return "DW_OP_lit30";
3327     case DW_OP_lit31:
3328       return "DW_OP_lit31";
3329     case DW_OP_reg0:
3330       return "DW_OP_reg0";
3331     case DW_OP_reg1:
3332       return "DW_OP_reg1";
3333     case DW_OP_reg2:
3334       return "DW_OP_reg2";
3335     case DW_OP_reg3:
3336       return "DW_OP_reg3";
3337     case DW_OP_reg4:
3338       return "DW_OP_reg4";
3339     case DW_OP_reg5:
3340       return "DW_OP_reg5";
3341     case DW_OP_reg6:
3342       return "DW_OP_reg6";
3343     case DW_OP_reg7:
3344       return "DW_OP_reg7";
3345     case DW_OP_reg8:
3346       return "DW_OP_reg8";
3347     case DW_OP_reg9:
3348       return "DW_OP_reg9";
3349     case DW_OP_reg10:
3350       return "DW_OP_reg10";
3351     case DW_OP_reg11:
3352       return "DW_OP_reg11";
3353     case DW_OP_reg12:
3354       return "DW_OP_reg12";
3355     case DW_OP_reg13:
3356       return "DW_OP_reg13";
3357     case DW_OP_reg14:
3358       return "DW_OP_reg14";
3359     case DW_OP_reg15:
3360       return "DW_OP_reg15";
3361     case DW_OP_reg16:
3362       return "DW_OP_reg16";
3363     case DW_OP_reg17:
3364       return "DW_OP_reg17";
3365     case DW_OP_reg18:
3366       return "DW_OP_reg18";
3367     case DW_OP_reg19:
3368       return "DW_OP_reg19";
3369     case DW_OP_reg20:
3370       return "DW_OP_reg20";
3371     case DW_OP_reg21:
3372       return "DW_OP_reg21";
3373     case DW_OP_reg22:
3374       return "DW_OP_reg22";
3375     case DW_OP_reg23:
3376       return "DW_OP_reg23";
3377     case DW_OP_reg24:
3378       return "DW_OP_reg24";
3379     case DW_OP_reg25:
3380       return "DW_OP_reg25";
3381     case DW_OP_reg26:
3382       return "DW_OP_reg26";
3383     case DW_OP_reg27:
3384       return "DW_OP_reg27";
3385     case DW_OP_reg28:
3386       return "DW_OP_reg28";
3387     case DW_OP_reg29:
3388       return "DW_OP_reg29";
3389     case DW_OP_reg30:
3390       return "DW_OP_reg30";
3391     case DW_OP_reg31:
3392       return "DW_OP_reg31";
3393     case DW_OP_breg0:
3394       return "DW_OP_breg0";
3395     case DW_OP_breg1:
3396       return "DW_OP_breg1";
3397     case DW_OP_breg2:
3398       return "DW_OP_breg2";
3399     case DW_OP_breg3:
3400       return "DW_OP_breg3";
3401     case DW_OP_breg4:
3402       return "DW_OP_breg4";
3403     case DW_OP_breg5:
3404       return "DW_OP_breg5";
3405     case DW_OP_breg6:
3406       return "DW_OP_breg6";
3407     case DW_OP_breg7:
3408       return "DW_OP_breg7";
3409     case DW_OP_breg8:
3410       return "DW_OP_breg8";
3411     case DW_OP_breg9:
3412       return "DW_OP_breg9";
3413     case DW_OP_breg10:
3414       return "DW_OP_breg10";
3415     case DW_OP_breg11:
3416       return "DW_OP_breg11";
3417     case DW_OP_breg12:
3418       return "DW_OP_breg12";
3419     case DW_OP_breg13:
3420       return "DW_OP_breg13";
3421     case DW_OP_breg14:
3422       return "DW_OP_breg14";
3423     case DW_OP_breg15:
3424       return "DW_OP_breg15";
3425     case DW_OP_breg16:
3426       return "DW_OP_breg16";
3427     case DW_OP_breg17:
3428       return "DW_OP_breg17";
3429     case DW_OP_breg18:
3430       return "DW_OP_breg18";
3431     case DW_OP_breg19:
3432       return "DW_OP_breg19";
3433     case DW_OP_breg20:
3434       return "DW_OP_breg20";
3435     case DW_OP_breg21:
3436       return "DW_OP_breg21";
3437     case DW_OP_breg22:
3438       return "DW_OP_breg22";
3439     case DW_OP_breg23:
3440       return "DW_OP_breg23";
3441     case DW_OP_breg24:
3442       return "DW_OP_breg24";
3443     case DW_OP_breg25:
3444       return "DW_OP_breg25";
3445     case DW_OP_breg26:
3446       return "DW_OP_breg26";
3447     case DW_OP_breg27:
3448       return "DW_OP_breg27";
3449     case DW_OP_breg28:
3450       return "DW_OP_breg28";
3451     case DW_OP_breg29:
3452       return "DW_OP_breg29";
3453     case DW_OP_breg30:
3454       return "DW_OP_breg30";
3455     case DW_OP_breg31:
3456       return "DW_OP_breg31";
3457     case DW_OP_regx:
3458       return "DW_OP_regx";
3459     case DW_OP_fbreg:
3460       return "DW_OP_fbreg";
3461     case DW_OP_bregx:
3462       return "DW_OP_bregx";
3463     case DW_OP_piece:
3464       return "DW_OP_piece";
3465     case DW_OP_deref_size:
3466       return "DW_OP_deref_size";
3467     case DW_OP_xderef_size:
3468       return "DW_OP_xderef_size";
3469     case DW_OP_nop:
3470       return "DW_OP_nop";
3471     default:
3472       return "OP_<unknown>";
3473     }
3474 }
3475
3476 /* Convert a DWARF type code into its string name.  */
3477
3478 #if 0
3479 static const char *
3480 dwarf_type_encoding_name (enc)
3481      register unsigned enc;
3482 {
3483   switch (enc)
3484     {
3485     case DW_ATE_address:
3486       return "DW_ATE_address";
3487     case DW_ATE_boolean:
3488       return "DW_ATE_boolean";
3489     case DW_ATE_complex_float:
3490       return "DW_ATE_complex_float";
3491     case DW_ATE_float:
3492       return "DW_ATE_float";
3493     case DW_ATE_signed:
3494       return "DW_ATE_signed";
3495     case DW_ATE_signed_char:
3496       return "DW_ATE_signed_char";
3497     case DW_ATE_unsigned:
3498       return "DW_ATE_unsigned";
3499     case DW_ATE_unsigned_char:
3500       return "DW_ATE_unsigned_char";
3501     default:
3502       return "DW_ATE_<unknown>";
3503     }
3504 }
3505 #endif
3506 \f
3507 /* Determine the "ultimate origin" of a decl.  The decl may be an inlined
3508    instance of an inlined instance of a decl which is local to an inline
3509    function, so we have to trace all of the way back through the origin chain
3510    to find out what sort of node actually served as the original seed for the
3511    given block.  */
3512
3513 static tree
3514 decl_ultimate_origin (decl)
3515      register tree decl;
3516 {
3517   /* output_inline_function sets DECL_ABSTRACT_ORIGIN for all the
3518      nodes in the function to point to themselves; ignore that if
3519      we're trying to output the abstract instance of this function.  */
3520   if (DECL_ABSTRACT (decl) && DECL_ABSTRACT_ORIGIN (decl) == decl)
3521     return NULL_TREE;
3522
3523 #ifdef ENABLE_CHECKING 
3524   if (DECL_FROM_INLINE (DECL_ORIGIN (decl)))
3525     /* Since the DECL_ABSTRACT_ORIGIN for a DECL is supposed to be the
3526        most distant ancestor, this should never happen.  */
3527     abort ();
3528 #endif
3529
3530   return DECL_ABSTRACT_ORIGIN (decl);
3531 }
3532
3533 /* Determine the "ultimate origin" of a block.  The block may be an inlined
3534    instance of an inlined instance of a block which is local to an inline
3535    function, so we have to trace all of the way back through the origin chain
3536    to find out what sort of node actually served as the original seed for the
3537    given block.  */
3538
3539 static tree
3540 block_ultimate_origin (block)
3541      register tree block;
3542 {
3543   register tree immediate_origin = BLOCK_ABSTRACT_ORIGIN (block);
3544
3545   /* output_inline_function sets BLOCK_ABSTRACT_ORIGIN for all the
3546      nodes in the function to point to themselves; ignore that if
3547      we're trying to output the abstract instance of this function.  */
3548   if (BLOCK_ABSTRACT (block) && immediate_origin == block)
3549     return NULL_TREE;
3550
3551   if (immediate_origin == NULL_TREE)
3552     return NULL_TREE;
3553   else
3554     {
3555       register tree ret_val;
3556       register tree lookahead = immediate_origin;
3557
3558       do
3559         {
3560           ret_val = lookahead;
3561           lookahead = (TREE_CODE (ret_val) == BLOCK)
3562             ? BLOCK_ABSTRACT_ORIGIN (ret_val)
3563             : NULL;
3564         }
3565       while (lookahead != NULL && lookahead != ret_val);
3566
3567       return ret_val;
3568     }
3569 }
3570
3571 /* Get the class to which DECL belongs, if any.  In g++, the DECL_CONTEXT
3572    of a virtual function may refer to a base class, so we check the 'this'
3573    parameter.  */
3574
3575 static tree
3576 decl_class_context (decl)
3577      tree decl;
3578 {
3579   tree context = NULL_TREE;
3580
3581   if (TREE_CODE (decl) != FUNCTION_DECL || ! DECL_VINDEX (decl))
3582     context = DECL_CONTEXT (decl);
3583   else
3584     context = TYPE_MAIN_VARIANT
3585       (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (decl)))));
3586
3587   if (context && TREE_CODE_CLASS (TREE_CODE (context)) != 't')
3588     context = NULL_TREE;
3589
3590   return context;
3591 }
3592 \f
3593 /* Add an attribute/value pair to a DIE.  We build the lists up in reverse
3594    addition order, and correct that in add_sibling_attributes.  */
3595
3596 static inline void
3597 add_dwarf_attr (die, attr)
3598      register dw_die_ref die;
3599      register dw_attr_ref attr;
3600 {
3601   if (die != NULL && attr != NULL)
3602     {
3603       attr->dw_attr_next = die->die_attr;
3604       die->die_attr = attr;
3605     }
3606 }
3607
3608 static inline dw_val_class
3609 AT_class (a)
3610      dw_attr_ref a;
3611 {
3612   return a->dw_attr_val.val_class;
3613 }
3614
3615 /* Add a flag value attribute to a DIE.  */
3616
3617 static inline void
3618 add_AT_flag (die, attr_kind, flag)
3619      register dw_die_ref die;
3620      register enum dwarf_attribute attr_kind;
3621      register unsigned flag;
3622 {
3623   register dw_attr_ref attr = (dw_attr_ref) xmalloc (sizeof (dw_attr_node));
3624
3625   attr->dw_attr_next = NULL;
3626   attr->dw_attr = attr_kind;
3627   attr->dw_attr_val.val_class = dw_val_class_flag;
3628   attr->dw_attr_val.v.val_flag = flag;
3629   add_dwarf_attr (die, attr);
3630 }
3631
3632 static inline unsigned
3633 AT_flag (a)
3634      register dw_attr_ref a;
3635 {
3636   if (a && AT_class (a) == dw_val_class_flag)
3637     return a->dw_attr_val.v.val_flag;
3638
3639   return 0;
3640 }
3641
3642 /* Add a signed integer attribute value to a DIE.  */
3643
3644 static inline void
3645 add_AT_int (die, attr_kind, int_val)
3646      register dw_die_ref die;
3647      register enum dwarf_attribute attr_kind;
3648      register long int int_val;
3649 {
3650   register dw_attr_ref attr = (dw_attr_ref) xmalloc (sizeof (dw_attr_node));
3651
3652   attr->dw_attr_next = NULL;
3653   attr->dw_attr = attr_kind;
3654   attr->dw_attr_val.val_class = dw_val_class_const;
3655   attr->dw_attr_val.v.val_int = int_val;
3656   add_dwarf_attr (die, attr);
3657 }
3658
3659 static inline long int
3660 AT_int (a)
3661      register dw_attr_ref a;
3662 {
3663   if (a && AT_class (a) == dw_val_class_const)
3664     return a->dw_attr_val.v.val_int;
3665
3666   return 0;
3667 }
3668
3669 /* Add an unsigned integer attribute value to a DIE.  */
3670
3671 static inline void
3672 add_AT_unsigned (die, attr_kind, unsigned_val)
3673      register dw_die_ref die;
3674      register enum dwarf_attribute attr_kind;
3675      register unsigned long unsigned_val;
3676 {
3677   register dw_attr_ref attr = (dw_attr_ref) xmalloc (sizeof (dw_attr_node));
3678
3679   attr->dw_attr_next = NULL;
3680   attr->dw_attr = attr_kind;
3681   attr->dw_attr_val.val_class = dw_val_class_unsigned_const;
3682   attr->dw_attr_val.v.val_unsigned = unsigned_val;
3683   add_dwarf_attr (die, attr);
3684 }
3685
3686 static inline unsigned long
3687 AT_unsigned (a)
3688      register dw_attr_ref a;
3689 {
3690   if (a && AT_class (a) == dw_val_class_unsigned_const)
3691     return a->dw_attr_val.v.val_unsigned;
3692
3693   return 0;
3694 }
3695
3696 /* Add an unsigned double integer attribute value to a DIE.  */
3697
3698 static inline void
3699 add_AT_long_long (die, attr_kind, val_hi, val_low)
3700      register dw_die_ref die;
3701      register enum dwarf_attribute attr_kind;
3702      register unsigned long val_hi;
3703      register unsigned long val_low;
3704 {
3705   register dw_attr_ref attr = (dw_attr_ref) xmalloc (sizeof (dw_attr_node));
3706
3707   attr->dw_attr_next = NULL;
3708   attr->dw_attr = attr_kind;
3709   attr->dw_attr_val.val_class = dw_val_class_long_long;
3710   attr->dw_attr_val.v.val_long_long.hi = val_hi;
3711   attr->dw_attr_val.v.val_long_long.low = val_low;
3712   add_dwarf_attr (die, attr);
3713 }
3714
3715 /* Add a floating point attribute value to a DIE and return it.  */
3716
3717 static inline void
3718 add_AT_float (die, attr_kind, length, array)
3719      register dw_die_ref die;
3720      register enum dwarf_attribute attr_kind;
3721      register unsigned length;
3722      register long *array;
3723 {
3724   register dw_attr_ref attr = (dw_attr_ref) xmalloc (sizeof (dw_attr_node));
3725
3726   attr->dw_attr_next = NULL;
3727   attr->dw_attr = attr_kind;
3728   attr->dw_attr_val.val_class = dw_val_class_float;
3729   attr->dw_attr_val.v.val_float.length = length;
3730   attr->dw_attr_val.v.val_float.array = array;
3731   add_dwarf_attr (die, attr);
3732 }
3733
3734 /* Add a string attribute value to a DIE.  */
3735
3736 static inline void
3737 add_AT_string (die, attr_kind, str)
3738      register dw_die_ref die;
3739      register enum dwarf_attribute attr_kind;
3740      register const char *str;
3741 {
3742   register dw_attr_ref attr = (dw_attr_ref) xmalloc (sizeof (dw_attr_node));
3743
3744   attr->dw_attr_next = NULL;
3745   attr->dw_attr = attr_kind;
3746   attr->dw_attr_val.val_class = dw_val_class_str;
3747   attr->dw_attr_val.v.val_str = xstrdup (str);
3748   add_dwarf_attr (die, attr);
3749 }
3750
3751 static inline const char *
3752 AT_string (a)
3753      register dw_attr_ref a;
3754 {
3755   if (a && AT_class (a) == dw_val_class_str)
3756     return a->dw_attr_val.v.val_str;
3757
3758   return NULL;
3759 }
3760
3761 /* Add a DIE reference attribute value to a DIE.  */
3762
3763 static inline void
3764 add_AT_die_ref (die, attr_kind, targ_die)
3765      register dw_die_ref die;
3766      register enum dwarf_attribute attr_kind;
3767      register dw_die_ref targ_die;
3768 {
3769   register dw_attr_ref attr = (dw_attr_ref) xmalloc (sizeof (dw_attr_node));
3770
3771   attr->dw_attr_next = NULL;
3772   attr->dw_attr = attr_kind;
3773   attr->dw_attr_val.val_class = dw_val_class_die_ref;
3774   attr->dw_attr_val.v.val_die_ref = targ_die;
3775   add_dwarf_attr (die, attr);
3776 }
3777
3778 static inline dw_die_ref
3779 AT_ref (a)
3780      register dw_attr_ref a;
3781 {
3782   if (a && AT_class (a) == dw_val_class_die_ref)
3783     return a->dw_attr_val.v.val_die_ref;
3784
3785   return NULL;
3786 }
3787
3788 /* Add an FDE reference attribute value to a DIE.  */
3789
3790 static inline void
3791 add_AT_fde_ref (die, attr_kind, targ_fde)
3792      register dw_die_ref die;
3793      register enum dwarf_attribute attr_kind;
3794      register unsigned targ_fde;
3795 {
3796   register dw_attr_ref attr = (dw_attr_ref) xmalloc (sizeof (dw_attr_node));
3797
3798   attr->dw_attr_next = NULL;
3799   attr->dw_attr = attr_kind;
3800   attr->dw_attr_val.val_class = dw_val_class_fde_ref;
3801   attr->dw_attr_val.v.val_fde_index = targ_fde;
3802   add_dwarf_attr (die, attr);
3803 }
3804
3805 /* Add a location description attribute value to a DIE.  */
3806
3807 static inline void
3808 add_AT_loc (die, attr_kind, loc)
3809      register dw_die_ref die;
3810      register enum dwarf_attribute attr_kind;
3811      register dw_loc_descr_ref loc;
3812 {
3813   register dw_attr_ref attr = (dw_attr_ref) xmalloc (sizeof (dw_attr_node));
3814
3815   attr->dw_attr_next = NULL;
3816   attr->dw_attr = attr_kind;
3817   attr->dw_attr_val.val_class = dw_val_class_loc;
3818   attr->dw_attr_val.v.val_loc = loc;
3819   add_dwarf_attr (die, attr);
3820 }
3821
3822 static inline dw_loc_descr_ref
3823 AT_loc (a)
3824      register dw_attr_ref a;
3825 {
3826   if (a && AT_class (a) == dw_val_class_loc)
3827     return a->dw_attr_val.v.val_loc;
3828
3829   return NULL;
3830 }
3831
3832 /* Add an address constant attribute value to a DIE.  */
3833
3834 static inline void
3835 add_AT_addr (die, attr_kind, addr)
3836      register dw_die_ref die;
3837      register enum dwarf_attribute attr_kind;
3838      char *addr;
3839 {
3840   register dw_attr_ref attr = (dw_attr_ref) xmalloc (sizeof (dw_attr_node));
3841
3842   attr->dw_attr_next = NULL;
3843   attr->dw_attr = attr_kind;
3844   attr->dw_attr_val.val_class = dw_val_class_addr;
3845   attr->dw_attr_val.v.val_addr = addr;
3846   add_dwarf_attr (die, attr);
3847 }
3848
3849 static inline const char *
3850 AT_addr (a)
3851      register dw_attr_ref a;
3852 {
3853   if (a && AT_class (a) == dw_val_class_addr)
3854     return a->dw_attr_val.v.val_addr;
3855
3856   return NULL;
3857 }
3858
3859 /* Add a label identifier attribute value to a DIE.  */
3860
3861 static inline void
3862 add_AT_lbl_id (die, attr_kind, lbl_id)
3863      register dw_die_ref die;
3864      register enum dwarf_attribute attr_kind;
3865      register char *lbl_id;
3866 {
3867   register dw_attr_ref attr = (dw_attr_ref) xmalloc (sizeof (dw_attr_node));
3868
3869   attr->dw_attr_next = NULL;
3870   attr->dw_attr = attr_kind;
3871   attr->dw_attr_val.val_class = dw_val_class_lbl_id;
3872   attr->dw_attr_val.v.val_lbl_id = xstrdup (lbl_id);
3873   add_dwarf_attr (die, attr);
3874 }
3875
3876 /* Add a section offset attribute value to a DIE.  */
3877
3878 static inline void
3879 add_AT_lbl_offset (die, attr_kind, label)
3880      register dw_die_ref die;
3881      register enum dwarf_attribute attr_kind;
3882      register char *label;
3883 {
3884   register dw_attr_ref attr = (dw_attr_ref) xmalloc (sizeof (dw_attr_node));
3885
3886   attr->dw_attr_next = NULL;
3887   attr->dw_attr = attr_kind;
3888   attr->dw_attr_val.val_class = dw_val_class_lbl_offset;
3889   attr->dw_attr_val.v.val_lbl_id = xstrdup (label);
3890   add_dwarf_attr (die, attr);
3891   
3892 }
3893
3894 static inline const char *
3895 AT_lbl (a)
3896      register dw_attr_ref a;
3897 {
3898   if (a && (AT_class (a) == dw_val_class_lbl_id
3899             || AT_class (a) == dw_val_class_lbl_offset))
3900     return a->dw_attr_val.v.val_lbl_id;
3901
3902   return NULL;
3903 }
3904
3905 /* Get the attribute of type attr_kind.  */
3906
3907 static inline dw_attr_ref
3908 get_AT (die, attr_kind)
3909      register dw_die_ref die;
3910      register enum dwarf_attribute attr_kind;
3911 {
3912   register dw_attr_ref a;
3913   register dw_die_ref spec = NULL;
3914   
3915   if (die != NULL)
3916     {
3917       for (a = die->die_attr; a != NULL; a = a->dw_attr_next)
3918         {
3919           if (a->dw_attr == attr_kind)
3920             return a;
3921
3922           if (a->dw_attr == DW_AT_specification
3923               || a->dw_attr == DW_AT_abstract_origin)
3924             spec = AT_ref (a);
3925         }
3926
3927       if (spec)
3928         return get_AT (spec, attr_kind);
3929     }
3930
3931   return NULL;
3932 }
3933
3934 /* Return the "low pc" attribute value, typically associated with
3935    a subprogram DIE.  Return null if the "low pc" attribute is
3936    either not prsent, or if it cannot be represented as an
3937    assembler label identifier.  */
3938
3939 static inline const char *
3940 get_AT_low_pc (die)
3941      register dw_die_ref die;
3942 {
3943   register dw_attr_ref a = get_AT (die, DW_AT_low_pc);
3944   return AT_lbl (a);
3945 }
3946
3947 /* Return the "high pc" attribute value, typically associated with
3948    a subprogram DIE.  Return null if the "high pc" attribute is
3949    either not prsent, or if it cannot be represented as an
3950    assembler label identifier.  */
3951
3952 static inline const char *
3953 get_AT_hi_pc (die)
3954      register dw_die_ref die;
3955 {
3956   register dw_attr_ref a = get_AT (die, DW_AT_high_pc);
3957   return AT_lbl (a);
3958 }
3959
3960 /* Return the value of the string attribute designated by ATTR_KIND, or
3961    NULL if it is not present.  */
3962
3963 static inline const char *
3964 get_AT_string (die, attr_kind)
3965      register dw_die_ref die;
3966      register enum dwarf_attribute attr_kind;
3967 {
3968   register dw_attr_ref a = get_AT (die, attr_kind);
3969   return AT_string (a);
3970 }
3971
3972 /* Return the value of the flag attribute designated by ATTR_KIND, or -1
3973    if it is not present.  */
3974
3975 static inline int
3976 get_AT_flag (die, attr_kind)
3977      register dw_die_ref die;
3978      register enum dwarf_attribute attr_kind;
3979 {
3980   register dw_attr_ref a = get_AT (die, attr_kind);
3981   return AT_flag (a);
3982 }
3983
3984 /* Return the value of the unsigned attribute designated by ATTR_KIND, or 0
3985    if it is not present.  */
3986
3987 static inline unsigned
3988 get_AT_unsigned (die, attr_kind)
3989      register dw_die_ref die;
3990      register enum dwarf_attribute attr_kind;
3991 {
3992   register dw_attr_ref a = get_AT (die, attr_kind);
3993   return AT_unsigned (a);
3994 }
3995
3996 static inline dw_die_ref
3997 get_AT_ref (die, attr_kind)
3998      dw_die_ref die;
3999      register enum dwarf_attribute attr_kind;
4000 {
4001   register dw_attr_ref a = get_AT (die, attr_kind);
4002   return AT_ref (a);
4003 }
4004
4005 static inline int
4006 is_c_family ()
4007 {
4008   register unsigned lang = get_AT_unsigned (comp_unit_die, DW_AT_language);
4009
4010   return (lang == DW_LANG_C || lang == DW_LANG_C89
4011           || lang == DW_LANG_C_plus_plus);
4012
4013
4014 static inline int
4015 is_fortran ()
4016 {
4017   register unsigned lang = get_AT_unsigned (comp_unit_die, DW_AT_language);
4018
4019   return (lang == DW_LANG_Fortran77 || lang == DW_LANG_Fortran90);
4020
4021
4022 /* Free up the memory used by A.  */
4023
4024 static inline void
4025 free_AT (a)
4026      dw_attr_ref a;
4027 {
4028   switch (AT_class (a))
4029     {
4030     case dw_val_class_addr:
4031     case dw_val_class_str:
4032     case dw_val_class_lbl_id:
4033     case dw_val_class_lbl_offset:
4034       free (a->dw_attr_val.v.val_str);
4035       break;
4036
4037     default:
4038       break;
4039     }
4040
4041   free (a);
4042 }  
4043
4044 /* Remove the specified attribute if present.  */
4045
4046 static void
4047 remove_AT (die, attr_kind)
4048      register dw_die_ref die;
4049      register enum dwarf_attribute attr_kind;
4050 {
4051   register dw_attr_ref *p;
4052   register dw_attr_ref removed = NULL;
4053
4054   if (die != NULL)
4055     {
4056       for (p = &(die->die_attr); *p; p = &((*p)->dw_attr_next))
4057         if ((*p)->dw_attr == attr_kind)
4058           {
4059             removed = *p;
4060             *p = (*p)->dw_attr_next;
4061             break;
4062           }
4063
4064       if (removed != 0)
4065         free_AT (removed);
4066     }
4067 }
4068
4069 /* Free up the memory used by DIE.  */
4070
4071 static inline void
4072 free_die (die)
4073      dw_die_ref die;
4074 {
4075   remove_children (die);
4076   free (die);
4077 }
4078
4079 /* Discard the children of this DIE.  */
4080
4081 static void
4082 remove_children (die)
4083      register dw_die_ref die;
4084 {
4085   register dw_die_ref child_die = die->die_child;
4086
4087   die->die_child = NULL;
4088
4089   while (child_die != NULL)
4090     {
4091       register dw_die_ref tmp_die = child_die;
4092       register dw_attr_ref a;
4093
4094       child_die = child_die->die_sib;
4095       
4096       for (a = tmp_die->die_attr; a != NULL; )
4097         {
4098           register dw_attr_ref tmp_a = a;
4099
4100           a = a->dw_attr_next;
4101           free_AT (tmp_a);
4102         }
4103
4104       free_die (tmp_die);
4105     }
4106 }
4107
4108 /* Add a child DIE below its parent.  We build the lists up in reverse
4109    addition order, and correct that in add_sibling_attributes.  */
4110
4111 static inline void
4112 add_child_die (die, child_die)
4113      register dw_die_ref die;
4114      register dw_die_ref child_die;
4115 {
4116   if (die != NULL && child_die != NULL)
4117     {
4118       if (die == child_die)
4119         abort ();
4120       child_die->die_parent = die;
4121       child_die->die_sib = die->die_child;
4122       die->die_child = child_die;
4123     }
4124 }
4125
4126 /* Move CHILD, which must be a child of PARENT or the DIE for which PARENT
4127    is the specification, to the front of PARENT's list of children.  */
4128
4129 static void
4130 splice_child_die (parent, child)
4131      dw_die_ref parent, child;
4132 {
4133   dw_die_ref *p;
4134
4135   /* We want the declaration DIE from inside the class, not the
4136      specification DIE at toplevel.  */
4137   if (child->die_parent != parent)
4138     {
4139       dw_die_ref tmp = get_AT_ref (child, DW_AT_specification);
4140       if (tmp)
4141         child = tmp;
4142     }
4143
4144   if (child->die_parent != parent
4145       && child->die_parent != get_AT_ref (parent, DW_AT_specification))
4146     abort ();
4147
4148   for (p = &(parent->die_child); *p; p = &((*p)->die_sib))
4149     if (*p == child)
4150       {
4151         *p = child->die_sib;
4152         break;
4153       }
4154
4155   child->die_sib = parent->die_child;
4156   parent->die_child = child;
4157 }
4158
4159 /* Return a pointer to a newly created DIE node.  */
4160
4161 static inline dw_die_ref
4162 new_die (tag_value, parent_die)
4163      register enum dwarf_tag tag_value;
4164      register dw_die_ref parent_die;
4165 {
4166   register dw_die_ref die = (dw_die_ref) xmalloc (sizeof (die_node));
4167
4168   die->die_tag = tag_value;
4169   die->die_abbrev = 0;
4170   die->die_offset = 0;
4171   die->die_child = NULL;
4172   die->die_parent = NULL;
4173   die->die_sib = NULL;
4174   die->die_attr = NULL;
4175
4176   if (parent_die != NULL)
4177     add_child_die (parent_die, die);
4178   else
4179     {
4180       limbo_die_node *limbo_node;
4181
4182       limbo_node = (limbo_die_node *) xmalloc (sizeof (limbo_die_node));
4183       limbo_node->die = die;
4184       limbo_node->next = limbo_die_list;
4185       limbo_die_list = limbo_node;
4186     }
4187
4188   return die;
4189 }
4190
4191 /* Return the DIE associated with the given type specifier.  */
4192
4193 static inline dw_die_ref
4194 lookup_type_die (type)
4195      register tree type;
4196 {
4197   return (dw_die_ref) TYPE_SYMTAB_POINTER (type);
4198 }
4199
4200 /* Equate a DIE to a given type specifier.  */
4201
4202 static inline void
4203 equate_type_number_to_die (type, type_die)
4204      register tree type;
4205      register dw_die_ref type_die;
4206 {
4207   TYPE_SYMTAB_POINTER (type) = (char *) type_die;
4208 }
4209
4210 /* Return the DIE associated with a given declaration.  */
4211
4212 static inline dw_die_ref
4213 lookup_decl_die (decl)
4214      register tree decl;
4215 {
4216   register unsigned decl_id = DECL_UID (decl);
4217
4218   return (decl_id < decl_die_table_in_use
4219           ? decl_die_table[decl_id] : NULL);
4220 }
4221
4222 /* Equate a DIE to a particular declaration.  */
4223
4224 static void
4225 equate_decl_number_to_die (decl, decl_die)
4226      register tree decl;
4227      register dw_die_ref decl_die;
4228 {
4229   register unsigned decl_id = DECL_UID (decl);
4230   register unsigned num_allocated;
4231
4232   if (decl_id >= decl_die_table_allocated)
4233     {
4234       num_allocated
4235         = ((decl_id + 1 + DECL_DIE_TABLE_INCREMENT - 1)
4236            / DECL_DIE_TABLE_INCREMENT)
4237           * DECL_DIE_TABLE_INCREMENT;
4238
4239       decl_die_table
4240         = (dw_die_ref *) xrealloc (decl_die_table,
4241                                    sizeof (dw_die_ref) * num_allocated);
4242
4243       bzero ((char *) &decl_die_table[decl_die_table_allocated],
4244              (num_allocated - decl_die_table_allocated) * sizeof (dw_die_ref));
4245       decl_die_table_allocated = num_allocated;
4246     }
4247
4248   if (decl_id >= decl_die_table_in_use)
4249     decl_die_table_in_use = (decl_id + 1);
4250
4251   decl_die_table[decl_id] = decl_die;
4252 }
4253
4254 /* Return a pointer to a newly allocated location description.  Location
4255    descriptions are simple expression terms that can be strung
4256    together to form more complicated location (address) descriptions.  */
4257
4258 static inline dw_loc_descr_ref
4259 new_loc_descr (op, oprnd1, oprnd2)
4260      register enum dwarf_location_atom op;
4261      register unsigned long oprnd1;
4262      register unsigned long oprnd2;
4263 {
4264   register dw_loc_descr_ref descr
4265     = (dw_loc_descr_ref) xmalloc (sizeof (dw_loc_descr_node));
4266
4267   descr->dw_loc_next = NULL;
4268   descr->dw_loc_opc = op;
4269   descr->dw_loc_oprnd1.val_class = dw_val_class_unsigned_const;
4270   descr->dw_loc_oprnd1.v.val_unsigned = oprnd1;
4271   descr->dw_loc_oprnd2.val_class = dw_val_class_unsigned_const;
4272   descr->dw_loc_oprnd2.v.val_unsigned = oprnd2;
4273
4274   return descr;
4275 }
4276
4277 /* Add a location description term to a location description expression.  */
4278
4279 static inline void
4280 add_loc_descr (list_head, descr)
4281      register dw_loc_descr_ref *list_head;
4282      register dw_loc_descr_ref descr;
4283 {
4284   register dw_loc_descr_ref *d;
4285
4286   /* Find the end of the chain.  */
4287   for (d = list_head; (*d) != NULL; d = &(*d)->dw_loc_next)
4288     ;
4289
4290   *d = descr;
4291 }
4292 \f
4293 /* Keep track of the number of spaces used to indent the
4294    output of the debugging routines that print the structure of
4295    the DIE internal representation.  */
4296 static int print_indent;
4297
4298 /* Indent the line the number of spaces given by print_indent.  */
4299
4300 static inline void
4301 print_spaces (outfile)
4302      FILE *outfile;
4303 {
4304   fprintf (outfile, "%*s", print_indent, "");
4305 }
4306
4307 /* Print the information associated with a given DIE, and its children.
4308    This routine is a debugging aid only.  */
4309
4310 static void
4311 print_die (die, outfile)
4312      dw_die_ref die;
4313      FILE *outfile;
4314 {
4315   register dw_attr_ref a;
4316   register dw_die_ref c;
4317
4318   print_spaces (outfile);
4319   fprintf (outfile, "DIE %4lu: %s\n",
4320            die->die_offset, dwarf_tag_name (die->die_tag));
4321   print_spaces (outfile);
4322   fprintf (outfile, "  abbrev id: %lu", die->die_abbrev);
4323   fprintf (outfile, " offset: %lu\n", die->die_offset);
4324
4325   for (a = die->die_attr; a != NULL; a = a->dw_attr_next)
4326     {
4327       print_spaces (outfile);
4328       fprintf (outfile, "  %s: ", dwarf_attr_name (a->dw_attr));
4329
4330       switch (AT_class (a))
4331         {
4332         case dw_val_class_addr:
4333           fprintf (outfile, "address");
4334           break;
4335         case dw_val_class_loc:
4336           fprintf (outfile, "location descriptor");
4337           break;
4338         case dw_val_class_const:
4339           fprintf (outfile, "%ld", AT_int (a));
4340           break;
4341         case dw_val_class_unsigned_const:
4342           fprintf (outfile, "%lu", AT_unsigned (a));
4343           break;
4344         case dw_val_class_long_long:
4345           fprintf (outfile, "constant (%lu,%lu)",
4346                   a->dw_attr_val.v.val_long_long.hi,
4347                   a->dw_attr_val.v.val_long_long.low);
4348           break;
4349         case dw_val_class_float:
4350           fprintf (outfile, "floating-point constant");
4351           break;
4352         case dw_val_class_flag:
4353           fprintf (outfile, "%u", AT_flag (a));
4354           break;
4355         case dw_val_class_die_ref:
4356           if (AT_ref (a) != NULL)
4357             fprintf (outfile, "die -> %lu", AT_ref (a)->die_offset);
4358           else
4359             fprintf (outfile, "die -> <null>");
4360           break;
4361         case dw_val_class_lbl_id:
4362         case dw_val_class_lbl_offset:
4363           fprintf (outfile, "label: %s", AT_lbl (a));
4364           break;
4365         case dw_val_class_str:
4366           if (AT_string (a) != NULL)
4367             fprintf (outfile, "\"%s\"", AT_string (a));
4368           else
4369             fprintf (outfile, "<null>");
4370           break;
4371         default:
4372           break;
4373         }
4374
4375       fprintf (outfile, "\n");
4376     }
4377
4378   if (die->die_child != NULL)
4379     {
4380       print_indent += 4;
4381       for (c = die->die_child; c != NULL; c = c->die_sib)
4382         print_die (c, outfile);
4383
4384       print_indent -= 4;
4385     }
4386 }
4387
4388 /* Print the contents of the source code line number correspondence table.
4389    This routine is a debugging aid only.  */
4390
4391 static void
4392 print_dwarf_line_table (outfile)
4393      FILE *outfile;
4394 {
4395   register unsigned i;
4396   register dw_line_info_ref line_info;
4397
4398   fprintf (outfile, "\n\nDWARF source line information\n");
4399   for (i = 1; i < line_info_table_in_use; ++i)
4400     {
4401       line_info = &line_info_table[i];
4402       fprintf (outfile, "%5d: ", i);
4403       fprintf (outfile, "%-20s", file_table[line_info->dw_file_num]);
4404       fprintf (outfile, "%6ld", line_info->dw_line_num);
4405       fprintf (outfile, "\n");
4406     }
4407
4408   fprintf (outfile, "\n\n");
4409 }
4410
4411 /* Print the information collected for a given DIE.  */
4412
4413 void
4414 debug_dwarf_die (die)
4415      dw_die_ref die;
4416 {
4417   print_die (die, stderr);
4418 }
4419
4420 /* Print all DWARF information collected for the compilation unit.
4421    This routine is a debugging aid only.  */
4422
4423 void
4424 debug_dwarf ()
4425 {
4426   print_indent = 0;
4427   print_die (comp_unit_die, stderr);
4428   if (! DWARF2_ASM_LINE_DEBUG_INFO)
4429     print_dwarf_line_table (stderr);
4430 }
4431 \f
4432 /* We build up the lists of children and attributes by pushing new ones
4433    onto the beginning of the list.  Reverse the lists for DIE so that
4434    they are in order of addition.  */
4435
4436 static void
4437 reverse_die_lists (die)
4438      register dw_die_ref die;
4439 {
4440   register dw_die_ref c, cp, cn;
4441   register dw_attr_ref a, ap, an;
4442
4443   for (a = die->die_attr, ap = 0; a; a = an)
4444     {
4445       an = a->dw_attr_next;
4446       a->dw_attr_next = ap;
4447       ap = a;
4448     }
4449   die->die_attr = ap;
4450
4451   for (c = die->die_child, cp = 0; c; c = cn)
4452     {
4453       cn = c->die_sib;
4454       c->die_sib = cp;
4455       cp = c;
4456     }
4457   die->die_child = cp;
4458 }
4459
4460 /* Traverse the DIE, reverse its lists of attributes and children, and
4461    add a sibling attribute if it may have the effect of speeding up
4462    access to siblings.  To save some space, avoid generating sibling
4463    attributes for DIE's without children.  */
4464
4465 static void
4466 add_sibling_attributes (die)
4467      register dw_die_ref die;
4468 {
4469   register dw_die_ref c;
4470
4471   reverse_die_lists (die);
4472
4473   if (die != comp_unit_die && die->die_sib && die->die_child != NULL)
4474     /* Add the sibling link to the front of the attribute list.  */
4475     add_AT_die_ref (die, DW_AT_sibling, die->die_sib);
4476
4477   for (c = die->die_child; c != NULL; c = c->die_sib)
4478     add_sibling_attributes (c);
4479 }
4480
4481 /* The format of each DIE (and its attribute value pairs)
4482    is encoded in an abbreviation table.  This routine builds the
4483    abbreviation table and assigns a unique abbreviation id for
4484    each abbreviation entry.  The children of each die are visited
4485    recursively.  */
4486
4487 static void
4488 build_abbrev_table (die)
4489      register dw_die_ref die;
4490 {
4491   register unsigned long abbrev_id;
4492   register unsigned long n_alloc;
4493   register dw_die_ref c;
4494   register dw_attr_ref d_attr, a_attr;
4495   for (abbrev_id = 1; abbrev_id < abbrev_die_table_in_use; ++abbrev_id)
4496     {
4497       register dw_die_ref abbrev = abbrev_die_table[abbrev_id];
4498
4499       if (abbrev->die_tag == die->die_tag)
4500         {
4501           if ((abbrev->die_child != NULL) == (die->die_child != NULL))
4502             {
4503               a_attr = abbrev->die_attr;
4504               d_attr = die->die_attr;
4505
4506               while (a_attr != NULL && d_attr != NULL)
4507                 {
4508                   if ((a_attr->dw_attr != d_attr->dw_attr)
4509                       || (value_format (a_attr) != value_format (d_attr)))
4510                     break;
4511
4512                   a_attr = a_attr->dw_attr_next;
4513                   d_attr = d_attr->dw_attr_next;
4514                 }
4515
4516               if (a_attr == NULL && d_attr == NULL)
4517                 break;
4518             }
4519         }
4520     }
4521
4522   if (abbrev_id >= abbrev_die_table_in_use)
4523     {
4524       if (abbrev_die_table_in_use >= abbrev_die_table_allocated)
4525         {
4526           n_alloc = abbrev_die_table_allocated + ABBREV_DIE_TABLE_INCREMENT;
4527           abbrev_die_table 
4528             = (dw_die_ref *) xrealloc (abbrev_die_table,
4529                                        sizeof (dw_die_ref) * n_alloc);
4530
4531           bzero ((char *) &abbrev_die_table[abbrev_die_table_allocated],
4532                  (n_alloc - abbrev_die_table_allocated) * sizeof (dw_die_ref));
4533           abbrev_die_table_allocated = n_alloc;
4534         }
4535
4536       ++abbrev_die_table_in_use;
4537       abbrev_die_table[abbrev_id] = die;
4538     }
4539
4540   die->die_abbrev = abbrev_id;
4541   for (c = die->die_child; c != NULL; c = c->die_sib)
4542     build_abbrev_table (c);
4543 }
4544 \f
4545 /* Return the size of a string, including the null byte.
4546
4547    This used to treat backslashes as escapes, and hence they were not included
4548    in the count.  However, that conflicts with what ASM_OUTPUT_ASCII does,
4549    which treats a backslash as a backslash, escaping it if necessary, and hence
4550    we must include them in the count.  */
4551
4552 static unsigned long
4553 size_of_string (str)
4554      register const char *str;
4555 {
4556   return strlen (str) + 1;
4557 }
4558
4559 /* Return the size of a location descriptor.  */
4560
4561 static unsigned long
4562 size_of_loc_descr (loc)
4563      register dw_loc_descr_ref loc;
4564 {
4565   register unsigned long size = 1;
4566
4567   switch (loc->dw_loc_opc)
4568     {
4569     case DW_OP_addr:
4570       size += PTR_SIZE;
4571       break;
4572     case DW_OP_const1u:
4573     case DW_OP_const1s:
4574       size += 1;
4575       break;
4576     case DW_OP_const2u:
4577     case DW_OP_const2s:
4578       size += 2;
4579       break;
4580     case DW_OP_const4u:
4581     case DW_OP_const4s:
4582       size += 4;
4583       break;
4584     case DW_OP_const8u:
4585     case DW_OP_const8s:
4586       size += 8;
4587       break;
4588     case DW_OP_constu:
4589       size += size_of_uleb128 (loc->dw_loc_oprnd1.v.val_unsigned);
4590       break;
4591     case DW_OP_consts:
4592       size += size_of_sleb128 (loc->dw_loc_oprnd1.v.val_int);
4593       break;
4594     case DW_OP_pick:
4595       size += 1;
4596       break;
4597     case DW_OP_plus_uconst:
4598       size += size_of_uleb128 (loc->dw_loc_oprnd1.v.val_unsigned);
4599       break;
4600     case DW_OP_skip:
4601     case DW_OP_bra:
4602       size += 2;
4603       break;
4604     case DW_OP_breg0:
4605     case DW_OP_breg1:
4606     case DW_OP_breg2:
4607     case DW_OP_breg3:
4608     case DW_OP_breg4:
4609     case DW_OP_breg5:
4610     case DW_OP_breg6:
4611     case DW_OP_breg7:
4612     case DW_OP_breg8:
4613     case DW_OP_breg9:
4614     case DW_OP_breg10:
4615     case DW_OP_breg11:
4616     case DW_OP_breg12:
4617     case DW_OP_breg13:
4618     case DW_OP_breg14:
4619     case DW_OP_breg15:
4620     case DW_OP_breg16:
4621     case DW_OP_breg17:
4622     case DW_OP_breg18:
4623     case DW_OP_breg19:
4624     case DW_OP_breg20:
4625     case DW_OP_breg21:
4626     case DW_OP_breg22:
4627     case DW_OP_breg23:
4628     case DW_OP_breg24:
4629     case DW_OP_breg25:
4630     case DW_OP_breg26:
4631     case DW_OP_breg27:
4632     case DW_OP_breg28:
4633     case DW_OP_breg29:
4634     case DW_OP_breg30:
4635     case DW_OP_breg31:
4636       size += size_of_sleb128 (loc->dw_loc_oprnd1.v.val_int);
4637       break;
4638     case DW_OP_regx:
4639       size += size_of_uleb128 (loc->dw_loc_oprnd1.v.val_unsigned);
4640       break;
4641     case DW_OP_fbreg:
4642       size += size_of_sleb128 (loc->dw_loc_oprnd1.v.val_int);
4643       break;
4644     case DW_OP_bregx:
4645       size += size_of_uleb128 (loc->dw_loc_oprnd1.v.val_unsigned);
4646       size += size_of_sleb128 (loc->dw_loc_oprnd2.v.val_int);
4647       break;
4648     case DW_OP_piece:
4649       size += size_of_uleb128 (loc->dw_loc_oprnd1.v.val_unsigned);
4650       break;
4651     case DW_OP_deref_size:
4652     case DW_OP_xderef_size:
4653       size += 1;
4654       break;
4655     default:
4656       break;
4657     }
4658
4659   return size;
4660 }
4661
4662 /* Return the size of a series of location descriptors.  */
4663
4664 static unsigned long
4665 size_of_locs (loc)
4666      register dw_loc_descr_ref loc;
4667 {
4668   register unsigned long size = 0;
4669
4670   for (; loc != NULL; loc = loc->dw_loc_next)
4671     size += size_of_loc_descr (loc);
4672
4673   return size;
4674 }
4675
4676 /* Return the power-of-two number of bytes necessary to represent VALUE.  */
4677
4678 static int
4679 constant_size (value)
4680      long unsigned value;
4681 {
4682   int log;
4683
4684   if (value == 0)
4685     log = 0;
4686   else
4687     log = floor_log2 (value);
4688
4689   log = log / 8;
4690   log = 1 << (floor_log2 (log) + 1);
4691
4692   return log;
4693 }
4694
4695 /* Return the size of a DIE, as it is represented in the
4696    .debug_info section.  */
4697
4698 static unsigned long
4699 size_of_die (die)
4700      register dw_die_ref die;
4701 {
4702   register unsigned long size = 0;
4703   register dw_attr_ref a;
4704
4705   size += size_of_uleb128 (die->die_abbrev);
4706   for (a = die->die_attr; a != NULL; a = a->dw_attr_next)
4707     {
4708       switch (AT_class (a))
4709         {
4710         case dw_val_class_addr:
4711           size += PTR_SIZE;
4712           break;
4713         case dw_val_class_loc:
4714           {
4715             register unsigned long lsize = size_of_locs (AT_loc (a));
4716
4717             /* Block length.  */
4718             size += constant_size (lsize);
4719             size += lsize;
4720           }
4721           break;
4722         case dw_val_class_const:
4723           size += 4;
4724           break;
4725         case dw_val_class_unsigned_const:
4726           size += constant_size (AT_unsigned (a));
4727           break;
4728         case dw_val_class_long_long:
4729           size += 1 + 8; /* block */
4730           break;
4731         case dw_val_class_float:
4732           size += 1 + a->dw_attr_val.v.val_float.length * 4; /* block */
4733           break;
4734         case dw_val_class_flag:
4735           size += 1;
4736           break;
4737         case dw_val_class_die_ref:
4738           size += DWARF_OFFSET_SIZE;
4739           break;
4740         case dw_val_class_fde_ref:
4741           size += DWARF_OFFSET_SIZE;
4742           break;
4743         case dw_val_class_lbl_id:
4744           size += PTR_SIZE;
4745           break;
4746         case dw_val_class_lbl_offset:
4747           size += DWARF_OFFSET_SIZE;
4748           break;
4749         case dw_val_class_str:
4750           size += size_of_string (AT_string (a));
4751           break;
4752         default:
4753           abort ();
4754         }
4755     }
4756
4757   return size;
4758 }
4759
4760 /* Size the debugging information associated with a given DIE.
4761    Visits the DIE's children recursively.  Updates the global
4762    variable next_die_offset, on each time through.  Uses the
4763    current value of next_die_offset to update the die_offset
4764    field in each DIE.  */
4765
4766 static void
4767 calc_die_sizes (die)
4768      dw_die_ref die;
4769 {
4770   register dw_die_ref c;
4771   die->die_offset = next_die_offset;
4772   next_die_offset += size_of_die (die);
4773
4774   for (c = die->die_child; c != NULL; c = c->die_sib)
4775     calc_die_sizes (c);
4776
4777   if (die->die_child != NULL)
4778     /* Count the null byte used to terminate sibling lists.  */
4779     next_die_offset += 1;
4780 }
4781
4782 /* Return the size of the line information prolog generated for the
4783    compilation unit.  */
4784
4785 static unsigned long
4786 size_of_line_prolog ()
4787 {
4788   register unsigned long size;
4789   register unsigned long ft_index;
4790
4791   size = DWARF_LINE_PROLOG_HEADER_SIZE;
4792
4793   /* Count the size of the table giving number of args for each
4794      standard opcode.  */
4795   size += DWARF_LINE_OPCODE_BASE - 1;
4796
4797   /* Include directory table is empty (at present).  Count only the
4798      null byte used to terminate the table.  */
4799   size += 1;
4800
4801   for (ft_index = 1; ft_index < file_table_in_use; ++ft_index)
4802     {
4803       /* File name entry.  */
4804       size += size_of_string (file_table[ft_index]);
4805
4806       /* Include directory index.  */
4807       size += size_of_uleb128 (0);
4808
4809       /* Modification time.  */
4810       size += size_of_uleb128 (0);
4811
4812       /* File length in bytes.  */
4813       size += size_of_uleb128 (0);
4814     }
4815
4816   /* Count the file table terminator.  */
4817   size += 1;
4818   return size;
4819 }
4820
4821 /* Return the size of the .debug_pubnames table  generated for the
4822    compilation unit.  */
4823
4824 static unsigned long
4825 size_of_pubnames ()
4826 {
4827   register unsigned long size;
4828   register unsigned i;
4829
4830   size = DWARF_PUBNAMES_HEADER_SIZE;
4831   for (i = 0; i < pubname_table_in_use; ++i)
4832     {
4833       register pubname_ref p = &pubname_table[i];
4834       size += DWARF_OFFSET_SIZE + size_of_string (p->name);
4835     }
4836
4837   size += DWARF_OFFSET_SIZE;
4838   return size;
4839 }
4840
4841 /* Return the size of the information in the .debug_aranges section.  */
4842
4843 static unsigned long
4844 size_of_aranges ()
4845 {
4846   register unsigned long size;
4847
4848   size = DWARF_ARANGES_HEADER_SIZE;
4849
4850   /* Count the address/length pair for this compilation unit.  */
4851   size += 2 * PTR_SIZE;
4852   size += 2 * PTR_SIZE * arange_table_in_use;
4853
4854   /* Count the two zero words used to terminated the address range table.  */
4855   size += 2 * PTR_SIZE;
4856   return size;
4857 }
4858 \f
4859 /* Select the encoding of an attribute value.  */
4860
4861 static enum dwarf_form
4862 value_format (a)
4863      dw_attr_ref a;
4864 {
4865   switch (a->dw_attr_val.val_class)
4866     {
4867     case dw_val_class_addr:
4868       return DW_FORM_addr;
4869     case dw_val_class_loc:
4870       switch (constant_size (size_of_locs (AT_loc (a))))
4871         {
4872         case 1:
4873           return DW_FORM_block1;
4874         case 2:
4875           return DW_FORM_block2;
4876         default:
4877           abort ();
4878         }
4879     case dw_val_class_const:
4880       return DW_FORM_data4;
4881     case dw_val_class_unsigned_const:
4882       switch (constant_size (AT_unsigned (a)))
4883         {
4884         case 1:
4885           return DW_FORM_data1;
4886         case 2:
4887           return DW_FORM_data2;
4888         case 4:
4889           return DW_FORM_data4;
4890         case 8:
4891           return DW_FORM_data8;
4892         default:
4893           abort ();
4894         }
4895     case dw_val_class_long_long:
4896       return DW_FORM_block1;
4897     case dw_val_class_float:
4898       return DW_FORM_block1;
4899     case dw_val_class_flag:
4900       return DW_FORM_flag;
4901     case dw_val_class_die_ref:
4902       return DW_FORM_ref;
4903     case dw_val_class_fde_ref:
4904       return DW_FORM_data;
4905     case dw_val_class_lbl_id:
4906       return DW_FORM_addr;
4907     case dw_val_class_lbl_offset:
4908       return DW_FORM_data;
4909     case dw_val_class_str:
4910       return DW_FORM_string;
4911     default:
4912       abort ();
4913     }
4914 }
4915
4916 /* Output the encoding of an attribute value.  */
4917
4918 static void
4919 output_value_format (a)
4920      dw_attr_ref a;
4921 {
4922   enum dwarf_form form = value_format (a);
4923
4924   output_uleb128 (form);
4925   if (flag_debug_asm)
4926     fprintf (asm_out_file, " (%s)", dwarf_form_name (form));
4927
4928   fputc ('\n', asm_out_file);
4929 }
4930
4931 /* Output the .debug_abbrev section which defines the DIE abbreviation
4932    table.  */
4933
4934 static void
4935 output_abbrev_section ()
4936 {
4937   unsigned long abbrev_id;
4938
4939   dw_attr_ref a_attr;
4940   for (abbrev_id = 1; abbrev_id < abbrev_die_table_in_use; ++abbrev_id)
4941     {
4942       register dw_die_ref abbrev = abbrev_die_table[abbrev_id];
4943
4944       output_uleb128 (abbrev_id);
4945       if (flag_debug_asm)
4946         fprintf (asm_out_file, " (abbrev code)");
4947
4948       fputc ('\n', asm_out_file);
4949       output_uleb128 (abbrev->die_tag);
4950       if (flag_debug_asm)
4951         fprintf (asm_out_file, " (TAG: %s)",
4952                  dwarf_tag_name (abbrev->die_tag));
4953
4954       fputc ('\n', asm_out_file);
4955       fprintf (asm_out_file, "\t%s\t0x%x", ASM_BYTE_OP,
4956                abbrev->die_child != NULL ? DW_children_yes : DW_children_no);
4957
4958       if (flag_debug_asm)
4959         fprintf (asm_out_file, "\t%s %s",
4960                  ASM_COMMENT_START,
4961                  (abbrev->die_child != NULL
4962                   ? "DW_children_yes" : "DW_children_no"));
4963
4964       fputc ('\n', asm_out_file);
4965
4966       for (a_attr = abbrev->die_attr; a_attr != NULL;
4967            a_attr = a_attr->dw_attr_next)
4968         {
4969           output_uleb128 (a_attr->dw_attr);
4970           if (flag_debug_asm)
4971             fprintf (asm_out_file, " (%s)",
4972                      dwarf_attr_name (a_attr->dw_attr));
4973
4974           fputc ('\n', asm_out_file);
4975           output_value_format (a_attr);
4976         }
4977
4978       fprintf (asm_out_file, "\t%s\t0,0\n", ASM_BYTE_OP);
4979     }
4980
4981   /* Terminate the table.  */
4982   fprintf (asm_out_file, "\t%s\t0\n", ASM_BYTE_OP);
4983 }
4984
4985 /* Output location description stack opcode's operands (if any).  */
4986
4987 static void
4988 output_loc_operands (loc)
4989      register dw_loc_descr_ref loc;
4990 {
4991   register dw_val_ref val1 = &loc->dw_loc_oprnd1;
4992   register dw_val_ref val2 = &loc->dw_loc_oprnd2;
4993
4994   switch (loc->dw_loc_opc)
4995     {
4996     case DW_OP_addr:
4997       ASM_OUTPUT_DWARF_ADDR_CONST (asm_out_file, val1->v.val_addr);
4998       fputc ('\n', asm_out_file);
4999       break;
5000     case DW_OP_const1u:
5001     case DW_OP_const1s:
5002       ASM_OUTPUT_DWARF_DATA1 (asm_out_file, val1->v.val_flag);
5003       fputc ('\n', asm_out_file);
5004       break;
5005     case DW_OP_const2u:
5006     case DW_OP_const2s:
5007       ASM_OUTPUT_DWARF_DATA2 (asm_out_file, val1->v.val_int);
5008       fputc ('\n', asm_out_file);
5009       break;
5010     case DW_OP_const4u:
5011     case DW_OP_const4s:
5012       ASM_OUTPUT_DWARF_DATA4 (asm_out_file, val1->v.val_int);
5013       fputc ('\n', asm_out_file);
5014       break;
5015     case DW_OP_const8u:
5016     case DW_OP_const8s:
5017       abort ();
5018       fputc ('\n', asm_out_file);
5019       break;
5020     case DW_OP_constu:
5021       output_uleb128 (val1->v.val_unsigned);
5022       fputc ('\n', asm_out_file);
5023       break;
5024     case DW_OP_consts:
5025       output_sleb128 (val1->v.val_int);
5026       fputc ('\n', asm_out_file);
5027       break;
5028     case DW_OP_pick:
5029       ASM_OUTPUT_DWARF_DATA1 (asm_out_file, val1->v.val_int);
5030       fputc ('\n', asm_out_file);
5031       break;
5032     case DW_OP_plus_uconst:
5033       output_uleb128 (val1->v.val_unsigned);
5034       fputc ('\n', asm_out_file);
5035       break;
5036     case DW_OP_skip:
5037     case DW_OP_bra:
5038       ASM_OUTPUT_DWARF_DATA2 (asm_out_file, val1->v.val_int);
5039       fputc ('\n', asm_out_file);
5040       break;
5041     case DW_OP_breg0:
5042     case DW_OP_breg1:
5043     case DW_OP_breg2:
5044     case DW_OP_breg3:
5045     case DW_OP_breg4:
5046     case DW_OP_breg5:
5047     case DW_OP_breg6:
5048     case DW_OP_breg7:
5049     case DW_OP_breg8:
5050     case DW_OP_breg9:
5051     case DW_OP_breg10:
5052     case DW_OP_breg11:
5053     case DW_OP_breg12:
5054     case DW_OP_breg13:
5055     case DW_OP_breg14:
5056     case DW_OP_breg15:
5057     case DW_OP_breg16:
5058     case DW_OP_breg17:
5059     case DW_OP_breg18:
5060     case DW_OP_breg19:
5061     case DW_OP_breg20:
5062     case DW_OP_breg21:
5063     case DW_OP_breg22:
5064     case DW_OP_breg23:
5065     case DW_OP_breg24:
5066     case DW_OP_breg25:
5067     case DW_OP_breg26:
5068     case DW_OP_breg27:
5069     case DW_OP_breg28:
5070     case DW_OP_breg29:
5071     case DW_OP_breg30:
5072     case DW_OP_breg31:
5073       output_sleb128 (val1->v.val_int);
5074       fputc ('\n', asm_out_file);
5075       break;
5076     case DW_OP_regx:
5077       output_uleb128 (val1->v.val_unsigned);
5078       fputc ('\n', asm_out_file);
5079       break;
5080     case DW_OP_fbreg:
5081       output_sleb128 (val1->v.val_int);
5082       fputc ('\n', asm_out_file);
5083       break;
5084     case DW_OP_bregx:
5085       output_uleb128 (val1->v.val_unsigned);
5086       fputc ('\n', asm_out_file);
5087       output_sleb128 (val2->v.val_int);
5088       fputc ('\n', asm_out_file);
5089       break;
5090     case DW_OP_piece:
5091       output_uleb128 (val1->v.val_unsigned);
5092       fputc ('\n', asm_out_file);
5093       break;
5094     case DW_OP_deref_size:
5095     case DW_OP_xderef_size:
5096       ASM_OUTPUT_DWARF_DATA1 (asm_out_file, val1->v.val_flag);
5097       fputc ('\n', asm_out_file);
5098       break;
5099     default:
5100       break;
5101     }
5102 }
5103
5104 /* Output the DIE and its attributes.  Called recursively to generate
5105    the definitions of each child DIE.  */
5106
5107 static void
5108 output_die (die)
5109      register dw_die_ref die;
5110 {
5111   register dw_attr_ref a;
5112   register dw_die_ref c;
5113   register unsigned long size;
5114   register dw_loc_descr_ref loc;
5115
5116   output_uleb128 (die->die_abbrev);
5117   if (flag_debug_asm)
5118     fprintf (asm_out_file, " (DIE (0x%lx) %s)",
5119              die->die_offset, dwarf_tag_name (die->die_tag));
5120
5121   fputc ('\n', asm_out_file);
5122
5123   for (a = die->die_attr; a != NULL; a = a->dw_attr_next)
5124     {
5125       switch (AT_class (a))
5126         {
5127         case dw_val_class_addr:
5128           ASM_OUTPUT_DWARF_ADDR_CONST (asm_out_file, AT_addr (a));
5129           break;
5130
5131         case dw_val_class_loc:
5132           size = size_of_locs (AT_loc (a));
5133
5134           /* Output the block length for this list of location operations.  */
5135           switch (constant_size (size))
5136             {
5137             case 1:
5138               ASM_OUTPUT_DWARF_DATA1 (asm_out_file, size);
5139               break;
5140             case 2:
5141               ASM_OUTPUT_DWARF_DATA2 (asm_out_file, size);
5142               break;
5143             default:
5144               abort ();
5145             }
5146
5147           if (flag_debug_asm)
5148             fprintf (asm_out_file, "\t%s %s",
5149                      ASM_COMMENT_START, dwarf_attr_name (a->dw_attr));
5150
5151           fputc ('\n', asm_out_file);
5152           for (loc = AT_loc (a); loc != NULL; loc = loc->dw_loc_next)
5153             {
5154               /* Output the opcode.  */
5155               ASM_OUTPUT_DWARF_DATA1 (asm_out_file, loc->dw_loc_opc);
5156               if (flag_debug_asm)
5157                 fprintf (asm_out_file, "\t%s %s", ASM_COMMENT_START,
5158                          dwarf_stack_op_name (loc->dw_loc_opc));
5159
5160               fputc ('\n', asm_out_file);
5161
5162               /* Output the operand(s) (if any).  */
5163               output_loc_operands (loc);
5164             }
5165           break;
5166
5167         case dw_val_class_const:
5168           ASM_OUTPUT_DWARF_DATA4 (asm_out_file, AT_int (a));
5169           break;
5170
5171         case dw_val_class_unsigned_const:
5172           switch (constant_size (AT_unsigned (a)))
5173             {
5174             case 1:
5175               ASM_OUTPUT_DWARF_DATA1 (asm_out_file, AT_unsigned (a));
5176               break;
5177             case 2:
5178               ASM_OUTPUT_DWARF_DATA2 (asm_out_file, AT_unsigned (a));
5179               break;
5180             case 4:
5181               ASM_OUTPUT_DWARF_DATA4 (asm_out_file, AT_unsigned (a));
5182               break;
5183             case 8:
5184               ASM_OUTPUT_DWARF_DATA8 (asm_out_file,
5185                                       a->dw_attr_val.v.val_long_long.hi,
5186                                       a->dw_attr_val.v.val_long_long.low);
5187               break;
5188             default:
5189               abort ();
5190             }
5191           break;
5192
5193         case dw_val_class_long_long:
5194           ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 8);
5195           if (flag_debug_asm)
5196             fprintf (asm_out_file, "\t%s %s",
5197                    ASM_COMMENT_START, dwarf_attr_name (a->dw_attr));
5198
5199           fputc ('\n', asm_out_file);
5200           ASM_OUTPUT_DWARF_DATA8 (asm_out_file,
5201                                   a->dw_attr_val.v.val_long_long.hi,
5202                                   a->dw_attr_val.v.val_long_long.low);
5203
5204           if (flag_debug_asm)
5205             fprintf (asm_out_file,
5206                      "\t%s long long constant", ASM_COMMENT_START);
5207           
5208           fputc ('\n', asm_out_file);
5209           break;
5210
5211         case dw_val_class_float:
5212           {
5213             register unsigned int i;
5214             ASM_OUTPUT_DWARF_DATA1 (asm_out_file,
5215                                     a->dw_attr_val.v.val_float.length * 4);
5216             if (flag_debug_asm)
5217               fprintf (asm_out_file, "\t%s %s",
5218                        ASM_COMMENT_START, dwarf_attr_name (a->dw_attr));
5219
5220             fputc ('\n', asm_out_file);
5221             for (i = 0; i < a->dw_attr_val.v.val_float.length; ++i)
5222               {
5223                 ASM_OUTPUT_DWARF_DATA4 (asm_out_file,
5224                                         a->dw_attr_val.v.val_float.array[i]);
5225                 if (flag_debug_asm)
5226                   fprintf (asm_out_file, "\t%s fp constant word %u",
5227                            ASM_COMMENT_START, i);
5228
5229                 fputc ('\n', asm_out_file);
5230               }
5231           break;
5232           }
5233
5234         case dw_val_class_flag:
5235           ASM_OUTPUT_DWARF_DATA1 (asm_out_file, AT_flag (a));
5236           break;
5237
5238         case dw_val_class_die_ref:
5239           ASM_OUTPUT_DWARF_DATA (asm_out_file, AT_ref (a)->die_offset);
5240           break;
5241
5242         case dw_val_class_fde_ref:
5243           {
5244             char l1[20];
5245             ASM_GENERATE_INTERNAL_LABEL
5246               (l1, FDE_AFTER_SIZE_LABEL, a->dw_attr_val.v.val_fde_index * 2);
5247             ASM_OUTPUT_DWARF_OFFSET (asm_out_file, l1);
5248             fprintf (asm_out_file, " - %d", DWARF_OFFSET_SIZE);
5249           }
5250           break;
5251
5252         case dw_val_class_lbl_id:
5253           ASM_OUTPUT_DWARF_ADDR (asm_out_file, AT_lbl (a));
5254           break;
5255
5256         case dw_val_class_lbl_offset:
5257           ASM_OUTPUT_DWARF_OFFSET (asm_out_file, AT_lbl (a));
5258           break;
5259
5260         case dw_val_class_str:
5261           if (flag_debug_asm)
5262             ASM_OUTPUT_DWARF_STRING (asm_out_file, AT_string (a));
5263           else
5264             ASM_OUTPUT_ASCII (asm_out_file, AT_string (a),
5265                               (int) strlen (AT_string (a)) + 1);
5266           break;
5267
5268         default:
5269           abort ();
5270         }
5271
5272       if (AT_class (a) != dw_val_class_loc
5273           && AT_class (a) != dw_val_class_long_long
5274           && AT_class (a) != dw_val_class_float)
5275         {
5276           if (flag_debug_asm)
5277             fprintf (asm_out_file, "\t%s %s",
5278                      ASM_COMMENT_START, dwarf_attr_name (a->dw_attr));
5279
5280           fputc ('\n', asm_out_file);
5281         }
5282     }
5283
5284   for (c = die->die_child; c != NULL; c = c->die_sib)
5285     output_die (c);
5286
5287   if (die->die_child != NULL)
5288     {
5289       /* Add null byte to terminate sibling list. */
5290       ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 0);
5291       if (flag_debug_asm)
5292         fprintf (asm_out_file, "\t%s end of children of DIE 0x%lx",
5293                  ASM_COMMENT_START, die->die_offset);
5294
5295       fputc ('\n', asm_out_file);
5296     }
5297 }
5298
5299 /* Output the compilation unit that appears at the beginning of the
5300    .debug_info section, and precedes the DIE descriptions.  */
5301
5302 static void
5303 output_compilation_unit_header ()
5304 {
5305   ASM_OUTPUT_DWARF_DATA (asm_out_file, next_die_offset - DWARF_OFFSET_SIZE);
5306   if (flag_debug_asm)
5307     fprintf (asm_out_file, "\t%s Length of Compilation Unit Info.",
5308              ASM_COMMENT_START);
5309
5310   fputc ('\n', asm_out_file);
5311   ASM_OUTPUT_DWARF_DATA2 (asm_out_file, DWARF_VERSION);
5312   if (flag_debug_asm)
5313     fprintf (asm_out_file, "\t%s DWARF version number", ASM_COMMENT_START);
5314
5315   fputc ('\n', asm_out_file);
5316   ASM_OUTPUT_DWARF_OFFSET (asm_out_file, abbrev_section_label);
5317   if (flag_debug_asm)
5318     fprintf (asm_out_file, "\t%s Offset Into Abbrev. Section",
5319              ASM_COMMENT_START);
5320
5321   fputc ('\n', asm_out_file);
5322   ASM_OUTPUT_DWARF_DATA1 (asm_out_file, PTR_SIZE);
5323   if (flag_debug_asm)
5324     fprintf (asm_out_file, "\t%s Pointer Size (in bytes)", ASM_COMMENT_START);
5325
5326   fputc ('\n', asm_out_file);
5327 }
5328
5329 /* The DWARF2 pubname for a nested thingy looks like "A::f".  The output
5330    of decl_printable_name for C++ looks like "A::f(int)".  Let's drop the
5331    argument list, and maybe the scope.  */
5332
5333 static const char *
5334 dwarf2_name (decl, scope)
5335      tree decl;
5336      int scope;
5337 {
5338   return (*decl_printable_name) (decl, scope ? 1 : 0);
5339 }
5340
5341 /* Add a new entry to .debug_pubnames if appropriate.  */
5342
5343 static void
5344 add_pubname (decl, die)
5345      tree decl;
5346      dw_die_ref die;
5347 {
5348   pubname_ref p;
5349
5350   if (! TREE_PUBLIC (decl))
5351     return;
5352
5353   if (pubname_table_in_use == pubname_table_allocated)
5354     {
5355       pubname_table_allocated += PUBNAME_TABLE_INCREMENT;
5356       pubname_table = (pubname_ref) xrealloc
5357         (pubname_table, pubname_table_allocated * sizeof (pubname_entry));
5358     }
5359
5360   p = &pubname_table[pubname_table_in_use++];
5361   p->die = die;
5362
5363   p->name = xstrdup (dwarf2_name (decl, 1));
5364 }
5365
5366 /* Output the public names table used to speed up access to externally
5367    visible names.  For now, only generate entries for externally
5368    visible procedures.  */
5369
5370 static void
5371 output_pubnames ()
5372 {
5373   register unsigned i;
5374   register unsigned long pubnames_length = size_of_pubnames ();
5375
5376   ASM_OUTPUT_DWARF_DATA (asm_out_file, pubnames_length);
5377
5378   if (flag_debug_asm)
5379     fprintf (asm_out_file, "\t%s Length of Public Names Info.",
5380              ASM_COMMENT_START);
5381
5382   fputc ('\n', asm_out_file);
5383   ASM_OUTPUT_DWARF_DATA2 (asm_out_file, DWARF_VERSION);
5384
5385   if (flag_debug_asm)
5386     fprintf (asm_out_file, "\t%s DWARF Version", ASM_COMMENT_START);
5387
5388   fputc ('\n', asm_out_file);
5389   ASM_OUTPUT_DWARF_OFFSET (asm_out_file, debug_info_section_label);
5390   if (flag_debug_asm)
5391     fprintf (asm_out_file, "\t%s Offset of Compilation Unit Info.",
5392              ASM_COMMENT_START);
5393
5394   fputc ('\n', asm_out_file);
5395   ASM_OUTPUT_DWARF_DATA (asm_out_file, next_die_offset);
5396   if (flag_debug_asm)
5397     fprintf (asm_out_file, "\t%s Compilation Unit Length", ASM_COMMENT_START);
5398
5399   fputc ('\n', asm_out_file);
5400   for (i = 0; i < pubname_table_in_use; ++i)
5401     {
5402       register pubname_ref pub = &pubname_table[i];
5403
5404       ASM_OUTPUT_DWARF_DATA (asm_out_file, pub->die->die_offset);
5405       if (flag_debug_asm)
5406         fprintf (asm_out_file, "\t%s DIE offset", ASM_COMMENT_START);
5407
5408       fputc ('\n', asm_out_file);
5409
5410       if (flag_debug_asm)
5411         {
5412           ASM_OUTPUT_DWARF_STRING (asm_out_file, pub->name);
5413           fprintf (asm_out_file, "%s external name", ASM_COMMENT_START);
5414         }
5415       else
5416         {
5417           ASM_OUTPUT_ASCII (asm_out_file, pub->name,
5418                             (int) strlen (pub->name) + 1);
5419         }
5420
5421       fputc ('\n', asm_out_file);
5422     }
5423
5424   ASM_OUTPUT_DWARF_DATA (asm_out_file, 0);
5425   fputc ('\n', asm_out_file);
5426 }
5427
5428 /* Add a new entry to .debug_aranges if appropriate.  */
5429
5430 static void
5431 add_arange (decl, die)
5432      tree decl;
5433      dw_die_ref die;
5434 {
5435   if (! DECL_SECTION_NAME (decl))
5436     return;
5437
5438   if (arange_table_in_use == arange_table_allocated)
5439     {
5440       arange_table_allocated += ARANGE_TABLE_INCREMENT;
5441       arange_table
5442         = (arange_ref) xrealloc (arange_table,
5443                                  arange_table_allocated * sizeof (dw_die_ref));
5444     }
5445
5446   arange_table[arange_table_in_use++] = die;
5447 }
5448
5449 /* Output the information that goes into the .debug_aranges table.
5450    Namely, define the beginning and ending address range of the
5451    text section generated for this compilation unit.  */
5452
5453 static void
5454 output_aranges ()
5455 {
5456   register unsigned i;
5457   register unsigned long aranges_length = size_of_aranges ();
5458
5459   ASM_OUTPUT_DWARF_DATA (asm_out_file, aranges_length);
5460   if (flag_debug_asm)
5461     fprintf (asm_out_file, "\t%s Length of Address Ranges Info.",
5462              ASM_COMMENT_START);
5463
5464   fputc ('\n', asm_out_file);
5465   ASM_OUTPUT_DWARF_DATA2 (asm_out_file, DWARF_VERSION);
5466   if (flag_debug_asm)
5467     fprintf (asm_out_file, "\t%s DWARF Version", ASM_COMMENT_START);
5468
5469   fputc ('\n', asm_out_file);
5470   ASM_OUTPUT_DWARF_OFFSET (asm_out_file, debug_info_section_label);
5471   if (flag_debug_asm)
5472     fprintf (asm_out_file, "\t%s Offset of Compilation Unit Info.",
5473              ASM_COMMENT_START);
5474
5475   fputc ('\n', asm_out_file);
5476   ASM_OUTPUT_DWARF_DATA1 (asm_out_file, PTR_SIZE);
5477   if (flag_debug_asm)
5478     fprintf (asm_out_file, "\t%s Size of Address", ASM_COMMENT_START);
5479
5480   fputc ('\n', asm_out_file);
5481   ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 0);
5482   if (flag_debug_asm)
5483     fprintf (asm_out_file, "\t%s Size of Segment Descriptor",
5484              ASM_COMMENT_START);
5485
5486   fputc ('\n', asm_out_file);
5487   /* We need to align to twice the pointer size here.
5488      If DWARF_OFFSET_SIZE == 4, then we have emitted 12 bytes, and need 4
5489      bytes of padding to align for either 4 or 8 byte pointers.  */
5490   ASM_OUTPUT_DWARF_DATA4 (asm_out_file, 0);
5491   /* If DWARF_OFFSET_SIZE == 8, then we have emitted 20 bytes, and need 12
5492      bytes of padding to align for 8 byte pointers.  We have already emitted
5493      4 bytes of padding, so emit 8 more here.  */
5494   if (DWARF_OFFSET_SIZE == 8)
5495     fprintf (asm_out_file, ",0,0");
5496
5497   if (flag_debug_asm)
5498     fprintf (asm_out_file, "\t%s Pad to %d byte boundary",
5499              ASM_COMMENT_START, 2 * PTR_SIZE);
5500
5501   fputc ('\n', asm_out_file);
5502   ASM_OUTPUT_DWARF_ADDR (asm_out_file, text_section_label);
5503   if (flag_debug_asm)
5504     fprintf (asm_out_file, "\t%s Address", ASM_COMMENT_START);
5505
5506   fputc ('\n', asm_out_file);
5507   ASM_OUTPUT_DWARF_ADDR_DELTA (asm_out_file, text_end_label,
5508                                text_section_label);
5509   if (flag_debug_asm)
5510     fprintf (asm_out_file, "%s Length", ASM_COMMENT_START);
5511
5512   fputc ('\n', asm_out_file);
5513   for (i = 0; i < arange_table_in_use; ++i)
5514     {
5515       dw_die_ref die = arange_table[i];
5516
5517       if (die->die_tag == DW_TAG_subprogram)
5518         ASM_OUTPUT_DWARF_ADDR (asm_out_file, get_AT_low_pc (die));
5519       else
5520         {
5521           /* A static variable; extract the symbol from DW_AT_location.
5522              Note that this code isn't currently hit, as we only emit
5523              aranges for functions (jason 9/23/99).  */
5524
5525           dw_attr_ref a = get_AT (die, DW_AT_location);
5526           dw_loc_descr_ref loc;
5527           if (! a || AT_class (a) != dw_val_class_loc)
5528             abort ();
5529
5530           loc = AT_loc (a);
5531           if (loc->dw_loc_opc != DW_OP_addr)
5532             abort ();
5533
5534           ASM_OUTPUT_DWARF_ADDR (asm_out_file, loc->dw_loc_oprnd1.v.val_addr);
5535         }
5536
5537       if (flag_debug_asm)
5538         fprintf (asm_out_file, "\t%s Address", ASM_COMMENT_START);
5539
5540       fputc ('\n', asm_out_file);
5541       if (die->die_tag == DW_TAG_subprogram)
5542         ASM_OUTPUT_DWARF_ADDR_DELTA (asm_out_file, get_AT_hi_pc (die),
5543                                      get_AT_low_pc (die));
5544       else
5545         ASM_OUTPUT_DWARF_ADDR_DATA (asm_out_file,
5546                                     get_AT_unsigned (die, DW_AT_byte_size));
5547
5548       if (flag_debug_asm)
5549         fprintf (asm_out_file, "%s Length", ASM_COMMENT_START);
5550
5551       fputc ('\n', asm_out_file);
5552     }
5553
5554   /* Output the terminator words.  */
5555   ASM_OUTPUT_DWARF_ADDR_DATA (asm_out_file, 0);
5556   fputc ('\n', asm_out_file);
5557   ASM_OUTPUT_DWARF_ADDR_DATA (asm_out_file, 0);
5558   fputc ('\n', asm_out_file);
5559 }
5560
5561 /* Output the source line number correspondence information.  This
5562    information goes into the .debug_line section.  */
5563
5564 static void
5565 output_line_info ()
5566 {
5567   char line_label[MAX_ARTIFICIAL_LABEL_BYTES];
5568   char prev_line_label[MAX_ARTIFICIAL_LABEL_BYTES];
5569   register unsigned opc;
5570   register unsigned n_op_args;
5571   register unsigned long ft_index;
5572   register unsigned long lt_index;
5573   register unsigned long current_line;
5574   register long line_offset;
5575   register long line_delta;
5576   register unsigned long current_file;
5577   register unsigned long function;
5578
5579   ASM_OUTPUT_DWARF_DELTA (asm_out_file, ".LTEND", ".LTSTART");
5580   if (flag_debug_asm)
5581     fprintf (asm_out_file, "\t%s Length of Source Line Info.",
5582              ASM_COMMENT_START);
5583
5584   fputc ('\n', asm_out_file);
5585   ASM_OUTPUT_LABEL (asm_out_file, ".LTSTART");
5586   ASM_OUTPUT_DWARF_DATA2 (asm_out_file, DWARF_VERSION);
5587   if (flag_debug_asm)
5588     fprintf (asm_out_file, "\t%s DWARF Version", ASM_COMMENT_START);
5589
5590   fputc ('\n', asm_out_file);
5591   ASM_OUTPUT_DWARF_DATA (asm_out_file, size_of_line_prolog ());
5592   if (flag_debug_asm)
5593     fprintf (asm_out_file, "\t%s Prolog Length", ASM_COMMENT_START);
5594
5595   fputc ('\n', asm_out_file);
5596   ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DWARF_LINE_MIN_INSTR_LENGTH);
5597   if (flag_debug_asm)
5598     fprintf (asm_out_file, "\t%s Minimum Instruction Length",
5599              ASM_COMMENT_START);
5600
5601   fputc ('\n', asm_out_file);
5602   ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DWARF_LINE_DEFAULT_IS_STMT_START);
5603   if (flag_debug_asm)
5604     fprintf (asm_out_file, "\t%s Default is_stmt_start flag",
5605              ASM_COMMENT_START);
5606
5607   fputc ('\n', asm_out_file);
5608   fprintf (asm_out_file, "\t%s\t%d", ASM_BYTE_OP, DWARF_LINE_BASE);
5609   if (flag_debug_asm)
5610     fprintf (asm_out_file, "\t%s Line Base Value (Special Opcodes)",
5611              ASM_COMMENT_START);
5612
5613   fputc ('\n', asm_out_file);
5614   fprintf (asm_out_file, "\t%s\t%u", ASM_BYTE_OP, DWARF_LINE_RANGE);
5615   if (flag_debug_asm)
5616     fprintf (asm_out_file, "\t%s Line Range Value (Special Opcodes)",
5617              ASM_COMMENT_START);
5618
5619   fputc ('\n', asm_out_file);
5620   fprintf (asm_out_file, "\t%s\t%u", ASM_BYTE_OP, DWARF_LINE_OPCODE_BASE);
5621   if (flag_debug_asm)
5622     fprintf (asm_out_file, "\t%s Special Opcode Base", ASM_COMMENT_START);
5623
5624   fputc ('\n', asm_out_file);
5625   for (opc = 1; opc < DWARF_LINE_OPCODE_BASE; ++opc)
5626     {
5627       switch (opc)
5628         {
5629         case DW_LNS_advance_pc:
5630         case DW_LNS_advance_line:
5631         case DW_LNS_set_file:
5632         case DW_LNS_set_column:
5633         case DW_LNS_fixed_advance_pc:
5634           n_op_args = 1;
5635           break;
5636         default:
5637           n_op_args = 0;
5638           break;
5639         }
5640       ASM_OUTPUT_DWARF_DATA1 (asm_out_file, n_op_args);
5641       if (flag_debug_asm)
5642         fprintf (asm_out_file, "\t%s opcode: 0x%x has %d args",
5643                  ASM_COMMENT_START, opc, n_op_args);
5644       fputc ('\n', asm_out_file);
5645     }
5646
5647   if (flag_debug_asm)
5648     fprintf (asm_out_file, "%s Include Directory Table\n", ASM_COMMENT_START);
5649
5650   /* Include directory table is empty, at present */
5651   ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 0);
5652   fputc ('\n', asm_out_file);
5653   if (flag_debug_asm)
5654     fprintf (asm_out_file, "%s File Name Table\n", ASM_COMMENT_START);
5655
5656   for (ft_index = 1; ft_index < file_table_in_use; ++ft_index)
5657     {
5658       if (flag_debug_asm)
5659         {
5660           ASM_OUTPUT_DWARF_STRING (asm_out_file, file_table[ft_index]);
5661           fprintf (asm_out_file, "%s File Entry: 0x%lx",
5662                    ASM_COMMENT_START, ft_index);
5663         }
5664       else
5665         {
5666           ASM_OUTPUT_ASCII (asm_out_file,
5667                             file_table[ft_index],
5668                             (int) strlen (file_table[ft_index]) + 1);
5669         }
5670
5671       fputc ('\n', asm_out_file);
5672
5673       /* Include directory index */
5674       output_uleb128 (0);
5675       fputc ('\n', asm_out_file);
5676
5677       /* Modification time */
5678       output_uleb128 (0);
5679       fputc ('\n', asm_out_file);
5680
5681       /* File length in bytes */
5682       output_uleb128 (0);
5683       fputc ('\n', asm_out_file);
5684     }
5685
5686   /* Terminate the file name table */
5687   ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 0);
5688   fputc ('\n', asm_out_file);
5689
5690   /* We used to set the address register to the first location in the text
5691      section here, but that didn't accomplish anything since we already
5692      have a line note for the opening brace of the first function.  */
5693
5694   /* Generate the line number to PC correspondence table, encoded as
5695      a series of state machine operations.  */
5696   current_file = 1;
5697   current_line = 1;
5698   strcpy (prev_line_label, text_section_label);
5699   for (lt_index = 1; lt_index < line_info_table_in_use; ++lt_index)
5700     {
5701       register dw_line_info_ref line_info = &line_info_table[lt_index];
5702
5703 #if 0
5704       /* Disable this optimization for now; GDB wants to see two line notes
5705          at the beginning of a function so it can find the end of the
5706          prologue.  */
5707
5708       /* Don't emit anything for redundant notes.  Just updating the
5709          address doesn't accomplish anything, because we already assume
5710          that anything after the last address is this line.  */
5711       if (line_info->dw_line_num == current_line
5712           && line_info->dw_file_num == current_file)
5713         continue;
5714 #endif
5715
5716       /* Emit debug info for the address of the current line, choosing
5717          the encoding that uses the least amount of space.  */
5718       /* ??? Unfortunately, we have little choice here currently, and must
5719          always use the most general form.  Gcc does not know the address
5720          delta itself, so we can't use DW_LNS_advance_pc.  There are no known
5721          dwarf2 aware assemblers at this time, so we can't use any special
5722          pseudo ops that would allow the assembler to optimally encode this for
5723          us.  Many ports do have length attributes which will give an upper
5724          bound on the address range.  We could perhaps use length attributes
5725          to determine when it is safe to use DW_LNS_fixed_advance_pc.  */
5726       ASM_GENERATE_INTERNAL_LABEL (line_label, LINE_CODE_LABEL, lt_index);
5727       if (0)
5728         {
5729           /* This can handle deltas up to 0xffff.  This takes 3 bytes.  */
5730           ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNS_fixed_advance_pc);
5731           if (flag_debug_asm)
5732             fprintf (asm_out_file, "\t%s DW_LNS_fixed_advance_pc",
5733                      ASM_COMMENT_START);
5734
5735           fputc ('\n', asm_out_file);
5736           ASM_OUTPUT_DWARF_DELTA2 (asm_out_file, line_label, prev_line_label);
5737           fputc ('\n', asm_out_file);
5738         }
5739       else
5740         {
5741           /* This can handle any delta.  This takes 4+PTR_SIZE bytes.  */
5742           ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 0);
5743           if (flag_debug_asm)
5744             fprintf (asm_out_file, "\t%s DW_LNE_set_address",
5745                      ASM_COMMENT_START);
5746           fputc ('\n', asm_out_file);
5747           output_uleb128 (1 + PTR_SIZE);
5748           fputc ('\n', asm_out_file);
5749           ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNE_set_address);
5750           fputc ('\n', asm_out_file);
5751           ASM_OUTPUT_DWARF_ADDR (asm_out_file, line_label);
5752           fputc ('\n', asm_out_file);
5753         }
5754       strcpy (prev_line_label, line_label);
5755
5756       /* Emit debug info for the source file of the current line, if
5757          different from the previous line.  */
5758       if (line_info->dw_file_num != current_file)
5759         {
5760           current_file = line_info->dw_file_num;
5761           ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNS_set_file);
5762           if (flag_debug_asm)
5763             fprintf (asm_out_file, "\t%s DW_LNS_set_file", ASM_COMMENT_START);
5764
5765           fputc ('\n', asm_out_file);
5766           output_uleb128 (current_file);
5767           if (flag_debug_asm)
5768             fprintf (asm_out_file, " (\"%s\")", file_table[current_file]);
5769
5770           fputc ('\n', asm_out_file);
5771         }
5772
5773       /* Emit debug info for the current line number, choosing the encoding
5774          that uses the least amount of space.  */
5775       if (line_info->dw_line_num != current_line)
5776         {
5777           line_offset = line_info->dw_line_num - current_line;
5778           line_delta = line_offset - DWARF_LINE_BASE;
5779           current_line = line_info->dw_line_num;
5780           if (line_delta >= 0 && line_delta < (DWARF_LINE_RANGE - 1))
5781             {
5782               /* This can handle deltas from -10 to 234, using the current
5783                  definitions of DWARF_LINE_BASE and DWARF_LINE_RANGE.  This
5784                  takes 1 byte.  */
5785               ASM_OUTPUT_DWARF_DATA1 (asm_out_file,
5786                                       DWARF_LINE_OPCODE_BASE + line_delta);
5787               if (flag_debug_asm)
5788                 fprintf (asm_out_file,
5789                          "\t%s line %ld", ASM_COMMENT_START, current_line);
5790
5791               fputc ('\n', asm_out_file);
5792             }
5793           else
5794             {
5795               /* This can handle any delta.  This takes at least 4 bytes,
5796                  depending on the value being encoded.  */
5797               ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNS_advance_line);
5798               if (flag_debug_asm)
5799                 fprintf (asm_out_file, "\t%s advance to line %ld",
5800                          ASM_COMMENT_START, current_line);
5801
5802               fputc ('\n', asm_out_file);
5803               output_sleb128 (line_offset);
5804               fputc ('\n', asm_out_file);
5805               ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNS_copy);
5806               if (flag_debug_asm)
5807                 fprintf (asm_out_file, "\t%s DW_LNS_copy", ASM_COMMENT_START);
5808               fputc ('\n', asm_out_file);
5809             }
5810         }
5811       else
5812         {
5813           /* We still need to start a new row, so output a copy insn.  */
5814           ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNS_copy);
5815           if (flag_debug_asm)
5816             fprintf (asm_out_file, "\t%s DW_LNS_copy", ASM_COMMENT_START);
5817           fputc ('\n', asm_out_file);
5818         }
5819     }
5820
5821   /* Emit debug info for the address of the end of the function.  */
5822   if (0)
5823     {
5824       ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNS_fixed_advance_pc);
5825       if (flag_debug_asm)
5826         fprintf (asm_out_file, "\t%s DW_LNS_fixed_advance_pc",
5827                  ASM_COMMENT_START);
5828
5829       fputc ('\n', asm_out_file);
5830       ASM_OUTPUT_DWARF_DELTA2 (asm_out_file, text_end_label, prev_line_label);
5831       fputc ('\n', asm_out_file);
5832     }
5833   else
5834     {
5835       ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 0);
5836       if (flag_debug_asm)
5837         fprintf (asm_out_file, "\t%s DW_LNE_set_address", ASM_COMMENT_START);
5838       fputc ('\n', asm_out_file);
5839       output_uleb128 (1 + PTR_SIZE);
5840       fputc ('\n', asm_out_file);
5841       ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNE_set_address);
5842       fputc ('\n', asm_out_file);
5843       ASM_OUTPUT_DWARF_ADDR (asm_out_file, text_end_label);
5844       fputc ('\n', asm_out_file);
5845     }
5846
5847   /* Output the marker for the end of the line number info.  */
5848   ASM_OUTPUT_LABEL (asm_out_file, ".LTEND");
5849   ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 0);
5850   if (flag_debug_asm)
5851     fprintf (asm_out_file, "\t%s DW_LNE_end_sequence", ASM_COMMENT_START);
5852
5853   fputc ('\n', asm_out_file);
5854   output_uleb128 (1);
5855   fputc ('\n', asm_out_file);
5856   ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNE_end_sequence);
5857   fputc ('\n', asm_out_file);
5858
5859   function = 0;
5860   current_file = 1;
5861   current_line = 1;
5862   for (lt_index = 0; lt_index < separate_line_info_table_in_use; )
5863     {
5864       register dw_separate_line_info_ref line_info
5865         = &separate_line_info_table[lt_index];
5866
5867 #if 0
5868       /* Don't emit anything for redundant notes.  */
5869       if (line_info->dw_line_num == current_line
5870           && line_info->dw_file_num == current_file
5871           && line_info->function == function)
5872         goto cont;
5873 #endif
5874
5875       /* Emit debug info for the address of the current line.  If this is
5876          a new function, or the first line of a function, then we need
5877          to handle it differently.  */
5878       ASM_GENERATE_INTERNAL_LABEL (line_label, SEPARATE_LINE_CODE_LABEL,
5879                                    lt_index);
5880       if (function != line_info->function)
5881         {
5882           function = line_info->function;
5883
5884           /* Set the address register to the first line in the function */
5885           ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 0);
5886           if (flag_debug_asm)
5887             fprintf (asm_out_file, "\t%s DW_LNE_set_address",
5888                      ASM_COMMENT_START);
5889
5890           fputc ('\n', asm_out_file);
5891           output_uleb128 (1 + PTR_SIZE);
5892           fputc ('\n', asm_out_file);
5893           ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNE_set_address);
5894           fputc ('\n', asm_out_file);
5895           ASM_OUTPUT_DWARF_ADDR (asm_out_file, line_label);
5896           fputc ('\n', asm_out_file);
5897         }
5898       else
5899         {
5900           /* ??? See the DW_LNS_advance_pc comment above.  */
5901           if (0)
5902             {
5903               ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNS_fixed_advance_pc);
5904               if (flag_debug_asm)
5905                 fprintf (asm_out_file, "\t%s DW_LNS_fixed_advance_pc",
5906                          ASM_COMMENT_START);
5907
5908               fputc ('\n', asm_out_file);
5909               ASM_OUTPUT_DWARF_DELTA2 (asm_out_file, line_label,
5910                                        prev_line_label);
5911               fputc ('\n', asm_out_file);
5912             }
5913           else
5914             {
5915               ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 0);
5916               if (flag_debug_asm)
5917                 fprintf (asm_out_file, "\t%s DW_LNE_set_address",
5918                          ASM_COMMENT_START);
5919               fputc ('\n', asm_out_file);
5920               output_uleb128 (1 + PTR_SIZE);
5921               fputc ('\n', asm_out_file);
5922               ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNE_set_address);
5923               fputc ('\n', asm_out_file);
5924               ASM_OUTPUT_DWARF_ADDR (asm_out_file, line_label);
5925               fputc ('\n', asm_out_file);
5926             }
5927         }
5928       strcpy (prev_line_label, line_label);
5929
5930       /* Emit debug info for the source file of the current line, if
5931          different from the previous line.  */
5932       if (line_info->dw_file_num != current_file)
5933         {
5934           current_file = line_info->dw_file_num;
5935           ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNS_set_file);
5936           if (flag_debug_asm)
5937             fprintf (asm_out_file, "\t%s DW_LNS_set_file", ASM_COMMENT_START);
5938
5939           fputc ('\n', asm_out_file);
5940           output_uleb128 (current_file);
5941           if (flag_debug_asm)
5942             fprintf (asm_out_file, " (\"%s\")", file_table[current_file]);
5943
5944           fputc ('\n', asm_out_file);
5945         }
5946
5947       /* Emit debug info for the current line number, choosing the encoding
5948          that uses the least amount of space.  */
5949       if (line_info->dw_line_num != current_line)
5950         {
5951           line_offset = line_info->dw_line_num - current_line;
5952           line_delta = line_offset - DWARF_LINE_BASE;
5953           current_line = line_info->dw_line_num;
5954           if (line_delta >= 0 && line_delta < (DWARF_LINE_RANGE - 1))
5955             {
5956               ASM_OUTPUT_DWARF_DATA1 (asm_out_file,
5957                                       DWARF_LINE_OPCODE_BASE + line_delta);
5958               if (flag_debug_asm)
5959                 fprintf (asm_out_file,
5960                          "\t%s line %ld", ASM_COMMENT_START, current_line);
5961
5962               fputc ('\n', asm_out_file);
5963             }
5964           else
5965             {
5966               ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNS_advance_line);
5967               if (flag_debug_asm)
5968                 fprintf (asm_out_file, "\t%s advance to line %ld",
5969                          ASM_COMMENT_START, current_line);
5970
5971               fputc ('\n', asm_out_file);
5972               output_sleb128 (line_offset);
5973               fputc ('\n', asm_out_file);
5974               ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNS_copy);
5975               if (flag_debug_asm)
5976                 fprintf (asm_out_file, "\t%s DW_LNS_copy", ASM_COMMENT_START);
5977               fputc ('\n', asm_out_file);
5978             }
5979         }
5980       else
5981         {
5982           /* We still need to start a new row, so output a copy insn.  */
5983           ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNS_copy);
5984           if (flag_debug_asm)
5985             fprintf (asm_out_file, "\t%s DW_LNS_copy", ASM_COMMENT_START);
5986           fputc ('\n', asm_out_file);
5987         }
5988
5989 #if 0
5990     cont:
5991 #endif
5992       ++lt_index;
5993
5994       /* If we're done with a function, end its sequence.  */
5995       if (lt_index == separate_line_info_table_in_use
5996           || separate_line_info_table[lt_index].function != function)
5997         {
5998           current_file = 1;
5999           current_line = 1;
6000
6001           /* Emit debug info for the address of the end of the function.  */
6002           ASM_GENERATE_INTERNAL_LABEL (line_label, FUNC_END_LABEL, function);
6003           if (0)
6004             {
6005               ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNS_fixed_advance_pc);
6006               if (flag_debug_asm)
6007                 fprintf (asm_out_file, "\t%s DW_LNS_fixed_advance_pc",
6008                          ASM_COMMENT_START);
6009
6010               fputc ('\n', asm_out_file);
6011               ASM_OUTPUT_DWARF_DELTA2 (asm_out_file, line_label,
6012                                        prev_line_label);
6013               fputc ('\n', asm_out_file);
6014             }
6015           else
6016             {
6017               ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 0);
6018               if (flag_debug_asm)
6019                 fprintf (asm_out_file, "\t%s DW_LNE_set_address",
6020                          ASM_COMMENT_START);
6021               fputc ('\n', asm_out_file);
6022               output_uleb128 (1 + PTR_SIZE);
6023               fputc ('\n', asm_out_file);
6024               ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNE_set_address);
6025               fputc ('\n', asm_out_file);
6026               ASM_OUTPUT_DWARF_ADDR (asm_out_file, line_label);
6027               fputc ('\n', asm_out_file);
6028             }
6029
6030           /* Output the marker for the end of this sequence.  */
6031           ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 0);
6032           if (flag_debug_asm)
6033             fprintf (asm_out_file, "\t%s DW_LNE_end_sequence",
6034                      ASM_COMMENT_START);
6035
6036           fputc ('\n', asm_out_file);
6037           output_uleb128 (1);
6038           fputc ('\n', asm_out_file);
6039           ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNE_end_sequence);
6040           fputc ('\n', asm_out_file);
6041         }
6042     }
6043 }
6044 \f
6045 /* Given a pointer to a BLOCK node return non-zero if (and only if) the node
6046    in question represents the outermost pair of curly braces (i.e. the "body
6047    block") of a function or method.
6048
6049    For any BLOCK node representing a "body block" of a function or method, the
6050    BLOCK_SUPERCONTEXT of the node will point to another BLOCK node which
6051    represents the outermost (function) scope for the function or method (i.e.
6052    the one which includes the formal parameters).  The BLOCK_SUPERCONTEXT of
6053    *that* node in turn will point to the relevant FUNCTION_DECL node. */
6054
6055 static inline int
6056 is_body_block (stmt)
6057      register tree stmt;
6058 {
6059   if (TREE_CODE (stmt) == BLOCK)
6060     {
6061       register tree parent = BLOCK_SUPERCONTEXT (stmt);
6062
6063       if (TREE_CODE (parent) == BLOCK)
6064         {
6065           register tree grandparent = BLOCK_SUPERCONTEXT (parent);
6066
6067           if (TREE_CODE (grandparent) == FUNCTION_DECL)
6068             return 1;
6069         }
6070     }
6071
6072   return 0;
6073 }
6074
6075 /* Given a pointer to a tree node for some base type, return a pointer to
6076    a DIE that describes the given type.
6077
6078    This routine must only be called for GCC type nodes that correspond to
6079    Dwarf base (fundamental) types.  */
6080
6081 static dw_die_ref
6082 base_type_die (type)
6083      register tree type;
6084 {
6085   register dw_die_ref base_type_result;
6086   register const char *type_name;
6087   register enum dwarf_type encoding;
6088   register tree name = TYPE_NAME (type);
6089
6090   if (TREE_CODE (type) == ERROR_MARK
6091       || TREE_CODE (type) == VOID_TYPE)
6092     return 0;
6093
6094   if (name)
6095     {
6096       if (TREE_CODE (name) == TYPE_DECL)
6097         name = DECL_NAME (name);
6098
6099       type_name = IDENTIFIER_POINTER (name);
6100     }
6101   else
6102     type_name = "__unknown__";
6103
6104   switch (TREE_CODE (type))
6105     {
6106     case INTEGER_TYPE:
6107       /* Carefully distinguish the C character types, without messing
6108          up if the language is not C. Note that we check only for the names
6109          that contain spaces; other names might occur by coincidence in other 
6110          languages.  */
6111       if (! (TYPE_PRECISION (type) == CHAR_TYPE_SIZE
6112              && (type == char_type_node
6113                  || ! strcmp (type_name, "signed char")
6114                  || ! strcmp (type_name, "unsigned char"))))
6115         {
6116           if (TREE_UNSIGNED (type))
6117             encoding = DW_ATE_unsigned;
6118           else
6119             encoding = DW_ATE_signed;
6120           break;
6121         }
6122       /* else fall through */
6123
6124     case CHAR_TYPE:
6125       /* GNU Pascal/Ada CHAR type.  Not used in C.  */
6126       if (TREE_UNSIGNED (type))
6127         encoding = DW_ATE_unsigned_char;
6128       else
6129         encoding = DW_ATE_signed_char;
6130       break;
6131
6132     case REAL_TYPE:
6133       encoding = DW_ATE_float;
6134       break;
6135
6136       /* Dwarf2 doesn't know anything about complex ints, so use
6137          a user defined type for it.  */
6138     case COMPLEX_TYPE:
6139       if (TREE_CODE (TREE_TYPE (type)) == REAL_TYPE)
6140         encoding = DW_ATE_complex_float;
6141       else
6142         encoding = DW_ATE_lo_user;
6143       break;
6144
6145     case BOOLEAN_TYPE:
6146       /* GNU FORTRAN/Ada/C++ BOOLEAN type.  */
6147       encoding = DW_ATE_boolean;
6148       break;
6149
6150     default:
6151       abort (); /* No other TREE_CODEs are Dwarf fundamental types.  */
6152     }
6153
6154   base_type_result = new_die (DW_TAG_base_type, comp_unit_die);
6155   if (demangle_name_func)
6156     type_name = (*demangle_name_func) (type_name);
6157
6158   add_AT_string (base_type_result, DW_AT_name, type_name);
6159   add_AT_unsigned (base_type_result, DW_AT_byte_size,
6160                    int_size_in_bytes (type));
6161   add_AT_unsigned (base_type_result, DW_AT_encoding, encoding);
6162
6163   return base_type_result;
6164 }
6165
6166 /* Given a pointer to an arbitrary ..._TYPE tree node, return a pointer to
6167    the Dwarf "root" type for the given input type.  The Dwarf "root" type of
6168    a given type is generally the same as the given type, except that if the
6169    given type is a pointer or reference type, then the root type of the given
6170    type is the root type of the "basis" type for the pointer or reference
6171    type.  (This definition of the "root" type is recursive.) Also, the root
6172    type of a `const' qualified type or a `volatile' qualified type is the
6173    root type of the given type without the qualifiers.  */
6174
6175 static tree
6176 root_type (type)
6177      register tree type;
6178 {
6179   if (TREE_CODE (type) == ERROR_MARK)
6180     return error_mark_node;
6181
6182   switch (TREE_CODE (type))
6183     {
6184     case ERROR_MARK:
6185       return error_mark_node;
6186
6187     case POINTER_TYPE:
6188     case REFERENCE_TYPE:
6189       return type_main_variant (root_type (TREE_TYPE (type)));
6190
6191     default:
6192       return type_main_variant (type);
6193     }
6194 }
6195
6196 /* Given a pointer to an arbitrary ..._TYPE tree node, return non-zero if the
6197    given input type is a Dwarf "fundamental" type.  Otherwise return null.  */
6198
6199 static inline int
6200 is_base_type (type)
6201      register tree type;
6202 {
6203   switch (TREE_CODE (type))
6204     {
6205     case ERROR_MARK:
6206     case VOID_TYPE:
6207     case INTEGER_TYPE:
6208     case REAL_TYPE:
6209     case COMPLEX_TYPE:
6210     case BOOLEAN_TYPE:
6211     case CHAR_TYPE:
6212       return 1;
6213
6214     case SET_TYPE:
6215     case ARRAY_TYPE:
6216     case RECORD_TYPE:
6217     case UNION_TYPE:
6218     case QUAL_UNION_TYPE:
6219     case ENUMERAL_TYPE:
6220     case FUNCTION_TYPE:
6221     case METHOD_TYPE:
6222     case POINTER_TYPE:
6223     case REFERENCE_TYPE:
6224     case FILE_TYPE:
6225     case OFFSET_TYPE:
6226     case LANG_TYPE:
6227       return 0;
6228
6229     default:
6230       abort ();
6231     }
6232
6233   return 0;
6234 }
6235
6236 /* Given a pointer to an arbitrary ..._TYPE tree node, return a debugging
6237    entry that chains various modifiers in front of the given type.  */
6238
6239 static dw_die_ref
6240 modified_type_die (type, is_const_type, is_volatile_type, context_die)
6241      register tree type;
6242      register int is_const_type;
6243      register int is_volatile_type;
6244      register dw_die_ref context_die;
6245 {
6246   register enum tree_code code = TREE_CODE (type);
6247   register dw_die_ref mod_type_die = NULL;
6248   register dw_die_ref sub_die = NULL;
6249   register tree item_type = NULL;
6250
6251   if (code != ERROR_MARK)
6252     {
6253       type = build_type_variant (type, is_const_type, is_volatile_type);
6254
6255       mod_type_die = lookup_type_die (type);
6256       if (mod_type_die)
6257         return mod_type_die;
6258
6259       /* Handle C typedef types. */
6260       if (TYPE_NAME (type) && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
6261           && DECL_ORIGINAL_TYPE (TYPE_NAME (type)))
6262         {
6263           tree dtype = TREE_TYPE (TYPE_NAME (type));
6264           if (type == dtype)
6265             {
6266               /* For a named type, use the typedef.  */
6267               gen_type_die (type, context_die);
6268               mod_type_die = lookup_type_die (type);
6269             }
6270
6271           else if (is_const_type < TYPE_READONLY (dtype)
6272                    || is_volatile_type < TYPE_VOLATILE (dtype))
6273             /* cv-unqualified version of named type.  Just use the unnamed
6274                type to which it refers.  */
6275             mod_type_die
6276               = modified_type_die (DECL_ORIGINAL_TYPE (TYPE_NAME (type)),
6277                                    is_const_type, is_volatile_type,
6278                                    context_die);
6279           /* Else cv-qualified version of named type; fall through.  */
6280         }
6281
6282       if (mod_type_die)
6283         /* OK */;
6284       else if (is_const_type)
6285         {
6286           mod_type_die = new_die (DW_TAG_const_type, comp_unit_die);
6287           sub_die = modified_type_die (type, 0, is_volatile_type, context_die);
6288         }
6289       else if (is_volatile_type)
6290         {
6291           mod_type_die = new_die (DW_TAG_volatile_type, comp_unit_die);
6292           sub_die = modified_type_die (type, 0, 0, context_die);
6293         }
6294       else if (code == POINTER_TYPE)
6295         {
6296           mod_type_die = new_die (DW_TAG_pointer_type, comp_unit_die);
6297           add_AT_unsigned (mod_type_die, DW_AT_byte_size, PTR_SIZE);
6298 #if 0
6299           add_AT_unsigned (mod_type_die, DW_AT_address_class, 0);
6300 #endif
6301           item_type = TREE_TYPE (type);
6302         }
6303       else if (code == REFERENCE_TYPE)
6304         {
6305           mod_type_die = new_die (DW_TAG_reference_type, comp_unit_die);
6306           add_AT_unsigned (mod_type_die, DW_AT_byte_size, PTR_SIZE);
6307 #if 0
6308           add_AT_unsigned (mod_type_die, DW_AT_address_class, 0);
6309 #endif 
6310           item_type = TREE_TYPE (type);
6311         }
6312       else if (is_base_type (type))
6313         mod_type_die = base_type_die (type);
6314       else
6315         {
6316           gen_type_die (type, context_die);
6317
6318           /* We have to get the type_main_variant here (and pass that to the
6319              `lookup_type_die' routine) because the ..._TYPE node we have
6320              might simply be a *copy* of some original type node (where the
6321              copy was created to help us keep track of typedef names) and
6322              that copy might have a different TYPE_UID from the original
6323              ..._TYPE node.  */
6324           mod_type_die = lookup_type_die (type_main_variant (type));
6325           if (mod_type_die == NULL)
6326             abort ();
6327         }
6328     }
6329
6330   equate_type_number_to_die (type, mod_type_die);
6331   if (item_type)
6332     /* We must do this after the equate_type_number_to_die call, in case
6333        this is a recursive type.  This ensures that the modified_type_die
6334        recursion will terminate even if the type is recursive.  Recursive
6335        types are possible in Ada.  */
6336     sub_die = modified_type_die (item_type,
6337                                  TYPE_READONLY (item_type),
6338                                  TYPE_VOLATILE (item_type),
6339                                  context_die);
6340
6341   if (sub_die != NULL)
6342     add_AT_die_ref (mod_type_die, DW_AT_type, sub_die);
6343
6344   return mod_type_die;
6345 }
6346
6347 /* Given a pointer to an arbitrary ..._TYPE tree node, return true if it is
6348    an enumerated type.   */
6349
6350 static inline int
6351 type_is_enum (type)
6352      register tree type;
6353 {
6354   return TREE_CODE (type) == ENUMERAL_TYPE;
6355 }
6356
6357 /* Return a location descriptor that designates a machine register.  */
6358
6359 static dw_loc_descr_ref
6360 reg_loc_descriptor (rtl)
6361      register rtx rtl;
6362 {
6363   register dw_loc_descr_ref loc_result = NULL;
6364   register unsigned reg = reg_number (rtl);
6365
6366   if (reg <= 31)
6367     loc_result = new_loc_descr (DW_OP_reg0 + reg, 0, 0);
6368   else
6369     loc_result = new_loc_descr (DW_OP_regx, reg, 0);
6370
6371   return loc_result;
6372 }
6373
6374 /* Return a location descriptor that designates a base+offset location.  */
6375
6376 static dw_loc_descr_ref
6377 based_loc_descr (reg, offset)
6378      unsigned reg;
6379      long int offset;
6380 {
6381   register dw_loc_descr_ref loc_result;
6382   /* For the "frame base", we use the frame pointer or stack pointer
6383      registers, since the RTL for local variables is relative to one of
6384      them.  */
6385   register unsigned fp_reg = DBX_REGISTER_NUMBER (frame_pointer_needed
6386                                                   ? HARD_FRAME_POINTER_REGNUM
6387                                                   : STACK_POINTER_REGNUM);
6388
6389   if (reg == fp_reg)
6390     loc_result = new_loc_descr (DW_OP_fbreg, offset, 0);
6391   else if (reg <= 31)
6392     loc_result = new_loc_descr (DW_OP_breg0 + reg, offset, 0);
6393   else
6394     loc_result = new_loc_descr (DW_OP_bregx, reg, offset);
6395
6396   return loc_result;
6397 }
6398
6399 /* Return true if this RTL expression describes a base+offset calculation.  */
6400
6401 static inline int
6402 is_based_loc (rtl)
6403      register rtx rtl;
6404 {
6405     return (GET_CODE (rtl) == PLUS
6406             && ((GET_CODE (XEXP (rtl, 0)) == REG
6407                  && GET_CODE (XEXP (rtl, 1)) == CONST_INT)));
6408 }
6409
6410 /* The following routine converts the RTL for a variable or parameter
6411    (resident in memory) into an equivalent Dwarf representation of a
6412    mechanism for getting the address of that same variable onto the top of a
6413    hypothetical "address evaluation" stack.
6414
6415    When creating memory location descriptors, we are effectively transforming
6416    the RTL for a memory-resident object into its Dwarf postfix expression
6417    equivalent.  This routine recursively descends an RTL tree, turning
6418    it into Dwarf postfix code as it goes.
6419
6420    MODE is the mode of the memory reference, needed to handle some
6421    autoincrement addressing modes.  */
6422
6423 static dw_loc_descr_ref
6424 mem_loc_descriptor (rtl, mode)
6425      register rtx rtl;
6426      enum machine_mode mode;
6427 {
6428   dw_loc_descr_ref mem_loc_result = NULL;
6429   /* Note that for a dynamically sized array, the location we will generate a 
6430      description of here will be the lowest numbered location which is
6431      actually within the array.  That's *not* necessarily the same as the
6432      zeroth element of the array.  */
6433
6434   switch (GET_CODE (rtl))
6435     {
6436     case POST_INC:
6437     case POST_DEC:
6438       /* POST_INC and POST_DEC can be handled just like a SUBREG.  So we
6439          just fall into the SUBREG code.  */
6440
6441       /* ... fall through ... */
6442
6443     case SUBREG:
6444       /* The case of a subreg may arise when we have a local (register)
6445          variable or a formal (register) parameter which doesn't quite fill
6446          up an entire register.  For now, just assume that it is
6447          legitimate to make the Dwarf info refer to the whole register which
6448          contains the given subreg.  */
6449       rtl = XEXP (rtl, 0);
6450
6451       /* ... fall through ... */
6452
6453     case REG:
6454       /* Whenever a register number forms a part of the description of the
6455          method for calculating the (dynamic) address of a memory resident
6456          object, DWARF rules require the register number be referred to as 
6457          a "base register".  This distinction is not based in any way upon
6458          what category of register the hardware believes the given register
6459          belongs to.  This is strictly DWARF terminology we're dealing with
6460          here. Note that in cases where the location of a memory-resident
6461          data object could be expressed as: OP_ADD (OP_BASEREG (basereg),
6462          OP_CONST (0)) the actual DWARF location descriptor that we generate
6463          may just be OP_BASEREG (basereg).  This may look deceptively like
6464          the object in question was allocated to a register (rather than in
6465          memory) so DWARF consumers need to be aware of the subtle
6466          distinction between OP_REG and OP_BASEREG.  */
6467       mem_loc_result = based_loc_descr (reg_number (rtl), 0);
6468       break;
6469
6470     case MEM:
6471       mem_loc_result = mem_loc_descriptor (XEXP (rtl, 0), mode);
6472       add_loc_descr (&mem_loc_result, new_loc_descr (DW_OP_deref, 0, 0));
6473       break;
6474
6475      case LABEL_REF:
6476        /* Some ports can transform a symbol ref into a label ref, because
6477          the symbol ref is too far away and has to be dumped into a constant
6478          pool.  */
6479     case CONST:
6480     case SYMBOL_REF:
6481       mem_loc_result = new_loc_descr (DW_OP_addr, 0, 0);
6482       mem_loc_result->dw_loc_oprnd1.val_class = dw_val_class_addr;
6483       mem_loc_result->dw_loc_oprnd1.v.val_addr = addr_to_string (rtl);
6484       break;
6485
6486     case PRE_INC:
6487     case PRE_DEC:
6488       /* Turn these into a PLUS expression and fall into the PLUS code
6489          below.  */
6490       rtl = gen_rtx_PLUS (word_mode, XEXP (rtl, 0),
6491                           GEN_INT (GET_CODE (rtl) == PRE_INC
6492                                    ? GET_MODE_UNIT_SIZE (mode) 
6493                                    : - GET_MODE_UNIT_SIZE (mode)));
6494                           
6495       /* ... fall through ... */
6496
6497     case PLUS:
6498       if (is_based_loc (rtl))
6499         mem_loc_result = based_loc_descr (reg_number (XEXP (rtl, 0)),
6500                                           INTVAL (XEXP (rtl, 1)));
6501       else
6502         {
6503           add_loc_descr (&mem_loc_result, mem_loc_descriptor (XEXP (rtl, 0),
6504                                                               mode));
6505           add_loc_descr (&mem_loc_result, mem_loc_descriptor (XEXP (rtl, 1),
6506                                                               mode));
6507           add_loc_descr (&mem_loc_result, new_loc_descr (DW_OP_plus, 0, 0));
6508         }
6509       break;
6510
6511     case MULT:
6512       /* If a pseudo-reg is optimized away, it is possible for it to
6513          be replaced with a MEM containing a multiply.  */
6514       add_loc_descr (&mem_loc_result, mem_loc_descriptor (XEXP (rtl, 0), mode));
6515       add_loc_descr (&mem_loc_result, mem_loc_descriptor (XEXP (rtl, 1), mode));
6516       add_loc_descr (&mem_loc_result, new_loc_descr (DW_OP_mul, 0, 0));
6517       break;
6518
6519     case CONST_INT:
6520       mem_loc_result = new_loc_descr (DW_OP_constu, INTVAL (rtl), 0);
6521       break;
6522
6523     default:
6524       abort ();
6525     }
6526
6527   return mem_loc_result;
6528 }
6529
6530 /* Return a descriptor that describes the concatenation of two locations.
6531    This is typically a complex variable.  */
6532
6533 static dw_loc_descr_ref
6534 concat_loc_descriptor (x0, x1)
6535      register rtx x0, x1;
6536 {
6537   dw_loc_descr_ref cc_loc_result = NULL;
6538
6539   if (!is_pseudo_reg (x0)
6540       && (GET_CODE (x0) != MEM || !is_pseudo_reg (XEXP (x0, 0))))
6541     add_loc_descr (&cc_loc_result, loc_descriptor (x0));
6542   add_loc_descr (&cc_loc_result,
6543                  new_loc_descr (DW_OP_piece, GET_MODE_SIZE (GET_MODE (x0)), 0));
6544
6545   if (!is_pseudo_reg (x1)
6546       && (GET_CODE (x1) != MEM || !is_pseudo_reg (XEXP (x1, 0))))
6547     add_loc_descr (&cc_loc_result, loc_descriptor (x1));
6548   add_loc_descr (&cc_loc_result,
6549                  new_loc_descr (DW_OP_piece, GET_MODE_SIZE (GET_MODE (x1)), 0));
6550
6551   return cc_loc_result;
6552 }
6553
6554 /* Output a proper Dwarf location descriptor for a variable or parameter
6555    which is either allocated in a register or in a memory location.  For a
6556    register, we just generate an OP_REG and the register number.  For a
6557    memory location we provide a Dwarf postfix expression describing how to
6558    generate the (dynamic) address of the object onto the address stack.  */
6559
6560 static dw_loc_descr_ref
6561 loc_descriptor (rtl)
6562      register rtx rtl;
6563 {
6564   dw_loc_descr_ref loc_result = NULL;
6565   switch (GET_CODE (rtl))
6566     {
6567     case SUBREG:
6568       /* The case of a subreg may arise when we have a local (register)
6569          variable or a formal (register) parameter which doesn't quite fill
6570          up an entire register.  For now, just assume that it is
6571          legitimate to make the Dwarf info refer to the whole register which
6572          contains the given subreg.  */
6573       rtl = XEXP (rtl, 0);
6574
6575       /* ... fall through ... */
6576
6577     case REG:
6578       loc_result = reg_loc_descriptor (rtl);
6579       break;
6580
6581     case MEM:
6582       loc_result = mem_loc_descriptor (XEXP (rtl, 0), GET_MODE (rtl));
6583       break;
6584
6585     case CONCAT:
6586       loc_result = concat_loc_descriptor (XEXP (rtl, 0), XEXP (rtl, 1));
6587       break;
6588
6589     default:
6590       abort ();
6591     }
6592
6593   return loc_result;
6594 }
6595
6596 /* Given an unsigned value, round it up to the lowest multiple of `boundary'
6597    which is not less than the value itself.  */
6598
6599 static inline unsigned
6600 ceiling (value, boundary)
6601      register unsigned value;
6602      register unsigned boundary;
6603 {
6604   return (((value + boundary - 1) / boundary) * boundary);
6605 }
6606
6607 /* Given a pointer to what is assumed to be a FIELD_DECL node, return a
6608    pointer to the declared type for the relevant field variable, or return
6609    `integer_type_node' if the given node turns out to be an
6610    ERROR_MARK node.  */
6611
6612 static inline tree
6613 field_type (decl)
6614      register tree decl;
6615 {
6616   register tree type;
6617
6618   if (TREE_CODE (decl) == ERROR_MARK)
6619     return integer_type_node;
6620
6621   type = DECL_BIT_FIELD_TYPE (decl);
6622   if (type == NULL_TREE)
6623     type = TREE_TYPE (decl);
6624
6625   return type;
6626 }
6627
6628 /* Given a pointer to a tree node, assumed to be some kind of a ..._TYPE
6629    node, return the alignment in bits for the type, or else return
6630    BITS_PER_WORD if the node actually turns out to be an
6631    ERROR_MARK node.  */
6632
6633 static inline unsigned
6634 simple_type_align_in_bits (type)
6635      register tree type;
6636 {
6637   return (TREE_CODE (type) != ERROR_MARK) ? TYPE_ALIGN (type) : BITS_PER_WORD;
6638 }
6639
6640 /* Given a pointer to a tree node, assumed to be some kind of a ..._TYPE
6641    node, return the size in bits for the type if it is a constant, or else
6642    return the alignment for the type if the type's size is not constant, or
6643    else return BITS_PER_WORD if the type actually turns out to be an
6644    ERROR_MARK node.  */
6645
6646 static inline unsigned
6647 simple_type_size_in_bits (type)
6648      register tree type;
6649 {
6650   if (TREE_CODE (type) == ERROR_MARK)
6651     return BITS_PER_WORD;
6652   else
6653     {
6654       register tree type_size_tree = TYPE_SIZE (type);
6655
6656       if (TREE_CODE (type_size_tree) != INTEGER_CST)
6657         return TYPE_ALIGN (type);
6658
6659       return (unsigned) TREE_INT_CST_LOW (type_size_tree);
6660     }
6661 }
6662
6663 /* Given a pointer to what is assumed to be a FIELD_DECL node, compute and
6664    return the byte offset of the lowest addressed byte of the "containing
6665    object" for the given FIELD_DECL, or return 0 if we are unable to
6666    determine what that offset is, either because the argument turns out to
6667    be a pointer to an ERROR_MARK node, or because the offset is actually
6668    variable.  (We can't handle the latter case just yet).  */
6669
6670 static unsigned
6671 field_byte_offset (decl)
6672      register tree decl;
6673 {
6674   register unsigned type_align_in_bytes;
6675   register unsigned type_align_in_bits;
6676   register unsigned type_size_in_bits;
6677   register unsigned object_offset_in_align_units;
6678   register unsigned object_offset_in_bits;
6679   register unsigned object_offset_in_bytes;
6680   register tree type;
6681   register tree bitpos_tree;
6682   register tree field_size_tree;
6683   register unsigned bitpos_int;
6684   register unsigned deepest_bitpos;
6685   register unsigned field_size_in_bits;
6686
6687   if (TREE_CODE (decl) == ERROR_MARK)
6688     return 0;
6689
6690   if (TREE_CODE (decl) != FIELD_DECL)
6691     abort ();
6692
6693   type = field_type (decl);
6694
6695   bitpos_tree = DECL_FIELD_BITPOS (decl);
6696   field_size_tree = DECL_SIZE (decl);
6697
6698   /* We cannot yet cope with fields whose positions are variable, so 
6699      for now, when we see such things, we simply return 0.  Someday, we may
6700      be able to handle such cases, but it will be damn difficult.  */
6701   if (TREE_CODE (bitpos_tree) != INTEGER_CST)
6702     return 0;
6703
6704   bitpos_int = (unsigned) TREE_INT_CST_LOW (bitpos_tree);
6705
6706     /* If we don't know the size of the field, pretend it's a full word.  */
6707   if (TREE_CODE (field_size_tree) == INTEGER_CST)
6708     field_size_in_bits = (unsigned) TREE_INT_CST_LOW (field_size_tree);
6709   else
6710     field_size_in_bits = BITS_PER_WORD;
6711
6712   type_size_in_bits = simple_type_size_in_bits (type);
6713   type_align_in_bits = simple_type_align_in_bits (type);
6714   type_align_in_bytes = type_align_in_bits / BITS_PER_UNIT;
6715
6716   /* Note that the GCC front-end doesn't make any attempt to keep track of
6717      the starting bit offset (relative to the start of the containing
6718      structure type) of the hypothetical "containing object" for a bit-
6719      field.  Thus, when computing the byte offset value for the start of the
6720      "containing object" of a bit-field, we must deduce this information on 
6721      our own. This can be rather tricky to do in some cases.  For example,
6722      handling the following structure type definition when compiling for an
6723      i386/i486 target (which only aligns long long's to 32-bit boundaries)
6724      can be very tricky:
6725
6726          struct S { int field1; long long field2:31; };
6727
6728      Fortunately, there is a simple rule-of-thumb which can be
6729      used in such cases.  When compiling for an i386/i486, GCC will allocate
6730      8 bytes for the structure shown above.  It decides to do this based upon 
6731      one simple rule for bit-field allocation.  Quite simply, GCC allocates
6732      each "containing object" for each bit-field at the first (i.e. lowest
6733      addressed) legitimate alignment boundary (based upon the required
6734      minimum alignment for the declared type of the field) which it can
6735      possibly use, subject to the condition that there is still enough
6736      available space remaining in the containing object (when allocated at
6737      the selected point) to fully accommodate all of the bits of the
6738      bit-field itself.  This simple rule makes it obvious why GCC allocates
6739      8 bytes for each object of the structure type shown above.  When looking
6740      for a place to allocate the "containing object" for `field2', the
6741      compiler simply tries to allocate a 64-bit "containing object" at each
6742      successive 32-bit boundary (starting at zero) until it finds a place to
6743      allocate that 64- bit field such that at least 31 contiguous (and
6744      previously unallocated) bits remain within that selected 64 bit field.
6745      (As it turns out, for the example above, the compiler finds that it is
6746      OK to allocate the "containing object" 64-bit field at bit-offset zero
6747      within the structure type.) Here we attempt to work backwards from the
6748      limited set of facts we're given, and we try to deduce from those facts, 
6749      where GCC must have believed that the containing object started (within
6750      the structure type). The value we deduce is then used (by the callers of 
6751      this routine) to generate DW_AT_location and DW_AT_bit_offset attributes 
6752      for fields (both bit-fields and, in the case of DW_AT_location, regular
6753      fields as well).  */
6754
6755   /* Figure out the bit-distance from the start of the structure to the
6756      "deepest" bit of the bit-field.  */
6757   deepest_bitpos = bitpos_int + field_size_in_bits;
6758
6759   /* This is the tricky part.  Use some fancy footwork to deduce where the
6760      lowest addressed bit of the containing object must be.  */
6761   object_offset_in_bits
6762     = ceiling (deepest_bitpos, type_align_in_bits) - type_size_in_bits;
6763
6764   /* Compute the offset of the containing object in "alignment units".  */
6765   object_offset_in_align_units = object_offset_in_bits / type_align_in_bits;
6766
6767   /* Compute the offset of the containing object in bytes.  */
6768   object_offset_in_bytes = object_offset_in_align_units * type_align_in_bytes;
6769
6770   return object_offset_in_bytes;
6771 }
6772 \f
6773 /* The following routines define various Dwarf attributes and any data
6774    associated with them.  */
6775
6776 /* Add a location description attribute value to a DIE.
6777
6778    This emits location attributes suitable for whole variables and
6779    whole parameters.  Note that the location attributes for struct fields are
6780    generated by the routine `data_member_location_attribute' below.  */
6781
6782 static void
6783 add_AT_location_description (die, attr_kind, rtl)
6784      dw_die_ref die;
6785      enum dwarf_attribute attr_kind;
6786      register rtx rtl;
6787 {
6788   /* Handle a special case.  If we are about to output a location descriptor
6789      for a variable or parameter which has been optimized out of existence,
6790      don't do that.  A variable which has been optimized out
6791      of existence will have a DECL_RTL value which denotes a pseudo-reg.
6792      Currently, in some rare cases, variables can have DECL_RTL values which
6793      look like (MEM (REG pseudo-reg#)).  These cases are due to bugs
6794      elsewhere in the compiler.  We treat such cases as if the variable(s) in 
6795      question had been optimized out of existence.  */
6796
6797   if (is_pseudo_reg (rtl)
6798       || (GET_CODE (rtl) == MEM
6799           && is_pseudo_reg (XEXP (rtl, 0)))
6800       /* This can happen for a PARM_DECL with a DECL_INCOMING_RTL which 
6801          references the internal argument pointer (a pseudo) in a function
6802          where all references to the internal argument pointer were
6803          eliminated via the optimizers.  */
6804       || (GET_CODE (rtl) == MEM
6805           && GET_CODE (XEXP (rtl, 0)) == PLUS
6806           && is_pseudo_reg (XEXP (XEXP (rtl, 0), 0)))
6807       || (GET_CODE (rtl) == CONCAT
6808           && is_pseudo_reg (XEXP (rtl, 0))
6809           && is_pseudo_reg (XEXP (rtl, 1))))
6810     return;
6811
6812   add_AT_loc (die, attr_kind, loc_descriptor (rtl));
6813 }
6814
6815 /* Attach the specialized form of location attribute used for data
6816    members of struct and union types.  In the special case of a
6817    FIELD_DECL node which represents a bit-field, the "offset" part
6818    of this special location descriptor must indicate the distance
6819    in bytes from the lowest-addressed byte of the containing struct
6820    or union type to the lowest-addressed byte of the "containing
6821    object" for the bit-field.  (See the `field_byte_offset' function
6822    above).. For any given bit-field, the "containing object" is a
6823    hypothetical object (of some integral or enum type) within which
6824    the given bit-field lives.  The type of this hypothetical
6825    "containing object" is always the same as the declared type of
6826    the individual bit-field itself (for GCC anyway... the DWARF
6827    spec doesn't actually mandate this).  Note that it is the size
6828    (in bytes) of the hypothetical "containing object" which will
6829    be given in the DW_AT_byte_size attribute for this bit-field.
6830    (See the `byte_size_attribute' function below.)  It is also used
6831    when calculating the value of the DW_AT_bit_offset attribute.
6832    (See the `bit_offset_attribute' function below).  */
6833
6834 static void
6835 add_data_member_location_attribute (die, decl)
6836      register dw_die_ref die;
6837      register tree decl;
6838 {
6839   register unsigned long offset;
6840   register dw_loc_descr_ref loc_descr;
6841   register enum dwarf_location_atom op;
6842
6843   if (TREE_CODE (decl) == TREE_VEC)
6844     offset = TREE_INT_CST_LOW (BINFO_OFFSET (decl));
6845   else
6846     offset = field_byte_offset (decl);
6847
6848   /* The DWARF2 standard says that we should assume that the structure address
6849      is already on the stack, so we can specify a structure field address
6850      by using DW_OP_plus_uconst.  */
6851
6852 #ifdef MIPS_DEBUGGING_INFO
6853   /* ??? The SGI dwarf reader does not handle the DW_OP_plus_uconst operator
6854      correctly.  It works only if we leave the offset on the stack.  */
6855   op = DW_OP_constu;
6856 #else
6857   op = DW_OP_plus_uconst;
6858 #endif
6859
6860   loc_descr = new_loc_descr (op, offset, 0);
6861   add_AT_loc (die, DW_AT_data_member_location, loc_descr);
6862 }
6863
6864 /* Attach an DW_AT_const_value attribute for a variable or a parameter which
6865    does not have a "location" either in memory or in a register.  These
6866    things can arise in GNU C when a constant is passed as an actual parameter
6867    to an inlined function.  They can also arise in C++ where declared
6868    constants do not necessarily get memory "homes".  */
6869
6870 static void
6871 add_const_value_attribute (die, rtl)
6872      register dw_die_ref die;
6873      register rtx rtl;
6874 {
6875   switch (GET_CODE (rtl))
6876     {
6877     case CONST_INT:
6878       /* Note that a CONST_INT rtx could represent either an integer or a
6879          floating-point constant.  A CONST_INT is used whenever the constant
6880          will fit into a single word.  In all such cases, the original mode
6881          of the constant value is wiped out, and the CONST_INT rtx is
6882          assigned VOIDmode.  */
6883       add_AT_unsigned (die, DW_AT_const_value, (unsigned) INTVAL (rtl));
6884       break;
6885
6886     case CONST_DOUBLE:
6887       /* Note that a CONST_DOUBLE rtx could represent either an integer or a
6888          floating-point constant.  A CONST_DOUBLE is used whenever the
6889          constant requires more than one word in order to be adequately
6890          represented.  We output CONST_DOUBLEs as blocks.  */
6891       {
6892         register enum machine_mode mode = GET_MODE (rtl);
6893
6894         if (GET_MODE_CLASS (mode) == MODE_FLOAT)
6895           {
6896             register unsigned length = GET_MODE_SIZE (mode) / sizeof (long);
6897             long array[4];
6898             REAL_VALUE_TYPE rv;
6899
6900             REAL_VALUE_FROM_CONST_DOUBLE (rv, rtl);
6901             switch (mode)
6902               {
6903               case SFmode:
6904                 REAL_VALUE_TO_TARGET_SINGLE (rv, array[0]);
6905                 break;
6906
6907               case DFmode:
6908                 REAL_VALUE_TO_TARGET_DOUBLE (rv, array);
6909                 break;
6910
6911               case XFmode:
6912               case TFmode:
6913                 REAL_VALUE_TO_TARGET_LONG_DOUBLE (rv, array);
6914                 break;
6915
6916               default:
6917                 abort ();
6918               }
6919
6920             add_AT_float (die, DW_AT_const_value, length, array);
6921           }
6922         else
6923           add_AT_long_long (die, DW_AT_const_value,
6924                             CONST_DOUBLE_HIGH (rtl), CONST_DOUBLE_LOW (rtl));
6925       }
6926       break;
6927
6928     case CONST_STRING:
6929       add_AT_string (die, DW_AT_const_value, XSTR (rtl, 0));
6930       break;
6931
6932     case SYMBOL_REF:
6933     case LABEL_REF:
6934     case CONST:
6935       add_AT_addr (die, DW_AT_const_value, addr_to_string (rtl));
6936       break;
6937
6938     case PLUS:
6939       /* In cases where an inlined instance of an inline function is passed
6940          the address of an `auto' variable (which is local to the caller) we
6941          can get a situation where the DECL_RTL of the artificial local
6942          variable (for the inlining) which acts as a stand-in for the
6943          corresponding formal parameter (of the inline function) will look
6944          like (plus:SI (reg:SI FRAME_PTR) (const_int ...)).  This is not
6945          exactly a compile-time constant expression, but it isn't the address 
6946          of the (artificial) local variable either.  Rather, it represents the 
6947          *value* which the artificial local variable always has during its
6948          lifetime.  We currently have no way to represent such quasi-constant 
6949          values in Dwarf, so for now we just punt and generate nothing.  */
6950       break;
6951
6952     default:
6953       /* No other kinds of rtx should be possible here.  */
6954       abort ();
6955     }
6956
6957 }
6958
6959 /* Generate *either* an DW_AT_location attribute or else an DW_AT_const_value
6960    data attribute for a variable or a parameter.  We generate the
6961    DW_AT_const_value attribute only in those cases where the given variable
6962    or parameter does not have a true "location" either in memory or in a
6963    register.  This can happen (for example) when a constant is passed as an
6964    actual argument in a call to an inline function.  (It's possible that
6965    these things can crop up in other ways also.)  Note that one type of
6966    constant value which can be passed into an inlined function is a constant
6967    pointer.  This can happen for example if an actual argument in an inlined
6968    function call evaluates to a compile-time constant address.  */
6969
6970 static void
6971 add_location_or_const_value_attribute (die, decl)
6972      register dw_die_ref die;
6973      register tree decl;
6974 {
6975   register rtx rtl;
6976   register tree declared_type;
6977   register tree passed_type;
6978
6979   if (TREE_CODE (decl) == ERROR_MARK)
6980     return;
6981
6982   if (TREE_CODE (decl) != VAR_DECL && TREE_CODE (decl) != PARM_DECL)
6983     abort ();
6984
6985   /* Here we have to decide where we are going to say the parameter "lives"
6986      (as far as the debugger is concerned).  We only have a couple of
6987      choices.  GCC provides us with DECL_RTL and with DECL_INCOMING_RTL.
6988
6989      DECL_RTL normally indicates where the parameter lives during most of the 
6990      activation of the function.  If optimization is enabled however, this
6991      could be either NULL or else a pseudo-reg.  Both of those cases indicate 
6992      that the parameter doesn't really live anywhere (as far as the code
6993      generation parts of GCC are concerned) during most of the function's
6994      activation.  That will happen (for example) if the parameter is never
6995      referenced within the function.
6996
6997      We could just generate a location descriptor here for all non-NULL
6998      non-pseudo values of DECL_RTL and ignore all of the rest, but we can be
6999      a little nicer than that if we also consider DECL_INCOMING_RTL in cases
7000      where DECL_RTL is NULL or is a pseudo-reg.
7001
7002      Note however that we can only get away with using DECL_INCOMING_RTL as
7003      a backup substitute for DECL_RTL in certain limited cases.  In cases
7004      where DECL_ARG_TYPE (decl) indicates the same type as TREE_TYPE (decl),
7005      we can be sure that the parameter was passed using the same type as it is
7006      declared to have within the function, and that its DECL_INCOMING_RTL
7007      points us to a place where a value of that type is passed.
7008
7009      In cases where DECL_ARG_TYPE (decl) and TREE_TYPE (decl) are different,
7010      we cannot (in general) use DECL_INCOMING_RTL as a substitute for DECL_RTL
7011      because in these cases DECL_INCOMING_RTL points us to a value of some
7012      type which is *different* from the type of the parameter itself.  Thus,
7013      if we tried to use DECL_INCOMING_RTL to generate a location attribute in
7014      such cases, the debugger would end up (for example) trying to fetch a
7015      `float' from a place which actually contains the first part of a
7016      `double'.  That would lead to really incorrect and confusing
7017      output at debug-time.
7018
7019      So, in general, we *do not* use DECL_INCOMING_RTL as a backup for DECL_RTL
7020      in cases where DECL_ARG_TYPE (decl) != TREE_TYPE (decl).  There
7021      are a couple of exceptions however.  On little-endian machines we can
7022      get away with using DECL_INCOMING_RTL even when DECL_ARG_TYPE (decl) is
7023      not the same as TREE_TYPE (decl), but only when DECL_ARG_TYPE (decl) is
7024      an integral type that is smaller than TREE_TYPE (decl). These cases arise
7025      when (on a little-endian machine) a non-prototyped function has a
7026      parameter declared to be of type `short' or `char'.  In such cases,
7027      TREE_TYPE (decl) will be `short' or `char', DECL_ARG_TYPE (decl) will
7028      be `int', and DECL_INCOMING_RTL will point to the lowest-order byte of the
7029      passed `int' value.  If the debugger then uses that address to fetch
7030      a `short' or a `char' (on a little-endian machine) the result will be
7031      the correct data, so we allow for such exceptional cases below.
7032
7033      Note that our goal here is to describe the place where the given formal
7034      parameter lives during most of the function's activation (i.e. between
7035      the end of the prologue and the start of the epilogue).  We'll do that
7036      as best as we can. Note however that if the given formal parameter is
7037      modified sometime during the execution of the function, then a stack
7038      backtrace (at debug-time) will show the function as having been
7039      called with the *new* value rather than the value which was
7040      originally passed in.  This happens rarely enough that it is not
7041      a major problem, but it *is* a problem, and I'd like to fix it.
7042
7043      A future version of dwarf2out.c may generate two additional
7044      attributes for any given DW_TAG_formal_parameter DIE which will
7045      describe the "passed type" and the "passed location" for the
7046      given formal parameter in addition to the attributes we now
7047      generate to indicate the "declared type" and the "active
7048      location" for each parameter.  This additional set of attributes
7049      could be used by debuggers for stack backtraces. Separately, note
7050      that sometimes DECL_RTL can be NULL and DECL_INCOMING_RTL can be
7051      NULL also.  This happens (for example) for inlined-instances of
7052      inline function formal parameters which are never referenced.
7053      This really shouldn't be happening.  All PARM_DECL nodes should
7054      get valid non-NULL DECL_INCOMING_RTL values, but integrate.c
7055      doesn't currently generate these values for inlined instances of
7056      inline function parameters, so when we see such cases, we are
7057      just out-of-luck for the time being (until integrate.c
7058      gets fixed).  */
7059
7060   /* Use DECL_RTL as the "location" unless we find something better.  */
7061   rtl = DECL_RTL (decl);
7062
7063   if (TREE_CODE (decl) == PARM_DECL)
7064     {
7065       if (rtl == NULL_RTX || is_pseudo_reg (rtl))
7066         {
7067           declared_type = type_main_variant (TREE_TYPE (decl));
7068           passed_type = type_main_variant (DECL_ARG_TYPE (decl));
7069
7070           /* This decl represents a formal parameter which was optimized out.
7071              Note that DECL_INCOMING_RTL may be NULL in here, but we handle
7072              all* cases where (rtl == NULL_RTX) just below.  */
7073           if (declared_type == passed_type)
7074             rtl = DECL_INCOMING_RTL (decl);
7075           else if (! BYTES_BIG_ENDIAN
7076                    && TREE_CODE (declared_type) == INTEGER_TYPE
7077                    && (GET_MODE_SIZE (TYPE_MODE (declared_type))
7078                        <= GET_MODE_SIZE (TYPE_MODE (passed_type))))
7079                 rtl = DECL_INCOMING_RTL (decl);
7080         }
7081
7082       /* If the parm was passed in registers, but lives on the stack, then
7083          make a big endian correction if the mode of the type of the
7084          parameter is not the same as the mode of the rtl.  */
7085       /* ??? This is the same series of checks that are made in dbxout.c before
7086          we reach the big endian correction code there.  It isn't clear if all
7087          of these checks are necessary here, but keeping them all is the safe
7088          thing to do.  */
7089       else if (GET_CODE (rtl) == MEM
7090                && XEXP (rtl, 0) != const0_rtx
7091                && ! CONSTANT_P (XEXP (rtl, 0))
7092                /* Not passed in memory.  */
7093                && GET_CODE (DECL_INCOMING_RTL (decl)) != MEM
7094                /* Not passed by invisible reference.  */
7095                && (GET_CODE (XEXP (rtl, 0)) != REG
7096                    || REGNO (XEXP (rtl, 0)) == HARD_FRAME_POINTER_REGNUM
7097                    || REGNO (XEXP (rtl, 0)) == STACK_POINTER_REGNUM
7098 #if ARG_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
7099                    || REGNO (XEXP (rtl, 0)) == ARG_POINTER_REGNUM
7100 #endif
7101                      )
7102                /* Big endian correction check.  */
7103                && BYTES_BIG_ENDIAN
7104                && TYPE_MODE (TREE_TYPE (decl)) != GET_MODE (rtl)
7105                && (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (decl)))
7106                    < UNITS_PER_WORD))
7107         {
7108           int offset = (UNITS_PER_WORD
7109                         - GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (decl))));
7110           rtl = gen_rtx_MEM (TYPE_MODE (TREE_TYPE (decl)),
7111                              plus_constant (XEXP (rtl, 0), offset));
7112         }
7113     }
7114
7115   if (rtl == NULL_RTX)
7116     return;
7117
7118   rtl = eliminate_regs (rtl, 0, NULL_RTX);
7119 #ifdef LEAF_REG_REMAP
7120   if (current_function_uses_only_leaf_regs)
7121     leaf_renumber_regs_insn (rtl);
7122 #endif
7123
7124   switch (GET_CODE (rtl))
7125     {
7126     case ADDRESSOF:
7127       /* The address of a variable that was optimized away; don't emit
7128          anything.  */
7129       break;
7130
7131     case CONST_INT:
7132     case CONST_DOUBLE:
7133     case CONST_STRING:
7134     case SYMBOL_REF:
7135     case LABEL_REF:
7136     case CONST:
7137     case PLUS:
7138       /* DECL_RTL could be (plus (reg ...) (const_int ...)) */
7139       add_const_value_attribute (die, rtl);
7140       break;
7141
7142     case MEM:
7143     case REG:
7144     case SUBREG:
7145     case CONCAT:
7146       add_AT_location_description (die, DW_AT_location, rtl);
7147       break;
7148
7149     default:
7150       abort ();
7151     }
7152 }
7153
7154 /* Generate an DW_AT_name attribute given some string value to be included as
7155    the value of the attribute.  */
7156
7157 static inline void
7158 add_name_attribute (die, name_string)
7159      register dw_die_ref die;
7160      register const char *name_string;
7161 {
7162   if (name_string != NULL && *name_string != 0)
7163     {
7164       if (demangle_name_func)
7165         name_string = (*demangle_name_func) (name_string);
7166
7167       add_AT_string (die, DW_AT_name, name_string);
7168     }
7169 }
7170
7171 /* Given a tree node describing an array bound (either lower or upper) output
7172    a representation for that bound.  */
7173
7174 static void
7175 add_bound_info (subrange_die, bound_attr, bound)
7176      register dw_die_ref subrange_die;
7177      register enum dwarf_attribute bound_attr;
7178      register tree bound;
7179 {
7180   register unsigned bound_value = 0;
7181
7182   /* If this is an Ada unconstrained array type, then don't emit any debug
7183      info because the array bounds are unknown.  They are parameterized when
7184      the type is instantiated.  */
7185   if (contains_placeholder_p (bound))
7186     return;
7187
7188   switch (TREE_CODE (bound))
7189     {
7190     case ERROR_MARK:
7191       return;
7192
7193     /* All fixed-bounds are represented by INTEGER_CST nodes.        */
7194     case INTEGER_CST:
7195       bound_value = TREE_INT_CST_LOW (bound);
7196       if (bound_attr == DW_AT_lower_bound
7197           && ((is_c_family () && bound_value == 0)
7198               || (is_fortran () && bound_value == 1)))
7199         /* use the default */;
7200       else
7201         add_AT_unsigned (subrange_die, bound_attr, bound_value);
7202       break;
7203
7204     case CONVERT_EXPR:
7205     case NOP_EXPR:
7206     case NON_LVALUE_EXPR:
7207       add_bound_info (subrange_die, bound_attr, TREE_OPERAND (bound, 0));
7208       break;
7209       
7210     case SAVE_EXPR:
7211       /* If optimization is turned on, the SAVE_EXPRs that describe how to
7212          access the upper bound values may be bogus.  If they refer to a
7213          register, they may only describe how to get at these values at the
7214          points in the generated code right after they have just been
7215          computed.  Worse yet, in the typical case, the upper bound values
7216          will not even *be* computed in the optimized code (though the
7217          number of elements will), so these SAVE_EXPRs are entirely
7218          bogus. In order to compensate for this fact, we check here to see
7219          if optimization is enabled, and if so, we don't add an attribute
7220          for the (unknown and unknowable) upper bound.  This should not
7221          cause too much trouble for existing (stupid?)  debuggers because
7222          they have to deal with empty upper bounds location descriptions
7223          anyway in order to be able to deal with incomplete array types.
7224          Of course an intelligent debugger (GDB?)  should be able to
7225          comprehend that a missing upper bound specification in a array
7226          type used for a storage class `auto' local array variable
7227          indicates that the upper bound is both unknown (at compile- time)
7228          and unknowable (at run-time) due to optimization.
7229
7230          We assume that a MEM rtx is safe because gcc wouldn't put the
7231          value there unless it was going to be used repeatedly in the
7232          function, i.e. for cleanups.  */
7233       if (! optimize || GET_CODE (SAVE_EXPR_RTL (bound)) == MEM)
7234         {
7235           register dw_die_ref ctx = lookup_decl_die (current_function_decl);
7236           register dw_die_ref decl_die = new_die (DW_TAG_variable, ctx);
7237           register rtx loc = SAVE_EXPR_RTL (bound);
7238
7239           /* If the RTL for the SAVE_EXPR is memory, handle the case where
7240              it references an outer function's frame.  */
7241
7242           if (GET_CODE (loc) == MEM)
7243             {
7244               rtx new_addr = fix_lexical_addr (XEXP (loc, 0), bound);
7245
7246               if (XEXP (loc, 0) != new_addr)
7247                 loc = gen_rtx_MEM (GET_MODE (loc), new_addr);
7248             }
7249
7250           add_AT_flag (decl_die, DW_AT_artificial, 1);
7251           add_type_attribute (decl_die, TREE_TYPE (bound), 1, 0, ctx);
7252           add_AT_location_description (decl_die, DW_AT_location, loc);
7253           add_AT_die_ref (subrange_die, bound_attr, decl_die);
7254         }
7255
7256       /* Else leave out the attribute.  */
7257       break;
7258
7259     case MAX_EXPR:
7260     case VAR_DECL:
7261     case COMPONENT_REF:
7262       /* ??? These types of bounds can be created by the Ada front end,
7263          and it isn't clear how to emit debug info for them.  */
7264       break;
7265
7266     default:
7267       abort ();
7268     }
7269 }
7270
7271 /* Note that the block of subscript information for an array type also
7272    includes information about the element type of type given array type.  */
7273
7274 static void
7275 add_subscript_info (type_die, type)
7276      register dw_die_ref type_die;
7277      register tree type;
7278 {
7279 #ifndef MIPS_DEBUGGING_INFO
7280   register unsigned dimension_number;
7281 #endif
7282   register tree lower, upper;
7283   register dw_die_ref subrange_die;
7284
7285   /* The GNU compilers represent multidimensional array types as sequences of 
7286      one dimensional array types whose element types are themselves array
7287      types.  Here we squish that down, so that each multidimensional array
7288      type gets only one array_type DIE in the Dwarf debugging info. The draft 
7289      Dwarf specification say that we are allowed to do this kind of
7290      compression in C (because there is no difference between an array or
7291      arrays and a multidimensional array in C) but for other source languages 
7292      (e.g. Ada) we probably shouldn't do this.  */
7293
7294   /* ??? The SGI dwarf reader fails for multidimensional arrays with a
7295      const enum type.  E.g. const enum machine_mode insn_operand_mode[2][10].
7296      We work around this by disabling this feature.  See also
7297      gen_array_type_die.  */
7298 #ifndef MIPS_DEBUGGING_INFO
7299   for (dimension_number = 0;
7300        TREE_CODE (type) == ARRAY_TYPE;
7301        type = TREE_TYPE (type), dimension_number++)
7302     {
7303 #endif
7304       register tree domain = TYPE_DOMAIN (type);
7305
7306       /* Arrays come in three flavors: Unspecified bounds, fixed bounds,
7307          and (in GNU C only) variable bounds.  Handle all three forms 
7308          here.  */
7309       subrange_die = new_die (DW_TAG_subrange_type, type_die);
7310       if (domain)
7311         {
7312           /* We have an array type with specified bounds.  */
7313           lower = TYPE_MIN_VALUE (domain);
7314           upper = TYPE_MAX_VALUE (domain);
7315
7316           /* define the index type.  */
7317           if (TREE_TYPE (domain))
7318             {
7319               /* ??? This is probably an Ada unnamed subrange type.  Ignore the
7320                  TREE_TYPE field.  We can't emit debug info for this
7321                  because it is an unnamed integral type.  */
7322               if (TREE_CODE (domain) == INTEGER_TYPE
7323                   && TYPE_NAME (domain) == NULL_TREE
7324                   && TREE_CODE (TREE_TYPE (domain)) == INTEGER_TYPE
7325                   && TYPE_NAME (TREE_TYPE (domain)) == NULL_TREE)
7326                 ;       
7327               else
7328                 add_type_attribute (subrange_die, TREE_TYPE (domain), 0, 0,
7329                                     type_die);
7330             }
7331
7332           /* ??? If upper is NULL, the array has unspecified length,
7333              but it does have a lower bound.  This happens with Fortran
7334                dimension arr(N:*)
7335              Since the debugger is definitely going to need to know N
7336              to produce useful results, go ahead and output the lower
7337              bound solo, and hope the debugger can cope.  */
7338
7339           add_bound_info (subrange_die, DW_AT_lower_bound, lower);
7340           if (upper)
7341             add_bound_info (subrange_die, DW_AT_upper_bound, upper);
7342         }
7343       else
7344         /* We have an array type with an unspecified length.  The DWARF-2
7345              spec does not say how to handle this; let's just leave out the
7346              bounds.  */
7347         {;}
7348       
7349
7350 #ifndef MIPS_DEBUGGING_INFO
7351     }
7352 #endif
7353 }
7354
7355 static void
7356 add_byte_size_attribute (die, tree_node)
7357      dw_die_ref die;
7358      register tree tree_node;
7359 {
7360   register unsigned size;
7361
7362   switch (TREE_CODE (tree_node))
7363     {
7364     case ERROR_MARK:
7365       size = 0;
7366       break;
7367     case ENUMERAL_TYPE:
7368     case RECORD_TYPE:
7369     case UNION_TYPE:
7370     case QUAL_UNION_TYPE:
7371       size = int_size_in_bytes (tree_node);
7372       break;
7373     case FIELD_DECL:
7374       /* For a data member of a struct or union, the DW_AT_byte_size is
7375          generally given as the number of bytes normally allocated for an
7376          object of the *declared* type of the member itself.  This is true
7377          even for bit-fields.  */
7378       size = simple_type_size_in_bits (field_type (tree_node)) / BITS_PER_UNIT;
7379       break;
7380     default:
7381       abort ();
7382     }
7383
7384   /* Note that `size' might be -1 when we get to this point.  If it is, that
7385      indicates that the byte size of the entity in question is variable.  We
7386      have no good way of expressing this fact in Dwarf at the present time,
7387      so just let the -1 pass on through.  */
7388
7389   add_AT_unsigned (die, DW_AT_byte_size, size);
7390 }
7391
7392 /* For a FIELD_DECL node which represents a bit-field, output an attribute
7393    which specifies the distance in bits from the highest order bit of the
7394    "containing object" for the bit-field to the highest order bit of the
7395    bit-field itself.
7396
7397    For any given bit-field, the "containing object" is a hypothetical
7398    object (of some integral or enum type) within which the given bit-field
7399    lives.  The type of this hypothetical "containing object" is always the
7400    same as the declared type of the individual bit-field itself.  The
7401    determination of the exact location of the "containing object" for a
7402    bit-field is rather complicated.  It's handled by the
7403    `field_byte_offset' function (above).
7404
7405    Note that it is the size (in bytes) of the hypothetical "containing object"
7406    which will be given in the DW_AT_byte_size attribute for this bit-field.
7407    (See `byte_size_attribute' above).  */
7408
7409 static inline void
7410 add_bit_offset_attribute (die, decl)
7411      register dw_die_ref die;
7412      register tree decl;
7413 {
7414   register unsigned object_offset_in_bytes = field_byte_offset (decl);
7415   register tree type = DECL_BIT_FIELD_TYPE (decl);
7416   register tree bitpos_tree = DECL_FIELD_BITPOS (decl);
7417   register unsigned bitpos_int;
7418   register unsigned highest_order_object_bit_offset;
7419   register unsigned highest_order_field_bit_offset;
7420   register unsigned bit_offset;
7421
7422   /* Must be a field and a bit field.  */
7423   if (!type
7424       || TREE_CODE (decl) != FIELD_DECL)
7425     abort ();
7426
7427   /* We can't yet handle bit-fields whose offsets are variable, so if we
7428      encounter such things, just return without generating any attribute
7429      whatsoever.  */
7430   if (TREE_CODE (bitpos_tree) != INTEGER_CST)
7431     return;
7432
7433   bitpos_int = (unsigned) TREE_INT_CST_LOW (bitpos_tree);
7434
7435   /* Note that the bit offset is always the distance (in bits) from the
7436      highest-order bit of the "containing object" to the highest-order bit of 
7437      the bit-field itself.  Since the "high-order end" of any object or field 
7438      is different on big-endian and little-endian machines, the computation
7439      below must take account of these differences.  */
7440   highest_order_object_bit_offset = object_offset_in_bytes * BITS_PER_UNIT;
7441   highest_order_field_bit_offset = bitpos_int;
7442
7443   if (! BYTES_BIG_ENDIAN)
7444     {
7445       highest_order_field_bit_offset
7446         += (unsigned) TREE_INT_CST_LOW (DECL_SIZE (decl));
7447
7448       highest_order_object_bit_offset += simple_type_size_in_bits (type);
7449     }
7450
7451   bit_offset
7452     = (! BYTES_BIG_ENDIAN
7453        ? highest_order_object_bit_offset - highest_order_field_bit_offset
7454        : highest_order_field_bit_offset - highest_order_object_bit_offset);
7455
7456   add_AT_unsigned (die, DW_AT_bit_offset, bit_offset);
7457 }
7458
7459 /* For a FIELD_DECL node which represents a bit field, output an attribute
7460    which specifies the length in bits of the given field.  */
7461
7462 static inline void
7463 add_bit_size_attribute (die, decl)
7464      register dw_die_ref die;
7465      register tree decl;
7466 {
7467   /* Must be a field and a bit field.  */
7468   if (TREE_CODE (decl) != FIELD_DECL
7469       || ! DECL_BIT_FIELD_TYPE (decl))
7470     abort ();
7471   add_AT_unsigned (die, DW_AT_bit_size,
7472                    (unsigned) TREE_INT_CST_LOW (DECL_SIZE (decl)));
7473 }
7474
7475 /* If the compiled language is ANSI C, then add a 'prototyped'
7476    attribute, if arg types are given for the parameters of a function.  */
7477
7478 static inline void
7479 add_prototyped_attribute (die, func_type)
7480      register dw_die_ref die;
7481      register tree func_type;
7482 {
7483   if (get_AT_unsigned (comp_unit_die, DW_AT_language) == DW_LANG_C89
7484       && TYPE_ARG_TYPES (func_type) != NULL)
7485     add_AT_flag (die, DW_AT_prototyped, 1);
7486 }
7487
7488
7489 /* Add an 'abstract_origin' attribute below a given DIE.  The DIE is found
7490    by looking in either the type declaration or object declaration
7491    equate table.  */
7492
7493 static inline void
7494 add_abstract_origin_attribute (die, origin)
7495      register dw_die_ref die;
7496      register tree origin;
7497 {
7498   dw_die_ref origin_die = NULL;
7499
7500   if (TREE_CODE_CLASS (TREE_CODE (origin)) == 'd')
7501     origin_die = lookup_decl_die (origin);
7502   else if (TREE_CODE_CLASS (TREE_CODE (origin)) == 't')
7503     origin_die = lookup_type_die (origin);
7504
7505   if (origin_die == NULL)
7506     return;
7507   
7508   add_AT_die_ref (die, DW_AT_abstract_origin, origin_die);
7509 }
7510
7511 /* We do not currently support the pure_virtual attribute.  */
7512
7513 static inline void
7514 add_pure_or_virtual_attribute (die, func_decl)
7515      register dw_die_ref die;
7516      register tree func_decl;
7517 {
7518   if (DECL_VINDEX (func_decl))
7519     {
7520       add_AT_unsigned (die, DW_AT_virtuality, DW_VIRTUALITY_virtual);
7521       add_AT_loc (die, DW_AT_vtable_elem_location,
7522                   new_loc_descr (DW_OP_constu,
7523                                  TREE_INT_CST_LOW (DECL_VINDEX (func_decl)),
7524                                  0));
7525
7526       /* GNU extension: Record what type this method came from originally.  */
7527       if (debug_info_level > DINFO_LEVEL_TERSE)
7528         add_AT_die_ref (die, DW_AT_containing_type,
7529                         lookup_type_die (DECL_CONTEXT (func_decl)));
7530     }
7531 }
7532 \f
7533 /* Add source coordinate attributes for the given decl.  */
7534
7535 static void
7536 add_src_coords_attributes (die, decl)
7537      register dw_die_ref die;
7538      register tree decl;
7539 {
7540   register unsigned file_index = lookup_filename (DECL_SOURCE_FILE (decl));
7541
7542   add_AT_unsigned (die, DW_AT_decl_file, file_index);
7543   add_AT_unsigned (die, DW_AT_decl_line, DECL_SOURCE_LINE (decl));
7544 }
7545
7546 /* Add an DW_AT_name attribute and source coordinate attribute for the
7547    given decl, but only if it actually has a name.  */
7548
7549 static void
7550 add_name_and_src_coords_attributes (die, decl)
7551      register dw_die_ref die;
7552      register tree decl;
7553 {
7554   register tree decl_name;
7555
7556   decl_name = DECL_NAME (decl); 
7557   if (decl_name != NULL && IDENTIFIER_POINTER (decl_name) != NULL)
7558     {
7559       add_name_attribute (die, dwarf2_name (decl, 0));
7560       if (! DECL_ARTIFICIAL (decl))
7561         add_src_coords_attributes (die, decl);
7562
7563       if ((TREE_CODE (decl) == FUNCTION_DECL || TREE_CODE (decl) == VAR_DECL)
7564           && DECL_ASSEMBLER_NAME (decl) != DECL_NAME (decl))
7565         add_AT_string (die, DW_AT_MIPS_linkage_name,
7566                        IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)));
7567     }
7568 }
7569
7570 /* Push a new declaration scope. */
7571
7572 static void
7573 push_decl_scope (scope)
7574      tree scope;
7575 {
7576   /* Make room in the decl_scope_table, if necessary.  */
7577   if (decl_scope_table_allocated == decl_scope_depth)
7578     {
7579       decl_scope_table_allocated += DECL_SCOPE_TABLE_INCREMENT;
7580       decl_scope_table
7581         = (tree *) xrealloc (decl_scope_table,
7582                              decl_scope_table_allocated * sizeof (tree));
7583     }
7584
7585   decl_scope_table[decl_scope_depth] = scope;
7586   decl_scope_depth++;
7587 }
7588
7589 /* Pop a declaration scope.  */
7590 static inline void
7591 pop_decl_scope ()
7592 {
7593   if (decl_scope_depth <= 0)
7594     abort ();
7595   --decl_scope_depth;
7596 }
7597
7598 /* Return the DIE for the scope that immediately contains this type.
7599    Non-named types get global scope.  Named types nested in other
7600    types get their containing scope if it's open, or global scope
7601    otherwise.  All other types (i.e. function-local named types) get
7602    the current active scope.  */
7603
7604 static dw_die_ref
7605 scope_die_for (t, context_die)
7606     register tree t; 
7607     register dw_die_ref context_die;
7608 {
7609   register dw_die_ref scope_die = NULL;
7610   register tree containing_scope;
7611   register int i;
7612
7613   /* Non-types always go in the current scope.  */
7614   if (! TYPE_P (t))
7615     abort ();
7616
7617   containing_scope = TYPE_CONTEXT (t);
7618
7619   /* Ignore namespaces for the moment.  */
7620   if (containing_scope && TREE_CODE (containing_scope) == NAMESPACE_DECL)
7621     containing_scope = NULL_TREE;
7622
7623   /* Ignore function type "scopes" from the C frontend.  They mean that
7624      a tagged type is local to a parmlist of a function declarator, but
7625      that isn't useful to DWARF.  */
7626   if (containing_scope && TREE_CODE (containing_scope) == FUNCTION_TYPE)
7627     containing_scope = NULL_TREE;
7628
7629   if (containing_scope == NULL_TREE)
7630     scope_die = comp_unit_die;
7631   else if (TYPE_P (containing_scope))
7632     {
7633       /* For types, we can just look up the appropriate DIE.  But
7634          first we check to see if we're in the middle of emitting it
7635          so we know where the new DIE should go.  */
7636
7637       for (i = decl_scope_depth - 1; i >= 0; --i)
7638         if (decl_scope_table[i] == containing_scope)
7639           break;
7640
7641       if (i < 0)
7642         {
7643           if (debug_info_level > DINFO_LEVEL_TERSE
7644               && !TREE_ASM_WRITTEN (containing_scope))
7645             abort ();
7646
7647           /* If none of the current dies are suitable, we get file scope.  */
7648           scope_die = comp_unit_die;
7649         }
7650       else
7651         scope_die = lookup_type_die (containing_scope);
7652     }
7653   else
7654     scope_die = context_die;
7655
7656   return scope_die;
7657 }
7658
7659 /* Returns nonzero iff CONTEXT_DIE is internal to a function.  */
7660
7661 static inline int
7662 local_scope_p (context_die)
7663      dw_die_ref context_die;
7664 {
7665   for (; context_die; context_die = context_die->die_parent)
7666     if (context_die->die_tag == DW_TAG_inlined_subroutine
7667         || context_die->die_tag == DW_TAG_subprogram)
7668       return 1;
7669   return 0;
7670 }
7671
7672 /* Many forms of DIEs require a "type description" attribute.  This
7673    routine locates the proper "type descriptor" die for the type given
7674    by 'type', and adds an DW_AT_type attribute below the given die.  */
7675
7676 static void
7677 add_type_attribute (object_die, type, decl_const, decl_volatile, context_die)
7678      register dw_die_ref object_die;
7679      register tree type;
7680      register int decl_const;
7681      register int decl_volatile;
7682      register dw_die_ref context_die;
7683 {
7684   register enum tree_code code  = TREE_CODE (type);
7685   register dw_die_ref type_die  = NULL;
7686
7687   /* ??? If this type is an unnamed subrange type of an integral or
7688      floating-point type, use the inner type.  This is because we have no
7689      support for unnamed types in base_type_die.  This can happen if this is
7690      an Ada subrange type.  Correct solution is emit a subrange type die.  */
7691   if ((code == INTEGER_TYPE || code == REAL_TYPE)
7692       && TREE_TYPE (type) != 0 && TYPE_NAME (type) == 0)
7693     type = TREE_TYPE (type), code = TREE_CODE (type);
7694
7695   if (code == ERROR_MARK)
7696     return;
7697
7698   /* Handle a special case.  For functions whose return type is void, we
7699      generate *no* type attribute.  (Note that no object may have type
7700      `void', so this only applies to function return types).  */
7701   if (code == VOID_TYPE)
7702     return;
7703
7704   type_die = modified_type_die (type,
7705                                 decl_const || TYPE_READONLY (type),
7706                                 decl_volatile || TYPE_VOLATILE (type),
7707                                 context_die);
7708   if (type_die != NULL)
7709     add_AT_die_ref (object_die, DW_AT_type, type_die);
7710 }
7711
7712 /* Given a tree pointer to a struct, class, union, or enum type node, return
7713    a pointer to the (string) tag name for the given type, or zero if the type
7714    was declared without a tag.  */
7715
7716 static char *
7717 type_tag (type)
7718      register tree type;
7719 {
7720   register char *name = 0;
7721
7722   if (TYPE_NAME (type) != 0)
7723     {
7724       register tree t = 0;
7725
7726       /* Find the IDENTIFIER_NODE for the type name.  */
7727       if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE)
7728         t = TYPE_NAME (type);
7729
7730       /* The g++ front end makes the TYPE_NAME of *each* tagged type point to 
7731          a TYPE_DECL node, regardless of whether or not a `typedef' was
7732          involved.  */
7733       else if (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
7734                && ! DECL_IGNORED_P (TYPE_NAME (type)))
7735         t = DECL_NAME (TYPE_NAME (type));
7736
7737       /* Now get the name as a string, or invent one.  */
7738       if (t != 0)
7739         name = IDENTIFIER_POINTER (t);
7740     }
7741
7742   return (name == 0 || *name == '\0') ? 0 : name;
7743 }
7744
7745 /* Return the type associated with a data member, make a special check
7746    for bit field types.  */
7747
7748 static inline tree
7749 member_declared_type (member)
7750      register tree member;
7751 {
7752   return (DECL_BIT_FIELD_TYPE (member)
7753           ? DECL_BIT_FIELD_TYPE (member)
7754           : TREE_TYPE (member));
7755 }
7756
7757 /* Get the decl's label, as described by its RTL. This may be different
7758    from the DECL_NAME name used in the source file.  */
7759
7760 #if 0
7761 static char *
7762 decl_start_label (decl)
7763      register tree decl;
7764 {
7765   rtx x;
7766   char *fnname;
7767   x = DECL_RTL (decl);
7768   if (GET_CODE (x) != MEM)
7769     abort ();
7770
7771   x = XEXP (x, 0);
7772   if (GET_CODE (x) != SYMBOL_REF)
7773     abort ();
7774
7775   fnname = XSTR (x, 0);
7776   return fnname;
7777 }
7778 #endif
7779 \f
7780 /* These routines generate the internal representation of the DIE's for
7781    the compilation unit.  Debugging information is collected by walking
7782    the declaration trees passed in from dwarf2out_decl().  */
7783
7784 static void
7785 gen_array_type_die (type, context_die)
7786      register tree type;
7787      register dw_die_ref context_die;
7788 {
7789   register dw_die_ref scope_die = scope_die_for (type, context_die);
7790   register dw_die_ref array_die;
7791   register tree element_type;
7792
7793   /* ??? The SGI dwarf reader fails for array of array of enum types unless
7794      the inner array type comes before the outer array type.  Thus we must
7795      call gen_type_die before we call new_die.  See below also.  */
7796 #ifdef MIPS_DEBUGGING_INFO
7797   gen_type_die (TREE_TYPE (type), context_die);
7798 #endif
7799
7800   array_die = new_die (DW_TAG_array_type, scope_die);
7801
7802 #if 0
7803   /* We default the array ordering.  SDB will probably do
7804      the right things even if DW_AT_ordering is not present.  It's not even
7805      an issue until we start to get into multidimensional arrays anyway.  If
7806      SDB is ever caught doing the Wrong Thing for multi-dimensional arrays,
7807      then we'll have to put the DW_AT_ordering attribute back in.  (But if
7808      and when we find out that we need to put these in, we will only do so
7809      for multidimensional arrays.  */
7810   add_AT_unsigned (array_die, DW_AT_ordering, DW_ORD_row_major);
7811 #endif
7812
7813 #ifdef MIPS_DEBUGGING_INFO
7814   /* The SGI compilers handle arrays of unknown bound by setting
7815      AT_declaration and not emitting any subrange DIEs.  */
7816   if (! TYPE_DOMAIN (type))
7817     add_AT_unsigned (array_die, DW_AT_declaration, 1);
7818   else
7819 #endif
7820     add_subscript_info (array_die, type);
7821
7822   add_name_attribute (array_die, type_tag (type));
7823   equate_type_number_to_die (type, array_die);
7824
7825   /* Add representation of the type of the elements of this array type.  */
7826   element_type = TREE_TYPE (type);
7827
7828   /* ??? The SGI dwarf reader fails for multidimensional arrays with a
7829      const enum type.  E.g. const enum machine_mode insn_operand_mode[2][10].
7830      We work around this by disabling this feature.  See also
7831      add_subscript_info.  */
7832 #ifndef MIPS_DEBUGGING_INFO
7833   while (TREE_CODE (element_type) == ARRAY_TYPE)
7834     element_type = TREE_TYPE (element_type);
7835
7836   gen_type_die (element_type, context_die);
7837 #endif
7838
7839   add_type_attribute (array_die, element_type, 0, 0, context_die);
7840 }
7841
7842 static void
7843 gen_set_type_die (type, context_die)
7844      register tree type;
7845      register dw_die_ref context_die;
7846 {
7847   register dw_die_ref type_die
7848     = new_die (DW_TAG_set_type, scope_die_for (type, context_die));
7849
7850   equate_type_number_to_die (type, type_die);
7851   add_type_attribute (type_die, TREE_TYPE (type), 0, 0, context_die);
7852 }
7853
7854 #if 0
7855 static void
7856 gen_entry_point_die (decl, context_die)
7857      register tree decl;
7858      register dw_die_ref context_die;
7859 {
7860   register tree origin = decl_ultimate_origin (decl);
7861   register dw_die_ref decl_die = new_die (DW_TAG_entry_point, context_die);
7862   if (origin != NULL)
7863     add_abstract_origin_attribute (decl_die, origin);
7864   else
7865     {
7866       add_name_and_src_coords_attributes (decl_die, decl);
7867       add_type_attribute (decl_die, TREE_TYPE (TREE_TYPE (decl)),
7868                           0, 0, context_die);
7869     }
7870
7871   if (DECL_ABSTRACT (decl))
7872     equate_decl_number_to_die (decl, decl_die);
7873   else
7874     add_AT_lbl_id (decl_die, DW_AT_low_pc, decl_start_label (decl));
7875 }
7876 #endif
7877
7878 /* Remember a type in the incomplete_types_list.  */
7879
7880 static void
7881 add_incomplete_type (type)
7882      tree type;
7883 {
7884   if (incomplete_types == incomplete_types_allocated)
7885     {
7886       incomplete_types_allocated += INCOMPLETE_TYPES_INCREMENT;
7887       incomplete_types_list
7888         = (tree *) xrealloc (incomplete_types_list,
7889                              sizeof (tree) * incomplete_types_allocated);
7890     }
7891
7892   incomplete_types_list[incomplete_types++] = type;
7893 }
7894
7895 /* Walk through the list of incomplete types again, trying once more to
7896    emit full debugging info for them.  */
7897
7898 static void
7899 retry_incomplete_types ()
7900 {
7901   register tree type;
7902
7903   while (incomplete_types)
7904     {
7905       --incomplete_types;
7906       type = incomplete_types_list[incomplete_types];
7907       gen_type_die (type, comp_unit_die);
7908     }
7909 }
7910
7911 /* Generate a DIE to represent an inlined instance of an enumeration type.  */
7912
7913 static void
7914 gen_inlined_enumeration_type_die (type, context_die)
7915      register tree type;
7916      register dw_die_ref context_die;
7917 {
7918   register dw_die_ref type_die = new_die (DW_TAG_enumeration_type,
7919                                           context_die);
7920   /* We do not check for TREE_ASM_WRITTEN (type) being set, as the type may
7921      be incomplete and such types are not marked.  */
7922   add_abstract_origin_attribute (type_die, type);
7923 }
7924
7925 /* Generate a DIE to represent an inlined instance of a structure type.  */
7926
7927 static void
7928 gen_inlined_structure_type_die (type, context_die)
7929      register tree type;
7930      register dw_die_ref context_die;
7931 {
7932   register dw_die_ref type_die = new_die (DW_TAG_structure_type, context_die);
7933
7934   /* We do not check for TREE_ASM_WRITTEN (type) being set, as the type may
7935      be incomplete and such types are not marked.  */
7936   add_abstract_origin_attribute (type_die, type);
7937 }
7938
7939 /* Generate a DIE to represent an inlined instance of a union type.  */
7940
7941 static void
7942 gen_inlined_union_type_die (type, context_die)
7943      register tree type;
7944      register dw_die_ref context_die;
7945 {
7946   register dw_die_ref type_die = new_die (DW_TAG_union_type, context_die);
7947
7948   /* We do not check for TREE_ASM_WRITTEN (type) being set, as the type may
7949      be incomplete and such types are not marked.  */
7950   add_abstract_origin_attribute (type_die, type);
7951 }
7952
7953 /* Generate a DIE to represent an enumeration type.  Note that these DIEs
7954    include all of the information about the enumeration values also. Each
7955    enumerated type name/value is listed as a child of the enumerated type
7956    DIE.  */
7957
7958 static void
7959 gen_enumeration_type_die (type, context_die)
7960      register tree type;
7961      register dw_die_ref context_die;
7962 {
7963   register dw_die_ref type_die = lookup_type_die (type);
7964
7965   if (type_die == NULL)
7966     {
7967       type_die = new_die (DW_TAG_enumeration_type,
7968                           scope_die_for (type, context_die));
7969       equate_type_number_to_die (type, type_die);
7970       add_name_attribute (type_die, type_tag (type));
7971     }
7972   else if (! TYPE_SIZE (type))
7973     return;
7974   else
7975     remove_AT (type_die, DW_AT_declaration);
7976
7977   /* Handle a GNU C/C++ extension, i.e. incomplete enum types.  If the
7978      given enum type is incomplete, do not generate the DW_AT_byte_size
7979      attribute or the DW_AT_element_list attribute.  */
7980   if (TYPE_SIZE (type))
7981     {
7982       register tree link;
7983
7984       TREE_ASM_WRITTEN (type) = 1;
7985       add_byte_size_attribute (type_die, type);
7986       if (TYPE_STUB_DECL (type) != NULL_TREE)
7987         add_src_coords_attributes (type_die, TYPE_STUB_DECL (type));
7988
7989       /* If the first reference to this type was as the return type of an
7990          inline function, then it may not have a parent.  Fix this now.  */
7991       if (type_die->die_parent == NULL)
7992         add_child_die (scope_die_for (type, context_die), type_die);
7993
7994       for (link = TYPE_FIELDS (type);
7995            link != NULL; link = TREE_CHAIN (link))
7996         {
7997           register dw_die_ref enum_die = new_die (DW_TAG_enumerator, type_die);
7998
7999           add_name_attribute (enum_die,
8000                               IDENTIFIER_POINTER (TREE_PURPOSE (link)));
8001           add_AT_unsigned (enum_die, DW_AT_const_value,
8002                            (unsigned) TREE_INT_CST_LOW (TREE_VALUE (link)));
8003         }
8004     }
8005   else
8006     add_AT_flag (type_die, DW_AT_declaration, 1);
8007 }
8008
8009
8010 /* Generate a DIE to represent either a real live formal parameter decl or to
8011    represent just the type of some formal parameter position in some function
8012    type.
8013
8014    Note that this routine is a bit unusual because its argument may be a
8015    ..._DECL node (i.e. either a PARM_DECL or perhaps a VAR_DECL which
8016    represents an inlining of some PARM_DECL) or else some sort of a ..._TYPE
8017    node.  If it's the former then this function is being called to output a
8018    DIE to represent a formal parameter object (or some inlining thereof).  If
8019    it's the latter, then this function is only being called to output a
8020    DW_TAG_formal_parameter DIE to stand as a placeholder for some formal
8021    argument type of some subprogram type.  */
8022
8023 static dw_die_ref
8024 gen_formal_parameter_die (node, context_die)
8025      register tree node;
8026      register dw_die_ref context_die;
8027 {
8028   register dw_die_ref parm_die
8029     = new_die (DW_TAG_formal_parameter, context_die);
8030   register tree origin;
8031
8032   switch (TREE_CODE_CLASS (TREE_CODE (node)))
8033     {
8034     case 'd':
8035       origin = decl_ultimate_origin (node);
8036       if (origin != NULL)
8037         add_abstract_origin_attribute (parm_die, origin);
8038       else
8039         {
8040           add_name_and_src_coords_attributes (parm_die, node);
8041           add_type_attribute (parm_die, TREE_TYPE (node),
8042                               TREE_READONLY (node),
8043                               TREE_THIS_VOLATILE (node),
8044                               context_die);
8045           if (DECL_ARTIFICIAL (node))
8046             add_AT_flag (parm_die, DW_AT_artificial, 1);
8047         }
8048
8049       equate_decl_number_to_die (node, parm_die);
8050       if (! DECL_ABSTRACT (node))
8051         add_location_or_const_value_attribute (parm_die, node);
8052
8053       break;
8054
8055     case 't':
8056       /* We were called with some kind of a ..._TYPE node.  */
8057       add_type_attribute (parm_die, node, 0, 0, context_die);
8058       break;
8059
8060     default:
8061       abort ();
8062     }
8063
8064   return parm_die;
8065 }
8066
8067 /* Generate a special type of DIE used as a stand-in for a trailing ellipsis
8068    at the end of an (ANSI prototyped) formal parameters list.  */
8069
8070 static void
8071 gen_unspecified_parameters_die (decl_or_type, context_die)
8072      register tree decl_or_type ATTRIBUTE_UNUSED;
8073      register dw_die_ref context_die;
8074 {
8075   new_die (DW_TAG_unspecified_parameters, context_die);
8076 }
8077
8078 /* Generate a list of nameless DW_TAG_formal_parameter DIEs (and perhaps a
8079    DW_TAG_unspecified_parameters DIE) to represent the types of the formal
8080    parameters as specified in some function type specification (except for
8081    those which appear as part of a function *definition*).
8082
8083    Note we must be careful here to output all of the parameter DIEs before*
8084    we output any DIEs needed to represent the types of the formal parameters.
8085    This keeps svr4 SDB happy because it (incorrectly) thinks that the first
8086    non-parameter DIE it sees ends the formal parameter list.  */
8087
8088 static void
8089 gen_formal_types_die (function_or_method_type, context_die)
8090      register tree function_or_method_type;
8091      register dw_die_ref context_die;
8092 {
8093   register tree link;
8094   register tree formal_type = NULL;
8095   register tree first_parm_type = TYPE_ARG_TYPES (function_or_method_type);
8096
8097 #if 0
8098   /* In the case where we are generating a formal types list for a C++
8099      non-static member function type, skip over the first thing on the
8100      TYPE_ARG_TYPES list because it only represents the type of the hidden
8101      `this pointer'.  The debugger should be able to figure out (without
8102      being explicitly told) that this non-static member function type takes a 
8103      `this pointer' and should be able to figure what the type of that hidden 
8104      parameter is from the DW_AT_member attribute of the parent
8105      DW_TAG_subroutine_type DIE.  */
8106   if (TREE_CODE (function_or_method_type) == METHOD_TYPE)
8107     first_parm_type = TREE_CHAIN (first_parm_type);
8108 #endif
8109
8110   /* Make our first pass over the list of formal parameter types and output a 
8111      DW_TAG_formal_parameter DIE for each one.  */
8112   for (link = first_parm_type; link; link = TREE_CHAIN (link))
8113     {
8114       register dw_die_ref parm_die;
8115       
8116       formal_type = TREE_VALUE (link);
8117       if (formal_type == void_type_node)
8118         break;
8119
8120       /* Output a (nameless) DIE to represent the formal parameter itself.  */
8121       parm_die = gen_formal_parameter_die (formal_type, context_die);
8122       if (TREE_CODE (function_or_method_type) == METHOD_TYPE
8123           && link == first_parm_type)
8124         add_AT_flag (parm_die, DW_AT_artificial, 1);
8125     }
8126
8127   /* If this function type has an ellipsis, add a
8128      DW_TAG_unspecified_parameters DIE to the end of the parameter list.  */
8129   if (formal_type != void_type_node)
8130     gen_unspecified_parameters_die (function_or_method_type, context_die);
8131
8132   /* Make our second (and final) pass over the list of formal parameter types 
8133      and output DIEs to represent those types (as necessary).  */
8134   for (link = TYPE_ARG_TYPES (function_or_method_type);
8135        link;
8136        link = TREE_CHAIN (link))
8137     {
8138       formal_type = TREE_VALUE (link);
8139       if (formal_type == void_type_node)
8140         break;
8141
8142       gen_type_die (formal_type, context_die);
8143     }
8144 }
8145
8146 /* We want to generate the DIE for TYPE so that we can generate the
8147    die for MEMBER, which has been defined; we will need to refer back
8148    to the member declaration nested within TYPE.  If we're trying to
8149    generate minimal debug info for TYPE, processing TYPE won't do the
8150    trick; we need to attach the member declaration by hand.  */
8151
8152 static void
8153 gen_type_die_for_member (type, member, context_die)
8154      tree type, member;
8155      dw_die_ref context_die;
8156 {
8157   gen_type_die (type, context_die);
8158
8159   /* If we're trying to avoid duplicate debug info, we may not have
8160      emitted the member decl for this function.  Emit it now.  */
8161   if (TYPE_DECL_SUPPRESS_DEBUG (TYPE_STUB_DECL (type))
8162       && ! lookup_decl_die (member))
8163     {
8164       if (decl_ultimate_origin (member))
8165         abort ();
8166
8167       push_decl_scope (type);
8168       if (TREE_CODE (member) == FUNCTION_DECL)
8169         gen_subprogram_die (member, lookup_type_die (type));
8170       else
8171         gen_variable_die (member, lookup_type_die (type));
8172       pop_decl_scope ();
8173     }
8174 }
8175
8176 /* Generate the DWARF2 info for the "abstract" instance
8177    of a function which we may later generate inlined and/or
8178    out-of-line instances of.  */
8179
8180 static void
8181 gen_abstract_function (decl)
8182      tree decl;
8183 {
8184   register dw_die_ref old_die = lookup_decl_die (decl);
8185   tree save_fn;
8186
8187   if (old_die && get_AT_unsigned (old_die, DW_AT_inline))
8188     /* We've already generated the abstract instance.  */
8189     return;
8190
8191   save_fn = current_function_decl;
8192   current_function_decl = decl;
8193
8194   set_decl_abstract_flags (decl, 1);
8195   dwarf2out_decl (decl);
8196   set_decl_abstract_flags (decl, 0);
8197
8198   current_function_decl = save_fn;
8199 }
8200
8201 /* Generate a DIE to represent a declared function (either file-scope or
8202    block-local).  */
8203
8204 static void
8205 gen_subprogram_die (decl, context_die)
8206      register tree decl;
8207      register dw_die_ref context_die;
8208 {
8209   char label_id[MAX_ARTIFICIAL_LABEL_BYTES];
8210   register tree origin = decl_ultimate_origin (decl);
8211   register dw_die_ref subr_die;
8212   register rtx fp_reg;
8213   register tree fn_arg_types;
8214   register tree outer_scope;
8215   register dw_die_ref old_die = lookup_decl_die (decl);
8216   register int declaration
8217     = (current_function_decl != decl
8218        || (context_die
8219            && (context_die->die_tag == DW_TAG_structure_type
8220                || context_die->die_tag == DW_TAG_union_type)));
8221
8222   /* Note that it is possible to have both DECL_ABSTRACT and `declaration'
8223      be true, if we started to generate the abstract instance of an inline,
8224      decided to output its containing class, and proceeded to emit the
8225      declaration of the inline from the member list for the class.  In that
8226      case, `declaration' takes priority; we'll get back to the abstract
8227      instance when we're done with the class.  */
8228
8229   if (origin != NULL)
8230     {
8231       if (declaration && ! local_scope_p (context_die))
8232         abort ();
8233
8234       subr_die = new_die (DW_TAG_subprogram, context_die);
8235       add_abstract_origin_attribute (subr_die, origin);
8236     }
8237   else if (old_die && DECL_ABSTRACT (decl)
8238            && get_AT_unsigned (old_die, DW_AT_inline))
8239     {
8240       /* This must be a redefinition of an extern inline function.
8241          We can just reuse the old die here.  */
8242       subr_die = old_die;
8243
8244       /* Clear out the inlined attribute and parm types.  */
8245       remove_AT (subr_die, DW_AT_inline);
8246       remove_children (subr_die);
8247     }
8248   else if (old_die)
8249     {
8250       register unsigned file_index
8251         = lookup_filename (DECL_SOURCE_FILE (decl));
8252
8253       if (get_AT_flag (old_die, DW_AT_declaration) != 1)
8254         {
8255           /* ??? This can happen if there is a bug in the program, for
8256              instance, if it has duplicate function definitions.  Ideally,
8257              we should detect this case and ignore it.  For now, if we have
8258              already reported an error, any error at all, then assume that
8259              we got here because of a input error, not a dwarf2 bug.  */
8260           if (errorcount)
8261             return;
8262           abort ();
8263         }
8264
8265       /* If the definition comes from the same place as the declaration,
8266          maybe use the old DIE.  We always want the DIE for this function
8267          that has the *_pc attributes to be under comp_unit_die so the
8268          debugger can find it.  For inlines, that is the concrete instance,
8269          so we can use the old DIE here.  For non-inline methods, we want a
8270          specification DIE at toplevel, so we need a new DIE.  For local
8271          class methods, this doesn't apply; we just use the old DIE.  */
8272       if ((DECL_ABSTRACT (decl) || old_die->die_parent == comp_unit_die
8273            || context_die == NULL)
8274           && (DECL_ARTIFICIAL (decl)
8275               || (get_AT_unsigned (old_die, DW_AT_decl_file) == file_index
8276                   && (get_AT_unsigned (old_die, DW_AT_decl_line)
8277                       == (unsigned)DECL_SOURCE_LINE (decl)))))
8278         {
8279           subr_die = old_die;
8280
8281           /* Clear out the declaration attribute and the parm types.  */
8282           remove_AT (subr_die, DW_AT_declaration);
8283           remove_children (subr_die);
8284         }
8285       else
8286         {
8287           subr_die = new_die (DW_TAG_subprogram, context_die);
8288           add_AT_die_ref (subr_die, DW_AT_specification, old_die);
8289           if (get_AT_unsigned (old_die, DW_AT_decl_file) != file_index)
8290             add_AT_unsigned (subr_die, DW_AT_decl_file, file_index);
8291           if (get_AT_unsigned (old_die, DW_AT_decl_line)
8292               != (unsigned)DECL_SOURCE_LINE (decl))
8293             add_AT_unsigned
8294               (subr_die, DW_AT_decl_line, DECL_SOURCE_LINE (decl));
8295         }
8296     }
8297   else
8298     {
8299       subr_die = new_die (DW_TAG_subprogram, context_die);
8300                          
8301       if (TREE_PUBLIC (decl))
8302         add_AT_flag (subr_die, DW_AT_external, 1);
8303
8304       add_name_and_src_coords_attributes (subr_die, decl);
8305       if (debug_info_level > DINFO_LEVEL_TERSE)
8306         {
8307           register tree type = TREE_TYPE (decl);
8308
8309           add_prototyped_attribute (subr_die, type);
8310           add_type_attribute (subr_die, TREE_TYPE (type), 0, 0, context_die);
8311         }
8312
8313       add_pure_or_virtual_attribute (subr_die, decl);
8314       if (DECL_ARTIFICIAL (decl))
8315         add_AT_flag (subr_die, DW_AT_artificial, 1);
8316       if (TREE_PROTECTED (decl))
8317         add_AT_unsigned (subr_die, DW_AT_accessibility, DW_ACCESS_protected);
8318       else if (TREE_PRIVATE (decl))
8319         add_AT_unsigned (subr_die, DW_AT_accessibility, DW_ACCESS_private);
8320     }
8321
8322   if (declaration)
8323     {
8324       if (! origin)
8325         add_AT_flag (subr_die, DW_AT_declaration, 1);
8326
8327       /* The first time we see a member function, it is in the context of
8328          the class to which it belongs.  We make sure of this by emitting
8329          the class first.  The next time is the definition, which is
8330          handled above.  The two may come from the same source text.  */
8331       if (DECL_CONTEXT (decl) || DECL_ABSTRACT (decl))
8332         equate_decl_number_to_die (decl, subr_die);
8333     }
8334   else if (DECL_ABSTRACT (decl))
8335     {
8336       if (DECL_INLINE (decl) && !flag_no_inline)
8337         {
8338           /* ??? Checking DECL_DEFER_OUTPUT is correct for static
8339              inline functions, but not for extern inline functions.
8340              We can't get this completely correct because information
8341              about whether the function was declared inline is not
8342              saved anywhere.  */
8343           if (DECL_DEFER_OUTPUT (decl))
8344             add_AT_unsigned (subr_die, DW_AT_inline, DW_INL_declared_inlined);
8345           else
8346             add_AT_unsigned (subr_die, DW_AT_inline, DW_INL_inlined);
8347         }
8348       else
8349         add_AT_unsigned (subr_die, DW_AT_inline, DW_INL_declared_not_inlined);
8350
8351       equate_decl_number_to_die (decl, subr_die);
8352     }
8353   else if (!DECL_EXTERNAL (decl))
8354     {
8355       if (origin == NULL_TREE)
8356         equate_decl_number_to_die (decl, subr_die);
8357
8358       ASM_GENERATE_INTERNAL_LABEL (label_id, FUNC_BEGIN_LABEL,
8359                                    current_funcdef_number);
8360       add_AT_lbl_id (subr_die, DW_AT_low_pc, label_id);
8361       ASM_GENERATE_INTERNAL_LABEL (label_id, FUNC_END_LABEL,
8362                                    current_funcdef_number);
8363       add_AT_lbl_id (subr_die, DW_AT_high_pc, label_id);
8364
8365       add_pubname (decl, subr_die);
8366       add_arange (decl, subr_die);
8367
8368 #ifdef MIPS_DEBUGGING_INFO
8369       /* Add a reference to the FDE for this routine.  */
8370       add_AT_fde_ref (subr_die, DW_AT_MIPS_fde, current_funcdef_fde);
8371 #endif
8372
8373       /* Define the "frame base" location for this routine.  We use the
8374          frame pointer or stack pointer registers, since the RTL for local
8375          variables is relative to one of them.  */
8376       fp_reg
8377         = frame_pointer_needed ? hard_frame_pointer_rtx : stack_pointer_rtx;
8378       add_AT_loc (subr_die, DW_AT_frame_base, reg_loc_descriptor (fp_reg));
8379
8380 #if 0
8381       /* ??? This fails for nested inline functions, because context_display
8382          is not part of the state saved/restored for inline functions.  */
8383       if (current_function_needs_context)
8384         add_AT_location_description (subr_die, DW_AT_static_link,
8385                                      lookup_static_chain (decl));
8386 #endif
8387     }
8388
8389   /* Now output descriptions of the arguments for this function. This gets
8390      (unnecessarily?) complex because of the fact that the DECL_ARGUMENT list 
8391      for a FUNCTION_DECL doesn't indicate cases where there was a trailing
8392      `...' at the end of the formal parameter list.  In order to find out if
8393      there was a trailing ellipsis or not, we must instead look at the type
8394      associated with the FUNCTION_DECL.  This will be a node of type
8395      FUNCTION_TYPE. If the chain of type nodes hanging off of this
8396      FUNCTION_TYPE node ends with a void_type_node then there should *not* be 
8397      an ellipsis at the end.  */
8398
8399   /* In the case where we are describing a mere function declaration, all we
8400      need to do here (and all we *can* do here) is to describe the *types* of 
8401      its formal parameters.  */
8402   if (debug_info_level <= DINFO_LEVEL_TERSE)
8403     ;
8404   else if (declaration)
8405     gen_formal_types_die (TREE_TYPE (decl), subr_die);
8406   else
8407     {
8408       /* Generate DIEs to represent all known formal parameters */
8409       register tree arg_decls = DECL_ARGUMENTS (decl);
8410       register tree parm;
8411
8412       /* When generating DIEs, generate the unspecified_parameters DIE
8413          instead if we come across the arg "__builtin_va_alist" */
8414       for (parm = arg_decls; parm; parm = TREE_CHAIN (parm))
8415         if (TREE_CODE (parm) == PARM_DECL)
8416           {
8417             if (DECL_NAME (parm)
8418                 && !strcmp (IDENTIFIER_POINTER (DECL_NAME (parm)),
8419                             "__builtin_va_alist"))
8420               gen_unspecified_parameters_die (parm, subr_die);
8421             else
8422               gen_decl_die (parm, subr_die);
8423           }
8424
8425       /* Decide whether we need a unspecified_parameters DIE at the end.
8426          There are 2 more cases to do this for: 1) the ansi ... declaration - 
8427          this is detectable when the end of the arg list is not a
8428          void_type_node 2) an unprototyped function declaration (not a
8429          definition).  This just means that we have no info about the
8430          parameters at all.  */
8431       fn_arg_types = TYPE_ARG_TYPES (TREE_TYPE (decl));
8432       if (fn_arg_types != NULL)
8433         {
8434           /* this is the prototyped case, check for ...  */
8435           if (TREE_VALUE (tree_last (fn_arg_types)) != void_type_node)
8436             gen_unspecified_parameters_die (decl, subr_die);
8437         }
8438       else if (DECL_INITIAL (decl) == NULL_TREE)
8439         gen_unspecified_parameters_die (decl, subr_die);
8440     }
8441
8442   /* Output Dwarf info for all of the stuff within the body of the function
8443      (if it has one - it may be just a declaration).  */
8444   outer_scope = DECL_INITIAL (decl);
8445
8446   /* Note that here, `outer_scope' is a pointer to the outermost BLOCK
8447      node created to represent a function. This outermost BLOCK actually
8448      represents the outermost binding contour for the function, i.e. the
8449      contour in which the function's formal parameters and labels get
8450      declared. Curiously, it appears that the front end doesn't actually
8451      put the PARM_DECL nodes for the current function onto the BLOCK_VARS
8452      list for this outer scope.  (They are strung off of the DECL_ARGUMENTS
8453      list for the function instead.) The BLOCK_VARS list for the
8454      `outer_scope' does provide us with a list of the LABEL_DECL nodes for
8455      the function however, and we output DWARF info for those in
8456      decls_for_scope.  Just within the `outer_scope' there will be a BLOCK
8457      node representing the function's outermost pair of curly braces, and
8458      any blocks used for the base and member initializers of a C++
8459      constructor function.  */
8460   if (! declaration && TREE_CODE (outer_scope) != ERROR_MARK)
8461     {
8462       current_function_has_inlines = 0;
8463       decls_for_scope (outer_scope, subr_die, 0);
8464
8465 #if 0 && defined (MIPS_DEBUGGING_INFO)
8466       if (current_function_has_inlines)
8467         {
8468           add_AT_flag (subr_die, DW_AT_MIPS_has_inlines, 1);
8469           if (! comp_unit_has_inlines)
8470             {
8471               add_AT_flag (comp_unit_die, DW_AT_MIPS_has_inlines, 1);
8472               comp_unit_has_inlines = 1;
8473             }
8474         }
8475 #endif
8476     }
8477 }
8478
8479 /* Generate a DIE to represent a declared data object.  */
8480
8481 static void
8482 gen_variable_die (decl, context_die)
8483      register tree decl;
8484      register dw_die_ref context_die;
8485 {
8486   register tree origin = decl_ultimate_origin (decl);
8487   register dw_die_ref var_die = new_die (DW_TAG_variable, context_die);
8488
8489   dw_die_ref old_die = lookup_decl_die (decl);
8490   int declaration
8491     = (DECL_EXTERNAL (decl)
8492        || current_function_decl != decl_function_context (decl)
8493        || context_die->die_tag == DW_TAG_structure_type
8494        || context_die->die_tag == DW_TAG_union_type);
8495
8496   if (origin != NULL)
8497     add_abstract_origin_attribute (var_die, origin);
8498   /* Loop unrolling can create multiple blocks that refer to the same
8499      static variable, so we must test for the DW_AT_declaration flag.  */
8500   /* ??? Loop unrolling/reorder_blocks should perhaps be rewritten to
8501      copy decls and set the DECL_ABSTRACT flag on them instead of
8502      sharing them.  */
8503   else if (old_die && TREE_STATIC (decl)
8504            && get_AT_flag (old_die, DW_AT_declaration) == 1)
8505     {
8506       /* This is a definition of a C++ class level static.  */
8507       add_AT_die_ref (var_die, DW_AT_specification, old_die);
8508       if (DECL_NAME (decl))
8509         {
8510           register unsigned file_index
8511             = lookup_filename (DECL_SOURCE_FILE (decl));
8512
8513           if (get_AT_unsigned (old_die, DW_AT_decl_file) != file_index)
8514             add_AT_unsigned (var_die, DW_AT_decl_file, file_index);
8515
8516           if (get_AT_unsigned (old_die, DW_AT_decl_line)
8517               != (unsigned)DECL_SOURCE_LINE (decl))
8518
8519             add_AT_unsigned (var_die, DW_AT_decl_line,
8520                              DECL_SOURCE_LINE (decl));
8521         }
8522     }
8523   else
8524     {
8525       add_name_and_src_coords_attributes (var_die, decl);
8526       add_type_attribute (var_die, TREE_TYPE (decl),
8527                           TREE_READONLY (decl),
8528                           TREE_THIS_VOLATILE (decl), context_die);
8529
8530       if (TREE_PUBLIC (decl))
8531         add_AT_flag (var_die, DW_AT_external, 1);
8532
8533       if (DECL_ARTIFICIAL (decl))
8534         add_AT_flag (var_die, DW_AT_artificial, 1);
8535
8536       if (TREE_PROTECTED (decl))
8537         add_AT_unsigned (var_die, DW_AT_accessibility, DW_ACCESS_protected);
8538
8539       else if (TREE_PRIVATE (decl))
8540         add_AT_unsigned (var_die, DW_AT_accessibility, DW_ACCESS_private);
8541     }
8542
8543   if (declaration)
8544     add_AT_flag (var_die, DW_AT_declaration, 1);
8545   
8546   if ((declaration && decl_class_context (decl)) || DECL_ABSTRACT (decl))
8547     equate_decl_number_to_die (decl, var_die);
8548
8549   if (! declaration && ! DECL_ABSTRACT (decl))
8550     {
8551       equate_decl_number_to_die (decl, var_die);
8552       add_location_or_const_value_attribute (var_die, decl);
8553       add_pubname (decl, var_die);
8554     }
8555 }
8556
8557 /* Generate a DIE to represent a label identifier.  */
8558
8559 static void
8560 gen_label_die (decl, context_die)
8561      register tree decl;
8562      register dw_die_ref context_die;
8563 {
8564   register tree origin = decl_ultimate_origin (decl);
8565   register dw_die_ref lbl_die = new_die (DW_TAG_label, context_die);
8566   register rtx insn;
8567   char label[MAX_ARTIFICIAL_LABEL_BYTES];
8568   char label2[MAX_ARTIFICIAL_LABEL_BYTES];
8569
8570   if (origin != NULL)
8571     add_abstract_origin_attribute (lbl_die, origin);
8572   else
8573     add_name_and_src_coords_attributes (lbl_die, decl);
8574
8575   if (DECL_ABSTRACT (decl))
8576     equate_decl_number_to_die (decl, lbl_die);
8577   else
8578     {
8579       insn = DECL_RTL (decl);
8580
8581       /* Deleted labels are programmer specified labels which have been
8582          eliminated because of various optimisations.  We still emit them
8583          here so that it is possible to put breakpoints on them.  */
8584       if (GET_CODE (insn) == CODE_LABEL
8585           || ((GET_CODE (insn) == NOTE
8586                && NOTE_LINE_NUMBER (insn) == NOTE_INSN_DELETED_LABEL)))
8587         {
8588           /* When optimization is enabled (via -O) some parts of the compiler 
8589              (e.g. jump.c and cse.c) may try to delete CODE_LABEL insns which 
8590              represent source-level labels which were explicitly declared by
8591              the user.  This really shouldn't be happening though, so catch
8592              it if it ever does happen.  */
8593           if (INSN_DELETED_P (insn))
8594             abort ();
8595
8596           sprintf (label2, INSN_LABEL_FMT, current_funcdef_number);
8597           ASM_GENERATE_INTERNAL_LABEL (label, label2,
8598                                        (unsigned) INSN_UID (insn));
8599           add_AT_lbl_id (lbl_die, DW_AT_low_pc, label);
8600         }
8601     }
8602 }
8603
8604 /* Generate a DIE for a lexical block.  */
8605
8606 static void
8607 gen_lexical_block_die (stmt, context_die, depth)
8608      register tree stmt;
8609      register dw_die_ref context_die;
8610      int depth;
8611 {
8612   register dw_die_ref stmt_die = new_die (DW_TAG_lexical_block, context_die);
8613   char label[MAX_ARTIFICIAL_LABEL_BYTES];
8614
8615   if (! BLOCK_ABSTRACT (stmt))
8616     {
8617       ASM_GENERATE_INTERNAL_LABEL (label, BLOCK_BEGIN_LABEL,
8618                                    next_block_number);
8619       add_AT_lbl_id (stmt_die, DW_AT_low_pc, label);
8620       ASM_GENERATE_INTERNAL_LABEL (label, BLOCK_END_LABEL, next_block_number);
8621       add_AT_lbl_id (stmt_die, DW_AT_high_pc, label);
8622     }
8623
8624   decls_for_scope (stmt, stmt_die, depth);
8625 }
8626
8627 /* Generate a DIE for an inlined subprogram.  */
8628
8629 static void
8630 gen_inlined_subroutine_die (stmt, context_die, depth)
8631      register tree stmt;
8632      register dw_die_ref context_die;
8633      int depth;
8634 {
8635   if (! BLOCK_ABSTRACT (stmt))
8636     {
8637       register dw_die_ref subr_die
8638         = new_die (DW_TAG_inlined_subroutine, context_die);
8639       register tree decl = block_ultimate_origin (stmt);
8640       char label[MAX_ARTIFICIAL_LABEL_BYTES];
8641
8642       /* Emit info for the abstract instance first, if we haven't yet.  */
8643       gen_abstract_function (decl);
8644
8645       add_abstract_origin_attribute (subr_die, decl);
8646       ASM_GENERATE_INTERNAL_LABEL (label, BLOCK_BEGIN_LABEL,
8647                                    next_block_number);
8648       add_AT_lbl_id (subr_die, DW_AT_low_pc, label);
8649       ASM_GENERATE_INTERNAL_LABEL (label, BLOCK_END_LABEL, next_block_number);
8650       add_AT_lbl_id (subr_die, DW_AT_high_pc, label);
8651       decls_for_scope (stmt, subr_die, depth);
8652       current_function_has_inlines = 1;
8653     }
8654 }
8655
8656 /* Generate a DIE for a field in a record, or structure.  */
8657
8658 static void
8659 gen_field_die (decl, context_die)
8660      register tree decl;
8661      register dw_die_ref context_die;
8662 {
8663   register dw_die_ref decl_die = new_die (DW_TAG_member, context_die);
8664
8665   add_name_and_src_coords_attributes (decl_die, decl);
8666   add_type_attribute (decl_die, member_declared_type (decl),
8667                       TREE_READONLY (decl), TREE_THIS_VOLATILE (decl),
8668                       context_die);
8669
8670   /* If this is a bit field...  */
8671   if (DECL_BIT_FIELD_TYPE (decl))
8672     {
8673       add_byte_size_attribute (decl_die, decl);
8674       add_bit_size_attribute (decl_die, decl);
8675       add_bit_offset_attribute (decl_die, decl);
8676     }
8677
8678   if (TREE_CODE (DECL_FIELD_CONTEXT (decl)) != UNION_TYPE)
8679     add_data_member_location_attribute (decl_die, decl);
8680
8681   if (DECL_ARTIFICIAL (decl))
8682     add_AT_flag (decl_die, DW_AT_artificial, 1);
8683
8684   if (TREE_PROTECTED (decl))
8685     add_AT_unsigned (decl_die, DW_AT_accessibility, DW_ACCESS_protected);
8686
8687   else if (TREE_PRIVATE (decl))
8688     add_AT_unsigned (decl_die, DW_AT_accessibility, DW_ACCESS_private);
8689 }
8690
8691 #if 0
8692 /* Don't generate either pointer_type DIEs or reference_type DIEs here.
8693    Use modified_type_die instead.
8694    We keep this code here just in case these types of DIEs may be needed to
8695    represent certain things in other languages (e.g. Pascal) someday.  */
8696 static void
8697 gen_pointer_type_die (type, context_die)
8698      register tree type;
8699      register dw_die_ref context_die;
8700 {
8701   register dw_die_ref ptr_die
8702     = new_die (DW_TAG_pointer_type, scope_die_for (type, context_die));
8703
8704   equate_type_number_to_die (type, ptr_die);
8705   add_type_attribute (ptr_die, TREE_TYPE (type), 0, 0, context_die);
8706   add_AT_unsigned (mod_type_die, DW_AT_byte_size, PTR_SIZE);
8707 }
8708
8709 /* Don't generate either pointer_type DIEs or reference_type DIEs here.
8710    Use modified_type_die instead.
8711    We keep this code here just in case these types of DIEs may be needed to
8712    represent certain things in other languages (e.g. Pascal) someday.  */
8713 static void
8714 gen_reference_type_die (type, context_die)
8715      register tree type;
8716      register dw_die_ref context_die;
8717 {
8718   register dw_die_ref ref_die
8719     = new_die (DW_TAG_reference_type, scope_die_for (type, context_die));
8720
8721   equate_type_number_to_die (type, ref_die);
8722   add_type_attribute (ref_die, TREE_TYPE (type), 0, 0, context_die);
8723   add_AT_unsigned (mod_type_die, DW_AT_byte_size, PTR_SIZE);
8724 }
8725 #endif
8726
8727 /* Generate a DIE for a pointer to a member type.  */
8728 static void
8729 gen_ptr_to_mbr_type_die (type, context_die)
8730      register tree type;
8731      register dw_die_ref context_die;
8732 {
8733   register dw_die_ref ptr_die
8734     = new_die (DW_TAG_ptr_to_member_type, scope_die_for (type, context_die));
8735
8736   equate_type_number_to_die (type, ptr_die);
8737   add_AT_die_ref (ptr_die, DW_AT_containing_type,
8738                   lookup_type_die (TYPE_OFFSET_BASETYPE (type)));
8739   add_type_attribute (ptr_die, TREE_TYPE (type), 0, 0, context_die);
8740 }
8741
8742 /* Generate the DIE for the compilation unit.  */
8743
8744 static dw_die_ref
8745 gen_compile_unit_die (filename)
8746      register const char *filename;
8747 {
8748   register dw_die_ref die;
8749   char producer[250];
8750   char *wd = getpwd ();
8751   int language;
8752
8753   die = new_die (DW_TAG_compile_unit, NULL);
8754   add_name_attribute (die, filename);
8755
8756   if (wd != NULL && filename[0] != DIR_SEPARATOR)
8757     add_AT_string (die, DW_AT_comp_dir, wd);
8758
8759   sprintf (producer, "%s %s", language_string, version_string);
8760
8761 #ifdef MIPS_DEBUGGING_INFO
8762   /* The MIPS/SGI compilers place the 'cc' command line options in the producer
8763      string.  The SGI debugger looks for -g, -g1, -g2, or -g3; if they do
8764      not appear in the producer string, the debugger reaches the conclusion
8765      that the object file is stripped and has no debugging information.
8766      To get the MIPS/SGI debugger to believe that there is debugging
8767      information in the object file, we add a -g to the producer string.  */
8768   if (debug_info_level > DINFO_LEVEL_TERSE)
8769     strcat (producer, " -g");
8770 #endif
8771
8772   add_AT_string (die, DW_AT_producer, producer);
8773
8774   if (strcmp (language_string, "GNU C++") == 0)
8775     language = DW_LANG_C_plus_plus;
8776   else if (strcmp (language_string, "GNU Ada") == 0)
8777     language = DW_LANG_Ada83;
8778   else if (strcmp (language_string, "GNU F77") == 0)
8779     language = DW_LANG_Fortran77;
8780   else if (strcmp (language_string, "GNU Pascal") == 0)
8781     language = DW_LANG_Pascal83;
8782   else if (flag_traditional)
8783     language = DW_LANG_C;
8784   else
8785     language = DW_LANG_C89;
8786
8787   add_AT_unsigned (die, DW_AT_language, language);
8788
8789   return die;
8790 }
8791
8792 /* Generate a DIE for a string type.  */
8793
8794 static void
8795 gen_string_type_die (type, context_die)
8796      register tree type;
8797      register dw_die_ref context_die;
8798 {
8799   register dw_die_ref type_die
8800     = new_die (DW_TAG_string_type, scope_die_for (type, context_die));
8801
8802   equate_type_number_to_die (type, type_die);
8803
8804   /* Fudge the string length attribute for now.  */
8805   
8806   /* TODO: add string length info.
8807    string_length_attribute (TYPE_MAX_VALUE (TYPE_DOMAIN (type)));
8808                               bound_representation (upper_bound, 0, 'u'); */
8809 }
8810
8811 /* Generate the DIE for a base class.  */
8812
8813 static void
8814 gen_inheritance_die (binfo, context_die)
8815      register tree binfo;
8816      register dw_die_ref context_die;
8817 {
8818   dw_die_ref die = new_die (DW_TAG_inheritance, context_die);
8819
8820   add_type_attribute (die, BINFO_TYPE (binfo), 0, 0, context_die);
8821   add_data_member_location_attribute (die, binfo);
8822
8823   if (TREE_VIA_VIRTUAL (binfo))
8824     add_AT_unsigned (die, DW_AT_virtuality, DW_VIRTUALITY_virtual);
8825   if (TREE_VIA_PUBLIC (binfo))
8826     add_AT_unsigned (die, DW_AT_accessibility, DW_ACCESS_public);
8827   else if (TREE_VIA_PROTECTED (binfo))
8828     add_AT_unsigned (die, DW_AT_accessibility, DW_ACCESS_protected);
8829 }
8830
8831 /* Generate a DIE for a class member.  */
8832
8833 static void
8834 gen_member_die (type, context_die)
8835      register tree type;
8836      register dw_die_ref context_die;
8837 {
8838   register tree member;
8839   dw_die_ref child;
8840
8841   /* If this is not an incomplete type, output descriptions of each of its
8842      members. Note that as we output the DIEs necessary to represent the
8843      members of this record or union type, we will also be trying to output
8844      DIEs to represent the *types* of those members. However the `type'
8845      function (above) will specifically avoid generating type DIEs for member 
8846      types *within* the list of member DIEs for this (containing) type execpt 
8847      for those types (of members) which are explicitly marked as also being
8848      members of this (containing) type themselves.  The g++ front- end can
8849      force any given type to be treated as a member of some other
8850      (containing) type by setting the TYPE_CONTEXT of the given (member) type 
8851      to point to the TREE node representing the appropriate (containing)
8852      type.  */
8853
8854   /* First output info about the base classes.  */
8855   if (TYPE_BINFO (type) && TYPE_BINFO_BASETYPES (type))
8856     {
8857       register tree bases = TYPE_BINFO_BASETYPES (type);
8858       register int n_bases = TREE_VEC_LENGTH (bases);
8859       register int i;
8860
8861       for (i = 0; i < n_bases; i++)
8862         gen_inheritance_die (TREE_VEC_ELT (bases, i), context_die);
8863     }
8864
8865   /* Now output info about the data members and type members.  */
8866   for (member = TYPE_FIELDS (type); member; member = TREE_CHAIN (member))
8867     {
8868       /* If we thought we were generating minimal debug info for TYPE
8869          and then changed our minds, some of the member declarations
8870          may have already been defined.  Don't define them again, but
8871          do put them in the right order.  */
8872
8873       child = lookup_decl_die (member);
8874       if (child)
8875         splice_child_die (context_die, child);
8876       else
8877         gen_decl_die (member, context_die);
8878     }
8879
8880   /* Now output info about the function members (if any).  */
8881   for (member = TYPE_METHODS (type); member; member = TREE_CHAIN (member))
8882     {
8883       child = lookup_decl_die (member);
8884       if (child)
8885         splice_child_die (context_die, child);
8886       else
8887         gen_decl_die (member, context_die);
8888     }
8889 }
8890
8891 /* Generate a DIE for a structure or union type.  If TYPE_DECL_SUPPRESS_DEBUG
8892    is set, we pretend that the type was never defined, so we only get the
8893    member DIEs needed by later specification DIEs.  */
8894
8895 static void
8896 gen_struct_or_union_type_die (type, context_die)
8897      register tree type;
8898      register dw_die_ref context_die;
8899 {
8900   register dw_die_ref type_die = lookup_type_die (type);
8901   register dw_die_ref scope_die = 0;
8902   register int nested = 0;
8903   int complete = (TYPE_SIZE (type)
8904                   && ! TYPE_DECL_SUPPRESS_DEBUG (TYPE_STUB_DECL (type)));
8905
8906   if (type_die && ! complete)
8907     return;
8908
8909   if (TYPE_CONTEXT (type) != NULL_TREE
8910       && AGGREGATE_TYPE_P (TYPE_CONTEXT (type)))
8911     nested = 1;
8912
8913   scope_die = scope_die_for (type, context_die);
8914
8915   if (! type_die || (nested && scope_die == comp_unit_die))
8916     /* First occurrence of type or toplevel definition of nested class.  */
8917     {
8918       register dw_die_ref old_die = type_die;
8919
8920       type_die = new_die (TREE_CODE (type) == RECORD_TYPE
8921                           ? DW_TAG_structure_type : DW_TAG_union_type,
8922                           scope_die);
8923       equate_type_number_to_die (type, type_die);
8924       add_name_attribute (type_die, type_tag (type));
8925       if (old_die)
8926         add_AT_die_ref (type_die, DW_AT_specification, old_die);
8927     }
8928   else
8929     remove_AT (type_die, DW_AT_declaration);
8930
8931   /* If this type has been completed, then give it a byte_size attribute and
8932      then give a list of members.  */
8933   if (complete)
8934     {
8935       /* Prevent infinite recursion in cases where the type of some member of 
8936          this type is expressed in terms of this type itself.  */
8937       TREE_ASM_WRITTEN (type) = 1;
8938       add_byte_size_attribute (type_die, type);
8939       if (TYPE_STUB_DECL (type) != NULL_TREE)
8940         add_src_coords_attributes (type_die, TYPE_STUB_DECL (type));
8941
8942       /* If the first reference to this type was as the return type of an
8943          inline function, then it may not have a parent.  Fix this now.  */
8944       if (type_die->die_parent == NULL)
8945         add_child_die (scope_die, type_die);
8946
8947       push_decl_scope (type);
8948       gen_member_die (type, type_die);
8949       pop_decl_scope ();
8950
8951       /* GNU extension: Record what type our vtable lives in.  */
8952       if (TYPE_VFIELD (type))
8953         {
8954           tree vtype = DECL_FCONTEXT (TYPE_VFIELD (type));
8955
8956           gen_type_die (vtype, context_die);
8957           add_AT_die_ref (type_die, DW_AT_containing_type,
8958                           lookup_type_die (vtype));
8959         }
8960     }
8961   else
8962     {
8963       add_AT_flag (type_die, DW_AT_declaration, 1);
8964
8965       /* We can't do this for function-local types, and we don't need to.  */
8966       if (! decl_function_context (TYPE_STUB_DECL (type)))
8967         add_incomplete_type (type);
8968     }
8969 }
8970
8971 /* Generate a DIE for a subroutine _type_.  */
8972
8973 static void
8974 gen_subroutine_type_die (type, context_die)
8975      register tree type;
8976      register dw_die_ref context_die;
8977 {
8978   register tree return_type = TREE_TYPE (type);
8979   register dw_die_ref subr_die
8980     = new_die (DW_TAG_subroutine_type, scope_die_for (type, context_die));
8981
8982   equate_type_number_to_die (type, subr_die);
8983   add_prototyped_attribute (subr_die, type);
8984   add_type_attribute (subr_die, return_type, 0, 0, context_die);
8985   gen_formal_types_die (type, subr_die);
8986 }
8987
8988 /* Generate a DIE for a type definition */
8989
8990 static void
8991 gen_typedef_die (decl, context_die)
8992      register tree decl;
8993      register dw_die_ref context_die;
8994 {
8995   register dw_die_ref type_die;
8996   register tree origin;
8997
8998   if (TREE_ASM_WRITTEN (decl))
8999     return;
9000   TREE_ASM_WRITTEN (decl) = 1;
9001
9002   type_die = new_die (DW_TAG_typedef, context_die);
9003   origin = decl_ultimate_origin (decl);
9004   if (origin != NULL)
9005     add_abstract_origin_attribute (type_die, origin);
9006   else
9007     {
9008       register tree type;
9009       add_name_and_src_coords_attributes (type_die, decl);
9010       if (DECL_ORIGINAL_TYPE (decl))
9011         {
9012           type = DECL_ORIGINAL_TYPE (decl);
9013           equate_type_number_to_die (TREE_TYPE (decl), type_die);
9014         }
9015       else
9016         type = TREE_TYPE (decl);
9017       add_type_attribute (type_die, type, TREE_READONLY (decl),
9018                           TREE_THIS_VOLATILE (decl), context_die);
9019     }
9020
9021   if (DECL_ABSTRACT (decl))
9022     equate_decl_number_to_die (decl, type_die);
9023 }
9024
9025 /* Generate a type description DIE.  */
9026
9027 static void
9028 gen_type_die (type, context_die)
9029      register tree type;
9030      register dw_die_ref context_die;
9031 {
9032   int need_pop;
9033
9034   if (type == NULL_TREE || type == error_mark_node)
9035     return;
9036
9037   /* We are going to output a DIE to represent the unqualified version of
9038      this type (i.e. without any const or volatile qualifiers) so get the
9039      main variant (i.e. the unqualified version) of this type now.  */
9040   type = type_main_variant (type);
9041
9042   if (TREE_ASM_WRITTEN (type))
9043     return;
9044
9045   if (TYPE_NAME (type) && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
9046       && DECL_ORIGINAL_TYPE (TYPE_NAME (type)))
9047     { 
9048       TREE_ASM_WRITTEN (type) = 1;
9049       gen_decl_die (TYPE_NAME (type), context_die);
9050       return;
9051     }
9052
9053   switch (TREE_CODE (type))
9054     {
9055     case ERROR_MARK:
9056       break;
9057
9058     case POINTER_TYPE:
9059     case REFERENCE_TYPE:
9060       /* We must set TREE_ASM_WRITTEN in case this is a recursive type.  This
9061          ensures that the gen_type_die recursion will terminate even if the
9062          type is recursive.  Recursive types are possible in Ada.  */
9063       /* ??? We could perhaps do this for all types before the switch
9064          statement.  */
9065       TREE_ASM_WRITTEN (type) = 1;
9066
9067       /* For these types, all that is required is that we output a DIE (or a
9068          set of DIEs) to represent the "basis" type.  */
9069       gen_type_die (TREE_TYPE (type), context_die);
9070       break;
9071
9072     case OFFSET_TYPE:
9073       /* This code is used for C++ pointer-to-data-member types. 
9074          Output a description of the relevant class type.  */
9075       gen_type_die (TYPE_OFFSET_BASETYPE (type), context_die);
9076
9077       /* Output a description of the type of the object pointed to.  */
9078       gen_type_die (TREE_TYPE (type), context_die);
9079
9080       /* Now output a DIE to represent this pointer-to-data-member type
9081          itself.  */
9082       gen_ptr_to_mbr_type_die (type, context_die);
9083       break;
9084
9085     case SET_TYPE:
9086       gen_type_die (TYPE_DOMAIN (type), context_die);
9087       gen_set_type_die (type, context_die);
9088       break;
9089
9090     case FILE_TYPE:
9091       gen_type_die (TREE_TYPE (type), context_die);
9092       abort ();                 /* No way to represent these in Dwarf yet!  */
9093       break;
9094
9095     case FUNCTION_TYPE:
9096       /* Force out return type (in case it wasn't forced out already).  */
9097       gen_type_die (TREE_TYPE (type), context_die);
9098       gen_subroutine_type_die (type, context_die);
9099       break;
9100
9101     case METHOD_TYPE:
9102       /* Force out return type (in case it wasn't forced out already).  */
9103       gen_type_die (TREE_TYPE (type), context_die);
9104       gen_subroutine_type_die (type, context_die);
9105       break;
9106
9107     case ARRAY_TYPE:
9108       if (TYPE_STRING_FLAG (type) && TREE_CODE (TREE_TYPE (type)) == CHAR_TYPE)
9109         {
9110           gen_type_die (TREE_TYPE (type), context_die);
9111           gen_string_type_die (type, context_die);
9112         }
9113       else
9114         gen_array_type_die (type, context_die);
9115       break;
9116
9117     case ENUMERAL_TYPE:
9118     case RECORD_TYPE:
9119     case UNION_TYPE:
9120     case QUAL_UNION_TYPE:
9121       /* If this is a nested type whose containing class hasn't been
9122          written out yet, writing it out will cover this one, too.
9123          This does not apply to instantiations of member class templates;
9124          they need to be added to the containing class as they are
9125          generated.  FIXME: This hurts the idea of combining type decls
9126          from multiple TUs, since we can't predict what set of template
9127          instantiations we'll get.  */
9128       if (TYPE_CONTEXT (type)
9129           && AGGREGATE_TYPE_P (TYPE_CONTEXT (type))
9130           && ! TREE_ASM_WRITTEN (TYPE_CONTEXT (type)))
9131         {
9132           gen_type_die (TYPE_CONTEXT (type), context_die);
9133
9134           if (TREE_ASM_WRITTEN (type))
9135             return;
9136
9137           /* If that failed, attach ourselves to the stub.  */
9138           push_decl_scope (TYPE_CONTEXT (type));
9139           context_die = lookup_type_die (TYPE_CONTEXT (type));
9140           need_pop = 1;
9141         }
9142       else
9143         need_pop = 0;
9144
9145       if (TREE_CODE (type) == ENUMERAL_TYPE)
9146         gen_enumeration_type_die (type, context_die);
9147       else
9148         gen_struct_or_union_type_die (type, context_die);
9149
9150       if (need_pop)
9151         pop_decl_scope ();
9152
9153       /* Don't set TREE_ASM_WRITTEN on an incomplete struct; we want to fix
9154          it up if it is ever completed.  gen_*_type_die will set it for us
9155          when appropriate.  */
9156       return;
9157
9158     case VOID_TYPE:
9159     case INTEGER_TYPE:
9160     case REAL_TYPE:
9161     case COMPLEX_TYPE:
9162     case BOOLEAN_TYPE:
9163     case CHAR_TYPE:
9164       /* No DIEs needed for fundamental types.  */
9165       break;
9166
9167     case LANG_TYPE:
9168       /* No Dwarf representation currently defined.  */
9169       break;
9170
9171     default:
9172       abort ();
9173     }
9174
9175   TREE_ASM_WRITTEN (type) = 1;
9176 }
9177
9178 /* Generate a DIE for a tagged type instantiation.  */
9179
9180 static void
9181 gen_tagged_type_instantiation_die (type, context_die)
9182      register tree type;
9183      register dw_die_ref context_die;
9184 {
9185   if (type == NULL_TREE || type == error_mark_node)
9186     return;
9187
9188   /* We are going to output a DIE to represent the unqualified version of
9189      this type (i.e. without any const or volatile qualifiers) so make sure
9190      that we have the main variant (i.e. the unqualified version) of this
9191      type now.  */
9192   if (type != type_main_variant (type))
9193     abort ();
9194
9195   /* Do not check TREE_ASM_WRITTEN(type) as it may not be set if this is
9196      an instance of an unresolved type.  */
9197   
9198   switch (TREE_CODE (type))
9199     {
9200     case ERROR_MARK:
9201       break;
9202
9203     case ENUMERAL_TYPE:
9204       gen_inlined_enumeration_type_die (type, context_die);
9205       break;
9206
9207     case RECORD_TYPE:
9208       gen_inlined_structure_type_die (type, context_die);
9209       break;
9210
9211     case UNION_TYPE:
9212     case QUAL_UNION_TYPE:
9213       gen_inlined_union_type_die (type, context_die);
9214       break;
9215
9216     default:
9217       abort ();
9218     }
9219 }
9220
9221 /* Generate a DW_TAG_lexical_block DIE followed by DIEs to represent all of the
9222    things which are local to the given block.  */
9223
9224 static void
9225 gen_block_die (stmt, context_die, depth)
9226      register tree stmt;
9227      register dw_die_ref context_die;
9228      int depth;
9229 {
9230   register int must_output_die = 0;
9231   register tree origin;
9232   register tree decl;
9233   register enum tree_code origin_code;
9234
9235   /* Ignore blocks never really used to make RTL.  */
9236
9237   if (stmt == NULL_TREE || !TREE_USED (stmt))
9238     return;
9239
9240   /* Determine the "ultimate origin" of this block.  This block may be an
9241      inlined instance of an inlined instance of inline function, so we have
9242      to trace all of the way back through the origin chain to find out what
9243      sort of node actually served as the original seed for the creation of
9244      the current block.  */
9245   origin = block_ultimate_origin (stmt);
9246   origin_code = (origin != NULL) ? TREE_CODE (origin) : ERROR_MARK;
9247
9248   /* Determine if we need to output any Dwarf DIEs at all to represent this
9249      block.  */
9250   if (origin_code == FUNCTION_DECL)
9251     /* The outer scopes for inlinings *must* always be represented.  We
9252        generate DW_TAG_inlined_subroutine DIEs for them.  (See below.) */
9253     must_output_die = 1;
9254   else
9255     {
9256       /* In the case where the current block represents an inlining of the
9257          "body block" of an inline function, we must *NOT* output any DIE for 
9258          this block because we have already output a DIE to represent the
9259          whole inlined function scope and the "body block" of any function
9260          doesn't really represent a different scope according to ANSI C
9261          rules.  So we check here to make sure that this block does not
9262          represent a "body block inlining" before trying to set the
9263          `must_output_die' flag.  */
9264       if (! is_body_block (origin ? origin : stmt))
9265         {
9266           /* Determine if this block directly contains any "significant"
9267              local declarations which we will need to output DIEs for.  */
9268           if (debug_info_level > DINFO_LEVEL_TERSE)
9269             /* We are not in terse mode so *any* local declaration counts
9270                as being a "significant" one.  */
9271             must_output_die = (BLOCK_VARS (stmt) != NULL);
9272           else
9273             /* We are in terse mode, so only local (nested) function
9274                definitions count as "significant" local declarations.  */
9275             for (decl = BLOCK_VARS (stmt);
9276                  decl != NULL; decl = TREE_CHAIN (decl))
9277               if (TREE_CODE (decl) == FUNCTION_DECL
9278                   && DECL_INITIAL (decl))
9279                 {
9280                   must_output_die = 1;
9281                   break;
9282                 }
9283         }
9284     }
9285
9286   /* It would be a waste of space to generate a Dwarf DW_TAG_lexical_block
9287      DIE for any block which contains no significant local declarations at
9288      all.  Rather, in such cases we just call `decls_for_scope' so that any
9289      needed Dwarf info for any sub-blocks will get properly generated. Note
9290      that in terse mode, our definition of what constitutes a "significant"
9291      local declaration gets restricted to include only inlined function
9292      instances and local (nested) function definitions.  */
9293   if (must_output_die)
9294     {
9295       if (origin_code == FUNCTION_DECL)
9296         gen_inlined_subroutine_die (stmt, context_die, depth);
9297       else
9298         gen_lexical_block_die (stmt, context_die, depth);
9299     }
9300   else
9301     decls_for_scope (stmt, context_die, depth);
9302 }
9303
9304 /* Generate all of the decls declared within a given scope and (recursively)
9305    all of its sub-blocks.  */
9306
9307 static void
9308 decls_for_scope (stmt, context_die, depth)
9309      register tree stmt;
9310      register dw_die_ref context_die;
9311      int depth;
9312 {
9313   register tree decl;
9314   register tree subblocks;
9315
9316   /* Ignore blocks never really used to make RTL.  */
9317   if (stmt == NULL_TREE || ! TREE_USED (stmt))
9318     return;
9319
9320   if (!BLOCK_ABSTRACT (stmt) && depth > 0)
9321     next_block_number++;
9322
9323   /* Output the DIEs to represent all of the data objects and typedefs
9324      declared directly within this block but not within any nested
9325      sub-blocks.  Also, nested function and tag DIEs have been
9326      generated with a parent of NULL; fix that up now.  */
9327   for (decl = BLOCK_VARS (stmt);
9328        decl != NULL; decl = TREE_CHAIN (decl))
9329     {
9330       register dw_die_ref die;
9331
9332       if (TREE_CODE (decl) == FUNCTION_DECL)
9333         die = lookup_decl_die (decl);
9334       else if (TREE_CODE (decl) == TYPE_DECL && TYPE_DECL_IS_STUB (decl))
9335         die = lookup_type_die (TREE_TYPE (decl));
9336       else
9337         die = NULL;
9338
9339       if (die != NULL && die->die_parent == NULL)
9340         add_child_die (context_die, die);
9341       else
9342         gen_decl_die (decl, context_die);
9343     }
9344
9345   /* Output the DIEs to represent all sub-blocks (and the items declared
9346      therein) of this block.  */
9347   for (subblocks = BLOCK_SUBBLOCKS (stmt);
9348        subblocks != NULL;
9349        subblocks = BLOCK_CHAIN (subblocks))
9350     gen_block_die (subblocks, context_die, depth + 1);
9351 }
9352
9353 /* Is this a typedef we can avoid emitting?  */
9354
9355 static inline int
9356 is_redundant_typedef (decl)
9357      register tree decl;
9358 {
9359   if (TYPE_DECL_IS_STUB (decl))
9360     return 1;
9361
9362   if (DECL_ARTIFICIAL (decl)
9363       && DECL_CONTEXT (decl)
9364       && is_tagged_type (DECL_CONTEXT (decl))
9365       && TREE_CODE (TYPE_NAME (DECL_CONTEXT (decl))) == TYPE_DECL
9366       && DECL_NAME (decl) == DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl))))
9367     /* Also ignore the artificial member typedef for the class name.  */
9368     return 1;
9369
9370   return 0;
9371 }
9372
9373 /* Generate Dwarf debug information for a decl described by DECL.  */
9374
9375 static void
9376 gen_decl_die (decl, context_die)
9377      register tree decl;
9378      register dw_die_ref context_die;
9379 {
9380   register tree origin;
9381
9382   if (TREE_CODE (decl) == ERROR_MARK)
9383     return;
9384
9385   /* If this ..._DECL node is marked to be ignored, then ignore it. But don't 
9386      ignore a function definition, since that would screw up our count of
9387      blocks, and that in turn will completely screw up the labels we will 
9388      reference in subsequent DW_AT_low_pc and DW_AT_high_pc attributes (for
9389      subsequent blocks).  */
9390   if (DECL_IGNORED_P (decl) && TREE_CODE (decl) != FUNCTION_DECL)
9391     return;
9392
9393   switch (TREE_CODE (decl))
9394     {
9395     case CONST_DECL:
9396       /* The individual enumerators of an enum type get output when we output 
9397          the Dwarf representation of the relevant enum type itself.  */
9398       break;
9399
9400     case FUNCTION_DECL:
9401       /* Don't output any DIEs to represent mere function declarations,
9402          unless they are class members or explicit block externs.  */
9403       if (DECL_INITIAL (decl) == NULL_TREE && DECL_CONTEXT (decl) == NULL_TREE
9404           && (current_function_decl == NULL_TREE || DECL_ARTIFICIAL (decl)))
9405         break;
9406
9407       /* Emit info for the abstract instance first, if we haven't yet.  */
9408       origin = decl_ultimate_origin (decl);
9409       if (origin)
9410         gen_abstract_function (origin);
9411
9412       if (debug_info_level > DINFO_LEVEL_TERSE)
9413         {
9414           /* Before we describe the FUNCTION_DECL itself, make sure that we
9415              have described its return type.  */
9416           gen_type_die (TREE_TYPE (TREE_TYPE (decl)), context_die);
9417
9418           /* And its virtual context.  */
9419           if (DECL_VINDEX (decl) != NULL_TREE)
9420             gen_type_die (DECL_CONTEXT (decl), context_die);
9421
9422           /* And its containing type.  */
9423           origin = decl_class_context (decl);
9424           if (origin != NULL_TREE)
9425             gen_type_die_for_member (origin, decl, context_die);
9426         }
9427
9428       /* Now output a DIE to represent the function itself.  */
9429       gen_subprogram_die (decl, context_die);
9430       break;
9431
9432     case TYPE_DECL:
9433       /* If we are in terse mode, don't generate any DIEs to represent any
9434          actual typedefs.  */
9435       if (debug_info_level <= DINFO_LEVEL_TERSE)
9436         break;
9437
9438       /* In the special case of a TYPE_DECL node representing the 
9439          declaration of some type tag, if the given TYPE_DECL is marked as
9440          having been instantiated from some other (original) TYPE_DECL node
9441          (e.g. one which was generated within the original definition of an
9442          inline function) we have to generate a special (abbreviated)
9443          DW_TAG_structure_type, DW_TAG_union_type, or DW_TAG_enumeration_type 
9444          DIE here.  */
9445       if (TYPE_DECL_IS_STUB (decl) && decl_ultimate_origin (decl) != NULL_TREE)
9446         {
9447           gen_tagged_type_instantiation_die (TREE_TYPE (decl), context_die);
9448           break;
9449         }
9450
9451       if (is_redundant_typedef (decl))
9452         gen_type_die (TREE_TYPE (decl), context_die);
9453       else
9454         /* Output a DIE to represent the typedef itself.  */
9455         gen_typedef_die (decl, context_die);
9456       break;
9457
9458     case LABEL_DECL:
9459       if (debug_info_level >= DINFO_LEVEL_NORMAL)
9460         gen_label_die (decl, context_die);
9461       break;
9462
9463     case VAR_DECL:
9464       /* If we are in terse mode, don't generate any DIEs to represent any
9465          variable declarations or definitions.  */
9466       if (debug_info_level <= DINFO_LEVEL_TERSE)
9467         break;
9468
9469       /* Output any DIEs that are needed to specify the type of this data
9470          object.  */
9471       gen_type_die (TREE_TYPE (decl), context_die);
9472
9473       /* And its containing type.  */
9474       origin = decl_class_context (decl);
9475       if (origin != NULL_TREE)
9476         gen_type_die_for_member (origin, decl, context_die);
9477
9478       /* Now output the DIE to represent the data object itself.  This gets
9479          complicated because of the possibility that the VAR_DECL really
9480          represents an inlined instance of a formal parameter for an inline
9481          function.  */
9482       origin = decl_ultimate_origin (decl);
9483       if (origin != NULL_TREE && TREE_CODE (origin) == PARM_DECL)
9484         gen_formal_parameter_die (decl, context_die);
9485       else
9486         gen_variable_die (decl, context_die);
9487       break;
9488
9489     case FIELD_DECL:
9490       /* Ignore the nameless fields that are used to skip bits, but
9491          handle C++ anonymous unions.  */
9492       if (DECL_NAME (decl) != NULL_TREE
9493           || TREE_CODE (TREE_TYPE (decl)) == UNION_TYPE)
9494         {
9495           gen_type_die (member_declared_type (decl), context_die);
9496           gen_field_die (decl, context_die);
9497         }
9498       break;
9499
9500     case PARM_DECL:
9501       gen_type_die (TREE_TYPE (decl), context_die);
9502       gen_formal_parameter_die (decl, context_die);
9503       break;
9504
9505     case NAMESPACE_DECL:
9506       /* Ignore for now.  */
9507       break;
9508
9509     default:
9510       abort ();
9511     }
9512 }
9513 \f
9514 /* Add Ada "use" clause information for SGI Workshop debugger.  */
9515
9516 void
9517 dwarf2out_add_library_unit_info (filename, context_list)
9518      char *filename;
9519      char *context_list;
9520 {
9521   unsigned int file_index;
9522
9523   if (filename != NULL)
9524     {
9525       dw_die_ref unit_die = new_die (DW_TAG_module, comp_unit_die);
9526       tree context_list_decl 
9527         = build_decl (LABEL_DECL, get_identifier (context_list),
9528                       void_type_node);
9529
9530       TREE_PUBLIC (context_list_decl) = TRUE;
9531       add_name_attribute (unit_die, context_list);
9532       file_index = lookup_filename (filename);
9533       add_AT_unsigned (unit_die, DW_AT_decl_file, file_index);
9534       add_pubname (context_list_decl, unit_die);
9535     }
9536 }
9537
9538 /* Write the debugging output for DECL.  */
9539
9540 void
9541 dwarf2out_decl (decl)
9542      register tree decl;
9543 {
9544   register dw_die_ref context_die = comp_unit_die;
9545
9546   if (TREE_CODE (decl) == ERROR_MARK)
9547     return;
9548
9549   /* If this ..._DECL node is marked to be ignored, then ignore it.  We gotta 
9550      hope that the node in question doesn't represent a function definition.
9551      If it does, then totally ignoring it is bound to screw up our count of
9552      blocks, and that in turn will completely screw up the labels we will 
9553      reference in subsequent DW_AT_low_pc and DW_AT_high_pc attributes (for
9554      subsequent blocks).  (It's too bad that BLOCK nodes don't carry their
9555      own sequence numbers with them!) */
9556   if (DECL_IGNORED_P (decl))
9557     {
9558       if (TREE_CODE (decl) == FUNCTION_DECL
9559           && DECL_INITIAL (decl) != NULL)
9560         abort ();
9561
9562       return;
9563     }
9564
9565   switch (TREE_CODE (decl))
9566     {
9567     case FUNCTION_DECL:
9568       /* Ignore this FUNCTION_DECL if it refers to a builtin declaration of a 
9569          builtin function.  Explicit programmer-supplied declarations of
9570          these same functions should NOT be ignored however.  */
9571       if (DECL_EXTERNAL (decl) && DECL_FUNCTION_CODE (decl))
9572         return;
9573
9574       /* What we would really like to do here is to filter out all mere
9575          file-scope declarations of file-scope functions which are never
9576          referenced later within this translation unit (and keep all of ones
9577          that *are* referenced later on) but we aren't clairvoyant, so we have 
9578          no idea which functions will be referenced in the future (i.e. later 
9579          on within the current translation unit). So here we just ignore all
9580          file-scope function declarations which are not also definitions.  If 
9581          and when the debugger needs to know something about these functions,
9582          it will have to hunt around and find the DWARF information associated 
9583          with the definition of the function.  Note that we can't just check
9584          `DECL_EXTERNAL' to find out which FUNCTION_DECL nodes represent
9585          definitions and which ones represent mere declarations.  We have to
9586          check `DECL_INITIAL' instead. That's because the C front-end
9587          supports some weird semantics for "extern inline" function
9588          definitions.  These can get inlined within the current translation
9589          unit (an thus, we need to generate DWARF info for their abstract
9590          instances so that the DWARF info for the concrete inlined instances
9591          can have something to refer to) but the compiler never generates any 
9592          out-of-lines instances of such things (despite the fact that they
9593          *are* definitions).  The important point is that the C front-end
9594          marks these "extern inline" functions as DECL_EXTERNAL, but we need
9595          to generate DWARF for them anyway. Note that the C++ front-end also
9596          plays some similar games for inline function definitions appearing
9597          within include files which also contain 
9598          `#pragma interface' pragmas.  */
9599       if (DECL_INITIAL (decl) == NULL_TREE)
9600         return;
9601
9602       /* If we're a nested function, initially use a parent of NULL; if we're
9603          a plain function, this will be fixed up in decls_for_scope.  If
9604          we're a method, it will be ignored, since we already have a DIE.  */
9605       if (decl_function_context (decl))
9606         context_die = NULL;
9607
9608       break;
9609
9610     case VAR_DECL:
9611       /* Ignore this VAR_DECL if it refers to a file-scope extern data object 
9612          declaration and if the declaration was never even referenced from
9613          within this entire compilation unit.  We suppress these DIEs in
9614          order to save space in the .debug section (by eliminating entries
9615          which are probably useless).  Note that we must not suppress
9616          block-local extern declarations (whether used or not) because that
9617          would screw-up the debugger's name lookup mechanism and cause it to
9618          miss things which really ought to be in scope at a given point.  */
9619       if (DECL_EXTERNAL (decl) && !TREE_USED (decl))
9620         return;
9621
9622       /* If we are in terse mode, don't generate any DIEs to represent any
9623          variable declarations or definitions.  */
9624       if (debug_info_level <= DINFO_LEVEL_TERSE)
9625         return;
9626       break;
9627
9628     case TYPE_DECL:
9629       /* Don't bother trying to generate any DIEs to represent any of the
9630          normal built-in types for the language we are compiling.  */
9631       if (DECL_SOURCE_LINE (decl) == 0)
9632         {
9633           /* OK, we need to generate one for `bool' so GDB knows what type
9634              comparisons have.  */
9635           if ((get_AT_unsigned (comp_unit_die, DW_AT_language)
9636                == DW_LANG_C_plus_plus)
9637               && TREE_CODE (TREE_TYPE (decl)) == BOOLEAN_TYPE)
9638             modified_type_die (TREE_TYPE (decl), 0, 0, NULL);
9639
9640           return;
9641         }
9642
9643       /* If we are in terse mode, don't generate any DIEs for types.  */
9644       if (debug_info_level <= DINFO_LEVEL_TERSE)
9645         return;
9646
9647       /* If we're a function-scope tag, initially use a parent of NULL;
9648          this will be fixed up in decls_for_scope.  */
9649       if (decl_function_context (decl))
9650         context_die = NULL;
9651
9652       break;
9653
9654     default:
9655       return;
9656     }
9657
9658   gen_decl_die (decl, context_die);
9659 }
9660
9661 /* Output a marker (i.e. a label) for the beginning of the generated code for
9662    a lexical block.  */
9663
9664 void
9665 dwarf2out_begin_block (blocknum)
9666      register unsigned blocknum;
9667 {
9668   function_section (current_function_decl);
9669   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, BLOCK_BEGIN_LABEL, blocknum);
9670 }
9671
9672 /* Output a marker (i.e. a label) for the end of the generated code for a
9673    lexical block.  */
9674
9675 void
9676 dwarf2out_end_block (blocknum)
9677      register unsigned blocknum;
9678 {
9679   function_section (current_function_decl);
9680   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, BLOCK_END_LABEL, blocknum);
9681 }
9682
9683 /* Output a marker (i.e. a label) at a point in the assembly code which
9684    corresponds to a given source level label.  */
9685
9686 void
9687 dwarf2out_label (insn)
9688      register rtx insn;
9689 {
9690   char label[MAX_ARTIFICIAL_LABEL_BYTES];
9691
9692   if (debug_info_level >= DINFO_LEVEL_NORMAL)
9693     {
9694       function_section (current_function_decl);
9695       sprintf (label, INSN_LABEL_FMT, current_funcdef_number);
9696       ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, label,
9697                                  (unsigned) INSN_UID (insn));
9698     }
9699 }
9700
9701 /* Lookup a filename (in the list of filenames that we know about here in
9702    dwarf2out.c) and return its "index".  The index of each (known) filename is
9703    just a unique number which is associated with only that one filename.
9704    We need such numbers for the sake of generating labels
9705    (in the .debug_sfnames section) and references to those
9706    files  numbers (in the .debug_srcinfo and.debug_macinfo sections).
9707    If the filename given as an argument is not found in our current list,
9708    add it to the list and assign it the next available unique index number.
9709    In order to speed up searches, we remember the index of the filename
9710    was looked up last.  This handles the majority of all searches.  */
9711
9712 static unsigned
9713 lookup_filename (file_name)
9714      const char *file_name;
9715 {
9716   static unsigned last_file_lookup_index = 0;
9717   register unsigned i;
9718
9719   /* Check to see if the file name that was searched on the previous call
9720      matches this file name. If so, return the index.  */
9721   if (last_file_lookup_index != 0)
9722     if (strcmp (file_name, file_table[last_file_lookup_index]) == 0)
9723       return last_file_lookup_index;
9724
9725   /* Didn't match the previous lookup, search the table */
9726   for (i = 1; i < file_table_in_use; ++i)
9727     if (strcmp (file_name, file_table[i]) == 0)
9728       {
9729         last_file_lookup_index = i;
9730         return i;
9731       }
9732
9733   /* Prepare to add a new table entry by making sure there is enough space in 
9734      the table to do so.  If not, expand the current table.  */
9735   if (file_table_in_use == file_table_allocated)
9736     {
9737       file_table_allocated += FILE_TABLE_INCREMENT;
9738       file_table
9739         = (char **) xrealloc (file_table,
9740                               file_table_allocated * sizeof (char *));
9741     }
9742
9743   /* Add the new entry to the end of the filename table.  */
9744   file_table[file_table_in_use] = xstrdup (file_name);
9745   last_file_lookup_index = file_table_in_use++;
9746
9747   return last_file_lookup_index;
9748 }
9749
9750 /* Output a label to mark the beginning of a source code line entry
9751    and record information relating to this source line, in
9752    'line_info_table' for later output of the .debug_line section.  */
9753
9754 void
9755 dwarf2out_line (filename, line)
9756      register const char *filename;
9757      register unsigned line;
9758 {
9759   if (debug_info_level >= DINFO_LEVEL_NORMAL)
9760     {
9761       function_section (current_function_decl);
9762
9763       if (DWARF2_ASM_LINE_DEBUG_INFO)
9764         {
9765           static const char *lastfile;
9766
9767           /* Emit the .file and .loc directives understood by GNU as.  */
9768           if (lastfile == 0 || strcmp (filename, lastfile))
9769             {
9770               if (lastfile == 0)
9771                 ggc_add_string_root ((char **) &lastfile, 1);
9772
9773               fprintf (asm_out_file, "\t.file 0 \"%s\"\n", filename);
9774               lastfile = filename;
9775             }
9776
9777           fprintf (asm_out_file, "\t.loc 0 %d 0\n", line);
9778
9779           /* Indicate that line number info exists.  */
9780           ++line_info_table_in_use;
9781
9782           /* Indicate that multiple line number tables exist.  */
9783           if (DECL_SECTION_NAME (current_function_decl))
9784             ++separate_line_info_table_in_use;
9785         }
9786       else if (DECL_SECTION_NAME (current_function_decl))
9787         {
9788           register dw_separate_line_info_ref line_info;
9789           ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, SEPARATE_LINE_CODE_LABEL,
9790                                      separate_line_info_table_in_use);
9791           if (flag_debug_asm)
9792             fprintf (asm_out_file, "\t%s line %d", ASM_COMMENT_START, line);
9793           fputc ('\n', asm_out_file);
9794
9795           /* expand the line info table if necessary */
9796           if (separate_line_info_table_in_use
9797               == separate_line_info_table_allocated)
9798             {
9799               separate_line_info_table_allocated += LINE_INFO_TABLE_INCREMENT;
9800               separate_line_info_table
9801                 = (dw_separate_line_info_ref)
9802                   xrealloc (separate_line_info_table,
9803                             separate_line_info_table_allocated
9804                             * sizeof (dw_separate_line_info_entry));
9805             }
9806
9807           /* Add the new entry at the end of the line_info_table.  */
9808           line_info
9809             = &separate_line_info_table[separate_line_info_table_in_use++];
9810           line_info->dw_file_num = lookup_filename (filename);
9811           line_info->dw_line_num = line;
9812           line_info->function = current_funcdef_number;
9813         }
9814       else
9815         {
9816           register dw_line_info_ref line_info;
9817
9818           ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, LINE_CODE_LABEL,
9819                                      line_info_table_in_use);
9820           if (flag_debug_asm)
9821             fprintf (asm_out_file, "\t%s line %d", ASM_COMMENT_START, line);
9822           fputc ('\n', asm_out_file);
9823
9824           /* Expand the line info table if necessary.  */
9825           if (line_info_table_in_use == line_info_table_allocated)
9826             {
9827               line_info_table_allocated += LINE_INFO_TABLE_INCREMENT;
9828               line_info_table
9829                 = (dw_line_info_ref)
9830                   xrealloc (line_info_table,
9831                             (line_info_table_allocated
9832                              * sizeof (dw_line_info_entry)));
9833             }
9834
9835           /* Add the new entry at the end of the line_info_table.  */
9836           line_info = &line_info_table[line_info_table_in_use++];
9837           line_info->dw_file_num = lookup_filename (filename);
9838           line_info->dw_line_num = line;
9839         }
9840     }
9841 }
9842
9843 /* Record the beginning of a new source file, for later output
9844    of the .debug_macinfo section.  At present, unimplemented.  */
9845
9846 void
9847 dwarf2out_start_source_file (filename)
9848      register const char *filename ATTRIBUTE_UNUSED;
9849 {
9850 }
9851
9852 /* Record the end of a source file, for later output
9853    of the .debug_macinfo section.  At present, unimplemented.  */
9854
9855 void
9856 dwarf2out_end_source_file ()
9857 {
9858 }
9859
9860 /* Called from check_newline in c-parse.y.  The `buffer' parameter contains
9861    the tail part of the directive line, i.e. the part which is past the
9862    initial whitespace, #, whitespace, directive-name, whitespace part.  */
9863
9864 void
9865 dwarf2out_define (lineno, buffer)
9866      register unsigned lineno ATTRIBUTE_UNUSED;
9867      register const char *buffer ATTRIBUTE_UNUSED;
9868 {
9869   static int initialized = 0;
9870   if (!initialized)
9871     {
9872       dwarf2out_start_source_file (primary_filename);
9873       initialized = 1;
9874     }
9875 }
9876
9877 /* Called from check_newline in c-parse.y.  The `buffer' parameter contains
9878    the tail part of the directive line, i.e. the part which is past the
9879    initial whitespace, #, whitespace, directive-name, whitespace part.  */
9880
9881 void
9882 dwarf2out_undef (lineno, buffer)
9883      register unsigned lineno ATTRIBUTE_UNUSED;
9884      register const char *buffer ATTRIBUTE_UNUSED;
9885 {
9886 }
9887
9888 /* Set up for Dwarf output at the start of compilation.  */
9889
9890 void
9891 dwarf2out_init (asm_out_file, main_input_filename)
9892      register FILE *asm_out_file;
9893      register char *main_input_filename;
9894 {
9895   /* Remember the name of the primary input file.  */
9896   primary_filename = main_input_filename;
9897
9898   /* Allocate the initial hunk of the file_table.  */
9899   file_table = (char **) xcalloc (FILE_TABLE_INCREMENT, sizeof (char *));
9900   file_table_allocated = FILE_TABLE_INCREMENT;
9901
9902   /* Skip the first entry - file numbers begin at 1.  */
9903   file_table_in_use = 1;
9904
9905   /* Allocate the initial hunk of the decl_die_table.  */
9906   decl_die_table
9907     = (dw_die_ref *) xcalloc (DECL_DIE_TABLE_INCREMENT, sizeof (dw_die_ref));
9908   decl_die_table_allocated = DECL_DIE_TABLE_INCREMENT;
9909   decl_die_table_in_use = 0;
9910
9911   /* Allocate the initial hunk of the decl_scope_table.  */
9912   decl_scope_table
9913     = (tree *) xcalloc (DECL_SCOPE_TABLE_INCREMENT, sizeof (tree));
9914   decl_scope_table_allocated = DECL_SCOPE_TABLE_INCREMENT;
9915   decl_scope_depth = 0;
9916
9917   /* Allocate the initial hunk of the abbrev_die_table.  */
9918   abbrev_die_table
9919     = (dw_die_ref *) xcalloc (ABBREV_DIE_TABLE_INCREMENT,
9920                               sizeof (dw_die_ref));
9921   abbrev_die_table_allocated = ABBREV_DIE_TABLE_INCREMENT;
9922   /* Zero-th entry is allocated, but unused */
9923   abbrev_die_table_in_use = 1;
9924
9925   /* Allocate the initial hunk of the line_info_table.  */
9926   line_info_table
9927     = (dw_line_info_ref) xcalloc (LINE_INFO_TABLE_INCREMENT,
9928                                   sizeof (dw_line_info_entry));
9929   line_info_table_allocated = LINE_INFO_TABLE_INCREMENT;
9930   /* Zero-th entry is allocated, but unused */
9931   line_info_table_in_use = 1;
9932
9933   /* Generate the initial DIE for the .debug section.  Note that the (string) 
9934      value given in the DW_AT_name attribute of the DW_TAG_compile_unit DIE
9935      will (typically) be a relative pathname and that this pathname should be 
9936      taken as being relative to the directory from which the compiler was
9937      invoked when the given (base) source file was compiled.  */
9938   comp_unit_die = gen_compile_unit_die (main_input_filename);
9939
9940   ASM_GENERATE_INTERNAL_LABEL (text_end_label, TEXT_END_LABEL, 0);
9941   ASM_GENERATE_INTERNAL_LABEL (abbrev_section_label, ABBREV_SECTION_LABEL, 0);
9942   if (DWARF2_GENERATE_TEXT_SECTION_LABEL)
9943     ASM_GENERATE_INTERNAL_LABEL (text_section_label, TEXT_SECTION_LABEL, 0);
9944   else
9945     strcpy (text_section_label, stripattributes (TEXT_SECTION));
9946   ASM_GENERATE_INTERNAL_LABEL (debug_info_section_label, 
9947                                DEBUG_INFO_SECTION_LABEL, 0);
9948   ASM_GENERATE_INTERNAL_LABEL (debug_line_section_label, 
9949                                DEBUG_LINE_SECTION_LABEL, 0);
9950
9951   ASM_OUTPUT_SECTION (asm_out_file, ABBREV_SECTION);
9952   ASM_OUTPUT_LABEL (asm_out_file, abbrev_section_label);
9953   if (DWARF2_GENERATE_TEXT_SECTION_LABEL)
9954     {
9955       ASM_OUTPUT_SECTION (asm_out_file, TEXT_SECTION);
9956       ASM_OUTPUT_LABEL (asm_out_file, text_section_label);
9957     }
9958   ASM_OUTPUT_SECTION (asm_out_file, DEBUG_INFO_SECTION);
9959   ASM_OUTPUT_LABEL (asm_out_file, debug_info_section_label);
9960   ASM_OUTPUT_SECTION (asm_out_file, DEBUG_LINE_SECTION);
9961   ASM_OUTPUT_LABEL (asm_out_file, debug_line_section_label);
9962 }
9963
9964 /* Output stuff that dwarf requires at the end of every file,
9965    and generate the DWARF-2 debugging info.  */
9966
9967 void
9968 dwarf2out_finish ()
9969 {
9970   limbo_die_node *node, *next_node;
9971   dw_die_ref die;
9972
9973   /* Traverse the limbo die list, and add parent/child links.  The only
9974      dies without parents that should be here are concrete instances of
9975      inline functions, and the comp_unit_die.  We can ignore the comp_unit_die.
9976      For concrete instances, we can get the parent die from the abstract
9977      instance.  */
9978   for (node = limbo_die_list; node; node = next_node)
9979     {
9980       next_node = node->next;
9981       die = node->die;
9982
9983       if (die->die_parent == NULL)
9984         {
9985           dw_die_ref origin = get_AT_ref (die, DW_AT_abstract_origin);
9986           if (origin)
9987             add_child_die (origin->die_parent, die);
9988           else if (die == comp_unit_die)
9989             ;
9990           else
9991             abort ();
9992         }
9993       free (node);
9994     }
9995   limbo_die_list = NULL;
9996
9997   /* Walk through the list of incomplete types again, trying once more to
9998      emit full debugging info for them.  */
9999   retry_incomplete_types ();
10000
10001   /* Traverse the DIE's, reverse their lists of attributes and children,
10002      and add add sibling attributes to those DIE's that have children.  */
10003   add_sibling_attributes (comp_unit_die);
10004
10005   /* Output a terminator label for the .text section.  */
10006   fputc ('\n', asm_out_file);
10007   ASM_OUTPUT_SECTION (asm_out_file, TEXT_SECTION);
10008   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, TEXT_END_LABEL, 0);
10009
10010 #if 0
10011   /* Output a terminator label for the .data section.  */
10012   fputc ('\n', asm_out_file);
10013   ASM_OUTPUT_SECTION (asm_out_file, DATA_SECTION);
10014   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, DATA_END_LABEL, 0);
10015
10016   /* Output a terminator label for the .bss section.  */
10017   fputc ('\n', asm_out_file);
10018   ASM_OUTPUT_SECTION (asm_out_file, BSS_SECTION);
10019   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, BSS_END_LABEL, 0);
10020 #endif
10021
10022   /* Output the source line correspondence table.  */
10023   if (line_info_table_in_use > 1 || separate_line_info_table_in_use)
10024     {
10025       if (! DWARF2_ASM_LINE_DEBUG_INFO)
10026         {
10027           fputc ('\n', asm_out_file);
10028           ASM_OUTPUT_SECTION (asm_out_file, DEBUG_LINE_SECTION);
10029           output_line_info ();
10030         }
10031
10032       /* We can only use the low/high_pc attributes if all of the code
10033          was in .text.  */
10034       if (separate_line_info_table_in_use == 0)
10035         {
10036           add_AT_lbl_id (comp_unit_die, DW_AT_low_pc, text_section_label);
10037           add_AT_lbl_id (comp_unit_die, DW_AT_high_pc, text_end_label);
10038         }
10039
10040       add_AT_lbl_offset (comp_unit_die, DW_AT_stmt_list,
10041                          debug_line_section_label);
10042     }
10043
10044 #if 0 /* unimplemented */
10045   if (debug_info_level >= DINFO_LEVEL_VERBOSE && primary)
10046     add_AT_unsigned (die, DW_AT_macro_info, 0);
10047 #endif
10048
10049   /* Output the abbreviation table.  */
10050   fputc ('\n', asm_out_file);
10051   ASM_OUTPUT_SECTION (asm_out_file, ABBREV_SECTION);
10052   build_abbrev_table (comp_unit_die);
10053   output_abbrev_section ();
10054
10055   /* Initialize the beginning DIE offset - and calculate sizes/offsets.   */
10056   next_die_offset = DWARF_COMPILE_UNIT_HEADER_SIZE;
10057   calc_die_sizes (comp_unit_die);
10058
10059   /* Output debugging information.  */
10060   fputc ('\n', asm_out_file);
10061   ASM_OUTPUT_SECTION (asm_out_file, DEBUG_INFO_SECTION);
10062   output_compilation_unit_header ();
10063   output_die (comp_unit_die);
10064
10065   if (pubname_table_in_use)
10066     {
10067       /* Output public names table.  */
10068       fputc ('\n', asm_out_file);
10069       ASM_OUTPUT_SECTION (asm_out_file, PUBNAMES_SECTION);
10070       output_pubnames ();
10071     }
10072
10073   /* We only put functions in the arange table, so don't write it out if
10074      we don't have any.  */
10075   if (fde_table_in_use)
10076     {
10077       /* Output the address range information.  */
10078       fputc ('\n', asm_out_file);
10079       ASM_OUTPUT_SECTION (asm_out_file, ARANGES_SECTION);
10080       output_aranges ();
10081     }
10082 }
10083 #endif /* DWARF2_DEBUGGING_INFO */