1/* -*- mode: C; c-basic-offset: 3; -*- */ 2 3/*--------------------------------------------------------------------*/ 4/*--- Read DWARF1/2/3/4 debug info. readdwarf.c ---*/ 5/*--------------------------------------------------------------------*/ 6 7/* 8 This file is part of Valgrind, a dynamic binary instrumentation 9 framework. 10 11 Copyright (C) 2000-2013 Julian Seward 12 jseward@acm.org 13 14 This program is free software; you can redistribute it and/or 15 modify it under the terms of the GNU General Public License as 16 published by the Free Software Foundation; either version 2 of the 17 License, or (at your option) any later version. 18 19 This program is distributed in the hope that it will be useful, but 20 WITHOUT ANY WARRANTY; without even the implied warranty of 21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 22 General Public License for more details. 23 24 You should have received a copy of the GNU General Public License 25 along with this program; if not, write to the Free Software 26 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 27 02111-1307, USA. 28 29 The GNU General Public License is contained in the file COPYING. 30*/ 31 32#if defined(VGO_linux) || defined(VGO_darwin) 33 34#include "pub_core_basics.h" 35#include "pub_core_debuginfo.h" 36#include "pub_core_libcbase.h" 37#include "pub_core_libcassert.h" 38#include "pub_core_libcprint.h" 39#include "pub_core_options.h" 40#include "pub_core_xarray.h" 41#include "pub_core_tooliface.h" /* VG_(needs) */ 42#include "priv_misc.h" /* dinfo_zalloc/free/strdup */ 43#include "priv_image.h" 44#include "priv_d3basics.h" 45#include "priv_tytypes.h" 46#include "priv_storage.h" 47#include "priv_readdwarf.h" /* self */ 48 49 50/*------------------------------------------------------------*/ 51/*--- ---*/ 52/*--- Read line number and CFI info from DWARF1, DWARF2 ---*/ 53/*--- and to some extent DWARF3 sections. ---*/ 54/*--- ---*/ 55/*------------------------------------------------------------*/ 56 57/*------------------------------------------------------------*/ 58/*--- Expanding arrays of words, for holding file name and ---*/ 59/*--- directory name arrays. ---*/ 60/*------------------------------------------------------------*/ 61 62typedef 63 struct { 64 Word* tab; 65 UInt tab_size; 66 UInt tab_used; 67 } 68 WordArray; 69 70static void init_WordArray ( WordArray* wa ) 71{ 72 wa->tab = NULL; 73 wa->tab_size = 0; 74 wa->tab_used = 0; 75} 76 77static void free_WordArray ( WordArray* wa ) 78{ 79 if (wa->tab) { 80 vg_assert(wa->tab_size > 0); 81 ML_(dinfo_free)(wa->tab); 82 } 83 init_WordArray(wa); 84} 85 86static void addto_WordArray ( WordArray* wa, Word w ) 87{ 88 UInt new_size, i; 89 Word* new_tab; 90 91 if (0) VG_(printf)("<<ADD %p (new sz = %d) >>\n", 92 (HChar*)w, wa->tab_used+1); 93 94 if (wa->tab_used < wa->tab_size) { 95 /* fine */ 96 } else { 97 /* expand array */ 98 if (0) VG_(printf)("EXPAND ARRAY from %d\n", wa->tab_size); 99 vg_assert(wa->tab_used == wa->tab_size); 100 vg_assert( (wa->tab_size == 0 && wa->tab == NULL) 101 || (wa->tab_size != 0 && wa->tab != NULL) ); 102 new_size = wa->tab_size == 0 ? 8 : 2 * wa->tab_size; 103 new_tab = ML_(dinfo_zalloc)("di.aWA.1", new_size * sizeof(Word)); 104 vg_assert(new_tab != NULL); 105 for (i = 0; i < wa->tab_used; i++) 106 new_tab[i] = wa->tab[i]; 107 wa->tab_size = new_size; 108 if (wa->tab) 109 ML_(dinfo_free)(wa->tab); 110 wa->tab = new_tab; 111 } 112 113 vg_assert(wa->tab_used < wa->tab_size); 114 vg_assert(wa->tab_size > 0); 115 wa->tab[wa->tab_used] = w; 116 wa->tab_used++; 117} 118 119static Word index_WordArray ( /*OUT*/Bool* inRange, WordArray* wa, Int i ) 120{ 121 vg_assert(inRange); 122 if (i >= 0 && i < wa->tab_used) { 123 *inRange = True; 124 return wa->tab[i]; 125 } else { 126 *inRange = False; 127 return 0; 128 } 129} 130 131 132/*------------------------------------------------------------*/ 133/*--- Read DWARF2 format line number info. ---*/ 134/*------------------------------------------------------------*/ 135 136/* Structure holding info extracted from the a .debug_line 137 section. */ 138typedef struct 139{ 140 ULong li_length; 141 UShort li_version; 142 ULong li_header_length; 143 UChar li_min_insn_length; 144 UChar li_max_ops_per_insn; 145 UChar li_default_is_stmt; 146 Int li_line_base; 147 UChar li_line_range; 148 UChar li_opcode_base; 149} 150DebugLineInfo; 151 152/* Structure holding additional infos found from a .debug_info 153 * compilation unit block */ 154typedef struct 155{ 156 /* Feel free to add more members here if you need ! */ 157 DiCursor compdir; /* Compilation directory - points to .debug_info */ 158 DiCursor name; /* Main file name - points to .debug_info */ 159 ULong stmt_list; /* Offset in .debug_line */ 160 Bool dw64; /* 64-bit Dwarf? */ 161} 162UnitInfo; 163 164/* Line number opcodes. */ 165enum dwarf_line_number_ops 166 { 167 DW_LNS_extended_op = 0, 168 DW_LNS_copy = 1, 169 DW_LNS_advance_pc = 2, 170 DW_LNS_advance_line = 3, 171 DW_LNS_set_file = 4, 172 DW_LNS_set_column = 5, 173 DW_LNS_negate_stmt = 6, 174 DW_LNS_set_basic_block = 7, 175 DW_LNS_const_add_pc = 8, 176 DW_LNS_fixed_advance_pc = 9, 177 /* DWARF 3. */ 178 DW_LNS_set_prologue_end = 10, 179 DW_LNS_set_epilogue_begin = 11, 180 DW_LNS_set_isa = 12 181 }; 182 183/* Line number extended opcodes. */ 184enum dwarf_line_number_x_ops 185 { 186 DW_LNE_end_sequence = 1, 187 DW_LNE_set_address = 2, 188 DW_LNE_define_file = 3, 189 DW_LNE_set_discriminator = 4 190 }; 191 192typedef struct 193{ 194 /* Information for the last statement boundary. 195 * Needed to calculate statement lengths. */ 196 Addr last_address; 197 UInt last_file; 198 UInt last_line; 199 200 Addr address; 201 UInt file; 202 UInt line; 203 UInt column; 204 Int is_stmt; 205 Int basic_block; 206 UChar end_sequence; 207} LineSMR; 208 209 210/* FIXME: duplicated in readdwarf3.c */ 211/* Read a 'leb128' and advance *data accordingly. */ 212static ULong step_leb128 ( DiCursor* data, Int sign ) 213{ 214 ULong result = 0; 215 Int shift = 0; 216 UChar byte; 217 218 vg_assert(sign == 0 || sign == 1); 219 220 do { 221 byte = ML_(cur_step_UChar)(data); 222 result |= ((ULong)(byte & 0x7f)) << shift; 223 shift += 7; 224 } 225 while (byte & 0x80); 226 227 if (sign && (shift < 64) && (byte & 0x40)) 228 result |= -(1ULL << shift); 229 230 return result; 231} 232 233/* FIXME: duplicated in readdwarf3.c */ 234static ULong step_leb128U( DiCursor* data ) { 235 return step_leb128( data, 0 ); 236} 237 238/* FIXME: duplicated in readdwarf3.c */ 239static Long step_leb128S( DiCursor* data ) { 240 return step_leb128( data, 1 ); 241} 242 243/* Read what the DWARF3 spec calls an "initial length field". This 244 uses up either 4 or 12 bytes of the input and produces a 32-bit or 245 64-bit number respectively. 246 247 Read 32-bit value from p. If it is 0xFFFFFFFF, instead read a 248 64-bit bit value from p+4. This is used in 64-bit dwarf to encode 249 some table lengths. Advance the cursor (p) accordingly. 250 251 XXX this is a hack: the endianness of the initial length field is 252 specified by the DWARF we're reading. This happens to work only 253 because we don't do cross-arch jitting, hence this code runs on a 254 platform of the same endianness as the DWARF it is reading. Same 255 applies for initial lengths for CIE/FDEs and probably in zillions 256 of other places -- to be precise, exactly the places where 257 binutils/dwarf.c calls byte_get(). 258*/ 259static 260ULong step_initial_length_field ( DiCursor* p_img, /*OUT*/Bool* is64 ) 261{ 262 UInt w32 = ML_(cur_step_UInt)(p_img); 263 if (w32 == 0xFFFFFFFF) { 264 *is64 = True; 265 return ML_(cur_step_ULong)(p_img); 266 } else { 267 *is64 = False; 268 return (ULong)w32; 269 } 270} 271 272static 273ULong read_initial_length_field ( DiCursor p_img, /*OUT*/Bool* is64 ) 274{ 275 /* Something of a roundabout approach .. the modification to p_img 276 is abandoned. */ 277 return step_initial_length_field( &p_img, is64 ); 278} 279 280 281static LineSMR state_machine_regs; 282 283static 284void reset_state_machine ( Int is_stmt ) 285{ 286 if (0) VG_(printf)("smr.a := %p (reset)\n", NULL ); 287 state_machine_regs.last_address = 0; 288 state_machine_regs.last_file = 1; 289 state_machine_regs.last_line = 1; 290 state_machine_regs.address = 0; 291 state_machine_regs.file = 1; 292 state_machine_regs.line = 1; 293 state_machine_regs.column = 0; 294 state_machine_regs.is_stmt = is_stmt; 295 state_machine_regs.basic_block = 0; 296 state_machine_regs.end_sequence = 0; 297} 298 299/* Look up a directory name, or return NULL if unknown. */ 300static 301HChar* lookupDir ( Int filename_index, 302 WordArray* fnidx2dir, 303 WordArray* dirnames ) 304{ 305 Bool inRange; 306 Word diridx, dirname; 307 308 diridx = index_WordArray( &inRange, fnidx2dir, filename_index ); 309 if (!inRange) goto bad; 310 311 dirname = index_WordArray( &inRange, dirnames, (Int)diridx ); 312 if (!inRange) goto bad; 313 314 return (HChar*)dirname; 315 bad: 316 return NULL; 317} 318 319//////////////////////////////////////////////////////////////////// 320//////////////////////////////////////////////////////////////////// 321 322/* Handled an extended line op starting at *data, and advance *data 323 accordingly. */ 324static 325void process_extended_line_op( struct _DebugInfo* di, 326 WordArray* filenames, 327 WordArray* dirnames, 328 WordArray* fnidx2dir, 329 DiCursor* data, Int is_stmt) 330{ 331 UInt len = step_leb128U(data); 332 if (len == 0) { 333 VG_(message)(Vg_UserMsg, 334 "Warning: DWARF2 reader: " 335 "Badly formed extended line op encountered\n"); 336 return; 337 } 338 339 UChar op_code = ML_(cur_step_UChar)(data); 340 if (0) VG_(printf)("dwarf2: ext OPC: %d\n", op_code); 341 342 switch (op_code) { 343 case DW_LNE_end_sequence: 344 if (0) VG_(printf)("1001: si->o %#lx, smr.a %#lx\n", 345 di->text_debug_bias, state_machine_regs.address ); 346 /* JRS: added for compliance with spec; is pointless due to 347 reset_state_machine below */ 348 state_machine_regs.end_sequence = 1; 349 350 if (state_machine_regs.is_stmt) { 351 if (state_machine_regs.last_address) { 352 Bool inRange = False; 353 const HChar* filename 354 = (HChar*)index_WordArray( &inRange, filenames, 355 state_machine_regs.last_file); 356 if (!inRange || !filename) 357 filename = "???"; 358 ML_(addLineInfo) ( 359 di, 360 filename, 361 lookupDir( state_machine_regs.last_file, 362 fnidx2dir, dirnames ), 363 di->text_debug_bias + state_machine_regs.last_address, 364 di->text_debug_bias + state_machine_regs.address, 365 state_machine_regs.last_line, 0 366 ); 367 } 368 } 369 reset_state_machine (is_stmt); 370 if (di->ddump_line) 371 VG_(printf)(" Extended opcode %d: End of Sequence\n\n", 372 (Int)op_code); 373 break; 374 375 case DW_LNE_set_address: { 376 Addr adr = ML_(cur_step_Addr)(data); 377 state_machine_regs.address = adr; 378 if (di->ddump_line) 379 VG_(printf)(" Extended opcode %d: set Address to 0x%lx\n", 380 (Int)op_code, (Addr)adr); 381 break; 382 } 383 384 case DW_LNE_define_file: { 385 HChar* name = ML_(cur_step_strdup)(data, "di.pelo.1"); 386 addto_WordArray( filenames, (Word)ML_(addStr)(di,name,-1) ); 387 ML_(dinfo_free)(name); 388 (void)step_leb128U(data); // ignored: dir index 389 (void)step_leb128U(data); // ignored: mod time 390 (void)step_leb128U(data); // ignored: file size 391 if (di->ddump_line) 392 VG_(printf)(" DWARF2-line: set_address\n"); 393 break; 394 } 395 396 case DW_LNE_set_discriminator: 397 (void)step_leb128U(data); // ignored: new 'discriminator' value 398 break; 399 400 default: 401 if (di->ddump_line) 402 VG_(printf)("process_extended_line_op:default\n"); 403 break; 404 } 405} 406 407//////////////////////////////////////////////////////////////////// 408//////////////////////////////////////////////////////////////////// 409 410/* read a .debug_line section block for a compilation unit 411 * 412 * Input: - theBlock must point to the start of the block 413 * for the given compilation unit 414 * - ui contains additional info like the compilation dir 415 * for this unit 416 * 417 * Output: - si debug info structures get updated 418 */ 419static 420void read_dwarf2_lineblock ( struct _DebugInfo* di, 421 UnitInfo* ui, 422 DiCursor theBlock, /* IMAGE */ 423 Int noLargerThan ) 424{ 425 Int i; 426 DebugLineInfo info; 427 Bool is64; 428 WordArray filenames; 429 WordArray dirnames; 430 WordArray fnidx2dir; 431 432 DiCursor external = theBlock; 433 DiCursor data = theBlock; 434 435 /* filenames is an array of file names harvested from the DWARF2 436 info. Entry [0] is NULL and is never referred to by the state 437 machine. 438 439 Similarly, dirnames is an array of directory names. Entry [0] 440 is also NULL and denotes "we don't know what the path is", since 441 that is different from "the path is the empty string". Unlike 442 the file name table, the state machine does refer to entry [0], 443 which basically means "." ("the current directory of the 444 compilation", whatever that means, according to the DWARF3 445 spec.) 446 447 fnidx2dir is an array of indexes into the dirnames table. 448 (confused yet?) filenames[] and fnidx2dir[] are indexed 449 together. That is, for some index i in the filename table, then 450 451 the filename is filenames[i] 452 the directory is dirnames[ fnidx2dir[i] ] */ 453 454 /* Fails due to gcc padding ... 455 vg_assert(sizeof(DWARF2_External_LineInfo) 456 == sizeof(DWARF2_Internal_LineInfo)); 457 */ 458 459 init_WordArray(&filenames); 460 init_WordArray(&dirnames); 461 init_WordArray(&fnidx2dir); 462 463 /* DWARF2 starts numbering filename entries at 1, so we need to 464 add a dummy zeroth entry to the table. The zeroth dirnames 465 entry denotes 'current directory of compilation' so we might 466 as well make the fnidx2dir zeroth entry denote that. 467 */ 468 addto_WordArray( &filenames, (Word)NULL ); 469 470 if (ML_(cur_is_valid)(ui->compdir)) 471 addto_WordArray( &dirnames, 472 (Word)ML_(addStrFromCursor)(di, ui->compdir) ); 473 else 474 addto_WordArray( &dirnames, (Word)ML_(addStr)(di, ".", -1) ); 475 476 addto_WordArray( &fnidx2dir, (Word)0 ); /* compilation dir */ 477 478 info.li_length = step_initial_length_field( &external, &is64 ); 479 if (di->ddump_line) 480 VG_(printf)(" Length: %llu\n", 481 info.li_length); 482 483 /* Check the length of the block. */ 484 if (info.li_length > noLargerThan) { 485 ML_(symerr)(di, True, 486 "DWARF line info appears to be corrupt " 487 "- the section is too small"); 488 goto out; 489 } 490 491 /* Check its version number. */ 492 info.li_version = ML_(cur_step_UShort)(&external); 493 if (di->ddump_line) 494 VG_(printf)(" DWARF Version: %d\n", 495 (Int)info.li_version); 496 497 if (info.li_version != 2 && info.li_version != 3 && info.li_version != 4) { 498 ML_(symerr)(di, True, 499 "Only DWARF version 2, 3 and 4 line info " 500 "is currently supported."); 501 goto out; 502 } 503 504 info.li_header_length = is64 ? ML_(cur_step_ULong)(&external) 505 : (ULong)(ML_(cur_step_UInt)(&external)); 506 if (di->ddump_line) 507 VG_(printf)(" Prologue Length: %llu\n", 508 info.li_header_length); 509 510 info.li_min_insn_length = ML_(cur_step_UChar)(&external); 511 if (di->ddump_line) 512 VG_(printf)(" Minimum Instruction Length: %d\n", 513 (Int)info.li_min_insn_length); 514 515 /* We only support machines with one opcode per instruction 516 for now. If we ever want to support VLIW machines there is 517 code to handle multiple opcodes per instruction in the 518 patch attached to BZ#233595. 519 */ 520 if (info.li_version >= 4) { 521 info.li_max_ops_per_insn = ML_(cur_step_UChar)(&external); 522 if (info.li_max_ops_per_insn != 1) { 523 ML_(symerr)(di, True, 524 "Invalid Maximum Ops Per Insn in line info."); 525 goto out; 526 } 527 if (di->ddump_line) 528 VG_(printf)(" Maximum Ops Per Insn: %d\n", 529 (Int)info.li_max_ops_per_insn); 530 } else { 531 info.li_max_ops_per_insn = 1; 532 } 533 534 info.li_default_is_stmt = ML_(cur_step_UChar)(&external); 535 if (di->ddump_line) 536 VG_(printf)(" Initial value of 'is_stmt': %d\n", 537 (Int)info.li_default_is_stmt); 538 539 /* Josef Weidendorfer (20021021) writes: 540 541 It seems to me that the Intel Fortran compiler generates bad 542 DWARF2 line info code: It sets "is_stmt" of the state machine in 543 the the line info reader to be always false. Thus, there is 544 never a statement boundary generated and therefore never a 545 instruction range/line number mapping generated for valgrind. 546 547 Please have a look at the DWARF2 specification, Ch. 6.2 548 (x86.ddj.com/ftp/manuals/tools/dwarf.pdf). Perhaps I understand 549 this wrong, but I don't think so. 550 551 I just had a look at the GDB DWARF2 reader... They completely 552 ignore "is_stmt" when recording line info ;-) That's the reason 553 "objdump -S" works on files from the the intel fortran compiler. 554 555 Therefore: */ 556 info.li_default_is_stmt = True; 557 558 /* JRS: changed (UInt*) to (UChar*) */ 559 info.li_line_base = ML_(cur_step_UChar)(&external); 560 info.li_line_base = (Int)(Char)info.li_line_base; 561 if (di->ddump_line) 562 VG_(printf)(" Line Base: %d\n", 563 info.li_line_base); 564 565 info.li_line_range = ML_(cur_step_UChar)(&external); 566 if (di->ddump_line) 567 VG_(printf)(" Line Range: %d\n", 568 (Int)info.li_line_range); 569 570 info.li_opcode_base = ML_(cur_step_UChar)(&external); 571 if (di->ddump_line) 572 VG_(printf)(" Opcode Base: %d\n\n", 573 info.li_opcode_base); 574 575 if (0) VG_(printf)("dwarf2: line base: %d, range %d, opc base: %d\n", 576 (Int)info.li_line_base, 577 (Int)info.li_line_range, 578 (Int)info.li_opcode_base); 579 580 DiCursor end_of_sequence 581 = ML_(cur_plus)(data, info.li_length + (is64 ? 12 : 4)); 582 583 reset_state_machine (info.li_default_is_stmt); 584 585 /* Read the contents of the Opcodes table. */ 586 DiCursor standard_opcodes = external; 587 if (di->ddump_line) { 588 VG_(printf)(" Opcodes:\n"); 589 for (i = 1; i < (Int)info.li_opcode_base; i++) { 590 VG_(printf)(" Opcode %d has %d args\n", 591 i, (Int)ML_(cur_read_UChar)( 592 ML_(cur_plus)(standard_opcodes, 593 (i-1) * sizeof(UChar)) )); 594 } 595 VG_(printf)("\n"); 596 } 597 598 /* Read the contents of the Directory table. */ 599 data = ML_(cur_plus)(standard_opcodes, info.li_opcode_base - 1); 600 601 if (di->ddump_line) 602 VG_(printf)(" The Directory Table%s\n", 603 ML_(cur_read_UChar)(data) == 0 ? " is empty." : ":" ); 604 605 while (ML_(cur_read_UChar)(data) != 0) { 606 607# define NBUF 4096 608 static HChar buf[NBUF]; 609 610 HChar* data_str = ML_(cur_read_strdup)(data, "di.rd2l.1"); 611 if (di->ddump_line) 612 VG_(printf)(" %s\n", data_str); 613 614 /* If data[0] is '/', then 'data' is an absolute path and we 615 don't mess with it. Otherwise, if we can, construct the 616 path 'ui->compdir' ++ "/" ++ 'data'. */ 617 618 if (data_str[0] != '/' 619 /* not an absolute path */ 620 && ML_(cur_is_valid)(ui->compdir) 621 /* actually got something sensible for compdir */ 622 && ML_(cur_strlen)(ui->compdir) 623 + VG_(strlen)(data_str) + 5/*paranoia*/ < NBUF 624 /* it's short enough to concatenate */) 625 { 626 buf[0] = 0; 627 HChar* compdir_str = ML_(cur_read_strdup)(ui->compdir, "di.rd2l.1b"); 628 VG_(strcat)(buf, compdir_str); 629 VG_(strcat)(buf, "/"); 630 VG_(strcat)(buf, data_str); 631 vg_assert(VG_(strlen)(buf) < NBUF); 632 addto_WordArray( &dirnames, (Word)ML_(addStr)(di,buf,-1) ); 633 if (0) VG_(printf)("rel path %s\n", buf); 634 ML_(dinfo_free)(compdir_str); 635 } else { 636 /* just use 'data'. */ 637 addto_WordArray( &dirnames, (Word)ML_(addStr)(di,data_str,-1) ); 638 if (0) VG_(printf)("abs path %s\n", data_str); 639 } 640 641 data = ML_(cur_plus)(data, VG_(strlen)(data_str) + 1); 642 ML_(dinfo_free)(data_str); 643 644# undef NBUF 645 } 646 647 if (di->ddump_line) 648 VG_(printf)("\n"); 649 650 if (ML_(cur_read_UChar)(data) != 0) { 651 ML_(symerr)(di, True, 652 "can't find NUL at end of DWARF2 directory table"); 653 goto out; 654 } 655 data = ML_(cur_plus)(data, 1); 656 657 /* Read the contents of the File Name table. This produces a bunch 658 of file names, and for each, an index to the corresponding 659 directory name entry. */ 660 if (di->ddump_line) { 661 VG_(printf)(" The File Name Table:\n"); 662 VG_(printf)(" Entry Dir Time Size Name\n"); 663 } 664 665 i = 1; 666 while (ML_(cur_read_UChar)(data) != 0) { 667 HChar* name = ML_(cur_step_strdup)(&data, "di.rd2l.2"); 668 Int diridx = step_leb128U(&data); 669 Int uu_time = step_leb128U(&data); /* unused */ 670 Int uu_size = step_leb128U(&data); /* unused */ 671 addto_WordArray( &filenames, (Word)ML_(addStr)(di,name,-1) ); 672 addto_WordArray( &fnidx2dir, (Word)diridx ); 673 if (0) VG_(printf)("file %s diridx %d\n", name, diridx ); 674 if (di->ddump_line) 675 VG_(printf)(" %d\t%d\t%d\t%d\t%s\n", 676 i, diridx, uu_time, uu_size, name); 677 i++; 678 ML_(dinfo_free)(name); 679 } 680 681 if (di->ddump_line) 682 VG_(printf)("\n"); 683 684 if (ML_(cur_read_UChar)(data) != 0) { 685 ML_(symerr)(di, True, 686 "can't find NUL at end of DWARF2 file name table"); 687 goto out; 688 } 689 data = ML_(cur_plus)(data, 1); 690 691 if (di->ddump_line) 692 VG_(printf)(" Line Number Statements:\n"); 693 694 /* Now display the statements. */ 695 696 while (ML_(cur_cmpLT)(data, end_of_sequence)) { 697 UChar op_code = ML_(cur_step_UChar)(&data); 698 699 if (0) VG_(printf)("dwarf2: OPC: %d\n", op_code); 700 701 if (op_code >= info.li_opcode_base) { 702 op_code -= info.li_opcode_base; 703 Word adv = (op_code / info.li_line_range) 704 * info.li_min_insn_length; 705 Int advAddr = adv; 706 state_machine_regs.address += adv; 707 708 if (0) VG_(printf)("smr.a += %#lx\n", adv ); 709 adv = (op_code % info.li_line_range) + info.li_line_base; 710 if (0) VG_(printf)("1002: di->o %#lx, smr.a %#lx\n", 711 di->text_debug_bias, state_machine_regs.address ); 712 state_machine_regs.line += adv; 713 714 if (di->ddump_line) 715 VG_(printf)(" Special opcode %d: advance Address by %d " 716 "to 0x%lx and Line by %d to %d\n", 717 (Int)op_code, advAddr, state_machine_regs.address, 718 (Int)adv, (Int)state_machine_regs.line ); 719 720 if (state_machine_regs.is_stmt) { 721 /* only add a statement if there was a previous boundary */ 722 if (state_machine_regs.last_address) { 723 Bool inRange = False; 724 const HChar* filename 725 = (HChar*)index_WordArray( &inRange, &filenames, 726 state_machine_regs.last_file); 727 if (!inRange || !filename) 728 filename = "???"; 729 ML_(addLineInfo)( 730 di, 731 filename, 732 lookupDir( state_machine_regs.last_file, 733 &fnidx2dir, &dirnames ), 734 di->text_debug_bias + state_machine_regs.last_address, 735 di->text_debug_bias + state_machine_regs.address, 736 state_machine_regs.last_line, 737 0 738 ); 739 } 740 state_machine_regs.last_address = state_machine_regs.address; 741 state_machine_regs.last_file = state_machine_regs.file; 742 state_machine_regs.last_line = state_machine_regs.line; 743 } 744 } 745 746 else { /* ! (op_code >= info.li_opcode_base) */ 747 748 switch (op_code) { 749 case DW_LNS_extended_op: 750 process_extended_line_op ( 751 di, &filenames, &dirnames, &fnidx2dir, 752 &data, info.li_default_is_stmt); 753 break; 754 755 case DW_LNS_copy: 756 if (0) VG_(printf)("1002: di->o %#lx, smr.a %#lx\n", 757 di->text_debug_bias, state_machine_regs.address ); 758 if (state_machine_regs.is_stmt) { 759 /* only add a statement if there was a previous boundary */ 760 if (state_machine_regs.last_address) { 761 Bool inRange = False; 762 const HChar* filename 763 = (HChar*)index_WordArray( &inRange, &filenames, 764 state_machine_regs.last_file ); 765 if (!inRange || !filename) 766 filename = "???"; 767 ML_(addLineInfo)( 768 di, 769 filename, 770 lookupDir( state_machine_regs.last_file, 771 &fnidx2dir, &dirnames ), 772 di->text_debug_bias + state_machine_regs.last_address, 773 di->text_debug_bias + state_machine_regs.address, 774 state_machine_regs.last_line, 775 0 776 ); 777 } 778 state_machine_regs.last_address = state_machine_regs.address; 779 state_machine_regs.last_file = state_machine_regs.file; 780 state_machine_regs.last_line = state_machine_regs.line; 781 } 782 state_machine_regs.basic_block = 0; /* JRS added */ 783 if (di->ddump_line) 784 VG_(printf)(" Copy\n"); 785 break; 786 787 case DW_LNS_advance_pc: { 788 Word adv = info.li_min_insn_length * step_leb128U(&data); 789 state_machine_regs.address += adv; 790 if (0) VG_(printf)("smr.a += %#lx\n", adv ); 791 if (di->ddump_line) 792 VG_(printf)(" Advance PC by %ld to 0x%lx\n", 793 adv, state_machine_regs.address); 794 break; 795 } 796 case DW_LNS_advance_line: { 797 Word adv = step_leb128S(&data); 798 state_machine_regs.line += adv; 799 if (di->ddump_line) 800 VG_(printf)(" Advance Line by %ld to %d\n", 801 adv, (Int)state_machine_regs.line); 802 break; 803 } 804 case DW_LNS_set_file: { 805 Word adv = step_leb128U(&data); 806 state_machine_regs.file = adv; 807 if (di->ddump_line) 808 VG_(printf)(" Set File Name to entry %ld in the " 809 "File Name Table\n", adv); 810 break; 811 } 812 case DW_LNS_set_column: { 813 Word adv = step_leb128U(&data); 814 state_machine_regs.column = adv; 815 if (di->ddump_line) 816 VG_(printf)(" Set column to %ld\n", adv); 817 break; 818 } 819 case DW_LNS_negate_stmt: { 820 Int adv = state_machine_regs.is_stmt; 821 adv = ! adv; 822 state_machine_regs.is_stmt = adv; 823 if (di->ddump_line) 824 VG_(printf)(" DWARF2-line: negate_stmt\n"); 825 break; 826 } 827 case DW_LNS_set_basic_block: { 828 state_machine_regs.basic_block = 1; 829 if (di->ddump_line) 830 VG_(printf)(" DWARF2-line: set_basic_block\n"); 831 break; 832 } 833 case DW_LNS_const_add_pc: { 834 Word adv = (((255 - info.li_opcode_base) / info.li_line_range) 835 * info.li_min_insn_length); 836 state_machine_regs.address += adv; 837 if (0) VG_(printf)("smr.a += %#lx\n", adv ); 838 if (di->ddump_line) 839 VG_(printf)(" Advance PC by constant %ld to 0x%lx\n", 840 adv, (Addr)state_machine_regs.address); 841 break; 842 } 843 case DW_LNS_fixed_advance_pc: { 844 /* XXX: Need something to get 2 bytes */ 845 Word adv = ML_(cur_step_UShort)(&data); 846 state_machine_regs.address += adv; 847 if (0) VG_(printf)("smr.a += %#lx\n", adv ); 848 if (di->ddump_line) 849 VG_(printf)(" DWARF2-line: fixed_advance_pc\n"); 850 break; 851 } 852 case DW_LNS_set_prologue_end: 853 if (di->ddump_line) 854 VG_(printf)(" DWARF2-line: set_prologue_end\n"); 855 break; 856 857 case DW_LNS_set_epilogue_begin: 858 if (di->ddump_line) 859 VG_(printf)(" DWARF2-line: set_epilogue_begin\n"); 860 break; 861 862 case DW_LNS_set_isa: 863 (void)step_leb128U(&data); 864 if (di->ddump_line) 865 VG_(printf)(" DWARF2-line: set_isa\n"); 866 break; 867 868 default: { 869 Int j; 870 for (j = (Int)ML_(cur_read_UChar)( 871 ML_(cur_plus)(standard_opcodes, 872 (op_code-1) * sizeof(UChar))); 873 j > 0 ; --j) { 874 step_leb128U(&data); 875 } 876 if (di->ddump_line) 877 VG_(printf)(" Unknown opcode %d\n", (Int)op_code); 878 break; 879 } 880 } /* switch (op_code) */ 881 882 } /* if (op_code >= info.li_opcode_base) */ 883 884 } /* while (data < end_of_sequence) */ 885 886 if (di->ddump_line) 887 VG_(printf)("\n"); 888 889 out: 890 free_WordArray(&filenames); 891 free_WordArray(&dirnames); 892 free_WordArray(&fnidx2dir); 893} 894 895//////////////////////////////////////////////////////////////////// 896//////////////////////////////////////////////////////////////////// 897 898/* Return abbrev for given code 899 * Returned cursor points to the tag 900 * */ 901static DiCursor lookup_abbrev( DiCursor p, ULong acode ) 902{ 903 while (1) { 904 ULong code = step_leb128U(&p); 905 if (code == acode) 906 return p; 907 (void)step_leb128U(&p); /* skip tag */ 908 p = ML_(cur_plus)(p,1); /* skip has_children flag */ 909 ULong name; 910 do { 911 name = step_leb128U(&p); /* name */ 912 (void)step_leb128U(&p); /* form */ 913 } 914 while (name != 0); /* until name == form == 0 */ 915 } 916} 917 918/* Read general information for a particular compile unit block in 919 * the .debug_info section. In particular read the name, compdir and 920 * stmt_list needed to parse the line number information. 921 * 922 * Input: - unitblock is the start of a compilation 923 * unit block in .debuginfo section 924 * - debugabbrev is start of .debug_abbrev section 925 * - debugstr is start of .debug_str section 926 * - debugstr_alt_img is start of .debug_str section in alt debug file 927 * 928 * Output: Fill members of ui pertaining to the compilation unit: 929 * - ui->name is the name of the compilation unit 930 * - ui->compdir is the compilation unit directory 931 * - ui->stmt_list is the offset in .debug_line section 932 * for the dbginfos of this compilation unit 933 * 934 * Note : the output strings are not allocated and point 935 * directly to the memory-mapped section. 936 */ 937static 938void read_unitinfo_dwarf2( /*OUT*/UnitInfo* ui, 939 DiCursor unitblock_img, 940 DiCursor debugabbrev_img, 941 DiCursor debugstr_img, 942 DiCursor debugstr_alt_img ) 943{ 944 UInt acode, abcode; 945 ULong atoffs, blklen; 946 UShort ver; 947 948 UChar addr_size; 949 DiCursor p = unitblock_img; 950 DiCursor end_img; 951 DiCursor abbrev_img; 952 953 VG_(memset)( ui, 0, sizeof( UnitInfo ) ); 954 ui->stmt_list = -1LL; 955 956 /* Read the compilation unit header in .debug_info section - See p 70 */ 957 958 /* This block length */ 959 blklen = step_initial_length_field( &p, &ui->dw64 ); 960 961 /* version should be 2, 3 or 4 */ 962 ver = ML_(cur_step_UShort)(&p); 963 964 /* get offset in abbrev */ 965 atoffs = ui->dw64 ? ML_(cur_step_ULong)(&p) 966 : (ULong)(ML_(cur_step_UInt)(&p)); 967 968 /* Address size */ 969 addr_size = ML_(cur_step_UChar)(&p); 970 971 /* End of this block */ 972 end_img = ML_(cur_plus)(unitblock_img, blklen + (ui->dw64 ? 12 : 4)); 973 974 /* Abbreviation data for this block */ 975 abbrev_img = ML_(cur_plus)(debugabbrev_img, atoffs); 976 977 /* Read the compilation unit entry - this is always the first DIE. 978 * See DWARF4 para 7.5. */ 979 if (ML_(cur_cmpLT)(p, end_img)) { 980 UInt tag; 981 982 acode = step_leb128U( &p ); /* abbreviation code */ 983 984 /* Read abbreviation header */ 985 abcode = step_leb128U( &abbrev_img ); /* abbreviation code */ 986 if ( acode != abcode ) { 987 /* This isn't illegal, but somewhat unlikely. Normally the 988 * first abbrev describes the first DIE, the compile_unit. 989 * But maybe this abbrevation data is shared with another 990 * or it is a NULL entry used for padding. See para 7.5.3. */ 991 abbrev_img = lookup_abbrev( ML_(cur_plus)(debugabbrev_img, atoffs), 992 acode ); 993 } 994 995 tag = step_leb128U( &abbrev_img ); 996 997 if ( tag != 0x0011 /*TAG_compile_unit*/ ) 998 return; /* Not a compile unit (might be partial) or broken DWARF. */ 999 1000 /* DW_CHILDREN_yes or DW_CHILDREN_no */ 1001 abbrev_img = ML_(cur_plus)(abbrev_img, 1); 1002 1003 /* And loop on entries */ 1004 for ( ; ; ) { 1005 /* Read entry definition */ 1006 ULong cval = -1LL; /* Constant value read */ 1007 DiCursor sval = DiCursor_INVALID; /* String value read */ 1008 UInt name = step_leb128U( &abbrev_img ); 1009 UInt form = step_leb128U( &abbrev_img ); 1010 if (name == 0) 1011 break; 1012 1013 /* Read data */ 1014 /* Attributes encoding explained p 71 */ 1015 if ( form == 0x16 /* FORM_indirect */ ) 1016 form = step_leb128U( &p ); 1017 /* Decode form. For most kinds, Just skip the amount of data since 1018 we don't use it for now */ 1019 /* JRS 9 Feb 06: This now handles 64-bit DWARF too. In 1020 64-bit DWARF, lineptr (and loclistptr,macptr,rangelistptr 1021 classes) use FORM_data8, not FORM_data4. Also, 1022 FORM_ref_addr and FORM_strp are 64-bit values, not 32-bit 1023 values. */ 1024 /* TJH 27 Apr 10: in DWARF 4 lineptr (and loclistptr,macptr, 1025 rangelistptr classes) use FORM_sec_offset which is 64 bits 1026 in 64 bit DWARF and 32 bits in 32 bit DWARF. */ 1027 /* JRS 20 Apr 11: LLVM-2.9 encodes DW_AT_stmt_list using 1028 FORM_addr rather than the FORM_data4 that GCC uses. Hence 1029 handle FORM_addr too. */ 1030 switch( form ) { 1031 /* Those cases extract the data properly */ 1032 case 0x05: /* FORM_data2 */ 1033 cval = ML_(cur_step_UShort)(&p); 1034 break; 1035 case 0x06: /* FORM_data4 */ 1036 cval = ML_(cur_step_UInt)(&p); 1037 break; 1038 case 0x0e: /* FORM_strp */ /* pointer in .debug_str */ 1039 /* 2006-01-01: only generate a value if a debug_str 1040 section was found) */ 1041 if (ML_(cur_is_valid)(debugstr_img) && !ui->dw64) 1042 sval = ML_(cur_plus)(debugstr_img, ML_(cur_read_UInt)(p)); 1043 if (ML_(cur_is_valid)(debugstr_img) && ui->dw64) 1044 sval = ML_(cur_plus)(debugstr_img, ML_(cur_read_ULong)(p)); 1045 p = ML_(cur_plus)(p, ui->dw64 ? 8 : 4); 1046 break; 1047 case 0x08: /* FORM_string */ 1048 sval = p; 1049 p = ML_(cur_plus)(p, ML_(cur_strlen)(p) + 1); 1050 break; 1051 case 0x0b: /* FORM_data1 */ 1052 cval = ML_(cur_step_UChar)(&p); 1053 break; 1054 case 0x17: /* FORM_sec_offset */ 1055 if (ui->dw64) { 1056 cval = ML_(cur_step_ULong)(&p); 1057 } else { 1058 cval = ML_(cur_step_UInt)(&p); 1059 }; 1060 break; 1061 case 0x07: /* FORM_data8 */ 1062 if (ui->dw64) cval = ML_(cur_read_ULong)(p); 1063 p = ML_(cur_plus)(p, 8); 1064 /* perhaps should assign unconditionally to cval? */ 1065 break; 1066 /* TODO : Following ones just skip data - implement if you need */ 1067 case 0x01: /* FORM_addr */ 1068 p = ML_(cur_plus)(p, addr_size); 1069 break; 1070 case 0x03: /* FORM_block2 */ 1071 p = ML_(cur_plus)(p, ML_(cur_read_UShort)(p) + 2); 1072 break; 1073 case 0x04: /* FORM_block4 */ 1074 p = ML_(cur_plus)(p, ML_(cur_read_UInt)(p) + 4); 1075 break; 1076 case 0x09: /* FORM_block */ /* fallthrough */ 1077 case 0x18: { /* FORM_exprloc */ 1078 ULong block_len = step_leb128U(&p); 1079 p = ML_(cur_plus)(p, block_len); 1080 break; 1081 } 1082 case 0x0a: /* FORM_block1 */ 1083 p = ML_(cur_plus)(p, ML_(cur_read_UChar)(p) + 1); 1084 break; 1085 case 0x0c: /* FORM_flag */ 1086 p = ML_(cur_plus)(p, 1); 1087 break; 1088 case 0x0d: /* FORM_sdata */ 1089 (void)step_leb128S(&p); 1090 break; 1091 case 0x0f: /* FORM_udata */ 1092 (void)step_leb128U(&p); 1093 break; 1094 case 0x10: /* FORM_ref_addr */ 1095 p = ML_(cur_plus)(p, (ver == 2) ? addr_size 1096 : (ui->dw64 ? 8 : 4)); 1097 break; 1098 case 0x11: /* FORM_ref1 */ 1099 p = ML_(cur_plus)(p, 1); 1100 break; 1101 case 0x12: /* FORM_ref2 */ 1102 p = ML_(cur_plus)(p, 2); 1103 break; 1104 case 0x13: /* FORM_ref4 */ 1105 p = ML_(cur_plus)(p, 4); 1106 break; 1107 case 0x14: /* FORM_ref8 */ 1108 p = ML_(cur_plus)(p, 8); 1109 break; 1110 case 0x15: /* FORM_ref_udata */ 1111 (void)step_leb128U(&p); 1112 break; 1113 case 0x19: /* FORM_flag_present */ 1114 break; 1115 case 0x20: /* FORM_ref_sig8 */ 1116 p = ML_(cur_plus)(p, 8); 1117 break; 1118 case 0x1f20: /* FORM_GNU_ref_alt */ 1119 p = ML_(cur_plus)(p, ui->dw64 ? 8 : 4); 1120 break; 1121 case 0x1f21: /* FORM_GNU_strp_alt */ 1122 if (ML_(cur_is_valid)(debugstr_alt_img) && !ui->dw64) 1123 sval = ML_(cur_plus)(debugstr_alt_img, 1124 ML_(cur_read_UInt)(p)); 1125 if (ML_(cur_is_valid)(debugstr_alt_img) && ui->dw64) 1126 sval = ML_(cur_plus)(debugstr_alt_img, 1127 ML_(cur_read_ULong)(p)); 1128 p = ML_(cur_plus)(p, ui->dw64 ? 8 : 4); 1129 break; 1130 1131 default: 1132 VG_(printf)( "### unhandled dwarf2 abbrev form code 0x%x\n", 1133 form ); 1134 break; 1135 } 1136 1137 /* Now store the members we need in the UnitInfo structure */ 1138 if ( tag == 0x0011 /*TAG_compile_unit*/ ) { 1139 if ( name == 0x03 ) ui->name = sval; /* DW_AT_name */ 1140 else if ( name == 0x1b ) ui->compdir = sval; /* DW_AT_compdir */ 1141 else if ( name == 0x10 ) ui->stmt_list = cval; /* DW_AT_stmt_list */ 1142 } 1143 } 1144 } /* Just read the first DIE, if that wasn't the compile_unit then 1145 * this might have been a partial unit or broken DWARF info. 1146 * That's enough info for us, and we are not gdb ! */ 1147} 1148 1149 1150//////////////////////////////////////////////////////////////////// 1151//////////////////////////////////////////////////////////////////// 1152 1153/* Collect the debug info from DWARF3 debugging sections 1154 * of a given module. 1155 * 1156 * Inputs: given .debug_xxx sections 1157 * Output: update di to contain all the DWARF3 debug infos 1158 */ 1159void ML_(read_debuginfo_dwarf3) 1160 ( struct _DebugInfo* di, 1161 DiSlice escn_debug_info, /* .debug_info */ 1162 DiSlice escn_debug_types, /* .debug_types */ 1163 DiSlice escn_debug_abbv, /* .debug_abbrev */ 1164 DiSlice escn_debug_line, /* .debug_line */ 1165 DiSlice escn_debug_str, /* .debug_str */ 1166 DiSlice escn_debug_str_alt ) /* .debug_str */ 1167{ 1168 UnitInfo ui; 1169 UShort ver; 1170 ULong blklen; 1171 Bool blklen_is_64; 1172 1173 /* Make sure we at least have a header for the first block */ 1174 if (escn_debug_info.szB < 4) { 1175 ML_(symerr)( di, True, 1176 "Last block truncated in .debug_info; ignoring" ); 1177 return; 1178 } 1179 1180 DiCursor block_img = DiCursor_INVALID; 1181 DiCursor end1_img = ML_(cur_plus)( ML_(cur_from_sli)(escn_debug_info), 1182 escn_debug_info.szB ); 1183 Int blklen_len = 0; 1184 1185 /* Iterate on all the blocks we find in .debug_info */ 1186 for ( block_img = ML_(cur_from_sli)(escn_debug_info); 1187 ML_(cur_cmpLT)(block_img, ML_(cur_plus)(end1_img, -(DiOffT)4)); 1188 block_img = ML_(cur_plus)(block_img, blklen + blklen_len) ) { 1189 1190 /* Read the compilation unit header in .debug_info section - See 1191 p 70 */ 1192 /* This block length */ 1193 blklen = read_initial_length_field( block_img, &blklen_is_64 ); 1194 blklen_len = blklen_is_64 ? 12 : 4; 1195 1196 if (ML_(cur_cmpGT)( ML_(cur_plus)(block_img, blklen + blklen_len), 1197 end1_img )) { 1198 ML_(symerr)( di, True, 1199 "Last block truncated in .debug_info; ignoring" ); 1200 return; 1201 } 1202 1203 /* version should be 2 */ 1204 ver = ML_(cur_read_UShort)( ML_(cur_plus)(block_img, blklen_len) ); 1205 if ( ver != 2 && ver != 3 && ver != 4 ) { 1206 ML_(symerr)( di, True, 1207 "Ignoring non-Dwarf2/3/4 block in .debug_info" ); 1208 continue; 1209 } 1210 1211 /* Fill ui with offset in .debug_line and compdir */ 1212 if (0) 1213 VG_(printf)( 1214 "Reading UnitInfo at 0x%llx.....\n", 1215 (ULong)ML_(cur_minus)( block_img, 1216 ML_(cur_from_sli)(escn_debug_info)) ); 1217 read_unitinfo_dwarf2( &ui, block_img, 1218 ML_(cur_from_sli)(escn_debug_abbv), 1219 ML_(cur_from_sli)(escn_debug_str), 1220 ML_(cur_from_sli)(escn_debug_str_alt) ); 1221 if (0) { 1222 HChar* str_name = ML_(cur_read_strdup)(ui.name, "di.rdd3.1"); 1223 HChar* str_compdir = ML_(cur_read_strdup)(ui.compdir, "di.rdd3.2"); 1224 VG_(printf)( " => LINES=0x%llx NAME=%s DIR=%s\n", 1225 ui.stmt_list, str_name, str_compdir ); 1226 ML_(dinfo_free)(str_name); 1227 ML_(dinfo_free)(str_compdir); 1228 } 1229 1230 /* Ignore blocks with no .debug_line associated block */ 1231 if ( ui.stmt_list == -1LL ) 1232 continue; 1233 1234 if (0) { 1235 HChar* str_name = ML_(cur_read_strdup)(ui.name, "di.rdd3.3"); 1236 VG_(printf)("debug_line_sz %lld, ui.stmt_list %lld %s\n", 1237 escn_debug_line.szB, ui.stmt_list, str_name ); 1238 ML_(dinfo_free)(str_name); 1239 } 1240 1241 /* Read the .debug_line block for this compile unit */ 1242 read_dwarf2_lineblock( 1243 di, &ui, 1244 ML_(cur_plus)(ML_(cur_from_sli)(escn_debug_line), ui.stmt_list), 1245 escn_debug_line.szB - ui.stmt_list 1246 ); 1247 } 1248} 1249 1250 1251//////////////////////////////////////////////////////////////////// 1252//////////////////////////////////////////////////////////////////// 1253 1254/*------------------------------------------------------------*/ 1255/*--- Read DWARF1 format line number info. ---*/ 1256/*------------------------------------------------------------*/ 1257 1258/* DWARF1 appears to be redundant, but nevertheless the Lahey Fortran 1259 compiler generates it. 1260*/ 1261 1262/* The following three enums (dwarf_tag, dwarf_form, dwarf_attribute) 1263 are taken from the file include/elf/dwarf.h in the GNU gdb-6.0 1264 sources, which are Copyright 1992, 1993, 1995, 1999 Free Software 1265 Foundation, Inc and naturally licensed under the GNU General Public 1266 License version 2 or later. 1267*/ 1268 1269/* Tag names and codes. */ 1270 1271enum dwarf_tag { 1272 TAG_padding = 0x0000, 1273 TAG_array_type = 0x0001, 1274 TAG_class_type = 0x0002, 1275 TAG_entry_point = 0x0003, 1276 TAG_enumeration_type = 0x0004, 1277 TAG_formal_parameter = 0x0005, 1278 TAG_global_subroutine = 0x0006, 1279 TAG_global_variable = 0x0007, 1280 /* 0x0008 -- reserved */ 1281 /* 0x0009 -- reserved */ 1282 TAG_label = 0x000a, 1283 TAG_lexical_block = 0x000b, 1284 TAG_local_variable = 0x000c, 1285 TAG_member = 0x000d, 1286 /* 0x000e -- reserved */ 1287 TAG_pointer_type = 0x000f, 1288 TAG_reference_type = 0x0010, 1289 TAG_compile_unit = 0x0011, 1290 TAG_string_type = 0x0012, 1291 TAG_structure_type = 0x0013, 1292 TAG_subroutine = 0x0014, 1293 TAG_subroutine_type = 0x0015, 1294 TAG_typedef = 0x0016, 1295 TAG_union_type = 0x0017, 1296 TAG_unspecified_parameters = 0x0018, 1297 TAG_variant = 0x0019, 1298 TAG_common_block = 0x001a, 1299 TAG_common_inclusion = 0x001b, 1300 TAG_inheritance = 0x001c, 1301 TAG_inlined_subroutine = 0x001d, 1302 TAG_module = 0x001e, 1303 TAG_ptr_to_member_type = 0x001f, 1304 TAG_set_type = 0x0020, 1305 TAG_subrange_type = 0x0021, 1306 TAG_with_stmt = 0x0022, 1307 1308 /* GNU extensions */ 1309 1310 TAG_format_label = 0x8000, /* for FORTRAN 77 and Fortran 90 */ 1311 TAG_namelist = 0x8001, /* For Fortran 90 */ 1312 TAG_function_template = 0x8002, /* for C++ */ 1313 TAG_class_template = 0x8003 /* for C++ */ 1314}; 1315 1316/* Form names and codes. */ 1317 1318enum dwarf_form { 1319 FORM_ADDR = 0x1, 1320 FORM_REF = 0x2, 1321 FORM_BLOCK2 = 0x3, 1322 FORM_BLOCK4 = 0x4, 1323 FORM_DATA2 = 0x5, 1324 FORM_DATA4 = 0x6, 1325 FORM_DATA8 = 0x7, 1326 FORM_STRING = 0x8 1327}; 1328 1329/* Attribute names and codes. */ 1330 1331enum dwarf_attribute { 1332 AT_sibling = (0x0010|FORM_REF), 1333 AT_location = (0x0020|FORM_BLOCK2), 1334 AT_name = (0x0030|FORM_STRING), 1335 AT_fund_type = (0x0050|FORM_DATA2), 1336 AT_mod_fund_type = (0x0060|FORM_BLOCK2), 1337 AT_user_def_type = (0x0070|FORM_REF), 1338 AT_mod_u_d_type = (0x0080|FORM_BLOCK2), 1339 AT_ordering = (0x0090|FORM_DATA2), 1340 AT_subscr_data = (0x00a0|FORM_BLOCK2), 1341 AT_byte_size = (0x00b0|FORM_DATA4), 1342 AT_bit_offset = (0x00c0|FORM_DATA2), 1343 AT_bit_size = (0x00d0|FORM_DATA4), 1344 /* (0x00e0|FORM_xxxx) -- reserved */ 1345 AT_element_list = (0x00f0|FORM_BLOCK4), 1346 AT_stmt_list = (0x0100|FORM_DATA4), 1347 AT_low_pc = (0x0110|FORM_ADDR), 1348 AT_high_pc = (0x0120|FORM_ADDR), 1349 AT_language = (0x0130|FORM_DATA4), 1350 AT_member = (0x0140|FORM_REF), 1351 AT_discr = (0x0150|FORM_REF), 1352 AT_discr_value = (0x0160|FORM_BLOCK2), 1353 /* (0x0170|FORM_xxxx) -- reserved */ 1354 /* (0x0180|FORM_xxxx) -- reserved */ 1355 AT_string_length = (0x0190|FORM_BLOCK2), 1356 AT_common_reference = (0x01a0|FORM_REF), 1357 AT_comp_dir = (0x01b0|FORM_STRING), 1358 AT_const_value_string = (0x01c0|FORM_STRING), 1359 AT_const_value_data2 = (0x01c0|FORM_DATA2), 1360 AT_const_value_data4 = (0x01c0|FORM_DATA4), 1361 AT_const_value_data8 = (0x01c0|FORM_DATA8), 1362 AT_const_value_block2 = (0x01c0|FORM_BLOCK2), 1363 AT_const_value_block4 = (0x01c0|FORM_BLOCK4), 1364 AT_containing_type = (0x01d0|FORM_REF), 1365 AT_default_value_addr = (0x01e0|FORM_ADDR), 1366 AT_default_value_data2 = (0x01e0|FORM_DATA2), 1367 AT_default_value_data4 = (0x01e0|FORM_DATA4), 1368 AT_default_value_data8 = (0x01e0|FORM_DATA8), 1369 AT_default_value_string = (0x01e0|FORM_STRING), 1370 AT_friends = (0x01f0|FORM_BLOCK2), 1371 AT_inline = (0x0200|FORM_STRING), 1372 AT_is_optional = (0x0210|FORM_STRING), 1373 AT_lower_bound_ref = (0x0220|FORM_REF), 1374 AT_lower_bound_data2 = (0x0220|FORM_DATA2), 1375 AT_lower_bound_data4 = (0x0220|FORM_DATA4), 1376 AT_lower_bound_data8 = (0x0220|FORM_DATA8), 1377 AT_private = (0x0240|FORM_STRING), 1378 AT_producer = (0x0250|FORM_STRING), 1379 AT_program = (0x0230|FORM_STRING), 1380 AT_protected = (0x0260|FORM_STRING), 1381 AT_prototyped = (0x0270|FORM_STRING), 1382 AT_public = (0x0280|FORM_STRING), 1383 AT_pure_virtual = (0x0290|FORM_STRING), 1384 AT_return_addr = (0x02a0|FORM_BLOCK2), 1385 AT_abstract_origin = (0x02b0|FORM_REF), 1386 AT_start_scope = (0x02c0|FORM_DATA4), 1387 AT_stride_size = (0x02e0|FORM_DATA4), 1388 AT_upper_bound_ref = (0x02f0|FORM_REF), 1389 AT_upper_bound_data2 = (0x02f0|FORM_DATA2), 1390 AT_upper_bound_data4 = (0x02f0|FORM_DATA4), 1391 AT_upper_bound_data8 = (0x02f0|FORM_DATA8), 1392 AT_virtual = (0x0300|FORM_STRING), 1393 1394 /* GNU extensions. */ 1395 1396 AT_sf_names = (0x8000|FORM_DATA4), 1397 AT_src_info = (0x8010|FORM_DATA4), 1398 AT_mac_info = (0x8020|FORM_DATA4), 1399 AT_src_coords = (0x8030|FORM_DATA4), 1400 AT_body_begin = (0x8040|FORM_ADDR), 1401 AT_body_end = (0x8050|FORM_ADDR) 1402}; 1403 1404/* end of enums taken from gdb-6.0 sources */ 1405#if 0 1406void ML_(read_debuginfo_dwarf1) ( 1407 struct _DebugInfo* di, 1408 UChar* dwarf1d, Int dwarf1d_sz, 1409 UChar* dwarf1l, Int dwarf1l_sz ) 1410{ 1411 UInt stmt_list; 1412 Bool stmt_list_found; 1413 Int die_offset, die_szb, at_offset; 1414 UShort die_kind, at_kind; 1415 UChar* at_base; 1416 HChar* src_filename; 1417 1418 if (0) 1419 VG_(printf)("read_debuginfo_dwarf1 ( %p, %d, %p, %d )\n", 1420 dwarf1d, dwarf1d_sz, dwarf1l, dwarf1l_sz ); 1421 1422 /* This loop scans the DIEs. */ 1423 die_offset = 0; 1424 while (True) { 1425 if (die_offset >= dwarf1d_sz) break; 1426 1427 die_szb = ML_(read_Int)(dwarf1d + die_offset); 1428 die_kind = ML_(read_UShort)(dwarf1d + die_offset + 4); 1429 1430 /* We're only interested in compile_unit DIEs; ignore others. */ 1431 if (die_kind != TAG_compile_unit) { 1432 die_offset += die_szb; 1433 continue; 1434 } 1435 1436 if (0) 1437 VG_(printf)("compile-unit DIE: offset %d, tag 0x%x, size %d\n", 1438 die_offset, (Int)die_kind, die_szb ); 1439 1440 /* We've got a compile_unit DIE starting at (dwarf1d + 1441 die_offset+6). Try and find the AT_name and AT_stmt_list 1442 attributes. Then, finally, we can read the line number info 1443 for this source file. */ 1444 1445 /* The next 3 are set as we find the relevant attrs. */ 1446 src_filename = NULL; 1447 stmt_list_found = False; 1448 stmt_list = 0; 1449 1450 /* This loop scans the Attrs inside compile_unit DIEs. */ 1451 at_base = dwarf1d + die_offset + 6; 1452 at_offset = 0; 1453 while (True) { 1454 if (at_offset >= die_szb-6) break; 1455 1456 at_kind = ML_(read_UShort)(at_base + at_offset); 1457 if (0) VG_(printf)("atoffset %d, attag 0x%x\n", 1458 at_offset, (Int)at_kind ); 1459 at_offset += 2; /* step over the attribute itself */ 1460 /* We have to examine the attribute to figure out its 1461 length. */ 1462 switch (at_kind) { 1463 case AT_stmt_list: 1464 case AT_language: 1465 case AT_sibling: 1466 if (at_kind == AT_stmt_list) { 1467 stmt_list_found = True; 1468 stmt_list = ML_(read_Int)(at_base+at_offset); 1469 } 1470 at_offset += 4; break; 1471 case AT_high_pc: 1472 case AT_low_pc: 1473 at_offset += sizeof(void*); break; 1474 case AT_name: 1475 case AT_producer: 1476 case AT_comp_dir: 1477 /* Zero terminated string, step over it. */ 1478 if (at_kind == AT_name) 1479 src_filename = (HChar *)(at_base + at_offset); 1480 while (at_offset < die_szb-6 && at_base[at_offset] != 0) 1481 at_offset++; 1482 at_offset++; 1483 break; 1484 default: 1485 VG_(printf)("Unhandled DWARF-1 attribute 0x%x\n", 1486 (Int)at_kind ); 1487 VG_(core_panic)("Unhandled DWARF-1 attribute"); 1488 } /* switch (at_kind) */ 1489 } /* looping over attributes */ 1490 1491 /* So, did we find the required stuff for a line number table in 1492 this DIE? If yes, read it. */ 1493 if (stmt_list_found /* there is a line number table */ 1494 && src_filename != NULL /* we know the source filename */ 1495 ) { 1496 /* Table starts: 1497 Length: 1498 4 bytes, includes the entire table 1499 Base address: 1500 unclear (4? 8?), assuming native pointer size here. 1501 Then a sequence of triples 1502 (source line number -- 32 bits 1503 source line column -- 16 bits 1504 address delta -- 32 bits) 1505 */ 1506 Addr base; 1507 Int len; 1508 HChar* curr_filenm; 1509 UChar* ptr; 1510 UInt prev_line, prev_delta; 1511 1512 curr_filenm = ML_(addStr) ( di, src_filename, -1 ); 1513 prev_line = prev_delta = 0; 1514 1515 ptr = dwarf1l + stmt_list; 1516 len = ML_(read_Int)(ptr); ptr += sizeof(Int); 1517 base = ML_(read_Addr)(ptr); ptr += sizeof(void*); 1518 len -= (sizeof(Int) + sizeof(void*)); 1519 while (len > 0) { 1520 UInt line; 1521 UShort col; 1522 UInt delta; 1523 line = ML_(read_UInt)(ptr); ptr += sizeof(UInt); 1524 col = ML_(read_UShort)(ptr); ptr += sizeof(UShort); 1525 delta = ML_(read_UInt)(ptr); ptr += sizeof(UInt); 1526 if (0) VG_(printf)("line %d, col %d, delta %d\n", 1527 line, (Int)col, delta ); 1528 len -= (sizeof(UInt) + sizeof(UShort) + sizeof(UInt)); 1529 1530 if (delta > 0 && prev_line > 0) { 1531 if (0) VG_(printf) (" %d %d-%d\n", 1532 prev_line, prev_delta, delta-1); 1533 ML_(addLineInfo) ( di, curr_filenm, NULL, 1534 base + prev_delta, base + delta, 1535 prev_line, 0 ); 1536 } 1537 prev_line = line; 1538 prev_delta = delta; 1539 } 1540 } 1541 1542 /* Move on the the next DIE. */ 1543 die_offset += die_szb; 1544 1545 } /* Looping over DIEs */ 1546 1547} 1548#endif 1549 1550/*------------------------------------------------------------*/ 1551/*--- Read call-frame info from an .eh_frame section ---*/ 1552/*------------------------------------------------------------*/ 1553 1554/* Sources of info: 1555 1556 The DWARF3 spec, available from http://www.dwarfstd.org/Download.php 1557 1558 This describes how to read CFA data from .debug_frame sections. 1559 So as to maximise everybody's annoyance and confusion, .eh_frame 1560 sections are almost the same as .debug_frame sections, but differ 1561 in a few subtle and ill documented but important aspects. 1562 1563 Generic ELF Specification, sections 7.5 (DWARF Extensions) and 7.6 1564 (Exception Frames), available from 1565 1566 http://www.linux-foundation.org/spec/book/ELF-generic/ELF-generic.html 1567 1568 This really does describe .eh_frame, at least the aspects that 1569 differ from standard DWARF3. It's better than guessing, and 1570 (marginally) more fun than reading the gdb source code. 1571*/ 1572 1573/* Useful info .. 1574 1575 In general: 1576 gdb-6.3/gdb/dwarf2-frame.c 1577 1578 gdb-6.3/gdb/i386-tdep.c: 1579 1580 DWARF2/GCC uses the stack address *before* the function call as a 1581 frame's CFA. [jrs: I presume this means %esp before the call as 1582 the CFA]. 1583 1584 JRS: on amd64, the dwarf register numbering is, as per 1585 gdb-6.3/gdb/amd64-tdep.c and also amd64-abi-0.98.pdf: 1586 1587 0 1 2 3 4 5 6 7 1588 RAX RDX RCX RBX RSI RDI RBP RSP 1589 1590 8 ... 15 1591 R8 ... R15 1592 1593 16 is the return address (RIP) 1594 "The table defines Return Address to have a register number, 1595 even though the address is stored in 0(%rsp) and not in a 1596 physical register." 1597 1598 17 ... 24 1599 XMM0 ... XMM7 1600 1601 25 ... 32 1602 XMM8 ... XMM15 1603 1604 33 ... 40 1605 ST0 ... ST7 1606 1607 41 ... 48 1608 MM0 ... MM7 1609 1610 49 RFLAGS 1611 50,51,52,53,54,55 ES,CS,SS,DS,FS,GS 1612 58 FS.BASE (what's that?) 1613 59 GS.BASE (what's that?) 1614 62 TR (task register) 1615 63 LDTR (LDT register) 1616 64 MXCSR 1617 65 FCW (x87 control word) 1618 66 FSW (x86 status word) 1619 1620 On x86 I cannot find any documentation. It _appears_ to be the 1621 actual instruction encoding, viz: 1622 1623 0 1 2 3 4 5 6 7 1624 EAX ECX EDX EBX ESP EBP ESI EDI 1625 1626 8 is the return address (EIP) */ 1627 1628 1629/* Comments re DW_CFA_set_loc, 16 Nov 06. 1630 1631 JRS: 1632 Someone recently sent me a libcrypto.so.0.9.8 as distributed with 1633 Ubuntu of some flavour, compiled with gcc 4.1.2 on amd64. It 1634 causes V's CF reader to complain a lot: 1635 1636 >> --19976-- DWARF2 CFI reader: unhandled CFI instruction 0:24 1637 >> --19976-- DWARF2 CFI reader: unhandled CFI instruction 0:24 1638 >> --19976-- DWARF2 CFI reader: unhandled CFI instruction 0:24 1639 >> --19976-- DWARF2 CFI reader: unhandled CFI instruction 0:24 1640 >> --19976-- DWARF2 CFI reader: unhandled CFI instruction 0:48 1641 >> --19976-- DWARF2 CFI reader: unhandled CFI instruction 0:24 1642 1643 After chasing this around a bit it seems that the CF bytecode 1644 parser lost sync at a DW_CFA_set_loc, which has a single argument 1645 denoting an address. 1646 1647 As it stands that address is extracted by read_Addr(). On amd64 1648 that just fetches 8 bytes regardless of anything else. 1649 1650 read_encoded_Addr() is more sophisticated. This appears to take 1651 into account some kind of encoding flag. When I replace the uses 1652 of read_Addr by read_encoded_Addr for DW_CFA_set_loc, the 1653 complaints go away, there is no loss of sync, and the parsed CF 1654 instructions are the same as shown by readelf --debug-dump=frames. 1655 1656 So it seems a plausible fix. The problem is I looked in the DWARF3 1657 spec and completely failed to figure out whether or not the arg to 1658 DW_CFA_set_loc is supposed to be encoded in a way suitable for 1659 read_encoded_Addr, nor for that matter any description of what it 1660 is that read_encoded_Addr is really decoding. 1661 1662 TomH: 1663 The problem is that the encoding is not standard - the eh_frame 1664 section uses the same encoding as the dwarf_frame section except 1665 for a few small changes, and this is one of them. So this is not 1666 something the DWARF standard covers. 1667 1668 There is an augmentation string to indicate what is going on though 1669 so that programs can recognise it. 1670 1671 What we are doing seems to match what gdb 6.5 and libdwarf 20060614 1672 do though. I'm not sure about readelf though. 1673 1674 (later): Well dwarfdump barfs on it: 1675 1676 dwarfdump ERROR: dwarf_get_fde_info_for_reg: 1677 DW_DLE_DF_FRAME_DECODING_ERROR(193) (193) 1678 1679 I've looked at binutils as well now, and the code in readelf agrees 1680 with your patch - ie it treats set_loc as having an encoded address 1681 if there is a zR augmentation indicating an encoding. 1682 1683 Quite why gdb and libdwarf don't understand this is an interesting 1684 question... 1685 1686 Final outcome: all uses of read_Addr were replaced by 1687 read_encoded_Addr. A new type AddressDecodingInfo was added to 1688 make it relatively clean to plumb through the extra info needed by 1689 read_encoded_Addr. 1690*/ 1691 1692/* More badness re address encoding, 12 Jan 07. 1693 1694 Most gcc provided CIEs have a "zR" augmentation, which means they 1695 supply their own address encoding, and that works fine. However, 1696 some icc9 supplied CIEs have no augmentation, which means they use 1697 the default_Addr_encoding(). That says to use a machine-word sized 1698 value, literally unmodified. 1699 1700 Since .so's are, in general, relocated when loaded, having absolute 1701 addresses in the CFI data makes no sense when read_encoded_Addr is 1702 used to find the initial location for a FDE. The resulting saga: 1703 1704 TomH: 1705 > I'm chasing a stack backtrace failure for an amd64 .so which was 1706 > created I believe by icc 9.1. After a while I wound up looking at 1707 > this: (readdwarf.c) 1708 > 1709 > 5083 tom static UChar default_Addr_encoding ( void ) 1710 > 3584 tom { 1711 > 3584 tom switch (sizeof(Addr)) { 1712 > 3584 tom case 4: return DW_EH_PE_udata4; 1713 > 3584 tom case 8: return DW_EH_PE_udata8; 1714 > 3584 tom default: vg_assert(0); 1715 > 3584 tom } 1716 > 3584 tom } 1717 > 1718 > If a CIE does not have an "augmentation string" (typically "zR") then 1719 > addresses are decoded as described by default_Addr_encoding. If there 1720 > is an 'R' in the augmentation string then the encoding to use 1721 > is specified by the CIE itself, which works fine with GCC compiled code 1722 > since that always appears to specify zR. 1723 1724 Correct. 1725 1726 > Problem is this .so has no augmentation string and so uses the 1727 > default encoding, viz DW_EH_PE_udata8. That appears to mean 1728 > "read a 64 bit number" and use that as-is (for the starting value 1729 > of the program counter when running the CFA program). 1730 1731 Strictly speaking the default is DW_EH_PE_absptr, but that amounts 1732 to either udata4 or udata8 depending on the platform's pointer size 1733 which is a shortcut I used. 1734 1735 > For this .so that gives nonsense (very small) PCs which are later 1736 > rejected by the sanity check which ensures PC ranges fall inside 1737 > the mapped text segment. It seems like the .so expects to have the 1738 > start VMA of the text segment added on. This would correspond to 1739 > 1740 > static UChar default_Addr_encoding ( void ) 1741 > { 1742 > switch (sizeof(Addr)) { 1743 > case 4: return DW_EH_PE_textrel + DW_EH_PE_udata4; 1744 > case 8: return DW_EH_PE_textrel + DW_EH_PE_udata8; 1745 > default: vg_assert(0); 1746 > } 1747 > } 1748 1749 The problem you're seeing is that you have absolute pointers inside 1750 a shared library, which obviously makes little sense on the face of 1751 things as how would the linker know where the library will be 1752 loaded? 1753 1754 The answer of course is that it doesn't, so if it points absolute 1755 pointers in the frame unwind data is has to include relocations for 1756 them, and I'm betting that if you look at the relocations in the 1757 library you will there are some for that data. 1758 1759 That is fine of course when ld.so maps the library - it will 1760 relocate the eh_frame data as it maps it (or prelinking will 1761 already have done so) and when the g++ exception code kicks in and 1762 unwinds the stack it will see relocated data. 1763 1764 We of course are mapping the section from the ELF file ourselves 1765 and are not applying the relocations, hence the problem you are 1766 seeing. 1767 1768 Strictly speaking we should apply the relocations but the cheap 1769 solution is essentially to do what you've done - strictly speaking 1770 you should adjust by the difference between the address the library 1771 was linked for and the address it has been loaded at, but a shared 1772 library will normally be linked for address zero I believe. It's 1773 possible that prelinking might change that though? 1774 1775 JRS: 1776 That all syncs with what I am seeing. 1777 1778 So what I am inclined to do is: 1779 1780 - Leave default_Addr_encoding as it is 1781 1782 - Change read_encoded_Addr's handling of "case DW_EH_PE_absptr" so 1783 it sets base to, as you say, the difference between the address 1784 the library was linked for and the address it has been loaded at 1785 (== the SegInfo's text_bias) 1786 1787 Does that sound sane? I think it should even handle the prelinked 1788 case. 1789 1790 (JRS, later) 1791 1792 Hmm. Plausible as it sounds, it doesn't work. It now produces 1793 bogus backtraces for locations inside the (statically linked) 1794 memcheck executable. 1795 1796 Besides, there are a couple of other places where read_encoded_Addr 1797 is used -- one of which is used to establish the length of the 1798 address range covered by the current FDE: 1799 1800 fde_arange = read_encoded_Addr(&nbytes, &adi, data); 1801 1802 and it doesn't seem to make any sense for read_encoded_Addr to add 1803 on the text segment bias in that context. The DWARF3 spec says 1804 that both the initial_location and address_range (length) fields 1805 are encoded the same way ("target address"), so it is unclear at 1806 what stage in the process it would be appropriate to relocate the 1807 former but not the latter. 1808 1809 One unprincipled kludge that does work is the following: just 1810 before handing one of the address range fragments off to 1811 ML_(addDiCfSI) for permanent storage, check its start address. If 1812 that is very low (less than 2 M), and is far below the mapped text 1813 segment, and adding the text bias would move the fragment entirely 1814 inside the mapped text segment, then do so. A kind of kludged 1815 last-minute relocation, if you like. 1816 1817 12 Jan 07: committing said kludge (see kludge_then_addDiCfSI). If 1818 the situation clarifies, it can easily enough be backed out and 1819 replaced by a better fix. 1820*/ 1821 1822/* --------------- Decls --------------- */ 1823 1824#if defined(VGP_x86_linux) 1825# define FP_REG 5 1826# define SP_REG 4 1827# define RA_REG_DEFAULT 8 1828#elif defined(VGP_amd64_linux) 1829# define FP_REG 6 1830# define SP_REG 7 1831# define RA_REG_DEFAULT 16 1832#elif defined(VGP_ppc32_linux) 1833# define FP_REG 1 1834# define SP_REG 1 1835# define RA_REG_DEFAULT 65 1836#elif defined(VGP_ppc64_linux) 1837# define FP_REG 1 1838# define SP_REG 1 1839# define RA_REG_DEFAULT 65 1840#elif defined(VGP_arm_linux) 1841# define FP_REG 12 1842# define SP_REG 13 1843# define RA_REG_DEFAULT 14 1844#elif defined(VGP_arm64_linux) 1845# define FP_REG 29 1846# define SP_REG 31 1847# define RA_REG_DEFAULT 30 1848#elif defined(VGP_x86_darwin) 1849# define FP_REG 5 1850# define SP_REG 4 1851# define RA_REG_DEFAULT 8 1852#elif defined(VGP_amd64_darwin) 1853# define FP_REG 6 1854# define SP_REG 7 1855# define RA_REG_DEFAULT 16 1856#elif defined(VGP_s390x_linux) 1857# define FP_REG 11 // sometimes s390 has a frame pointer in r11 1858# define SP_REG 15 // stack is always r15 1859# define RA_REG_DEFAULT 14 // the return address is in r14 1860#elif defined(VGP_mips32_linux) 1861# define FP_REG 30 1862# define SP_REG 29 1863# define RA_REG_DEFAULT 31 1864#elif defined(VGP_mips64_linux) 1865# define FP_REG 30 1866# define SP_REG 29 1867# define RA_REG_DEFAULT 31 1868#else 1869# error "Unknown platform" 1870#endif 1871 1872/* The number of regs we are prepared to unwind. The number for 1873 arm-linux (320) seems ludicrously high, but the ARM IHI 0040A page 1874 7 (DWARF for the ARM Architecture) specifies that values up to 320 1875 might exist, for Neon/VFP-v3. */ 1876#if defined(VGP_ppc32_linux) || defined(VGP_ppc64_linux) \ 1877 || defined(VGP_mips32_linux) || defined(VGP_mips64_linux) 1878# define N_CFI_REGS 72 1879#elif defined(VGP_arm_linux) 1880# define N_CFI_REGS 320 1881#elif defined(VGP_arm64_linux) 1882# define N_CFI_REGS 128 1883#else 1884# define N_CFI_REGS 20 1885#endif 1886 1887/* Instructions for the automaton */ 1888enum dwarf_cfa_primary_ops 1889 { 1890 DW_CFA_use_secondary = 0, 1891 DW_CFA_advance_loc = 1, 1892 DW_CFA_offset = 2, 1893 DW_CFA_restore = 3 1894 }; 1895 1896enum dwarf_cfa_secondary_ops 1897 { 1898 DW_CFA_nop = 0x00, 1899 DW_CFA_set_loc = 0x01, 1900 DW_CFA_advance_loc1 = 0x02, 1901 DW_CFA_advance_loc2 = 0x03, 1902 DW_CFA_advance_loc4 = 0x04, 1903 DW_CFA_offset_extended = 0x05, 1904 DW_CFA_restore_extended = 0x06, 1905 DW_CFA_undefined = 0x07, 1906 DW_CFA_same_value = 0x08, 1907 DW_CFA_register = 0x09, 1908 DW_CFA_remember_state = 0x0a, 1909 DW_CFA_restore_state = 0x0b, 1910 DW_CFA_def_cfa = 0x0c, 1911 DW_CFA_def_cfa_register = 0x0d, 1912 DW_CFA_def_cfa_offset = 0x0e, 1913 DW_CFA_def_cfa_expression = 0x0f, /* DWARF3 only */ 1914 DW_CFA_expression = 0x10, /* DWARF3 only */ 1915 DW_CFA_offset_extended_sf = 0x11, /* DWARF3 only */ 1916 DW_CFA_def_cfa_sf = 0x12, /* DWARF3 only */ 1917 DW_CFA_def_cfa_offset_sf = 0x13, /* DWARF3 only */ 1918 DW_CFA_val_offset = 0x14, /* DWARF3 only */ 1919 DW_CFA_val_offset_sf = 0x15, /* DWARF3 only */ 1920 DW_CFA_val_expression = 0x16, /* DWARF3 only */ 1921 DW_CFA_lo_user = 0x1c, 1922 DW_CFA_GNU_window_save = 0x2d, /* GNU extension */ 1923 DW_CFA_GNU_args_size = 0x2e, /* GNU extension */ 1924 DW_CFA_GNU_negative_offset_extended = 0x2f, /* GNU extension */ 1925 DW_CFA_hi_user = 0x3f 1926 }; 1927 1928#define DW_EH_PE_absptr 0x00 1929#define DW_EH_PE_omit 0xff 1930 1931#define DW_EH_PE_uleb128 0x01 1932#define DW_EH_PE_udata2 0x02 1933#define DW_EH_PE_udata4 0x03 1934#define DW_EH_PE_udata8 0x04 1935#define DW_EH_PE_sleb128 0x09 1936#define DW_EH_PE_sdata2 0x0A 1937#define DW_EH_PE_sdata4 0x0B 1938#define DW_EH_PE_sdata8 0x0C 1939#define DW_EH_PE_signed 0x08 1940 1941#define DW_EH_PE_pcrel 0x10 1942#define DW_EH_PE_textrel 0x20 1943#define DW_EH_PE_datarel 0x30 1944#define DW_EH_PE_funcrel 0x40 1945#define DW_EH_PE_aligned 0x50 1946 1947#define DW_EH_PE_indirect 0x80 1948 1949 1950/* RegRule and UnwindContext are used temporarily to do the unwinding. 1951 The result is then summarised into a sequence of CfiSIs, if 1952 possible. UnwindContext effectively holds the state of the 1953 abstract machine whilst it is running. 1954 1955 The CFA can either be a signed offset from a register, 1956 or an expression: 1957 1958 CFA = cfa_reg + cfa_off when UnwindContext.cfa_is_regoff==True 1959 | [[ cfa_expr_id ]] 1960 1961 When .cfa_is_regoff == True, cfa_expr_id must be zero 1962 When .cfa_is_regoff == False, cfa_reg must be zero 1963 and cfa_off must be zero 1964 1965 RegRule describes, for each register, how to get its 1966 value in the previous frame, where 'cfa' denotes the cfa 1967 for the frame as a whole: 1968 1969 RegRule = RR_Undef -- undefined 1970 | RR_Same -- same as in previous frame 1971 | RR_CFAOff arg -- is at * ( cfa + arg ) 1972 | RR_CFAValOff arg -- is ( cfa + arg ) 1973 | RR_Reg arg -- is in register 'arg' 1974 | RR_Expr arg -- is at * [[ arg ]] 1975 | RR_ValExpr arg -- is [[ arg ]] 1976 | RR_Arch -- dunno 1977 1978 Note that RR_Expr is redundant since the same can be represented 1979 using RR_ValExpr with an explicit dereference (CfiExpr_Deref) at 1980 the outermost level. 1981 1982 All expressions are stored in exprs in the containing 1983 UnwindContext. Since the UnwindContext gets reinitialised for each 1984 new FDE, summarise_context needs to copy out any expressions it 1985 wants to keep into the cfsi_exprs field of the containing SegInfo. 1986*/ 1987typedef 1988 struct { 1989 enum { RR_Undef, RR_Same, RR_CFAOff, RR_CFAValOff, 1990 RR_Reg, /*RR_Expr,*/ RR_ValExpr, RR_Arch } tag; 1991 /* meaning: int offset for CFAoff/CFAValOff 1992 reg # for Reg 1993 expr index for Expr/ValExpr */ 1994 Int arg; 1995 } 1996 RegRule; 1997 1998static void ppRegRule ( XArray* exprs, RegRule* rrule ) 1999{ 2000 vg_assert(exprs); 2001 switch (rrule->tag) { 2002 case RR_Undef: VG_(printf)("u "); break; 2003 case RR_Same: VG_(printf)("s "); break; 2004 case RR_CFAOff: VG_(printf)("c%d ", rrule->arg); break; 2005 case RR_CFAValOff: VG_(printf)("v%d ", rrule->arg); break; 2006 case RR_Reg: VG_(printf)("r%d ", rrule->arg); break; 2007 case RR_ValExpr: VG_(printf)("ve{"); 2008 ML_(ppCfiExpr)( exprs, rrule->arg ); 2009 VG_(printf)("} "); 2010 break; 2011 case RR_Arch: VG_(printf)("a "); break; 2012 default: VG_(core_panic)("ppRegRule"); 2013 } 2014} 2015 2016 2017/* Size of the stack of register unwind rules. This is only 2018 exceedingly rarely used, so a stack of size 1 should actually work 2019 with almost all compiler-generated CFA. */ 2020#define N_RR_STACK 4 2021 2022typedef 2023 struct { 2024 /* Read-only fields (set by the CIE) */ 2025 Int code_a_f; 2026 Int data_a_f; 2027 Addr initloc; 2028 Int ra_reg; 2029 /* The rest of these fields can be modifed by 2030 run_CF_instruction. */ 2031 /* The LOC entry */ 2032 Addr loc; 2033 /* We need a stack of these in order to handle 2034 DW_CFA_{remember,restore}_state. */ 2035 struct UnwindContextState { 2036 /* The CFA entry. This can be either reg+/-offset or an expr. */ 2037 Bool cfa_is_regoff; /* True=>is reg+offset; False=>is expr */ 2038 Int cfa_reg; 2039 Int cfa_off; /* in bytes */ 2040 Int cfa_expr_ix; /* index into cfa_exprs */ 2041 /* Register unwind rules. */ 2042 RegRule reg[N_CFI_REGS]; 2043 } 2044 state[N_RR_STACK]; 2045 Int state_sp; /* 0 <= state_sp < N_RR_STACK; points at the 2046 currently-in-use rule set. */ 2047 /* array of CfiExpr, shared by reg[] and cfa_expr_ix */ 2048 XArray* exprs; 2049 } 2050 UnwindContext; 2051 2052static void ppUnwindContext ( UnwindContext* ctx ) 2053{ 2054 Int j, i; 2055 VG_(printf)("0x%llx: ", (ULong)ctx->loc); 2056 for (j = 0; j <= ctx->state_sp; j++) { 2057 struct UnwindContextState* ctxs = &ctx->state[j]; 2058 VG_(printf)("%s[%d]={ ", j > 0 ? " " : "", j); 2059 if (ctxs->cfa_is_regoff) { 2060 VG_(printf)("%d(r%d) ", ctxs->cfa_off, ctxs->cfa_reg); 2061 } else { 2062 vg_assert(ctx->exprs); 2063 VG_(printf)("{"); 2064 ML_(ppCfiExpr)( ctx->exprs, ctxs->cfa_expr_ix ); 2065 VG_(printf)("} "); 2066 } 2067 VG_(printf)("{ "); 2068 for (i = 0; i < N_CFI_REGS; i++) 2069 ppRegRule(ctx->exprs, &ctxs->reg[i]); 2070 VG_(printf)("}"); 2071 } 2072 VG_(printf)("\n"); 2073} 2074 2075static void initUnwindContext ( /*OUT*/UnwindContext* ctx ) 2076{ 2077 Int j, i; 2078 VG_(memset)(ctx, 0, sizeof(*ctx)); 2079 /* ctx->code_a_f = 0; 2080 ctx->data_a_f = 0; 2081 ctx->initloc = 0; */ 2082 ctx->ra_reg = RA_REG_DEFAULT; 2083 /* ctx->loc = 0; 2084 ctx->exprs = NULL; 2085 ctx->state_sp = 0; */ 2086 for (j = 0; j < N_RR_STACK; j++) { 2087 ctx->state[j].cfa_is_regoff = True; 2088 /* ctx->state[j].cfa_reg = 0; 2089 ctx->state[j].cfa_off = 0; 2090 ctx->state[j].cfa_expr_ix = 0; */ 2091 for (i = 0; i < N_CFI_REGS; i++) { 2092 if (RR_Undef != 0) 2093 ctx->state[j].reg[i].tag = RR_Undef; 2094 /* ctx->state[j].reg[i].arg = 0; */ 2095 } 2096# if defined(VGA_arm) 2097 /* All callee-saved registers (or at least the ones we are 2098 summarising for) should start out as RR_Same, on ARM. */ 2099 ctx->state[j].reg[11].tag = RR_Same; 2100 /* ctx->state[j].reg[13].tag = RR_Same; */ 2101 ctx->state[j].reg[14].tag = RR_Same; 2102 ctx->state[j].reg[12].tag = RR_Same; 2103 ctx->state[j].reg[7].tag = RR_Same; 2104 /* this can't be right though: R12 (IP) isn't callee saved. */ 2105# elif defined(VGA_arm64) 2106 /* Callee-saved registers (that we are interested in) should 2107 start out as RR_Same. */ 2108 ctx->state[j].reg[29/*FP*/].tag = RR_Same; 2109 ctx->state[j].reg[30/*LR*/].tag = RR_Same; 2110# endif 2111 } 2112} 2113 2114 2115/* A structure which holds information needed by read_encoded_Addr(). 2116*/ 2117typedef 2118 struct { 2119 UChar encoding; 2120 DiCursor ehframe_image; 2121 Addr ehframe_avma; 2122 Addr text_bias; 2123 } 2124 AddressDecodingInfo; 2125 2126 2127/* ------------ Deal with summary-info records ------------ */ 2128 2129static void initCfiSI ( DiCfSI* si ) 2130{ 2131 VG_(bzero_inline)(si, sizeof(*si)); 2132} 2133 2134 2135/* --------------- Summarisation --------------- */ 2136 2137/* Forward */ 2138static 2139Int copy_convert_CfiExpr_tree ( XArray* dst, 2140 UnwindContext* srcuc, 2141 Int nd ); 2142 2143/* Summarise ctx into si, if possible. Returns True if successful. 2144 This is taken to be just after ctx's loc advances; hence the 2145 summary is up to but not including the current loc. This works 2146 on both x86 and amd64. 2147*/ 2148static Bool summarise_context( /*OUT*/DiCfSI* si, 2149 Addr loc_start, 2150 UnwindContext* ctx, 2151 struct _DebugInfo* debuginfo ) 2152{ 2153 Int why = 0; 2154 struct UnwindContextState* ctxs; 2155 initCfiSI(si); 2156 2157 /* Guard against obviously stupid settings of the reg-rule stack 2158 pointer. */ 2159 if (ctx->state_sp < 0) { why = 8; goto failed; } 2160 if (ctx->state_sp >= N_RR_STACK) { why = 9; goto failed; } 2161 ctxs = &ctx->state[ctx->state_sp]; 2162 2163 /* First, summarise the method for generating the CFA */ 2164 if (!ctxs->cfa_is_regoff) { 2165 /* it was set by DW_CFA_def_cfa_expression; try to convert */ 2166 XArray *src, *dst; 2167 Int conv; 2168 src = ctx->exprs; 2169 dst = debuginfo->cfsi_exprs; 2170 if (src && (VG_(sizeXA)(src) > 0) && (!dst)) { 2171 dst = VG_(newXA)( ML_(dinfo_zalloc), "di.ccCt.1", ML_(dinfo_free), 2172 sizeof(CfiExpr) ); 2173 vg_assert(dst); 2174 debuginfo->cfsi_exprs = dst; 2175 } 2176 conv = copy_convert_CfiExpr_tree 2177 ( dst, ctx, ctxs->cfa_expr_ix ); 2178 vg_assert(conv >= -1); 2179 if (conv == -1) { why = 6; goto failed; } 2180 si->cfa_how = CFIC_EXPR; 2181 si->cfa_off = conv; 2182 if (0 && debuginfo->ddump_frames) 2183 ML_(ppCfiExpr)(dst, conv); 2184 } 2185 else 2186 if (ctxs->cfa_is_regoff && ctxs->cfa_reg == SP_REG) { 2187 si->cfa_off = ctxs->cfa_off; 2188# if defined(VGA_x86) || defined(VGA_amd64) || defined(VGA_s390x) \ 2189 || defined(VGA_mips32) || defined(VGA_mips64) 2190 si->cfa_how = CFIC_IA_SPREL; 2191# elif defined(VGA_arm) 2192 si->cfa_how = CFIC_ARM_R13REL; 2193# elif defined(VGA_arm64) 2194 si->cfa_how = CFIC_ARM64_SPREL; 2195# else 2196 si->cfa_how = 0; /* invalid */ 2197# endif 2198 } 2199 else 2200 if (ctxs->cfa_is_regoff && ctxs->cfa_reg == FP_REG) { 2201 si->cfa_off = ctxs->cfa_off; 2202# if defined(VGA_x86) || defined(VGA_amd64) || defined(VGA_s390x) \ 2203 || defined(VGA_mips32) || defined(VGA_mips64) 2204 si->cfa_how = CFIC_IA_BPREL; 2205# elif defined(VGA_arm) 2206 si->cfa_how = CFIC_ARM_R12REL; 2207# elif defined(VGA_arm64) 2208 si->cfa_how = CFIC_ARM64_X29REL; 2209# else 2210 si->cfa_how = 0; /* invalid */ 2211# endif 2212 } 2213# if defined(VGA_arm) 2214 else 2215 if (ctxs->cfa_is_regoff && ctxs->cfa_reg == 11/*??_REG*/) { 2216 si->cfa_how = CFIC_ARM_R11REL; 2217 si->cfa_off = ctxs->cfa_off; 2218 } 2219 else 2220 if (ctxs->cfa_is_regoff && ctxs->cfa_reg == 7/*??_REG*/) { 2221 si->cfa_how = CFIC_ARM_R7REL; 2222 si->cfa_off = ctxs->cfa_off; 2223 } 2224# elif defined(VGA_arm64) 2225 // do we need any arm64 specifics here? 2226# endif 2227 else { 2228 why = 1; 2229 goto failed; 2230 } 2231 2232# define SUMMARISE_HOW(_how, _off, _ctxreg) \ 2233 switch (_ctxreg.tag) { \ 2234 case RR_Undef: \ 2235 _how = CFIR_UNKNOWN; _off = 0; break; \ 2236 case RR_Same: \ 2237 _how = CFIR_SAME; _off = 0; break; \ 2238 case RR_CFAOff: \ 2239 _how = CFIR_MEMCFAREL; _off = _ctxreg.arg; break; \ 2240 case RR_CFAValOff: \ 2241 _how = CFIR_CFAREL; _off = _ctxreg.arg; break; \ 2242 case RR_ValExpr: { \ 2243 XArray *src, *dst; \ 2244 Int conv; \ 2245 src = ctx->exprs; \ 2246 dst = debuginfo->cfsi_exprs; \ 2247 if (src && (VG_(sizeXA)(src) > 0) && (!dst)) { \ 2248 dst = VG_(newXA)( ML_(dinfo_zalloc), \ 2249 "di.ccCt.2", \ 2250 ML_(dinfo_free), \ 2251 sizeof(CfiExpr) ); \ 2252 vg_assert(dst); \ 2253 debuginfo->cfsi_exprs = dst; \ 2254 } \ 2255 conv = copy_convert_CfiExpr_tree \ 2256 ( dst, ctx, _ctxreg.arg ); \ 2257 vg_assert(conv >= -1); \ 2258 if (conv == -1) { why = 7; goto failed; } \ 2259 _how = CFIR_EXPR; \ 2260 _off = conv; \ 2261 if (0 && debuginfo->ddump_frames) \ 2262 ML_(ppCfiExpr)(dst, conv); \ 2263 break; \ 2264 } \ 2265 default: \ 2266 why = 2; goto failed; /* otherwise give up */ \ 2267 } 2268 2269 2270# if defined(VGA_x86) || defined(VGA_amd64) 2271 2272 /* --- entire tail of this fn specialised for x86/amd64 --- */ 2273 2274 SUMMARISE_HOW(si->ra_how, si->ra_off, 2275 ctxs->reg[ctx->ra_reg] ); 2276 SUMMARISE_HOW(si->bp_how, si->bp_off, 2277 ctxs->reg[FP_REG] ); 2278 2279 /* on x86/amd64, it seems the old %{e,r}sp value before the call is 2280 always the same as the CFA. Therefore ... */ 2281 si->sp_how = CFIR_CFAREL; 2282 si->sp_off = 0; 2283 2284 /* also, gcc says "Undef" for %{e,r}bp when it is unchanged. So 2285 .. */ 2286 if (ctxs->reg[FP_REG].tag == RR_Undef) 2287 si->bp_how = CFIR_SAME; 2288 2289 /* knock out some obviously stupid cases */ 2290 if (si->ra_how == CFIR_SAME) 2291 { why = 3; goto failed; } 2292 2293 /* bogus looking range? Note, we require that the difference is 2294 representable in 32 bits. */ 2295 if (loc_start >= ctx->loc) 2296 { why = 4; goto failed; } 2297 if (ctx->loc - loc_start > 10000000 /* let's say */) 2298 { why = 5; goto failed; } 2299 2300 si->base = loc_start + ctx->initloc; 2301 si->len = (UInt)(ctx->loc - loc_start); 2302 2303 return True; 2304 2305# elif defined(VGA_arm) 2306 2307 /* ---- entire tail of this fn specialised for arm ---- */ 2308 2309 SUMMARISE_HOW(si->r14_how, si->r14_off, 2310 ctxs->reg[14] ); 2311 2312 //SUMMARISE_HOW(si->r13_how, si->r13_off, 2313 // ctxs->reg[13] ); 2314 2315 SUMMARISE_HOW(si->r12_how, si->r12_off, 2316 ctxs->reg[FP_REG] ); 2317 2318 SUMMARISE_HOW(si->r11_how, si->r11_off, 2319 ctxs->reg[11/*FP_REG*/] ); 2320 2321 SUMMARISE_HOW(si->r7_how, si->r7_off, 2322 ctxs->reg[7] ); 2323 2324 if (ctxs->reg[14/*LR*/].tag == RR_Same 2325 && ctx->ra_reg == 14/*as we expect it always to be*/) { 2326 /* Generate a trivial CfiExpr, which merely says "r14". First 2327 ensure this DebugInfo has a cfsi_expr array in which to park 2328 it. */ 2329 if (!debuginfo->cfsi_exprs) 2330 debuginfo->cfsi_exprs = VG_(newXA)( ML_(dinfo_zalloc), 2331 "di.ccCt.2a", 2332 ML_(dinfo_free), 2333 sizeof(CfiExpr) ); 2334 si->ra_off = ML_(CfiExpr_CfiReg)( debuginfo->cfsi_exprs, 2335 Creg_ARM_R14); 2336 si->ra_how = CFIR_EXPR; 2337 } else { 2338 /* Just summarise it in the normal way */ 2339 SUMMARISE_HOW(si->ra_how, si->ra_off, 2340 ctxs->reg[ctx->ra_reg] ); 2341 } 2342 2343 /* on arm, it seems the old r13 (SP) value before the call is 2344 always the same as the CFA. Therefore ... */ 2345 si->r13_how = CFIR_CFAREL; 2346 si->r13_off = 0; 2347 2348 /* bogus looking range? Note, we require that the difference is 2349 representable in 32 bits. */ 2350 if (loc_start >= ctx->loc) 2351 { why = 4; goto failed; } 2352 if (ctx->loc - loc_start > 10000000 /* let's say */) 2353 { why = 5; goto failed; } 2354 2355 si->base = loc_start + ctx->initloc; 2356 si->len = (UInt)(ctx->loc - loc_start); 2357 2358 return True; 2359 2360# elif defined(VGA_arm64) 2361 2362 /* --- entire tail of this fn specialised for arm64 --- */ 2363 2364 SUMMARISE_HOW(si->x30_how, si->x30_off, ctxs->reg[30/*LR*/]); 2365 SUMMARISE_HOW(si->x29_how, si->x29_off, ctxs->reg[29/*FP*/]); 2366 2367 if (ctxs->reg[30/*LR*/].tag == RR_Same 2368 && ctx->ra_reg == 30/*as we expect it always to be*/) { 2369 /* Generate a trivial CfiExpr, which merely says "x30". First 2370 ensure this DebugInfo has a cfsi_expr array in which to park 2371 it. */ 2372 if (!debuginfo->cfsi_exprs) 2373 debuginfo->cfsi_exprs = VG_(newXA)( ML_(dinfo_zalloc), 2374 "di.ccCt.2a-arm64", 2375 ML_(dinfo_free), 2376 sizeof(CfiExpr) ); 2377 si->ra_off = ML_(CfiExpr_CfiReg)( debuginfo->cfsi_exprs, 2378 Creg_ARM64_X30); 2379 si->ra_how = CFIR_EXPR; 2380 } else { 2381 /* Just summarise it in the normal way */ 2382 SUMMARISE_HOW(si->ra_how, si->ra_off, ctxs->reg[ctx->ra_reg]); 2383 } 2384 2385 /* on arm64, it seems the old SP value before the call is always 2386 the same as the CFA. Therefore ... */ 2387 si->sp_how = CFIR_CFAREL; 2388 si->sp_off = 0; 2389 2390 /* bogus looking range? Note, we require that the difference is 2391 representable in 32 bits. */ 2392 if (loc_start >= ctx->loc) 2393 { why = 4; goto failed; } 2394 if (ctx->loc - loc_start > 10000000 /* let's say */) 2395 { why = 5; goto failed; } 2396 2397 si->base = loc_start + ctx->initloc; 2398 si->len = (UInt)(ctx->loc - loc_start); 2399 2400 return True; 2401 2402# elif defined(VGA_s390x) 2403 2404 /* --- entire tail of this fn specialised for s390 --- */ 2405 2406 SUMMARISE_HOW(si->ra_how, si->ra_off, 2407 ctxs->reg[ctx->ra_reg] ); 2408 SUMMARISE_HOW(si->fp_how, si->fp_off, 2409 ctxs->reg[FP_REG] ); 2410 SUMMARISE_HOW(si->sp_how, si->sp_off, 2411 ctxs->reg[SP_REG] ); 2412 2413 /* change some defaults to consumable values */ 2414 if (si->sp_how == CFIR_UNKNOWN) 2415 si->sp_how = CFIR_SAME; 2416 2417 if (si->fp_how == CFIR_UNKNOWN) 2418 si->fp_how = CFIR_SAME; 2419 2420 if (si->cfa_how == CFIR_UNKNOWN) { 2421 si->cfa_how = CFIC_IA_SPREL; 2422 si->cfa_off = 160; 2423 } 2424 if (si->ra_how == CFIR_UNKNOWN) { 2425 if (!debuginfo->cfsi_exprs) 2426 debuginfo->cfsi_exprs = VG_(newXA)( ML_(dinfo_zalloc), 2427 "di.ccCt.2a", 2428 ML_(dinfo_free), 2429 sizeof(CfiExpr) ); 2430 si->ra_how = CFIR_EXPR; 2431 si->ra_off = ML_(CfiExpr_CfiReg)( debuginfo->cfsi_exprs, 2432 Creg_S390_R14); 2433 } 2434 2435 /* knock out some obviously stupid cases */ 2436 if (si->ra_how == CFIR_SAME) 2437 { why = 3; goto failed; } 2438 2439 /* bogus looking range? Note, we require that the difference is 2440 representable in 32 bits. */ 2441 if (loc_start >= ctx->loc) 2442 { why = 4; goto failed; } 2443 if (ctx->loc - loc_start > 10000000 /* let's say */) 2444 { why = 5; goto failed; } 2445 2446 si->base = loc_start + ctx->initloc; 2447 si->len = (UInt)(ctx->loc - loc_start); 2448 2449 return True; 2450 2451# elif defined(VGA_mips32) || defined(VGA_mips64) 2452 2453 /* --- entire tail of this fn specialised for mips --- */ 2454 2455 SUMMARISE_HOW(si->ra_how, si->ra_off, 2456 ctxs->reg[ctx->ra_reg] ); 2457 SUMMARISE_HOW(si->fp_how, si->fp_off, 2458 ctxs->reg[FP_REG] ); 2459 SUMMARISE_HOW(si->sp_how, si->sp_off, 2460 ctxs->reg[SP_REG] ); 2461 si->sp_how = CFIR_CFAREL; 2462 si->sp_off = 0; 2463 2464 if (si->fp_how == CFIR_UNKNOWN) 2465 si->fp_how = CFIR_SAME; 2466 if (si->cfa_how == CFIR_UNKNOWN) { 2467 si->cfa_how = CFIC_IA_SPREL; 2468 si->cfa_off = 160; 2469 } 2470 if (si->ra_how == CFIR_UNKNOWN) { 2471 if (!debuginfo->cfsi_exprs) 2472 debuginfo->cfsi_exprs = VG_(newXA)( ML_(dinfo_zalloc), 2473 "di.ccCt.2a", 2474 ML_(dinfo_free), 2475 sizeof(CfiExpr) ); 2476 si->ra_how = CFIR_EXPR; 2477 si->ra_off = ML_(CfiExpr_CfiReg)( debuginfo->cfsi_exprs, 2478 Creg_MIPS_RA); 2479 } 2480 2481 if (si->ra_how == CFIR_SAME) 2482 { why = 3; goto failed; } 2483 2484 if (loc_start >= ctx->loc) 2485 { why = 4; goto failed; } 2486 if (ctx->loc - loc_start > 10000000 /* let's say */) 2487 { why = 5; goto failed; } 2488 2489 si->base = loc_start + ctx->initloc; 2490 si->len = (UInt)(ctx->loc - loc_start); 2491 2492 return True; 2493 2494# elif defined(VGA_ppc32) || defined(VGA_ppc64) 2495 /* These don't use CFI based unwinding (is that really true?) */ 2496 2497# else 2498# error "Unknown arch" 2499# endif 2500 2501 /* --- non-specialised code after this point --- */ 2502 2503# undef SUMMARISE_HOW 2504 2505 failed: 2506 if (VG_(clo_verbosity) > 2 || debuginfo->trace_cfi) { 2507 VG_(message)(Vg_DebugMsg, 2508 "summarise_context(loc_start = %#lx)" 2509 ": cannot summarise(why=%d): \n", loc_start, why); 2510 ppUnwindContext(ctx); 2511 } 2512 return False; 2513} 2514 2515/* Copy the tree rooted at srcuc->exprs node srcix to dstxa, on the 2516 way converting any DwReg regs (regs numbered using the Dwarf scheme 2517 defined by each architecture's ABI) into CfiRegs, which are 2518 platform independent. If the conversion isn't possible because 2519 there is no equivalent register, return -1. This has the 2520 undesirable side effect of de-dagifying the input; oh well. */ 2521static Int copy_convert_CfiExpr_tree ( XArray* dstxa, 2522 UnwindContext* srcuc, 2523 Int srcix ) 2524{ 2525 CfiExpr* src; 2526 Int cpL, cpR, cpA; 2527 XArray* srcxa = srcuc->exprs; 2528 vg_assert(srcxa); 2529 vg_assert(dstxa); 2530 vg_assert(srcix >= 0 && srcix < VG_(sizeXA)(srcxa)); 2531 2532 src = VG_(indexXA)( srcxa, srcix ); 2533 switch (src->tag) { 2534 case Cex_Undef: 2535 return ML_(CfiExpr_Undef)( dstxa ); 2536 case Cex_Deref: 2537 cpA = copy_convert_CfiExpr_tree( dstxa, srcuc, src->Cex.Deref.ixAddr ); 2538 if (cpA == -1) 2539 return -1; /* propagate failure */ 2540 return ML_(CfiExpr_Deref)( dstxa, cpA ); 2541 case Cex_Const: 2542 return ML_(CfiExpr_Const)( dstxa, src->Cex.Const.con ); 2543 case Cex_Binop: 2544 cpL = copy_convert_CfiExpr_tree( dstxa, srcuc, src->Cex.Binop.ixL ); 2545 cpR = copy_convert_CfiExpr_tree( dstxa, srcuc, src->Cex.Binop.ixR ); 2546 vg_assert(cpL >= -1 && cpR >= -1); 2547 if (cpL == -1 || cpR == -1) 2548 return -1; /* propagate failure */ 2549 return ML_(CfiExpr_Binop)( dstxa, src->Cex.Binop.op, cpL, cpR ); 2550 case Cex_CfiReg: 2551 /* should not see these in input (are created only by this 2552 conversion step!) */ 2553 VG_(core_panic)("copy_convert_CfiExpr_tree: CfiReg in input"); 2554 case Cex_DwReg: { 2555 /* This is the only place where the conversion can fail. */ 2556 Int dwreg __attribute__((unused)); 2557 dwreg = src->Cex.DwReg.reg; 2558# if defined(VGA_x86) || defined(VGA_amd64) 2559 if (dwreg == SP_REG) 2560 return ML_(CfiExpr_CfiReg)( dstxa, Creg_IA_SP ); 2561 if (dwreg == FP_REG) 2562 return ML_(CfiExpr_CfiReg)( dstxa, Creg_IA_BP ); 2563 if (dwreg == srcuc->ra_reg) 2564 return ML_(CfiExpr_CfiReg)( dstxa, Creg_IA_IP ); /* correct? */ 2565# elif defined(VGA_arm) 2566 if (dwreg == SP_REG) 2567 return ML_(CfiExpr_CfiReg)( dstxa, Creg_ARM_R13 ); 2568 if (dwreg == FP_REG) 2569 return ML_(CfiExpr_CfiReg)( dstxa, Creg_ARM_R12 ); 2570 if (dwreg == srcuc->ra_reg) 2571 return ML_(CfiExpr_CfiReg)( dstxa, Creg_ARM_R15 ); /* correct? */ 2572# elif defined(VGA_s390x) 2573 if (dwreg == SP_REG) 2574 return ML_(CfiExpr_CfiReg)( dstxa, Creg_IA_SP ); 2575 if (dwreg == FP_REG) 2576 return ML_(CfiExpr_CfiReg)( dstxa, Creg_IA_BP ); 2577 if (dwreg == srcuc->ra_reg) 2578 return ML_(CfiExpr_CfiReg)( dstxa, Creg_IA_IP ); /* correct? */ 2579# elif defined(VGA_mips32) || defined(VGA_mips64) 2580 if (dwreg == SP_REG) 2581 return ML_(CfiExpr_CfiReg)( dstxa, Creg_IA_SP ); 2582 if (dwreg == FP_REG) 2583 return ML_(CfiExpr_CfiReg)( dstxa, Creg_IA_BP ); 2584 if (dwreg == srcuc->ra_reg) 2585 return ML_(CfiExpr_CfiReg)( dstxa, Creg_IA_IP ); 2586# elif defined(VGA_arm64) 2587 I_die_here; 2588# elif defined(VGA_ppc32) || defined(VGA_ppc64) 2589# else 2590# error "Unknown arch" 2591# endif 2592 /* else we must fail - can't represent the reg */ 2593 return -1; 2594 } 2595 default: 2596 VG_(core_panic)("copy_convert_CfiExpr_tree: default"); 2597 } 2598} 2599 2600 2601static void ppUnwindContext_summary ( UnwindContext* ctx ) 2602{ 2603 struct UnwindContextState* ctxs = &ctx->state[ctx->state_sp]; 2604 2605 VG_(printf)("0x%llx-1: ", (ULong)ctx->loc); 2606 2607 if (ctxs->cfa_reg == SP_REG) { 2608 VG_(printf)("SP/CFA=%d+SP ", ctxs->cfa_off); 2609 } else 2610 if (ctxs->cfa_reg == FP_REG) { 2611 VG_(printf)("SP/CFA=%d+FP ", ctxs->cfa_off); 2612 } else { 2613 VG_(printf)("SP/CFA=unknown "); 2614 } 2615 2616 VG_(printf)("RA="); 2617 ppRegRule( ctx->exprs, &ctxs->reg[ctx->ra_reg] ); 2618 2619 VG_(printf)("FP="); 2620 ppRegRule( ctx->exprs, &ctxs->reg[FP_REG] ); 2621 VG_(printf)("\n"); 2622} 2623 2624 2625/* ------------ Pick apart DWARF2 byte streams ------------ */ 2626 2627static ULong step_le_u_encoded_literal ( DiCursor* data, UInt size ) 2628{ 2629 switch (size) { 2630 case 8: return (ULong)ML_(cur_step_ULong)( data ); 2631 case 4: return (ULong)ML_(cur_step_UInt)( data ); 2632 case 2: return (ULong)ML_(cur_step_UShort)( data ); 2633 case 1: return (ULong)ML_(cur_step_UChar)( data ); 2634 default: vg_assert(0); /*NOTREACHED*/ return 0; 2635 } 2636} 2637 2638static Long step_le_s_encoded_literal ( DiCursor* data, UInt size ) 2639{ 2640 Long s64 = step_le_u_encoded_literal( data, size ); 2641 switch (size) { 2642 case 8: break; 2643 case 4: s64 <<= 32; s64 >>= 32; break; 2644 case 2: s64 <<= 48; s64 >>= 48; break; 2645 case 1: s64 <<= 56; s64 >>= 56; break; 2646 default: vg_assert(0); /*NOTREACHED*/ return 0; 2647 } 2648 return s64; 2649} 2650 2651static UChar default_Addr_encoding ( void ) 2652{ 2653 switch (sizeof(Addr)) { 2654 case 4: return DW_EH_PE_udata4; 2655 case 8: return DW_EH_PE_udata8; 2656 default: vg_assert(0); 2657 } 2658} 2659 2660static UInt size_of_encoded_Addr ( UChar encoding ) 2661{ 2662 if (encoding == DW_EH_PE_omit) 2663 return 0; 2664 2665 switch (encoding & 0x07) { 2666 case DW_EH_PE_absptr: return sizeof(Addr); 2667 case DW_EH_PE_udata2: return sizeof(UShort); 2668 case DW_EH_PE_udata4: return sizeof(UInt); 2669 case DW_EH_PE_udata8: return sizeof(ULong); 2670 default: vg_assert(0); 2671 } 2672} 2673 2674static Addr step_encoded_Addr ( AddressDecodingInfo* adi, 2675 /*MOD*/DiCursor* data ) 2676{ 2677 /* Regarding the handling of DW_EH_PE_absptr. DWARF3 says this 2678 denotes an absolute address, hence you would think 'base' is 2679 zero. However, that is nonsensical (unless relocations are to 2680 be applied to the unwind data before reading it, which sounds 2681 unlikely). My interpretation is that DW_EH_PE_absptr indicates 2682 an address relative to where the object was loaded (technically, 2683 relative to its stated load VMA, hence the use of text_bias 2684 rather than text_avma). Hmm, should we use text_bias or 2685 text_avma here? Not sure. 2686 2687 This view appears to be supported by DWARF3 spec sec 7.3 2688 "Executable Objects and Shared Objects": 2689 2690 This requirement makes the debugging information for shared 2691 objects position independent. Virtual addresses in a shared 2692 object may be calculated by adding the offset to the base 2693 address at which the object was attached. This offset is 2694 available in the run-time linker's data structures. 2695 */ 2696 Addr base; 2697 Word offset; 2698 UChar encoding = adi->encoding; 2699 DiCursor ehframe_image = adi->ehframe_image; 2700 Addr ehframe_avma = adi->ehframe_avma; 2701 2702 vg_assert((encoding & DW_EH_PE_indirect) == 0); 2703 2704 switch (encoding & 0x70) { 2705 case DW_EH_PE_absptr: 2706 base = adi->text_bias; 2707 break; 2708 case DW_EH_PE_pcrel: 2709 base = ehframe_avma + ML_(cur_minus)(*data, ehframe_image); 2710 break; 2711 case DW_EH_PE_datarel: 2712 vg_assert(0); 2713 base = /* data base address */ 0; 2714 break; 2715 case DW_EH_PE_textrel: 2716 vg_assert(0); 2717 base = /* text base address */ 0; 2718 break; 2719 case DW_EH_PE_funcrel: 2720 base = 0; 2721 break; 2722 case DW_EH_PE_aligned: 2723 base = 0; 2724 offset = ML_(cur_minus)(*data, ehframe_image); 2725 if ((offset % sizeof(Addr)) != 0) { 2726 Word nbytes = sizeof(Addr) - (offset % sizeof(Addr)); 2727 *data = ML_(cur_plus)(*data, nbytes); 2728 } 2729 break; 2730 default: 2731 vg_assert(0); 2732 } 2733 2734 if ((encoding & 0x07) == 0x00) 2735 encoding |= default_Addr_encoding(); 2736 2737 switch (encoding & 0x0f) { 2738 case DW_EH_PE_udata2: 2739 return base + ML_(cur_step_UShort)(data); 2740 case DW_EH_PE_udata4: 2741 return base + ML_(cur_step_UInt)(data); 2742 case DW_EH_PE_udata8: 2743 return base + ML_(cur_step_ULong)(data); 2744 case DW_EH_PE_sdata2: 2745 return base + ML_(cur_step_Short)(data); 2746 case DW_EH_PE_sdata4: 2747 return base + ML_(cur_step_Int)(data); 2748 case DW_EH_PE_sdata8: 2749 return base + ML_(cur_step_Long)(data); 2750 default: 2751 vg_assert2(0, "read encoded address %d\n", encoding & 0x0f); 2752 } 2753} 2754 2755 2756/* ------------ Run/show DWARF3 expressions ---------- */ 2757 2758/* Convert the DWARF3 expression in expr[0 .. exprlen-1] into a dag 2759 (of CfiExprs) stored in ctx->exprs, and return the index in 2760 ctx->exprs of the root node. Or fail in which case return -1. */ 2761/* IMPORTANT: when adding expression forms here, also remember to 2762 add suitable evaluation code in evalCfiExpr in debuginfo.c. */ 2763static Int dwarfexpr_to_dag ( UnwindContext* ctx, 2764 DiCursor expr, Int exprlen, 2765 Bool push_cfa_at_start, 2766 Bool ddump_frames ) 2767{ 2768# define N_EXPR_STACK 20 2769 2770# define PUSH(_arg) \ 2771 do { \ 2772 vg_assert(sp >= -1 && sp < N_EXPR_STACK); \ 2773 if (sp == N_EXPR_STACK-1) \ 2774 return -1; \ 2775 sp++; \ 2776 stack[sp] = (_arg); \ 2777 } while (0) 2778 2779# define POP(_lval) \ 2780 do { \ 2781 vg_assert(sp >= -1 && sp < N_EXPR_STACK); \ 2782 if (sp == -1) \ 2783 return -1; \ 2784 _lval = stack[sp]; \ 2785 sp--; \ 2786 } while (0) 2787 2788 Int ix, ix2, reg; 2789 UChar opcode; 2790 Word sw; 2791 UWord uw; 2792 CfiUnop uop; 2793 CfiBinop bop; 2794 const HChar* opname; 2795 2796 Int sp; /* # of top element: valid is -1 .. N_EXPR_STACK-1 */ 2797 Int stack[N_EXPR_STACK]; /* indices into ctx->exprs */ 2798 struct UnwindContextState* ctxs = &ctx->state[ctx->state_sp]; 2799 2800 XArray* dst = ctx->exprs; 2801 DiCursor limit = ML_(cur_plus)(expr, exprlen); 2802 2803 vg_assert(dst); 2804 vg_assert(exprlen >= 0); 2805 2806 sp = -1; /* empty */ 2807 2808 /* Synthesise the CFA as a CfiExpr */ 2809 if (push_cfa_at_start) { 2810 if (ctxs->cfa_is_regoff) { 2811 /* cfa is reg +/- offset */ 2812 ix = ML_(CfiExpr_Binop)( dst, 2813 Cbinop_Add, 2814 ML_(CfiExpr_DwReg)( dst, ctxs->cfa_reg ), 2815 ML_(CfiExpr_Const)( dst, (UWord)(Word)ctxs->cfa_off ) 2816 ); 2817 PUSH(ix); 2818 } else { 2819 /* CFA is already an expr; use its root node */ 2820 PUSH(ctxs->cfa_expr_ix); 2821 } 2822 } 2823 2824 while (True) { 2825 2826 vg_assert(sp >= -1 && sp < N_EXPR_STACK); 2827 2828 if (ML_(cur_cmpGT)(expr, limit)) /* "expr > limit" */ 2829 return -1; /* overrun - something's wrong */ 2830 2831 if (ML_(cur_cmpEQ)(expr, limit)) { /* "expr == limit" */ 2832 /* end of expr - return expr on the top of stack. */ 2833 if (sp == -1) 2834 return -1; /* stack empty. Bad. */ 2835 else 2836 break; 2837 } 2838 2839 uop = 0; bop = 0; opname = NULL; /* excessively conservative */ 2840 2841 opcode = ML_(cur_step_UChar)(&expr); 2842 switch (opcode) { 2843 2844 case DW_OP_lit0 ... DW_OP_lit31: 2845 /* push: literal 0 .. 31 */ 2846 sw = (Word)opcode - (Word)DW_OP_lit0; 2847 vg_assert(sw >= 0 && sw <= 31); 2848 PUSH( ML_(CfiExpr_Const)( dst, (UWord)sw ) ); 2849 if (ddump_frames) 2850 VG_(printf)("DW_OP_lit%ld", sw); 2851 break; 2852 2853 case DW_OP_breg0 ... DW_OP_breg31: 2854 /* push: reg + sleb128 */ 2855 reg = (Int)opcode - (Int)DW_OP_breg0; 2856 vg_assert(reg >= 0 && reg <= 31); 2857 sw = step_leb128S( &expr ); 2858 ix = ML_(CfiExpr_Binop)( dst, 2859 Cbinop_Add, 2860 ML_(CfiExpr_DwReg)( dst, reg ), 2861 ML_(CfiExpr_Const)( dst, (UWord)sw ) 2862 ); 2863 PUSH(ix); 2864 if (ddump_frames) 2865 VG_(printf)("DW_OP_breg%d: %ld", reg, sw); 2866 break; 2867 2868 case DW_OP_reg0 ... DW_OP_reg31: 2869 /* push: reg */ 2870 reg = (Int)opcode - (Int)DW_OP_reg0; 2871 vg_assert(reg >= 0 && reg <= 31); 2872 ix = ML_(CfiExpr_DwReg)( dst, reg ); 2873 PUSH(ix); 2874 if (ddump_frames) 2875 VG_(printf)("DW_OP_reg%d", reg); 2876 break; 2877 2878 case DW_OP_plus_uconst: 2879 uw = step_leb128U( &expr ); 2880 PUSH( ML_(CfiExpr_Const)( dst, uw ) ); 2881 POP( ix ); 2882 POP( ix2 ); 2883 PUSH( ML_(CfiExpr_Binop)( dst, Cbinop_Add, ix2, ix ) ); 2884 if (ddump_frames) 2885 VG_(printf)("DW_OP_plus_uconst: %lu", uw); 2886 break; 2887 2888 case DW_OP_const4s: 2889 /* push: 32-bit signed immediate */ 2890 sw = step_le_s_encoded_literal( &expr, 4 ); 2891 PUSH( ML_(CfiExpr_Const)( dst, (UWord)sw ) ); 2892 if (ddump_frames) 2893 VG_(printf)("DW_OP_const4s: %ld", sw); 2894 break; 2895 2896 case DW_OP_const2s: 2897 /* push: 16-bit signed immediate */ 2898 sw = step_le_s_encoded_literal( &expr, 2 ); 2899 PUSH( ML_(CfiExpr_Const)( dst, (UWord)sw ) ); 2900 if (ddump_frames) 2901 VG_(printf)("DW_OP_const2s: %ld", sw); 2902 break; 2903 2904 case DW_OP_const1s: 2905 /* push: 8-bit signed immediate */ 2906 sw = step_le_s_encoded_literal( &expr, 1 ); 2907 PUSH( ML_(CfiExpr_Const)( dst, (UWord)sw ) ); 2908 if (ddump_frames) 2909 VG_(printf)("DW_OP_const1s: %ld", sw); 2910 break; 2911 2912 case DW_OP_const1u: 2913 /* push: 8-bit unsigned immediate */ 2914 uw = step_le_u_encoded_literal( &expr, 1 ); 2915 PUSH( ML_(CfiExpr_Const)( dst, uw ) ); 2916 if (ddump_frames) 2917 VG_(printf)("DW_OP_const1: %lu", uw); 2918 break; 2919 2920 case DW_OP_const2u: 2921 /* push: 16-bit unsigned immediate */ 2922 uw = step_le_u_encoded_literal( &expr, 2 ); 2923 PUSH( ML_(CfiExpr_Const)( dst, uw ) ); 2924 if (ddump_frames) 2925 VG_(printf)("DW_OP_const2: %lu", uw); 2926 break; 2927 2928 case DW_OP_const4u: 2929 /* push: 32-bit unsigned immediate */ 2930 uw = step_le_u_encoded_literal( &expr, 4 ); 2931 PUSH( ML_(CfiExpr_Const)( dst, uw ) ); 2932 if (ddump_frames) 2933 VG_(printf)("DW_OP_const4: %lu", uw); 2934 break; 2935 2936 case DW_OP_abs: 2937 uop = Cunop_Abs; opname = "abs"; goto unop; 2938 case DW_OP_neg: 2939 uop = Cunop_Neg; opname = "neg"; goto unop; 2940 case DW_OP_not: 2941 uop = Cunop_Not; opname = "not"; goto unop; 2942 unop: 2943 POP( ix ); 2944 PUSH( ML_(CfiExpr_Unop)( dst, uop, ix ) ); 2945 if (ddump_frames) 2946 VG_(printf)("DW_OP_%s", opname); 2947 break; 2948 2949 case DW_OP_minus: 2950 bop = Cbinop_Sub; opname = "minus"; goto binop; 2951 case DW_OP_plus: 2952 bop = Cbinop_Add; opname = "plus"; goto binop; 2953 case DW_OP_and: 2954 bop = Cbinop_And; opname = "and"; goto binop; 2955 case DW_OP_mul: 2956 bop = Cbinop_Mul; opname = "mul"; goto binop; 2957 case DW_OP_shl: 2958 bop = Cbinop_Shl; opname = "shl"; goto binop; 2959 case DW_OP_shr: 2960 bop = Cbinop_Shr; opname = "shr"; goto binop; 2961 case DW_OP_eq: 2962 bop = Cbinop_Eq; opname = "eq"; goto binop; 2963 case DW_OP_ge: 2964 bop = Cbinop_Ge; opname = "ge"; goto binop; 2965 case DW_OP_gt: 2966 bop = Cbinop_Gt; opname = "gt"; goto binop; 2967 case DW_OP_le: 2968 bop = Cbinop_Le; opname = "le"; goto binop; 2969 case DW_OP_lt: 2970 bop = Cbinop_Lt; opname = "lt"; goto binop; 2971 case DW_OP_ne: 2972 bop = Cbinop_Ne; opname = "ne"; goto binop; 2973 binop: 2974 POP( ix ); 2975 POP( ix2 ); 2976 PUSH( ML_(CfiExpr_Binop)( dst, bop, ix2, ix ) ); 2977 if (ddump_frames) 2978 VG_(printf)("DW_OP_%s", opname); 2979 break; 2980 2981 case DW_OP_deref: 2982 POP( ix ); 2983 PUSH( ML_(CfiExpr_Deref)( dst, ix ) ); 2984 if (ddump_frames) 2985 VG_(printf)("DW_OP_deref"); 2986 break; 2987 2988 default: 2989 if (!VG_(clo_xml)) 2990 VG_(message)(Vg_DebugMsg, 2991 "Warning: DWARF2 CFI reader: unhandled DW_OP_ " 2992 "opcode 0x%x\n", (Int)opcode); 2993 return -1; 2994 } 2995 2996 if (ML_(cur_cmpLT)(expr, limit) && ddump_frames) 2997 VG_(printf)("; "); 2998 2999 } 3000 3001 vg_assert(sp >= -1 && sp < N_EXPR_STACK); 3002 if (sp == -1) 3003 return -1; 3004 3005 if (0 && ddump_frames) 3006 ML_(ppCfiExpr)( dst, stack[sp] ); 3007 return stack[sp]; 3008 3009# undef POP 3010# undef PUSH 3011# undef N_EXPR_STACK 3012} 3013 3014 3015/* ------------ Run/show CFI instructions ------------ */ 3016 3017/* Run a CFI instruction, and also return its length. 3018 Returns 0 if the instruction could not be executed. 3019*/ 3020static Int run_CF_instruction ( /*MOD*/UnwindContext* ctx, 3021 DiCursor instrIN, 3022 UnwindContext* restore_ctx, 3023 AddressDecodingInfo* adi, 3024 struct _DebugInfo* di ) 3025{ 3026 Int off, reg, reg2, len, j; 3027 UInt delta; 3028 Addr printing_bias = ((Addr)ctx->initloc) - ((Addr)di->text_bias); 3029 struct UnwindContextState* ctxs; 3030 3031 DiCursor instr = instrIN; 3032 UChar instr_0 = ML_(cur_step_UChar)(&instr); 3033 UChar hi2 = (instr_0 >> 6) & 3; 3034 UChar lo6 = instr_0 & 0x3F; 3035 3036 if (ctx->state_sp < 0 || ctx->state_sp >= N_RR_STACK) 3037 return 0; /* bogus reg-rule stack pointer */ 3038 3039 ctxs = &ctx->state[ctx->state_sp]; 3040 if (hi2 == DW_CFA_advance_loc) { 3041 delta = (UInt)lo6; 3042 delta *= ctx->code_a_f; 3043 ctx->loc += delta; 3044 if (di->ddump_frames) 3045 VG_(printf)(" DW_CFA_advance_loc: %d to %08lx\n", 3046 (Int)delta, (Addr)ctx->loc + printing_bias); 3047 return ML_(cur_minus)(instr, instrIN); 3048 } 3049 3050 if (hi2 == DW_CFA_offset) { 3051 /* Set rule for reg 'lo6' to CFAOff(off * data_af) */ 3052 off = step_leb128( &instr, 0 ); 3053 reg = (Int)lo6; 3054 if (reg < 0 || reg >= N_CFI_REGS) 3055 return 0; /* fail */ 3056 ctxs->reg[reg].tag = RR_CFAOff; 3057 ctxs->reg[reg].arg = off * ctx->data_a_f; 3058 if (di->ddump_frames) 3059 VG_(printf)(" DW_CFA_offset: r%d at cfa%s%d\n", 3060 (Int)reg, 3061 ctxs->reg[reg].arg < 0 ? "" : "+", 3062 (Int)ctxs->reg[reg].arg ); 3063 return ML_(cur_minus)(instr, instrIN); 3064 } 3065 3066 if (hi2 == DW_CFA_restore) { 3067 reg = (Int)lo6; 3068 if (reg < 0 || reg >= N_CFI_REGS) 3069 return 0; /* fail */ 3070 if (restore_ctx == NULL) 3071 return 0; /* fail */ 3072 ctxs->reg[reg] = restore_ctx->state[restore_ctx->state_sp].reg[reg]; 3073 if (di->ddump_frames) 3074 VG_(printf)(" DW_CFA_restore: r%d\n", (Int)reg); 3075 return ML_(cur_minus)(instr, instrIN); 3076 } 3077 3078 vg_assert(hi2 == DW_CFA_use_secondary); 3079 3080 switch (lo6) { 3081 case DW_CFA_nop: 3082 if (di->ddump_frames) 3083 VG_(printf)(" DW_CFA_nop\n"); 3084 break; 3085 case DW_CFA_set_loc: 3086 /* WAS: 3087 ctx->loc = read_Addr(&instr[i]) - ctx->initloc; i+= sizeof(Addr); 3088 Was this ever right? */ 3089 /* 2007 Feb 23: No. binutils/dwarf.c treats it as an encoded 3090 address and that appears to be in accordance with the 3091 DWARF3 spec. */ 3092 ctx->loc = step_encoded_Addr(adi, &instr); 3093 if (di->ddump_frames) 3094 VG_(printf)(" rci:DW_CFA_set_loc\n"); 3095 break; 3096 case DW_CFA_advance_loc1: 3097 delta = (UInt)ML_(cur_step_UChar)(&instr); 3098 delta *= ctx->code_a_f; 3099 ctx->loc += delta; 3100 if (di->ddump_frames) 3101 VG_(printf)(" DW_CFA_advance_loc1: %d to %08lx\n", 3102 (Int)delta, (Addr)ctx->loc + printing_bias); 3103 break; 3104 case DW_CFA_advance_loc2: 3105 delta = (UInt)ML_(cur_step_UShort)(&instr); 3106 delta *= ctx->code_a_f; 3107 ctx->loc += delta; 3108 if (di->ddump_frames) 3109 VG_(printf)(" DW_CFA_advance_loc2: %d to %08lx\n", 3110 (Int)delta, (Addr)ctx->loc + printing_bias); 3111 break; 3112 case DW_CFA_advance_loc4: 3113 delta = (UInt)ML_(cur_step_UInt)(&instr); 3114 delta *= ctx->code_a_f; 3115 ctx->loc += delta; 3116 if (di->ddump_frames) 3117 VG_(printf)(" DW_CFA_advance_loc4: %d to %08lx\n", 3118 (Int)delta, (Addr)ctx->loc + printing_bias); 3119 break; 3120 3121 case DW_CFA_def_cfa: 3122 reg = step_leb128( &instr, 0 ); 3123 off = step_leb128( &instr, 0 ); 3124 if (reg < 0 || reg >= N_CFI_REGS) 3125 return 0; /* fail */ 3126 ctxs->cfa_is_regoff = True; 3127 ctxs->cfa_expr_ix = 0; 3128 ctxs->cfa_reg = reg; 3129 ctxs->cfa_off = off; 3130 if (di->ddump_frames) 3131 VG_(printf)(" DW_CFA_def_cfa: r%d ofs %d\n", (Int)reg, (Int)off); 3132 break; 3133 3134 case DW_CFA_def_cfa_sf: 3135 reg = step_leb128( &instr, 0 ); 3136 off = step_leb128( &instr, 1 ); 3137 if (reg < 0 || reg >= N_CFI_REGS) 3138 return 0; /* fail */ 3139 ctxs->cfa_is_regoff = True; 3140 ctxs->cfa_expr_ix = 0; 3141 ctxs->cfa_reg = reg; 3142 ctxs->cfa_off = off * ctx->data_a_f; 3143 if (di->ddump_frames) 3144 VG_(printf)(" rci:DW_CFA_def_cfa_sf\n"); 3145 break; 3146 3147 case DW_CFA_register: 3148 reg = step_leb128( &instr, 0 ); 3149 reg2 = step_leb128( &instr, 0 ); 3150 if (reg < 0 || reg >= N_CFI_REGS) 3151 return 0; /* fail */ 3152 if (reg2 < 0 || reg2 >= N_CFI_REGS) 3153 return 0; /* fail */ 3154 ctxs->reg[reg].tag = RR_Reg; 3155 ctxs->reg[reg].arg = reg2; 3156 if (di->ddump_frames) 3157 VG_(printf)(" DW_CFA_register: r%d in r%d\n", 3158 (Int)reg, (Int)reg2); 3159 break; 3160 3161 case DW_CFA_offset_extended: 3162 reg = step_leb128( &instr, 0 ); 3163 off = step_leb128( &instr, 0 ); 3164 if (reg < 0 || reg >= N_CFI_REGS) 3165 return 0; /* fail */ 3166 ctxs->reg[reg].tag = RR_CFAOff; 3167 ctxs->reg[reg].arg = off * ctx->data_a_f; 3168 if (di->ddump_frames) 3169 VG_(printf)(" rci:DW_CFA_offset_extended\n"); 3170 break; 3171 3172 case DW_CFA_offset_extended_sf: 3173 reg = step_leb128( &instr, 0 ); 3174 off = step_leb128( &instr, 1 ); 3175 if (reg < 0 || reg >= N_CFI_REGS) 3176 return 0; /* fail */ 3177 ctxs->reg[reg].tag = RR_CFAOff; 3178 ctxs->reg[reg].arg = off * ctx->data_a_f; 3179 if (di->ddump_frames) 3180 VG_(printf)(" DW_CFA_offset_extended_sf: r%d at cfa%s%d\n", 3181 reg, 3182 ctxs->reg[reg].arg < 0 ? "" : "+", 3183 (Int)ctxs->reg[reg].arg); 3184 break; 3185 3186 case DW_CFA_GNU_negative_offset_extended: 3187 reg = step_leb128( &instr, 0 ); 3188 off = step_leb128( &instr, 0 ); 3189 if (reg < 0 || reg >= N_CFI_REGS) 3190 return 0; /* fail */ 3191 ctxs->reg[reg].tag = RR_CFAOff; 3192 ctxs->reg[reg].arg = (-off) * ctx->data_a_f; 3193 if (di->ddump_frames) 3194 VG_(printf)(" rci:DW_CFA_GNU_negative_offset_extended\n"); 3195 break; 3196 3197 case DW_CFA_restore_extended: 3198 reg = step_leb128( &instr, 0 ); 3199 if (reg < 0 || reg >= N_CFI_REGS) 3200 return 0; /* fail */ 3201 if (restore_ctx == NULL) 3202 return 0; /* fail */ 3203 ctxs->reg[reg] = restore_ctx->state[restore_ctx->state_sp].reg[reg]; 3204 if (di->ddump_frames) 3205 VG_(printf)(" rci:DW_CFA_restore_extended\n"); 3206 break; 3207 3208 case DW_CFA_val_offset: 3209 reg = step_leb128( &instr, 0 ); 3210 off = step_leb128( &instr, 0 ); 3211 if (reg < 0 || reg >= N_CFI_REGS) 3212 return 0; /* fail */ 3213 ctxs->reg[reg].tag = RR_CFAValOff; 3214 ctxs->reg[reg].arg = off * ctx->data_a_f; 3215 if (di->ddump_frames) 3216 VG_(printf)(" rci:DW_CFA_val_offset\n"); 3217 break; 3218 3219 case DW_CFA_val_offset_sf: 3220 reg = step_leb128( &instr, 0 ); 3221 off = step_leb128( &instr, 1 ); 3222 if (reg < 0 || reg >= N_CFI_REGS) 3223 return 0; /* fail */ 3224 ctxs->reg[reg].tag = RR_CFAValOff; 3225 ctxs->reg[reg].arg = off * ctx->data_a_f; 3226 if (di->ddump_frames) 3227 VG_(printf)(" rci:DW_CFA_val_offset_sf\n"); 3228 break; 3229 3230 case DW_CFA_def_cfa_register: 3231 reg = step_leb128( &instr, 0); 3232 if (reg < 0 || reg >= N_CFI_REGS) 3233 return 0; /* fail */ 3234 ctxs->cfa_is_regoff = True; 3235 ctxs->cfa_expr_ix = 0; 3236 ctxs->cfa_reg = reg; 3237 /* ->cfa_off unchanged */ 3238 if (di->ddump_frames) 3239 VG_(printf)(" DW_CFA_def_cfa_register: r%d\n", (Int)reg ); 3240 break; 3241 3242 case DW_CFA_def_cfa_offset: 3243 off = step_leb128( &instr, 0); 3244 ctxs->cfa_is_regoff = True; 3245 ctxs->cfa_expr_ix = 0; 3246 /* ->reg is unchanged */ 3247 ctxs->cfa_off = off; 3248 if (di->ddump_frames) 3249 VG_(printf)(" DW_CFA_def_cfa_offset: %d\n", (Int)off); 3250 break; 3251 3252 case DW_CFA_def_cfa_offset_sf: 3253 off = step_leb128( &instr, 1); 3254 ctxs->cfa_is_regoff = True; 3255 ctxs->cfa_expr_ix = 0; 3256 /* ->reg is unchanged */ 3257 ctxs->cfa_off = off * ctx->data_a_f; 3258 if (di->ddump_frames) 3259 VG_(printf)(" DW_CFA_def_cfa_offset_sf: %d\n", ctxs->cfa_off); 3260 break; 3261 3262 case DW_CFA_undefined: 3263 reg = step_leb128( &instr, 0); 3264 if (reg < 0 || reg >= N_CFI_REGS) 3265 return 0; /* fail */ 3266 ctxs->reg[reg].tag = RR_Undef; 3267 ctxs->reg[reg].arg = 0; 3268 if (di->ddump_frames) 3269 VG_(printf)(" rci:DW_CFA_undefined\n"); 3270 break; 3271 3272 case DW_CFA_same_value: 3273 reg = step_leb128( &instr, 0); 3274 if (reg < 0 || reg >= N_CFI_REGS) 3275 return 0; /* fail */ 3276 ctxs->reg[reg].tag = RR_Same; 3277 ctxs->reg[reg].arg = 0; 3278 if (di->ddump_frames) 3279 VG_(printf)(" rci:DW_CFA_same_value\n"); 3280 break; 3281 3282 case DW_CFA_GNU_args_size: 3283 /* No idea what is supposed to happen. gdb-6.3 simply 3284 ignores these. */ 3285 /*off = */ (void)step_leb128( &instr, 0 ); 3286 if (di->ddump_frames) 3287 VG_(printf)(" rci:DW_CFA_GNU_args_size (ignored)\n"); 3288 break; 3289 3290 case DW_CFA_expression: { 3291 /* Identical to DW_CFA_val_expression except that the value 3292 computed is an address and so needs one final 3293 dereference. */ 3294 DiCursor expr; 3295 reg = step_leb128( &instr, 0 ); 3296 len = step_leb128( &instr, 0 ); 3297 expr = instr; 3298 instr = ML_(cur_plus)(instr, len); 3299 if (reg < 0 || reg >= N_CFI_REGS) 3300 return 0; /* fail */ 3301 if (di->ddump_frames) 3302 VG_(printf)(" DW_CFA_expression: r%d (", 3303 (Int)reg); 3304 /* Convert the expression into a dag rooted at ctx->exprs index j, 3305 or fail. */ 3306 j = dwarfexpr_to_dag ( ctx, expr, len, True/*push CFA at start*/, 3307 di->ddump_frames); 3308 if (di->ddump_frames) 3309 VG_(printf)(")\n"); 3310 vg_assert(j >= -1); 3311 if (j >= 0) { 3312 vg_assert(ctx->exprs); 3313 vg_assert( j < VG_(sizeXA)(ctx->exprs) ); 3314 } 3315 if (j == -1) 3316 return 0; /* fail */ 3317 /* Add an extra dereference */ 3318 j = ML_(CfiExpr_Deref)( ctx->exprs, j ); 3319 ctxs->reg[reg].tag = RR_ValExpr; 3320 ctxs->reg[reg].arg = j; 3321 break; 3322 } 3323 3324 case DW_CFA_val_expression: { 3325 DiCursor expr; 3326 reg = step_leb128( &instr, 0 ); 3327 len = step_leb128( &instr, 0 ); 3328 expr = instr; 3329 instr = ML_(cur_plus)(instr, len); 3330 if (reg < 0 || reg >= N_CFI_REGS) 3331 return 0; /* fail */ 3332 if (di->ddump_frames) 3333 VG_(printf)(" DW_CFA_val_expression: r%d (", 3334 (Int)reg); 3335 /* Convert the expression into a dag rooted at ctx->exprs index j, 3336 or fail. */ 3337 j = dwarfexpr_to_dag ( ctx, expr, len, True/*push CFA at start*/, 3338 di->ddump_frames); 3339 if (di->ddump_frames) 3340 VG_(printf)(")\n"); 3341 vg_assert(j >= -1); 3342 if (j >= 0) { 3343 vg_assert(ctx->exprs); 3344 vg_assert( j < VG_(sizeXA)(ctx->exprs) ); 3345 } 3346 if (j == -1) 3347 return 0; /* fail */ 3348 ctxs->reg[reg].tag = RR_ValExpr; 3349 ctxs->reg[reg].arg = j; 3350 break; 3351 } 3352 3353 case DW_CFA_def_cfa_expression: { 3354 DiCursor expr; 3355 len = step_leb128( &instr, 0 ); 3356 expr = instr; 3357 instr = ML_(cur_plus)(instr, len); 3358 if (di->ddump_frames) 3359 VG_(printf)(" DW_CFA_def_cfa_expression ("); 3360 /* Convert the expression into a dag rooted at ctx->exprs index j, 3361 or fail. */ 3362 j = dwarfexpr_to_dag ( ctx, expr, len, True/*push CFA at start*/, 3363 di->ddump_frames); 3364 if (di->ddump_frames) 3365 VG_(printf)(")\n"); 3366 ctxs->cfa_is_regoff = False; 3367 ctxs->cfa_reg = 0; 3368 ctxs->cfa_off = 0; 3369 ctxs->cfa_expr_ix = j; 3370 break; 3371 } 3372 3373 case DW_CFA_GNU_window_save: 3374 /* Ignored. This appears to be sparc-specific; quite why it 3375 turns up in SuSE-supplied x86 .so's beats me. */ 3376 if (di->ddump_frames) 3377 VG_(printf)(" DW_CFA_GNU_window_save\n"); 3378 break; 3379 3380 case DW_CFA_remember_state: 3381 if (di->ddump_frames) 3382 VG_(printf)(" DW_CFA_remember_state\n"); 3383 /* we just checked this at entry, so: */ 3384 vg_assert(ctx->state_sp >= 0 && ctx->state_sp < N_RR_STACK); 3385 ctx->state_sp++; 3386 if (ctx->state_sp == N_RR_STACK) { 3387 /* stack overflow. We're hosed. */ 3388 VG_(message)(Vg_DebugMsg, "DWARF2 CFI reader: N_RR_STACK is " 3389 "too low; increase and recompile."); 3390 return 0; /* indicate failure */ 3391 } else { 3392 VG_(memcpy)(/*dst*/&ctx->state[ctx->state_sp], 3393 /*src*/&ctx->state[ctx->state_sp - 1], 3394 sizeof(ctx->state[ctx->state_sp]) ); 3395 } 3396 break; 3397 3398 case DW_CFA_restore_state: 3399 if (di->ddump_frames) 3400 VG_(printf)(" DW_CFA_restore_state\n"); 3401 /* we just checked this at entry, so: */ 3402 vg_assert(ctx->state_sp >= 0 && ctx->state_sp < N_RR_STACK); 3403 if (ctx->state_sp == 0) { 3404 /* stack undefflow. Give up. */ 3405 return 0; /* indicate failure */ 3406 } else { 3407 /* simply fall back to previous entry */ 3408 ctx->state_sp--; 3409 } 3410 break; 3411 3412 default: 3413 VG_(message)(Vg_DebugMsg, "DWARF2 CFI reader: unhandled CFI " 3414 "instruction 0:%d\n", (Int)lo6); 3415 if (di->ddump_frames) 3416 VG_(printf)(" rci:run_CF_instruction:default\n"); 3417 return 0; /* failure */ 3418 /*NOTREACHED*/ 3419 } 3420 3421 return ML_(cur_minus)(instr, instrIN); 3422} 3423 3424 3425/* Show a CFI instruction, and also return its length. Show it as 3426 close as possible (preferably identical) to how GNU binutils 3427 readelf --debug-dump=frames would. */ 3428 3429static Int show_CF_instruction ( DiCursor instrIN, 3430 AddressDecodingInfo* adi, 3431 Int code_a_f, Int data_a_f ) 3432{ 3433 Int off, coff, reg, reg2, len; 3434 UInt delta; 3435 Addr loc; 3436 DiCursor instr = instrIN; 3437 UChar instr_0 = ML_(cur_step_UChar)(&instr); 3438 UChar hi2 = (instr_0 >> 6) & 3; 3439 UChar lo6 = instr_0 & 0x3F; 3440 3441 if (0) { 3442 DiCursor tmpi = instrIN; 3443 UInt i_0 = ML_(cur_step_UChar)(&tmpi); 3444 UInt i_1 = ML_(cur_step_UChar)(&tmpi); 3445 UInt i_2 = ML_(cur_step_UChar)(&tmpi); 3446 UInt i_3 = ML_(cur_step_UChar)(&tmpi); 3447 UInt i_4 = ML_(cur_step_UChar)(&tmpi); 3448 UInt i_5 = ML_(cur_step_UChar)(&tmpi); 3449 UInt i_6 = ML_(cur_step_UChar)(&tmpi); 3450 UInt i_7 = ML_(cur_step_UChar)(&tmpi); 3451 VG_(printf)("raw:%x/%x:%x:%x:%x:%x:%x:%x:%x:%x\n", 3452 hi2, lo6, i_0, i_1, i_2, i_3, i_4, i_5, i_6, i_7); 3453 } 3454 3455 if (hi2 == DW_CFA_advance_loc) { 3456 VG_(printf)(" sci:DW_CFA_advance_loc(%d)\n", (Int)lo6); 3457 return ML_(cur_minus)(instr, instrIN); 3458 } 3459 3460 if (hi2 == DW_CFA_offset) { 3461 off = step_leb128( &instr, 0 ); 3462 coff = off * data_a_f; 3463 VG_(printf)(" DW_CFA_offset: r%d at cfa%s%d\n", 3464 (Int)lo6, coff < 0 ? "" : "+", (Int)coff ); 3465 return ML_(cur_minus)(instr, instrIN); 3466 } 3467 3468 if (hi2 == DW_CFA_restore) { 3469 VG_(printf)(" sci:DW_CFA_restore(r%d)\n", (Int)lo6); 3470 return ML_(cur_minus)(instr, instrIN); 3471 } 3472 3473 vg_assert(hi2 == DW_CFA_use_secondary); 3474 3475 switch (lo6) { 3476 3477 case DW_CFA_nop: 3478 VG_(printf)(" DW_CFA_nop\n"); 3479 break; 3480 3481 case DW_CFA_set_loc: 3482 /* WAS: loc = read_Addr(&instr[i]); i+= sizeof(Addr); 3483 (now known to be incorrect -- the address is encoded) */ 3484 loc = step_encoded_Addr(adi, &instr); 3485 VG_(printf)(" sci:DW_CFA_set_loc(%#lx)\n", loc); 3486 break; 3487 3488 case DW_CFA_advance_loc1: 3489 delta = (UInt)ML_(cur_step_UChar)(&instr); 3490 VG_(printf)(" sci:DW_CFA_advance_loc1(%d)\n", delta); 3491 break; 3492 3493 case DW_CFA_advance_loc2: 3494 delta = (UInt)ML_(cur_step_UShort)(&instr); 3495 VG_(printf)(" sci:DW_CFA_advance_loc2(%d)\n", delta); 3496 break; 3497 3498 case DW_CFA_advance_loc4: 3499 delta = (UInt)ML_(cur_step_UInt)(&instr); 3500 VG_(printf)(" DW_CFA_advance_loc4(%d)\n", delta); 3501 break; 3502 3503 case DW_CFA_def_cfa: 3504 reg = step_leb128( &instr, 0 ); 3505 off = step_leb128( &instr, 0 ); 3506 VG_(printf)(" DW_CFA_def_cfa: r%d ofs %d\n", (Int)reg, (Int)off); 3507 break; 3508 3509 case DW_CFA_def_cfa_sf: 3510 reg = step_leb128( &instr, 0 ); 3511 off = step_leb128( &instr, 1 ); 3512 VG_(printf)(" DW_CFA_def_cfa_sf: r%d ofs %d\n", 3513 (Int)reg, (Int)(off * data_a_f)); 3514 break; 3515 3516 case DW_CFA_register: 3517 reg = step_leb128( &instr, 0); 3518 reg2 = step_leb128( &instr, 0); 3519 VG_(printf)(" sci:DW_CFA_register(r%d, r%d)\n", reg, reg2); 3520 break; 3521 3522 case DW_CFA_def_cfa_register: 3523 reg = step_leb128( &instr, 0); 3524 VG_(printf)(" sci:DW_CFA_def_cfa_register(r%d)\n", reg); 3525 break; 3526 3527 case DW_CFA_def_cfa_offset: 3528 off = step_leb128( &instr, 0); 3529 VG_(printf)(" sci:DW_CFA_def_cfa_offset(%d)\n", off); 3530 break; 3531 3532 case DW_CFA_def_cfa_offset_sf: 3533 off = step_leb128( &instr, 1); 3534 VG_(printf)(" sci:DW_CFA_def_cfa_offset_sf(%d)\n", off); 3535 break; 3536 3537 case DW_CFA_restore_extended: 3538 reg = step_leb128( &instr, 0); 3539 VG_(printf)(" sci:DW_CFA_restore_extended(r%d)\n", reg); 3540 break; 3541 3542 case DW_CFA_undefined: 3543 reg = step_leb128( &instr, 0); 3544 VG_(printf)(" sci:DW_CFA_undefined(r%d)\n", reg); 3545 break; 3546 3547 case DW_CFA_same_value: 3548 reg = step_leb128( &instr, 0); 3549 VG_(printf)(" sci:DW_CFA_same_value(r%d)\n", reg); 3550 break; 3551 3552 case DW_CFA_remember_state: 3553 VG_(printf)(" sci:DW_CFA_remember_state\n"); 3554 break; 3555 3556 case DW_CFA_restore_state: 3557 VG_(printf)(" sci:DW_CFA_restore_state\n"); 3558 break; 3559 3560 case DW_CFA_GNU_args_size: 3561 off = step_leb128( &instr, 0 ); 3562 VG_(printf)(" sci:DW_CFA_GNU_args_size(%d)\n", off ); 3563 break; 3564 3565 case DW_CFA_def_cfa_expression: 3566 len = step_leb128( &instr, 0 ); 3567 instr = ML_(cur_plus)(instr, len); 3568 VG_(printf)(" sci:DW_CFA_def_cfa_expression(length %d)\n", len); 3569 break; 3570 3571 case DW_CFA_expression: 3572 reg = step_leb128( &instr, 0 ); 3573 len = step_leb128( &instr, 0 ); 3574 instr = ML_(cur_plus)(instr, len); 3575 VG_(printf)(" sci:DW_CFA_expression(r%d, length %d)\n", reg, len); 3576 break; 3577 3578 case DW_CFA_val_expression: 3579 reg = step_leb128( &instr, 0 ); 3580 len = step_leb128( &instr, 0 ); 3581 instr = ML_(cur_plus)(instr, len); 3582 VG_(printf)(" sci:DW_CFA_val_expression(r%d, length %d)\n", reg, len); 3583 break; 3584 3585 case DW_CFA_offset_extended: 3586 reg = step_leb128( &instr, 0 ); 3587 off = step_leb128( &instr, 0 ); 3588 VG_(printf)(" sci:DW_CFA_offset_extended(r%d, " 3589 "off %d x data_af)\n", reg, off); 3590 break; 3591 3592 case DW_CFA_offset_extended_sf: 3593 reg = step_leb128( &instr, 0 ); 3594 off = step_leb128( &instr, 1 ); 3595 coff = (Int)(off * data_a_f); 3596 VG_(printf)(" DW_CFA_offset_extended_sf: r%d at cfa%s%d\n", 3597 reg, coff < 0 ? "" : "+", coff); 3598 break; 3599 3600 case DW_CFA_GNU_negative_offset_extended: 3601 reg = step_leb128( &instr, 0 ); 3602 off = step_leb128( &instr, 0 ); 3603 VG_(printf)(" sci:DW_CFA_GNU_negative_offset_extended" 3604 "(r%d, off %d x data_af)\n", reg, -off); 3605 break; 3606 3607 case DW_CFA_val_offset: 3608 reg = step_leb128( &instr, 0 ); 3609 off = step_leb128( &instr, 0 ); 3610 VG_(printf)(" sci:DW_CFA_val_offset(r%d, off %d x data_af)\n", 3611 reg, off); 3612 break; 3613 3614 case DW_CFA_val_offset_sf: 3615 reg = step_leb128( &instr, 0 ); 3616 off = step_leb128( &instr, 1 ); 3617 VG_(printf)(" sci:DW_CFA_val_offset_sf(r%d, off %d x data_af)\n", 3618 reg, off); 3619 break; 3620 3621 case DW_CFA_GNU_window_save: 3622 VG_(printf)(" sci:DW_CFA_GNU_window_save\n"); 3623 break; 3624 3625 default: 3626 VG_(printf)(" sci:0:%d\n", (Int)lo6); 3627 break; 3628 } 3629 3630 return ML_(cur_minus)(instr, instrIN); 3631} 3632 3633 3634/* Show the instructions in instrs[0 .. ilen-1]. */ 3635static void show_CF_instructions ( DiCursor instrs, Int ilen, 3636 AddressDecodingInfo* adi, 3637 Int code_a_f, Int data_a_f ) 3638{ 3639 Int i = 0; 3640 while (True) { 3641 if (i >= ilen) break; 3642 i += show_CF_instruction( ML_(cur_plus)(instrs, i), 3643 adi, code_a_f, data_a_f ); 3644 } 3645} 3646 3647 3648/* Run the CF instructions in instrs[0 .. ilen-1], until the end is 3649 reached, or until there is a failure. Return True iff success. 3650*/ 3651static 3652Bool run_CF_instructions ( struct _DebugInfo* di, 3653 Bool record, 3654 UnwindContext* ctx, DiCursor instrs, Int ilen, 3655 UWord fde_arange, 3656 UnwindContext* restore_ctx, 3657 AddressDecodingInfo* adi ) 3658{ 3659 DiCfSI cfsi; 3660 Bool summ_ok; 3661 Int j, i = 0; 3662 Addr loc_prev; 3663 if (0) ppUnwindContext(ctx); 3664 if (0) ppUnwindContext_summary(ctx); 3665 while (True) { 3666 loc_prev = ctx->loc; 3667 if (i >= ilen) break; 3668 if (0) (void)show_CF_instruction( ML_(cur_plus)(instrs,i), adi, 3669 ctx->code_a_f, ctx->data_a_f ); 3670 j = run_CF_instruction( ctx, ML_(cur_plus)(instrs,i), 3671 restore_ctx, adi, di ); 3672 if (j == 0) 3673 return False; /* execution failed */ 3674 i += j; 3675 if (0) ppUnwindContext(ctx); 3676 if (record && loc_prev != ctx->loc) { 3677 summ_ok = summarise_context ( &cfsi, loc_prev, ctx, di ); 3678 if (summ_ok) { 3679 ML_(addDiCfSI)(di, &cfsi); 3680 if (di->trace_cfi) 3681 ML_(ppDiCfSI)(di->cfsi_exprs, &cfsi); 3682 } 3683 } 3684 } 3685 if (ctx->loc < fde_arange) { 3686 loc_prev = ctx->loc; 3687 ctx->loc = fde_arange; 3688 if (record) { 3689 summ_ok = summarise_context ( &cfsi, loc_prev, ctx, di ); 3690 if (summ_ok) { 3691 ML_(addDiCfSI)(di, &cfsi); 3692 if (di->trace_cfi) 3693 ML_(ppDiCfSI)(di->cfsi_exprs, &cfsi); 3694 } 3695 } 3696 } 3697 return True; 3698} 3699 3700 3701/* ------------ Main entry point for CFI reading ------------ */ 3702 3703typedef 3704 struct { 3705 /* This gives the CIE an identity to which FDEs will refer. */ 3706 ULong offset; 3707 /* Code, data factors. */ 3708 Int code_a_f; 3709 Int data_a_f; 3710 /* Return-address pseudo-register. */ 3711 Int ra_reg; 3712 UChar address_encoding; 3713 /* Where are the instrs? */ 3714 DiCursor instrs; 3715 Int ilen; 3716 /* God knows .. don't ask */ 3717 Bool saw_z_augmentation; 3718 } 3719 CIE; 3720 3721static void init_CIE ( CIE* cie ) 3722{ 3723 cie->offset = 0; 3724 cie->code_a_f = 0; 3725 cie->data_a_f = 0; 3726 cie->ra_reg = 0; 3727 cie->address_encoding = 0; 3728 cie->instrs = DiCursor_INVALID; 3729 cie->ilen = 0; 3730 cie->saw_z_augmentation = False; 3731} 3732 3733#define N_CIEs 8000 3734static CIE the_CIEs[N_CIEs]; 3735 3736 3737/* Read, summarise and store CFA unwind info from .eh_frame and 3738 .debug_frame sections. is_ehframe tells us which kind we are 3739 dealing with -- they are slightly different. */ 3740void ML_(read_callframe_info_dwarf3) 3741 ( /*OUT*/struct _DebugInfo* di, 3742 DiSlice escn_frame, Addr frame_avma, Bool is_ehframe ) 3743{ 3744 const HChar* how = NULL; 3745 Int n_CIEs = 0; 3746 DiCursor frame_image = ML_(cur_from_sli)(escn_frame); /* fixed */ 3747 DiOffT frame_size = escn_frame.szB; 3748 DiCursor data = frame_image; 3749 UWord cfsi_used_orig; 3750 3751 /* If we're dealing with a .debug_frame, assume zero frame_avma. */ 3752 if (!is_ehframe) 3753 vg_assert(frame_avma == 0); 3754 3755# if defined(VGP_ppc32_linux) || defined(VGP_ppc64_linux) 3756 /* These targets don't use CFI-based stack unwinding. */ 3757 return; 3758# endif 3759 3760 /* If we read more than one .debug_frame or .eh_frame for this 3761 DebugInfo*, the second and subsequent reads should only add FDEs 3762 for address ranges not already covered by the FDEs already 3763 present. To be able to quickly check which address ranges are 3764 already present, any existing records (DiCFSIs) must be sorted, 3765 so we can binary-search them in the code below. We also record 3766 di->cfsi_used so that we know where the boundary is between 3767 existing and new records. */ 3768 if (di->cfsi_used > 0) { 3769 ML_(canonicaliseCFI) ( di ); 3770 } 3771 cfsi_used_orig = di->cfsi_used; 3772 3773 if (di->trace_cfi) { 3774 VG_(printf)("\n-----------------------------------------------\n"); 3775 VG_(printf)("CFI info: szB %lld, _avma %#lx\n", 3776 escn_frame.szB, frame_avma ); 3777 VG_(printf)("CFI info: name %s\n", di->fsm.filename ); 3778 } 3779 3780 /* Loop over CIEs/FDEs */ 3781 3782 /* Conceptually, the frame info is a sequence of FDEs, one for each 3783 function. Inside an FDE is a miniature program for a special 3784 state machine, which, when run, produces the stack-unwinding 3785 info for that function. 3786 3787 Because the FDEs typically have much in common, and because the 3788 DWARF designers appear to have been fanatical about space 3789 saving, the common parts are factored out into so-called CIEs. 3790 That means that what we traverse is a sequence of structs, each 3791 of which is either a FDE (usually) or a CIE (occasionally). 3792 Each FDE has a field indicating which CIE is the one pertaining 3793 to it. 3794 3795 The following loop traverses the sequence. FDEs are dealt with 3796 immediately; once we harvest the useful info in an FDE, it is 3797 then forgotten about. By contrast, CIEs are validated and 3798 dumped into an array, because later FDEs may refer to any 3799 previously-seen CIE. 3800 */ 3801 while (True) { 3802 DiCursor ciefde_start; 3803 ULong ciefde_len; 3804 ULong cie_pointer; 3805 Bool dw64; 3806 3807 /* Are we done? */ 3808 if (ML_(cur_cmpEQ)(data, ML_(cur_plus)(frame_image, frame_size))) 3809 return; 3810 3811 /* Overshot the end? Means something is wrong */ 3812 if (ML_(cur_cmpGT)(data, ML_(cur_plus)(frame_image, frame_size))) { 3813 how = "overran the end of .eh_frame"; 3814 goto bad; 3815 } 3816 3817 /* Ok, we must be looking at the start of a new CIE or FDE. 3818 Figure out which it is. */ 3819 3820 ciefde_start = data; 3821 if (di->trace_cfi) 3822 VG_(printf)("\ncie/fde.start = (frame_image + 0x%llx)\n", 3823 ML_(cur_minus)(ciefde_start, frame_image)); 3824 3825 ciefde_len = (ULong)ML_(cur_step_UInt)(&data); 3826 if (di->trace_cfi) 3827 VG_(printf)("cie/fde.length = %lld\n", ciefde_len); 3828 3829 /* Apparently, if the .length field is zero, we are at the end 3830 of the sequence. This is stated in the Generic Elf 3831 Specification (see comments far above here) and is one of the 3832 places where .eh_frame and .debug_frame data differ. */ 3833 if (ciefde_len == 0) { 3834 if (di->ddump_frames) 3835 VG_(printf)("%08llx ZERO terminator\n\n", 3836 ML_(cur_minus)(ciefde_start, frame_image)); 3837 return; 3838 } 3839 3840 /* If the .length field is 0xFFFFFFFF then we're dealing with 3841 64-bit DWARF, and the real length is stored as a 64-bit 3842 number immediately following it. */ 3843 dw64 = False; 3844 if (ciefde_len == 0xFFFFFFFFUL) { 3845 dw64 = True; 3846 ciefde_len = ML_(cur_step_ULong)(&data); 3847 } 3848 3849 /* Now get the CIE ID, whose size depends on the DWARF 32 vs 3850 64-ness. */ 3851 if (dw64) { 3852 /* see XXX below */ 3853 cie_pointer = ML_(cur_step_ULong)(&data); 3854 } else { 3855 /* see XXX below */ 3856 cie_pointer = (ULong)ML_(cur_step_UInt)(&data); 3857 } 3858 3859 if (di->trace_cfi) 3860 VG_(printf)("cie.pointer = %lld\n", cie_pointer); 3861 3862 /* If cie_pointer is zero for .eh_frame or all ones for .debug_frame, 3863 we've got a CIE; else it's an FDE. */ 3864 if (cie_pointer == (is_ehframe ? 0ULL 3865 : dw64 ? 0xFFFFFFFFFFFFFFFFULL : 0xFFFFFFFFULL)) { 3866 3867 Int this_CIE; 3868 UChar cie_version; 3869 DiCursor cie_augmentation; 3870 3871 /* --------- CIE --------- */ 3872 if (di->trace_cfi) 3873 VG_(printf)("------ new CIE (#%d of 0 .. %d) ------\n", 3874 n_CIEs, N_CIEs - 1); 3875 3876 /* Allocate a new CIE record. */ 3877 vg_assert(n_CIEs >= 0 && n_CIEs <= N_CIEs); 3878 if (n_CIEs == N_CIEs) { 3879 how = "N_CIEs is too low. Increase and recompile."; 3880 goto bad; 3881 } 3882 3883 this_CIE = n_CIEs; 3884 n_CIEs++; 3885 init_CIE( &the_CIEs[this_CIE] ); 3886 3887 /* Record its offset. This is how we will find it again 3888 later when looking at an FDE. */ 3889 the_CIEs[this_CIE].offset 3890 = (ULong)ML_(cur_minus)(ciefde_start, frame_image); 3891 3892 if (di->ddump_frames) 3893 VG_(printf)("%08lx %08lx %08lx CIE\n", 3894 (Addr)ML_(cur_minus)(ciefde_start, frame_image), 3895 (Addr)ciefde_len, 3896 (Addr)(UWord)cie_pointer ); 3897 3898 cie_version = ML_(cur_step_UChar)(&data); 3899 if (di->trace_cfi) 3900 VG_(printf)("cie.version = %d\n", (Int)cie_version); 3901 if (di->ddump_frames) 3902 VG_(printf)(" Version: %d\n", (Int)cie_version); 3903 if (cie_version != 1 && cie_version != 3 && cie_version != 4) { 3904 how = "unexpected CIE version (not 1 nor 3 nor 4)"; 3905 goto bad; 3906 } 3907 3908 cie_augmentation = data; 3909 data = ML_(cur_plus)(data, 1 + ML_(cur_strlen)(cie_augmentation)); 3910 3911 if (di->trace_cfi || di->ddump_frames) { 3912 HChar* str = ML_(cur_read_strdup)(cie_augmentation, "di.rcid3.1"); 3913 if (di->trace_cfi) 3914 VG_(printf)("cie.augment = \"%s\"\n", str); 3915 if (di->ddump_frames) 3916 VG_(printf)(" Augmentation: \"%s\"\n", str); 3917 ML_(dinfo_free)(str); 3918 } 3919 3920 if (ML_(cur_read_UChar)(cie_augmentation) == 'e' 3921 && ML_(cur_read_UChar) 3922 (ML_(cur_plus)(cie_augmentation, 1)) == 'h') { 3923 data = ML_(cur_plus)(data, sizeof(Addr)); 3924 cie_augmentation = ML_(cur_plus)(cie_augmentation, 2); 3925 } 3926 3927 if (cie_version >= 4) { 3928 if (ML_(cur_step_UChar)(&data) != sizeof(Addr)) { 3929 how = "unexpected address size"; 3930 goto bad; 3931 } 3932 if (ML_(cur_step_UChar)(&data) != 0) { 3933 how = "unexpected non-zero segment size"; 3934 goto bad; 3935 } 3936 } 3937 3938 the_CIEs[this_CIE].code_a_f = step_leb128( &data, 0); 3939 if (di->trace_cfi) 3940 VG_(printf)("cie.code_af = %d\n", 3941 the_CIEs[this_CIE].code_a_f); 3942 if (di->ddump_frames) 3943 VG_(printf)(" Code alignment factor: %d\n", 3944 (Int)the_CIEs[this_CIE].code_a_f); 3945 3946 the_CIEs[this_CIE].data_a_f = step_leb128( &data, 1); 3947 if (di->trace_cfi) 3948 VG_(printf)("cie.data_af = %d\n", 3949 the_CIEs[this_CIE].data_a_f); 3950 if (di->ddump_frames) 3951 VG_(printf)(" Data alignment factor: %d\n", 3952 (Int)the_CIEs[this_CIE].data_a_f); 3953 3954 if (cie_version == 1) { 3955 the_CIEs[this_CIE].ra_reg = (Int)ML_(cur_step_UChar)(&data); 3956 } else { 3957 the_CIEs[this_CIE].ra_reg = step_leb128( &data, 0); 3958 } 3959 if (di->trace_cfi) 3960 VG_(printf)("cie.ra_reg = %d\n", 3961 the_CIEs[this_CIE].ra_reg); 3962 if (di->ddump_frames) 3963 VG_(printf)(" Return address column: %d\n", 3964 (Int)the_CIEs[this_CIE].ra_reg); 3965 3966 if (the_CIEs[this_CIE].ra_reg < 0 3967 || the_CIEs[this_CIE].ra_reg >= N_CFI_REGS) { 3968 how = "cie.ra_reg has implausible value"; 3969 goto bad; 3970 } 3971 3972 the_CIEs[this_CIE].saw_z_augmentation 3973 = ML_(cur_read_UChar)(cie_augmentation) == 'z'; 3974 if (the_CIEs[this_CIE].saw_z_augmentation) { 3975 UInt length = step_leb128( &data, 0); 3976 the_CIEs[this_CIE].instrs = ML_(cur_plus)(data, length); 3977 cie_augmentation = ML_(cur_plus)(cie_augmentation, 1); 3978 if (di->ddump_frames) { 3979 UInt i; 3980 VG_(printf)(" Augmentation data: "); 3981 for (i = 0; i < length; i++) 3982 VG_(printf)(" %02x", (UInt)ML_(cur_read_UChar) 3983 (ML_(cur_plus)(data, i))); 3984 VG_(printf)("\n"); 3985 } 3986 } else { 3987 the_CIEs[this_CIE].instrs = DiCursor_INVALID; 3988 } 3989 3990 the_CIEs[this_CIE].address_encoding = default_Addr_encoding(); 3991 3992 while (ML_(cur_read_UChar)(cie_augmentation)) { 3993 switch (ML_(cur_read_UChar)(cie_augmentation)) { 3994 case 'L': 3995 data = ML_(cur_plus)(data, 1); 3996 cie_augmentation = ML_(cur_plus)(cie_augmentation, 1); 3997 break; 3998 case 'R': 3999 the_CIEs[this_CIE].address_encoding 4000 = ML_(cur_step_UChar)(&data); 4001 cie_augmentation = ML_(cur_plus)(cie_augmentation, 1); 4002 break; 4003 case 'P': 4004 data = ML_(cur_plus)(data, size_of_encoded_Addr( 4005 ML_(cur_read_UChar)(data) )); 4006 data = ML_(cur_plus)(data, 1); 4007 cie_augmentation = ML_(cur_plus)(cie_augmentation, 1); 4008 break; 4009 case 'S': 4010 cie_augmentation = ML_(cur_plus)(cie_augmentation, 1); 4011 break; 4012 default: 4013 if (!ML_(cur_is_valid)(the_CIEs[this_CIE].instrs)) { 4014 how = "unhandled cie.augmentation"; 4015 goto bad; 4016 } 4017 data = the_CIEs[this_CIE].instrs; 4018 goto done_augmentation; 4019 } 4020 } 4021 4022 done_augmentation: 4023 4024 if (di->trace_cfi) 4025 VG_(printf)("cie.encoding = 0x%x\n", 4026 the_CIEs[this_CIE].address_encoding); 4027 4028 the_CIEs[this_CIE].instrs = data; 4029 the_CIEs[this_CIE].ilen = ML_(cur_minus)(ciefde_start, data) 4030 + (Long)ciefde_len + (Long)sizeof(UInt); 4031 if (di->trace_cfi) { 4032 //VG_(printf)("cie.instrs = %p\n", the_CIEs[this_CIE].instrs); 4033 VG_(printf)("cie.ilen = %d\n", the_CIEs[this_CIE].ilen); 4034 } 4035 4036 if (the_CIEs[this_CIE].ilen < 0 4037 || the_CIEs[this_CIE].ilen > frame_size) { 4038 how = "implausible # cie initial insns"; 4039 goto bad; 4040 } 4041 4042 data = ML_(cur_plus)(data, the_CIEs[this_CIE].ilen); 4043 4044 /* Show the CIE's instructions (the preamble for each FDE 4045 that uses this CIE). */ 4046 if (di->ddump_frames) 4047 VG_(printf)("\n"); 4048 4049 if (di->trace_cfi || di->ddump_frames) { 4050 AddressDecodingInfo adi; 4051 adi.encoding = the_CIEs[this_CIE].address_encoding; 4052 adi.ehframe_image = frame_image; 4053 adi.ehframe_avma = frame_avma; 4054 adi.text_bias = di->text_debug_bias; 4055 show_CF_instructions( the_CIEs[this_CIE].instrs, 4056 the_CIEs[this_CIE].ilen, &adi, 4057 the_CIEs[this_CIE].code_a_f, 4058 the_CIEs[this_CIE].data_a_f ); 4059 } 4060 4061 if (di->ddump_frames) 4062 VG_(printf)("\n"); 4063 4064 } else { 4065 4066 AddressDecodingInfo adi; 4067 UnwindContext ctx, restore_ctx; 4068 Int cie; 4069 ULong look_for; 4070 Bool ok; 4071 Addr fde_initloc; 4072 UWord fde_arange; 4073 DiCursor fde_instrs; 4074 Int fde_ilen; 4075 4076 /* --------- FDE --------- */ 4077 4078 /* Find the relevant CIE. The CIE we want is located 4079 cie_pointer bytes back from here. */ 4080 4081 /* re sizeof(UInt) / sizeof(ULong), matches XXX above. */ 4082 if (is_ehframe) 4083 look_for = ML_(cur_minus)(data, frame_image) 4084 - (dw64 ? sizeof(ULong) : sizeof(UInt)) 4085 - cie_pointer; 4086 else 4087 look_for = cie_pointer; 4088 4089 for (cie = 0; cie < n_CIEs; cie++) { 4090 if (0) VG_(printf)("look for %lld %lld\n", 4091 look_for, the_CIEs[cie].offset ); 4092 if (the_CIEs[cie].offset == look_for) 4093 break; 4094 } 4095 vg_assert(cie >= 0 && cie <= n_CIEs); 4096 if (cie == n_CIEs) { 4097 how = "FDE refers to not-findable CIE"; 4098 goto bad; 4099 } 4100 4101 adi.encoding = the_CIEs[cie].address_encoding; 4102 adi.ehframe_image = frame_image; 4103 adi.ehframe_avma = frame_avma; 4104 adi.text_bias = di->text_debug_bias; 4105 fde_initloc = step_encoded_Addr(&adi, &data); 4106 if (di->trace_cfi) 4107 VG_(printf)("fde.initloc = %#lx\n", fde_initloc); 4108 4109 adi.encoding = the_CIEs[cie].address_encoding & 0xf; 4110 adi.ehframe_image = frame_image; 4111 adi.ehframe_avma = frame_avma; 4112 adi.text_bias = di->text_debug_bias; 4113 4114 /* WAS (incorrectly): 4115 fde_arange = read_encoded_Addr(&nbytes, &adi, data); 4116 data += nbytes; 4117 The following corresponds to what binutils/dwarf.c does: 4118 */ 4119 { UInt ptr_size = size_of_encoded_Addr( adi.encoding ); 4120 switch (ptr_size) { 4121 case 8: case 4: case 2: case 1: 4122 fde_arange 4123 = (UWord)step_le_u_encoded_literal(&data, ptr_size); 4124 break; 4125 default: 4126 how = "unknown arange field encoding in FDE"; 4127 goto bad; 4128 } 4129 } 4130 4131 if (di->trace_cfi) 4132 VG_(printf)("fde.arangec = %#lx\n", fde_arange); 4133 4134 if (di->ddump_frames) 4135 VG_(printf)("%08lx %08lx %08lx FDE cie=%08lx pc=%08lx..%08lx\n", 4136 (Addr)ML_(cur_minus)(ciefde_start, frame_image), 4137 (Addr)ciefde_len, 4138 (Addr)(UWord)cie_pointer, 4139 (Addr)look_for, 4140 ((Addr)fde_initloc) - di->text_debug_bias, 4141 ((Addr)fde_initloc) - di->text_debug_bias + fde_arange); 4142 4143 if (the_CIEs[cie].saw_z_augmentation) { 4144 UInt length = step_leb128( &data, 0); 4145 if (di->ddump_frames && (length > 0)) { 4146 UInt i; 4147 VG_(printf)(" Augmentation data: "); 4148 for (i = 0; i < length; i++) 4149 VG_(printf)(" %02x", (UInt)ML_(cur_read_UChar) 4150 (ML_(cur_plus)(data, i))); 4151 VG_(printf)("\n\n"); 4152 } 4153 data = ML_(cur_plus)(data, length); 4154 } 4155 4156 fde_instrs = data; 4157 fde_ilen = ML_(cur_minus)(ciefde_start, data) 4158 + (Long)ciefde_len + (Long)sizeof(UInt); 4159 if (di->trace_cfi) { 4160 //VG_(printf)("fde.instrs = %p\n", fde_instrs); 4161 VG_(printf)("fde.ilen = %d\n", (Int)fde_ilen); 4162 } 4163 4164 if (fde_ilen < 0 || fde_ilen > frame_size) { 4165 how = "implausible # fde insns"; 4166 goto bad; 4167 } 4168 4169 data = ML_(cur_plus)(data, fde_ilen); 4170 4171 /* If this object's DebugInfo* had some DiCFSIs from a 4172 previous .eh_frame or .debug_frame read, we must check 4173 that we're not adding a duplicate. */ 4174 if (cfsi_used_orig > 0) { 4175 Addr a_mid_lo, a_mid_hi; 4176 Word mid, size, 4177 lo = 0, 4178 hi = cfsi_used_orig-1; 4179 while (True) { 4180 /* current unsearched space is from lo to hi, inclusive. */ 4181 if (lo > hi) break; /* not found */ 4182 mid = (lo + hi) / 2; 4183 a_mid_lo = di->cfsi[mid].base; 4184 size = di->cfsi[mid].len; 4185 a_mid_hi = a_mid_lo + size - 1; 4186 vg_assert(a_mid_hi >= a_mid_lo); 4187 if (fde_initloc + fde_arange <= a_mid_lo) { 4188 hi = mid-1; continue; 4189 } 4190 if (fde_initloc > a_mid_hi) { lo = mid+1; continue; } 4191 break; 4192 } 4193 4194 /* The range this .debug_frame FDE covers has been already 4195 covered in .eh_frame section. Don't add it from .debug_frame 4196 section again. */ 4197 if (lo <= hi) 4198 continue; 4199 } 4200 4201 adi.encoding = the_CIEs[cie].address_encoding; 4202 adi.ehframe_image = frame_image; 4203 adi.ehframe_avma = frame_avma; 4204 adi.text_bias = di->text_debug_bias; 4205 4206 if (di->trace_cfi) 4207 show_CF_instructions( fde_instrs, fde_ilen, &adi, 4208 the_CIEs[cie].code_a_f, 4209 the_CIEs[cie].data_a_f ); 4210 4211 initUnwindContext(&ctx); 4212 ctx.code_a_f = the_CIEs[cie].code_a_f; 4213 ctx.data_a_f = the_CIEs[cie].data_a_f; 4214 ctx.initloc = fde_initloc; 4215 ctx.ra_reg = the_CIEs[cie].ra_reg; 4216 ctx.exprs = VG_(newXA)( ML_(dinfo_zalloc), "di.rcid.1", 4217 ML_(dinfo_free), 4218 sizeof(CfiExpr) ); 4219 vg_assert(ctx.exprs); 4220 4221 /* Run the CIE's instructions. Ugly hack: if 4222 --debug-dump=frames is in effect, suppress output for 4223 these instructions since they will already have been shown 4224 at the time the CIE was first encountered. Note, not 4225 thread safe - if this reader is ever made threaded, should 4226 fix properly. */ 4227 { Bool hack = di->ddump_frames; 4228 di->ddump_frames = False; 4229 initUnwindContext(&restore_ctx); 4230 ok = run_CF_instructions( 4231 di, False, &ctx, the_CIEs[cie].instrs, 4232 the_CIEs[cie].ilen, 0, NULL, &adi 4233 ); 4234 di->ddump_frames = hack; 4235 } 4236 /* And now run the instructions for the FDE, starting from 4237 the state created by running the CIE preamble 4238 instructions. */ 4239 if (ok) { 4240 restore_ctx = ctx; 4241 ok = run_CF_instructions( 4242 di, True, &ctx, fde_instrs, fde_ilen, fde_arange, 4243 &restore_ctx, &adi 4244 ); 4245 if (di->ddump_frames) 4246 VG_(printf)("\n"); 4247 } 4248 4249 VG_(deleteXA)( ctx.exprs ); 4250 } 4251 } 4252 4253 return; 4254 4255 bad: 4256 if (!VG_(clo_xml) && VG_(clo_verbosity) > 1) 4257 VG_(message)(Vg_UserMsg, 4258 "Warning: %s in DWARF2 CFI reading\n", how); 4259 return; 4260} 4261 4262#endif // defined(VGO_linux) || defined(VGO_darwin) 4263 4264/*--------------------------------------------------------------------*/ 4265/*--- end ---*/ 4266/*--------------------------------------------------------------------*/ 4267