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