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