OSDN Git Service

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