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