OSDN Git Service

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