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