OSDN Git Service

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