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