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