OSDN Git Service

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