OSDN Git Service

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