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