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