Add diclaimer of copyright to _osname() manual page.
[unix-history] / gnu / usr.bin / cc / common / dwarfout.c
CommitLineData
9bf86ebb
PR
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 "hard-reg-set.h"
32#include "insn-config.h"
33#include "reload.h"
34#include "output.h"
35#include "defaults.h"
36
37#ifndef DWARF_VERSION
38#define DWARF_VERSION 1
39#endif
40
41/* #define NDEBUG 1 */
42#include "assert.h"
43
44#if defined(DWARF_TIMESTAMPS)
45#if defined(POSIX)
46#include <time.h>
47#else /* !defined(POSIX) */
48#include <sys/types.h>
49#if defined(__STDC__)
50extern time_t time (time_t *);
51#else /* !defined(__STDC__) */
52extern time_t time ();
53#endif /* !defined(__STDC__) */
54#endif /* !defined(POSIX) */
55#endif /* defined(DWARF_TIMESTAMPS) */
56
57extern char *getpwd ();
58
59extern char *index ();
60extern char *rindex ();
61
62/* IMPORTANT NOTE: Please see the file README.DWARF for important details
63 regarding the GNU implementation of Dwarf. */
64
65/* NOTE: In the comments in this file, many references are made to
66 so called "Debugging Information Entries". For the sake of brevity,
67 this term is abbreviated to `DIE' throughout the remainder of this
68 file. */
69
70/* Note that the implementation of C++ support herein is (as yet) unfinished.
71 If you want to try to complete it, more power to you. */
72
73#if defined(__GNUC__) && (NDEBUG == 1)
74#define inline static inline
75#else
76#define inline static
77#endif
78
79/* How to start an assembler comment. */
80#ifndef ASM_COMMENT_START
81#define ASM_COMMENT_START ";#"
82#endif
83
84/* How to print out a register name. */
85#ifndef PRINT_REG
86#define PRINT_REG(RTX, CODE, FILE) \
87 fprintf ((FILE), "%s", reg_names[REGNO (RTX)])
88#endif
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
107extern int flag_traditional;
108extern char *version_string;
109extern char *language_string;
110
111/* Maximum size (in bytes) of an artificially generated label. */
112
113#define MAX_ARTIFICIAL_LABEL_BYTES 30
114\f
115/* Make sure we know the sizes of the various types dwarf can describe.
116 These are only defaults. If the sizes are different for your target,
117 you should override these values by defining the appropriate symbols
118 in your tm.h file. */
119
120#ifndef CHAR_TYPE_SIZE
121#define CHAR_TYPE_SIZE BITS_PER_UNIT
122#endif
123
124#ifndef SHORT_TYPE_SIZE
125#define SHORT_TYPE_SIZE (BITS_PER_UNIT * 2)
126#endif
127
128#ifndef INT_TYPE_SIZE
129#define INT_TYPE_SIZE BITS_PER_WORD
130#endif
131
132#ifndef LONG_TYPE_SIZE
133#define LONG_TYPE_SIZE BITS_PER_WORD
134#endif
135
136#ifndef LONG_LONG_TYPE_SIZE
137#define LONG_LONG_TYPE_SIZE (BITS_PER_WORD * 2)
138#endif
139
140#ifndef WCHAR_TYPE_SIZE
141#define WCHAR_TYPE_SIZE INT_TYPE_SIZE
142#endif
143
144#ifndef WCHAR_UNSIGNED
145#define WCHAR_UNSIGNED 0
146#endif
147
148#ifndef FLOAT_TYPE_SIZE
149#define FLOAT_TYPE_SIZE BITS_PER_WORD
150#endif
151
152#ifndef DOUBLE_TYPE_SIZE
153#define DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
154#endif
155
156#ifndef LONG_DOUBLE_TYPE_SIZE
157#define LONG_DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
158#endif
159\f
160/* Structure to keep track of source filenames. */
161
162struct filename_entry {
163 unsigned number;
164 char * name;
165};
166
167typedef struct filename_entry filename_entry;
168
169/* Pointer to an array of elements, each one having the structure above. */
170
171static filename_entry *filename_table;
172
173/* Total number of entries in the table (i.e. array) pointed to by
174 `filename_table'. This is the *total* and includes both used and
175 unused slots. */
176
177static unsigned ft_entries_allocated;
178
179/* Number of entries in the filename_table which are actually in use. */
180
181static unsigned ft_entries;
182
183/* Size (in elements) of increments by which we may expand the filename
184 table. Actually, a single hunk of space of this size should be enough
185 for most typical programs. */
186
187#define FT_ENTRIES_INCREMENT 64
188
189/* Local pointer to the name of the main input file. Initialized in
190 dwarfout_init. */
191
192static char *primary_filename;
193
194/* Pointer to the most recent filename for which we produced some line info. */
195
196static char *last_filename;
197
198/* For Dwarf output, we must assign lexical-blocks id numbers
199 in the order in which their beginnings are encountered.
200 We output Dwarf debugging info that refers to the beginnings
201 and ends of the ranges of code for each lexical block with
202 assembler labels ..Bn and ..Bn.e, where n is the block number.
203 The labels themselves are generated in final.c, which assigns
204 numbers to the blocks in the same way. */
205
206static unsigned next_block_number = 2;
207
208/* Counter to generate unique names for DIEs. */
209
210static unsigned next_unused_dienum = 1;
211
212/* Number of the DIE which is currently being generated. */
213
214static unsigned current_dienum;
215
216/* Number to use for the special "pubname" label on the next DIE which
217 represents a function or data object defined in this compilation
218 unit which has "extern" linkage. */
219
220static next_pubname_number = 0;
221
222#define NEXT_DIE_NUM pending_sibling_stack[pending_siblings-1]
223
224/* Pointer to a dynamically allocated list of pre-reserved and still
225 pending sibling DIE numbers. Note that this list will grow as needed. */
226
227static unsigned *pending_sibling_stack;
228
229/* Counter to keep track of the number of pre-reserved and still pending
230 sibling DIE numbers. */
231
232static unsigned pending_siblings;
233
234/* The currently allocated size of the above list (expressed in number of
235 list elements). */
236
237static unsigned pending_siblings_allocated;
238
239/* Size (in elements) of increments by which we may expand the pending
240 sibling stack. Actually, a single hunk of space of this size should
241 be enough for most typical programs. */
242
243#define PENDING_SIBLINGS_INCREMENT 64
244
245/* Non-zero if we are performing our file-scope finalization pass and if
246 we should force out Dwarf descriptions of any and all file-scope
247 tagged types which are still incomplete types. */
248
249static int finalizing = 0;
250
251/* A pointer to the base of a list of pending types which we haven't
252 generated DIEs for yet, but which we will have to come back to
253 later on. */
254
255static tree *pending_types_list;
256
257/* Number of elements currently allocated for the pending_types_list. */
258
259static unsigned pending_types_allocated;
260
261/* Number of elements of pending_types_list currently in use. */
262
263static unsigned pending_types;
264
265/* Size (in elements) of increments by which we may expand the pending
266 types list. Actually, a single hunk of space of this size should
267 be enough for most typical programs. */
268
269#define PENDING_TYPES_INCREMENT 64
270
271/* Pointer to an artificial RECORD_TYPE which we create in dwarfout_init.
272 This is used in a hack to help us get the DIEs describing types of
273 formal parameters to come *after* all of the DIEs describing the formal
274 parameters themselves. That's necessary in order to be compatible
275 with what the brain-damaged svr4 SDB debugger requires. */
276
277static tree fake_containing_scope;
278
279/* The number of the current function definition that we are generating
280 debugging information for. These numbers range from 1 up to the maximum
281 number of function definitions contained within the current compilation
282 unit. These numbers are used to create unique labels for various things
283 contained within various function definitions. */
284
285static unsigned current_funcdef_number = 1;
286
287/* A pointer to the ..._DECL node which we have most recently been working
288 on. We keep this around just in case something about it looks screwy
289 and we want to tell the user what the source coordinates for the actual
290 declaration are. */
291
292static tree dwarf_last_decl;
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
310#define FILE_ASM_OP ".file"
311#endif
312#ifndef VERSION_ASM_OP
313#define VERSION_ASM_OP ".version"
314#endif
315#ifndef UNALIGNED_SHORT_ASM_OP
316#define UNALIGNED_SHORT_ASM_OP ".2byte"
317#endif
318#ifndef UNALIGNED_INT_ASM_OP
319#define UNALIGNED_INT_ASM_OP ".4byte"
320#endif
321#ifndef ASM_BYTE_OP
322#define ASM_BYTE_OP ".byte"
323#endif
324#ifndef SET_ASM_OP
325#define SET_ASM_OP ".set"
326#endif
327
328/* Pseudo-ops for pushing the current section onto the section stack (and
329 simultaneously changing to a new section) and for poping back to the
330 section we were in immediately before this one. Note that most svr4
331 assemblers only maintain a one level stack... you can push all the
332 sections you want, but you can only pop out one level. (The sparc
333 svr4 assembler is an exception to this general rule.) That's
334 OK because we only use at most one level of the section stack herein. */
335
336#ifndef PUSHSECTION_ASM_OP
337#define PUSHSECTION_ASM_OP ".section"
338#endif
339#ifndef POPSECTION_ASM_OP
340#define POPSECTION_ASM_OP ".previous"
341#endif
342
343/* The default format used by the ASM_OUTPUT_PUSH_SECTION macro (see below)
344 to print the PUSHSECTION_ASM_OP and the section name. The default here
345 works for almost all svr4 assemblers, except for the sparc, where the
346 section name must be enclosed in double quotes. (See sparcv4.h.) */
347
348#ifndef PUSHSECTION_FORMAT
349#define PUSHSECTION_FORMAT "%s\t%s\n"
350#endif
351
352#ifndef DEBUG_SECTION
353#define DEBUG_SECTION ".debug"
354#endif
355#ifndef LINE_SECTION
356#define LINE_SECTION ".line"
357#endif
358#ifndef SFNAMES_SECTION
359#define SFNAMES_SECTION ".debug_sfnames"
360#endif
361#ifndef SRCINFO_SECTION
362#define SRCINFO_SECTION ".debug_srcinfo"
363#endif
364#ifndef MACINFO_SECTION
365#define MACINFO_SECTION ".debug_macinfo"
366#endif
367#ifndef PUBNAMES_SECTION
368#define PUBNAMES_SECTION ".debug_pubnames"
369#endif
370#ifndef ARANGES_SECTION
371#define ARANGES_SECTION ".debug_aranges"
372#endif
373#ifndef TEXT_SECTION
374#define TEXT_SECTION ".text"
375#endif
376#ifndef DATA_SECTION
377#define DATA_SECTION ".data"
378#endif
379#ifndef DATA1_SECTION
380#define DATA1_SECTION ".data1"
381#endif
382#ifndef RODATA_SECTION
383#define RODATA_SECTION ".rodata"
384#endif
385#ifndef RODATA1_SECTION
386#define RODATA1_SECTION ".rodata1"
387#endif
388#ifndef BSS_SECTION
389#define BSS_SECTION ".bss"
390#endif
391\f
392/* Definitions of defaults for formats and names of various special
393 (artificial) labels which may be generated within this file (when
394 the -g options is used and DWARF_DEBUGGING_INFO is in effect.
395
396 If necessary, these may be overridden from within your tm.h file,
397 but typically, you should never need to override these.
398
399 These labels have been hacked (temporarily) so that they all begin with
400 a `.L' sequence so as to appease the stock sparc/svr4 assembler and the
401 stock m88k/svr4 assembler, both of which need to see .L at the start of
402 a label in order to prevent that label from going into the linker symbol
403 table). When I get time, I'll have to fix this the right way so that we
404 will use ASM_GENERATE_INTERNAL_LABEL and ASM_OUTPUT_INTERNAL_LABEL herein,
405 but that will require a rather massive set of changes. For the moment,
406 the following definitions out to produce the right results for all svr4
407 and svr3 assemblers. -- rfg
408*/
409
410#ifndef TEXT_BEGIN_LABEL
411#define TEXT_BEGIN_LABEL ".L_text_b"
412#endif
413#ifndef TEXT_END_LABEL
414#define TEXT_END_LABEL ".L_text_e"
415#endif
416
417#ifndef DATA_BEGIN_LABEL
418#define DATA_BEGIN_LABEL ".L_data_b"
419#endif
420#ifndef DATA_END_LABEL
421#define DATA_END_LABEL ".L_data_e"
422#endif
423
424#ifndef DATA1_BEGIN_LABEL
425#define DATA1_BEGIN_LABEL ".L_data1_b"
426#endif
427#ifndef DATA1_END_LABEL
428#define DATA1_END_LABEL ".L_data1_e"
429#endif
430
431#ifndef RODATA_BEGIN_LABEL
432#define RODATA_BEGIN_LABEL ".L_rodata_b"
433#endif
434#ifndef RODATA_END_LABEL
435#define RODATA_END_LABEL ".L_rodata_e"
436#endif
437
438#ifndef RODATA1_BEGIN_LABEL
439#define RODATA1_BEGIN_LABEL ".L_rodata1_b"
440#endif
441#ifndef RODATA1_END_LABEL
442#define RODATA1_END_LABEL ".L_rodata1_e"
443#endif
444
445#ifndef BSS_BEGIN_LABEL
446#define BSS_BEGIN_LABEL ".L_bss_b"
447#endif
448#ifndef BSS_END_LABEL
449#define BSS_END_LABEL ".L_bss_e"
450#endif
451
452#ifndef LINE_BEGIN_LABEL
453#define LINE_BEGIN_LABEL ".L_line_b"
454#endif
455#ifndef LINE_LAST_ENTRY_LABEL
456#define LINE_LAST_ENTRY_LABEL ".L_line_last"
457#endif
458#ifndef LINE_END_LABEL
459#define LINE_END_LABEL ".L_line_e"
460#endif
461
462#ifndef DEBUG_BEGIN_LABEL
463#define DEBUG_BEGIN_LABEL ".L_debug_b"
464#endif
465#ifndef SFNAMES_BEGIN_LABEL
466#define SFNAMES_BEGIN_LABEL ".L_sfnames_b"
467#endif
468#ifndef SRCINFO_BEGIN_LABEL
469#define SRCINFO_BEGIN_LABEL ".L_srcinfo_b"
470#endif
471#ifndef MACINFO_BEGIN_LABEL
472#define MACINFO_BEGIN_LABEL ".L_macinfo_b"
473#endif
474
475#ifndef DIE_BEGIN_LABEL_FMT
476#define DIE_BEGIN_LABEL_FMT ".L_D%u"
477#endif
478#ifndef DIE_END_LABEL_FMT
479#define DIE_END_LABEL_FMT ".L_D%u_e"
480#endif
481#ifndef PUB_DIE_LABEL_FMT
482#define PUB_DIE_LABEL_FMT ".L_P%u"
483#endif
484#ifndef INSN_LABEL_FMT
485#define INSN_LABEL_FMT ".L_I%u_%u"
486#endif
487#ifndef BLOCK_BEGIN_LABEL_FMT
488#define BLOCK_BEGIN_LABEL_FMT ".L_B%u"
489#endif
490#ifndef BLOCK_END_LABEL_FMT
491#define BLOCK_END_LABEL_FMT ".L_B%u_e"
492#endif
493#ifndef SS_BEGIN_LABEL_FMT
494#define SS_BEGIN_LABEL_FMT ".L_s%u"
495#endif
496#ifndef SS_END_LABEL_FMT
497#define SS_END_LABEL_FMT ".L_s%u_e"
498#endif
499#ifndef EE_BEGIN_LABEL_FMT
500#define EE_BEGIN_LABEL_FMT ".L_e%u"
501#endif
502#ifndef EE_END_LABEL_FMT
503#define EE_END_LABEL_FMT ".L_e%u_e"
504#endif
505#ifndef MT_BEGIN_LABEL_FMT
506#define MT_BEGIN_LABEL_FMT ".L_t%u"
507#endif
508#ifndef MT_END_LABEL_FMT
509#define MT_END_LABEL_FMT ".L_t%u_e"
510#endif
511#ifndef LOC_BEGIN_LABEL_FMT
512#define LOC_BEGIN_LABEL_FMT ".L_l%u"
513#endif
514#ifndef LOC_END_LABEL_FMT
515#define LOC_END_LABEL_FMT ".L_l%u_e"
516#endif
517#ifndef BOUND_BEGIN_LABEL_FMT
518#define BOUND_BEGIN_LABEL_FMT ".L_b%u_%u_%c"
519#endif
520#ifndef BOUND_END_LABEL_FMT
521#define BOUND_END_LABEL_FMT ".L_b%u_%u_%c_e"
522#endif
523#ifndef DERIV_BEGIN_LABEL_FMT
524#define DERIV_BEGIN_LABEL_FMT ".L_d%u"
525#endif
526#ifndef DERIV_END_LABEL_FMT
527#define DERIV_END_LABEL_FMT ".L_d%u_e"
528#endif
529#ifndef SL_BEGIN_LABEL_FMT
530#define SL_BEGIN_LABEL_FMT ".L_sl%u"
531#endif
532#ifndef SL_END_LABEL_FMT
533#define SL_END_LABEL_FMT ".L_sl%u_e"
534#endif
535#ifndef BODY_BEGIN_LABEL_FMT
536#define BODY_BEGIN_LABEL_FMT ".L_b%u"
537#endif
538#ifndef BODY_END_LABEL_FMT
539#define BODY_END_LABEL_FMT ".L_b%u_e"
540#endif
541#ifndef FUNC_END_LABEL_FMT
542#define FUNC_END_LABEL_FMT ".L_f%u_e"
543#endif
544#ifndef TYPE_NAME_FMT
545#define TYPE_NAME_FMT ".L_T%u"
546#endif
547#ifndef DECL_NAME_FMT
548#define DECL_NAME_FMT ".L_E%u"
549#endif
550#ifndef LINE_CODE_LABEL_FMT
551#define LINE_CODE_LABEL_FMT ".L_LC%u"
552#endif
553#ifndef SFNAMES_ENTRY_LABEL_FMT
554#define SFNAMES_ENTRY_LABEL_FMT ".L_F%u"
555#endif
556#ifndef LINE_ENTRY_LABEL_FMT
557#define LINE_ENTRY_LABEL_FMT ".L_LE%u"
558#endif
559\f
560/* Definitions of defaults for various types of primitive assembly language
561 output operations.
562
563 If necessary, these may be overridden from within your tm.h file,
564 but typically, you shouldn't need to override these. One known
565 exception is ASM_OUTPUT_DEF which has to be different for stock
566 sparc/svr4 assemblers.
567*/
568
569#ifndef ASM_OUTPUT_PUSH_SECTION
570#define ASM_OUTPUT_PUSH_SECTION(FILE, SECTION) \
571 fprintf ((FILE), PUSHSECTION_FORMAT, PUSHSECTION_ASM_OP, SECTION)
572#endif
573
574#ifndef ASM_OUTPUT_POP_SECTION
575#define ASM_OUTPUT_POP_SECTION(FILE) \
576 fprintf ((FILE), "\t%s\n", POPSECTION_ASM_OP)
577#endif
578
579#ifndef ASM_OUTPUT_SOURCE_FILENAME
580#define ASM_OUTPUT_SOURCE_FILENAME(FILE,NAME) \
581 fprintf ((FILE), "\t%s\t\"%s\"\n", FILE_ASM_OP, NAME)
582#endif
583
584#ifndef ASM_OUTPUT_DEF
585#define ASM_OUTPUT_DEF(FILE,LABEL1,LABEL2) \
586 do { fprintf ((FILE), "\t%s\t", SET_ASM_OP); \
587 assemble_name (FILE, LABEL1); \
588 fprintf (FILE, ","); \
589 assemble_name (FILE, LABEL2); \
590 fprintf (FILE, "\n"); \
591 } while (0)
592#endif
593
594#ifndef ASM_OUTPUT_DWARF_DELTA2
595#define ASM_OUTPUT_DWARF_DELTA2(FILE,LABEL1,LABEL2) \
596 do { fprintf ((FILE), "\t%s\t", UNALIGNED_SHORT_ASM_OP); \
597 assemble_name (FILE, LABEL1); \
598 fprintf (FILE, "-"); \
599 assemble_name (FILE, LABEL2); \
600 fprintf (FILE, "\n"); \
601 } while (0)
602#endif
603
604#ifndef ASM_OUTPUT_DWARF_DELTA4
605#define ASM_OUTPUT_DWARF_DELTA4(FILE,LABEL1,LABEL2) \
606 do { fprintf ((FILE), "\t%s\t", UNALIGNED_INT_ASM_OP); \
607 assemble_name (FILE, LABEL1); \
608 fprintf (FILE, "-"); \
609 assemble_name (FILE, LABEL2); \
610 fprintf (FILE, "\n"); \
611 } while (0)
612#endif
613
614#ifndef ASM_OUTPUT_DWARF_TAG
615#define ASM_OUTPUT_DWARF_TAG(FILE,TAG) \
616 do { \
617 fprintf ((FILE), "\t%s\t0x%x", \
618 UNALIGNED_SHORT_ASM_OP, (unsigned) TAG); \
619 if (flag_verbose_asm) \
620 fprintf ((FILE), "\t%s %s", \
621 ASM_COMMENT_START, dwarf_tag_name (TAG)); \
622 fputc ('\n', (FILE)); \
623 } while (0)
624#endif
625
626#ifndef ASM_OUTPUT_DWARF_ATTRIBUTE
627#define ASM_OUTPUT_DWARF_ATTRIBUTE(FILE,ATTR) \
628 do { \
629 fprintf ((FILE), "\t%s\t0x%x", \
630 UNALIGNED_SHORT_ASM_OP, (unsigned) ATTR); \
631 if (flag_verbose_asm) \
632 fprintf ((FILE), "\t%s %s", \
633 ASM_COMMENT_START, dwarf_attr_name (ATTR)); \
634 fputc ('\n', (FILE)); \
635 } while (0)
636#endif
637
638#ifndef ASM_OUTPUT_DWARF_STACK_OP
639#define ASM_OUTPUT_DWARF_STACK_OP(FILE,OP) \
640 do { \
641 fprintf ((FILE), "\t%s\t0x%x", ASM_BYTE_OP, (unsigned) OP); \
642 if (flag_verbose_asm) \
643 fprintf ((FILE), "\t%s %s", \
644 ASM_COMMENT_START, dwarf_stack_op_name (OP)); \
645 fputc ('\n', (FILE)); \
646 } while (0)
647#endif
648
649#ifndef ASM_OUTPUT_DWARF_FUND_TYPE
650#define ASM_OUTPUT_DWARF_FUND_TYPE(FILE,FT) \
651 do { \
652 fprintf ((FILE), "\t%s\t0x%x", \
653 UNALIGNED_SHORT_ASM_OP, (unsigned) FT); \
654 if (flag_verbose_asm) \
655 fprintf ((FILE), "\t%s %s", \
656 ASM_COMMENT_START, dwarf_fund_type_name (FT)); \
657 fputc ('\n', (FILE)); \
658 } while (0)
659#endif
660
661#ifndef ASM_OUTPUT_DWARF_FMT_BYTE
662#define ASM_OUTPUT_DWARF_FMT_BYTE(FILE,FMT) \
663 do { \
664 fprintf ((FILE), "\t%s\t0x%x", ASM_BYTE_OP, (unsigned) FMT); \
665 if (flag_verbose_asm) \
666 fprintf ((FILE), "\t%s %s", \
667 ASM_COMMENT_START, dwarf_fmt_byte_name (FMT)); \
668 fputc ('\n', (FILE)); \
669 } while (0)
670#endif
671
672#ifndef ASM_OUTPUT_DWARF_TYPE_MODIFIER
673#define ASM_OUTPUT_DWARF_TYPE_MODIFIER(FILE,MOD) \
674 do { \
675 fprintf ((FILE), "\t%s\t0x%x", ASM_BYTE_OP, (unsigned) MOD); \
676 if (flag_verbose_asm) \
677 fprintf ((FILE), "\t%s %s", \
678 ASM_COMMENT_START, dwarf_typemod_name (MOD)); \
679 fputc ('\n', (FILE)); \
680 } while (0)
681#endif
682\f
683#ifndef ASM_OUTPUT_DWARF_ADDR
684#define ASM_OUTPUT_DWARF_ADDR(FILE,LABEL) \
685 do { fprintf ((FILE), "\t%s\t", UNALIGNED_INT_ASM_OP); \
686 assemble_name (FILE, LABEL); \
687 fprintf (FILE, "\n"); \
688 } while (0)
689#endif
690
691#ifndef ASM_OUTPUT_DWARF_ADDR_CONST
692#define ASM_OUTPUT_DWARF_ADDR_CONST(FILE,RTX) \
693 do { \
694 fprintf ((FILE), "\t%s\t", UNALIGNED_INT_ASM_OP); \
695 output_addr_const ((FILE), (RTX)); \
696 fputc ('\n', (FILE)); \
697 } while (0)
698#endif
699
700#ifndef ASM_OUTPUT_DWARF_REF
701#define ASM_OUTPUT_DWARF_REF(FILE,LABEL) \
702 do { fprintf ((FILE), "\t%s\t", UNALIGNED_INT_ASM_OP); \
703 assemble_name (FILE, LABEL); \
704 fprintf (FILE, "\n"); \
705 } while (0)
706#endif
707
708#ifndef ASM_OUTPUT_DWARF_DATA1
709#define ASM_OUTPUT_DWARF_DATA1(FILE,VALUE) \
710 fprintf ((FILE), "\t%s\t0x%x\n", ASM_BYTE_OP, VALUE)
711#endif
712
713#ifndef ASM_OUTPUT_DWARF_DATA2
714#define ASM_OUTPUT_DWARF_DATA2(FILE,VALUE) \
715 fprintf ((FILE), "\t%s\t0x%x\n", UNALIGNED_SHORT_ASM_OP, (unsigned) VALUE)
716#endif
717
718#ifndef ASM_OUTPUT_DWARF_DATA4
719#define ASM_OUTPUT_DWARF_DATA4(FILE,VALUE) \
720 fprintf ((FILE), "\t%s\t0x%x\n", UNALIGNED_INT_ASM_OP, (unsigned) VALUE)
721#endif
722
723#ifndef ASM_OUTPUT_DWARF_DATA8
724#define ASM_OUTPUT_DWARF_DATA8(FILE,HIGH_VALUE,LOW_VALUE) \
725 do { \
726 if (WORDS_BIG_ENDIAN) \
727 { \
728 fprintf ((FILE), "\t%s\t0x%x\n", UNALIGNED_INT_ASM_OP, HIGH_VALUE); \
729 fprintf ((FILE), "\t%s\t0x%x\n", UNALIGNED_INT_ASM_OP, LOW_VALUE);\
730 } \
731 else \
732 { \
733 fprintf ((FILE), "\t%s\t0x%x\n", UNALIGNED_INT_ASM_OP, LOW_VALUE);\
734 fprintf ((FILE), "\t%s\t0x%x\n", UNALIGNED_INT_ASM_OP, HIGH_VALUE); \
735 } \
736 } while (0)
737#endif
738
739#ifndef ASM_OUTPUT_DWARF_STRING
740#define ASM_OUTPUT_DWARF_STRING(FILE,P) \
741 ASM_OUTPUT_ASCII ((FILE), P, strlen (P)+1)
742#endif
743\f
744/************************ general utility functions **************************/
745
746inline char *
747xstrdup (s)
748 register char *s;
749{
750 register char *p = (char *) xmalloc (strlen (s) + 1);
751
752 strcpy (p, s);
753 return p;
754}
755
756inline int
757is_pseudo_reg (rtl)
758 register rtx rtl;
759{
760 return (((GET_CODE (rtl) == REG) && (REGNO (rtl) >= FIRST_PSEUDO_REGISTER))
761 || ((GET_CODE (rtl) == SUBREG)
762 && (REGNO (XEXP (rtl, 0)) >= FIRST_PSEUDO_REGISTER)));
763}
764
5bd49366
PR
765inline tree
766type_main_variant (type)
767 register tree type;
768{
769 type = TYPE_MAIN_VARIANT (type);
770
771 /* There really should be only one main variant among any group of variants
772 of a given type (and all of the MAIN_VARIANT values for all members of
773 the group should point to that one type) but sometimes the C front-end
774 messes this up for array types, so we work around that bug here. */
775
776 if (TREE_CODE (type) == ARRAY_TYPE)
777 {
778 while (type != TYPE_MAIN_VARIANT (type))
779 type = TYPE_MAIN_VARIANT (type);
780 }
781
782 return type;
783}
784
9bf86ebb
PR
785/* Return non-zero if the given type node represents a tagged type. */
786
787inline int
788is_tagged_type (type)
789 register tree type;
790{
791 register enum tree_code code = TREE_CODE (type);
792
793 return (code == RECORD_TYPE || code == UNION_TYPE
794 || code == QUAL_UNION_TYPE || code == ENUMERAL_TYPE);
795}
796
797static char *
798dwarf_tag_name (tag)
799 register unsigned tag;
800{
801 switch (tag)
802 {
803 case TAG_padding: return "TAG_padding";
804 case TAG_array_type: return "TAG_array_type";
805 case TAG_class_type: return "TAG_class_type";
806 case TAG_entry_point: return "TAG_entry_point";
807 case TAG_enumeration_type: return "TAG_enumeration_type";
808 case TAG_formal_parameter: return "TAG_formal_parameter";
809 case TAG_global_subroutine: return "TAG_global_subroutine";
810 case TAG_global_variable: return "TAG_global_variable";
811 case TAG_label: return "TAG_label";
812 case TAG_lexical_block: return "TAG_lexical_block";
813 case TAG_local_variable: return "TAG_local_variable";
814 case TAG_member: return "TAG_member";
815 case TAG_pointer_type: return "TAG_pointer_type";
816 case TAG_reference_type: return "TAG_reference_type";
817 case TAG_compile_unit: return "TAG_compile_unit";
818 case TAG_string_type: return "TAG_string_type";
819 case TAG_structure_type: return "TAG_structure_type";
820 case TAG_subroutine: return "TAG_subroutine";
821 case TAG_subroutine_type: return "TAG_subroutine_type";
822 case TAG_typedef: return "TAG_typedef";
823 case TAG_union_type: return "TAG_union_type";
824 case TAG_unspecified_parameters: return "TAG_unspecified_parameters";
825 case TAG_variant: return "TAG_variant";
826 case TAG_common_block: return "TAG_common_block";
827 case TAG_common_inclusion: return "TAG_common_inclusion";
828 case TAG_inheritance: return "TAG_inheritance";
829 case TAG_inlined_subroutine: return "TAG_inlined_subroutine";
830 case TAG_module: return "TAG_module";
831 case TAG_ptr_to_member_type: return "TAG_ptr_to_member_type";
832 case TAG_set_type: return "TAG_set_type";
833 case TAG_subrange_type: return "TAG_subrange_type";
834 case TAG_with_stmt: return "TAG_with_stmt";
835
836 /* GNU extensions. */
837
838 case TAG_format_label: return "TAG_format_label";
839 case TAG_namelist: return "TAG_namelist";
840 case TAG_function_template: return "TAG_function_template";
841 case TAG_class_template: return "TAG_class_template";
842
843 default: return "TAG_<unknown>";
844 }
845}
846
847static char *
848dwarf_attr_name (attr)
849 register unsigned attr;
850{
851 switch (attr)
852 {
853 case AT_sibling: return "AT_sibling";
854 case AT_location: return "AT_location";
855 case AT_name: return "AT_name";
856 case AT_fund_type: return "AT_fund_type";
857 case AT_mod_fund_type: return "AT_mod_fund_type";
858 case AT_user_def_type: return "AT_user_def_type";
859 case AT_mod_u_d_type: return "AT_mod_u_d_type";
860 case AT_ordering: return "AT_ordering";
861 case AT_subscr_data: return "AT_subscr_data";
862 case AT_byte_size: return "AT_byte_size";
863 case AT_bit_offset: return "AT_bit_offset";
864 case AT_bit_size: return "AT_bit_size";
865 case AT_element_list: return "AT_element_list";
866 case AT_stmt_list: return "AT_stmt_list";
867 case AT_low_pc: return "AT_low_pc";
868 case AT_high_pc: return "AT_high_pc";
869 case AT_language: return "AT_language";
870 case AT_member: return "AT_member";
871 case AT_discr: return "AT_discr";
872 case AT_discr_value: return "AT_discr_value";
873 case AT_string_length: return "AT_string_length";
874 case AT_common_reference: return "AT_common_reference";
875 case AT_comp_dir: return "AT_comp_dir";
876 case AT_const_value_string: return "AT_const_value_string";
877 case AT_const_value_data2: return "AT_const_value_data2";
878 case AT_const_value_data4: return "AT_const_value_data4";
879 case AT_const_value_data8: return "AT_const_value_data8";
880 case AT_const_value_block2: return "AT_const_value_block2";
881 case AT_const_value_block4: return "AT_const_value_block4";
882 case AT_containing_type: return "AT_containing_type";
883 case AT_default_value_addr: return "AT_default_value_addr";
884 case AT_default_value_data2: return "AT_default_value_data2";
885 case AT_default_value_data4: return "AT_default_value_data4";
886 case AT_default_value_data8: return "AT_default_value_data8";
887 case AT_default_value_string: return "AT_default_value_string";
888 case AT_friends: return "AT_friends";
889 case AT_inline: return "AT_inline";
890 case AT_is_optional: return "AT_is_optional";
891 case AT_lower_bound_ref: return "AT_lower_bound_ref";
892 case AT_lower_bound_data2: return "AT_lower_bound_data2";
893 case AT_lower_bound_data4: return "AT_lower_bound_data4";
894 case AT_lower_bound_data8: return "AT_lower_bound_data8";
895 case AT_private: return "AT_private";
896 case AT_producer: return "AT_producer";
897 case AT_program: return "AT_program";
898 case AT_protected: return "AT_protected";
899 case AT_prototyped: return "AT_prototyped";
900 case AT_public: return "AT_public";
901 case AT_pure_virtual: return "AT_pure_virtual";
902 case AT_return_addr: return "AT_return_addr";
903 case AT_abstract_origin: return "AT_abstract_origin";
904 case AT_start_scope: return "AT_start_scope";
905 case AT_stride_size: return "AT_stride_size";
906 case AT_upper_bound_ref: return "AT_upper_bound_ref";
907 case AT_upper_bound_data2: return "AT_upper_bound_data2";
908 case AT_upper_bound_data4: return "AT_upper_bound_data4";
909 case AT_upper_bound_data8: return "AT_upper_bound_data8";
910 case AT_virtual: return "AT_virtual";
911
912 /* GNU extensions */
913
914 case AT_sf_names: return "AT_sf_names";
915 case AT_src_info: return "AT_src_info";
916 case AT_mac_info: return "AT_mac_info";
917 case AT_src_coords: return "AT_src_coords";
918 case AT_body_begin: return "AT_body_begin";
919 case AT_body_end: return "AT_body_end";
920
921 default: return "AT_<unknown>";
922 }
923}
924
925static char *
926dwarf_stack_op_name (op)
927 register unsigned op;
928{
929 switch (op)
930 {
931 case OP_REG: return "OP_REG";
932 case OP_BASEREG: return "OP_BASEREG";
933 case OP_ADDR: return "OP_ADDR";
934 case OP_CONST: return "OP_CONST";
935 case OP_DEREF2: return "OP_DEREF2";
936 case OP_DEREF4: return "OP_DEREF4";
937 case OP_ADD: return "OP_ADD";
938 default: return "OP_<unknown>";
939 }
940}
941
942static char *
943dwarf_typemod_name (mod)
944 register unsigned mod;
945{
946 switch (mod)
947 {
948 case MOD_pointer_to: return "MOD_pointer_to";
949 case MOD_reference_to: return "MOD_reference_to";
950 case MOD_const: return "MOD_const";
951 case MOD_volatile: return "MOD_volatile";
952 default: return "MOD_<unknown>";
953 }
954}
955
956static char *
957dwarf_fmt_byte_name (fmt)
958 register unsigned fmt;
959{
960 switch (fmt)
961 {
962 case FMT_FT_C_C: return "FMT_FT_C_C";
963 case FMT_FT_C_X: return "FMT_FT_C_X";
964 case FMT_FT_X_C: return "FMT_FT_X_C";
965 case FMT_FT_X_X: return "FMT_FT_X_X";
966 case FMT_UT_C_C: return "FMT_UT_C_C";
967 case FMT_UT_C_X: return "FMT_UT_C_X";
968 case FMT_UT_X_C: return "FMT_UT_X_C";
969 case FMT_UT_X_X: return "FMT_UT_X_X";
970 case FMT_ET: return "FMT_ET";
971 default: return "FMT_<unknown>";
972 }
973}
974static char *
975dwarf_fund_type_name (ft)
976 register unsigned ft;
977{
978 switch (ft)
979 {
980 case FT_char: return "FT_char";
981 case FT_signed_char: return "FT_signed_char";
982 case FT_unsigned_char: return "FT_unsigned_char";
983 case FT_short: return "FT_short";
984 case FT_signed_short: return "FT_signed_short";
985 case FT_unsigned_short: return "FT_unsigned_short";
986 case FT_integer: return "FT_integer";
987 case FT_signed_integer: return "FT_signed_integer";
988 case FT_unsigned_integer: return "FT_unsigned_integer";
989 case FT_long: return "FT_long";
990 case FT_signed_long: return "FT_signed_long";
991 case FT_unsigned_long: return "FT_unsigned_long";
992 case FT_pointer: return "FT_pointer";
993 case FT_float: return "FT_float";
994 case FT_dbl_prec_float: return "FT_dbl_prec_float";
995 case FT_ext_prec_float: return "FT_ext_prec_float";
996 case FT_complex: return "FT_complex";
997 case FT_dbl_prec_complex: return "FT_dbl_prec_complex";
998 case FT_void: return "FT_void";
999 case FT_boolean: return "FT_boolean";
1000 case FT_ext_prec_complex: return "FT_ext_prec_complex";
1001 case FT_label: return "FT_label";
1002
1003 /* GNU extensions. */
1004
1005 case FT_long_long: return "FT_long_long";
1006 case FT_signed_long_long: return "FT_signed_long_long";
1007 case FT_unsigned_long_long: return "FT_unsigned_long_long";
1008
1009 case FT_int8: return "FT_int8";
1010 case FT_signed_int8: return "FT_signed_int8";
1011 case FT_unsigned_int8: return "FT_unsigned_int8";
1012 case FT_int16: return "FT_int16";
1013 case FT_signed_int16: return "FT_signed_int16";
1014 case FT_unsigned_int16: return "FT_unsigned_int16";
1015 case FT_int32: return "FT_int32";
1016 case FT_signed_int32: return "FT_signed_int32";
1017 case FT_unsigned_int32: return "FT_unsigned_int32";
1018 case FT_int64: return "FT_int64";
1019 case FT_signed_int64: return "FT_signed_int64";
1020 case FT_unsigned_int64: return "FT_signed_int64";
1021
1022 case FT_real32: return "FT_real32";
1023 case FT_real64: return "FT_real64";
1024 case FT_real96: return "FT_real96";
1025 case FT_real128: return "FT_real128";
1026
1027 default: return "FT_<unknown>";
1028 }
1029}
1030
1031/* Determine the "ultimate origin" of a decl. The decl may be an
1032 inlined instance of an inlined instance of a decl which is local
1033 to an inline function, so we have to trace all of the way back
1034 through the origin chain to find out what sort of node actually
1035 served as the original seed for the given block. */
1036
1037static tree
1038decl_ultimate_origin (decl)
1039 register tree decl;
1040{
1041 register tree immediate_origin = DECL_ABSTRACT_ORIGIN (decl);
1042
1043 if (immediate_origin == NULL)
1044 return NULL;
1045 else
1046 {
1047 register tree ret_val;
1048 register tree lookahead = immediate_origin;
1049
1050 do
1051 {
1052 ret_val = lookahead;
1053 lookahead = DECL_ABSTRACT_ORIGIN (ret_val);
1054 }
1055 while (lookahead != NULL && lookahead != ret_val);
1056 return ret_val;
1057 }
1058}
1059
1060/* Determine the "ultimate origin" of a block. The block may be an
1061 inlined instance of an inlined instance of a block which is local
1062 to an inline function, so we have to trace all of the way back
1063 through the origin chain to find out what sort of node actually
1064 served as the original seed for the given block. */
1065
1066static tree
1067block_ultimate_origin (block)
1068 register tree block;
1069{
1070 register tree immediate_origin = BLOCK_ABSTRACT_ORIGIN (block);
1071
1072 if (immediate_origin == NULL)
1073 return NULL;
1074 else
1075 {
1076 register tree ret_val;
1077 register tree lookahead = immediate_origin;
1078
1079 do
1080 {
1081 ret_val = lookahead;
1082 lookahead = (TREE_CODE (ret_val) == BLOCK)
1083 ? BLOCK_ABSTRACT_ORIGIN (ret_val)
1084 : NULL;
1085 }
1086 while (lookahead != NULL && lookahead != ret_val);
1087 return ret_val;
1088 }
1089}
1090
1091static void
1092output_unsigned_leb128 (value)
1093 register unsigned long value;
1094{
1095 register unsigned long orig_value = value;
1096
1097 do
1098 {
1099 register unsigned byte = (value & 0x7f);
1100
1101 value >>= 7;
1102 if (value != 0) /* more bytes to follow */
1103 byte |= 0x80;
1104 fprintf (asm_out_file, "\t%s\t0x%x", ASM_BYTE_OP, (unsigned) byte);
1105 if (flag_verbose_asm && value == 0)
1106 fprintf (asm_out_file, "\t%s ULEB128 number - value = %u",
1107 ASM_COMMENT_START, orig_value);
1108 fputc ('\n', asm_out_file);
1109 }
1110 while (value != 0);
1111}
1112
1113static void
1114output_signed_leb128 (value)
1115 register long value;
1116{
1117 register long orig_value = value;
1118 register int negative = (value < 0);
1119 register int more;
1120
1121 do
1122 {
1123 register unsigned byte = (value & 0x7f);
1124
1125 value >>= 7;
1126 if (negative)
1127 value |= 0xfe000000; /* manually sign extend */
1128 if (((value == 0) && ((byte & 0x40) == 0))
1129 || ((value == -1) && ((byte & 0x40) == 1)))
1130 more = 0;
1131 else
1132 {
1133 byte |= 0x80;
1134 more = 1;
1135 }
1136 fprintf (asm_out_file, "\t%s\t0x%x", ASM_BYTE_OP, (unsigned) byte);
1137 if (flag_verbose_asm && more == 0)
1138 fprintf (asm_out_file, "\t%s SLEB128 number - value = %d",
1139 ASM_COMMENT_START, orig_value);
1140 fputc ('\n', asm_out_file);
1141 }
1142 while (more);
1143}
1144\f
1145/**************** utility functions for attribute functions ******************/
1146
1147/* Given a pointer to a BLOCK node return non-zero if (and only if) the
1148 node in question represents the outermost pair of curly braces (i.e.
1149 the "body block") of a function or method.
1150
1151 For any BLOCK node representing a "body block" of a function or method,
1152 the BLOCK_SUPERCONTEXT of the node will point to another BLOCK node
1153 which represents the outermost (function) scope for the function or
1154 method (i.e. the one which includes the formal parameters). The
1155 BLOCK_SUPERCONTEXT of *that* node in turn will point to the relevant
1156 FUNCTION_DECL node.
1157*/
1158
1159inline int
1160is_body_block (stmt)
1161 register tree stmt;
1162{
1163 if (TREE_CODE (stmt) == BLOCK)
1164 {
1165 register tree parent = BLOCK_SUPERCONTEXT (stmt);
1166
1167 if (TREE_CODE (parent) == BLOCK)
1168 {
1169 register tree grandparent = BLOCK_SUPERCONTEXT (parent);
1170
1171 if (TREE_CODE (grandparent) == FUNCTION_DECL)
1172 return 1;
1173 }
1174 }
1175 return 0;
1176}
1177
1178/* Given a pointer to a tree node for some type, return a Dwarf fundamental
1179 type code for the given type.
1180
1181 This routine must only be called for GCC type nodes that correspond to
1182 Dwarf fundamental types.
1183
1184 The current Dwarf draft specification calls for Dwarf fundamental types
1185 to accurately reflect the fact that a given type was either a "plain"
1186 integral type or an explicitly "signed" integral type. Unfortunately,
1187 we can't always do this, because GCC may already have thrown away the
1188 information about the precise way in which the type was originally
1189 specified, as in:
1190
1191 typedef signed int my_type;
1192
1193 struct s { my_type f; };
1194
1195 Since we may be stuck here without enought information to do exactly
1196 what is called for in the Dwarf draft specification, we do the best
1197 that we can under the circumstances and always use the "plain" integral
1198 fundamental type codes for int, short, and long types. That's probably
1199 good enough. The additional accuracy called for in the current DWARF
1200 draft specification is probably never even useful in practice. */
1201
1202static int
1203fundamental_type_code (type)
1204 register tree type;
1205{
1206 if (TREE_CODE (type) == ERROR_MARK)
1207 return 0;
1208
1209 switch (TREE_CODE (type))
1210 {
1211 case ERROR_MARK:
1212 return FT_void;
1213
1214 case VOID_TYPE:
1215 return FT_void;
1216
1217 case INTEGER_TYPE:
1218 /* Carefully distinguish all the standard types of C,
1219 without messing up if the language is not C.
1220 Note that we check only for the names that contain spaces;
1221 other names might occur by coincidence in other languages. */
1222 if (TYPE_NAME (type) != 0
1223 && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
1224 && DECL_NAME (TYPE_NAME (type)) != 0
1225 && TREE_CODE (DECL_NAME (TYPE_NAME (type))) == IDENTIFIER_NODE)
1226 {
1227 char *name = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)));
1228
1229 if (!strcmp (name, "unsigned char"))
1230 return FT_unsigned_char;
1231 if (!strcmp (name, "signed char"))
1232 return FT_signed_char;
1233 if (!strcmp (name, "unsigned int"))
1234 return FT_unsigned_integer;
1235 if (!strcmp (name, "short int"))
1236 return FT_short;
1237 if (!strcmp (name, "short unsigned int"))
1238 return FT_unsigned_short;
1239 if (!strcmp (name, "long int"))
1240 return FT_long;
1241 if (!strcmp (name, "long unsigned int"))
1242 return FT_unsigned_long;
1243 if (!strcmp (name, "long long int"))
1244 return FT_long_long; /* Not grok'ed by svr4 SDB */
1245 if (!strcmp (name, "long long unsigned int"))
1246 return FT_unsigned_long_long; /* Not grok'ed by svr4 SDB */
1247 }
1248
1249 /* Most integer types will be sorted out above, however, for the
1250 sake of special `array index' integer types, the following code
1251 is also provided. */
1252
1253 if (TYPE_PRECISION (type) == INT_TYPE_SIZE)
1254 return (TREE_UNSIGNED (type) ? FT_unsigned_integer : FT_integer);
1255
1256 if (TYPE_PRECISION (type) == LONG_TYPE_SIZE)
1257 return (TREE_UNSIGNED (type) ? FT_unsigned_long : FT_long);
1258
1259 if (TYPE_PRECISION (type) == LONG_LONG_TYPE_SIZE)
1260 return (TREE_UNSIGNED (type) ? FT_unsigned_long_long : FT_long_long);
1261
1262 if (TYPE_PRECISION (type) == SHORT_TYPE_SIZE)
1263 return (TREE_UNSIGNED (type) ? FT_unsigned_short : FT_short);
1264
1265 if (TYPE_PRECISION (type) == CHAR_TYPE_SIZE)
1266 return (TREE_UNSIGNED (type) ? FT_unsigned_char : FT_char);
1267
1268 abort ();
1269
1270 case REAL_TYPE:
1271 /* Carefully distinguish all the standard types of C,
1272 without messing up if the language is not C. */
1273 if (TYPE_NAME (type) != 0
1274 && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
1275 && DECL_NAME (TYPE_NAME (type)) != 0
1276 && TREE_CODE (DECL_NAME (TYPE_NAME (type))) == IDENTIFIER_NODE)
1277 {
1278 char *name = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)));
1279
1280 /* Note that here we can run afowl of a serious bug in "classic"
1281 svr4 SDB debuggers. They don't seem to understand the
1282 FT_ext_prec_float type (even though they should). */
1283
1284 if (!strcmp (name, "long double"))
1285 return FT_ext_prec_float;
1286 }
1287
1288 if (TYPE_PRECISION (type) == DOUBLE_TYPE_SIZE)
1289 return FT_dbl_prec_float;
1290 if (TYPE_PRECISION (type) == FLOAT_TYPE_SIZE)
1291 return FT_float;
1292
1293 /* Note that here we can run afowl of a serious bug in "classic"
1294 svr4 SDB debuggers. They don't seem to understand the
1295 FT_ext_prec_float type (even though they should). */
1296
1297 if (TYPE_PRECISION (type) == LONG_DOUBLE_TYPE_SIZE)
1298 return FT_ext_prec_float;
1299 abort ();
1300
1301 case COMPLEX_TYPE:
1302 return FT_complex; /* GNU FORTRAN COMPLEX type. */
1303
1304 case CHAR_TYPE:
1305 return FT_char; /* GNU Pascal CHAR type. Not used in C. */
1306
1307 case BOOLEAN_TYPE:
1308 return FT_boolean; /* GNU FORTRAN BOOLEAN type. */
1309
1310 default:
1311 abort (); /* No other TREE_CODEs are Dwarf fundamental types. */
1312 }
1313 return 0;
1314}
1315\f
1316/* Given a pointer to an arbitrary ..._TYPE tree node, return a pointer to
1317 the Dwarf "root" type for the given input type. The Dwarf "root" type
1318 of a given type is generally the same as the given type, except that if
1319 the given type is a pointer or reference type, then the root type of
1320 the given type is the root type of the "basis" type for the pointer or
1321 reference type. (This definition of the "root" type is recursive.)
1322 Also, the root type of a `const' qualified type or a `volatile'
1323 qualified type is the root type of the given type without the
1324 qualifiers. */
1325
1326static tree
1327root_type (type)
1328 register tree type;
1329{
1330 if (TREE_CODE (type) == ERROR_MARK)
1331 return error_mark_node;
1332
1333 switch (TREE_CODE (type))
1334 {
1335 case ERROR_MARK:
1336 return error_mark_node;
1337
1338 case POINTER_TYPE:
1339 case REFERENCE_TYPE:
5bd49366 1340 return type_main_variant (root_type (TREE_TYPE (type)));
9bf86ebb
PR
1341
1342 default:
5bd49366 1343 return type_main_variant (type);
9bf86ebb
PR
1344 }
1345}
1346
1347/* Given a pointer to an arbitrary ..._TYPE tree node, write out a sequence
1348 of zero or more Dwarf "type-modifier" bytes applicable to the type. */
1349
1350static void
1351write_modifier_bytes (type, decl_const, decl_volatile)
1352 register tree type;
1353 register int decl_const;
1354 register int decl_volatile;
1355{
1356 if (TREE_CODE (type) == ERROR_MARK)
1357 return;
1358
1359 if (TYPE_READONLY (type) || decl_const)
1360 ASM_OUTPUT_DWARF_TYPE_MODIFIER (asm_out_file, MOD_const);
1361 if (TYPE_VOLATILE (type) || decl_volatile)
1362 ASM_OUTPUT_DWARF_TYPE_MODIFIER (asm_out_file, MOD_volatile);
1363 switch (TREE_CODE (type))
1364 {
1365 case POINTER_TYPE:
1366 ASM_OUTPUT_DWARF_TYPE_MODIFIER (asm_out_file, MOD_pointer_to);
1367 write_modifier_bytes (TREE_TYPE (type), 0, 0);
1368 return;
1369
1370 case REFERENCE_TYPE:
1371 ASM_OUTPUT_DWARF_TYPE_MODIFIER (asm_out_file, MOD_reference_to);
1372 write_modifier_bytes (TREE_TYPE (type), 0, 0);
1373 return;
1374
1375 case ERROR_MARK:
1376 default:
1377 return;
1378 }
1379}
1380\f
1381/* Given a pointer to an arbitrary ..._TYPE tree node, return non-zero if the
1382 given input type is a Dwarf "fundamental" type. Otherwise return zero. */
1383
1384inline int
1385type_is_fundamental (type)
1386 register tree type;
1387{
1388 switch (TREE_CODE (type))
1389 {
1390 case ERROR_MARK:
1391 case VOID_TYPE:
1392 case INTEGER_TYPE:
1393 case REAL_TYPE:
1394 case COMPLEX_TYPE:
1395 case BOOLEAN_TYPE:
1396 case CHAR_TYPE:
1397 return 1;
1398
1399 case SET_TYPE:
1400 case ARRAY_TYPE:
1401 case RECORD_TYPE:
1402 case UNION_TYPE:
1403 case QUAL_UNION_TYPE:
1404 case ENUMERAL_TYPE:
1405 case FUNCTION_TYPE:
1406 case METHOD_TYPE:
1407 case POINTER_TYPE:
1408 case REFERENCE_TYPE:
1409 case STRING_TYPE:
1410 case FILE_TYPE:
1411 case OFFSET_TYPE:
1412 case LANG_TYPE:
1413 return 0;
1414
1415 default:
1416 abort ();
1417 }
1418 return 0;
1419}
1420
1421/* Given a pointer to some ..._DECL tree node, generate an assembly language
1422 equate directive which will associate a symbolic name with the current DIE.
1423
1424 The name used is an artificial label generated from the DECL_UID number
1425 associated with the given decl node. The name it gets equated to is the
1426 symbolic label that we (previously) output at the start of the DIE that
1427 we are currently generating.
1428
1429 Calling this function while generating some "decl related" form of DIE
1430 makes it possible to later refer to the DIE which represents the given
1431 decl simply by re-generating the symbolic name from the ..._DECL node's
1432 UID number. */
1433
1434static void
1435equate_decl_number_to_die_number (decl)
1436 register tree decl;
1437{
1438 /* In the case where we are generating a DIE for some ..._DECL node
1439 which represents either some inline function declaration or some
1440 entity declared within an inline function declaration/definition,
1441 setup a symbolic name for the current DIE so that we have a name
1442 for this DIE that we can easily refer to later on within
1443 AT_abstract_origin attributes. */
1444
1445 char decl_label[MAX_ARTIFICIAL_LABEL_BYTES];
1446 char die_label[MAX_ARTIFICIAL_LABEL_BYTES];
1447
1448 sprintf (decl_label, DECL_NAME_FMT, DECL_UID (decl));
1449 sprintf (die_label, DIE_BEGIN_LABEL_FMT, current_dienum);
1450 ASM_OUTPUT_DEF (asm_out_file, decl_label, die_label);
1451}
1452
1453/* Given a pointer to some ..._TYPE tree node, generate an assembly language
1454 equate directive which will associate a symbolic name with the current DIE.
1455
1456 The name used is an artificial label generated from the TYPE_UID number
1457 associated with the given type node. The name it gets equated to is the
1458 symbolic label that we (previously) output at the start of the DIE that
1459 we are currently generating.
1460
1461 Calling this function while generating some "type related" form of DIE
1462 makes it easy to later refer to the DIE which represents the given type
1463 simply by re-generating the alternative name from the ..._TYPE node's
1464 UID number. */
1465
1466inline void
1467equate_type_number_to_die_number (type)
1468 register tree type;
1469{
1470 char type_label[MAX_ARTIFICIAL_LABEL_BYTES];
1471 char die_label[MAX_ARTIFICIAL_LABEL_BYTES];
1472
1473 /* We are generating a DIE to represent the main variant of this type
1474 (i.e the type without any const or volatile qualifiers) so in order
1475 to get the equate to come out right, we need to get the main variant
1476 itself here. */
1477
5bd49366 1478 type = type_main_variant (type);
9bf86ebb
PR
1479
1480 sprintf (type_label, TYPE_NAME_FMT, TYPE_UID (type));
1481 sprintf (die_label, DIE_BEGIN_LABEL_FMT, current_dienum);
1482 ASM_OUTPUT_DEF (asm_out_file, type_label, die_label);
1483}
1484
1485static void
1486output_reg_number (rtl)
1487 register rtx rtl;
1488{
1489 register unsigned regno = REGNO (rtl);
1490
1491 if (regno >= FIRST_PSEUDO_REGISTER)
1492 {
1493 warning_with_decl (dwarf_last_decl, "internal regno botch: regno = %d\n",
1494 regno);
1495 regno = 0;
1496 }
1497 fprintf (asm_out_file, "\t%s\t0x%x",
1498 UNALIGNED_INT_ASM_OP, DBX_REGISTER_NUMBER (regno));
1499 if (flag_verbose_asm)
1500 {
1501 fprintf (asm_out_file, "\t%s ", ASM_COMMENT_START);
1502 PRINT_REG (rtl, 0, asm_out_file);
1503 }
1504 fputc ('\n', asm_out_file);
1505}
1506
1507/* The following routine is a nice and simple transducer. It converts the
1508 RTL for a variable or parameter (resident in memory) into an equivalent
1509 Dwarf representation of a mechanism for getting the address of that same
1510 variable onto the top of a hypothetical "address evaluation" stack.
1511
1512 When creating memory location descriptors, we are effectively trans-
1513 forming the RTL for a memory-resident object into its Dwarf postfix
1514 expression equivalent. This routine just recursively descends an
1515 RTL tree, turning it into Dwarf postfix code as it goes. */
1516
1517static void
1518output_mem_loc_descriptor (rtl)
1519 register rtx rtl;
1520{
1521 /* Note that for a dynamically sized array, the location we will
1522 generate a description of here will be the lowest numbered location
1523 which is actually within the array. That's *not* necessarily the
1524 same as the zeroth element of the array. */
1525
1526 switch (GET_CODE (rtl))
1527 {
1528 case SUBREG:
1529
1530 /* The case of a subreg may arise when we have a local (register)
1531 variable or a formal (register) parameter which doesn't quite
1532 fill up an entire register. For now, just assume that it is
1533 legitimate to make the Dwarf info refer to the whole register
1534 which contains the given subreg. */
1535
1536 rtl = XEXP (rtl, 0);
1537 /* Drop thru. */
1538
1539 case REG:
1540
1541 /* Whenever a register number forms a part of the description of
1542 the method for calculating the (dynamic) address of a memory
1543 resident object, DWARF rules require the register number to
1544 be referred to as a "base register". This distinction is not
1545 based in any way upon what category of register the hardware
1546 believes the given register belongs to. This is strictly
1547 DWARF terminology we're dealing with here.
1548
1549 Note that in cases where the location of a memory-resident data
1550 object could be expressed as:
1551
1552 OP_ADD (OP_BASEREG (basereg), OP_CONST (0))
1553
1554 the actual DWARF location descriptor that we generate may just
1555 be OP_BASEREG (basereg). This may look deceptively like the
1556 object in question was allocated to a register (rather than
1557 in memory) so DWARF consumers need to be aware of the subtle
1558 distinction between OP_REG and OP_BASEREG. */
1559
1560 ASM_OUTPUT_DWARF_STACK_OP (asm_out_file, OP_BASEREG);
1561 output_reg_number (rtl);
1562 break;
1563
1564 case MEM:
1565 output_mem_loc_descriptor (XEXP (rtl, 0));
1566 ASM_OUTPUT_DWARF_STACK_OP (asm_out_file, OP_DEREF4);
1567 break;
1568
1569 case CONST:
1570 case SYMBOL_REF:
1571 ASM_OUTPUT_DWARF_STACK_OP (asm_out_file, OP_ADDR);
1572 ASM_OUTPUT_DWARF_ADDR_CONST (asm_out_file, rtl);
1573 break;
1574
1575 case PLUS:
1576 output_mem_loc_descriptor (XEXP (rtl, 0));
1577 output_mem_loc_descriptor (XEXP (rtl, 1));
1578 ASM_OUTPUT_DWARF_STACK_OP (asm_out_file, OP_ADD);
1579 break;
1580
1581 case CONST_INT:
1582 ASM_OUTPUT_DWARF_STACK_OP (asm_out_file, OP_CONST);
1583 ASM_OUTPUT_DWARF_DATA4 (asm_out_file, INTVAL (rtl));
1584 break;
1585
1586 default:
1587 abort ();
1588 }
1589}
1590
1591/* Output a proper Dwarf location descriptor for a variable or parameter
1592 which is either allocated in a register or in a memory location. For
1593 a register, we just generate an OP_REG and the register number. For a
1594 memory location we provide a Dwarf postfix expression describing how to
1595 generate the (dynamic) address of the object onto the address stack. */
1596
1597static void
1598output_loc_descriptor (rtl)
1599 register rtx rtl;
1600{
1601 switch (GET_CODE (rtl))
1602 {
1603 case SUBREG:
1604
1605 /* The case of a subreg may arise when we have a local (register)
1606 variable or a formal (register) parameter which doesn't quite
1607 fill up an entire register. For now, just assume that it is
1608 legitimate to make the Dwarf info refer to the whole register
1609 which contains the given subreg. */
1610
1611 rtl = XEXP (rtl, 0);
1612 /* Drop thru. */
1613
1614 case REG:
1615 ASM_OUTPUT_DWARF_STACK_OP (asm_out_file, OP_REG);
1616 output_reg_number (rtl);
1617 break;
1618
1619 case MEM:
1620 output_mem_loc_descriptor (XEXP (rtl, 0));
1621 break;
1622
1623 default:
1624 abort (); /* Should never happen */
1625 }
1626}
1627
1628/* Given a tree node describing an array bound (either lower or upper)
1629 output a representation for that bound. */
1630
1631static void
1632output_bound_representation (bound, dim_num, u_or_l)
1633 register tree bound;
1634 register unsigned dim_num; /* For multi-dimensional arrays. */
1635 register char u_or_l; /* Designates upper or lower bound. */
1636{
1637 switch (TREE_CODE (bound))
1638 {
1639
1640 case ERROR_MARK:
1641 return;
1642
1643 /* All fixed-bounds are represented by INTEGER_CST nodes. */
1644
1645 case INTEGER_CST:
1646 ASM_OUTPUT_DWARF_DATA4 (asm_out_file,
1647 (unsigned) TREE_INT_CST_LOW (bound));
1648 break;
1649
1650 /* Dynamic bounds may be represented by NOP_EXPR nodes containing
1651 SAVE_EXPR nodes. */
1652
1653 case NOP_EXPR:
1654 bound = TREE_OPERAND (bound, 0);
1655 /* ... fall thru... */
1656
1657 case SAVE_EXPR:
1658 {
1659 char begin_label[MAX_ARTIFICIAL_LABEL_BYTES];
1660 char end_label[MAX_ARTIFICIAL_LABEL_BYTES];
1661
1662 sprintf (begin_label, BOUND_BEGIN_LABEL_FMT,
1663 current_dienum, dim_num, u_or_l);
1664
1665 sprintf (end_label, BOUND_END_LABEL_FMT,
1666 current_dienum, dim_num, u_or_l);
1667
1668 ASM_OUTPUT_DWARF_DELTA2 (asm_out_file, end_label, begin_label);
1669 ASM_OUTPUT_LABEL (asm_out_file, begin_label);
1670
1671 /* If we are working on a bound for a dynamic dimension in C,
1672 the dynamic dimension in question had better have a static
1673 (zero) lower bound and a dynamic *upper* bound. */
1674
1675 if (u_or_l != 'u')
1676 abort ();
1677
1678 /* If optimization is turned on, the SAVE_EXPRs that describe
1679 how to access the upper bound values are essentially bogus.
1680 They only describe (at best) how to get at these values at
1681 the points in the generated code right after they have just
1682 been computed. Worse yet, in the typical case, the upper
1683 bound values will not even *be* computed in the optimized
1684 code, so these SAVE_EXPRs are entirely bogus.
1685
1686 In order to compensate for this fact, we check here to see
1687 if optimization is enabled, and if so, we effectively create
1688 an empty location description for the (unknown and unknowable)
1689 upper bound.
1690
1691 This should not cause too much trouble for existing (stupid?)
1692 debuggers because they have to deal with empty upper bounds
1693 location descriptions anyway in order to be able to deal with
1694 incomplete array types.
1695
1696 Of course an intelligent debugger (GDB?) should be able to
1697 comprehend that a missing upper bound specification in a
1698 array type used for a storage class `auto' local array variable
1699 indicates that the upper bound is both unknown (at compile-
1700 time) and unknowable (at run-time) due to optimization.
1701 */
1702
1703 if (! optimize)
1704 output_loc_descriptor
1705 (eliminate_regs (SAVE_EXPR_RTL (bound), 0, NULL_RTX));
1706
1707 ASM_OUTPUT_LABEL (asm_out_file, end_label);
1708 }
1709 break;
1710
1711 default:
1712 abort ();
1713 }
1714}
1715
1716/* Recursive function to output a sequence of value/name pairs for
1717 enumeration constants in reversed order. This is called from
1718 enumeration_type_die. */
1719
1720static void
1721output_enumeral_list (link)
1722 register tree link;
1723{
1724 if (link)
1725 {
1726 output_enumeral_list (TREE_CHAIN (link));
1727 ASM_OUTPUT_DWARF_DATA4 (asm_out_file,
1728 (unsigned) TREE_INT_CST_LOW (TREE_VALUE (link)));
1729 ASM_OUTPUT_DWARF_STRING (asm_out_file,
1730 IDENTIFIER_POINTER (TREE_PURPOSE (link)));
1731 }
1732}
1733
1734/* Given an unsigned value, round it up to the lowest multiple of `boundary'
1735 which is not less than the value itself. */
1736
1737inline unsigned
1738ceiling (value, boundary)
1739 register unsigned value;
1740 register unsigned boundary;
1741{
1742 return (((value + boundary - 1) / boundary) * boundary);
1743}
1744
1745/* Given a pointer to what is assumed to be a FIELD_DECL node, return a
1746 pointer to the declared type for the relevant field variable, or return
1747 `integer_type_node' if the given node turns out to be an ERROR_MARK node. */
1748
1749inline tree
1750field_type (decl)
1751 register tree decl;
1752{
1753 register tree type;
1754
1755 if (TREE_CODE (decl) == ERROR_MARK)
1756 return integer_type_node;
1757
1758 type = DECL_BIT_FIELD_TYPE (decl);
1759 if (type == NULL)
1760 type = TREE_TYPE (decl);
1761 return type;
1762}
1763
1764/* Given a pointer to a tree node, assumed to be some kind of a ..._TYPE
1765 node, return the alignment in bits for the type, or else return
1766 BITS_PER_WORD if the node actually turns out to be an ERROR_MARK node. */
1767
1768inline unsigned
1769simple_type_align_in_bits (type)
1770 register tree type;
1771{
1772 return (TREE_CODE (type) != ERROR_MARK) ? TYPE_ALIGN (type) : BITS_PER_WORD;
1773}
1774
1775/* Given a pointer to a tree node, assumed to be some kind of a ..._TYPE
1776 node, return the size in bits for the type if it is a constant, or
1777 else return the alignment for the type if the type's size is not
1778 constant, or else return BITS_PER_WORD if the type actually turns out
1779 to be an ERROR_MARK node. */
1780
1781inline unsigned
1782simple_type_size_in_bits (type)
1783 register tree type;
1784{
1785 if (TREE_CODE (type) == ERROR_MARK)
1786 return BITS_PER_WORD;
1787 else
1788 {
1789 register tree type_size_tree = TYPE_SIZE (type);
1790
1791 if (TREE_CODE (type_size_tree) != INTEGER_CST)
1792 return TYPE_ALIGN (type);
1793
1794 return (unsigned) TREE_INT_CST_LOW (type_size_tree);
1795 }
1796}
1797
1798/* Given a pointer to what is assumed to be a FIELD_DECL node, compute and
1799 return the byte offset of the lowest addressed byte of the "containing
1800 object" for the given FIELD_DECL, or return 0 if we are unable to deter-
1801 mine what that offset is, either because the argument turns out to be a
1802 pointer to an ERROR_MARK node, or because the offset is actually variable.
1803 (We can't handle the latter case just yet.) */
1804
1805static unsigned
1806field_byte_offset (decl)
1807 register tree decl;
1808{
1809 register unsigned type_align_in_bytes;
1810 register unsigned type_align_in_bits;
1811 register unsigned type_size_in_bits;
1812 register unsigned object_offset_in_align_units;
1813 register unsigned object_offset_in_bits;
1814 register unsigned object_offset_in_bytes;
1815 register tree type;
1816 register tree bitpos_tree;
1817 register tree field_size_tree;
1818 register unsigned bitpos_int;
1819 register unsigned deepest_bitpos;
1820 register unsigned field_size_in_bits;
1821
1822 if (TREE_CODE (decl) == ERROR_MARK)
1823 return 0;
1824
1825 if (TREE_CODE (decl) != FIELD_DECL)
1826 abort ();
1827
1828 type = field_type (decl);
1829
1830 bitpos_tree = DECL_FIELD_BITPOS (decl);
1831 field_size_tree = DECL_SIZE (decl);
1832
1833 /* We cannot yet cope with fields whose positions or sizes are variable,
1834 so for now, when we see such things, we simply return 0. Someday,
1835 we may be able to handle such cases, but it will be damn difficult. */
1836
1837 if (TREE_CODE (bitpos_tree) != INTEGER_CST)
1838 return 0;
1839 bitpos_int = (unsigned) TREE_INT_CST_LOW (bitpos_tree);
1840
1841 if (TREE_CODE (field_size_tree) != INTEGER_CST)
1842 return 0;
1843 field_size_in_bits = (unsigned) TREE_INT_CST_LOW (field_size_tree);
1844
1845 type_size_in_bits = simple_type_size_in_bits (type);
1846
1847 type_align_in_bits = simple_type_align_in_bits (type);
1848 type_align_in_bytes = type_align_in_bits / BITS_PER_UNIT;
1849
1850 /* Note that the GCC front-end doesn't make any attempt to keep track
1851 of the starting bit offset (relative to the start of the containing
1852 structure type) of the hypothetical "containing object" for a bit-
1853 field. Thus, when computing the byte offset value for the start of
1854 the "containing object" of a bit-field, we must deduce this infor-
1855 mation on our own.
1856
1857 This can be rather tricky to do in some cases. For example, handling
1858 the following structure type definition when compiling for an i386/i486
1859 target (which only aligns long long's to 32-bit boundaries) can be very
1860 tricky:
1861
1862 struct S {
1863 int field1;
1864 long long field2:31;
1865 };
1866
1867 Fortunately, there is a simple rule-of-thumb which can be used in such
1868 cases. When compiling for an i386/i486, GCC will allocate 8 bytes for
1869 the structure shown above. It decides to do this based upon one simple
1870 rule for bit-field allocation. Quite simply, GCC allocates each "con-
1871 taining object" for each bit-field at the first (i.e. lowest addressed)
1872 legitimate alignment boundary (based upon the required minimum alignment
1873 for the declared type of the field) which it can possibly use, subject
1874 to the condition that there is still enough available space remaining
1875 in the containing object (when allocated at the selected point) to
1876 fully accommodate all of the bits of the bit-field itself.
1877
1878 This simple rule makes it obvious why GCC allocates 8 bytes for each
1879 object of the structure type shown above. When looking for a place to
1880 allocate the "containing object" for `field2', the compiler simply tries
1881 to allocate a 64-bit "containing object" at each successive 32-bit
1882 boundary (starting at zero) until it finds a place to allocate that 64-
1883 bit field such that at least 31 contiguous (and previously unallocated)
1884 bits remain within that selected 64 bit field. (As it turns out, for
1885 the example above, the compiler finds that it is OK to allocate the
1886 "containing object" 64-bit field at bit-offset zero within the
1887 structure type.)
1888
1889 Here we attempt to work backwards from the limited set of facts we're
1890 given, and we try to deduce from those facts, where GCC must have
1891 believed that the containing object started (within the structure type).
1892
1893 The value we deduce is then used (by the callers of this routine) to
1894 generate AT_location and AT_bit_offset attributes for fields (both
1895 bit-fields and, in the case of AT_location, regular fields as well).
1896 */
1897
1898 /* Figure out the bit-distance from the start of the structure to the
1899 "deepest" bit of the bit-field. */
1900 deepest_bitpos = bitpos_int + field_size_in_bits;
1901
1902 /* This is the tricky part. Use some fancy footwork to deduce where the
1903 lowest addressed bit of the containing object must be. */
1904 object_offset_in_bits
1905 = ceiling (deepest_bitpos, type_align_in_bits) - type_size_in_bits;
1906
1907 /* Compute the offset of the containing object in "alignment units". */
1908 object_offset_in_align_units = object_offset_in_bits / type_align_in_bits;
1909
1910 /* Compute the offset of the containing object in bytes. */
1911 object_offset_in_bytes = object_offset_in_align_units * type_align_in_bytes;
1912
1913 return object_offset_in_bytes;
1914}
1915
1916/****************************** attributes *********************************/
1917
1918/* The following routines are responsible for writing out the various types
1919 of Dwarf attributes (and any following data bytes associated with them).
1920 These routines are listed in order based on the numerical codes of their
1921 associated attributes. */
1922
1923/* Generate an AT_sibling attribute. */
1924
1925inline void
1926sibling_attribute ()
1927{
1928 char label[MAX_ARTIFICIAL_LABEL_BYTES];
1929
1930 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_sibling);
1931 sprintf (label, DIE_BEGIN_LABEL_FMT, NEXT_DIE_NUM);
1932 ASM_OUTPUT_DWARF_REF (asm_out_file, label);
1933}
1934
1935/* Output the form of location attributes suitable for whole variables and
1936 whole parameters. Note that the location attributes for struct fields
1937 are generated by the routine `data_member_location_attribute' below. */
1938
1939static void
1940location_attribute (rtl)
1941 register rtx rtl;
1942{
1943 char begin_label[MAX_ARTIFICIAL_LABEL_BYTES];
1944 char end_label[MAX_ARTIFICIAL_LABEL_BYTES];
1945
1946 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_location);
1947 sprintf (begin_label, LOC_BEGIN_LABEL_FMT, current_dienum);
1948 sprintf (end_label, LOC_END_LABEL_FMT, current_dienum);
1949 ASM_OUTPUT_DWARF_DELTA2 (asm_out_file, end_label, begin_label);
1950 ASM_OUTPUT_LABEL (asm_out_file, begin_label);
1951
1952 /* Handle a special case. If we are about to output a location descriptor
1953 for a variable or parameter which has been optimized out of existence,
1954 don't do that. Instead we output a zero-length location descriptor
1955 value as part of the location attribute.
1956
1957 A variable which has been optimized out of existence will have a
1958 DECL_RTL value which denotes a pseudo-reg.
1959
1960 Currently, in some rare cases, variables can have DECL_RTL values
1961 which look like (MEM (REG pseudo-reg#)). These cases are due to
1962 bugs elsewhere in the compiler. We treat such cases
1963 as if the variable(s) in question had been optimized out of existence.
1964
1965 Note that in all cases where we wish to express the fact that a
1966 variable has been optimized out of existence, we do not simply
1967 suppress the generation of the entire location attribute because
1968 the absence of a location attribute in certain kinds of DIEs is
1969 used to indicate something else entirely... i.e. that the DIE
1970 represents an object declaration, but not a definition. So sayeth
1971 the PLSIG.
1972 */
1973
1974 if (! is_pseudo_reg (rtl)
1975 && (GET_CODE (rtl) != MEM || ! is_pseudo_reg (XEXP (rtl, 0))))
1976 output_loc_descriptor (eliminate_regs (rtl, 0, NULL_RTX));
1977
1978 ASM_OUTPUT_LABEL (asm_out_file, end_label);
1979}
1980
1981/* Output the specialized form of location attribute used for data members
1982 of struct and union types.
1983
1984 In the special case of a FIELD_DECL node which represents a bit-field,
1985 the "offset" part of this special location descriptor must indicate the
1986 distance in bytes from the lowest-addressed byte of the containing
1987 struct or union type to the lowest-addressed byte of the "containing
1988 object" for the bit-field. (See the `field_byte_offset' function above.)
1989
1990 For any given bit-field, the "containing object" is a hypothetical
1991 object (of some integral or enum type) within which the given bit-field
1992 lives. The type of this hypothetical "containing object" is always the
1993 same as the declared type of the individual bit-field itself (for GCC
1994 anyway... the DWARF spec doesn't actually mandate this).
1995
1996 Note that it is the size (in bytes) of the hypothetical "containing
1997 object" which will be given in the AT_byte_size attribute for this
1998 bit-field. (See the `byte_size_attribute' function below.) It is
1999 also used when calculating the value of the AT_bit_offset attribute.
2000 (See the `bit_offset_attribute' function below.)
2001*/
2002
2003static void
2004data_member_location_attribute (decl)
2005 register tree decl;
2006{
2007 register unsigned object_offset_in_bytes = field_byte_offset (decl);
2008 char begin_label[MAX_ARTIFICIAL_LABEL_BYTES];
2009 char end_label[MAX_ARTIFICIAL_LABEL_BYTES];
2010
2011 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_location);
2012 sprintf (begin_label, LOC_BEGIN_LABEL_FMT, current_dienum);
2013 sprintf (end_label, LOC_END_LABEL_FMT, current_dienum);
2014 ASM_OUTPUT_DWARF_DELTA2 (asm_out_file, end_label, begin_label);
2015 ASM_OUTPUT_LABEL (asm_out_file, begin_label);
2016 ASM_OUTPUT_DWARF_STACK_OP (asm_out_file, OP_CONST);
2017 ASM_OUTPUT_DWARF_DATA4 (asm_out_file, object_offset_in_bytes);
2018 ASM_OUTPUT_DWARF_STACK_OP (asm_out_file, OP_ADD);
2019 ASM_OUTPUT_LABEL (asm_out_file, end_label);
2020}
2021
2022/* Output an AT_const_value attribute for a variable or a parameter which
2023 does not have a "location" either in memory or in a register. These
2024 things can arise in GNU C when a constant is passed as an actual
2025 parameter to an inlined function. They can also arise in C++ where
2026 declared constants do not necessarily get memory "homes". */
2027
2028static void
2029const_value_attribute (rtl)
2030 register rtx rtl;
2031{
2032 char begin_label[MAX_ARTIFICIAL_LABEL_BYTES];
2033 char end_label[MAX_ARTIFICIAL_LABEL_BYTES];
2034
2035 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_const_value_block4);
2036 sprintf (begin_label, LOC_BEGIN_LABEL_FMT, current_dienum);
2037 sprintf (end_label, LOC_END_LABEL_FMT, current_dienum);
2038 ASM_OUTPUT_DWARF_DELTA4 (asm_out_file, end_label, begin_label);
2039 ASM_OUTPUT_LABEL (asm_out_file, begin_label);
2040
2041 switch (GET_CODE (rtl))
2042 {
2043 case CONST_INT:
2044 /* Note that a CONST_INT rtx could represent either an integer or
2045 a floating-point constant. A CONST_INT is used whenever the
2046 constant will fit into a single word. In all such cases, the
2047 original mode of the constant value is wiped out, and the
2048 CONST_INT rtx is assigned VOIDmode. Since we no longer have
2049 precise mode information for these constants, we always just
2050 output them using 4 bytes. */
2051
2052 ASM_OUTPUT_DWARF_DATA4 (asm_out_file, (unsigned) INTVAL (rtl));
2053 break;
2054
2055 case CONST_DOUBLE:
2056 /* Note that a CONST_DOUBLE rtx could represent either an integer
2057 or a floating-point constant. A CONST_DOUBLE is used whenever
2058 the constant requires more than one word in order to be adequately
2059 represented. In all such cases, the original mode of the constant
2060 value is preserved as the mode of the CONST_DOUBLE rtx, but for
2061 simplicity we always just output CONST_DOUBLEs using 8 bytes. */
2062
2063 ASM_OUTPUT_DWARF_DATA8 (asm_out_file,
2064 (unsigned HOST_WIDE_INT) CONST_DOUBLE_HIGH (rtl),
2065 (unsigned HOST_WIDE_INT) CONST_DOUBLE_LOW (rtl));
2066 break;
2067
2068 case CONST_STRING:
2069 ASM_OUTPUT_DWARF_STRING (asm_out_file, XSTR (rtl, 0));
2070 break;
2071
2072 case SYMBOL_REF:
2073 case LABEL_REF:
2074 case CONST:
2075 ASM_OUTPUT_DWARF_ADDR_CONST (asm_out_file, rtl);
2076 break;
2077
2078 case PLUS:
2079 /* In cases where an inlined instance of an inline function is passed
2080 the address of an `auto' variable (which is local to the caller)
2081 we can get a situation where the DECL_RTL of the artificial
2082 local variable (for the inlining) which acts as a stand-in for
2083 the corresponding formal parameter (of the inline function)
2084 will look like (plus:SI (reg:SI FRAME_PTR) (const_int ...)).
2085 This is not exactly a compile-time constant expression, but it
2086 isn't the address of the (artificial) local variable either.
2087 Rather, it represents the *value* which the artificial local
2088 variable always has during its lifetime. We currently have no
2089 way to represent such quasi-constant values in Dwarf, so for now
2090 we just punt and generate an AT_const_value attribute with form
2091 FORM_BLOCK4 and a length of zero. */
2092 break;
2093
2094 default:
2095 abort (); /* No other kinds of rtx should be possible here. */
2096 }
2097
2098 ASM_OUTPUT_LABEL (asm_out_file, end_label);
2099}
2100
2101/* Generate *either* an AT_location attribute or else an AT_const_value
2102 data attribute for a variable or a parameter. We generate the
2103 AT_const_value attribute only in those cases where the given
2104 variable or parameter does not have a true "location" either in
2105 memory or in a register. This can happen (for example) when a
2106 constant is passed as an actual argument in a call to an inline
2107 function. (It's possible that these things can crop up in other
2108 ways also.) Note that one type of constant value which can be
2109 passed into an inlined function is a constant pointer. This can
2110 happen for example if an actual argument in an inlined function
2111 call evaluates to a compile-time constant address. */
2112
2113static void
2114location_or_const_value_attribute (decl)
2115 register tree decl;
2116{
2117 register rtx rtl;
2118
2119 if (TREE_CODE (decl) == ERROR_MARK)
2120 return;
2121
2122 if ((TREE_CODE (decl) != VAR_DECL) && (TREE_CODE (decl) != PARM_DECL))
2123 {
2124 /* Should never happen. */
2125 abort ();
2126 return;
2127 }
2128
2129 /* Here we have to decide where we are going to say the parameter "lives"
2130 (as far as the debugger is concerned). We only have a couple of choices.
2131 GCC provides us with DECL_RTL and with DECL_INCOMING_RTL. DECL_RTL
2132 normally indicates where the parameter lives during most of the activa-
2133 tion of the function. If optimization is enabled however, this could
2134 be either NULL or else a pseudo-reg. Both of those cases indicate that
2135 the parameter doesn't really live anywhere (as far as the code generation
2136 parts of GCC are concerned) during most of the function's activation.
2137 That will happen (for example) if the parameter is never referenced
2138 within the function.
2139
2140 We could just generate a location descriptor here for all non-NULL
2141 non-pseudo values of DECL_RTL and ignore all of the rest, but we can
2142 be a little nicer than that if we also consider DECL_INCOMING_RTL in
2143 cases where DECL_RTL is NULL or is a pseudo-reg.
2144
2145 Note however that we can only get away with using DECL_INCOMING_RTL as
2146 a backup substitute for DECL_RTL in certain limited cases. In cases
2147 where DECL_ARG_TYPE(decl) indicates the same type as TREE_TYPE(decl)
2148 we can be sure that the parameter was passed using the same type as it
2149 is declared to have within the function, and that its DECL_INCOMING_RTL
2150 points us to a place where a value of that type is passed. In cases
2151 where DECL_ARG_TYPE(decl) and TREE_TYPE(decl) are different types
2152 however, we cannot (in general) use DECL_INCOMING_RTL as a backup
2153 substitute for DECL_RTL because in these cases, DECL_INCOMING_RTL
2154 points us to a value of some type which is *different* from the type
2155 of the parameter itself. Thus, if we tried to use DECL_INCOMING_RTL
2156 to generate a location attribute in such cases, the debugger would
2157 end up (for example) trying to fetch a `float' from a place which
2158 actually contains the first part of a `double'. That would lead to
2159 really incorrect and confusing output at debug-time, and we don't
2160 want that now do we?
2161
2162 So in general, we DO NOT use DECL_INCOMING_RTL as a backup for DECL_RTL
2163 in cases where DECL_ARG_TYPE(decl) != TREE_TYPE(decl). There are a
2164 couple of cute exceptions however. On little-endian machines we can
2165 get away with using DECL_INCOMING_RTL even when DECL_ARG_TYPE(decl) is
2166 not the same as TREE_TYPE(decl) but only when DECL_ARG_TYPE(decl) is
2167 an integral type which is smaller than TREE_TYPE(decl). These cases
2168 arise when (on a little-endian machine) a non-prototyped function has
2169 a parameter declared to be of type `short' or `char'. In such cases,
2170 TREE_TYPE(decl) will be `short' or `char', DECL_ARG_TYPE(decl) will be
2171 `int', and DECL_INCOMING_RTL will point to the lowest-order byte of the
2172 passed `int' value. If the debugger then uses that address to fetch a
2173 `short' or a `char' (on a little-endian machine) the result will be the
2174 correct data, so we allow for such exceptional cases below.
2175
2176 Note that our goal here is to describe the place where the given formal
2177 parameter lives during most of the function's activation (i.e. between
2178 the end of the prologue and the start of the epilogue). We'll do that
2179 as best as we can. Note however that if the given formal parameter is
2180 modified sometime during the execution of the function, then a stack
2181 backtrace (at debug-time) will show the function as having been called
2182 with the *new* value rather than the value which was originally passed
2183 in. This happens rarely enough that it is not a major problem, but it
2184 *is* a problem, and I'd like to fix it. A future version of dwarfout.c
2185 may generate two additional attributes for any given TAG_formal_parameter
2186 DIE which will describe the "passed type" and the "passed location" for
2187 the given formal parameter in addition to the attributes we now generate
2188 to indicate the "declared type" and the "active location" for each
2189 parameter. This additional set of attributes could be used by debuggers
2190 for stack backtraces.
2191
2192 Separately, note that sometimes DECL_RTL can be NULL and DECL_INCOMING_RTL
2193 can be NULL also. This happens (for example) for inlined-instances of
2194 inline function formal parameters which are never referenced. This really
2195 shouldn't be happening. All PARM_DECL nodes should get valid non-NULL
2196 DECL_INCOMING_RTL values, but integrate.c doesn't currently generate
2197 these values for inlined instances of inline function parameters, so
2198 when we see such cases, we are just SOL (shit-out-of-luck) for the time
2199 being (until integrate.c gets fixed).
2200 */
2201
2202 /* Use DECL_RTL as the "location" unless we find something better. */
2203 rtl = DECL_RTL (decl);
2204
2205 if (TREE_CODE (decl) == PARM_DECL)
2206 if (rtl == NULL_RTX || is_pseudo_reg (rtl))
2207 {
2208 /* This decl represents a formal parameter which was optimized out. */
5bd49366
PR
2209 register tree declared_type = type_main_variant (TREE_TYPE (decl));
2210 register tree passed_type = type_main_variant (DECL_ARG_TYPE (decl));
9bf86ebb
PR
2211
2212 /* Note that DECL_INCOMING_RTL may be NULL in here, but we handle
2213 *all* cases where (rtl == NULL_RTX) just below. */
2214
2215 if (declared_type == passed_type)
2216 rtl = DECL_INCOMING_RTL (decl);
2217#if (BYTES_BIG_ENDIAN == 0)
2218 else
2219 if (TREE_CODE (declared_type) == INTEGER_TYPE)
2220 if (TYPE_SIZE (declared_type) <= TYPE_SIZE (passed_type))
2221 rtl = DECL_INCOMING_RTL (decl);
2222#endif /* (BYTES_BIG_ENDIAN == 0) */
2223 }
2224
2225 if (rtl == NULL_RTX)
2226 return;
2227
2228 switch (GET_CODE (rtl))
2229 {
2230 case CONST_INT:
2231 case CONST_DOUBLE:
2232 case CONST_STRING:
2233 case SYMBOL_REF:
2234 case LABEL_REF:
2235 case CONST:
2236 case PLUS: /* DECL_RTL could be (plus (reg ...) (const_int ...)) */
2237 const_value_attribute (rtl);
2238 break;
2239
2240 case MEM:
2241 case REG:
2242 case SUBREG:
2243 location_attribute (rtl);
2244 break;
2245
2246 default:
2247 abort (); /* Should never happen. */
2248 }
2249}
2250
2251/* Generate an AT_name attribute given some string value to be included as
2252 the value of the attribute. */
2253
2254inline void
2255name_attribute (name_string)
2256 register char *name_string;
2257{
2258 if (name_string && *name_string)
2259 {
2260 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_name);
2261 ASM_OUTPUT_DWARF_STRING (asm_out_file, name_string);
2262 }
2263}
2264
2265inline void
2266fund_type_attribute (ft_code)
2267 register unsigned ft_code;
2268{
2269 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_fund_type);
2270 ASM_OUTPUT_DWARF_FUND_TYPE (asm_out_file, ft_code);
2271}
2272
2273static void
2274mod_fund_type_attribute (type, decl_const, decl_volatile)
2275 register tree type;
2276 register int decl_const;
2277 register int decl_volatile;
2278{
2279 char begin_label[MAX_ARTIFICIAL_LABEL_BYTES];
2280 char end_label[MAX_ARTIFICIAL_LABEL_BYTES];
2281
2282 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_mod_fund_type);
2283 sprintf (begin_label, MT_BEGIN_LABEL_FMT, current_dienum);
2284 sprintf (end_label, MT_END_LABEL_FMT, current_dienum);
2285 ASM_OUTPUT_DWARF_DELTA2 (asm_out_file, end_label, begin_label);
2286 ASM_OUTPUT_LABEL (asm_out_file, begin_label);
2287 write_modifier_bytes (type, decl_const, decl_volatile);
2288 ASM_OUTPUT_DWARF_FUND_TYPE (asm_out_file,
2289 fundamental_type_code (root_type (type)));
2290 ASM_OUTPUT_LABEL (asm_out_file, end_label);
2291}
2292
2293inline void
2294user_def_type_attribute (type)
2295 register tree type;
2296{
2297 char ud_type_name[MAX_ARTIFICIAL_LABEL_BYTES];
2298
2299 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_user_def_type);
2300 sprintf (ud_type_name, TYPE_NAME_FMT, TYPE_UID (type));
2301 ASM_OUTPUT_DWARF_REF (asm_out_file, ud_type_name);
2302}
2303
2304static void
2305mod_u_d_type_attribute (type, decl_const, decl_volatile)
2306 register tree type;
2307 register int decl_const;
2308 register int decl_volatile;
2309{
2310 char begin_label[MAX_ARTIFICIAL_LABEL_BYTES];
2311 char end_label[MAX_ARTIFICIAL_LABEL_BYTES];
2312 char ud_type_name[MAX_ARTIFICIAL_LABEL_BYTES];
2313
2314 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_mod_u_d_type);
2315 sprintf (begin_label, MT_BEGIN_LABEL_FMT, current_dienum);
2316 sprintf (end_label, MT_END_LABEL_FMT, current_dienum);
2317 ASM_OUTPUT_DWARF_DELTA2 (asm_out_file, end_label, begin_label);
2318 ASM_OUTPUT_LABEL (asm_out_file, begin_label);
2319 write_modifier_bytes (type, decl_const, decl_volatile);
2320 sprintf (ud_type_name, TYPE_NAME_FMT, TYPE_UID (root_type (type)));
2321 ASM_OUTPUT_DWARF_REF (asm_out_file, ud_type_name);
2322 ASM_OUTPUT_LABEL (asm_out_file, end_label);
2323}
2324
2325#ifdef USE_ORDERING_ATTRIBUTE
2326inline void
2327ordering_attribute (ordering)
2328 register unsigned ordering;
2329{
2330 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_ordering);
2331 ASM_OUTPUT_DWARF_DATA2 (asm_out_file, ordering);
2332}
2333#endif /* defined(USE_ORDERING_ATTRIBUTE) */
2334
2335/* Note that the block of subscript information for an array type also
2336 includes information about the element type of type given array type. */
2337
2338static void
2339subscript_data_attribute (type)
2340 register tree type;
2341{
2342 register unsigned dimension_number;
2343 char begin_label[MAX_ARTIFICIAL_LABEL_BYTES];
2344 char end_label[MAX_ARTIFICIAL_LABEL_BYTES];
2345
2346 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_subscr_data);
2347 sprintf (begin_label, SS_BEGIN_LABEL_FMT, current_dienum);
2348 sprintf (end_label, SS_END_LABEL_FMT, current_dienum);
2349 ASM_OUTPUT_DWARF_DELTA2 (asm_out_file, end_label, begin_label);
2350 ASM_OUTPUT_LABEL (asm_out_file, begin_label);
2351
2352 /* The GNU compilers represent multidimensional array types as sequences
2353 of one dimensional array types whose element types are themselves array
2354 types. Here we squish that down, so that each multidimensional array
2355 type gets only one array_type DIE in the Dwarf debugging info. The
2356 draft Dwarf specification say that we are allowed to do this kind
2357 of compression in C (because there is no difference between an
2358 array or arrays and a multidimensional array in C) but for other
2359 source languages (e.g. Ada) we probably shouldn't do this. */
2360
2361 for (dimension_number = 0;
2362 TREE_CODE (type) == ARRAY_TYPE;
2363 type = TREE_TYPE (type), dimension_number++)
2364 {
2365 register tree domain = TYPE_DOMAIN (type);
2366
2367 /* Arrays come in three flavors. Unspecified bounds, fixed
2368 bounds, and (in GNU C only) variable bounds. Handle all
2369 three forms here. */
2370
2371 if (domain)
2372 {
2373 /* We have an array type with specified bounds. */
2374
2375 register tree lower = TYPE_MIN_VALUE (domain);
2376 register tree upper = TYPE_MAX_VALUE (domain);
2377
2378 /* Handle only fundamental types as index types for now. */
2379
2380 if (! type_is_fundamental (domain))
2381 abort ();
2382
2383 /* Output the representation format byte for this dimension. */
2384
2385 ASM_OUTPUT_DWARF_FMT_BYTE (asm_out_file,
2386 FMT_CODE (1,
2387 TREE_CODE (lower) == INTEGER_CST,
2388 TREE_CODE (upper) == INTEGER_CST));
2389
2390 /* Output the index type for this dimension. */
2391
2392 ASM_OUTPUT_DWARF_FUND_TYPE (asm_out_file,
2393 fundamental_type_code (domain));
2394
2395 /* Output the representation for the lower bound. */
2396
2397 output_bound_representation (lower, dimension_number, 'l');
2398
2399 /* Output the representation for the upper bound. */
2400
2401 output_bound_representation (upper, dimension_number, 'u');
2402 }
2403 else
2404 {
2405 /* We have an array type with an unspecified length. For C and
2406 C++ we can assume that this really means that (a) the index
2407 type is an integral type, and (b) the lower bound is zero.
2408 Note that Dwarf defines the representation of an unspecified
2409 (upper) bound as being a zero-length location description. */
2410
2411 /* Output the array-bounds format byte. */
2412
2413 ASM_OUTPUT_DWARF_FMT_BYTE (asm_out_file, FMT_FT_C_X);
2414
2415 /* Output the (assumed) index type. */
2416
2417 ASM_OUTPUT_DWARF_FUND_TYPE (asm_out_file, FT_integer);
2418
2419 /* Output the (assumed) lower bound (constant) value. */
2420
2421 ASM_OUTPUT_DWARF_DATA4 (asm_out_file, 0);
2422
2423 /* Output the (empty) location description for the upper bound. */
2424
2425 ASM_OUTPUT_DWARF_DATA2 (asm_out_file, 0);
2426 }
2427 }
2428
2429 /* Output the prefix byte that says that the element type is comming up. */
2430
2431 ASM_OUTPUT_DWARF_FMT_BYTE (asm_out_file, FMT_ET);
2432
2433 /* Output a representation of the type of the elements of this array type. */
2434
2435 type_attribute (type, 0, 0);
2436
2437 ASM_OUTPUT_LABEL (asm_out_file, end_label);
2438}
2439
2440static void
2441byte_size_attribute (tree_node)
2442 register tree tree_node;
2443{
2444 register unsigned size;
2445
2446 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_byte_size);
2447 switch (TREE_CODE (tree_node))
2448 {
2449 case ERROR_MARK:
2450 size = 0;
2451 break;
2452
2453 case ENUMERAL_TYPE:
2454 case RECORD_TYPE:
2455 case UNION_TYPE:
2456 case QUAL_UNION_TYPE:
2457 size = int_size_in_bytes (tree_node);
2458 break;
2459
2460 case FIELD_DECL:
2461 /* For a data member of a struct or union, the AT_byte_size is
2462 generally given as the number of bytes normally allocated for
2463 an object of the *declared* type of the member itself. This
2464 is true even for bit-fields. */
2465 size = simple_type_size_in_bits (field_type (tree_node))
2466 / BITS_PER_UNIT;
2467 break;
2468
2469 default:
2470 abort ();
2471 }
2472
2473 /* Note that `size' might be -1 when we get to this point. If it
2474 is, that indicates that the byte size of the entity in question
2475 is variable. We have no good way of expressing this fact in Dwarf
2476 at the present time, so just let the -1 pass on through. */
2477
2478 ASM_OUTPUT_DWARF_DATA4 (asm_out_file, size);
2479}
2480
2481/* For a FIELD_DECL node which represents a bit-field, output an attribute
2482 which specifies the distance in bits from the highest order bit of the
2483 "containing object" for the bit-field to the highest order bit of the
2484 bit-field itself.
2485
2486 For any given bit-field, the "containing object" is a hypothetical
2487 object (of some integral or enum type) within which the given bit-field
2488 lives. The type of this hypothetical "containing object" is always the
2489 same as the declared type of the individual bit-field itself.
2490
2491 The determination of the exact location of the "containing object" for
2492 a bit-field is rather complicated. It's handled by the `field_byte_offset'
2493 function (above).
2494
2495 Note that it is the size (in bytes) of the hypothetical "containing
2496 object" which will be given in the AT_byte_size attribute for this
2497 bit-field. (See `byte_size_attribute' above.)
2498*/
2499
2500inline void
2501bit_offset_attribute (decl)
2502 register tree decl;
2503{
2504 register unsigned object_offset_in_bytes = field_byte_offset (decl);
2505 register tree type = DECL_BIT_FIELD_TYPE (decl);
2506 register tree bitpos_tree = DECL_FIELD_BITPOS (decl);
2507 register unsigned bitpos_int;
2508 register unsigned highest_order_object_bit_offset;
2509 register unsigned highest_order_field_bit_offset;
2510 register unsigned bit_offset;
2511
2512 assert (TREE_CODE (decl) == FIELD_DECL); /* Must be a field. */
2513 assert (type); /* Must be a bit field. */
2514
2515 /* We can't yet handle bit-fields whose offsets are variable, so if we
2516 encounter such things, just return without generating any attribute
2517 whatsoever. */
2518
2519 if (TREE_CODE (bitpos_tree) != INTEGER_CST)
2520 return;
2521 bitpos_int = (unsigned) TREE_INT_CST_LOW (bitpos_tree);
2522
2523 /* Note that the bit offset is always the distance (in bits) from the
2524 highest-order bit of the "containing object" to the highest-order
2525 bit of the bit-field itself. Since the "high-order end" of any
2526 object or field is different on big-endian and little-endian machines,
2527 the computation below must take account of these differences. */
2528
2529 highest_order_object_bit_offset = object_offset_in_bytes * BITS_PER_UNIT;
2530 highest_order_field_bit_offset = bitpos_int;
2531
2532#if (BYTES_BIG_ENDIAN == 0)
2533 highest_order_field_bit_offset
2534 += (unsigned) TREE_INT_CST_LOW (DECL_SIZE (decl));
2535
2536 highest_order_object_bit_offset += simple_type_size_in_bits (type);
2537#endif /* (BYTES_BIG_ENDIAN == 0) */
2538
2539 bit_offset =
2540#if (BYTES_BIG_ENDIAN == 0)
2541 highest_order_object_bit_offset - highest_order_field_bit_offset;
2542#else /* (BYTES_BIG_ENDIAN != 0) */
2543 highest_order_field_bit_offset - highest_order_object_bit_offset;
2544#endif /* (BYTES_BIG_ENDIAN != 0) */
2545
2546 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_bit_offset);
2547 ASM_OUTPUT_DWARF_DATA2 (asm_out_file, bit_offset);
2548}
2549
2550/* For a FIELD_DECL node which represents a bit field, output an attribute
2551 which specifies the length in bits of the given field. */
2552
2553inline void
2554bit_size_attribute (decl)
2555 register tree decl;
2556{
2557 assert (TREE_CODE (decl) == FIELD_DECL); /* Must be a field. */
2558 assert (DECL_BIT_FIELD_TYPE (decl)); /* Must be a bit field. */
2559
2560 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_bit_size);
2561 ASM_OUTPUT_DWARF_DATA4 (asm_out_file,
2562 (unsigned) TREE_INT_CST_LOW (DECL_SIZE (decl)));
2563}
2564
2565/* The following routine outputs the `element_list' attribute for enumeration
2566 type DIEs. The element_lits attribute includes the names and values of
2567 all of the enumeration constants associated with the given enumeration
2568 type. */
2569
2570inline void
2571element_list_attribute (element)
2572 register tree element;
2573{
2574 char begin_label[MAX_ARTIFICIAL_LABEL_BYTES];
2575 char end_label[MAX_ARTIFICIAL_LABEL_BYTES];
2576
2577 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_element_list);
2578 sprintf (begin_label, EE_BEGIN_LABEL_FMT, current_dienum);
2579 sprintf (end_label, EE_END_LABEL_FMT, current_dienum);
2580 ASM_OUTPUT_DWARF_DELTA4 (asm_out_file, end_label, begin_label);
2581 ASM_OUTPUT_LABEL (asm_out_file, begin_label);
2582
2583 /* Here we output a list of value/name pairs for each enumeration constant
2584 defined for this enumeration type (as required), but we do it in REVERSE
2585 order. The order is the one required by the draft #5 Dwarf specification
2586 published by the UI/PLSIG. */
2587
2588 output_enumeral_list (element); /* Recursively output the whole list. */
2589
2590 ASM_OUTPUT_LABEL (asm_out_file, end_label);
2591}
2592
2593/* Generate an AT_stmt_list attribute. These are normally present only in
2594 DIEs with a TAG_compile_unit tag. */
2595
2596inline void
2597stmt_list_attribute (label)
2598 register char *label;
2599{
2600 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_stmt_list);
2601 /* Don't use ASM_OUTPUT_DWARF_DATA4 here. */
2602 ASM_OUTPUT_DWARF_ADDR (asm_out_file, label);
2603}
2604
2605/* Generate an AT_low_pc attribute for a label DIE, a lexical_block DIE or
2606 for a subroutine DIE. */
2607
2608inline void
2609low_pc_attribute (asm_low_label)
2610 register char *asm_low_label;
2611{
2612 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_low_pc);
2613 ASM_OUTPUT_DWARF_ADDR (asm_out_file, asm_low_label);
2614}
2615
2616/* Generate an AT_high_pc attribute for a lexical_block DIE or for a
2617 subroutine DIE. */
2618
2619inline void
2620high_pc_attribute (asm_high_label)
2621 register char *asm_high_label;
2622{
2623 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_high_pc);
2624 ASM_OUTPUT_DWARF_ADDR (asm_out_file, asm_high_label);
2625}
2626
2627/* Generate an AT_body_begin attribute for a subroutine DIE. */
2628
2629inline void
2630body_begin_attribute (asm_begin_label)
2631 register char *asm_begin_label;
2632{
2633 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_body_begin);
2634 ASM_OUTPUT_DWARF_ADDR (asm_out_file, asm_begin_label);
2635}
2636
2637/* Generate an AT_body_end attribute for a subroutine DIE. */
2638
2639inline void
2640body_end_attribute (asm_end_label)
2641 register char *asm_end_label;
2642{
2643 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_body_end);
2644 ASM_OUTPUT_DWARF_ADDR (asm_out_file, asm_end_label);
2645}
2646
2647/* Generate an AT_language attribute given a LANG value. These attributes
2648 are used only within TAG_compile_unit DIEs. */
2649
2650inline void
2651language_attribute (language_code)
2652 register unsigned language_code;
2653{
2654 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_language);
2655 ASM_OUTPUT_DWARF_DATA4 (asm_out_file, language_code);
2656}
2657
2658inline void
2659member_attribute (context)
2660 register tree context;
2661{
2662 char label[MAX_ARTIFICIAL_LABEL_BYTES];
2663
2664 /* Generate this attribute only for members in C++. */
2665
2666 if (context != NULL && is_tagged_type (context))
2667 {
2668 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_member);
2669 sprintf (label, TYPE_NAME_FMT, TYPE_UID (context));
2670 ASM_OUTPUT_DWARF_REF (asm_out_file, label);
2671 }
2672}
2673
2674inline void
2675string_length_attribute (upper_bound)
2676 register tree upper_bound;
2677{
2678 char begin_label[MAX_ARTIFICIAL_LABEL_BYTES];
2679 char end_label[MAX_ARTIFICIAL_LABEL_BYTES];
2680
2681 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_string_length);
2682 sprintf (begin_label, SL_BEGIN_LABEL_FMT, current_dienum);
2683 sprintf (end_label, SL_END_LABEL_FMT, current_dienum);
2684 ASM_OUTPUT_DWARF_DELTA2 (asm_out_file, end_label, begin_label);
2685 ASM_OUTPUT_LABEL (asm_out_file, begin_label);
2686 output_bound_representation (upper_bound, 0, 'u');
2687 ASM_OUTPUT_LABEL (asm_out_file, end_label);
2688}
2689
2690inline void
2691comp_dir_attribute (dirname)
2692 register char *dirname;
2693{
2694 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_comp_dir);
2695 ASM_OUTPUT_DWARF_STRING (asm_out_file, dirname);
2696}
2697
2698inline void
2699sf_names_attribute (sf_names_start_label)
2700 register char *sf_names_start_label;
2701{
2702 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_sf_names);
2703 /* Don't use ASM_OUTPUT_DWARF_DATA4 here. */
2704 ASM_OUTPUT_DWARF_ADDR (asm_out_file, sf_names_start_label);
2705}
2706
2707inline void
2708src_info_attribute (src_info_start_label)
2709 register char *src_info_start_label;
2710{
2711 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_src_info);
2712 /* Don't use ASM_OUTPUT_DWARF_DATA4 here. */
2713 ASM_OUTPUT_DWARF_ADDR (asm_out_file, src_info_start_label);
2714}
2715
2716inline void
2717mac_info_attribute (mac_info_start_label)
2718 register char *mac_info_start_label;
2719{
2720 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_mac_info);
2721 /* Don't use ASM_OUTPUT_DWARF_DATA4 here. */
2722 ASM_OUTPUT_DWARF_ADDR (asm_out_file, mac_info_start_label);
2723}
2724
2725inline void
2726prototyped_attribute (func_type)
2727 register tree func_type;
2728{
2729 if ((strcmp (language_string, "GNU C") == 0)
2730 && (TYPE_ARG_TYPES (func_type) != NULL))
2731 {
2732 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_prototyped);
2733 ASM_OUTPUT_DWARF_STRING (asm_out_file, "");
2734 }
2735}
2736
2737inline void
2738producer_attribute (producer)
2739 register char *producer;
2740{
2741 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_producer);
2742 ASM_OUTPUT_DWARF_STRING (asm_out_file, producer);
2743}
2744
2745inline void
2746inline_attribute (decl)
2747 register tree decl;
2748{
2749 if (DECL_INLINE (decl))
2750 {
2751 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_inline);
2752 ASM_OUTPUT_DWARF_STRING (asm_out_file, "");
2753 }
2754}
2755
2756inline void
2757containing_type_attribute (containing_type)
2758 register tree containing_type;
2759{
2760 char label[MAX_ARTIFICIAL_LABEL_BYTES];
2761
2762 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_containing_type);
2763 sprintf (label, TYPE_NAME_FMT, TYPE_UID (containing_type));
2764 ASM_OUTPUT_DWARF_REF (asm_out_file, label);
2765}
2766
2767inline void
2768abstract_origin_attribute (origin)
2769 register tree origin;
2770{
2771 char label[MAX_ARTIFICIAL_LABEL_BYTES];
2772
2773 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_abstract_origin);
2774 switch (TREE_CODE_CLASS (TREE_CODE (origin)))
2775 {
2776 case 'd':
2777 sprintf (label, DECL_NAME_FMT, DECL_UID (origin));
2778 break;
2779
2780 case 't':
2781 sprintf (label, TYPE_NAME_FMT, TYPE_UID (origin));
2782 break;
2783
2784 default:
2785 abort (); /* Should never happen. */
2786
2787 }
2788 ASM_OUTPUT_DWARF_REF (asm_out_file, label);
2789}
2790
2791#ifdef DWARF_DECL_COORDINATES
2792inline void
2793src_coords_attribute (src_fileno, src_lineno)
2794 register unsigned src_fileno;
2795 register unsigned src_lineno;
2796{
2797 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_src_coords);
2798 ASM_OUTPUT_DWARF_DATA2 (asm_out_file, src_fileno);
2799 ASM_OUTPUT_DWARF_DATA2 (asm_out_file, src_lineno);
2800}
2801#endif /* defined(DWARF_DECL_COORDINATES) */
2802
2803inline void
2804pure_or_virtual_attribute (func_decl)
2805 register tree func_decl;
2806{
2807 if (DECL_VIRTUAL_P (func_decl))
2808 {
2809#if 0 /* DECL_ABSTRACT_VIRTUAL_P is C++-specific. */
2810 if (DECL_ABSTRACT_VIRTUAL_P (func_decl))
2811 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_pure_virtual);
2812 else
2813#endif
2814 ASM_OUTPUT_DWARF_ATTRIBUTE (asm_out_file, AT_virtual);
2815 ASM_OUTPUT_DWARF_STRING (asm_out_file, "");
2816 }
2817}
2818
2819/************************* end of attributes *****************************/
2820
2821/********************* utility routines for DIEs *************************/
2822
2823/* Output an AT_name attribute and an AT_src_coords attribute for the
2824 given decl, but only if it actually has a name. */
2825
2826static void
2827name_and_src_coords_attributes (decl)
2828 register tree decl;
2829{
2830 register tree decl_name = DECL_NAME (decl);
2831
2832 if (decl_name && IDENTIFIER_POINTER (decl_name))
2833 {
2834 name_attribute (IDENTIFIER_POINTER (decl_name));
2835#ifdef DWARF_DECL_COORDINATES
2836 {
2837 register unsigned file_index;
2838
2839 /* This is annoying, but we have to pop out of the .debug section
2840 for a moment while we call `lookup_filename' because calling it
2841 may cause a temporary switch into the .debug_sfnames section and
2842 most svr4 assemblers are not smart enough be be able to nest
2843 section switches to any depth greater than one. Note that we
2844 also can't skirt this issue by delaying all output to the
2845 .debug_sfnames section unit the end of compilation because that
2846 would cause us to have inter-section forward references and
2847 Fred Fish sez that m68k/svr4 assemblers botch those. */
2848
2849 ASM_OUTPUT_POP_SECTION (asm_out_file);
2850 file_index = lookup_filename (DECL_SOURCE_FILE (decl));
2851 ASM_OUTPUT_PUSH_SECTION (asm_out_file, DEBUG_SECTION);
2852
2853 src_coords_attribute (file_index, DECL_SOURCE_LINE (decl));
2854 }
2855#endif /* defined(DWARF_DECL_COORDINATES) */
2856 }
2857}
2858
2859/* Many forms of DIEs contain a "type description" part. The following
2860 routine writes out these "type descriptor" parts. */
2861
2862static void
2863type_attribute (type, decl_const, decl_volatile)
2864 register tree type;
2865 register int decl_const;
2866 register int decl_volatile;
2867{
2868 register enum tree_code code = TREE_CODE (type);
2869 register int root_type_modified;
2870
2871 if (TREE_CODE (type) == ERROR_MARK)
2872 return;
2873
2874 /* Handle a special case. For functions whose return type is void,
2875 we generate *no* type attribute. (Note that no object may have
2876 type `void', so this only applies to function return types. */
2877
2878 if (TREE_CODE (type) == VOID_TYPE)
2879 return;
2880
2881 root_type_modified = (code == POINTER_TYPE || code == REFERENCE_TYPE
2882 || decl_const || decl_volatile
2883 || TYPE_READONLY (type) || TYPE_VOLATILE (type));
2884
2885 if (type_is_fundamental (root_type (type)))
2886 if (root_type_modified)
2887 mod_fund_type_attribute (type, decl_const, decl_volatile);
2888 else
2889 fund_type_attribute (fundamental_type_code (type));
2890 else
2891 if (root_type_modified)
2892 mod_u_d_type_attribute (type, decl_const, decl_volatile);
2893 else
5bd49366 2894 /* We have to get the type_main_variant here (and pass that to the
9bf86ebb
PR
2895 `user_def_type_attribute' routine) because the ..._TYPE node we
2896 have might simply be a *copy* of some original type node (where
2897 the copy was created to help us keep track of typedef names)
2898 and that copy might have a different TYPE_UID from the original
2899 ..._TYPE node. (Note that when `equate_type_number_to_die_number'
2900 is labeling a given type DIE for future reference, it always and
2901 only creates labels for DIEs representing *main variants*, and it
2902 never even knows about non-main-variants.) */
5bd49366 2903 user_def_type_attribute (type_main_variant (type));
9bf86ebb
PR
2904}
2905
2906/* Given a tree pointer to a struct, class, union, or enum type node, return
2907 a pointer to the (string) tag name for the given type, or zero if the
2908 type was declared without a tag. */
2909
2910static char *
2911type_tag (type)
2912 register tree type;
2913{
2914 register char *name = 0;
2915
2916 if (TYPE_NAME (type) != 0)
2917 {
2918 register tree t = 0;
2919
2920 /* Find the IDENTIFIER_NODE for the type name. */
2921 if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE)
2922 t = TYPE_NAME (type);
2923#if 0
2924 /* The g++ front end makes the TYPE_NAME of *each* tagged type point
2925 to a TYPE_DECL node, regardless of whether or not a `typedef' was
2926 involved. This is distinctly different from what the gcc front-end
2927 does. It always makes the TYPE_NAME for each tagged type be either
2928 NULL (signifying an anonymous tagged type) or else a pointer to an
2929 IDENTIFIER_NODE. Obviously, we would like to generate correct Dwarf
2930 for both C and C++, but given this inconsistency in the TREE
2931 representation of tagged types for C and C++ in the GNU front-ends,
2932 we cannot support both languages correctly unless we introduce some
2933 front-end specific code here, and rms objects to that, so we can
2934 only generate correct Dwarf for one of these two languages. C is
2935 more important, so for now we'll do the right thing for C and let
2936 g++ go fish. */
2937
2938 else
2939 if (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL)
2940 t = DECL_NAME (TYPE_NAME (type));
2941#endif
2942 /* Now get the name as a string, or invent one. */
2943 if (t != 0)
2944 name = IDENTIFIER_POINTER (t);
2945 }
2946
2947 return (name == 0 || *name == '\0') ? 0 : name;
2948}
2949
2950inline void
2951dienum_push ()
2952{
2953 /* Start by checking if the pending_sibling_stack needs to be expanded.
2954 If necessary, expand it. */
2955
2956 if (pending_siblings == pending_siblings_allocated)
2957 {
2958 pending_siblings_allocated += PENDING_SIBLINGS_INCREMENT;
2959 pending_sibling_stack
2960 = (unsigned *) xrealloc (pending_sibling_stack,
2961 pending_siblings_allocated * sizeof(unsigned));
2962 }
2963
2964 pending_siblings++;
2965 NEXT_DIE_NUM = next_unused_dienum++;
2966}
2967
2968/* Pop the sibling stack so that the most recently pushed DIEnum becomes the
2969 NEXT_DIE_NUM. */
2970
2971inline void
2972dienum_pop ()
2973{
2974 pending_siblings--;
2975}
2976
2977inline tree
2978member_declared_type (member)
2979 register tree member;
2980{
2981 return (DECL_BIT_FIELD_TYPE (member))
2982 ? DECL_BIT_FIELD_TYPE (member)
2983 : TREE_TYPE (member);
2984}
2985
2986/******************************* DIEs ************************************/
2987
2988/* Output routines for individual types of DIEs. */
2989
2990/* Note that every type of DIE (except a null DIE) gets a sibling. */
2991
2992static void
2993output_array_type_die (arg)
2994 register void *arg;
2995{
2996 register tree type = arg;
2997
2998 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_array_type);
2999 sibling_attribute ();
3000 equate_type_number_to_die_number (type);
3001 member_attribute (TYPE_CONTEXT (type));
3002
3003 /* I believe that we can default the array ordering. SDB will probably
3004 do the right things even if AT_ordering is not present. It's not
3005 even an issue until we start to get into multidimensional arrays
3006 anyway. If SDB is ever caught doing the Wrong Thing for multi-
3007 dimensional arrays, then we'll have to put the AT_ordering attribute
3008 back in. (But if and when we find out that we need to put these in,
3009 we will only do so for multidimensional arrays. After all, we don't
3010 want to waste space in the .debug section now do we?) */
3011
3012#ifdef USE_ORDERING_ATTRIBUTE
3013 ordering_attribute (ORD_row_major);
3014#endif /* defined(USE_ORDERING_ATTRIBUTE) */
3015
3016 subscript_data_attribute (type);
3017}
3018
3019static void
3020output_set_type_die (arg)
3021 register void *arg;
3022{
3023 register tree type = arg;
3024
3025 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_set_type);
3026 sibling_attribute ();
3027 equate_type_number_to_die_number (type);
3028 member_attribute (TYPE_CONTEXT (type));
3029 type_attribute (TREE_TYPE (type), 0, 0);
3030}
3031
3032#if 0
3033/* Implement this when there is a GNU FORTRAN or GNU Ada front end. */
3034static void
3035output_entry_point_die (arg)
3036 register void *arg;
3037{
3038 register tree decl = arg;
3039 register tree origin = decl_ultimate_origin (decl);
3040
3041 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_entry_point);
3042 sibling_attribute ();
3043 dienum_push ();
3044 if (origin != NULL)
3045 abstract_origin_attribute (origin);
3046 else
3047 {
3048 name_and_src_coords_attributes (decl);
3049 member_attribute (DECL_CONTEXT (decl));
3050 type_attribute (TREE_TYPE (TREE_TYPE (decl)), 0, 0);
3051 }
3052 if (DECL_ABSTRACT (decl))
3053 equate_decl_number_to_die_number (decl);
3054 else
3055 low_pc_attribute (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)));
3056}
3057#endif
3058
3059/* Output a DIE to represent an inlined instance of an enumeration type. */
3060
3061static void
3062output_inlined_enumeration_type_die (arg)
3063 register void *arg;
3064{
3065 register tree type = arg;
3066
3067 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_enumeration_type);
3068 sibling_attribute ();
3069 assert (TREE_ASM_WRITTEN (type));
3070 abstract_origin_attribute (type);
3071}
3072
3073/* Output a DIE to represent an inlined instance of a structure type. */
3074
3075static void
3076output_inlined_structure_type_die (arg)
3077 register void *arg;
3078{
3079 register tree type = arg;
3080
3081 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_structure_type);
3082 sibling_attribute ();
3083 assert (TREE_ASM_WRITTEN (type));
3084 abstract_origin_attribute (type);
3085}
3086
3087/* Output a DIE to represent an inlined instance of a union type. */
3088
3089static void
3090output_inlined_union_type_die (arg)
3091 register void *arg;
3092{
3093 register tree type = arg;
3094
3095 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_union_type);
3096 sibling_attribute ();
3097 assert (TREE_ASM_WRITTEN (type));
3098 abstract_origin_attribute (type);
3099}
3100
3101/* Output a DIE to represent an enumeration type. Note that these DIEs
3102 include all of the information about the enumeration values also.
3103 This information is encoded into the element_list attribute. */
3104
3105static void
3106output_enumeration_type_die (arg)
3107 register void *arg;
3108{
3109 register tree type = arg;
3110
3111 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_enumeration_type);
3112 sibling_attribute ();
3113 equate_type_number_to_die_number (type);
3114 name_attribute (type_tag (type));
3115 member_attribute (TYPE_CONTEXT (type));
3116
3117 /* Handle a GNU C/C++ extension, i.e. incomplete enum types. If the
3118 given enum type is incomplete, do not generate the AT_byte_size
3119 attribute or the AT_element_list attribute. */
3120
3121 if (TYPE_SIZE (type))
3122 {
3123 byte_size_attribute (type);
3124 element_list_attribute (TYPE_FIELDS (type));
3125 }
3126}
3127
3128/* Output a DIE to represent either a real live formal parameter decl or
3129 to represent just the type of some formal parameter position in some
3130 function type.
3131
3132 Note that this routine is a bit unusual because its argument may be
3133 a ..._DECL node (i.e. either a PARM_DECL or perhaps a VAR_DECL which
3134 represents an inlining of some PARM_DECL) or else some sort of a
3135 ..._TYPE node. If it's the former then this function is being called
3136 to output a DIE to represent a formal parameter object (or some inlining
3137 thereof). If it's the latter, then this function is only being called
3138 to output a TAG_formal_parameter DIE to stand as a placeholder for some
3139 formal argument type of some subprogram type. */
3140
3141static void
3142output_formal_parameter_die (arg)
3143 register void *arg;
3144{
3145 register tree node = arg;
3146
3147 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_formal_parameter);
3148 sibling_attribute ();
3149
3150 switch (TREE_CODE_CLASS (TREE_CODE (node)))
3151 {
3152 case 'd': /* We were called with some kind of a ..._DECL node. */
3153 {
3154 register tree origin = decl_ultimate_origin (node);
3155
3156 if (origin != NULL)
3157 abstract_origin_attribute (origin);
3158 else
3159 {
3160 name_and_src_coords_attributes (node);
3161 type_attribute (TREE_TYPE (node),
3162 TREE_READONLY (node), TREE_THIS_VOLATILE (node));
3163 }
3164 if (DECL_ABSTRACT (node))
3165 equate_decl_number_to_die_number (node);
3166 else
3167 location_or_const_value_attribute (node);
3168 }
3169 break;
3170
3171 case 't': /* We were called with some kind of a ..._TYPE node. */
3172 type_attribute (node, 0, 0);
3173 break;
3174
3175 default:
3176 abort (); /* Should never happen. */
3177 }
3178}
3179
3180/* Output a DIE to represent a declared function (either file-scope
3181 or block-local) which has "external linkage" (according to ANSI-C). */
3182
3183static void
3184output_global_subroutine_die (arg)
3185 register void *arg;
3186{
3187 register tree decl = arg;
3188 register tree origin = decl_ultimate_origin (decl);
3189
3190 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_global_subroutine);
3191 sibling_attribute ();
3192 dienum_push ();
3193 if (origin != NULL)
3194 abstract_origin_attribute (origin);
3195 else
3196 {
3197 register tree type = TREE_TYPE (decl);
3198
3199 name_and_src_coords_attributes (decl);
3200 inline_attribute (decl);
3201 prototyped_attribute (type);
3202 member_attribute (DECL_CONTEXT (decl));
3203 type_attribute (TREE_TYPE (type), 0, 0);
3204 pure_or_virtual_attribute (decl);
3205 }
3206 if (DECL_ABSTRACT (decl))
3207 equate_decl_number_to_die_number (decl);
3208 else
3209 {
3210 if (! DECL_EXTERNAL (decl))
3211 {
3212 char label[MAX_ARTIFICIAL_LABEL_BYTES];
3213
3214 low_pc_attribute (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)));
3215 sprintf (label, FUNC_END_LABEL_FMT, current_funcdef_number);
3216 high_pc_attribute (label);
3217 sprintf (label, BODY_BEGIN_LABEL_FMT, current_funcdef_number);
3218 body_begin_attribute (label);
3219 sprintf (label, BODY_END_LABEL_FMT, current_funcdef_number);
3220 body_end_attribute (label);
3221 }
3222 }
3223}
3224
3225/* Output a DIE to represent a declared data object (either file-scope
3226 or block-local) which has "external linkage" (according to ANSI-C). */
3227
3228static void
3229output_global_variable_die (arg)
3230 register void *arg;
3231{
3232 register tree decl = arg;
3233 register tree origin = decl_ultimate_origin (decl);
3234
3235 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_global_variable);
3236 sibling_attribute ();
3237 if (origin != NULL)
3238 abstract_origin_attribute (origin);
3239 else
3240 {
3241 name_and_src_coords_attributes (decl);
3242 member_attribute (DECL_CONTEXT (decl));
3243 type_attribute (TREE_TYPE (decl),
3244 TREE_READONLY (decl), TREE_THIS_VOLATILE (decl));
3245 }
3246 if (DECL_ABSTRACT (decl))
3247 equate_decl_number_to_die_number (decl);
3248 else
3249 {
3250 if (!DECL_EXTERNAL (decl))
3251 location_or_const_value_attribute (decl);
3252 }
3253}
3254
3255static void
3256output_label_die (arg)
3257 register void *arg;
3258{
3259 register tree decl = arg;
3260 register tree origin = decl_ultimate_origin (decl);
3261
3262 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_label);
3263 sibling_attribute ();
3264 if (origin != NULL)
3265 abstract_origin_attribute (origin);
3266 else
3267 name_and_src_coords_attributes (decl);
3268 if (DECL_ABSTRACT (decl))
3269 equate_decl_number_to_die_number (decl);
3270 else
3271 {
3272 register rtx insn = DECL_RTL (decl);
3273
3274 if (GET_CODE (insn) == CODE_LABEL)
3275 {
3276 char label[MAX_ARTIFICIAL_LABEL_BYTES];
3277
3278 /* When optimization is enabled (via -O) some parts of the compiler
3279 (e.g. jump.c and cse.c) may try to delete CODE_LABEL insns which
3280 represent source-level labels which were explicitly declared by
3281 the user. This really shouldn't be happening though, so catch
3282 it if it ever does happen. */
3283
3284 if (INSN_DELETED_P (insn))
3285 abort (); /* Should never happen. */
3286
3287 sprintf (label, INSN_LABEL_FMT, current_funcdef_number,
3288 (unsigned) INSN_UID (insn));
3289 low_pc_attribute (label);
3290 }
3291 }
3292}
3293
3294static void
3295output_lexical_block_die (arg)
3296 register void *arg;
3297{
3298 register tree stmt = arg;
3299
3300 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_lexical_block);
3301 sibling_attribute ();
3302 dienum_push ();
3303 if (! BLOCK_ABSTRACT (stmt))
3304 {
3305 char begin_label[MAX_ARTIFICIAL_LABEL_BYTES];
3306 char end_label[MAX_ARTIFICIAL_LABEL_BYTES];
3307
3308 sprintf (begin_label, BLOCK_BEGIN_LABEL_FMT, next_block_number);
3309 low_pc_attribute (begin_label);
3310 sprintf (end_label, BLOCK_END_LABEL_FMT, next_block_number);
3311 high_pc_attribute (end_label);
3312 }
3313}
3314
3315static void
3316output_inlined_subroutine_die (arg)
3317 register void *arg;
3318{
3319 register tree stmt = arg;
3320
3321 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_inlined_subroutine);
3322 sibling_attribute ();
3323 dienum_push ();
3324 abstract_origin_attribute (block_ultimate_origin (stmt));
3325 if (! BLOCK_ABSTRACT (stmt))
3326 {
3327 char begin_label[MAX_ARTIFICIAL_LABEL_BYTES];
3328 char end_label[MAX_ARTIFICIAL_LABEL_BYTES];
3329
3330 sprintf (begin_label, BLOCK_BEGIN_LABEL_FMT, next_block_number);
3331 low_pc_attribute (begin_label);
3332 sprintf (end_label, BLOCK_END_LABEL_FMT, next_block_number);
3333 high_pc_attribute (end_label);
3334 }
3335}
3336
3337/* Output a DIE to represent a declared data object (either file-scope
3338 or block-local) which has "internal linkage" (according to ANSI-C). */
3339
3340static void
3341output_local_variable_die (arg)
3342 register void *arg;
3343{
3344 register tree decl = arg;
3345 register tree origin = decl_ultimate_origin (decl);
3346
3347 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_local_variable);
3348 sibling_attribute ();
3349 if (origin != NULL)
3350 abstract_origin_attribute (origin);
3351 else
3352 {
3353 name_and_src_coords_attributes (decl);
3354 member_attribute (DECL_CONTEXT (decl));
3355 type_attribute (TREE_TYPE (decl),
3356 TREE_READONLY (decl), TREE_THIS_VOLATILE (decl));
3357 }
3358 if (DECL_ABSTRACT (decl))
3359 equate_decl_number_to_die_number (decl);
3360 else
3361 location_or_const_value_attribute (decl);
3362}
3363
3364static void
3365output_member_die (arg)
3366 register void *arg;
3367{
3368 register tree decl = arg;
3369
3370 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_member);
3371 sibling_attribute ();
3372 name_and_src_coords_attributes (decl);
3373 member_attribute (DECL_CONTEXT (decl));
3374 type_attribute (member_declared_type (decl),
3375 TREE_READONLY (decl), TREE_THIS_VOLATILE (decl));
3376 if (DECL_BIT_FIELD_TYPE (decl)) /* If this is a bit field... */
3377 {
3378 byte_size_attribute (decl);
3379 bit_size_attribute (decl);
3380 bit_offset_attribute (decl);
3381 }
3382 data_member_location_attribute (decl);
3383}
3384
3385#if 0
3386/* Don't generate either pointer_type DIEs or reference_type DIEs. Use
3387 modified types instead.
3388
3389 We keep this code here just in case these types of DIEs may be needed
3390 to represent certain things in other languages (e.g. Pascal) someday.
3391*/
3392
3393static void
3394output_pointer_type_die (arg)
3395 register void *arg;
3396{
3397 register tree type = arg;
3398
3399 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_pointer_type);
3400 sibling_attribute ();
3401 equate_type_number_to_die_number (type);
3402 member_attribute (TYPE_CONTEXT (type));
3403 type_attribute (TREE_TYPE (type), 0, 0);
3404}
3405
3406static void
3407output_reference_type_die (arg)
3408 register void *arg;
3409{
3410 register tree type = arg;
3411
3412 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_reference_type);
3413 sibling_attribute ();
3414 equate_type_number_to_die_number (type);
3415 member_attribute (TYPE_CONTEXT (type));
3416 type_attribute (TREE_TYPE (type), 0, 0);
3417}
3418#endif
3419
3420static void
3421output_ptr_to_mbr_type_die (arg)
3422 register void *arg;
3423{
3424 register tree type = arg;
3425
3426 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_ptr_to_member_type);
3427 sibling_attribute ();
3428 equate_type_number_to_die_number (type);
3429 member_attribute (TYPE_CONTEXT (type));
3430 containing_type_attribute (TYPE_OFFSET_BASETYPE (type));
3431 type_attribute (TREE_TYPE (type), 0, 0);
3432}
3433
3434static void
3435output_compile_unit_die (arg)
3436 register void *arg;
3437{
3438 register char *main_input_filename = arg;
3439
3440 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_compile_unit);
3441 sibling_attribute ();
3442 dienum_push ();
3443 name_attribute (main_input_filename);
3444
3445 {
3446 char producer[250];
3447
3448 sprintf (producer, "%s %s", language_string, version_string);
3449 producer_attribute (producer);
3450 }
3451
3452 if (strcmp (language_string, "GNU C++") == 0)
3453 language_attribute (LANG_C_PLUS_PLUS);
3454 else if (flag_traditional)
3455 language_attribute (LANG_C);
3456 else
3457 language_attribute (LANG_C89);
3458 low_pc_attribute (TEXT_BEGIN_LABEL);
3459 high_pc_attribute (TEXT_END_LABEL);
3460 if (debug_info_level >= DINFO_LEVEL_NORMAL)
3461 stmt_list_attribute (LINE_BEGIN_LABEL);
3462 last_filename = xstrdup (main_input_filename);
3463
3464 {
3465 char *wd = getpwd ();
3466 if (wd)
3467 comp_dir_attribute (wd);
3468 }
3469
3470 if (debug_info_level >= DINFO_LEVEL_NORMAL)
3471 {
3472 sf_names_attribute (SFNAMES_BEGIN_LABEL);
3473 src_info_attribute (SRCINFO_BEGIN_LABEL);
3474 if (debug_info_level >= DINFO_LEVEL_VERBOSE)
3475 mac_info_attribute (MACINFO_BEGIN_LABEL);
3476 }
3477}
3478
3479static void
3480output_string_type_die (arg)
3481 register void *arg;
3482{
3483 register tree type = arg;
3484
3485 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_string_type);
3486 sibling_attribute ();
3487 member_attribute (TYPE_CONTEXT (type));
3488
3489 /* Fudge the string length attribute for now. */
3490
3491 string_length_attribute (TYPE_MAX_VALUE (TYPE_DOMAIN (type)));
3492}
3493
3494static void
3495output_structure_type_die (arg)
3496 register void *arg;
3497{
3498 register tree type = arg;
3499
3500 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_structure_type);
3501 sibling_attribute ();
3502 equate_type_number_to_die_number (type);
3503 name_attribute (type_tag (type));
3504 member_attribute (TYPE_CONTEXT (type));
3505
3506 /* If this type has been completed, then give it a byte_size attribute
3507 and prepare to give a list of members. Otherwise, don't do either of
3508 these things. In the latter case, we will not be generating a list
3509 of members (since we don't have any idea what they might be for an
3510 incomplete type). */
3511
3512 if (TYPE_SIZE (type))
3513 {
3514 dienum_push ();
3515 byte_size_attribute (type);
3516 }
3517}
3518
3519/* Output a DIE to represent a declared function (either file-scope
3520 or block-local) which has "internal linkage" (according to ANSI-C). */
3521
3522static void
3523output_local_subroutine_die (arg)
3524 register void *arg;
3525{
3526 register tree decl = arg;
3527 register tree origin = decl_ultimate_origin (decl);
3528
3529 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_subroutine);
3530 sibling_attribute ();
3531 dienum_push ();
3532 if (origin != NULL)
3533 abstract_origin_attribute (origin);
3534 else
3535 {
3536 register tree type = TREE_TYPE (decl);
3537
3538 name_and_src_coords_attributes (decl);
3539 inline_attribute (decl);
3540 prototyped_attribute (type);
3541 member_attribute (DECL_CONTEXT (decl));
3542 type_attribute (TREE_TYPE (type), 0, 0);
3543 pure_or_virtual_attribute (decl);
3544 }
3545 if (DECL_ABSTRACT (decl))
3546 equate_decl_number_to_die_number (decl);
3547 else
3548 {
3549 /* Avoid getting screwed up in cases where a function was declared
3550 static but where no definition was ever given for it. */
3551
3552 if (TREE_ASM_WRITTEN (decl))
3553 {
3554 char label[MAX_ARTIFICIAL_LABEL_BYTES];
3555
3556 low_pc_attribute (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)));
3557 sprintf (label, FUNC_END_LABEL_FMT, current_funcdef_number);
3558 high_pc_attribute (label);
3559 sprintf (label, BODY_BEGIN_LABEL_FMT, current_funcdef_number);
3560 body_begin_attribute (label);
3561 sprintf (label, BODY_END_LABEL_FMT, current_funcdef_number);
3562 body_end_attribute (label);
3563 }
3564 }
3565}
3566
3567static void
3568output_subroutine_type_die (arg)
3569 register void *arg;
3570{
3571 register tree type = arg;
3572 register tree return_type = TREE_TYPE (type);
3573
3574 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_subroutine_type);
3575 sibling_attribute ();
3576 dienum_push ();
3577 equate_type_number_to_die_number (type);
3578 prototyped_attribute (type);
3579 member_attribute (TYPE_CONTEXT (type));
3580 type_attribute (return_type, 0, 0);
3581}
3582
3583static void
3584output_typedef_die (arg)
3585 register void *arg;
3586{
3587 register tree decl = arg;
3588 register tree origin = decl_ultimate_origin (decl);
3589
3590 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_typedef);
3591 sibling_attribute ();
3592 if (origin != NULL)
3593 abstract_origin_attribute (origin);
3594 else
3595 {
3596 name_and_src_coords_attributes (decl);
3597 member_attribute (DECL_CONTEXT (decl));
3598 type_attribute (TREE_TYPE (decl),
3599 TREE_READONLY (decl), TREE_THIS_VOLATILE (decl));
3600 }
3601 if (DECL_ABSTRACT (decl))
3602 equate_decl_number_to_die_number (decl);
3603}
3604
3605static void
3606output_union_type_die (arg)
3607 register void *arg;
3608{
3609 register tree type = arg;
3610
3611 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_union_type);
3612 sibling_attribute ();
3613 equate_type_number_to_die_number (type);
3614 name_attribute (type_tag (type));
3615 member_attribute (TYPE_CONTEXT (type));
3616
3617 /* If this type has been completed, then give it a byte_size attribute
3618 and prepare to give a list of members. Otherwise, don't do either of
3619 these things. In the latter case, we will not be generating a list
3620 of members (since we don't have any idea what they might be for an
3621 incomplete type). */
3622
3623 if (TYPE_SIZE (type))
3624 {
3625 dienum_push ();
3626 byte_size_attribute (type);
3627 }
3628}
3629
3630/* Generate a special type of DIE used as a stand-in for a trailing ellipsis
3631 at the end of an (ANSI prototyped) formal parameters list. */
3632
3633static void
3634output_unspecified_parameters_die (arg)
3635 register void *arg;
3636{
3637 register tree decl_or_type = arg;
3638
3639 ASM_OUTPUT_DWARF_TAG (asm_out_file, TAG_unspecified_parameters);
3640 sibling_attribute ();
3641
3642 /* This kludge is here only for the sake of being compatible with what
3643 the USL CI5 C compiler does. The specification of Dwarf Version 1
3644 doesn't say that TAG_unspecified_parameters DIEs should contain any
3645 attributes other than the AT_sibling attribute, but they are certainly
3646 allowed to contain additional attributes, and the CI5 compiler
3647 generates AT_name, AT_fund_type, and AT_location attributes within
3648 TAG_unspecified_parameters DIEs which appear in the child lists for
3649 DIEs representing function definitions, so we do likewise here. */
3650
3651 if (TREE_CODE (decl_or_type) == FUNCTION_DECL && DECL_INITIAL (decl_or_type))
3652 {
3653 name_attribute ("...");
3654 fund_type_attribute (FT_pointer);
3655 /* location_attribute (?); */
3656 }
3657}
3658
3659static void
3660output_padded_null_die (arg)
3661 register void *arg;
3662{
3663 ASM_OUTPUT_ALIGN (asm_out_file, 2); /* 2**2 == 4 */
3664}
3665
3666/*************************** end of DIEs *********************************/
3667
3668/* Generate some type of DIE. This routine generates the generic outer
3669 wrapper stuff which goes around all types of DIE's (regardless of their
3670 TAGs. All forms of DIEs start with a DIE-specific label, followed by a
3671 DIE-length word, followed by the guts of the DIE itself. After the guts
3672 of the DIE, there must always be a terminator label for the DIE. */
3673
3674static void
3675output_die (die_specific_output_function, param)
3676 register void (*die_specific_output_function)();
3677 register void *param;
3678{
3679 char begin_label[MAX_ARTIFICIAL_LABEL_BYTES];
3680 char end_label[MAX_ARTIFICIAL_LABEL_BYTES];
3681
3682 current_dienum = NEXT_DIE_NUM;
3683 NEXT_DIE_NUM = next_unused_dienum;
3684
3685 sprintf (begin_label, DIE_BEGIN_LABEL_FMT, current_dienum);
3686 sprintf (end_label, DIE_END_LABEL_FMT, current_dienum);
3687
3688 /* Write a label which will act as the name for the start of this DIE. */
3689
3690 ASM_OUTPUT_LABEL (asm_out_file, begin_label);
3691
3692 /* Write the DIE-length word. */
3693
3694 ASM_OUTPUT_DWARF_DELTA4 (asm_out_file, end_label, begin_label);
3695
3696 /* Fill in the guts of the DIE. */
3697
3698 next_unused_dienum++;
3699 die_specific_output_function (param);
3700
3701 /* Write a label which will act as the name for the end of this DIE. */
3702
3703 ASM_OUTPUT_LABEL (asm_out_file, end_label);
3704}
3705
3706static void
3707end_sibling_chain ()
3708{
3709 char begin_label[MAX_ARTIFICIAL_LABEL_BYTES];
3710
3711 current_dienum = NEXT_DIE_NUM;
3712 NEXT_DIE_NUM = next_unused_dienum;
3713
3714 sprintf (begin_label, DIE_BEGIN_LABEL_FMT, current_dienum);
3715
3716 /* Write a label which will act as the name for the start of this DIE. */
3717
3718 ASM_OUTPUT_LABEL (asm_out_file, begin_label);
3719
3720 /* Write the DIE-length word. */
3721
3722 ASM_OUTPUT_DWARF_DATA4 (asm_out_file, 4);
3723
3724 dienum_pop ();
3725}
3726\f
3727/* Generate a list of nameless TAG_formal_parameter DIEs (and perhaps a
3728 TAG_unspecified_parameters DIE) to represent the types of the formal
3729 parameters as specified in some function type specification (except
3730 for those which appear as part of a function *definition*).
3731
3732 Note that we must be careful here to output all of the parameter DIEs
3733 *before* we output any DIEs needed to represent the types of the formal
3734 parameters. This keeps svr4 SDB happy because it (incorrectly) thinks
3735 that the first non-parameter DIE it sees ends the formal parameter list.
3736*/
3737
3738static void
3739output_formal_types (function_or_method_type)
3740 register tree function_or_method_type;
3741{
3742 register tree link;
3743 register tree formal_type = NULL;
3744 register tree first_parm_type = TYPE_ARG_TYPES (function_or_method_type);
3745
3746 /* In the case where we are generating a formal types list for a C++
3747 non-static member function type, skip over the first thing on the
3748 TYPE_ARG_TYPES list because it only represents the type of the
3749 hidden `this pointer'. The debugger should be able to figure
3750 out (without being explicitly told) that this non-static member
3751 function type takes a `this pointer' and should be able to figure
3752 what the type of that hidden parameter is from the AT_member
3753 attribute of the parent TAG_subroutine_type DIE. */
3754
3755 if (TREE_CODE (function_or_method_type) == METHOD_TYPE)
3756 first_parm_type = TREE_CHAIN (first_parm_type);
3757
3758 /* Make our first pass over the list of formal parameter types and output
3759 a TAG_formal_parameter DIE for each one. */
3760
3761 for (link = first_parm_type; link; link = TREE_CHAIN (link))
3762 {
3763 formal_type = TREE_VALUE (link);
3764 if (formal_type == void_type_node)
3765 break;
3766
3767 /* Output a (nameless) DIE to represent the formal parameter itself. */
3768
3769 output_die (output_formal_parameter_die, formal_type);
3770 }
3771
3772 /* If this function type has an ellipsis, add a TAG_unspecified_parameters
3773 DIE to the end of the parameter list. */
3774
3775 if (formal_type != void_type_node)
3776 output_die (output_unspecified_parameters_die, function_or_method_type);
3777
3778 /* Make our second (and final) pass over the list of formal parameter types
3779 and output DIEs to represent those types (as necessary). */
3780
3781 for (link = TYPE_ARG_TYPES (function_or_method_type);
3782 link;
3783 link = TREE_CHAIN (link))
3784 {
3785 formal_type = TREE_VALUE (link);
3786 if (formal_type == void_type_node)
3787 break;
3788
3789 output_type (formal_type, function_or_method_type);
3790 }
3791}
3792\f
3793/* Remember a type in the pending_types_list. */
3794
3795static void
3796pend_type (type)
3797 register tree type;
3798{
3799 if (pending_types == pending_types_allocated)
3800 {
3801 pending_types_allocated += PENDING_TYPES_INCREMENT;
3802 pending_types_list
3803 = (tree *) xrealloc (pending_types_list,
3804 sizeof (tree) * pending_types_allocated);
3805 }
3806 pending_types_list[pending_types++] = type;
3807
3808 /* Mark the pending type as having been output already (even though
3809 it hasn't been). This prevents the type from being added to the
3810 pending_types_list more than once. */
3811
3812 TREE_ASM_WRITTEN (type) = 1;
3813}
3814
3815/* Return non-zero if it is legitimate to output DIEs to represent a
3816 given type while we are generating the list of child DIEs for some
3817 DIE (e.g. a function or lexical block DIE) associated with a given scope.
3818
3819 See the comments within the function for a description of when it is
3820 considered legitimate to output DIEs for various kinds of types.
3821
3822 Note that TYPE_CONTEXT(type) may be NULL (to indicate global scope)
3823 or it may point to a BLOCK node (for types local to a block), or to a
3824 FUNCTION_DECL node (for types local to the heading of some function
3825 definition), or to a FUNCTION_TYPE node (for types local to the
3826 prototyped parameter list of a function type specification), or to a
3827 RECORD_TYPE, UNION_TYPE, or QUAL_UNION_TYPE node
3828 (in the case of C++ nested types).
3829
3830 The `scope' parameter should likewise be NULL or should point to a
3831 BLOCK node, a FUNCTION_DECL node, a FUNCTION_TYPE node, a RECORD_TYPE
3832 node, a UNION_TYPE node, or a QUAL_UNION_TYPE node.
3833
3834 This function is used only for deciding when to "pend" and when to
3835 "un-pend" types to/from the pending_types_list.
3836
3837 Note that we sometimes make use of this "type pending" feature in a
3838 rather twisted way to temporarily delay the production of DIEs for the
3839 types of formal parameters. (We do this just to make svr4 SDB happy.)
3840 It order to delay the production of DIEs representing types of formal
3841 parameters, callers of this function supply `fake_containing_scope' as
3842 the `scope' parameter to this function. Given that fake_containing_scope
3843 is a tagged type which is *not* the containing scope for *any* other type,
3844 the desired effect is achieved, i.e. output of DIEs representing types
3845 is temporarily suspended, and any type DIEs which would have otherwise
3846 been output are instead placed onto the pending_types_list. Later on,
3847 we force these (temporarily pended) types to be output simply by calling
3848 `output_pending_types_for_scope' with an actual argument equal to the
3849 true scope of the types we temporarily pended.
3850*/
3851
3852inline int
3853type_ok_for_scope (type, scope)
3854 register tree type;
3855 register tree scope;
3856{
3857 /* Tagged types (i.e. struct, union, and enum types) must always be
3858 output only in the scopes where they actually belong (or else the
3859 scoping of their own tag names and the scoping of their member
3860 names will be incorrect). Non-tagged-types on the other hand can
3861 generally be output anywhere, except that svr4 SDB really doesn't
3862 want to see them nested within struct or union types, so here we
3863 say it is always OK to immediately output any such a (non-tagged)
3864 type, so long as we are not within such a context. Note that the
3865 only kinds of non-tagged types which we will be dealing with here
3866 (for C and C++ anyway) will be array types and function types. */
3867
3868 return is_tagged_type (type)
3869 ? (TYPE_CONTEXT (type) == scope)
3870 : (scope == NULL_TREE || ! is_tagged_type (scope));
3871}
3872
3873/* Output any pending types (from the pending_types list) which we can output
3874 now (taking into account the scope that we are working on now).
3875
3876 For each type output, remove the given type from the pending_types_list
3877 *before* we try to output it.
3878
3879 Note that we have to process the list in beginning-to-end order,
3880 because the call made here to output_type may cause yet more types
3881 to be added to the end of the list, and we may have to output some
3882 of them too.
3883*/
3884
3885static void
3886output_pending_types_for_scope (containing_scope)
3887 register tree containing_scope;
3888{
3889 register unsigned i;
3890
3891 for (i = 0; i < pending_types; )
3892 {
3893 register tree type = pending_types_list[i];
3894
3895 if (type_ok_for_scope (type, containing_scope))
3896 {
3897 register tree *mover;
3898 register tree *limit;
3899
3900 pending_types--;
3901 limit = &pending_types_list[pending_types];
3902 for (mover = &pending_types_list[i]; mover < limit; mover++)
3903 *mover = *(mover+1);
3904
3905 /* Un-mark the type as having been output already (because it
3906 hasn't been, really). Then call output_type to generate a
3907 Dwarf representation of it. */
3908
3909 TREE_ASM_WRITTEN (type) = 0;
3910 output_type (type, containing_scope);
3911
3912 /* Don't increment the loop counter in this case because we
3913 have shifted all of the subsequent pending types down one
3914 element in the pending_types_list array. */
3915 }
3916 else
3917 i++;
3918 }
3919}
3920
3921static void
3922output_type (type, containing_scope)
3923 register tree type;
3924 register tree containing_scope;
3925{
3926 if (type == 0 || type == error_mark_node)
3927 return;
3928
3929 /* We are going to output a DIE to represent the unqualified version of
3930 of this type (i.e. without any const or volatile qualifiers) so get
3931 the main variant (i.e. the unqualified version) of this type now. */
3932
5bd49366 3933 type = type_main_variant (type);
9bf86ebb
PR
3934
3935 if (TREE_ASM_WRITTEN (type))
3936 return;
3937
3938 /* Don't generate any DIEs for this type now unless it is OK to do so
3939 (based upon what `type_ok_for_scope' tells us). */
3940
3941 if (! type_ok_for_scope (type, containing_scope))
3942 {
3943 pend_type (type);
3944 return;
3945 }
3946
3947 switch (TREE_CODE (type))
3948 {
3949 case ERROR_MARK:
3950 break;
3951
3952 case POINTER_TYPE:
3953 case REFERENCE_TYPE:
3954 /* For these types, all that is required is that we output a DIE
3955 (or a set of DIEs) to represent the "basis" type. */
3956 output_type (TREE_TYPE (type), containing_scope);
3957 break;
3958
3959 case OFFSET_TYPE:
3960 /* This code is used for C++ pointer-to-data-member types. */
3961 /* Output a description of the relevant class type. */
3962 output_type (TYPE_OFFSET_BASETYPE (type), containing_scope);
3963 /* Output a description of the type of the object pointed to. */
3964 output_type (TREE_TYPE (type), containing_scope);
3965 /* Now output a DIE to represent this pointer-to-data-member type
3966 itself. */
3967 output_die (output_ptr_to_mbr_type_die, type);
3968 break;
3969
3970 case SET_TYPE:
3971 output_type (TREE_TYPE (type), containing_scope);
3972 output_die (output_set_type_die, type);
3973 break;
3974
3975 case FILE_TYPE:
3976 output_type (TREE_TYPE (type), containing_scope);
3977 abort (); /* No way to represent these in Dwarf yet! */
3978 break;
3979
3980 case STRING_TYPE:
3981 output_type (TREE_TYPE (type), containing_scope);
3982 output_die (output_string_type_die, type);
3983 break;
3984
3985 case FUNCTION_TYPE:
3986 /* Force out return type (in case it wasn't forced out already). */
3987 output_type (TREE_TYPE (type), containing_scope);
3988 output_die (output_subroutine_type_die, type);
3989 output_formal_types (type);
3990 end_sibling_chain ();
3991 break;
3992
3993 case METHOD_TYPE:
3994 /* Force out return type (in case it wasn't forced out already). */
3995 output_type (TREE_TYPE (type), containing_scope);
3996 output_die (output_subroutine_type_die, type);
3997 output_formal_types (type);
3998 end_sibling_chain ();
3999 break;
4000
4001 case ARRAY_TYPE:
4002 {
4003 register tree element_type;
4004
4005 element_type = TREE_TYPE (type);
4006 while (TREE_CODE (element_type) == ARRAY_TYPE)
4007 element_type = TREE_TYPE (element_type);
4008
4009 output_type (element_type, containing_scope);
4010 output_die (output_array_type_die, type);
4011 }
4012 break;
4013
4014 case ENUMERAL_TYPE:
4015 case RECORD_TYPE:
4016 case UNION_TYPE:
4017 case QUAL_UNION_TYPE:
4018
4019 /* For a non-file-scope tagged type, we can always go ahead and
4020 output a Dwarf description of this type right now, even if
4021 the type in question is still incomplete, because if this
4022 local type *was* ever completed anywhere within its scope,
4023 that complete definition would already have been attached to
4024 this RECORD_TYPE, UNION_TYPE, QUAL_UNION_TYPE or ENUMERAL_TYPE
4025 node by the time we reach this point. That's true because of the
4026 way the front-end does its processing of file-scope declarations (of
4027 functions and class types) within which other types might be
4028 nested. The C and C++ front-ends always gobble up such "local
4029 scope" things en-mass before they try to output *any* debugging
4030 information for any of the stuff contained inside them and thus,
4031 we get the benefit here of what is (in effect) a pre-resolution
4032 of forward references to tagged types in local scopes.
4033
4034 Note however that for file-scope tagged types we cannot assume
4035 that such pre-resolution of forward references has taken place.
4036 A given file-scope tagged type may appear to be incomplete when
4037 we reach this point, but it may yet be given a full definition
4038 (at file-scope) later on during compilation. In order to avoid
4039 generating a premature (and possibly incorrect) set of Dwarf
4040 DIEs for such (as yet incomplete) file-scope tagged types, we
4041 generate nothing at all for as-yet incomplete file-scope tagged
4042 types here unless we are making our special "finalization" pass
4043 for file-scope things at the very end of compilation. At that
4044 time, we will certainly know as much about each file-scope tagged
4045 type as we are ever going to know, so at that point in time, we
4046 can safely generate correct Dwarf descriptions for these file-
4047 scope tagged types.
4048 */
4049
4050 if (TYPE_SIZE (type) == 0 && TYPE_CONTEXT (type) == NULL && !finalizing)
4051 return; /* EARLY EXIT! Avoid setting TREE_ASM_WRITTEN. */
4052
4053 /* Prevent infinite recursion in cases where the type of some
4054 member of this type is expressed in terms of this type itself. */
4055
4056 TREE_ASM_WRITTEN (type) = 1;
4057
4058 /* Output a DIE to represent the tagged type itself. */
4059
4060 switch (TREE_CODE (type))
4061 {
4062 case ENUMERAL_TYPE:
4063 output_die (output_enumeration_type_die, type);
4064 return; /* a special case -- nothing left to do so just return */
4065
4066 case RECORD_TYPE:
4067 output_die (output_structure_type_die, type);
4068 break;
4069
4070 case UNION_TYPE:
4071 case QUAL_UNION_TYPE:
4072 output_die (output_union_type_die, type);
4073 break;
4074
4075 default:
4076 abort (); /* Should never happen. */
4077 }
4078
4079 /* If this is not an incomplete type, output descriptions of
4080 each of its members.
4081
4082 Note that as we output the DIEs necessary to represent the
4083 members of this record or union type, we will also be trying
4084 to output DIEs to represent the *types* of those members.
4085 However the `output_type' function (above) will specifically
4086 avoid generating type DIEs for member types *within* the list
4087 of member DIEs for this (containing) type execpt for those
4088 types (of members) which are explicitly marked as also being
4089 members of this (containing) type themselves. The g++ front-
4090 end can force any given type to be treated as a member of some
4091 other (containing) type by setting the TYPE_CONTEXT of the
4092 given (member) type to point to the TREE node representing the
4093 appropriate (containing) type.
4094 */
4095
4096 if (TYPE_SIZE (type))
4097 {
4098 {
4099 register tree normal_member;
4100
4101 /* First output info about the data members and type members. */
4102
4103 for (normal_member = TYPE_FIELDS (type);
4104 normal_member;
4105 normal_member = TREE_CHAIN (normal_member))
4106 output_decl (normal_member, type);
4107 }
4108
4109 {
4110 register tree vec_base;
4111
4112 /* Now output info about the function members (if any). */
4113
4114 vec_base = TYPE_METHODS (type);
4115 if (vec_base)
4116 {
4117 register tree first_func_member = TREE_VEC_ELT (vec_base, 0);
4118 register tree func_member;
4119
4120 /* This isn't documented, but the first element of the
4121 vector of member functions can be NULL in cases where
4122 the class type in question didn't have either a
4123 constructor or a destructor declared for it. We have
4124 to make allowances for that here. */
4125
4126 if (first_func_member == NULL)
4127 first_func_member = TREE_VEC_ELT (vec_base, 1);
4128
4129 for (func_member = first_func_member;
4130 func_member;
4131 func_member = TREE_CHAIN (func_member))
4132 output_decl (func_member, type);
4133 }
4134 }
4135
4136 /* RECORD_TYPEs, UNION_TYPEs, and QUAL_UNION_TYPEs are themselves
4137 scopes (at least in C++) so we must now output any nested
4138 pending types which are local just to this type. */
4139
4140 output_pending_types_for_scope (type);
4141
4142 end_sibling_chain (); /* Terminate member chain. */
4143 }
4144
4145 break;
4146
4147 case VOID_TYPE:
4148 case INTEGER_TYPE:
4149 case REAL_TYPE:
4150 case COMPLEX_TYPE:
4151 case BOOLEAN_TYPE:
4152 case CHAR_TYPE:
4153 break; /* No DIEs needed for fundamental types. */
4154
4155 case LANG_TYPE: /* No Dwarf representation currently defined. */
4156 break;
4157
4158 default:
4159 abort ();
4160 }
4161
4162 TREE_ASM_WRITTEN (type) = 1;
4163}
4164
4165static void
4166output_tagged_type_instantiation (type)
4167 register tree type;
4168{
4169 if (type == 0 || type == error_mark_node)
4170 return;
4171
4172 /* We are going to output a DIE to represent the unqualified version of
4173 of this type (i.e. without any const or volatile qualifiers) so make
4174 sure that we have the main variant (i.e. the unqualified version) of
4175 this type now. */
4176
5bd49366 4177 assert (type == type_main_variant (type));
9bf86ebb
PR
4178
4179 assert (TREE_ASM_WRITTEN (type));
4180
4181 switch (TREE_CODE (type))
4182 {
4183 case ERROR_MARK:
4184 break;
4185
4186 case ENUMERAL_TYPE:
4187 output_die (output_inlined_enumeration_type_die, type);
4188 break;
4189
4190 case RECORD_TYPE:
4191 output_die (output_inlined_structure_type_die, type);
4192 break;
4193
4194 case UNION_TYPE:
4195 case QUAL_UNION_TYPE:
4196 output_die (output_inlined_union_type_die, type);
4197 break;
4198
4199 default:
4200 abort (); /* Should never happen. */
4201 }
4202}
4203\f
4204/* Output a TAG_lexical_block DIE followed by DIEs to represent all of
4205 the things which are local to the given block. */
4206
4207static void
4208output_block (stmt)
4209 register tree stmt;
4210{
4211 register int must_output_die = 0;
4212 register tree origin;
4213 register enum tree_code origin_code;
4214
4215 /* Ignore blocks never really used to make RTL. */
4216
4217 if (! stmt || ! TREE_USED (stmt))
4218 return;
4219
4220 /* Determine the "ultimate origin" of this block. This block may be an
4221 inlined instance of an inlined instance of inline function, so we
4222 have to trace all of the way back through the origin chain to find
4223 out what sort of node actually served as the original seed for the
4224 creation of the current block. */
4225
4226 origin = block_ultimate_origin (stmt);
4227 origin_code = (origin != NULL) ? TREE_CODE (origin) : ERROR_MARK;
4228
4229 /* Determine if we need to output any Dwarf DIEs at all to represent this
4230 block. */
4231
4232 if (origin_code == FUNCTION_DECL)
4233 /* The outer scopes for inlinings *must* always be represented. We
4234 generate TAG_inlined_subroutine DIEs for them. (See below.) */
4235 must_output_die = 1;
4236 else
4237 {
4238 /* In the case where the current block represents an inlining of the
4239 "body block" of an inline function, we must *NOT* output any DIE
4240 for this block because we have already output a DIE to represent
4241 the whole inlined function scope and the "body block" of any
4242 function doesn't really represent a different scope according to
4243 ANSI C rules. So we check here to make sure that this block does
4244 not represent a "body block inlining" before trying to set the
4245 `must_output_die' flag. */
4246
4247 if (origin == NULL || ! is_body_block (origin))
4248 {
4249 /* Determine if this block directly contains any "significant"
4250 local declarations which we will need to output DIEs for. */
4251
4252 if (debug_info_level > DINFO_LEVEL_TERSE)
4253 /* We are not in terse mode so *any* local declaration counts
4254 as being a "significant" one. */
4255 must_output_die = (BLOCK_VARS (stmt) != NULL);
4256 else
4257 {
4258 register tree decl;
4259
4260 /* We are in terse mode, so only local (nested) function
4261 definitions count as "significant" local declarations. */
4262
4263 for (decl = BLOCK_VARS (stmt); decl; decl = TREE_CHAIN (decl))
4264 if (TREE_CODE (decl) == FUNCTION_DECL && DECL_INITIAL (decl))
4265 {
4266 must_output_die = 1;
4267 break;
4268 }
4269 }
4270 }
4271 }
4272
4273 /* It would be a waste of space to generate a Dwarf TAG_lexical_block
4274 DIE for any block which contains no significant local declarations
4275 at all. Rather, in such cases we just call `output_decls_for_scope'
4276 so that any needed Dwarf info for any sub-blocks will get properly
4277 generated. Note that in terse mode, our definition of what constitutes
4278 a "significant" local declaration gets restricted to include only
4279 inlined function instances and local (nested) function definitions. */
4280
4281 if (must_output_die)
4282 {
4283 output_die ((origin_code == FUNCTION_DECL)
4284 ? output_inlined_subroutine_die
4285 : output_lexical_block_die,
4286 stmt);
4287 output_decls_for_scope (stmt);
4288 end_sibling_chain ();
4289 }
4290 else
4291 output_decls_for_scope (stmt);
4292}
4293
4294/* Output all of the decls declared within a given scope (also called
4295 a `binding contour') and (recursively) all of it's sub-blocks. */
4296
4297static void
4298output_decls_for_scope (stmt)
4299 register tree stmt;
4300{
4301 /* Ignore blocks never really used to make RTL. */
4302
4303 if (! stmt || ! TREE_USED (stmt))
4304 return;
4305
4306 if (! BLOCK_ABSTRACT (stmt))
4307 next_block_number++;
4308
4309 /* Output the DIEs to represent all of the data objects, functions,
4310 typedefs, and tagged types declared directly within this block
4311 but not within any nested sub-blocks. */
4312
4313 {
4314 register tree decl;
4315
4316 for (decl = BLOCK_VARS (stmt); decl; decl = TREE_CHAIN (decl))
4317 output_decl (decl, stmt);
4318 }
4319
4320 output_pending_types_for_scope (stmt);
4321
4322 /* Output the DIEs to represent all sub-blocks (and the items declared
4323 therein) of this block. */
4324
4325 {
4326 register tree subblocks;
4327
4328 for (subblocks = BLOCK_SUBBLOCKS (stmt);
4329 subblocks;
4330 subblocks = BLOCK_CHAIN (subblocks))
4331 output_block (subblocks);
4332 }
4333}
4334
4335/* Output Dwarf .debug information for a decl described by DECL. */
4336
4337static void
4338output_decl (decl, containing_scope)
4339 register tree decl;
4340 register tree containing_scope;
4341{
4342 /* Make a note of the decl node we are going to be working on. We may
4343 need to give the user the source coordinates of where it appeared in
4344 case we notice (later on) that something about it looks screwy. */
4345
4346 dwarf_last_decl = decl;
4347
4348 if (TREE_CODE (decl) == ERROR_MARK)
4349 return;
4350
4351 /* If this ..._DECL node is marked to be ignored, then ignore it.
4352 But don't ignore a function definition, since that would screw
4353 up our count of blocks, and that it turn will completely screw up the
4354 the labels we will reference in subsequent AT_low_pc and AT_high_pc
4355 attributes (for subsequent blocks). */
4356
4357 if (DECL_IGNORED_P (decl) && TREE_CODE (decl) != FUNCTION_DECL)
4358 return;
4359
4360 switch (TREE_CODE (decl))
4361 {
4362 case CONST_DECL:
4363 /* The individual enumerators of an enum type get output when we
4364 output the Dwarf representation of the relevant enum type itself. */
4365 break;
4366
4367 case FUNCTION_DECL:
4368 /* If we are in terse mode, don't output any DIEs to represent
4369 mere function declarations. Also, if we are conforming
4370 to the DWARF version 1 specification, don't output DIEs for
4371 mere function declarations. */
4372
4373 if (DECL_INITIAL (decl) == NULL_TREE)
4374#if (DWARF_VERSION > 1)
4375 if (debug_info_level <= DINFO_LEVEL_TERSE)
4376#endif
4377 break;
4378
4379 /* Before we describe the FUNCTION_DECL itself, make sure that we
4380 have described its return type. */
4381
4382 output_type (TREE_TYPE (TREE_TYPE (decl)), containing_scope);
4383
4384 /* If the following DIE will represent a function definition for a
4385 function with "extern" linkage, output a special "pubnames" DIE
4386 label just ahead of the actual DIE. A reference to this label
4387 was already generated in the .debug_pubnames section sub-entry
4388 for this function definition. */
4389
4390 if (TREE_PUBLIC (decl))
4391 {
4392 char label[MAX_ARTIFICIAL_LABEL_BYTES];
4393
4394 sprintf (label, PUB_DIE_LABEL_FMT, next_pubname_number++);
4395 ASM_OUTPUT_LABEL (asm_out_file, label);
4396 }
4397
4398 /* Now output a DIE to represent the function itself. */
4399
4400 output_die (TREE_PUBLIC (decl) || DECL_EXTERNAL (decl)
4401 ? output_global_subroutine_die
4402 : output_local_subroutine_die,
4403 decl);
4404
4405 /* Now output descriptions of the arguments for this function.
4406 This gets (unnecessarily?) complex because of the fact that
4407 the DECL_ARGUMENT list for a FUNCTION_DECL doesn't indicate
4408 cases where there was a trailing `...' at the end of the formal
4409 parameter list. In order to find out if there was a trailing
4410 ellipsis or not, we must instead look at the type associated
4411 with the FUNCTION_DECL. This will be a node of type FUNCTION_TYPE.
4412 If the chain of type nodes hanging off of this FUNCTION_TYPE node
4413 ends with a void_type_node then there should *not* be an ellipsis
4414 at the end. */
4415
4416 /* In the case where we are describing a mere function declaration, all
4417 we need to do here (and all we *can* do here) is to describe
4418 the *types* of its formal parameters. */
4419
4420 if (DECL_INITIAL (decl) == NULL_TREE)
4421 output_formal_types (TREE_TYPE (decl));
4422 else
4423 {
4424 register tree arg_decls = DECL_ARGUMENTS (decl);
4425
4426 {
4427 register tree last_arg;
4428
4429 last_arg = (arg_decls && TREE_CODE (arg_decls) != ERROR_MARK)
4430 ? tree_last (arg_decls)
4431 : NULL;
4432
4433 /* Generate DIEs to represent all known formal parameters, but
4434 don't do it if this looks like a varargs function. A given
4435 function is considered to be a varargs function if (and only
4436 if) its last named argument is named `__builtin_va_alist'. */
4437
4438 if (! last_arg
4439 || ! DECL_NAME (last_arg)
4440 || strcmp (IDENTIFIER_POINTER (DECL_NAME (last_arg)),
4441 "__builtin_va_alist"))
4442 {
4443 register tree parm;
4444
4445 /* WARNING! Kludge zone ahead! Here we have a special
4446 hack for svr4 SDB compatibility. Instead of passing the
4447 current FUNCTION_DECL node as the second parameter (i.e.
4448 the `containing_scope' parameter) to `output_decl' (as
4449 we ought to) we instead pass a pointer to our own private
4450 fake_containing_scope node. That node is a RECORD_TYPE
4451 node which NO OTHER TYPE may ever actually be a member of.
4452
4453 This pointer will ultimately get passed into `output_type'
4454 as its `containing_scope' parameter. `Output_type' will
4455 then perform its part in the hack... i.e. it will pend
4456 the type of the formal parameter onto the pending_types
4457 list. Later on, when we are done generating the whole
4458 sequence of formal parameter DIEs for this function
4459 definition, we will un-pend all previously pended types
4460 of formal parameters for this function definition.
4461
4462 This whole kludge prevents any type DIEs from being
4463 mixed in with the formal parameter DIEs. That's good
4464 because svr4 SDB believes that the list of formal
4465 parameter DIEs for a function ends wherever the first
4466 non-formal-parameter DIE appears. Thus, we have to
4467 keep the formal parameter DIEs segregated. They must
4468 all appear (consecutively) at the start of the list of
4469 children for the DIE representing the function definition.
4470 Then (and only then) may we output any additional DIEs
4471 needed to represent the types of these formal parameters.
4472 */
4473
4474 for (parm = arg_decls; parm; parm = TREE_CHAIN (parm))
4475 if (TREE_CODE (parm) == PARM_DECL)
4476 output_decl (parm, fake_containing_scope);
4477
4478 /* Now that we have finished generating all of the DIEs to
4479 represent the formal parameters themselves, force out
4480 any DIEs needed to represent their types. We do this
4481 simply by un-pending all previously pended types which
4482 can legitimately go into the chain of children DIEs for
4483 the current FUNCTION_DECL. */
4484
4485 output_pending_types_for_scope (decl);
4486 }
4487 }
4488
4489 /* Now try to decide if we should put an ellipsis at the end. */
4490
4491 {
4492 register int has_ellipsis = TRUE; /* default assumption */
4493 register tree fn_arg_types = TYPE_ARG_TYPES (TREE_TYPE (decl));
4494
4495 if (fn_arg_types)
4496 {
4497 /* This function declaration/definition was prototyped. */
4498
4499 /* If the list of formal argument types ends with a
4500 void_type_node, then the formals list did *not* end
4501 with an ellipsis. */
4502
4503 if (TREE_VALUE (tree_last (fn_arg_types)) == void_type_node)
4504 has_ellipsis = FALSE;
4505 }
4506 else
4507 {
4508 /* This function declaration/definition was not prototyped. */
4509
4510 /* Note that all non-prototyped function *declarations* are
4511 assumed to represent varargs functions (until proven
4512 otherwise). */
4513
4514 if (DECL_INITIAL (decl)) /* if this is a func definition */
4515 {
4516 if (!arg_decls)
4517 has_ellipsis = FALSE; /* no args == (void) */
4518 else
4519 {
4520 /* For a non-prototyped function definition which
4521 declares one or more formal parameters, if the name
4522 of the first formal parameter is *not*
4523 __builtin_va_alist then we must assume that this
4524 is *not* a varargs function. */
4525
4526 if (DECL_NAME (arg_decls)
4527 && strcmp (IDENTIFIER_POINTER (DECL_NAME (arg_decls)),
4528 "__builtin_va_alist"))
4529 has_ellipsis = FALSE;
4530 }
4531 }
4532 }
4533
4534 if (has_ellipsis)
4535 output_die (output_unspecified_parameters_die, decl);
4536 }
4537 }
4538
4539 /* Output Dwarf info for all of the stuff within the body of the
4540 function (if it has one - it may be just a declaration). */
4541
4542 {
4543 register tree outer_scope = DECL_INITIAL (decl);
4544
4545 if (outer_scope && TREE_CODE (outer_scope) != ERROR_MARK)
4546 {
4547 /* Note that here, `outer_scope' is a pointer to the outermost
4548 BLOCK node created to represent a function.
4549 This outermost BLOCK actually represents the outermost
4550 binding contour for the function, i.e. the contour in which
4551 the function's formal parameters and labels get declared.
4552
4553 Curiously, it appears that the front end doesn't actually
4554 put the PARM_DECL nodes for the current function onto the
4555 BLOCK_VARS list for this outer scope. (They are strung
4556 off of the DECL_ARGUMENTS list for the function instead.)
4557 The BLOCK_VARS list for the `outer_scope' does provide us
4558 with a list of the LABEL_DECL nodes for the function however,
4559 and we output DWARF info for those here.
4560
4561 Just within the `outer_scope' there will be another BLOCK
4562 node representing the function's outermost pair of curly
4563 braces. We musn't generate a lexical_block DIE for this
4564 outermost pair of curly braces because that is not really an
4565 independent scope according to ANSI C rules. Rather, it is
4566 the same scope in which the parameters were declared. */
4567
4568 {
4569 register tree label;
4570
4571 for (label = BLOCK_VARS (outer_scope);
4572 label;
4573 label = TREE_CHAIN (label))
4574 output_decl (label, outer_scope);
4575 }
4576
4577 /* Note here that `BLOCK_SUBBLOCKS (outer_scope)' points to a
4578 list of BLOCK nodes which is always only one element long.
4579 That one element represents the outermost pair of curley
4580 braces for the function body. */
4581
4582 output_decls_for_scope (BLOCK_SUBBLOCKS (outer_scope));
4583
4584 /* Finally, force out any pending types which are local to the
4585 outermost block of this function definition. These will
4586 all have a TYPE_CONTEXT which points to the FUNCTION_DECL
4587 node itself. */
4588
4589 output_pending_types_for_scope (decl);
4590 }
4591 }
4592
4593 /* Generate a terminator for the list of stuff `owned' by this
4594 function. */
4595
4596 end_sibling_chain ();
4597
4598 break;
4599
4600 case TYPE_DECL:
4601 /* If we are in terse mode, don't generate any DIEs to represent
4602 any actual typedefs. Note that even when we are in terse mode,
4603 we must still output DIEs to represent those tagged types which
4604 are used (directly or indirectly) in the specification of either
4605 a return type or a formal parameter type of some function. */
4606
4607 if (debug_info_level <= DINFO_LEVEL_TERSE)
4608 if (DECL_NAME (decl) != NULL
4609 || ! TYPE_USED_FOR_FUNCTION (TREE_TYPE (decl)))
4610 return;
4611
4612 /* In the special case of a null-named TYPE_DECL node (representing
4613 the declaration of some type tag), if the given TYPE_DECL is
4614 marked as having been instantiated from some other (original)
4615 TYPE_DECL node (e.g. one which was generated within the original
4616 definition of an inline function) we have to generate a special
4617 (abbreviated) TAG_structure_type, TAG_union_type, or
4618 TAG_enumeration-type DIE here. */
4619
4620 if (! DECL_NAME (decl) && DECL_ABSTRACT_ORIGIN (decl))
4621 {
4622 output_tagged_type_instantiation (TREE_TYPE (decl));
4623 return;
4624 }
4625
4626 output_type (TREE_TYPE (decl), containing_scope);
4627
4628 /* Note that unlike the gcc front end (which generates a NULL named
4629 TYPE_DECL node for each complete tagged type, each array type,
4630 and each function type node created) the g++ front end generates
4631 a *named* TYPE_DECL node for each tagged type node created.
4632 Unfortunately, these g++ TYPE_DECL nodes cause us to output many
4633 superfluous and unnecessary TAG_typedef DIEs here. When g++ is
4634 fixed to stop generating these superfluous named TYPE_DECL nodes,
4635 the superfluous TAG_typedef DIEs will likewise cease. */
4636
4637 if (DECL_NAME (decl))
4638 /* Output a DIE to represent the typedef itself. */
4639 output_die (output_typedef_die, decl);
4640 break;
4641
4642 case LABEL_DECL:
4643 if (debug_info_level >= DINFO_LEVEL_NORMAL)
4644 output_die (output_label_die, decl);
4645 break;
4646
4647 case VAR_DECL:
4648 /* If we are conforming to the DWARF version 1 specification, don't
4649 generated any DIEs to represent mere external object declarations. */
4650
4651#if (DWARF_VERSION <= 1)
4652 if (DECL_EXTERNAL (decl) && ! TREE_PUBLIC (decl))
4653 break;
4654#endif
4655
4656 /* If we are in terse mode, don't generate any DIEs to represent
4657 any variable declarations or definitions. */
4658
4659 if (debug_info_level <= DINFO_LEVEL_TERSE)
4660 break;
4661
4662 /* Output any DIEs that are needed to specify the type of this data
4663 object. */
4664
4665 output_type (TREE_TYPE (decl), containing_scope);
4666
4667 /* If the following DIE will represent a data object definition for a
4668 data object with "extern" linkage, output a special "pubnames" DIE
4669 label just ahead of the actual DIE. A reference to this label
4670 was already generated in the .debug_pubnames section sub-entry
4671 for this data object definition. */
4672
4673 if (TREE_PUBLIC (decl) && ! DECL_ABSTRACT (decl))
4674 {
4675 char label[MAX_ARTIFICIAL_LABEL_BYTES];
4676
4677 sprintf (label, PUB_DIE_LABEL_FMT, next_pubname_number++);
4678 ASM_OUTPUT_LABEL (asm_out_file, label);
4679 }
4680
4681 /* Now output the DIE to represent the data object itself. This gets
4682 complicated because of the possibility that the VAR_DECL really
4683 represents an inlined instance of a formal parameter for an inline
4684 function. */
4685
4686 {
4687 register void (*func) ();
4688 register tree origin = decl_ultimate_origin (decl);
4689
4690 if (origin != NULL && TREE_CODE (origin) == PARM_DECL)
4691 func = output_formal_parameter_die;
4692 else
4693 {
4694 if (TREE_PUBLIC (decl) || DECL_EXTERNAL (decl))
4695 func = output_global_variable_die;
4696 else
4697 func = output_local_variable_die;
4698 }
4699 output_die (func, decl);
4700 }
4701 break;
4702
4703 case FIELD_DECL:
4704 /* Ignore the nameless fields that are used to skip bits. */
4705 if (DECL_NAME (decl) != 0)
4706 {
4707 output_type (member_declared_type (decl), containing_scope);
4708 output_die (output_member_die, decl);
4709 }
4710 break;
4711
4712 case PARM_DECL:
4713 /* Force out the type of this formal, if it was not forced out yet.
4714 Note that here we can run afowl of a bug in "classic" svr4 SDB.
4715 It should be able to grok the presence of type DIEs within a list
4716 of TAG_formal_parameter DIEs, but it doesn't. */
4717
4718 output_type (TREE_TYPE (decl), containing_scope);
4719 output_die (output_formal_parameter_die, decl);
4720 break;
4721
4722 default:
4723 abort ();
4724 }
4725}
4726\f
4727void
4728dwarfout_file_scope_decl (decl, set_finalizing)
4729 register tree decl;
4730 register int set_finalizing;
4731{
4732 if (TREE_CODE (decl) == ERROR_MARK)
4733 return;
4734
4735 /* If this ..._DECL node is marked to be ignored, then ignore it. We
4736 gotta hope that the node in question doesn't represent a function
4737 definition. If it does, then totally ignoring it is bound to screw
4738 up our count of blocks, and that it turn will completely screw up the
4739 the labels we will reference in subsequent AT_low_pc and AT_high_pc
4740 attributes (for subsequent blocks). (It's too bad that BLOCK nodes
4741 don't carry their own sequence numbers with them!) */
4742
4743 if (DECL_IGNORED_P (decl))
4744 {
4745 if (TREE_CODE (decl) == FUNCTION_DECL && DECL_INITIAL (decl) != NULL)
4746 abort ();
4747 return;
4748 }
4749
4750 switch (TREE_CODE (decl))
4751 {
4752 case FUNCTION_DECL:
4753
4754 /* Ignore this FUNCTION_DECL if it refers to a builtin declaration of
4755 a builtin function. Explicit programmer-supplied declarations of
4756 these same functions should NOT be ignored however. */
4757
4758 if (DECL_EXTERNAL (decl) && DECL_FUNCTION_CODE (decl))
4759 return;
4760
4761 /* What we would really like to do here is to filter out all mere
4762 file-scope declarations of file-scope functions which are never
4763 referenced later within this translation unit (and keep all of
4764 ones that *are* referenced later on) but we aren't clarvoiant,
4765 so we have no idea which functions will be referenced in the
4766 future (i.e. later on within the current translation unit).
4767 So here we just ignore all file-scope function declarations
4768 which are not also definitions. If and when the debugger needs
4769 to know something about these funcstion, it wil have to hunt
4770 around and find the DWARF information associated with the
4771 *definition* of the function.
4772
4773 Note that we can't just check `DECL_EXTERNAL' to find out which
4774 FUNCTION_DECL nodes represent definitions and which ones represent
4775 mere declarations. We have to check `DECL_INITIAL' instead. That's
4776 because the C front-end supports some weird semantics for "extern
4777 inline" function definitions. These can get inlined within the
4778 current translation unit (an thus, we need to generate DWARF info
4779 for their abstract instances so that the DWARF info for the
4780 concrete inlined instances can have something to refer to) but
4781 the compiler never generates any out-of-lines instances of such
4782 things (despite the fact that they *are* definitions). The
4783 important point is that the C front-end marks these "extern inline"
4784 functions as DECL_EXTERNAL, but we need to generate DWARf for them
4785 anyway.
4786
4787 Note that the C++ front-end also plays some similar games for inline
4788 function definitions appearing within include files which also
4789 contain `#pragma interface' pragmas. */
4790
4791 if (DECL_INITIAL (decl) == NULL_TREE)
4792 return;
4793
4794 if (TREE_PUBLIC (decl)
4795 && ! DECL_EXTERNAL (decl)
4796 && ! DECL_ABSTRACT (decl))
4797 {
4798 char label[MAX_ARTIFICIAL_LABEL_BYTES];
4799
4800 /* Output a .debug_pubnames entry for a public function
4801 defined in this compilation unit. */
4802
4803 fputc ('\n', asm_out_file);
4804 ASM_OUTPUT_PUSH_SECTION (asm_out_file, PUBNAMES_SECTION);
4805 sprintf (label, PUB_DIE_LABEL_FMT, next_pubname_number);
4806 ASM_OUTPUT_DWARF_ADDR (asm_out_file, label);
4807 ASM_OUTPUT_DWARF_STRING (asm_out_file,
4808 IDENTIFIER_POINTER (DECL_NAME (decl)));
4809 ASM_OUTPUT_POP_SECTION (asm_out_file);
4810 }
4811
4812 break;
4813
4814 case VAR_DECL:
4815
4816 /* Ignore this VAR_DECL if it refers to a file-scope extern data
4817 object declaration and if the declaration was never even
4818 referenced from within this entire compilation unit. We
4819 suppress these DIEs in order to save space in the .debug section
4820 (by eliminating entries which are probably useless). Note that
4821 we must not suppress block-local extern declarations (whether
4822 used or not) because that would screw-up the debugger's name
4823 lookup mechanism and cause it to miss things which really ought
4824 to be in scope at a given point. */
4825
4826 if (DECL_EXTERNAL (decl) && !TREE_USED (decl))
4827 return;
4828
4829 if (TREE_PUBLIC (decl)
4830 && ! DECL_EXTERNAL (decl)
4831 && GET_CODE (DECL_RTL (decl)) == MEM
4832 && ! DECL_ABSTRACT (decl))
4833 {
4834 char label[MAX_ARTIFICIAL_LABEL_BYTES];
4835
4836 if (debug_info_level >= DINFO_LEVEL_NORMAL)
4837 {
4838 /* Output a .debug_pubnames entry for a public variable
4839 defined in this compilation unit. */
4840
4841 fputc ('\n', asm_out_file);
4842 ASM_OUTPUT_PUSH_SECTION (asm_out_file, PUBNAMES_SECTION);
4843 sprintf (label, PUB_DIE_LABEL_FMT, next_pubname_number);
4844 ASM_OUTPUT_DWARF_ADDR (asm_out_file, label);
4845 ASM_OUTPUT_DWARF_STRING (asm_out_file,
4846 IDENTIFIER_POINTER (DECL_NAME (decl)));
4847 ASM_OUTPUT_POP_SECTION (asm_out_file);
4848 }
4849
4850 if (DECL_INITIAL (decl) == NULL)
4851 {
4852 /* Output a .debug_aranges entry for a public variable
4853 which is tentatively defined in this compilation unit. */
4854
4855 fputc ('\n', asm_out_file);
4856 ASM_OUTPUT_PUSH_SECTION (asm_out_file, ARANGES_SECTION);
4857 ASM_OUTPUT_DWARF_ADDR (asm_out_file,
4858 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)));
4859 ASM_OUTPUT_DWARF_DATA4 (asm_out_file,
4860 (unsigned) int_size_in_bytes (TREE_TYPE (decl)));
4861 ASM_OUTPUT_POP_SECTION (asm_out_file);
4862 }
4863 }
4864
4865 /* If we are in terse mode, don't generate any DIEs to represent
4866 any variable declarations or definitions. */
4867
4868 if (debug_info_level <= DINFO_LEVEL_TERSE)
4869 return;
4870
4871 break;
4872
4873 case TYPE_DECL:
4874 /* Don't bother trying to generate any DIEs to represent any of the
4875 normal built-in types for the language we are compiling, except
4876 in cases where the types in question are *not* DWARF fundamental
4877 types. We make an exception in the case of non-fundamental types
4878 for the sake of objective C (and perhaps C++) because the GNU
4879 front-ends for these languages may in fact create certain "built-in"
4880 types which are (for example) RECORD_TYPEs. In such cases, we
4881 really need to output these (non-fundamental) types because other
4882 DIEs may contain references to them. */
4883
4884 if (DECL_SOURCE_LINE (decl) == 0
4885 && type_is_fundamental (TREE_TYPE (decl)))
4886 return;
4887
4888 /* If we are in terse mode, don't generate any DIEs to represent
4889 any actual typedefs. Note that even when we are in terse mode,
4890 we must still output DIEs to represent those tagged types which
4891 are used (directly or indirectly) in the specification of either
4892 a return type or a formal parameter type of some function. */
4893
4894 if (debug_info_level <= DINFO_LEVEL_TERSE)
4895 if (DECL_NAME (decl) != NULL
4896 || ! TYPE_USED_FOR_FUNCTION (TREE_TYPE (decl)))
4897 return;
4898
4899 break;
4900
4901 default:
4902 return;
4903 }
4904
4905 fputc ('\n', asm_out_file);
4906 ASM_OUTPUT_PUSH_SECTION (asm_out_file, DEBUG_SECTION);
4907 finalizing = set_finalizing;
4908 output_decl (decl, NULL_TREE);
4909
4910 /* NOTE: The call above to `output_decl' may have caused one or more
4911 file-scope named types (i.e. tagged types) to be placed onto the
4912 pending_types_list. We have to get those types off of that list
4913 at some point, and this is the perfect time to do it. If we didn't
4914 take them off now, they might still be on the list when cc1 finally
4915 exits. That might be OK if it weren't for the fact that when we put
4916 types onto the pending_types_list, we set the TREE_ASM_WRITTEN flag
4917 for these types, and that causes them never to be output unless
4918 `output_pending_types_for_scope' takes them off of the list and un-sets
4919 their TREE_ASM_WRITTEN flags. */
4920
4921 output_pending_types_for_scope (NULL_TREE);
4922
4923 /* The above call should have totally emptied the pending_types_list. */
4924
4925 assert (pending_types == 0);
4926
4927 ASM_OUTPUT_POP_SECTION (asm_out_file);
4928
4929 if (TREE_CODE (decl) == FUNCTION_DECL && DECL_INITIAL (decl) != NULL)
4930 current_funcdef_number++;
4931}
4932\f
4933/* Output a marker (i.e. a label) for the beginning of the generated code
4934 for a lexical block. */
4935
4936void
4937dwarfout_begin_block (blocknum)
4938 register unsigned blocknum;
4939{
4940 char label[MAX_ARTIFICIAL_LABEL_BYTES];
4941
4942 text_section ();
4943 sprintf (label, BLOCK_BEGIN_LABEL_FMT, blocknum);
4944 ASM_OUTPUT_LABEL (asm_out_file, label);
4945}
4946
4947/* Output a marker (i.e. a label) for the end of the generated code
4948 for a lexical block. */
4949
4950void
4951dwarfout_end_block (blocknum)
4952 register unsigned blocknum;
4953{
4954 char label[MAX_ARTIFICIAL_LABEL_BYTES];
4955
4956 text_section ();
4957 sprintf (label, BLOCK_END_LABEL_FMT, blocknum);
4958 ASM_OUTPUT_LABEL (asm_out_file, label);
4959}
4960
4961/* Output a marker (i.e. a label) at a point in the assembly code which
4962 corresponds to a given source level label. */
4963
4964void
4965dwarfout_label (insn)
4966 register rtx insn;
4967{
4968 if (debug_info_level >= DINFO_LEVEL_NORMAL)
4969 {
4970 char label[MAX_ARTIFICIAL_LABEL_BYTES];
4971
4972 text_section ();
4973 sprintf (label, INSN_LABEL_FMT, current_funcdef_number,
4974 (unsigned) INSN_UID (insn));
4975 ASM_OUTPUT_LABEL (asm_out_file, label);
4976 }
4977}
4978
4979/* Output a marker (i.e. a label) for the point in the generated code where
4980 the real body of the function begins (after parameters have been moved
4981 to their home locations). */
4982
4983void
4984dwarfout_begin_function ()
4985{
4986 char label[MAX_ARTIFICIAL_LABEL_BYTES];
4987
4988 text_section ();
4989 sprintf (label, BODY_BEGIN_LABEL_FMT, current_funcdef_number);
4990 ASM_OUTPUT_LABEL (asm_out_file, label);
4991}
4992
4993/* Output a marker (i.e. a label) for the point in the generated code where
4994 the real body of the function ends (just before the epilogue code). */
4995
4996void
4997dwarfout_end_function ()
4998{
4999 char label[MAX_ARTIFICIAL_LABEL_BYTES];
5000
5001 text_section ();
5002 sprintf (label, BODY_END_LABEL_FMT, current_funcdef_number);
5003 ASM_OUTPUT_LABEL (asm_out_file, label);
5004}
5005
5006/* Output a marker (i.e. a label) for the absolute end of the generated code
5007 for a function definition. This gets called *after* the epilogue code
5008 has been generated. */
5009
5010void
5011dwarfout_end_epilogue ()
5012{
5013 char label[MAX_ARTIFICIAL_LABEL_BYTES];
5014
5015 /* Output a label to mark the endpoint of the code generated for this
5016 function. */
5017
5018 sprintf (label, FUNC_END_LABEL_FMT, current_funcdef_number);
5019 ASM_OUTPUT_LABEL (asm_out_file, label);
5020}
5021
5022static void
5023shuffle_filename_entry (new_zeroth)
5024 register filename_entry *new_zeroth;
5025{
5026 filename_entry temp_entry;
5027 register filename_entry *limit_p;
5028 register filename_entry *move_p;
5029
5030 if (new_zeroth == &filename_table[0])
5031 return;
5032
5033 temp_entry = *new_zeroth;
5034
5035 /* Shift entries up in the table to make room at [0]. */
5036
5037 limit_p = &filename_table[0];
5038 for (move_p = new_zeroth; move_p > limit_p; move_p--)
5039 *move_p = *(move_p-1);
5040
5041 /* Install the found entry at [0]. */
5042
5043 filename_table[0] = temp_entry;
5044}
5045
5046/* Create a new (string) entry for the .debug_sfnames section. */
5047
5048static void
5049generate_new_sfname_entry ()
5050{
5051 char label[MAX_ARTIFICIAL_LABEL_BYTES];
5052
5053 fputc ('\n', asm_out_file);
5054 ASM_OUTPUT_PUSH_SECTION (asm_out_file, SFNAMES_SECTION);
5055 sprintf (label, SFNAMES_ENTRY_LABEL_FMT, filename_table[0].number);
5056 ASM_OUTPUT_LABEL (asm_out_file, label);
5057 ASM_OUTPUT_DWARF_STRING (asm_out_file,
5058 filename_table[0].name
5059 ? filename_table[0].name
5060 : "");
5061 ASM_OUTPUT_POP_SECTION (asm_out_file);
5062}
5063
5064/* Lookup a filename (in the list of filenames that we know about here in
5065 dwarfout.c) and return its "index". The index of each (known) filename
5066 is just a unique number which is associated with only that one filename.
5067 We need such numbers for the sake of generating labels (in the
5068 .debug_sfnames section) and references to those unique labels (in the
5069 .debug_srcinfo and .debug_macinfo sections).
5070
5071 If the filename given as an argument is not found in our current list,
5072 add it to the list and assign it the next available unique index number.
5073
5074 Whatever we do (i.e. whether we find a pre-existing filename or add a new
5075 one), we shuffle the filename found (or added) up to the zeroth entry of
5076 our list of filenames (which is always searched linearly). We do this so
5077 as to optimize the most common case for these filename lookups within
5078 dwarfout.c. The most common case by far is the case where we call
5079 lookup_filename to lookup the very same filename that we did a lookup
5080 on the last time we called lookup_filename. We make sure that this
5081 common case is fast because such cases will constitute 99.9% of the
5082 lookups we ever do (in practice).
5083
5084 If we add a new filename entry to our table, we go ahead and generate
5085 the corresponding entry in the .debug_sfnames section right away.
5086 Doing so allows us to avoid tickling an assembler bug (present in some
5087 m68k assemblers) which yields assembly-time errors in cases where the
5088 difference of two label addresses is taken and where the two labels
5089 are in a section *other* than the one where the difference is being
5090 calculated, and where at least one of the two symbol references is a
5091 forward reference. (This bug could be tickled by our .debug_srcinfo
5092 entries if we don't output their corresponding .debug_sfnames entries
5093 before them.)
5094*/
5095
5096static unsigned
5097lookup_filename (file_name)
5098 char *file_name;
5099{
5100 register filename_entry *search_p;
5101 register filename_entry *limit_p = &filename_table[ft_entries];
5102
5103 for (search_p = filename_table; search_p < limit_p; search_p++)
5104 if (!strcmp (file_name, search_p->name))
5105 {
5106 /* When we get here, we have found the filename that we were
5107 looking for in the filename_table. Now we want to make sure
5108 that it gets moved to the zero'th entry in the table (if it
5109 is not already there) so that subsequent attempts to find the
5110 same filename will find it as quickly as possible. */
5111
5112 shuffle_filename_entry (search_p);
5113 return filename_table[0].number;
5114 }
5115
5116 /* We come here whenever we have a new filename which is not registered
5117 in the current table. Here we add it to the table. */
5118
5119 /* Prepare to add a new table entry by making sure there is enough space
5120 in the table to do so. If not, expand the current table. */
5121
5122 if (ft_entries == ft_entries_allocated)
5123 {
5124 ft_entries_allocated += FT_ENTRIES_INCREMENT;
5125 filename_table
5126 = (filename_entry *)
5127 xrealloc (filename_table,
5128 ft_entries_allocated * sizeof (filename_entry));
5129 }
5130
5131 /* Initially, add the new entry at the end of the filename table. */
5132
5133 filename_table[ft_entries].number = ft_entries;
5134 filename_table[ft_entries].name = xstrdup (file_name);
5135
5136 /* Shuffle the new entry into filename_table[0]. */
5137
5138 shuffle_filename_entry (&filename_table[ft_entries]);
5139
5140 if (debug_info_level >= DINFO_LEVEL_NORMAL)
5141 generate_new_sfname_entry ();
5142
5143 ft_entries++;
5144 return filename_table[0].number;
5145}
5146
5147static void
5148generate_srcinfo_entry (line_entry_num, files_entry_num)
5149 unsigned line_entry_num;
5150 unsigned files_entry_num;
5151{
5152 char label[MAX_ARTIFICIAL_LABEL_BYTES];
5153
5154 fputc ('\n', asm_out_file);
5155 ASM_OUTPUT_PUSH_SECTION (asm_out_file, SRCINFO_SECTION);
5156 sprintf (label, LINE_ENTRY_LABEL_FMT, line_entry_num);
5157 ASM_OUTPUT_DWARF_DELTA4 (asm_out_file, label, LINE_BEGIN_LABEL);
5158 sprintf (label, SFNAMES_ENTRY_LABEL_FMT, files_entry_num);
5159 ASM_OUTPUT_DWARF_DELTA4 (asm_out_file, label, SFNAMES_BEGIN_LABEL);
5160 ASM_OUTPUT_POP_SECTION (asm_out_file);
5161}
5162
5163void
5164dwarfout_line (filename, line)
5165 register char *filename;
5166 register unsigned line;
5167{
5168 if (debug_info_level >= DINFO_LEVEL_NORMAL)
5169 {
5170 char label[MAX_ARTIFICIAL_LABEL_BYTES];
5171 static unsigned last_line_entry_num = 0;
5172 static unsigned prev_file_entry_num = (unsigned) -1;
5173 register unsigned this_file_entry_num = lookup_filename (filename);
5174
5175 text_section ();
5176 sprintf (label, LINE_CODE_LABEL_FMT, ++last_line_entry_num);
5177 ASM_OUTPUT_LABEL (asm_out_file, label);
5178
5179 fputc ('\n', asm_out_file);
5180 ASM_OUTPUT_PUSH_SECTION (asm_out_file, LINE_SECTION);
5181
5182 if (this_file_entry_num != prev_file_entry_num)
5183 {
5184 char line_entry_label[MAX_ARTIFICIAL_LABEL_BYTES];
5185
5186 sprintf (line_entry_label, LINE_ENTRY_LABEL_FMT, last_line_entry_num);
5187 ASM_OUTPUT_LABEL (asm_out_file, line_entry_label);
5188 }
5189
5190 {
5191 register char *tail = rindex (filename, '/');
5192
5193 if (tail != NULL)
5194 filename = tail;
5195 }
5196
5197 fprintf (asm_out_file, "\t%s\t%u\t%s %s:%u\n",
5198 UNALIGNED_INT_ASM_OP, line, ASM_COMMENT_START,
5199 filename, line);
5200 ASM_OUTPUT_DWARF_DATA2 (asm_out_file, 0xffff);
5201 ASM_OUTPUT_DWARF_DELTA4 (asm_out_file, label, TEXT_BEGIN_LABEL);
5202 ASM_OUTPUT_POP_SECTION (asm_out_file);
5203
5204 if (this_file_entry_num != prev_file_entry_num)
5205 generate_srcinfo_entry (last_line_entry_num, this_file_entry_num);
5206 prev_file_entry_num = this_file_entry_num;
5207 }
5208}
5209
5210/* Generate an entry in the .debug_macinfo section. */
5211
5212static void
5213generate_macinfo_entry (type_and_offset, string)
5214 register char *type_and_offset;
5215 register char *string;
5216{
5217 fputc ('\n', asm_out_file);
5218 ASM_OUTPUT_PUSH_SECTION (asm_out_file, MACINFO_SECTION);
5219 fprintf (asm_out_file, "\t%s\t%s\n", UNALIGNED_INT_ASM_OP, type_and_offset);
5220 ASM_OUTPUT_DWARF_STRING (asm_out_file, string);
5221 ASM_OUTPUT_POP_SECTION (asm_out_file);
5222}
5223
5224void
5225dwarfout_start_new_source_file (filename)
5226 register char *filename;
5227{
5228 char label[MAX_ARTIFICIAL_LABEL_BYTES];
5229 char type_and_offset[MAX_ARTIFICIAL_LABEL_BYTES*3];
5230
5231 sprintf (label, SFNAMES_ENTRY_LABEL_FMT, lookup_filename (filename));
5232 sprintf (type_and_offset, "0x%08x+%s-%s",
5233 ((unsigned) MACINFO_start << 24), label, SFNAMES_BEGIN_LABEL);
5234 generate_macinfo_entry (type_and_offset, "");
5235}
5236
5237void
5238dwarfout_resume_previous_source_file (lineno)
5239 register unsigned lineno;
5240{
5241 char type_and_offset[MAX_ARTIFICIAL_LABEL_BYTES*2];
5242
5243 sprintf (type_and_offset, "0x%08x+%u",
5244 ((unsigned) MACINFO_resume << 24), lineno);
5245 generate_macinfo_entry (type_and_offset, "");
5246}
5247
5248/* Called from check_newline in c-parse.y. The `buffer' parameter
5249 contains the tail part of the directive line, i.e. the part which
5250 is past the initial whitespace, #, whitespace, directive-name,
5251 whitespace part. */
5252
5253void
5254dwarfout_define (lineno, buffer)
5255 register unsigned lineno;
5256 register char *buffer;
5257{
5258 static int initialized = 0;
5259 char type_and_offset[MAX_ARTIFICIAL_LABEL_BYTES*2];
5260
5261 if (!initialized)
5262 {
5263 dwarfout_start_new_source_file (primary_filename);
5264 initialized = 1;
5265 }
5266 sprintf (type_and_offset, "0x%08x+%u",
5267 ((unsigned) MACINFO_define << 24), lineno);
5268 generate_macinfo_entry (type_and_offset, buffer);
5269}
5270
5271/* Called from check_newline in c-parse.y. The `buffer' parameter
5272 contains the tail part of the directive line, i.e. the part which
5273 is past the initial whitespace, #, whitespace, directive-name,
5274 whitespace part. */
5275
5276void
5277dwarfout_undef (lineno, buffer)
5278 register unsigned lineno;
5279 register char *buffer;
5280{
5281 char type_and_offset[MAX_ARTIFICIAL_LABEL_BYTES*2];
5282
5283 sprintf (type_and_offset, "0x%08x+%u",
5284 ((unsigned) MACINFO_undef << 24), lineno);
5285 generate_macinfo_entry (type_and_offset, buffer);
5286}
5287
5288/* Set up for Dwarf output at the start of compilation. */
5289
5290void
5291dwarfout_init (asm_out_file, main_input_filename)
5292 register FILE *asm_out_file;
5293 register char *main_input_filename;
5294{
5295 /* Remember the name of the primary input file. */
5296
5297 primary_filename = main_input_filename;
5298
5299 /* Allocate the initial hunk of the pending_sibling_stack. */
5300
5301 pending_sibling_stack
5302 = (unsigned *)
5303 xmalloc (PENDING_SIBLINGS_INCREMENT * sizeof (unsigned));
5304 pending_siblings_allocated = PENDING_SIBLINGS_INCREMENT;
5305 pending_siblings = 1;
5306
5307 /* Allocate the initial hunk of the filename_table. */
5308
5309 filename_table
5310 = (filename_entry *)
5311 xmalloc (FT_ENTRIES_INCREMENT * sizeof (filename_entry));
5312 ft_entries_allocated = FT_ENTRIES_INCREMENT;
5313 ft_entries = 0;
5314
5315 /* Allocate the initial hunk of the pending_types_list. */
5316
5317 pending_types_list
5318 = (tree *) xmalloc (PENDING_TYPES_INCREMENT * sizeof (tree));
5319 pending_types_allocated = PENDING_TYPES_INCREMENT;
5320 pending_types = 0;
5321
5322 /* Create an artificial RECORD_TYPE node which we can use in our hack
5323 to get the DIEs representing types of formal parameters to come out
5324 only *after* the DIEs for the formal parameters themselves. */
5325
5326 fake_containing_scope = make_node (RECORD_TYPE);
5327
5328 /* Output a starting label for the .text section. */
5329
5330 fputc ('\n', asm_out_file);
5331 ASM_OUTPUT_PUSH_SECTION (asm_out_file, TEXT_SECTION);
5332 ASM_OUTPUT_LABEL (asm_out_file, TEXT_BEGIN_LABEL);
5333 ASM_OUTPUT_POP_SECTION (asm_out_file);
5334
5335 /* Output a starting label for the .data section. */
5336
5337 fputc ('\n', asm_out_file);
5338 ASM_OUTPUT_PUSH_SECTION (asm_out_file, DATA_SECTION);
5339 ASM_OUTPUT_LABEL (asm_out_file, DATA_BEGIN_LABEL);
5340 ASM_OUTPUT_POP_SECTION (asm_out_file);
5341
5342#if 0 /* GNU C doesn't currently use .data1. */
5343 /* Output a starting label for the .data1 section. */
5344
5345 fputc ('\n', asm_out_file);
5346 ASM_OUTPUT_PUSH_SECTION (asm_out_file, DATA1_SECTION);
5347 ASM_OUTPUT_LABEL (asm_out_file, DATA1_BEGIN_LABEL);
5348 ASM_OUTPUT_POP_SECTION (asm_out_file);
5349#endif
5350
5351 /* Output a starting label for the .rodata section. */
5352
5353 fputc ('\n', asm_out_file);
5354 ASM_OUTPUT_PUSH_SECTION (asm_out_file, RODATA_SECTION);
5355 ASM_OUTPUT_LABEL (asm_out_file, RODATA_BEGIN_LABEL);
5356 ASM_OUTPUT_POP_SECTION (asm_out_file);
5357
5358#if 0 /* GNU C doesn't currently use .rodata1. */
5359 /* Output a starting label for the .rodata1 section. */
5360
5361 fputc ('\n', asm_out_file);
5362 ASM_OUTPUT_PUSH_SECTION (asm_out_file, RODATA1_SECTION);
5363 ASM_OUTPUT_LABEL (asm_out_file, RODATA1_BEGIN_LABEL);
5364 ASM_OUTPUT_POP_SECTION (asm_out_file);
5365#endif
5366
5367 /* Output a starting label for the .bss section. */
5368
5369 fputc ('\n', asm_out_file);
5370 ASM_OUTPUT_PUSH_SECTION (asm_out_file, BSS_SECTION);
5371 ASM_OUTPUT_LABEL (asm_out_file, BSS_BEGIN_LABEL);
5372 ASM_OUTPUT_POP_SECTION (asm_out_file);
5373
5374 if (debug_info_level >= DINFO_LEVEL_NORMAL)
5375 {
5376 /* Output a starting label and an initial (compilation directory)
5377 entry for the .debug_sfnames section. The starting label will be
5378 referenced by the initial entry in the .debug_srcinfo section. */
5379
5380 fputc ('\n', asm_out_file);
5381 ASM_OUTPUT_PUSH_SECTION (asm_out_file, SFNAMES_SECTION);
5382 ASM_OUTPUT_LABEL (asm_out_file, SFNAMES_BEGIN_LABEL);
5383 {
5384 register char *pwd = getpwd ();
5385 register unsigned len = strlen (pwd);
5386 register char *dirname = (char *) xmalloc (len + 2);
5387
5388 strcpy (dirname, pwd);
5389 strcpy (dirname + len, "/");
5390 ASM_OUTPUT_DWARF_STRING (asm_out_file, dirname);
5391 free (dirname);
5392 }
5393 ASM_OUTPUT_POP_SECTION (asm_out_file);
5394
5395 if (debug_info_level >= DINFO_LEVEL_VERBOSE)
5396 {
5397 /* Output a starting label for the .debug_macinfo section. This
5398 label will be referenced by the AT_mac_info attribute in the
5399 TAG_compile_unit DIE. */
5400
5401 fputc ('\n', asm_out_file);
5402 ASM_OUTPUT_PUSH_SECTION (asm_out_file, MACINFO_SECTION);
5403 ASM_OUTPUT_LABEL (asm_out_file, MACINFO_BEGIN_LABEL);
5404 ASM_OUTPUT_POP_SECTION (asm_out_file);
5405 }
5406
5407 /* Generate the initial entry for the .line section. */
5408
5409 fputc ('\n', asm_out_file);
5410 ASM_OUTPUT_PUSH_SECTION (asm_out_file, LINE_SECTION);
5411 ASM_OUTPUT_LABEL (asm_out_file, LINE_BEGIN_LABEL);
5412 ASM_OUTPUT_DWARF_DELTA4 (asm_out_file, LINE_END_LABEL, LINE_BEGIN_LABEL);
5413 ASM_OUTPUT_DWARF_ADDR (asm_out_file, TEXT_BEGIN_LABEL);
5414 ASM_OUTPUT_POP_SECTION (asm_out_file);
5415
5416 /* Generate the initial entry for the .debug_srcinfo section. */
5417
5418 fputc ('\n', asm_out_file);
5419 ASM_OUTPUT_PUSH_SECTION (asm_out_file, SRCINFO_SECTION);
5420 ASM_OUTPUT_LABEL (asm_out_file, SRCINFO_BEGIN_LABEL);
5421 ASM_OUTPUT_DWARF_ADDR (asm_out_file, LINE_BEGIN_LABEL);
5422 ASM_OUTPUT_DWARF_ADDR (asm_out_file, SFNAMES_BEGIN_LABEL);
5423 ASM_OUTPUT_DWARF_ADDR (asm_out_file, TEXT_BEGIN_LABEL);
5424 ASM_OUTPUT_DWARF_ADDR (asm_out_file, TEXT_END_LABEL);
5425#ifdef DWARF_TIMESTAMPS
5426 ASM_OUTPUT_DWARF_DATA4 (asm_out_file, time (NULL));
5427#else
5428 ASM_OUTPUT_DWARF_DATA4 (asm_out_file, -1);
5429#endif
5430 ASM_OUTPUT_POP_SECTION (asm_out_file);
5431
5432 /* Generate the initial entry for the .debug_pubnames section. */
5433
5434 fputc ('\n', asm_out_file);
5435 ASM_OUTPUT_PUSH_SECTION (asm_out_file, PUBNAMES_SECTION);
5436 ASM_OUTPUT_DWARF_ADDR (asm_out_file, DEBUG_BEGIN_LABEL);
5437 ASM_OUTPUT_POP_SECTION (asm_out_file);
5438
5439 /* Generate the initial entry for the .debug_aranges section. */
5440
5441 fputc ('\n', asm_out_file);
5442 ASM_OUTPUT_PUSH_SECTION (asm_out_file, ARANGES_SECTION);
5443 ASM_OUTPUT_DWARF_ADDR (asm_out_file, DEBUG_BEGIN_LABEL);
5444 ASM_OUTPUT_POP_SECTION (asm_out_file);
5445 }
5446
5447 /* Setup first DIE number == 1. */
5448 NEXT_DIE_NUM = next_unused_dienum++;
5449
5450 /* Generate the initial DIE for the .debug section. Note that the
5451 (string) value given in the AT_name attribute of the TAG_compile_unit
5452 DIE will (typically) be a relative pathname and that this pathname
5453 should be taken as being relative to the directory from which the
5454 compiler was invoked when the given (base) source file was compiled. */
5455
5456 fputc ('\n', asm_out_file);
5457 ASM_OUTPUT_PUSH_SECTION (asm_out_file, DEBUG_SECTION);
5458 ASM_OUTPUT_LABEL (asm_out_file, DEBUG_BEGIN_LABEL);
5459 output_die (output_compile_unit_die, main_input_filename);
5460 ASM_OUTPUT_POP_SECTION (asm_out_file);
5461
5462 fputc ('\n', asm_out_file);
5463}
5464
5465/* Output stuff that dwarf requires at the end of every file. */
5466
5467void
5468dwarfout_finish ()
5469{
5470 char label[MAX_ARTIFICIAL_LABEL_BYTES];
5471
5472 fputc ('\n', asm_out_file);
5473 ASM_OUTPUT_PUSH_SECTION (asm_out_file, DEBUG_SECTION);
5474
5475 /* Mark the end of the chain of siblings which represent all file-scope
5476 declarations in this compilation unit. */
5477
5478 /* The (null) DIE which represents the terminator for the (sibling linked)
5479 list of file-scope items is *special*. Normally, we would just call
5480 end_sibling_chain at this point in order to output a word with the
5481 value `4' and that word would act as the terminator for the list of
5482 DIEs describing file-scope items. Unfortunately, if we were to simply
5483 do that, the label that would follow this DIE in the .debug section
5484 (i.e. `..D2') would *not* be properly aligned (as it must be on some
5485 machines) to a 4 byte boundary.
5486
5487 In order to force the label `..D2' to get aligned to a 4 byte boundary,
5488 the trick used is to insert extra (otherwise useless) padding bytes
5489 into the (null) DIE that we know must precede the ..D2 label in the
5490 .debug section. The amount of padding required can be anywhere between
5491 0 and 3 bytes. The length word at the start of this DIE (i.e. the one
5492 with the padding) would normally contain the value 4, but now it will
5493 also have to include the padding bytes, so it will instead have some
5494 value in the range 4..7.
5495
5496 Fortunately, the rules of Dwarf say that any DIE whose length word
5497 contains *any* value less than 8 should be treated as a null DIE, so
5498 this trick works out nicely. Clever, eh? Don't give me any credit
5499 (or blame). I didn't think of this scheme. I just conformed to it.
5500 */
5501
5502 output_die (output_padded_null_die, (void *)0);
5503 dienum_pop ();
5504
5505 sprintf (label, DIE_BEGIN_LABEL_FMT, NEXT_DIE_NUM);
5506 ASM_OUTPUT_LABEL (asm_out_file, label); /* should be ..D2 */
5507 ASM_OUTPUT_POP_SECTION (asm_out_file);
5508
5509 /* Output a terminator label for the .text section. */
5510
5511 fputc ('\n', asm_out_file);
5512 ASM_OUTPUT_PUSH_SECTION (asm_out_file, TEXT_SECTION);
5513 ASM_OUTPUT_LABEL (asm_out_file, TEXT_END_LABEL);
5514 ASM_OUTPUT_POP_SECTION (asm_out_file);
5515
5516 /* Output a terminator label for the .data section. */
5517
5518 fputc ('\n', asm_out_file);
5519 ASM_OUTPUT_PUSH_SECTION (asm_out_file, DATA_SECTION);
5520 ASM_OUTPUT_LABEL (asm_out_file, DATA_END_LABEL);
5521 ASM_OUTPUT_POP_SECTION (asm_out_file);
5522
5523#if 0 /* GNU C doesn't currently use .data1. */
5524 /* Output a terminator label for the .data1 section. */
5525
5526 fputc ('\n', asm_out_file);
5527 ASM_OUTPUT_PUSH_SECTION (asm_out_file, DATA1_SECTION);
5528 ASM_OUTPUT_LABEL (asm_out_file, DATA1_END_LABEL);
5529 ASM_OUTPUT_POP_SECTION (asm_out_file);
5530#endif
5531
5532 /* Output a terminator label for the .rodata section. */
5533
5534 fputc ('\n', asm_out_file);
5535 ASM_OUTPUT_PUSH_SECTION (asm_out_file, RODATA_SECTION);
5536 ASM_OUTPUT_LABEL (asm_out_file, RODATA_END_LABEL);
5537 ASM_OUTPUT_POP_SECTION (asm_out_file);
5538
5539#if 0 /* GNU C doesn't currently use .rodata1. */
5540 /* Output a terminator label for the .rodata1 section. */
5541
5542 fputc ('\n', asm_out_file);
5543 ASM_OUTPUT_PUSH_SECTION (asm_out_file, RODATA1_SECTION);
5544 ASM_OUTPUT_LABEL (asm_out_file, RODATA1_END_LABEL);
5545 ASM_OUTPUT_POP_SECTION (asm_out_file);
5546#endif
5547
5548 /* Output a terminator label for the .bss section. */
5549
5550 fputc ('\n', asm_out_file);
5551 ASM_OUTPUT_PUSH_SECTION (asm_out_file, BSS_SECTION);
5552 ASM_OUTPUT_LABEL (asm_out_file, BSS_END_LABEL);
5553 ASM_OUTPUT_POP_SECTION (asm_out_file);
5554
5555 if (debug_info_level >= DINFO_LEVEL_NORMAL)
5556 {
5557 /* Output a terminating entry for the .line section. */
5558
5559 fputc ('\n', asm_out_file);
5560 ASM_OUTPUT_PUSH_SECTION (asm_out_file, LINE_SECTION);
5561 ASM_OUTPUT_LABEL (asm_out_file, LINE_LAST_ENTRY_LABEL);
5562 ASM_OUTPUT_DWARF_DATA4 (asm_out_file, 0);
5563 ASM_OUTPUT_DWARF_DATA2 (asm_out_file, 0xffff);
5564 ASM_OUTPUT_DWARF_DELTA4 (asm_out_file, TEXT_END_LABEL, TEXT_BEGIN_LABEL);
5565 ASM_OUTPUT_LABEL (asm_out_file, LINE_END_LABEL);
5566 ASM_OUTPUT_POP_SECTION (asm_out_file);
5567
5568 /* Output a terminating entry for the .debug_srcinfo section. */
5569
5570 fputc ('\n', asm_out_file);
5571 ASM_OUTPUT_PUSH_SECTION (asm_out_file, SRCINFO_SECTION);
5572 ASM_OUTPUT_DWARF_DELTA4 (asm_out_file,
5573 LINE_LAST_ENTRY_LABEL, LINE_BEGIN_LABEL);
5574 ASM_OUTPUT_DWARF_DATA4 (asm_out_file, -1);
5575 ASM_OUTPUT_POP_SECTION (asm_out_file);
5576
5577 if (debug_info_level >= DINFO_LEVEL_VERBOSE)
5578 {
5579 /* Output terminating entries for the .debug_macinfo section. */
5580
5581 dwarfout_resume_previous_source_file (0);
5582
5583 fputc ('\n', asm_out_file);
5584 ASM_OUTPUT_PUSH_SECTION (asm_out_file, MACINFO_SECTION);
5585 ASM_OUTPUT_DWARF_DATA4 (asm_out_file, 0);
5586 ASM_OUTPUT_DWARF_STRING (asm_out_file, "");
5587 ASM_OUTPUT_POP_SECTION (asm_out_file);
5588 }
5589
5590 /* Generate the terminating entry for the .debug_pubnames section. */
5591
5592 fputc ('\n', asm_out_file);
5593 ASM_OUTPUT_PUSH_SECTION (asm_out_file, PUBNAMES_SECTION);
5594 ASM_OUTPUT_DWARF_DATA4 (asm_out_file, 0);
5595 ASM_OUTPUT_DWARF_STRING (asm_out_file, "");
5596 ASM_OUTPUT_POP_SECTION (asm_out_file);
5597
5598 /* Generate the terminating entries for the .debug_aranges section.
5599
5600 Note that we want to do this only *after* we have output the end
5601 labels (for the various program sections) which we are going to
5602 refer to here. This allows us to work around a bug in the m68k
5603 svr4 assembler. That assembler gives bogus assembly-time errors
5604 if (within any given section) you try to take the difference of
5605 two relocatable symbols, both of which are located within some
5606 other section, and if one (or both?) of the symbols involved is
5607 being forward-referenced. By generating the .debug_aranges
5608 entries at this late point in the assembly output, we skirt the
5609 issue simply by avoiding forward-references.
5610 */
5611
5612 fputc ('\n', asm_out_file);
5613 ASM_OUTPUT_PUSH_SECTION (asm_out_file, ARANGES_SECTION);
5614
5615 ASM_OUTPUT_DWARF_ADDR (asm_out_file, TEXT_BEGIN_LABEL);
5616 ASM_OUTPUT_DWARF_DELTA4 (asm_out_file, TEXT_END_LABEL, TEXT_BEGIN_LABEL);
5617
5618 ASM_OUTPUT_DWARF_ADDR (asm_out_file, DATA_BEGIN_LABEL);
5619 ASM_OUTPUT_DWARF_DELTA4 (asm_out_file, DATA_END_LABEL, DATA_BEGIN_LABEL);
5620
5621#if 0 /* GNU C doesn't currently use .data1. */
5622 ASM_OUTPUT_DWARF_ADDR (asm_out_file, DATA1_BEGIN_LABEL);
5623 ASM_OUTPUT_DWARF_DELTA4 (asm_out_file, DATA1_END_LABEL,
5624 DATA1_BEGIN_LABEL);
5625#endif
5626
5627 ASM_OUTPUT_DWARF_ADDR (asm_out_file, RODATA_BEGIN_LABEL);
5628 ASM_OUTPUT_DWARF_DELTA4 (asm_out_file, RODATA_END_LABEL,
5629 RODATA_BEGIN_LABEL);
5630
5631#if 0 /* GNU C doesn't currently use .rodata1. */
5632 ASM_OUTPUT_DWARF_ADDR (asm_out_file, RODATA1_BEGIN_LABEL);
5633 ASM_OUTPUT_DWARF_DELTA4 (asm_out_file, RODATA1_END_LABEL,
5634 RODATA1_BEGIN_LABEL);
5635#endif
5636
5637 ASM_OUTPUT_DWARF_ADDR (asm_out_file, BSS_BEGIN_LABEL);
5638 ASM_OUTPUT_DWARF_DELTA4 (asm_out_file, BSS_END_LABEL, BSS_BEGIN_LABEL);
5639
5640 ASM_OUTPUT_DWARF_DATA4 (asm_out_file, 0);
5641 ASM_OUTPUT_DWARF_DATA4 (asm_out_file, 0);
5642
5643 ASM_OUTPUT_POP_SECTION (asm_out_file);
5644 }
5645}
5646
5647#endif /* DWARF_DEBUGGING_INFO */