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