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