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