OSDN Git Service

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