OSDN Git Service

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