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