OSDN Git Service

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