1/* Output Dwarf2 format symbol table information from the GNU C compiler.
|
2 Copyright (C) 1992, 93, 95, 96, 97, 1998 Free Software Foundation, Inc.
|
2 Copyright (C) 1992, 93, 95-98, 1999 Free Software Foundation, Inc. |
3 Contributed by Gary Funck (gary@intrepid.com). 4 Derived from DWARF 1 implementation of Ron Guilmette (rfg@monkeys.com). 5 Extensively modified by Jason Merrill (jason@cygnus.com). 6 7This file is part of GNU CC. 8 9GNU CC is free software; you can redistribute it and/or modify 10it under the terms of the GNU General Public License as published by 11the Free Software Foundation; either version 2, or (at your option) 12any later version. 13 14GNU CC is distributed in the hope that it will be useful, 15but WITHOUT ANY WARRANTY; without even the implied warranty of 16MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17GNU General Public License for more details. 18 19You should have received a copy of the GNU General Public License 20along with GNU CC; see the file COPYING. If not, write to
|
21the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
|
21the Free Software Foundation, 59 Temple Place - Suite 330, 22Boston, MA 02111-1307, USA. */ |
23 24/* The first part of this file deals with the DWARF 2 frame unwind 25 information, which is also used by the GCC efficient exception handling 26 mechanism. The second part, controlled only by an #ifdef 27 DWARF2_DEBUGGING_INFO, deals with the other DWARF 2 debugging 28 information. */ 29 30#include "config.h" 31#include "system.h" 32#include "defaults.h" 33#include "tree.h" 34#include "flags.h" 35#include "rtl.h" 36#include "hard-reg-set.h" 37#include "regs.h" 38#include "insn-config.h" 39#include "reload.h" 40#include "output.h" 41#include "expr.h" 42#include "except.h" 43#include "dwarf2.h" 44#include "dwarf2out.h" 45#include "toplev.h" 46#include "dyn-string.h" 47 48/* We cannot use <assert.h> in GCC source, since that would include 49 GCC's assert.h, which may not be compatible with the host compiler. */ 50#undef assert 51#ifdef NDEBUG 52# define assert(e) 53#else 54# define assert(e) do { if (! (e)) abort (); } while (0) 55#endif 56 57/* Decide whether we want to emit frame unwind information for the current 58 translation unit. */ 59 60int 61dwarf2out_do_frame () 62{ 63 return (write_symbols == DWARF2_DEBUG 64#ifdef DWARF2_FRAME_INFO 65 || DWARF2_FRAME_INFO 66#endif 67#ifdef DWARF2_UNWIND_INFO 68 || (flag_exceptions && ! exceptions_via_longjmp) 69#endif 70 ); 71} 72 73#if defined (DWARF2_DEBUGGING_INFO) || defined (DWARF2_UNWIND_INFO) 74
|
74#ifndef __GNUC__
75#define inline
76#endif
77
|
75/* How to start an assembler comment. */ 76#ifndef ASM_COMMENT_START 77#define ASM_COMMENT_START ";#" 78#endif 79 80typedef struct dw_cfi_struct *dw_cfi_ref; 81typedef struct dw_fde_struct *dw_fde_ref; 82typedef union dw_cfi_oprnd_struct *dw_cfi_oprnd_ref; 83 84/* Call frames are described using a sequence of Call Frame 85 Information instructions. The register number, offset 86 and address fields are provided as possible operands; 87 their use is selected by the opcode field. */ 88 89typedef union dw_cfi_oprnd_struct 90{ 91 unsigned long dw_cfi_reg_num; 92 long int dw_cfi_offset; 93 char *dw_cfi_addr; 94} 95dw_cfi_oprnd; 96 97typedef struct dw_cfi_struct 98{ 99 dw_cfi_ref dw_cfi_next; 100 enum dwarf_call_frame_info dw_cfi_opc; 101 dw_cfi_oprnd dw_cfi_oprnd1; 102 dw_cfi_oprnd dw_cfi_oprnd2; 103} 104dw_cfi_node; 105 106/* All call frame descriptions (FDE's) in the GCC generated DWARF 107 refer to a single Common Information Entry (CIE), defined at 108 the beginning of the .debug_frame section. This used of a single 109 CIE obviates the need to keep track of multiple CIE's 110 in the DWARF generation routines below. */ 111 112typedef struct dw_fde_struct 113{ 114 char *dw_fde_begin; 115 char *dw_fde_current_label; 116 char *dw_fde_end; 117 dw_cfi_ref dw_fde_cfi; 118} 119dw_fde_node; 120 121/* Maximum size (in bytes) of an artificially generated label. */ 122#define MAX_ARTIFICIAL_LABEL_BYTES 30 123 124/* Make sure we know the sizes of the various types dwarf can describe. These 125 are only defaults. If the sizes are different for your target, you should 126 override these values by defining the appropriate symbols in your tm.h 127 file. */ 128 129#ifndef CHAR_TYPE_SIZE 130#define CHAR_TYPE_SIZE BITS_PER_UNIT 131#endif 132#ifndef PTR_SIZE 133#define PTR_SIZE (POINTER_SIZE / BITS_PER_UNIT) 134#endif 135 136/* The size in bytes of a DWARF field indicating an offset or length 137 relative to a debug info section, specified to be 4 bytes in the DWARF-2 138 specification. The SGI/MIPS ABI defines it to be the same as PTR_SIZE. */ 139 140#ifndef DWARF_OFFSET_SIZE 141#define DWARF_OFFSET_SIZE 4 142#endif 143 144#define DWARF_VERSION 2 145 146/* Round SIZE up to the nearest BOUNDARY. */ 147#define DWARF_ROUND(SIZE,BOUNDARY) \ 148 (((SIZE) + (BOUNDARY) - 1) & ~((BOUNDARY) - 1)) 149 150/* Offsets recorded in opcodes are a multiple of this alignment factor. */ 151#ifdef STACK_GROWS_DOWNWARD 152#define DWARF_CIE_DATA_ALIGNMENT (-UNITS_PER_WORD) 153#else 154#define DWARF_CIE_DATA_ALIGNMENT UNITS_PER_WORD 155#endif 156 157/* A pointer to the base of a table that contains frame description 158 information for each routine. */ 159static dw_fde_ref fde_table; 160 161/* Number of elements currently allocated for fde_table. */ 162static unsigned fde_table_allocated; 163 164/* Number of elements in fde_table currently in use. */ 165static unsigned fde_table_in_use; 166 167/* Size (in elements) of increments by which we may expand the 168 fde_table. */ 169#define FDE_TABLE_INCREMENT 256 170 171/* A list of call frame insns for the CIE. */ 172static dw_cfi_ref cie_cfi_head; 173 174/* The number of the current function definition for which debugging 175 information is being generated. These numbers range from 1 up to the 176 maximum number of function definitions contained within the current 177 compilation unit. These numbers are used to create unique label id's 178 unique to each function definition. */ 179static unsigned current_funcdef_number = 0; 180 181/* Some DWARF extensions (e.g., MIPS/SGI) implement a subprogram 182 attribute that accelerates the lookup of the FDE associated 183 with the subprogram. This variable holds the table index of the FDE 184 associated with the current function (body) definition. */ 185static unsigned current_funcdef_fde; 186 187/* Forward declarations for functions defined in this file. */ 188 189static char *stripattributes PROTO((char *)); 190static char *dwarf_cfi_name PROTO((unsigned)); 191static dw_cfi_ref new_cfi PROTO((void)); 192static void add_cfi PROTO((dw_cfi_ref *, dw_cfi_ref)); 193static unsigned long size_of_uleb128 PROTO((unsigned long)); 194static unsigned long size_of_sleb128 PROTO((long)); 195static void output_uleb128 PROTO((unsigned long)); 196static void output_sleb128 PROTO((long)); 197static void add_fde_cfi PROTO((char *, dw_cfi_ref)); 198static void lookup_cfa_1 PROTO((dw_cfi_ref, unsigned long *, 199 long *)); 200static void lookup_cfa PROTO((unsigned long *, long *)); 201static void reg_save PROTO((char *, unsigned, unsigned, 202 long)); 203static void initial_return_save PROTO((rtx)); 204static void output_cfi PROTO((dw_cfi_ref, dw_fde_ref)); 205static void output_call_frame_info PROTO((int)); 206static unsigned reg_number PROTO((rtx)); 207static void dwarf2out_stack_adjust PROTO((rtx)); 208 209/* Definitions of defaults for assembler-dependent names of various 210 pseudo-ops and section names. 211 Theses may be overridden in the tm.h file (if necessary) for a particular 212 assembler. */ 213 214#ifdef OBJECT_FORMAT_ELF 215#ifndef UNALIGNED_SHORT_ASM_OP 216#define UNALIGNED_SHORT_ASM_OP ".2byte" 217#endif 218#ifndef UNALIGNED_INT_ASM_OP 219#define UNALIGNED_INT_ASM_OP ".4byte" 220#endif 221#ifndef UNALIGNED_DOUBLE_INT_ASM_OP 222#define UNALIGNED_DOUBLE_INT_ASM_OP ".8byte" 223#endif 224#endif /* OBJECT_FORMAT_ELF */ 225 226#ifndef ASM_BYTE_OP 227#define ASM_BYTE_OP ".byte" 228#endif 229 230/* Data and reference forms for relocatable data. */ 231#define DW_FORM_data (DWARF_OFFSET_SIZE == 8 ? DW_FORM_data8 : DW_FORM_data4) 232#define DW_FORM_ref (DWARF_OFFSET_SIZE == 8 ? DW_FORM_ref8 : DW_FORM_ref4) 233 234/* Pseudo-op for defining a new section. */ 235#ifndef SECTION_ASM_OP 236#define SECTION_ASM_OP ".section" 237#endif 238 239/* The default format used by the ASM_OUTPUT_SECTION macro (see below) to 240 print the SECTION_ASM_OP and the section name. The default here works for 241 almost all svr4 assemblers, except for the sparc, where the section name 242 must be enclosed in double quotes. (See sparcv4.h). */ 243#ifndef SECTION_FORMAT 244#ifdef PUSHSECTION_FORMAT 245#define SECTION_FORMAT PUSHSECTION_FORMAT 246#else 247#define SECTION_FORMAT "\t%s\t%s\n" 248#endif 249#endif 250 251#ifndef FRAME_SECTION 252#define FRAME_SECTION ".debug_frame" 253#endif 254 255#ifndef FUNC_BEGIN_LABEL 256#define FUNC_BEGIN_LABEL "LFB" 257#endif 258#ifndef FUNC_END_LABEL 259#define FUNC_END_LABEL "LFE" 260#endif 261#define CIE_AFTER_SIZE_LABEL "LSCIE" 262#define CIE_END_LABEL "LECIE" 263#define CIE_LENGTH_LABEL "LLCIE" 264#define FDE_AFTER_SIZE_LABEL "LSFDE" 265#define FDE_END_LABEL "LEFDE" 266#define FDE_LENGTH_LABEL "LLFDE" 267 268/* Definitions of defaults for various types of primitive assembly language 269 output operations. These may be overridden from within the tm.h file, 270 but typically, that is unnecessary. */ 271 272#ifndef ASM_OUTPUT_SECTION 273#define ASM_OUTPUT_SECTION(FILE, SECTION) \ 274 fprintf ((FILE), SECTION_FORMAT, SECTION_ASM_OP, SECTION) 275#endif 276 277#ifndef ASM_OUTPUT_DWARF_DATA1 278#define ASM_OUTPUT_DWARF_DATA1(FILE,VALUE) \ 279 fprintf ((FILE), "\t%s\t0x%x", ASM_BYTE_OP, (unsigned) (VALUE)) 280#endif 281 282#ifndef ASM_OUTPUT_DWARF_DELTA1 283#define ASM_OUTPUT_DWARF_DELTA1(FILE,LABEL1,LABEL2) \ 284 do { fprintf ((FILE), "\t%s\t", ASM_BYTE_OP); \ 285 assemble_name (FILE, LABEL1); \ 286 fprintf (FILE, "-"); \ 287 assemble_name (FILE, LABEL2); \ 288 } while (0) 289#endif 290 291#ifdef UNALIGNED_INT_ASM_OP 292 293#ifndef UNALIGNED_OFFSET_ASM_OP 294#define UNALIGNED_OFFSET_ASM_OP \ 295 (DWARF_OFFSET_SIZE == 8 ? UNALIGNED_DOUBLE_INT_ASM_OP : UNALIGNED_INT_ASM_OP) 296#endif 297 298#ifndef UNALIGNED_WORD_ASM_OP 299#define UNALIGNED_WORD_ASM_OP \ 300 (PTR_SIZE == 8 ? UNALIGNED_DOUBLE_INT_ASM_OP : UNALIGNED_INT_ASM_OP) 301#endif 302 303#ifndef ASM_OUTPUT_DWARF_DELTA2 304#define ASM_OUTPUT_DWARF_DELTA2(FILE,LABEL1,LABEL2) \ 305 do { fprintf ((FILE), "\t%s\t", UNALIGNED_SHORT_ASM_OP); \ 306 assemble_name (FILE, LABEL1); \ 307 fprintf (FILE, "-"); \ 308 assemble_name (FILE, LABEL2); \ 309 } while (0) 310#endif 311 312#ifndef ASM_OUTPUT_DWARF_DELTA4 313#define ASM_OUTPUT_DWARF_DELTA4(FILE,LABEL1,LABEL2) \ 314 do { fprintf ((FILE), "\t%s\t", UNALIGNED_INT_ASM_OP); \ 315 assemble_name (FILE, LABEL1); \ 316 fprintf (FILE, "-"); \ 317 assemble_name (FILE, LABEL2); \ 318 } while (0) 319#endif 320 321#ifndef ASM_OUTPUT_DWARF_DELTA 322#define ASM_OUTPUT_DWARF_DELTA(FILE,LABEL1,LABEL2) \ 323 do { fprintf ((FILE), "\t%s\t", UNALIGNED_OFFSET_ASM_OP); \ 324 assemble_name (FILE, LABEL1); \ 325 fprintf (FILE, "-"); \ 326 assemble_name (FILE, LABEL2); \ 327 } while (0) 328#endif 329 330#ifndef ASM_OUTPUT_DWARF_ADDR_DELTA 331#define ASM_OUTPUT_DWARF_ADDR_DELTA(FILE,LABEL1,LABEL2) \ 332 do { fprintf ((FILE), "\t%s\t", UNALIGNED_WORD_ASM_OP); \ 333 assemble_name (FILE, LABEL1); \ 334 fprintf (FILE, "-"); \ 335 assemble_name (FILE, LABEL2); \ 336 } while (0) 337#endif 338 339#ifndef ASM_OUTPUT_DWARF_ADDR 340#define ASM_OUTPUT_DWARF_ADDR(FILE,LABEL) \ 341 do { fprintf ((FILE), "\t%s\t", UNALIGNED_WORD_ASM_OP); \ 342 assemble_name (FILE, LABEL); \ 343 } while (0) 344#endif 345
|
346/* ??? This macro takes an RTX in dwarfout.c and a string in dwarf2out.c. 347 We resolve the conflict by creating a new macro ASM_OUTPUT_DWARF2_ADDR_CONST 348 for ports that want to support both DWARF1 and DWARF2. This needs a better 349 solution. See also the comments in sparc/sp64-elf.h. */ 350#ifdef ASM_OUTPUT_DWARF2_ADDR_CONST 351#undef ASM_OUTPUT_DWARF_ADDR_CONST 352#define ASM_OUTPUT_DWARF_ADDR_CONST(FILE,ADDR) \ 353 ASM_OUTPUT_DWARF2_ADDR_CONST (FILE, ADDR) 354#endif 355 |
356#ifndef ASM_OUTPUT_DWARF_ADDR_CONST 357#define ASM_OUTPUT_DWARF_ADDR_CONST(FILE,ADDR) \ 358 fprintf ((FILE), "\t%s\t%s", UNALIGNED_WORD_ASM_OP, (ADDR)) 359#endif 360 361#ifndef ASM_OUTPUT_DWARF_OFFSET4 362#define ASM_OUTPUT_DWARF_OFFSET4(FILE,LABEL) \ 363 do { fprintf ((FILE), "\t%s\t", UNALIGNED_INT_ASM_OP); \ 364 assemble_name (FILE, LABEL); \ 365 } while (0) 366#endif 367 368#ifndef ASM_OUTPUT_DWARF_OFFSET 369#define ASM_OUTPUT_DWARF_OFFSET(FILE,LABEL) \ 370 do { fprintf ((FILE), "\t%s\t", UNALIGNED_OFFSET_ASM_OP); \ 371 assemble_name (FILE, LABEL); \ 372 } while (0) 373#endif 374 375#ifndef ASM_OUTPUT_DWARF_DATA2 376#define ASM_OUTPUT_DWARF_DATA2(FILE,VALUE) \ 377 fprintf ((FILE), "\t%s\t0x%x", UNALIGNED_SHORT_ASM_OP, (unsigned) (VALUE)) 378#endif 379 380#ifndef ASM_OUTPUT_DWARF_DATA4 381#define ASM_OUTPUT_DWARF_DATA4(FILE,VALUE) \ 382 fprintf ((FILE), "\t%s\t0x%x", UNALIGNED_INT_ASM_OP, (unsigned) (VALUE)) 383#endif 384 385#ifndef ASM_OUTPUT_DWARF_DATA 386#define ASM_OUTPUT_DWARF_DATA(FILE,VALUE) \ 387 fprintf ((FILE), "\t%s\t0x%lx", UNALIGNED_OFFSET_ASM_OP, \ 388 (unsigned long) (VALUE)) 389#endif 390 391#ifndef ASM_OUTPUT_DWARF_ADDR_DATA 392#define ASM_OUTPUT_DWARF_ADDR_DATA(FILE,VALUE) \ 393 fprintf ((FILE), "\t%s\t0x%lx", UNALIGNED_WORD_ASM_OP, \ 394 (unsigned long) (VALUE)) 395#endif 396 397#ifndef ASM_OUTPUT_DWARF_DATA8 398#define ASM_OUTPUT_DWARF_DATA8(FILE,HIGH_VALUE,LOW_VALUE) \ 399 do { \ 400 if (WORDS_BIG_ENDIAN) \ 401 { \ 402 fprintf ((FILE), "\t%s\t0x%lx\n", UNALIGNED_INT_ASM_OP, (HIGH_VALUE));\ 403 fprintf ((FILE), "\t%s\t0x%lx", UNALIGNED_INT_ASM_OP, (LOW_VALUE));\ 404 } \ 405 else \ 406 { \ 407 fprintf ((FILE), "\t%s\t0x%lx\n", UNALIGNED_INT_ASM_OP, (LOW_VALUE)); \ 408 fprintf ((FILE), "\t%s\t0x%lx", UNALIGNED_INT_ASM_OP, (HIGH_VALUE)); \ 409 } \ 410 } while (0) 411#endif 412 413#else /* UNALIGNED_INT_ASM_OP */ 414 415/* We don't have unaligned support, let's hope the normal output works for 416 .debug_frame. */ 417 418#define ASM_OUTPUT_DWARF_ADDR(FILE,LABEL) \ 419 assemble_integer (gen_rtx_SYMBOL_REF (Pmode, LABEL), PTR_SIZE, 1) 420 421#define ASM_OUTPUT_DWARF_OFFSET4(FILE,LABEL) \ 422 assemble_integer (gen_rtx_SYMBOL_REF (SImode, LABEL), 4, 1) 423 424#define ASM_OUTPUT_DWARF_OFFSET(FILE,LABEL) \ 425 assemble_integer (gen_rtx_SYMBOL_REF (SImode, LABEL), 4, 1) 426 427#define ASM_OUTPUT_DWARF_DELTA2(FILE,LABEL1,LABEL2) \ 428 assemble_integer (gen_rtx_MINUS (HImode, \ 429 gen_rtx_SYMBOL_REF (Pmode, LABEL1), \ 430 gen_rtx_SYMBOL_REF (Pmode, LABEL2)), \ 431 2, 1) 432 433#define ASM_OUTPUT_DWARF_DELTA4(FILE,LABEL1,LABEL2) \ 434 assemble_integer (gen_rtx_MINUS (SImode, \ 435 gen_rtx_SYMBOL_REF (Pmode, LABEL1), \ 436 gen_rtx_SYMBOL_REF (Pmode, LABEL2)), \ 437 4, 1) 438 439#define ASM_OUTPUT_DWARF_ADDR_DELTA(FILE,LABEL1,LABEL2) \ 440 assemble_integer (gen_rtx_MINUS (Pmode, \ 441 gen_rtx_SYMBOL_REF (Pmode, LABEL1), \ 442 gen_rtx_SYMBOL_REF (Pmode, LABEL2)), \ 443 PTR_SIZE, 1) 444 445#define ASM_OUTPUT_DWARF_DELTA(FILE,LABEL1,LABEL2) \ 446 ASM_OUTPUT_DWARF_DELTA4 (FILE,LABEL1,LABEL2) 447 448#define ASM_OUTPUT_DWARF_DATA4(FILE,VALUE) \ 449 assemble_integer (GEN_INT (VALUE), 4, 1) 450 451#endif /* UNALIGNED_INT_ASM_OP */ 452 453#ifdef SET_ASM_OP 454#ifndef ASM_OUTPUT_DEFINE_LABEL_DIFFERENCE_SYMBOL 455#define ASM_OUTPUT_DEFINE_LABEL_DIFFERENCE_SYMBOL(FILE, SY, HI, LO) \ 456 do { \ 457 fprintf (FILE, "\t%s\t", SET_ASM_OP); \ 458 assemble_name (FILE, SY); \ 459 fputc (',', FILE); \ 460 assemble_name (FILE, HI); \ 461 fputc ('-', FILE); \ 462 assemble_name (FILE, LO); \ 463 } while (0) 464#endif 465#endif /* SET_ASM_OP */ 466 467/* This is similar to the default ASM_OUTPUT_ASCII, except that no trailing 468 newline is produced. When flag_debug_asm is asserted, we add commentary 469 at the end of the line, so we must avoid output of a newline here. */ 470#ifndef ASM_OUTPUT_DWARF_STRING 471#define ASM_OUTPUT_DWARF_STRING(FILE,P) \ 472 do { \ 473 register int slen = strlen(P); \ 474 register char *p = (P); \ 475 register int i; \ 476 fprintf (FILE, "\t.ascii \""); \ 477 for (i = 0; i < slen; i++) \ 478 { \ 479 register int c = p[i]; \ 480 if (c == '\"' || c == '\\') \ 481 putc ('\\', FILE); \ 482 if (c >= ' ' && c < 0177) \ 483 putc (c, FILE); \ 484 else \ 485 { \ 486 fprintf (FILE, "\\%o", c); \ 487 } \ 488 } \ 489 fprintf (FILE, "\\0\""); \ 490 } \ 491 while (0) 492#endif 493 494/* The DWARF 2 CFA column which tracks the return address. Normally this 495 is the column for PC, or the first column after all of the hard 496 registers. */ 497#ifndef DWARF_FRAME_RETURN_COLUMN 498#ifdef PC_REGNUM 499#define DWARF_FRAME_RETURN_COLUMN DWARF_FRAME_REGNUM (PC_REGNUM) 500#else 501#define DWARF_FRAME_RETURN_COLUMN FIRST_PSEUDO_REGISTER 502#endif 503#endif 504 505/* The mapping from gcc register number to DWARF 2 CFA column number. By 506 default, we just provide columns for all registers. */ 507#ifndef DWARF_FRAME_REGNUM 508#define DWARF_FRAME_REGNUM(REG) DBX_REGISTER_NUMBER (REG) 509#endif 510 511/* Hook used by __throw. */ 512 513rtx 514expand_builtin_dwarf_fp_regnum () 515{ 516 return GEN_INT (DWARF_FRAME_REGNUM (HARD_FRAME_POINTER_REGNUM)); 517} 518 519/* The offset from the incoming value of %sp to the top of the stack frame 520 for the current function. */ 521#ifndef INCOMING_FRAME_SP_OFFSET 522#define INCOMING_FRAME_SP_OFFSET 0 523#endif 524 525/* Return a pointer to a copy of the section string name S with all 526 attributes stripped off, and an asterisk prepended (for assemble_name). */ 527 528static inline char * 529stripattributes (s) 530 char *s; 531{ 532 char *stripped = xmalloc (strlen (s) + 2); 533 char *p = stripped; 534 535 *p++ = '*'; 536 537 while (*s && *s != ',') 538 *p++ = *s++; 539 540 *p = '\0'; 541 return stripped; 542} 543 544/* Return the register number described by a given RTL node. */ 545 546static unsigned 547reg_number (rtl) 548 register rtx rtl; 549{ 550 register unsigned regno = REGNO (rtl); 551 552 if (regno >= FIRST_PSEUDO_REGISTER) 553 { 554 warning ("internal regno botch: regno = %d\n", regno); 555 regno = 0; 556 } 557 558 regno = DBX_REGISTER_NUMBER (regno); 559 return regno; 560} 561 562struct reg_size_range 563{ 564 int beg; 565 int end; 566 int size; 567}; 568 569/* Given a register number in REG_TREE, return an rtx for its size in bytes. 570 We do this in kind of a roundabout way, by building up a list of 571 register size ranges and seeing where our register falls in one of those 572 ranges. We need to do it this way because REG_TREE is not a constant, 573 and the target macros were not designed to make this task easy. */ 574 575rtx 576expand_builtin_dwarf_reg_size (reg_tree, target) 577 tree reg_tree; 578 rtx target; 579{ 580 enum machine_mode mode; 581 int size; 582 struct reg_size_range ranges[5]; 583 tree t, t2; 584 585 int i = 0; 586 int n_ranges = 0; 587 int last_size = -1; 588 589 for (; i < FIRST_PSEUDO_REGISTER; ++i) 590 { 591 /* The return address is out of order on the MIPS, and we don't use 592 copy_reg for it anyway, so we don't care here how large it is. */ 593 if (DWARF_FRAME_REGNUM (i) == DWARF_FRAME_RETURN_COLUMN) 594 continue; 595 596 mode = reg_raw_mode[i]; 597 598 /* CCmode is arbitrarily given a size of 4 bytes. It is more useful 599 to use the same size as word_mode, since that reduces the number 600 of ranges we need. It should not matter, since the result should 601 never be used for a condition code register anyways. */ 602 if (GET_MODE_CLASS (mode) == MODE_CC) 603 mode = word_mode; 604 605 size = GET_MODE_SIZE (mode); 606 607 /* If this register is not valid in the specified mode and 608 we have a previous size, use that for the size of this 609 register to avoid making junk tiny ranges. */ 610 if (! HARD_REGNO_MODE_OK (i, mode) && last_size != -1) 611 size = last_size; 612 613 if (size != last_size) 614 { 615 ranges[n_ranges].beg = i; 616 ranges[n_ranges].size = last_size = size; 617 ++n_ranges; 618 if (n_ranges >= 5) 619 abort (); 620 } 621 ranges[n_ranges-1].end = i; 622 } 623 624 /* The usual case: fp regs surrounded by general regs. */ 625 if (n_ranges == 3 && ranges[0].size == ranges[2].size) 626 { 627 if ((DWARF_FRAME_REGNUM (ranges[1].end) 628 - DWARF_FRAME_REGNUM (ranges[1].beg)) 629 != ranges[1].end - ranges[1].beg) 630 abort (); 631 t = fold (build (GE_EXPR, integer_type_node, reg_tree, 632 build_int_2 (DWARF_FRAME_REGNUM (ranges[1].beg), 0))); 633 t2 = fold (build (LE_EXPR, integer_type_node, reg_tree, 634 build_int_2 (DWARF_FRAME_REGNUM (ranges[1].end), 0))); 635 t = fold (build (TRUTH_ANDIF_EXPR, integer_type_node, t, t2)); 636 t = fold (build (COND_EXPR, integer_type_node, t, 637 build_int_2 (ranges[1].size, 0), 638 build_int_2 (ranges[0].size, 0))); 639 } 640 else 641 {
|
642 /* Initialize last_end to be larger than any possible 643 DWARF_FRAME_REGNUM. */ 644 int last_end = 0x7fffffff; |
645 --n_ranges; 646 t = build_int_2 (ranges[n_ranges].size, 0);
|
637 size = DWARF_FRAME_REGNUM (ranges[n_ranges].beg);
638 for (; n_ranges--; )
|
647 do |
648 {
|
640 if ((DWARF_FRAME_REGNUM (ranges[n_ranges].end)
641 - DWARF_FRAME_REGNUM (ranges[n_ranges].beg))
642 != ranges[n_ranges].end - ranges[n_ranges].beg)
|
649 int beg = DWARF_FRAME_REGNUM (ranges[n_ranges].beg); 650 int end = DWARF_FRAME_REGNUM (ranges[n_ranges].end); 651 if (beg < 0) 652 continue; 653 if (end >= last_end) |
654 abort ();
|
644 if (DWARF_FRAME_REGNUM (ranges[n_ranges].beg) >= size)
|
655 last_end = end; 656 if (end - beg != ranges[n_ranges].end - ranges[n_ranges].beg) |
657 abort ();
|
646 size = DWARF_FRAME_REGNUM (ranges[n_ranges].beg);
|
658 t2 = fold (build (LE_EXPR, integer_type_node, reg_tree,
|
648 build_int_2 (DWARF_FRAME_REGNUM
649 (ranges[n_ranges].end), 0)));
|
659 build_int_2 (end, 0))); |
660 t = fold (build (COND_EXPR, integer_type_node, t2, 661 build_int_2 (ranges[n_ranges].size, 0), t)); 662 }
|
663 while (--n_ranges >= 0); |
664 } 665 return expand_expr (t, target, Pmode, 0); 666} 667 668/* Convert a DWARF call frame info. operation to its string name */ 669 670static char * 671dwarf_cfi_name (cfi_opc) 672 register unsigned cfi_opc; 673{ 674 switch (cfi_opc) 675 { 676 case DW_CFA_advance_loc: 677 return "DW_CFA_advance_loc"; 678 case DW_CFA_offset: 679 return "DW_CFA_offset"; 680 case DW_CFA_restore: 681 return "DW_CFA_restore"; 682 case DW_CFA_nop: 683 return "DW_CFA_nop"; 684 case DW_CFA_set_loc: 685 return "DW_CFA_set_loc"; 686 case DW_CFA_advance_loc1: 687 return "DW_CFA_advance_loc1"; 688 case DW_CFA_advance_loc2: 689 return "DW_CFA_advance_loc2"; 690 case DW_CFA_advance_loc4: 691 return "DW_CFA_advance_loc4"; 692 case DW_CFA_offset_extended: 693 return "DW_CFA_offset_extended"; 694 case DW_CFA_restore_extended: 695 return "DW_CFA_restore_extended"; 696 case DW_CFA_undefined: 697 return "DW_CFA_undefined"; 698 case DW_CFA_same_value: 699 return "DW_CFA_same_value"; 700 case DW_CFA_register: 701 return "DW_CFA_register"; 702 case DW_CFA_remember_state: 703 return "DW_CFA_remember_state"; 704 case DW_CFA_restore_state: 705 return "DW_CFA_restore_state"; 706 case DW_CFA_def_cfa: 707 return "DW_CFA_def_cfa"; 708 case DW_CFA_def_cfa_register: 709 return "DW_CFA_def_cfa_register"; 710 case DW_CFA_def_cfa_offset: 711 return "DW_CFA_def_cfa_offset"; 712 713 /* SGI/MIPS specific */ 714 case DW_CFA_MIPS_advance_loc8: 715 return "DW_CFA_MIPS_advance_loc8"; 716 717 /* GNU extensions */ 718 case DW_CFA_GNU_window_save: 719 return "DW_CFA_GNU_window_save"; 720 case DW_CFA_GNU_args_size: 721 return "DW_CFA_GNU_args_size"; 722 723 default: 724 return "DW_CFA_<unknown>"; 725 } 726} 727 728/* Return a pointer to a newly allocated Call Frame Instruction. */ 729 730static inline dw_cfi_ref 731new_cfi () 732{ 733 register dw_cfi_ref cfi = (dw_cfi_ref) xmalloc (sizeof (dw_cfi_node)); 734 735 cfi->dw_cfi_next = NULL; 736 cfi->dw_cfi_oprnd1.dw_cfi_reg_num = 0; 737 cfi->dw_cfi_oprnd2.dw_cfi_reg_num = 0; 738 739 return cfi; 740} 741 742/* Add a Call Frame Instruction to list of instructions. */ 743 744static inline void 745add_cfi (list_head, cfi) 746 register dw_cfi_ref *list_head; 747 register dw_cfi_ref cfi; 748{ 749 register dw_cfi_ref *p; 750 751 /* Find the end of the chain. */ 752 for (p = list_head; (*p) != NULL; p = &(*p)->dw_cfi_next) 753 ; 754 755 *p = cfi; 756} 757 758/* Generate a new label for the CFI info to refer to. */ 759 760char * 761dwarf2out_cfi_label () 762{ 763 static char label[20]; 764 static unsigned long label_num = 0; 765 766 ASM_GENERATE_INTERNAL_LABEL (label, "LCFI", label_num++); 767 ASM_OUTPUT_LABEL (asm_out_file, label); 768 769 return label; 770} 771 772/* Add CFI to the current fde at the PC value indicated by LABEL if specified, 773 or to the CIE if LABEL is NULL. */ 774 775static void 776add_fde_cfi (label, cfi) 777 register char *label; 778 register dw_cfi_ref cfi; 779{ 780 if (label) 781 { 782 register dw_fde_ref fde = &fde_table[fde_table_in_use - 1]; 783 784 if (*label == 0) 785 label = dwarf2out_cfi_label (); 786 787 if (fde->dw_fde_current_label == NULL 788 || strcmp (label, fde->dw_fde_current_label) != 0) 789 { 790 register dw_cfi_ref xcfi; 791 792 fde->dw_fde_current_label = label = xstrdup (label); 793 794 /* Set the location counter to the new label. */ 795 xcfi = new_cfi (); 796 xcfi->dw_cfi_opc = DW_CFA_advance_loc4; 797 xcfi->dw_cfi_oprnd1.dw_cfi_addr = label; 798 add_cfi (&fde->dw_fde_cfi, xcfi); 799 } 800 801 add_cfi (&fde->dw_fde_cfi, cfi); 802 } 803 804 else 805 add_cfi (&cie_cfi_head, cfi); 806} 807 808/* Subroutine of lookup_cfa. */ 809 810static inline void 811lookup_cfa_1 (cfi, regp, offsetp) 812 register dw_cfi_ref cfi; 813 register unsigned long *regp; 814 register long *offsetp; 815{ 816 switch (cfi->dw_cfi_opc) 817 { 818 case DW_CFA_def_cfa_offset: 819 *offsetp = cfi->dw_cfi_oprnd1.dw_cfi_offset; 820 break; 821 case DW_CFA_def_cfa_register: 822 *regp = cfi->dw_cfi_oprnd1.dw_cfi_reg_num; 823 break; 824 case DW_CFA_def_cfa: 825 *regp = cfi->dw_cfi_oprnd1.dw_cfi_reg_num; 826 *offsetp = cfi->dw_cfi_oprnd2.dw_cfi_offset; 827 break; 828 default: 829 break; 830 } 831} 832 833/* Find the previous value for the CFA. */ 834 835static void 836lookup_cfa (regp, offsetp) 837 register unsigned long *regp; 838 register long *offsetp; 839{ 840 register dw_cfi_ref cfi; 841 842 *regp = (unsigned long) -1; 843 *offsetp = 0; 844 845 for (cfi = cie_cfi_head; cfi; cfi = cfi->dw_cfi_next) 846 lookup_cfa_1 (cfi, regp, offsetp); 847 848 if (fde_table_in_use) 849 { 850 register dw_fde_ref fde = &fde_table[fde_table_in_use - 1]; 851 for (cfi = fde->dw_fde_cfi; cfi; cfi = cfi->dw_cfi_next) 852 lookup_cfa_1 (cfi, regp, offsetp); 853 } 854} 855 856/* The current rule for calculating the DWARF2 canonical frame address. */ 857static unsigned long cfa_reg; 858static long cfa_offset; 859 860/* The register used for saving registers to the stack, and its offset 861 from the CFA. */ 862static unsigned cfa_store_reg; 863static long cfa_store_offset; 864 865/* The running total of the size of arguments pushed onto the stack. */ 866static long args_size; 867 868/* The last args_size we actually output. */ 869static long old_args_size; 870 871/* Entry point to update the canonical frame address (CFA). 872 LABEL is passed to add_fde_cfi. The value of CFA is now to be 873 calculated from REG+OFFSET. */ 874 875void 876dwarf2out_def_cfa (label, reg, offset) 877 register char *label; 878 register unsigned reg; 879 register long offset; 880{ 881 register dw_cfi_ref cfi; 882 unsigned long old_reg; 883 long old_offset; 884 885 cfa_reg = reg; 886 cfa_offset = offset; 887 if (cfa_store_reg == reg) 888 cfa_store_offset = offset; 889 890 reg = DWARF_FRAME_REGNUM (reg); 891 lookup_cfa (&old_reg, &old_offset); 892 893 if (reg == old_reg && offset == old_offset) 894 return; 895 896 cfi = new_cfi (); 897 898 if (reg == old_reg) 899 { 900 cfi->dw_cfi_opc = DW_CFA_def_cfa_offset; 901 cfi->dw_cfi_oprnd1.dw_cfi_offset = offset; 902 } 903 904#ifndef MIPS_DEBUGGING_INFO /* SGI dbx thinks this means no offset. */ 905 else if (offset == old_offset && old_reg != (unsigned long) -1) 906 { 907 cfi->dw_cfi_opc = DW_CFA_def_cfa_register; 908 cfi->dw_cfi_oprnd1.dw_cfi_reg_num = reg; 909 } 910#endif 911 912 else 913 { 914 cfi->dw_cfi_opc = DW_CFA_def_cfa; 915 cfi->dw_cfi_oprnd1.dw_cfi_reg_num = reg; 916 cfi->dw_cfi_oprnd2.dw_cfi_offset = offset; 917 } 918 919 add_fde_cfi (label, cfi); 920} 921 922/* Add the CFI for saving a register. REG is the CFA column number. 923 LABEL is passed to add_fde_cfi. 924 If SREG is -1, the register is saved at OFFSET from the CFA; 925 otherwise it is saved in SREG. */ 926 927static void 928reg_save (label, reg, sreg, offset) 929 register char * label; 930 register unsigned reg; 931 register unsigned sreg; 932 register long offset; 933{ 934 register dw_cfi_ref cfi = new_cfi (); 935 936 cfi->dw_cfi_oprnd1.dw_cfi_reg_num = reg; 937 938 /* The following comparison is correct. -1 is used to indicate that 939 the value isn't a register number. */ 940 if (sreg == (unsigned int) -1) 941 { 942 if (reg & ~0x3f) 943 /* The register number won't fit in 6 bits, so we have to use 944 the long form. */ 945 cfi->dw_cfi_opc = DW_CFA_offset_extended; 946 else 947 cfi->dw_cfi_opc = DW_CFA_offset; 948 949 offset /= DWARF_CIE_DATA_ALIGNMENT; 950 if (offset < 0) 951 abort (); 952 cfi->dw_cfi_oprnd2.dw_cfi_offset = offset; 953 } 954 else 955 { 956 cfi->dw_cfi_opc = DW_CFA_register; 957 cfi->dw_cfi_oprnd2.dw_cfi_reg_num = sreg; 958 } 959 960 add_fde_cfi (label, cfi); 961} 962 963/* Add the CFI for saving a register window. LABEL is passed to reg_save. 964 This CFI tells the unwinder that it needs to restore the window registers 965 from the previous frame's window save area. 966 967 ??? Perhaps we should note in the CIE where windows are saved (instead of 968 assuming 0(cfa)) and what registers are in the window. */ 969 970void 971dwarf2out_window_save (label) 972 register char * label; 973{ 974 register dw_cfi_ref cfi = new_cfi (); 975 cfi->dw_cfi_opc = DW_CFA_GNU_window_save; 976 add_fde_cfi (label, cfi); 977} 978 979/* Add a CFI to update the running total of the size of arguments 980 pushed onto the stack. */ 981 982void 983dwarf2out_args_size (label, size) 984 char *label; 985 long size; 986{ 987 register dw_cfi_ref cfi; 988 989 if (size == old_args_size) 990 return; 991 old_args_size = size; 992 993 cfi = new_cfi (); 994 cfi->dw_cfi_opc = DW_CFA_GNU_args_size; 995 cfi->dw_cfi_oprnd1.dw_cfi_offset = size; 996 add_fde_cfi (label, cfi); 997} 998 999/* Entry point for saving a register to the stack. REG is the GCC register 1000 number. LABEL and OFFSET are passed to reg_save. */ 1001 1002void 1003dwarf2out_reg_save (label, reg, offset) 1004 register char * label; 1005 register unsigned reg; 1006 register long offset; 1007{ 1008 reg_save (label, DWARF_FRAME_REGNUM (reg), -1, offset); 1009} 1010 1011/* Entry point for saving the return address in the stack. 1012 LABEL and OFFSET are passed to reg_save. */ 1013 1014void 1015dwarf2out_return_save (label, offset) 1016 register char * label; 1017 register long offset; 1018{ 1019 reg_save (label, DWARF_FRAME_RETURN_COLUMN, -1, offset); 1020} 1021 1022/* Entry point for saving the return address in a register. 1023 LABEL and SREG are passed to reg_save. */ 1024 1025void 1026dwarf2out_return_reg (label, sreg) 1027 register char * label; 1028 register unsigned sreg; 1029{ 1030 reg_save (label, DWARF_FRAME_RETURN_COLUMN, sreg, 0); 1031} 1032 1033/* Record the initial position of the return address. RTL is 1034 INCOMING_RETURN_ADDR_RTX. */ 1035 1036static void 1037initial_return_save (rtl) 1038 register rtx rtl; 1039{
|
1029 unsigned reg = -1;
|
1040 unsigned int reg = (unsigned int) -1; |
1041 long offset = 0; 1042 1043 switch (GET_CODE (rtl)) 1044 { 1045 case REG: 1046 /* RA is in a register. */ 1047 reg = reg_number (rtl); 1048 break; 1049 case MEM: 1050 /* RA is on the stack. */ 1051 rtl = XEXP (rtl, 0); 1052 switch (GET_CODE (rtl)) 1053 { 1054 case REG: 1055 if (REGNO (rtl) != STACK_POINTER_REGNUM) 1056 abort (); 1057 offset = 0; 1058 break; 1059 case PLUS: 1060 if (REGNO (XEXP (rtl, 0)) != STACK_POINTER_REGNUM) 1061 abort (); 1062 offset = INTVAL (XEXP (rtl, 1)); 1063 break; 1064 case MINUS: 1065 if (REGNO (XEXP (rtl, 0)) != STACK_POINTER_REGNUM) 1066 abort (); 1067 offset = -INTVAL (XEXP (rtl, 1)); 1068 break; 1069 default: 1070 abort (); 1071 } 1072 break; 1073 case PLUS: 1074 /* The return address is at some offset from any value we can 1075 actually load. For instance, on the SPARC it is in %i7+8. Just 1076 ignore the offset for now; it doesn't matter for unwinding frames. */ 1077 if (GET_CODE (XEXP (rtl, 1)) != CONST_INT) 1078 abort (); 1079 initial_return_save (XEXP (rtl, 0)); 1080 return; 1081 default: 1082 abort (); 1083 } 1084 1085 reg_save (NULL, DWARF_FRAME_RETURN_COLUMN, reg, offset - cfa_offset); 1086} 1087 1088/* Check INSN to see if it looks like a push or a stack adjustment, and 1089 make a note of it if it does. EH uses this information to find out how 1090 much extra space it needs to pop off the stack. */ 1091 1092static void 1093dwarf2out_stack_adjust (insn) 1094 rtx insn; 1095{ 1096 long offset; 1097 char *label; 1098 1099 if (! asynchronous_exceptions && GET_CODE (insn) == CALL_INSN) 1100 { 1101 /* Extract the size of the args from the CALL rtx itself. */ 1102 1103 insn = PATTERN (insn); 1104 if (GET_CODE (insn) == PARALLEL) 1105 insn = XVECEXP (insn, 0, 0); 1106 if (GET_CODE (insn) == SET) 1107 insn = SET_SRC (insn); 1108 assert (GET_CODE (insn) == CALL); 1109 dwarf2out_args_size ("", INTVAL (XEXP (insn, 1))); 1110 return; 1111 } 1112 1113 /* If only calls can throw, and we have a frame pointer, 1114 save up adjustments until we see the CALL_INSN. */ 1115 else if (! asynchronous_exceptions 1116 && cfa_reg != STACK_POINTER_REGNUM) 1117 return; 1118 1119 if (GET_CODE (insn) == BARRIER) 1120 { 1121 /* When we see a BARRIER, we know to reset args_size to 0. Usually 1122 the compiler will have already emitted a stack adjustment, but 1123 doesn't bother for calls to noreturn functions. */ 1124#ifdef STACK_GROWS_DOWNWARD 1125 offset = -args_size; 1126#else 1127 offset = args_size; 1128#endif 1129 } 1130 else if (GET_CODE (PATTERN (insn)) == SET) 1131 { 1132 rtx src, dest; 1133 enum rtx_code code; 1134 1135 insn = PATTERN (insn); 1136 src = SET_SRC (insn); 1137 dest = SET_DEST (insn); 1138 1139 if (dest == stack_pointer_rtx) 1140 { 1141 /* (set (reg sp) (plus (reg sp) (const_int))) */ 1142 code = GET_CODE (src); 1143 if (! (code == PLUS || code == MINUS) 1144 || XEXP (src, 0) != stack_pointer_rtx 1145 || GET_CODE (XEXP (src, 1)) != CONST_INT) 1146 return; 1147 1148 offset = INTVAL (XEXP (src, 1)); 1149 } 1150 else if (GET_CODE (dest) == MEM) 1151 { 1152 /* (set (mem (pre_dec (reg sp))) (foo)) */ 1153 src = XEXP (dest, 0); 1154 code = GET_CODE (src); 1155 1156 if (! (code == PRE_DEC || code == PRE_INC) 1157 || XEXP (src, 0) != stack_pointer_rtx) 1158 return; 1159 1160 offset = GET_MODE_SIZE (GET_MODE (dest)); 1161 } 1162 else 1163 return; 1164 1165 if (code == PLUS || code == PRE_INC) 1166 offset = -offset; 1167 } 1168 else 1169 return; 1170 1171 if (offset == 0) 1172 return; 1173 1174 if (cfa_reg == STACK_POINTER_REGNUM) 1175 cfa_offset += offset; 1176 1177#ifndef STACK_GROWS_DOWNWARD 1178 offset = -offset; 1179#endif 1180 args_size += offset; 1181 if (args_size < 0) 1182 args_size = 0; 1183 1184 label = dwarf2out_cfi_label (); 1185 dwarf2out_def_cfa (label, cfa_reg, cfa_offset); 1186 dwarf2out_args_size (label, args_size); 1187} 1188
|
1178/* Record call frame debugging information for INSN, which either
|
1189/* A temporary register used in adjusting SP or setting up the store_reg. */ 1190static unsigned cfa_temp_reg; 1191 1192/* A temporary value used in adjusting SP or setting up the store_reg. */ 1193static long cfa_temp_value; 1194 1195/* Record call frame debugging information for an expression, which either |
1196 sets SP or FP (adjusting how we calculate the frame address) or saves a
|
1180 register to the stack. If INSN is NULL_RTX, initialize our state. */
|
1197 register to the stack. */ |
1198
|
1182void
1183dwarf2out_frame_debug (insn)
1184 rtx insn;
|
1199static void 1200dwarf2out_frame_debug_expr (expr, label) 1201 rtx expr; 1202 char *label; |
1203{
|
1186 char *label;
|
1204 rtx src, dest; 1205 long offset;
|
1206 1207 /* If RTX_FRAME_RELATED_P is set on a PARALLEL, process each member of 1208 the PARALLEL independantly. The first element is always processed if 1209 it is a SET. This is for backward compatability. Other elements 1210 are processed only if they are SETs and the RTX_FRAME_RELATED_P 1211 flag is set in them. */ |
1212
|
1190 /* A temporary register used in adjusting SP or setting up the store_reg. */
1191 static unsigned cfa_temp_reg;
1192 static long cfa_temp_value;
|
1213 if (GET_CODE (expr) == PARALLEL) 1214 { 1215 int par_index; 1216 int limit = XVECLEN (expr, 0); |
1217
|
1194 if (insn == NULL_RTX)
1195 {
1196 /* Set up state for generating call frame debug info. */
1197 lookup_cfa (&cfa_reg, &cfa_offset);
1198 if (cfa_reg != DWARF_FRAME_REGNUM (STACK_POINTER_REGNUM))
1199 abort ();
1200 cfa_reg = STACK_POINTER_REGNUM;
1201 cfa_store_reg = cfa_reg;
1202 cfa_store_offset = cfa_offset;
1203 cfa_temp_reg = -1;
1204 cfa_temp_value = 0;
|
1218 for (par_index = 0; par_index < limit; par_index++) 1219 { 1220 rtx x = XVECEXP (expr, 0, par_index); 1221 1222 if (GET_CODE (x) == SET && 1223 (RTX_FRAME_RELATED_P (x) || par_index == 0)) 1224 dwarf2out_frame_debug_expr (x, label); 1225 } |
1226 return; 1227 }
|
1207
1208 if (! RTX_FRAME_RELATED_P (insn))
1209 {
1210 dwarf2out_stack_adjust (insn);
1211 return;
1212 }
1213
1214 label = dwarf2out_cfi_label ();
1215
1216 insn = PATTERN (insn);
1217 /* Assume that in a PARALLEL prologue insn, only the first elt is
1218 significant. Currently this is true. */
1219 if (GET_CODE (insn) == PARALLEL)
1220 insn = XVECEXP (insn, 0, 0);
1221 if (GET_CODE (insn) != SET)
|
1228 1229 if (GET_CODE (expr) != SET) |
1230 abort (); 1231
|
1224 src = SET_SRC (insn);
1225 dest = SET_DEST (insn);
|
1232 src = SET_SRC (expr); 1233 dest = SET_DEST (expr); |
1234 1235 switch (GET_CODE (dest)) 1236 { 1237 case REG: 1238 /* Update the CFA rule wrt SP or FP. Make sure src is
|
1231 relative to the current CFA register. */
|
1239 relative to the current CFA register. */ |
1240 switch (GET_CODE (src))
|
1233 {
1234 /* Setting FP from SP. */
1235 case REG:
1236 if (cfa_reg != REGNO (src))
1237 abort ();
1238 if (REGNO (dest) != STACK_POINTER_REGNUM
1239 && !(frame_pointer_needed
1240 && REGNO (dest) == HARD_FRAME_POINTER_REGNUM))
1241 abort ();
1242 cfa_reg = REGNO (dest);
1243 break;
|
1241 { 1242 /* Setting FP from SP. */ 1243 case REG: 1244 if (cfa_reg != (unsigned) REGNO (src)) 1245 abort (); 1246 if (REGNO (dest) != STACK_POINTER_REGNUM 1247 && !(frame_pointer_needed 1248 && REGNO (dest) == HARD_FRAME_POINTER_REGNUM)) 1249 abort (); 1250 cfa_reg = REGNO (dest); 1251 break; |
1252
|
1245 case PLUS:
1246 case MINUS:
1247 if (dest == stack_pointer_rtx)
1248 {
1249 /* Adjusting SP. */
1250 switch (GET_CODE (XEXP (src, 1)))
1251 {
1252 case CONST_INT:
1253 offset = INTVAL (XEXP (src, 1));
1254 break;
1255 case REG:
1256 if (REGNO (XEXP (src, 1)) != cfa_temp_reg)
1257 abort ();
1258 offset = cfa_temp_value;
1259 break;
1260 default:
1261 abort ();
1262 }
|
1253 case PLUS: 1254 case MINUS: 1255 if (dest == stack_pointer_rtx) 1256 { 1257 /* Adjusting SP. */ 1258 switch (GET_CODE (XEXP (src, 1))) 1259 { 1260 case CONST_INT: 1261 offset = INTVAL (XEXP (src, 1)); 1262 break; 1263 case REG: 1264 if ((unsigned) REGNO (XEXP (src, 1)) != cfa_temp_reg) 1265 abort (); 1266 offset = cfa_temp_value; 1267 break; 1268 default: 1269 abort (); 1270 } |
1271
|
1264 if (XEXP (src, 0) == hard_frame_pointer_rtx)
1265 {
1266 /* Restoring SP from FP in the epilogue. */
1267 if (cfa_reg != HARD_FRAME_POINTER_REGNUM)
1268 abort ();
1269 cfa_reg = STACK_POINTER_REGNUM;
1270 }
1271 else if (XEXP (src, 0) != stack_pointer_rtx)
1272 abort ();
|
1272 if (XEXP (src, 0) == hard_frame_pointer_rtx) 1273 { 1274 /* Restoring SP from FP in the epilogue. */ 1275 if (cfa_reg != (unsigned) HARD_FRAME_POINTER_REGNUM) 1276 abort (); 1277 cfa_reg = STACK_POINTER_REGNUM; 1278 } 1279 else if (XEXP (src, 0) != stack_pointer_rtx) 1280 abort (); |
1281
|
1274 if (GET_CODE (src) == PLUS)
1275 offset = -offset;
1276 if (cfa_reg == STACK_POINTER_REGNUM)
1277 cfa_offset += offset;
1278 if (cfa_store_reg == STACK_POINTER_REGNUM)
1279 cfa_store_offset += offset;
1280 }
|
1282 if (GET_CODE (src) == PLUS) 1283 offset = -offset; 1284 if (cfa_reg == STACK_POINTER_REGNUM) 1285 cfa_offset += offset; 1286 if (cfa_store_reg == STACK_POINTER_REGNUM) 1287 cfa_store_offset += offset; 1288 } |
1289 else if (dest == hard_frame_pointer_rtx) 1290 {
|
1283 /* Either setting the FP from an offset of the SP,
1284 or adjusting the FP */
1285 if (! frame_pointer_needed
1286 || REGNO (dest) != HARD_FRAME_POINTER_REGNUM)
1287 abort ();
|
1291 /* Either setting the FP from an offset of the SP, 1292 or adjusting the FP */ 1293 if (! frame_pointer_needed 1294 || REGNO (dest) != HARD_FRAME_POINTER_REGNUM) 1295 abort (); |
1296
|
1289 if (XEXP (src, 0) == stack_pointer_rtx
1290 && GET_CODE (XEXP (src, 1)) == CONST_INT)
1291 {
1292 if (cfa_reg != STACK_POINTER_REGNUM)
1293 abort ();
1294 offset = INTVAL (XEXP (src, 1));
1295 if (GET_CODE (src) == PLUS)
1296 offset = -offset;
1297 cfa_offset += offset;
1298 cfa_reg = HARD_FRAME_POINTER_REGNUM;
1299 }
1300 else if (XEXP (src, 0) == hard_frame_pointer_rtx
1301 && GET_CODE (XEXP (src, 1)) == CONST_INT)
1302 {
1303 if (cfa_reg != HARD_FRAME_POINTER_REGNUM)
1304 abort ();
1305 offset = INTVAL (XEXP (src, 1));
1306 if (GET_CODE (src) == PLUS)
1307 offset = -offset;
1308 cfa_offset += offset;
1309 }
|
1297 if (XEXP (src, 0) == stack_pointer_rtx 1298 && GET_CODE (XEXP (src, 1)) == CONST_INT) 1299 { 1300 if (cfa_reg != STACK_POINTER_REGNUM) 1301 abort (); 1302 offset = INTVAL (XEXP (src, 1)); 1303 if (GET_CODE (src) == PLUS) 1304 offset = -offset; 1305 cfa_offset += offset; 1306 cfa_reg = HARD_FRAME_POINTER_REGNUM; 1307 } 1308 else if (XEXP (src, 0) == hard_frame_pointer_rtx 1309 && GET_CODE (XEXP (src, 1)) == CONST_INT) 1310 { 1311 if (cfa_reg != (unsigned) HARD_FRAME_POINTER_REGNUM) 1312 abort (); 1313 offset = INTVAL (XEXP (src, 1)); 1314 if (GET_CODE (src) == PLUS) 1315 offset = -offset; 1316 cfa_offset += offset; 1317 } |
1318
|
1311 else
1312 abort();
|
1319 else 1320 abort(); |
1321 }
|
1314 else
1315 {
1316 if (GET_CODE (src) != PLUS
1317 || XEXP (src, 1) != stack_pointer_rtx)
1318 abort ();
1319 if (GET_CODE (XEXP (src, 0)) != REG
1320 || REGNO (XEXP (src, 0)) != cfa_temp_reg)
1321 abort ();
1322 if (cfa_reg != STACK_POINTER_REGNUM)
1323 abort ();
1324 cfa_store_reg = REGNO (dest);
1325 cfa_store_offset = cfa_offset - cfa_temp_value;
1326 }
1327 break;
|
1322 else 1323 { 1324 if (GET_CODE (src) != PLUS 1325 || XEXP (src, 1) != stack_pointer_rtx) 1326 abort (); 1327 if (GET_CODE (XEXP (src, 0)) != REG 1328 || (unsigned) REGNO (XEXP (src, 0)) != cfa_temp_reg) 1329 abort (); 1330 if (cfa_reg != STACK_POINTER_REGNUM) 1331 abort (); 1332 cfa_store_reg = REGNO (dest); 1333 cfa_store_offset = cfa_offset - cfa_temp_value; 1334 } 1335 break; |
1336
|
1329 case CONST_INT:
1330 cfa_temp_reg = REGNO (dest);
1331 cfa_temp_value = INTVAL (src);
1332 break;
|
1337 case CONST_INT: 1338 cfa_temp_reg = REGNO (dest); 1339 cfa_temp_value = INTVAL (src); 1340 break; |
1341
|
1334 case IOR:
1335 if (GET_CODE (XEXP (src, 0)) != REG
1336 || REGNO (XEXP (src, 0)) != cfa_temp_reg
1337 || REGNO (dest) != cfa_temp_reg
1338 || GET_CODE (XEXP (src, 1)) != CONST_INT)
1339 abort ();
1340 cfa_temp_value |= INTVAL (XEXP (src, 1));
1341 break;
|
1342 case IOR: 1343 if (GET_CODE (XEXP (src, 0)) != REG 1344 || (unsigned) REGNO (XEXP (src, 0)) != cfa_temp_reg 1345 || (unsigned) REGNO (dest) != cfa_temp_reg 1346 || GET_CODE (XEXP (src, 1)) != CONST_INT) 1347 abort (); 1348 cfa_temp_value |= INTVAL (XEXP (src, 1)); 1349 break; |
1350
|
1343 default:
1344 abort ();
1345 }
|
1351 default: 1352 abort (); 1353 } |
1354 dwarf2out_def_cfa (label, cfa_reg, cfa_offset);
|
1347 break;
|
1355 break; |
1356
|
1349 case MEM:
1350 /* Saving a register to the stack. Make sure dest is relative to the
1351 CFA register. */
1352 if (GET_CODE (src) != REG)
1353 abort ();
1354 switch (GET_CODE (XEXP (dest, 0)))
1355 {
1356 /* With a push. */
1357 case PRE_INC:
1358 case PRE_DEC:
1359 offset = GET_MODE_SIZE (GET_MODE (dest));
1360 if (GET_CODE (XEXP (dest, 0)) == PRE_INC)
1361 offset = -offset;
|
1357 case MEM: 1358 /* Saving a register to the stack. Make sure dest is relative to the 1359 CFA register. */ 1360 if (GET_CODE (src) != REG) 1361 abort (); 1362 switch (GET_CODE (XEXP (dest, 0))) 1363 { 1364 /* With a push. */ 1365 case PRE_INC: 1366 case PRE_DEC: 1367 offset = GET_MODE_SIZE (GET_MODE (dest)); 1368 if (GET_CODE (XEXP (dest, 0)) == PRE_INC) 1369 offset = -offset; |
1370
|
1363 if (REGNO (XEXP (XEXP (dest, 0), 0)) != STACK_POINTER_REGNUM
1364 || cfa_store_reg != STACK_POINTER_REGNUM)
1365 abort ();
1366 cfa_store_offset += offset;
1367 if (cfa_reg == STACK_POINTER_REGNUM)
1368 cfa_offset = cfa_store_offset;
|
1371 if (REGNO (XEXP (XEXP (dest, 0), 0)) != STACK_POINTER_REGNUM 1372 || cfa_store_reg != STACK_POINTER_REGNUM) 1373 abort (); 1374 cfa_store_offset += offset; 1375 if (cfa_reg == STACK_POINTER_REGNUM) 1376 cfa_offset = cfa_store_offset; |
1377
|
1370 offset = -cfa_store_offset;
1371 break;
|
1378 offset = -cfa_store_offset; 1379 break; |
1380
|
1373 /* With an offset. */
1374 case PLUS:
1375 case MINUS:
1376 offset = INTVAL (XEXP (XEXP (dest, 0), 1));
1377 if (GET_CODE (src) == MINUS)
1378 offset = -offset;
|
1381 /* With an offset. */ 1382 case PLUS: 1383 case MINUS: 1384 offset = INTVAL (XEXP (XEXP (dest, 0), 1)); 1385 if (GET_CODE (XEXP (dest, 0)) == MINUS) 1386 offset = -offset; |
1387
|
1380 if (cfa_store_reg != REGNO (XEXP (XEXP (dest, 0), 0)))
1381 abort ();
1382 offset -= cfa_store_offset;
1383 break;
|
1388 if (cfa_store_reg != (unsigned) REGNO (XEXP (XEXP (dest, 0), 0))) 1389 abort (); 1390 offset -= cfa_store_offset; 1391 break; |
1392
|
1385 default:
1386 abort ();
1387 }
1388 dwarf2out_def_cfa (label, cfa_reg, cfa_offset);
1389 dwarf2out_reg_save (label, REGNO (src), offset);
1390 break;
|
1393 /* Without an offset. */ 1394 case REG: 1395 if (cfa_store_reg != (unsigned) REGNO (XEXP (dest, 0))) 1396 abort(); 1397 offset = -cfa_store_offset; 1398 break; |
1399
|
1392 default:
1393 abort ();
|
1400 default: 1401 abort (); 1402 } 1403 dwarf2out_def_cfa (label, cfa_reg, cfa_offset); 1404 dwarf2out_reg_save (label, REGNO (src), offset); 1405 break; 1406 1407 default: 1408 abort (); 1409 } 1410} 1411 1412 1413/* Record call frame debugging information for INSN, which either 1414 sets SP or FP (adjusting how we calculate the frame address) or saves a 1415 register to the stack. If INSN is NULL_RTX, initialize our state. */ 1416 1417void 1418dwarf2out_frame_debug (insn) 1419 rtx insn; 1420{ 1421 char *label; 1422 rtx src; 1423 1424 if (insn == NULL_RTX) 1425 { 1426 /* Set up state for generating call frame debug info. */ 1427 lookup_cfa (&cfa_reg, &cfa_offset); 1428 if (cfa_reg != DWARF_FRAME_REGNUM (STACK_POINTER_REGNUM)) 1429 abort (); 1430 cfa_reg = STACK_POINTER_REGNUM; 1431 cfa_store_reg = cfa_reg; 1432 cfa_store_offset = cfa_offset; 1433 cfa_temp_reg = -1; 1434 cfa_temp_value = 0; 1435 return; |
1436 }
|
1437 1438 if (! RTX_FRAME_RELATED_P (insn)) 1439 { 1440 dwarf2out_stack_adjust (insn); 1441 return; 1442 } 1443 1444 label = dwarf2out_cfi_label (); 1445 1446 src = find_reg_note (insn, REG_FRAME_RELATED_EXPR, NULL_RTX); 1447 if (src) 1448 insn = XEXP (src, 0); 1449 else 1450 insn = PATTERN (insn); 1451 1452 dwarf2out_frame_debug_expr (insn, label); |
1453} 1454 1455/* Return the size of an unsigned LEB128 quantity. */ 1456 1457static inline unsigned long 1458size_of_uleb128 (value) 1459 register unsigned long value; 1460{ 1461 register unsigned long size = 0; 1462 register unsigned byte; 1463 1464 do 1465 { 1466 byte = (value & 0x7f); 1467 value >>= 7; 1468 size += 1; 1469 } 1470 while (value != 0); 1471 1472 return size; 1473} 1474 1475/* Return the size of a signed LEB128 quantity. */ 1476 1477static inline unsigned long 1478size_of_sleb128 (value) 1479 register long value; 1480{ 1481 register unsigned long size = 0; 1482 register unsigned byte; 1483 1484 do 1485 { 1486 byte = (value & 0x7f); 1487 value >>= 7; 1488 size += 1; 1489 } 1490 while (!(((value == 0) && ((byte & 0x40) == 0)) 1491 || ((value == -1) && ((byte & 0x40) != 0)))); 1492 1493 return size; 1494} 1495 1496/* Output an unsigned LEB128 quantity. */ 1497 1498static void 1499output_uleb128 (value) 1500 register unsigned long value; 1501{ 1502 unsigned long save_value = value; 1503 1504 fprintf (asm_out_file, "\t%s\t", ASM_BYTE_OP); 1505 do 1506 { 1507 register unsigned byte = (value & 0x7f); 1508 value >>= 7; 1509 if (value != 0) 1510 /* More bytes to follow. */ 1511 byte |= 0x80; 1512 1513 fprintf (asm_out_file, "0x%x", byte); 1514 if (value != 0) 1515 fprintf (asm_out_file, ","); 1516 } 1517 while (value != 0); 1518 1519 if (flag_debug_asm) 1520 fprintf (asm_out_file, "\t%s ULEB128 0x%lx", ASM_COMMENT_START, save_value); 1521} 1522 1523/* Output an signed LEB128 quantity. */ 1524 1525static void 1526output_sleb128 (value) 1527 register long value; 1528{ 1529 register int more; 1530 register unsigned byte; 1531 long save_value = value; 1532 1533 fprintf (asm_out_file, "\t%s\t", ASM_BYTE_OP); 1534 do 1535 { 1536 byte = (value & 0x7f); 1537 /* arithmetic shift */ 1538 value >>= 7; 1539 more = !((((value == 0) && ((byte & 0x40) == 0)) 1540 || ((value == -1) && ((byte & 0x40) != 0)))); 1541 if (more) 1542 byte |= 0x80; 1543 1544 fprintf (asm_out_file, "0x%x", byte); 1545 if (more) 1546 fprintf (asm_out_file, ","); 1547 } 1548 1549 while (more); 1550 if (flag_debug_asm) 1551 fprintf (asm_out_file, "\t%s SLEB128 %ld", ASM_COMMENT_START, save_value); 1552} 1553 1554/* Output a Call Frame Information opcode and its operand(s). */ 1555 1556static void 1557output_cfi (cfi, fde) 1558 register dw_cfi_ref cfi; 1559 register dw_fde_ref fde; 1560{ 1561 if (cfi->dw_cfi_opc == DW_CFA_advance_loc) 1562 { 1563 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 1564 cfi->dw_cfi_opc 1565 | (cfi->dw_cfi_oprnd1.dw_cfi_offset & 0x3f)); 1566 if (flag_debug_asm) 1567 fprintf (asm_out_file, "\t%s DW_CFA_advance_loc 0x%lx", 1568 ASM_COMMENT_START, cfi->dw_cfi_oprnd1.dw_cfi_offset); 1569 fputc ('\n', asm_out_file); 1570 } 1571 1572 else if (cfi->dw_cfi_opc == DW_CFA_offset) 1573 { 1574 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 1575 cfi->dw_cfi_opc 1576 | (cfi->dw_cfi_oprnd1.dw_cfi_reg_num & 0x3f)); 1577 if (flag_debug_asm) 1578 fprintf (asm_out_file, "\t%s DW_CFA_offset, column 0x%lx", 1579 ASM_COMMENT_START, cfi->dw_cfi_oprnd1.dw_cfi_reg_num); 1580 1581 fputc ('\n', asm_out_file); 1582 output_uleb128 (cfi->dw_cfi_oprnd2.dw_cfi_offset); 1583 fputc ('\n', asm_out_file); 1584 } 1585 else if (cfi->dw_cfi_opc == DW_CFA_restore) 1586 { 1587 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 1588 cfi->dw_cfi_opc 1589 | (cfi->dw_cfi_oprnd1.dw_cfi_reg_num & 0x3f)); 1590 if (flag_debug_asm) 1591 fprintf (asm_out_file, "\t%s DW_CFA_restore, column 0x%lx", 1592 ASM_COMMENT_START, cfi->dw_cfi_oprnd1.dw_cfi_reg_num); 1593 1594 fputc ('\n', asm_out_file); 1595 } 1596 else 1597 { 1598 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, cfi->dw_cfi_opc); 1599 if (flag_debug_asm) 1600 fprintf (asm_out_file, "\t%s %s", ASM_COMMENT_START, 1601 dwarf_cfi_name (cfi->dw_cfi_opc)); 1602 1603 fputc ('\n', asm_out_file); 1604 switch (cfi->dw_cfi_opc) 1605 { 1606 case DW_CFA_set_loc: 1607 ASM_OUTPUT_DWARF_ADDR (asm_out_file, cfi->dw_cfi_oprnd1.dw_cfi_addr); 1608 fputc ('\n', asm_out_file); 1609 break; 1610 case DW_CFA_advance_loc1: 1611 ASM_OUTPUT_DWARF_DELTA1 (asm_out_file, 1612 cfi->dw_cfi_oprnd1.dw_cfi_addr, 1613 fde->dw_fde_current_label); 1614 fputc ('\n', asm_out_file); 1615 fde->dw_fde_current_label = cfi->dw_cfi_oprnd1.dw_cfi_addr; 1616 break; 1617 case DW_CFA_advance_loc2: 1618 ASM_OUTPUT_DWARF_DELTA2 (asm_out_file, 1619 cfi->dw_cfi_oprnd1.dw_cfi_addr, 1620 fde->dw_fde_current_label); 1621 fputc ('\n', asm_out_file); 1622 fde->dw_fde_current_label = cfi->dw_cfi_oprnd1.dw_cfi_addr; 1623 break; 1624 case DW_CFA_advance_loc4: 1625 ASM_OUTPUT_DWARF_DELTA4 (asm_out_file, 1626 cfi->dw_cfi_oprnd1.dw_cfi_addr, 1627 fde->dw_fde_current_label); 1628 fputc ('\n', asm_out_file); 1629 fde->dw_fde_current_label = cfi->dw_cfi_oprnd1.dw_cfi_addr; 1630 break; 1631#ifdef MIPS_DEBUGGING_INFO 1632 case DW_CFA_MIPS_advance_loc8: 1633 /* TODO: not currently implemented. */ 1634 abort (); 1635 break; 1636#endif 1637 case DW_CFA_offset_extended: 1638 case DW_CFA_def_cfa: 1639 output_uleb128 (cfi->dw_cfi_oprnd1.dw_cfi_reg_num); 1640 fputc ('\n', asm_out_file); 1641 output_uleb128 (cfi->dw_cfi_oprnd2.dw_cfi_offset); 1642 fputc ('\n', asm_out_file); 1643 break; 1644 case DW_CFA_restore_extended: 1645 case DW_CFA_undefined: 1646 output_uleb128 (cfi->dw_cfi_oprnd1.dw_cfi_reg_num); 1647 fputc ('\n', asm_out_file); 1648 break; 1649 case DW_CFA_same_value: 1650 case DW_CFA_def_cfa_register: 1651 output_uleb128 (cfi->dw_cfi_oprnd1.dw_cfi_reg_num); 1652 fputc ('\n', asm_out_file); 1653 break; 1654 case DW_CFA_register: 1655 output_uleb128 (cfi->dw_cfi_oprnd1.dw_cfi_reg_num); 1656 fputc ('\n', asm_out_file); 1657 output_uleb128 (cfi->dw_cfi_oprnd2.dw_cfi_reg_num); 1658 fputc ('\n', asm_out_file); 1659 break; 1660 case DW_CFA_def_cfa_offset: 1661 output_uleb128 (cfi->dw_cfi_oprnd1.dw_cfi_offset); 1662 fputc ('\n', asm_out_file); 1663 break; 1664 case DW_CFA_GNU_window_save: 1665 break; 1666 case DW_CFA_GNU_args_size: 1667 output_uleb128 (cfi->dw_cfi_oprnd1.dw_cfi_offset); 1668 fputc ('\n', asm_out_file); 1669 break; 1670 default: 1671 break; 1672 } 1673 } 1674} 1675 1676#if !defined (EH_FRAME_SECTION) 1677#if defined (EH_FRAME_SECTION_ASM_OP) 1678#define EH_FRAME_SECTION() eh_frame_section(); 1679#else 1680#if defined (ASM_OUTPUT_SECTION_NAME) 1681#define EH_FRAME_SECTION() \ 1682 do { \ 1683 named_section (NULL_TREE, ".eh_frame", 0); \ 1684 } while (0) 1685#endif 1686#endif 1687#endif 1688 1689/* If we aren't using crtstuff to run ctors, don't use it for EH. */ 1690#if !defined (HAS_INIT_SECTION) && !defined (INIT_SECTION_ASM_OP) 1691#undef EH_FRAME_SECTION 1692#endif 1693 1694/* Output the call frame information used to used to record information 1695 that relates to calculating the frame pointer, and records the 1696 location of saved registers. */ 1697 1698static void 1699output_call_frame_info (for_eh) 1700 int for_eh; 1701{ 1702 register unsigned long i; 1703 register dw_fde_ref fde; 1704 register dw_cfi_ref cfi; 1705 char l1[20], l2[20]; 1706#ifdef ASM_OUTPUT_DEFINE_LABEL_DIFFERENCE_SYMBOL 1707 char ld[20]; 1708#endif 1709 1710 /* Do we want to include a pointer to the exception table? */ 1711 int eh_ptr = for_eh && exception_table_p (); 1712 1713 fputc ('\n', asm_out_file); 1714 1715 /* We're going to be generating comments, so turn on app. */ 1716 if (flag_debug_asm) 1717 app_enable (); 1718 1719 if (for_eh) 1720 { 1721#ifdef EH_FRAME_SECTION 1722 EH_FRAME_SECTION (); 1723#else 1724 tree label = get_file_function_name ('F'); 1725
|
1668 data_section ();
|
1726 force_data_section (); |
1727 ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (PTR_SIZE)); 1728 ASM_GLOBALIZE_LABEL (asm_out_file, IDENTIFIER_POINTER (label)); 1729 ASM_OUTPUT_LABEL (asm_out_file, IDENTIFIER_POINTER (label)); 1730#endif 1731 assemble_label ("__FRAME_BEGIN__"); 1732 } 1733 else 1734 ASM_OUTPUT_SECTION (asm_out_file, FRAME_SECTION); 1735 1736 /* Output the CIE. */ 1737 ASM_GENERATE_INTERNAL_LABEL (l1, CIE_AFTER_SIZE_LABEL, for_eh); 1738 ASM_GENERATE_INTERNAL_LABEL (l2, CIE_END_LABEL, for_eh); 1739#ifdef ASM_OUTPUT_DEFINE_LABEL_DIFFERENCE_SYMBOL 1740 ASM_GENERATE_INTERNAL_LABEL (ld, CIE_LENGTH_LABEL, for_eh); 1741 if (for_eh) 1742 ASM_OUTPUT_DWARF_OFFSET4 (asm_out_file, ld); 1743 else 1744 ASM_OUTPUT_DWARF_OFFSET (asm_out_file, ld); 1745#else 1746 if (for_eh) 1747 ASM_OUTPUT_DWARF_DELTA4 (asm_out_file, l2, l1); 1748 else 1749 ASM_OUTPUT_DWARF_DELTA (asm_out_file, l2, l1); 1750#endif 1751 if (flag_debug_asm) 1752 fprintf (asm_out_file, "\t%s Length of Common Information Entry", 1753 ASM_COMMENT_START); 1754 1755 fputc ('\n', asm_out_file); 1756 ASM_OUTPUT_LABEL (asm_out_file, l1); 1757 1758 if (for_eh) 1759 /* Now that the CIE pointer is PC-relative for EH, 1760 use 0 to identify the CIE. */ 1761 ASM_OUTPUT_DWARF_DATA4 (asm_out_file, 0); 1762 else 1763 ASM_OUTPUT_DWARF_DATA4 (asm_out_file, DW_CIE_ID); 1764 1765 if (flag_debug_asm) 1766 fprintf (asm_out_file, "\t%s CIE Identifier Tag", ASM_COMMENT_START); 1767 1768 fputc ('\n', asm_out_file); 1769 if (! for_eh && DWARF_OFFSET_SIZE == 8) 1770 { 1771 ASM_OUTPUT_DWARF_DATA4 (asm_out_file, DW_CIE_ID); 1772 fputc ('\n', asm_out_file); 1773 } 1774 1775 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_CIE_VERSION); 1776 if (flag_debug_asm) 1777 fprintf (asm_out_file, "\t%s CIE Version", ASM_COMMENT_START); 1778 1779 fputc ('\n', asm_out_file); 1780 if (eh_ptr) 1781 { 1782 /* The CIE contains a pointer to the exception region info for the 1783 frame. Make the augmentation string three bytes (including the 1784 trailing null) so the pointer is 4-byte aligned. The Solaris ld 1785 can't handle unaligned relocs. */ 1786 if (flag_debug_asm) 1787 { 1788 ASM_OUTPUT_DWARF_STRING (asm_out_file, "eh"); 1789 fprintf (asm_out_file, "\t%s CIE Augmentation", ASM_COMMENT_START); 1790 } 1791 else 1792 { 1793 ASM_OUTPUT_ASCII (asm_out_file, "eh", 3); 1794 } 1795 fputc ('\n', asm_out_file); 1796 1797 ASM_OUTPUT_DWARF_ADDR (asm_out_file, "__EXCEPTION_TABLE__"); 1798 if (flag_debug_asm) 1799 fprintf (asm_out_file, "\t%s pointer to exception region info", 1800 ASM_COMMENT_START); 1801 } 1802 else 1803 { 1804 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 0); 1805 if (flag_debug_asm) 1806 fprintf (asm_out_file, "\t%s CIE Augmentation (none)", 1807 ASM_COMMENT_START); 1808 } 1809 1810 fputc ('\n', asm_out_file); 1811 output_uleb128 (1); 1812 if (flag_debug_asm) 1813 fprintf (asm_out_file, " (CIE Code Alignment Factor)"); 1814 1815 fputc ('\n', asm_out_file); 1816 output_sleb128 (DWARF_CIE_DATA_ALIGNMENT); 1817 if (flag_debug_asm) 1818 fprintf (asm_out_file, " (CIE Data Alignment Factor)"); 1819 1820 fputc ('\n', asm_out_file); 1821 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DWARF_FRAME_RETURN_COLUMN); 1822 if (flag_debug_asm) 1823 fprintf (asm_out_file, "\t%s CIE RA Column", ASM_COMMENT_START); 1824 1825 fputc ('\n', asm_out_file); 1826 1827 for (cfi = cie_cfi_head; cfi != NULL; cfi = cfi->dw_cfi_next) 1828 output_cfi (cfi, NULL); 1829 1830 /* Pad the CIE out to an address sized boundary. */ 1831 ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (PTR_SIZE)); 1832 ASM_OUTPUT_LABEL (asm_out_file, l2); 1833#ifdef ASM_OUTPUT_DEFINE_LABEL_DIFFERENCE_SYMBOL 1834 ASM_OUTPUT_DEFINE_LABEL_DIFFERENCE_SYMBOL (asm_out_file, ld, l2, l1); 1835 if (flag_debug_asm) 1836 fprintf (asm_out_file, "\t%s CIE Length Symbol", ASM_COMMENT_START); 1837 fputc ('\n', asm_out_file); 1838#endif 1839 1840 /* Loop through all of the FDE's. */ 1841 for (i = 0; i < fde_table_in_use; ++i) 1842 { 1843 fde = &fde_table[i]; 1844 1845 ASM_GENERATE_INTERNAL_LABEL (l1, FDE_AFTER_SIZE_LABEL, for_eh + i*2); 1846 ASM_GENERATE_INTERNAL_LABEL (l2, FDE_END_LABEL, for_eh + i*2); 1847#ifdef ASM_OUTPUT_DEFINE_LABEL_DIFFERENCE_SYMBOL 1848 ASM_GENERATE_INTERNAL_LABEL (ld, FDE_LENGTH_LABEL, for_eh + i*2); 1849 if (for_eh) 1850 ASM_OUTPUT_DWARF_OFFSET4 (asm_out_file, ld); 1851 else 1852 ASM_OUTPUT_DWARF_OFFSET (asm_out_file, ld); 1853#else 1854 if (for_eh) 1855 ASM_OUTPUT_DWARF_DELTA4 (asm_out_file, l2, l1); 1856 else 1857 ASM_OUTPUT_DWARF_DELTA (asm_out_file, l2, l1); 1858#endif 1859 if (flag_debug_asm) 1860 fprintf (asm_out_file, "\t%s FDE Length", ASM_COMMENT_START); 1861 fputc ('\n', asm_out_file); 1862 ASM_OUTPUT_LABEL (asm_out_file, l1); 1863
|
1864 /* ??? This always emits a 4 byte offset when for_eh is true, but it 1865 emits a target dependent sized offset when for_eh is not true. 1866 This inconsistency may confuse gdb. The only case where we need a 1867 non-4 byte offset is for the Irix6 N64 ABI, so we may lose SGI 1868 compatibility if we emit a 4 byte offset. We need a 4 byte offset 1869 though in order to be compatible with the dwarf_fde struct in frame.c. 1870 If the for_eh case is changed, then the struct in frame.c has 1871 to be adjusted appropriately. */ |
1872 if (for_eh)
|
1807 ASM_OUTPUT_DWARF_DELTA (asm_out_file, l1, "__FRAME_BEGIN__");
|
1873 ASM_OUTPUT_DWARF_DELTA4 (asm_out_file, l1, "__FRAME_BEGIN__"); |
1874 else 1875 ASM_OUTPUT_DWARF_OFFSET (asm_out_file, stripattributes (FRAME_SECTION)); 1876 if (flag_debug_asm) 1877 fprintf (asm_out_file, "\t%s FDE CIE offset", ASM_COMMENT_START); 1878 1879 fputc ('\n', asm_out_file); 1880 ASM_OUTPUT_DWARF_ADDR (asm_out_file, fde->dw_fde_begin); 1881 if (flag_debug_asm) 1882 fprintf (asm_out_file, "\t%s FDE initial location", ASM_COMMENT_START); 1883 1884 fputc ('\n', asm_out_file); 1885 ASM_OUTPUT_DWARF_ADDR_DELTA (asm_out_file, 1886 fde->dw_fde_end, fde->dw_fde_begin); 1887 if (flag_debug_asm) 1888 fprintf (asm_out_file, "\t%s FDE address range", ASM_COMMENT_START); 1889 1890 fputc ('\n', asm_out_file); 1891 1892 /* Loop through the Call Frame Instructions associated with 1893 this FDE. */ 1894 fde->dw_fde_current_label = fde->dw_fde_begin; 1895 for (cfi = fde->dw_fde_cfi; cfi != NULL; cfi = cfi->dw_cfi_next) 1896 output_cfi (cfi, fde); 1897 1898 /* Pad the FDE out to an address sized boundary. */ 1899 ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (PTR_SIZE)); 1900 ASM_OUTPUT_LABEL (asm_out_file, l2); 1901#ifdef ASM_OUTPUT_DEFINE_LABEL_DIFFERENCE_SYMBOL 1902 ASM_OUTPUT_DEFINE_LABEL_DIFFERENCE_SYMBOL (asm_out_file, ld, l2, l1); 1903 if (flag_debug_asm) 1904 fprintf (asm_out_file, "\t%s FDE Length Symbol", ASM_COMMENT_START); 1905 fputc ('\n', asm_out_file); 1906#endif 1907 } 1908#ifndef EH_FRAME_SECTION 1909 if (for_eh) 1910 { 1911 /* Emit terminating zero for table. */ 1912 ASM_OUTPUT_DWARF_DATA4 (asm_out_file, 0); 1913 fputc ('\n', asm_out_file); 1914 } 1915#endif 1916#ifdef MIPS_DEBUGGING_INFO 1917 /* Work around Irix 6 assembler bug whereby labels at the end of a section 1918 get a value of 0. Putting .align 0 after the label fixes it. */ 1919 ASM_OUTPUT_ALIGN (asm_out_file, 0); 1920#endif 1921 1922 /* Turn off app to make assembly quicker. */ 1923 if (flag_debug_asm) 1924 app_disable (); 1925} 1926 1927/* Output a marker (i.e. a label) for the beginning of a function, before 1928 the prologue. */ 1929 1930void 1931dwarf2out_begin_prologue () 1932{ 1933 char label[MAX_ARTIFICIAL_LABEL_BYTES]; 1934 register dw_fde_ref fde; 1935 1936 ++current_funcdef_number; 1937 1938 function_section (current_function_decl); 1939 ASM_GENERATE_INTERNAL_LABEL (label, FUNC_BEGIN_LABEL, 1940 current_funcdef_number); 1941 ASM_OUTPUT_LABEL (asm_out_file, label); 1942 1943 /* Expand the fde table if necessary. */ 1944 if (fde_table_in_use == fde_table_allocated) 1945 { 1946 fde_table_allocated += FDE_TABLE_INCREMENT; 1947 fde_table 1948 = (dw_fde_ref) xrealloc (fde_table, 1949 fde_table_allocated * sizeof (dw_fde_node)); 1950 } 1951 1952 /* Record the FDE associated with this function. */ 1953 current_funcdef_fde = fde_table_in_use; 1954 1955 /* Add the new FDE at the end of the fde_table. */ 1956 fde = &fde_table[fde_table_in_use++]; 1957 fde->dw_fde_begin = xstrdup (label); 1958 fde->dw_fde_current_label = NULL; 1959 fde->dw_fde_end = NULL; 1960 fde->dw_fde_cfi = NULL; 1961 1962 args_size = old_args_size = 0; 1963} 1964 1965/* Output a marker (i.e. a label) for the absolute end of the generated code 1966 for a function definition. This gets called *after* the epilogue code has 1967 been generated. */ 1968 1969void 1970dwarf2out_end_epilogue () 1971{ 1972 dw_fde_ref fde; 1973 char label[MAX_ARTIFICIAL_LABEL_BYTES]; 1974 1975 /* Output a label to mark the endpoint of the code generated for this 1976 function. */ 1977 ASM_GENERATE_INTERNAL_LABEL (label, FUNC_END_LABEL, current_funcdef_number); 1978 ASM_OUTPUT_LABEL (asm_out_file, label); 1979 fde = &fde_table[fde_table_in_use - 1]; 1980 fde->dw_fde_end = xstrdup (label); 1981} 1982 1983void 1984dwarf2out_frame_init () 1985{ 1986 /* Allocate the initial hunk of the fde_table. */ 1987 fde_table 1988 = (dw_fde_ref) xmalloc (FDE_TABLE_INCREMENT * sizeof (dw_fde_node)); 1989 bzero ((char *) fde_table, FDE_TABLE_INCREMENT * sizeof (dw_fde_node)); 1990 fde_table_allocated = FDE_TABLE_INCREMENT; 1991 fde_table_in_use = 0; 1992 1993 /* Generate the CFA instructions common to all FDE's. Do it now for the 1994 sake of lookup_cfa. */ 1995 1996#ifdef DWARF2_UNWIND_INFO 1997 /* On entry, the Canonical Frame Address is at SP. */ 1998 dwarf2out_def_cfa (NULL, STACK_POINTER_REGNUM, INCOMING_FRAME_SP_OFFSET); 1999 initial_return_save (INCOMING_RETURN_ADDR_RTX); 2000#endif 2001} 2002 2003void 2004dwarf2out_frame_finish () 2005{ 2006 /* Output call frame information. */ 2007#ifdef MIPS_DEBUGGING_INFO 2008 if (write_symbols == DWARF2_DEBUG) 2009 output_call_frame_info (0); 2010 if (flag_exceptions && ! exceptions_via_longjmp) 2011 output_call_frame_info (1); 2012#else 2013 if (write_symbols == DWARF2_DEBUG 2014 || (flag_exceptions && ! exceptions_via_longjmp)) 2015 output_call_frame_info (1); 2016#endif 2017} 2018 2019#endif /* .debug_frame support */ 2020 2021/* And now, the support for symbolic debugging information. */ 2022#ifdef DWARF2_DEBUGGING_INFO 2023 2024extern char *getpwd PROTO((void)); 2025 2026/* NOTE: In the comments in this file, many references are made to 2027 "Debugging Information Entries". This term is abbreviated as `DIE' 2028 throughout the remainder of this file. */ 2029 2030/* An internal representation of the DWARF output is built, and then 2031 walked to generate the DWARF debugging info. The walk of the internal 2032 representation is done after the entire program has been compiled. 2033 The types below are used to describe the internal representation. */ 2034 2035/* Each DIE may have a series of attribute/value pairs. Values 2036 can take on several forms. The forms that are used in this 2037 implementation are listed below. */ 2038 2039typedef enum 2040{ 2041 dw_val_class_addr, 2042 dw_val_class_loc, 2043 dw_val_class_const, 2044 dw_val_class_unsigned_const, 2045 dw_val_class_long_long, 2046 dw_val_class_float, 2047 dw_val_class_flag, 2048 dw_val_class_die_ref, 2049 dw_val_class_fde_ref, 2050 dw_val_class_lbl_id,
|
1985 dw_val_class_section_offset,
|
2051 dw_val_class_lbl_offset, |
2052 dw_val_class_str 2053} 2054dw_val_class; 2055 2056/* Various DIE's use offsets relative to the beginning of the 2057 .debug_info section to refer to each other. */ 2058 2059typedef long int dw_offset; 2060 2061/* Define typedefs here to avoid circular dependencies. */ 2062 2063typedef struct die_struct *dw_die_ref; 2064typedef struct dw_attr_struct *dw_attr_ref; 2065typedef struct dw_val_struct *dw_val_ref; 2066typedef struct dw_line_info_struct *dw_line_info_ref; 2067typedef struct dw_separate_line_info_struct *dw_separate_line_info_ref; 2068typedef struct dw_loc_descr_struct *dw_loc_descr_ref; 2069typedef struct pubname_struct *pubname_ref; 2070typedef dw_die_ref *arange_ref; 2071 2072/* Describe a double word constant value. */ 2073 2074typedef struct dw_long_long_struct 2075{ 2076 unsigned long hi; 2077 unsigned long low; 2078} 2079dw_long_long_const; 2080 2081/* Describe a floating point constant value. */ 2082 2083typedef struct dw_fp_struct 2084{ 2085 long *array; 2086 unsigned length; 2087} 2088dw_float_const; 2089 2090/* Each entry in the line_info_table maintains the file and 2091 line number associated with the label generated for that 2092 entry. The label gives the PC value associated with 2093 the line number entry. */ 2094 2095typedef struct dw_line_info_struct 2096{ 2097 unsigned long dw_file_num; 2098 unsigned long dw_line_num; 2099} 2100dw_line_info_entry; 2101 2102/* Line information for functions in separate sections; each one gets its 2103 own sequence. */ 2104typedef struct dw_separate_line_info_struct 2105{ 2106 unsigned long dw_file_num; 2107 unsigned long dw_line_num; 2108 unsigned long function; 2109} 2110dw_separate_line_info_entry; 2111 2112/* The dw_val_node describes an attribute's value, as it is 2113 represented internally. */ 2114 2115typedef struct dw_val_struct 2116{ 2117 dw_val_class val_class; 2118 union 2119 { 2120 char *val_addr; 2121 dw_loc_descr_ref val_loc; 2122 long int val_int; 2123 long unsigned val_unsigned; 2124 dw_long_long_const val_long_long; 2125 dw_float_const val_float; 2126 dw_die_ref val_die_ref; 2127 unsigned val_fde_index; 2128 char *val_str; 2129 char *val_lbl_id;
|
2064 char *val_section;
|
2130 unsigned char val_flag; 2131 } 2132 v; 2133} 2134dw_val_node; 2135 2136/* Locations in memory are described using a sequence of stack machine 2137 operations. */ 2138 2139typedef struct dw_loc_descr_struct 2140{ 2141 dw_loc_descr_ref dw_loc_next; 2142 enum dwarf_location_atom dw_loc_opc; 2143 dw_val_node dw_loc_oprnd1; 2144 dw_val_node dw_loc_oprnd2; 2145} 2146dw_loc_descr_node; 2147 2148/* Each DIE attribute has a field specifying the attribute kind, 2149 a link to the next attribute in the chain, and an attribute value. 2150 Attributes are typically linked below the DIE they modify. */ 2151 2152typedef struct dw_attr_struct 2153{ 2154 enum dwarf_attribute dw_attr; 2155 dw_attr_ref dw_attr_next; 2156 dw_val_node dw_attr_val; 2157} 2158dw_attr_node; 2159 2160/* The Debugging Information Entry (DIE) structure */ 2161 2162typedef struct die_struct 2163{ 2164 enum dwarf_tag die_tag; 2165 dw_attr_ref die_attr; 2166 dw_attr_ref die_attr_last; 2167 dw_die_ref die_parent; 2168 dw_die_ref die_child; 2169 dw_die_ref die_child_last; 2170 dw_die_ref die_sib; 2171 dw_offset die_offset; 2172 unsigned long die_abbrev; 2173} 2174die_node; 2175 2176/* The pubname structure */ 2177 2178typedef struct pubname_struct 2179{ 2180 dw_die_ref die; 2181 char * name; 2182} 2183pubname_entry; 2184 2185/* The limbo die list structure. */ 2186typedef struct limbo_die_struct 2187{ 2188 dw_die_ref die; 2189 struct limbo_die_struct *next; 2190} 2191limbo_die_node; 2192 2193/* How to start an assembler comment. */ 2194#ifndef ASM_COMMENT_START 2195#define ASM_COMMENT_START ";#" 2196#endif 2197 2198/* Define a macro which returns non-zero for a TYPE_DECL which was 2199 implicitly generated for a tagged type. 2200 2201 Note that unlike the gcc front end (which generates a NULL named 2202 TYPE_DECL node for each complete tagged type, each array type, and 2203 each function type node created) the g++ front end generates a 2204 _named_ TYPE_DECL node for each tagged type node created. 2205 These TYPE_DECLs have DECL_ARTIFICIAL set, so we know not to 2206 generate a DW_TAG_typedef DIE for them. */ 2207 2208#define TYPE_DECL_IS_STUB(decl) \ 2209 (DECL_NAME (decl) == NULL_TREE \ 2210 || (DECL_ARTIFICIAL (decl) \ 2211 && is_tagged_type (TREE_TYPE (decl)) \ 2212 && ((decl == TYPE_STUB_DECL (TREE_TYPE (decl))) \ 2213 /* This is necessary for stub decls that \ 2214 appear in nested inline functions. */ \ 2215 || (DECL_ABSTRACT_ORIGIN (decl) != NULL_TREE \ 2216 && (decl_ultimate_origin (decl) \ 2217 == TYPE_STUB_DECL (TREE_TYPE (decl))))))) 2218 2219/* Information concerning the compilation unit's programming 2220 language, and compiler version. */ 2221 2222extern int flag_traditional; 2223extern char *version_string; 2224extern char *language_string; 2225 2226/* Fixed size portion of the DWARF compilation unit header. */ 2227#define DWARF_COMPILE_UNIT_HEADER_SIZE (2 * DWARF_OFFSET_SIZE + 3) 2228 2229/* Fixed size portion of debugging line information prolog. */ 2230#define DWARF_LINE_PROLOG_HEADER_SIZE 5 2231 2232/* Fixed size portion of public names info. */ 2233#define DWARF_PUBNAMES_HEADER_SIZE (2 * DWARF_OFFSET_SIZE + 2) 2234 2235/* Fixed size portion of the address range info. */ 2236#define DWARF_ARANGES_HEADER_SIZE \ 2237 (DWARF_ROUND (2 * DWARF_OFFSET_SIZE + 4, PTR_SIZE * 2) - DWARF_OFFSET_SIZE) 2238 2239/* Define the architecture-dependent minimum instruction length (in bytes). 2240 In this implementation of DWARF, this field is used for information 2241 purposes only. Since GCC generates assembly language, we have 2242 no a priori knowledge of how many instruction bytes are generated 2243 for each source line, and therefore can use only the DW_LNE_set_address 2244 and DW_LNS_fixed_advance_pc line information commands. */ 2245 2246#ifndef DWARF_LINE_MIN_INSTR_LENGTH 2247#define DWARF_LINE_MIN_INSTR_LENGTH 4 2248#endif 2249 2250/* Minimum line offset in a special line info. opcode. 2251 This value was chosen to give a reasonable range of values. */ 2252#define DWARF_LINE_BASE -10 2253 2254/* First special line opcde - leave room for the standard opcodes. */ 2255#define DWARF_LINE_OPCODE_BASE 10 2256 2257/* Range of line offsets in a special line info. opcode. */ 2258#define DWARF_LINE_RANGE (254-DWARF_LINE_OPCODE_BASE+1) 2259 2260/* Flag that indicates the initial value of the is_stmt_start flag. 2261 In the present implementation, we do not mark any lines as 2262 the beginning of a source statement, because that information 2263 is not made available by the GCC front-end. */ 2264#define DWARF_LINE_DEFAULT_IS_STMT_START 1 2265 2266/* This location is used by calc_die_sizes() to keep track 2267 the offset of each DIE within the .debug_info section. */ 2268static unsigned long next_die_offset; 2269 2270/* Record the root of the DIE's built for the current compilation unit. */ 2271static dw_die_ref comp_unit_die; 2272 2273/* A list of DIEs with a NULL parent waiting to be relocated. */ 2274static limbo_die_node *limbo_die_list = 0; 2275 2276/* Pointer to an array of filenames referenced by this compilation unit. */ 2277static char **file_table; 2278 2279/* Total number of entries in the table (i.e. array) pointed to by 2280 `file_table'. This is the *total* and includes both used and unused 2281 slots. */ 2282static unsigned file_table_allocated; 2283 2284/* Number of entries in the file_table which are actually in use. */ 2285static unsigned file_table_in_use; 2286 2287/* Size (in elements) of increments by which we may expand the filename 2288 table. */ 2289#define FILE_TABLE_INCREMENT 64 2290 2291/* Local pointer to the name of the main input file. Initialized in 2292 dwarf2out_init. */ 2293static char *primary_filename; 2294 2295/* For Dwarf output, we must assign lexical-blocks id numbers in the order in 2296 which their beginnings are encountered. We output Dwarf debugging info 2297 that refers to the beginnings and ends of the ranges of code for each 2298 lexical block. The labels themselves are generated in final.c, which 2299 assigns numbers to the blocks in the same way. */ 2300static unsigned next_block_number = 2; 2301 2302/* A pointer to the base of a table of references to DIE's that describe 2303 declarations. The table is indexed by DECL_UID() which is a unique 2304 number identifying each decl. */ 2305static dw_die_ref *decl_die_table; 2306 2307/* Number of elements currently allocated for the decl_die_table. */ 2308static unsigned decl_die_table_allocated; 2309 2310/* Number of elements in decl_die_table currently in use. */ 2311static unsigned decl_die_table_in_use; 2312 2313/* Size (in elements) of increments by which we may expand the 2314 decl_die_table. */ 2315#define DECL_DIE_TABLE_INCREMENT 256 2316 2317/* Structure used for the decl_scope table. scope is the current declaration 2318 scope, and previous is the entry that is the parent of this scope. This 2319 is usually but not always the immediately preceeding entry. */ 2320 2321typedef struct decl_scope_struct 2322{ 2323 tree scope; 2324 int previous; 2325} 2326decl_scope_node; 2327 2328/* A pointer to the base of a table of references to declaration 2329 scopes. This table is a display which tracks the nesting 2330 of declaration scopes at the current scope and containing 2331 scopes. This table is used to find the proper place to 2332 define type declaration DIE's. */ 2333static decl_scope_node *decl_scope_table; 2334 2335/* Number of elements currently allocated for the decl_scope_table. */ 2336static int decl_scope_table_allocated; 2337 2338/* Current level of nesting of declaration scopes. */ 2339static int decl_scope_depth; 2340 2341/* Size (in elements) of increments by which we may expand the 2342 decl_scope_table. */ 2343#define DECL_SCOPE_TABLE_INCREMENT 64 2344 2345/* A pointer to the base of a list of references to DIE's that 2346 are uniquely identified by their tag, presence/absence of 2347 children DIE's, and list of attribute/value pairs. */ 2348static dw_die_ref *abbrev_die_table; 2349 2350/* Number of elements currently allocated for abbrev_die_table. */ 2351static unsigned abbrev_die_table_allocated; 2352 2353/* Number of elements in type_die_table currently in use. */ 2354static unsigned abbrev_die_table_in_use; 2355 2356/* Size (in elements) of increments by which we may expand the 2357 abbrev_die_table. */ 2358#define ABBREV_DIE_TABLE_INCREMENT 256 2359 2360/* A pointer to the base of a table that contains line information 2361 for each source code line in .text in the compilation unit. */ 2362static dw_line_info_ref line_info_table; 2363 2364/* Number of elements currently allocated for line_info_table. */ 2365static unsigned line_info_table_allocated; 2366 2367/* Number of elements in separate_line_info_table currently in use. */ 2368static unsigned separate_line_info_table_in_use; 2369 2370/* A pointer to the base of a table that contains line information 2371 for each source code line outside of .text in the compilation unit. */ 2372static dw_separate_line_info_ref separate_line_info_table; 2373 2374/* Number of elements currently allocated for separate_line_info_table. */ 2375static unsigned separate_line_info_table_allocated; 2376 2377/* Number of elements in line_info_table currently in use. */ 2378static unsigned line_info_table_in_use; 2379 2380/* Size (in elements) of increments by which we may expand the 2381 line_info_table. */ 2382#define LINE_INFO_TABLE_INCREMENT 1024 2383 2384/* A pointer to the base of a table that contains a list of publicly 2385 accessible names. */ 2386static pubname_ref pubname_table; 2387 2388/* Number of elements currently allocated for pubname_table. */ 2389static unsigned pubname_table_allocated; 2390 2391/* Number of elements in pubname_table currently in use. */ 2392static unsigned pubname_table_in_use; 2393 2394/* Size (in elements) of increments by which we may expand the 2395 pubname_table. */ 2396#define PUBNAME_TABLE_INCREMENT 64 2397 2398/* A pointer to the base of a table that contains a list of publicly 2399 accessible names. */ 2400static arange_ref arange_table; 2401 2402/* Number of elements currently allocated for arange_table. */ 2403static unsigned arange_table_allocated; 2404 2405/* Number of elements in arange_table currently in use. */ 2406static unsigned arange_table_in_use; 2407 2408/* Size (in elements) of increments by which we may expand the 2409 arange_table. */ 2410#define ARANGE_TABLE_INCREMENT 64 2411 2412/* A pointer to the base of a list of pending types which we haven't 2413 generated DIEs for yet, but which we will have to come back to 2414 later on. */ 2415 2416static tree *pending_types_list; 2417 2418/* Number of elements currently allocated for the pending_types_list. */ 2419static unsigned pending_types_allocated; 2420 2421/* Number of elements of pending_types_list currently in use. */ 2422static unsigned pending_types; 2423 2424/* Size (in elements) of increments by which we may expand the pending 2425 types list. Actually, a single hunk of space of this size should 2426 be enough for most typical programs. */ 2427#define PENDING_TYPES_INCREMENT 64 2428
|
2429/* A pointer to the base of a list of incomplete types which might be 2430 completed at some later time. */ 2431 2432static tree *incomplete_types_list; 2433 2434/* Number of elements currently allocated for the incomplete_types_list. */ 2435static unsigned incomplete_types_allocated; 2436 2437/* Number of elements of incomplete_types_list currently in use. */ 2438static unsigned incomplete_types; 2439 2440/* Size (in elements) of increments by which we may expand the incomplete 2441 types list. Actually, a single hunk of space of this size should 2442 be enough for most typical programs. */ 2443#define INCOMPLETE_TYPES_INCREMENT 64 2444 |
2445/* Record whether the function being analyzed contains inlined functions. */ 2446static int current_function_has_inlines; 2447#if 0 && defined (MIPS_DEBUGGING_INFO) 2448static int comp_unit_has_inlines; 2449#endif 2450 2451/* A pointer to the ..._DECL node which we have most recently been working 2452 on. We keep this around just in case something about it looks screwy and 2453 we want to tell the user what the source coordinates for the actual 2454 declaration are. */ 2455static tree dwarf_last_decl; 2456 2457/* Forward declarations for functions defined in this file. */ 2458 2459static void addr_const_to_string PROTO((dyn_string_t, rtx)); 2460static char *addr_to_string PROTO((rtx)); 2461static int is_pseudo_reg PROTO((rtx)); 2462static tree type_main_variant PROTO((tree)); 2463static int is_tagged_type PROTO((tree)); 2464static char *dwarf_tag_name PROTO((unsigned)); 2465static char *dwarf_attr_name PROTO((unsigned)); 2466static char *dwarf_form_name PROTO((unsigned)); 2467static char *dwarf_stack_op_name PROTO((unsigned)); 2468#if 0 2469static char *dwarf_type_encoding_name PROTO((unsigned)); 2470#endif 2471static tree decl_ultimate_origin PROTO((tree)); 2472static tree block_ultimate_origin PROTO((tree)); 2473static tree decl_class_context PROTO((tree)); 2474static void add_dwarf_attr PROTO((dw_die_ref, dw_attr_ref)); 2475static void add_AT_flag PROTO((dw_die_ref, 2476 enum dwarf_attribute, 2477 unsigned)); 2478static void add_AT_int PROTO((dw_die_ref, 2479 enum dwarf_attribute, long)); 2480static void add_AT_unsigned PROTO((dw_die_ref, 2481 enum dwarf_attribute, 2482 unsigned long)); 2483static void add_AT_long_long PROTO((dw_die_ref, 2484 enum dwarf_attribute, 2485 unsigned long, unsigned long)); 2486static void add_AT_float PROTO((dw_die_ref, 2487 enum dwarf_attribute, 2488 unsigned, long *)); 2489static void add_AT_string PROTO((dw_die_ref, 2490 enum dwarf_attribute, char *)); 2491static void add_AT_die_ref PROTO((dw_die_ref, 2492 enum dwarf_attribute, 2493 dw_die_ref)); 2494static void add_AT_fde_ref PROTO((dw_die_ref, 2495 enum dwarf_attribute, 2496 unsigned)); 2497static void add_AT_loc PROTO((dw_die_ref, 2498 enum dwarf_attribute, 2499 dw_loc_descr_ref)); 2500static void add_AT_addr PROTO((dw_die_ref, 2501 enum dwarf_attribute, char *)); 2502static void add_AT_lbl_id PROTO((dw_die_ref, 2503 enum dwarf_attribute, char *));
|
2423static void add_AT_section_offset PROTO((dw_die_ref,
|
2504static void add_AT_lbl_offset PROTO((dw_die_ref, |
2505 enum dwarf_attribute, char *)); 2506static int is_extern_subr_die PROTO((dw_die_ref)); 2507static dw_attr_ref get_AT PROTO((dw_die_ref, 2508 enum dwarf_attribute)); 2509static char *get_AT_low_pc PROTO((dw_die_ref)); 2510static char *get_AT_hi_pc PROTO((dw_die_ref)); 2511static char *get_AT_string PROTO((dw_die_ref, 2512 enum dwarf_attribute)); 2513static int get_AT_flag PROTO((dw_die_ref, 2514 enum dwarf_attribute)); 2515static unsigned get_AT_unsigned PROTO((dw_die_ref, 2516 enum dwarf_attribute)); 2517static int is_c_family PROTO((void)); 2518static int is_fortran PROTO((void)); 2519static void remove_AT PROTO((dw_die_ref, 2520 enum dwarf_attribute)); 2521static void remove_children PROTO((dw_die_ref)); 2522static void add_child_die PROTO((dw_die_ref, dw_die_ref)); 2523static dw_die_ref new_die PROTO((enum dwarf_tag, dw_die_ref)); 2524static dw_die_ref lookup_type_die PROTO((tree)); 2525static void equate_type_number_to_die PROTO((tree, dw_die_ref)); 2526static dw_die_ref lookup_decl_die PROTO((tree)); 2527static void equate_decl_number_to_die PROTO((tree, dw_die_ref)); 2528static dw_loc_descr_ref new_loc_descr PROTO((enum dwarf_location_atom, 2529 unsigned long, unsigned long)); 2530static void add_loc_descr PROTO((dw_loc_descr_ref *, 2531 dw_loc_descr_ref)); 2532static void print_spaces PROTO((FILE *)); 2533static void print_die PROTO((dw_die_ref, FILE *)); 2534static void print_dwarf_line_table PROTO((FILE *)); 2535static void add_sibling_attributes PROTO((dw_die_ref)); 2536static void build_abbrev_table PROTO((dw_die_ref)); 2537static unsigned long size_of_string PROTO((char *)); 2538static unsigned long size_of_loc_descr PROTO((dw_loc_descr_ref)); 2539static unsigned long size_of_locs PROTO((dw_loc_descr_ref)); 2540static int constant_size PROTO((long unsigned)); 2541static unsigned long size_of_die PROTO((dw_die_ref)); 2542static void calc_die_sizes PROTO((dw_die_ref)); 2543static unsigned long size_of_line_prolog PROTO((void)); 2544static unsigned long size_of_line_info PROTO((void)); 2545static unsigned long size_of_pubnames PROTO((void)); 2546static unsigned long size_of_aranges PROTO((void)); 2547static enum dwarf_form value_format PROTO((dw_val_ref)); 2548static void output_value_format PROTO((dw_val_ref)); 2549static void output_abbrev_section PROTO((void)); 2550static void output_loc_operands PROTO((dw_loc_descr_ref)); 2551static unsigned long sibling_offset PROTO((dw_die_ref)); 2552static void output_die PROTO((dw_die_ref)); 2553static void output_compilation_unit_header PROTO((void)); 2554static char *dwarf2_name PROTO((tree, int)); 2555static void add_pubname PROTO((tree, dw_die_ref)); 2556static void output_pubnames PROTO((void)); 2557static void add_arange PROTO((tree, dw_die_ref)); 2558static void output_aranges PROTO((void)); 2559static void output_line_info PROTO((void)); 2560static int is_body_block PROTO((tree)); 2561static dw_die_ref base_type_die PROTO((tree)); 2562static tree root_type PROTO((tree)); 2563static int is_base_type PROTO((tree)); 2564static dw_die_ref modified_type_die PROTO((tree, int, int, dw_die_ref)); 2565static int type_is_enum PROTO((tree)); 2566static dw_loc_descr_ref reg_loc_descriptor PROTO((rtx)); 2567static dw_loc_descr_ref based_loc_descr PROTO((unsigned, long)); 2568static int is_based_loc PROTO((rtx)); 2569static dw_loc_descr_ref mem_loc_descriptor PROTO((rtx)); 2570static dw_loc_descr_ref concat_loc_descriptor PROTO((rtx, rtx)); 2571static dw_loc_descr_ref loc_descriptor PROTO((rtx)); 2572static unsigned ceiling PROTO((unsigned, unsigned)); 2573static tree field_type PROTO((tree)); 2574static unsigned simple_type_align_in_bits PROTO((tree)); 2575static unsigned simple_type_size_in_bits PROTO((tree)); 2576static unsigned field_byte_offset PROTO((tree)); 2577static void add_AT_location_description PROTO((dw_die_ref, 2578 enum dwarf_attribute, rtx)); 2579static void add_data_member_location_attribute PROTO((dw_die_ref, tree)); 2580static void add_const_value_attribute PROTO((dw_die_ref, rtx)); 2581static void add_location_or_const_value_attribute PROTO((dw_die_ref, tree)); 2582static void add_name_attribute PROTO((dw_die_ref, char *)); 2583static void add_bound_info PROTO((dw_die_ref, 2584 enum dwarf_attribute, tree)); 2585static void add_subscript_info PROTO((dw_die_ref, tree)); 2586static void add_byte_size_attribute PROTO((dw_die_ref, tree)); 2587static void add_bit_offset_attribute PROTO((dw_die_ref, tree)); 2588static void add_bit_size_attribute PROTO((dw_die_ref, tree)); 2589static void add_prototyped_attribute PROTO((dw_die_ref, tree)); 2590static void add_abstract_origin_attribute PROTO((dw_die_ref, tree)); 2591static void add_pure_or_virtual_attribute PROTO((dw_die_ref, tree)); 2592static void add_src_coords_attributes PROTO((dw_die_ref, tree)); 2593static void add_name_and_src_coords_attributes PROTO((dw_die_ref, tree)); 2594static void push_decl_scope PROTO((tree)); 2595static dw_die_ref scope_die_for PROTO((tree, dw_die_ref)); 2596static void pop_decl_scope PROTO((void)); 2597static void add_type_attribute PROTO((dw_die_ref, tree, int, int, 2598 dw_die_ref)); 2599static char *type_tag PROTO((tree)); 2600static tree member_declared_type PROTO((tree)); 2601#if 0 2602static char *decl_start_label PROTO((tree)); 2603#endif 2604static void gen_array_type_die PROTO((tree, dw_die_ref)); 2605static void gen_set_type_die PROTO((tree, dw_die_ref)); 2606#if 0 2607static void gen_entry_point_die PROTO((tree, dw_die_ref)); 2608#endif 2609static void pend_type PROTO((tree)); 2610static void output_pending_types_for_scope PROTO((dw_die_ref)); 2611static void gen_inlined_enumeration_type_die PROTO((tree, dw_die_ref)); 2612static void gen_inlined_structure_type_die PROTO((tree, dw_die_ref)); 2613static void gen_inlined_union_type_die PROTO((tree, dw_die_ref)); 2614static void gen_enumeration_type_die PROTO((tree, dw_die_ref)); 2615static dw_die_ref gen_formal_parameter_die PROTO((tree, dw_die_ref)); 2616static void gen_unspecified_parameters_die PROTO((tree, dw_die_ref)); 2617static void gen_formal_types_die PROTO((tree, dw_die_ref)); 2618static void gen_subprogram_die PROTO((tree, dw_die_ref)); 2619static void gen_variable_die PROTO((tree, dw_die_ref)); 2620static void gen_label_die PROTO((tree, dw_die_ref)); 2621static void gen_lexical_block_die PROTO((tree, dw_die_ref, int)); 2622static void gen_inlined_subroutine_die PROTO((tree, dw_die_ref, int)); 2623static void gen_field_die PROTO((tree, dw_die_ref)); 2624static void gen_ptr_to_mbr_type_die PROTO((tree, dw_die_ref)); 2625static void gen_compile_unit_die PROTO((char *)); 2626static void gen_string_type_die PROTO((tree, dw_die_ref)); 2627static void gen_inheritance_die PROTO((tree, dw_die_ref)); 2628static void gen_member_die PROTO((tree, dw_die_ref)); 2629static void gen_struct_or_union_type_die PROTO((tree, dw_die_ref)); 2630static void gen_subroutine_type_die PROTO((tree, dw_die_ref)); 2631static void gen_typedef_die PROTO((tree, dw_die_ref)); 2632static void gen_type_die PROTO((tree, dw_die_ref)); 2633static void gen_tagged_type_instantiation_die PROTO((tree, dw_die_ref)); 2634static void gen_block_die PROTO((tree, dw_die_ref, int)); 2635static void decls_for_scope PROTO((tree, dw_die_ref, int)); 2636static int is_redundant_typedef PROTO((tree)); 2637static void gen_decl_die PROTO((tree, dw_die_ref)); 2638static unsigned lookup_filename PROTO((char *)); 2639 2640/* Section names used to hold DWARF debugging information. */ 2641#ifndef DEBUG_INFO_SECTION 2642#define DEBUG_INFO_SECTION ".debug_info" 2643#endif 2644#ifndef ABBREV_SECTION 2645#define ABBREV_SECTION ".debug_abbrev" 2646#endif 2647#ifndef ARANGES_SECTION 2648#define ARANGES_SECTION ".debug_aranges" 2649#endif 2650#ifndef DW_MACINFO_SECTION 2651#define DW_MACINFO_SECTION ".debug_macinfo" 2652#endif 2653#ifndef DEBUG_LINE_SECTION 2654#define DEBUG_LINE_SECTION ".debug_line" 2655#endif 2656#ifndef LOC_SECTION 2657#define LOC_SECTION ".debug_loc" 2658#endif 2659#ifndef PUBNAMES_SECTION 2660#define PUBNAMES_SECTION ".debug_pubnames" 2661#endif 2662#ifndef STR_SECTION 2663#define STR_SECTION ".debug_str" 2664#endif 2665 2666/* Standard ELF section names for compiled code and data. */ 2667#ifndef TEXT_SECTION 2668#define TEXT_SECTION ".text" 2669#endif 2670#ifndef DATA_SECTION 2671#define DATA_SECTION ".data" 2672#endif 2673#ifndef BSS_SECTION 2674#define BSS_SECTION ".bss" 2675#endif 2676
|
2677/* Labels we insert at beginning sections we can reference instead of 2678 the section names themselves. */ |
2679
|
2680#ifndef TEXT_SECTION_LABEL 2681#define TEXT_SECTION_LABEL "Ltext" 2682#endif 2683#ifndef DEBUG_LINE_SECTION_LABEL 2684#define DEBUG_LINE_SECTION_LABEL "Ldebug_line" 2685#endif 2686#ifndef DEBUG_INFO_SECTION_LABEL 2687#define DEBUG_INFO_SECTION_LABEL "Ldebug_info" 2688#endif 2689#ifndef ABBREV_SECTION_LABEL 2690#define ABBREV_SECTION_LABEL "Ldebug_abbrev" 2691#endif 2692 2693 |
2694/* Definitions of defaults for formats and names of various special 2695 (artificial) labels which may be generated within this file (when the -g 2696 options is used and DWARF_DEBUGGING_INFO is in effect. 2697 If necessary, these may be overridden from within the tm.h file, but 2698 typically, overriding these defaults is unnecessary. */ 2699 2700static char text_end_label[MAX_ARTIFICIAL_LABEL_BYTES];
|
2701static char text_section_label[MAX_ARTIFICIAL_LABEL_BYTES]; 2702static char abbrev_section_label[MAX_ARTIFICIAL_LABEL_BYTES]; 2703static char debug_info_section_label[MAX_ARTIFICIAL_LABEL_BYTES]; 2704static char debug_line_section_label[MAX_ARTIFICIAL_LABEL_BYTES]; |
2705 2706#ifndef TEXT_END_LABEL 2707#define TEXT_END_LABEL "Letext" 2708#endif 2709#ifndef DATA_END_LABEL 2710#define DATA_END_LABEL "Ledata" 2711#endif 2712#ifndef BSS_END_LABEL 2713#define BSS_END_LABEL "Lebss" 2714#endif 2715#ifndef INSN_LABEL_FMT 2716#define INSN_LABEL_FMT "LI%u_" 2717#endif 2718#ifndef BLOCK_BEGIN_LABEL 2719#define BLOCK_BEGIN_LABEL "LBB" 2720#endif 2721#ifndef BLOCK_END_LABEL 2722#define BLOCK_END_LABEL "LBE" 2723#endif 2724#ifndef BODY_BEGIN_LABEL 2725#define BODY_BEGIN_LABEL "Lbb" 2726#endif 2727#ifndef BODY_END_LABEL 2728#define BODY_END_LABEL "Lbe" 2729#endif 2730#ifndef LINE_CODE_LABEL 2731#define LINE_CODE_LABEL "LM" 2732#endif 2733#ifndef SEPARATE_LINE_CODE_LABEL 2734#define SEPARATE_LINE_CODE_LABEL "LSM" 2735#endif 2736 2737/* Convert a reference to the assembler name of a C-level name. This 2738 macro has the same effect as ASM_OUTPUT_LABELREF, but copies to 2739 a string rather than writing to a file. */ 2740#ifndef ASM_NAME_TO_STRING
|
2640#define ASM_NAME_TO_STRING(STR, NAME) \
2641 do { \
2642 if ((NAME)[0] == '*') \
2643 dyn_string_append (STR, NAME + 1); \
2644 else \
2645 dyn_string_append (STR, NAME); \
2646 } \
|
2741#define ASM_NAME_TO_STRING(STR, NAME) \ 2742 do { \ 2743 if ((NAME)[0] == '*') \ 2744 dyn_string_append (STR, NAME + 1); \ 2745 else \ 2746 { \ 2747 char *newstr; \ 2748 STRIP_NAME_ENCODING (newstr, NAME); \ 2749 dyn_string_append (STR, user_label_prefix); \ 2750 dyn_string_append (STR, newstr); \ 2751 } \ 2752 } \ |
2753 while (0) 2754#endif 2755 2756/* Convert an integer constant expression into assembler syntax. Addition 2757 and subtraction are the only arithmetic that may appear in these 2758 expressions. This is an adaptation of output_addr_const in final.c. 2759 Here, the target of the conversion is a string buffer. We can't use 2760 output_addr_const directly, because it writes to a file. */ 2761 2762static void 2763addr_const_to_string (str, x) 2764 dyn_string_t str; 2765 rtx x; 2766{ 2767 char buf1[256]; 2768 2769restart: 2770 switch (GET_CODE (x)) 2771 { 2772 case PC: 2773 if (flag_pic) 2774 dyn_string_append (str, ","); 2775 else 2776 abort (); 2777 break; 2778 2779 case SYMBOL_REF: 2780 ASM_NAME_TO_STRING (str, XSTR (x, 0)); 2781 break; 2782 2783 case LABEL_REF: 2784 ASM_GENERATE_INTERNAL_LABEL (buf1, "L", CODE_LABEL_NUMBER (XEXP (x, 0))); 2785 ASM_NAME_TO_STRING (str, buf1); 2786 break; 2787 2788 case CODE_LABEL: 2789 ASM_GENERATE_INTERNAL_LABEL (buf1, "L", CODE_LABEL_NUMBER (x)); 2790 ASM_NAME_TO_STRING (str, buf1); 2791 break; 2792 2793 case CONST_INT: 2794 sprintf (buf1, HOST_WIDE_INT_PRINT_DEC, INTVAL (x)); 2795 dyn_string_append (str, buf1); 2796 break; 2797 2798 case CONST: 2799 /* This used to output parentheses around the expression, but that does 2800 not work on the 386 (either ATT or BSD assembler). */ 2801 addr_const_to_string (str, XEXP (x, 0)); 2802 break; 2803 2804 case CONST_DOUBLE: 2805 if (GET_MODE (x) == VOIDmode) 2806 { 2807 /* We can use %d if the number is one word and positive. */ 2808 if (CONST_DOUBLE_HIGH (x)) 2809 sprintf (buf1, HOST_WIDE_INT_PRINT_DOUBLE_HEX, 2810 CONST_DOUBLE_HIGH (x), CONST_DOUBLE_LOW (x)); 2811 else if (CONST_DOUBLE_LOW (x) < 0) 2812 sprintf (buf1, HOST_WIDE_INT_PRINT_HEX, CONST_DOUBLE_LOW (x)); 2813 else 2814 sprintf (buf1, HOST_WIDE_INT_PRINT_DEC, 2815 CONST_DOUBLE_LOW (x)); 2816 dyn_string_append (str, buf1); 2817 } 2818 else 2819 /* We can't handle floating point constants; PRINT_OPERAND must 2820 handle them. */ 2821 output_operand_lossage ("floating constant misused"); 2822 break; 2823 2824 case PLUS: 2825 /* Some assemblers need integer constants to appear last (eg masm). */ 2826 if (GET_CODE (XEXP (x, 0)) == CONST_INT) 2827 { 2828 addr_const_to_string (str, XEXP (x, 1)); 2829 if (INTVAL (XEXP (x, 0)) >= 0) 2830 dyn_string_append (str, "+"); 2831 2832 addr_const_to_string (str, XEXP (x, 0)); 2833 } 2834 else 2835 { 2836 addr_const_to_string (str, XEXP (x, 0)); 2837 if (INTVAL (XEXP (x, 1)) >= 0) 2838 dyn_string_append (str, "+"); 2839 2840 addr_const_to_string (str, XEXP (x, 1)); 2841 } 2842 break; 2843 2844 case MINUS: 2845 /* Avoid outputting things like x-x or x+5-x, since some assemblers 2846 can't handle that. */ 2847 x = simplify_subtraction (x); 2848 if (GET_CODE (x) != MINUS) 2849 goto restart; 2850 2851 addr_const_to_string (str, XEXP (x, 0)); 2852 dyn_string_append (str, "-"); 2853 if (GET_CODE (XEXP (x, 1)) == CONST_INT 2854 && INTVAL (XEXP (x, 1)) < 0) 2855 { 2856 dyn_string_append (str, ASM_OPEN_PAREN); 2857 addr_const_to_string (str, XEXP (x, 1)); 2858 dyn_string_append (str, ASM_CLOSE_PAREN); 2859 } 2860 else 2861 addr_const_to_string (str, XEXP (x, 1)); 2862 break; 2863 2864 case ZERO_EXTEND: 2865 case SIGN_EXTEND: 2866 addr_const_to_string (str, XEXP (x, 0)); 2867 break; 2868 2869 default: 2870 output_operand_lossage ("invalid expression as operand"); 2871 } 2872} 2873 2874/* Convert an address constant to a string, and return a pointer to 2875 a copy of the result, located on the heap. */ 2876 2877static char * 2878addr_to_string (x) 2879 rtx x; 2880{ 2881 dyn_string_t ds = dyn_string_new (256); 2882 char *s; 2883 2884 addr_const_to_string (ds, x); 2885 2886 /* Return the dynamically allocated string, but free the 2887 dyn_string_t itself. */ 2888 s = ds->s; 2889 free (ds); 2890 return s; 2891} 2892 2893/* Test if rtl node points to a pseudo register. */ 2894 2895static inline int 2896is_pseudo_reg (rtl) 2897 register rtx rtl; 2898{ 2899 return (((GET_CODE (rtl) == REG) && (REGNO (rtl) >= FIRST_PSEUDO_REGISTER)) 2900 || ((GET_CODE (rtl) == SUBREG) 2901 && (REGNO (XEXP (rtl, 0)) >= FIRST_PSEUDO_REGISTER))); 2902} 2903 2904/* Return a reference to a type, with its const and volatile qualifiers 2905 removed. */ 2906 2907static inline tree 2908type_main_variant (type) 2909 register tree type; 2910{ 2911 type = TYPE_MAIN_VARIANT (type); 2912 2913 /* There really should be only one main variant among any group of variants 2914 of a given type (and all of the MAIN_VARIANT values for all members of 2915 the group should point to that one type) but sometimes the C front-end 2916 messes this up for array types, so we work around that bug here. */ 2917 2918 if (TREE_CODE (type) == ARRAY_TYPE) 2919 while (type != TYPE_MAIN_VARIANT (type)) 2920 type = TYPE_MAIN_VARIANT (type); 2921 2922 return type; 2923} 2924 2925/* Return non-zero if the given type node represents a tagged type. */ 2926 2927static inline int 2928is_tagged_type (type) 2929 register tree type; 2930{ 2931 register enum tree_code code = TREE_CODE (type); 2932 2933 return (code == RECORD_TYPE || code == UNION_TYPE 2934 || code == QUAL_UNION_TYPE || code == ENUMERAL_TYPE); 2935} 2936 2937/* Convert a DIE tag into its string name. */ 2938 2939static char * 2940dwarf_tag_name (tag) 2941 register unsigned tag; 2942{ 2943 switch (tag) 2944 { 2945 case DW_TAG_padding: 2946 return "DW_TAG_padding"; 2947 case DW_TAG_array_type: 2948 return "DW_TAG_array_type"; 2949 case DW_TAG_class_type: 2950 return "DW_TAG_class_type"; 2951 case DW_TAG_entry_point: 2952 return "DW_TAG_entry_point"; 2953 case DW_TAG_enumeration_type: 2954 return "DW_TAG_enumeration_type"; 2955 case DW_TAG_formal_parameter: 2956 return "DW_TAG_formal_parameter"; 2957 case DW_TAG_imported_declaration: 2958 return "DW_TAG_imported_declaration"; 2959 case DW_TAG_label: 2960 return "DW_TAG_label"; 2961 case DW_TAG_lexical_block: 2962 return "DW_TAG_lexical_block"; 2963 case DW_TAG_member: 2964 return "DW_TAG_member"; 2965 case DW_TAG_pointer_type: 2966 return "DW_TAG_pointer_type"; 2967 case DW_TAG_reference_type: 2968 return "DW_TAG_reference_type"; 2969 case DW_TAG_compile_unit: 2970 return "DW_TAG_compile_unit"; 2971 case DW_TAG_string_type: 2972 return "DW_TAG_string_type"; 2973 case DW_TAG_structure_type: 2974 return "DW_TAG_structure_type"; 2975 case DW_TAG_subroutine_type: 2976 return "DW_TAG_subroutine_type"; 2977 case DW_TAG_typedef: 2978 return "DW_TAG_typedef"; 2979 case DW_TAG_union_type: 2980 return "DW_TAG_union_type"; 2981 case DW_TAG_unspecified_parameters: 2982 return "DW_TAG_unspecified_parameters"; 2983 case DW_TAG_variant: 2984 return "DW_TAG_variant"; 2985 case DW_TAG_common_block: 2986 return "DW_TAG_common_block"; 2987 case DW_TAG_common_inclusion: 2988 return "DW_TAG_common_inclusion"; 2989 case DW_TAG_inheritance: 2990 return "DW_TAG_inheritance"; 2991 case DW_TAG_inlined_subroutine: 2992 return "DW_TAG_inlined_subroutine"; 2993 case DW_TAG_module: 2994 return "DW_TAG_module"; 2995 case DW_TAG_ptr_to_member_type: 2996 return "DW_TAG_ptr_to_member_type"; 2997 case DW_TAG_set_type: 2998 return "DW_TAG_set_type"; 2999 case DW_TAG_subrange_type: 3000 return "DW_TAG_subrange_type"; 3001 case DW_TAG_with_stmt: 3002 return "DW_TAG_with_stmt"; 3003 case DW_TAG_access_declaration: 3004 return "DW_TAG_access_declaration"; 3005 case DW_TAG_base_type: 3006 return "DW_TAG_base_type"; 3007 case DW_TAG_catch_block: 3008 return "DW_TAG_catch_block"; 3009 case DW_TAG_const_type: 3010 return "DW_TAG_const_type"; 3011 case DW_TAG_constant: 3012 return "DW_TAG_constant"; 3013 case DW_TAG_enumerator: 3014 return "DW_TAG_enumerator"; 3015 case DW_TAG_file_type: 3016 return "DW_TAG_file_type"; 3017 case DW_TAG_friend: 3018 return "DW_TAG_friend"; 3019 case DW_TAG_namelist: 3020 return "DW_TAG_namelist"; 3021 case DW_TAG_namelist_item: 3022 return "DW_TAG_namelist_item"; 3023 case DW_TAG_packed_type: 3024 return "DW_TAG_packed_type"; 3025 case DW_TAG_subprogram: 3026 return "DW_TAG_subprogram"; 3027 case DW_TAG_template_type_param: 3028 return "DW_TAG_template_type_param"; 3029 case DW_TAG_template_value_param: 3030 return "DW_TAG_template_value_param"; 3031 case DW_TAG_thrown_type: 3032 return "DW_TAG_thrown_type"; 3033 case DW_TAG_try_block: 3034 return "DW_TAG_try_block"; 3035 case DW_TAG_variant_part: 3036 return "DW_TAG_variant_part"; 3037 case DW_TAG_variable: 3038 return "DW_TAG_variable"; 3039 case DW_TAG_volatile_type: 3040 return "DW_TAG_volatile_type"; 3041 case DW_TAG_MIPS_loop: 3042 return "DW_TAG_MIPS_loop"; 3043 case DW_TAG_format_label: 3044 return "DW_TAG_format_label"; 3045 case DW_TAG_function_template: 3046 return "DW_TAG_function_template"; 3047 case DW_TAG_class_template: 3048 return "DW_TAG_class_template"; 3049 default: 3050 return "DW_TAG_<unknown>"; 3051 } 3052} 3053 3054/* Convert a DWARF attribute code into its string name. */ 3055 3056static char * 3057dwarf_attr_name (attr) 3058 register unsigned attr; 3059{ 3060 switch (attr) 3061 { 3062 case DW_AT_sibling: 3063 return "DW_AT_sibling"; 3064 case DW_AT_location: 3065 return "DW_AT_location"; 3066 case DW_AT_name: 3067 return "DW_AT_name"; 3068 case DW_AT_ordering: 3069 return "DW_AT_ordering"; 3070 case DW_AT_subscr_data: 3071 return "DW_AT_subscr_data"; 3072 case DW_AT_byte_size: 3073 return "DW_AT_byte_size"; 3074 case DW_AT_bit_offset: 3075 return "DW_AT_bit_offset"; 3076 case DW_AT_bit_size: 3077 return "DW_AT_bit_size"; 3078 case DW_AT_element_list: 3079 return "DW_AT_element_list"; 3080 case DW_AT_stmt_list: 3081 return "DW_AT_stmt_list"; 3082 case DW_AT_low_pc: 3083 return "DW_AT_low_pc"; 3084 case DW_AT_high_pc: 3085 return "DW_AT_high_pc"; 3086 case DW_AT_language: 3087 return "DW_AT_language"; 3088 case DW_AT_member: 3089 return "DW_AT_member"; 3090 case DW_AT_discr: 3091 return "DW_AT_discr"; 3092 case DW_AT_discr_value: 3093 return "DW_AT_discr_value"; 3094 case DW_AT_visibility: 3095 return "DW_AT_visibility"; 3096 case DW_AT_import: 3097 return "DW_AT_import"; 3098 case DW_AT_string_length: 3099 return "DW_AT_string_length"; 3100 case DW_AT_common_reference: 3101 return "DW_AT_common_reference"; 3102 case DW_AT_comp_dir: 3103 return "DW_AT_comp_dir"; 3104 case DW_AT_const_value: 3105 return "DW_AT_const_value"; 3106 case DW_AT_containing_type: 3107 return "DW_AT_containing_type"; 3108 case DW_AT_default_value: 3109 return "DW_AT_default_value"; 3110 case DW_AT_inline: 3111 return "DW_AT_inline"; 3112 case DW_AT_is_optional: 3113 return "DW_AT_is_optional"; 3114 case DW_AT_lower_bound: 3115 return "DW_AT_lower_bound"; 3116 case DW_AT_producer: 3117 return "DW_AT_producer"; 3118 case DW_AT_prototyped: 3119 return "DW_AT_prototyped"; 3120 case DW_AT_return_addr: 3121 return "DW_AT_return_addr"; 3122 case DW_AT_start_scope: 3123 return "DW_AT_start_scope"; 3124 case DW_AT_stride_size: 3125 return "DW_AT_stride_size"; 3126 case DW_AT_upper_bound: 3127 return "DW_AT_upper_bound"; 3128 case DW_AT_abstract_origin: 3129 return "DW_AT_abstract_origin"; 3130 case DW_AT_accessibility: 3131 return "DW_AT_accessibility"; 3132 case DW_AT_address_class: 3133 return "DW_AT_address_class"; 3134 case DW_AT_artificial: 3135 return "DW_AT_artificial"; 3136 case DW_AT_base_types: 3137 return "DW_AT_base_types"; 3138 case DW_AT_calling_convention: 3139 return "DW_AT_calling_convention"; 3140 case DW_AT_count: 3141 return "DW_AT_count"; 3142 case DW_AT_data_member_location: 3143 return "DW_AT_data_member_location"; 3144 case DW_AT_decl_column: 3145 return "DW_AT_decl_column"; 3146 case DW_AT_decl_file: 3147 return "DW_AT_decl_file"; 3148 case DW_AT_decl_line: 3149 return "DW_AT_decl_line"; 3150 case DW_AT_declaration: 3151 return "DW_AT_declaration"; 3152 case DW_AT_discr_list: 3153 return "DW_AT_discr_list"; 3154 case DW_AT_encoding: 3155 return "DW_AT_encoding"; 3156 case DW_AT_external: 3157 return "DW_AT_external"; 3158 case DW_AT_frame_base: 3159 return "DW_AT_frame_base"; 3160 case DW_AT_friend: 3161 return "DW_AT_friend"; 3162 case DW_AT_identifier_case: 3163 return "DW_AT_identifier_case"; 3164 case DW_AT_macro_info: 3165 return "DW_AT_macro_info"; 3166 case DW_AT_namelist_items: 3167 return "DW_AT_namelist_items"; 3168 case DW_AT_priority: 3169 return "DW_AT_priority"; 3170 case DW_AT_segment: 3171 return "DW_AT_segment"; 3172 case DW_AT_specification: 3173 return "DW_AT_specification"; 3174 case DW_AT_static_link: 3175 return "DW_AT_static_link"; 3176 case DW_AT_type: 3177 return "DW_AT_type"; 3178 case DW_AT_use_location: 3179 return "DW_AT_use_location"; 3180 case DW_AT_variable_parameter: 3181 return "DW_AT_variable_parameter"; 3182 case DW_AT_virtuality: 3183 return "DW_AT_virtuality"; 3184 case DW_AT_vtable_elem_location: 3185 return "DW_AT_vtable_elem_location"; 3186 3187 case DW_AT_MIPS_fde: 3188 return "DW_AT_MIPS_fde"; 3189 case DW_AT_MIPS_loop_begin: 3190 return "DW_AT_MIPS_loop_begin"; 3191 case DW_AT_MIPS_tail_loop_begin: 3192 return "DW_AT_MIPS_tail_loop_begin"; 3193 case DW_AT_MIPS_epilog_begin: 3194 return "DW_AT_MIPS_epilog_begin"; 3195 case DW_AT_MIPS_loop_unroll_factor: 3196 return "DW_AT_MIPS_loop_unroll_factor"; 3197 case DW_AT_MIPS_software_pipeline_depth: 3198 return "DW_AT_MIPS_software_pipeline_depth"; 3199 case DW_AT_MIPS_linkage_name: 3200 return "DW_AT_MIPS_linkage_name"; 3201 case DW_AT_MIPS_stride: 3202 return "DW_AT_MIPS_stride"; 3203 case DW_AT_MIPS_abstract_name: 3204 return "DW_AT_MIPS_abstract_name"; 3205 case DW_AT_MIPS_clone_origin: 3206 return "DW_AT_MIPS_clone_origin"; 3207 case DW_AT_MIPS_has_inlines: 3208 return "DW_AT_MIPS_has_inlines"; 3209 3210 case DW_AT_sf_names: 3211 return "DW_AT_sf_names"; 3212 case DW_AT_src_info: 3213 return "DW_AT_src_info"; 3214 case DW_AT_mac_info: 3215 return "DW_AT_mac_info"; 3216 case DW_AT_src_coords: 3217 return "DW_AT_src_coords"; 3218 case DW_AT_body_begin: 3219 return "DW_AT_body_begin"; 3220 case DW_AT_body_end: 3221 return "DW_AT_body_end"; 3222 default: 3223 return "DW_AT_<unknown>"; 3224 } 3225} 3226 3227/* Convert a DWARF value form code into its string name. */ 3228 3229static char * 3230dwarf_form_name (form) 3231 register unsigned form; 3232{ 3233 switch (form) 3234 { 3235 case DW_FORM_addr: 3236 return "DW_FORM_addr"; 3237 case DW_FORM_block2: 3238 return "DW_FORM_block2"; 3239 case DW_FORM_block4: 3240 return "DW_FORM_block4"; 3241 case DW_FORM_data2: 3242 return "DW_FORM_data2"; 3243 case DW_FORM_data4: 3244 return "DW_FORM_data4"; 3245 case DW_FORM_data8: 3246 return "DW_FORM_data8"; 3247 case DW_FORM_string: 3248 return "DW_FORM_string"; 3249 case DW_FORM_block: 3250 return "DW_FORM_block"; 3251 case DW_FORM_block1: 3252 return "DW_FORM_block1"; 3253 case DW_FORM_data1: 3254 return "DW_FORM_data1"; 3255 case DW_FORM_flag: 3256 return "DW_FORM_flag"; 3257 case DW_FORM_sdata: 3258 return "DW_FORM_sdata"; 3259 case DW_FORM_strp: 3260 return "DW_FORM_strp"; 3261 case DW_FORM_udata: 3262 return "DW_FORM_udata"; 3263 case DW_FORM_ref_addr: 3264 return "DW_FORM_ref_addr"; 3265 case DW_FORM_ref1: 3266 return "DW_FORM_ref1"; 3267 case DW_FORM_ref2: 3268 return "DW_FORM_ref2"; 3269 case DW_FORM_ref4: 3270 return "DW_FORM_ref4"; 3271 case DW_FORM_ref8: 3272 return "DW_FORM_ref8"; 3273 case DW_FORM_ref_udata: 3274 return "DW_FORM_ref_udata"; 3275 case DW_FORM_indirect: 3276 return "DW_FORM_indirect"; 3277 default: 3278 return "DW_FORM_<unknown>"; 3279 } 3280} 3281 3282/* Convert a DWARF stack opcode into its string name. */ 3283 3284static char * 3285dwarf_stack_op_name (op) 3286 register unsigned op; 3287{ 3288 switch (op) 3289 { 3290 case DW_OP_addr: 3291 return "DW_OP_addr"; 3292 case DW_OP_deref: 3293 return "DW_OP_deref"; 3294 case DW_OP_const1u: 3295 return "DW_OP_const1u"; 3296 case DW_OP_const1s: 3297 return "DW_OP_const1s"; 3298 case DW_OP_const2u: 3299 return "DW_OP_const2u"; 3300 case DW_OP_const2s: 3301 return "DW_OP_const2s"; 3302 case DW_OP_const4u: 3303 return "DW_OP_const4u"; 3304 case DW_OP_const4s: 3305 return "DW_OP_const4s"; 3306 case DW_OP_const8u: 3307 return "DW_OP_const8u"; 3308 case DW_OP_const8s: 3309 return "DW_OP_const8s"; 3310 case DW_OP_constu: 3311 return "DW_OP_constu"; 3312 case DW_OP_consts: 3313 return "DW_OP_consts"; 3314 case DW_OP_dup: 3315 return "DW_OP_dup"; 3316 case DW_OP_drop: 3317 return "DW_OP_drop"; 3318 case DW_OP_over: 3319 return "DW_OP_over"; 3320 case DW_OP_pick: 3321 return "DW_OP_pick"; 3322 case DW_OP_swap: 3323 return "DW_OP_swap"; 3324 case DW_OP_rot: 3325 return "DW_OP_rot"; 3326 case DW_OP_xderef: 3327 return "DW_OP_xderef"; 3328 case DW_OP_abs: 3329 return "DW_OP_abs"; 3330 case DW_OP_and: 3331 return "DW_OP_and"; 3332 case DW_OP_div: 3333 return "DW_OP_div"; 3334 case DW_OP_minus: 3335 return "DW_OP_minus"; 3336 case DW_OP_mod: 3337 return "DW_OP_mod"; 3338 case DW_OP_mul: 3339 return "DW_OP_mul"; 3340 case DW_OP_neg: 3341 return "DW_OP_neg"; 3342 case DW_OP_not: 3343 return "DW_OP_not"; 3344 case DW_OP_or: 3345 return "DW_OP_or"; 3346 case DW_OP_plus: 3347 return "DW_OP_plus"; 3348 case DW_OP_plus_uconst: 3349 return "DW_OP_plus_uconst"; 3350 case DW_OP_shl: 3351 return "DW_OP_shl"; 3352 case DW_OP_shr: 3353 return "DW_OP_shr"; 3354 case DW_OP_shra: 3355 return "DW_OP_shra"; 3356 case DW_OP_xor: 3357 return "DW_OP_xor"; 3358 case DW_OP_bra: 3359 return "DW_OP_bra"; 3360 case DW_OP_eq: 3361 return "DW_OP_eq"; 3362 case DW_OP_ge: 3363 return "DW_OP_ge"; 3364 case DW_OP_gt: 3365 return "DW_OP_gt"; 3366 case DW_OP_le: 3367 return "DW_OP_le"; 3368 case DW_OP_lt: 3369 return "DW_OP_lt"; 3370 case DW_OP_ne: 3371 return "DW_OP_ne"; 3372 case DW_OP_skip: 3373 return "DW_OP_skip"; 3374 case DW_OP_lit0: 3375 return "DW_OP_lit0"; 3376 case DW_OP_lit1: 3377 return "DW_OP_lit1"; 3378 case DW_OP_lit2: 3379 return "DW_OP_lit2"; 3380 case DW_OP_lit3: 3381 return "DW_OP_lit3"; 3382 case DW_OP_lit4: 3383 return "DW_OP_lit4"; 3384 case DW_OP_lit5: 3385 return "DW_OP_lit5"; 3386 case DW_OP_lit6: 3387 return "DW_OP_lit6"; 3388 case DW_OP_lit7: 3389 return "DW_OP_lit7"; 3390 case DW_OP_lit8: 3391 return "DW_OP_lit8"; 3392 case DW_OP_lit9: 3393 return "DW_OP_lit9"; 3394 case DW_OP_lit10: 3395 return "DW_OP_lit10"; 3396 case DW_OP_lit11: 3397 return "DW_OP_lit11"; 3398 case DW_OP_lit12: 3399 return "DW_OP_lit12"; 3400 case DW_OP_lit13: 3401 return "DW_OP_lit13"; 3402 case DW_OP_lit14: 3403 return "DW_OP_lit14"; 3404 case DW_OP_lit15: 3405 return "DW_OP_lit15"; 3406 case DW_OP_lit16: 3407 return "DW_OP_lit16"; 3408 case DW_OP_lit17: 3409 return "DW_OP_lit17"; 3410 case DW_OP_lit18: 3411 return "DW_OP_lit18"; 3412 case DW_OP_lit19: 3413 return "DW_OP_lit19"; 3414 case DW_OP_lit20: 3415 return "DW_OP_lit20"; 3416 case DW_OP_lit21: 3417 return "DW_OP_lit21"; 3418 case DW_OP_lit22: 3419 return "DW_OP_lit22"; 3420 case DW_OP_lit23: 3421 return "DW_OP_lit23"; 3422 case DW_OP_lit24: 3423 return "DW_OP_lit24"; 3424 case DW_OP_lit25: 3425 return "DW_OP_lit25"; 3426 case DW_OP_lit26: 3427 return "DW_OP_lit26"; 3428 case DW_OP_lit27: 3429 return "DW_OP_lit27"; 3430 case DW_OP_lit28: 3431 return "DW_OP_lit28"; 3432 case DW_OP_lit29: 3433 return "DW_OP_lit29"; 3434 case DW_OP_lit30: 3435 return "DW_OP_lit30"; 3436 case DW_OP_lit31: 3437 return "DW_OP_lit31"; 3438 case DW_OP_reg0: 3439 return "DW_OP_reg0"; 3440 case DW_OP_reg1: 3441 return "DW_OP_reg1"; 3442 case DW_OP_reg2: 3443 return "DW_OP_reg2"; 3444 case DW_OP_reg3: 3445 return "DW_OP_reg3"; 3446 case DW_OP_reg4: 3447 return "DW_OP_reg4"; 3448 case DW_OP_reg5: 3449 return "DW_OP_reg5"; 3450 case DW_OP_reg6: 3451 return "DW_OP_reg6"; 3452 case DW_OP_reg7: 3453 return "DW_OP_reg7"; 3454 case DW_OP_reg8: 3455 return "DW_OP_reg8"; 3456 case DW_OP_reg9: 3457 return "DW_OP_reg9"; 3458 case DW_OP_reg10: 3459 return "DW_OP_reg10"; 3460 case DW_OP_reg11: 3461 return "DW_OP_reg11"; 3462 case DW_OP_reg12: 3463 return "DW_OP_reg12"; 3464 case DW_OP_reg13: 3465 return "DW_OP_reg13"; 3466 case DW_OP_reg14: 3467 return "DW_OP_reg14"; 3468 case DW_OP_reg15: 3469 return "DW_OP_reg15"; 3470 case DW_OP_reg16: 3471 return "DW_OP_reg16"; 3472 case DW_OP_reg17: 3473 return "DW_OP_reg17"; 3474 case DW_OP_reg18: 3475 return "DW_OP_reg18"; 3476 case DW_OP_reg19: 3477 return "DW_OP_reg19"; 3478 case DW_OP_reg20: 3479 return "DW_OP_reg20"; 3480 case DW_OP_reg21: 3481 return "DW_OP_reg21"; 3482 case DW_OP_reg22: 3483 return "DW_OP_reg22"; 3484 case DW_OP_reg23: 3485 return "DW_OP_reg23"; 3486 case DW_OP_reg24: 3487 return "DW_OP_reg24"; 3488 case DW_OP_reg25: 3489 return "DW_OP_reg25"; 3490 case DW_OP_reg26: 3491 return "DW_OP_reg26"; 3492 case DW_OP_reg27: 3493 return "DW_OP_reg27"; 3494 case DW_OP_reg28: 3495 return "DW_OP_reg28"; 3496 case DW_OP_reg29: 3497 return "DW_OP_reg29"; 3498 case DW_OP_reg30: 3499 return "DW_OP_reg30"; 3500 case DW_OP_reg31: 3501 return "DW_OP_reg31"; 3502 case DW_OP_breg0: 3503 return "DW_OP_breg0"; 3504 case DW_OP_breg1: 3505 return "DW_OP_breg1"; 3506 case DW_OP_breg2: 3507 return "DW_OP_breg2"; 3508 case DW_OP_breg3: 3509 return "DW_OP_breg3"; 3510 case DW_OP_breg4: 3511 return "DW_OP_breg4"; 3512 case DW_OP_breg5: 3513 return "DW_OP_breg5"; 3514 case DW_OP_breg6: 3515 return "DW_OP_breg6"; 3516 case DW_OP_breg7: 3517 return "DW_OP_breg7"; 3518 case DW_OP_breg8: 3519 return "DW_OP_breg8"; 3520 case DW_OP_breg9: 3521 return "DW_OP_breg9"; 3522 case DW_OP_breg10: 3523 return "DW_OP_breg10"; 3524 case DW_OP_breg11: 3525 return "DW_OP_breg11"; 3526 case DW_OP_breg12: 3527 return "DW_OP_breg12"; 3528 case DW_OP_breg13: 3529 return "DW_OP_breg13"; 3530 case DW_OP_breg14: 3531 return "DW_OP_breg14"; 3532 case DW_OP_breg15: 3533 return "DW_OP_breg15"; 3534 case DW_OP_breg16: 3535 return "DW_OP_breg16"; 3536 case DW_OP_breg17: 3537 return "DW_OP_breg17"; 3538 case DW_OP_breg18: 3539 return "DW_OP_breg18"; 3540 case DW_OP_breg19: 3541 return "DW_OP_breg19"; 3542 case DW_OP_breg20: 3543 return "DW_OP_breg20"; 3544 case DW_OP_breg21: 3545 return "DW_OP_breg21"; 3546 case DW_OP_breg22: 3547 return "DW_OP_breg22"; 3548 case DW_OP_breg23: 3549 return "DW_OP_breg23"; 3550 case DW_OP_breg24: 3551 return "DW_OP_breg24"; 3552 case DW_OP_breg25: 3553 return "DW_OP_breg25"; 3554 case DW_OP_breg26: 3555 return "DW_OP_breg26"; 3556 case DW_OP_breg27: 3557 return "DW_OP_breg27"; 3558 case DW_OP_breg28: 3559 return "DW_OP_breg28"; 3560 case DW_OP_breg29: 3561 return "DW_OP_breg29"; 3562 case DW_OP_breg30: 3563 return "DW_OP_breg30"; 3564 case DW_OP_breg31: 3565 return "DW_OP_breg31"; 3566 case DW_OP_regx: 3567 return "DW_OP_regx"; 3568 case DW_OP_fbreg: 3569 return "DW_OP_fbreg"; 3570 case DW_OP_bregx: 3571 return "DW_OP_bregx"; 3572 case DW_OP_piece: 3573 return "DW_OP_piece"; 3574 case DW_OP_deref_size: 3575 return "DW_OP_deref_size"; 3576 case DW_OP_xderef_size: 3577 return "DW_OP_xderef_size"; 3578 case DW_OP_nop: 3579 return "DW_OP_nop"; 3580 default: 3581 return "OP_<unknown>"; 3582 } 3583} 3584 3585/* Convert a DWARF type code into its string name. */ 3586 3587#if 0 3588static char * 3589dwarf_type_encoding_name (enc) 3590 register unsigned enc; 3591{ 3592 switch (enc) 3593 { 3594 case DW_ATE_address: 3595 return "DW_ATE_address"; 3596 case DW_ATE_boolean: 3597 return "DW_ATE_boolean"; 3598 case DW_ATE_complex_float: 3599 return "DW_ATE_complex_float"; 3600 case DW_ATE_float: 3601 return "DW_ATE_float"; 3602 case DW_ATE_signed: 3603 return "DW_ATE_signed"; 3604 case DW_ATE_signed_char: 3605 return "DW_ATE_signed_char"; 3606 case DW_ATE_unsigned: 3607 return "DW_ATE_unsigned"; 3608 case DW_ATE_unsigned_char: 3609 return "DW_ATE_unsigned_char"; 3610 default: 3611 return "DW_ATE_<unknown>"; 3612 } 3613} 3614#endif 3615 3616/* Determine the "ultimate origin" of a decl. The decl may be an inlined 3617 instance of an inlined instance of a decl which is local to an inline 3618 function, so we have to trace all of the way back through the origin chain 3619 to find out what sort of node actually served as the original seed for the 3620 given block. */ 3621 3622static tree 3623decl_ultimate_origin (decl) 3624 register tree decl; 3625{
|
3520 register tree immediate_origin = DECL_ABSTRACT_ORIGIN (decl);
|
3626#ifdef ENABLE_CHECKING 3627 if (DECL_FROM_INLINE (DECL_ORIGIN (decl))) 3628 /* Since the DECL_ABSTRACT_ORIGIN for a DECL is supposed to be the 3629 most distant ancestor, this should never happen. */ 3630 abort (); 3631#endif |
3632
|
3522 if (immediate_origin == NULL_TREE)
3523 return NULL_TREE;
3524 else
3525 {
3526 register tree ret_val;
3527 register tree lookahead = immediate_origin;
3528
3529 do
3530 {
3531 ret_val = lookahead;
3532 lookahead = DECL_ABSTRACT_ORIGIN (ret_val);
3533 }
3534 while (lookahead != NULL && lookahead != ret_val);
3535
3536 return ret_val;
3537 }
|
3633 return DECL_ABSTRACT_ORIGIN (decl); |
3634} 3635 3636/* Determine the "ultimate origin" of a block. The block may be an inlined 3637 instance of an inlined instance of a block which is local to an inline 3638 function, so we have to trace all of the way back through the origin chain 3639 to find out what sort of node actually served as the original seed for the 3640 given block. */ 3641 3642static tree 3643block_ultimate_origin (block) 3644 register tree block; 3645{ 3646 register tree immediate_origin = BLOCK_ABSTRACT_ORIGIN (block); 3647 3648 if (immediate_origin == NULL_TREE) 3649 return NULL_TREE; 3650 else 3651 { 3652 register tree ret_val; 3653 register tree lookahead = immediate_origin; 3654 3655 do 3656 { 3657 ret_val = lookahead; 3658 lookahead = (TREE_CODE (ret_val) == BLOCK) 3659 ? BLOCK_ABSTRACT_ORIGIN (ret_val) 3660 : NULL; 3661 } 3662 while (lookahead != NULL && lookahead != ret_val); 3663 3664 return ret_val; 3665 } 3666} 3667 3668/* Get the class to which DECL belongs, if any. In g++, the DECL_CONTEXT 3669 of a virtual function may refer to a base class, so we check the 'this' 3670 parameter. */ 3671 3672static tree 3673decl_class_context (decl) 3674 tree decl; 3675{ 3676 tree context = NULL_TREE; 3677 3678 if (TREE_CODE (decl) != FUNCTION_DECL || ! DECL_VINDEX (decl)) 3679 context = DECL_CONTEXT (decl); 3680 else 3681 context = TYPE_MAIN_VARIANT 3682 (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (decl))))); 3683 3684 if (context && TREE_CODE_CLASS (TREE_CODE (context)) != 't') 3685 context = NULL_TREE; 3686 3687 return context; 3688} 3689 3690/* Add an attribute/value pair to a DIE */ 3691 3692static inline void 3693add_dwarf_attr (die, attr) 3694 register dw_die_ref die; 3695 register dw_attr_ref attr; 3696{ 3697 if (die != NULL && attr != NULL) 3698 { 3699 if (die->die_attr == NULL) 3700 { 3701 die->die_attr = attr; 3702 die->die_attr_last = attr; 3703 } 3704 else 3705 { 3706 die->die_attr_last->dw_attr_next = attr; 3707 die->die_attr_last = attr; 3708 } 3709 } 3710} 3711 3712/* Add a flag value attribute to a DIE. */ 3713 3714static inline void 3715add_AT_flag (die, attr_kind, flag) 3716 register dw_die_ref die; 3717 register enum dwarf_attribute attr_kind; 3718 register unsigned flag; 3719{ 3720 register dw_attr_ref attr = (dw_attr_ref) xmalloc (sizeof (dw_attr_node)); 3721 3722 attr->dw_attr_next = NULL; 3723 attr->dw_attr = attr_kind; 3724 attr->dw_attr_val.val_class = dw_val_class_flag; 3725 attr->dw_attr_val.v.val_flag = flag; 3726 add_dwarf_attr (die, attr); 3727} 3728 3729/* Add a signed integer attribute value to a DIE. */ 3730 3731static inline void 3732add_AT_int (die, attr_kind, int_val) 3733 register dw_die_ref die; 3734 register enum dwarf_attribute attr_kind; 3735 register long int int_val; 3736{ 3737 register dw_attr_ref attr = (dw_attr_ref) xmalloc (sizeof (dw_attr_node)); 3738 3739 attr->dw_attr_next = NULL; 3740 attr->dw_attr = attr_kind; 3741 attr->dw_attr_val.val_class = dw_val_class_const; 3742 attr->dw_attr_val.v.val_int = int_val; 3743 add_dwarf_attr (die, attr); 3744} 3745 3746/* Add an unsigned integer attribute value to a DIE. */ 3747 3748static inline void 3749add_AT_unsigned (die, attr_kind, unsigned_val) 3750 register dw_die_ref die; 3751 register enum dwarf_attribute attr_kind; 3752 register unsigned long unsigned_val; 3753{ 3754 register dw_attr_ref attr = (dw_attr_ref) xmalloc (sizeof (dw_attr_node)); 3755 3756 attr->dw_attr_next = NULL; 3757 attr->dw_attr = attr_kind; 3758 attr->dw_attr_val.val_class = dw_val_class_unsigned_const; 3759 attr->dw_attr_val.v.val_unsigned = unsigned_val; 3760 add_dwarf_attr (die, attr); 3761} 3762 3763/* Add an unsigned double integer attribute value to a DIE. */ 3764 3765static inline void 3766add_AT_long_long (die, attr_kind, val_hi, val_low) 3767 register dw_die_ref die; 3768 register enum dwarf_attribute attr_kind; 3769 register unsigned long val_hi; 3770 register unsigned long val_low; 3771{ 3772 register dw_attr_ref attr = (dw_attr_ref) xmalloc (sizeof (dw_attr_node)); 3773 3774 attr->dw_attr_next = NULL; 3775 attr->dw_attr = attr_kind; 3776 attr->dw_attr_val.val_class = dw_val_class_long_long; 3777 attr->dw_attr_val.v.val_long_long.hi = val_hi; 3778 attr->dw_attr_val.v.val_long_long.low = val_low; 3779 add_dwarf_attr (die, attr); 3780} 3781 3782/* Add a floating point attribute value to a DIE and return it. */ 3783 3784static inline void 3785add_AT_float (die, attr_kind, length, array) 3786 register dw_die_ref die; 3787 register enum dwarf_attribute attr_kind; 3788 register unsigned length; 3789 register long *array; 3790{ 3791 register dw_attr_ref attr = (dw_attr_ref) xmalloc (sizeof (dw_attr_node)); 3792 3793 attr->dw_attr_next = NULL; 3794 attr->dw_attr = attr_kind; 3795 attr->dw_attr_val.val_class = dw_val_class_float; 3796 attr->dw_attr_val.v.val_float.length = length; 3797 attr->dw_attr_val.v.val_float.array = array; 3798 add_dwarf_attr (die, attr); 3799} 3800 3801/* Add a string attribute value to a DIE. */ 3802 3803static inline void 3804add_AT_string (die, attr_kind, str) 3805 register dw_die_ref die; 3806 register enum dwarf_attribute attr_kind; 3807 register char *str; 3808{ 3809 register dw_attr_ref attr = (dw_attr_ref) xmalloc (sizeof (dw_attr_node)); 3810 3811 attr->dw_attr_next = NULL; 3812 attr->dw_attr = attr_kind; 3813 attr->dw_attr_val.val_class = dw_val_class_str; 3814 attr->dw_attr_val.v.val_str = xstrdup (str); 3815 add_dwarf_attr (die, attr); 3816} 3817 3818/* Add a DIE reference attribute value to a DIE. */ 3819 3820static inline void 3821add_AT_die_ref (die, attr_kind, targ_die) 3822 register dw_die_ref die; 3823 register enum dwarf_attribute attr_kind; 3824 register dw_die_ref targ_die; 3825{ 3826 register dw_attr_ref attr = (dw_attr_ref) xmalloc (sizeof (dw_attr_node)); 3827 3828 attr->dw_attr_next = NULL; 3829 attr->dw_attr = attr_kind; 3830 attr->dw_attr_val.val_class = dw_val_class_die_ref; 3831 attr->dw_attr_val.v.val_die_ref = targ_die; 3832 add_dwarf_attr (die, attr); 3833} 3834 3835/* Add an FDE reference attribute value to a DIE. */ 3836 3837static inline void 3838add_AT_fde_ref (die, attr_kind, targ_fde) 3839 register dw_die_ref die; 3840 register enum dwarf_attribute attr_kind; 3841 register unsigned targ_fde; 3842{ 3843 register dw_attr_ref attr = (dw_attr_ref) xmalloc (sizeof (dw_attr_node)); 3844 3845 attr->dw_attr_next = NULL; 3846 attr->dw_attr = attr_kind; 3847 attr->dw_attr_val.val_class = dw_val_class_fde_ref; 3848 attr->dw_attr_val.v.val_fde_index = targ_fde; 3849 add_dwarf_attr (die, attr); 3850} 3851 3852/* Add a location description attribute value to a DIE. */ 3853 3854static inline void 3855add_AT_loc (die, attr_kind, loc) 3856 register dw_die_ref die; 3857 register enum dwarf_attribute attr_kind; 3858 register dw_loc_descr_ref loc; 3859{ 3860 register dw_attr_ref attr = (dw_attr_ref) xmalloc (sizeof (dw_attr_node)); 3861 3862 attr->dw_attr_next = NULL; 3863 attr->dw_attr = attr_kind; 3864 attr->dw_attr_val.val_class = dw_val_class_loc; 3865 attr->dw_attr_val.v.val_loc = loc; 3866 add_dwarf_attr (die, attr); 3867} 3868 3869/* Add an address constant attribute value to a DIE. */ 3870 3871static inline void 3872add_AT_addr (die, attr_kind, addr) 3873 register dw_die_ref die; 3874 register enum dwarf_attribute attr_kind; 3875 char *addr; 3876{ 3877 register dw_attr_ref attr = (dw_attr_ref) xmalloc (sizeof (dw_attr_node)); 3878 3879 attr->dw_attr_next = NULL; 3880 attr->dw_attr = attr_kind; 3881 attr->dw_attr_val.val_class = dw_val_class_addr; 3882 attr->dw_attr_val.v.val_addr = addr; 3883 add_dwarf_attr (die, attr); 3884} 3885 3886/* Add a label identifier attribute value to a DIE. */ 3887 3888static inline void 3889add_AT_lbl_id (die, attr_kind, lbl_id) 3890 register dw_die_ref die; 3891 register enum dwarf_attribute attr_kind; 3892 register char *lbl_id; 3893{ 3894 register dw_attr_ref attr = (dw_attr_ref) xmalloc (sizeof (dw_attr_node)); 3895 3896 attr->dw_attr_next = NULL; 3897 attr->dw_attr = attr_kind; 3898 attr->dw_attr_val.val_class = dw_val_class_lbl_id; 3899 attr->dw_attr_val.v.val_lbl_id = xstrdup (lbl_id); 3900 add_dwarf_attr (die, attr); 3901} 3902 3903/* Add a section offset attribute value to a DIE. */ 3904 3905static inline void
|
3810add_AT_section_offset (die, attr_kind, section)
|
3906add_AT_lbl_offset (die, attr_kind, label) |
3907 register dw_die_ref die; 3908 register enum dwarf_attribute attr_kind;
|
3813 register char *section;
|
3909 register char *label; |
3910{ 3911 register dw_attr_ref attr = (dw_attr_ref) xmalloc (sizeof (dw_attr_node)); 3912 3913 attr->dw_attr_next = NULL; 3914 attr->dw_attr = attr_kind;
|
3819 attr->dw_attr_val.val_class = dw_val_class_section_offset;
3820 attr->dw_attr_val.v.val_section = section;
|
3915 attr->dw_attr_val.val_class = dw_val_class_lbl_offset; 3916 attr->dw_attr_val.v.val_lbl_id = label; |
3917 add_dwarf_attr (die, attr); 3918 3919} 3920 3921/* Test if die refers to an external subroutine. */ 3922 3923static inline int 3924is_extern_subr_die (die) 3925 register dw_die_ref die; 3926{ 3927 register dw_attr_ref a; 3928 register int is_subr = FALSE; 3929 register int is_extern = FALSE; 3930 3931 if (die != NULL && die->die_tag == DW_TAG_subprogram) 3932 { 3933 is_subr = TRUE; 3934 for (a = die->die_attr; a != NULL; a = a->dw_attr_next) 3935 { 3936 if (a->dw_attr == DW_AT_external 3937 && a->dw_attr_val.val_class == dw_val_class_flag 3938 && a->dw_attr_val.v.val_flag != 0) 3939 { 3940 is_extern = TRUE; 3941 break; 3942 } 3943 } 3944 } 3945 3946 return is_subr && is_extern; 3947} 3948 3949/* Get the attribute of type attr_kind. */ 3950 3951static inline dw_attr_ref 3952get_AT (die, attr_kind) 3953 register dw_die_ref die; 3954 register enum dwarf_attribute attr_kind; 3955{ 3956 register dw_attr_ref a; 3957 register dw_die_ref spec = NULL; 3958 3959 if (die != NULL) 3960 { 3961 for (a = die->die_attr; a != NULL; a = a->dw_attr_next) 3962 { 3963 if (a->dw_attr == attr_kind) 3964 return a; 3965 3966 if (a->dw_attr == DW_AT_specification 3967 || a->dw_attr == DW_AT_abstract_origin) 3968 spec = a->dw_attr_val.v.val_die_ref; 3969 } 3970 3971 if (spec) 3972 return get_AT (spec, attr_kind); 3973 } 3974 3975 return NULL; 3976} 3977 3978/* Return the "low pc" attribute value, typically associated with 3979 a subprogram DIE. Return null if the "low pc" attribute is 3980 either not prsent, or if it cannot be represented as an 3981 assembler label identifier. */ 3982 3983static inline char * 3984get_AT_low_pc (die) 3985 register dw_die_ref die; 3986{ 3987 register dw_attr_ref a = get_AT (die, DW_AT_low_pc); 3988 3989 if (a && a->dw_attr_val.val_class == dw_val_class_lbl_id) 3990 return a->dw_attr_val.v.val_lbl_id; 3991 3992 return NULL; 3993} 3994 3995/* Return the "high pc" attribute value, typically associated with 3996 a subprogram DIE. Return null if the "high pc" attribute is 3997 either not prsent, or if it cannot be represented as an 3998 assembler label identifier. */ 3999 4000static inline char * 4001get_AT_hi_pc (die) 4002 register dw_die_ref die; 4003{ 4004 register dw_attr_ref a = get_AT (die, DW_AT_high_pc); 4005 4006 if (a && a->dw_attr_val.val_class == dw_val_class_lbl_id) 4007 return a->dw_attr_val.v.val_lbl_id; 4008 4009 return NULL; 4010} 4011 4012/* Return the value of the string attribute designated by ATTR_KIND, or 4013 NULL if it is not present. */ 4014 4015static inline char * 4016get_AT_string (die, attr_kind) 4017 register dw_die_ref die; 4018 register enum dwarf_attribute attr_kind; 4019{ 4020 register dw_attr_ref a = get_AT (die, attr_kind); 4021 4022 if (a && a->dw_attr_val.val_class == dw_val_class_str) 4023 return a->dw_attr_val.v.val_str; 4024 4025 return NULL; 4026} 4027 4028/* Return the value of the flag attribute designated by ATTR_KIND, or -1 4029 if it is not present. */ 4030 4031static inline int 4032get_AT_flag (die, attr_kind) 4033 register dw_die_ref die; 4034 register enum dwarf_attribute attr_kind; 4035{ 4036 register dw_attr_ref a = get_AT (die, attr_kind); 4037 4038 if (a && a->dw_attr_val.val_class == dw_val_class_flag) 4039 return a->dw_attr_val.v.val_flag; 4040 4041 return -1; 4042} 4043 4044/* Return the value of the unsigned attribute designated by ATTR_KIND, or 0 4045 if it is not present. */ 4046 4047static inline unsigned 4048get_AT_unsigned (die, attr_kind) 4049 register dw_die_ref die; 4050 register enum dwarf_attribute attr_kind; 4051{ 4052 register dw_attr_ref a = get_AT (die, attr_kind); 4053 4054 if (a && a->dw_attr_val.val_class == dw_val_class_unsigned_const) 4055 return a->dw_attr_val.v.val_unsigned; 4056 4057 return 0; 4058} 4059 4060static inline int 4061is_c_family () 4062{ 4063 register unsigned lang = get_AT_unsigned (comp_unit_die, DW_AT_language); 4064 4065 return (lang == DW_LANG_C || lang == DW_LANG_C89 4066 || lang == DW_LANG_C_plus_plus); 4067} 4068 4069static inline int 4070is_fortran () 4071{ 4072 register unsigned lang = get_AT_unsigned (comp_unit_die, DW_AT_language); 4073 4074 return (lang == DW_LANG_Fortran77 || lang == DW_LANG_Fortran90); 4075} 4076 4077/* Remove the specified attribute if present. */ 4078 4079static inline void 4080remove_AT (die, attr_kind) 4081 register dw_die_ref die; 4082 register enum dwarf_attribute attr_kind; 4083{ 4084 register dw_attr_ref a; 4085 register dw_attr_ref removed = NULL;; 4086 4087 if (die != NULL) 4088 { 4089 if (die->die_attr->dw_attr == attr_kind) 4090 { 4091 removed = die->die_attr; 4092 if (die->die_attr_last == die->die_attr) 4093 die->die_attr_last = NULL; 4094 4095 die->die_attr = die->die_attr->dw_attr_next; 4096 } 4097 4098 else 4099 for (a = die->die_attr; a->dw_attr_next != NULL; 4100 a = a->dw_attr_next) 4101 if (a->dw_attr_next->dw_attr == attr_kind) 4102 { 4103 removed = a->dw_attr_next; 4104 if (die->die_attr_last == a->dw_attr_next) 4105 die->die_attr_last = a; 4106 4107 a->dw_attr_next = a->dw_attr_next->dw_attr_next; 4108 break; 4109 } 4110 4111 if (removed != 0) 4112 free (removed); 4113 } 4114} 4115 4116/* Discard the children of this DIE. */ 4117 4118static inline void 4119remove_children (die) 4120 register dw_die_ref die; 4121{ 4122 register dw_die_ref child_die = die->die_child; 4123 4124 die->die_child = NULL; 4125 die->die_child_last = NULL; 4126 4127 while (child_die != NULL) 4128 { 4129 register dw_die_ref tmp_die = child_die; 4130 register dw_attr_ref a; 4131 4132 child_die = child_die->die_sib; 4133 4134 for (a = tmp_die->die_attr; a != NULL; ) 4135 { 4136 register dw_attr_ref tmp_a = a; 4137 4138 a = a->dw_attr_next; 4139 free (tmp_a); 4140 } 4141 4142 free (tmp_die); 4143 } 4144} 4145 4146/* Add a child DIE below its parent. */ 4147 4148static inline void 4149add_child_die (die, child_die) 4150 register dw_die_ref die; 4151 register dw_die_ref child_die; 4152{ 4153 if (die != NULL && child_die != NULL) 4154 { 4155 if (die == child_die) 4156 abort (); 4157 child_die->die_parent = die; 4158 child_die->die_sib = NULL; 4159 4160 if (die->die_child == NULL) 4161 { 4162 die->die_child = child_die; 4163 die->die_child_last = child_die; 4164 } 4165 else 4166 { 4167 die->die_child_last->die_sib = child_die; 4168 die->die_child_last = child_die; 4169 } 4170 } 4171} 4172 4173/* Return a pointer to a newly created DIE node. */ 4174 4175static inline dw_die_ref 4176new_die (tag_value, parent_die) 4177 register enum dwarf_tag tag_value; 4178 register dw_die_ref parent_die; 4179{ 4180 register dw_die_ref die = (dw_die_ref) xmalloc (sizeof (die_node)); 4181 4182 die->die_tag = tag_value; 4183 die->die_abbrev = 0; 4184 die->die_offset = 0; 4185 die->die_child = NULL; 4186 die->die_parent = NULL; 4187 die->die_sib = NULL; 4188 die->die_child_last = NULL; 4189 die->die_attr = NULL; 4190 die->die_attr_last = NULL; 4191 4192 if (parent_die != NULL) 4193 add_child_die (parent_die, die); 4194 else 4195 { 4196 limbo_die_node *limbo_node; 4197 4198 limbo_node = (limbo_die_node *) xmalloc (sizeof (limbo_die_node)); 4199 limbo_node->die = die; 4200 limbo_node->next = limbo_die_list; 4201 limbo_die_list = limbo_node; 4202 } 4203 4204 return die; 4205} 4206 4207/* Return the DIE associated with the given type specifier. */ 4208 4209static inline dw_die_ref 4210lookup_type_die (type) 4211 register tree type; 4212{ 4213 return (dw_die_ref) TYPE_SYMTAB_POINTER (type); 4214} 4215 4216/* Equate a DIE to a given type specifier. */ 4217 4218static void 4219equate_type_number_to_die (type, type_die) 4220 register tree type; 4221 register dw_die_ref type_die; 4222{ 4223 TYPE_SYMTAB_POINTER (type) = (char *) type_die; 4224} 4225 4226/* Return the DIE associated with a given declaration. */ 4227 4228static inline dw_die_ref 4229lookup_decl_die (decl) 4230 register tree decl; 4231{ 4232 register unsigned decl_id = DECL_UID (decl); 4233 4234 return (decl_id < decl_die_table_in_use 4235 ? decl_die_table[decl_id] : NULL); 4236} 4237 4238/* Equate a DIE to a particular declaration. */ 4239 4240static void 4241equate_decl_number_to_die (decl, decl_die) 4242 register tree decl; 4243 register dw_die_ref decl_die; 4244{ 4245 register unsigned decl_id = DECL_UID (decl); 4246 register unsigned num_allocated; 4247 4248 if (decl_id >= decl_die_table_allocated) 4249 { 4250 num_allocated 4251 = ((decl_id + 1 + DECL_DIE_TABLE_INCREMENT - 1) 4252 / DECL_DIE_TABLE_INCREMENT) 4253 * DECL_DIE_TABLE_INCREMENT; 4254 4255 decl_die_table 4256 = (dw_die_ref *) xrealloc (decl_die_table, 4257 sizeof (dw_die_ref) * num_allocated); 4258 4259 bzero ((char *) &decl_die_table[decl_die_table_allocated], 4260 (num_allocated - decl_die_table_allocated) * sizeof (dw_die_ref)); 4261 decl_die_table_allocated = num_allocated; 4262 } 4263 4264 if (decl_id >= decl_die_table_in_use) 4265 decl_die_table_in_use = (decl_id + 1); 4266 4267 decl_die_table[decl_id] = decl_die; 4268} 4269 4270/* Return a pointer to a newly allocated location description. Location 4271 descriptions are simple expression terms that can be strung 4272 together to form more complicated location (address) descriptions. */ 4273 4274static inline dw_loc_descr_ref 4275new_loc_descr (op, oprnd1, oprnd2) 4276 register enum dwarf_location_atom op; 4277 register unsigned long oprnd1; 4278 register unsigned long oprnd2; 4279{ 4280 register dw_loc_descr_ref descr 4281 = (dw_loc_descr_ref) xmalloc (sizeof (dw_loc_descr_node)); 4282 4283 descr->dw_loc_next = NULL; 4284 descr->dw_loc_opc = op; 4285 descr->dw_loc_oprnd1.val_class = dw_val_class_unsigned_const; 4286 descr->dw_loc_oprnd1.v.val_unsigned = oprnd1; 4287 descr->dw_loc_oprnd2.val_class = dw_val_class_unsigned_const; 4288 descr->dw_loc_oprnd2.v.val_unsigned = oprnd2; 4289 4290 return descr; 4291} 4292 4293/* Add a location description term to a location description expression. */ 4294 4295static inline void 4296add_loc_descr (list_head, descr) 4297 register dw_loc_descr_ref *list_head; 4298 register dw_loc_descr_ref descr; 4299{ 4300 register dw_loc_descr_ref *d; 4301 4302 /* Find the end of the chain. */ 4303 for (d = list_head; (*d) != NULL; d = &(*d)->dw_loc_next) 4304 ; 4305 4306 *d = descr; 4307} 4308 4309/* Keep track of the number of spaces used to indent the 4310 output of the debugging routines that print the structure of 4311 the DIE internal representation. */ 4312static int print_indent; 4313 4314/* Indent the line the number of spaces given by print_indent. */ 4315 4316static inline void 4317print_spaces (outfile) 4318 FILE *outfile; 4319{ 4320 fprintf (outfile, "%*s", print_indent, ""); 4321} 4322 4323/* Print the information associated with a given DIE, and its children. 4324 This routine is a debugging aid only. */ 4325 4326static void 4327print_die (die, outfile) 4328 dw_die_ref die; 4329 FILE *outfile; 4330{ 4331 register dw_attr_ref a; 4332 register dw_die_ref c; 4333 4334 print_spaces (outfile); 4335 fprintf (outfile, "DIE %4lu: %s\n", 4336 die->die_offset, dwarf_tag_name (die->die_tag)); 4337 print_spaces (outfile); 4338 fprintf (outfile, " abbrev id: %lu", die->die_abbrev); 4339 fprintf (outfile, " offset: %lu\n", die->die_offset); 4340 4341 for (a = die->die_attr; a != NULL; a = a->dw_attr_next) 4342 { 4343 print_spaces (outfile); 4344 fprintf (outfile, " %s: ", dwarf_attr_name (a->dw_attr)); 4345 4346 switch (a->dw_attr_val.val_class) 4347 { 4348 case dw_val_class_addr: 4349 fprintf (outfile, "address"); 4350 break; 4351 case dw_val_class_loc: 4352 fprintf (outfile, "location descriptor"); 4353 break; 4354 case dw_val_class_const: 4355 fprintf (outfile, "%ld", a->dw_attr_val.v.val_int); 4356 break; 4357 case dw_val_class_unsigned_const: 4358 fprintf (outfile, "%lu", a->dw_attr_val.v.val_unsigned); 4359 break; 4360 case dw_val_class_long_long: 4361 fprintf (outfile, "constant (%lu,%lu)", 4362 a->dw_attr_val.v.val_long_long.hi, 4363 a->dw_attr_val.v.val_long_long.low); 4364 break; 4365 case dw_val_class_float: 4366 fprintf (outfile, "floating-point constant"); 4367 break; 4368 case dw_val_class_flag: 4369 fprintf (outfile, "%u", a->dw_attr_val.v.val_flag); 4370 break; 4371 case dw_val_class_die_ref: 4372 if (a->dw_attr_val.v.val_die_ref != NULL) 4373 fprintf (outfile, "die -> %lu", 4374 a->dw_attr_val.v.val_die_ref->die_offset); 4375 else 4376 fprintf (outfile, "die -> <null>"); 4377 break; 4378 case dw_val_class_lbl_id:
|
4379 case dw_val_class_lbl_offset: |
4380 fprintf (outfile, "label: %s", a->dw_attr_val.v.val_lbl_id); 4381 break;
|
4285 case dw_val_class_section_offset:
4286 fprintf (outfile, "section: %s", a->dw_attr_val.v.val_section);
4287 break;
|
4382 case dw_val_class_str: 4383 if (a->dw_attr_val.v.val_str != NULL) 4384 fprintf (outfile, "\"%s\"", a->dw_attr_val.v.val_str); 4385 else 4386 fprintf (outfile, "<null>"); 4387 break; 4388 default: 4389 break; 4390 } 4391 4392 fprintf (outfile, "\n"); 4393 } 4394 4395 if (die->die_child != NULL) 4396 { 4397 print_indent += 4; 4398 for (c = die->die_child; c != NULL; c = c->die_sib) 4399 print_die (c, outfile); 4400 4401 print_indent -= 4; 4402 } 4403} 4404 4405/* Print the contents of the source code line number correspondence table. 4406 This routine is a debugging aid only. */ 4407 4408static void 4409print_dwarf_line_table (outfile) 4410 FILE *outfile; 4411{ 4412 register unsigned i; 4413 register dw_line_info_ref line_info; 4414 4415 fprintf (outfile, "\n\nDWARF source line information\n"); 4416 for (i = 1; i < line_info_table_in_use; ++i) 4417 { 4418 line_info = &line_info_table[i]; 4419 fprintf (outfile, "%5d: ", i); 4420 fprintf (outfile, "%-20s", file_table[line_info->dw_file_num]); 4421 fprintf (outfile, "%6ld", line_info->dw_line_num); 4422 fprintf (outfile, "\n"); 4423 } 4424 4425 fprintf (outfile, "\n\n"); 4426} 4427 4428/* Print the information collected for a given DIE. */ 4429 4430void 4431debug_dwarf_die (die) 4432 dw_die_ref die; 4433{ 4434 print_die (die, stderr); 4435} 4436 4437/* Print all DWARF information collected for the compilation unit. 4438 This routine is a debugging aid only. */ 4439 4440void 4441debug_dwarf () 4442{ 4443 print_indent = 0; 4444 print_die (comp_unit_die, stderr); 4445 print_dwarf_line_table (stderr); 4446} 4447 4448/* Traverse the DIE, and add a sibling attribute if it may have the 4449 effect of speeding up access to siblings. To save some space, 4450 avoid generating sibling attributes for DIE's without children. */ 4451 4452static void 4453add_sibling_attributes(die) 4454 register dw_die_ref die; 4455{ 4456 register dw_die_ref c; 4457 register dw_attr_ref attr; 4458 if (die != comp_unit_die && die->die_child != NULL) 4459 { 4460 attr = (dw_attr_ref) xmalloc (sizeof (dw_attr_node)); 4461 attr->dw_attr_next = NULL; 4462 attr->dw_attr = DW_AT_sibling; 4463 attr->dw_attr_val.val_class = dw_val_class_die_ref; 4464 attr->dw_attr_val.v.val_die_ref = die->die_sib; 4465 4466 /* Add the sibling link to the front of the attribute list. */ 4467 attr->dw_attr_next = die->die_attr; 4468 if (die->die_attr == NULL) 4469 die->die_attr_last = attr; 4470 4471 die->die_attr = attr; 4472 } 4473 4474 for (c = die->die_child; c != NULL; c = c->die_sib) 4475 add_sibling_attributes (c); 4476} 4477 4478/* The format of each DIE (and its attribute value pairs) 4479 is encoded in an abbreviation table. This routine builds the 4480 abbreviation table and assigns a unique abbreviation id for 4481 each abbreviation entry. The children of each die are visited 4482 recursively. */ 4483 4484static void 4485build_abbrev_table (die) 4486 register dw_die_ref die; 4487{ 4488 register unsigned long abbrev_id; 4489 register unsigned long n_alloc; 4490 register dw_die_ref c; 4491 register dw_attr_ref d_attr, a_attr; 4492 for (abbrev_id = 1; abbrev_id < abbrev_die_table_in_use; ++abbrev_id) 4493 { 4494 register dw_die_ref abbrev = abbrev_die_table[abbrev_id]; 4495 4496 if (abbrev->die_tag == die->die_tag) 4497 { 4498 if ((abbrev->die_child != NULL) == (die->die_child != NULL)) 4499 { 4500 a_attr = abbrev->die_attr; 4501 d_attr = die->die_attr; 4502 4503 while (a_attr != NULL && d_attr != NULL) 4504 { 4505 if ((a_attr->dw_attr != d_attr->dw_attr) 4506 || (value_format (&a_attr->dw_attr_val) 4507 != value_format (&d_attr->dw_attr_val))) 4508 break; 4509 4510 a_attr = a_attr->dw_attr_next; 4511 d_attr = d_attr->dw_attr_next; 4512 } 4513 4514 if (a_attr == NULL && d_attr == NULL) 4515 break; 4516 } 4517 } 4518 } 4519 4520 if (abbrev_id >= abbrev_die_table_in_use) 4521 { 4522 if (abbrev_die_table_in_use >= abbrev_die_table_allocated) 4523 { 4524 n_alloc = abbrev_die_table_allocated + ABBREV_DIE_TABLE_INCREMENT; 4525 abbrev_die_table 4526 = (dw_die_ref *) xrealloc (abbrev_die_table, 4527 sizeof (dw_die_ref) * n_alloc); 4528 4529 bzero ((char *) &abbrev_die_table[abbrev_die_table_allocated], 4530 (n_alloc - abbrev_die_table_allocated) * sizeof (dw_die_ref)); 4531 abbrev_die_table_allocated = n_alloc; 4532 } 4533 4534 ++abbrev_die_table_in_use; 4535 abbrev_die_table[abbrev_id] = die; 4536 } 4537 4538 die->die_abbrev = abbrev_id; 4539 for (c = die->die_child; c != NULL; c = c->die_sib) 4540 build_abbrev_table (c); 4541} 4542 4543/* Return the size of a string, including the null byte. 4544 4545 This used to treat backslashes as escapes, and hence they were not included 4546 in the count. However, that conflicts with what ASM_OUTPUT_ASCII does, 4547 which treats a backslash as a backslash, escaping it if necessary, and hence 4548 we must include them in the count. */ 4549 4550static unsigned long 4551size_of_string (str) 4552 register char *str; 4553{ 4554 return strlen (str) + 1; 4555} 4556 4557/* Return the size of a location descriptor. */ 4558 4559static unsigned long 4560size_of_loc_descr (loc) 4561 register dw_loc_descr_ref loc; 4562{ 4563 register unsigned long size = 1; 4564 4565 switch (loc->dw_loc_opc) 4566 { 4567 case DW_OP_addr: 4568 size += PTR_SIZE; 4569 break; 4570 case DW_OP_const1u: 4571 case DW_OP_const1s: 4572 size += 1; 4573 break; 4574 case DW_OP_const2u: 4575 case DW_OP_const2s: 4576 size += 2; 4577 break; 4578 case DW_OP_const4u: 4579 case DW_OP_const4s: 4580 size += 4; 4581 break; 4582 case DW_OP_const8u: 4583 case DW_OP_const8s: 4584 size += 8; 4585 break; 4586 case DW_OP_constu: 4587 size += size_of_uleb128 (loc->dw_loc_oprnd1.v.val_unsigned); 4588 break; 4589 case DW_OP_consts: 4590 size += size_of_sleb128 (loc->dw_loc_oprnd1.v.val_int); 4591 break; 4592 case DW_OP_pick: 4593 size += 1; 4594 break; 4595 case DW_OP_plus_uconst: 4596 size += size_of_uleb128 (loc->dw_loc_oprnd1.v.val_unsigned); 4597 break; 4598 case DW_OP_skip: 4599 case DW_OP_bra: 4600 size += 2; 4601 break; 4602 case DW_OP_breg0: 4603 case DW_OP_breg1: 4604 case DW_OP_breg2: 4605 case DW_OP_breg3: 4606 case DW_OP_breg4: 4607 case DW_OP_breg5: 4608 case DW_OP_breg6: 4609 case DW_OP_breg7: 4610 case DW_OP_breg8: 4611 case DW_OP_breg9: 4612 case DW_OP_breg10: 4613 case DW_OP_breg11: 4614 case DW_OP_breg12: 4615 case DW_OP_breg13: 4616 case DW_OP_breg14: 4617 case DW_OP_breg15: 4618 case DW_OP_breg16: 4619 case DW_OP_breg17: 4620 case DW_OP_breg18: 4621 case DW_OP_breg19: 4622 case DW_OP_breg20: 4623 case DW_OP_breg21: 4624 case DW_OP_breg22: 4625 case DW_OP_breg23: 4626 case DW_OP_breg24: 4627 case DW_OP_breg25: 4628 case DW_OP_breg26: 4629 case DW_OP_breg27: 4630 case DW_OP_breg28: 4631 case DW_OP_breg29: 4632 case DW_OP_breg30: 4633 case DW_OP_breg31: 4634 size += size_of_sleb128 (loc->dw_loc_oprnd1.v.val_int); 4635 break; 4636 case DW_OP_regx: 4637 size += size_of_uleb128 (loc->dw_loc_oprnd1.v.val_unsigned); 4638 break; 4639 case DW_OP_fbreg: 4640 size += size_of_sleb128 (loc->dw_loc_oprnd1.v.val_int); 4641 break; 4642 case DW_OP_bregx: 4643 size += size_of_uleb128 (loc->dw_loc_oprnd1.v.val_unsigned); 4644 size += size_of_sleb128 (loc->dw_loc_oprnd2.v.val_int); 4645 break; 4646 case DW_OP_piece: 4647 size += size_of_uleb128 (loc->dw_loc_oprnd1.v.val_unsigned); 4648 break; 4649 case DW_OP_deref_size: 4650 case DW_OP_xderef_size: 4651 size += 1; 4652 break; 4653 default: 4654 break; 4655 } 4656 4657 return size; 4658} 4659 4660/* Return the size of a series of location descriptors. */ 4661 4662static unsigned long 4663size_of_locs (loc) 4664 register dw_loc_descr_ref loc; 4665{ 4666 register unsigned long size = 0; 4667 4668 for (; loc != NULL; loc = loc->dw_loc_next) 4669 size += size_of_loc_descr (loc); 4670 4671 return size; 4672} 4673 4674/* Return the power-of-two number of bytes necessary to represent VALUE. */ 4675 4676static int 4677constant_size (value) 4678 long unsigned value; 4679{ 4680 int log; 4681 4682 if (value == 0) 4683 log = 0; 4684 else 4685 log = floor_log2 (value); 4686 4687 log = log / 8; 4688 log = 1 << (floor_log2 (log) + 1); 4689 4690 return log; 4691} 4692 4693/* Return the size of a DIE, as it is represented in the 4694 .debug_info section. */ 4695 4696static unsigned long 4697size_of_die (die) 4698 register dw_die_ref die; 4699{ 4700 register unsigned long size = 0; 4701 register dw_attr_ref a; 4702 4703 size += size_of_uleb128 (die->die_abbrev); 4704 for (a = die->die_attr; a != NULL; a = a->dw_attr_next) 4705 { 4706 switch (a->dw_attr_val.val_class) 4707 { 4708 case dw_val_class_addr: 4709 size += PTR_SIZE; 4710 break; 4711 case dw_val_class_loc: 4712 { 4713 register unsigned long lsize 4714 = size_of_locs (a->dw_attr_val.v.val_loc); 4715 4716 /* Block length. */ 4717 size += constant_size (lsize); 4718 size += lsize; 4719 } 4720 break; 4721 case dw_val_class_const: 4722 size += 4; 4723 break; 4724 case dw_val_class_unsigned_const: 4725 size += constant_size (a->dw_attr_val.v.val_unsigned); 4726 break; 4727 case dw_val_class_long_long: 4728 size += 1 + 8; /* block */ 4729 break; 4730 case dw_val_class_float: 4731 size += 1 + a->dw_attr_val.v.val_float.length * 4; /* block */ 4732 break; 4733 case dw_val_class_flag: 4734 size += 1; 4735 break; 4736 case dw_val_class_die_ref: 4737 size += DWARF_OFFSET_SIZE; 4738 break; 4739 case dw_val_class_fde_ref: 4740 size += DWARF_OFFSET_SIZE; 4741 break; 4742 case dw_val_class_lbl_id: 4743 size += PTR_SIZE; 4744 break;
|
4651 case dw_val_class_section_offset:
|
4745 case dw_val_class_lbl_offset: |
4746 size += DWARF_OFFSET_SIZE; 4747 break; 4748 case dw_val_class_str: 4749 size += size_of_string (a->dw_attr_val.v.val_str); 4750 break; 4751 default: 4752 abort (); 4753 } 4754 } 4755 4756 return size; 4757} 4758 4759/* Size the debugging information associated with a given DIE. 4760 Visits the DIE's children recursively. Updates the global 4761 variable next_die_offset, on each time through. Uses the 4762 current value of next_die_offset to update the die_offset 4763 field in each DIE. */ 4764 4765static void 4766calc_die_sizes (die) 4767 dw_die_ref die; 4768{ 4769 register dw_die_ref c; 4770 die->die_offset = next_die_offset; 4771 next_die_offset += size_of_die (die); 4772 4773 for (c = die->die_child; c != NULL; c = c->die_sib) 4774 calc_die_sizes (c); 4775 4776 if (die->die_child != NULL) 4777 /* Count the null byte used to terminate sibling lists. */ 4778 next_die_offset += 1; 4779} 4780 4781/* Return the size of the line information prolog generated for the 4782 compilation unit. */ 4783 4784static unsigned long 4785size_of_line_prolog () 4786{ 4787 register unsigned long size; 4788 register unsigned long ft_index; 4789 4790 size = DWARF_LINE_PROLOG_HEADER_SIZE; 4791 4792 /* Count the size of the table giving number of args for each 4793 standard opcode. */ 4794 size += DWARF_LINE_OPCODE_BASE - 1; 4795 4796 /* Include directory table is empty (at present). Count only the 4797 null byte used to terminate the table. */ 4798 size += 1; 4799 4800 for (ft_index = 1; ft_index < file_table_in_use; ++ft_index) 4801 { 4802 /* File name entry. */ 4803 size += size_of_string (file_table[ft_index]); 4804 4805 /* Include directory index. */ 4806 size += size_of_uleb128 (0); 4807 4808 /* Modification time. */ 4809 size += size_of_uleb128 (0); 4810 4811 /* File length in bytes. */ 4812 size += size_of_uleb128 (0); 4813 } 4814 4815 /* Count the file table terminator. */ 4816 size += 1; 4817 return size; 4818} 4819 4820/* Return the size of the line information generated for this 4821 compilation unit. */ 4822 4823static unsigned long 4824size_of_line_info () 4825{ 4826 register unsigned long size; 4827 register unsigned long lt_index; 4828 register unsigned long current_line; 4829 register long line_offset; 4830 register long line_delta; 4831 register unsigned long current_file; 4832 register unsigned long function; 4833 unsigned long size_of_set_address; 4834 4835 /* Size of a DW_LNE_set_address instruction. */ 4836 size_of_set_address = 1 + size_of_uleb128 (1 + PTR_SIZE) + 1 + PTR_SIZE; 4837 4838 /* Version number. */ 4839 size = 2; 4840 4841 /* Prolog length specifier. */ 4842 size += DWARF_OFFSET_SIZE; 4843 4844 /* Prolog. */ 4845 size += size_of_line_prolog (); 4846
|
4753 /* Set address register instruction. */
4754 size += size_of_set_address;
4755
|
4847 current_file = 1; 4848 current_line = 1; 4849 for (lt_index = 1; lt_index < line_info_table_in_use; ++lt_index) 4850 {
|
4760 register dw_line_info_ref line_info;
|
4851 register dw_line_info_ref line_info = &line_info_table[lt_index]; |
4852
|
4853 if (line_info->dw_line_num == current_line 4854 && line_info->dw_file_num == current_file) 4855 continue; 4856 |
4857 /* Advance pc instruction. */ 4858 /* ??? See the DW_LNS_advance_pc comment in output_line_info. */ 4859 if (0) 4860 size += 1 + 2; 4861 else 4862 size += size_of_set_address; 4863
|
4769 line_info = &line_info_table[lt_index];
|
4864 if (line_info->dw_file_num != current_file) 4865 { 4866 /* Set file number instruction. */ 4867 size += 1; 4868 current_file = line_info->dw_file_num; 4869 size += size_of_uleb128 (current_file); 4870 } 4871 4872 if (line_info->dw_line_num != current_line) 4873 { 4874 line_offset = line_info->dw_line_num - current_line; 4875 line_delta = line_offset - DWARF_LINE_BASE; 4876 current_line = line_info->dw_line_num; 4877 if (line_delta >= 0 && line_delta < (DWARF_LINE_RANGE - 1)) 4878 /* 1-byte special line number instruction. */ 4879 size += 1; 4880 else 4881 { 4882 /* Advance line instruction. */ 4883 size += 1; 4884 size += size_of_sleb128 (line_offset); 4885 /* Generate line entry instruction. */ 4886 size += 1; 4887 } 4888 } 4889 } 4890 4891 /* Advance pc instruction. */ 4892 if (0) 4893 size += 1 + 2; 4894 else 4895 size += size_of_set_address; 4896 4897 /* End of line number info. marker. */ 4898 size += 1 + size_of_uleb128 (1) + 1; 4899 4900 function = 0; 4901 current_file = 1; 4902 current_line = 1; 4903 for (lt_index = 0; lt_index < separate_line_info_table_in_use; ) 4904 { 4905 register dw_separate_line_info_ref line_info 4906 = &separate_line_info_table[lt_index];
|
4907 4908 if (line_info->dw_line_num == current_line 4909 && line_info->dw_file_num == current_file 4910 && line_info->function == function) 4911 goto cont; 4912 |
4913 if (function != line_info->function) 4914 { 4915 function = line_info->function; 4916 /* Set address register instruction. */ 4917 size += size_of_set_address; 4918 } 4919 else 4920 { 4921 /* Advance pc instruction. */ 4922 if (0) 4923 size += 1 + 2; 4924 else 4925 size += size_of_set_address; 4926 } 4927 4928 if (line_info->dw_file_num != current_file) 4929 { 4930 /* Set file number instruction. */ 4931 size += 1; 4932 current_file = line_info->dw_file_num; 4933 size += size_of_uleb128 (current_file); 4934 } 4935 4936 if (line_info->dw_line_num != current_line) 4937 { 4938 line_offset = line_info->dw_line_num - current_line; 4939 line_delta = line_offset - DWARF_LINE_BASE; 4940 current_line = line_info->dw_line_num; 4941 if (line_delta >= 0 && line_delta < (DWARF_LINE_RANGE - 1)) 4942 /* 1-byte special line number instruction. */ 4943 size += 1; 4944 else 4945 { 4946 /* Advance line instruction. */ 4947 size += 1; 4948 size += size_of_sleb128 (line_offset); 4949 4950 /* Generate line entry instruction. */ 4951 size += 1; 4952 } 4953 } 4954
|
4955 cont: |
4956 ++lt_index; 4957 4958 /* If we're done with a function, end its sequence. */ 4959 if (lt_index == separate_line_info_table_in_use 4960 || separate_line_info_table[lt_index].function != function) 4961 { 4962 current_file = 1; 4963 current_line = 1; 4964 4965 /* Advance pc instruction. */ 4966 if (0) 4967 size += 1 + 2; 4968 else 4969 size += size_of_set_address; 4970 4971 /* End of line number info. marker. */ 4972 size += 1 + size_of_uleb128 (1) + 1; 4973 } 4974 } 4975 4976 return size; 4977} 4978 4979/* Return the size of the .debug_pubnames table generated for the 4980 compilation unit. */ 4981 4982static unsigned long 4983size_of_pubnames () 4984{ 4985 register unsigned long size; 4986 register unsigned i; 4987 4988 size = DWARF_PUBNAMES_HEADER_SIZE; 4989 for (i = 0; i < pubname_table_in_use; ++i) 4990 { 4991 register pubname_ref p = &pubname_table[i]; 4992 size += DWARF_OFFSET_SIZE + size_of_string (p->name); 4993 } 4994 4995 size += DWARF_OFFSET_SIZE; 4996 return size; 4997} 4998 4999/* Return the size of the information in the .debug_aranges section. */ 5000 5001static unsigned long 5002size_of_aranges () 5003{ 5004 register unsigned long size; 5005 5006 size = DWARF_ARANGES_HEADER_SIZE; 5007 5008 /* Count the address/length pair for this compilation unit. */ 5009 size += 2 * PTR_SIZE; 5010 size += 2 * PTR_SIZE * arange_table_in_use; 5011 5012 /* Count the two zero words used to terminated the address range table. */ 5013 size += 2 * PTR_SIZE; 5014 return size; 5015} 5016 5017/* Select the encoding of an attribute value. */ 5018 5019static enum dwarf_form 5020value_format (v) 5021 dw_val_ref v; 5022{ 5023 switch (v->val_class) 5024 { 5025 case dw_val_class_addr: 5026 return DW_FORM_addr; 5027 case dw_val_class_loc: 5028 switch (constant_size (size_of_locs (v->v.val_loc))) 5029 { 5030 case 1: 5031 return DW_FORM_block1; 5032 case 2: 5033 return DW_FORM_block2; 5034 default: 5035 abort (); 5036 } 5037 case dw_val_class_const: 5038 return DW_FORM_data4; 5039 case dw_val_class_unsigned_const: 5040 switch (constant_size (v->v.val_unsigned)) 5041 { 5042 case 1: 5043 return DW_FORM_data1; 5044 case 2: 5045 return DW_FORM_data2; 5046 case 4: 5047 return DW_FORM_data4; 5048 case 8: 5049 return DW_FORM_data8; 5050 default: 5051 abort (); 5052 } 5053 case dw_val_class_long_long: 5054 return DW_FORM_block1; 5055 case dw_val_class_float: 5056 return DW_FORM_block1; 5057 case dw_val_class_flag: 5058 return DW_FORM_flag; 5059 case dw_val_class_die_ref: 5060 return DW_FORM_ref; 5061 case dw_val_class_fde_ref: 5062 return DW_FORM_data; 5063 case dw_val_class_lbl_id: 5064 return DW_FORM_addr;
|
4964 case dw_val_class_section_offset:
|
5065 case dw_val_class_lbl_offset: |
5066 return DW_FORM_data; 5067 case dw_val_class_str: 5068 return DW_FORM_string; 5069 default: 5070 abort (); 5071 } 5072} 5073 5074/* Output the encoding of an attribute value. */ 5075 5076static void 5077output_value_format (v) 5078 dw_val_ref v; 5079{ 5080 enum dwarf_form form = value_format (v); 5081 5082 output_uleb128 (form); 5083 if (flag_debug_asm) 5084 fprintf (asm_out_file, " (%s)", dwarf_form_name (form)); 5085 5086 fputc ('\n', asm_out_file); 5087} 5088 5089/* Output the .debug_abbrev section which defines the DIE abbreviation 5090 table. */ 5091 5092static void 5093output_abbrev_section () 5094{ 5095 unsigned long abbrev_id; 5096 5097 dw_attr_ref a_attr; 5098 for (abbrev_id = 1; abbrev_id < abbrev_die_table_in_use; ++abbrev_id) 5099 { 5100 register dw_die_ref abbrev = abbrev_die_table[abbrev_id]; 5101 5102 output_uleb128 (abbrev_id); 5103 if (flag_debug_asm) 5104 fprintf (asm_out_file, " (abbrev code)"); 5105 5106 fputc ('\n', asm_out_file); 5107 output_uleb128 (abbrev->die_tag); 5108 if (flag_debug_asm) 5109 fprintf (asm_out_file, " (TAG: %s)", 5110 dwarf_tag_name (abbrev->die_tag)); 5111 5112 fputc ('\n', asm_out_file); 5113 fprintf (asm_out_file, "\t%s\t0x%x", ASM_BYTE_OP, 5114 abbrev->die_child != NULL ? DW_children_yes : DW_children_no); 5115 5116 if (flag_debug_asm) 5117 fprintf (asm_out_file, "\t%s %s", 5118 ASM_COMMENT_START, 5119 (abbrev->die_child != NULL 5120 ? "DW_children_yes" : "DW_children_no")); 5121 5122 fputc ('\n', asm_out_file); 5123 5124 for (a_attr = abbrev->die_attr; a_attr != NULL; 5125 a_attr = a_attr->dw_attr_next) 5126 { 5127 output_uleb128 (a_attr->dw_attr); 5128 if (flag_debug_asm) 5129 fprintf (asm_out_file, " (%s)", 5130 dwarf_attr_name (a_attr->dw_attr)); 5131 5132 fputc ('\n', asm_out_file); 5133 output_value_format (&a_attr->dw_attr_val); 5134 } 5135 5136 fprintf (asm_out_file, "\t%s\t0,0\n", ASM_BYTE_OP); 5137 }
|
5138 5139 /* We need to properly terminate the abbrev table for this 5140 compilation unit, as per the standard, and not rely on 5141 workarounds in e.g. gdb. */ 5142 fprintf (asm_out_file, "\t%s\t0\n", ASM_BYTE_OP); |
5143} 5144 5145/* Output location description stack opcode's operands (if any). */ 5146 5147static void 5148output_loc_operands (loc) 5149 register dw_loc_descr_ref loc; 5150{ 5151 register dw_val_ref val1 = &loc->dw_loc_oprnd1; 5152 register dw_val_ref val2 = &loc->dw_loc_oprnd2; 5153 5154 switch (loc->dw_loc_opc) 5155 { 5156 case DW_OP_addr: 5157 ASM_OUTPUT_DWARF_ADDR_CONST (asm_out_file, val1->v.val_addr); 5158 fputc ('\n', asm_out_file); 5159 break; 5160 case DW_OP_const1u: 5161 case DW_OP_const1s: 5162 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, val1->v.val_flag); 5163 fputc ('\n', asm_out_file); 5164 break; 5165 case DW_OP_const2u: 5166 case DW_OP_const2s: 5167 ASM_OUTPUT_DWARF_DATA2 (asm_out_file, val1->v.val_int); 5168 fputc ('\n', asm_out_file); 5169 break; 5170 case DW_OP_const4u: 5171 case DW_OP_const4s: 5172 ASM_OUTPUT_DWARF_DATA4 (asm_out_file, val1->v.val_int); 5173 fputc ('\n', asm_out_file); 5174 break; 5175 case DW_OP_const8u: 5176 case DW_OP_const8s: 5177 abort (); 5178 fputc ('\n', asm_out_file); 5179 break; 5180 case DW_OP_constu: 5181 output_uleb128 (val1->v.val_unsigned); 5182 fputc ('\n', asm_out_file); 5183 break; 5184 case DW_OP_consts: 5185 output_sleb128 (val1->v.val_int); 5186 fputc ('\n', asm_out_file); 5187 break; 5188 case DW_OP_pick: 5189 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, val1->v.val_int); 5190 fputc ('\n', asm_out_file); 5191 break; 5192 case DW_OP_plus_uconst: 5193 output_uleb128 (val1->v.val_unsigned); 5194 fputc ('\n', asm_out_file); 5195 break; 5196 case DW_OP_skip: 5197 case DW_OP_bra: 5198 ASM_OUTPUT_DWARF_DATA2 (asm_out_file, val1->v.val_int); 5199 fputc ('\n', asm_out_file); 5200 break; 5201 case DW_OP_breg0: 5202 case DW_OP_breg1: 5203 case DW_OP_breg2: 5204 case DW_OP_breg3: 5205 case DW_OP_breg4: 5206 case DW_OP_breg5: 5207 case DW_OP_breg6: 5208 case DW_OP_breg7: 5209 case DW_OP_breg8: 5210 case DW_OP_breg9: 5211 case DW_OP_breg10: 5212 case DW_OP_breg11: 5213 case DW_OP_breg12: 5214 case DW_OP_breg13: 5215 case DW_OP_breg14: 5216 case DW_OP_breg15: 5217 case DW_OP_breg16: 5218 case DW_OP_breg17: 5219 case DW_OP_breg18: 5220 case DW_OP_breg19: 5221 case DW_OP_breg20: 5222 case DW_OP_breg21: 5223 case DW_OP_breg22: 5224 case DW_OP_breg23: 5225 case DW_OP_breg24: 5226 case DW_OP_breg25: 5227 case DW_OP_breg26: 5228 case DW_OP_breg27: 5229 case DW_OP_breg28: 5230 case DW_OP_breg29: 5231 case DW_OP_breg30: 5232 case DW_OP_breg31: 5233 output_sleb128 (val1->v.val_int); 5234 fputc ('\n', asm_out_file); 5235 break; 5236 case DW_OP_regx: 5237 output_uleb128 (val1->v.val_unsigned); 5238 fputc ('\n', asm_out_file); 5239 break; 5240 case DW_OP_fbreg: 5241 output_sleb128 (val1->v.val_int); 5242 fputc ('\n', asm_out_file); 5243 break; 5244 case DW_OP_bregx: 5245 output_uleb128 (val1->v.val_unsigned); 5246 fputc ('\n', asm_out_file); 5247 output_sleb128 (val2->v.val_int); 5248 fputc ('\n', asm_out_file); 5249 break; 5250 case DW_OP_piece: 5251 output_uleb128 (val1->v.val_unsigned); 5252 fputc ('\n', asm_out_file); 5253 break; 5254 case DW_OP_deref_size: 5255 case DW_OP_xderef_size: 5256 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, val1->v.val_flag); 5257 fputc ('\n', asm_out_file); 5258 break; 5259 default: 5260 break; 5261 } 5262} 5263 5264/* Compute the offset of a sibling. */ 5265 5266static unsigned long 5267sibling_offset (die) 5268 dw_die_ref die; 5269{ 5270 unsigned long offset; 5271 5272 if (die->die_child_last == NULL) 5273 offset = die->die_offset + size_of_die (die); 5274 else 5275 offset = sibling_offset (die->die_child_last) + 1; 5276 5277 return offset; 5278} 5279 5280/* Output the DIE and its attributes. Called recursively to generate 5281 the definitions of each child DIE. */ 5282 5283static void 5284output_die (die) 5285 register dw_die_ref die; 5286{ 5287 register dw_attr_ref a; 5288 register dw_die_ref c; 5289 register unsigned long ref_offset; 5290 register unsigned long size; 5291 register dw_loc_descr_ref loc;
|
5186 register int i;
|
5292 5293 output_uleb128 (die->die_abbrev); 5294 if (flag_debug_asm) 5295 fprintf (asm_out_file, " (DIE (0x%lx) %s)", 5296 die->die_offset, dwarf_tag_name (die->die_tag)); 5297 5298 fputc ('\n', asm_out_file); 5299 5300 for (a = die->die_attr; a != NULL; a = a->dw_attr_next) 5301 { 5302 switch (a->dw_attr_val.val_class) 5303 { 5304 case dw_val_class_addr: 5305 ASM_OUTPUT_DWARF_ADDR_CONST (asm_out_file, 5306 a->dw_attr_val.v.val_addr); 5307 break; 5308 5309 case dw_val_class_loc: 5310 size = size_of_locs (a->dw_attr_val.v.val_loc); 5311 5312 /* Output the block length for this list of location operations. */ 5313 switch (constant_size (size)) 5314 { 5315 case 1: 5316 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, size); 5317 break; 5318 case 2: 5319 ASM_OUTPUT_DWARF_DATA2 (asm_out_file, size); 5320 break; 5321 default: 5322 abort (); 5323 } 5324 5325 if (flag_debug_asm) 5326 fprintf (asm_out_file, "\t%s %s", 5327 ASM_COMMENT_START, dwarf_attr_name (a->dw_attr)); 5328 5329 fputc ('\n', asm_out_file); 5330 for (loc = a->dw_attr_val.v.val_loc; loc != NULL; 5331 loc = loc->dw_loc_next) 5332 { 5333 /* Output the opcode. */ 5334 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, loc->dw_loc_opc); 5335 if (flag_debug_asm) 5336 fprintf (asm_out_file, "\t%s %s", ASM_COMMENT_START, 5337 dwarf_stack_op_name (loc->dw_loc_opc)); 5338 5339 fputc ('\n', asm_out_file); 5340 5341 /* Output the operand(s) (if any). */ 5342 output_loc_operands (loc); 5343 } 5344 break; 5345 5346 case dw_val_class_const: 5347 ASM_OUTPUT_DWARF_DATA4 (asm_out_file, a->dw_attr_val.v.val_int); 5348 break; 5349 5350 case dw_val_class_unsigned_const: 5351 switch (constant_size (a->dw_attr_val.v.val_unsigned)) 5352 { 5353 case 1: 5354 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 5355 a->dw_attr_val.v.val_unsigned); 5356 break; 5357 case 2: 5358 ASM_OUTPUT_DWARF_DATA2 (asm_out_file, 5359 a->dw_attr_val.v.val_unsigned); 5360 break; 5361 case 4: 5362 ASM_OUTPUT_DWARF_DATA4 (asm_out_file, 5363 a->dw_attr_val.v.val_unsigned); 5364 break; 5365 case 8: 5366 ASM_OUTPUT_DWARF_DATA8 (asm_out_file, 5367 a->dw_attr_val.v.val_long_long.hi, 5368 a->dw_attr_val.v.val_long_long.low); 5369 break; 5370 default: 5371 abort (); 5372 } 5373 break; 5374 5375 case dw_val_class_long_long: 5376 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 8); 5377 if (flag_debug_asm) 5378 fprintf (asm_out_file, "\t%s %s", 5379 ASM_COMMENT_START, dwarf_attr_name (a->dw_attr)); 5380 5381 fputc ('\n', asm_out_file); 5382 ASM_OUTPUT_DWARF_DATA8 (asm_out_file, 5383 a->dw_attr_val.v.val_long_long.hi, 5384 a->dw_attr_val.v.val_long_long.low); 5385 5386 if (flag_debug_asm) 5387 fprintf (asm_out_file, 5388 "\t%s long long constant", ASM_COMMENT_START); 5389 5390 fputc ('\n', asm_out_file); 5391 break; 5392 5393 case dw_val_class_float:
|
5289 ASM_OUTPUT_DWARF_DATA1 (asm_out_file,
5290 a->dw_attr_val.v.val_float.length * 4);
5291 if (flag_debug_asm)
5292 fprintf (asm_out_file, "\t%s %s",
5293 ASM_COMMENT_START, dwarf_attr_name (a->dw_attr));
|
5394 { 5395 register unsigned int i; 5396 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 5397 a->dw_attr_val.v.val_float.length * 4); 5398 if (flag_debug_asm) 5399 fprintf (asm_out_file, "\t%s %s", 5400 ASM_COMMENT_START, dwarf_attr_name (a->dw_attr)); |
5401
|
5295 fputc ('\n', asm_out_file);
5296 for (i = 0; i < a->dw_attr_val.v.val_float.length; ++i)
5297 {
5298 ASM_OUTPUT_DWARF_DATA4 (asm_out_file,
5299 a->dw_attr_val.v.val_float.array[i]);
5300 if (flag_debug_asm)
5301 fprintf (asm_out_file, "\t%s fp constant word %d",
5302 ASM_COMMENT_START, i);
|
5402 fputc ('\n', asm_out_file); 5403 for (i = 0; i < a->dw_attr_val.v.val_float.length; ++i) 5404 { 5405 ASM_OUTPUT_DWARF_DATA4 (asm_out_file, 5406 a->dw_attr_val.v.val_float.array[i]); 5407 if (flag_debug_asm) 5408 fprintf (asm_out_file, "\t%s fp constant word %u", 5409 ASM_COMMENT_START, i); |
5410
|
5304 fputc ('\n', asm_out_file);
5305 }
|
5411 fputc ('\n', asm_out_file); 5412 } |
5413 break;
|
5414 } |
5415 5416 case dw_val_class_flag: 5417 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, a->dw_attr_val.v.val_flag); 5418 break; 5419 5420 case dw_val_class_die_ref: 5421 if (a->dw_attr_val.v.val_die_ref != NULL) 5422 ref_offset = a->dw_attr_val.v.val_die_ref->die_offset; 5423 else if (a->dw_attr == DW_AT_sibling) 5424 ref_offset = sibling_offset(die); 5425 else 5426 abort (); 5427 5428 ASM_OUTPUT_DWARF_DATA (asm_out_file, ref_offset); 5429 break; 5430 5431 case dw_val_class_fde_ref: 5432 { 5433 char l1[20]; 5434 ASM_GENERATE_INTERNAL_LABEL 5435 (l1, FDE_AFTER_SIZE_LABEL, a->dw_attr_val.v.val_fde_index * 2); 5436 ASM_OUTPUT_DWARF_OFFSET (asm_out_file, l1); 5437 fprintf (asm_out_file, " - %d", DWARF_OFFSET_SIZE); 5438 } 5439 break; 5440 5441 case dw_val_class_lbl_id: 5442 ASM_OUTPUT_DWARF_ADDR (asm_out_file, a->dw_attr_val.v.val_lbl_id); 5443 break; 5444
|
5337 case dw_val_class_section_offset:
5338 ASM_OUTPUT_DWARF_OFFSET (asm_out_file,
5339 stripattributes
5340 (a->dw_attr_val.v.val_section));
|
5445 case dw_val_class_lbl_offset: 5446 ASM_OUTPUT_DWARF_OFFSET (asm_out_file, a->dw_attr_val.v.val_lbl_id); |
5447 break; 5448 5449 case dw_val_class_str: 5450 if (flag_debug_asm) 5451 ASM_OUTPUT_DWARF_STRING (asm_out_file, a->dw_attr_val.v.val_str); 5452 else 5453 ASM_OUTPUT_ASCII (asm_out_file, 5454 a->dw_attr_val.v.val_str,
|
5349 strlen (a->dw_attr_val.v.val_str) + 1);
|
5455 (int) strlen (a->dw_attr_val.v.val_str) + 1); |
5456 break; 5457 5458 default: 5459 abort (); 5460 } 5461 5462 if (a->dw_attr_val.val_class != dw_val_class_loc 5463 && a->dw_attr_val.val_class != dw_val_class_long_long 5464 && a->dw_attr_val.val_class != dw_val_class_float) 5465 { 5466 if (flag_debug_asm) 5467 fprintf (asm_out_file, "\t%s %s", 5468 ASM_COMMENT_START, dwarf_attr_name (a->dw_attr)); 5469 5470 fputc ('\n', asm_out_file); 5471 } 5472 } 5473 5474 for (c = die->die_child; c != NULL; c = c->die_sib) 5475 output_die (c); 5476 5477 if (die->die_child != NULL) 5478 { 5479 /* Add null byte to terminate sibling list. */ 5480 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 0); 5481 if (flag_debug_asm) 5482 fprintf (asm_out_file, "\t%s end of children of DIE 0x%lx", 5483 ASM_COMMENT_START, die->die_offset); 5484 5485 fputc ('\n', asm_out_file); 5486 } 5487} 5488 5489/* Output the compilation unit that appears at the beginning of the 5490 .debug_info section, and precedes the DIE descriptions. */ 5491 5492static void 5493output_compilation_unit_header () 5494{ 5495 ASM_OUTPUT_DWARF_DATA (asm_out_file, next_die_offset - DWARF_OFFSET_SIZE); 5496 if (flag_debug_asm) 5497 fprintf (asm_out_file, "\t%s Length of Compilation Unit Info.", 5498 ASM_COMMENT_START); 5499 5500 fputc ('\n', asm_out_file); 5501 ASM_OUTPUT_DWARF_DATA2 (asm_out_file, DWARF_VERSION); 5502 if (flag_debug_asm) 5503 fprintf (asm_out_file, "\t%s DWARF version number", ASM_COMMENT_START); 5504 5505 fputc ('\n', asm_out_file);
|
5400 ASM_OUTPUT_DWARF_OFFSET (asm_out_file, stripattributes (ABBREV_SECTION));
|
5506 ASM_OUTPUT_DWARF_OFFSET (asm_out_file, abbrev_section_label); |
5507 if (flag_debug_asm) 5508 fprintf (asm_out_file, "\t%s Offset Into Abbrev. Section", 5509 ASM_COMMENT_START); 5510 5511 fputc ('\n', asm_out_file); 5512 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, PTR_SIZE); 5513 if (flag_debug_asm) 5514 fprintf (asm_out_file, "\t%s Pointer Size (in bytes)", ASM_COMMENT_START); 5515 5516 fputc ('\n', asm_out_file); 5517} 5518 5519/* The DWARF2 pubname for a nested thingy looks like "A::f". The output 5520 of decl_printable_name for C++ looks like "A::f(int)". Let's drop the 5521 argument list, and maybe the scope. */ 5522 5523static char * 5524dwarf2_name (decl, scope) 5525 tree decl; 5526 int scope; 5527{ 5528 return (*decl_printable_name) (decl, scope ? 1 : 0); 5529} 5530 5531/* Add a new entry to .debug_pubnames if appropriate. */ 5532 5533static void 5534add_pubname (decl, die) 5535 tree decl; 5536 dw_die_ref die; 5537{ 5538 pubname_ref p; 5539 5540 if (! TREE_PUBLIC (decl)) 5541 return; 5542 5543 if (pubname_table_in_use == pubname_table_allocated) 5544 { 5545 pubname_table_allocated += PUBNAME_TABLE_INCREMENT; 5546 pubname_table = (pubname_ref) xrealloc 5547 (pubname_table, pubname_table_allocated * sizeof (pubname_entry)); 5548 } 5549 5550 p = &pubname_table[pubname_table_in_use++]; 5551 p->die = die; 5552 5553 p->name = xstrdup (dwarf2_name (decl, 1)); 5554} 5555 5556/* Output the public names table used to speed up access to externally 5557 visible names. For now, only generate entries for externally 5558 visible procedures. */ 5559 5560static void 5561output_pubnames () 5562{ 5563 register unsigned i; 5564 register unsigned long pubnames_length = size_of_pubnames (); 5565 5566 ASM_OUTPUT_DWARF_DATA (asm_out_file, pubnames_length); 5567 5568 if (flag_debug_asm) 5569 fprintf (asm_out_file, "\t%s Length of Public Names Info.", 5570 ASM_COMMENT_START); 5571 5572 fputc ('\n', asm_out_file); 5573 ASM_OUTPUT_DWARF_DATA2 (asm_out_file, DWARF_VERSION); 5574 5575 if (flag_debug_asm) 5576 fprintf (asm_out_file, "\t%s DWARF Version", ASM_COMMENT_START); 5577 5578 fputc ('\n', asm_out_file);
|
5473 ASM_OUTPUT_DWARF_OFFSET (asm_out_file, stripattributes (DEBUG_INFO_SECTION));
|
5579 ASM_OUTPUT_DWARF_OFFSET (asm_out_file, debug_info_section_label); |
5580 if (flag_debug_asm) 5581 fprintf (asm_out_file, "\t%s Offset of Compilation Unit Info.", 5582 ASM_COMMENT_START); 5583 5584 fputc ('\n', asm_out_file); 5585 ASM_OUTPUT_DWARF_DATA (asm_out_file, next_die_offset); 5586 if (flag_debug_asm) 5587 fprintf (asm_out_file, "\t%s Compilation Unit Length", ASM_COMMENT_START); 5588 5589 fputc ('\n', asm_out_file); 5590 for (i = 0; i < pubname_table_in_use; ++i) 5591 { 5592 register pubname_ref pub = &pubname_table[i]; 5593 5594 ASM_OUTPUT_DWARF_DATA (asm_out_file, pub->die->die_offset); 5595 if (flag_debug_asm) 5596 fprintf (asm_out_file, "\t%s DIE offset", ASM_COMMENT_START); 5597 5598 fputc ('\n', asm_out_file); 5599 5600 if (flag_debug_asm) 5601 { 5602 ASM_OUTPUT_DWARF_STRING (asm_out_file, pub->name); 5603 fprintf (asm_out_file, "%s external name", ASM_COMMENT_START); 5604 } 5605 else 5606 {
|
5501 ASM_OUTPUT_ASCII (asm_out_file, pub->name, strlen (pub->name) + 1);
|
5607 ASM_OUTPUT_ASCII (asm_out_file, pub->name, 5608 (int) strlen (pub->name) + 1); |
5609 } 5610 5611 fputc ('\n', asm_out_file); 5612 } 5613 5614 ASM_OUTPUT_DWARF_DATA (asm_out_file, 0); 5615 fputc ('\n', asm_out_file); 5616} 5617 5618/* Add a new entry to .debug_aranges if appropriate. */ 5619 5620static void 5621add_arange (decl, die) 5622 tree decl; 5623 dw_die_ref die; 5624{ 5625 if (! DECL_SECTION_NAME (decl)) 5626 return; 5627 5628 if (arange_table_in_use == arange_table_allocated) 5629 { 5630 arange_table_allocated += ARANGE_TABLE_INCREMENT; 5631 arange_table 5632 = (arange_ref) xrealloc (arange_table, 5633 arange_table_allocated * sizeof (dw_die_ref)); 5634 } 5635 5636 arange_table[arange_table_in_use++] = die; 5637} 5638 5639/* Output the information that goes into the .debug_aranges table. 5640 Namely, define the beginning and ending address range of the 5641 text section generated for this compilation unit. */ 5642 5643static void 5644output_aranges () 5645{ 5646 register unsigned i; 5647 register unsigned long aranges_length = size_of_aranges (); 5648 5649 ASM_OUTPUT_DWARF_DATA (asm_out_file, aranges_length); 5650 if (flag_debug_asm) 5651 fprintf (asm_out_file, "\t%s Length of Address Ranges Info.", 5652 ASM_COMMENT_START); 5653 5654 fputc ('\n', asm_out_file); 5655 ASM_OUTPUT_DWARF_DATA2 (asm_out_file, DWARF_VERSION); 5656 if (flag_debug_asm) 5657 fprintf (asm_out_file, "\t%s DWARF Version", ASM_COMMENT_START); 5658 5659 fputc ('\n', asm_out_file);
|
5553 ASM_OUTPUT_DWARF_OFFSET (asm_out_file, stripattributes (DEBUG_INFO_SECTION));
|
5660 ASM_OUTPUT_DWARF_OFFSET (asm_out_file, debug_info_section_label); |
5661 if (flag_debug_asm) 5662 fprintf (asm_out_file, "\t%s Offset of Compilation Unit Info.", 5663 ASM_COMMENT_START); 5664 5665 fputc ('\n', asm_out_file); 5666 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, PTR_SIZE); 5667 if (flag_debug_asm) 5668 fprintf (asm_out_file, "\t%s Size of Address", ASM_COMMENT_START); 5669 5670 fputc ('\n', asm_out_file); 5671 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 0); 5672 if (flag_debug_asm) 5673 fprintf (asm_out_file, "\t%s Size of Segment Descriptor", 5674 ASM_COMMENT_START); 5675 5676 fputc ('\n', asm_out_file); 5677 ASM_OUTPUT_DWARF_DATA4 (asm_out_file, 4); 5678 if (PTR_SIZE == 8) 5679 fprintf (asm_out_file, ",0,0"); 5680 5681 if (flag_debug_asm) 5682 fprintf (asm_out_file, "\t%s Pad to %d byte boundary", 5683 ASM_COMMENT_START, 2 * PTR_SIZE); 5684 5685 fputc ('\n', asm_out_file);
|
5579 ASM_OUTPUT_DWARF_ADDR (asm_out_file, TEXT_SECTION);
|
5686 ASM_OUTPUT_DWARF_ADDR (asm_out_file, text_section_label); |
5687 if (flag_debug_asm) 5688 fprintf (asm_out_file, "\t%s Address", ASM_COMMENT_START); 5689 5690 fputc ('\n', asm_out_file);
|
5584 ASM_OUTPUT_DWARF_ADDR_DELTA (asm_out_file, text_end_label, TEXT_SECTION);
|
5691 ASM_OUTPUT_DWARF_ADDR_DELTA (asm_out_file, text_end_label, 5692 text_section_label); |
5693 if (flag_debug_asm) 5694 fprintf (asm_out_file, "%s Length", ASM_COMMENT_START); 5695 5696 fputc ('\n', asm_out_file); 5697 for (i = 0; i < arange_table_in_use; ++i) 5698 { 5699 dw_die_ref a = arange_table[i]; 5700 5701 if (a->die_tag == DW_TAG_subprogram) 5702 ASM_OUTPUT_DWARF_ADDR (asm_out_file, get_AT_low_pc (a)); 5703 else 5704 { 5705 char *name = get_AT_string (a, DW_AT_MIPS_linkage_name); 5706 if (! name) 5707 name = get_AT_string (a, DW_AT_name); 5708 5709 ASM_OUTPUT_DWARF_ADDR (asm_out_file, name); 5710 } 5711 5712 if (flag_debug_asm) 5713 fprintf (asm_out_file, "\t%s Address", ASM_COMMENT_START); 5714 5715 fputc ('\n', asm_out_file); 5716 if (a->die_tag == DW_TAG_subprogram) 5717 ASM_OUTPUT_DWARF_ADDR_DELTA (asm_out_file, get_AT_hi_pc (a), 5718 get_AT_low_pc (a)); 5719 else 5720 ASM_OUTPUT_DWARF_ADDR_DATA (asm_out_file, 5721 get_AT_unsigned (a, DW_AT_byte_size)); 5722 5723 if (flag_debug_asm) 5724 fprintf (asm_out_file, "%s Length", ASM_COMMENT_START); 5725 5726 fputc ('\n', asm_out_file); 5727 } 5728 5729 /* Output the terminator words. */ 5730 ASM_OUTPUT_DWARF_ADDR_DATA (asm_out_file, 0); 5731 fputc ('\n', asm_out_file); 5732 ASM_OUTPUT_DWARF_ADDR_DATA (asm_out_file, 0); 5733 fputc ('\n', asm_out_file); 5734} 5735 5736/* Output the source line number correspondence information. This 5737 information goes into the .debug_line section. 5738 5739 If the format of this data changes, then the function size_of_line_info 5740 must also be adjusted the same way. */ 5741 5742static void 5743output_line_info () 5744{ 5745 char line_label[MAX_ARTIFICIAL_LABEL_BYTES]; 5746 char prev_line_label[MAX_ARTIFICIAL_LABEL_BYTES]; 5747 register unsigned opc; 5748 register unsigned n_op_args; 5749 register unsigned long ft_index; 5750 register unsigned long lt_index; 5751 register unsigned long current_line; 5752 register long line_offset; 5753 register long line_delta; 5754 register unsigned long current_file; 5755 register unsigned long function; 5756 5757 ASM_OUTPUT_DWARF_DATA (asm_out_file, size_of_line_info ()); 5758 if (flag_debug_asm) 5759 fprintf (asm_out_file, "\t%s Length of Source Line Info.", 5760 ASM_COMMENT_START); 5761 5762 fputc ('\n', asm_out_file); 5763 ASM_OUTPUT_DWARF_DATA2 (asm_out_file, DWARF_VERSION); 5764 if (flag_debug_asm) 5765 fprintf (asm_out_file, "\t%s DWARF Version", ASM_COMMENT_START); 5766 5767 fputc ('\n', asm_out_file); 5768 ASM_OUTPUT_DWARF_DATA (asm_out_file, size_of_line_prolog ()); 5769 if (flag_debug_asm) 5770 fprintf (asm_out_file, "\t%s Prolog Length", ASM_COMMENT_START); 5771 5772 fputc ('\n', asm_out_file); 5773 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DWARF_LINE_MIN_INSTR_LENGTH); 5774 if (flag_debug_asm) 5775 fprintf (asm_out_file, "\t%s Minimum Instruction Length", 5776 ASM_COMMENT_START); 5777 5778 fputc ('\n', asm_out_file); 5779 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DWARF_LINE_DEFAULT_IS_STMT_START); 5780 if (flag_debug_asm) 5781 fprintf (asm_out_file, "\t%s Default is_stmt_start flag", 5782 ASM_COMMENT_START); 5783 5784 fputc ('\n', asm_out_file); 5785 fprintf (asm_out_file, "\t%s\t%d", ASM_BYTE_OP, DWARF_LINE_BASE); 5786 if (flag_debug_asm) 5787 fprintf (asm_out_file, "\t%s Line Base Value (Special Opcodes)", 5788 ASM_COMMENT_START); 5789 5790 fputc ('\n', asm_out_file); 5791 fprintf (asm_out_file, "\t%s\t%u", ASM_BYTE_OP, DWARF_LINE_RANGE); 5792 if (flag_debug_asm) 5793 fprintf (asm_out_file, "\t%s Line Range Value (Special Opcodes)", 5794 ASM_COMMENT_START); 5795 5796 fputc ('\n', asm_out_file); 5797 fprintf (asm_out_file, "\t%s\t%u", ASM_BYTE_OP, DWARF_LINE_OPCODE_BASE); 5798 if (flag_debug_asm) 5799 fprintf (asm_out_file, "\t%s Special Opcode Base", ASM_COMMENT_START); 5800 5801 fputc ('\n', asm_out_file); 5802 for (opc = 1; opc < DWARF_LINE_OPCODE_BASE; ++opc) 5803 { 5804 switch (opc) 5805 { 5806 case DW_LNS_advance_pc: 5807 case DW_LNS_advance_line: 5808 case DW_LNS_set_file: 5809 case DW_LNS_set_column: 5810 case DW_LNS_fixed_advance_pc: 5811 n_op_args = 1; 5812 break; 5813 default: 5814 n_op_args = 0; 5815 break; 5816 } 5817 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, n_op_args); 5818 if (flag_debug_asm) 5819 fprintf (asm_out_file, "\t%s opcode: 0x%x has %d args", 5820 ASM_COMMENT_START, opc, n_op_args); 5821 fputc ('\n', asm_out_file); 5822 } 5823 5824 if (flag_debug_asm) 5825 fprintf (asm_out_file, "%s Include Directory Table\n", ASM_COMMENT_START); 5826 5827 /* Include directory table is empty, at present */ 5828 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 0); 5829 fputc ('\n', asm_out_file); 5830 if (flag_debug_asm) 5831 fprintf (asm_out_file, "%s File Name Table\n", ASM_COMMENT_START); 5832 5833 for (ft_index = 1; ft_index < file_table_in_use; ++ft_index) 5834 { 5835 if (flag_debug_asm) 5836 { 5837 ASM_OUTPUT_DWARF_STRING (asm_out_file, file_table[ft_index]); 5838 fprintf (asm_out_file, "%s File Entry: 0x%lx", 5839 ASM_COMMENT_START, ft_index); 5840 } 5841 else 5842 { 5843 ASM_OUTPUT_ASCII (asm_out_file, 5844 file_table[ft_index],
|
5737 strlen (file_table[ft_index]) + 1);
|
5845 (int) strlen (file_table[ft_index]) + 1); |
5846 } 5847 5848 fputc ('\n', asm_out_file); 5849 5850 /* Include directory index */ 5851 output_uleb128 (0); 5852 fputc ('\n', asm_out_file); 5853 5854 /* Modification time */ 5855 output_uleb128 (0); 5856 fputc ('\n', asm_out_file); 5857 5858 /* File length in bytes */ 5859 output_uleb128 (0); 5860 fputc ('\n', asm_out_file); 5861 } 5862 5863 /* Terminate the file name table */ 5864 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 0); 5865 fputc ('\n', asm_out_file); 5866
|
5759 /* Set the address register to the first location in the text section */
5760 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 0);
5761 if (flag_debug_asm)
5762 fprintf (asm_out_file, "\t%s DW_LNE_set_address", ASM_COMMENT_START);
|
5867 /* We used to set the address register to the first location in the text 5868 section here, but that didn't accomplish anything since we already 5869 have a line note for the opening brace of the first function. */ |
5870
|
5764 fputc ('\n', asm_out_file);
5765 output_uleb128 (1 + PTR_SIZE);
5766 fputc ('\n', asm_out_file);
5767 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNE_set_address);
5768 fputc ('\n', asm_out_file);
5769 ASM_OUTPUT_DWARF_ADDR (asm_out_file, TEXT_SECTION);
5770 fputc ('\n', asm_out_file);
5771
|
5871 /* Generate the line number to PC correspondence table, encoded as 5872 a series of state machine operations. */ 5873 current_file = 1; 5874 current_line = 1;
|
5776 strcpy (prev_line_label, TEXT_SECTION);
|
5875 strcpy (prev_line_label, text_section_label); |
5876 for (lt_index = 1; lt_index < line_info_table_in_use; ++lt_index) 5877 {
|
5779 register dw_line_info_ref line_info;
|
5878 register dw_line_info_ref line_info = &line_info_table[lt_index]; |
5879
|
5880 /* Don't emit anything for redundant notes. Just updating the 5881 address doesn't accomplish anything, because we already assume 5882 that anything after the last address is this line. */ 5883 if (line_info->dw_line_num == current_line 5884 && line_info->dw_file_num == current_file) 5885 continue; 5886 |
5887 /* Emit debug info for the address of the current line, choosing 5888 the encoding that uses the least amount of space. */ 5889 /* ??? Unfortunately, we have little choice here currently, and must 5890 always use the most general form. Gcc does not know the address 5891 delta itself, so we can't use DW_LNS_advance_pc. There are no known 5892 dwarf2 aware assemblers at this time, so we can't use any special 5893 pseudo ops that would allow the assembler to optimally encode this for 5894 us. Many ports do have length attributes which will give an upper 5895 bound on the address range. We could perhaps use length attributes 5896 to determine when it is safe to use DW_LNS_fixed_advance_pc. */ 5897 ASM_GENERATE_INTERNAL_LABEL (line_label, LINE_CODE_LABEL, lt_index); 5898 if (0) 5899 { 5900 /* This can handle deltas up to 0xffff. This takes 3 bytes. */ 5901 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNS_fixed_advance_pc); 5902 if (flag_debug_asm) 5903 fprintf (asm_out_file, "\t%s DW_LNS_fixed_advance_pc", 5904 ASM_COMMENT_START); 5905 5906 fputc ('\n', asm_out_file); 5907 ASM_OUTPUT_DWARF_DELTA2 (asm_out_file, line_label, prev_line_label); 5908 fputc ('\n', asm_out_file); 5909 } 5910 else 5911 { 5912 /* This can handle any delta. This takes 4+PTR_SIZE bytes. */ 5913 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 0); 5914 if (flag_debug_asm) 5915 fprintf (asm_out_file, "\t%s DW_LNE_set_address", 5916 ASM_COMMENT_START); 5917 fputc ('\n', asm_out_file); 5918 output_uleb128 (1 + PTR_SIZE); 5919 fputc ('\n', asm_out_file); 5920 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNE_set_address); 5921 fputc ('\n', asm_out_file); 5922 ASM_OUTPUT_DWARF_ADDR (asm_out_file, line_label); 5923 fputc ('\n', asm_out_file); 5924 } 5925 strcpy (prev_line_label, line_label); 5926 5927 /* Emit debug info for the source file of the current line, if 5928 different from the previous line. */
|
5823 line_info = &line_info_table[lt_index];
|
5929 if (line_info->dw_file_num != current_file) 5930 { 5931 current_file = line_info->dw_file_num; 5932 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNS_set_file); 5933 if (flag_debug_asm) 5934 fprintf (asm_out_file, "\t%s DW_LNS_set_file", ASM_COMMENT_START); 5935 5936 fputc ('\n', asm_out_file); 5937 output_uleb128 (current_file); 5938 if (flag_debug_asm) 5939 fprintf (asm_out_file, " (\"%s\")", file_table[current_file]); 5940 5941 fputc ('\n', asm_out_file); 5942 } 5943 5944 /* Emit debug info for the current line number, choosing the encoding 5945 that uses the least amount of space. */
|
5841 line_offset = line_info->dw_line_num - current_line;
5842 line_delta = line_offset - DWARF_LINE_BASE;
5843 current_line = line_info->dw_line_num;
5844 if (line_delta >= 0 && line_delta < (DWARF_LINE_RANGE - 1))
|
5946 if (line_info->dw_line_num != current_line) |
5947 {
|
5846 /* This can handle deltas from -10 to 234, using the current
5847 definitions of DWARF_LINE_BASE and DWARF_LINE_RANGE. This
5848 takes 1 byte. */
5849 ASM_OUTPUT_DWARF_DATA1 (asm_out_file,
5850 DWARF_LINE_OPCODE_BASE + line_delta);
5851 if (flag_debug_asm)
5852 fprintf (asm_out_file,
5853 "\t%s line %ld", ASM_COMMENT_START, current_line);
|
5948 line_offset = line_info->dw_line_num - current_line; 5949 line_delta = line_offset - DWARF_LINE_BASE; 5950 current_line = line_info->dw_line_num; 5951 if (line_delta >= 0 && line_delta < (DWARF_LINE_RANGE - 1)) 5952 { 5953 /* This can handle deltas from -10 to 234, using the current 5954 definitions of DWARF_LINE_BASE and DWARF_LINE_RANGE. This 5955 takes 1 byte. */ 5956 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 5957 DWARF_LINE_OPCODE_BASE + line_delta); 5958 if (flag_debug_asm) 5959 fprintf (asm_out_file, 5960 "\t%s line %ld", ASM_COMMENT_START, current_line); |
5961
|
5855 fputc ('\n', asm_out_file);
|
5962 fputc ('\n', asm_out_file); 5963 } 5964 else 5965 { 5966 /* This can handle any delta. This takes at least 4 bytes, 5967 depending on the value being encoded. */ 5968 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNS_advance_line); 5969 if (flag_debug_asm) 5970 fprintf (asm_out_file, "\t%s advance to line %ld", 5971 ASM_COMMENT_START, current_line); 5972 5973 fputc ('\n', asm_out_file); 5974 output_sleb128 (line_offset); 5975 fputc ('\n', asm_out_file); 5976 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNS_copy); 5977 if (flag_debug_asm) 5978 fprintf (asm_out_file, "\t%s DW_LNS_copy", ASM_COMMENT_START); 5979 fputc ('\n', asm_out_file); 5980 } |
5981 } 5982 else 5983 {
|
5859 /* This can handle any delta. This takes at least 4 bytes, depending
5860 on the value being encoded. */
5861 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNS_advance_line);
|
5984 /* We still need to start a new row, so output a copy insn. */ 5985 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNS_copy); |
5986 if (flag_debug_asm)
|
5863 fprintf (asm_out_file, "\t%s advance to line %ld",
5864 ASM_COMMENT_START, current_line);
5865
|
5987 fprintf (asm_out_file, "\t%s DW_LNS_copy", ASM_COMMENT_START); |
5988 fputc ('\n', asm_out_file);
|
5867 output_sleb128 (line_offset);
5868 fputc ('\n', asm_out_file);
5869 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNS_copy);
5870 fputc ('\n', asm_out_file);
|
5989 } 5990 } 5991 5992 /* Emit debug info for the address of the end of the function. */ 5993 if (0) 5994 { 5995 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNS_fixed_advance_pc); 5996 if (flag_debug_asm) 5997 fprintf (asm_out_file, "\t%s DW_LNS_fixed_advance_pc", 5998 ASM_COMMENT_START); 5999 6000 fputc ('\n', asm_out_file); 6001 ASM_OUTPUT_DWARF_DELTA2 (asm_out_file, text_end_label, prev_line_label); 6002 fputc ('\n', asm_out_file); 6003 } 6004 else 6005 { 6006 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 0); 6007 if (flag_debug_asm) 6008 fprintf (asm_out_file, "\t%s DW_LNE_set_address", ASM_COMMENT_START); 6009 fputc ('\n', asm_out_file); 6010 output_uleb128 (1 + PTR_SIZE); 6011 fputc ('\n', asm_out_file); 6012 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNE_set_address); 6013 fputc ('\n', asm_out_file); 6014 ASM_OUTPUT_DWARF_ADDR (asm_out_file, text_end_label); 6015 fputc ('\n', asm_out_file); 6016 } 6017 6018 /* Output the marker for the end of the line number info. */ 6019 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 0); 6020 if (flag_debug_asm) 6021 fprintf (asm_out_file, "\t%s DW_LNE_end_sequence", ASM_COMMENT_START); 6022 6023 fputc ('\n', asm_out_file); 6024 output_uleb128 (1); 6025 fputc ('\n', asm_out_file); 6026 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNE_end_sequence); 6027 fputc ('\n', asm_out_file); 6028 6029 function = 0; 6030 current_file = 1; 6031 current_line = 1; 6032 for (lt_index = 0; lt_index < separate_line_info_table_in_use; ) 6033 { 6034 register dw_separate_line_info_ref line_info 6035 = &separate_line_info_table[lt_index]; 6036
|
6037 /* Don't emit anything for redundant notes. */ 6038 if (line_info->dw_line_num == current_line 6039 && line_info->dw_file_num == current_file 6040 && line_info->function == function) 6041 goto cont; 6042 |
6043 /* Emit debug info for the address of the current line. If this is 6044 a new function, or the first line of a function, then we need 6045 to handle it differently. */ 6046 ASM_GENERATE_INTERNAL_LABEL (line_label, SEPARATE_LINE_CODE_LABEL, 6047 lt_index); 6048 if (function != line_info->function) 6049 { 6050 function = line_info->function; 6051 6052 /* Set the address register to the first line in the function */ 6053 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 0); 6054 if (flag_debug_asm) 6055 fprintf (asm_out_file, "\t%s DW_LNE_set_address", 6056 ASM_COMMENT_START); 6057 6058 fputc ('\n', asm_out_file); 6059 output_uleb128 (1 + PTR_SIZE); 6060 fputc ('\n', asm_out_file); 6061 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNE_set_address); 6062 fputc ('\n', asm_out_file); 6063 ASM_OUTPUT_DWARF_ADDR (asm_out_file, line_label); 6064 fputc ('\n', asm_out_file); 6065 } 6066 else 6067 { 6068 /* ??? See the DW_LNS_advance_pc comment above. */ 6069 if (0) 6070 { 6071 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNS_fixed_advance_pc); 6072 if (flag_debug_asm) 6073 fprintf (asm_out_file, "\t%s DW_LNS_fixed_advance_pc", 6074 ASM_COMMENT_START); 6075 6076 fputc ('\n', asm_out_file); 6077 ASM_OUTPUT_DWARF_DELTA2 (asm_out_file, line_label, 6078 prev_line_label); 6079 fputc ('\n', asm_out_file); 6080 } 6081 else 6082 { 6083 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 0); 6084 if (flag_debug_asm) 6085 fprintf (asm_out_file, "\t%s DW_LNE_set_address", 6086 ASM_COMMENT_START); 6087 fputc ('\n', asm_out_file); 6088 output_uleb128 (1 + PTR_SIZE); 6089 fputc ('\n', asm_out_file); 6090 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNE_set_address); 6091 fputc ('\n', asm_out_file); 6092 ASM_OUTPUT_DWARF_ADDR (asm_out_file, line_label); 6093 fputc ('\n', asm_out_file); 6094 } 6095 } 6096 strcpy (prev_line_label, line_label); 6097 6098 /* Emit debug info for the source file of the current line, if 6099 different from the previous line. */ 6100 if (line_info->dw_file_num != current_file) 6101 { 6102 current_file = line_info->dw_file_num; 6103 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNS_set_file); 6104 if (flag_debug_asm) 6105 fprintf (asm_out_file, "\t%s DW_LNS_set_file", ASM_COMMENT_START); 6106 6107 fputc ('\n', asm_out_file); 6108 output_uleb128 (current_file); 6109 if (flag_debug_asm) 6110 fprintf (asm_out_file, " (\"%s\")", file_table[current_file]); 6111 6112 fputc ('\n', asm_out_file); 6113 } 6114 6115 /* Emit debug info for the current line number, choosing the encoding 6116 that uses the least amount of space. */ 6117 if (line_info->dw_line_num != current_line) 6118 { 6119 line_offset = line_info->dw_line_num - current_line; 6120 line_delta = line_offset - DWARF_LINE_BASE; 6121 current_line = line_info->dw_line_num; 6122 if (line_delta >= 0 && line_delta < (DWARF_LINE_RANGE - 1)) 6123 { 6124 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 6125 DWARF_LINE_OPCODE_BASE + line_delta); 6126 if (flag_debug_asm) 6127 fprintf (asm_out_file, 6128 "\t%s line %ld", ASM_COMMENT_START, current_line); 6129 6130 fputc ('\n', asm_out_file); 6131 } 6132 else 6133 { 6134 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNS_advance_line); 6135 if (flag_debug_asm) 6136 fprintf (asm_out_file, "\t%s advance to line %ld", 6137 ASM_COMMENT_START, current_line); 6138 6139 fputc ('\n', asm_out_file); 6140 output_sleb128 (line_offset); 6141 fputc ('\n', asm_out_file); 6142 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNS_copy);
|
6143 if (flag_debug_asm) 6144 fprintf (asm_out_file, "\t%s DW_LNS_copy", ASM_COMMENT_START); |
6145 fputc ('\n', asm_out_file); 6146 } 6147 }
|
6148 else 6149 { 6150 /* We still need to start a new row, so output a copy insn. */ 6151 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNS_copy); 6152 if (flag_debug_asm) 6153 fprintf (asm_out_file, "\t%s DW_LNS_copy", ASM_COMMENT_START); 6154 fputc ('\n', asm_out_file); 6155 } |
6156
|
6157 cont: |
6158 ++lt_index; 6159 6160 /* If we're done with a function, end its sequence. */ 6161 if (lt_index == separate_line_info_table_in_use 6162 || separate_line_info_table[lt_index].function != function) 6163 { 6164 current_file = 1; 6165 current_line = 1; 6166 6167 /* Emit debug info for the address of the end of the function. */ 6168 ASM_GENERATE_INTERNAL_LABEL (line_label, FUNC_END_LABEL, function); 6169 if (0) 6170 { 6171 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNS_fixed_advance_pc); 6172 if (flag_debug_asm) 6173 fprintf (asm_out_file, "\t%s DW_LNS_fixed_advance_pc", 6174 ASM_COMMENT_START); 6175 6176 fputc ('\n', asm_out_file); 6177 ASM_OUTPUT_DWARF_DELTA2 (asm_out_file, line_label, 6178 prev_line_label); 6179 fputc ('\n', asm_out_file); 6180 } 6181 else 6182 { 6183 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 0); 6184 if (flag_debug_asm) 6185 fprintf (asm_out_file, "\t%s DW_LNE_set_address", 6186 ASM_COMMENT_START); 6187 fputc ('\n', asm_out_file); 6188 output_uleb128 (1 + PTR_SIZE); 6189 fputc ('\n', asm_out_file); 6190 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNE_set_address); 6191 fputc ('\n', asm_out_file); 6192 ASM_OUTPUT_DWARF_ADDR (asm_out_file, line_label); 6193 fputc ('\n', asm_out_file); 6194 } 6195 6196 /* Output the marker for the end of this sequence. */ 6197 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, 0); 6198 if (flag_debug_asm) 6199 fprintf (asm_out_file, "\t%s DW_LNE_end_sequence", 6200 ASM_COMMENT_START); 6201 6202 fputc ('\n', asm_out_file); 6203 output_uleb128 (1); 6204 fputc ('\n', asm_out_file); 6205 ASM_OUTPUT_DWARF_DATA1 (asm_out_file, DW_LNE_end_sequence); 6206 fputc ('\n', asm_out_file); 6207 } 6208 } 6209} 6210 6211/* Given a pointer to a BLOCK node return non-zero if (and only if) the node 6212 in question represents the outermost pair of curly braces (i.e. the "body 6213 block") of a function or method. 6214 6215 For any BLOCK node representing a "body block" of a function or method, the 6216 BLOCK_SUPERCONTEXT of the node will point to another BLOCK node which 6217 represents the outermost (function) scope for the function or method (i.e. 6218 the one which includes the formal parameters). The BLOCK_SUPERCONTEXT of 6219 *that* node in turn will point to the relevant FUNCTION_DECL node. */ 6220 6221static inline int 6222is_body_block (stmt) 6223 register tree stmt; 6224{ 6225 if (TREE_CODE (stmt) == BLOCK) 6226 { 6227 register tree parent = BLOCK_SUPERCONTEXT (stmt); 6228 6229 if (TREE_CODE (parent) == BLOCK) 6230 { 6231 register tree grandparent = BLOCK_SUPERCONTEXT (parent); 6232 6233 if (TREE_CODE (grandparent) == FUNCTION_DECL) 6234 return 1; 6235 } 6236 } 6237 6238 return 0; 6239} 6240 6241/* Given a pointer to a tree node for some base type, return a pointer to 6242 a DIE that describes the given type. 6243 6244 This routine must only be called for GCC type nodes that correspond to 6245 Dwarf base (fundamental) types. */ 6246 6247static dw_die_ref 6248base_type_die (type) 6249 register tree type; 6250{ 6251 register dw_die_ref base_type_result; 6252 register char *type_name; 6253 register enum dwarf_type encoding; 6254 register tree name = TYPE_NAME (type); 6255 6256 if (TREE_CODE (type) == ERROR_MARK 6257 || TREE_CODE (type) == VOID_TYPE) 6258 return 0; 6259 6260 if (TREE_CODE (name) == TYPE_DECL) 6261 name = DECL_NAME (name); 6262 type_name = IDENTIFIER_POINTER (name); 6263 6264 switch (TREE_CODE (type)) 6265 { 6266 case INTEGER_TYPE: 6267 /* Carefully distinguish the C character types, without messing 6268 up if the language is not C. Note that we check only for the names 6269 that contain spaces; other names might occur by coincidence in other 6270 languages. */ 6271 if (! (TYPE_PRECISION (type) == CHAR_TYPE_SIZE 6272 && (type == char_type_node 6273 || ! strcmp (type_name, "signed char") 6274 || ! strcmp (type_name, "unsigned char")))) 6275 { 6276 if (TREE_UNSIGNED (type)) 6277 encoding = DW_ATE_unsigned; 6278 else 6279 encoding = DW_ATE_signed; 6280 break; 6281 } 6282 /* else fall through */ 6283 6284 case CHAR_TYPE: 6285 /* GNU Pascal/Ada CHAR type. Not used in C. */ 6286 if (TREE_UNSIGNED (type)) 6287 encoding = DW_ATE_unsigned_char; 6288 else 6289 encoding = DW_ATE_signed_char; 6290 break; 6291 6292 case REAL_TYPE: 6293 encoding = DW_ATE_float; 6294 break; 6295 6296 case COMPLEX_TYPE: 6297 encoding = DW_ATE_complex_float; 6298 break; 6299 6300 case BOOLEAN_TYPE: 6301 /* GNU FORTRAN/Ada/C++ BOOLEAN type. */ 6302 encoding = DW_ATE_boolean; 6303 break; 6304 6305 default: 6306 abort (); /* No other TREE_CODEs are Dwarf fundamental types. */ 6307 } 6308 6309 base_type_result = new_die (DW_TAG_base_type, comp_unit_die); 6310 add_AT_string (base_type_result, DW_AT_name, type_name); 6311 add_AT_unsigned (base_type_result, DW_AT_byte_size, 6312 int_size_in_bytes (type)); 6313 add_AT_unsigned (base_type_result, DW_AT_encoding, encoding); 6314 6315 return base_type_result; 6316} 6317 6318/* Given a pointer to an arbitrary ..._TYPE tree node, return a pointer to 6319 the Dwarf "root" type for the given input type. The Dwarf "root" type of 6320 a given type is generally the same as the given type, except that if the 6321 given type is a pointer or reference type, then the root type of the given 6322 type is the root type of the "basis" type for the pointer or reference 6323 type. (This definition of the "root" type is recursive.) Also, the root 6324 type of a `const' qualified type or a `volatile' qualified type is the 6325 root type of the given type without the qualifiers. */ 6326 6327static tree 6328root_type (type) 6329 register tree type; 6330{ 6331 if (TREE_CODE (type) == ERROR_MARK) 6332 return error_mark_node; 6333 6334 switch (TREE_CODE (type)) 6335 { 6336 case ERROR_MARK: 6337 return error_mark_node; 6338 6339 case POINTER_TYPE: 6340 case REFERENCE_TYPE: 6341 return type_main_variant (root_type (TREE_TYPE (type))); 6342 6343 default: 6344 return type_main_variant (type); 6345 } 6346} 6347 6348/* Given a pointer to an arbitrary ..._TYPE tree node, return non-zero if the 6349 given input type is a Dwarf "fundamental" type. Otherwise return null. */ 6350 6351static inline int 6352is_base_type (type) 6353 register tree type; 6354{ 6355 switch (TREE_CODE (type)) 6356 { 6357 case ERROR_MARK: 6358 case VOID_TYPE: 6359 case INTEGER_TYPE: 6360 case REAL_TYPE: 6361 case COMPLEX_TYPE: 6362 case BOOLEAN_TYPE: 6363 case CHAR_TYPE: 6364 return 1; 6365 6366 case SET_TYPE: 6367 case ARRAY_TYPE: 6368 case RECORD_TYPE: 6369 case UNION_TYPE: 6370 case QUAL_UNION_TYPE: 6371 case ENUMERAL_TYPE: 6372 case FUNCTION_TYPE: 6373 case METHOD_TYPE: 6374 case POINTER_TYPE: 6375 case REFERENCE_TYPE: 6376 case FILE_TYPE: 6377 case OFFSET_TYPE: 6378 case LANG_TYPE: 6379 return 0; 6380 6381 default: 6382 abort (); 6383 } 6384 6385 return 0; 6386} 6387 6388/* Given a pointer to an arbitrary ..._TYPE tree node, return a debugging 6389 entry that chains various modifiers in front of the given type. */ 6390 6391static dw_die_ref 6392modified_type_die (type, is_const_type, is_volatile_type, context_die) 6393 register tree type; 6394 register int is_const_type; 6395 register int is_volatile_type; 6396 register dw_die_ref context_die; 6397{ 6398 register enum tree_code code = TREE_CODE (type); 6399 register dw_die_ref mod_type_die = NULL; 6400 register dw_die_ref sub_die = NULL; 6401 register tree item_type = NULL; 6402 6403 if (code != ERROR_MARK) 6404 { 6405 type = build_type_variant (type, is_const_type, is_volatile_type); 6406 6407 mod_type_die = lookup_type_die (type); 6408 if (mod_type_die) 6409 return mod_type_die; 6410 6411 /* Handle C typedef types. */ 6412 if (TYPE_NAME (type) && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL 6413 && DECL_ORIGINAL_TYPE (TYPE_NAME (type))) 6414 { 6415 tree dtype = TREE_TYPE (TYPE_NAME (type)); 6416 if (type == dtype) 6417 { 6418 /* For a named type, use the typedef. */ 6419 gen_type_die (type, context_die); 6420 mod_type_die = lookup_type_die (type); 6421 } 6422 6423 else if (is_const_type < TYPE_READONLY (dtype) 6424 || is_volatile_type < TYPE_VOLATILE (dtype)) 6425 /* cv-unqualified version of named type. Just use the unnamed 6426 type to which it refers. */ 6427 mod_type_die 6428 = modified_type_die (DECL_ORIGINAL_TYPE (TYPE_NAME (type)), 6429 is_const_type, is_volatile_type, 6430 context_die); 6431 /* Else cv-qualified version of named type; fall through. */ 6432 } 6433 6434 if (mod_type_die) 6435 /* OK */; 6436 else if (is_const_type) 6437 { 6438 mod_type_die = new_die (DW_TAG_const_type, comp_unit_die); 6439 sub_die = modified_type_die (type, 0, is_volatile_type, context_die); 6440 } 6441 else if (is_volatile_type) 6442 { 6443 mod_type_die = new_die (DW_TAG_volatile_type, comp_unit_die); 6444 sub_die = modified_type_die (type, 0, 0, context_die); 6445 } 6446 else if (code == POINTER_TYPE) 6447 { 6448 mod_type_die = new_die (DW_TAG_pointer_type, comp_unit_die); 6449 add_AT_unsigned (mod_type_die, DW_AT_byte_size, PTR_SIZE); 6450#if 0 6451 add_AT_unsigned (mod_type_die, DW_AT_address_class, 0); 6452#endif 6453 item_type = TREE_TYPE (type); 6454 } 6455 else if (code == REFERENCE_TYPE) 6456 { 6457 mod_type_die = new_die (DW_TAG_reference_type, comp_unit_die); 6458 add_AT_unsigned (mod_type_die, DW_AT_byte_size, PTR_SIZE); 6459#if 0 6460 add_AT_unsigned (mod_type_die, DW_AT_address_class, 0); 6461#endif 6462 item_type = TREE_TYPE (type); 6463 } 6464 else if (is_base_type (type)) 6465 mod_type_die = base_type_die (type); 6466 else 6467 { 6468 gen_type_die (type, context_die); 6469 6470 /* We have to get the type_main_variant here (and pass that to the 6471 `lookup_type_die' routine) because the ..._TYPE node we have 6472 might simply be a *copy* of some original type node (where the 6473 copy was created to help us keep track of typedef names) and 6474 that copy might have a different TYPE_UID from the original 6475 ..._TYPE node. */ 6476 mod_type_die = lookup_type_die (type_main_variant (type)); 6477 if (mod_type_die == NULL) 6478 abort (); 6479 } 6480 } 6481 6482 equate_type_number_to_die (type, mod_type_die); 6483 if (item_type) 6484 /* We must do this after the equate_type_number_to_die call, in case 6485 this is a recursive type. This ensures that the modified_type_die 6486 recursion will terminate even if the type is recursive. Recursive 6487 types are possible in Ada. */ 6488 sub_die = modified_type_die (item_type, 6489 TYPE_READONLY (item_type), 6490 TYPE_VOLATILE (item_type), 6491 context_die); 6492 6493 if (sub_die != NULL) 6494 add_AT_die_ref (mod_type_die, DW_AT_type, sub_die); 6495 6496 return mod_type_die; 6497} 6498 6499/* Given a pointer to an arbitrary ..._TYPE tree node, return true if it is 6500 an enumerated type. */ 6501 6502static inline int 6503type_is_enum (type) 6504 register tree type; 6505{ 6506 return TREE_CODE (type) == ENUMERAL_TYPE; 6507} 6508 6509/* Return a location descriptor that designates a machine register. */ 6510 6511static dw_loc_descr_ref 6512reg_loc_descriptor (rtl) 6513 register rtx rtl; 6514{ 6515 register dw_loc_descr_ref loc_result = NULL; 6516 register unsigned reg = reg_number (rtl); 6517 6518 if (reg <= 31) 6519 loc_result = new_loc_descr (DW_OP_reg0 + reg, 0, 0); 6520 else 6521 loc_result = new_loc_descr (DW_OP_regx, reg, 0); 6522 6523 return loc_result; 6524} 6525 6526/* Return a location descriptor that designates a base+offset location. */ 6527 6528static dw_loc_descr_ref 6529based_loc_descr (reg, offset) 6530 unsigned reg; 6531 long int offset; 6532{ 6533 register dw_loc_descr_ref loc_result; 6534 /* For the "frame base", we use the frame pointer or stack pointer 6535 registers, since the RTL for local variables is relative to one of 6536 them. */ 6537 register unsigned fp_reg = DBX_REGISTER_NUMBER (frame_pointer_needed 6538 ? HARD_FRAME_POINTER_REGNUM 6539 : STACK_POINTER_REGNUM); 6540 6541 if (reg == fp_reg) 6542 loc_result = new_loc_descr (DW_OP_fbreg, offset, 0); 6543 else if (reg <= 31) 6544 loc_result = new_loc_descr (DW_OP_breg0 + reg, offset, 0); 6545 else 6546 loc_result = new_loc_descr (DW_OP_bregx, reg, offset); 6547 6548 return loc_result; 6549} 6550 6551/* Return true if this RTL expression describes a base+offset calculation. */ 6552 6553static inline int 6554is_based_loc (rtl) 6555 register rtx rtl; 6556{ 6557 return (GET_CODE (rtl) == PLUS 6558 && ((GET_CODE (XEXP (rtl, 0)) == REG 6559 && GET_CODE (XEXP (rtl, 1)) == CONST_INT))); 6560} 6561 6562/* The following routine converts the RTL for a variable or parameter 6563 (resident in memory) into an equivalent Dwarf representation of a 6564 mechanism for getting the address of that same variable onto the top of a 6565 hypothetical "address evaluation" stack. 6566 6567 When creating memory location descriptors, we are effectively transforming 6568 the RTL for a memory-resident object into its Dwarf postfix expression 6569 equivalent. This routine recursively descends an RTL tree, turning 6570 it into Dwarf postfix code as it goes. */ 6571 6572static dw_loc_descr_ref 6573mem_loc_descriptor (rtl) 6574 register rtx rtl; 6575{ 6576 dw_loc_descr_ref mem_loc_result = NULL; 6577 /* Note that for a dynamically sized array, the location we will generate a 6578 description of here will be the lowest numbered location which is 6579 actually within the array. That's *not* necessarily the same as the 6580 zeroth element of the array. */ 6581 6582 switch (GET_CODE (rtl)) 6583 { 6584 case SUBREG: 6585 /* The case of a subreg may arise when we have a local (register) 6586 variable or a formal (register) parameter which doesn't quite fill 6587 up an entire register. For now, just assume that it is 6588 legitimate to make the Dwarf info refer to the whole register which 6589 contains the given subreg. */ 6590 rtl = XEXP (rtl, 0); 6591 6592 /* ... fall through ... */ 6593 6594 case REG: 6595 /* Whenever a register number forms a part of the description of the 6596 method for calculating the (dynamic) address of a memory resident 6597 object, DWARF rules require the register number be referred to as 6598 a "base register". This distinction is not based in any way upon 6599 what category of register the hardware believes the given register 6600 belongs to. This is strictly DWARF terminology we're dealing with 6601 here. Note that in cases where the location of a memory-resident 6602 data object could be expressed as: OP_ADD (OP_BASEREG (basereg), 6603 OP_CONST (0)) the actual DWARF location descriptor that we generate 6604 may just be OP_BASEREG (basereg). This may look deceptively like 6605 the object in question was allocated to a register (rather than in 6606 memory) so DWARF consumers need to be aware of the subtle 6607 distinction between OP_REG and OP_BASEREG. */ 6608 mem_loc_result = based_loc_descr (reg_number (rtl), 0); 6609 break; 6610 6611 case MEM: 6612 mem_loc_result = mem_loc_descriptor (XEXP (rtl, 0)); 6613 add_loc_descr (&mem_loc_result, new_loc_descr (DW_OP_deref, 0, 0)); 6614 break; 6615 6616 case CONST: 6617 case SYMBOL_REF: 6618 mem_loc_result = new_loc_descr (DW_OP_addr, 0, 0); 6619 mem_loc_result->dw_loc_oprnd1.val_class = dw_val_class_addr; 6620 mem_loc_result->dw_loc_oprnd1.v.val_addr = addr_to_string (rtl); 6621 break; 6622 6623 case PLUS: 6624 if (is_based_loc (rtl)) 6625 mem_loc_result = based_loc_descr (reg_number (XEXP (rtl, 0)), 6626 INTVAL (XEXP (rtl, 1))); 6627 else 6628 { 6629 add_loc_descr (&mem_loc_result, mem_loc_descriptor (XEXP (rtl, 0))); 6630 add_loc_descr (&mem_loc_result, mem_loc_descriptor (XEXP (rtl, 1))); 6631 add_loc_descr (&mem_loc_result, new_loc_descr (DW_OP_plus, 0, 0)); 6632 } 6633 break; 6634 6635 case MULT: 6636 /* If a pseudo-reg is optimized away, it is possible for it to 6637 be replaced with a MEM containing a multiply. */ 6638 add_loc_descr (&mem_loc_result, mem_loc_descriptor (XEXP (rtl, 0))); 6639 add_loc_descr (&mem_loc_result, mem_loc_descriptor (XEXP (rtl, 1))); 6640 add_loc_descr (&mem_loc_result, new_loc_descr (DW_OP_mul, 0, 0)); 6641 break; 6642 6643 case CONST_INT: 6644 mem_loc_result = new_loc_descr (DW_OP_constu, INTVAL (rtl), 0); 6645 break; 6646 6647 default: 6648 abort (); 6649 } 6650 6651 return mem_loc_result; 6652} 6653 6654/* Return a descriptor that describes the concatenation of two locations. 6655 This is typically a complex variable. */ 6656 6657static dw_loc_descr_ref 6658concat_loc_descriptor (x0, x1) 6659 register rtx x0, x1; 6660{ 6661 dw_loc_descr_ref cc_loc_result = NULL; 6662 6663 if (!is_pseudo_reg (x0) 6664 && (GET_CODE (x0) != MEM || !is_pseudo_reg (XEXP (x0, 0)))) 6665 add_loc_descr (&cc_loc_result, loc_descriptor (x0)); 6666 add_loc_descr (&cc_loc_result, 6667 new_loc_descr (DW_OP_piece, GET_MODE_SIZE (GET_MODE (x0)), 0)); 6668 6669 if (!is_pseudo_reg (x1) 6670 && (GET_CODE (x1) != MEM || !is_pseudo_reg (XEXP (x1, 0)))) 6671 add_loc_descr (&cc_loc_result, loc_descriptor (x1)); 6672 add_loc_descr (&cc_loc_result, 6673 new_loc_descr (DW_OP_piece, GET_MODE_SIZE (GET_MODE (x1)), 0)); 6674 6675 return cc_loc_result; 6676} 6677 6678/* Output a proper Dwarf location descriptor for a variable or parameter 6679 which is either allocated in a register or in a memory location. For a 6680 register, we just generate an OP_REG and the register number. For a 6681 memory location we provide a Dwarf postfix expression describing how to 6682 generate the (dynamic) address of the object onto the address stack. */ 6683 6684static dw_loc_descr_ref 6685loc_descriptor (rtl) 6686 register rtx rtl; 6687{ 6688 dw_loc_descr_ref loc_result = NULL; 6689 switch (GET_CODE (rtl)) 6690 { 6691 case SUBREG: 6692 /* The case of a subreg may arise when we have a local (register) 6693 variable or a formal (register) parameter which doesn't quite fill 6694 up an entire register. For now, just assume that it is 6695 legitimate to make the Dwarf info refer to the whole register which 6696 contains the given subreg. */ 6697 rtl = XEXP (rtl, 0); 6698 6699 /* ... fall through ... */ 6700 6701 case REG: 6702 loc_result = reg_loc_descriptor (rtl); 6703 break; 6704 6705 case MEM: 6706 loc_result = mem_loc_descriptor (XEXP (rtl, 0)); 6707 break; 6708 6709 case CONCAT: 6710 loc_result = concat_loc_descriptor (XEXP (rtl, 0), XEXP (rtl, 1)); 6711 break; 6712 6713 default: 6714 abort (); 6715 } 6716 6717 return loc_result; 6718} 6719 6720/* Given an unsigned value, round it up to the lowest multiple of `boundary' 6721 which is not less than the value itself. */ 6722 6723static inline unsigned 6724ceiling (value, boundary) 6725 register unsigned value; 6726 register unsigned boundary; 6727{ 6728 return (((value + boundary - 1) / boundary) * boundary); 6729} 6730 6731/* Given a pointer to what is assumed to be a FIELD_DECL node, return a 6732 pointer to the declared type for the relevant field variable, or return 6733 `integer_type_node' if the given node turns out to be an 6734 ERROR_MARK node. */ 6735 6736static inline tree 6737field_type (decl) 6738 register tree decl; 6739{ 6740 register tree type; 6741 6742 if (TREE_CODE (decl) == ERROR_MARK) 6743 return integer_type_node; 6744 6745 type = DECL_BIT_FIELD_TYPE (decl); 6746 if (type == NULL_TREE) 6747 type = TREE_TYPE (decl); 6748 6749 return type; 6750} 6751 6752/* Given a pointer to a tree node, assumed to be some kind of a ..._TYPE 6753 node, return the alignment in bits for the type, or else return 6754 BITS_PER_WORD if the node actually turns out to be an 6755 ERROR_MARK node. */ 6756 6757static inline unsigned 6758simple_type_align_in_bits (type) 6759 register tree type; 6760{ 6761 return (TREE_CODE (type) != ERROR_MARK) ? TYPE_ALIGN (type) : BITS_PER_WORD; 6762} 6763 6764/* Given a pointer to a tree node, assumed to be some kind of a ..._TYPE 6765 node, return the size in bits for the type if it is a constant, or else 6766 return the alignment for the type if the type's size is not constant, or 6767 else return BITS_PER_WORD if the type actually turns out to be an 6768 ERROR_MARK node. */ 6769 6770static inline unsigned 6771simple_type_size_in_bits (type) 6772 register tree type; 6773{ 6774 if (TREE_CODE (type) == ERROR_MARK) 6775 return BITS_PER_WORD; 6776 else 6777 { 6778 register tree type_size_tree = TYPE_SIZE (type); 6779 6780 if (TREE_CODE (type_size_tree) != INTEGER_CST) 6781 return TYPE_ALIGN (type); 6782 6783 return (unsigned) TREE_INT_CST_LOW (type_size_tree); 6784 } 6785} 6786 6787/* Given a pointer to what is assumed to be a FIELD_DECL node, compute and 6788 return the byte offset of the lowest addressed byte of the "containing 6789 object" for the given FIELD_DECL, or return 0 if we are unable to 6790 determine what that offset is, either because the argument turns out to 6791 be a pointer to an ERROR_MARK node, or because the offset is actually 6792 variable. (We can't handle the latter case just yet). */ 6793 6794static unsigned 6795field_byte_offset (decl) 6796 register tree decl; 6797{ 6798 register unsigned type_align_in_bytes; 6799 register unsigned type_align_in_bits; 6800 register unsigned type_size_in_bits; 6801 register unsigned object_offset_in_align_units; 6802 register unsigned object_offset_in_bits; 6803 register unsigned object_offset_in_bytes; 6804 register tree type; 6805 register tree bitpos_tree; 6806 register tree field_size_tree; 6807 register unsigned bitpos_int; 6808 register unsigned deepest_bitpos; 6809 register unsigned field_size_in_bits; 6810 6811 if (TREE_CODE (decl) == ERROR_MARK) 6812 return 0; 6813 6814 if (TREE_CODE (decl) != FIELD_DECL) 6815 abort (); 6816 6817 type = field_type (decl); 6818 6819 bitpos_tree = DECL_FIELD_BITPOS (decl); 6820 field_size_tree = DECL_SIZE (decl); 6821 6822 /* We cannot yet cope with fields whose positions or sizes are variable, so 6823 for now, when we see such things, we simply return 0. Someday, we may 6824 be able to handle such cases, but it will be damn difficult. */ 6825 if (TREE_CODE (bitpos_tree) != INTEGER_CST) 6826 return 0; 6827 bitpos_int = (unsigned) TREE_INT_CST_LOW (bitpos_tree); 6828 6829 if (TREE_CODE (field_size_tree) != INTEGER_CST) 6830 return 0; 6831 6832 field_size_in_bits = (unsigned) TREE_INT_CST_LOW (field_size_tree); 6833 type_size_in_bits = simple_type_size_in_bits (type); 6834 type_align_in_bits = simple_type_align_in_bits (type); 6835 type_align_in_bytes = type_align_in_bits / BITS_PER_UNIT; 6836 6837 /* Note that the GCC front-end doesn't make any attempt to keep track of 6838 the starting bit offset (relative to the start of the containing 6839 structure type) of the hypothetical "containing object" for a bit- 6840 field. Thus, when computing the byte offset value for the start of the 6841 "containing object" of a bit-field, we must deduce this information on 6842 our own. This can be rather tricky to do in some cases. For example, 6843 handling the following structure type definition when compiling for an 6844 i386/i486 target (which only aligns long long's to 32-bit boundaries) 6845 can be very tricky: 6846 6847 struct S { int field1; long long field2:31; }; 6848 6849 Fortunately, there is a simple rule-of-thumb which can be 6850 used in such cases. When compiling for an i386/i486, GCC will allocate 6851 8 bytes for the structure shown above. It decides to do this based upon 6852 one simple rule for bit-field allocation. Quite simply, GCC allocates 6853 each "containing object" for each bit-field at the first (i.e. lowest 6854 addressed) legitimate alignment boundary (based upon the required 6855 minimum alignment for the declared type of the field) which it can 6856 possibly use, subject to the condition that there is still enough 6857 available space remaining in the containing object (when allocated at 6858 the selected point) to fully accommodate all of the bits of the 6859 bit-field itself. This simple rule makes it obvious why GCC allocates 6860 8 bytes for each object of the structure type shown above. When looking 6861 for a place to allocate the "containing object" for `field2', the 6862 compiler simply tries to allocate a 64-bit "containing object" at each 6863 successive 32-bit boundary (starting at zero) until it finds a place to 6864 allocate that 64- bit field such that at least 31 contiguous (and 6865 previously unallocated) bits remain within that selected 64 bit field. 6866 (As it turns out, for the example above, the compiler finds that it is 6867 OK to allocate the "containing object" 64-bit field at bit-offset zero 6868 within the structure type.) Here we attempt to work backwards from the 6869 limited set of facts we're given, and we try to deduce from those facts, 6870 where GCC must have believed that the containing object started (within 6871 the structure type). The value we deduce is then used (by the callers of 6872 this routine) to generate DW_AT_location and DW_AT_bit_offset attributes 6873 for fields (both bit-fields and, in the case of DW_AT_location, regular 6874 fields as well). */ 6875 6876 /* Figure out the bit-distance from the start of the structure to the 6877 "deepest" bit of the bit-field. */ 6878 deepest_bitpos = bitpos_int + field_size_in_bits; 6879 6880 /* This is the tricky part. Use some fancy footwork to deduce where the 6881 lowest addressed bit of the containing object must be. */ 6882 object_offset_in_bits 6883 = ceiling (deepest_bitpos, type_align_in_bits) - type_size_in_bits; 6884 6885 /* Compute the offset of the containing object in "alignment units". */ 6886 object_offset_in_align_units = object_offset_in_bits / type_align_in_bits; 6887 6888 /* Compute the offset of the containing object in bytes. */ 6889 object_offset_in_bytes = object_offset_in_align_units * type_align_in_bytes; 6890 6891 return object_offset_in_bytes; 6892} 6893 6894/* The following routines define various Dwarf attributes and any data 6895 associated with them. */ 6896 6897/* Add a location description attribute value to a DIE. 6898 6899 This emits location attributes suitable for whole variables and 6900 whole parameters. Note that the location attributes for struct fields are 6901 generated by the routine `data_member_location_attribute' below. */ 6902 6903static void 6904add_AT_location_description (die, attr_kind, rtl) 6905 dw_die_ref die; 6906 enum dwarf_attribute attr_kind; 6907 register rtx rtl; 6908{ 6909 /* Handle a special case. If we are about to output a location descriptor 6910 for a variable or parameter which has been optimized out of existence, 6911 don't do that. A variable which has been optimized out 6912 of existence will have a DECL_RTL value which denotes a pseudo-reg. 6913 Currently, in some rare cases, variables can have DECL_RTL values which 6914 look like (MEM (REG pseudo-reg#)). These cases are due to bugs 6915 elsewhere in the compiler. We treat such cases as if the variable(s) in 6916 question had been optimized out of existence. */ 6917 6918 if (is_pseudo_reg (rtl) 6919 || (GET_CODE (rtl) == MEM 6920 && is_pseudo_reg (XEXP (rtl, 0))) 6921 || (GET_CODE (rtl) == CONCAT 6922 && is_pseudo_reg (XEXP (rtl, 0)) 6923 && is_pseudo_reg (XEXP (rtl, 1)))) 6924 return; 6925 6926 add_AT_loc (die, attr_kind, loc_descriptor (rtl)); 6927} 6928 6929/* Attach the specialized form of location attribute used for data 6930 members of struct and union types. In the special case of a 6931 FIELD_DECL node which represents a bit-field, the "offset" part 6932 of this special location descriptor must indicate the distance 6933 in bytes from the lowest-addressed byte of the containing struct 6934 or union type to the lowest-addressed byte of the "containing 6935 object" for the bit-field. (See the `field_byte_offset' function 6936 above).. For any given bit-field, the "containing object" is a 6937 hypothetical object (of some integral or enum type) within which 6938 the given bit-field lives. The type of this hypothetical 6939 "containing object" is always the same as the declared type of 6940 the individual bit-field itself (for GCC anyway... the DWARF 6941 spec doesn't actually mandate this). Note that it is the size 6942 (in bytes) of the hypothetical "containing object" which will 6943 be given in the DW_AT_byte_size attribute for this bit-field. 6944 (See the `byte_size_attribute' function below.) It is also used 6945 when calculating the value of the DW_AT_bit_offset attribute. 6946 (See the `bit_offset_attribute' function below). */ 6947 6948static void 6949add_data_member_location_attribute (die, decl) 6950 register dw_die_ref die; 6951 register tree decl; 6952{ 6953 register unsigned long offset; 6954 register dw_loc_descr_ref loc_descr; 6955 register enum dwarf_location_atom op; 6956 6957 if (TREE_CODE (decl) == TREE_VEC) 6958 offset = TREE_INT_CST_LOW (BINFO_OFFSET (decl)); 6959 else 6960 offset = field_byte_offset (decl); 6961 6962 /* The DWARF2 standard says that we should assume that the structure address 6963 is already on the stack, so we can specify a structure field address 6964 by using DW_OP_plus_uconst. */ 6965 6966#ifdef MIPS_DEBUGGING_INFO 6967 /* ??? The SGI dwarf reader does not handle the DW_OP_plus_uconst operator 6968 correctly. It works only if we leave the offset on the stack. */ 6969 op = DW_OP_constu; 6970#else 6971 op = DW_OP_plus_uconst; 6972#endif 6973 6974 loc_descr = new_loc_descr (op, offset, 0); 6975 add_AT_loc (die, DW_AT_data_member_location, loc_descr); 6976} 6977 6978/* Attach an DW_AT_const_value attribute for a variable or a parameter which 6979 does not have a "location" either in memory or in a register. These 6980 things can arise in GNU C when a constant is passed as an actual parameter 6981 to an inlined function. They can also arise in C++ where declared 6982 constants do not necessarily get memory "homes". */ 6983 6984static void 6985add_const_value_attribute (die, rtl) 6986 register dw_die_ref die; 6987 register rtx rtl; 6988{ 6989 switch (GET_CODE (rtl)) 6990 { 6991 case CONST_INT: 6992 /* Note that a CONST_INT rtx could represent either an integer or a 6993 floating-point constant. A CONST_INT is used whenever the constant 6994 will fit into a single word. In all such cases, the original mode 6995 of the constant value is wiped out, and the CONST_INT rtx is 6996 assigned VOIDmode. */ 6997 add_AT_unsigned (die, DW_AT_const_value, (unsigned) INTVAL (rtl)); 6998 break; 6999 7000 case CONST_DOUBLE: 7001 /* Note that a CONST_DOUBLE rtx could represent either an integer or a 7002 floating-point constant. A CONST_DOUBLE is used whenever the 7003 constant requires more than one word in order to be adequately 7004 represented. We output CONST_DOUBLEs as blocks. */ 7005 { 7006 register enum machine_mode mode = GET_MODE (rtl); 7007 7008 if (GET_MODE_CLASS (mode) == MODE_FLOAT) 7009 { 7010 register unsigned length = GET_MODE_SIZE (mode) / sizeof (long); 7011 long array[4]; 7012 REAL_VALUE_TYPE rv; 7013 7014 REAL_VALUE_FROM_CONST_DOUBLE (rv, rtl); 7015 switch (mode) 7016 { 7017 case SFmode: 7018 REAL_VALUE_TO_TARGET_SINGLE (rv, array[0]); 7019 break; 7020 7021 case DFmode: 7022 REAL_VALUE_TO_TARGET_DOUBLE (rv, array); 7023 break; 7024 7025 case XFmode: 7026 case TFmode: 7027 REAL_VALUE_TO_TARGET_LONG_DOUBLE (rv, array); 7028 break; 7029 7030 default: 7031 abort (); 7032 } 7033 7034 add_AT_float (die, DW_AT_const_value, length, array); 7035 } 7036 else 7037 add_AT_long_long (die, DW_AT_const_value, 7038 CONST_DOUBLE_HIGH (rtl), CONST_DOUBLE_LOW (rtl)); 7039 } 7040 break; 7041 7042 case CONST_STRING: 7043 add_AT_string (die, DW_AT_const_value, XSTR (rtl, 0)); 7044 break; 7045 7046 case SYMBOL_REF: 7047 case LABEL_REF: 7048 case CONST: 7049 add_AT_addr (die, DW_AT_const_value, addr_to_string (rtl)); 7050 break; 7051 7052 case PLUS: 7053 /* In cases where an inlined instance of an inline function is passed 7054 the address of an `auto' variable (which is local to the caller) we 7055 can get a situation where the DECL_RTL of the artificial local 7056 variable (for the inlining) which acts as a stand-in for the 7057 corresponding formal parameter (of the inline function) will look 7058 like (plus:SI (reg:SI FRAME_PTR) (const_int ...)). This is not 7059 exactly a compile-time constant expression, but it isn't the address 7060 of the (artificial) local variable either. Rather, it represents the 7061 *value* which the artificial local variable always has during its 7062 lifetime. We currently have no way to represent such quasi-constant 7063 values in Dwarf, so for now we just punt and generate nothing. */ 7064 break; 7065 7066 default: 7067 /* No other kinds of rtx should be possible here. */ 7068 abort (); 7069 } 7070 7071} 7072 7073/* Generate *either* an DW_AT_location attribute or else an DW_AT_const_value 7074 data attribute for a variable or a parameter. We generate the 7075 DW_AT_const_value attribute only in those cases where the given variable 7076 or parameter does not have a true "location" either in memory or in a 7077 register. This can happen (for example) when a constant is passed as an 7078 actual argument in a call to an inline function. (It's possible that 7079 these things can crop up in other ways also.) Note that one type of 7080 constant value which can be passed into an inlined function is a constant 7081 pointer. This can happen for example if an actual argument in an inlined 7082 function call evaluates to a compile-time constant address. */ 7083 7084static void 7085add_location_or_const_value_attribute (die, decl) 7086 register dw_die_ref die; 7087 register tree decl; 7088{ 7089 register rtx rtl; 7090 register tree declared_type; 7091 register tree passed_type; 7092 7093 if (TREE_CODE (decl) == ERROR_MARK) 7094 return; 7095 7096 if (TREE_CODE (decl) != VAR_DECL && TREE_CODE (decl) != PARM_DECL) 7097 abort (); 7098 7099 /* Here we have to decide where we are going to say the parameter "lives" 7100 (as far as the debugger is concerned). We only have a couple of 7101 choices. GCC provides us with DECL_RTL and with DECL_INCOMING_RTL. 7102 7103 DECL_RTL normally indicates where the parameter lives during most of the 7104 activation of the function. If optimization is enabled however, this 7105 could be either NULL or else a pseudo-reg. Both of those cases indicate 7106 that the parameter doesn't really live anywhere (as far as the code 7107 generation parts of GCC are concerned) during most of the function's 7108 activation. That will happen (for example) if the parameter is never 7109 referenced within the function. 7110 7111 We could just generate a location descriptor here for all non-NULL 7112 non-pseudo values of DECL_RTL and ignore all of the rest, but we can be 7113 a little nicer than that if we also consider DECL_INCOMING_RTL in cases 7114 where DECL_RTL is NULL or is a pseudo-reg. 7115 7116 Note however that we can only get away with using DECL_INCOMING_RTL as 7117 a backup substitute for DECL_RTL in certain limited cases. In cases 7118 where DECL_ARG_TYPE (decl) indicates the same type as TREE_TYPE (decl), 7119 we can be sure that the parameter was passed using the same type as it is 7120 declared to have within the function, and that its DECL_INCOMING_RTL 7121 points us to a place where a value of that type is passed. 7122 7123 In cases where DECL_ARG_TYPE (decl) and TREE_TYPE (decl) are different, 7124 we cannot (in general) use DECL_INCOMING_RTL as a substitute for DECL_RTL 7125 because in these cases DECL_INCOMING_RTL points us to a value of some 7126 type which is *different* from the type of the parameter itself. Thus, 7127 if we tried to use DECL_INCOMING_RTL to generate a location attribute in 7128 such cases, the debugger would end up (for example) trying to fetch a 7129 `float' from a place which actually contains the first part of a 7130 `double'. That would lead to really incorrect and confusing 7131 output at debug-time. 7132 7133 So, in general, we *do not* use DECL_INCOMING_RTL as a backup for DECL_RTL 7134 in cases where DECL_ARG_TYPE (decl) != TREE_TYPE (decl). There 7135 are a couple of exceptions however. On little-endian machines we can 7136 get away with using DECL_INCOMING_RTL even when DECL_ARG_TYPE (decl) is 7137 not the same as TREE_TYPE (decl), but only when DECL_ARG_TYPE (decl) is 7138 an integral type that is smaller than TREE_TYPE (decl). These cases arise 7139 when (on a little-endian machine) a non-prototyped function has a 7140 parameter declared to be of type `short' or `char'. In such cases, 7141 TREE_TYPE (decl) will be `short' or `char', DECL_ARG_TYPE (decl) will 7142 be `int', and DECL_INCOMING_RTL will point to the lowest-order byte of the 7143 passed `int' value. If the debugger then uses that address to fetch 7144 a `short' or a `char' (on a little-endian machine) the result will be 7145 the correct data, so we allow for such exceptional cases below. 7146 7147 Note that our goal here is to describe the place where the given formal 7148 parameter lives during most of the function's activation (i.e. between 7149 the end of the prologue and the start of the epilogue). We'll do that 7150 as best as we can. Note however that if the given formal parameter is 7151 modified sometime during the execution of the function, then a stack 7152 backtrace (at debug-time) will show the function as having been 7153 called with the *new* value rather than the value which was 7154 originally passed in. This happens rarely enough that it is not 7155 a major problem, but it *is* a problem, and I'd like to fix it. 7156 7157 A future version of dwarf2out.c may generate two additional 7158 attributes for any given DW_TAG_formal_parameter DIE which will 7159 describe the "passed type" and the "passed location" for the 7160 given formal parameter in addition to the attributes we now 7161 generate to indicate the "declared type" and the "active 7162 location" for each parameter. This additional set of attributes 7163 could be used by debuggers for stack backtraces. Separately, note 7164 that sometimes DECL_RTL can be NULL and DECL_INCOMING_RTL can be 7165 NULL also. This happens (for example) for inlined-instances of 7166 inline function formal parameters which are never referenced. 7167 This really shouldn't be happening. All PARM_DECL nodes should 7168 get valid non-NULL DECL_INCOMING_RTL values, but integrate.c 7169 doesn't currently generate these values for inlined instances of 7170 inline function parameters, so when we see such cases, we are 7171 just out-of-luck for the time being (until integrate.c 7172 gets fixed). */ 7173 7174 /* Use DECL_RTL as the "location" unless we find something better. */ 7175 rtl = DECL_RTL (decl); 7176 7177 if (TREE_CODE (decl) == PARM_DECL) 7178 { 7179 if (rtl == NULL_RTX || is_pseudo_reg (rtl)) 7180 { 7181 declared_type = type_main_variant (TREE_TYPE (decl)); 7182 passed_type = type_main_variant (DECL_ARG_TYPE (decl)); 7183 7184 /* This decl represents a formal parameter which was optimized out. 7185 Note that DECL_INCOMING_RTL may be NULL in here, but we handle 7186 all* cases where (rtl == NULL_RTX) just below. */ 7187 if (declared_type == passed_type) 7188 rtl = DECL_INCOMING_RTL (decl); 7189 else if (! BYTES_BIG_ENDIAN 7190 && TREE_CODE (declared_type) == INTEGER_TYPE
|
7056 && TYPE_SIZE (declared_type) <= TYPE_SIZE (passed_type))
|
7191 && (GET_MODE_SIZE (TYPE_MODE (declared_type)) 7192 <= GET_MODE_SIZE (TYPE_MODE (passed_type)))) |
7193 rtl = DECL_INCOMING_RTL (decl); 7194 }
|
7195 7196 /* If the parm was passed in registers, but lives on the stack, then 7197 make a big endian correction if the mode of the type of the 7198 parameter is not the same as the mode of the rtl. */ 7199 /* ??? This is the same series of checks that are made in dbxout.c before 7200 we reach the big endian correction code there. It isn't clear if all 7201 of these checks are necessary here, but keeping them all is the safe 7202 thing to do. */ 7203 else if (GET_CODE (rtl) == MEM 7204 && XEXP (rtl, 0) != const0_rtx 7205 && ! CONSTANT_P (XEXP (rtl, 0)) 7206 /* Not passed in memory. */ 7207 && GET_CODE (DECL_INCOMING_RTL (decl)) != MEM 7208 /* Not passed by invisible reference. */ 7209 && (GET_CODE (XEXP (rtl, 0)) != REG 7210 || REGNO (XEXP (rtl, 0)) == HARD_FRAME_POINTER_REGNUM 7211 || REGNO (XEXP (rtl, 0)) == STACK_POINTER_REGNUM 7212#if ARG_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM 7213 || REGNO (XEXP (rtl, 0)) == ARG_POINTER_REGNUM 7214#endif 7215 ) 7216 /* Big endian correction check. */ 7217 && BYTES_BIG_ENDIAN 7218 && TYPE_MODE (TREE_TYPE (decl)) != GET_MODE (rtl) 7219 && (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (decl))) 7220 < UNITS_PER_WORD)) 7221 { 7222 int offset = (UNITS_PER_WORD 7223 - GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (decl)))); 7224 rtl = gen_rtx_MEM (TYPE_MODE (TREE_TYPE (decl)), 7225 plus_constant (XEXP (rtl, 0), offset)); 7226 } |
7227 } 7228 7229 if (rtl == NULL_RTX) 7230 return; 7231 7232 rtl = eliminate_regs (rtl, 0, NULL_RTX); 7233#ifdef LEAF_REG_REMAP
|
7066 if (leaf_function)
|
7234 if (current_function_uses_only_leaf_regs) |
7235 leaf_renumber_regs_insn (rtl); 7236#endif 7237 7238 switch (GET_CODE (rtl)) 7239 { 7240 case ADDRESSOF: 7241 /* The address of a variable that was optimized away; don't emit 7242 anything. */ 7243 break; 7244 7245 case CONST_INT: 7246 case CONST_DOUBLE: 7247 case CONST_STRING: 7248 case SYMBOL_REF: 7249 case LABEL_REF: 7250 case CONST: 7251 case PLUS: 7252 /* DECL_RTL could be (plus (reg ...) (const_int ...)) */ 7253 add_const_value_attribute (die, rtl); 7254 break; 7255 7256 case MEM: 7257 case REG: 7258 case SUBREG: 7259 case CONCAT: 7260 add_AT_location_description (die, DW_AT_location, rtl); 7261 break; 7262 7263 default: 7264 abort (); 7265 } 7266} 7267 7268/* Generate an DW_AT_name attribute given some string value to be included as 7269 the value of the attribute. */ 7270 7271static inline void 7272add_name_attribute (die, name_string) 7273 register dw_die_ref die; 7274 register char *name_string; 7275{ 7276 if (name_string != NULL && *name_string != 0) 7277 add_AT_string (die, DW_AT_name, name_string); 7278} 7279 7280/* Given a tree node describing an array bound (either lower or upper) output 7281 a representation for that bound. */ 7282 7283static void 7284add_bound_info (subrange_die, bound_attr, bound) 7285 register dw_die_ref subrange_die; 7286 register enum dwarf_attribute bound_attr; 7287 register tree bound; 7288{ 7289 register unsigned bound_value = 0; 7290 7291 /* If this is an Ada unconstrained array type, then don't emit any debug 7292 info because the array bounds are unknown. They are parameterized when 7293 the type is instantiated. */ 7294 if (contains_placeholder_p (bound)) 7295 return; 7296 7297 switch (TREE_CODE (bound)) 7298 { 7299 case ERROR_MARK: 7300 return; 7301 7302 /* All fixed-bounds are represented by INTEGER_CST nodes. */ 7303 case INTEGER_CST: 7304 bound_value = TREE_INT_CST_LOW (bound); 7305 if (bound_attr == DW_AT_lower_bound 7306 && ((is_c_family () && bound_value == 0) 7307 || (is_fortran () && bound_value == 1))) 7308 /* use the default */; 7309 else 7310 add_AT_unsigned (subrange_die, bound_attr, bound_value); 7311 break; 7312 7313 case CONVERT_EXPR: 7314 case NOP_EXPR: 7315 case NON_LVALUE_EXPR: 7316 add_bound_info (subrange_die, bound_attr, TREE_OPERAND (bound, 0)); 7317 break; 7318 7319 case SAVE_EXPR: 7320 /* If optimization is turned on, the SAVE_EXPRs that describe how to 7321 access the upper bound values may be bogus. If they refer to a 7322 register, they may only describe how to get at these values at the 7323 points in the generated code right after they have just been 7324 computed. Worse yet, in the typical case, the upper bound values 7325 will not even *be* computed in the optimized code (though the 7326 number of elements will), so these SAVE_EXPRs are entirely 7327 bogus. In order to compensate for this fact, we check here to see 7328 if optimization is enabled, and if so, we don't add an attribute 7329 for the (unknown and unknowable) upper bound. This should not 7330 cause too much trouble for existing (stupid?) debuggers because 7331 they have to deal with empty upper bounds location descriptions 7332 anyway in order to be able to deal with incomplete array types. 7333 Of course an intelligent debugger (GDB?) should be able to 7334 comprehend that a missing upper bound specification in a array 7335 type used for a storage class `auto' local array variable 7336 indicates that the upper bound is both unknown (at compile- time) 7337 and unknowable (at run-time) due to optimization. 7338 7339 We assume that a MEM rtx is safe because gcc wouldn't put the 7340 value there unless it was going to be used repeatedly in the 7341 function, i.e. for cleanups. */ 7342 if (! optimize || GET_CODE (SAVE_EXPR_RTL (bound)) == MEM) 7343 { 7344 register dw_die_ref ctx = lookup_decl_die (current_function_decl); 7345 register dw_die_ref decl_die = new_die (DW_TAG_variable, ctx); 7346 register rtx loc = SAVE_EXPR_RTL (bound); 7347 7348 /* If the RTL for the SAVE_EXPR is memory, handle the case where 7349 it references an outer function's frame. */ 7350 7351 if (GET_CODE (loc) == MEM) 7352 { 7353 rtx new_addr = fix_lexical_addr (XEXP (loc, 0), bound); 7354 7355 if (XEXP (loc, 0) != new_addr) 7356 loc = gen_rtx (MEM, GET_MODE (loc), new_addr); 7357 } 7358 7359 add_AT_flag (decl_die, DW_AT_artificial, 1); 7360 add_type_attribute (decl_die, TREE_TYPE (bound), 1, 0, ctx); 7361 add_AT_location_description (decl_die, DW_AT_location, loc); 7362 add_AT_die_ref (subrange_die, bound_attr, decl_die); 7363 } 7364 7365 /* Else leave out the attribute. */ 7366 break; 7367 7368 case MAX_EXPR: 7369 case VAR_DECL: 7370 case COMPONENT_REF: 7371 /* ??? These types of bounds can be created by the Ada front end, 7372 and it isn't clear how to emit debug info for them. */ 7373 break; 7374 7375 default: 7376 abort (); 7377 } 7378} 7379 7380/* Note that the block of subscript information for an array type also 7381 includes information about the element type of type given array type. */ 7382 7383static void 7384add_subscript_info (type_die, type) 7385 register dw_die_ref type_die; 7386 register tree type; 7387{ 7388#ifndef MIPS_DEBUGGING_INFO 7389 register unsigned dimension_number; 7390#endif 7391 register tree lower, upper; 7392 register dw_die_ref subrange_die; 7393 7394 /* The GNU compilers represent multidimensional array types as sequences of 7395 one dimensional array types whose element types are themselves array 7396 types. Here we squish that down, so that each multidimensional array 7397 type gets only one array_type DIE in the Dwarf debugging info. The draft 7398 Dwarf specification say that we are allowed to do this kind of 7399 compression in C (because there is no difference between an array or 7400 arrays and a multidimensional array in C) but for other source languages 7401 (e.g. Ada) we probably shouldn't do this. */ 7402 7403 /* ??? The SGI dwarf reader fails for multidimensional arrays with a 7404 const enum type. E.g. const enum machine_mode insn_operand_mode[2][10]. 7405 We work around this by disabling this feature. See also 7406 gen_array_type_die. */ 7407#ifndef MIPS_DEBUGGING_INFO 7408 for (dimension_number = 0; 7409 TREE_CODE (type) == ARRAY_TYPE; 7410 type = TREE_TYPE (type), dimension_number++) 7411 { 7412#endif 7413 register tree domain = TYPE_DOMAIN (type); 7414 7415 /* Arrays come in three flavors: Unspecified bounds, fixed bounds, 7416 and (in GNU C only) variable bounds. Handle all three forms 7417 here. */ 7418 subrange_die = new_die (DW_TAG_subrange_type, type_die); 7419 if (domain) 7420 { 7421 /* We have an array type with specified bounds. */ 7422 lower = TYPE_MIN_VALUE (domain); 7423 upper = TYPE_MAX_VALUE (domain); 7424 7425 /* define the index type. */ 7426 if (TREE_TYPE (domain)) 7427 { 7428 /* ??? This is probably an Ada unnamed subrange type. Ignore the 7429 TREE_TYPE field. We can't emit debug info for this 7430 because it is an unnamed integral type. */ 7431 if (TREE_CODE (domain) == INTEGER_TYPE 7432 && TYPE_NAME (domain) == NULL_TREE 7433 && TREE_CODE (TREE_TYPE (domain)) == INTEGER_TYPE 7434 && TYPE_NAME (TREE_TYPE (domain)) == NULL_TREE) 7435 ; 7436 else 7437 add_type_attribute (subrange_die, TREE_TYPE (domain), 0, 0, 7438 type_die); 7439 } 7440 7441 /* ??? If upper is NULL, the array has unspecified length, 7442 but it does have a lower bound. This happens with Fortran 7443 dimension arr(N:*) 7444 Since the debugger is definitely going to need to know N 7445 to produce useful results, go ahead and output the lower 7446 bound solo, and hope the debugger can cope. */ 7447 7448 add_bound_info (subrange_die, DW_AT_lower_bound, lower); 7449 if (upper) 7450 add_bound_info (subrange_die, DW_AT_upper_bound, upper); 7451 } 7452 else 7453 /* We have an array type with an unspecified length. The DWARF-2 7454 spec does not say how to handle this; let's just leave out the 7455 bounds. */ 7456 {;} 7457 7458 7459#ifndef MIPS_DEBUGGING_INFO 7460 } 7461#endif 7462} 7463 7464static void 7465add_byte_size_attribute (die, tree_node) 7466 dw_die_ref die; 7467 register tree tree_node; 7468{ 7469 register unsigned size; 7470 7471 switch (TREE_CODE (tree_node)) 7472 { 7473 case ERROR_MARK: 7474 size = 0; 7475 break; 7476 case ENUMERAL_TYPE: 7477 case RECORD_TYPE: 7478 case UNION_TYPE: 7479 case QUAL_UNION_TYPE: 7480 size = int_size_in_bytes (tree_node); 7481 break; 7482 case FIELD_DECL: 7483 /* For a data member of a struct or union, the DW_AT_byte_size is 7484 generally given as the number of bytes normally allocated for an 7485 object of the *declared* type of the member itself. This is true 7486 even for bit-fields. */ 7487 size = simple_type_size_in_bits (field_type (tree_node)) / BITS_PER_UNIT; 7488 break; 7489 default: 7490 abort (); 7491 } 7492 7493 /* Note that `size' might be -1 when we get to this point. If it is, that 7494 indicates that the byte size of the entity in question is variable. We 7495 have no good way of expressing this fact in Dwarf at the present time, 7496 so just let the -1 pass on through. */ 7497 7498 add_AT_unsigned (die, DW_AT_byte_size, size); 7499} 7500 7501/* For a FIELD_DECL node which represents a bit-field, output an attribute 7502 which specifies the distance in bits from the highest order bit of the 7503 "containing object" for the bit-field to the highest order bit of the 7504 bit-field itself. 7505 7506 For any given bit-field, the "containing object" is a hypothetical 7507 object (of some integral or enum type) within which the given bit-field 7508 lives. The type of this hypothetical "containing object" is always the 7509 same as the declared type of the individual bit-field itself. The 7510 determination of the exact location of the "containing object" for a 7511 bit-field is rather complicated. It's handled by the 7512 `field_byte_offset' function (above). 7513 7514 Note that it is the size (in bytes) of the hypothetical "containing object" 7515 which will be given in the DW_AT_byte_size attribute for this bit-field. 7516 (See `byte_size_attribute' above). */ 7517 7518static inline void 7519add_bit_offset_attribute (die, decl) 7520 register dw_die_ref die; 7521 register tree decl; 7522{ 7523 register unsigned object_offset_in_bytes = field_byte_offset (decl); 7524 register tree type = DECL_BIT_FIELD_TYPE (decl); 7525 register tree bitpos_tree = DECL_FIELD_BITPOS (decl); 7526 register unsigned bitpos_int; 7527 register unsigned highest_order_object_bit_offset; 7528 register unsigned highest_order_field_bit_offset; 7529 register unsigned bit_offset; 7530 7531 /* Must be a field and a bit field. */ 7532 if (!type 7533 || TREE_CODE (decl) != FIELD_DECL) 7534 abort (); 7535 7536 /* We can't yet handle bit-fields whose offsets are variable, so if we 7537 encounter such things, just return without generating any attribute 7538 whatsoever. */ 7539 if (TREE_CODE (bitpos_tree) != INTEGER_CST) 7540 return; 7541 7542 bitpos_int = (unsigned) TREE_INT_CST_LOW (bitpos_tree); 7543 7544 /* Note that the bit offset is always the distance (in bits) from the 7545 highest-order bit of the "containing object" to the highest-order bit of 7546 the bit-field itself. Since the "high-order end" of any object or field 7547 is different on big-endian and little-endian machines, the computation 7548 below must take account of these differences. */ 7549 highest_order_object_bit_offset = object_offset_in_bytes * BITS_PER_UNIT; 7550 highest_order_field_bit_offset = bitpos_int; 7551 7552 if (! BYTES_BIG_ENDIAN) 7553 { 7554 highest_order_field_bit_offset 7555 += (unsigned) TREE_INT_CST_LOW (DECL_SIZE (decl)); 7556 7557 highest_order_object_bit_offset += simple_type_size_in_bits (type); 7558 } 7559 7560 bit_offset 7561 = (! BYTES_BIG_ENDIAN 7562 ? highest_order_object_bit_offset - highest_order_field_bit_offset 7563 : highest_order_field_bit_offset - highest_order_object_bit_offset); 7564 7565 add_AT_unsigned (die, DW_AT_bit_offset, bit_offset); 7566} 7567 7568/* For a FIELD_DECL node which represents a bit field, output an attribute 7569 which specifies the length in bits of the given field. */ 7570 7571static inline void 7572add_bit_size_attribute (die, decl) 7573 register dw_die_ref die; 7574 register tree decl; 7575{ 7576 /* Must be a field and a bit field. */ 7577 if (TREE_CODE (decl) != FIELD_DECL 7578 || ! DECL_BIT_FIELD_TYPE (decl)) 7579 abort (); 7580 add_AT_unsigned (die, DW_AT_bit_size, 7581 (unsigned) TREE_INT_CST_LOW (DECL_SIZE (decl))); 7582} 7583 7584/* If the compiled language is ANSI C, then add a 'prototyped' 7585 attribute, if arg types are given for the parameters of a function. */ 7586 7587static inline void 7588add_prototyped_attribute (die, func_type) 7589 register dw_die_ref die; 7590 register tree func_type; 7591{ 7592 if (get_AT_unsigned (comp_unit_die, DW_AT_language) == DW_LANG_C89 7593 && TYPE_ARG_TYPES (func_type) != NULL) 7594 add_AT_flag (die, DW_AT_prototyped, 1); 7595} 7596 7597 7598/* Add an 'abstract_origin' attribute below a given DIE. The DIE is found 7599 by looking in either the type declaration or object declaration 7600 equate table. */ 7601 7602static inline void 7603add_abstract_origin_attribute (die, origin) 7604 register dw_die_ref die; 7605 register tree origin; 7606{ 7607 dw_die_ref origin_die = NULL; 7608 if (TREE_CODE_CLASS (TREE_CODE (origin)) == 'd') 7609 origin_die = lookup_decl_die (origin); 7610 else if (TREE_CODE_CLASS (TREE_CODE (origin)) == 't') 7611 origin_die = lookup_type_die (origin); 7612 7613 add_AT_die_ref (die, DW_AT_abstract_origin, origin_die); 7614} 7615 7616/* We do not currently support the pure_virtual attribute. */ 7617 7618static inline void 7619add_pure_or_virtual_attribute (die, func_decl) 7620 register dw_die_ref die; 7621 register tree func_decl; 7622{ 7623 if (DECL_VINDEX (func_decl)) 7624 { 7625 add_AT_unsigned (die, DW_AT_virtuality, DW_VIRTUALITY_virtual); 7626 add_AT_loc (die, DW_AT_vtable_elem_location, 7627 new_loc_descr (DW_OP_constu, 7628 TREE_INT_CST_LOW (DECL_VINDEX (func_decl)), 7629 0)); 7630 7631 /* GNU extension: Record what type this method came from originally. */ 7632 if (debug_info_level > DINFO_LEVEL_TERSE) 7633 add_AT_die_ref (die, DW_AT_containing_type, 7634 lookup_type_die (DECL_CONTEXT (func_decl))); 7635 } 7636} 7637 7638/* Add source coordinate attributes for the given decl. */ 7639 7640static void 7641add_src_coords_attributes (die, decl) 7642 register dw_die_ref die; 7643 register tree decl; 7644{ 7645 register unsigned file_index = lookup_filename (DECL_SOURCE_FILE (decl)); 7646 7647 add_AT_unsigned (die, DW_AT_decl_file, file_index); 7648 add_AT_unsigned (die, DW_AT_decl_line, DECL_SOURCE_LINE (decl)); 7649} 7650 7651/* Add an DW_AT_name attribute and source coordinate attribute for the 7652 given decl, but only if it actually has a name. */ 7653 7654static void 7655add_name_and_src_coords_attributes (die, decl) 7656 register dw_die_ref die; 7657 register tree decl; 7658{ 7659 register tree decl_name; 7660 7661 decl_name = DECL_NAME (decl); 7662 if (decl_name != NULL && IDENTIFIER_POINTER (decl_name) != NULL) 7663 { 7664 add_name_attribute (die, dwarf2_name (decl, 0)); 7665 add_src_coords_attributes (die, decl); 7666 if ((TREE_CODE (decl) == FUNCTION_DECL || TREE_CODE (decl) == VAR_DECL) 7667 && DECL_ASSEMBLER_NAME (decl) != DECL_NAME (decl)) 7668 add_AT_string (die, DW_AT_MIPS_linkage_name, 7669 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl))); 7670 } 7671} 7672 7673/* Push a new declaration scope. */ 7674 7675static void 7676push_decl_scope (scope) 7677 tree scope; 7678{ 7679 tree containing_scope; 7680 int i; 7681 7682 /* Make room in the decl_scope_table, if necessary. */ 7683 if (decl_scope_table_allocated == decl_scope_depth) 7684 { 7685 decl_scope_table_allocated += DECL_SCOPE_TABLE_INCREMENT; 7686 decl_scope_table 7687 = (decl_scope_node *) xrealloc (decl_scope_table, 7688 (decl_scope_table_allocated 7689 * sizeof (decl_scope_node))); 7690 } 7691 7692 decl_scope_table[decl_scope_depth].scope = scope; 7693 7694 /* Sometimes, while recursively emitting subtypes within a class type, 7695 we end up recuring on a subtype at a higher level then the current 7696 subtype. In such a case, we need to search the decl_scope_table to 7697 find the parent of this subtype. */ 7698
|
7531 if (TREE_CODE_CLASS (TREE_CODE (scope)) == 't')
|
7699 if (AGGREGATE_TYPE_P (scope)) |
7700 containing_scope = TYPE_CONTEXT (scope); 7701 else 7702 containing_scope = NULL_TREE; 7703 7704 /* The normal case. */ 7705 if (decl_scope_depth == 0 7706 || containing_scope == NULL_TREE 7707 /* Ignore namespaces for the moment. */ 7708 || TREE_CODE (containing_scope) == NAMESPACE_DECL 7709 || containing_scope == decl_scope_table[decl_scope_depth - 1].scope) 7710 decl_scope_table[decl_scope_depth].previous = decl_scope_depth - 1; 7711 else 7712 { 7713 /* We need to search for the containing_scope. */ 7714 for (i = 0; i < decl_scope_depth; i++) 7715 if (decl_scope_table[i].scope == containing_scope) 7716 break; 7717 7718 if (i == decl_scope_depth) 7719 abort (); 7720 else 7721 decl_scope_table[decl_scope_depth].previous = i; 7722 } 7723 7724 decl_scope_depth++; 7725} 7726 7727/* Return the DIE for the scope that immediately contains this declaration. */ 7728 7729static dw_die_ref 7730scope_die_for (t, context_die) 7731 register tree t; 7732 register dw_die_ref context_die; 7733{ 7734 register dw_die_ref scope_die = NULL; 7735 register tree containing_scope; 7736 register int i; 7737 7738 /* Walk back up the declaration tree looking for a place to define 7739 this type. */ 7740 if (TREE_CODE_CLASS (TREE_CODE (t)) == 't') 7741 containing_scope = TYPE_CONTEXT (t); 7742 else if (TREE_CODE (t) == FUNCTION_DECL && DECL_VINDEX (t)) 7743 containing_scope = decl_class_context (t); 7744 else 7745 containing_scope = DECL_CONTEXT (t); 7746 7747 /* Ignore namespaces for the moment. */ 7748 if (containing_scope && TREE_CODE (containing_scope) == NAMESPACE_DECL) 7749 containing_scope = NULL_TREE; 7750
|
7751 /* Ignore function type "scopes" from the C frontend. They mean that 7752 a tagged type is local to a parmlist of a function declarator, but 7753 that isn't useful to DWARF. */ 7754 if (containing_scope && TREE_CODE (containing_scope) == FUNCTION_TYPE) 7755 containing_scope = NULL_TREE; 7756 |
7757 /* Function-local tags and functions get stuck in limbo until they are 7758 fixed up by decls_for_scope. */ 7759 if (context_die == NULL && containing_scope != NULL_TREE 7760 && (TREE_CODE (t) == FUNCTION_DECL || is_tagged_type (t))) 7761 return NULL; 7762 7763 if (containing_scope == NULL_TREE) 7764 scope_die = comp_unit_die; 7765 else 7766 { 7767 for (i = decl_scope_depth - 1, scope_die = context_die; 7768 i >= 0 && decl_scope_table[i].scope != containing_scope; 7769 (scope_die = scope_die->die_parent, 7770 i = decl_scope_table[i].previous)) 7771 ; 7772 7773 /* ??? Integrate_decl_tree does not handle BLOCK_TYPE_TAGS, nor 7774 does it try to handle types defined by TYPE_DECLs. Such types 7775 thus have an incorrect TYPE_CONTEXT, which points to the block 7776 they were originally defined in, instead of the current block 7777 created by function inlining. We try to detect that here and 7778 work around it. */ 7779 7780 if (i < 0 && scope_die == comp_unit_die 7781 && TREE_CODE (containing_scope) == BLOCK 7782 && is_tagged_type (t) 7783 && (block_ultimate_origin (decl_scope_table[decl_scope_depth - 1].scope) 7784 == containing_scope)) 7785 { 7786 scope_die = context_die; 7787 /* Since the checks below are no longer applicable. */ 7788 i = 0; 7789 } 7790 7791 if (i < 0) 7792 {
|
7619 if (scope_die != comp_unit_die
7620 || TREE_CODE_CLASS (TREE_CODE (containing_scope)) != 't')
|
7793 if (TREE_CODE_CLASS (TREE_CODE (containing_scope)) != 't') |
7794 abort (); 7795 if (debug_info_level > DINFO_LEVEL_TERSE 7796 && !TREE_ASM_WRITTEN (containing_scope)) 7797 abort ();
|
7798 7799 /* If none of the current dies are suitable, we get file scope. */ 7800 scope_die = comp_unit_die; |
7801 } 7802 } 7803 7804 return scope_die; 7805} 7806 7807/* Pop a declaration scope. */ 7808static inline void 7809pop_decl_scope () 7810{ 7811 if (decl_scope_depth <= 0) 7812 abort (); 7813 --decl_scope_depth; 7814} 7815 7816/* Many forms of DIEs require a "type description" attribute. This 7817 routine locates the proper "type descriptor" die for the type given 7818 by 'type', and adds an DW_AT_type attribute below the given die. */ 7819 7820static void 7821add_type_attribute (object_die, type, decl_const, decl_volatile, context_die) 7822 register dw_die_ref object_die; 7823 register tree type; 7824 register int decl_const; 7825 register int decl_volatile; 7826 register dw_die_ref context_die; 7827{ 7828 register enum tree_code code = TREE_CODE (type); 7829 register dw_die_ref type_die = NULL; 7830 7831 /* ??? If this type is an unnamed subrange type of an integral or 7832 floating-point type, use the inner type. This is because we have no 7833 support for unnamed types in base_type_die. This can happen if this is 7834 an Ada subrange type. Correct solution is emit a subrange type die. */ 7835 if ((code == INTEGER_TYPE || code == REAL_TYPE) 7836 && TREE_TYPE (type) != 0 && TYPE_NAME (type) == 0) 7837 type = TREE_TYPE (type), code = TREE_CODE (type); 7838 7839 if (code == ERROR_MARK) 7840 return; 7841 7842 /* Handle a special case. For functions whose return type is void, we 7843 generate *no* type attribute. (Note that no object may have type 7844 `void', so this only applies to function return types). */ 7845 if (code == VOID_TYPE) 7846 return; 7847 7848 type_die = modified_type_die (type, 7849 decl_const || TYPE_READONLY (type), 7850 decl_volatile || TYPE_VOLATILE (type), 7851 context_die); 7852 if (type_die != NULL) 7853 add_AT_die_ref (object_die, DW_AT_type, type_die); 7854} 7855 7856/* Given a tree pointer to a struct, class, union, or enum type node, return 7857 a pointer to the (string) tag name for the given type, or zero if the type 7858 was declared without a tag. */ 7859 7860static char * 7861type_tag (type) 7862 register tree type; 7863{ 7864 register char *name = 0; 7865 7866 if (TYPE_NAME (type) != 0) 7867 { 7868 register tree t = 0; 7869 7870 /* Find the IDENTIFIER_NODE for the type name. */ 7871 if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE) 7872 t = TYPE_NAME (type); 7873 7874 /* The g++ front end makes the TYPE_NAME of *each* tagged type point to 7875 a TYPE_DECL node, regardless of whether or not a `typedef' was 7876 involved. */ 7877 else if (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL 7878 && ! DECL_IGNORED_P (TYPE_NAME (type))) 7879 t = DECL_NAME (TYPE_NAME (type)); 7880 7881 /* Now get the name as a string, or invent one. */ 7882 if (t != 0) 7883 name = IDENTIFIER_POINTER (t); 7884 } 7885 7886 return (name == 0 || *name == '\0') ? 0 : name; 7887} 7888 7889/* Return the type associated with a data member, make a special check 7890 for bit field types. */ 7891 7892static inline tree 7893member_declared_type (member) 7894 register tree member; 7895{ 7896 return (DECL_BIT_FIELD_TYPE (member) 7897 ? DECL_BIT_FIELD_TYPE (member) 7898 : TREE_TYPE (member)); 7899} 7900 7901/* Get the decl's label, as described by its RTL. This may be different 7902 from the DECL_NAME name used in the source file. */ 7903 7904#if 0 7905static char * 7906decl_start_label (decl) 7907 register tree decl; 7908{ 7909 rtx x; 7910 char *fnname; 7911 x = DECL_RTL (decl); 7912 if (GET_CODE (x) != MEM) 7913 abort (); 7914 7915 x = XEXP (x, 0); 7916 if (GET_CODE (x) != SYMBOL_REF) 7917 abort (); 7918 7919 fnname = XSTR (x, 0); 7920 return fnname; 7921} 7922#endif 7923 7924/* These routines generate the internal representation of the DIE's for 7925 the compilation unit. Debugging information is collected by walking 7926 the declaration trees passed in from dwarf2out_decl(). */ 7927 7928static void 7929gen_array_type_die (type, context_die) 7930 register tree type; 7931 register dw_die_ref context_die; 7932{ 7933 register dw_die_ref scope_die = scope_die_for (type, context_die); 7934 register dw_die_ref array_die; 7935 register tree element_type; 7936 7937 /* ??? The SGI dwarf reader fails for array of array of enum types unless 7938 the inner array type comes before the outer array type. Thus we must 7939 call gen_type_die before we call new_die. See below also. */ 7940#ifdef MIPS_DEBUGGING_INFO 7941 gen_type_die (TREE_TYPE (type), context_die); 7942#endif 7943 7944 array_die = new_die (DW_TAG_array_type, scope_die); 7945 7946#if 0 7947 /* We default the array ordering. SDB will probably do 7948 the right things even if DW_AT_ordering is not present. It's not even 7949 an issue until we start to get into multidimensional arrays anyway. If 7950 SDB is ever caught doing the Wrong Thing for multi-dimensional arrays, 7951 then we'll have to put the DW_AT_ordering attribute back in. (But if 7952 and when we find out that we need to put these in, we will only do so 7953 for multidimensional arrays. */ 7954 add_AT_unsigned (array_die, DW_AT_ordering, DW_ORD_row_major); 7955#endif 7956 7957#ifdef MIPS_DEBUGGING_INFO 7958 /* The SGI compilers handle arrays of unknown bound by setting 7959 AT_declaration and not emitting any subrange DIEs. */ 7960 if (! TYPE_DOMAIN (type)) 7961 add_AT_unsigned (array_die, DW_AT_declaration, 1); 7962 else 7963#endif 7964 add_subscript_info (array_die, type); 7965 7966 equate_type_number_to_die (type, array_die); 7967 7968 /* Add representation of the type of the elements of this array type. */ 7969 element_type = TREE_TYPE (type); 7970 7971 /* ??? The SGI dwarf reader fails for multidimensional arrays with a 7972 const enum type. E.g. const enum machine_mode insn_operand_mode[2][10]. 7973 We work around this by disabling this feature. See also 7974 add_subscript_info. */ 7975#ifndef MIPS_DEBUGGING_INFO 7976 while (TREE_CODE (element_type) == ARRAY_TYPE) 7977 element_type = TREE_TYPE (element_type); 7978 7979 gen_type_die (element_type, context_die); 7980#endif 7981 7982 add_type_attribute (array_die, element_type, 0, 0, context_die); 7983} 7984 7985static void 7986gen_set_type_die (type, context_die) 7987 register tree type; 7988 register dw_die_ref context_die; 7989{ 7990 register dw_die_ref type_die 7991 = new_die (DW_TAG_set_type, scope_die_for (type, context_die)); 7992 7993 equate_type_number_to_die (type, type_die); 7994 add_type_attribute (type_die, TREE_TYPE (type), 0, 0, context_die); 7995} 7996 7997#if 0 7998static void 7999gen_entry_point_die (decl, context_die) 8000 register tree decl; 8001 register dw_die_ref context_die; 8002{ 8003 register tree origin = decl_ultimate_origin (decl); 8004 register dw_die_ref decl_die = new_die (DW_TAG_entry_point, context_die); 8005 if (origin != NULL) 8006 add_abstract_origin_attribute (decl_die, origin); 8007 else 8008 { 8009 add_name_and_src_coords_attributes (decl_die, decl); 8010 add_type_attribute (decl_die, TREE_TYPE (TREE_TYPE (decl)), 8011 0, 0, context_die); 8012 } 8013 8014 if (DECL_ABSTRACT (decl)) 8015 equate_decl_number_to_die (decl, decl_die); 8016 else 8017 add_AT_lbl_id (decl_die, DW_AT_low_pc, decl_start_label (decl)); 8018} 8019#endif 8020 8021/* Remember a type in the pending_types_list. */ 8022 8023static void 8024pend_type (type) 8025 register tree type; 8026{ 8027 if (pending_types == pending_types_allocated) 8028 { 8029 pending_types_allocated += PENDING_TYPES_INCREMENT; 8030 pending_types_list 8031 = (tree *) xrealloc (pending_types_list, 8032 sizeof (tree) * pending_types_allocated); 8033 } 8034 8035 pending_types_list[pending_types++] = type; 8036} 8037 8038/* Output any pending types (from the pending_types list) which we can output 8039 now (taking into account the scope that we are working on now). 8040 8041 For each type output, remove the given type from the pending_types_list 8042 *before* we try to output it. */ 8043 8044static void 8045output_pending_types_for_scope (context_die) 8046 register dw_die_ref context_die; 8047{ 8048 register tree type; 8049 8050 while (pending_types) 8051 { 8052 --pending_types; 8053 type = pending_types_list[pending_types]; 8054 gen_type_die (type, context_die); 8055 if (!TREE_ASM_WRITTEN (type)) 8056 abort (); 8057 } 8058} 8059
|
8060/* Remember a type in the incomplete_types_list. */ 8061 8062static void 8063add_incomplete_type (type) 8064 tree type; 8065{ 8066 if (incomplete_types == incomplete_types_allocated) 8067 { 8068 incomplete_types_allocated += INCOMPLETE_TYPES_INCREMENT; 8069 incomplete_types_list 8070 = (tree *) xrealloc (incomplete_types_list, 8071 sizeof (tree) * incomplete_types_allocated); 8072 } 8073 8074 incomplete_types_list[incomplete_types++] = type; 8075} 8076 8077/* Walk through the list of incomplete types again, trying once more to 8078 emit full debugging info for them. */ 8079 8080static void 8081retry_incomplete_types () 8082{ 8083 register tree type; 8084 8085 while (incomplete_types) 8086 { 8087 --incomplete_types; 8088 type = incomplete_types_list[incomplete_types]; 8089 gen_type_die (type, comp_unit_die); 8090 } 8091} 8092 |
8093/* Generate a DIE to represent an inlined instance of an enumeration type. */ 8094 8095static void 8096gen_inlined_enumeration_type_die (type, context_die) 8097 register tree type; 8098 register dw_die_ref context_die; 8099{ 8100 register dw_die_ref type_die = new_die (DW_TAG_enumeration_type, 8101 scope_die_for (type, context_die)); 8102 8103 if (!TREE_ASM_WRITTEN (type)) 8104 abort (); 8105 add_abstract_origin_attribute (type_die, type); 8106} 8107 8108/* Generate a DIE to represent an inlined instance of a structure type. */ 8109 8110static void 8111gen_inlined_structure_type_die (type, context_die) 8112 register tree type; 8113 register dw_die_ref context_die; 8114{ 8115 register dw_die_ref type_die = new_die (DW_TAG_structure_type, 8116 scope_die_for (type, context_die)); 8117 8118 if (!TREE_ASM_WRITTEN (type)) 8119 abort (); 8120 add_abstract_origin_attribute (type_die, type); 8121} 8122 8123/* Generate a DIE to represent an inlined instance of a union type. */ 8124 8125static void 8126gen_inlined_union_type_die (type, context_die) 8127 register tree type; 8128 register dw_die_ref context_die; 8129{ 8130 register dw_die_ref type_die = new_die (DW_TAG_union_type, 8131 scope_die_for (type, context_die)); 8132 8133 if (!TREE_ASM_WRITTEN (type)) 8134 abort (); 8135 add_abstract_origin_attribute (type_die, type); 8136} 8137 8138/* Generate a DIE to represent an enumeration type. Note that these DIEs 8139 include all of the information about the enumeration values also. Each 8140 enumerated type name/value is listed as a child of the enumerated type 8141 DIE. */ 8142 8143static void 8144gen_enumeration_type_die (type, context_die) 8145 register tree type; 8146 register dw_die_ref context_die; 8147{ 8148 register dw_die_ref type_die = lookup_type_die (type); 8149 8150 if (type_die == NULL) 8151 { 8152 type_die = new_die (DW_TAG_enumeration_type, 8153 scope_die_for (type, context_die)); 8154 equate_type_number_to_die (type, type_die); 8155 add_name_attribute (type_die, type_tag (type)); 8156 } 8157 else if (! TYPE_SIZE (type)) 8158 return; 8159 else 8160 remove_AT (type_die, DW_AT_declaration); 8161 8162 /* Handle a GNU C/C++ extension, i.e. incomplete enum types. If the 8163 given enum type is incomplete, do not generate the DW_AT_byte_size 8164 attribute or the DW_AT_element_list attribute. */ 8165 if (TYPE_SIZE (type)) 8166 { 8167 register tree link; 8168 8169 TREE_ASM_WRITTEN (type) = 1; 8170 add_byte_size_attribute (type_die, type); 8171 if (TYPE_STUB_DECL (type) != NULL_TREE) 8172 add_src_coords_attributes (type_die, TYPE_STUB_DECL (type)); 8173 8174 /* If the first reference to this type was as the return type of an 8175 inline function, then it may not have a parent. Fix this now. */ 8176 if (type_die->die_parent == NULL) 8177 add_child_die (scope_die_for (type, context_die), type_die); 8178 8179 for (link = TYPE_FIELDS (type); 8180 link != NULL; link = TREE_CHAIN (link)) 8181 { 8182 register dw_die_ref enum_die = new_die (DW_TAG_enumerator, type_die); 8183 8184 add_name_attribute (enum_die, 8185 IDENTIFIER_POINTER (TREE_PURPOSE (link))); 8186 add_AT_unsigned (enum_die, DW_AT_const_value, 8187 (unsigned) TREE_INT_CST_LOW (TREE_VALUE (link))); 8188 } 8189 } 8190 else 8191 add_AT_flag (type_die, DW_AT_declaration, 1); 8192} 8193 8194 8195/* Generate a DIE to represent either a real live formal parameter decl or to 8196 represent just the type of some formal parameter position in some function 8197 type. 8198 8199 Note that this routine is a bit unusual because its argument may be a 8200 ..._DECL node (i.e. either a PARM_DECL or perhaps a VAR_DECL which 8201 represents an inlining of some PARM_DECL) or else some sort of a ..._TYPE 8202 node. If it's the former then this function is being called to output a 8203 DIE to represent a formal parameter object (or some inlining thereof). If 8204 it's the latter, then this function is only being called to output a 8205 DW_TAG_formal_parameter DIE to stand as a placeholder for some formal 8206 argument type of some subprogram type. */ 8207 8208static dw_die_ref 8209gen_formal_parameter_die (node, context_die) 8210 register tree node; 8211 register dw_die_ref context_die; 8212{ 8213 register dw_die_ref parm_die 8214 = new_die (DW_TAG_formal_parameter, context_die); 8215 register tree origin; 8216 8217 switch (TREE_CODE_CLASS (TREE_CODE (node))) 8218 { 8219 case 'd': 8220 origin = decl_ultimate_origin (node); 8221 if (origin != NULL) 8222 add_abstract_origin_attribute (parm_die, origin); 8223 else 8224 { 8225 add_name_and_src_coords_attributes (parm_die, node); 8226 add_type_attribute (parm_die, TREE_TYPE (node), 8227 TREE_READONLY (node), 8228 TREE_THIS_VOLATILE (node), 8229 context_die); 8230 if (DECL_ARTIFICIAL (node)) 8231 add_AT_flag (parm_die, DW_AT_artificial, 1); 8232 } 8233 8234 equate_decl_number_to_die (node, parm_die); 8235 if (! DECL_ABSTRACT (node)) 8236 add_location_or_const_value_attribute (parm_die, node); 8237 8238 break; 8239 8240 case 't': 8241 /* We were called with some kind of a ..._TYPE node. */ 8242 add_type_attribute (parm_die, node, 0, 0, context_die); 8243 break; 8244 8245 default: 8246 abort (); 8247 } 8248 8249 return parm_die; 8250} 8251 8252/* Generate a special type of DIE used as a stand-in for a trailing ellipsis 8253 at the end of an (ANSI prototyped) formal parameters list. */ 8254 8255static void 8256gen_unspecified_parameters_die (decl_or_type, context_die) 8257 register tree decl_or_type; 8258 register dw_die_ref context_die; 8259{ 8260 new_die (DW_TAG_unspecified_parameters, context_die); 8261} 8262 8263/* Generate a list of nameless DW_TAG_formal_parameter DIEs (and perhaps a 8264 DW_TAG_unspecified_parameters DIE) to represent the types of the formal 8265 parameters as specified in some function type specification (except for 8266 those which appear as part of a function *definition*). 8267 8268 Note we must be careful here to output all of the parameter DIEs before* 8269 we output any DIEs needed to represent the types of the formal parameters. 8270 This keeps svr4 SDB happy because it (incorrectly) thinks that the first 8271 non-parameter DIE it sees ends the formal parameter list. */ 8272 8273static void 8274gen_formal_types_die (function_or_method_type, context_die) 8275 register tree function_or_method_type; 8276 register dw_die_ref context_die; 8277{ 8278 register tree link; 8279 register tree formal_type = NULL; 8280 register tree first_parm_type = TYPE_ARG_TYPES (function_or_method_type); 8281 8282#if 0 8283 /* In the case where we are generating a formal types list for a C++ 8284 non-static member function type, skip over the first thing on the 8285 TYPE_ARG_TYPES list because it only represents the type of the hidden 8286 `this pointer'. The debugger should be able to figure out (without 8287 being explicitly told) that this non-static member function type takes a 8288 `this pointer' and should be able to figure what the type of that hidden 8289 parameter is from the DW_AT_member attribute of the parent 8290 DW_TAG_subroutine_type DIE. */ 8291 if (TREE_CODE (function_or_method_type) == METHOD_TYPE) 8292 first_parm_type = TREE_CHAIN (first_parm_type); 8293#endif 8294 8295 /* Make our first pass over the list of formal parameter types and output a 8296 DW_TAG_formal_parameter DIE for each one. */ 8297 for (link = first_parm_type; link; link = TREE_CHAIN (link)) 8298 { 8299 register dw_die_ref parm_die; 8300 8301 formal_type = TREE_VALUE (link); 8302 if (formal_type == void_type_node) 8303 break; 8304 8305 /* Output a (nameless) DIE to represent the formal parameter itself. */ 8306 parm_die = gen_formal_parameter_die (formal_type, context_die); 8307 if (TREE_CODE (function_or_method_type) == METHOD_TYPE 8308 && link == first_parm_type) 8309 add_AT_flag (parm_die, DW_AT_artificial, 1); 8310 } 8311 8312 /* If this function type has an ellipsis, add a 8313 DW_TAG_unspecified_parameters DIE to the end of the parameter list. */ 8314 if (formal_type != void_type_node) 8315 gen_unspecified_parameters_die (function_or_method_type, context_die); 8316 8317 /* Make our second (and final) pass over the list of formal parameter types 8318 and output DIEs to represent those types (as necessary). */ 8319 for (link = TYPE_ARG_TYPES (function_or_method_type); 8320 link; 8321 link = TREE_CHAIN (link)) 8322 { 8323 formal_type = TREE_VALUE (link); 8324 if (formal_type == void_type_node) 8325 break; 8326 8327 gen_type_die (formal_type, context_die); 8328 } 8329} 8330 8331/* Generate a DIE to represent a declared function (either file-scope or 8332 block-local). */ 8333 8334static void 8335gen_subprogram_die (decl, context_die) 8336 register tree decl; 8337 register dw_die_ref context_die; 8338{ 8339 char label_id[MAX_ARTIFICIAL_LABEL_BYTES]; 8340 register tree origin = decl_ultimate_origin (decl); 8341 register dw_die_ref subr_die; 8342 register rtx fp_reg; 8343 register tree fn_arg_types; 8344 register tree outer_scope; 8345 register dw_die_ref old_die = lookup_decl_die (decl); 8346 register int declaration 8347 = (current_function_decl != decl 8348 || (context_die 8349 && (context_die->die_tag == DW_TAG_structure_type 8350 || context_die->die_tag == DW_TAG_union_type))); 8351 8352 if (origin != NULL) 8353 { 8354 subr_die = new_die (DW_TAG_subprogram, context_die); 8355 add_abstract_origin_attribute (subr_die, origin); 8356 } 8357 else if (old_die && DECL_ABSTRACT (decl) 8358 && get_AT_unsigned (old_die, DW_AT_inline)) 8359 { 8360 /* This must be a redefinition of an extern inline function. 8361 We can just reuse the old die here. */ 8362 subr_die = old_die; 8363 8364 /* Clear out the inlined attribute and parm types. */ 8365 remove_AT (subr_die, DW_AT_inline); 8366 remove_children (subr_die); 8367 } 8368 else if (old_die) 8369 { 8370 register unsigned file_index 8371 = lookup_filename (DECL_SOURCE_FILE (decl)); 8372 8373 if (get_AT_flag (old_die, DW_AT_declaration) != 1)
|
8165 abort ();
|
8374 { 8375 /* ??? This can happen if there is a bug in the program, for 8376 instance, if it has duplicate function definitions. Ideally, 8377 we should detect this case and ignore it. For now, if we have 8378 already reported an error, any error at all, then assume that 8379 we got here because of a input error, not a dwarf2 bug. */ 8380 extern int errorcount; 8381 if (errorcount) 8382 return; 8383 abort (); 8384 } |
8385 8386 /* If the definition comes from the same place as the declaration, 8387 maybe use the old DIE. We always want the DIE for this function 8388 that has the *_pc attributes to be under comp_unit_die so the 8389 debugger can find it. For inlines, that is the concrete instance, 8390 so we can use the old DIE here. For non-inline methods, we want a 8391 specification DIE at toplevel, so we need a new DIE. For local 8392 class methods, this does not apply. */ 8393 if ((DECL_ABSTRACT (decl) || old_die->die_parent == comp_unit_die 8394 || context_die == NULL) 8395 && get_AT_unsigned (old_die, DW_AT_decl_file) == file_index 8396 && (get_AT_unsigned (old_die, DW_AT_decl_line) 8397 == DECL_SOURCE_LINE (decl))) 8398 { 8399 subr_die = old_die; 8400 8401 /* Clear out the declaration attribute and the parm types. */ 8402 remove_AT (subr_die, DW_AT_declaration); 8403 remove_children (subr_die); 8404 } 8405 else 8406 { 8407 subr_die = new_die (DW_TAG_subprogram, context_die); 8408 add_AT_die_ref (subr_die, DW_AT_specification, old_die); 8409 if (get_AT_unsigned (old_die, DW_AT_decl_file) != file_index) 8410 add_AT_unsigned (subr_die, DW_AT_decl_file, file_index); 8411 if (get_AT_unsigned (old_die, DW_AT_decl_line) 8412 != DECL_SOURCE_LINE (decl)) 8413 add_AT_unsigned 8414 (subr_die, DW_AT_decl_line, DECL_SOURCE_LINE (decl)); 8415 } 8416 } 8417 else 8418 { 8419 register dw_die_ref scope_die; 8420 8421 if (DECL_CONTEXT (decl)) 8422 scope_die = scope_die_for (decl, context_die); 8423 else 8424 /* Don't put block extern declarations under comp_unit_die. */ 8425 scope_die = context_die; 8426 8427 subr_die = new_die (DW_TAG_subprogram, scope_die); 8428 8429 if (TREE_PUBLIC (decl)) 8430 add_AT_flag (subr_die, DW_AT_external, 1); 8431 8432 add_name_and_src_coords_attributes (subr_die, decl); 8433 if (debug_info_level > DINFO_LEVEL_TERSE) 8434 { 8435 register tree type = TREE_TYPE (decl); 8436 8437 add_prototyped_attribute (subr_die, type); 8438 add_type_attribute (subr_die, TREE_TYPE (type), 0, 0, context_die); 8439 } 8440 8441 add_pure_or_virtual_attribute (subr_die, decl); 8442 if (DECL_ARTIFICIAL (decl)) 8443 add_AT_flag (subr_die, DW_AT_artificial, 1); 8444 if (TREE_PROTECTED (decl)) 8445 add_AT_unsigned (subr_die, DW_AT_accessibility, DW_ACCESS_protected); 8446 else if (TREE_PRIVATE (decl)) 8447 add_AT_unsigned (subr_die, DW_AT_accessibility, DW_ACCESS_private); 8448 } 8449 8450 if (declaration) 8451 { 8452 add_AT_flag (subr_die, DW_AT_declaration, 1); 8453 8454 /* The first time we see a member function, it is in the context of 8455 the class to which it belongs. We make sure of this by emitting 8456 the class first. The next time is the definition, which is 8457 handled above. The two may come from the same source text. */ 8458 if (DECL_CONTEXT (decl)) 8459 equate_decl_number_to_die (decl, subr_die); 8460 } 8461 else if (DECL_ABSTRACT (decl)) 8462 { 8463 /* ??? Checking DECL_DEFER_OUTPUT is correct for static inline functions, 8464 but not for extern inline functions. We can't get this completely 8465 correct because information about whether the function was declared 8466 inline is not saved anywhere. */ 8467 if (DECL_DEFER_OUTPUT (decl)) 8468 { 8469 if (DECL_INLINE (decl)) 8470 add_AT_unsigned (subr_die, DW_AT_inline, DW_INL_declared_inlined); 8471 else 8472 add_AT_unsigned (subr_die, DW_AT_inline, 8473 DW_INL_declared_not_inlined); 8474 } 8475 else if (DECL_INLINE (decl)) 8476 add_AT_unsigned (subr_die, DW_AT_inline, DW_INL_inlined); 8477 else 8478 abort (); 8479 8480 equate_decl_number_to_die (decl, subr_die); 8481 } 8482 else if (!DECL_EXTERNAL (decl)) 8483 { 8484 if (origin == NULL_TREE) 8485 equate_decl_number_to_die (decl, subr_die); 8486 8487 ASM_GENERATE_INTERNAL_LABEL (label_id, FUNC_BEGIN_LABEL, 8488 current_funcdef_number); 8489 add_AT_lbl_id (subr_die, DW_AT_low_pc, label_id); 8490 ASM_GENERATE_INTERNAL_LABEL (label_id, FUNC_END_LABEL, 8491 current_funcdef_number); 8492 add_AT_lbl_id (subr_die, DW_AT_high_pc, label_id); 8493 8494 add_pubname (decl, subr_die); 8495 add_arange (decl, subr_die); 8496 8497#ifdef MIPS_DEBUGGING_INFO 8498 /* Add a reference to the FDE for this routine. */ 8499 add_AT_fde_ref (subr_die, DW_AT_MIPS_fde, current_funcdef_fde); 8500#endif 8501 8502 /* Define the "frame base" location for this routine. We use the 8503 frame pointer or stack pointer registers, since the RTL for local 8504 variables is relative to one of them. */ 8505 fp_reg 8506 = frame_pointer_needed ? hard_frame_pointer_rtx : stack_pointer_rtx; 8507 add_AT_loc (subr_die, DW_AT_frame_base, reg_loc_descriptor (fp_reg)); 8508 8509#if 0 8510 /* ??? This fails for nested inline functions, because context_display 8511 is not part of the state saved/restored for inline functions. */ 8512 if (current_function_needs_context) 8513 add_AT_location_description (subr_die, DW_AT_static_link, 8514 lookup_static_chain (decl)); 8515#endif 8516 } 8517 8518 /* Now output descriptions of the arguments for this function. This gets 8519 (unnecessarily?) complex because of the fact that the DECL_ARGUMENT list 8520 for a FUNCTION_DECL doesn't indicate cases where there was a trailing 8521 `...' at the end of the formal parameter list. In order to find out if 8522 there was a trailing ellipsis or not, we must instead look at the type 8523 associated with the FUNCTION_DECL. This will be a node of type 8524 FUNCTION_TYPE. If the chain of type nodes hanging off of this 8525 FUNCTION_TYPE node ends with a void_type_node then there should *not* be 8526 an ellipsis at the end. */ 8527 push_decl_scope (decl); 8528 8529 /* In the case where we are describing a mere function declaration, all we 8530 need to do here (and all we *can* do here) is to describe the *types* of 8531 its formal parameters. */ 8532 if (debug_info_level <= DINFO_LEVEL_TERSE) 8533 ; 8534 else if (declaration) 8535 gen_formal_types_die (TREE_TYPE (decl), subr_die); 8536 else 8537 { 8538 /* Generate DIEs to represent all known formal parameters */ 8539 register tree arg_decls = DECL_ARGUMENTS (decl); 8540 register tree parm; 8541 8542 /* When generating DIEs, generate the unspecified_parameters DIE 8543 instead if we come across the arg "__builtin_va_alist" */ 8544 for (parm = arg_decls; parm; parm = TREE_CHAIN (parm)) 8545 if (TREE_CODE (parm) == PARM_DECL) 8546 { 8547 if (DECL_NAME (parm) 8548 && !strcmp (IDENTIFIER_POINTER (DECL_NAME (parm)), 8549 "__builtin_va_alist")) 8550 gen_unspecified_parameters_die (parm, subr_die); 8551 else 8552 gen_decl_die (parm, subr_die); 8553 } 8554 8555 /* Decide whether we need a unspecified_parameters DIE at the end. 8556 There are 2 more cases to do this for: 1) the ansi ... declaration - 8557 this is detectable when the end of the arg list is not a 8558 void_type_node 2) an unprototyped function declaration (not a 8559 definition). This just means that we have no info about the 8560 parameters at all. */ 8561 fn_arg_types = TYPE_ARG_TYPES (TREE_TYPE (decl)); 8562 if (fn_arg_types != NULL) 8563 { 8564 /* this is the prototyped case, check for ... */ 8565 if (TREE_VALUE (tree_last (fn_arg_types)) != void_type_node) 8566 gen_unspecified_parameters_die (decl, subr_die); 8567 } 8568 else if (DECL_INITIAL (decl) == NULL_TREE) 8569 gen_unspecified_parameters_die (decl, subr_die); 8570 } 8571 8572 /* Output Dwarf info for all of the stuff within the body of the function 8573 (if it has one - it may be just a declaration). */ 8574 outer_scope = DECL_INITIAL (decl); 8575 8576 /* Note that here, `outer_scope' is a pointer to the outermost BLOCK 8577 node created to represent a function. This outermost BLOCK actually 8578 represents the outermost binding contour for the function, i.e. the 8579 contour in which the function's formal parameters and labels get 8580 declared. Curiously, it appears that the front end doesn't actually 8581 put the PARM_DECL nodes for the current function onto the BLOCK_VARS 8582 list for this outer scope. (They are strung off of the DECL_ARGUMENTS 8583 list for the function instead.) The BLOCK_VARS list for the 8584 `outer_scope' does provide us with a list of the LABEL_DECL nodes for 8585 the function however, and we output DWARF info for those in 8586 decls_for_scope. Just within the `outer_scope' there will be a BLOCK 8587 node representing the function's outermost pair of curly braces, and 8588 any blocks used for the base and member initializers of a C++ 8589 constructor function. */ 8590 if (! declaration && TREE_CODE (outer_scope) != ERROR_MARK) 8591 { 8592 current_function_has_inlines = 0; 8593 decls_for_scope (outer_scope, subr_die, 0); 8594 8595#if 0 && defined (MIPS_DEBUGGING_INFO) 8596 if (current_function_has_inlines) 8597 { 8598 add_AT_flag (subr_die, DW_AT_MIPS_has_inlines, 1); 8599 if (! comp_unit_has_inlines) 8600 { 8601 add_AT_flag (comp_unit_die, DW_AT_MIPS_has_inlines, 1); 8602 comp_unit_has_inlines = 1; 8603 } 8604 } 8605#endif 8606 } 8607 8608 pop_decl_scope (); 8609} 8610 8611/* Generate a DIE to represent a declared data object. */ 8612 8613static void 8614gen_variable_die (decl, context_die) 8615 register tree decl; 8616 register dw_die_ref context_die; 8617{ 8618 register tree origin = decl_ultimate_origin (decl); 8619 register dw_die_ref var_die = new_die (DW_TAG_variable, context_die); 8620 8621 dw_die_ref old_die = lookup_decl_die (decl); 8622 int declaration 8623 = (DECL_EXTERNAL (decl) 8624 || current_function_decl != decl_function_context (decl) 8625 || context_die->die_tag == DW_TAG_structure_type 8626 || context_die->die_tag == DW_TAG_union_type); 8627 8628 if (origin != NULL) 8629 add_abstract_origin_attribute (var_die, origin); 8630 /* Loop unrolling can create multiple blocks that refer to the same 8631 static variable, so we must test for the DW_AT_declaration flag. */ 8632 /* ??? Loop unrolling/reorder_blocks should perhaps be rewritten to 8633 copy decls and set the DECL_ABSTRACT flag on them instead of 8634 sharing them. */ 8635 else if (old_die && TREE_STATIC (decl) 8636 && get_AT_flag (old_die, DW_AT_declaration) == 1) 8637 { 8638 /* ??? This is an instantiation of a C++ class level static. */ 8639 add_AT_die_ref (var_die, DW_AT_specification, old_die); 8640 if (DECL_NAME (decl)) 8641 { 8642 register unsigned file_index 8643 = lookup_filename (DECL_SOURCE_FILE (decl)); 8644 8645 if (get_AT_unsigned (old_die, DW_AT_decl_file) != file_index) 8646 add_AT_unsigned (var_die, DW_AT_decl_file, file_index); 8647 8648 if (get_AT_unsigned (old_die, DW_AT_decl_line) 8649 != DECL_SOURCE_LINE (decl)) 8650 8651 add_AT_unsigned (var_die, DW_AT_decl_line, 8652 DECL_SOURCE_LINE (decl)); 8653 } 8654 } 8655 else 8656 { 8657 add_name_and_src_coords_attributes (var_die, decl); 8658 add_type_attribute (var_die, TREE_TYPE (decl), 8659 TREE_READONLY (decl), 8660 TREE_THIS_VOLATILE (decl), context_die); 8661 8662 if (TREE_PUBLIC (decl)) 8663 add_AT_flag (var_die, DW_AT_external, 1); 8664 8665 if (DECL_ARTIFICIAL (decl)) 8666 add_AT_flag (var_die, DW_AT_artificial, 1); 8667 8668 if (TREE_PROTECTED (decl)) 8669 add_AT_unsigned (var_die, DW_AT_accessibility, DW_ACCESS_protected); 8670 8671 else if (TREE_PRIVATE (decl)) 8672 add_AT_unsigned (var_die, DW_AT_accessibility, DW_ACCESS_private); 8673 } 8674 8675 if (declaration) 8676 add_AT_flag (var_die, DW_AT_declaration, 1); 8677 8678 if ((declaration && decl_class_context (decl)) || DECL_ABSTRACT (decl)) 8679 equate_decl_number_to_die (decl, var_die); 8680 8681 if (! declaration && ! DECL_ABSTRACT (decl)) 8682 { 8683 equate_decl_number_to_die (decl, var_die); 8684 add_location_or_const_value_attribute (var_die, decl); 8685 add_pubname (decl, var_die); 8686 } 8687} 8688 8689/* Generate a DIE to represent a label identifier. */ 8690 8691static void 8692gen_label_die (decl, context_die) 8693 register tree decl; 8694 register dw_die_ref context_die; 8695{ 8696 register tree origin = decl_ultimate_origin (decl); 8697 register dw_die_ref lbl_die = new_die (DW_TAG_label, context_die); 8698 register rtx insn; 8699 char label[MAX_ARTIFICIAL_LABEL_BYTES]; 8700 char label2[MAX_ARTIFICIAL_LABEL_BYTES]; 8701 8702 if (origin != NULL) 8703 add_abstract_origin_attribute (lbl_die, origin); 8704 else 8705 add_name_and_src_coords_attributes (lbl_die, decl); 8706 8707 if (DECL_ABSTRACT (decl)) 8708 equate_decl_number_to_die (decl, lbl_die); 8709 else 8710 { 8711 insn = DECL_RTL (decl);
|
8493 if (GET_CODE (insn) == CODE_LABEL)
|
8712 8713 /* Deleted labels are programmer specified labels which have been 8714 eliminated because of various optimisations. We still emit them 8715 here so that it is possible to put breakpoints on them. */ 8716 if (GET_CODE (insn) == CODE_LABEL 8717 || ((GET_CODE (insn) == NOTE 8718 && NOTE_LINE_NUMBER (insn) == NOTE_INSN_DELETED_LABEL))) |
8719 { 8720 /* When optimization is enabled (via -O) some parts of the compiler 8721 (e.g. jump.c and cse.c) may try to delete CODE_LABEL insns which 8722 represent source-level labels which were explicitly declared by 8723 the user. This really shouldn't be happening though, so catch 8724 it if it ever does happen. */ 8725 if (INSN_DELETED_P (insn)) 8726 abort (); 8727 8728 sprintf (label2, INSN_LABEL_FMT, current_funcdef_number); 8729 ASM_GENERATE_INTERNAL_LABEL (label, label2, 8730 (unsigned) INSN_UID (insn)); 8731 add_AT_lbl_id (lbl_die, DW_AT_low_pc, label); 8732 } 8733 } 8734} 8735 8736/* Generate a DIE for a lexical block. */ 8737 8738static void 8739gen_lexical_block_die (stmt, context_die, depth) 8740 register tree stmt; 8741 register dw_die_ref context_die; 8742 int depth; 8743{ 8744 register dw_die_ref stmt_die = new_die (DW_TAG_lexical_block, context_die); 8745 char label[MAX_ARTIFICIAL_LABEL_BYTES]; 8746 8747 if (! BLOCK_ABSTRACT (stmt)) 8748 { 8749 ASM_GENERATE_INTERNAL_LABEL (label, BLOCK_BEGIN_LABEL, 8750 next_block_number); 8751 add_AT_lbl_id (stmt_die, DW_AT_low_pc, label); 8752 ASM_GENERATE_INTERNAL_LABEL (label, BLOCK_END_LABEL, next_block_number); 8753 add_AT_lbl_id (stmt_die, DW_AT_high_pc, label); 8754 } 8755 8756 push_decl_scope (stmt); 8757 decls_for_scope (stmt, stmt_die, depth); 8758 pop_decl_scope (); 8759} 8760 8761/* Generate a DIE for an inlined subprogram. */ 8762 8763static void 8764gen_inlined_subroutine_die (stmt, context_die, depth) 8765 register tree stmt; 8766 register dw_die_ref context_die; 8767 int depth; 8768{ 8769 if (! BLOCK_ABSTRACT (stmt)) 8770 { 8771 register dw_die_ref subr_die 8772 = new_die (DW_TAG_inlined_subroutine, context_die); 8773 register tree decl = block_ultimate_origin (stmt); 8774 char label[MAX_ARTIFICIAL_LABEL_BYTES]; 8775 8776 add_abstract_origin_attribute (subr_die, decl); 8777 ASM_GENERATE_INTERNAL_LABEL (label, BLOCK_BEGIN_LABEL, 8778 next_block_number); 8779 add_AT_lbl_id (subr_die, DW_AT_low_pc, label); 8780 ASM_GENERATE_INTERNAL_LABEL (label, BLOCK_END_LABEL, next_block_number); 8781 add_AT_lbl_id (subr_die, DW_AT_high_pc, label); 8782 push_decl_scope (decl); 8783 decls_for_scope (stmt, subr_die, depth); 8784 pop_decl_scope (); 8785 current_function_has_inlines = 1; 8786 } 8787} 8788 8789/* Generate a DIE for a field in a record, or structure. */ 8790 8791static void 8792gen_field_die (decl, context_die) 8793 register tree decl; 8794 register dw_die_ref context_die; 8795{ 8796 register dw_die_ref decl_die = new_die (DW_TAG_member, context_die); 8797 8798 add_name_and_src_coords_attributes (decl_die, decl); 8799 add_type_attribute (decl_die, member_declared_type (decl), 8800 TREE_READONLY (decl), TREE_THIS_VOLATILE (decl), 8801 context_die); 8802 8803 /* If this is a bit field... */ 8804 if (DECL_BIT_FIELD_TYPE (decl)) 8805 { 8806 add_byte_size_attribute (decl_die, decl); 8807 add_bit_size_attribute (decl_die, decl); 8808 add_bit_offset_attribute (decl_die, decl); 8809 } 8810 8811 if (TREE_CODE (DECL_FIELD_CONTEXT (decl)) != UNION_TYPE) 8812 add_data_member_location_attribute (decl_die, decl); 8813 8814 if (DECL_ARTIFICIAL (decl)) 8815 add_AT_flag (decl_die, DW_AT_artificial, 1); 8816 8817 if (TREE_PROTECTED (decl)) 8818 add_AT_unsigned (decl_die, DW_AT_accessibility, DW_ACCESS_protected); 8819 8820 else if (TREE_PRIVATE (decl)) 8821 add_AT_unsigned (decl_die, DW_AT_accessibility, DW_ACCESS_private); 8822} 8823 8824#if 0 8825/* Don't generate either pointer_type DIEs or reference_type DIEs here. 8826 Use modified_type_die instead. 8827 We keep this code here just in case these types of DIEs may be needed to 8828 represent certain things in other languages (e.g. Pascal) someday. */ 8829static void 8830gen_pointer_type_die (type, context_die) 8831 register tree type; 8832 register dw_die_ref context_die; 8833{ 8834 register dw_die_ref ptr_die 8835 = new_die (DW_TAG_pointer_type, scope_die_for (type, context_die)); 8836 8837 equate_type_number_to_die (type, ptr_die); 8838 add_type_attribute (ptr_die, TREE_TYPE (type), 0, 0, context_die); 8839 add_AT_unsigned (mod_type_die, DW_AT_byte_size, PTR_SIZE); 8840} 8841 8842/* Don't generate either pointer_type DIEs or reference_type DIEs here. 8843 Use modified_type_die instead. 8844 We keep this code here just in case these types of DIEs may be needed to 8845 represent certain things in other languages (e.g. Pascal) someday. */ 8846static void 8847gen_reference_type_die (type, context_die) 8848 register tree type; 8849 register dw_die_ref context_die; 8850{ 8851 register dw_die_ref ref_die 8852 = new_die (DW_TAG_reference_type, scope_die_for (type, context_die)); 8853 8854 equate_type_number_to_die (type, ref_die); 8855 add_type_attribute (ref_die, TREE_TYPE (type), 0, 0, context_die); 8856 add_AT_unsigned (mod_type_die, DW_AT_byte_size, PTR_SIZE); 8857} 8858#endif 8859 8860/* Generate a DIE for a pointer to a member type. */ 8861static void 8862gen_ptr_to_mbr_type_die (type, context_die) 8863 register tree type; 8864 register dw_die_ref context_die; 8865{ 8866 register dw_die_ref ptr_die 8867 = new_die (DW_TAG_ptr_to_member_type, scope_die_for (type, context_die)); 8868 8869 equate_type_number_to_die (type, ptr_die); 8870 add_AT_die_ref (ptr_die, DW_AT_containing_type, 8871 lookup_type_die (TYPE_OFFSET_BASETYPE (type))); 8872 add_type_attribute (ptr_die, TREE_TYPE (type), 0, 0, context_die); 8873} 8874 8875/* Generate the DIE for the compilation unit. */ 8876 8877static void 8878gen_compile_unit_die (main_input_filename) 8879 register char *main_input_filename; 8880{ 8881 char producer[250]; 8882 char *wd = getpwd (); 8883 8884 comp_unit_die = new_die (DW_TAG_compile_unit, NULL); 8885 add_name_attribute (comp_unit_die, main_input_filename); 8886 8887 if (wd != NULL) 8888 add_AT_string (comp_unit_die, DW_AT_comp_dir, wd); 8889 8890 sprintf (producer, "%s %s", language_string, version_string); 8891 8892#ifdef MIPS_DEBUGGING_INFO 8893 /* The MIPS/SGI compilers place the 'cc' command line options in the producer 8894 string. The SGI debugger looks for -g, -g1, -g2, or -g3; if they do 8895 not appear in the producer string, the debugger reaches the conclusion 8896 that the object file is stripped and has no debugging information. 8897 To get the MIPS/SGI debugger to believe that there is debugging 8898 information in the object file, we add a -g to the producer string. */ 8899 if (debug_info_level > DINFO_LEVEL_TERSE) 8900 strcat (producer, " -g"); 8901#endif 8902 8903 add_AT_string (comp_unit_die, DW_AT_producer, producer); 8904 8905 if (strcmp (language_string, "GNU C++") == 0) 8906 add_AT_unsigned (comp_unit_die, DW_AT_language, DW_LANG_C_plus_plus); 8907 8908 else if (strcmp (language_string, "GNU Ada") == 0) 8909 add_AT_unsigned (comp_unit_die, DW_AT_language, DW_LANG_Ada83); 8910 8911 else if (strcmp (language_string, "GNU F77") == 0) 8912 add_AT_unsigned (comp_unit_die, DW_AT_language, DW_LANG_Fortran77); 8913 8914 else if (strcmp (language_string, "GNU Pascal") == 0) 8915 add_AT_unsigned (comp_unit_die, DW_AT_language, DW_LANG_Pascal83); 8916 8917 else if (flag_traditional) 8918 add_AT_unsigned (comp_unit_die, DW_AT_language, DW_LANG_C); 8919 8920 else 8921 add_AT_unsigned (comp_unit_die, DW_AT_language, DW_LANG_C89); 8922 8923#if 0 /* unimplemented */ 8924 if (debug_info_level >= DINFO_LEVEL_VERBOSE) 8925 add_AT_unsigned (comp_unit_die, DW_AT_macro_info, 0); 8926#endif 8927} 8928 8929/* Generate a DIE for a string type. */ 8930 8931static void 8932gen_string_type_die (type, context_die) 8933 register tree type; 8934 register dw_die_ref context_die; 8935{ 8936 register dw_die_ref type_die 8937 = new_die (DW_TAG_string_type, scope_die_for (type, context_die)); 8938 8939 equate_type_number_to_die (type, type_die); 8940 8941 /* Fudge the string length attribute for now. */ 8942 8943 /* TODO: add string length info. 8944 string_length_attribute (TYPE_MAX_VALUE (TYPE_DOMAIN (type))); 8945 bound_representation (upper_bound, 0, 'u'); */ 8946} 8947 8948/* Generate the DIE for a base class. */ 8949 8950static void 8951gen_inheritance_die (binfo, context_die) 8952 register tree binfo; 8953 register dw_die_ref context_die; 8954{ 8955 dw_die_ref die = new_die (DW_TAG_inheritance, context_die); 8956 8957 add_type_attribute (die, BINFO_TYPE (binfo), 0, 0, context_die); 8958 add_data_member_location_attribute (die, binfo); 8959 8960 if (TREE_VIA_VIRTUAL (binfo)) 8961 add_AT_unsigned (die, DW_AT_virtuality, DW_VIRTUALITY_virtual); 8962 if (TREE_VIA_PUBLIC (binfo)) 8963 add_AT_unsigned (die, DW_AT_accessibility, DW_ACCESS_public); 8964 else if (TREE_VIA_PROTECTED (binfo)) 8965 add_AT_unsigned (die, DW_AT_accessibility, DW_ACCESS_protected); 8966} 8967 8968/* Generate a DIE for a class member. */ 8969 8970static void 8971gen_member_die (type, context_die) 8972 register tree type; 8973 register dw_die_ref context_die; 8974{ 8975 register tree member; 8976 8977 /* If this is not an incomplete type, output descriptions of each of its 8978 members. Note that as we output the DIEs necessary to represent the 8979 members of this record or union type, we will also be trying to output 8980 DIEs to represent the *types* of those members. However the `type' 8981 function (above) will specifically avoid generating type DIEs for member 8982 types *within* the list of member DIEs for this (containing) type execpt 8983 for those types (of members) which are explicitly marked as also being 8984 members of this (containing) type themselves. The g++ front- end can 8985 force any given type to be treated as a member of some other 8986 (containing) type by setting the TYPE_CONTEXT of the given (member) type 8987 to point to the TREE node representing the appropriate (containing) 8988 type. */ 8989 8990 /* First output info about the base classes. */ 8991 if (TYPE_BINFO (type) && TYPE_BINFO_BASETYPES (type)) 8992 { 8993 register tree bases = TYPE_BINFO_BASETYPES (type); 8994 register int n_bases = TREE_VEC_LENGTH (bases); 8995 register int i; 8996 8997 for (i = 0; i < n_bases; i++) 8998 gen_inheritance_die (TREE_VEC_ELT (bases, i), context_die); 8999 } 9000 9001 /* Now output info about the data members and type members. */ 9002 for (member = TYPE_FIELDS (type); member; member = TREE_CHAIN (member)) 9003 gen_decl_die (member, context_die); 9004 9005 /* Now output info about the function members (if any). */ 9006 for (member = TYPE_METHODS (type); member; member = TREE_CHAIN (member)) 9007 gen_decl_die (member, context_die); 9008} 9009 9010/* Generate a DIE for a structure or union type. */ 9011 9012static void 9013gen_struct_or_union_type_die (type, context_die) 9014 register tree type; 9015 register dw_die_ref context_die; 9016{ 9017 register dw_die_ref type_die = lookup_type_die (type); 9018 register dw_die_ref scope_die = 0; 9019 register int nested = 0; 9020 9021 if (type_die && ! TYPE_SIZE (type)) 9022 return; 9023 9024 if (TYPE_CONTEXT (type) != NULL_TREE
|
8800 && TREE_CODE_CLASS (TREE_CODE (TYPE_CONTEXT (type))) == 't')
|
9025 && AGGREGATE_TYPE_P (TYPE_CONTEXT (type))) |
9026 nested = 1; 9027 9028 scope_die = scope_die_for (type, context_die); 9029 9030 if (! type_die || (nested && scope_die == comp_unit_die)) 9031 /* First occurrence of type or toplevel definition of nested class. */ 9032 { 9033 register dw_die_ref old_die = type_die; 9034 9035 type_die = new_die (TREE_CODE (type) == RECORD_TYPE 9036 ? DW_TAG_structure_type : DW_TAG_union_type, 9037 scope_die); 9038 equate_type_number_to_die (type, type_die); 9039 add_name_attribute (type_die, type_tag (type)); 9040 if (old_die) 9041 add_AT_die_ref (type_die, DW_AT_specification, old_die); 9042 } 9043 else 9044 remove_AT (type_die, DW_AT_declaration); 9045 9046 /* If we're not in the right context to be defining this type, defer to 9047 avoid tricky recursion. */ 9048 if (TYPE_SIZE (type) && decl_scope_depth > 0 && scope_die == comp_unit_die) 9049 { 9050 add_AT_flag (type_die, DW_AT_declaration, 1); 9051 pend_type (type); 9052 } 9053 /* If this type has been completed, then give it a byte_size attribute and 9054 then give a list of members. */ 9055 else if (TYPE_SIZE (type)) 9056 { 9057 /* Prevent infinite recursion in cases where the type of some member of 9058 this type is expressed in terms of this type itself. */ 9059 TREE_ASM_WRITTEN (type) = 1; 9060 add_byte_size_attribute (type_die, type); 9061 if (TYPE_STUB_DECL (type) != NULL_TREE) 9062 add_src_coords_attributes (type_die, TYPE_STUB_DECL (type)); 9063 9064 /* If the first reference to this type was as the return type of an 9065 inline function, then it may not have a parent. Fix this now. */ 9066 if (type_die->die_parent == NULL) 9067 add_child_die (scope_die, type_die); 9068 9069 push_decl_scope (type); 9070 gen_member_die (type, type_die); 9071 pop_decl_scope (); 9072 9073 /* GNU extension: Record what type our vtable lives in. */ 9074 if (TYPE_VFIELD (type)) 9075 { 9076 tree vtype = DECL_FCONTEXT (TYPE_VFIELD (type)); 9077 9078 gen_type_die (vtype, context_die); 9079 add_AT_die_ref (type_die, DW_AT_containing_type, 9080 lookup_type_die (vtype)); 9081 } 9082 } 9083 else
|
8859 add_AT_flag (type_die, DW_AT_declaration, 1);
|
9084 { 9085 add_AT_flag (type_die, DW_AT_declaration, 1); 9086 9087 /* We can't do this for function-local types, and we don't need to. */ 9088 if (TREE_PERMANENT (type)) 9089 add_incomplete_type (type); 9090 } |
9091} 9092 9093/* Generate a DIE for a subroutine _type_. */ 9094 9095static void 9096gen_subroutine_type_die (type, context_die) 9097 register tree type; 9098 register dw_die_ref context_die; 9099{ 9100 register tree return_type = TREE_TYPE (type); 9101 register dw_die_ref subr_die 9102 = new_die (DW_TAG_subroutine_type, scope_die_for (type, context_die)); 9103 9104 equate_type_number_to_die (type, subr_die); 9105 add_prototyped_attribute (subr_die, type); 9106 add_type_attribute (subr_die, return_type, 0, 0, context_die); 9107 gen_formal_types_die (type, subr_die); 9108} 9109 9110/* Generate a DIE for a type definition */ 9111 9112static void 9113gen_typedef_die (decl, context_die) 9114 register tree decl; 9115 register dw_die_ref context_die; 9116{ 9117 register dw_die_ref type_die; 9118 register tree origin; 9119 9120 if (TREE_ASM_WRITTEN (decl)) 9121 return; 9122 TREE_ASM_WRITTEN (decl) = 1; 9123 9124 type_die = new_die (DW_TAG_typedef, scope_die_for (decl, context_die)); 9125 origin = decl_ultimate_origin (decl); 9126 if (origin != NULL) 9127 add_abstract_origin_attribute (type_die, origin); 9128 else 9129 { 9130 register tree type; 9131 add_name_and_src_coords_attributes (type_die, decl); 9132 if (DECL_ORIGINAL_TYPE (decl)) 9133 { 9134 type = DECL_ORIGINAL_TYPE (decl); 9135 equate_type_number_to_die (TREE_TYPE (decl), type_die); 9136 } 9137 else 9138 type = TREE_TYPE (decl); 9139 add_type_attribute (type_die, type, TREE_READONLY (decl), 9140 TREE_THIS_VOLATILE (decl), context_die); 9141 } 9142 9143 if (DECL_ABSTRACT (decl)) 9144 equate_decl_number_to_die (decl, type_die); 9145} 9146 9147/* Generate a type description DIE. */ 9148 9149static void 9150gen_type_die (type, context_die) 9151 register tree type; 9152 register dw_die_ref context_die; 9153{ 9154 if (type == NULL_TREE || type == error_mark_node) 9155 return; 9156 9157 /* We are going to output a DIE to represent the unqualified version of 9158 this type (i.e. without any const or volatile qualifiers) so get the 9159 main variant (i.e. the unqualified version) of this type now. */ 9160 type = type_main_variant (type); 9161 9162 if (TREE_ASM_WRITTEN (type)) 9163 return; 9164 9165 if (TYPE_NAME (type) && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL 9166 && DECL_ORIGINAL_TYPE (TYPE_NAME (type))) 9167 { 9168 TREE_ASM_WRITTEN (type) = 1; 9169 gen_decl_die (TYPE_NAME (type), context_die); 9170 return; 9171 } 9172 9173 switch (TREE_CODE (type)) 9174 { 9175 case ERROR_MARK: 9176 break; 9177 9178 case POINTER_TYPE: 9179 case REFERENCE_TYPE: 9180 /* We must set TREE_ASM_WRITTEN in case this is a recursive type. This 9181 ensures that the gen_type_die recursion will terminate even if the 9182 type is recursive. Recursive types are possible in Ada. */ 9183 /* ??? We could perhaps do this for all types before the switch 9184 statement. */ 9185 TREE_ASM_WRITTEN (type) = 1; 9186 9187 /* For these types, all that is required is that we output a DIE (or a 9188 set of DIEs) to represent the "basis" type. */ 9189 gen_type_die (TREE_TYPE (type), context_die); 9190 break; 9191 9192 case OFFSET_TYPE: 9193 /* This code is used for C++ pointer-to-data-member types. 9194 Output a description of the relevant class type. */ 9195 gen_type_die (TYPE_OFFSET_BASETYPE (type), context_die); 9196 9197 /* Output a description of the type of the object pointed to. */ 9198 gen_type_die (TREE_TYPE (type), context_die); 9199 9200 /* Now output a DIE to represent this pointer-to-data-member type 9201 itself. */ 9202 gen_ptr_to_mbr_type_die (type, context_die); 9203 break; 9204 9205 case SET_TYPE: 9206 gen_type_die (TYPE_DOMAIN (type), context_die); 9207 gen_set_type_die (type, context_die); 9208 break; 9209 9210 case FILE_TYPE: 9211 gen_type_die (TREE_TYPE (type), context_die); 9212 abort (); /* No way to represent these in Dwarf yet! */ 9213 break; 9214 9215 case FUNCTION_TYPE: 9216 /* Force out return type (in case it wasn't forced out already). */ 9217 gen_type_die (TREE_TYPE (type), context_die); 9218 gen_subroutine_type_die (type, context_die); 9219 break; 9220 9221 case METHOD_TYPE: 9222 /* Force out return type (in case it wasn't forced out already). */ 9223 gen_type_die (TREE_TYPE (type), context_die); 9224 gen_subroutine_type_die (type, context_die); 9225 break; 9226 9227 case ARRAY_TYPE: 9228 if (TYPE_STRING_FLAG (type) && TREE_CODE (TREE_TYPE (type)) == CHAR_TYPE) 9229 { 9230 gen_type_die (TREE_TYPE (type), context_die); 9231 gen_string_type_die (type, context_die); 9232 } 9233 else 9234 gen_array_type_die (type, context_die); 9235 break; 9236 9237 case ENUMERAL_TYPE: 9238 case RECORD_TYPE: 9239 case UNION_TYPE: 9240 case QUAL_UNION_TYPE: 9241 /* If this is a nested type whose containing class hasn't been 9242 written out yet, writing it out will cover this one, too. */ 9243 if (TYPE_CONTEXT (type)
|
9013 && TREE_CODE_CLASS (TREE_CODE (TYPE_CONTEXT (type))) == 't'
|
9244 && AGGREGATE_TYPE_P (TYPE_CONTEXT (type)) |
9245 && ! TREE_ASM_WRITTEN (TYPE_CONTEXT (type))) 9246 { 9247 gen_type_die (TYPE_CONTEXT (type), context_die); 9248 9249 if (TREE_ASM_WRITTEN (TYPE_CONTEXT (type))) 9250 return; 9251 9252 /* If that failed, attach ourselves to the stub. */ 9253 push_decl_scope (TYPE_CONTEXT (type)); 9254 context_die = lookup_type_die (TYPE_CONTEXT (type)); 9255 } 9256 9257 if (TREE_CODE (type) == ENUMERAL_TYPE) 9258 gen_enumeration_type_die (type, context_die); 9259 else 9260 gen_struct_or_union_type_die (type, context_die); 9261 9262 if (TYPE_CONTEXT (type)
|
9032 && TREE_CODE_CLASS (TREE_CODE (TYPE_CONTEXT (type))) == 't'
|
9263 && AGGREGATE_TYPE_P (TYPE_CONTEXT (type)) |
9264 && ! TREE_ASM_WRITTEN (TYPE_CONTEXT (type))) 9265 pop_decl_scope (); 9266 9267 /* Don't set TREE_ASM_WRITTEN on an incomplete struct; we want to fix 9268 it up if it is ever completed. gen_*_type_die will set it for us 9269 when appropriate. */ 9270 return; 9271 9272 case VOID_TYPE: 9273 case INTEGER_TYPE: 9274 case REAL_TYPE: 9275 case COMPLEX_TYPE: 9276 case BOOLEAN_TYPE: 9277 case CHAR_TYPE: 9278 /* No DIEs needed for fundamental types. */ 9279 break; 9280 9281 case LANG_TYPE: 9282 /* No Dwarf representation currently defined. */ 9283 break; 9284 9285 default: 9286 abort (); 9287 } 9288 9289 TREE_ASM_WRITTEN (type) = 1; 9290} 9291 9292/* Generate a DIE for a tagged type instantiation. */ 9293 9294static void 9295gen_tagged_type_instantiation_die (type, context_die) 9296 register tree type; 9297 register dw_die_ref context_die; 9298{ 9299 if (type == NULL_TREE || type == error_mark_node) 9300 return; 9301 9302 /* We are going to output a DIE to represent the unqualified version of 9303 this type (i.e. without any const or volatile qualifiers) so make sure 9304 that we have the main variant (i.e. the unqualified version) of this 9305 type now. */ 9306 if (type != type_main_variant (type) 9307 || !TREE_ASM_WRITTEN (type)) 9308 abort (); 9309 9310 switch (TREE_CODE (type)) 9311 { 9312 case ERROR_MARK: 9313 break; 9314 9315 case ENUMERAL_TYPE: 9316 gen_inlined_enumeration_type_die (type, context_die); 9317 break; 9318 9319 case RECORD_TYPE: 9320 gen_inlined_structure_type_die (type, context_die); 9321 break; 9322 9323 case UNION_TYPE: 9324 case QUAL_UNION_TYPE: 9325 gen_inlined_union_type_die (type, context_die); 9326 break; 9327 9328 default: 9329 abort (); 9330 } 9331} 9332 9333/* Generate a DW_TAG_lexical_block DIE followed by DIEs to represent all of the 9334 things which are local to the given block. */ 9335 9336static void 9337gen_block_die (stmt, context_die, depth) 9338 register tree stmt; 9339 register dw_die_ref context_die; 9340 int depth; 9341{ 9342 register int must_output_die = 0; 9343 register tree origin; 9344 register tree decl; 9345 register enum tree_code origin_code; 9346 9347 /* Ignore blocks never really used to make RTL. */ 9348 9349 if (stmt == NULL_TREE || !TREE_USED (stmt)) 9350 return; 9351 9352 /* Determine the "ultimate origin" of this block. This block may be an 9353 inlined instance of an inlined instance of inline function, so we have 9354 to trace all of the way back through the origin chain to find out what 9355 sort of node actually served as the original seed for the creation of 9356 the current block. */ 9357 origin = block_ultimate_origin (stmt); 9358 origin_code = (origin != NULL) ? TREE_CODE (origin) : ERROR_MARK; 9359 9360 /* Determine if we need to output any Dwarf DIEs at all to represent this 9361 block. */ 9362 if (origin_code == FUNCTION_DECL) 9363 /* The outer scopes for inlinings *must* always be represented. We 9364 generate DW_TAG_inlined_subroutine DIEs for them. (See below.) */ 9365 must_output_die = 1; 9366 else 9367 { 9368 /* In the case where the current block represents an inlining of the 9369 "body block" of an inline function, we must *NOT* output any DIE for 9370 this block because we have already output a DIE to represent the 9371 whole inlined function scope and the "body block" of any function 9372 doesn't really represent a different scope according to ANSI C 9373 rules. So we check here to make sure that this block does not 9374 represent a "body block inlining" before trying to set the 9375 `must_output_die' flag. */ 9376 if (! is_body_block (origin ? origin : stmt)) 9377 { 9378 /* Determine if this block directly contains any "significant" 9379 local declarations which we will need to output DIEs for. */ 9380 if (debug_info_level > DINFO_LEVEL_TERSE) 9381 /* We are not in terse mode so *any* local declaration counts 9382 as being a "significant" one. */ 9383 must_output_die = (BLOCK_VARS (stmt) != NULL); 9384 else 9385 /* We are in terse mode, so only local (nested) function 9386 definitions count as "significant" local declarations. */ 9387 for (decl = BLOCK_VARS (stmt); 9388 decl != NULL; decl = TREE_CHAIN (decl)) 9389 if (TREE_CODE (decl) == FUNCTION_DECL 9390 && DECL_INITIAL (decl)) 9391 { 9392 must_output_die = 1; 9393 break; 9394 } 9395 } 9396 } 9397 9398 /* It would be a waste of space to generate a Dwarf DW_TAG_lexical_block 9399 DIE for any block which contains no significant local declarations at 9400 all. Rather, in such cases we just call `decls_for_scope' so that any 9401 needed Dwarf info for any sub-blocks will get properly generated. Note 9402 that in terse mode, our definition of what constitutes a "significant" 9403 local declaration gets restricted to include only inlined function 9404 instances and local (nested) function definitions. */ 9405 if (must_output_die) 9406 { 9407 if (origin_code == FUNCTION_DECL) 9408 gen_inlined_subroutine_die (stmt, context_die, depth); 9409 else 9410 gen_lexical_block_die (stmt, context_die, depth); 9411 } 9412 else 9413 decls_for_scope (stmt, context_die, depth); 9414} 9415 9416/* Generate all of the decls declared within a given scope and (recursively) 9417 all of its sub-blocks. */ 9418 9419static void 9420decls_for_scope (stmt, context_die, depth) 9421 register tree stmt; 9422 register dw_die_ref context_die; 9423 int depth; 9424{ 9425 register tree decl; 9426 register tree subblocks; 9427 9428 /* Ignore blocks never really used to make RTL. */ 9429 if (stmt == NULL_TREE || ! TREE_USED (stmt)) 9430 return; 9431 9432 if (!BLOCK_ABSTRACT (stmt) && depth > 0) 9433 next_block_number++; 9434 9435 /* Output the DIEs to represent all of the data objects and typedefs 9436 declared directly within this block but not within any nested 9437 sub-blocks. Also, nested function and tag DIEs have been 9438 generated with a parent of NULL; fix that up now. */ 9439 for (decl = BLOCK_VARS (stmt); 9440 decl != NULL; decl = TREE_CHAIN (decl)) 9441 { 9442 register dw_die_ref die; 9443 9444 if (TREE_CODE (decl) == FUNCTION_DECL) 9445 die = lookup_decl_die (decl); 9446 else if (TREE_CODE (decl) == TYPE_DECL && TYPE_DECL_IS_STUB (decl)) 9447 die = lookup_type_die (TREE_TYPE (decl)); 9448 else 9449 die = NULL; 9450 9451 if (die != NULL && die->die_parent == NULL) 9452 add_child_die (context_die, die); 9453 else 9454 gen_decl_die (decl, context_die); 9455 } 9456 9457 /* Output the DIEs to represent all sub-blocks (and the items declared 9458 therein) of this block. */ 9459 for (subblocks = BLOCK_SUBBLOCKS (stmt); 9460 subblocks != NULL; 9461 subblocks = BLOCK_CHAIN (subblocks)) 9462 gen_block_die (subblocks, context_die, depth + 1); 9463} 9464 9465/* Is this a typedef we can avoid emitting? */ 9466 9467static inline int 9468is_redundant_typedef (decl) 9469 register tree decl; 9470{ 9471 if (TYPE_DECL_IS_STUB (decl)) 9472 return 1; 9473 9474 if (DECL_ARTIFICIAL (decl) 9475 && DECL_CONTEXT (decl) 9476 && is_tagged_type (DECL_CONTEXT (decl)) 9477 && TREE_CODE (TYPE_NAME (DECL_CONTEXT (decl))) == TYPE_DECL 9478 && DECL_NAME (decl) == DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl)))) 9479 /* Also ignore the artificial member typedef for the class name. */ 9480 return 1; 9481 9482 return 0; 9483} 9484 9485/* Generate Dwarf debug information for a decl described by DECL. */ 9486 9487static void 9488gen_decl_die (decl, context_die) 9489 register tree decl; 9490 register dw_die_ref context_die; 9491{ 9492 register tree origin; 9493 9494 /* Make a note of the decl node we are going to be working on. We may need 9495 to give the user the source coordinates of where it appeared in case we 9496 notice (later on) that something about it looks screwy. */ 9497 dwarf_last_decl = decl; 9498 9499 if (TREE_CODE (decl) == ERROR_MARK) 9500 return; 9501 9502 /* If this ..._DECL node is marked to be ignored, then ignore it. But don't 9503 ignore a function definition, since that would screw up our count of 9504 blocks, and that in turn will completely screw up the labels we will 9505 reference in subsequent DW_AT_low_pc and DW_AT_high_pc attributes (for 9506 subsequent blocks). */ 9507 if (DECL_IGNORED_P (decl) && TREE_CODE (decl) != FUNCTION_DECL) 9508 return; 9509 9510 switch (TREE_CODE (decl)) 9511 { 9512 case CONST_DECL: 9513 /* The individual enumerators of an enum type get output when we output 9514 the Dwarf representation of the relevant enum type itself. */ 9515 break; 9516 9517 case FUNCTION_DECL: 9518 /* Don't output any DIEs to represent mere function declarations, 9519 unless they are class members or explicit block externs. */ 9520 if (DECL_INITIAL (decl) == NULL_TREE && DECL_CONTEXT (decl) == NULL_TREE 9521 && (current_function_decl == NULL_TREE || ! DECL_ARTIFICIAL (decl))) 9522 break; 9523 9524 if (debug_info_level > DINFO_LEVEL_TERSE) 9525 { 9526 /* Before we describe the FUNCTION_DECL itself, make sure that we 9527 have described its return type. */ 9528 gen_type_die (TREE_TYPE (TREE_TYPE (decl)), context_die); 9529 9530 /* And its containing type. */ 9531 origin = decl_class_context (decl); 9532 if (origin != NULL_TREE) 9533 gen_type_die (origin, context_die); 9534 9535 /* And its virtual context. */ 9536 if (DECL_VINDEX (decl) != NULL_TREE) 9537 gen_type_die (DECL_CONTEXT (decl), context_die); 9538 } 9539 9540 /* Now output a DIE to represent the function itself. */ 9541 gen_subprogram_die (decl, context_die); 9542 break; 9543 9544 case TYPE_DECL: 9545 /* If we are in terse mode, don't generate any DIEs to represent any 9546 actual typedefs. */ 9547 if (debug_info_level <= DINFO_LEVEL_TERSE) 9548 break; 9549 9550 /* In the special case of a TYPE_DECL node representing the 9551 declaration of some type tag, if the given TYPE_DECL is marked as 9552 having been instantiated from some other (original) TYPE_DECL node 9553 (e.g. one which was generated within the original definition of an 9554 inline function) we have to generate a special (abbreviated) 9555 DW_TAG_structure_type, DW_TAG_union_type, or DW_TAG_enumeration_type 9556 DIE here. */ 9557 if (TYPE_DECL_IS_STUB (decl) && DECL_ABSTRACT_ORIGIN (decl) != NULL_TREE) 9558 { 9559 gen_tagged_type_instantiation_die (TREE_TYPE (decl), context_die); 9560 break; 9561 } 9562 9563 if (is_redundant_typedef (decl)) 9564 gen_type_die (TREE_TYPE (decl), context_die); 9565 else 9566 /* Output a DIE to represent the typedef itself. */ 9567 gen_typedef_die (decl, context_die); 9568 break; 9569 9570 case LABEL_DECL: 9571 if (debug_info_level >= DINFO_LEVEL_NORMAL) 9572 gen_label_die (decl, context_die); 9573 break; 9574 9575 case VAR_DECL: 9576 /* If we are in terse mode, don't generate any DIEs to represent any 9577 variable declarations or definitions. */ 9578 if (debug_info_level <= DINFO_LEVEL_TERSE) 9579 break; 9580 9581 /* Output any DIEs that are needed to specify the type of this data 9582 object. */ 9583 gen_type_die (TREE_TYPE (decl), context_die); 9584 9585 /* And its containing type. */ 9586 origin = decl_class_context (decl); 9587 if (origin != NULL_TREE) 9588 gen_type_die (origin, context_die); 9589 9590 /* Now output the DIE to represent the data object itself. This gets 9591 complicated because of the possibility that the VAR_DECL really 9592 represents an inlined instance of a formal parameter for an inline 9593 function. */ 9594 origin = decl_ultimate_origin (decl); 9595 if (origin != NULL_TREE && TREE_CODE (origin) == PARM_DECL) 9596 gen_formal_parameter_die (decl, context_die); 9597 else 9598 gen_variable_die (decl, context_die); 9599 break; 9600 9601 case FIELD_DECL: 9602 /* Ignore the nameless fields that are used to skip bits, but 9603 handle C++ anonymous unions. */ 9604 if (DECL_NAME (decl) != NULL_TREE 9605 || TREE_CODE (TREE_TYPE (decl)) == UNION_TYPE) 9606 { 9607 gen_type_die (member_declared_type (decl), context_die); 9608 gen_field_die (decl, context_die); 9609 } 9610 break; 9611 9612 case PARM_DECL: 9613 gen_type_die (TREE_TYPE (decl), context_die); 9614 gen_formal_parameter_die (decl, context_die); 9615 break; 9616 9617 default: 9618 abort (); 9619 } 9620} 9621 9622/* Write the debugging output for DECL. */ 9623 9624void 9625dwarf2out_decl (decl) 9626 register tree decl; 9627{ 9628 register dw_die_ref context_die = comp_unit_die; 9629 9630 if (TREE_CODE (decl) == ERROR_MARK) 9631 return; 9632 9633 /* If this ..._DECL node is marked to be ignored, then ignore it. We gotta 9634 hope that the node in question doesn't represent a function definition. 9635 If it does, then totally ignoring it is bound to screw up our count of 9636 blocks, and that in turn will completely screw up the labels we will 9637 reference in subsequent DW_AT_low_pc and DW_AT_high_pc attributes (for 9638 subsequent blocks). (It's too bad that BLOCK nodes don't carry their 9639 own sequence numbers with them!) */ 9640 if (DECL_IGNORED_P (decl)) 9641 { 9642 if (TREE_CODE (decl) == FUNCTION_DECL
|
9412 && DECL_INITIAL (decl) != NULL)
|
9643 && DECL_INITIAL (decl) != NULL) |
9644 abort (); 9645 9646 return; 9647 } 9648 9649 switch (TREE_CODE (decl)) 9650 { 9651 case FUNCTION_DECL: 9652 /* Ignore this FUNCTION_DECL if it refers to a builtin declaration of a 9653 builtin function. Explicit programmer-supplied declarations of 9654 these same functions should NOT be ignored however. */ 9655 if (DECL_EXTERNAL (decl) && DECL_FUNCTION_CODE (decl)) 9656 return; 9657 9658 /* What we would really like to do here is to filter out all mere 9659 file-scope declarations of file-scope functions which are never 9660 referenced later within this translation unit (and keep all of ones 9661 that *are* referenced later on) but we aren't clairvoyant, so we have 9662 no idea which functions will be referenced in the future (i.e. later 9663 on within the current translation unit). So here we just ignore all 9664 file-scope function declarations which are not also definitions. If 9665 and when the debugger needs to know something about these functions, 9666 it wil have to hunt around and find the DWARF information associated 9667 with the definition of the function. Note that we can't just check 9668 `DECL_EXTERNAL' to find out which FUNCTION_DECL nodes represent 9669 definitions and which ones represent mere declarations. We have to 9670 check `DECL_INITIAL' instead. That's because the C front-end 9671 supports some weird semantics for "extern inline" function 9672 definitions. These can get inlined within the current translation 9673 unit (an thus, we need to generate DWARF info for their abstract 9674 instances so that the DWARF info for the concrete inlined instances 9675 can have something to refer to) but the compiler never generates any 9676 out-of-lines instances of such things (despite the fact that they 9677 *are* definitions). The important point is that the C front-end 9678 marks these "extern inline" functions as DECL_EXTERNAL, but we need 9679 to generate DWARF for them anyway. Note that the C++ front-end also 9680 plays some similar games for inline function definitions appearing 9681 within include files which also contain 9682 `#pragma interface' pragmas. */ 9683 if (DECL_INITIAL (decl) == NULL_TREE) 9684 return; 9685 9686 /* If we're a nested function, initially use a parent of NULL; if we're 9687 a plain function, this will be fixed up in decls_for_scope. If 9688 we're a method, it will be ignored, since we already have a DIE. */ 9689 if (decl_function_context (decl)) 9690 context_die = NULL; 9691 9692 break; 9693 9694 case VAR_DECL: 9695 /* Ignore this VAR_DECL if it refers to a file-scope extern data object 9696 declaration and if the declaration was never even referenced from 9697 within this entire compilation unit. We suppress these DIEs in 9698 order to save space in the .debug section (by eliminating entries 9699 which are probably useless). Note that we must not suppress 9700 block-local extern declarations (whether used or not) because that 9701 would screw-up the debugger's name lookup mechanism and cause it to 9702 miss things which really ought to be in scope at a given point. */ 9703 if (DECL_EXTERNAL (decl) && !TREE_USED (decl)) 9704 return; 9705 9706 /* If we are in terse mode, don't generate any DIEs to represent any 9707 variable declarations or definitions. */ 9708 if (debug_info_level <= DINFO_LEVEL_TERSE) 9709 return; 9710 break; 9711 9712 case TYPE_DECL: 9713 /* Don't bother trying to generate any DIEs to represent any of the 9714 normal built-in types for the language we are compiling. */ 9715 if (DECL_SOURCE_LINE (decl) == 0) 9716 { 9717 /* OK, we need to generate one for `bool' so GDB knows what type 9718 comparisons have. */ 9719 if ((get_AT_unsigned (comp_unit_die, DW_AT_language) 9720 == DW_LANG_C_plus_plus) 9721 && TREE_CODE (TREE_TYPE (decl)) == BOOLEAN_TYPE) 9722 modified_type_die (TREE_TYPE (decl), 0, 0, NULL); 9723 9724 return; 9725 } 9726 9727 /* If we are in terse mode, don't generate any DIEs for types. */ 9728 if (debug_info_level <= DINFO_LEVEL_TERSE) 9729 return; 9730 9731 /* If we're a function-scope tag, initially use a parent of NULL; 9732 this will be fixed up in decls_for_scope. */ 9733 if (decl_function_context (decl)) 9734 context_die = NULL; 9735 9736 break; 9737 9738 default: 9739 return; 9740 } 9741 9742 gen_decl_die (decl, context_die); 9743 output_pending_types_for_scope (comp_unit_die); 9744} 9745 9746/* Output a marker (i.e. a label) for the beginning of the generated code for 9747 a lexical block. */ 9748 9749void 9750dwarf2out_begin_block (blocknum) 9751 register unsigned blocknum; 9752{ 9753 function_section (current_function_decl); 9754 ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, BLOCK_BEGIN_LABEL, blocknum); 9755} 9756 9757/* Output a marker (i.e. a label) for the end of the generated code for a 9758 lexical block. */ 9759 9760void 9761dwarf2out_end_block (blocknum) 9762 register unsigned blocknum; 9763{ 9764 function_section (current_function_decl); 9765 ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, BLOCK_END_LABEL, blocknum); 9766} 9767 9768/* Output a marker (i.e. a label) at a point in the assembly code which 9769 corresponds to a given source level label. */ 9770 9771void 9772dwarf2out_label (insn) 9773 register rtx insn; 9774{ 9775 char label[MAX_ARTIFICIAL_LABEL_BYTES]; 9776 9777 if (debug_info_level >= DINFO_LEVEL_NORMAL) 9778 { 9779 function_section (current_function_decl); 9780 sprintf (label, INSN_LABEL_FMT, current_funcdef_number); 9781 ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, label, 9782 (unsigned) INSN_UID (insn)); 9783 } 9784} 9785 9786/* Lookup a filename (in the list of filenames that we know about here in 9787 dwarf2out.c) and return its "index". The index of each (known) filename is 9788 just a unique number which is associated with only that one filename. 9789 We need such numbers for the sake of generating labels 9790 (in the .debug_sfnames section) and references to those 9791 files numbers (in the .debug_srcinfo and.debug_macinfo sections). 9792 If the filename given as an argument is not found in our current list, 9793 add it to the list and assign it the next available unique index number. 9794 In order to speed up searches, we remember the index of the filename 9795 was looked up last. This handles the majority of all searches. */ 9796 9797static unsigned 9798lookup_filename (file_name) 9799 char *file_name; 9800{ 9801 static unsigned last_file_lookup_index = 0; 9802 register unsigned i; 9803 9804 /* Check to see if the file name that was searched on the previous call 9805 matches this file name. If so, return the index. */ 9806 if (last_file_lookup_index != 0) 9807 if (strcmp (file_name, file_table[last_file_lookup_index]) == 0) 9808 return last_file_lookup_index; 9809 9810 /* Didn't match the previous lookup, search the table */ 9811 for (i = 1; i < file_table_in_use; ++i) 9812 if (strcmp (file_name, file_table[i]) == 0) 9813 { 9814 last_file_lookup_index = i; 9815 return i; 9816 } 9817 9818 /* Prepare to add a new table entry by making sure there is enough space in 9819 the table to do so. If not, expand the current table. */ 9820 if (file_table_in_use == file_table_allocated) 9821 { 9822 file_table_allocated += FILE_TABLE_INCREMENT; 9823 file_table 9824 = (char **) xrealloc (file_table, 9825 file_table_allocated * sizeof (char *)); 9826 } 9827 9828 /* Add the new entry to the end of the filename table. */ 9829 file_table[file_table_in_use] = xstrdup (file_name); 9830 last_file_lookup_index = file_table_in_use++; 9831 9832 return last_file_lookup_index; 9833} 9834 9835/* Output a label to mark the beginning of a source code line entry 9836 and record information relating to this source line, in 9837 'line_info_table' for later output of the .debug_line section. */ 9838 9839void 9840dwarf2out_line (filename, line) 9841 register char *filename; 9842 register unsigned line; 9843{ 9844 if (debug_info_level >= DINFO_LEVEL_NORMAL) 9845 { 9846 function_section (current_function_decl); 9847 9848 if (DECL_SECTION_NAME (current_function_decl)) 9849 { 9850 register dw_separate_line_info_ref line_info; 9851 ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, SEPARATE_LINE_CODE_LABEL, 9852 separate_line_info_table_in_use); 9853 fputc ('\n', asm_out_file); 9854 9855 /* expand the line info table if necessary */ 9856 if (separate_line_info_table_in_use 9857 == separate_line_info_table_allocated) 9858 { 9859 separate_line_info_table_allocated += LINE_INFO_TABLE_INCREMENT; 9860 separate_line_info_table 9861 = (dw_separate_line_info_ref) 9862 xrealloc (separate_line_info_table, 9863 separate_line_info_table_allocated 9864 * sizeof (dw_separate_line_info_entry)); 9865 } 9866 9867 /* Add the new entry at the end of the line_info_table. */ 9868 line_info 9869 = &separate_line_info_table[separate_line_info_table_in_use++]; 9870 line_info->dw_file_num = lookup_filename (filename); 9871 line_info->dw_line_num = line; 9872 line_info->function = current_funcdef_number; 9873 } 9874 else 9875 { 9876 register dw_line_info_ref line_info; 9877 9878 ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, LINE_CODE_LABEL, 9879 line_info_table_in_use); 9880 fputc ('\n', asm_out_file); 9881 9882 /* Expand the line info table if necessary. */ 9883 if (line_info_table_in_use == line_info_table_allocated) 9884 { 9885 line_info_table_allocated += LINE_INFO_TABLE_INCREMENT; 9886 line_info_table 9887 = (dw_line_info_ref) 9888 xrealloc (line_info_table, 9889 (line_info_table_allocated 9890 * sizeof (dw_line_info_entry))); 9891 } 9892 9893 /* Add the new entry at the end of the line_info_table. */ 9894 line_info = &line_info_table[line_info_table_in_use++]; 9895 line_info->dw_file_num = lookup_filename (filename); 9896 line_info->dw_line_num = line; 9897 } 9898 } 9899} 9900 9901/* Record the beginning of a new source file, for later output 9902 of the .debug_macinfo section. At present, unimplemented. */ 9903 9904void 9905dwarf2out_start_source_file (filename) 9906 register char *filename ATTRIBUTE_UNUSED; 9907{ 9908} 9909 9910/* Record the end of a source file, for later output 9911 of the .debug_macinfo section. At present, unimplemented. */ 9912 9913void 9914dwarf2out_end_source_file () 9915{ 9916} 9917 9918/* Called from check_newline in c-parse.y. The `buffer' parameter contains 9919 the tail part of the directive line, i.e. the part which is past the 9920 initial whitespace, #, whitespace, directive-name, whitespace part. */ 9921 9922void 9923dwarf2out_define (lineno, buffer) 9924 register unsigned lineno; 9925 register char *buffer; 9926{ 9927 static int initialized = 0; 9928 if (!initialized) 9929 { 9930 dwarf2out_start_source_file (primary_filename); 9931 initialized = 1; 9932 } 9933} 9934 9935/* Called from check_newline in c-parse.y. The `buffer' parameter contains 9936 the tail part of the directive line, i.e. the part which is past the 9937 initial whitespace, #, whitespace, directive-name, whitespace part. */ 9938 9939void 9940dwarf2out_undef (lineno, buffer) 9941 register unsigned lineno ATTRIBUTE_UNUSED; 9942 register char *buffer ATTRIBUTE_UNUSED; 9943{ 9944} 9945 9946/* Set up for Dwarf output at the start of compilation. */ 9947 9948void 9949dwarf2out_init (asm_out_file, main_input_filename) 9950 register FILE *asm_out_file; 9951 register char *main_input_filename; 9952{ 9953 /* Remember the name of the primary input file. */ 9954 primary_filename = main_input_filename; 9955 9956 /* Allocate the initial hunk of the file_table. */ 9957 file_table = (char **) xmalloc (FILE_TABLE_INCREMENT * sizeof (char *)); 9958 bzero ((char *) file_table, FILE_TABLE_INCREMENT * sizeof (char *)); 9959 file_table_allocated = FILE_TABLE_INCREMENT; 9960 9961 /* Skip the first entry - file numbers begin at 1. */ 9962 file_table_in_use = 1; 9963 9964 /* Allocate the initial hunk of the decl_die_table. */ 9965 decl_die_table 9966 = (dw_die_ref *) xmalloc (DECL_DIE_TABLE_INCREMENT * sizeof (dw_die_ref)); 9967 bzero ((char *) decl_die_table, 9968 DECL_DIE_TABLE_INCREMENT * sizeof (dw_die_ref)); 9969 decl_die_table_allocated = DECL_DIE_TABLE_INCREMENT; 9970 decl_die_table_in_use = 0; 9971 9972 /* Allocate the initial hunk of the decl_scope_table. */ 9973 decl_scope_table 9974 = (decl_scope_node *) xmalloc (DECL_SCOPE_TABLE_INCREMENT 9975 * sizeof (decl_scope_node)); 9976 bzero ((char *) decl_scope_table, 9977 DECL_SCOPE_TABLE_INCREMENT * sizeof (decl_scope_node)); 9978 decl_scope_table_allocated = DECL_SCOPE_TABLE_INCREMENT; 9979 decl_scope_depth = 0; 9980 9981 /* Allocate the initial hunk of the abbrev_die_table. */ 9982 abbrev_die_table 9983 = (dw_die_ref *) xmalloc (ABBREV_DIE_TABLE_INCREMENT 9984 * sizeof (dw_die_ref)); 9985 bzero ((char *) abbrev_die_table, 9986 ABBREV_DIE_TABLE_INCREMENT * sizeof (dw_die_ref)); 9987 abbrev_die_table_allocated = ABBREV_DIE_TABLE_INCREMENT; 9988 /* Zero-th entry is allocated, but unused */ 9989 abbrev_die_table_in_use = 1; 9990 9991 /* Allocate the initial hunk of the line_info_table. */ 9992 line_info_table 9993 = (dw_line_info_ref) xmalloc (LINE_INFO_TABLE_INCREMENT 9994 * sizeof (dw_line_info_entry)); 9995 bzero ((char *) line_info_table, 9996 LINE_INFO_TABLE_INCREMENT * sizeof (dw_line_info_entry)); 9997 line_info_table_allocated = LINE_INFO_TABLE_INCREMENT; 9998 /* Zero-th entry is allocated, but unused */ 9999 line_info_table_in_use = 1; 10000 10001 /* Generate the initial DIE for the .debug section. Note that the (string) 10002 value given in the DW_AT_name attribute of the DW_TAG_compile_unit DIE 10003 will (typically) be a relative pathname and that this pathname should be 10004 taken as being relative to the directory from which the compiler was 10005 invoked when the given (base) source file was compiled. */ 10006 gen_compile_unit_die (main_input_filename); 10007 10008 ASM_GENERATE_INTERNAL_LABEL (text_end_label, TEXT_END_LABEL, 0);
|
10009 ASM_GENERATE_INTERNAL_LABEL (abbrev_section_label, ABBREV_SECTION_LABEL, 0); 10010 ASM_GENERATE_INTERNAL_LABEL (text_section_label, TEXT_SECTION_LABEL, 0); 10011 ASM_GENERATE_INTERNAL_LABEL (debug_info_section_label, 10012 DEBUG_INFO_SECTION_LABEL, 0); 10013 ASM_GENERATE_INTERNAL_LABEL (debug_line_section_label, 10014 DEBUG_LINE_SECTION_LABEL, 0); 10015 10016 ASM_OUTPUT_SECTION (asm_out_file, ABBREV_SECTION); 10017 ASM_OUTPUT_LABEL (asm_out_file, abbrev_section_label); 10018 ASM_OUTPUT_SECTION (asm_out_file, TEXT_SECTION); 10019 ASM_OUTPUT_LABEL (asm_out_file, text_section_label); 10020 ASM_OUTPUT_SECTION (asm_out_file, DEBUG_INFO_SECTION); 10021 ASM_OUTPUT_LABEL (asm_out_file, debug_info_section_label); 10022 ASM_OUTPUT_SECTION (asm_out_file, DEBUG_LINE_SECTION); 10023 ASM_OUTPUT_LABEL (asm_out_file, debug_line_section_label); |
10024} 10025 10026/* Output stuff that dwarf requires at the end of every file, 10027 and generate the DWARF-2 debugging info. */ 10028 10029void 10030dwarf2out_finish () 10031{ 10032 limbo_die_node *node, *next_node; 10033 dw_die_ref die; 10034 dw_attr_ref a; 10035 10036 /* Traverse the limbo die list, and add parent/child links. The only 10037 dies without parents that should be here are concrete instances of 10038 inline functions, and the comp_unit_die. We can ignore the comp_unit_die. 10039 For concrete instances, we can get the parent die from the abstract 10040 instance. */ 10041 for (node = limbo_die_list; node; node = next_node) 10042 { 10043 next_node = node->next; 10044 die = node->die; 10045 10046 if (die->die_parent == NULL) 10047 { 10048 a = get_AT (die, DW_AT_abstract_origin); 10049 if (a) 10050 add_child_die (a->dw_attr_val.v.val_die_ref->die_parent, die); 10051 else if (die == comp_unit_die) 10052 ; 10053 else 10054 abort (); 10055 } 10056 free (node); 10057 } 10058
|
10059 /* Walk through the list of incomplete types again, trying once more to 10060 emit full debugging info for them. */ 10061 retry_incomplete_types (); 10062 |
10063 /* Traverse the DIE tree and add sibling attributes to those DIE's 10064 that have children. */ 10065 add_sibling_attributes (comp_unit_die); 10066 10067 /* Output a terminator label for the .text section. */ 10068 fputc ('\n', asm_out_file); 10069 ASM_OUTPUT_SECTION (asm_out_file, TEXT_SECTION); 10070 ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, TEXT_END_LABEL, 0); 10071 10072#if 0 10073 /* Output a terminator label for the .data section. */ 10074 fputc ('\n', asm_out_file); 10075 ASM_OUTPUT_SECTION (asm_out_file, DATA_SECTION); 10076 ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, DATA_END_LABEL, 0); 10077 10078 /* Output a terminator label for the .bss section. */ 10079 fputc ('\n', asm_out_file); 10080 ASM_OUTPUT_SECTION (asm_out_file, BSS_SECTION); 10081 ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, BSS_END_LABEL, 0); 10082#endif 10083 10084 /* Output the source line correspondence table. */ 10085 if (line_info_table_in_use > 1 || separate_line_info_table_in_use) 10086 { 10087 fputc ('\n', asm_out_file); 10088 ASM_OUTPUT_SECTION (asm_out_file, DEBUG_LINE_SECTION); 10089 output_line_info (); 10090 10091 /* We can only use the low/high_pc attributes if all of the code 10092 was in .text. */ 10093 if (separate_line_info_table_in_use == 0) 10094 {
|
9845 add_AT_lbl_id (comp_unit_die, DW_AT_low_pc, TEXT_SECTION);
|
10095 add_AT_lbl_id (comp_unit_die, DW_AT_low_pc, text_section_label); |
10096 add_AT_lbl_id (comp_unit_die, DW_AT_high_pc, text_end_label); 10097 } 10098
|
9849 add_AT_section_offset (comp_unit_die, DW_AT_stmt_list, DEBUG_LINE_SECTION);
|
10099 add_AT_lbl_offset (comp_unit_die, DW_AT_stmt_list, 10100 debug_line_section_label); |
10101 } 10102 10103 /* Output the abbreviation table. */ 10104 fputc ('\n', asm_out_file); 10105 ASM_OUTPUT_SECTION (asm_out_file, ABBREV_SECTION); 10106 build_abbrev_table (comp_unit_die); 10107 output_abbrev_section (); 10108 10109 /* Initialize the beginning DIE offset - and calculate sizes/offsets. */ 10110 next_die_offset = DWARF_COMPILE_UNIT_HEADER_SIZE; 10111 calc_die_sizes (comp_unit_die); 10112 10113 /* Output debugging information. */ 10114 fputc ('\n', asm_out_file); 10115 ASM_OUTPUT_SECTION (asm_out_file, DEBUG_INFO_SECTION); 10116 output_compilation_unit_header (); 10117 output_die (comp_unit_die); 10118 10119 if (pubname_table_in_use) 10120 { 10121 /* Output public names table. */ 10122 fputc ('\n', asm_out_file); 10123 ASM_OUTPUT_SECTION (asm_out_file, PUBNAMES_SECTION); 10124 output_pubnames (); 10125 } 10126 10127 if (fde_table_in_use) 10128 { 10129 /* Output the address range information. */ 10130 fputc ('\n', asm_out_file); 10131 ASM_OUTPUT_SECTION (asm_out_file, ARANGES_SECTION); 10132 output_aranges (); 10133 } 10134} 10135#endif /* DWARF2_DEBUGGING_INFO */
|