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