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