Annotation of gcc/dwarfout.c, revision 1.1.1.1

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 */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.