OSDN Git Service

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