OSDN Git Service

* config/c4x/rtems.h: New file.
[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   /* If there was an error, the size could be zero.  */
6699   if (! field_size_tree)
6700     {
6701       if (errorcount)
6702         return 0;
6703       abort ();
6704     }
6705
6706   /* We cannot yet cope with fields whose positions are variable, so 
6707      for now, when we see such things, we simply return 0.  Someday, we may
6708      be able to handle such cases, but it will be damn difficult.  */
6709   if (TREE_CODE (bitpos_tree) != INTEGER_CST)
6710     return 0;
6711
6712   bitpos_int = (unsigned) TREE_INT_CST_LOW (bitpos_tree);
6713
6714     /* If we don't know the size of the field, pretend it's a full word.  */
6715   if (TREE_CODE (field_size_tree) == INTEGER_CST)
6716     field_size_in_bits = (unsigned) TREE_INT_CST_LOW (field_size_tree);
6717   else
6718     field_size_in_bits = BITS_PER_WORD;
6719
6720   type_size_in_bits = simple_type_size_in_bits (type);
6721   type_align_in_bits = simple_type_align_in_bits (type);
6722   type_align_in_bytes = type_align_in_bits / BITS_PER_UNIT;
6723
6724   /* Note that the GCC front-end doesn't make any attempt to keep track of
6725      the starting bit offset (relative to the start of the containing
6726      structure type) of the hypothetical "containing object" for a bit-
6727      field.  Thus, when computing the byte offset value for the start of the
6728      "containing object" of a bit-field, we must deduce this information on 
6729      our own. This can be rather tricky to do in some cases.  For example,
6730      handling the following structure type definition when compiling for an
6731      i386/i486 target (which only aligns long long's to 32-bit boundaries)
6732      can be very tricky:
6733
6734          struct S { int field1; long long field2:31; };
6735
6736      Fortunately, there is a simple rule-of-thumb which can be
6737      used in such cases.  When compiling for an i386/i486, GCC will allocate
6738      8 bytes for the structure shown above.  It decides to do this based upon 
6739      one simple rule for bit-field allocation.  Quite simply, GCC allocates
6740      each "containing object" for each bit-field at the first (i.e. lowest
6741      addressed) legitimate alignment boundary (based upon the required
6742      minimum alignment for the declared type of the field) which it can
6743      possibly use, subject to the condition that there is still enough
6744      available space remaining in the containing object (when allocated at
6745      the selected point) to fully accommodate all of the bits of the
6746      bit-field itself.  This simple rule makes it obvious why GCC allocates
6747      8 bytes for each object of the structure type shown above.  When looking
6748      for a place to allocate the "containing object" for `field2', the
6749      compiler simply tries to allocate a 64-bit "containing object" at each
6750      successive 32-bit boundary (starting at zero) until it finds a place to
6751      allocate that 64- bit field such that at least 31 contiguous (and
6752      previously unallocated) bits remain within that selected 64 bit field.
6753      (As it turns out, for the example above, the compiler finds that it is
6754      OK to allocate the "containing object" 64-bit field at bit-offset zero
6755      within the structure type.) Here we attempt to work backwards from the
6756      limited set of facts we're given, and we try to deduce from those facts, 
6757      where GCC must have believed that the containing object started (within
6758      the structure type). The value we deduce is then used (by the callers of 
6759      this routine) to generate DW_AT_location and DW_AT_bit_offset attributes 
6760      for fields (both bit-fields and, in the case of DW_AT_location, regular
6761      fields as well).  */
6762
6763   /* Figure out the bit-distance from the start of the structure to the
6764      "deepest" bit of the bit-field.  */
6765   deepest_bitpos = bitpos_int + field_size_in_bits;
6766
6767   /* This is the tricky part.  Use some fancy footwork to deduce where the
6768      lowest addressed bit of the containing object must be.  */
6769   object_offset_in_bits
6770     = ceiling (deepest_bitpos, type_align_in_bits) - type_size_in_bits;
6771
6772   /* Compute the offset of the containing object in "alignment units".  */
6773   object_offset_in_align_units = object_offset_in_bits / type_align_in_bits;
6774
6775   /* Compute the offset of the containing object in bytes.  */
6776   object_offset_in_bytes = object_offset_in_align_units * type_align_in_bytes;
6777
6778   return object_offset_in_bytes;
6779 }
6780 \f
6781 /* The following routines define various Dwarf attributes and any data
6782    associated with them.  */
6783
6784 /* Add a location description attribute value to a DIE.
6785
6786    This emits location attributes suitable for whole variables and
6787    whole parameters.  Note that the location attributes for struct fields are
6788    generated by the routine `data_member_location_attribute' below.  */
6789
6790 static void
6791 add_AT_location_description (die, attr_kind, rtl)
6792      dw_die_ref die;
6793      enum dwarf_attribute attr_kind;
6794      register rtx rtl;
6795 {
6796   /* Handle a special case.  If we are about to output a location descriptor
6797      for a variable or parameter which has been optimized out of existence,
6798      don't do that.  A variable which has been optimized out
6799      of existence will have a DECL_RTL value which denotes a pseudo-reg.
6800      Currently, in some rare cases, variables can have DECL_RTL values which
6801      look like (MEM (REG pseudo-reg#)).  These cases are due to bugs
6802      elsewhere in the compiler.  We treat such cases as if the variable(s) in 
6803      question had been optimized out of existence.  */
6804
6805   if (is_pseudo_reg (rtl)
6806       || (GET_CODE (rtl) == MEM
6807           && is_pseudo_reg (XEXP (rtl, 0)))
6808       /* This can happen for a PARM_DECL with a DECL_INCOMING_RTL which 
6809          references the internal argument pointer (a pseudo) in a function
6810          where all references to the internal argument pointer were
6811          eliminated via the optimizers.  */
6812       || (GET_CODE (rtl) == MEM
6813           && GET_CODE (XEXP (rtl, 0)) == PLUS
6814           && is_pseudo_reg (XEXP (XEXP (rtl, 0), 0)))
6815       || (GET_CODE (rtl) == CONCAT
6816           && is_pseudo_reg (XEXP (rtl, 0))
6817           && is_pseudo_reg (XEXP (rtl, 1))))
6818     return;
6819
6820   add_AT_loc (die, attr_kind, loc_descriptor (rtl));
6821 }
6822
6823 /* Attach the specialized form of location attribute used for data
6824    members of struct and union types.  In the special case of a
6825    FIELD_DECL node which represents a bit-field, the "offset" part
6826    of this special location descriptor must indicate the distance
6827    in bytes from the lowest-addressed byte of the containing struct
6828    or union type to the lowest-addressed byte of the "containing
6829    object" for the bit-field.  (See the `field_byte_offset' function
6830    above).. For any given bit-field, the "containing object" is a
6831    hypothetical object (of some integral or enum type) within which
6832    the given bit-field lives.  The type of this hypothetical
6833    "containing object" is always the same as the declared type of
6834    the individual bit-field itself (for GCC anyway... the DWARF
6835    spec doesn't actually mandate this).  Note that it is the size
6836    (in bytes) of the hypothetical "containing object" which will
6837    be given in the DW_AT_byte_size attribute for this bit-field.
6838    (See the `byte_size_attribute' function below.)  It is also used
6839    when calculating the value of the DW_AT_bit_offset attribute.
6840    (See the `bit_offset_attribute' function below).  */
6841
6842 static void
6843 add_data_member_location_attribute (die, decl)
6844      register dw_die_ref die;
6845      register tree decl;
6846 {
6847   register unsigned long offset;
6848   register dw_loc_descr_ref loc_descr;
6849   register enum dwarf_location_atom op;
6850
6851   if (TREE_CODE (decl) == TREE_VEC)
6852     offset = TREE_INT_CST_LOW (BINFO_OFFSET (decl));
6853   else
6854     offset = field_byte_offset (decl);
6855
6856   /* The DWARF2 standard says that we should assume that the structure address
6857      is already on the stack, so we can specify a structure field address
6858      by using DW_OP_plus_uconst.  */
6859
6860 #ifdef MIPS_DEBUGGING_INFO
6861   /* ??? The SGI dwarf reader does not handle the DW_OP_plus_uconst operator
6862      correctly.  It works only if we leave the offset on the stack.  */
6863   op = DW_OP_constu;
6864 #else
6865   op = DW_OP_plus_uconst;
6866 #endif
6867
6868   loc_descr = new_loc_descr (op, offset, 0);
6869   add_AT_loc (die, DW_AT_data_member_location, loc_descr);
6870 }
6871
6872 /* Attach an DW_AT_const_value attribute for a variable or a parameter which
6873    does not have a "location" either in memory or in a register.  These
6874    things can arise in GNU C when a constant is passed as an actual parameter
6875    to an inlined function.  They can also arise in C++ where declared
6876    constants do not necessarily get memory "homes".  */
6877
6878 static void
6879 add_const_value_attribute (die, rtl)
6880      register dw_die_ref die;
6881      register rtx rtl;
6882 {
6883   switch (GET_CODE (rtl))
6884     {
6885     case CONST_INT:
6886       /* Note that a CONST_INT rtx could represent either an integer or a
6887          floating-point constant.  A CONST_INT is used whenever the constant
6888          will fit into a single word.  In all such cases, the original mode
6889          of the constant value is wiped out, and the CONST_INT rtx is
6890          assigned VOIDmode.  */
6891       add_AT_unsigned (die, DW_AT_const_value, (unsigned) INTVAL (rtl));
6892       break;
6893
6894     case CONST_DOUBLE:
6895       /* Note that a CONST_DOUBLE rtx could represent either an integer or a
6896          floating-point constant.  A CONST_DOUBLE is used whenever the
6897          constant requires more than one word in order to be adequately
6898          represented.  We output CONST_DOUBLEs as blocks.  */
6899       {
6900         register enum machine_mode mode = GET_MODE (rtl);
6901
6902         if (GET_MODE_CLASS (mode) == MODE_FLOAT)
6903           {
6904             register unsigned length = GET_MODE_SIZE (mode) / sizeof (long);
6905             long array[4];
6906             REAL_VALUE_TYPE rv;
6907
6908             REAL_VALUE_FROM_CONST_DOUBLE (rv, rtl);
6909             switch (mode)
6910               {
6911               case SFmode:
6912                 REAL_VALUE_TO_TARGET_SINGLE (rv, array[0]);
6913                 break;
6914
6915               case DFmode:
6916                 REAL_VALUE_TO_TARGET_DOUBLE (rv, array);
6917                 break;
6918
6919               case XFmode:
6920               case TFmode:
6921                 REAL_VALUE_TO_TARGET_LONG_DOUBLE (rv, array);
6922                 break;
6923
6924               default:
6925                 abort ();
6926               }
6927
6928             add_AT_float (die, DW_AT_const_value, length, array);
6929           }
6930         else
6931           add_AT_long_long (die, DW_AT_const_value,
6932                             CONST_DOUBLE_HIGH (rtl), CONST_DOUBLE_LOW (rtl));
6933       }
6934       break;
6935
6936     case CONST_STRING:
6937       add_AT_string (die, DW_AT_const_value, XSTR (rtl, 0));
6938       break;
6939
6940     case SYMBOL_REF:
6941     case LABEL_REF:
6942     case CONST:
6943       add_AT_addr (die, DW_AT_const_value, addr_to_string (rtl));
6944       break;
6945
6946     case PLUS:
6947       /* In cases where an inlined instance of an inline function is passed
6948          the address of an `auto' variable (which is local to the caller) we
6949          can get a situation where the DECL_RTL of the artificial local
6950          variable (for the inlining) which acts as a stand-in for the
6951          corresponding formal parameter (of the inline function) will look
6952          like (plus:SI (reg:SI FRAME_PTR) (const_int ...)).  This is not
6953          exactly a compile-time constant expression, but it isn't the address 
6954          of the (artificial) local variable either.  Rather, it represents the 
6955          *value* which the artificial local variable always has during its
6956          lifetime.  We currently have no way to represent such quasi-constant 
6957          values in Dwarf, so for now we just punt and generate nothing.  */
6958       break;
6959
6960     default:
6961       /* No other kinds of rtx should be possible here.  */
6962       abort ();
6963     }
6964
6965 }
6966
6967 /* Generate *either* an DW_AT_location attribute or else an DW_AT_const_value
6968    data attribute for a variable or a parameter.  We generate the
6969    DW_AT_const_value attribute only in those cases where the given variable
6970    or parameter does not have a true "location" either in memory or in a
6971    register.  This can happen (for example) when a constant is passed as an
6972    actual argument in a call to an inline function.  (It's possible that
6973    these things can crop up in other ways also.)  Note that one type of
6974    constant value which can be passed into an inlined function is a constant
6975    pointer.  This can happen for example if an actual argument in an inlined
6976    function call evaluates to a compile-time constant address.  */
6977
6978 static void
6979 add_location_or_const_value_attribute (die, decl)
6980      register dw_die_ref die;
6981      register tree decl;
6982 {
6983   register rtx rtl;
6984   register tree declared_type;
6985   register tree passed_type;
6986
6987   if (TREE_CODE (decl) == ERROR_MARK)
6988     return;
6989
6990   if (TREE_CODE (decl) != VAR_DECL && TREE_CODE (decl) != PARM_DECL)
6991     abort ();
6992
6993   /* Here we have to decide where we are going to say the parameter "lives"
6994      (as far as the debugger is concerned).  We only have a couple of
6995      choices.  GCC provides us with DECL_RTL and with DECL_INCOMING_RTL.
6996
6997      DECL_RTL normally indicates where the parameter lives during most of the 
6998      activation of the function.  If optimization is enabled however, this
6999      could be either NULL or else a pseudo-reg.  Both of those cases indicate 
7000      that the parameter doesn't really live anywhere (as far as the code
7001      generation parts of GCC are concerned) during most of the function's
7002      activation.  That will happen (for example) if the parameter is never
7003      referenced within the function.
7004
7005      We could just generate a location descriptor here for all non-NULL
7006      non-pseudo values of DECL_RTL and ignore all of the rest, but we can be
7007      a little nicer than that if we also consider DECL_INCOMING_RTL in cases
7008      where DECL_RTL is NULL or is a pseudo-reg.
7009
7010      Note however that we can only get away with using DECL_INCOMING_RTL as
7011      a backup substitute for DECL_RTL in certain limited cases.  In cases
7012      where DECL_ARG_TYPE (decl) indicates the same type as TREE_TYPE (decl),
7013      we can be sure that the parameter was passed using the same type as it is
7014      declared to have within the function, and that its DECL_INCOMING_RTL
7015      points us to a place where a value of that type is passed.
7016
7017      In cases where DECL_ARG_TYPE (decl) and TREE_TYPE (decl) are different,
7018      we cannot (in general) use DECL_INCOMING_RTL as a substitute for DECL_RTL
7019      because in these cases DECL_INCOMING_RTL points us to a value of some
7020      type which is *different* from the type of the parameter itself.  Thus,
7021      if we tried to use DECL_INCOMING_RTL to generate a location attribute in
7022      such cases, the debugger would end up (for example) trying to fetch a
7023      `float' from a place which actually contains the first part of a
7024      `double'.  That would lead to really incorrect and confusing
7025      output at debug-time.
7026
7027      So, in general, we *do not* use DECL_INCOMING_RTL as a backup for DECL_RTL
7028      in cases where DECL_ARG_TYPE (decl) != TREE_TYPE (decl).  There
7029      are a couple of exceptions however.  On little-endian machines we can
7030      get away with using DECL_INCOMING_RTL even when DECL_ARG_TYPE (decl) is
7031      not the same as TREE_TYPE (decl), but only when DECL_ARG_TYPE (decl) is
7032      an integral type that is smaller than TREE_TYPE (decl). These cases arise
7033      when (on a little-endian machine) a non-prototyped function has a
7034      parameter declared to be of type `short' or `char'.  In such cases,
7035      TREE_TYPE (decl) will be `short' or `char', DECL_ARG_TYPE (decl) will
7036      be `int', and DECL_INCOMING_RTL will point to the lowest-order byte of the
7037      passed `int' value.  If the debugger then uses that address to fetch
7038      a `short' or a `char' (on a little-endian machine) the result will be
7039      the correct data, so we allow for such exceptional cases below.
7040
7041      Note that our goal here is to describe the place where the given formal
7042      parameter lives during most of the function's activation (i.e. between
7043      the end of the prologue and the start of the epilogue).  We'll do that
7044      as best as we can. Note however that if the given formal parameter is
7045      modified sometime during the execution of the function, then a stack
7046      backtrace (at debug-time) will show the function as having been
7047      called with the *new* value rather than the value which was
7048      originally passed in.  This happens rarely enough that it is not
7049      a major problem, but it *is* a problem, and I'd like to fix it.
7050
7051      A future version of dwarf2out.c may generate two additional
7052      attributes for any given DW_TAG_formal_parameter DIE which will
7053      describe the "passed type" and the "passed location" for the
7054      given formal parameter in addition to the attributes we now
7055      generate to indicate the "declared type" and the "active
7056      location" for each parameter.  This additional set of attributes
7057      could be used by debuggers for stack backtraces. Separately, note
7058      that sometimes DECL_RTL can be NULL and DECL_INCOMING_RTL can be
7059      NULL also.  This happens (for example) for inlined-instances of
7060      inline function formal parameters which are never referenced.
7061      This really shouldn't be happening.  All PARM_DECL nodes should
7062      get valid non-NULL DECL_INCOMING_RTL values, but integrate.c
7063      doesn't currently generate these values for inlined instances of
7064      inline function parameters, so when we see such cases, we are
7065      just out-of-luck for the time being (until integrate.c
7066      gets fixed).  */
7067
7068   /* Use DECL_RTL as the "location" unless we find something better.  */
7069   rtl = DECL_RTL (decl);
7070
7071   if (TREE_CODE (decl) == PARM_DECL)
7072     {
7073       if (rtl == NULL_RTX || is_pseudo_reg (rtl))
7074         {
7075           declared_type = type_main_variant (TREE_TYPE (decl));
7076           passed_type = type_main_variant (DECL_ARG_TYPE (decl));
7077
7078           /* This decl represents a formal parameter which was optimized out.
7079              Note that DECL_INCOMING_RTL may be NULL in here, but we handle
7080              all* cases where (rtl == NULL_RTX) just below.  */
7081           if (declared_type == passed_type)
7082             rtl = DECL_INCOMING_RTL (decl);
7083           else if (! BYTES_BIG_ENDIAN
7084                    && TREE_CODE (declared_type) == INTEGER_TYPE
7085                    && (GET_MODE_SIZE (TYPE_MODE (declared_type))
7086                        <= GET_MODE_SIZE (TYPE_MODE (passed_type))))
7087                 rtl = DECL_INCOMING_RTL (decl);
7088         }
7089
7090       /* If the parm was passed in registers, but lives on the stack, then
7091          make a big endian correction if the mode of the type of the
7092          parameter is not the same as the mode of the rtl.  */
7093       /* ??? This is the same series of checks that are made in dbxout.c before
7094          we reach the big endian correction code there.  It isn't clear if all
7095          of these checks are necessary here, but keeping them all is the safe
7096          thing to do.  */
7097       else if (GET_CODE (rtl) == MEM
7098                && XEXP (rtl, 0) != const0_rtx
7099                && ! CONSTANT_P (XEXP (rtl, 0))
7100                /* Not passed in memory.  */
7101                && GET_CODE (DECL_INCOMING_RTL (decl)) != MEM
7102                /* Not passed by invisible reference.  */
7103                && (GET_CODE (XEXP (rtl, 0)) != REG
7104                    || REGNO (XEXP (rtl, 0)) == HARD_FRAME_POINTER_REGNUM
7105                    || REGNO (XEXP (rtl, 0)) == STACK_POINTER_REGNUM
7106 #if ARG_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
7107                    || REGNO (XEXP (rtl, 0)) == ARG_POINTER_REGNUM
7108 #endif
7109                      )
7110                /* Big endian correction check.  */
7111                && BYTES_BIG_ENDIAN
7112                && TYPE_MODE (TREE_TYPE (decl)) != GET_MODE (rtl)
7113                && (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (decl)))
7114                    < UNITS_PER_WORD))
7115         {
7116           int offset = (UNITS_PER_WORD
7117                         - GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (decl))));
7118           rtl = gen_rtx_MEM (TYPE_MODE (TREE_TYPE (decl)),
7119                              plus_constant (XEXP (rtl, 0), offset));
7120         }
7121     }
7122
7123   if (rtl == NULL_RTX)
7124     return;
7125
7126   rtl = eliminate_regs (rtl, 0, NULL_RTX);
7127 #ifdef LEAF_REG_REMAP
7128   if (current_function_uses_only_leaf_regs)
7129     leaf_renumber_regs_insn (rtl);
7130 #endif
7131
7132   switch (GET_CODE (rtl))
7133     {
7134     case ADDRESSOF:
7135       /* The address of a variable that was optimized away; don't emit
7136          anything.  */
7137       break;
7138
7139     case CONST_INT:
7140     case CONST_DOUBLE:
7141     case CONST_STRING:
7142     case SYMBOL_REF:
7143     case LABEL_REF:
7144     case CONST:
7145     case PLUS:
7146       /* DECL_RTL could be (plus (reg ...) (const_int ...)) */
7147       add_const_value_attribute (die, rtl);
7148       break;
7149
7150     case MEM:
7151     case REG:
7152     case SUBREG:
7153     case CONCAT:
7154       add_AT_location_description (die, DW_AT_location, rtl);
7155       break;
7156
7157     default:
7158       abort ();
7159     }
7160 }
7161
7162 /* Generate an DW_AT_name attribute given some string value to be included as
7163    the value of the attribute.  */
7164
7165 static inline void
7166 add_name_attribute (die, name_string)
7167      register dw_die_ref die;
7168      register const char *name_string;
7169 {
7170   if (name_string != NULL && *name_string != 0)
7171     {
7172       if (demangle_name_func)
7173         name_string = (*demangle_name_func) (name_string);
7174
7175       add_AT_string (die, DW_AT_name, name_string);
7176     }
7177 }
7178
7179 /* Given a tree node describing an array bound (either lower or upper) output
7180    a representation for that bound.  */
7181
7182 static void
7183 add_bound_info (subrange_die, bound_attr, bound)
7184      register dw_die_ref subrange_die;
7185      register enum dwarf_attribute bound_attr;
7186      register tree bound;
7187 {
7188   register unsigned bound_value = 0;
7189
7190   /* If this is an Ada unconstrained array type, then don't emit any debug
7191      info because the array bounds are unknown.  They are parameterized when
7192      the type is instantiated.  */
7193   if (contains_placeholder_p (bound))
7194     return;
7195
7196   switch (TREE_CODE (bound))
7197     {
7198     case ERROR_MARK:
7199       return;
7200
7201     /* All fixed-bounds are represented by INTEGER_CST nodes.        */
7202     case INTEGER_CST:
7203       bound_value = TREE_INT_CST_LOW (bound);
7204       if (bound_attr == DW_AT_lower_bound
7205           && ((is_c_family () && bound_value == 0)
7206               || (is_fortran () && bound_value == 1)))
7207         /* use the default */;
7208       else
7209         add_AT_unsigned (subrange_die, bound_attr, bound_value);
7210       break;
7211
7212     case CONVERT_EXPR:
7213     case NOP_EXPR:
7214     case NON_LVALUE_EXPR:
7215       add_bound_info (subrange_die, bound_attr, TREE_OPERAND (bound, 0));
7216       break;
7217       
7218     case SAVE_EXPR:
7219       /* If optimization is turned on, the SAVE_EXPRs that describe how to
7220          access the upper bound values may be bogus.  If they refer to a
7221          register, they may only describe how to get at these values at the
7222          points in the generated code right after they have just been
7223          computed.  Worse yet, in the typical case, the upper bound values
7224          will not even *be* computed in the optimized code (though the
7225          number of elements will), so these SAVE_EXPRs are entirely
7226          bogus. In order to compensate for this fact, we check here to see
7227          if optimization is enabled, and if so, we don't add an attribute
7228          for the (unknown and unknowable) upper bound.  This should not
7229          cause too much trouble for existing (stupid?)  debuggers because
7230          they have to deal with empty upper bounds location descriptions
7231          anyway in order to be able to deal with incomplete array types.
7232          Of course an intelligent debugger (GDB?)  should be able to
7233          comprehend that a missing upper bound specification in a array
7234          type used for a storage class `auto' local array variable
7235          indicates that the upper bound is both unknown (at compile- time)
7236          and unknowable (at run-time) due to optimization.
7237
7238          We assume that a MEM rtx is safe because gcc wouldn't put the
7239          value there unless it was going to be used repeatedly in the
7240          function, i.e. for cleanups.  */
7241       if (! optimize || GET_CODE (SAVE_EXPR_RTL (bound)) == MEM)
7242         {
7243           register dw_die_ref ctx = lookup_decl_die (current_function_decl);
7244           register dw_die_ref decl_die = new_die (DW_TAG_variable, ctx);
7245           register rtx loc = SAVE_EXPR_RTL (bound);
7246
7247           /* If the RTL for the SAVE_EXPR is memory, handle the case where
7248              it references an outer function's frame.  */
7249
7250           if (GET_CODE (loc) == MEM)
7251             {
7252               rtx new_addr = fix_lexical_addr (XEXP (loc, 0), bound);
7253
7254               if (XEXP (loc, 0) != new_addr)
7255                 loc = gen_rtx_MEM (GET_MODE (loc), new_addr);
7256             }
7257
7258           add_AT_flag (decl_die, DW_AT_artificial, 1);
7259           add_type_attribute (decl_die, TREE_TYPE (bound), 1, 0, ctx);
7260           add_AT_location_description (decl_die, DW_AT_location, loc);
7261           add_AT_die_ref (subrange_die, bound_attr, decl_die);
7262         }
7263
7264       /* Else leave out the attribute.  */
7265       break;
7266
7267     case MAX_EXPR:
7268     case VAR_DECL:
7269     case COMPONENT_REF:
7270       /* ??? These types of bounds can be created by the Ada front end,
7271          and it isn't clear how to emit debug info for them.  */
7272       break;
7273
7274     default:
7275       abort ();
7276     }
7277 }
7278
7279 /* Note that the block of subscript information for an array type also
7280    includes information about the element type of type given array type.  */
7281
7282 static void
7283 add_subscript_info (type_die, type)
7284      register dw_die_ref type_die;
7285      register tree type;
7286 {
7287 #ifndef MIPS_DEBUGGING_INFO
7288   register unsigned dimension_number;
7289 #endif
7290   register tree lower, upper;
7291   register dw_die_ref subrange_die;
7292
7293   /* The GNU compilers represent multidimensional array types as sequences of 
7294      one dimensional array types whose element types are themselves array
7295      types.  Here we squish that down, so that each multidimensional array
7296      type gets only one array_type DIE in the Dwarf debugging info. The draft 
7297      Dwarf specification say that we are allowed to do this kind of
7298      compression in C (because there is no difference between an array or
7299      arrays and a multidimensional array in C) but for other source languages 
7300      (e.g. Ada) we probably shouldn't do this.  */
7301
7302   /* ??? The SGI dwarf reader fails for multidimensional arrays with a
7303      const enum type.  E.g. const enum machine_mode insn_operand_mode[2][10].
7304      We work around this by disabling this feature.  See also
7305      gen_array_type_die.  */
7306 #ifndef MIPS_DEBUGGING_INFO
7307   for (dimension_number = 0;
7308        TREE_CODE (type) == ARRAY_TYPE;
7309        type = TREE_TYPE (type), dimension_number++)
7310     {
7311 #endif
7312       register tree domain = TYPE_DOMAIN (type);
7313
7314       /* Arrays come in three flavors: Unspecified bounds, fixed bounds,
7315          and (in GNU C only) variable bounds.  Handle all three forms 
7316          here.  */
7317       subrange_die = new_die (DW_TAG_subrange_type, type_die);
7318       if (domain)
7319         {
7320           /* We have an array type with specified bounds.  */
7321           lower = TYPE_MIN_VALUE (domain);
7322           upper = TYPE_MAX_VALUE (domain);
7323
7324           /* define the index type.  */
7325           if (TREE_TYPE (domain))
7326             {
7327               /* ??? This is probably an Ada unnamed subrange type.  Ignore the
7328                  TREE_TYPE field.  We can't emit debug info for this
7329                  because it is an unnamed integral type.  */
7330               if (TREE_CODE (domain) == INTEGER_TYPE
7331                   && TYPE_NAME (domain) == NULL_TREE
7332                   && TREE_CODE (TREE_TYPE (domain)) == INTEGER_TYPE
7333                   && TYPE_NAME (TREE_TYPE (domain)) == NULL_TREE)
7334                 ;       
7335               else
7336                 add_type_attribute (subrange_die, TREE_TYPE (domain), 0, 0,
7337                                     type_die);
7338             }
7339
7340           /* ??? If upper is NULL, the array has unspecified length,
7341              but it does have a lower bound.  This happens with Fortran
7342                dimension arr(N:*)
7343              Since the debugger is definitely going to need to know N
7344              to produce useful results, go ahead and output the lower
7345              bound solo, and hope the debugger can cope.  */
7346
7347           add_bound_info (subrange_die, DW_AT_lower_bound, lower);
7348           if (upper)
7349             add_bound_info (subrange_die, DW_AT_upper_bound, upper);
7350         }
7351       else
7352         /* We have an array type with an unspecified length.  The DWARF-2
7353              spec does not say how to handle this; let's just leave out the
7354              bounds.  */
7355         {;}
7356       
7357
7358 #ifndef MIPS_DEBUGGING_INFO
7359     }
7360 #endif
7361 }
7362
7363 static void
7364 add_byte_size_attribute (die, tree_node)
7365      dw_die_ref die;
7366      register tree tree_node;
7367 {
7368   register unsigned size;
7369
7370   switch (TREE_CODE (tree_node))
7371     {
7372     case ERROR_MARK:
7373       size = 0;
7374       break;
7375     case ENUMERAL_TYPE:
7376     case RECORD_TYPE:
7377     case UNION_TYPE:
7378     case QUAL_UNION_TYPE:
7379       size = int_size_in_bytes (tree_node);
7380       break;
7381     case FIELD_DECL:
7382       /* For a data member of a struct or union, the DW_AT_byte_size is
7383          generally given as the number of bytes normally allocated for an
7384          object of the *declared* type of the member itself.  This is true
7385          even for bit-fields.  */
7386       size = simple_type_size_in_bits (field_type (tree_node)) / BITS_PER_UNIT;
7387       break;
7388     default:
7389       abort ();
7390     }
7391
7392   /* Note that `size' might be -1 when we get to this point.  If it is, that
7393      indicates that the byte size of the entity in question is variable.  We
7394      have no good way of expressing this fact in Dwarf at the present time,
7395      so just let the -1 pass on through.  */
7396
7397   add_AT_unsigned (die, DW_AT_byte_size, size);
7398 }
7399
7400 /* For a FIELD_DECL node which represents a bit-field, output an attribute
7401    which specifies the distance in bits from the highest order bit of the
7402    "containing object" for the bit-field to the highest order bit of the
7403    bit-field itself.
7404
7405    For any given bit-field, the "containing object" is a hypothetical
7406    object (of some integral or enum type) within which the given bit-field
7407    lives.  The type of this hypothetical "containing object" is always the
7408    same as the declared type of the individual bit-field itself.  The
7409    determination of the exact location of the "containing object" for a
7410    bit-field is rather complicated.  It's handled by the
7411    `field_byte_offset' function (above).
7412
7413    Note that it is the size (in bytes) of the hypothetical "containing object"
7414    which will be given in the DW_AT_byte_size attribute for this bit-field.
7415    (See `byte_size_attribute' above).  */
7416
7417 static inline void
7418 add_bit_offset_attribute (die, decl)
7419      register dw_die_ref die;
7420      register tree decl;
7421 {
7422   register unsigned object_offset_in_bytes = field_byte_offset (decl);
7423   register tree type = DECL_BIT_FIELD_TYPE (decl);
7424   register tree bitpos_tree = DECL_FIELD_BITPOS (decl);
7425   register unsigned bitpos_int;
7426   register unsigned highest_order_object_bit_offset;
7427   register unsigned highest_order_field_bit_offset;
7428   register unsigned bit_offset;
7429
7430   /* Must be a field and a bit field.  */
7431   if (!type
7432       || TREE_CODE (decl) != FIELD_DECL)
7433     abort ();
7434
7435   /* We can't yet handle bit-fields whose offsets are variable, so if we
7436      encounter such things, just return without generating any attribute
7437      whatsoever.  */
7438   if (TREE_CODE (bitpos_tree) != INTEGER_CST)
7439     return;
7440
7441   bitpos_int = (unsigned) TREE_INT_CST_LOW (bitpos_tree);
7442
7443   /* Note that the bit offset is always the distance (in bits) from the
7444      highest-order bit of the "containing object" to the highest-order bit of 
7445      the bit-field itself.  Since the "high-order end" of any object or field 
7446      is different on big-endian and little-endian machines, the computation
7447      below must take account of these differences.  */
7448   highest_order_object_bit_offset = object_offset_in_bytes * BITS_PER_UNIT;
7449   highest_order_field_bit_offset = bitpos_int;
7450
7451   if (! BYTES_BIG_ENDIAN)
7452     {
7453       highest_order_field_bit_offset
7454         += (unsigned) TREE_INT_CST_LOW (DECL_SIZE (decl));
7455
7456       highest_order_object_bit_offset += simple_type_size_in_bits (type);
7457     }
7458
7459   bit_offset
7460     = (! BYTES_BIG_ENDIAN
7461        ? highest_order_object_bit_offset - highest_order_field_bit_offset
7462        : highest_order_field_bit_offset - highest_order_object_bit_offset);
7463
7464   add_AT_unsigned (die, DW_AT_bit_offset, bit_offset);
7465 }
7466
7467 /* For a FIELD_DECL node which represents a bit field, output an attribute
7468    which specifies the length in bits of the given field.  */
7469
7470 static inline void
7471 add_bit_size_attribute (die, decl)
7472      register dw_die_ref die;
7473      register tree decl;
7474 {
7475   /* Must be a field and a bit field.  */
7476   if (TREE_CODE (decl) != FIELD_DECL
7477       || ! DECL_BIT_FIELD_TYPE (decl))
7478     abort ();
7479   add_AT_unsigned (die, DW_AT_bit_size,
7480                    (unsigned) TREE_INT_CST_LOW (DECL_SIZE (decl)));
7481 }
7482
7483 /* If the compiled language is ANSI C, then add a 'prototyped'
7484    attribute, if arg types are given for the parameters of a function.  */
7485
7486 static inline void
7487 add_prototyped_attribute (die, func_type)
7488      register dw_die_ref die;
7489      register tree func_type;
7490 {
7491   if (get_AT_unsigned (comp_unit_die, DW_AT_language) == DW_LANG_C89
7492       && TYPE_ARG_TYPES (func_type) != NULL)
7493     add_AT_flag (die, DW_AT_prototyped, 1);
7494 }
7495
7496
7497 /* Add an 'abstract_origin' attribute below a given DIE.  The DIE is found
7498    by looking in either the type declaration or object declaration
7499    equate table.  */
7500
7501 static inline void
7502 add_abstract_origin_attribute (die, origin)
7503      register dw_die_ref die;
7504      register tree origin;
7505 {
7506   dw_die_ref origin_die = NULL;
7507
7508   if (TREE_CODE_CLASS (TREE_CODE (origin)) == 'd')
7509     origin_die = lookup_decl_die (origin);
7510   else if (TREE_CODE_CLASS (TREE_CODE (origin)) == 't')
7511     origin_die = lookup_type_die (origin);
7512
7513   if (origin_die == NULL)
7514     abort ();
7515   
7516   add_AT_die_ref (die, DW_AT_abstract_origin, origin_die);
7517 }
7518
7519 /* We do not currently support the pure_virtual attribute.  */
7520
7521 static inline void
7522 add_pure_or_virtual_attribute (die, func_decl)
7523      register dw_die_ref die;
7524      register tree func_decl;
7525 {
7526   if (DECL_VINDEX (func_decl))
7527     {
7528       add_AT_unsigned (die, DW_AT_virtuality, DW_VIRTUALITY_virtual);
7529       add_AT_loc (die, DW_AT_vtable_elem_location,
7530                   new_loc_descr (DW_OP_constu,
7531                                  TREE_INT_CST_LOW (DECL_VINDEX (func_decl)),
7532                                  0));
7533
7534       /* GNU extension: Record what type this method came from originally.  */
7535       if (debug_info_level > DINFO_LEVEL_TERSE)
7536         add_AT_die_ref (die, DW_AT_containing_type,
7537                         lookup_type_die (DECL_CONTEXT (func_decl)));
7538     }
7539 }
7540 \f
7541 /* Add source coordinate attributes for the given decl.  */
7542
7543 static void
7544 add_src_coords_attributes (die, decl)
7545      register dw_die_ref die;
7546      register tree decl;
7547 {
7548   register unsigned file_index = lookup_filename (DECL_SOURCE_FILE (decl));
7549
7550   add_AT_unsigned (die, DW_AT_decl_file, file_index);
7551   add_AT_unsigned (die, DW_AT_decl_line, DECL_SOURCE_LINE (decl));
7552 }
7553
7554 /* Add an DW_AT_name attribute and source coordinate attribute for the
7555    given decl, but only if it actually has a name.  */
7556
7557 static void
7558 add_name_and_src_coords_attributes (die, decl)
7559      register dw_die_ref die;
7560      register tree decl;
7561 {
7562   register tree decl_name;
7563
7564   decl_name = DECL_NAME (decl); 
7565   if (decl_name != NULL && IDENTIFIER_POINTER (decl_name) != NULL)
7566     {
7567       add_name_attribute (die, dwarf2_name (decl, 0));
7568       if (! DECL_ARTIFICIAL (decl))
7569         add_src_coords_attributes (die, decl);
7570
7571       if ((TREE_CODE (decl) == FUNCTION_DECL || TREE_CODE (decl) == VAR_DECL)
7572           && DECL_ASSEMBLER_NAME (decl) != DECL_NAME (decl))
7573         add_AT_string (die, DW_AT_MIPS_linkage_name,
7574                        IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)));
7575     }
7576 }
7577
7578 /* Push a new declaration scope. */
7579
7580 static void
7581 push_decl_scope (scope)
7582      tree scope;
7583 {
7584   /* Make room in the decl_scope_table, if necessary.  */
7585   if (decl_scope_table_allocated == decl_scope_depth)
7586     {
7587       decl_scope_table_allocated += DECL_SCOPE_TABLE_INCREMENT;
7588       decl_scope_table
7589         = (tree *) xrealloc (decl_scope_table,
7590                              decl_scope_table_allocated * sizeof (tree));
7591     }
7592
7593   decl_scope_table[decl_scope_depth] = scope;
7594   decl_scope_depth++;
7595 }
7596
7597 /* Pop a declaration scope.  */
7598 static inline void
7599 pop_decl_scope ()
7600 {
7601   if (decl_scope_depth <= 0)
7602     abort ();
7603   --decl_scope_depth;
7604 }
7605
7606 /* Return the DIE for the scope that immediately contains this type.
7607    Non-named types get global scope.  Named types nested in other
7608    types get their containing scope if it's open, or global scope
7609    otherwise.  All other types (i.e. function-local named types) get
7610    the current active scope.  */
7611
7612 static dw_die_ref
7613 scope_die_for (t, context_die)
7614     register tree t; 
7615     register dw_die_ref context_die;
7616 {
7617   register dw_die_ref scope_die = NULL;
7618   register tree containing_scope;
7619   register int i;
7620
7621   /* Non-types always go in the current scope.  */
7622   if (! TYPE_P (t))
7623     abort ();
7624
7625   containing_scope = TYPE_CONTEXT (t);
7626
7627   /* Ignore namespaces for the moment.  */
7628   if (containing_scope && TREE_CODE (containing_scope) == NAMESPACE_DECL)
7629     containing_scope = NULL_TREE;
7630
7631   /* Ignore function type "scopes" from the C frontend.  They mean that
7632      a tagged type is local to a parmlist of a function declarator, but
7633      that isn't useful to DWARF.  */
7634   if (containing_scope && TREE_CODE (containing_scope) == FUNCTION_TYPE)
7635     containing_scope = NULL_TREE;
7636
7637   if (containing_scope == NULL_TREE)
7638     scope_die = comp_unit_die;
7639   else if (TYPE_P (containing_scope))
7640     {
7641       /* For types, we can just look up the appropriate DIE.  But
7642          first we check to see if we're in the middle of emitting it
7643          so we know where the new DIE should go.  */
7644
7645       for (i = decl_scope_depth - 1; i >= 0; --i)
7646         if (decl_scope_table[i] == containing_scope)
7647           break;
7648
7649       if (i < 0)
7650         {
7651           if (debug_info_level > DINFO_LEVEL_TERSE
7652               && !TREE_ASM_WRITTEN (containing_scope))
7653             abort ();
7654
7655           /* If none of the current dies are suitable, we get file scope.  */
7656           scope_die = comp_unit_die;
7657         }
7658       else
7659         scope_die = lookup_type_die (containing_scope);
7660     }
7661   else
7662     scope_die = context_die;
7663
7664   return scope_die;
7665 }
7666
7667 /* Returns nonzero iff CONTEXT_DIE is internal to a function.  */
7668
7669 static inline int
7670 local_scope_p (context_die)
7671      dw_die_ref context_die;
7672 {
7673   for (; context_die; context_die = context_die->die_parent)
7674     if (context_die->die_tag == DW_TAG_inlined_subroutine
7675         || context_die->die_tag == DW_TAG_subprogram)
7676       return 1;
7677   return 0;
7678 }
7679
7680 /* Returns nonzero iff CONTEXT_DIE is a class.  */
7681
7682 static inline int
7683 class_scope_p (context_die)
7684      dw_die_ref context_die;
7685 {
7686   return (context_die
7687           && (context_die->die_tag == DW_TAG_structure_type
7688               || context_die->die_tag == DW_TAG_union_type));
7689 }
7690
7691 /* Many forms of DIEs require a "type description" attribute.  This
7692    routine locates the proper "type descriptor" die for the type given
7693    by 'type', and adds an DW_AT_type attribute below the given die.  */
7694
7695 static void
7696 add_type_attribute (object_die, type, decl_const, decl_volatile, context_die)
7697      register dw_die_ref object_die;
7698      register tree type;
7699      register int decl_const;
7700      register int decl_volatile;
7701      register dw_die_ref context_die;
7702 {
7703   register enum tree_code code  = TREE_CODE (type);
7704   register dw_die_ref type_die  = NULL;
7705
7706   /* ??? If this type is an unnamed subrange type of an integral or
7707      floating-point type, use the inner type.  This is because we have no
7708      support for unnamed types in base_type_die.  This can happen if this is
7709      an Ada subrange type.  Correct solution is emit a subrange type die.  */
7710   if ((code == INTEGER_TYPE || code == REAL_TYPE)
7711       && TREE_TYPE (type) != 0 && TYPE_NAME (type) == 0)
7712     type = TREE_TYPE (type), code = TREE_CODE (type);
7713
7714   if (code == ERROR_MARK)
7715     return;
7716
7717   /* Handle a special case.  For functions whose return type is void, we
7718      generate *no* type attribute.  (Note that no object may have type
7719      `void', so this only applies to function return types).  */
7720   if (code == VOID_TYPE)
7721     return;
7722
7723   type_die = modified_type_die (type,
7724                                 decl_const || TYPE_READONLY (type),
7725                                 decl_volatile || TYPE_VOLATILE (type),
7726                                 context_die);
7727   if (type_die != NULL)
7728     add_AT_die_ref (object_die, DW_AT_type, type_die);
7729 }
7730
7731 /* Given a tree pointer to a struct, class, union, or enum type node, return
7732    a pointer to the (string) tag name for the given type, or zero if the type
7733    was declared without a tag.  */
7734
7735 static char *
7736 type_tag (type)
7737      register tree type;
7738 {
7739   register char *name = 0;
7740
7741   if (TYPE_NAME (type) != 0)
7742     {
7743       register tree t = 0;
7744
7745       /* Find the IDENTIFIER_NODE for the type name.  */
7746       if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE)
7747         t = TYPE_NAME (type);
7748
7749       /* The g++ front end makes the TYPE_NAME of *each* tagged type point to 
7750          a TYPE_DECL node, regardless of whether or not a `typedef' was
7751          involved.  */
7752       else if (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
7753                && ! DECL_IGNORED_P (TYPE_NAME (type)))
7754         t = DECL_NAME (TYPE_NAME (type));
7755
7756       /* Now get the name as a string, or invent one.  */
7757       if (t != 0)
7758         name = IDENTIFIER_POINTER (t);
7759     }
7760
7761   return (name == 0 || *name == '\0') ? 0 : name;
7762 }
7763
7764 /* Return the type associated with a data member, make a special check
7765    for bit field types.  */
7766
7767 static inline tree
7768 member_declared_type (member)
7769      register tree member;
7770 {
7771   return (DECL_BIT_FIELD_TYPE (member)
7772           ? DECL_BIT_FIELD_TYPE (member)
7773           : TREE_TYPE (member));
7774 }
7775
7776 /* Get the decl's label, as described by its RTL. This may be different
7777    from the DECL_NAME name used in the source file.  */
7778
7779 #if 0
7780 static char *
7781 decl_start_label (decl)
7782      register tree decl;
7783 {
7784   rtx x;
7785   char *fnname;
7786   x = DECL_RTL (decl);
7787   if (GET_CODE (x) != MEM)
7788     abort ();
7789
7790   x = XEXP (x, 0);
7791   if (GET_CODE (x) != SYMBOL_REF)
7792     abort ();
7793
7794   fnname = XSTR (x, 0);
7795   return fnname;
7796 }
7797 #endif
7798 \f
7799 /* These routines generate the internal representation of the DIE's for
7800    the compilation unit.  Debugging information is collected by walking
7801    the declaration trees passed in from dwarf2out_decl().  */
7802
7803 static void
7804 gen_array_type_die (type, context_die)
7805      register tree type;
7806      register dw_die_ref context_die;
7807 {
7808   register dw_die_ref scope_die = scope_die_for (type, context_die);
7809   register dw_die_ref array_die;
7810   register tree element_type;
7811
7812   /* ??? The SGI dwarf reader fails for array of array of enum types unless
7813      the inner array type comes before the outer array type.  Thus we must
7814      call gen_type_die before we call new_die.  See below also.  */
7815 #ifdef MIPS_DEBUGGING_INFO
7816   gen_type_die (TREE_TYPE (type), context_die);
7817 #endif
7818
7819   array_die = new_die (DW_TAG_array_type, scope_die);
7820
7821 #if 0
7822   /* We default the array ordering.  SDB will probably do
7823      the right things even if DW_AT_ordering is not present.  It's not even
7824      an issue until we start to get into multidimensional arrays anyway.  If
7825      SDB is ever caught doing the Wrong Thing for multi-dimensional arrays,
7826      then we'll have to put the DW_AT_ordering attribute back in.  (But if
7827      and when we find out that we need to put these in, we will only do so
7828      for multidimensional arrays.  */
7829   add_AT_unsigned (array_die, DW_AT_ordering, DW_ORD_row_major);
7830 #endif
7831
7832 #ifdef MIPS_DEBUGGING_INFO
7833   /* The SGI compilers handle arrays of unknown bound by setting
7834      AT_declaration and not emitting any subrange DIEs.  */
7835   if (! TYPE_DOMAIN (type))
7836     add_AT_unsigned (array_die, DW_AT_declaration, 1);
7837   else
7838 #endif
7839     add_subscript_info (array_die, type);
7840
7841   add_name_attribute (array_die, type_tag (type));
7842   equate_type_number_to_die (type, array_die);
7843
7844   /* Add representation of the type of the elements of this array type.  */
7845   element_type = TREE_TYPE (type);
7846
7847   /* ??? The SGI dwarf reader fails for multidimensional arrays with a
7848      const enum type.  E.g. const enum machine_mode insn_operand_mode[2][10].
7849      We work around this by disabling this feature.  See also
7850      add_subscript_info.  */
7851 #ifndef MIPS_DEBUGGING_INFO
7852   while (TREE_CODE (element_type) == ARRAY_TYPE)
7853     element_type = TREE_TYPE (element_type);
7854
7855   gen_type_die (element_type, context_die);
7856 #endif
7857
7858   add_type_attribute (array_die, element_type, 0, 0, context_die);
7859 }
7860
7861 static void
7862 gen_set_type_die (type, context_die)
7863      register tree type;
7864      register dw_die_ref context_die;
7865 {
7866   register dw_die_ref type_die
7867     = new_die (DW_TAG_set_type, scope_die_for (type, context_die));
7868
7869   equate_type_number_to_die (type, type_die);
7870   add_type_attribute (type_die, TREE_TYPE (type), 0, 0, context_die);
7871 }
7872
7873 #if 0
7874 static void
7875 gen_entry_point_die (decl, context_die)
7876      register tree decl;
7877      register dw_die_ref context_die;
7878 {
7879   register tree origin = decl_ultimate_origin (decl);
7880   register dw_die_ref decl_die = new_die (DW_TAG_entry_point, context_die);
7881   if (origin != NULL)
7882     add_abstract_origin_attribute (decl_die, origin);
7883   else
7884     {
7885       add_name_and_src_coords_attributes (decl_die, decl);
7886       add_type_attribute (decl_die, TREE_TYPE (TREE_TYPE (decl)),
7887                           0, 0, context_die);
7888     }
7889
7890   if (DECL_ABSTRACT (decl))
7891     equate_decl_number_to_die (decl, decl_die);
7892   else
7893     add_AT_lbl_id (decl_die, DW_AT_low_pc, decl_start_label (decl));
7894 }
7895 #endif
7896
7897 /* Remember a type in the incomplete_types_list.  */
7898
7899 static void
7900 add_incomplete_type (type)
7901      tree type;
7902 {
7903   if (incomplete_types == incomplete_types_allocated)
7904     {
7905       incomplete_types_allocated += INCOMPLETE_TYPES_INCREMENT;
7906       incomplete_types_list
7907         = (tree *) xrealloc (incomplete_types_list,
7908                              sizeof (tree) * incomplete_types_allocated);
7909     }
7910
7911   incomplete_types_list[incomplete_types++] = type;
7912 }
7913
7914 /* Walk through the list of incomplete types again, trying once more to
7915    emit full debugging info for them.  */
7916
7917 static void
7918 retry_incomplete_types ()
7919 {
7920   register tree type;
7921
7922   while (incomplete_types)
7923     {
7924       --incomplete_types;
7925       type = incomplete_types_list[incomplete_types];
7926       gen_type_die (type, comp_unit_die);
7927     }
7928 }
7929
7930 /* Generate a DIE to represent an inlined instance of an enumeration type.  */
7931
7932 static void
7933 gen_inlined_enumeration_type_die (type, context_die)
7934      register tree type;
7935      register dw_die_ref context_die;
7936 {
7937   register dw_die_ref type_die = new_die (DW_TAG_enumeration_type,
7938                                           context_die);
7939   /* We do not check for TREE_ASM_WRITTEN (type) being set, as the type may
7940      be incomplete and such types are not marked.  */
7941   add_abstract_origin_attribute (type_die, type);
7942 }
7943
7944 /* Generate a DIE to represent an inlined instance of a structure type.  */
7945
7946 static void
7947 gen_inlined_structure_type_die (type, context_die)
7948      register tree type;
7949      register dw_die_ref context_die;
7950 {
7951   register dw_die_ref type_die = new_die (DW_TAG_structure_type, context_die);
7952
7953   /* We do not check for TREE_ASM_WRITTEN (type) being set, as the type may
7954      be incomplete and such types are not marked.  */
7955   add_abstract_origin_attribute (type_die, type);
7956 }
7957
7958 /* Generate a DIE to represent an inlined instance of a union type.  */
7959
7960 static void
7961 gen_inlined_union_type_die (type, context_die)
7962      register tree type;
7963      register dw_die_ref context_die;
7964 {
7965   register dw_die_ref type_die = new_die (DW_TAG_union_type, context_die);
7966
7967   /* We do not check for TREE_ASM_WRITTEN (type) being set, as the type may
7968      be incomplete and such types are not marked.  */
7969   add_abstract_origin_attribute (type_die, type);
7970 }
7971
7972 /* Generate a DIE to represent an enumeration type.  Note that these DIEs
7973    include all of the information about the enumeration values also. Each
7974    enumerated type name/value is listed as a child of the enumerated type
7975    DIE.  */
7976
7977 static void
7978 gen_enumeration_type_die (type, context_die)
7979      register tree type;
7980      register dw_die_ref context_die;
7981 {
7982   register dw_die_ref type_die = lookup_type_die (type);
7983
7984   if (type_die == NULL)
7985     {
7986       type_die = new_die (DW_TAG_enumeration_type,
7987                           scope_die_for (type, context_die));
7988       equate_type_number_to_die (type, type_die);
7989       add_name_attribute (type_die, type_tag (type));
7990     }
7991   else if (! TYPE_SIZE (type))
7992     return;
7993   else
7994     remove_AT (type_die, DW_AT_declaration);
7995
7996   /* Handle a GNU C/C++ extension, i.e. incomplete enum types.  If the
7997      given enum type is incomplete, do not generate the DW_AT_byte_size
7998      attribute or the DW_AT_element_list attribute.  */
7999   if (TYPE_SIZE (type))
8000     {
8001       register tree link;
8002
8003       TREE_ASM_WRITTEN (type) = 1;
8004       add_byte_size_attribute (type_die, type);
8005       if (TYPE_STUB_DECL (type) != NULL_TREE)
8006         add_src_coords_attributes (type_die, TYPE_STUB_DECL (type));
8007
8008       /* If the first reference to this type was as the return type of an
8009          inline function, then it may not have a parent.  Fix this now.  */
8010       if (type_die->die_parent == NULL)
8011         add_child_die (scope_die_for (type, context_die), type_die);
8012
8013       for (link = TYPE_FIELDS (type);
8014            link != NULL; link = TREE_CHAIN (link))
8015         {
8016           register dw_die_ref enum_die = new_die (DW_TAG_enumerator, type_die);
8017
8018           add_name_attribute (enum_die,
8019                               IDENTIFIER_POINTER (TREE_PURPOSE (link)));
8020           add_AT_unsigned (enum_die, DW_AT_const_value,
8021                            (unsigned) TREE_INT_CST_LOW (TREE_VALUE (link)));
8022         }
8023     }
8024   else
8025     add_AT_flag (type_die, DW_AT_declaration, 1);
8026 }
8027
8028
8029 /* Generate a DIE to represent either a real live formal parameter decl or to
8030    represent just the type of some formal parameter position in some function
8031    type.
8032
8033    Note that this routine is a bit unusual because its argument may be a
8034    ..._DECL node (i.e. either a PARM_DECL or perhaps a VAR_DECL which
8035    represents an inlining of some PARM_DECL) or else some sort of a ..._TYPE
8036    node.  If it's the former then this function is being called to output a
8037    DIE to represent a formal parameter object (or some inlining thereof).  If
8038    it's the latter, then this function is only being called to output a
8039    DW_TAG_formal_parameter DIE to stand as a placeholder for some formal
8040    argument type of some subprogram type.  */
8041
8042 static dw_die_ref
8043 gen_formal_parameter_die (node, context_die)
8044      register tree node;
8045      register dw_die_ref context_die;
8046 {
8047   register dw_die_ref parm_die
8048     = new_die (DW_TAG_formal_parameter, context_die);
8049   register tree origin;
8050
8051   switch (TREE_CODE_CLASS (TREE_CODE (node)))
8052     {
8053     case 'd':
8054       origin = decl_ultimate_origin (node);
8055       if (origin != NULL)
8056         add_abstract_origin_attribute (parm_die, origin);
8057       else
8058         {
8059           add_name_and_src_coords_attributes (parm_die, node);
8060           add_type_attribute (parm_die, TREE_TYPE (node),
8061                               TREE_READONLY (node),
8062                               TREE_THIS_VOLATILE (node),
8063                               context_die);
8064           if (DECL_ARTIFICIAL (node))
8065             add_AT_flag (parm_die, DW_AT_artificial, 1);
8066         }
8067
8068       equate_decl_number_to_die (node, parm_die);
8069       if (! DECL_ABSTRACT (node))
8070         add_location_or_const_value_attribute (parm_die, node);
8071
8072       break;
8073
8074     case 't':
8075       /* We were called with some kind of a ..._TYPE node.  */
8076       add_type_attribute (parm_die, node, 0, 0, context_die);
8077       break;
8078
8079     default:
8080       abort ();
8081     }
8082
8083   return parm_die;
8084 }
8085
8086 /* Generate a special type of DIE used as a stand-in for a trailing ellipsis
8087    at the end of an (ANSI prototyped) formal parameters list.  */
8088
8089 static void
8090 gen_unspecified_parameters_die (decl_or_type, context_die)
8091      register tree decl_or_type ATTRIBUTE_UNUSED;
8092      register dw_die_ref context_die;
8093 {
8094   new_die (DW_TAG_unspecified_parameters, context_die);
8095 }
8096
8097 /* Generate a list of nameless DW_TAG_formal_parameter DIEs (and perhaps a
8098    DW_TAG_unspecified_parameters DIE) to represent the types of the formal
8099    parameters as specified in some function type specification (except for
8100    those which appear as part of a function *definition*).
8101
8102    Note we must be careful here to output all of the parameter DIEs before*
8103    we output any DIEs needed to represent the types of the formal parameters.
8104    This keeps svr4 SDB happy because it (incorrectly) thinks that the first
8105    non-parameter DIE it sees ends the formal parameter list.  */
8106
8107 static void
8108 gen_formal_types_die (function_or_method_type, context_die)
8109      register tree function_or_method_type;
8110      register dw_die_ref context_die;
8111 {
8112   register tree link;
8113   register tree formal_type = NULL;
8114   register tree first_parm_type = TYPE_ARG_TYPES (function_or_method_type);
8115
8116 #if 0
8117   /* In the case where we are generating a formal types list for a C++
8118      non-static member function type, skip over the first thing on the
8119      TYPE_ARG_TYPES list because it only represents the type of the hidden
8120      `this pointer'.  The debugger should be able to figure out (without
8121      being explicitly told) that this non-static member function type takes a 
8122      `this pointer' and should be able to figure what the type of that hidden 
8123      parameter is from the DW_AT_member attribute of the parent
8124      DW_TAG_subroutine_type DIE.  */
8125   if (TREE_CODE (function_or_method_type) == METHOD_TYPE)
8126     first_parm_type = TREE_CHAIN (first_parm_type);
8127 #endif
8128
8129   /* Make our first pass over the list of formal parameter types and output a 
8130      DW_TAG_formal_parameter DIE for each one.  */
8131   for (link = first_parm_type; link; link = TREE_CHAIN (link))
8132     {
8133       register dw_die_ref parm_die;
8134       
8135       formal_type = TREE_VALUE (link);
8136       if (formal_type == void_type_node)
8137         break;
8138
8139       /* Output a (nameless) DIE to represent the formal parameter itself.  */
8140       parm_die = gen_formal_parameter_die (formal_type, context_die);
8141       if (TREE_CODE (function_or_method_type) == METHOD_TYPE
8142           && link == first_parm_type)
8143         add_AT_flag (parm_die, DW_AT_artificial, 1);
8144     }
8145
8146   /* If this function type has an ellipsis, add a
8147      DW_TAG_unspecified_parameters DIE to the end of the parameter list.  */
8148   if (formal_type != void_type_node)
8149     gen_unspecified_parameters_die (function_or_method_type, context_die);
8150
8151   /* Make our second (and final) pass over the list of formal parameter types 
8152      and output DIEs to represent those types (as necessary).  */
8153   for (link = TYPE_ARG_TYPES (function_or_method_type);
8154        link;
8155        link = TREE_CHAIN (link))
8156     {
8157       formal_type = TREE_VALUE (link);
8158       if (formal_type == void_type_node)
8159         break;
8160
8161       gen_type_die (formal_type, context_die);
8162     }
8163 }
8164
8165 /* We want to generate the DIE for TYPE so that we can generate the
8166    die for MEMBER, which has been defined; we will need to refer back
8167    to the member declaration nested within TYPE.  If we're trying to
8168    generate minimal debug info for TYPE, processing TYPE won't do the
8169    trick; we need to attach the member declaration by hand.  */
8170
8171 static void
8172 gen_type_die_for_member (type, member, context_die)
8173      tree type, member;
8174      dw_die_ref context_die;
8175 {
8176   gen_type_die (type, context_die);
8177
8178   /* If we're trying to avoid duplicate debug info, we may not have
8179      emitted the member decl for this function.  Emit it now.  */
8180   if (TYPE_DECL_SUPPRESS_DEBUG (TYPE_STUB_DECL (type))
8181       && ! lookup_decl_die (member))
8182     {
8183       if (decl_ultimate_origin (member))
8184         abort ();
8185
8186       push_decl_scope (type);
8187       if (TREE_CODE (member) == FUNCTION_DECL)
8188         gen_subprogram_die (member, lookup_type_die (type));
8189       else
8190         gen_variable_die (member, lookup_type_die (type));
8191       pop_decl_scope ();
8192     }
8193 }
8194
8195 /* Generate the DWARF2 info for the "abstract" instance
8196    of a function which we may later generate inlined and/or
8197    out-of-line instances of.  */
8198
8199 static void
8200 gen_abstract_function (decl)
8201      tree decl;
8202 {
8203   register dw_die_ref old_die = lookup_decl_die (decl);
8204   tree save_fn;
8205
8206   if (old_die && get_AT_unsigned (old_die, DW_AT_inline))
8207     /* We've already generated the abstract instance.  */
8208     return;
8209
8210   save_fn = current_function_decl;
8211   current_function_decl = decl;
8212
8213   set_decl_abstract_flags (decl, 1);
8214   dwarf2out_decl (decl);
8215   set_decl_abstract_flags (decl, 0);
8216
8217   current_function_decl = save_fn;
8218 }
8219
8220 /* Generate a DIE to represent a declared function (either file-scope or
8221    block-local).  */
8222
8223 static void
8224 gen_subprogram_die (decl, context_die)
8225      register tree decl;
8226      register dw_die_ref context_die;
8227 {
8228   char label_id[MAX_ARTIFICIAL_LABEL_BYTES];
8229   register tree origin = decl_ultimate_origin (decl);
8230   register dw_die_ref subr_die;
8231   register rtx fp_reg;
8232   register tree fn_arg_types;
8233   register tree outer_scope;
8234   register dw_die_ref old_die = lookup_decl_die (decl);
8235   register int declaration = (current_function_decl != decl
8236                               || class_scope_p (context_die));
8237
8238   /* Note that it is possible to have both DECL_ABSTRACT and `declaration'
8239      be true, if we started to generate the abstract instance of an inline,
8240      decided to output its containing class, and proceeded to emit the
8241      declaration of the inline from the member list for the class.  In that
8242      case, `declaration' takes priority; we'll get back to the abstract
8243      instance when we're done with the class.  */
8244
8245   if (origin != NULL)
8246     {
8247       if (declaration && ! local_scope_p (context_die))
8248         abort ();
8249
8250       subr_die = new_die (DW_TAG_subprogram, context_die);
8251       add_abstract_origin_attribute (subr_die, origin);
8252     }
8253   else if (old_die && DECL_ABSTRACT (decl)
8254            && get_AT_unsigned (old_die, DW_AT_inline))
8255     {
8256       /* This must be a redefinition of an extern inline function.
8257          We can just reuse the old die here.  */
8258       subr_die = old_die;
8259
8260       /* Clear out the inlined attribute and parm types.  */
8261       remove_AT (subr_die, DW_AT_inline);
8262       remove_children (subr_die);
8263     }
8264   else if (old_die)
8265     {
8266       register unsigned file_index
8267         = lookup_filename (DECL_SOURCE_FILE (decl));
8268
8269       if (get_AT_flag (old_die, DW_AT_declaration) != 1)
8270         {
8271           /* ??? This can happen if there is a bug in the program, for
8272              instance, if it has duplicate function definitions.  Ideally,
8273              we should detect this case and ignore it.  For now, if we have
8274              already reported an error, any error at all, then assume that
8275              we got here because of a input error, not a dwarf2 bug.  */
8276           if (errorcount)
8277             return;
8278           abort ();
8279         }
8280
8281       /* If the definition comes from the same place as the declaration,
8282          maybe use the old DIE.  We always want the DIE for this function
8283          that has the *_pc attributes to be under comp_unit_die so the
8284          debugger can find it.  For inlines, that is the concrete instance,
8285          so we can use the old DIE here.  For non-inline methods, we want a
8286          specification DIE at toplevel, so we need a new DIE.  For local
8287          class methods, this doesn't apply; we just use the old DIE.  */
8288       if ((DECL_ABSTRACT (decl) || old_die->die_parent == comp_unit_die
8289            || context_die == NULL)
8290           && (DECL_ARTIFICIAL (decl)
8291               || (get_AT_unsigned (old_die, DW_AT_decl_file) == file_index
8292                   && (get_AT_unsigned (old_die, DW_AT_decl_line)
8293                       == (unsigned)DECL_SOURCE_LINE (decl)))))
8294         {
8295           subr_die = old_die;
8296
8297           /* Clear out the declaration attribute and the parm types.  */
8298           remove_AT (subr_die, DW_AT_declaration);
8299           remove_children (subr_die);
8300         }
8301       else
8302         {
8303           subr_die = new_die (DW_TAG_subprogram, context_die);
8304           add_AT_die_ref (subr_die, DW_AT_specification, old_die);
8305           if (get_AT_unsigned (old_die, DW_AT_decl_file) != file_index)
8306             add_AT_unsigned (subr_die, DW_AT_decl_file, file_index);
8307           if (get_AT_unsigned (old_die, DW_AT_decl_line)
8308               != (unsigned)DECL_SOURCE_LINE (decl))
8309             add_AT_unsigned
8310               (subr_die, DW_AT_decl_line, DECL_SOURCE_LINE (decl));
8311         }
8312     }
8313   else
8314     {
8315       subr_die = new_die (DW_TAG_subprogram, context_die);
8316                          
8317       if (TREE_PUBLIC (decl))
8318         add_AT_flag (subr_die, DW_AT_external, 1);
8319
8320       add_name_and_src_coords_attributes (subr_die, decl);
8321       if (debug_info_level > DINFO_LEVEL_TERSE)
8322         {
8323           register tree type = TREE_TYPE (decl);
8324
8325           add_prototyped_attribute (subr_die, type);
8326           add_type_attribute (subr_die, TREE_TYPE (type), 0, 0, context_die);
8327         }
8328
8329       add_pure_or_virtual_attribute (subr_die, decl);
8330       if (DECL_ARTIFICIAL (decl))
8331         add_AT_flag (subr_die, DW_AT_artificial, 1);
8332       if (TREE_PROTECTED (decl))
8333         add_AT_unsigned (subr_die, DW_AT_accessibility, DW_ACCESS_protected);
8334       else if (TREE_PRIVATE (decl))
8335         add_AT_unsigned (subr_die, DW_AT_accessibility, DW_ACCESS_private);
8336     }
8337
8338   if (declaration)
8339     {
8340       if (! origin)
8341         add_AT_flag (subr_die, DW_AT_declaration, 1);
8342
8343       /* The first time we see a member function, it is in the context of
8344          the class to which it belongs.  We make sure of this by emitting
8345          the class first.  The next time is the definition, which is
8346          handled above.  The two may come from the same source text.  */
8347       if (DECL_CONTEXT (decl) || DECL_ABSTRACT (decl))
8348         equate_decl_number_to_die (decl, subr_die);
8349     }
8350   else if (DECL_ABSTRACT (decl))
8351     {
8352       if (DECL_INLINE (decl) && !flag_no_inline)
8353         {
8354           /* ??? Checking DECL_DEFER_OUTPUT is correct for static
8355              inline functions, but not for extern inline functions.
8356              We can't get this completely correct because information
8357              about whether the function was declared inline is not
8358              saved anywhere.  */
8359           if (DECL_DEFER_OUTPUT (decl))
8360             add_AT_unsigned (subr_die, DW_AT_inline, DW_INL_declared_inlined);
8361           else
8362             add_AT_unsigned (subr_die, DW_AT_inline, DW_INL_inlined);
8363         }
8364       else
8365         add_AT_unsigned (subr_die, DW_AT_inline, DW_INL_declared_not_inlined);
8366
8367       equate_decl_number_to_die (decl, subr_die);
8368     }
8369   else if (!DECL_EXTERNAL (decl))
8370     {
8371       if (origin == NULL_TREE)
8372         equate_decl_number_to_die (decl, subr_die);
8373
8374       ASM_GENERATE_INTERNAL_LABEL (label_id, FUNC_BEGIN_LABEL,
8375                                    current_funcdef_number);
8376       add_AT_lbl_id (subr_die, DW_AT_low_pc, label_id);
8377       ASM_GENERATE_INTERNAL_LABEL (label_id, FUNC_END_LABEL,
8378                                    current_funcdef_number);
8379       add_AT_lbl_id (subr_die, DW_AT_high_pc, label_id);
8380
8381       add_pubname (decl, subr_die);
8382       add_arange (decl, subr_die);
8383
8384 #ifdef MIPS_DEBUGGING_INFO
8385       /* Add a reference to the FDE for this routine.  */
8386       add_AT_fde_ref (subr_die, DW_AT_MIPS_fde, current_funcdef_fde);
8387 #endif
8388
8389       /* Define the "frame base" location for this routine.  We use the
8390          frame pointer or stack pointer registers, since the RTL for local
8391          variables is relative to one of them.  */
8392       fp_reg
8393         = frame_pointer_needed ? hard_frame_pointer_rtx : stack_pointer_rtx;
8394       add_AT_loc (subr_die, DW_AT_frame_base, reg_loc_descriptor (fp_reg));
8395
8396 #if 0
8397       /* ??? This fails for nested inline functions, because context_display
8398          is not part of the state saved/restored for inline functions.  */
8399       if (current_function_needs_context)
8400         add_AT_location_description (subr_die, DW_AT_static_link,
8401                                      lookup_static_chain (decl));
8402 #endif
8403     }
8404
8405   /* Now output descriptions of the arguments for this function. This gets
8406      (unnecessarily?) complex because of the fact that the DECL_ARGUMENT list 
8407      for a FUNCTION_DECL doesn't indicate cases where there was a trailing
8408      `...' at the end of the formal parameter list.  In order to find out if
8409      there was a trailing ellipsis or not, we must instead look at the type
8410      associated with the FUNCTION_DECL.  This will be a node of type
8411      FUNCTION_TYPE. If the chain of type nodes hanging off of this
8412      FUNCTION_TYPE node ends with a void_type_node then there should *not* be 
8413      an ellipsis at the end.  */
8414
8415   /* In the case where we are describing a mere function declaration, all we
8416      need to do here (and all we *can* do here) is to describe the *types* of 
8417      its formal parameters.  */
8418   if (debug_info_level <= DINFO_LEVEL_TERSE)
8419     ;
8420   else if (declaration)
8421     gen_formal_types_die (TREE_TYPE (decl), subr_die);
8422   else
8423     {
8424       /* Generate DIEs to represent all known formal parameters */
8425       register tree arg_decls = DECL_ARGUMENTS (decl);
8426       register tree parm;
8427
8428       /* When generating DIEs, generate the unspecified_parameters DIE
8429          instead if we come across the arg "__builtin_va_alist" */
8430       for (parm = arg_decls; parm; parm = TREE_CHAIN (parm))
8431         if (TREE_CODE (parm) == PARM_DECL)
8432           {
8433             if (DECL_NAME (parm)
8434                 && !strcmp (IDENTIFIER_POINTER (DECL_NAME (parm)),
8435                             "__builtin_va_alist"))
8436               gen_unspecified_parameters_die (parm, subr_die);
8437             else
8438               gen_decl_die (parm, subr_die);
8439           }
8440
8441       /* Decide whether we need a unspecified_parameters DIE at the end.
8442          There are 2 more cases to do this for: 1) the ansi ... declaration - 
8443          this is detectable when the end of the arg list is not a
8444          void_type_node 2) an unprototyped function declaration (not a
8445          definition).  This just means that we have no info about the
8446          parameters at all.  */
8447       fn_arg_types = TYPE_ARG_TYPES (TREE_TYPE (decl));
8448       if (fn_arg_types != NULL)
8449         {
8450           /* this is the prototyped case, check for ...  */
8451           if (TREE_VALUE (tree_last (fn_arg_types)) != void_type_node)
8452             gen_unspecified_parameters_die (decl, subr_die);
8453         }
8454       else if (DECL_INITIAL (decl) == NULL_TREE)
8455         gen_unspecified_parameters_die (decl, subr_die);
8456     }
8457
8458   /* Output Dwarf info for all of the stuff within the body of the function
8459      (if it has one - it may be just a declaration).  */
8460   outer_scope = DECL_INITIAL (decl);
8461
8462   /* Note that here, `outer_scope' is a pointer to the outermost BLOCK
8463      node created to represent a function. This outermost BLOCK actually
8464      represents the outermost binding contour for the function, i.e. the
8465      contour in which the function's formal parameters and labels get
8466      declared. Curiously, it appears that the front end doesn't actually
8467      put the PARM_DECL nodes for the current function onto the BLOCK_VARS
8468      list for this outer scope.  (They are strung off of the DECL_ARGUMENTS
8469      list for the function instead.) The BLOCK_VARS list for the
8470      `outer_scope' does provide us with a list of the LABEL_DECL nodes for
8471      the function however, and we output DWARF info for those in
8472      decls_for_scope.  Just within the `outer_scope' there will be a BLOCK
8473      node representing the function's outermost pair of curly braces, and
8474      any blocks used for the base and member initializers of a C++
8475      constructor function.  */
8476   if (! declaration && TREE_CODE (outer_scope) != ERROR_MARK)
8477     {
8478       current_function_has_inlines = 0;
8479       decls_for_scope (outer_scope, subr_die, 0);
8480
8481 #if 0 && defined (MIPS_DEBUGGING_INFO)
8482       if (current_function_has_inlines)
8483         {
8484           add_AT_flag (subr_die, DW_AT_MIPS_has_inlines, 1);
8485           if (! comp_unit_has_inlines)
8486             {
8487               add_AT_flag (comp_unit_die, DW_AT_MIPS_has_inlines, 1);
8488               comp_unit_has_inlines = 1;
8489             }
8490         }
8491 #endif
8492     }
8493 }
8494
8495 /* Generate a DIE to represent a declared data object.  */
8496
8497 static void
8498 gen_variable_die (decl, context_die)
8499      register tree decl;
8500      register dw_die_ref context_die;
8501 {
8502   register tree origin = decl_ultimate_origin (decl);
8503   register dw_die_ref var_die = new_die (DW_TAG_variable, context_die);
8504
8505   dw_die_ref old_die = lookup_decl_die (decl);
8506   int declaration = (DECL_EXTERNAL (decl)
8507                      || class_scope_p (context_die));
8508
8509   if (origin != NULL)
8510     add_abstract_origin_attribute (var_die, origin);
8511   /* Loop unrolling can create multiple blocks that refer to the same
8512      static variable, so we must test for the DW_AT_declaration flag.  */
8513   /* ??? Loop unrolling/reorder_blocks should perhaps be rewritten to
8514      copy decls and set the DECL_ABSTRACT flag on them instead of
8515      sharing them.  */
8516   else if (old_die && TREE_STATIC (decl)
8517            && get_AT_flag (old_die, DW_AT_declaration) == 1)
8518     {
8519       /* This is a definition of a C++ class level static.  */
8520       add_AT_die_ref (var_die, DW_AT_specification, old_die);
8521       if (DECL_NAME (decl))
8522         {
8523           register unsigned file_index
8524             = lookup_filename (DECL_SOURCE_FILE (decl));
8525
8526           if (get_AT_unsigned (old_die, DW_AT_decl_file) != file_index)
8527             add_AT_unsigned (var_die, DW_AT_decl_file, file_index);
8528
8529           if (get_AT_unsigned (old_die, DW_AT_decl_line)
8530               != (unsigned)DECL_SOURCE_LINE (decl))
8531
8532             add_AT_unsigned (var_die, DW_AT_decl_line,
8533                              DECL_SOURCE_LINE (decl));
8534         }
8535     }
8536   else
8537     {
8538       add_name_and_src_coords_attributes (var_die, decl);
8539       add_type_attribute (var_die, TREE_TYPE (decl),
8540                           TREE_READONLY (decl),
8541                           TREE_THIS_VOLATILE (decl), context_die);
8542
8543       if (TREE_PUBLIC (decl))
8544         add_AT_flag (var_die, DW_AT_external, 1);
8545
8546       if (DECL_ARTIFICIAL (decl))
8547         add_AT_flag (var_die, DW_AT_artificial, 1);
8548
8549       if (TREE_PROTECTED (decl))
8550         add_AT_unsigned (var_die, DW_AT_accessibility, DW_ACCESS_protected);
8551
8552       else if (TREE_PRIVATE (decl))
8553         add_AT_unsigned (var_die, DW_AT_accessibility, DW_ACCESS_private);
8554     }
8555
8556   if (declaration)
8557     add_AT_flag (var_die, DW_AT_declaration, 1);
8558   
8559   if (class_scope_p (context_die) || DECL_ABSTRACT (decl))
8560     equate_decl_number_to_die (decl, var_die);
8561
8562   if (! declaration && ! DECL_ABSTRACT (decl))
8563     {
8564       add_location_or_const_value_attribute (var_die, decl);
8565       add_pubname (decl, var_die);
8566     }
8567 }
8568
8569 /* Generate a DIE to represent a label identifier.  */
8570
8571 static void
8572 gen_label_die (decl, context_die)
8573      register tree decl;
8574      register dw_die_ref context_die;
8575 {
8576   register tree origin = decl_ultimate_origin (decl);
8577   register dw_die_ref lbl_die = new_die (DW_TAG_label, context_die);
8578   register rtx insn;
8579   char label[MAX_ARTIFICIAL_LABEL_BYTES];
8580   char label2[MAX_ARTIFICIAL_LABEL_BYTES];
8581
8582   if (origin != NULL)
8583     add_abstract_origin_attribute (lbl_die, origin);
8584   else
8585     add_name_and_src_coords_attributes (lbl_die, decl);
8586
8587   if (DECL_ABSTRACT (decl))
8588     equate_decl_number_to_die (decl, lbl_die);
8589   else
8590     {
8591       insn = DECL_RTL (decl);
8592
8593       /* Deleted labels are programmer specified labels which have been
8594          eliminated because of various optimisations.  We still emit them
8595          here so that it is possible to put breakpoints on them.  */
8596       if (GET_CODE (insn) == CODE_LABEL
8597           || ((GET_CODE (insn) == NOTE
8598                && NOTE_LINE_NUMBER (insn) == NOTE_INSN_DELETED_LABEL)))
8599         {
8600           /* When optimization is enabled (via -O) some parts of the compiler 
8601              (e.g. jump.c and cse.c) may try to delete CODE_LABEL insns which 
8602              represent source-level labels which were explicitly declared by
8603              the user.  This really shouldn't be happening though, so catch
8604              it if it ever does happen.  */
8605           if (INSN_DELETED_P (insn))
8606             abort ();
8607
8608           sprintf (label2, INSN_LABEL_FMT, current_funcdef_number);
8609           ASM_GENERATE_INTERNAL_LABEL (label, label2,
8610                                        (unsigned) INSN_UID (insn));
8611           add_AT_lbl_id (lbl_die, DW_AT_low_pc, label);
8612         }
8613     }
8614 }
8615
8616 /* Generate a DIE for a lexical block.  */
8617
8618 static void
8619 gen_lexical_block_die (stmt, context_die, depth)
8620      register tree stmt;
8621      register dw_die_ref context_die;
8622      int depth;
8623 {
8624   register dw_die_ref stmt_die = new_die (DW_TAG_lexical_block, context_die);
8625   char label[MAX_ARTIFICIAL_LABEL_BYTES];
8626
8627   if (! BLOCK_ABSTRACT (stmt))
8628     {
8629       ASM_GENERATE_INTERNAL_LABEL (label, BLOCK_BEGIN_LABEL,
8630                                    next_block_number);
8631       add_AT_lbl_id (stmt_die, DW_AT_low_pc, label);
8632       ASM_GENERATE_INTERNAL_LABEL (label, BLOCK_END_LABEL, next_block_number);
8633       add_AT_lbl_id (stmt_die, DW_AT_high_pc, label);
8634     }
8635
8636   decls_for_scope (stmt, stmt_die, depth);
8637 }
8638
8639 /* Generate a DIE for an inlined subprogram.  */
8640
8641 static void
8642 gen_inlined_subroutine_die (stmt, context_die, depth)
8643      register tree stmt;
8644      register dw_die_ref context_die;
8645      int depth;
8646 {
8647   if (! BLOCK_ABSTRACT (stmt))
8648     {
8649       register dw_die_ref subr_die
8650         = new_die (DW_TAG_inlined_subroutine, context_die);
8651       register tree decl = block_ultimate_origin (stmt);
8652       char label[MAX_ARTIFICIAL_LABEL_BYTES];
8653
8654       /* Emit info for the abstract instance first, if we haven't yet.  */
8655       gen_abstract_function (decl);
8656
8657       add_abstract_origin_attribute (subr_die, decl);
8658       ASM_GENERATE_INTERNAL_LABEL (label, BLOCK_BEGIN_LABEL,
8659                                    next_block_number);
8660       add_AT_lbl_id (subr_die, DW_AT_low_pc, label);
8661       ASM_GENERATE_INTERNAL_LABEL (label, BLOCK_END_LABEL, next_block_number);
8662       add_AT_lbl_id (subr_die, DW_AT_high_pc, label);
8663       decls_for_scope (stmt, subr_die, depth);
8664       current_function_has_inlines = 1;
8665     }
8666 }
8667
8668 /* Generate a DIE for a field in a record, or structure.  */
8669
8670 static void
8671 gen_field_die (decl, context_die)
8672      register tree decl;
8673      register dw_die_ref context_die;
8674 {
8675   register dw_die_ref decl_die = new_die (DW_TAG_member, context_die);
8676
8677   add_name_and_src_coords_attributes (decl_die, decl);
8678   add_type_attribute (decl_die, member_declared_type (decl),
8679                       TREE_READONLY (decl), TREE_THIS_VOLATILE (decl),
8680                       context_die);
8681
8682   /* If this is a bit field...  */
8683   if (DECL_BIT_FIELD_TYPE (decl))
8684     {
8685       add_byte_size_attribute (decl_die, decl);
8686       add_bit_size_attribute (decl_die, decl);
8687       add_bit_offset_attribute (decl_die, decl);
8688     }
8689
8690   if (TREE_CODE (DECL_FIELD_CONTEXT (decl)) != UNION_TYPE)
8691     add_data_member_location_attribute (decl_die, decl);
8692
8693   if (DECL_ARTIFICIAL (decl))
8694     add_AT_flag (decl_die, DW_AT_artificial, 1);
8695
8696   if (TREE_PROTECTED (decl))
8697     add_AT_unsigned (decl_die, DW_AT_accessibility, DW_ACCESS_protected);
8698
8699   else if (TREE_PRIVATE (decl))
8700     add_AT_unsigned (decl_die, DW_AT_accessibility, DW_ACCESS_private);
8701 }
8702
8703 #if 0
8704 /* Don't generate either pointer_type DIEs or reference_type DIEs here.
8705    Use modified_type_die instead.
8706    We keep this code here just in case these types of DIEs may be needed to
8707    represent certain things in other languages (e.g. Pascal) someday.  */
8708 static void
8709 gen_pointer_type_die (type, context_die)
8710      register tree type;
8711      register dw_die_ref context_die;
8712 {
8713   register dw_die_ref ptr_die
8714     = new_die (DW_TAG_pointer_type, scope_die_for (type, context_die));
8715
8716   equate_type_number_to_die (type, ptr_die);
8717   add_type_attribute (ptr_die, TREE_TYPE (type), 0, 0, context_die);
8718   add_AT_unsigned (mod_type_die, DW_AT_byte_size, PTR_SIZE);
8719 }
8720
8721 /* Don't generate either pointer_type DIEs or reference_type DIEs here.
8722    Use modified_type_die instead.
8723    We keep this code here just in case these types of DIEs may be needed to
8724    represent certain things in other languages (e.g. Pascal) someday.  */
8725 static void
8726 gen_reference_type_die (type, context_die)
8727      register tree type;
8728      register dw_die_ref context_die;
8729 {
8730   register dw_die_ref ref_die
8731     = new_die (DW_TAG_reference_type, scope_die_for (type, context_die));
8732
8733   equate_type_number_to_die (type, ref_die);
8734   add_type_attribute (ref_die, TREE_TYPE (type), 0, 0, context_die);
8735   add_AT_unsigned (mod_type_die, DW_AT_byte_size, PTR_SIZE);
8736 }
8737 #endif
8738
8739 /* Generate a DIE for a pointer to a member type.  */
8740 static void
8741 gen_ptr_to_mbr_type_die (type, context_die)
8742      register tree type;
8743      register dw_die_ref context_die;
8744 {
8745   register dw_die_ref ptr_die
8746     = new_die (DW_TAG_ptr_to_member_type, scope_die_for (type, context_die));
8747
8748   equate_type_number_to_die (type, ptr_die);
8749   add_AT_die_ref (ptr_die, DW_AT_containing_type,
8750                   lookup_type_die (TYPE_OFFSET_BASETYPE (type)));
8751   add_type_attribute (ptr_die, TREE_TYPE (type), 0, 0, context_die);
8752 }
8753
8754 /* Generate the DIE for the compilation unit.  */
8755
8756 static dw_die_ref
8757 gen_compile_unit_die (filename)
8758      register const char *filename;
8759 {
8760   register dw_die_ref die;
8761   char producer[250];
8762   char *wd = getpwd ();
8763   int language;
8764
8765   die = new_die (DW_TAG_compile_unit, NULL);
8766   add_name_attribute (die, filename);
8767
8768   if (wd != NULL && filename[0] != DIR_SEPARATOR)
8769     add_AT_string (die, DW_AT_comp_dir, wd);
8770
8771   sprintf (producer, "%s %s", language_string, version_string);
8772
8773 #ifdef MIPS_DEBUGGING_INFO
8774   /* The MIPS/SGI compilers place the 'cc' command line options in the producer
8775      string.  The SGI debugger looks for -g, -g1, -g2, or -g3; if they do
8776      not appear in the producer string, the debugger reaches the conclusion
8777      that the object file is stripped and has no debugging information.
8778      To get the MIPS/SGI debugger to believe that there is debugging
8779      information in the object file, we add a -g to the producer string.  */
8780   if (debug_info_level > DINFO_LEVEL_TERSE)
8781     strcat (producer, " -g");
8782 #endif
8783
8784   add_AT_string (die, DW_AT_producer, producer);
8785
8786   if (strcmp (language_string, "GNU C++") == 0)
8787     language = DW_LANG_C_plus_plus;
8788   else if (strcmp (language_string, "GNU Ada") == 0)
8789     language = DW_LANG_Ada83;
8790   else if (strcmp (language_string, "GNU F77") == 0)
8791     language = DW_LANG_Fortran77;
8792   else if (strcmp (language_string, "GNU Pascal") == 0)
8793     language = DW_LANG_Pascal83;
8794   else if (flag_traditional)
8795     language = DW_LANG_C;
8796   else
8797     language = DW_LANG_C89;
8798
8799   add_AT_unsigned (die, DW_AT_language, language);
8800
8801   return die;
8802 }
8803
8804 /* Generate a DIE for a string type.  */
8805
8806 static void
8807 gen_string_type_die (type, context_die)
8808      register tree type;
8809      register dw_die_ref context_die;
8810 {
8811   register dw_die_ref type_die
8812     = new_die (DW_TAG_string_type, scope_die_for (type, context_die));
8813
8814   equate_type_number_to_die (type, type_die);
8815
8816   /* Fudge the string length attribute for now.  */
8817   
8818   /* TODO: add string length info.
8819    string_length_attribute (TYPE_MAX_VALUE (TYPE_DOMAIN (type)));
8820                               bound_representation (upper_bound, 0, 'u'); */
8821 }
8822
8823 /* Generate the DIE for a base class.  */
8824
8825 static void
8826 gen_inheritance_die (binfo, context_die)
8827      register tree binfo;
8828      register dw_die_ref context_die;
8829 {
8830   dw_die_ref die = new_die (DW_TAG_inheritance, context_die);
8831
8832   add_type_attribute (die, BINFO_TYPE (binfo), 0, 0, context_die);
8833   add_data_member_location_attribute (die, binfo);
8834
8835   if (TREE_VIA_VIRTUAL (binfo))
8836     add_AT_unsigned (die, DW_AT_virtuality, DW_VIRTUALITY_virtual);
8837   if (TREE_VIA_PUBLIC (binfo))
8838     add_AT_unsigned (die, DW_AT_accessibility, DW_ACCESS_public);
8839   else if (TREE_VIA_PROTECTED (binfo))
8840     add_AT_unsigned (die, DW_AT_accessibility, DW_ACCESS_protected);
8841 }
8842
8843 /* Generate a DIE for a class member.  */
8844
8845 static void
8846 gen_member_die (type, context_die)
8847      register tree type;
8848      register dw_die_ref context_die;
8849 {
8850   register tree member;
8851   dw_die_ref child;
8852
8853   /* If this is not an incomplete type, output descriptions of each of its
8854      members. Note that as we output the DIEs necessary to represent the
8855      members of this record or union type, we will also be trying to output
8856      DIEs to represent the *types* of those members. However the `type'
8857      function (above) will specifically avoid generating type DIEs for member 
8858      types *within* the list of member DIEs for this (containing) type execpt 
8859      for those types (of members) which are explicitly marked as also being
8860      members of this (containing) type themselves.  The g++ front- end can
8861      force any given type to be treated as a member of some other
8862      (containing) type by setting the TYPE_CONTEXT of the given (member) type 
8863      to point to the TREE node representing the appropriate (containing)
8864      type.  */
8865
8866   /* First output info about the base classes.  */
8867   if (TYPE_BINFO (type) && TYPE_BINFO_BASETYPES (type))
8868     {
8869       register tree bases = TYPE_BINFO_BASETYPES (type);
8870       register int n_bases = TREE_VEC_LENGTH (bases);
8871       register int i;
8872
8873       for (i = 0; i < n_bases; i++)
8874         gen_inheritance_die (TREE_VEC_ELT (bases, i), context_die);
8875     }
8876
8877   /* Now output info about the data members and type members.  */
8878   for (member = TYPE_FIELDS (type); member; member = TREE_CHAIN (member))
8879     {
8880       /* If we thought we were generating minimal debug info for TYPE
8881          and then changed our minds, some of the member declarations
8882          may have already been defined.  Don't define them again, but
8883          do put them in the right order.  */
8884
8885       child = lookup_decl_die (member);
8886       if (child)
8887         splice_child_die (context_die, child);
8888       else
8889         gen_decl_die (member, context_die);
8890     }
8891
8892   /* Now output info about the function members (if any).  */
8893   for (member = TYPE_METHODS (type); member; member = TREE_CHAIN (member))
8894     {
8895       child = lookup_decl_die (member);
8896       if (child)
8897         splice_child_die (context_die, child);
8898       else
8899         gen_decl_die (member, context_die);
8900     }
8901 }
8902
8903 /* Generate a DIE for a structure or union type.  If TYPE_DECL_SUPPRESS_DEBUG
8904    is set, we pretend that the type was never defined, so we only get the
8905    member DIEs needed by later specification DIEs.  */
8906
8907 static void
8908 gen_struct_or_union_type_die (type, context_die)
8909      register tree type;
8910      register dw_die_ref context_die;
8911 {
8912   register dw_die_ref type_die = lookup_type_die (type);
8913   register dw_die_ref scope_die = 0;
8914   register int nested = 0;
8915   int complete = (TYPE_SIZE (type)
8916                   && ! TYPE_DECL_SUPPRESS_DEBUG (TYPE_STUB_DECL (type)));
8917
8918   if (type_die && ! complete)
8919     return;
8920
8921   if (TYPE_CONTEXT (type) != NULL_TREE
8922       && AGGREGATE_TYPE_P (TYPE_CONTEXT (type)))
8923     nested = 1;
8924
8925   scope_die = scope_die_for (type, context_die);
8926
8927   if (! type_die || (nested && scope_die == comp_unit_die))
8928     /* First occurrence of type or toplevel definition of nested class.  */
8929     {
8930       register dw_die_ref old_die = type_die;
8931
8932       type_die = new_die (TREE_CODE (type) == RECORD_TYPE
8933                           ? DW_TAG_structure_type : DW_TAG_union_type,
8934                           scope_die);
8935       equate_type_number_to_die (type, type_die);
8936       add_name_attribute (type_die, type_tag (type));
8937       if (old_die)
8938         add_AT_die_ref (type_die, DW_AT_specification, old_die);
8939     }
8940   else
8941     remove_AT (type_die, DW_AT_declaration);
8942
8943   /* If this type has been completed, then give it a byte_size attribute and
8944      then give a list of members.  */
8945   if (complete)
8946     {
8947       /* Prevent infinite recursion in cases where the type of some member of 
8948          this type is expressed in terms of this type itself.  */
8949       TREE_ASM_WRITTEN (type) = 1;
8950       add_byte_size_attribute (type_die, type);
8951       if (TYPE_STUB_DECL (type) != NULL_TREE)
8952         add_src_coords_attributes (type_die, TYPE_STUB_DECL (type));
8953
8954       /* If the first reference to this type was as the return type of an
8955          inline function, then it may not have a parent.  Fix this now.  */
8956       if (type_die->die_parent == NULL)
8957         add_child_die (scope_die, type_die);
8958
8959       push_decl_scope (type);
8960       gen_member_die (type, type_die);
8961       pop_decl_scope ();
8962
8963       /* GNU extension: Record what type our vtable lives in.  */
8964       if (TYPE_VFIELD (type))
8965         {
8966           tree vtype = DECL_FCONTEXT (TYPE_VFIELD (type));
8967
8968           gen_type_die (vtype, context_die);
8969           add_AT_die_ref (type_die, DW_AT_containing_type,
8970                           lookup_type_die (vtype));
8971         }
8972     }
8973   else
8974     {
8975       add_AT_flag (type_die, DW_AT_declaration, 1);
8976
8977       /* We don't need to do this for function-local types.  */
8978       if (context_die)
8979         add_incomplete_type (type);
8980     }
8981 }
8982
8983 /* Generate a DIE for a subroutine _type_.  */
8984
8985 static void
8986 gen_subroutine_type_die (type, context_die)
8987      register tree type;
8988      register dw_die_ref context_die;
8989 {
8990   register tree return_type = TREE_TYPE (type);
8991   register dw_die_ref subr_die
8992     = new_die (DW_TAG_subroutine_type, scope_die_for (type, context_die));
8993
8994   equate_type_number_to_die (type, subr_die);
8995   add_prototyped_attribute (subr_die, type);
8996   add_type_attribute (subr_die, return_type, 0, 0, context_die);
8997   gen_formal_types_die (type, subr_die);
8998 }
8999
9000 /* Generate a DIE for a type definition */
9001
9002 static void
9003 gen_typedef_die (decl, context_die)
9004      register tree decl;
9005      register dw_die_ref context_die;
9006 {
9007   register dw_die_ref type_die;
9008   register tree origin;
9009
9010   if (TREE_ASM_WRITTEN (decl))
9011     return;
9012   TREE_ASM_WRITTEN (decl) = 1;
9013
9014   type_die = new_die (DW_TAG_typedef, context_die);
9015   origin = decl_ultimate_origin (decl);
9016   if (origin != NULL)
9017     add_abstract_origin_attribute (type_die, origin);
9018   else
9019     {
9020       register tree type;
9021       add_name_and_src_coords_attributes (type_die, decl);
9022       if (DECL_ORIGINAL_TYPE (decl))
9023         {
9024           type = DECL_ORIGINAL_TYPE (decl);
9025           equate_type_number_to_die (TREE_TYPE (decl), type_die);
9026         }
9027       else
9028         type = TREE_TYPE (decl);
9029       add_type_attribute (type_die, type, TREE_READONLY (decl),
9030                           TREE_THIS_VOLATILE (decl), context_die);
9031     }
9032
9033   if (DECL_ABSTRACT (decl))
9034     equate_decl_number_to_die (decl, type_die);
9035 }
9036
9037 /* Generate a type description DIE.  */
9038
9039 static void
9040 gen_type_die (type, context_die)
9041      register tree type;
9042      register dw_die_ref context_die;
9043 {
9044   int need_pop;
9045
9046   if (type == NULL_TREE || type == error_mark_node)
9047     return;
9048
9049   /* We are going to output a DIE to represent the unqualified version of
9050      this type (i.e. without any const or volatile qualifiers) so get the
9051      main variant (i.e. the unqualified version) of this type now.  */
9052   type = type_main_variant (type);
9053
9054   if (TREE_ASM_WRITTEN (type))
9055     return;
9056
9057   if (TYPE_NAME (type) && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
9058       && DECL_ORIGINAL_TYPE (TYPE_NAME (type)))
9059     { 
9060       TREE_ASM_WRITTEN (type) = 1;
9061       gen_decl_die (TYPE_NAME (type), context_die);
9062       return;
9063     }
9064
9065   switch (TREE_CODE (type))
9066     {
9067     case ERROR_MARK:
9068       break;
9069
9070     case POINTER_TYPE:
9071     case REFERENCE_TYPE:
9072       /* We must set TREE_ASM_WRITTEN in case this is a recursive type.  This
9073          ensures that the gen_type_die recursion will terminate even if the
9074          type is recursive.  Recursive types are possible in Ada.  */
9075       /* ??? We could perhaps do this for all types before the switch
9076          statement.  */
9077       TREE_ASM_WRITTEN (type) = 1;
9078
9079       /* For these types, all that is required is that we output a DIE (or a
9080          set of DIEs) to represent the "basis" type.  */
9081       gen_type_die (TREE_TYPE (type), context_die);
9082       break;
9083
9084     case OFFSET_TYPE:
9085       /* This code is used for C++ pointer-to-data-member types. 
9086          Output a description of the relevant class type.  */
9087       gen_type_die (TYPE_OFFSET_BASETYPE (type), context_die);
9088
9089       /* Output a description of the type of the object pointed to.  */
9090       gen_type_die (TREE_TYPE (type), context_die);
9091
9092       /* Now output a DIE to represent this pointer-to-data-member type
9093          itself.  */
9094       gen_ptr_to_mbr_type_die (type, context_die);
9095       break;
9096
9097     case SET_TYPE:
9098       gen_type_die (TYPE_DOMAIN (type), context_die);
9099       gen_set_type_die (type, context_die);
9100       break;
9101
9102     case FILE_TYPE:
9103       gen_type_die (TREE_TYPE (type), context_die);
9104       abort ();                 /* No way to represent these in Dwarf yet!  */
9105       break;
9106
9107     case FUNCTION_TYPE:
9108       /* Force out return type (in case it wasn't forced out already).  */
9109       gen_type_die (TREE_TYPE (type), context_die);
9110       gen_subroutine_type_die (type, context_die);
9111       break;
9112
9113     case METHOD_TYPE:
9114       /* Force out return type (in case it wasn't forced out already).  */
9115       gen_type_die (TREE_TYPE (type), context_die);
9116       gen_subroutine_type_die (type, context_die);
9117       break;
9118
9119     case ARRAY_TYPE:
9120       if (TYPE_STRING_FLAG (type) && TREE_CODE (TREE_TYPE (type)) == CHAR_TYPE)
9121         {
9122           gen_type_die (TREE_TYPE (type), context_die);
9123           gen_string_type_die (type, context_die);
9124         }
9125       else
9126         gen_array_type_die (type, context_die);
9127       break;
9128
9129     case ENUMERAL_TYPE:
9130     case RECORD_TYPE:
9131     case UNION_TYPE:
9132     case QUAL_UNION_TYPE:
9133       /* If this is a nested type whose containing class hasn't been
9134          written out yet, writing it out will cover this one, too.
9135          This does not apply to instantiations of member class templates;
9136          they need to be added to the containing class as they are
9137          generated.  FIXME: This hurts the idea of combining type decls
9138          from multiple TUs, since we can't predict what set of template
9139          instantiations we'll get.  */
9140       if (TYPE_CONTEXT (type)
9141           && AGGREGATE_TYPE_P (TYPE_CONTEXT (type))
9142           && ! TREE_ASM_WRITTEN (TYPE_CONTEXT (type)))
9143         {
9144           gen_type_die (TYPE_CONTEXT (type), context_die);
9145
9146           if (TREE_ASM_WRITTEN (type))
9147             return;
9148
9149           /* If that failed, attach ourselves to the stub.  */
9150           push_decl_scope (TYPE_CONTEXT (type));
9151           context_die = lookup_type_die (TYPE_CONTEXT (type));
9152           need_pop = 1;
9153         }
9154       else
9155         need_pop = 0;
9156
9157       if (TREE_CODE (type) == ENUMERAL_TYPE)
9158         gen_enumeration_type_die (type, context_die);
9159       else
9160         gen_struct_or_union_type_die (type, context_die);
9161
9162       if (need_pop)
9163         pop_decl_scope ();
9164
9165       /* Don't set TREE_ASM_WRITTEN on an incomplete struct; we want to fix
9166          it up if it is ever completed.  gen_*_type_die will set it for us
9167          when appropriate.  */
9168       return;
9169
9170     case VOID_TYPE:
9171     case INTEGER_TYPE:
9172     case REAL_TYPE:
9173     case COMPLEX_TYPE:
9174     case BOOLEAN_TYPE:
9175     case CHAR_TYPE:
9176       /* No DIEs needed for fundamental types.  */
9177       break;
9178
9179     case LANG_TYPE:
9180       /* No Dwarf representation currently defined.  */
9181       break;
9182
9183     default:
9184       abort ();
9185     }
9186
9187   TREE_ASM_WRITTEN (type) = 1;
9188 }
9189
9190 /* Generate a DIE for a tagged type instantiation.  */
9191
9192 static void
9193 gen_tagged_type_instantiation_die (type, context_die)
9194      register tree type;
9195      register dw_die_ref context_die;
9196 {
9197   if (type == NULL_TREE || type == error_mark_node)
9198     return;
9199
9200   /* We are going to output a DIE to represent the unqualified version of
9201      this type (i.e. without any const or volatile qualifiers) so make sure
9202      that we have the main variant (i.e. the unqualified version) of this
9203      type now.  */
9204   if (type != type_main_variant (type))
9205     abort ();
9206
9207   /* Do not check TREE_ASM_WRITTEN(type) as it may not be set if this is
9208      an instance of an unresolved type.  */
9209   
9210   switch (TREE_CODE (type))
9211     {
9212     case ERROR_MARK:
9213       break;
9214
9215     case ENUMERAL_TYPE:
9216       gen_inlined_enumeration_type_die (type, context_die);
9217       break;
9218
9219     case RECORD_TYPE:
9220       gen_inlined_structure_type_die (type, context_die);
9221       break;
9222
9223     case UNION_TYPE:
9224     case QUAL_UNION_TYPE:
9225       gen_inlined_union_type_die (type, context_die);
9226       break;
9227
9228     default:
9229       abort ();
9230     }
9231 }
9232
9233 /* Generate a DW_TAG_lexical_block DIE followed by DIEs to represent all of the
9234    things which are local to the given block.  */
9235
9236 static void
9237 gen_block_die (stmt, context_die, depth)
9238      register tree stmt;
9239      register dw_die_ref context_die;
9240      int depth;
9241 {
9242   register int must_output_die = 0;
9243   register tree origin;
9244   register tree decl;
9245   register enum tree_code origin_code;
9246
9247   /* Ignore blocks never really used to make RTL.  */
9248
9249   if (stmt == NULL_TREE || !TREE_USED (stmt))
9250     return;
9251
9252   /* Determine the "ultimate origin" of this block.  This block may be an
9253      inlined instance of an inlined instance of inline function, so we have
9254      to trace all of the way back through the origin chain to find out what
9255      sort of node actually served as the original seed for the creation of
9256      the current block.  */
9257   origin = block_ultimate_origin (stmt);
9258   origin_code = (origin != NULL) ? TREE_CODE (origin) : ERROR_MARK;
9259
9260   /* Determine if we need to output any Dwarf DIEs at all to represent this
9261      block.  */
9262   if (origin_code == FUNCTION_DECL)
9263     /* The outer scopes for inlinings *must* always be represented.  We
9264        generate DW_TAG_inlined_subroutine DIEs for them.  (See below.) */
9265     must_output_die = 1;
9266   else
9267     {
9268       /* In the case where the current block represents an inlining of the
9269          "body block" of an inline function, we must *NOT* output any DIE for 
9270          this block because we have already output a DIE to represent the
9271          whole inlined function scope and the "body block" of any function
9272          doesn't really represent a different scope according to ANSI C
9273          rules.  So we check here to make sure that this block does not
9274          represent a "body block inlining" before trying to set the
9275          `must_output_die' flag.  */
9276       if (! is_body_block (origin ? origin : stmt))
9277         {
9278           /* Determine if this block directly contains any "significant"
9279              local declarations which we will need to output DIEs for.  */
9280           if (debug_info_level > DINFO_LEVEL_TERSE)
9281             /* We are not in terse mode so *any* local declaration counts
9282                as being a "significant" one.  */
9283             must_output_die = (BLOCK_VARS (stmt) != NULL);
9284           else
9285             /* We are in terse mode, so only local (nested) function
9286                definitions count as "significant" local declarations.  */
9287             for (decl = BLOCK_VARS (stmt);
9288                  decl != NULL; decl = TREE_CHAIN (decl))
9289               if (TREE_CODE (decl) == FUNCTION_DECL
9290                   && DECL_INITIAL (decl))
9291                 {
9292                   must_output_die = 1;
9293                   break;
9294                 }
9295         }
9296     }
9297
9298   /* It would be a waste of space to generate a Dwarf DW_TAG_lexical_block
9299      DIE for any block which contains no significant local declarations at
9300      all.  Rather, in such cases we just call `decls_for_scope' so that any
9301      needed Dwarf info for any sub-blocks will get properly generated. Note
9302      that in terse mode, our definition of what constitutes a "significant"
9303      local declaration gets restricted to include only inlined function
9304      instances and local (nested) function definitions.  */
9305   if (must_output_die)
9306     {
9307       if (origin_code == FUNCTION_DECL)
9308         gen_inlined_subroutine_die (stmt, context_die, depth);
9309       else
9310         gen_lexical_block_die (stmt, context_die, depth);
9311     }
9312   else
9313     decls_for_scope (stmt, context_die, depth);
9314 }
9315
9316 /* Generate all of the decls declared within a given scope and (recursively)
9317    all of its sub-blocks.  */
9318
9319 static void
9320 decls_for_scope (stmt, context_die, depth)
9321      register tree stmt;
9322      register dw_die_ref context_die;
9323      int depth;
9324 {
9325   register tree decl;
9326   register tree subblocks;
9327
9328   /* Ignore blocks never really used to make RTL.  */
9329   if (stmt == NULL_TREE || ! TREE_USED (stmt))
9330     return;
9331
9332   if (!BLOCK_ABSTRACT (stmt) && depth > 0)
9333     next_block_number++;
9334
9335   /* Output the DIEs to represent all of the data objects and typedefs
9336      declared directly within this block but not within any nested
9337      sub-blocks.  Also, nested function and tag DIEs have been
9338      generated with a parent of NULL; fix that up now.  */
9339   for (decl = BLOCK_VARS (stmt);
9340        decl != NULL; decl = TREE_CHAIN (decl))
9341     {
9342       register dw_die_ref die;
9343
9344       if (TREE_CODE (decl) == FUNCTION_DECL)
9345         die = lookup_decl_die (decl);
9346       else if (TREE_CODE (decl) == TYPE_DECL && TYPE_DECL_IS_STUB (decl))
9347         die = lookup_type_die (TREE_TYPE (decl));
9348       else
9349         die = NULL;
9350
9351       if (die != NULL && die->die_parent == NULL)
9352         add_child_die (context_die, die);
9353       else
9354         gen_decl_die (decl, context_die);
9355     }
9356
9357   /* Output the DIEs to represent all sub-blocks (and the items declared
9358      therein) of this block.  */
9359   for (subblocks = BLOCK_SUBBLOCKS (stmt);
9360        subblocks != NULL;
9361        subblocks = BLOCK_CHAIN (subblocks))
9362     gen_block_die (subblocks, context_die, depth + 1);
9363 }
9364
9365 /* Is this a typedef we can avoid emitting?  */
9366
9367 static inline int
9368 is_redundant_typedef (decl)
9369      register tree decl;
9370 {
9371   if (TYPE_DECL_IS_STUB (decl))
9372     return 1;
9373
9374   if (DECL_ARTIFICIAL (decl)
9375       && DECL_CONTEXT (decl)
9376       && is_tagged_type (DECL_CONTEXT (decl))
9377       && TREE_CODE (TYPE_NAME (DECL_CONTEXT (decl))) == TYPE_DECL
9378       && DECL_NAME (decl) == DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl))))
9379     /* Also ignore the artificial member typedef for the class name.  */
9380     return 1;
9381
9382   return 0;
9383 }
9384
9385 /* Generate Dwarf debug information for a decl described by DECL.  */
9386
9387 static void
9388 gen_decl_die (decl, context_die)
9389      register tree decl;
9390      register dw_die_ref context_die;
9391 {
9392   register tree origin;
9393
9394   if (TREE_CODE (decl) == ERROR_MARK)
9395     return;
9396
9397   /* If this ..._DECL node is marked to be ignored, then ignore it. But don't 
9398      ignore a function definition, since that would screw up our count of
9399      blocks, and that in turn will completely screw up the labels we will 
9400      reference in subsequent DW_AT_low_pc and DW_AT_high_pc attributes (for
9401      subsequent blocks).  */
9402   if (DECL_IGNORED_P (decl) && TREE_CODE (decl) != FUNCTION_DECL)
9403     return;
9404
9405   switch (TREE_CODE (decl))
9406     {
9407     case CONST_DECL:
9408       /* The individual enumerators of an enum type get output when we output 
9409          the Dwarf representation of the relevant enum type itself.  */
9410       break;
9411
9412     case FUNCTION_DECL:
9413       /* Don't output any DIEs to represent mere function declarations,
9414          unless they are class members or explicit block externs.  */
9415       if (DECL_INITIAL (decl) == NULL_TREE && DECL_CONTEXT (decl) == NULL_TREE
9416           && (current_function_decl == NULL_TREE || DECL_ARTIFICIAL (decl)))
9417         break;
9418
9419       /* Emit info for the abstract instance first, if we haven't yet.  */
9420       origin = decl_ultimate_origin (decl);
9421       if (origin)
9422         gen_abstract_function (origin);
9423
9424       if (debug_info_level > DINFO_LEVEL_TERSE)
9425         {
9426           /* Before we describe the FUNCTION_DECL itself, make sure that we
9427              have described its return type.  */
9428           gen_type_die (TREE_TYPE (TREE_TYPE (decl)), context_die);
9429
9430           /* And its virtual context.  */
9431           if (DECL_VINDEX (decl) != NULL_TREE)
9432             gen_type_die (DECL_CONTEXT (decl), context_die);
9433
9434           /* And its containing type.  */
9435           origin = decl_class_context (decl);
9436           if (origin != NULL_TREE)
9437             gen_type_die_for_member (origin, decl, context_die);
9438         }
9439
9440       /* Now output a DIE to represent the function itself.  */
9441       gen_subprogram_die (decl, context_die);
9442       break;
9443
9444     case TYPE_DECL:
9445       /* If we are in terse mode, don't generate any DIEs to represent any
9446          actual typedefs.  */
9447       if (debug_info_level <= DINFO_LEVEL_TERSE)
9448         break;
9449
9450       /* In the special case of a TYPE_DECL node representing the 
9451          declaration of some type tag, if the given TYPE_DECL is marked as
9452          having been instantiated from some other (original) TYPE_DECL node
9453          (e.g. one which was generated within the original definition of an
9454          inline function) we have to generate a special (abbreviated)
9455          DW_TAG_structure_type, DW_TAG_union_type, or DW_TAG_enumeration_type 
9456          DIE here.  */
9457       if (TYPE_DECL_IS_STUB (decl) && decl_ultimate_origin (decl) != NULL_TREE)
9458         {
9459           gen_tagged_type_instantiation_die (TREE_TYPE (decl), context_die);
9460           break;
9461         }
9462
9463       if (is_redundant_typedef (decl))
9464         gen_type_die (TREE_TYPE (decl), context_die);
9465       else
9466         /* Output a DIE to represent the typedef itself.  */
9467         gen_typedef_die (decl, context_die);
9468       break;
9469
9470     case LABEL_DECL:
9471       if (debug_info_level >= DINFO_LEVEL_NORMAL)
9472         gen_label_die (decl, context_die);
9473       break;
9474
9475     case VAR_DECL:
9476       /* If we are in terse mode, don't generate any DIEs to represent any
9477          variable declarations or definitions.  */
9478       if (debug_info_level <= DINFO_LEVEL_TERSE)
9479         break;
9480
9481       /* Output any DIEs that are needed to specify the type of this data
9482          object.  */
9483       gen_type_die (TREE_TYPE (decl), context_die);
9484
9485       /* And its containing type.  */
9486       origin = decl_class_context (decl);
9487       if (origin != NULL_TREE)
9488         gen_type_die_for_member (origin, decl, context_die);
9489
9490       /* Now output the DIE to represent the data object itself.  This gets
9491          complicated because of the possibility that the VAR_DECL really
9492          represents an inlined instance of a formal parameter for an inline
9493          function.  */
9494       origin = decl_ultimate_origin (decl);
9495       if (origin != NULL_TREE && TREE_CODE (origin) == PARM_DECL)
9496         gen_formal_parameter_die (decl, context_die);
9497       else
9498         gen_variable_die (decl, context_die);
9499       break;
9500
9501     case FIELD_DECL:
9502       /* Ignore the nameless fields that are used to skip bits, but
9503          handle C++ anonymous unions.  */
9504       if (DECL_NAME (decl) != NULL_TREE
9505           || TREE_CODE (TREE_TYPE (decl)) == UNION_TYPE)
9506         {
9507           gen_type_die (member_declared_type (decl), context_die);
9508           gen_field_die (decl, context_die);
9509         }
9510       break;
9511
9512     case PARM_DECL:
9513       gen_type_die (TREE_TYPE (decl), context_die);
9514       gen_formal_parameter_die (decl, context_die);
9515       break;
9516
9517     case NAMESPACE_DECL:
9518       /* Ignore for now.  */
9519       break;
9520
9521     default:
9522       abort ();
9523     }
9524 }
9525 \f
9526 /* Add Ada "use" clause information for SGI Workshop debugger.  */
9527
9528 void
9529 dwarf2out_add_library_unit_info (filename, context_list)
9530      char *filename;
9531      char *context_list;
9532 {
9533   unsigned int file_index;
9534
9535   if (filename != NULL)
9536     {
9537       dw_die_ref unit_die = new_die (DW_TAG_module, comp_unit_die);
9538       tree context_list_decl 
9539         = build_decl (LABEL_DECL, get_identifier (context_list),
9540                       void_type_node);
9541
9542       TREE_PUBLIC (context_list_decl) = TRUE;
9543       add_name_attribute (unit_die, context_list);
9544       file_index = lookup_filename (filename);
9545       add_AT_unsigned (unit_die, DW_AT_decl_file, file_index);
9546       add_pubname (context_list_decl, unit_die);
9547     }
9548 }
9549
9550 /* Write the debugging output for DECL.  */
9551
9552 void
9553 dwarf2out_decl (decl)
9554      register tree decl;
9555 {
9556   register dw_die_ref context_die = comp_unit_die;
9557
9558   if (TREE_CODE (decl) == ERROR_MARK)
9559     return;
9560
9561   /* If this ..._DECL node is marked to be ignored, then ignore it.  We gotta 
9562      hope that the node in question doesn't represent a function definition.
9563      If it does, then totally ignoring it is bound to screw up our count of
9564      blocks, and that in turn will completely screw up the labels we will 
9565      reference in subsequent DW_AT_low_pc and DW_AT_high_pc attributes (for
9566      subsequent blocks).  (It's too bad that BLOCK nodes don't carry their
9567      own sequence numbers with them!) */
9568   if (DECL_IGNORED_P (decl))
9569     {
9570       if (TREE_CODE (decl) == FUNCTION_DECL
9571           && DECL_INITIAL (decl) != NULL)
9572         abort ();
9573
9574       return;
9575     }
9576
9577   switch (TREE_CODE (decl))
9578     {
9579     case FUNCTION_DECL:
9580       /* Ignore this FUNCTION_DECL if it refers to a builtin declaration of a 
9581          builtin function.  Explicit programmer-supplied declarations of
9582          these same functions should NOT be ignored however.  */
9583       if (DECL_EXTERNAL (decl) && DECL_BUILT_IN (decl))
9584         return;
9585
9586       /* What we would really like to do here is to filter out all mere
9587          file-scope declarations of file-scope functions which are never
9588          referenced later within this translation unit (and keep all of ones
9589          that *are* referenced later on) but we aren't clairvoyant, so we have 
9590          no idea which functions will be referenced in the future (i.e. later 
9591          on within the current translation unit). So here we just ignore all
9592          file-scope function declarations which are not also definitions.  If 
9593          and when the debugger needs to know something about these functions,
9594          it will have to hunt around and find the DWARF information associated 
9595          with the definition of the function.  Note that we can't just check
9596          `DECL_EXTERNAL' to find out which FUNCTION_DECL nodes represent
9597          definitions and which ones represent mere declarations.  We have to
9598          check `DECL_INITIAL' instead. That's because the C front-end
9599          supports some weird semantics for "extern inline" function
9600          definitions.  These can get inlined within the current translation
9601          unit (an thus, we need to generate DWARF info for their abstract
9602          instances so that the DWARF info for the concrete inlined instances
9603          can have something to refer to) but the compiler never generates any 
9604          out-of-lines instances of such things (despite the fact that they
9605          *are* definitions).  The important point is that the C front-end
9606          marks these "extern inline" functions as DECL_EXTERNAL, but we need
9607          to generate DWARF for them anyway. Note that the C++ front-end also
9608          plays some similar games for inline function definitions appearing
9609          within include files which also contain 
9610          `#pragma interface' pragmas.  */
9611       if (DECL_INITIAL (decl) == NULL_TREE)
9612         return;
9613
9614       /* If we're a nested function, initially use a parent of NULL; if we're
9615          a plain function, this will be fixed up in decls_for_scope.  If
9616          we're a method, it will be ignored, since we already have a DIE.  */
9617       if (decl_function_context (decl))
9618         context_die = NULL;
9619
9620       break;
9621
9622     case VAR_DECL:
9623       /* Ignore this VAR_DECL if it refers to a file-scope extern data object 
9624          declaration and if the declaration was never even referenced from
9625          within this entire compilation unit.  We suppress these DIEs in
9626          order to save space in the .debug section (by eliminating entries
9627          which are probably useless).  Note that we must not suppress
9628          block-local extern declarations (whether used or not) because that
9629          would screw-up the debugger's name lookup mechanism and cause it to
9630          miss things which really ought to be in scope at a given point.  */
9631       if (DECL_EXTERNAL (decl) && !TREE_USED (decl))
9632         return;
9633
9634       /* If we are in terse mode, don't generate any DIEs to represent any
9635          variable declarations or definitions.  */
9636       if (debug_info_level <= DINFO_LEVEL_TERSE)
9637         return;
9638       break;
9639
9640     case TYPE_DECL:
9641       /* Don't bother trying to generate any DIEs to represent any of the
9642          normal built-in types for the language we are compiling.  */
9643       if (DECL_SOURCE_LINE (decl) == 0)
9644         {
9645           /* OK, we need to generate one for `bool' so GDB knows what type
9646              comparisons have.  */
9647           if ((get_AT_unsigned (comp_unit_die, DW_AT_language)
9648                == DW_LANG_C_plus_plus)
9649               && TREE_CODE (TREE_TYPE (decl)) == BOOLEAN_TYPE)
9650             modified_type_die (TREE_TYPE (decl), 0, 0, NULL);
9651
9652           return;
9653         }
9654
9655       /* If we are in terse mode, don't generate any DIEs for types.  */
9656       if (debug_info_level <= DINFO_LEVEL_TERSE)
9657         return;
9658
9659       /* If we're a function-scope tag, initially use a parent of NULL;
9660          this will be fixed up in decls_for_scope.  */
9661       if (decl_function_context (decl))
9662         context_die = NULL;
9663
9664       break;
9665
9666     default:
9667       return;
9668     }
9669
9670   gen_decl_die (decl, context_die);
9671 }
9672
9673 /* Output a marker (i.e. a label) for the beginning of the generated code for
9674    a lexical block.  */
9675
9676 void
9677 dwarf2out_begin_block (blocknum)
9678      register unsigned blocknum;
9679 {
9680   function_section (current_function_decl);
9681   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, BLOCK_BEGIN_LABEL, blocknum);
9682 }
9683
9684 /* Output a marker (i.e. a label) for the end of the generated code for a
9685    lexical block.  */
9686
9687 void
9688 dwarf2out_end_block (blocknum)
9689      register unsigned blocknum;
9690 {
9691   function_section (current_function_decl);
9692   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, BLOCK_END_LABEL, blocknum);
9693 }
9694
9695 /* Output a marker (i.e. a label) at a point in the assembly code which
9696    corresponds to a given source level label.  */
9697
9698 void
9699 dwarf2out_label (insn)
9700      register rtx insn;
9701 {
9702   char label[MAX_ARTIFICIAL_LABEL_BYTES];
9703
9704   if (debug_info_level >= DINFO_LEVEL_NORMAL)
9705     {
9706       function_section (current_function_decl);
9707       sprintf (label, INSN_LABEL_FMT, current_funcdef_number);
9708       ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, label,
9709                                  (unsigned) INSN_UID (insn));
9710     }
9711 }
9712
9713 /* Lookup a filename (in the list of filenames that we know about here in
9714    dwarf2out.c) and return its "index".  The index of each (known) filename is
9715    just a unique number which is associated with only that one filename.
9716    We need such numbers for the sake of generating labels
9717    (in the .debug_sfnames section) and references to those
9718    files  numbers (in the .debug_srcinfo and.debug_macinfo sections).
9719    If the filename given as an argument is not found in our current list,
9720    add it to the list and assign it the next available unique index number.
9721    In order to speed up searches, we remember the index of the filename
9722    was looked up last.  This handles the majority of all searches.  */
9723
9724 static unsigned
9725 lookup_filename (file_name)
9726      const char *file_name;
9727 {
9728   static unsigned last_file_lookup_index = 0;
9729   register unsigned i;
9730
9731   /* Check to see if the file name that was searched on the previous call
9732      matches this file name. If so, return the index.  */
9733   if (last_file_lookup_index != 0)
9734     if (strcmp (file_name, file_table[last_file_lookup_index]) == 0)
9735       return last_file_lookup_index;
9736
9737   /* Didn't match the previous lookup, search the table */
9738   for (i = 1; i < file_table_in_use; ++i)
9739     if (strcmp (file_name, file_table[i]) == 0)
9740       {
9741         last_file_lookup_index = i;
9742         return i;
9743       }
9744
9745   /* Prepare to add a new table entry by making sure there is enough space in 
9746      the table to do so.  If not, expand the current table.  */
9747   if (file_table_in_use == file_table_allocated)
9748     {
9749       file_table_allocated += FILE_TABLE_INCREMENT;
9750       file_table
9751         = (char **) xrealloc (file_table,
9752                               file_table_allocated * sizeof (char *));
9753     }
9754
9755   /* Add the new entry to the end of the filename table.  */
9756   file_table[file_table_in_use] = xstrdup (file_name);
9757   last_file_lookup_index = file_table_in_use++;
9758
9759   return last_file_lookup_index;
9760 }
9761
9762 /* Output a label to mark the beginning of a source code line entry
9763    and record information relating to this source line, in
9764    'line_info_table' for later output of the .debug_line section.  */
9765
9766 void
9767 dwarf2out_line (filename, line)
9768      register const char *filename;
9769      register unsigned line;
9770 {
9771   if (debug_info_level >= DINFO_LEVEL_NORMAL)
9772     {
9773       function_section (current_function_decl);
9774
9775       if (DWARF2_ASM_LINE_DEBUG_INFO)
9776         {
9777           static const char *lastfile;
9778
9779           /* Emit the .file and .loc directives understood by GNU as.  */
9780           if (lastfile == 0 || strcmp (filename, lastfile))
9781             {
9782               if (lastfile == 0)
9783                 ggc_add_string_root ((char **) &lastfile, 1);
9784
9785               fprintf (asm_out_file, "\t.file 0 \"%s\"\n", filename);
9786               lastfile = filename;
9787             }
9788
9789           fprintf (asm_out_file, "\t.loc 0 %d 0\n", line);
9790
9791           /* Indicate that line number info exists.  */
9792           ++line_info_table_in_use;
9793
9794           /* Indicate that multiple line number tables exist.  */
9795           if (DECL_SECTION_NAME (current_function_decl))
9796             ++separate_line_info_table_in_use;
9797         }
9798       else if (DECL_SECTION_NAME (current_function_decl))
9799         {
9800           register dw_separate_line_info_ref line_info;
9801           ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, SEPARATE_LINE_CODE_LABEL,
9802                                      separate_line_info_table_in_use);
9803           if (flag_debug_asm)
9804             fprintf (asm_out_file, "\t%s line %d", ASM_COMMENT_START, line);
9805           fputc ('\n', asm_out_file);
9806
9807           /* expand the line info table if necessary */
9808           if (separate_line_info_table_in_use
9809               == separate_line_info_table_allocated)
9810             {
9811               separate_line_info_table_allocated += LINE_INFO_TABLE_INCREMENT;
9812               separate_line_info_table
9813                 = (dw_separate_line_info_ref)
9814                   xrealloc (separate_line_info_table,
9815                             separate_line_info_table_allocated
9816                             * sizeof (dw_separate_line_info_entry));
9817             }
9818
9819           /* Add the new entry at the end of the line_info_table.  */
9820           line_info
9821             = &separate_line_info_table[separate_line_info_table_in_use++];
9822           line_info->dw_file_num = lookup_filename (filename);
9823           line_info->dw_line_num = line;
9824           line_info->function = current_funcdef_number;
9825         }
9826       else
9827         {
9828           register dw_line_info_ref line_info;
9829
9830           ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, LINE_CODE_LABEL,
9831                                      line_info_table_in_use);
9832           if (flag_debug_asm)
9833             fprintf (asm_out_file, "\t%s line %d", ASM_COMMENT_START, line);
9834           fputc ('\n', asm_out_file);
9835
9836           /* Expand the line info table if necessary.  */
9837           if (line_info_table_in_use == line_info_table_allocated)
9838             {
9839               line_info_table_allocated += LINE_INFO_TABLE_INCREMENT;
9840               line_info_table
9841                 = (dw_line_info_ref)
9842                   xrealloc (line_info_table,
9843                             (line_info_table_allocated
9844                              * sizeof (dw_line_info_entry)));
9845             }
9846
9847           /* Add the new entry at the end of the line_info_table.  */
9848           line_info = &line_info_table[line_info_table_in_use++];
9849           line_info->dw_file_num = lookup_filename (filename);
9850           line_info->dw_line_num = line;
9851         }
9852     }
9853 }
9854
9855 /* Record the beginning of a new source file, for later output
9856    of the .debug_macinfo section.  At present, unimplemented.  */
9857
9858 void
9859 dwarf2out_start_source_file (filename)
9860      register const char *filename ATTRIBUTE_UNUSED;
9861 {
9862 }
9863
9864 /* Record the end of a source file, for later output
9865    of the .debug_macinfo section.  At present, unimplemented.  */
9866
9867 void
9868 dwarf2out_end_source_file ()
9869 {
9870 }
9871
9872 /* Called from check_newline in c-parse.y.  The `buffer' parameter contains
9873    the tail part of the directive line, i.e. the part which is past the
9874    initial whitespace, #, whitespace, directive-name, whitespace part.  */
9875
9876 void
9877 dwarf2out_define (lineno, buffer)
9878      register unsigned lineno ATTRIBUTE_UNUSED;
9879      register const char *buffer ATTRIBUTE_UNUSED;
9880 {
9881   static int initialized = 0;
9882   if (!initialized)
9883     {
9884       dwarf2out_start_source_file (primary_filename);
9885       initialized = 1;
9886     }
9887 }
9888
9889 /* Called from check_newline in c-parse.y.  The `buffer' parameter contains
9890    the tail part of the directive line, i.e. the part which is past the
9891    initial whitespace, #, whitespace, directive-name, whitespace part.  */
9892
9893 void
9894 dwarf2out_undef (lineno, buffer)
9895      register unsigned lineno ATTRIBUTE_UNUSED;
9896      register const char *buffer ATTRIBUTE_UNUSED;
9897 {
9898 }
9899
9900 /* Set up for Dwarf output at the start of compilation.  */
9901
9902 void
9903 dwarf2out_init (asm_out_file, main_input_filename)
9904      register FILE *asm_out_file;
9905      register char *main_input_filename;
9906 {
9907   /* Remember the name of the primary input file.  */
9908   primary_filename = main_input_filename;
9909
9910   /* Allocate the initial hunk of the file_table.  */
9911   file_table = (char **) xcalloc (FILE_TABLE_INCREMENT, sizeof (char *));
9912   file_table_allocated = FILE_TABLE_INCREMENT;
9913
9914   /* Skip the first entry - file numbers begin at 1.  */
9915   file_table_in_use = 1;
9916
9917   /* Allocate the initial hunk of the decl_die_table.  */
9918   decl_die_table
9919     = (dw_die_ref *) xcalloc (DECL_DIE_TABLE_INCREMENT, sizeof (dw_die_ref));
9920   decl_die_table_allocated = DECL_DIE_TABLE_INCREMENT;
9921   decl_die_table_in_use = 0;
9922
9923   /* Allocate the initial hunk of the decl_scope_table.  */
9924   decl_scope_table
9925     = (tree *) xcalloc (DECL_SCOPE_TABLE_INCREMENT, sizeof (tree));
9926   decl_scope_table_allocated = DECL_SCOPE_TABLE_INCREMENT;
9927   decl_scope_depth = 0;
9928
9929   /* Allocate the initial hunk of the abbrev_die_table.  */
9930   abbrev_die_table
9931     = (dw_die_ref *) xcalloc (ABBREV_DIE_TABLE_INCREMENT,
9932                               sizeof (dw_die_ref));
9933   abbrev_die_table_allocated = ABBREV_DIE_TABLE_INCREMENT;
9934   /* Zero-th entry is allocated, but unused */
9935   abbrev_die_table_in_use = 1;
9936
9937   /* Allocate the initial hunk of the line_info_table.  */
9938   line_info_table
9939     = (dw_line_info_ref) xcalloc (LINE_INFO_TABLE_INCREMENT,
9940                                   sizeof (dw_line_info_entry));
9941   line_info_table_allocated = LINE_INFO_TABLE_INCREMENT;
9942   /* Zero-th entry is allocated, but unused */
9943   line_info_table_in_use = 1;
9944
9945   /* Generate the initial DIE for the .debug section.  Note that the (string) 
9946      value given in the DW_AT_name attribute of the DW_TAG_compile_unit DIE
9947      will (typically) be a relative pathname and that this pathname should be 
9948      taken as being relative to the directory from which the compiler was
9949      invoked when the given (base) source file was compiled.  */
9950   comp_unit_die = gen_compile_unit_die (main_input_filename);
9951
9952   ASM_GENERATE_INTERNAL_LABEL (text_end_label, TEXT_END_LABEL, 0);
9953   ASM_GENERATE_INTERNAL_LABEL (abbrev_section_label, ABBREV_SECTION_LABEL, 0);
9954   if (DWARF2_GENERATE_TEXT_SECTION_LABEL)
9955     ASM_GENERATE_INTERNAL_LABEL (text_section_label, TEXT_SECTION_LABEL, 0);
9956   else
9957     strcpy (text_section_label, stripattributes (TEXT_SECTION));
9958   ASM_GENERATE_INTERNAL_LABEL (debug_info_section_label, 
9959                                DEBUG_INFO_SECTION_LABEL, 0);
9960   ASM_GENERATE_INTERNAL_LABEL (debug_line_section_label, 
9961                                DEBUG_LINE_SECTION_LABEL, 0);
9962
9963   ASM_OUTPUT_SECTION (asm_out_file, ABBREV_SECTION);
9964   ASM_OUTPUT_LABEL (asm_out_file, abbrev_section_label);
9965   if (DWARF2_GENERATE_TEXT_SECTION_LABEL)
9966     {
9967       ASM_OUTPUT_SECTION (asm_out_file, TEXT_SECTION);
9968       ASM_OUTPUT_LABEL (asm_out_file, text_section_label);
9969     }
9970   ASM_OUTPUT_SECTION (asm_out_file, DEBUG_INFO_SECTION);
9971   ASM_OUTPUT_LABEL (asm_out_file, debug_info_section_label);
9972   ASM_OUTPUT_SECTION (asm_out_file, DEBUG_LINE_SECTION);
9973   ASM_OUTPUT_LABEL (asm_out_file, debug_line_section_label);
9974 }
9975
9976 /* Output stuff that dwarf requires at the end of every file,
9977    and generate the DWARF-2 debugging info.  */
9978
9979 void
9980 dwarf2out_finish ()
9981 {
9982   limbo_die_node *node, *next_node;
9983   dw_die_ref die;
9984
9985   /* Traverse the limbo die list, and add parent/child links.  The only
9986      dies without parents that should be here are concrete instances of
9987      inline functions, and the comp_unit_die.  We can ignore the comp_unit_die.
9988      For concrete instances, we can get the parent die from the abstract
9989      instance.  */
9990   for (node = limbo_die_list; node; node = next_node)
9991     {
9992       next_node = node->next;
9993       die = node->die;
9994
9995       if (die->die_parent == NULL)
9996         {
9997           dw_die_ref origin = get_AT_ref (die, DW_AT_abstract_origin);
9998           if (origin)
9999             add_child_die (origin->die_parent, die);
10000           else if (die == comp_unit_die)
10001             ;
10002           else
10003             abort ();
10004         }
10005       free (node);
10006     }
10007   limbo_die_list = NULL;
10008
10009   /* Walk through the list of incomplete types again, trying once more to
10010      emit full debugging info for them.  */
10011   retry_incomplete_types ();
10012
10013   /* Traverse the DIE's, reverse their lists of attributes and children,
10014      and add add sibling attributes to those DIE's that have children.  */
10015   add_sibling_attributes (comp_unit_die);
10016
10017   /* Output a terminator label for the .text section.  */
10018   fputc ('\n', asm_out_file);
10019   ASM_OUTPUT_SECTION (asm_out_file, TEXT_SECTION);
10020   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, TEXT_END_LABEL, 0);
10021
10022 #if 0
10023   /* Output a terminator label for the .data section.  */
10024   fputc ('\n', asm_out_file);
10025   ASM_OUTPUT_SECTION (asm_out_file, DATA_SECTION);
10026   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, DATA_END_LABEL, 0);
10027
10028   /* Output a terminator label for the .bss section.  */
10029   fputc ('\n', asm_out_file);
10030   ASM_OUTPUT_SECTION (asm_out_file, BSS_SECTION);
10031   ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, BSS_END_LABEL, 0);
10032 #endif
10033
10034   /* Output the source line correspondence table.  */
10035   if (line_info_table_in_use > 1 || separate_line_info_table_in_use)
10036     {
10037       if (! DWARF2_ASM_LINE_DEBUG_INFO)
10038         {
10039           fputc ('\n', asm_out_file);
10040           ASM_OUTPUT_SECTION (asm_out_file, DEBUG_LINE_SECTION);
10041           output_line_info ();
10042         }
10043
10044       /* We can only use the low/high_pc attributes if all of the code
10045          was in .text.  */
10046       if (separate_line_info_table_in_use == 0)
10047         {
10048           add_AT_lbl_id (comp_unit_die, DW_AT_low_pc, text_section_label);
10049           add_AT_lbl_id (comp_unit_die, DW_AT_high_pc, text_end_label);
10050         }
10051
10052       add_AT_lbl_offset (comp_unit_die, DW_AT_stmt_list,
10053                          debug_line_section_label);
10054     }
10055
10056 #if 0 /* unimplemented */
10057   if (debug_info_level >= DINFO_LEVEL_VERBOSE && primary)
10058     add_AT_unsigned (die, DW_AT_macro_info, 0);
10059 #endif
10060
10061   /* Output the abbreviation table.  */
10062   fputc ('\n', asm_out_file);
10063   ASM_OUTPUT_SECTION (asm_out_file, ABBREV_SECTION);
10064   build_abbrev_table (comp_unit_die);
10065   output_abbrev_section ();
10066
10067   /* Initialize the beginning DIE offset - and calculate sizes/offsets.   */
10068   next_die_offset = DWARF_COMPILE_UNIT_HEADER_SIZE;
10069   calc_die_sizes (comp_unit_die);
10070
10071   /* Output debugging information.  */
10072   fputc ('\n', asm_out_file);
10073   ASM_OUTPUT_SECTION (asm_out_file, DEBUG_INFO_SECTION);
10074   output_compilation_unit_header ();
10075   output_die (comp_unit_die);
10076
10077   if (pubname_table_in_use)
10078     {
10079       /* Output public names table.  */
10080       fputc ('\n', asm_out_file);
10081       ASM_OUTPUT_SECTION (asm_out_file, PUBNAMES_SECTION);
10082       output_pubnames ();
10083     }
10084
10085   /* We only put functions in the arange table, so don't write it out if
10086      we don't have any.  */
10087   if (fde_table_in_use)
10088     {
10089       /* Output the address range information.  */
10090       fputc ('\n', asm_out_file);
10091       ASM_OUTPUT_SECTION (asm_out_file, ARANGES_SECTION);
10092       output_aranges ();
10093     }
10094 }
10095 #endif /* DWARF2_DEBUGGING_INFO */