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