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