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