]> gcc.gnu.org Git - gcc.git/blame - gcc/dwarfout.c
*** empty log message ***
[gcc.git] / gcc / dwarfout.c
CommitLineData
340ccaab
TW
1/* This file contains code written by Ron Guilmette (rfg@ncd.com) for
2 Network Computing Devices, August, September, October, November 1990.
3
4 Output Dwarf format symbol table information from the GNU C compiler.
5 Copyright (C) 1992 Free Software Foundation, Inc.
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
23#include "config.h"
24
25#ifdef DWARF_DEBUGGING_INFO
26#include <stdio.h>
27#include "dwarf.h"
28#include "tree.h"
29#include "flags.h"
30#include "rtl.h"
31#include "insn-config.h"
32#include "reload.h"
33#include "output.h"
34
35/* #define NDEBUG 1 */
36#include <assert.h>
37
38#if defined(DWARF_TIMESTAMPS)
39#if defined(POSIX)
40#include <time.h>
41#else /* !defined(POSIX) */
42#include <sys/types.h>
43#if defined(__STDC__)
44extern time_t time (time_t *);
45#else /* !defined(__STDC__) */
46extern time_t time ();
47#endif /* !defined(__STDC__) */
48#endif /* !defined(POSIX) */
49#endif /* defined(DWARF_TIMESTAMPS) */
50
51#if defined(USG) || defined(POSIX)
52#include <string.h>
53#else
54#include <strings.h>
55#define strrchr rindex
340ccaab
TW
56#endif
57
2e494f70
RS
58char *getpwd ();
59
60
340ccaab
TW
61/* IMPORTANT NOTE: Please see the file README.DWARF for important details
62 regarding the GNU implementation of Dwarf. */
63
64/* NOTE: In the comments in this file, many references are made to
65 so called "Debugging Information Entries". For the sake of brevity,
66 this term is abbreviated to `DIE' throughout the remainder of this
67 file. */
68
69/* Note that the implementation of C++ support herein is (as yet) unfinished.
70 If you want to try to complete it, more power to you. */
71
72#if defined(__GNUC__) && (NDEBUG == 1)
73#define inline static inline
74#else
75#define inline static
76#endif
77
78/* How to start an assembler comment. */
79#ifndef ASM_COMMENT_START
80#define ASM_COMMENT_START ";#"
81#endif
82
83/* Define a macro which, when given a pointer to some BLOCK node, returns
84 a pointer to the FUNCTION_DECL node from which the given BLOCK node
85 was instantiated (as an inline expansion). This macro needs to be
86 defined properly in tree.h, however for the moment, we just fake it. */
87
88#define BLOCK_INLINE_FUNCTION(block) 0
89
90/* Define a macro which returns non-zero for any tagged type which is
91 used (directly or indirectly) in the specification of either some
92 function's return type or some formal parameter of some function.
93 We use this macro when we are operating in "terse" mode to help us
94 know what tagged types have to be represented in Dwarf (even in
95 terse mode) and which ones don't.
96
97 A flag bit with this meaning really should be a part of the normal
98 GCC ..._TYPE nodes, but at the moment, there is no such bit defined
99 for these nodes. For now, we have to just fake it. It it safe for
100 us to simply return zero for all complete tagged types (which will
101 get forced out anyway if they were used in the specification of some
102 formal or return type) and non-zero for all incomplete tagged types.
103*/
104
105#define TYPE_USED_FOR_FUNCTION(tagged_type) (TYPE_SIZE (tagged_type) == 0)
106
107#define BITFIELD_OFFSET_BITS(DECL) \
108 ((unsigned) TREE_INT_CST_LOW (DECL_FIELD_BITPOS (DECL)))
109#define BITFIELD_OFFSET_UNITS(DECL) \
110 (BITFIELD_OFFSET_BITS(DECL) / (unsigned) BITS_PER_UNIT)
111#define BITFIELD_OFFSET_WORDS_IN_UNITS(DECL) \
112 ((BITFIELD_OFFSET_BITS(DECL) / (unsigned) BITS_PER_WORD) * UNITS_PER_WORD)
113
114extern int flag_traditional;
115extern char *version_string;
116extern char *language_string;
117
118/* Maximum size (in bytes) of an artificially generated label. */
119
120#define MAX_ARTIFICIAL_LABEL_BYTES 30
121\f
122/* Make sure we know the sizes of the various types dwarf can describe.
123 These are only defaults. If the sizes are different for your target,
124 you should override these values by defining the appropriate symbols
125 in your tm.h file. */
126
127#ifndef CHAR_TYPE_SIZE
128#define CHAR_TYPE_SIZE BITS_PER_UNIT
129#endif
130
131#ifndef SHORT_TYPE_SIZE
132#define SHORT_TYPE_SIZE (BITS_PER_UNIT * 2)
133#endif
134
135#ifndef INT_TYPE_SIZE
136#define INT_TYPE_SIZE BITS_PER_WORD
137#endif
138
139#ifndef LONG_TYPE_SIZE
140#define LONG_TYPE_SIZE BITS_PER_WORD
141#endif
142
143#ifndef LONG_LONG_TYPE_SIZE
144#define LONG_LONG_TYPE_SIZE (BITS_PER_WORD * 2)
145#endif
146
147#ifndef WCHAR_TYPE_SIZE
148#define WCHAR_TYPE_SIZE INT_TYPE_SIZE
149#endif
150
151#ifndef WCHAR_UNSIGNED
152#define WCHAR_UNSIGNED 0
153#endif
154
155#ifndef FLOAT_TYPE_SIZE
156#define FLOAT_TYPE_SIZE BITS_PER_WORD
157#endif
158
159#ifndef DOUBLE_TYPE_SIZE
160#define DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
161#endif
162
163#ifndef LONG_DOUBLE_TYPE_SIZE
164#define LONG_DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
165#endif
166\f
167/* Structure to keep track of source filenames. */
168
169struct filename_entry {
170 unsigned number;
171 char * name;
172};
173
174typedef struct filename_entry filename_entry;
175
176/* Pointer to an array of elements, each one having the structure above. */
177
178static filename_entry *filename_table;
179
180/* Total number of entries in the table (i.e. array) pointed to by
181 `filename_table'. This is the *total* and includes both used and
182 unused slots. */
183
184static unsigned ft_entries_allocated;
185
186/* Number of entries in the filename_table which are actually in use. */
187
188static unsigned ft_entries;
189
190/* Size (in elements) of increments by which we may expand the filename
191 table. Actually, a single hunk of space of this size should be enough
192 for most typical programs. */
193
194#define FT_ENTRIES_INCREMENT 64
195
196/* Local pointer to the name of the main input file. Initialized in
197 dwarfout_init. */
198
199static char *primary_filename;
200
201/* Pointer to the most recent filename for which we produced some line info. */
202
203static char *last_filename;
204
205/* For Dwarf output, we must assign lexical-blocks id numbers
206 in the order in which their beginnings are encountered.
207 We output Dwarf debugging info that refers to the beginnings
208 and ends of the ranges of code for each lexical block with
209 assembler labels ..Bn and ..Bn.e, where n is the block number.
210 The labels themselves are generated in final.c, which assigns
211 numbers to the blocks in the same way. */
212
213static unsigned next_block_number = 2;
214
215/* Counter to generate unique names for DIEs. */
216
217static unsigned next_unused_dienum = 1;
218
219/* Number of the DIE which is currently being generated. */
220
221static unsigned current_dienum;
222
223/* Number to use for the special "pubname" label on the next DIE which
224 represents a function or data object defined in this compilation
225 unit which has "extern" linkage. */
226
227static next_pubname_number = 0;
228
229#define NEXT_DIE_NUM pending_sibling_stack[pending_siblings-1]
230
231/* Pointer to a dynamically allocated list of pre-reserved and still
232 pending sibling DIE numbers. Note that this list will grow as needed. */
233
234static unsigned *pending_sibling_stack;
235
236/* Counter to keep track of the number of pre-reserved and still pending
237 sibling DIE numbers. */
238
239static unsigned pending_siblings;
240
241/* The currently allocated size of the above list (expressed in number of
242 list elements). */
243
244static unsigned pending_siblings_allocated;
245
246/* Size (in elements) of increments by which we may expand the pending
247 sibling stack. Actually, a single hunk of space of this size should
248 be enough for most typical programs. */
249
250#define PENDING_SIBLINGS_INCREMENT 64
251
252/* Non-zero if we are performing our file-scope finalization pass and if
253 we should force out Dwarf decsriptions of any and all file-scope
254 tagged types which are still incomplete types. */
255
256static int finalizing = 0;
257
258/* A pointer to the base of a list of pending types which we haven't
259 generated DIEs for yet, but which we will have to come back to
260 later on. */
261
262static tree *pending_types_list;
263
264/* Number of elements currently allocated for the pending_types_list. */
265
266static unsigned pending_types_allocated;
267
268/* Number of elements of pending_types_list currently in use. */
269
270static unsigned pending_types;
271
272/* Size (in elements) of increments by which we may expand the pending
273 types list. Actually, a single hunk of space of this size should
274 be enough for most typical programs. */
275
276#define PENDING_TYPES_INCREMENT 64
277
278/* Pointer to an artifical RECORD_TYPE which we create in dwarfout_init.
279 This is used in a hack to help us get the DIEs describing types of
280 formal parameters to come *after* all of the DIEs describing the formal
281 parameters themselves. That's necessary in order to be compatible
282 with what the brain-dammaged svr4 SDB debugger requires. */
283
284static tree fake_containing_scope;
285
286/* The number of the current function definition that we are generating
287 debugging information for. These numbers range from 1 up to the maximum
288 number of function definitions contained within the current compilation
289 unit. These numbers are used to create unique labels for various things
290 contained within various function definitions. */
291
292static unsigned current_funcdef_number = 1;
293
294/* Forward declarations for functions defined in this file. */
295
296static void output_type ();
297static void type_attribute ();
298static void output_decls_for_scope ();
299static void output_decl ();
300static unsigned lookup_filename ();
301\f
302/* Definitions of defaults for assembler-dependent names of various
303 pseudo-ops and section names.
304
305 Theses may be overridden in your tm.h file (if necessary) for your
306 particular assembler. The default values provided here correspond to
307 what is expected by "standard" AT&T System V.4 assemblers. */
308
309#ifndef FILE_ASM_OP
2e494f70 310#define FILE_ASM_OP ".file"
340ccaab
TW
311#endif
312#ifndef VERSION_ASM_OP
2e494f70 313#define VERSION_ASM_OP ".version"
340ccaab
TW
314#endif
315#ifndef SECTION_ASM_OP
2e494f70 316#define SECTION_ASM_OP ".section"
340ccaab
TW
317#endif
318#ifndef UNALIGNED_SHORT_ASM_OP
2e494f70 319#define UNALIGNED_SHORT_ASM_OP ".2byte"
340ccaab
TW
320#endif
321#ifndef UNALIGNED_INT_ASM_OP
2e494f70 322#define UNALIGNED_INT_ASM_OP ".4byte"
340ccaab
TW
323#endif
324#ifndef DEF_ASM_OP
2e494f70 325#define DEF_ASM_OP ".set"
340ccaab
TW
326#endif
327
328/* This macro is already used elsewhere and has a published default. */
329#ifndef ASM_BYTE_OP
330#define ASM_BYTE_OP "\t.byte"
331#endif
332\f
333/* Definitions of defaults for formats and names of various special
334 (artificial) labels which may be generated within this file (when
335 the -g options is used and DWARF_DEBUGGING_INFO is in effect.
336
337 If necessary, these may be overridden from within your tm.h file,
338 but typically, you should never need to override these. */
339
340#ifndef TEXT_BEGIN_LABEL
341#define TEXT_BEGIN_LABEL "._text_b"
342#endif
343#ifndef TEXT_END_LABEL
344#define TEXT_END_LABEL "._text_e"
345#endif
346
347#ifndef DATA_BEGIN_LABEL
348#define DATA_BEGIN_LABEL "._data_b"
349#endif
350#ifndef DATA_END_LABEL
351#define DATA_END_LABEL "._data_e"
352#endif
353
354#ifndef DATA1_BEGIN_LABEL
355#define DATA1_BEGIN_LABEL "._data1_b"
356#endif
357#ifndef DATA1_END_LABEL
358#define DATA1_END_LABEL "._data1_e"
359#endif
360
361#ifndef RODATA_BEGIN_LABEL
362#define RODATA_BEGIN_LABEL "._rodata_b"
363#endif
364#ifndef RODATA_END_LABEL
365#define RODATA_END_LABEL "._rodata_e"
366#endif
367
368#ifndef RODATA1_BEGIN_LABEL
369#define RODATA1_BEGIN_LABEL "._rodata1_b"
370#endif
371#ifndef RODATA1_END_LABEL
372#define RODATA1_END_LABEL "._rodata1_e"
373#endif
374
375#ifndef BSS_BEGIN_LABEL
376#define BSS_BEGIN_LABEL "._bss_b"
377#endif
378#ifndef BSS_END_LABEL
379#define BSS_END_LABEL "._bss_e"
380#endif
381
382#ifndef LINE_BEGIN_LABEL
383#define LINE_BEGIN_LABEL "._line_b"
384#endif
385#ifndef LINE_LAST_ENTRY_LABEL
386#define LINE_LAST_ENTRY_LABEL "._line_last"
387#endif
388#ifndef LINE_END_LABEL
389#define LINE_END_LABEL "._line_e"
390#endif
391
392#ifndef DEBUG_BEGIN_LABEL
393#define DEBUG_BEGIN_LABEL "._debug_b"
394#endif
395#ifndef SFNAMES_BEGIN_LABEL
396#define SFNAMES_BEGIN_LABEL "._sfnames_b"
397#endif
398#ifndef SRCINFO_BEGIN_LABEL
399#define SRCINFO_BEGIN_LABEL "._srcinfo_b"
400#endif
401#ifndef MACINFO_BEGIN_LABEL
402#define MACINFO_BEGIN_LABEL "._macinfo_b"
403#endif
404
405#ifndef DIE_BEGIN_LABEL_FMT
406#define DIE_BEGIN_LABEL_FMT "._D%u"
407#endif
408#ifndef DIE_END_LABEL_FMT
409#define DIE_END_LABEL_FMT "._D%u_e"
410#endif
411#ifndef PUB_DIE_LABEL_FMT
412#define PUB_DIE_LABEL_FMT "._P%u"
413#endif
414#ifndef INSN_LABEL_FMT
415#define INSN_LABEL_FMT "._I%u_%u"
416#endif
417#ifndef BLOCK_BEGIN_LABEL_FMT
418#define BLOCK_BEGIN_LABEL_FMT "._B%u"
419#endif
420#ifndef BLOCK_END_LABEL_FMT
421#define BLOCK_END_LABEL_FMT "._B%u_e"
422#endif
423#ifndef SS_BEGIN_LABEL_FMT
424#define SS_BEGIN_LABEL_FMT "._s%u"
425#endif
426#ifndef SS_END_LABEL_FMT
427#define SS_END_LABEL_FMT "._s%u_e"
428#endif
429#ifndef EE_BEGIN_LABEL_FMT
430#define EE_BEGIN_LABEL_FMT "._e%u"
431#endif
432#ifndef EE_END_LABEL_FMT
433#define EE_END_LABEL_FMT "._e%u_e"
434#endif
435#ifndef MT_BEGIN_LABEL_FMT
436#define MT_BEGIN_LABEL_FMT "._t%u"
437#endif
438#ifndef MT_END_LABEL_FMT
439#define MT_END_LABEL_FMT "._t%u_e"
440#endif
441#ifndef LOC_BEGIN_LABEL_FMT
442#define LOC_BEGIN_LABEL_FMT "._l%u"
443#endif
444#ifndef LOC_END_LABEL_FMT
445#define LOC_END_LABEL_FMT "._l%u_e"
446#endif
447#ifndef BOUND_BEGIN_LABEL_FMT
448#define BOUND_BEGIN_LABEL_FMT "._b%u_%u_%c"
449#endif
450#ifndef BOUND_END_LABEL_FMT
451#define BOUND_END_LABEL_FMT "._b%u_%u_%c_e"
452#endif
453#ifndef DERIV_BEGIN_LABEL_FMT
454#define DERIV_BEGIN_LABEL_FMT "._d%u"
455#endif
456#ifndef DERIV_END_LABEL_FMT
457#define DERIV_END_LABEL_FMT "._d%u_e"
458#endif
459#ifndef SL_BEGIN_LABEL_FMT
460#define SL_BEGIN_LABEL_FMT "._sl%u"
461#endif
462#ifndef SL_END_LABEL_FMT
463#define SL_END_LABEL_FMT "._sl%u_e"
464#endif
465#ifndef FUNC_END_LABEL_FMT
466#define FUNC_END_LABEL_FMT "._f%u_e"
467#endif
468#ifndef TYPE_NAME_FMT
469#define TYPE_NAME_FMT "._T%u"
470#endif
471#ifndef LINE_CODE_LABEL_FMT
472#define LINE_CODE_LABEL_FMT "._LC%u"
473#endif
474#ifndef SFNAMES_ENTRY_LABEL_FMT
475#define SFNAMES_ENTRY_LABEL_FMT "._F%u"
476#endif
477#ifndef LINE_ENTRY_LABEL_FMT
478#define LINE_ENTRY_LABEL_FMT "._LE%u"
479#endif
480\f
481/* Definitions of defaults for various types of primitive assembly language
482 output operations.
483
484 If necessary, these may be overridden from within your tm.h file,
485 but typically, you should never need to override these. */
486
487#ifndef ASM_OUTPUT_SOURCE_FILENAME
488#define ASM_OUTPUT_SOURCE_FILENAME(FILE,NAME) \
2e494f70 489 fprintf ((FILE), "\t%s\t\"%s\"\n", FILE_ASM_OP, NAME)
340ccaab
TW
490#endif
491
492#ifndef ASM_OUTPUT_DEF
493#define ASM_OUTPUT_DEF(FILE,LABEL1,LABEL2) \
2e494f70 494 do { fprintf ((FILE), "\t%s\t", DEF_ASM_OP); \
340ccaab
TW
495 assemble_name (FILE, LABEL1); \
496 fprintf (FILE, ","); \
497 assemble_name (FILE, LABEL2); \
498 fprintf (FILE, "\n"); \
499 } while (0)
500#endif
501
502#ifndef ASM_DWARF_DEBUG_SECTION
503#define ASM_DWARF_DEBUG_SECTION(FILE) \
504 fprintf ((FILE), "%s\t.debug\n", SECTION_ASM_OP)
505#endif
506
507#ifndef ASM_DWARF_LINE_SECTION
508#define ASM_DWARF_LINE_SECTION(FILE) \
509 fprintf ((FILE), "%s\t.line\n", SECTION_ASM_OP)
510#endif
511
512#ifndef ASM_DWARF_SFNAMES_SECTION
513#define ASM_DWARF_SFNAMES_SECTION(FILE) \
514 fprintf ((FILE), "%s\t.debug_sfnames\n", SECTION_ASM_OP)
515#endif
516
517#ifndef ASM_DWARF_SRCINFO_SECTION
518#define ASM_DWARF_SRCINFO_SECTION(FILE) \
519 fprintf ((FILE), "%s\t.debug_srcinfo\n", SECTION_ASM_OP)
520#endif
521
522#ifndef ASM_DWARF_MACINFO_SECTION
523#define ASM_DWARF_MACINFO_SECTION(FILE) \
524 fprintf ((FILE), "%s\t.debug_macinfo\n", SECTION_ASM_OP)
525#endif
526
527#ifndef ASM_DWARF_PUBNAMES_SECTION
528#define ASM_DWARF_PUBNAMES_SECTION(FILE) \
529 fprintf ((FILE), "%s\t.debug_pubnames\n", SECTION_ASM_OP)
530#endif
531
532#ifndef ASM_DWARF_ARANGES_SECTION
533#define ASM_DWARF_ARANGES_SECTION(FILE) \
534 fprintf ((FILE), "%s\t.debug_aranges\n", SECTION_ASM_OP)
535#endif
536
537#ifndef ASM_DWARF_TEXT_SECTION
538#define ASM_DWARF_TEXT_SECTION(FILE) \
539 fprintf ((FILE), "%s\t.text\n", SECTION_ASM_OP)
540#endif
541
542#ifndef ASM_DWARF_DATA_SECTION
543#define ASM_DWARF_DATA_SECTION(FILE) \
544 fprintf ((FILE), "%s\t.data\n", SECTION_ASM_OP)
545#endif
546
547#ifndef ASM_DWARF_DATA1_SECTION
548#define ASM_DWARF_DATA1_SECTION(FILE) \
549 fprintf ((FILE), "%s\t.data1\n", SECTION_ASM_OP)
550#endif
551
552#ifndef ASM_DWARF_RODATA_SECTION
553#define ASM_DWARF_RODATA_SECTION(FILE) \
554 fprintf ((FILE), "%s\t.rodata\n", SECTION_ASM_OP)
555#endif
556
557#ifndef ASM_DWARF_RODATA1_SECTION
558#define ASM_DWARF_RODATA1_SECTION(FILE) \
559 fprintf ((FILE), "%s\t.rodata1\n", SECTION_ASM_OP)
560#endif
561
562#ifndef ASM_DWARF_BSS_SECTION
563#define ASM_DWARF_BSS_SECTION(FILE) \
564 fprintf ((FILE), "%s\t.bss\n", SECTION_ASM_OP)
565#endif
566
567#ifndef ASM_DWARF_POP_SECTION
568#define ASM_DWARF_POP_SECTION(FILE) \
569 fprintf ((FILE), "\t.previous\n")
570#endif
571
572#ifndef ASM_OUTPUT_DWARF_DELTA2
573#define ASM_OUTPUT_DWARF_DELTA2(FILE,LABEL1,LABEL2) \
2e494f70 574 do { fprintf ((FILE), "\t%s\t", UNALIGNED_SHORT_ASM_OP); \
340ccaab
TW
575 assemble_name (FILE, LABEL1); \
576 fprintf (FILE, "-"); \
577 assemble_name (FILE, LABEL2); \
578 fprintf (FILE, "\n"); \
579 } while (0)
580#endif
581
582#ifndef ASM_OUTPUT_DWARF_DELTA4
583#define ASM_OUTPUT_DWARF_DELTA4(FILE,LABEL1,LABEL2) \
2e494f70 584 do { fprintf ((FILE), "\t%s\t", UNALIGNED_INT_ASM_OP); \
340ccaab
TW
585 assemble_name (FILE, LABEL1); \
586 fprintf (FILE, "-"); \
587 assemble_name (FILE, LABEL2); \
588 fprintf (FILE, "\n"); \
589 } while (0)
590#endif
591
592#ifndef ASM_OUTPUT_DWARF_TAG
593#define ASM_OUTPUT_DWARF_TAG(FILE,TAG) \
2e494f70 594 fprintf ((FILE), "\t%s\t0x%x\t%s %s\n", UNALIGNED_SHORT_ASM_OP, \
340ccaab
TW
595 (unsigned) TAG, ASM_COMMENT_START, tag_name (TAG))
596#endif
597
598#ifndef ASM_OUTPUT_DWARF_ATTRIBUTE
599#define ASM_OUTPUT_DWARF_ATTRIBUTE(FILE,ATTRIBUTE) \
2e494f70 600 fprintf ((FILE), "\t%s\t0x%x\t%s %s\n", UNALIGNED_SHORT_ASM_OP, \
340ccaab
TW
601 (unsigned) ATTRIBUTE, ASM_COMMENT_START, attribute_name (ATTRIBUTE))
602#endif
603
604#ifndef ASM_OUTPUT_DWARF_STACK_OP
605#define ASM_OUTPUT_DWARF_STACK_OP(FILE,OP) \
606 fprintf ((FILE), "%s\t0x%x\t%s %s\n", ASM_BYTE_OP, \
607 (unsigned) OP, ASM_COMMENT_START, stack_op_name (OP))
608#endif
609
610#ifndef ASM_OUTPUT_DWARF_FUND_TYPE
611#define ASM_OUTPUT_DWARF_FUND_TYPE(FILE,FT) \
2e494f70 612 fprintf ((FILE), "\t%s\t0x%x\t%s %s\n", UNALIGNED_SHORT_ASM_OP, \
340ccaab
TW
613 (unsigned) FT, ASM_COMMENT_START, fundamental_type_name (FT))
614#endif
615
616#ifndef ASM_OUTPUT_DWARF_FMT_BYTE
617#define ASM_OUTPUT_DWARF_FMT_BYTE(FILE,FMT) \
618 fprintf ((FILE), "%s\t0x%x\t%s %s\n", ASM_BYTE_OP, \
619 (unsigned) FMT, ASM_COMMENT_START, format_byte_name (FMT))
620#endif
621
622#ifndef ASM_OUTPUT_DWARF_TYPE_MODIFIER
623#define ASM_OUTPUT_DWARF_TYPE_MODIFIER(FILE,MOD) \
624 fprintf ((FILE), "%s\t0x%x\t%s %s\n", ASM_BYTE_OP, \
625 (unsigned) MOD, ASM_COMMENT_START, modifier_name (MOD))
626#endif
627\f
628#ifndef ASM_OUTPUT_DWARF_ADDR
629#define ASM_OUTPUT_DWARF_ADDR(FILE,LABEL) \
2e494f70 630 do { fprintf ((FILE), "\t%s\t", UNALIGNED_INT_ASM_OP); \
340ccaab
TW
631 assemble_name (FILE, LABEL); \
632 fprintf (FILE, "\n"); \
633 } while (0)
634#endif
635
636#ifndef ASM_OUTPUT_DWARF_ADDR_CONST
637#define ASM_OUTPUT_DWARF_ADDR_CONST(FILE,RTX) \
2e494f70 638 fprintf ((FILE), "\t%s\t", UNALIGNED_INT_ASM_OP); \
340ccaab
TW
639 output_addr_const ((FILE), (RTX)); \
640 fputc ('\n', (FILE))
641#endif
642
643#ifndef ASM_OUTPUT_DWARF_REF
644#define ASM_OUTPUT_DWARF_REF(FILE,LABEL) \
2e494f70 645 do { fprintf ((FILE), "\t%s\t", UNALIGNED_INT_ASM_OP); \
340ccaab
TW
646 assemble_name (FILE, LABEL); \
647 fprintf (FILE, "\n"); \
648 } while (0)
649#endif
650
651#ifndef ASM_OUTPUT_DWARF_DATA1
652#define ASM_OUTPUT_DWARF_DATA1(FILE,VALUE) \
653 fprintf ((FILE), "%s\t0x%x\n", ASM_BYTE_OP, VALUE)
654#endif
655
656#ifndef ASM_OUTPUT_DWARF_DATA2
657#define ASM_OUTPUT_DWARF_DATA2(FILE,VALUE) \
2e494f70 658 fprintf ((FILE), "\t%s\t0x%x\n", UNALIGNED_SHORT_ASM_OP, (unsigned) VALUE)
340ccaab
TW
659#endif
660
661#ifndef ASM_OUTPUT_DWARF_DATA4
662#define ASM_OUTPUT_DWARF_DATA4(FILE,VALUE) \
2e494f70 663 fprintf ((FILE), "\t%s\t0x%x\n", UNALIGNED_INT_ASM_OP, (unsigned) VALUE)
340ccaab
TW
664#endif
665
666#ifndef ASM_OUTPUT_DWARF_DATA8
667#define ASM_OUTPUT_DWARF_DATA8(FILE,HIGH_VALUE,LOW_VALUE) \
668 do { \
669 if (WORDS_BIG_ENDIAN) \
670 { \
2e494f70
RS
671 fprintf ((FILE), "\t%s\t0x%x\n", UNALIGNED_INT_ASM_OP, HIGH_VALUE); \
672 fprintf ((FILE), "\t%s\t0x%x\n", UNALIGNED_INT_ASM_OP, LOW_VALUE);\
340ccaab
TW
673 } \
674 else \
675 { \
2e494f70
RS
676 fprintf ((FILE), "\t%s\t0x%x\n", UNALIGNED_INT_ASM_OP, LOW_VALUE);\
677 fprintf ((FILE), "\t%s\t0x%x\n", UNALIGNED_INT_ASM_OP, HIGH_VALUE); \
340ccaab
TW
678 } \
679 } while (0)
680#endif
681
682#ifndef ASM_OUTPUT_DWARF_STRING
683#define ASM_OUTPUT_DWARF_STRING(FILE,P) \
684 ASM_OUTPUT_ASCII ((FILE), P, strlen (P)+1)
685#endif
686\f
687/************************ general utility functions **************************/
688
689inline char *
690xstrdup (s)
691 register char *s;
692{
693 register char *p = (char *) xmalloc (strlen (s) + 1);
694
695 strcpy (p, s);
696 return p;
697}
698
699static char *
700tag_name (tag)
701 register unsigned tag;
702{
703 switch (tag)
704 {
705 case TAG_padding: return "TAG_padding";
706 case TAG_array_type: return "TAG_array_type";
707 case TAG_class_type: return "TAG_class_type";
708 case TAG_entry_point: return "TAG_entry_point";
709 case TAG_enumeration_type: return "TAG_enumeration_type";
710 case TAG_formal_parameter: return "TAG_formal_parameter";
711 case TAG_global_subroutine: return "TAG_global_subroutine";
712 case TAG_global_variable: return "TAG_global_variable";
713 case TAG_imported_declaration: return "TAG_imported_declaration";
714 case TAG_label: return "TAG_label";
715 case TAG_lexical_block: return "TAG_lexical_block";
716 case TAG_local_variable: return "TAG_local_variable";
717 case TAG_member: return "TAG_member";
718 case TAG_pointer_type: return "TAG_pointer_type";
719 case TAG_reference_type: return "TAG_reference_type";
720 case TAG_compile_unit: return "TAG_compile_unit";
721 case TAG_string_type: return "TAG_string_type";
722 case TAG_structure_type: return "TAG_structure_type";
723 case TAG_subroutine: return "TAG_subroutine";
724 case TAG_subroutine_type: return "TAG_subroutine_type";
725 case TAG_typedef: return "TAG_typedef";
726 case TAG_union_type: return "TAG_union_type";
727 case TAG_unspecified_parameters: return "TAG_unspecified_parameters";
728 case TAG_variant: return "TAG_variant";
729 case TAG_format: return "TAG_format";
730 case TAG_with_stmt: return "TAG_with_stmt";
731 case TAG_set_type: return "TAG_set_type";
732 default: return "<unknown tag>";
733 }
734}
735
736static char *
737attribute_name (attr)
738 register unsigned attr;
739{
740 switch (attr)
741 {
742 case AT_sibling: return "AT_sibling";
743 case AT_location: return "AT_location";
744 case AT_name: return "AT_name";
745 case AT_fund_type: return "AT_fund_type";
746 case AT_mod_fund_type: return "AT_mod_fund_type";
747 case AT_user_def_type: return "AT_user_def_type";
748 case AT_mod_u_d_type: return "AT_mod_u_d_type";
749 case AT_ordering: return "AT_ordering";
750 case AT_subscr_data: return "AT_subscr_data";
751 case AT_byte_size: return "AT_byte_size";
752 case AT_bit_offset: return "AT_bit_offset";
753 case AT_bit_size: return "AT_bit_size";
754 case AT_element_list: return "AT_element_list";
755 case AT_stmt_list: return "AT_stmt_list";
756 case AT_low_pc: return "AT_low_pc";
757 case AT_high_pc: return "AT_high_pc";
758 case AT_language: return "AT_language";
759 case AT_member: return "AT_member";
760 case AT_discr: return "AT_discr";
761 case AT_discr_value: return "AT_discr_value";
762 case AT_visibility: return "AT_visibility";
763 case AT_import: return "AT_import";
764 case AT_string_length: return "AT_string_length";
765 case AT_comp_dir: return "AT_comp_dir";
766 case AT_producer: return "AT_producer";
767 case AT_frame_base: return "AT_frame_base";
768 case AT_start_scope: return "AT_start_scope";
769 case AT_stride_size: return "AT_stride_size";
770 case AT_src_info: return "AT_src_info";
771 case AT_prototyped: return "AT_prototyped";
772 case AT_const_value_block4: return "AT_const_value_block4";
773 case AT_sf_names: return "AT_sf_names";
774 case AT_mac_info: return "AT_mac_info";
775 default: return "<unknown attribute>";
776 }
777}
778
779static char *
780stack_op_name (op)
781 register unsigned op;
782{
783 switch (op)
784 {
785 case OP_REG: return "OP_REG";
786 case OP_BASEREG: return "OP_BASEREG";
787 case OP_ADDR: return "OP_ADDR";
788 case OP_CONST: return "OP_CONST";
789 case OP_DEREF2: return "OP_DEREF2";
790 case OP_DEREF4: return "OP_DEREF4";
791 case OP_ADD: return "OP_ADD";
792 default: return "<unknown stack operator>";
793 }
794}
795
796static char *
797modifier_name (mod)
798 register unsigned mod;
799{
800 switch (mod)
801 {
802 case MOD_pointer_to: return "MOD_pointer_to";
803 case MOD_reference_to: return "MOD_reference_to";
804 case MOD_const: return "MOD_const";
805 case MOD_volatile: return "MOD_volatile";
806 default: return "<unknown modifier>";
807 }
808}
809
810static char *
811format_byte_name (fmt)
812 register unsigned fmt;
813{
814 switch (fmt)
815 {
816 case FMT_FT_C_C: return "FMT_FT_C_C";
817 case FMT_FT_C_X: return "FMT_FT_C_X";
818 case FMT_FT_X_C: return "FMT_FT_X_C";
819 case FMT_FT_X_X: return "FMT_FT_X_X";
820 case FMT_UT_C_C: return "FMT_UT_C_C";
821 case FMT_UT_C_X: return "FMT_UT_C_X";
822 case FMT_UT_X_C: return "FMT_UT_X_C";
823 case FMT_UT_X_X: return "FMT_UT_X_X";
824 case FMT_ET: return "FMT_ET";
825 default: return "<unknown array bound format byte>";
826 }
827}
828static char *
829fundamental_type_name (ft)
830 register unsigned ft;
831{
832 switch (ft)
833 {
834 case FT_char: return "FT_char";
835 case FT_signed_char: return "FT_signed_char";
836 case FT_unsigned_char: return "FT_unsigned_char";
837 case FT_short: return "FT_short";
838 case FT_signed_short: return "FT_signed_short";
839 case FT_unsigned_short: return "FT_unsigned_short";
840 case FT_integer: return "FT_integer";
841 case FT_signed_integer: return "FT_signed_integer";
842 case FT_unsigned_integer: return "FT_unsigned_integer";
843 case FT_long: return "FT_long";
844 case FT_signed_long: return "FT_signed_long";
845 case FT_unsigned_long: return "FT_unsigned_long";
846 case FT_pointer: return "FT_pointer";
847 case FT_float: return "FT_float";
848 case FT_dbl_prec_float: return "FT_dbl_prec_float";
849 case FT_ext_prec_float: return "FT_ext_prec_float";
850 case FT_complex: return "FT_complex";
851 case FT_dbl_prec_complex: return "FT_dbl_prec_complex";
852 case FT_void: return "FT_void";
853 case FT_boolean: return "FT_boolean";
854 case FT_long_long: return "FT_long_long";
855 case FT_signed_long_long: return "FT_signed_long_long";
856 case FT_unsigned_long_long: return "FT_unsigned_long_long";
857 default: return "<unknown fundamental type>";
858 }
859}
860\f
861/**************** utility functions for attribute functions ******************/
862
863/* Given a pointer to a tree node for some type, return a Dwarf fundamental
864 type code for the given type.
865
866 This routine must only be called for GCC type nodes that correspond to
867 Dwarf fundamental types.
868
869 The current Dwarf draft specification calls for Dwarf fundamental types
870 to accurately reflect the fact that a given type was either a "plain"
871 integral type or an explicitly "signed" integral type. Unfortuantely,
872 we can't always do this, because GCC may already have thrown away the
873 information about the precise way in which the type was originally
874 specified, as in:
875
876 typedef signed int field_type;
877
878 struct s { field_type f; };
879
880 Since we may be stuck here without enought information to do exactly
881 what is called for in the Dwarf draft specification, we do the best
882 that we can under the circumstances and always use the "plain" integral
883 fundamental type codes for int, short, and long types. That's probably
884 good enough. The additional accuracy called for in the current DWARF
885 draft specification is probably never even useful in practice. */
886
887static int
888fundamental_type_code (type)
889 register tree type;
890{
891 if (TREE_CODE (type) == ERROR_MARK)
892 return 0;
893
894 switch (TREE_CODE (type))
895 {
896 case ERROR_MARK:
897 return FT_void;
898
899 case VOID_TYPE:
900 return FT_void;
901
902 case INTEGER_TYPE:
903 /* Carefully distinguish all the standard types of C,
904 without messing up if the language is not C.
905 Note that we check only for the names that contain spaces;
906 other names might occur by coincidence in other languages. */
907 if (TYPE_NAME (type) != 0
908 && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
909 && DECL_NAME (TYPE_NAME (type)) != 0
910 && TREE_CODE (DECL_NAME (TYPE_NAME (type))) == IDENTIFIER_NODE)
911 {
912 char *name = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)));
913
914 if (!strcmp (name, "unsigned char"))
915 return FT_unsigned_char;
916 if (!strcmp (name, "signed char"))
917 return FT_signed_char;
918 if (!strcmp (name, "unsigned int"))
919 return FT_unsigned_integer;
920 if (!strcmp (name, "short int"))
921 return FT_short;
922 if (!strcmp (name, "short unsigned int"))
923 return FT_unsigned_short;
924 if (!strcmp (name, "long int"))
925 return FT_long;
926 if (!strcmp (name, "long unsigned int"))
927 return FT_unsigned_long;
928 if (!strcmp (name, "long long int"))
929 return FT_long_long; /* Not grok'ed by svr4 SDB */
930 if (!strcmp (name, "long long unsigned int"))
931 return FT_unsigned_long_long; /* Not grok'ed by svr4 SDB */
932 }
933
934 /* Most integer types will be sorted out above, however, for the
935 sake of special `array index' integer types, the following code
936 is also provided. */
937
938 if (TYPE_PRECISION (type) == INT_TYPE_SIZE)
939 return (TREE_UNSIGNED (type) ? FT_unsigned_integer : FT_integer);
940
941 if (TYPE_PRECISION (type) == LONG_TYPE_SIZE)
942 return (TREE_UNSIGNED (type) ? FT_unsigned_long : FT_long);
943
944 if (TYPE_PRECISION (type) == LONG_LONG_TYPE_SIZE)
945 return (TREE_UNSIGNED (type) ? FT_unsigned_long_long : FT_long_long);
946
947 if (TYPE_PRECISION (type) == SHORT_TYPE_SIZE)
948 return (TREE_UNSIGNED (type) ? FT_unsigned_short : FT_short);
949
950 if (TYPE_PRECISION (type) == CHAR_TYPE_SIZE)
951 return (TREE_UNSIGNED (type) ? FT_unsigned_char : FT_char);
952
953 abort ();
954
955 case REAL_TYPE:
956 /* Carefully distinguish all the standard types of C,
957 without messing up if the language is not C. */
958 if (TYPE_NAME (type) != 0
959 && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
960 && DECL_NAME (TYPE_NAME (type)) != 0
961 && TREE_CODE (DECL_NAME (TYPE_NAME (type))) == IDENTIFIER_NODE)
962 {
963 char *name = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)));
964
965 /* Note that here we can run afowl of a serious bug in "classic"
966 svr4 SDB debuggers. They don't seem to understand the
967 FT_ext_prec_float type (even though they should). */
968
969 if (!strcmp (name, "long double"))
970 return FT_ext_prec_float;
971 }
972
973 if (TYPE_PRECISION (type) == DOUBLE_TYPE_SIZE)
974 return FT_dbl_prec_float;
975 if (TYPE_PRECISION (type) == FLOAT_TYPE_SIZE)
976 return FT_float;
977
978 /* Note that here we can run afowl of a serious bug in "classic"
979 svr4 SDB debuggers. They don't seem to understand the
980 FT_ext_prec_float type (even though they should). */
981
982 if (TYPE_PRECISION (type) == LONG_DOUBLE_TYPE_SIZE)
983 return FT_ext_prec_float;
984 abort ();
985
986 case COMPLEX_TYPE:
987 return FT_complex; /* GNU FORTRAN COMPLEX type. */
988
989 case CHAR_TYPE:
990 return FT_char; /* GNU Pascal CHAR type. Not used in C. */
991
992 case BOOLEAN_TYPE:
993 return FT_boolean; /* GNU FORTRAN BOOLEAN type. */
994
995 default:
996 abort (); /* No other TREE_CODEs are Dwarf fundamental types. */
997 }
998 return 0;
999}
1000\f
1001/* Given a pointer to an arbitrary ..._TYPE tree node, return a pointer to
1002 the Dwarf "root" type for the given input type. The Dwarf "root" type
1003 of a given type is generally the same as the given type, except that if
1004 the given type is a pointer or reference type, then the root type of
1005 the given type is the root type of the "basis" type for the pointer or
1006 reference type. (This definition of the "root" type is recursive.)
1007 Also, the root type of a `const' qualified type or a `volatile'
1008 qualified type is the root type of the given type without the
1009 qualifiers. */
1010
1011static tree
1012root_type (type)
1013 register tree type;
1014{
1015 if (TREE_CODE (type) == ERROR_MARK)
1016 return error_mark_node;
1017
1018 switch (TREE_CODE (type))
1019 {
1020 case ERROR_MARK:
1021 return error_mark_node;
1022
1023 case POINTER_TYPE:
1024 case REFERENCE_TYPE:
1025 return TYPE_MAIN_VARIANT (root_type (TREE_TYPE (type)));
1026
1027 default:
1028 return TYPE_MAIN_VARIANT (type);
1029 }
1030}
1031
1032/* Given a pointer to an arbitrary ..._TYPE tree node, write out a sequence
1033 of zero or more Dwarf "type-modifier" bytes applicable to the type. */
1034
1035static void
1036write_modifier_bytes (type, decl_const, decl_volatile)
1037 register tree type;
1038 register int decl_const;
1039 register int decl_volatile;
1040{
1041 if (TREE_CODE (type) == ERROR_MARK)
1042 return;
1043
1044 if (TYPE_READONLY (type) || decl_const)
1045 ASM_OUTPUT_DWARF_TYPE_MODIFIER (asm_out_file, MOD_const);
1046 if (TYPE_VOLATILE (type) || decl_volatile)
1047 ASM_OUTPUT_DWARF_TYPE_MODIFIER (asm_out_file, MOD_volatile);
1048 switch (TREE_CODE (type))
1049 {
1050 case POINTER_TYPE:
1051 ASM_OUTPUT_DWARF_TYPE_MODIFIER (asm_out_file, MOD_pointer_to);
1052 write_modifier_bytes (TREE_TYPE (type), 0, 0);
1053 return;
1054
1055 case REFERENCE_TYPE:
1056 ASM_OUTPUT_DWARF_TYPE_MODIFIER (asm_out_file, MOD_reference_to);
1057 write_modifier_bytes (TREE_TYPE (type), 0, 0);
1058 return;
1059
1060 case ERROR_MARK:
1061 default:
1062 return;
1063 }
1064}
1065\f
1066/* Given a pointer to an arbitrary ..._TYPE tree node, return non-zero if the
1067 given input type is a Dwarf "fundamental" type. Otherwise return zero. */
1068
1069inline int
1070type_is_fundamental (type)
1071 register tree type;
1072{
1073 switch (TREE_CODE (type))
1074 {
1075 case ERROR_MARK:
1076 case VOID_TYPE:
1077 case INTEGER_TYPE:
1078 case REAL_TYPE:
1079 case COMPLEX_TYPE:
1080 case BOOLEAN_TYPE:
1081 case CHAR_TYPE:
1082 return 1;
1083
1084 case SET_TYPE:
1085 case ARRAY_TYPE:
1086 case RECORD_TYPE:
1087 case UNION_TYPE:
1088 case ENUMERAL_TYPE:
1089 case FUNCTION_TYPE:
1090 case METHOD_TYPE:
1091 case POINTER_TYPE:
1092 case REFERENCE_TYPE:
1093 case STRING_TYPE:
1094 case FILE_TYPE:
1095 case OFFSET_TYPE:
1096 case LANG_TYPE:
1097 return 0;
1098
1099 default:
1100 abort ();
1101 }
1102 return 0;
1103}
1104
1105/* Given a pointer to some ..._TYPE tree node, generate an assembly language
1106 equate directive which will associate an easily remembered symbolic name
1107 with the current DIE.
1108
1109 The name used is an artificial label generated from the TYPE_UID number
1110 associated with the given type node. The name it gets equated to is the
1111 symbolic label that we (previously) output at the start of the DIE that
1112 we are currently generating.
1113
1114 Calling this function while generating some "type related" form of DIE
1115 makes it easy to later refer to the DIE which represents the given type
1116 simply by re-generating the alternative name from the ..._TYPE node's
1117 UID number. */
1118
1119inline void
1120equate_type_number_to_die_number (type)
1121 register tree type;
1122{
1123 char type_label[MAX_ARTIFICIAL_LABEL_BYTES];
1124 char die_label[MAX_ARTIFICIAL_LABEL_BYTES];
1125
1126 /* We are generating a DIE to represent the main variant of this type
1127 (i.e the type without any const or volatile qualifiers) so in order
1128 to get the equate to come out right, we need to get the main variant
1129 itself here. */
1130
1131 type = TYPE_MAIN_VARIANT (type);
1132
1133 sprintf (type_label, TYPE_NAME_FMT, TYPE_UID (type));
1134 sprintf (die_label, DIE_BEGIN_LABEL_FMT, current_dienum);
1135 ASM_OUTPUT_DEF (asm_out_file, type_label, die_label);
1136}
1137
1138/* The following routine is a nice and simple transducer. It converts the
1139 RTL for a variable or parameter (resident in memory) into an equivalent
1140 Dwarf representation of a mechanism for getting the address of that same
1141 variable onto the top of a hypothetical "address evaluation" stack.
1142
1143 When creating memory location descriptors, we are effectively trans-
1144 forming the RTL for a memory-resident object into its Dwarf postfix
1145 expression equivalent. This routine just recursively descends an
1146 RTL tree, turning it into Dwarf postfix code as it goes. */
1147
1148static void
1149output_mem_loc_descriptor (rtl)
1150 register rtx rtl;
1151{
1152 /* Note that for a dynamically sized array, the location we will
1153 generate a description of here will be the lowest numbered location
1154 which is actually within the array. That's *not* necessarily the
1155 same as the zeroth element of the array. */
1156
1157 switch (GET_CODE (rtl))
1158 {
1159 case SUBREG:
1160
1161 /* The case of a subreg may arise when we have a local (register)
1162 variable or a formal (register) parameter which doesn't quite
1163 fill up an entire register. For now, just assume that it is
1164 legitimate to make the Dwarf info refer to the whole register
1165 which contains the given subreg. */
1166
1167 rtl = XEXP (rtl, 0);
1168 /* Drop thru. */
1169
1170 case REG:
1171
1172 /* Whenever a register number forms a part of the description of
1173 the method for calculating the (dynamic) address of a memory
1174 resident object, Dwarf rules require the register number to
1175 be referred to as a "base register". This distinction is not
1176 based in any way upon what category of register the hardware
1177 believes the given register belongs to. This is strictly
1178 Dwarf terminology we're dealing with here. */
1179
1180 ASM_OUTPUT_DWARF_STACK_OP (asm_out_file, OP_BASEREG);
1181 ASM_OUTPUT_DWARF_DATA4 (asm_out_file,
1182 DBX_REGISTER_NUMBER (REGNO (rtl)));
1183 break;
1184
1185 case MEM:
1186 output_mem_loc_descriptor (XEXP (rtl, 0));
1187 ASM_OUTPUT_DWARF_STACK_OP (asm_out_file, OP_DEREF4);
1188 break;
1189
1190 case CONST:
1191 case SYMBOL_REF:
1192 ASM_OUTPUT_DWARF_STACK_OP (asm_out_file, OP_ADDR);
1193 ASM_OUTPUT_DWARF_ADDR_CONST (asm_out_file, rtl);
1194 break;
1195
1196 case PLUS:
1197 output_mem_loc_descriptor (XEXP (rtl, 0));
1198 output_mem_loc_descriptor (XEXP (rtl, 1));
1199 ASM_OUTPUT_DWARF_STACK_OP (asm_out_file, OP_ADD);
1200 break;
1201
1202 case CONST_INT:
1203 ASM_OUTPUT_DWARF_STACK_OP (asm_out_file, OP_CONST);
1204 ASM_OUTPUT_DWARF_DATA4 (asm_out_file, INTVAL (rtl));
1205 break;
1206
1207 default:
1208 abort ();
1209 }
1210}
1211
1212/* Output a proper Dwarf location descriptor for a variable or parameter
1213 which is either allocated in a register or in a memory location. For
1214 a register, we just generate an OP_REG and the register number. For a
1215 memory location we provide a Dwarf postfix expression describing how to
1216 generate the (dynamic) address of the object onto the address stack. */
1217
1218static void
1219output_loc_descriptor (rtl)
1220 register rtx rtl;
1221{
1222 switch (GET_CODE (rtl))
1223 {
1224 case SUBREG:
1225
1226 /* The case of a subreg may arise when we have a local (register)
1227 variable or a formal (register) parameter which doesn't quite
1228 fill up an entire register. For now, just assume that it is
1229 legitimate to make the Dwarf info refer to the whole register
1230 which contains the given subreg. */
1231
1232 rtl = XEXP (rtl, 0);
1233 /* Drop thru. */
1234
1235 case REG:
1236 ASM_OUTPUT_DWARF_STACK_OP (asm_out_file, OP_REG);
1237 ASM_OUTPUT_DWARF_DATA4 (asm_out_file,
1238 DBX_REGISTER_NUMBER (REGNO (rtl)));
1239 break;
1240
1241 case MEM:
1242 output_mem_loc_descriptor (XEXP (rtl, 0));
1243 break;
1244
1245 default:
1246 abort (); /* Should never happen */
1247 }
1248}
1249
1250/* Given a tree node describing an array bound (either lower or upper)
1251 output a representation for that bound. */
1252
1253static void
1254output_bound_representation (bound, dim_num, u_or_l)
1255 register tree bound;
1256 register unsigned dim_num; /* For multi-dimensional arrays. */
1257 register char u_or_l; /* Designates upper or lower bound. */
1258{
1259 switch (TREE_CODE (bound))
1260 {
1261
1262 case ERROR_MARK:
1263 return;
1264
1265 /* All fixed-bounds are represented by INTEGER_CST nodes. */
1266
1267 case INTEGER_CST:
1268 ASM_OUTPUT_DWARF_DATA4 (asm_out_file,
1269 (unsigned) TREE_INT_CST_LOW (bound));
1270 break;
1271
1272 /* Dynamic bounds may be represented by NOP_EXPR nodes containing
1273 SAVE_EXPR nodes. */
1274
1275 case NOP_EXPR:
1276 bound = TREE_OPERAND (bound, 0);
1277 /* ... fall thru... */
1278
1279 case SAVE_EXPR:
1280 {
1281 char begin_label[MAX_ARTIFICIAL_LABEL_BYTES];
1282 char end_label[MAX_ARTIFICIAL_LABEL_BYTES];
1283
1284 sprintf (begin_label, BOUND_BEGIN_LABEL_FMT,
1285 current_dienum, dim_num, u_or_l);
1286
1287 sprintf (end_label, BOUND_END_LABEL_FMT,
1288 current_dienum, dim_num, u_or_l);
1289
1290 ASM_OUTPUT_DWARF_DELTA2 (asm_out_file, end_label, begin_label);
1291 ASM_OUTPUT_LABEL (asm_out_file, begin_label);
1292
1293 /* If we are working on a bound for a dynamic dimension in C,
1294 the dynamic dimension in question had better have a static
1295 (zero) lower bound and a dynamic *upper* bound. */
1296
1297 if (u_or_l != 'u')
1298 abort ();
1299
1300 /* If optimization is turned on, the SAVE_EXPRs that describe
1301 how to access the upper bound values are essentially bogus.
1302 They only describe (at best) how to get at these values at
1303 the points in the generated code right after they have just
1304 been computed. Worse yet, in the typical case, the upper
1305 bound values will not even *be* computed in the optimized
1306 code, so these SAVE_EXPRs are entirely bogus.
1307
1308 In order to compensate for this fact, we check here to see
1309 if optimization is enabled, and if so, we effectively create
1310 an empty location description for the (unknown and unknowable)
1311 upper bound.
1312
1313 This should not cause too much trouble for existing (stupid?)
1314 debuggers because they have to deal with empty upper bounds
1315 location descriptions anyway in order to be able to deal with
1316 incomplete array types.
1317
1318 Of course an intelligent debugger (GDB?) should be able to
1319 comprehend that a missing upper bound specification in a
1320 array type used for a storage class `auto' local array variable
1321 indicates that the upper bound is both unknown (at compile-
1322 time) and unknowable (at run-time) due to optimization.
1323 */
1324
1325 if (! optimize)
1326 output_loc_descriptor
1327 (eliminate_regs (SAVE_EXPR_RTL (bound), 0, 0));
1328
1329 ASM_OUTPUT_LABEL (asm_out_file, end_label);
1330 }
1331 break;
1332
1333 default:
1334 abort ();
1335 }
1336}
1337
1338/* Recursive function to output a sequence of value/name pairs for
1339 enumeration constants in reversed order. This is called from
1340 enumeration_type_die. */
1341
1342static void
1343output_enumeral_list (link)
1344 register tree link;
1345{
1346 if (link)
1347 {
1348 output_enumeral_list (TREE_CHAIN (link));
1349 ASM_OUTPUT_DWARF_DATA4 (asm_out_file,
1350 (unsigned) TREE_INT_CST_LOW (TREE_VALUE (link)));
1351 ASM_OUTPUT_DWARF_STRING (asm_out_file,
1352 IDENTIFIER_POINTER (TREE_PURPOSE (link)));
1353 }
1354}
1355
1356/****************************** attributes *********************************/
1357
1358/* The following routines are responsible for writing out the various types
1359 of Dwarf attributes (and any following data bytes associated with them).
1360 These routines are listed in order based on the numerical codes of their
1361 associated attributes. */
1362
1363/* Generate an AT_sibling attribute. */
1364
1365inline void
1366sibling_attribute ()
1367{
1368 char label[MAX_ARTIFICIAL_LABEL_BYTES];
1369
1370 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_sibling);
1371 sprintf (label, DIE_BEGIN_LABEL_FMT, NEXT_DIE_NUM);
1372 ASM_OUTPUT_DWARF_REF (asm_out_file, label);
1373}
1374
1375/* Output the form of location attributes suitable for whole variables and
1376 whole parameters. Note that the location attributes for struct fields
1377 are generated by the routine `data_member_location_attribute' below. */
1378
1379static void
1380location_attribute (rtl)
1381 register rtx rtl;
1382{
1383 char begin_label[MAX_ARTIFICIAL_LABEL_BYTES];
1384 char end_label[MAX_ARTIFICIAL_LABEL_BYTES];
1385
1386 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_location);
1387 sprintf (begin_label, LOC_BEGIN_LABEL_FMT, current_dienum);
1388 sprintf (end_label, LOC_END_LABEL_FMT, current_dienum);
1389 ASM_OUTPUT_DWARF_DELTA2 (asm_out_file, end_label, begin_label);
1390 ASM_OUTPUT_LABEL (asm_out_file, begin_label);
1391
1392 /* Handle a special case. If we are about to output a location descriptor
2e494f70 1393 for a variable or parameter which has been optimized out of existence,
340ccaab
TW
1394 don't do that. Instead we output a zero-length location descriptor
1395 value as part of the location attribute. Note that we cannot simply
1396 suppress the entire location attribute, because the absence of a
1397 location attribute in certain kinds of DIEs is used to indicate some-
1398 thing entirely different... i.e. that the DIE represents an object
1399 declaration, but not a definition. So sayeth the PLSIG. */
1400
1401 if (((GET_CODE (rtl) != REG) || (REGNO (rtl) < FIRST_PSEUDO_REGISTER))
1402 && ((GET_CODE (rtl) != SUBREG)
1403 || (REGNO (XEXP (rtl, 0)) < FIRST_PSEUDO_REGISTER)))
1404 output_loc_descriptor (eliminate_regs (rtl, 0, 0));
1405
1406 ASM_OUTPUT_LABEL (asm_out_file, end_label);
1407}
1408
1409/* Output the specialized form of location attribute used for data members
1410 of struct types. */
1411
1412static void
1413data_member_location_attribute (decl)
1414 register tree decl;
1415{
1416 char begin_label[MAX_ARTIFICIAL_LABEL_BYTES];
1417 char end_label[MAX_ARTIFICIAL_LABEL_BYTES];
1418
1419 if (TREE_CODE (decl) == ERROR_MARK)
1420 return;
1421
1422 if (TREE_CODE (decl) != FIELD_DECL)
1423 abort ();
1424
1425 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_location);
1426 sprintf (begin_label, LOC_BEGIN_LABEL_FMT, current_dienum);
1427 sprintf (end_label, LOC_END_LABEL_FMT, current_dienum);
1428 ASM_OUTPUT_DWARF_DELTA2 (asm_out_file, end_label, begin_label);
1429 ASM_OUTPUT_LABEL (asm_out_file, begin_label);
1430 ASM_OUTPUT_DWARF_STACK_OP (asm_out_file, OP_CONST);
1431
1432 /* This is pretty strange, but existing compilers producing DWARF
1433 apparently calculate the byte offset of a field differently
1434 depending upon whether or not it is a bit-field. If the given
1435 field is *not* a bit-field, then the offset is simply the
1436 the byte offset of the given field from the beginning of the
1437 struct. For bit-fields however, the offset is the offset (in
1438 bytes) of the beginning of the *containing word* from the
1439 beginning of the whole struct. */
1440
1441 ASM_OUTPUT_DWARF_DATA4 (asm_out_file,
1442 (DECL_BIT_FIELD_TYPE (decl))
1443 ? BITFIELD_OFFSET_WORDS_IN_UNITS (decl)
1444 : BITFIELD_OFFSET_UNITS (decl));
1445 ASM_OUTPUT_DWARF_STACK_OP (asm_out_file, OP_ADD);
1446 ASM_OUTPUT_LABEL (asm_out_file, end_label);
1447}
1448
1449/* Output an AT_const_value attribute for a variable or a parameter which
1450 does not have a "location" either in memory or in a register. These
1451 things can arise in GNU C when a constant is passed as an actual
1452 parameter to an inlined function. They can also arise in C++ where
1453 declared constants do not necessarily get memory "homes". */
1454
1455static void
1456const_value_attribute (rtl)
1457 register rtx rtl;
1458{
1459 char begin_label[MAX_ARTIFICIAL_LABEL_BYTES];
1460 char end_label[MAX_ARTIFICIAL_LABEL_BYTES];
1461
1462 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_const_value_block4);
1463 sprintf (begin_label, LOC_BEGIN_LABEL_FMT, current_dienum);
1464 sprintf (end_label, LOC_END_LABEL_FMT, current_dienum);
1465 ASM_OUTPUT_DWARF_DELTA4 (asm_out_file, end_label, begin_label);
1466 ASM_OUTPUT_LABEL (asm_out_file, begin_label);
1467
1468 switch (GET_CODE (rtl))
1469 {
1470 case CONST_INT:
1471 /* Note that a CONST_INT rtx could represent either an integer or
1472 a floating-point constant. A CONST_INT is used whenever the
1473 constant will fit into a single word. In all such cases, the
1474 original mode of the constant value is wiped out, and the
1475 CONST_INT rtx is assigned VOIDmode. Since we no longer have
1476 precise mode information for these constants, we always just
1477 output them using 4 bytes. */
1478
1479 ASM_OUTPUT_DWARF_DATA4 (asm_out_file, (unsigned) INTVAL (rtl));
1480 break;
1481
1482 case CONST_DOUBLE:
1483 /* Note that a CONST_DOUBLE rtx could represent either an integer
1484 or a floating-point constant. A CONST_DOUBLE is used whenever
1485 the constant requires more than one word in order to be adequately
1486 represented. In all such cases, the original mode of the constant
1487 value is preserved as the mode of the CONST_DOUBLE rtx, but for
1488 simplicity we always just output CONST_DOUBLEs using 8 bytes. */
1489
1490 ASM_OUTPUT_DWARF_DATA8 (asm_out_file,
1491 (unsigned) CONST_DOUBLE_HIGH (rtl),
1492 (unsigned) CONST_DOUBLE_LOW (rtl));
1493 break;
1494
1495 case CONST_STRING:
1496 ASM_OUTPUT_DWARF_STRING (asm_out_file, XSTR (rtl, 0));
1497 break;
1498
1499 case SYMBOL_REF:
1500 case LABEL_REF:
1501 case CONST:
1502 ASM_OUTPUT_DWARF_ADDR_CONST (asm_out_file, rtl);
1503 break;
1504
1505 case PLUS:
1506 /* In cases where an inlined instance of an inline function is passed
1507 the address of an `auto' variable (which is local to the caller)
1508 we can get a situation where the DECL_RTL of the artificial
1509 local variable (for the inlining) which acts as a stand-in for
1510 the corresponding formal parameter (of the inline function)
1511 will look like (plus:SI (reg:SI FRAME_PTR) (const_int ...)).
1512 This is not exactly a compile-time constant expression, but it
1513 isn't the address of the (artificial) local variable either.
1514 Rather, it represents the *value* which the artificial local
1515 variable always has during its lifetime. We currently have no
1516 way to represent such quasi-constant values in Dwarf, so for now
1517 we just punt and generate an AT_const_value attribute with form
1518 FORM_BLOCK4 and a length of zero. */
1519 break;
1520 }
1521
1522 ASM_OUTPUT_LABEL (asm_out_file, end_label);
1523}
1524
1525/* Generate *either* an AT_location attribute or else an AT_const_value
1526 data attribute for a variable or a parameter. We generate the
1527 AT_const_value attribute only in those cases where the given
1528 variable or parameter does not have a true "location" either in
1529 memory or in a register. This can happen (for example) when a
1530 constant is passed as an actual argument in a call to an inline
1531 function. (It's possible that these things can crop up in other
1532 ways also.) Note that one type of constant value which can be
1533 passed into an inlined function is a constant pointer. This can
1534 happen for example if an actual argument in an inlined function
1535 call evaluates to a compile-time constant address. */
1536
1537static void
1538location_or_const_value_attribute (decl)
1539 register tree decl;
1540{
1541 register rtx rtl;
1542
1543 if (TREE_CODE (decl) == ERROR_MARK)
1544 return;
1545
1546 if ((TREE_CODE (decl) != VAR_DECL) && (TREE_CODE (decl) != PARM_DECL))
1547 abort ();
1548
1549 /* It's not really clear what existing Dwarf debuggers need or expect
1550 as regards to location information for formal parameters. A later
1551 version of the Dwarf specification should resolve such issues, but
1552 for the time being, we assume here that debuggers want information
1553 about the location where the parameter was passed into the function.
1554 That seems to be what USL's CI5 compiler generates. Note that this
1555 will probably be different from the place where the parameter actual
1556 resides during function execution. Dwarf Version 2 will provide us
1557 with a means to describe that location also, but for now we can only
1558 describe the "passing" location. */
1559
2e494f70 1560#if 1 /* This is probably right, but it leads to a lot of trouble.
340ccaab
TW
1561 Fixing one problem has been exposing another,
1562 all of which seemed to have no ill effects before.
2e494f70 1563 Let's try it again for now. */
340ccaab
TW
1564 rtl = (TREE_CODE (decl) == PARM_DECL)
1565 ? DECL_INCOMING_RTL (decl)
1566 : DECL_RTL (decl);
2e494f70 1567#else
340ccaab 1568 rtl = DECL_RTL (decl);
2e494f70 1569#endif
340ccaab
TW
1570
1571 if (rtl == NULL)
1572 return;
1573
1574 switch (GET_CODE (rtl))
1575 {
1576 case CONST_INT:
1577 case CONST_DOUBLE:
1578 case CONST_STRING:
1579 case SYMBOL_REF:
1580 case LABEL_REF:
1581 case CONST:
1582 case PLUS: /* DECL_RTL could be (plus (reg ...) (const_int ...)) */
1583 const_value_attribute (rtl);
1584 break;
1585
1586 case MEM:
1587 case REG:
1588 case SUBREG:
1589 location_attribute (rtl);
1590 break;
1591
1592 default:
1593 abort (); /* Should never happen. */
1594 }
1595}
1596
1597/* Generate an AT_name attribute given some string value to be included as
1598 the value of the attribute. If the name is null, don't do anything. */
1599
1600inline void
1601name_attribute (name_string)
1602 register char *name_string;
1603{
1604 if (name_string && *name_string)
1605 {
1606 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_name);
1607 ASM_OUTPUT_DWARF_STRING (asm_out_file, name_string);
1608 }
1609}
1610
1611inline void
1612fund_type_attribute (ft_code)
1613 register unsigned ft_code;
1614{
1615 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_fund_type);
1616 ASM_OUTPUT_DWARF_FUND_TYPE (asm_out_file, ft_code);
1617}
1618
1619static void
1620mod_fund_type_attribute (type, decl_const, decl_volatile)
1621 register tree type;
1622 register int decl_const;
1623 register int decl_volatile;
1624{
1625 char begin_label[MAX_ARTIFICIAL_LABEL_BYTES];
1626 char end_label[MAX_ARTIFICIAL_LABEL_BYTES];
1627
1628 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_mod_fund_type);
1629 sprintf (begin_label, MT_BEGIN_LABEL_FMT, current_dienum);
1630 sprintf (end_label, MT_END_LABEL_FMT, current_dienum);
1631 ASM_OUTPUT_DWARF_DELTA2 (asm_out_file, end_label, begin_label);
1632 ASM_OUTPUT_LABEL (asm_out_file, begin_label);
1633 write_modifier_bytes (type, decl_const, decl_volatile);
1634 ASM_OUTPUT_DWARF_FUND_TYPE (asm_out_file,
1635 fundamental_type_code (root_type (type)));
1636 ASM_OUTPUT_LABEL (asm_out_file, end_label);
1637}
1638
1639inline void
1640user_def_type_attribute (type)
1641 register tree type;
1642{
1643 char ud_type_name[MAX_ARTIFICIAL_LABEL_BYTES];
1644
1645 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_user_def_type);
1646 sprintf (ud_type_name, TYPE_NAME_FMT, TYPE_UID (type));
1647 ASM_OUTPUT_DWARF_REF (asm_out_file, ud_type_name);
1648}
1649
1650static void
1651mod_u_d_type_attribute (type, decl_const, decl_volatile)
1652 register tree type;
1653 register int decl_const;
1654 register int decl_volatile;
1655{
1656 char begin_label[MAX_ARTIFICIAL_LABEL_BYTES];
1657 char end_label[MAX_ARTIFICIAL_LABEL_BYTES];
1658 char ud_type_name[MAX_ARTIFICIAL_LABEL_BYTES];
1659
1660 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_mod_u_d_type);
1661 sprintf (begin_label, MT_BEGIN_LABEL_FMT, current_dienum);
1662 sprintf (end_label, MT_END_LABEL_FMT, current_dienum);
1663 ASM_OUTPUT_DWARF_DELTA2 (asm_out_file, end_label, begin_label);
1664 ASM_OUTPUT_LABEL (asm_out_file, begin_label);
1665 write_modifier_bytes (type, decl_const, decl_volatile);
1666 sprintf (ud_type_name, TYPE_NAME_FMT, TYPE_UID (root_type (type)));
1667 ASM_OUTPUT_DWARF_REF (asm_out_file, ud_type_name);
1668 ASM_OUTPUT_LABEL (asm_out_file, end_label);
1669}
1670
1671inline void
1672ordering_attribute (ordering)
1673 register unsigned ordering;
1674{
1675 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_ordering);
1676 ASM_OUTPUT_DWARF_DATA2 (asm_out_file, ordering);
1677}
1678
1679/* Note that the block of subscript information for an array type also
1680 includes information about the element type of type given array type. */
1681
1682static void
1683subscript_data_attribute (type)
1684 register tree type;
1685{
1686 register unsigned dimension_number;
1687 char begin_label[MAX_ARTIFICIAL_LABEL_BYTES];
1688 char end_label[MAX_ARTIFICIAL_LABEL_BYTES];
1689
1690 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_subscr_data);
1691 sprintf (begin_label, SS_BEGIN_LABEL_FMT, current_dienum);
1692 sprintf (end_label, SS_END_LABEL_FMT, current_dienum);
1693 ASM_OUTPUT_DWARF_DELTA2 (asm_out_file, end_label, begin_label);
1694 ASM_OUTPUT_LABEL (asm_out_file, begin_label);
1695
1696 /* The GNU compilers represent multidimensional array types as sequences
1697 of one dimensional array types whose element types are themselves array
1698 types. Here we squish that down, so that each multidimensional array
1699 type gets only one array_type DIE in the Dwarf debugging info. The
1700 draft Dwarf specification say that we are allowed to do this kind
1701 of compression in C (because there is no difference between an
1702 array or arrays and a multidimensional array in C) but for other
1703 source languages (e.g. Ada) we probably shouldn't do this. */
1704
1705 for (dimension_number = 0;
1706 TREE_CODE (type) == ARRAY_TYPE;
1707 type = TREE_TYPE (type), dimension_number++)
1708 {
1709 register tree domain = TYPE_DOMAIN (type);
1710
1711 /* Arrays come in three flavors. Unspecified bounds, fixed
1712 bounds, and (in GNU C only) variable bounds. Handle all
1713 three forms here. */
1714
1715 if (domain)
1716 {
1717 /* We have an array type with specified bounds. */
1718
1719 register tree lower = TYPE_MIN_VALUE (domain);
1720 register tree upper = TYPE_MAX_VALUE (domain);
1721
1722 /* Handle only fundamental types as index types for now. */
1723
1724 if (! type_is_fundamental (domain))
1725 abort ();
1726
1727 /* Output the representation format byte for this dimension. */
1728
1729 ASM_OUTPUT_DWARF_FMT_BYTE (asm_out_file,
1730 FMT_CODE (1,
1731 TREE_CODE (lower) == INTEGER_CST,
1732 TREE_CODE (upper) == INTEGER_CST));
1733
1734 /* Output the index type for this dimension. */
1735
1736 ASM_OUTPUT_DWARF_FUND_TYPE (asm_out_file,
1737 fundamental_type_code (domain));
1738
1739 /* Output the representation for the lower bound. */
1740
1741 output_bound_representation (lower, dimension_number, 'l');
1742
1743 /* Output the representation for the upper bound. */
1744
1745 output_bound_representation (upper, dimension_number, 'u');
1746 }
1747 else
1748 {
1749 /* We have an array type with an unspecified length. For C and
1750 C++ we can assume that this really means that (a) the index
1751 type is an integral type, and (b) the lower bound is zero.
1752 Note that Dwarf defines the representation of an unspecified
1753 (upper) bound as being a zero-length location description. */
1754
1755 /* Output the array-bounds format byte. */
1756
1757 ASM_OUTPUT_DWARF_FMT_BYTE (asm_out_file, FMT_FT_C_X);
1758
1759 /* Output the (assumed) index type. */
1760
1761 ASM_OUTPUT_DWARF_FUND_TYPE (asm_out_file, FT_integer);
1762
1763 /* Output the (assumed) lower bound (constant) value. */
1764
1765 ASM_OUTPUT_DWARF_DATA4 (asm_out_file, 0);
1766
1767 /* Output the (empty) location description for the upper bound. */
1768
1769 ASM_OUTPUT_DWARF_DATA2 (asm_out_file, 0);
1770 }
1771 }
1772
1773 /* Output the prefix byte that says that the element type is comming up. */
1774
1775 ASM_OUTPUT_DWARF_FMT_BYTE (asm_out_file, FMT_ET);
1776
1777 /* Output a representation of the type of the elements of this array type. */
1778
1779 type_attribute (type, 0, 0);
1780
1781 ASM_OUTPUT_LABEL (asm_out_file, end_label);
1782}
1783
1784static void
1785byte_size_attribute (tree_node)
1786 register tree tree_node;
1787{
1788 register unsigned size;
1789
1790 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_byte_size);
1791 switch (TREE_CODE (tree_node))
1792 {
1793 case ERROR_MARK:
1794 size = 0;
1795 break;
1796
1797 case ENUMERAL_TYPE:
1798 case RECORD_TYPE:
1799 case UNION_TYPE:
1800 size = int_size_in_bytes (tree_node);
1801 break;
1802
1803 case FIELD_DECL:
1804 {
1805 register unsigned words;
1806 register unsigned bits;
1807
1808 bits = TREE_INT_CST_LOW (DECL_SIZE (tree_node));
1809 words = (bits + (BITS_PER_WORD-1)) / BITS_PER_WORD;
1810 size = words * (BITS_PER_WORD / BITS_PER_UNIT);
1811 }
1812 break;
1813
1814 default:
1815 abort ();
1816 }
1817 ASM_OUTPUT_DWARF_DATA4 (asm_out_file, size);
1818}
1819
1820/* For a FIELD_DECL node which represents a bit field, output an attribute
1821 which specifies the distance in bits from the start of the *word*
1822 containing the given field to the first bit of the field. */
1823
1824inline void
1825bit_offset_attribute (decl)
1826 register tree decl;
1827{
1828 assert (TREE_CODE (decl) == FIELD_DECL); /* Must be a field. */
1829 assert (DECL_BIT_FIELD_TYPE (decl)); /* Must be a bit field. */
1830
1831 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_bit_offset);
1832 ASM_OUTPUT_DWARF_DATA2 (asm_out_file,
1833 BITFIELD_OFFSET_BITS (decl) % (unsigned) BITS_PER_WORD);
1834}
1835
1836/* For a FIELD_DECL node which represents a bit field, output an attribute
1837 which specifies the length in bits of the given field. */
1838
1839inline void
1840bit_size_attribute (decl)
1841 register tree decl;
1842{
1843 assert (TREE_CODE (decl) == FIELD_DECL); /* Must be a field. */
1844 assert (DECL_BIT_FIELD_TYPE (decl)); /* Must be a bit field. */
1845
1846 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_bit_size);
1847 ASM_OUTPUT_DWARF_DATA4 (asm_out_file,
1848 (unsigned) TREE_INT_CST_LOW (DECL_SIZE (decl)));
1849}
1850
1851/* The following routine outputs the `element_list' attribute for enumeration
1852 type DIEs. The element_lits attribute includes the names and values of
1853 all of the enumeration constants associated with the given enumeration
1854 type. */
1855
1856inline void
1857element_list_attribute (element)
1858 register tree element;
1859{
1860 char begin_label[MAX_ARTIFICIAL_LABEL_BYTES];
1861 char end_label[MAX_ARTIFICIAL_LABEL_BYTES];
1862
1863 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_element_list);
1864 sprintf (begin_label, EE_BEGIN_LABEL_FMT, current_dienum);
1865 sprintf (end_label, EE_END_LABEL_FMT, current_dienum);
1866 ASM_OUTPUT_DWARF_DELTA4 (asm_out_file, end_label, begin_label);
1867 ASM_OUTPUT_LABEL (asm_out_file, begin_label);
1868
1869 /* Here we output a list of value/name pairs for each enumeration constant
1870 defined for this enumeration type (as required), but we do it in REVERSE
1871 order. The order is the one required by the draft #5 Dwarf specification
1872 published by the UI/PLSIG. */
1873
1874 output_enumeral_list (element); /* Recursively output the whole list. */
1875
1876 ASM_OUTPUT_LABEL (asm_out_file, end_label);
1877}
1878
1879/* Generate an AT_stmt_list attribute. These are normally present only in
1880 DIEs with a TAG_compile_unit tag. */
1881
1882inline void
1883stmt_list_attribute (label)
1884 register char *label;
1885{
1886 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_stmt_list);
1887 /* Don't use ASM_OUTPUT_DWARF_DATA4 here. */
1888 ASM_OUTPUT_DWARF_ADDR (asm_out_file, label);
1889}
1890
1891/* Generate an AT_low_pc attribute for a label DIE, a lexical_block DIE or
1892 for a subroutine DIE. */
1893
1894inline void
1895low_pc_attribute (asm_low_label)
1896 register char *asm_low_label;
1897{
1898 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_low_pc);
1899 ASM_OUTPUT_DWARF_ADDR (asm_out_file, asm_low_label);
1900}
1901
1902/* Generate an AT_high_pc attribute for a lexical_block DIE or for a
1903 subroutine DIE. */
1904
1905inline void
1906high_pc_attribute (asm_high_label)
1907 register char *asm_high_label;
1908{
1909 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_high_pc);
1910 ASM_OUTPUT_DWARF_ADDR (asm_out_file, asm_high_label);
1911}
1912
1913/* Generate an AT_language attribute given a LANG value. These attributes
1914 are used only within TAG_compile_unit DIEs. */
1915
1916inline void
1917language_attribute (language_code)
1918 register unsigned language_code;
1919{
1920 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_language);
1921 ASM_OUTPUT_DWARF_DATA4 (asm_out_file, language_code);
1922}
1923
1924inline void
1925member_attribute (context)
1926 register tree context;
1927{
1928 char label[MAX_ARTIFICIAL_LABEL_BYTES];
1929
1930 /* Generate this attribute only for members in C++. */
1931
1932 if (context != NULL
1933 && (TREE_CODE (context) == RECORD_TYPE
1934 || TREE_CODE (context) == UNION_TYPE))
1935 {
1936 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_member);
1937 sprintf (label, TYPE_NAME_FMT, TYPE_UID (context));
1938 ASM_OUTPUT_DWARF_REF (asm_out_file, label);
1939 }
1940}
1941
1942inline void
1943string_length_attribute (upper_bound)
1944 register tree upper_bound;
1945{
1946 char begin_label[MAX_ARTIFICIAL_LABEL_BYTES];
1947 char end_label[MAX_ARTIFICIAL_LABEL_BYTES];
1948
1949 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_string_length);
1950 sprintf (begin_label, SL_BEGIN_LABEL_FMT, current_dienum);
1951 sprintf (end_label, SL_END_LABEL_FMT, current_dienum);
1952 ASM_OUTPUT_DWARF_DELTA2 (asm_out_file, end_label, begin_label);
1953 ASM_OUTPUT_LABEL (asm_out_file, begin_label);
1954 output_bound_representation (upper_bound, 0, 'u');
1955 ASM_OUTPUT_LABEL (asm_out_file, end_label);
1956}
1957
1958inline void
1959comp_dir_attribute (dirname)
1960 register char *dirname;
1961{
1962 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_comp_dir);
1963 ASM_OUTPUT_DWARF_STRING (asm_out_file, dirname);
1964}
1965
1966inline void
1967sf_names_attribute (sf_names_start_label)
1968 register char *sf_names_start_label;
1969{
1970 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_sf_names);
1971 /* Don't use ASM_OUTPUT_DWARF_DATA4 here. */
1972 ASM_OUTPUT_DWARF_ADDR (asm_out_file, sf_names_start_label);
1973}
1974
1975inline void
1976src_info_attribute (src_info_start_label)
1977 register char *src_info_start_label;
1978{
1979 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_src_info);
1980 /* Don't use ASM_OUTPUT_DWARF_DATA4 here. */
1981 ASM_OUTPUT_DWARF_ADDR (asm_out_file, src_info_start_label);
1982}
1983
1984inline void
1985mac_info_attribute (mac_info_start_label)
1986 register char *mac_info_start_label;
1987{
1988 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_mac_info);
1989 /* Don't use ASM_OUTPUT_DWARF_DATA4 here. */
1990 ASM_OUTPUT_DWARF_ADDR (asm_out_file, mac_info_start_label);
1991}
1992
1993inline void
1994prototyped_attribute (func_type)
1995 register tree func_type;
1996{
1997 if ((strcmp (language_string, "GNU C") == 0)
1998 && (TYPE_ARG_TYPES (func_type) != NULL))
1999 {
2000 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_prototyped);
2001 ASM_OUTPUT_DWARF_STRING (asm_out_file, "");
2002 }
2003}
2004
2005inline void
2006producer_attribute (producer)
2007 register char *producer;
2008{
2009 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_producer);
2010 ASM_OUTPUT_DWARF_STRING (asm_out_file, producer);
2011}
2012
2013inline void
2014inline_attribute (decl)
2015 register tree decl;
2016{
2017 if (TREE_INLINE (decl))
2018 {
2019 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_inline);
2020 ASM_OUTPUT_DWARF_STRING (asm_out_file, "");
2021 }
2022}
2023
2024inline void
2025containing_type_attribute (containing_type)
2026 register tree containing_type;
2027{
2028 char label[MAX_ARTIFICIAL_LABEL_BYTES];
2029
2030 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_containing_type);
2031 sprintf (label, TYPE_NAME_FMT, TYPE_UID (containing_type));
2032 ASM_OUTPUT_DWARF_REF (asm_out_file, label);
2033}
2034
2035/************************* end of attributes *****************************/
2036
2037/********************* utility routines for DIEs *************************/
2038
2039/* Many forms of DIEs contain a "type description" part. The following
2040 routine writes out these "type descriptor" parts. */
2041
2042static void
2043type_attribute (type, decl_const, decl_volatile)
2044 register tree type;
2045 register int decl_const;
2046 register int decl_volatile;
2047{
2048 register enum tree_code code = TREE_CODE (type);
2049 register int root_type_modified;
2050
2051 if (TREE_CODE (type) == ERROR_MARK)
2052 return;
2053
2054 /* Handle a special case. For functions whose return type is void,
2055 we generate *no* type attribute. (Note that no object may have
2056 type `void', so this only applies to function return types. */
2057
2058 if (TREE_CODE (type) == VOID_TYPE)
2059 return;
2060
2061 root_type_modified = (code == POINTER_TYPE || code == REFERENCE_TYPE
2062 || decl_const || decl_volatile
2063 || TYPE_READONLY (type) || TYPE_VOLATILE (type));
2064
2065 if (type_is_fundamental (root_type (type)))
2066 if (root_type_modified)
2067 mod_fund_type_attribute (type, decl_const, decl_volatile);
2068 else
2069 fund_type_attribute (fundamental_type_code (type));
2070 else
2071 if (root_type_modified)
2072 mod_u_d_type_attribute (type, decl_const, decl_volatile);
2073 else
2074 user_def_type_attribute (type);
2075}
2076
2077/* Given a tree pointer to a struct, class, union, or enum type node, return
2078 a pointer to the (string) tag name for the given type, or zero if the
2079 type was declared without a tag. */
2080
2081static char *
2082type_tag (type)
2083 register tree type;
2084{
2085 register char *name = 0;
2086
2087 if (TYPE_NAME (type) != 0)
2088 {
2089 register tree t = 0;
2090
2091 /* Find the IDENTIFIER_NODE for the type name. */
2092 if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE)
2093 t = TYPE_NAME (type);
2094#if 0
2095 /* The g++ front end makes the TYPE_NAME of *each* tagged type point
2096 to a TYPE_DECL node, regardless of whether or not a `typedef' was
2097 involved. This is distinctly different from what the gcc front-end
2098 does. It always makes the TYPE_NAME for each tagged type be either
2099 NULL (signifying an anonymous tagged type) or else a pointer to an
2100 IDENTIFIER_NODE. Obviously, we would like to generate correct Dwarf
2101 for both C and C++, but given this inconsistancy in the TREE
2102 representation of tagged types for C and C++ in the GNU front-ends,
2103 we cannot support both languages correctly unless we introduce some
2104 front-end specific code here, and rms objects to that, so we can
2105 only generate correct Dwarf for one of these two languages. C is
2106 more important, so for now we'll do the right thing for C and let
2107 g++ go fish. */
2108
2109 else
2110 if (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL)
2111 t = DECL_NAME (TYPE_NAME (type));
2112#endif
2113 /* Now get the name as a string, or invent one. */
2114 if (t != 0)
2115 name = IDENTIFIER_POINTER (t);
2116 }
2117
2118 return (name == 0 || *name == '\0') ? 0 : name;
2119}
2120
2121inline void
2122dienum_push ()
2123{
2124 /* Start by checking if the pending_sibling_stack needs to be expanded.
2125 If necessary, expand it. */
2126
2127 if (pending_siblings == pending_siblings_allocated)
2128 {
2129 pending_siblings_allocated += PENDING_SIBLINGS_INCREMENT;
2130 pending_sibling_stack
2131 = (unsigned *) xrealloc (pending_sibling_stack,
2132 pending_siblings_allocated * sizeof(unsigned));
2133 }
2134
2135 pending_siblings++;
2136 NEXT_DIE_NUM = next_unused_dienum++;
2137}
2138
2139/* Pop the sibling stack so that the most recently pushed DIEnum becomes the
2140 NEXT_DIE_NUM. */
2141
2142inline void
2143dienum_pop ()
2144{
2145 pending_siblings--;
2146}
2147
2148inline tree
2149member_declared_type (member)
2150 register tree member;
2151{
2152 return (DECL_BIT_FIELD_TYPE (member))
2153 ? DECL_BIT_FIELD_TYPE (member)
2154 : TREE_TYPE (member);
2155}
2156
2157/******************************* DIEs ************************************/
2158
2159/* Output routines for individual types of DIEs. */
2160
2161/* Note that every type of DIE (except a null DIE) gets a sibling. */
2162
2163static void
2164output_array_type_die (arg)
2165 register void *arg;
2166{
2167 register tree type = arg;
2168
2169 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_array_type);
2170 sibling_attribute ();
2171 equate_type_number_to_die_number (type);
2172 member_attribute (TYPE_CONTEXT (type));
2173
2174 /* I believe that we can default the array ordering. SDB will probably
2175 do the right things even if AT_ordering is not present. It's not
2176 even an issue until we start to get into multidimensional arrays
2177 anyway. If SDB is shown to do the wrong thing in those cases, then
2178 we'll have to put the AT_ordering attribute back in, but only for
2179 multidimensional array. (After all, we don't want to waste space
2180 in the .debug section now do we?) */
2181
2182#if 0
2183 ordering_attribute (ORD_row_major);
2184#endif
2185
2186 subscript_data_attribute (type);
2187}
2188
2189static void
2190output_set_type_die (arg)
2191 register void *arg;
2192{
2193 register tree type = arg;
2194
2195 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_set_type);
2196 sibling_attribute ();
2197 equate_type_number_to_die_number (type);
2198 member_attribute (TYPE_CONTEXT (type));
2199 type_attribute (TREE_TYPE (type), 0, 0);
2200}
2201
2202#if 0
2203/* Implement this when there is a GNU FORTRAN or GNU Ada front end. */
2204static void
2205output_entry_point_die (arg)
2206 register void *arg;
2207{
2208 register tree decl = arg;
2209 register tree type = TREE_TYPE (decl);
2210 register tree return_type = TREE_TYPE (type);
2211
2212 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_entry_point);
2213 sibling_attribute ();
2214 dienum_push ();
2215 if (DECL_NAME (decl))
2216 name_attribute (IDENTIFIER_POINTER (DECL_NAME (decl)));
2217 member_attribute (DECL_CONTEXT (decl));
2218 type_attribute (return_type, 0, 0);
2219}
2220#endif
2221
2222/* Output a DIE to represent an enumeration type. Note that these DIEs
2223 include all of the information about the enumeration values also.
2224 This information is encoded into the element_list attribute. */
2225
2226static void
2227output_enumeration_type_die (arg)
2228 register void *arg;
2229{
2230 register tree type = arg;
2231
2232 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_enumeration_type);
2233 sibling_attribute ();
2234 equate_type_number_to_die_number (type);
2235 name_attribute (type_tag (type));
2236 member_attribute (TYPE_CONTEXT (type));
2237
2238 /* Handle a GNU C/C++ extension, i.e. incomplete enum types. If the
2239 given enum type is incomplete, do not generate the AT_byte_size
2240 attribute or the AT_element_list attribute. */
2241
2242 if (TYPE_SIZE (type))
2243 {
2244 byte_size_attribute (type);
2245 element_list_attribute (TYPE_FIELDS (type));
2246 }
2247}
2248
2249/* Output a DIE to represent either a real live formal parameter decl or
2250 to represent just the type of some formal parameter position in some
2251 function type.
2252
2253 Note that this routine is a bit unusual because its argument may be
2254 either a PARM_DECL node or else some sort of a ..._TYPE node. If it's
2255 the formar then this function is being called to output a real live
2256 formal parameter declaration. If it's the latter, then this function
2257 is only being called to output a TAG_formal_parameter DIE to stand as
2258 a placeholder for some formal argument type of some subprogram type. */
2259
2260static void
2261output_formal_parameter_die (arg)
2262 register void *arg;
2263{
2264 register tree decl = arg;
2265 register tree type;
2266
2267 if (TREE_CODE (decl) == PARM_DECL)
2268 type = TREE_TYPE (decl);
2269 else
2270 {
2271 type = decl; /* we were called with a type, not a decl */
2272 decl = NULL;
2273 }
2274
2275 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_formal_parameter);
2276 sibling_attribute ();
2277 if (decl)
2278 {
2279 if (DECL_NAME (decl))
2280 name_attribute (IDENTIFIER_POINTER (DECL_NAME (decl)));
2281 type_attribute (type, TREE_READONLY (decl), TREE_THIS_VOLATILE (decl));
2282 location_or_const_value_attribute (decl);
2283 }
2284 else
2285 type_attribute (type, 0, 0);
2286}
2287
2288/* Output a DIE to represent a declared function (either file-scope
2289 or block-local) which has "external linkage" (according to ANSI-C). */
2290
2291static void
2292output_global_subroutine_die (arg)
2293 register void *arg;
2294{
2295 register tree decl = arg;
2296 register tree type = TREE_TYPE (decl);
2297 register tree return_type = TREE_TYPE (type);
2298
2299 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_global_subroutine);
2300 sibling_attribute ();
2301 dienum_push ();
2302 if (DECL_NAME (decl))
2303 name_attribute (IDENTIFIER_POINTER (DECL_NAME (decl)));
2304 inline_attribute (decl);
2305 prototyped_attribute (type);
2306 member_attribute (DECL_CONTEXT (decl));
2307 type_attribute (return_type, 0, 0);
2308 if (!TREE_EXTERNAL (decl))
2309 {
2310 char func_end_label[MAX_ARTIFICIAL_LABEL_BYTES];
2311
2312 low_pc_attribute (IDENTIFIER_POINTER (DECL_NAME (decl)));
2313 sprintf (func_end_label, FUNC_END_LABEL_FMT, current_funcdef_number);
2314 high_pc_attribute (func_end_label);
2315 }
2316}
2317
2318/* Output a DIE to represent a declared data object (either file-scope
2319 or block-local) which has "external linkage" (according to ANSI-C). */
2320
2321static void
2322output_global_variable_die (arg)
2323 register void *arg;
2324{
2325 register tree decl = arg;
2326 register tree type = TREE_TYPE (decl);
2327
2328 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_global_variable);
2329 sibling_attribute ();
2330 if (DECL_NAME (decl))
2331 name_attribute (IDENTIFIER_POINTER (DECL_NAME (decl)));
2332 member_attribute (DECL_CONTEXT (decl));
2333 type_attribute (type, TREE_READONLY (decl), TREE_THIS_VOLATILE (decl));
2334 if (!TREE_EXTERNAL (decl))
2335 location_or_const_value_attribute (decl);
2336}
2337
2338#if 0
2339/* TAG_inline_subroutine has been retired by the UI/PLSIG. We're
2340 now supposed to use either TAG_subroutine or TAG_global_subroutine
2341 (depending on whether or not the function in question has internal
2342 or external linkage) and we're supposed to just put in an AT_inline
2343 attribute. */
2344static void
2345output_inline_subroutine_die (arg)
2346 register void *arg;
2347{
2348 register tree decl = arg;
2349 register tree type = TREE_TYPE (decl);
2350 register tree return_type = TREE_TYPE (type);
2351
2352 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_inline_subroutine);
2353 sibling_attribute ();
2354 dienum_push ();
2355 if (DECL_NAME (decl))
2356 name_attribute (IDENTIFIER_POINTER (DECL_NAME (decl)));
2357 prototyped_attribute (type);
2358 member_attribute (DECL_CONTEXT (decl));
2359 type_attribute (return_type, 0, 0);
2360
2361 /* Note: For each inline function which gets an out-of-line body
2362 generated for it, we want to generate AT_low_pc and AT_high_pc
2363 attributes here for the function's out-of-line body.
2364
2365 Unfortunately, the decision as to whether or not to generate an
2366 out-of-line body for any given inline function may not be made
2367 until we reach the end of the containing scope for the given
2368 inline function (because only then will it be known if the
2369 function was ever even called).
2370
2371 For this reason, the output of DIEs representing file-scope inline
2372 functions gets delayed until a special post-pass which happens only
2373 after we have reached the end of the compilation unit. Because of
2374 this mechanism, we can always be sure (by the time we reach here)
2375 that TREE_ASM_WRITTEN(decl) will correctly indicate whether or not
2376 there was an out-of-line body generated for this inline function.
2377 */
2378
2379 if (!TREE_EXTERNAL (decl))
2380 {
2381 if (TREE_ASM_WRITTEN (decl))
2382 {
2383 char func_end_label[MAX_ARTIFICIAL_LABEL_BYTES];
2384
2385 low_pc_attribute (IDENTIFIER_POINTER (DECL_NAME (decl)));
2386 sprintf (func_end_label, FUNC_END_LABEL_FMT, current_funcdef_number);
2387 high_pc_attribute (func_end_label);
2388 }
2389 }
2390}
2391#endif
2392
2393static void
2394output_label_die (arg)
2395 register void *arg;
2396{
2397 register tree decl = arg;
2398 register rtx insn = DECL_RTL (decl);
2399
2400 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_label);
2401 sibling_attribute ();
2402 name_attribute (IDENTIFIER_POINTER (DECL_NAME (decl)));
2403
2404 /* When optimization is enabled (with -O) the code in jump.c and in flow.c
2405 may cause insns representing one of more of the user's own labels to
2406 be deleted. This happens whenever it is determined that a given label
2407 is unreachable.
2408
2409 In such cases, we here generate an abbreviated form of a label DIE.
2410 This abbreviated version does *not* have a low_pc attribute. This
2411 should signify to the debugger that the label has been optimized away.
2412
2413 Note that a CODE_LABEL can get deleted either by begin converted into
2414 a NOTE_INSN_DELETED note, or by simply having its INSN_DELETED_P flag
2415 set to true. We handle both cases here.
2416 */
2417
2418 if (GET_CODE (insn) == CODE_LABEL && ! INSN_DELETED_P (insn))
2419 {
2420 char label[MAX_ARTIFICIAL_LABEL_BYTES];
2421
2422 sprintf (label, INSN_LABEL_FMT, current_funcdef_number,
2423 (unsigned) INSN_UID (insn));
2424 low_pc_attribute (label);
2425 }
2426}
2427
2428static void
2429output_lexical_block_die (arg)
2430 register void *arg;
2431{
2432 register tree stmt = arg;
2433 char begin_label[MAX_ARTIFICIAL_LABEL_BYTES];
2434 char end_label[MAX_ARTIFICIAL_LABEL_BYTES];
2435
2436 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_lexical_block);
2437 sibling_attribute ();
2438 dienum_push ();
2439 sprintf (begin_label, BLOCK_BEGIN_LABEL_FMT, next_block_number);
2440 low_pc_attribute (begin_label);
2441 sprintf (end_label, BLOCK_END_LABEL_FMT, next_block_number);
2442 high_pc_attribute (end_label);
2443}
2444
2445static void
2446output_inlined_subroutine_die (arg)
2447 register void *arg;
2448{
2449 register tree stmt = arg;
2450 char begin_label[MAX_ARTIFICIAL_LABEL_BYTES];
2451 char end_label[MAX_ARTIFICIAL_LABEL_BYTES];
2452
2453 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_inlined_subroutine);
2454 sibling_attribute ();
2455 dienum_push ();
2456 sprintf (begin_label, BLOCK_BEGIN_LABEL_FMT, next_block_number);
2457 low_pc_attribute (begin_label);
2458 sprintf (end_label, BLOCK_END_LABEL_FMT, next_block_number);
2459 high_pc_attribute (end_label);
2460}
2461
2462/* Output a DIE to represent a declared data object (either file-scope
2463 or block-local) which has "internal linkage" (according to ANSI-C). */
2464
2465static void
2466output_local_variable_die (arg)
2467 register void *arg;
2468{
2469 register tree decl = arg;
2470 register tree type = TREE_TYPE (decl);
2471
2472 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_local_variable);
2473 sibling_attribute ();
2474 if (DECL_NAME (decl))
2475 name_attribute (IDENTIFIER_POINTER (DECL_NAME (decl)));
2476 member_attribute (DECL_CONTEXT (decl));
2477 type_attribute (type, TREE_READONLY (decl), TREE_THIS_VOLATILE (decl));
2478 location_or_const_value_attribute (decl);
2479}
2480
2481static void
2482output_member_die (arg)
2483 register void *arg;
2484{
2485 register tree decl = arg;
2486
2487 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_member);
2488 sibling_attribute ();
2489 if (DECL_NAME (decl))
2490 name_attribute (IDENTIFIER_POINTER (DECL_NAME (decl)));
2491 member_attribute (DECL_CONTEXT (decl));
2492 type_attribute (member_declared_type (decl),
2493 TREE_READONLY (decl), TREE_THIS_VOLATILE (decl));
2494 if (DECL_BIT_FIELD_TYPE (decl)) /* If this is a bit field... */
2495 {
2496 byte_size_attribute (decl);
2497 bit_size_attribute (decl);
2498 bit_offset_attribute (decl);
2499 }
2500 data_member_location_attribute (decl);
2501}
2502
2503#if 0
2504/* Don't generate either pointer_type DIEs or reference_type DIEs. According
2505 to the 4-4-90 Dwarf draft spec (just after requirement #47):
2506
2507 These two type entries are not currently generated by any compiler.
2508 Since the only way to name a pointer (or reference) type is C or C++
2509 is via a "typedef", an entry with the "typedef" tag is generated
2510 instead.
2511
2512 We keep this code here just in case these types of DIEs may be needed
2513 to represent certain things in other languages (e.g. Pascal) someday.
2514*/
2515
2516static void
2517output_pointer_type_die (arg)
2518 register void *arg;
2519{
2520 register tree type = arg;
2521
2522 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_pointer_type);
2523 sibling_attribute ();
2524 equate_type_number_to_die_number (type);
2525 member_attribute (TYPE_CONTEXT (type));
2526 type_attribute (TREE_TYPE (type), 0, 0);
2527}
2528
2529static void
2530output_reference_type_die (arg)
2531 register void *arg;
2532{
2533 register tree type = arg;
2534
2535 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_reference_type);
2536 sibling_attribute ();
2537 equate_type_number_to_die_number (type);
2538 member_attribute (TYPE_CONTEXT (type));
2539 type_attribute (TREE_TYPE (type), 0, 0);
2540}
2541#endif
2542
2543output_ptr_to_mbr_type_die (arg)
2544 register void *arg;
2545{
2546 register tree type = arg;
2547
2548 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_ptr_to_member_type);
2549 sibling_attribute ();
2550 equate_type_number_to_die_number (type);
2551 member_attribute (TYPE_CONTEXT (type));
2552 containing_type_attribute (TYPE_OFFSET_BASETYPE (type));
2553 type_attribute (TREE_TYPE (type), 0, 0);
2554}
2555
2556static void
2557output_compile_unit_die (arg)
2558 register void *arg;
2559{
2560 register char *main_input_filename = arg;
2561
2562 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_compile_unit);
2563 sibling_attribute ();
2564 dienum_push ();
2565 name_attribute (main_input_filename);
2566
2567 {
2568 char producer[250];
2569
2570 sprintf (producer, "%s %s", language_string, version_string);
2571 producer_attribute (producer);
2572 }
2573
2574 if (strcmp (language_string, "GNU C++") == 0)
2575 language_attribute (LANG_C_PLUS_PLUS);
2576 else if (flag_traditional)
2577 language_attribute (LANG_C);
2578 else
2579 language_attribute (LANG_C89);
2580 low_pc_attribute (TEXT_BEGIN_LABEL);
2581 high_pc_attribute (TEXT_END_LABEL);
2582 if (debug_info_level >= DINFO_LEVEL_NORMAL)
2583 stmt_list_attribute (LINE_BEGIN_LABEL);
2584 last_filename = xstrdup (main_input_filename);
2585
2586 {
2e494f70
RS
2587 char *wd = getpwd ();
2588 if (wd)
2589 comp_dir_attribute (wd);
340ccaab
TW
2590 }
2591
2592 if (debug_info_level >= DINFO_LEVEL_NORMAL)
2593 {
2594 sf_names_attribute (SFNAMES_BEGIN_LABEL);
2595 src_info_attribute (SRCINFO_BEGIN_LABEL);
2596 if (debug_info_level >= DINFO_LEVEL_VERBOSE)
2597 mac_info_attribute (MACINFO_BEGIN_LABEL);
2598 }
2599}
2600
2601static void
2602output_string_type_die (arg)
2603 register void *arg;
2604{
2605 register tree type = arg;
2606
2607 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_string_type);
2608 sibling_attribute ();
2609 member_attribute (TYPE_CONTEXT (type));
2610
2611 /* Fudge the string length attribute for now. */
2612
2613 string_length_attribute (
2614 TYPE_MAX_VALUE (TYPE_DOMAIN (type)));
2615}
2616
2617static void
2618output_structure_type_die (arg)
2619 register void *arg;
2620{
2621 register tree type = arg;
2622
2623 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_structure_type);
2624 sibling_attribute ();
2625 equate_type_number_to_die_number (type);
2626 name_attribute (type_tag (type));
2627 member_attribute (TYPE_CONTEXT (type));
2628
2629 /* If this type has been completed, then give it a byte_size attribute
2630 and prepare to give a list of members. Otherwise, don't do either of
2631 these things. In the latter case, we will not be generating a list
2632 of members (since we don't have any idea what they might be for an
2633 incomplete type). */
2634
2635 if (TYPE_SIZE (type))
2636 {
2637 dienum_push ();
2638 byte_size_attribute (type);
2639 }
2640}
2641
2642/* Output a DIE to represent a declared function (either file-scope
2643 or block-local) which has "internal linkage" (according to ANSI-C). */
2644
2645static void
2646output_local_subroutine_die (arg)
2647 register void *arg;
2648{
2649 register tree decl = arg;
2650 register tree type = TREE_TYPE (decl);
2651 register tree return_type = TREE_TYPE (type);
2652 char func_end_label[MAX_ARTIFICIAL_LABEL_BYTES];
2653
2654 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_subroutine);
2655 sibling_attribute ();
2656 dienum_push ();
2657 if (DECL_NAME (decl))
2658 name_attribute (IDENTIFIER_POINTER (DECL_NAME (decl)));
2659 inline_attribute (decl);
2660 prototyped_attribute (type);
2661 member_attribute (DECL_CONTEXT (decl));
2662 type_attribute (return_type, 0, 0);
2663
2664 /* Avoid getting screwed up in cases where a function was declared static
2665 but where no definition was ever given for it. */
2666
2667 if (TREE_ASM_WRITTEN (decl))
2668 {
2669 low_pc_attribute (IDENTIFIER_POINTER (DECL_NAME (decl)));
2670 sprintf (func_end_label, FUNC_END_LABEL_FMT, current_funcdef_number);
2671 high_pc_attribute (func_end_label);
2672 }
2673}
2674
2675static void
2676output_subroutine_type_die (arg)
2677 register void *arg;
2678{
2679 register tree type = arg;
2680 register tree return_type = TREE_TYPE (type);
2681
2682 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_subroutine_type);
2683 sibling_attribute ();
2684 dienum_push ();
2685 equate_type_number_to_die_number (type);
2686 prototyped_attribute (type);
2687 member_attribute (TYPE_CONTEXT (type));
2688 type_attribute (return_type, 0, 0);
2689}
2690
2691static void
2692output_typedef_die (arg)
2693 register void *arg;
2694{
2695 register tree decl = arg;
2696 register tree type = TREE_TYPE (decl);
2697
2698 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_typedef);
2699 sibling_attribute ();
2700 if (DECL_NAME (decl))
2701 name_attribute (IDENTIFIER_POINTER (DECL_NAME (decl)));
2702 member_attribute (DECL_CONTEXT (decl));
2703 type_attribute (type, TREE_READONLY (decl), TREE_THIS_VOLATILE (decl));
2704}
2705
2706static void
2707output_union_type_die (arg)
2708 register void *arg;
2709{
2710 register tree type = arg;
2711
2712 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_union_type);
2713 sibling_attribute ();
2714 equate_type_number_to_die_number (type);
2715 name_attribute (type_tag (type));
2716 member_attribute (TYPE_CONTEXT (type));
2717
2718 /* If this type has been completed, then give it a byte_size attribute
2719 and prepare to give a list of members. Otherwise, don't do either of
2720 these things. In the latter case, we will not be generating a list
2721 of members (since we don't have any idea what they might be for an
2722 incomplete type). */
2723
2724 if (TYPE_SIZE (type))
2725 {
2726 dienum_push ();
2727 byte_size_attribute (type);
2728 }
2729}
2730
2731/* Generate a special type of DIE used as a stand-in for a trailing ellipsis
2732 at the end of an (ANSI prototyped) formal parameters list. */
2733
2734static void
2735output_unspecified_parameters_die (arg)
2736 register void *arg;
2737{
2738 register tree decl_or_type = arg;
2739
2740 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_unspecified_parameters);
2741 sibling_attribute ();
2742
2743 /* This kludge is here only for the sake of being compatible with what
2744 the USL CI5 C compiler does. The specification of Dwarf Version 1
2745 doesn't say that TAG_unspecified_parameters DIEs should contain any
2746 attributes other than the AT_sibling attribute, but they are certainly
2747 allowed to contain additional attributes, and the CI5 compiler
2748 generates AT_name, AT_fund_type, and AT_location attributes within
2749 TAG_unspecified_parameters DIEs which appear in the child lists for
2750 DIEs representing function definitions, so we do likewise here. */
2751
2752 if (TREE_CODE (decl_or_type) == FUNCTION_DECL && DECL_INITIAL (decl_or_type))
2753 {
2754 name_attribute ("...");
2755 fund_type_attribute (FT_pointer);
2756 /* location_attribute (?); */
2757 }
2758}
2759
2760static void
2761output_padded_null_die (arg)
2762 register void *arg;
2763{
2764 ASM_OUTPUT_ALIGN (asm_out_file, 2); /* 2**2 == 4 */
2765}
2766
2767/*************************** end of DIEs *********************************/
2768
2769/* Generate some type of DIE. This routine generates the generic outer
2770 wrapper stuff which goes around all types of DIE's (regardless of their
2771 TAGs. All forms of DIEs start with a DIE-specific label, followed by a
2772 DIE-length word, followed by the guts of the DIE itself. After the guts
2773 of the DIE, there must always be a terminator label for the DIE. */
2774
2775static void
2776output_die (die_specific_output_function, param)
2777 register void (*die_specific_output_function)();
2778 register void *param;
2779{
2780 char begin_label[MAX_ARTIFICIAL_LABEL_BYTES];
2781 char end_label[MAX_ARTIFICIAL_LABEL_BYTES];
2782
2783 current_dienum = NEXT_DIE_NUM;
2784 NEXT_DIE_NUM = next_unused_dienum;
2785
2786 sprintf (begin_label, DIE_BEGIN_LABEL_FMT, current_dienum);
2787 sprintf (end_label, DIE_END_LABEL_FMT, current_dienum);
2788
2789 /* Write a label which will act as the name for the start of this DIE. */
2790
2791 ASM_OUTPUT_LABEL (asm_out_file, begin_label);
2792
2793 /* Write the DIE-length word. */
2794
2795 ASM_OUTPUT_DWARF_DELTA4 (asm_out_file, end_label, begin_label);
2796
2797 /* Fill in the guts of the DIE. */
2798
2799 next_unused_dienum++;
2800 die_specific_output_function (param);
2801
2802 /* Write a label which will act as the name for the end of this DIE. */
2803
2804 ASM_OUTPUT_LABEL (asm_out_file, end_label);
2805}
2806
2807static void
2808end_sibling_chain ()
2809{
2810 char begin_label[MAX_ARTIFICIAL_LABEL_BYTES];
2811
2812 current_dienum = NEXT_DIE_NUM;
2813 NEXT_DIE_NUM = next_unused_dienum;
2814
2815 sprintf (begin_label, DIE_BEGIN_LABEL_FMT, current_dienum);
2816
2817 /* Write a label which will act as the name for the start of this DIE. */
2818
2819 ASM_OUTPUT_LABEL (asm_out_file, begin_label);
2820
2821 /* Write the DIE-length word. */
2822
2823 ASM_OUTPUT_DWARF_DATA4 (asm_out_file, 4);
2824
2825 dienum_pop ();
2826}
2827\f
2828/* Generate a list of nameless TAG_formal_parameter DIEs (and perhaps a
2829 TAG_unspecified_parameters DIE) to represent the types of the formal
2830 parameters as specified in some function type specification (except
2831 for those which appear as part of a function *definition*).
2832
2833 Note that we must be careful here to output all of the parameter DIEs
2834 *before* we output any DIEs needed to represent the types of the formal
2835 parameters. This keeps svr4 SDB happy because it (incorrectly) thinks
2836 that the first non-parameter DIE it sees ends the formal parameter list.
2837*/
2838
2839static void
2840output_formal_types (function_or_method_type)
2841 register tree function_or_method_type;
2842{
2843 register tree link;
2844 register tree formal_type;
2845 register tree first_parm_type = TYPE_ARG_TYPES (function_or_method_type);
2846
2847 /* In the case where we are generating a formal types list for a C++
2848 non-static member function type, skip over the first thing on the
2849 TYPE_ARG_TYPES list because it only represents the type of the
2850 hidden `this pointer'. The debugger should be able to figure
2851 out (without being explicitly told) that this non-static member
2852 function type takes a `this pointer' and should be able to figure
2853 what the type of that hidden parameter is from the AT_member
2854 attribute of the parent TAG_subroutine_type DIE. */
2855
2856 if (TREE_CODE (function_or_method_type) == METHOD_TYPE)
2857 first_parm_type = TREE_CHAIN (first_parm_type);
2858
2859 /* Make our first pass over the list of formal parameter types and output
2860 a TAG_formal_parameter DIE for each one. */
2861
2862 for (link = first_parm_type; link; link = TREE_CHAIN (link))
2863 {
2864 formal_type = TREE_VALUE (link);
2865 if (formal_type == void_type_node)
2866 break;
2867
2868 /* Output a (nameless) DIE to represent the formal parameter itself. */
2869
2870 output_die (output_formal_parameter_die, formal_type);
2871 }
2872
2873 /* If this function type has an ellipsis, add a TAG_unspecified_parameters
2874 DIE to the end of the parameter list. */
2875
2876 if (formal_type != void_type_node)
2877 output_die (output_unspecified_parameters_die, function_or_method_type);
2878
2879 /* Make our second (and final) pass over the list of formal parameter types
2880 and output DIEs to represent those types (as necessary). */
2881
2882 for (link = TYPE_ARG_TYPES (function_or_method_type);
2883 link;
2884 link = TREE_CHAIN (link))
2885 {
2886 formal_type = TREE_VALUE (link);
2887 if (formal_type == void_type_node)
2888 break;
2889
2890 output_type (formal_type, function_or_method_type);
2891 }
2892}
2893\f
2894/* Remember a type in the pending_types_list. */
2895
2896static void
2897pend_type (type)
2898 register tree type;
2899{
2900 if (pending_types == pending_types_allocated)
2901 {
2902 pending_types_allocated += PENDING_TYPES_INCREMENT;
2903 pending_types_list
2904 = (tree *) xrealloc (pending_types_list,
2905 sizeof (tree) * pending_types_allocated);
2906 }
2907 pending_types_list[pending_types++] = type;
2908
2909 /* Mark the pending type as having been output already (even though
2910 it hasn't been). This prevents the type from being added to the
2911 pending_types_list more than once. */
2912
2913 TREE_ASM_WRITTEN (type) = 1;
2914}
2915
2916/* Return non-zero if it is legitimate to output DIEs to represent a
2917 given type while we are generating the list of child DIEs for some
2918 DIE associated with a given scope.
2919
2920 This function returns non-zero if *either* of the following two conditions
2921 is satisfied:
2922
2923 o the type actually belongs to the given scope (as evidenced
2924 by its TYPE_CONTEXT value), or
2925
2926 o the type is anonymous, and the `scope' in question is *not*
2927 a RECORD_TYPE or UNION_TYPE.
2928
2929 In theory, we should be able to generate DIEs for anonymous types
2930 *anywhere* (since the scope of an anonymous type is irrelevant)
2931 however svr4 SDB doesn't want to see other type DIEs within the
2932 lists of child DIEs for a TAG_structure_type or TAG_union_type DIE.
2933
2934 Note that TYPE_CONTEXT(type) may be NULL (to indicate global scope)
2935 or it may point to a BLOCK node (for types local to a block), or to a
2936 FUNCTION_DECL node (for types local to the heading of some function
2937 definition), or to a FUNCTION_TYPE node (for types local to the
2938 prototyped parameter list of a function type specification), or to a
2939 RECORD_TYPE or UNION_TYPE node (in the case of C++ nested types).
2940
2941 The `scope' parameter should likewise be NULL or should point to a
2942 BLOCK node, a FUNCTION_DECL node, a FUNCTION_TYPE node, a RECORD_TYPE
2943 node, or a UNION_TYPE node.
2944
2945 This function is used only for deciding when to "pend" and when to
2946 "un-pend" types to/from the pending_types_list.
2947
2948 Note that we sometimes make use of this "type pending" feature in a
2949 rather twisted way to temporarily delay the production of DIEs for the
2950 types of formal parameters. (We do this just to make svr4 SDB happy.)
2951 It order to delay the production of DIEs representing types of formal
2952 parameters, callers of this function supply `fake_containing_scope' as
2953 the `scope' parameter to this function. Given that fake_containing_scope
2954 is *not* the containing scope for *any* other type, the desired effect
2955 is achieved, i.e. output of DIEs representing types is temporarily
2956 suspended, and any type DIEs which would have been output otherwise
2957 are instead placed onto the pending_types_list. Later on, we can force
2958 these (temporarily pended) types to be output simply by calling
2959 `output_pending_types_for_scope' with an actual argument equal to the
2960 true scope of the types we temporarily pended.
2961*/
2962
2963static int
2964type_ok_for_scope (type, scope)
2965 register tree type;
2966 register tree scope;
2967{
2968 return (TYPE_CONTEXT (type) == scope
2969 || (TYPE_NAME (type) == NULL
2970 && TREE_CODE (scope) != RECORD_TYPE
2971 && TREE_CODE (scope) != UNION_TYPE));
2972}
2973
2974/* Output any pending types (from the pending_types list) which we can output
2975 now (given the limitations of the scope that we are working on now).
2976
2977 For each type output, remove the given type from the pending_types_list
2978 *before* we try to output it.
2979
2980 Note that we have to process the list in beginning-to-end order,
2981 because the call made here to output_type may cause yet more types
2982 to be added to the end of the list, and we may have to output some
2983 of them too.
2984*/
2985
2986static void
2987output_pending_types_for_scope (containing_scope)
2988 register tree containing_scope;
2989{
2990 register unsigned i;
2991
2992 for (i = 0; i < pending_types; )
2993 {
2994 register tree type = pending_types_list[i];
2995
2996 if (type_ok_for_scope (type, containing_scope))
2997 {
2998 register tree *mover;
2999 register tree *limit;
3000
3001 pending_types--;
3002 limit = &pending_types_list[pending_types];
3003 for (mover = &pending_types_list[i]; mover < limit; mover++)
3004 *mover = *(mover+1);
3005
3006 /* Un-mark the type as having been output already (because it
3007 hasn't been, really). Then call output_type to generate a
3008 Dwarf representation of it. */
3009
3010 TREE_ASM_WRITTEN (type) = 0;
3011 output_type (type, containing_scope);
3012
3013 /* Don't increment the loop counter in this case because we
3014 have shifted all of the subsequent pending types down one
3015 element in the pending_types_list array. */
3016 }
3017 else
3018 i++;
3019 }
3020}
3021
3022static void
3023output_type (type, containing_scope)
3024 register tree type;
3025 register tree containing_scope;
3026{
3027 if (type == 0 || type == error_mark_node)
3028 return;
3029
3030 /* We are going to output a DIE to represent the unqualified version of
3031 of this type (i.e. without any const or volatile qualifiers) so get
3032 the main variant (i.e. the unqualified version) of this type now. */
3033
3034 type = TYPE_MAIN_VARIANT (type);
3035
3036 if (TREE_ASM_WRITTEN (type))
3037 return;
3038
3039 /* Don't generate any DIEs for this type now unless it is OK to do so
3040 (based upon what `type_ok_for_scope' tells us). */
3041
3042 if (! type_ok_for_scope (type, containing_scope))
3043 {
3044 pend_type (type);
3045 return;
3046 }
3047
3048 switch (TREE_CODE (type))
3049 {
3050 case ERROR_MARK:
3051 break;
3052
3053 case POINTER_TYPE:
3054 case REFERENCE_TYPE:
3055 /* For these types, all that is required is that we output a DIE
3056 (or a set of DIEs) to represent that "basis" type. */
3057 output_type (TREE_TYPE (type), containing_scope);
3058 break;
3059
3060 case OFFSET_TYPE:
3061 /* This code is used for C++ pointer-to-data-member types. */
3062 /* Output a description of the relevant class type. */
3063 output_type (TYPE_OFFSET_BASETYPE (type), containing_scope);
3064 /* Output a description of the type of the object pointed to. */
3065 output_type (TREE_TYPE (type), containing_scope);
3066 /* Now output a DIE to represent this pointer-to-data-member type
3067 itself. */
3068 output_die (output_ptr_to_mbr_type_die, type);
3069 break;
3070
3071 case SET_TYPE:
3072 output_type (TREE_TYPE (type), containing_scope);
3073 output_die (output_set_type_die, type);
3074 break;
3075
3076 case FILE_TYPE:
3077 output_type (TREE_TYPE (type), containing_scope);
3078 abort (); /* No way to reprsent these in Dwarf yet! */
3079 break;
3080
3081 case STRING_TYPE:
3082 output_type (TREE_TYPE (type), containing_scope);
3083 output_die (output_string_type_die, type);
3084 break;
3085
3086 case FUNCTION_TYPE:
3087 /* Force out return type (in case it wasn't forced out already). */
3088 output_type (TREE_TYPE (type), containing_scope);
3089 output_die (output_subroutine_type_die, type);
3090 output_formal_types (type);
3091 end_sibling_chain ();
3092 break;
3093
3094 case METHOD_TYPE:
3095 /* Force out return type (in case it wasn't forced out already). */
3096 output_type (TREE_TYPE (type), containing_scope);
3097 output_die (output_subroutine_type_die, type);
3098 output_formal_types (type);
3099 end_sibling_chain ();
3100 break;
3101
3102 case ARRAY_TYPE:
3103 {
3104 register tree element_type;
3105
3106 element_type = TREE_TYPE (type);
3107 while (TREE_CODE (element_type) == ARRAY_TYPE)
3108 element_type = TREE_TYPE (element_type);
3109
3110 output_type (element_type, containing_scope);
3111 output_die (output_array_type_die, type);
3112 }
3113 break;
3114
3115 case ENUMERAL_TYPE:
3116 case RECORD_TYPE:
3117 case UNION_TYPE:
3118
3119 /* For a non-file-scope tagged type, we can always go ahead and
3120 output a Dwarf description of this type right now, even if
3121 the type in question is still incomplete, because if this
3122 local type *was* ever completed anywhere within its scope,
3123 that complete definition would already have been attached to
3124 this RECORD_TYPE, UNION_TYPE or ENUMERAL_TYPE node by the
3125 time we reach this point. That's true because of the way the
3126 front-end does its processing of file-scope declarations (of
3127 functions and class types) within which other types might be
3128 nested. The C and C++ front-ends always gobble up such "local
3129 scope" things en-mass before they try to output *any* debugging
3130 information for any of the stuff contained inside them and thus,
3131 we get the benefit here of what is (in effect) a pre-resolution
3132 of forward references to tagged types in local scopes.
3133
3134 Note however that for file-scope tagged types we cannot assume
3135 that such pre-resolution of forward references has taken place.
3136 A given file-scope tagged type may appear to be incomplete when
3137 we reach this point, but it may yet be given a full definition
3138 (at file-scope) later on during compilation. In order to avoid
3139 generating a premature (and possibly incorrect) set of Dwarf
3140 DIEs for such (as yet incomplete) file-scope tagged types, we
3141 generate nothing at all for as-yet incomplete file-scope tagged
3142 types here unless we are making our special "finalization" pass
3143 for file-scope things at the very end of compilation. At that
3144 time, we will certainly know as much about each file-scope tagged
3145 type as we are ever going to know, so at that point in time, we
3146 can safely generate correct Dwarf descriptions for these file-
3147 scope tagged types.
3148 */
3149
3150 if (TYPE_SIZE (type) == 0 && TYPE_CONTEXT (type) == NULL && !finalizing)
3151 return; /* EARLY EXIT! Avoid setting TREE_ASM_WRITTEN. */
3152
3153 /* Prevent infinite recursion in cases where the type of some
3154 member of this type is expressed in terms of this type itself. */
3155
3156 TREE_ASM_WRITTEN (type) = 1;
3157
3158 /* Output a DIE to represent the tagged type itself. */
3159
3160 switch (TREE_CODE (type))
3161 {
3162 case ENUMERAL_TYPE:
3163 output_die (output_enumeration_type_die, type);
3164 return; /* a special case -- nothing left to do so just return */
3165
3166 case RECORD_TYPE:
3167 output_die (output_structure_type_die, type);
3168 break;
3169
3170 case UNION_TYPE:
3171 output_die (output_union_type_die, type);
3172 break;
3173 }
3174
3175 /* If this is not an incomplete type, output descriptions of
3176 each of its members.
3177
3178 Note that as we output the DIEs necessary to represent the
3179 members of this record or union type, we will also be trying
3180 to output DIEs to represent the *types* of those members.
3181 However the `output_type' function (above) will specifically
3182 avoid generating type DIEs for member types *within* the list
3183 of member DIEs for this (containing) type execpt for those
3184 types (of members) which are explicitly marked as also being
3185 members of this (containing) type themselves. The g++ front-
3186 end can force any given type to be treated as a member of some
3187 other (containing) type by setting the TYPE_CONTEXT of the
3188 given (member) type to point to the TREE node representing the
3189 appropriate (containing) type.
3190 */
3191
3192 if (TYPE_SIZE (type))
3193 {
3194 register tree member;
3195
3196 /* First output info about the data members and type members. */
3197
3198 for (member = TYPE_FIELDS (type);
3199 member;
3200 member = TREE_CHAIN (member))
3201 output_decl (member, type);
3202
3203 /* Now output info about the function members (if any). */
3204
3205 if (TYPE_METHODS (type))
3206 for (member = TREE_VEC_ELT (TYPE_METHODS (type), 0);
3207 member;
3208 member = TREE_CHAIN (member))
3209 output_decl (member, type);
3210
3211 end_sibling_chain (); /* Terminate member chain. */
3212 }
3213
3214 break;
3215
3216 case VOID_TYPE:
3217 case INTEGER_TYPE:
3218 case REAL_TYPE:
3219 case COMPLEX_TYPE:
3220 case BOOLEAN_TYPE:
3221 case CHAR_TYPE:
3222 break; /* No DIEs needed for fundamental types. */
3223
3224 case LANG_TYPE: /* No Dwarf representation currently defined. */
3225 break;
3226
3227 default:
3228 abort ();
3229 }
3230
3231 TREE_ASM_WRITTEN (type) = 1;
3232}
3233\f
3234/* Output a TAG_lexical_block DIE followed by DIEs to represent all of
3235 the things which are local to the given block. */
3236
3237static void
3238output_block (stmt)
3239 register tree stmt;
3240{
3241 register int have_significant_locals = 0;
3242
3243 /* Ignore blocks never really used to make RTL. */
3244
3245 if (! stmt || ! TREE_USED (stmt))
3246 return;
3247
3248 /* Determine if this block contains any "significant" local declarations
3249 which we need to output DIEs for. */
3250
3251 if (BLOCK_INLINE_FUNCTION (stmt))
3252 /* The outer scopes for inlinings *must* always be represented. */
3253 have_significant_locals = 1;
3254 else
3255 if (debug_info_level > DINFO_LEVEL_TERSE)
3256 have_significant_locals = (BLOCK_VARS (stmt) != NULL);
3257 else
3258 {
3259 register tree decl;
3260
3261 for (decl = BLOCK_VARS (stmt); decl; decl = TREE_CHAIN (decl))
3262 if (TREE_CODE (decl) == FUNCTION_DECL && DECL_INITIAL (decl))
3263 {
3264 have_significant_locals = 1;
3265 break;
3266 }
3267 }
3268
3269 /* It would be a waste of space to generate a Dwarf TAG_lexical_block
3270 DIE for any block which contains no significant local declarations
3271 at all. Rather, in such cases we just call `output_decls_for_scope'
3272 so that any needed Dwarf info for any sub-blocks will get properly
3273 generated. Note that in terse mode, our definition of what constitutes
3274 a "significant" local declaration gets restricted to include only
3275 inlined function instances and local (nested) function definitions. */
3276
3277 if (have_significant_locals)
3278 {
3279 output_die (BLOCK_INLINE_FUNCTION (stmt)
3280 ? output_inlined_subroutine_die
3281 : output_lexical_block_die,
3282 stmt);
3283 output_decls_for_scope (stmt);
3284 end_sibling_chain ();
3285 }
3286 else
3287 output_decls_for_scope (stmt);
3288}
3289
3290/* Output all of the decls declared within a given scope (also called
3291 a `binding contour') and (recursively) all of it's sub-blocks. */
3292
3293static void
3294output_decls_for_scope (stmt)
3295 register tree stmt;
3296{
3297 /* Ignore blocks never really used to make RTL. */
3298
3299 if (! stmt || ! TREE_USED (stmt))
3300 return;
3301
3302 next_block_number++;
3303
3304 /* Output the DIEs to represent all of the data objects, functions,
3305 typedefs, and tagged types declared directly within this block
3306 but not within any nested sub-blocks. */
3307
3308 {
3309 register tree decl;
3310
3311 for (decl = BLOCK_VARS (stmt); decl; decl = TREE_CHAIN (decl))
3312 output_decl (decl, stmt);
3313 }
3314
3315 output_pending_types_for_scope (stmt);
3316
3317 /* Output the DIEs to represent all sub-blocks (and the items declared
3318 therein) of this block. */
3319
3320 {
3321 register tree subblocks;
3322
3323 for (subblocks = BLOCK_SUBBLOCKS (stmt);
3324 subblocks;
3325 subblocks = BLOCK_CHAIN (subblocks))
3326 output_block (subblocks);
3327 }
3328}
3329
3330/* Output Dwarf .debug information for a decl described by DECL. */
3331
3332static void
3333output_decl (decl, containing_scope)
3334 register tree decl;
3335 register tree containing_scope;
3336{
3337 switch (TREE_CODE (decl))
3338 {
3339 case ERROR_MARK:
3340 break;
3341
3342 case CONST_DECL:
3343 /* The individual enumerators of an enum type get output when we
3344 output the Dwarf representation of the relevant enum type itself. */
3345 break;
3346
3347 case FUNCTION_DECL:
3348 /* If we are in terse mode, don't output any DIEs to represent
3349 mere external function declarations. */
3350
3351 if (TREE_EXTERNAL (decl) && debug_info_level <= DINFO_LEVEL_TERSE)
3352 break;
3353
3354 /* Before we describe the FUNCTION_DECL itself, make sure that we
3355 have described its return type. */
3356
3357 output_type (TREE_TYPE (TREE_TYPE (decl)), containing_scope);
3358
3359 /* If the following DIE will represent a function definition for a
3360 function with "extern" linkage, output a special "pubnames" DIE
3361 label just ahead of the actual DIE. A reference to this label
3362 was already generated in the .debug_pubnames section sub-entry
3363 for this function definition. */
3364
3365 if (TREE_PUBLIC (decl))
3366 {
3367 char label[MAX_ARTIFICIAL_LABEL_BYTES];
3368
3369 sprintf (label, PUB_DIE_LABEL_FMT, next_pubname_number++);
3370 ASM_OUTPUT_LABEL (asm_out_file, label);
3371 }
3372
3373 /* Now output a DIE to represent the function itself. */
3374
3375 output_die (TREE_PUBLIC (decl) || TREE_EXTERNAL (decl)
3376 ? output_global_subroutine_die
3377 : output_local_subroutine_die,
3378 decl);
3379
3380 /* Now output descriptions of the arguments for this function.
3381 This gets (unnecessarily?) complex because of the fact that
3382 the DECL_ARGUMENT list for a FUNCTION_DECL doesn't indicate
3383 cases where there was a trailing `...' at the end of the formal
3384 parameter list. In order to find out if there was a trailing
3385 ellipsis or not, we must instead look at the type associated
3386 with the FUNCTION_DECL. This will be a node of type FUNCTION_TYPE.
3387 If the chain of type nodes hanging off of this FUNCTION_TYPE node
3388 ends with a void_type_node then there should *not* be an ellipsis
3389 at the end. */
3390
3391 /* In the case where we are describing an external function, all
3392 we need to do here (and all we *can* do here) is to describe
3393 the *types* of its formal parameters. */
3394
3395 if (TREE_EXTERNAL (decl))
3396 output_formal_types (TREE_TYPE (decl));
3397 else
3398 {
3399 register tree arg_decls = DECL_ARGUMENTS (decl);
3400
3401 /* In the case where the FUNCTION_DECL represents a C++ non-static
3402 member function, skip over the first thing on the DECL_ARGUMENTS
3403 chain. It only represents the hidden `this pointer' parameter
3404 and the debugger should know implicitly that non-static member
3405 functions have such a thing, and should be able to figure out
3406 exactly what the type of each `this pointer' is (from the
3407 AT_member attribute of the parent TAG_subroutine DIE) without
3408 being explicitly told. */
3409
3410 if (TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE)
3411 arg_decls = TREE_CHAIN (arg_decls);
3412
3413 {
3414 register tree last_arg;
3415
3416 last_arg = (arg_decls && TREE_CODE (arg_decls) != ERROR_MARK)
3417 ? tree_last (arg_decls)
3418 : NULL;
3419
3420 /* Generate DIEs to represent all known formal parameters, but
3421 don't do it if this looks like a varargs function. A given
3422 function is considered to be a varargs function if (and only
3423 if) its last named argument is named `__builtin_va_alist'. */
3424
3425 if (! last_arg
3426 || ! DECL_NAME (last_arg)
3427 || strcmp (IDENTIFIER_POINTER (DECL_NAME (last_arg)),
3428 "__builtin_va_alist"))
3429 {
3430 register tree parm;
3431
3432 /* WARNING! Kludge zone ahead! Here we have a special
2e494f70 3433 hack for svr4 SDB compatibility. Instead of passing the
340ccaab
TW
3434 current FUNCTION_DECL node as the second parameter (i.e.
3435 the `containing_scope' parameter) to `output_decl' (as
3436 we ought to) we instead pass a pointer to our own private
3437 fake_containing_scope node. That node is a RECORD_TYPE
3438 node which NO OTHER TYPE may ever actually be a member of.
3439
3440 This pointer will ultimately get passed into `output_type'
3441 as its `containing_scope' parameter. `Output_type' will
3442 then perform its part in the hack... i.e. it will pend
3443 the type of the formal parameter onto the pending_types
3444 list. Later on, when we are done generating the whole
3445 sequence of formal parameter DIEs for this function
3446 definition, we will un-pend all previously pended types
3447 of formal parameters for this function definition.
3448
3449 This whole kludge prevents any type DIEs from being
3450 mixed in with the formal parameter DIEs. That's good
3451 because svr4 SDB believes that the list of formal
3452 parameter DIEs for a function ends wherever the first
3453 non-formal-parameter DIE appears. Thus, we have to
3454 keep the formal parameter DIEs segregated. They must
3455 all appear (consecutively) at the start of the list of
3456 children for the DIE representing the function definition.
3457 Then (and only then) may we output any additional DIEs
3458 needed to represent the types of these formal parameters.
3459 */
3460
3461 for (parm = arg_decls; parm; parm = TREE_CHAIN (parm))
3462 if (TREE_CODE (parm) == PARM_DECL)
3463 output_decl (parm, fake_containing_scope);
3464
3465 /* Now that we have finished generating all of the DIEs to
3466 represent the formal parameters themselves, force out
3467 any DIEs needed to represent their types. We do this
3468 simply by un-pending all previously pended types which
3469 can legitimately go into the chain of children DIEs for
3470 the current FUNCTION_DECL. */
3471
3472 output_pending_types_for_scope (decl);
3473 }
3474 }
3475
3476 /* Now try to decide if we should put an ellipsis at the end. */
3477
3478 {
3479 register int has_ellipsis = TRUE; /* default assumption */
3480 register tree fn_arg_types = TYPE_ARG_TYPES (TREE_TYPE (decl));
3481
3482 if (fn_arg_types)
3483 {
3484 /* This function declaration/definition was prototyped. */
3485
3486 /* If the list of formal argument types ends with a
3487 void_type_node, then the formals list did *not* end
3488 with an ellipsis. */
3489
3490 if (TREE_VALUE (tree_last (fn_arg_types)) == void_type_node)
3491 has_ellipsis = FALSE;
3492 }
3493 else
3494 {
3495 /* This function declaration/definition was not prototyped. */
3496
3497 /* Note that all non-prototyped function *declarations* are
3498 assumed to represent varargs functions (until proven
3499 otherwise). */
3500
3501 if (DECL_INITIAL (decl)) /* if this is a func definition */
3502 {
3503 if (!arg_decls)
3504 has_ellipsis = FALSE; /* no args == (void) */
3505 else
3506 {
3507 /* For a non-prototyped function definition which
3508 declares one or more formal parameters, if the name
3509 of the first formal parameter is *not*
3510 __builtin_va_alist then we must assume that this
3511 is *not* a varargs function. */
3512
3513 if (DECL_NAME (arg_decls)
3514 && strcmp (IDENTIFIER_POINTER (DECL_NAME (arg_decls)),
3515 "__builtin_va_alist"))
3516 has_ellipsis = FALSE;
3517 }
3518 }
3519 }
3520
3521 if (has_ellipsis)
3522 output_die (output_unspecified_parameters_die, decl);
3523 }
3524 }
3525
3526 /* Output Dwarf info for all of the stuff within the body of the
3527 function (if it has one - it may be just a declaration). */
3528
3529 {
3530 register tree outer_scope = DECL_INITIAL (decl);
3531
3532 if (outer_scope && TREE_CODE (outer_scope) != ERROR_MARK)
3533 {
3534 /* Note that here, `outer_scope' is a pointer to the outermost
3535 BLOCK node created to represent the body of a function.
3536 This outermost BLOCK actually represents the outermost
3537 binding contour for the function, i.e. the contour in which
3538 the function's formal parameters get declared. Just within
3539 this contour, there will be another (nested) BLOCK which
3540 represents the function's outermost block. We don't want
3541 to generate a lexical_block DIE to represent the outermost
3542 block of a function body, because that is not really an
3543 independent scope according to ANSI C rules. Rather, it is
3544 the same scope in which the parameters were declared and
3545 for Dwarf, we do not generate a TAG_lexical_block DIE for
3546 that scope. We must however see to it that the LABEL_DECLs
3547 associated with `outer_scope' get DIEs generated for them. */
3548
3549 {
3550 register tree label;
3551
3552 for (label = BLOCK_VARS (outer_scope);
3553 label;
3554 label = TREE_CHAIN (label))
3555 output_decl (label, outer_scope);
3556 }
3557
3558 output_decls_for_scope (BLOCK_SUBBLOCKS (outer_scope));
3559
3560 /* Finally, force out any pending types which are local to the
3561 outermost block of this function definition. These will
3562 all have a TYPE_CONTEXT which points to the FUNCTION_DECL
3563 node itself. */
3564
3565 output_pending_types_for_scope (decl);
3566 }
3567 }
3568
3569 /* Generate a terminator for the list of stuff `owned' by this
3570 function. */
3571
3572 end_sibling_chain ();
3573
3574 break;
3575
3576 case TYPE_DECL:
3577 /* If we are in terse mode, don't generate any DIEs to represent
3578 any actual typedefs. Note that even when we are in terse mode,
3579 we must still output DIEs to represent those tagged types which
3580 are used (directly or indirectly) in the specification of either
3581 a return type or a formal parameter type of some function. */
3582
3583 if (debug_info_level <= DINFO_LEVEL_TERSE)
3584 if (DECL_NAME (decl) != NULL
3585 || ! TYPE_USED_FOR_FUNCTION (TREE_TYPE (decl)))
3586 return;
3587
3588 output_type (TREE_TYPE (decl), containing_scope);
3589
3590 /* Note that unlike the gcc front end (which generates a NULL named
3591 TYPE_DECL node for each complete tagged type, each array type,
3592 and each function type node created) the g++ front end generates
3593 a *named* TYPE_DECL node for each tagged type node created.
3594 Unfortunately, these g++ TYPE_DECL nodes cause us to output many
3595 superfluous and unnecessary TAG_typedef DIEs here. When g++ is
3596 fixed to stop generating these superfluous named TYPE_DECL nodes,
3597 the superfluous TAG_typedef DIEs will likewise cease. */
3598
3599 if (DECL_NAME (decl))
3600 /* Output a DIE to represent the typedef itself. */
3601 output_die (output_typedef_die, decl);
3602 break;
3603
3604 case LABEL_DECL:
3605 if (debug_info_level >= DINFO_LEVEL_NORMAL)
3606 output_die (output_label_die, decl);
3607 break;
3608
3609 case VAR_DECL:
3610 /* If we are in terse mode, don't generate any DIEs to represent
3611 any variable declarations or definitions. */
3612
3613 if (debug_info_level <= DINFO_LEVEL_TERSE)
3614 break;
3615
3616 /* Output any DIEs that are needed to specify the type of this data
3617 object. */
3618
3619 output_type (TREE_TYPE (decl), containing_scope);
3620
3621 /* If the following DIE will represent a data object definition for a
3622 data object with "extern" linkage, output a special "pubnames" DIE
3623 label just ahead of the actual DIE. A reference to this label
3624 was already generated in the .debug_pubnames section sub-entry
3625 for this data object definition. */
3626
3627 if (TREE_PUBLIC (decl))
3628 {
3629 char label[MAX_ARTIFICIAL_LABEL_BYTES];
3630
3631 sprintf (label, PUB_DIE_LABEL_FMT, next_pubname_number++);
3632 ASM_OUTPUT_LABEL (asm_out_file, label);
3633 }
3634
3635 /* Now output the DIE to represent the data object itself. */
3636
3637 output_die (TREE_PUBLIC (decl) || TREE_EXTERNAL (decl)
3638 ? output_global_variable_die : output_local_variable_die,
3639 decl);
3640 break;
3641
3642 case FIELD_DECL:
3643 /* Ignore the nameless fields that are used to skip bits. */
3644 if (DECL_NAME (decl) != 0)
3645 {
3646 output_type (member_declared_type (decl), containing_scope);
3647 output_die (output_member_die, decl);
3648 }
3649 break;
3650
3651 case PARM_DECL:
3652 /* Force out the type of this formal, if it was not forced out yet.
3653 Note that here we can run afowl of a bug in "classic" svr4 SDB.
3654 It should be able to grok the presence of type DIEs within a list
3655 of TAG_formal_parameter DIEs, but it doesn't. */
3656
3657 output_type (TREE_TYPE (decl), containing_scope);
3658 output_die (output_formal_parameter_die, decl);
3659 break;
3660
3661 default:
3662 abort ();
3663 }
3664}
3665\f
3666void
3667dwarfout_file_scope_decl (decl, set_finalizing)
3668 register tree decl;
3669 register int set_finalizing;
3670{
3671 switch (TREE_CODE (decl))
3672 {
3673 case FUNCTION_DECL:
3674
3675 /* Ignore this FUNCTION_DECL if it refers to a builtin function. */
3676
3677 if (TREE_EXTERNAL (decl) && DECL_FUNCTION_CODE (decl))
3678 return;
3679
3680 /* Ignore this FUNCTION_DECL if it refers to a file-scope extern
3681 function declaration and if the declaration was never even
3682 referenced from within this entire compilation unit. We
3683 suppress these DIEs in order to save space in the .debug section
3684 (by eliminating entries which are probably useless). Note that
3685 we must not suppress block-local extern declarations (whether
3686 used or not) because that would screw-up the debugger's name
3687 lookup mechanism and cause it to miss things which really ought
3688 to be in scope at a given point. */
3689
3690 if (TREE_EXTERNAL (decl) && !TREE_USED (decl))
3691 return;
3692
3693 if (TREE_PUBLIC (decl) && ! TREE_EXTERNAL (decl))
3694 {
3695 char label[MAX_ARTIFICIAL_LABEL_BYTES];
3696
3697 /* Output a .debug_pubnames entry for a public function
3698 defined in this compilation unit. */
3699
3700 fputc ('\n', asm_out_file);
3701 ASM_DWARF_PUBNAMES_SECTION (asm_out_file);
3702 sprintf (label, PUB_DIE_LABEL_FMT, next_pubname_number);
3703 ASM_OUTPUT_DWARF_ADDR (asm_out_file, label);
3704 ASM_OUTPUT_DWARF_STRING (asm_out_file,
3705 IDENTIFIER_POINTER (DECL_NAME (decl)));
3706 ASM_DWARF_POP_SECTION (asm_out_file);
3707 }
3708
3709 break;
3710
3711 case VAR_DECL:
3712
3713 /* Ignore this VAR_DECL if it refers to a file-scope extern data
3714 object declaration and if the declaration was never even
3715 referenced from within this entire compilation unit. We
3716 suppress these DIEs in order to save space in the .debug section
3717 (by eliminating entries which are probably useless). Note that
3718 we must not suppress block-local extern declarations (whether
3719 used or not) because that would screw-up the debugger's name
3720 lookup mechanism and cause it to miss things which really ought
3721 to be in scope at a given point. */
3722
3723 if (TREE_EXTERNAL (decl) && !TREE_USED (decl))
3724 return;
3725
3726 if (TREE_PUBLIC (decl) && ! TREE_EXTERNAL (decl))
3727 {
3728 char label[MAX_ARTIFICIAL_LABEL_BYTES];
3729
3730 if (debug_info_level >= DINFO_LEVEL_NORMAL)
3731 {
3732 /* Output a .debug_pubnames entry for a public variable
3733 defined in this compilation unit. */
3734
3735 fputc ('\n', asm_out_file);
3736 ASM_DWARF_PUBNAMES_SECTION (asm_out_file);
3737 sprintf (label, PUB_DIE_LABEL_FMT, next_pubname_number);
3738 ASM_OUTPUT_DWARF_ADDR (asm_out_file, label);
3739 ASM_OUTPUT_DWARF_STRING (asm_out_file,
3740 IDENTIFIER_POINTER (DECL_NAME (decl)));
3741 ASM_DWARF_POP_SECTION (asm_out_file);
3742 }
3743
3744 if (DECL_INITIAL (decl) == NULL)
3745 {
3746 /* Output a .debug_aranges entry for a public variable
3747 which is tenatively defined in this compilation unit. */
3748
3749 fputc ('\n', asm_out_file);
3750 ASM_DWARF_ARANGES_SECTION (asm_out_file);
3751 ASM_OUTPUT_DWARF_ADDR (asm_out_file,
3752 IDENTIFIER_POINTER (DECL_NAME (decl)));
3753 ASM_OUTPUT_DWARF_DATA4 (asm_out_file,
3754 (unsigned) int_size_in_bytes (TREE_TYPE (decl)));
3755 ASM_DWARF_POP_SECTION (asm_out_file);
3756 }
3757 }
3758
3759 /* If we are in terse mode, don't generate any DIEs to represent
3760 any variable declarations or definitions. */
3761
3762 if (debug_info_level <= DINFO_LEVEL_TERSE)
3763 return;
3764
3765 break;
3766
3767 case TYPE_DECL:
3768 /* Don't generate any DIEs to represent the standard built-in types. */
3769
3770 if (DECL_SOURCE_LINE (decl) == 0)
3771 return;
3772
3773 /* If we are in terse mode, don't generate any DIEs to represent
3774 any actual typedefs. Note that even when we are in terse mode,
3775 we must still output DIEs to represent those tagged types which
3776 are used (directly or indirectly) in the specification of either
3777 a return type or a formal parameter type of some function. */
3778
3779 if (debug_info_level <= DINFO_LEVEL_TERSE)
3780 if (DECL_NAME (decl) != NULL
3781 || ! TYPE_USED_FOR_FUNCTION (TREE_TYPE (decl)))
3782 return;
3783
3784 break;
3785
3786 default:
3787 return;
3788 }
3789
3790 fputc ('\n', asm_out_file);
3791 ASM_DWARF_DEBUG_SECTION (asm_out_file);
3792 finalizing = set_finalizing;
3793 output_decl (decl, NULL);
3794
3795 /* NOTE: The call above to `output_decl' may have caused one or more
3796 file-scope named types (i.e. tagged types) to be placed onto the
3797 pending_types_list. We have to get those types off of that list
3798 at some point, and this is the perfect time to do it. If we didn't
3799 take them off now, they might still be on the list when cc1 finally
3800 exits. That might be OK if it weren't for the fact that when we put
3801 types onto the pending_types_list, we set the TREE_ASM_WRITTEN flag
3802 for these types, and that causes them never to be output unless
3803 `output_pending_types_for_scope' takes them off of the list and un-sets
3804 their TREE_ASM_WRITTEN flags. */
3805
3806 output_pending_types_for_scope (NULL);
3807
3808 /* The above call should have totally emptied the pending_types_list. */
3809
3810 assert (pending_types == 0);
3811
3812 ASM_DWARF_POP_SECTION (asm_out_file);
3813
3814 if (TREE_CODE (decl) == FUNCTION_DECL && DECL_INITIAL (decl) != NULL)
3815 current_funcdef_number++;
3816}
3817\f
3818/* Output a marker (i.e. a label) for the beginning of the generated code
3819 for a lexical block. */
3820
3821void
3822dwarfout_begin_block (blocknum)
3823 register unsigned blocknum;
3824{
3825 char label[MAX_ARTIFICIAL_LABEL_BYTES];
3826
3827 text_section ();
3828 sprintf (label, BLOCK_BEGIN_LABEL_FMT, blocknum);
3829 ASM_OUTPUT_LABEL (asm_out_file, label);
3830}
3831
3832/* Output a marker (i.e. a label) for the end of the generated code
3833 for a lexical block. */
3834
3835void
3836dwarfout_end_block (blocknum)
3837 register unsigned blocknum;
3838{
3839 char label[MAX_ARTIFICIAL_LABEL_BYTES];
3840
3841 text_section ();
3842 sprintf (label, BLOCK_END_LABEL_FMT, blocknum);
3843 ASM_OUTPUT_LABEL (asm_out_file, label);
3844}
3845
3846/* Output a marker (i.e. a label) at a point in the assembly code which
3847 corresponds to a given source level label. */
3848
3849void
3850dwarfout_label (insn)
3851 register rtx insn;
3852{
3853 if (debug_info_level >= DINFO_LEVEL_NORMAL)
3854 {
3855 char label[MAX_ARTIFICIAL_LABEL_BYTES];
3856
3857 text_section ();
3858 sprintf (label, INSN_LABEL_FMT, current_funcdef_number,
3859 (unsigned) INSN_UID (insn));
3860 ASM_OUTPUT_LABEL (asm_out_file, label);
3861 }
3862}
3863
3864/* Output a marker (i.e. a label) for the absolute end of the generated code
3865 for a function definition. This gets called *after* the epilogue code
3866 has been generated. */
3867
3868void
3869dwarfout_end_epilogue ()
3870{
3871 char label[MAX_ARTIFICIAL_LABEL_BYTES];
3872
3873 /* Output a label to mark the endpoint of the code generated for this
3874 function. */
3875
3876 sprintf (label, FUNC_END_LABEL_FMT, current_funcdef_number);
3877 ASM_OUTPUT_LABEL (asm_out_file, label);
3878}
3879
3880static void
3881shuffle_filename_entry (new_zeroth)
3882 register filename_entry *new_zeroth;
3883{
3884 filename_entry temp_entry;
3885 register filename_entry *limit_p;
3886 register filename_entry *move_p;
3887
3888 if (new_zeroth == &filename_table[0])
3889 return;
3890
3891 temp_entry = *new_zeroth;
3892
3893 /* Shift entries up in the table to make room at [0]. */
3894
3895 limit_p = &filename_table[0];
3896 for (move_p = new_zeroth; move_p > limit_p; move_p--)
3897 *move_p = *(move_p-1);
3898
3899 /* Install the found entry at [0]. */
3900
3901 filename_table[0] = temp_entry;
3902}
3903
3904/* Create a new (string) entry for the .debug_sfnames section. */
3905
3906static void
3907generate_new_sfname_entry ()
3908{
3909 char label[MAX_ARTIFICIAL_LABEL_BYTES];
3910
3911 fputc ('\n', asm_out_file);
3912 ASM_DWARF_SFNAMES_SECTION (asm_out_file);
3913 sprintf (label, SFNAMES_ENTRY_LABEL_FMT, filename_table[0].number);
3914 ASM_OUTPUT_LABEL (asm_out_file, label);
3915 ASM_OUTPUT_DWARF_STRING (asm_out_file,
3916 filename_table[0].name
3917 ? filename_table[0].name
3918 : "");
3919 ASM_DWARF_POP_SECTION (asm_out_file);
3920}
3921
3922/* Lookup a filename (in the list of filenames that we know about here in
3923 dwarfout.c) and return its "index". The index of each (known) filename
3924 is just a unique number which is associated with only that one filename.
3925 We need such numbers for the sake of generating labels (in the
3926 .debug_sfnames section) and references to those unique labels (in the
3927 .debug_srcinfo and .debug_macinfo sections).
3928
3929 If the filename given as an argument is not found in our current list,
3930 add it to the list and assign it the next available unique index number.
3931
3932 Whatever we do (i.e. whether we find a pre-existing filename or add a new
3933 one), we shuffle the filename found (or added) up to the zeroth entry of
3934 our list of filenames (which is always searched linearly). We do this so
3935 as to optimize the most common case for these filename lookups within
3936 dwarfout.c. The most common case by far is the case where we call
3937 lookup_filename to lookup the very same filename that we did a lookup
3938 on the last time we called lookup_filename. We make sure that this
3939 common case is fast because such cases will constitute 99.9% of the
3940 lookups we ever do (in practice).
3941
3942 If we add a new filename entry to our table, we go ahead and generate
3943 the corresponding entry in the .debug_sfnames section right away.
3944 Doing so allows us to avoid tickling an assembler bug (present in some
3945 m68k assemblers) which yields assembly-time errors in cases where the
3946 difference of two label addresses is taken and where the two labels
3947 are in a section *other* than the one where the difference is being
3948 calculated, and where at least one of the two symbol references is a
3949 forward reference. (This bug could be tickled by our .debug_srcinfo
3950 entries if we don't output their corresponding .debug_sfnames entries
3951 before them.)
3952*/
3953
3954static unsigned
3955lookup_filename (file_name)
3956 char *file_name;
3957{
3958 register filename_entry *search_p;
3959 register filename_entry *limit_p = &filename_table[ft_entries];
3960
3961 for (search_p = filename_table; search_p < limit_p; search_p++)
3962 if (!strcmp (file_name, search_p->name))
3963 {
3964 /* When we get here, we have found the filename that we were
3965 looking for in the filename_table. Now we want to make sure
3966 that it gets moved to the zero'th entry in the table (if it
3967 is not already there) so that subsequent attempts to find the
3968 same filename will find it as quickly as possible. */
3969
3970 shuffle_filename_entry (search_p);
3971 return filename_table[0].number;
3972 }
3973
3974 /* We come here whenever we have a new filename which is not registered
3975 in the current table. Here we add it to the table. */
3976
3977 /* Prepare to add a new table entry by making sure there is enough space
3978 in the table to do so. If not, expand the current table. */
3979
3980 if (ft_entries == ft_entries_allocated)
3981 {
3982 ft_entries_allocated += FT_ENTRIES_INCREMENT;
3983 filename_table
3984 = (filename_entry *)
3985 xrealloc (filename_table,
3986 ft_entries_allocated * sizeof (filename_entry));
3987 }
3988
3989 /* Initially, add the new entry at the end of the filename table. */
3990
3991 filename_table[ft_entries].number = ft_entries;
3992 filename_table[ft_entries].name = xstrdup (file_name);
3993
3994 /* Shuffle the new entry into filename_table[0]. */
3995
3996 shuffle_filename_entry (&filename_table[ft_entries]);
3997
3998 if (debug_info_level >= DINFO_LEVEL_NORMAL)
3999 generate_new_sfname_entry ();
4000
4001 ft_entries++;
4002 return filename_table[0].number;
4003}
4004
4005static void
4006generate_srcinfo_entry (line_entry_num, files_entry_num)
4007 unsigned line_entry_num;
4008 unsigned files_entry_num;
4009{
4010 char label[MAX_ARTIFICIAL_LABEL_BYTES];
4011
4012 fputc ('\n', asm_out_file);
4013 ASM_DWARF_SRCINFO_SECTION (asm_out_file);
4014 sprintf (label, LINE_ENTRY_LABEL_FMT, line_entry_num);
4015 ASM_OUTPUT_DWARF_DELTA4 (asm_out_file, label, LINE_BEGIN_LABEL);
4016 sprintf (label, SFNAMES_ENTRY_LABEL_FMT, files_entry_num);
4017 ASM_OUTPUT_DWARF_DELTA4 (asm_out_file, label, SFNAMES_BEGIN_LABEL);
4018 ASM_DWARF_POP_SECTION (asm_out_file);
4019}
4020
4021void
4022dwarfout_line (filename, line)
4023 register char *filename;
4024 register unsigned line;
4025{
4026 if (debug_info_level >= DINFO_LEVEL_NORMAL)
4027 {
4028 char label[MAX_ARTIFICIAL_LABEL_BYTES];
4029 static unsigned last_line_entry_num = 0;
4030 static unsigned prev_file_entry_num = (unsigned) -1;
4031 register unsigned this_file_entry_num = lookup_filename (filename);
4032
4033 text_section ();
4034 sprintf (label, LINE_CODE_LABEL_FMT, ++last_line_entry_num);
4035 ASM_OUTPUT_LABEL (asm_out_file, label);
4036
4037 fputc ('\n', asm_out_file);
4038 ASM_DWARF_LINE_SECTION (asm_out_file);
4039
4040 if (this_file_entry_num != prev_file_entry_num)
4041 {
4042 char line_entry_label[MAX_ARTIFICIAL_LABEL_BYTES];
4043
4044 sprintf (line_entry_label, LINE_ENTRY_LABEL_FMT, last_line_entry_num);
4045 ASM_OUTPUT_LABEL (asm_out_file, line_entry_label);
4046 }
4047
4048 {
4049 register char *tail = strrchr (filename, '/');
4050
4051 if (tail != NULL)
4052 filename = tail;
4053 }
4054
2e494f70 4055 fprintf (asm_out_file, "\t%s\t%u\t%s %s:%u\n",
340ccaab
TW
4056 UNALIGNED_INT_ASM_OP, line, ASM_COMMENT_START,
4057 filename, line);
4058 ASM_OUTPUT_DWARF_DATA2 (asm_out_file, 0xffff);
4059 ASM_OUTPUT_DWARF_DELTA4 (asm_out_file, label, TEXT_BEGIN_LABEL);
4060 ASM_DWARF_POP_SECTION (asm_out_file);
4061
4062 if (this_file_entry_num != prev_file_entry_num)
4063 generate_srcinfo_entry (last_line_entry_num, this_file_entry_num);
4064 prev_file_entry_num = this_file_entry_num;
4065 }
4066}
4067
4068/* Generate an entry in the .debug_macinfo section. */
4069
4070static void
4071generate_macinfo_entry (type_and_offset, string)
4072 register char *type_and_offset;
4073 register char *string;
4074{
4075 fputc ('\n', asm_out_file);
4076 ASM_DWARF_MACINFO_SECTION (asm_out_file);
2e494f70 4077 fprintf (asm_out_file, "\t%s\t%s\n", UNALIGNED_INT_ASM_OP, type_and_offset);
340ccaab
TW
4078 ASM_OUTPUT_DWARF_STRING (asm_out_file, string);
4079 ASM_DWARF_POP_SECTION (asm_out_file);
4080}
4081
4082void
4083dwarfout_start_new_source_file (filename)
4084 register char *filename;
4085{
4086 char label[MAX_ARTIFICIAL_LABEL_BYTES];
4087 char type_and_offset[MAX_ARTIFICIAL_LABEL_BYTES*3];
4088
4089 sprintf (label, SFNAMES_ENTRY_LABEL_FMT, lookup_filename (filename));
4090 sprintf (type_and_offset, "0x%08x+%s-%s",
4091 ((unsigned) MACINFO_start << 24), label, SFNAMES_BEGIN_LABEL);
4092 generate_macinfo_entry (type_and_offset, "");
4093}
4094
4095void
4096dwarfout_resume_previous_source_file (lineno)
4097 register unsigned lineno;
4098{
4099 char type_and_offset[MAX_ARTIFICIAL_LABEL_BYTES*2];
4100
4101 sprintf (type_and_offset, "0x%08x+%u",
4102 ((unsigned) MACINFO_resume << 24), lineno);
4103 generate_macinfo_entry (type_and_offset, "");
4104}
4105
4106/* Called from check_newline in c-parse.y. The `buffer' parameter
4107 contains the tail part of the directive line, i.e. the part which
4108 is past the initial whitespace, #, whitespace, directive-name,
4109 whitespace part. */
4110
4111void
4112dwarfout_define (lineno, buffer)
4113 register unsigned lineno;
4114 register char *buffer;
4115{
4116 static int initialized = 0;
4117 char type_and_offset[MAX_ARTIFICIAL_LABEL_BYTES*2];
4118
4119 if (!initialized)
4120 {
4121 dwarfout_start_new_source_file (primary_filename);
4122 initialized = 1;
4123 }
4124 sprintf (type_and_offset, "0x%08x+%u",
4125 ((unsigned) MACINFO_define << 24), lineno);
4126 generate_macinfo_entry (type_and_offset, buffer);
4127}
4128
4129/* Called from check_newline in c-parse.y. The `buffer' parameter
4130 contains the tail part of the directive line, i.e. the part which
4131 is past the initial whitespace, #, whitespace, directive-name,
4132 whitespace part. */
4133
4134void
4135dwarfout_undef (lineno, buffer)
4136 register unsigned lineno;
4137 register char *buffer;
4138{
4139 char type_and_offset[MAX_ARTIFICIAL_LABEL_BYTES*2];
4140
4141 sprintf (type_and_offset, "0x%08x+%u",
4142 ((unsigned) MACINFO_undef << 24), lineno);
4143 generate_macinfo_entry (type_and_offset, buffer);
4144}
4145
4146/* Set up for Dwarf output at the start of compilation. */
4147
4148void
4149dwarfout_init (asm_out_file, main_input_filename)
4150 register FILE *asm_out_file;
4151 register char *main_input_filename;
4152{
4153 /* Remember the name of the primary input file. */
4154
4155 primary_filename = main_input_filename;
4156
4157 /* Allocate the initial hunk of the pending_sibling_stack. */
4158
4159 pending_sibling_stack
4160 = (unsigned *)
4161 xmalloc (PENDING_SIBLINGS_INCREMENT * sizeof (unsigned));
4162 pending_siblings_allocated = PENDING_SIBLINGS_INCREMENT;
4163 pending_siblings = 1;
4164
4165 /* Allocate the initial hunk of the filename_table. */
4166
4167 filename_table
4168 = (filename_entry *)
4169 xmalloc (FT_ENTRIES_INCREMENT * sizeof (filename_entry));
4170 ft_entries_allocated = FT_ENTRIES_INCREMENT;
4171 ft_entries = 0;
4172
4173 /* Allocate the initial hunk of the pending_types_list. */
4174
4175 pending_types_list
4176 = (tree *) xmalloc (PENDING_TYPES_INCREMENT * sizeof (tree));
4177 pending_types_allocated = PENDING_TYPES_INCREMENT;
4178 pending_types = 0;
4179
4180 /* Create an artificial RECORD_TYPE node which we can use in our hack
4181 to get the DIEs representing types of formal parameters to come out
4182 only *after* the DIEs for the formal parameters themselves. */
4183
4184 fake_containing_scope = make_node (RECORD_TYPE);
4185
4186 /* Output a starting label for the .text section. */
4187
4188 fputc ('\n', asm_out_file);
4189 ASM_DWARF_TEXT_SECTION (asm_out_file);
4190 ASM_OUTPUT_LABEL (asm_out_file, TEXT_BEGIN_LABEL);
4191 ASM_DWARF_POP_SECTION (asm_out_file);
4192
4193 /* Output a starting label for the .data section. */
4194
4195 fputc ('\n', asm_out_file);
4196 ASM_DWARF_DATA_SECTION (asm_out_file);
4197 ASM_OUTPUT_LABEL (asm_out_file, DATA_BEGIN_LABEL);
4198 ASM_DWARF_POP_SECTION (asm_out_file);
4199
4200 /* Output a starting label for the .data1 section. */
4201
4202 fputc ('\n', asm_out_file);
4203 ASM_DWARF_DATA1_SECTION (asm_out_file);
4204 ASM_OUTPUT_LABEL (asm_out_file, DATA1_BEGIN_LABEL);
4205 ASM_DWARF_POP_SECTION (asm_out_file);
4206
4207 /* Output a starting label for the .rodata section. */
4208
4209 fputc ('\n', asm_out_file);
4210 ASM_DWARF_RODATA_SECTION (asm_out_file);
4211 ASM_OUTPUT_LABEL (asm_out_file, RODATA_BEGIN_LABEL);
4212 ASM_DWARF_POP_SECTION (asm_out_file);
4213
4214 /* Output a starting label for the .rodata1 section. */
4215
4216 fputc ('\n', asm_out_file);
4217 ASM_DWARF_RODATA1_SECTION (asm_out_file);
4218 ASM_OUTPUT_LABEL (asm_out_file, RODATA1_BEGIN_LABEL);
4219 ASM_DWARF_POP_SECTION (asm_out_file);
4220
4221 /* Output a starting label for the .bss section. */
4222
4223 fputc ('\n', asm_out_file);
4224 ASM_DWARF_BSS_SECTION (asm_out_file);
4225 ASM_OUTPUT_LABEL (asm_out_file, BSS_BEGIN_LABEL);
4226 ASM_DWARF_POP_SECTION (asm_out_file);
4227
4228 if (debug_info_level >= DINFO_LEVEL_NORMAL)
4229 {
4230 /* Output a starting label and an initial (compilation directory)
4231 entry for the .debug_sfnames section. The starting label will be
4232 referenced by the initial entry in the .debug_srcinfo section. */
4233
4234 fputc ('\n', asm_out_file);
4235 ASM_DWARF_SFNAMES_SECTION (asm_out_file);
4236 ASM_OUTPUT_LABEL (asm_out_file, SFNAMES_BEGIN_LABEL);
4237 {
2e494f70
RS
4238 register char *pwd = getpwd ();
4239 register unsigned len = strlen (pwd);
4240 register char *dirname = (char *) xmalloc (len + 2);
340ccaab 4241
2e494f70
RS
4242 strcpy (dirname, pwd);
4243 strcpy (dirname + len, "/");
340ccaab
TW
4244 ASM_OUTPUT_DWARF_STRING (asm_out_file, dirname);
4245 free (dirname);
4246 }
4247 ASM_DWARF_POP_SECTION (asm_out_file);
4248
4249 if (debug_info_level >= DINFO_LEVEL_VERBOSE)
4250 {
4251 /* Output a starting label for the .debug_macinfo section. This
4252 label will be referenced by the AT_mac_info attribute in the
4253 TAG_compile_unit DIE. */
4254
4255 fputc ('\n', asm_out_file);
4256 ASM_DWARF_MACINFO_SECTION (asm_out_file);
4257 ASM_OUTPUT_LABEL (asm_out_file, MACINFO_BEGIN_LABEL);
4258 ASM_DWARF_POP_SECTION (asm_out_file);
4259 }
4260
4261 /* Generate the initial entry for the .line section. */
4262
4263 fputc ('\n', asm_out_file);
4264 ASM_DWARF_LINE_SECTION (asm_out_file);
4265 ASM_OUTPUT_LABEL (asm_out_file, LINE_BEGIN_LABEL);
4266 ASM_OUTPUT_DWARF_DELTA4 (asm_out_file, LINE_END_LABEL, LINE_BEGIN_LABEL);
4267 ASM_OUTPUT_DWARF_ADDR (asm_out_file, TEXT_BEGIN_LABEL);
4268 ASM_DWARF_POP_SECTION (asm_out_file);
4269
4270 /* Generate the initial entry for the .debug_srcinfo section. */
4271
4272 fputc ('\n', asm_out_file);
4273 ASM_DWARF_SRCINFO_SECTION (asm_out_file);
4274 ASM_OUTPUT_LABEL (asm_out_file, SRCINFO_BEGIN_LABEL);
4275 ASM_OUTPUT_DWARF_ADDR (asm_out_file, LINE_BEGIN_LABEL);
4276 ASM_OUTPUT_DWARF_ADDR (asm_out_file, SFNAMES_BEGIN_LABEL);
4277 ASM_OUTPUT_DWARF_ADDR (asm_out_file, TEXT_BEGIN_LABEL);
4278 ASM_OUTPUT_DWARF_ADDR (asm_out_file, TEXT_END_LABEL);
4279#ifdef DWARF_TIMESTAMPS
4280 ASM_OUTPUT_DWARF_DATA4 (asm_out_file, time (NULL));
4281#else
4282 ASM_OUTPUT_DWARF_DATA4 (asm_out_file, -1);
4283#endif
4284 ASM_DWARF_POP_SECTION (asm_out_file);
4285
4286 /* Generate the initial entry for the .debug_pubnames section. */
4287
4288 fputc ('\n', asm_out_file);
4289 ASM_DWARF_PUBNAMES_SECTION (asm_out_file);
4290 ASM_OUTPUT_DWARF_ADDR (asm_out_file, DEBUG_BEGIN_LABEL);
4291 ASM_DWARF_POP_SECTION (asm_out_file);
4292
4293 /* Generate the initial entry for the .debug_aranges section. */
4294
4295 fputc ('\n', asm_out_file);
4296 ASM_DWARF_ARANGES_SECTION (asm_out_file);
4297 ASM_OUTPUT_DWARF_ADDR (asm_out_file, DEBUG_BEGIN_LABEL);
4298 ASM_DWARF_POP_SECTION (asm_out_file);
4299 }
4300
4301 /* Setup first DIE number == 1. */
4302 NEXT_DIE_NUM = next_unused_dienum++;
4303
4304 /* Generate the initial DIE for the .debug section. Note that the
4305 (string) value given in the AT_name attribute of the TAG_compile_unit
4306 DIE will (typically) be a relative pathname and that this pathname
4307 should be taken as being relative to the directory from which the
4308 compiler was invoked when the given (base) source file was compiled. */
4309
4310 fputc ('\n', asm_out_file);
4311 ASM_DWARF_DEBUG_SECTION (asm_out_file);
4312 ASM_OUTPUT_LABEL (asm_out_file, DEBUG_BEGIN_LABEL);
4313 output_die (output_compile_unit_die, main_input_filename);
4314 ASM_DWARF_POP_SECTION (asm_out_file);
4315
4316 fputc ('\n', asm_out_file);
4317}
4318
4319/* Output stuff that dwarf requires at the end of every file. */
4320
4321void
4322dwarfout_finish ()
4323{
4324 char label[MAX_ARTIFICIAL_LABEL_BYTES];
4325
4326 fputc ('\n', asm_out_file);
4327 ASM_DWARF_DEBUG_SECTION (asm_out_file);
4328
4329 /* Mark the end of the chain of siblings which represent all file-scope
4330 declarations in this compilation unit. */
4331
4332 /* The (null) DIE which represents the terminator for the (sibling linked)
4333 list of file-scope items is *special*. Normally, we would just call
4334 end_sibling_chain at this point in order to output a word with the
4335 value `4' and that word would act as the terminator for the list of
4336 DIEs describing file-scope items. Unfortunately, if we were to simply
4337 do that, the label that would follow this DIE in the .debug section
4338 (i.e. `..D2') would *not* be properly aligned (as it must be on some
4339 machines) to a 4 byte boundary.
4340
4341 In order to force the label `..D2' to get aligned to a 4 byte boundary,
4342 the trick used is to insert extra (otherwise useless) padding bytes
4343 into the (null) DIE that we know must preceed the ..D2 label in the
4344 .debug section. The amount of padding required can be anywhere between
4345 0 and 3 bytes. The length word at the start of this DIE (i.e. the one
4346 with the padding) would normally contain the value 4, but now it will
4347 also have to include the padding bytes, so it will instead have some
4348 value in the range 4..7.
4349
4350 Fortunately, the rules of Dwarf say that any DIE whose length word
4351 contains *any* value less than 8 should be treated as a null DIE, so
4352 this trick works out nicely. Clever, eh? Don't give me any credit
4353 (or blame). I didn't think of this scheme. I just conformed to it.
4354 */
4355
4356 output_die (output_padded_null_die, (void *)0);
4357 dienum_pop ();
4358
4359 sprintf (label, DIE_BEGIN_LABEL_FMT, NEXT_DIE_NUM);
4360 ASM_OUTPUT_LABEL (asm_out_file, label); /* should be ..D2 */
4361 ASM_DWARF_POP_SECTION (asm_out_file);
4362
4363 /* Output a terminator label for the .text section. */
4364
4365 fputc ('\n', asm_out_file);
4366 ASM_DWARF_TEXT_SECTION (asm_out_file);
4367 ASM_OUTPUT_LABEL (asm_out_file, TEXT_END_LABEL);
4368 ASM_DWARF_POP_SECTION (asm_out_file);
4369
4370 /* Output a terminator label for the .data section. */
4371
4372 fputc ('\n', asm_out_file);
4373 ASM_DWARF_DATA_SECTION (asm_out_file);
4374 ASM_OUTPUT_LABEL (asm_out_file, DATA_END_LABEL);
4375 ASM_DWARF_POP_SECTION (asm_out_file);
4376
4377 /* Output a terminator label for the .data1 section. */
4378
4379 fputc ('\n', asm_out_file);
4380 ASM_DWARF_DATA1_SECTION (asm_out_file);
4381 ASM_OUTPUT_LABEL (asm_out_file, DATA1_END_LABEL);
4382 ASM_DWARF_POP_SECTION (asm_out_file);
4383
4384 /* Output a terminator label for the .rodata section. */
4385
4386 fputc ('\n', asm_out_file);
4387 ASM_DWARF_RODATA_SECTION (asm_out_file);
4388 ASM_OUTPUT_LABEL (asm_out_file, RODATA_END_LABEL);
4389 ASM_DWARF_POP_SECTION (asm_out_file);
4390
4391 /* Output a terminator label for the .rodata1 section. */
4392
4393 fputc ('\n', asm_out_file);
4394 ASM_DWARF_RODATA1_SECTION (asm_out_file);
4395 ASM_OUTPUT_LABEL (asm_out_file, RODATA1_END_LABEL);
4396 ASM_DWARF_POP_SECTION (asm_out_file);
4397
4398 /* Output a terminator label for the .bss section. */
4399
4400 fputc ('\n', asm_out_file);
4401 ASM_DWARF_BSS_SECTION (asm_out_file);
4402 ASM_OUTPUT_LABEL (asm_out_file, BSS_END_LABEL);
4403 ASM_DWARF_POP_SECTION (asm_out_file);
4404
4405 if (debug_info_level >= DINFO_LEVEL_NORMAL)
4406 {
4407 /* Output a terminating entry for the .line section. */
4408
4409 fputc ('\n', asm_out_file);
4410 ASM_DWARF_LINE_SECTION (asm_out_file);
4411 ASM_OUTPUT_LABEL (asm_out_file, LINE_LAST_ENTRY_LABEL);
4412 ASM_OUTPUT_DWARF_DATA4 (asm_out_file, 0);
4413 ASM_OUTPUT_DWARF_DATA2 (asm_out_file, 0xffff);
4414 ASM_OUTPUT_DWARF_DELTA4 (asm_out_file, TEXT_END_LABEL, TEXT_BEGIN_LABEL);
4415 ASM_OUTPUT_LABEL (asm_out_file, LINE_END_LABEL);
4416 ASM_DWARF_POP_SECTION (asm_out_file);
4417
4418 /* Output a terminating entry for the .debug_srcinfo section. */
4419
4420 fputc ('\n', asm_out_file);
4421 ASM_DWARF_SRCINFO_SECTION (asm_out_file);
4422 ASM_OUTPUT_DWARF_DELTA4 (asm_out_file,
4423 LINE_LAST_ENTRY_LABEL, LINE_BEGIN_LABEL);
4424 ASM_OUTPUT_DWARF_DATA4 (asm_out_file, -1);
4425 ASM_DWARF_POP_SECTION (asm_out_file);
4426
4427 if (debug_info_level >= DINFO_LEVEL_VERBOSE)
4428 {
4429 /* Output terminating entries for the .debug_macinfo section. */
4430
4431 dwarfout_resume_previous_source_file (0);
4432
4433 fputc ('\n', asm_out_file);
4434 ASM_DWARF_MACINFO_SECTION (asm_out_file);
4435 ASM_OUTPUT_DWARF_DATA4 (asm_out_file, 0);
4436 ASM_OUTPUT_DWARF_STRING (asm_out_file, "");
4437 ASM_DWARF_POP_SECTION (asm_out_file);
4438 }
4439
4440 /* Generate the terminating entry for the .debug_pubnames section. */
4441
4442 fputc ('\n', asm_out_file);
4443 ASM_DWARF_PUBNAMES_SECTION (asm_out_file);
4444 ASM_OUTPUT_DWARF_DATA4 (asm_out_file, 0);
4445 ASM_OUTPUT_DWARF_STRING (asm_out_file, "");
4446 ASM_DWARF_POP_SECTION (asm_out_file);
4447
4448 /* Generate the terminating entries for the .debug_aranges section.
4449
4450 Note that we want to do this only *after* we have output the end
4451 labels (for the various program sections) which we are going to
4452 refer to here. This allows us to work around a bug in the m68k
4453 svr4 assembler. That assembler gives bogus assembly-time errors
4454 if (within any given section) you try to take the difference of
4455 two relocatable symbols, both of which are located within some
4456 other section, and if one (or both?) of the symbols involved is
4457 being forward-referenced. By generating the .debug_aranges
4458 entries at this late point in the assembly output, we skirt the
4459 issue simply by avoiding forward-references.
4460 */
4461
4462 fputc ('\n', asm_out_file);
4463 ASM_DWARF_ARANGES_SECTION (asm_out_file);
4464
4465 ASM_OUTPUT_DWARF_ADDR (asm_out_file, TEXT_BEGIN_LABEL);
4466 ASM_OUTPUT_DWARF_DELTA4 (asm_out_file, TEXT_END_LABEL, TEXT_BEGIN_LABEL);
4467
4468 ASM_OUTPUT_DWARF_ADDR (asm_out_file, DATA_BEGIN_LABEL);
4469 ASM_OUTPUT_DWARF_DELTA4 (asm_out_file, DATA_END_LABEL, DATA_BEGIN_LABEL);
4470
4471 ASM_OUTPUT_DWARF_ADDR (asm_out_file, DATA1_BEGIN_LABEL);
4472 ASM_OUTPUT_DWARF_DELTA4 (asm_out_file, DATA1_END_LABEL,
4473 DATA1_BEGIN_LABEL);
4474
4475 ASM_OUTPUT_DWARF_ADDR (asm_out_file, RODATA_BEGIN_LABEL);
4476 ASM_OUTPUT_DWARF_DELTA4 (asm_out_file, RODATA_END_LABEL,
4477 RODATA_BEGIN_LABEL);
4478
4479 ASM_OUTPUT_DWARF_ADDR (asm_out_file, RODATA1_BEGIN_LABEL);
4480 ASM_OUTPUT_DWARF_DELTA4 (asm_out_file, RODATA1_END_LABEL,
4481 RODATA1_BEGIN_LABEL);
4482
4483 ASM_OUTPUT_DWARF_ADDR (asm_out_file, BSS_BEGIN_LABEL);
4484 ASM_OUTPUT_DWARF_DELTA4 (asm_out_file, BSS_END_LABEL, BSS_BEGIN_LABEL);
4485
4486 ASM_OUTPUT_DWARF_DATA4 (asm_out_file, 0);
4487 ASM_OUTPUT_DWARF_DATA4 (asm_out_file, 0);
4488
4489 ASM_DWARF_POP_SECTION (asm_out_file);
4490 }
4491}
4492
4493#endif /* DWARF_DEBUGGING_INFO */
This page took 0.428587 seconds and 5 git commands to generate.