1/* -*- mode: C; c-basic-offset: 3; -*- */ 2 3/*--------------------------------------------------------------------*/ 4/*--- Top level management of symbols and debugging information. ---*/ 5/*--- debuginfo.c ---*/ 6/*--------------------------------------------------------------------*/ 7 8/* 9 This file is part of Valgrind, a dynamic binary instrumentation 10 framework. 11 12 Copyright (C) 2000-2013 Julian Seward 13 jseward@acm.org 14 15 This program is free software; you can redistribute it and/or 16 modify it under the terms of the GNU General Public License as 17 published by the Free Software Foundation; either version 2 of the 18 License, or (at your option) any later version. 19 20 This program is distributed in the hope that it will be useful, but 21 WITHOUT ANY WARRANTY; without even the implied warranty of 22 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 23 General Public License for more details. 24 25 You should have received a copy of the GNU General Public License 26 along with this program; if not, write to the Free Software 27 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 28 02111-1307, USA. 29 30 The GNU General Public License is contained in the file COPYING. 31*/ 32 33#include "pub_core_basics.h" 34#include "pub_core_vki.h" 35#include "pub_core_threadstate.h" 36#include "pub_core_debuginfo.h" /* self */ 37#include "pub_core_demangle.h" 38#include "pub_core_libcbase.h" 39#include "pub_core_libcassert.h" 40#include "pub_core_libcprint.h" 41#include "pub_core_libcfile.h" 42#include "pub_core_libcproc.h" // VG_(getenv) 43#include "pub_core_seqmatch.h" 44#include "pub_core_options.h" 45#include "pub_core_redir.h" // VG_(redir_notify_{new,delete}_SegInfo) 46#include "pub_core_aspacemgr.h" 47#include "pub_core_machine.h" // VG_PLAT_USES_PPCTOC 48#include "pub_core_xarray.h" 49#include "pub_core_oset.h" 50#include "pub_core_stacktrace.h" // VG_(get_StackTrace) XXX: circular dependency 51#include "pub_core_ume.h" 52 53#include "priv_misc.h" /* dinfo_zalloc/free */ 54#include "priv_image.h" 55#include "priv_d3basics.h" /* ML_(pp_GX) */ 56#include "priv_tytypes.h" 57#include "priv_storage.h" 58#include "priv_readdwarf.h" 59#if defined(VGO_linux) 60# include "priv_readelf.h" 61# include "priv_readdwarf3.h" 62# include "priv_readpdb.h" 63#elif defined(VGO_darwin) 64# include "priv_readmacho.h" 65# include "priv_readpdb.h" 66#endif 67 68 69/* Set this to 1 to enable debug printing for the 70 should-we-load-debuginfo-now? finite state machine. */ 71#define DEBUG_FSM 0 72 73 74/*------------------------------------------------------------*/ 75/*--- The _svma / _avma / _image / _bias naming scheme ---*/ 76/*------------------------------------------------------------*/ 77 78/* JRS 11 Jan 07: I find the different kinds of addresses involved in 79 debuginfo reading confusing. Recently I arrived at some 80 terminology which makes it clearer (to me, at least). There are 3 81 kinds of address used in the debuginfo reading process: 82 83 stated VMAs - the address where (eg) a .so says a symbol is, that 84 is, what it tells you if you consider the .so in 85 isolation 86 87 actual VMAs - the address where (eg) said symbol really wound up 88 after the .so was mapped into memory 89 90 image addresses - pointers into the copy of the .so (etc) 91 transiently mmaped aboard whilst we read its info 92 93 Additionally I use the term 'bias' to denote the difference 94 between stated and actual VMAs for a given entity. 95 96 This terminology is not used consistently, but a start has been 97 made. readelf.c and the call-frame info reader in readdwarf.c now 98 use it. Specifically, various variables and structure fields have 99 been annotated with _avma / _svma / _image / _bias. In places _img 100 is used instead of _image for the sake of brevity. 101*/ 102 103 104/*------------------------------------------------------------*/ 105/*--- fwdses ---*/ 106/*------------------------------------------------------------*/ 107 108static UInt CF_info_generation = 0; 109static void cfsi_m_cache__invalidate ( void ); 110 111 112/*------------------------------------------------------------*/ 113/*--- Root structure ---*/ 114/*------------------------------------------------------------*/ 115 116/* The root structure for the entire debug info system. It is a 117 linked list of DebugInfos. */ 118static DebugInfo* debugInfo_list = NULL; 119 120 121/* Find 'di' in the debugInfo_list and move it one step closer the the 122 front of the list, so as to make subsequent searches for it 123 cheaper. When used in a controlled way, makes a major improvement 124 in some DebugInfo-search-intensive situations, most notably stack 125 unwinding on amd64-linux. */ 126static void move_DebugInfo_one_step_forward ( DebugInfo* di ) 127{ 128 DebugInfo *di0, *di1, *di2; 129 if (di == debugInfo_list) 130 return; /* already at head of list */ 131 vg_assert(di != NULL); 132 di0 = debugInfo_list; 133 di1 = NULL; 134 di2 = NULL; 135 while (True) { 136 if (di0 == NULL || di0 == di) break; 137 di2 = di1; 138 di1 = di0; 139 di0 = di0->next; 140 } 141 vg_assert(di0 == di); 142 if (di0 != NULL && di1 != NULL && di2 != NULL) { 143 DebugInfo* tmp; 144 /* di0 points to di, di1 to its predecessor, and di2 to di1's 145 predecessor. Swap di0 and di1, that is, move di0 one step 146 closer to the start of the list. */ 147 vg_assert(di2->next == di1); 148 vg_assert(di1->next == di0); 149 tmp = di0->next; 150 di2->next = di0; 151 di0->next = di1; 152 di1->next = tmp; 153 } 154 else 155 if (di0 != NULL && di1 != NULL && di2 == NULL) { 156 /* it's second in the list. */ 157 vg_assert(debugInfo_list == di1); 158 vg_assert(di1->next == di0); 159 di1->next = di0->next; 160 di0->next = di1; 161 debugInfo_list = di0; 162 } 163} 164 165 166/*------------------------------------------------------------*/ 167/*--- Notification (acquire/discard) helpers ---*/ 168/*------------------------------------------------------------*/ 169 170/* Gives out unique abstract handles for allocated DebugInfos. See 171 comment in priv_storage.h, declaration of struct _DebugInfo, for 172 details. */ 173static ULong handle_counter = 1; 174 175/* Allocate and zero out a new DebugInfo record. */ 176static 177DebugInfo* alloc_DebugInfo( const HChar* filename ) 178{ 179 Bool traceme; 180 DebugInfo* di; 181 182 vg_assert(filename); 183 184 di = ML_(dinfo_zalloc)("di.debuginfo.aDI.1", sizeof(DebugInfo)); 185 di->handle = handle_counter++; 186 di->fsm.filename = ML_(dinfo_strdup)("di.debuginfo.aDI.2", filename); 187 di->fsm.maps = VG_(newXA)( 188 ML_(dinfo_zalloc), "di.debuginfo.aDI.3", 189 ML_(dinfo_free), sizeof(DebugInfoMapping)); 190 191 /* Everything else -- pointers, sizes, arrays -- is zeroed by 192 ML_(dinfo_zalloc). Now set up the debugging-output flags. */ 193 traceme 194 = VG_(string_match)( VG_(clo_trace_symtab_patt), filename ); 195 if (traceme) { 196 di->trace_symtab = VG_(clo_trace_symtab); 197 di->trace_cfi = VG_(clo_trace_cfi); 198 di->ddump_syms = VG_(clo_debug_dump_syms); 199 di->ddump_line = VG_(clo_debug_dump_line); 200 di->ddump_frames = VG_(clo_debug_dump_frames); 201 } 202 203 return di; 204} 205 206 207/* Free a DebugInfo, and also all the stuff hanging off it. */ 208static void free_DebugInfo ( DebugInfo* di ) 209{ 210 Word i, j, n; 211 TyEnt* ent; 212 GExpr* gexpr; 213 214 vg_assert(di != NULL); 215 if (di->fsm.maps) VG_(deleteXA)(di->fsm.maps); 216 if (di->fsm.filename) ML_(dinfo_free)(di->fsm.filename); 217 if (di->fsm.dbgname) ML_(dinfo_free)(di->fsm.dbgname); 218 if (di->soname) ML_(dinfo_free)(di->soname); 219 if (di->loctab) ML_(dinfo_free)(di->loctab); 220 if (di->loctab_fndn_ix) ML_(dinfo_free)(di->loctab_fndn_ix); 221 if (di->inltab) ML_(dinfo_free)(di->inltab); 222 if (di->cfsi_base) ML_(dinfo_free)(di->cfsi_base); 223 if (di->cfsi_m_ix) ML_(dinfo_free)(di->cfsi_m_ix); 224 if (di->cfsi_rd) ML_(dinfo_free)(di->cfsi_rd); 225 if (di->cfsi_m_pool) VG_(deleteDedupPA)(di->cfsi_m_pool); 226 if (di->cfsi_exprs) VG_(deleteXA)(di->cfsi_exprs); 227 if (di->fpo) ML_(dinfo_free)(di->fpo); 228 229 if (di->symtab) { 230 /* We have to visit all the entries so as to free up any 231 sec_names arrays that might exist. */ 232 n = di->symtab_used; 233 for (i = 0; i < n; i++) { 234 DiSym* sym = &di->symtab[i]; 235 if (sym->sec_names) 236 ML_(dinfo_free)(sym->sec_names); 237 } 238 /* and finally .. */ 239 ML_(dinfo_free)(di->symtab); 240 } 241 242 if (di->strpool) 243 VG_(deleteDedupPA) (di->strpool); 244 if (di->fndnpool) 245 VG_(deleteDedupPA) (di->fndnpool); 246 247 /* Delete the two admin arrays. These lists exist primarily so 248 that we can visit each object exactly once when we need to 249 delete them. */ 250 if (di->admin_tyents) { 251 n = VG_(sizeXA)(di->admin_tyents); 252 for (i = 0; i < n; i++) { 253 ent = (TyEnt*)VG_(indexXA)(di->admin_tyents, i); 254 /* Dump anything hanging off this ent */ 255 ML_(TyEnt__make_EMPTY)(ent); 256 } 257 VG_(deleteXA)(di->admin_tyents); 258 di->admin_tyents = NULL; 259 } 260 261 if (di->admin_gexprs) { 262 n = VG_(sizeXA)(di->admin_gexprs); 263 for (i = 0; i < n; i++) { 264 gexpr = *(GExpr**)VG_(indexXA)(di->admin_gexprs, i); 265 ML_(dinfo_free)(gexpr); 266 } 267 VG_(deleteXA)(di->admin_gexprs); 268 di->admin_gexprs = NULL; 269 } 270 271 /* Dump the variable info. This is kinda complex: we must take 272 care not to free items which reside in either the admin lists 273 (as we have just freed them) or which reside in the DebugInfo's 274 string table. */ 275 if (di->varinfo) { 276 for (i = 0; i < VG_(sizeXA)(di->varinfo); i++) { 277 OSet* scope = *(OSet**)VG_(indexXA)(di->varinfo, i); 278 if (!scope) continue; 279 /* iterate over all entries in 'scope' */ 280 VG_(OSetGen_ResetIter)(scope); 281 while (True) { 282 DiAddrRange* arange = VG_(OSetGen_Next)(scope); 283 if (!arange) break; 284 /* for each var in 'arange' */ 285 vg_assert(arange->vars); 286 for (j = 0; j < VG_(sizeXA)( arange->vars ); j++) { 287 DiVariable* var = (DiVariable*)VG_(indexXA)(arange->vars,j); 288 vg_assert(var); 289 /* Nothing to free in var: all the pointer fields refer 290 to stuff either on an admin list, or in 291 .strpool */ 292 } 293 VG_(deleteXA)(arange->vars); 294 /* Don't free arange itself, as OSetGen_Destroy does 295 that */ 296 } 297 VG_(OSetGen_Destroy)(scope); 298 } 299 VG_(deleteXA)(di->varinfo); 300 } 301 302 ML_(dinfo_free)(di); 303} 304 305 306/* 'si' is a member of debugInfo_list. Find it, remove it from the 307 list, notify m_redir that this has happened, and free all storage 308 reachable from it. 309*/ 310static void discard_DebugInfo ( DebugInfo* di ) 311{ 312 const HChar* reason = "munmap"; 313 314 DebugInfo** prev_next_ptr = &debugInfo_list; 315 DebugInfo* curr = debugInfo_list; 316 317 while (curr) { 318 if (curr == di) { 319 /* Found it; remove from list and free it. */ 320 if (curr->have_dinfo 321 && (VG_(clo_verbosity) > 1 || VG_(clo_trace_redir))) 322 VG_(message)(Vg_DebugMsg, 323 "Discarding syms at %#lx-%#lx in %s due to %s()\n", 324 di->text_avma, 325 di->text_avma + di->text_size, 326 curr->fsm.filename ? curr->fsm.filename 327 : "???", 328 reason); 329 vg_assert(*prev_next_ptr == curr); 330 *prev_next_ptr = curr->next; 331 if (curr->have_dinfo) 332 VG_(redir_notify_delete_DebugInfo)( curr ); 333 free_DebugInfo(curr); 334 return; 335 } 336 prev_next_ptr = &curr->next; 337 curr = curr->next; 338 } 339 340 /* Not found. */ 341} 342 343 344/* Repeatedly scan debugInfo_list, looking for DebugInfos with text 345 AVMAs intersecting [start,start+length), and call discard_DebugInfo 346 to get rid of them. This modifies the list, hence the multiple 347 iterations. Returns True iff any such DebugInfos were found. 348*/ 349static Bool discard_syms_in_range ( Addr start, SizeT length ) 350{ 351 Bool anyFound = False; 352 Bool found; 353 DebugInfo* curr; 354 355 while (True) { 356 found = False; 357 358 curr = debugInfo_list; 359 while (True) { 360 if (curr == NULL) 361 break; 362 if (curr->text_present 363 && curr->text_size > 0 364 && (start+length - 1 < curr->text_avma 365 || curr->text_avma + curr->text_size - 1 < start)) { 366 /* no overlap */ 367 } else { 368 found = True; 369 break; 370 } 371 curr = curr->next; 372 } 373 374 if (!found) break; 375 anyFound = True; 376 discard_DebugInfo( curr ); 377 } 378 379 return anyFound; 380} 381 382 383/* Does [s1,+len1) overlap [s2,+len2) ? Note: does not handle 384 wraparound at the end of the address space -- just asserts in that 385 case. */ 386static Bool ranges_overlap (Addr s1, SizeT len1, Addr s2, SizeT len2 ) 387{ 388 Addr e1, e2; 389 if (len1 == 0 || len2 == 0) 390 return False; 391 e1 = s1 + len1 - 1; 392 e2 = s2 + len2 - 1; 393 /* Assert that we don't have wraparound. If we do it would imply 394 that file sections are getting mapped around the end of the 395 address space, which sounds unlikely. */ 396 vg_assert(s1 <= e1); 397 vg_assert(s2 <= e2); 398 if (e1 < s2 || e2 < s1) return False; 399 return True; 400} 401 402 403/* Do the basic mappings of the two DebugInfos overlap in any way? */ 404static Bool do_DebugInfos_overlap ( const DebugInfo* di1, const DebugInfo* di2 ) 405{ 406 Word i, j; 407 vg_assert(di1); 408 vg_assert(di2); 409 for (i = 0; i < VG_(sizeXA)(di1->fsm.maps); i++) { 410 const DebugInfoMapping* map1 = VG_(indexXA)(di1->fsm.maps, i); 411 for (j = 0; j < VG_(sizeXA)(di2->fsm.maps); j++) { 412 const DebugInfoMapping* map2 = VG_(indexXA)(di2->fsm.maps, j); 413 if (ranges_overlap(map1->avma, map1->size, map2->avma, map2->size)) 414 return True; 415 } 416 } 417 418 return False; 419} 420 421 422/* Discard all elements of debugInfo_list whose .mark bit is set. 423*/ 424static void discard_marked_DebugInfos ( void ) 425{ 426 DebugInfo* curr; 427 428 while (True) { 429 430 curr = debugInfo_list; 431 while (True) { 432 if (!curr) 433 break; 434 if (curr->mark) 435 break; 436 curr = curr->next; 437 } 438 439 if (!curr) break; 440 discard_DebugInfo( curr ); 441 442 } 443} 444 445 446/* Discard any elements of debugInfo_list which overlap with diRef. 447 Clearly diRef must have its mapping information set to something sane. */ 448static void discard_DebugInfos_which_overlap_with ( DebugInfo* diRef ) 449{ 450 DebugInfo* di; 451 /* Mark all the DebugInfos in debugInfo_list that need to be 452 deleted. First, clear all the mark bits; then set them if they 453 overlap with siRef. Since siRef itself is in this list we at 454 least expect its own mark bit to be set. */ 455 for (di = debugInfo_list; di; di = di->next) { 456 di->mark = do_DebugInfos_overlap( di, diRef ); 457 if (di == diRef) { 458 vg_assert(di->mark); 459 di->mark = False; 460 } 461 } 462 discard_marked_DebugInfos(); 463} 464 465 466/* Find the existing DebugInfo for |filename| or if not found, create 467 one. In the latter case |filename| is strdup'd into VG_AR_DINFO, 468 and the new DebugInfo is added to debugInfo_list. */ 469static DebugInfo* find_or_create_DebugInfo_for ( const HChar* filename ) 470{ 471 DebugInfo* di; 472 vg_assert(filename); 473 for (di = debugInfo_list; di; di = di->next) { 474 vg_assert(di->fsm.filename); 475 if (0==VG_(strcmp)(di->fsm.filename, filename)) 476 break; 477 } 478 if (!di) { 479 di = alloc_DebugInfo(filename); 480 vg_assert(di); 481 di->next = debugInfo_list; 482 debugInfo_list = di; 483 } 484 return di; 485} 486 487 488/* Debuginfo reading for 'di' has just been successfully completed. 489 Check that the invariants stated in 490 "Comment_on_IMPORTANT_CFSI_REPRESENTATIONAL_INVARIANTS" in 491 priv_storage.h are observed. */ 492static void check_CFSI_related_invariants ( const DebugInfo* di ) 493{ 494 DebugInfo* di2 = NULL; 495 Bool has_nonempty_rx = False; 496 Bool cfsi_fits = False; 497 Word i, j; 498 vg_assert(di); 499 /* This fn isn't called until after debuginfo for this object has 500 been successfully read. And that shouldn't happen until we have 501 both a r-x and rw- mapping for the object. Hence: */ 502 vg_assert(di->fsm.have_rx_map); 503 vg_assert(di->fsm.have_rw_map); 504 for (i = 0; i < VG_(sizeXA)(di->fsm.maps); i++) { 505 const DebugInfoMapping* map = VG_(indexXA)(di->fsm.maps, i); 506 /* We are interested in r-x mappings only */ 507 if (!map->rx) 508 continue; 509 510 /* degenerate case: r-x section is empty */ 511 if (map->size == 0) 512 continue; 513 has_nonempty_rx = True; 514 515 /* normal case: r-x section is nonempty */ 516 /* invariant (0) */ 517 vg_assert(map->size > 0); 518 519 /* invariant (1) */ 520 for (di2 = debugInfo_list; di2; di2 = di2->next) { 521 if (di2 == di) 522 continue; 523 for (j = 0; j < VG_(sizeXA)(di2->fsm.maps); j++) { 524 const DebugInfoMapping* map2 = VG_(indexXA)(di2->fsm.maps, j); 525 if (!map2->rx || map2->size == 0) 526 continue; 527 vg_assert(!ranges_overlap(map->avma, map->size, 528 map2->avma, map2->size)); 529 } 530 } 531 di2 = NULL; 532 533 /* invariant (2) */ 534 if (di->cfsi_rd) { 535 vg_assert(di->cfsi_minavma <= di->cfsi_maxavma); /* duh! */ 536 /* Assume the csfi fits completely into one individual mapping 537 for now. This might need to be improved/reworked later. */ 538 if (di->cfsi_minavma >= map->avma && 539 di->cfsi_maxavma < map->avma + map->size) 540 cfsi_fits = True; 541 } 542 } 543 544 /* degenerate case: all r-x sections are empty */ 545 if (!has_nonempty_rx) { 546 vg_assert(di->cfsi_rd == NULL); 547 return; 548 } 549 550 /* invariant (2) - cont. */ 551 if (di->cfsi_rd) 552 vg_assert(cfsi_fits); 553 554 /* invariants (3) and (4) */ 555 if (di->cfsi_rd) { 556 vg_assert(di->cfsi_used > 0); 557 vg_assert(di->cfsi_size > 0); 558 for (i = 0; i < di->cfsi_used; i++) { 559 DiCfSI* cfsi = &di->cfsi_rd[i]; 560 vg_assert(cfsi->len > 0); 561 vg_assert(cfsi->base >= di->cfsi_minavma); 562 vg_assert(cfsi->base + cfsi->len - 1 <= di->cfsi_maxavma); 563 if (i > 0) { 564 DiCfSI* cfsip = &di->cfsi_rd[i-1]; 565 vg_assert(cfsip->base + cfsip->len <= cfsi->base); 566 } 567 } 568 } else { 569 vg_assert(di->cfsi_used == 0); 570 vg_assert(di->cfsi_size == 0); 571 } 572} 573 574 575/*--------------------------------------------------------------*/ 576/*--- ---*/ 577/*--- TOP LEVEL: INITIALISE THE DEBUGINFO SYSTEM ---*/ 578/*--- ---*/ 579/*--------------------------------------------------------------*/ 580 581void VG_(di_initialise) ( void ) 582{ 583 /* There's actually very little to do here, since everything 584 centers around the DebugInfos in debugInfo_list, they are 585 created and destroyed on demand, and each one is treated more or 586 less independently. */ 587 vg_assert(debugInfo_list == NULL); 588 589 /* flush the CFI fast query cache. */ 590 cfsi_m_cache__invalidate(); 591} 592 593 594/*--------------------------------------------------------------*/ 595/*--- ---*/ 596/*--- TOP LEVEL: NOTIFICATION (ACQUIRE/DISCARD INFO) (LINUX) ---*/ 597/*--- ---*/ 598/*--------------------------------------------------------------*/ 599 600#if defined(VGO_linux) || defined(VGO_darwin) 601 602/* Helper (indirect) for di_notify_ACHIEVE_ACCEPT_STATE */ 603static Bool overlaps_DebugInfoMappings ( const DebugInfoMapping* map1, 604 const DebugInfoMapping* map2 ) 605{ 606 vg_assert(map1 && map2 && map1 != map2); 607 vg_assert(map1->size != 0 && map2->size != 0); 608 if (map1->avma + map1->size <= map2->avma) return False; 609 if (map2->avma + map2->size <= map1->avma) return False; 610 return True; 611} 612 613 614/* Helper (indirect) for di_notify_ACHIEVE_ACCEPT_STATE */ 615static void show_DebugInfoMappings 616 ( const DebugInfo* di, 617 /*MOD*/XArray* maps /* XArray<DebugInfoMapping> */ ) 618{ 619 Word i, n; 620 vg_assert(maps); 621 n = VG_(sizeXA)(maps); 622 for (i = 0; i < n; i++) { 623 const DebugInfoMapping* map = VG_(indexXA)(maps, i); 624 TRACE_SYMTAB(" [%ld] avma 0x%-16llx size %-8lu " 625 "foff %-8lld %s %s %s\n", 626 i, (ULong)map->avma, map->size, (Long)map->foff, 627 map->rx ? "rx" : "--", 628 map->rw ? "rw" : "--", 629 map->ro ? "ro" : "--"); 630 } 631} 632 633 634/* Helper for di_notify_ACHIEVE_ACCEPT_STATE. This removes overlaps 635 in |maps|, in a fairly weak way, by truncating overlapping ends. 636 This may need to be strengthened in future. Currently it performs 637 a post-fixup check, so as least we can be sure that if this 638 function returns (rather than asserts) that |maps| is overlap 639 free. */ 640static void truncate_DebugInfoMapping_overlaps 641 ( const DebugInfo* di, 642 /*MOD*/XArray* maps /* XArray<DebugInfoMapping> */ ) 643{ 644 TRACE_SYMTAB("Un-de-overlapped _DebugInfoMappings:\n"); 645 show_DebugInfoMappings(di, maps); 646 TRACE_SYMTAB("\n"); 647 648 Word i, j, n; 649 DebugInfoMapping *map_i, *map_j; 650 651 n = VG_(sizeXA)(maps); 652 for (i = 0; i < n; i++) { 653 654 map_i = VG_(indexXA)(maps, i); 655 if (map_i->size == 0) 656 continue; // Hmm, mutancy. Shouldn't happen. 657 658 for (j = i+1; j < n; j++) { 659 660 map_j = VG_(indexXA)(maps, j); 661 if (map_j->size == 0) 662 continue; // Hmm, mutancy. Shouldn't happen. 663 664 /* map_j was observed later than map_i, since the entries are 665 in the XArray in the order in which they were observed. 666 If map_j starts inside map_i, trim map_i's end so it does 667 not overlap map_j. This reflects the reality that when 668 two mmaped areas overlap, the later mmap silently 669 overwrites the earlier mmap's mapping. */ 670 if (map_j->avma >= map_i->avma 671 && map_j->avma < map_i->avma + map_i->size) { 672 SizeT map_i_newsize = map_j->avma - map_i->avma; 673 vg_assert(map_i_newsize < map_i->size); 674 map_i->size = map_i_newsize; 675 } 676 677 } 678 } 679 680 TRACE_SYMTAB("De-overlapped DebugInfoMappings:\n"); 681 show_DebugInfoMappings(di, maps); 682 TRACE_SYMTAB("\n"); 683 TRACE_SYMTAB("Checking that there are no remaining overlaps.\n"); 684 685 for (i = 0; i < n; i++) { 686 map_i = VG_(indexXA)(maps, i); 687 if (map_i->size == 0) 688 continue; 689 for (j = i+1; j < n; j++) { 690 map_j = VG_(indexXA)(maps, j); 691 if (map_j->size == 0) 692 continue; 693 Bool overlap 694 = overlaps_DebugInfoMappings( map_i, map_j ); 695 /* If the following assert ever fails, it means the de-overlapping 696 scheme above is too weak, and needs improvement. */ 697 vg_assert(!overlap); 698 } 699 } 700 701 TRACE_SYMTAB("Check successful.\n"); 702} 703 704 705/* The debug info system is driven by notifications that a text 706 segment has been mapped in, or unmapped, or when sections change 707 permission. It's all a bit kludgey and basically means watching 708 syscalls, trying to second-guess when the system's dynamic linker 709 is done with mapping in a new object for execution. This is all 710 tracked using the DebugInfoFSM struct for the object. Anyway, once 711 we finally decide we've got to an accept state, this section then 712 will acquire whatever info is available for the corresponding 713 object. This section contains the notification handlers, which 714 update the FSM and determine when an accept state has been reached. 715*/ 716 717/* When the sequence of observations causes a DebugInfoFSM to move 718 into the accept state, call here to actually get the debuginfo read 719 in. Returns a ULong whose purpose is described in comments 720 preceding VG_(di_notify_mmap) just below. 721*/ 722static ULong di_notify_ACHIEVE_ACCEPT_STATE ( struct _DebugInfo* di ) 723{ 724 ULong di_handle; 725 Bool ok; 726 727 vg_assert(di->fsm.filename); 728 TRACE_SYMTAB("\n"); 729 TRACE_SYMTAB("------ start ELF OBJECT " 730 "-------------------------" 731 "------------------------------\n"); 732 TRACE_SYMTAB("------ name = %s\n", di->fsm.filename); 733 TRACE_SYMTAB("\n"); 734 735 /* We're going to read symbols and debug info for the avma 736 ranges specified in the _DebugInfoFsm mapping array. First 737 get rid of any other DebugInfos which overlap any of those 738 ranges (to avoid total confusion). */ 739 discard_DebugInfos_which_overlap_with( di ); 740 741 /* The DebugInfoMappings that now exist in the FSM may involve 742 overlaps. This confuses ML_(read_elf_debug_info), and may cause 743 it to compute wrong biases. So de-overlap them now. 744 See http://bugzilla.mozilla.org/show_bug.cgi?id=788974 */ 745 truncate_DebugInfoMapping_overlaps( di, di->fsm.maps ); 746 747 /* And acquire new info. */ 748# if defined(VGO_linux) 749 ok = ML_(read_elf_debug_info)( di ); 750# elif defined(VGO_darwin) 751 ok = ML_(read_macho_debug_info)( di ); 752# else 753# error "unknown OS" 754# endif 755 756 if (ok) { 757 758 TRACE_SYMTAB("\n------ Canonicalising the " 759 "acquired info ------\n"); 760 /* invalidate the CFI unwind cache. */ 761 cfsi_m_cache__invalidate(); 762 /* prepare read data for use */ 763 ML_(canonicaliseTables)( di ); 764 /* Check invariants listed in 765 Comment_on_IMPORTANT_REPRESENTATIONAL_INVARIANTS in 766 priv_storage.h. */ 767 check_CFSI_related_invariants(di); 768 ML_(finish_CFSI_arrays)(di); 769 /* notify m_redir about it */ 770 TRACE_SYMTAB("\n------ Notifying m_redir ------\n"); 771 VG_(redir_notify_new_DebugInfo)( di ); 772 /* Note that we succeeded */ 773 di->have_dinfo = True; 774 vg_assert(di->handle > 0); 775 di_handle = di->handle; 776 777 } else { 778 TRACE_SYMTAB("\n------ ELF reading failed ------\n"); 779 /* Something went wrong (eg. bad ELF file). Should we delete 780 this DebugInfo? No - it contains info on the rw/rx 781 mappings, at least. */ 782 di_handle = 0; 783 vg_assert(di->have_dinfo == False); 784 } 785 786 TRACE_SYMTAB("\n"); 787 TRACE_SYMTAB("------ name = %s\n", di->fsm.filename); 788 TRACE_SYMTAB("------ end ELF OBJECT " 789 "-------------------------" 790 "------------------------------\n"); 791 TRACE_SYMTAB("\n"); 792 793 return di_handle; 794} 795 796 797/* Notify the debuginfo system about a new mapping. This is the way 798 new debug information gets loaded. If allow_SkFileV is True, it 799 will try load debug info if the mapping at 'a' belongs to Valgrind; 800 whereas normally (False) it will not do that. This allows us to 801 carefully control when the thing will read symbols from the 802 Valgrind executable itself. 803 804 If use_fd is not -1, that is used instead of the filename; this 805 avoids perturbing fcntl locks, which are released by simply 806 re-opening and closing the same file (even via different fd!). 807 808 If a call to VG_(di_notify_mmap) causes debug info to be read, then 809 the returned ULong is an abstract handle which can later be used to 810 refer to the debuginfo read as a result of this specific mapping, 811 in later queries to m_debuginfo. In this case the handle value 812 will be one or above. If the returned value is zero, no debug info 813 was read. */ 814 815ULong VG_(di_notify_mmap)( Addr a, Bool allow_SkFileV, Int use_fd ) 816{ 817 NSegment const * seg; 818 const HChar* filename; 819 Bool is_rx_map, is_rw_map, is_ro_map; 820 DebugInfo* di; 821 Int actual_fd, oflags; 822 SysRes preadres; 823 HChar buf1k[1024]; 824 Bool debug = (DEBUG_FSM != 0); 825 SysRes statres; 826 struct vg_stat statbuf; 827 828 vg_assert(use_fd >= -1); 829 830 /* In short, figure out if this mapping is of interest to us, and 831 if so, try to guess what ld.so is doing and when/if we should 832 read debug info. */ 833 seg = VG_(am_find_nsegment)(a); 834 vg_assert(seg); 835 836 if (debug) { 837 VG_(printf)("di_notify_mmap-0:\n"); 838 VG_(printf)("di_notify_mmap-1: %#lx-%#lx %c%c%c\n", 839 seg->start, seg->end, 840 seg->hasR ? 'r' : '-', 841 seg->hasW ? 'w' : '-',seg->hasX ? 'x' : '-' ); 842 } 843 844 /* guaranteed by aspacemgr-linux.c, sane_NSegment() */ 845 vg_assert(seg->end > seg->start); 846 847 /* Ignore non-file mappings */ 848 if ( ! (seg->kind == SkFileC 849 || (seg->kind == SkFileV && allow_SkFileV)) ) 850 return 0; 851 852 /* If the file doesn't have a name, we're hosed. Give up. */ 853 filename = VG_(am_get_filename)( seg ); 854 if (!filename) 855 return 0; 856 857 /* 858 * Cannot read from these magic files: 859 * --20208-- WARNING: Serious error when reading debug info 860 * --20208-- When reading debug info from /proc/xen/privcmd: 861 * --20208-- can't read file to inspect ELF header 862 */ 863 if (VG_(strncmp)(filename, "/proc/xen/", 10) == 0) 864 return 0; 865 866 if (debug) 867 VG_(printf)("di_notify_mmap-2: %s\n", filename); 868 869 /* Only try to read debug information from regular files. */ 870 statres = VG_(stat)(filename, &statbuf); 871 872 /* stat dereferences symlinks, so we don't expect it to succeed and 873 yet produce something that is a symlink. */ 874 vg_assert(sr_isError(statres) || ! VKI_S_ISLNK(statbuf.mode)); 875 876 /* Don't let the stat call fail silently. Filter out some known 877 sources of noise before complaining, though. */ 878 if (sr_isError(statres)) { 879 DebugInfo fake_di; 880 Bool quiet = VG_(strstr)(filename, "/var/run/nscd/") != NULL; 881 if (!quiet && VG_(clo_verbosity) > 1) { 882 VG_(memset)(&fake_di, 0, sizeof(fake_di)); 883 fake_di.fsm.filename = ML_(dinfo_strdup)("di.debuginfo.nmm", filename); 884 ML_(symerr)(&fake_di, True, "failed to stat64/stat this file"); 885 } 886 return 0; 887 } 888 889 /* Finally, the point of all this stattery: if it's not a regular file, 890 don't try to read debug info from it. */ 891 if (! VKI_S_ISREG(statbuf.mode)) 892 return 0; 893 894 /* no uses of statbuf below here. */ 895 896 /* Now we have to guess if this is a text-like mapping, a data-like 897 mapping, neither or both. The rules are: 898 899 text if: x86-linux r and x 900 other-linux r and x and not w 901 902 data if: x86-linux r and w 903 other-linux r and w and not x 904 905 Background: On x86-linux, objects are typically mapped twice: 906 907 1b8fb000-1b8ff000 r-xp 00000000 08:02 4471477 vgpreload_memcheck.so 908 1b8ff000-1b900000 rw-p 00004000 08:02 4471477 vgpreload_memcheck.so 909 910 whereas ppc32-linux mysteriously does this: 911 912 118a6000-118ad000 r-xp 00000000 08:05 14209428 vgpreload_memcheck.so 913 118ad000-118b6000 ---p 00007000 08:05 14209428 vgpreload_memcheck.so 914 118b6000-118bd000 rwxp 00000000 08:05 14209428 vgpreload_memcheck.so 915 916 The third mapping should not be considered to have executable 917 code in. Therefore a test which works for both is: r and x and 918 NOT w. Reading symbols from the rwx segment -- which overlaps 919 the r-x segment in the file -- causes the redirection mechanism 920 to redirect to addresses in that third segment, which is wrong 921 and causes crashes. 922 923 JRS 28 Dec 05: unfortunately icc 8.1 on x86 has been seen to 924 produce executables with a single rwx segment rather than a 925 (r-x,rw-) pair. That means the rules have to be modified thusly: 926 927 x86-linux: consider if r and x 928 all others: consider if r and x and not w 929 930 2009 Aug 16: apply similar kludge to ppc32-linux. 931 See http://bugs.kde.org/show_bug.cgi?id=190820 932 933 There are two modes on s390x: with and without the noexec kernel 934 parameter. Together with some older kernels, this leads to several 935 variants: 936 executable: r and x 937 data: r and w and x 938 or 939 executable: r and x 940 data: r and w 941 */ 942 is_rx_map = False; 943 is_rw_map = False; 944 is_ro_map = False; 945 946# if defined(VGA_x86) || defined(VGA_ppc32) || defined(VGA_mips32) \ 947 || defined(VGA_mips64) 948 is_rx_map = seg->hasR && seg->hasX; 949 is_rw_map = seg->hasR && seg->hasW; 950# elif defined(VGA_amd64) || defined(VGA_ppc64be) || defined(VGA_ppc64le) \ 951 || defined(VGA_arm) || defined(VGA_arm64) 952 is_rx_map = seg->hasR && seg->hasX && !seg->hasW; 953 is_rw_map = seg->hasR && seg->hasW && !seg->hasX; 954# elif defined(VGP_s390x_linux) 955 is_rx_map = seg->hasR && seg->hasX && !seg->hasW; 956 is_rw_map = seg->hasR && seg->hasW; 957# elif defined(VGA_tilegx) 958 is_rx_map = seg->hasR && seg->hasX; // && !seg->hasW; 959 is_rw_map = seg->hasR && seg->hasW; // && !seg->hasX; 960# else 961# error "Unknown platform" 962# endif 963 964# if defined(VGP_x86_darwin) && DARWIN_VERS >= DARWIN_10_7 965 is_ro_map = seg->hasR && !seg->hasW && !seg->hasX; 966# endif 967 968 if (debug) 969 VG_(printf)("di_notify_mmap-3: " 970 "is_rx_map %d, is_rw_map %d, is_ro_map %d\n", 971 (Int)is_rx_map, (Int)is_rw_map, (Int)is_ro_map); 972 973 /* Ignore mappings with permissions we can't possibly be interested in. */ 974 if (!(is_rx_map || is_rw_map || is_ro_map)) 975 return 0; 976 977 /* Peer at the first few bytes of the file, to see if it is an ELF */ 978 /* object file. Ignore the file if we do not have read permission. */ 979 VG_(memset)(buf1k, 0, sizeof(buf1k)); 980 oflags = VKI_O_RDONLY; 981# if defined(VKI_O_LARGEFILE) 982 oflags |= VKI_O_LARGEFILE; 983# endif 984 985 if (use_fd == -1) { 986 SysRes fd = VG_(open)( filename, oflags, 0 ); 987 if (sr_isError(fd)) { 988 if (sr_Err(fd) != VKI_EACCES) { 989 DebugInfo fake_di; 990 VG_(memset)(&fake_di, 0, sizeof(fake_di)); 991 fake_di.fsm.filename = ML_(dinfo_strdup)("di.debuginfo.nmm", 992 filename); 993 ML_(symerr)(&fake_di, True, 994 "can't open file to inspect ELF header"); 995 } 996 return 0; 997 } 998 actual_fd = sr_Res(fd); 999 } else { 1000 actual_fd = use_fd; 1001 } 1002 1003 preadres = VG_(pread)( actual_fd, buf1k, sizeof(buf1k), 0 ); 1004 if (use_fd == -1) { 1005 VG_(close)( actual_fd ); 1006 } 1007 1008 if (sr_isError(preadres)) { 1009 DebugInfo fake_di; 1010 VG_(memset)(&fake_di, 0, sizeof(fake_di)); 1011 fake_di.fsm.filename = ML_(dinfo_strdup)("di.debuginfo.nmm", filename); 1012 ML_(symerr)(&fake_di, True, "can't read file to inspect ELF header"); 1013 return 0; 1014 } 1015 if (sr_Res(preadres) == 0) 1016 return 0; 1017 vg_assert(sr_Res(preadres) > 0 && sr_Res(preadres) <= sizeof(buf1k) ); 1018 1019 /* We're only interested in mappings of object files. */ 1020# if defined(VGO_linux) 1021 if (!ML_(is_elf_object_file)( buf1k, (SizeT)sr_Res(preadres), False )) 1022 return 0; 1023# elif defined(VGO_darwin) 1024 if (!ML_(is_macho_object_file)( buf1k, (SizeT)sr_Res(preadres) )) 1025 return 0; 1026# else 1027# error "unknown OS" 1028# endif 1029 1030 /* See if we have a DebugInfo for this filename. If not, 1031 create one. */ 1032 di = find_or_create_DebugInfo_for( filename ); 1033 vg_assert(di); 1034 1035 if (debug) 1036 VG_(printf)("di_notify_mmap-4: " 1037 "noting details in DebugInfo* at %p\n", di); 1038 1039 /* Note the details about the mapping. */ 1040 DebugInfoMapping map; 1041 map.avma = a; 1042 map.size = seg->end + 1 - seg->start; 1043 map.foff = seg->offset; 1044 map.rx = is_rx_map; 1045 map.rw = is_rw_map; 1046 map.ro = is_ro_map; 1047 VG_(addToXA)(di->fsm.maps, &map); 1048 1049 /* Update flags about what kind of mappings we've already seen. */ 1050 di->fsm.have_rx_map |= is_rx_map; 1051 di->fsm.have_rw_map |= is_rw_map; 1052 di->fsm.have_ro_map |= is_ro_map; 1053 1054 /* So, finally, are we in an accept state? */ 1055 if (di->fsm.have_rx_map && di->fsm.have_rw_map && !di->have_dinfo) { 1056 /* Ok, so, finally, we found what we need, and we haven't 1057 already read debuginfo for this object. So let's do so now. 1058 Yee-ha! */ 1059 if (debug) 1060 VG_(printf)("di_notify_mmap-5: " 1061 "achieved accept state for %s\n", filename); 1062 return di_notify_ACHIEVE_ACCEPT_STATE ( di ); 1063 } else { 1064 /* If we don't have an rx and rw mapping, or if we already have 1065 debuginfo for this mapping for whatever reason, go no 1066 further. */ 1067 return 0; 1068 } 1069} 1070 1071 1072/* Unmap is simpler - throw away any SegInfos intersecting 1073 [a, a+len). */ 1074void VG_(di_notify_munmap)( Addr a, SizeT len ) 1075{ 1076 Bool anyFound; 1077 if (0) VG_(printf)("DISCARD %#lx %#lx\n", a, a+len); 1078 anyFound = discard_syms_in_range(a, len); 1079 if (anyFound) 1080 cfsi_m_cache__invalidate(); 1081} 1082 1083 1084/* Uh, this doesn't do anything at all. IIRC glibc (or ld.so, I don't 1085 remember) does a bunch of mprotects on itself, and if we follow 1086 through here, it causes the debug info for that object to get 1087 discarded. */ 1088void VG_(di_notify_mprotect)( Addr a, SizeT len, UInt prot ) 1089{ 1090 Bool exe_ok = toBool(prot & VKI_PROT_EXEC); 1091# if defined(VGA_x86) 1092 exe_ok = exe_ok || toBool(prot & VKI_PROT_READ); 1093# endif 1094 if (0 && !exe_ok) { 1095 Bool anyFound = discard_syms_in_range(a, len); 1096 if (anyFound) 1097 cfsi_m_cache__invalidate(); 1098 } 1099} 1100 1101 1102/* This is a MacOSX >= 10.7 32-bit only special. See comments on the 1103 declaration of struct _DebugInfoFSM for details. */ 1104void VG_(di_notify_vm_protect)( Addr a, SizeT len, UInt prot ) 1105{ 1106 Bool debug = (DEBUG_FSM != 0); 1107 1108 Bool r_ok = toBool(prot & VKI_PROT_READ); 1109 Bool w_ok = toBool(prot & VKI_PROT_WRITE); 1110 Bool x_ok = toBool(prot & VKI_PROT_EXEC); 1111 if (debug) { 1112 VG_(printf)("di_notify_vm_protect-0:\n"); 1113 VG_(printf)("di_notify_vm_protect-1: %#lx-%#lx %c%c%c\n", 1114 a, a + len - 1, 1115 r_ok ? 'r' : '-', w_ok ? 'w' : '-', x_ok ? 'x' : '-' ); 1116 } 1117 1118 Bool do_nothing = True; 1119# if defined(VGP_x86_darwin) && (DARWIN_VERS >= DARWIN_10_7) 1120 do_nothing = False; 1121# endif 1122 if (do_nothing /* wrong platform */) { 1123 if (debug) 1124 VG_(printf)("di_notify_vm_protect-2: wrong platform, " 1125 "doing nothing.\n"); 1126 return; 1127 } 1128 1129 if (! (r_ok && !w_ok && x_ok)) 1130 return; /* not an upgrade to r-x */ 1131 1132 /* Find a DebugInfo containing a FSM that has [a, +len) previously 1133 observed as a r-- mapping, plus some other rw- mapping. If such 1134 is found, conclude we're in an accept state and read debuginfo 1135 accordingly. */ 1136 if (debug) 1137 VG_(printf)("di_notify_vm_protect-3: looking for existing DebugInfo*\n"); 1138 DebugInfo* di; 1139 DebugInfoMapping *map = NULL; 1140 Word i; 1141 for (di = debugInfo_list; di; di = di->next) { 1142 vg_assert(di->fsm.filename); 1143 if (di->have_dinfo) 1144 continue; /* already have debuginfo for this object */ 1145 if (!di->fsm.have_ro_map) 1146 continue; /* need to have a r-- mapping for this object */ 1147 if (di->fsm.have_rx_map) 1148 continue; /* rx- mapping already exists */ 1149 if (!di->fsm.have_rw_map) 1150 continue; /* need to have a rw- mapping */ 1151 /* Try to find a mapping matching the memory area. */ 1152 for (i = 0; i < VG_(sizeXA)(di->fsm.maps); i++) { 1153 map = VG_(indexXA)(di->fsm.maps, i); 1154 if (map->ro && map->avma == a && map->size == len) 1155 break; 1156 map = NULL; 1157 } 1158 if (!map) 1159 continue; /* this isn't an upgrade of an r-- mapping */ 1160 /* looks like we're in luck! */ 1161 break; 1162 } 1163 if (di == NULL) 1164 return; /* didn't find anything */ 1165 1166 if (debug) 1167 VG_(printf)("di_notify_vm_protect-4: found existing DebugInfo* at %p\n", 1168 di); 1169 1170 /* Do the upgrade. Simply update the flags of the mapping 1171 and pretend we never saw the RO map at all. */ 1172 vg_assert(di->fsm.have_ro_map); 1173 map->rx = True; 1174 map->ro = False; 1175 di->fsm.have_rx_map = True; 1176 di->fsm.have_ro_map = False; 1177 /* See if there are any more ro mappings */ 1178 for (i = 0; i < VG_(sizeXA)(di->fsm.maps); i++) { 1179 map = VG_(indexXA)(di->fsm.maps, i); 1180 if (map->ro) { 1181 di->fsm.have_ro_map = True; 1182 break; 1183 } 1184 } 1185 1186 /* Check if we're now in an accept state and read debuginfo. Finally. */ 1187 if (di->fsm.have_rx_map && di->fsm.have_rw_map && !di->have_dinfo) { 1188 if (debug) 1189 VG_(printf)("di_notify_vm_protect-5: " 1190 "achieved accept state for %s\n", di->fsm.filename); 1191 ULong di_handle __attribute__((unused)) 1192 = di_notify_ACHIEVE_ACCEPT_STATE( di ); 1193 /* di_handle is ignored. That's not a problem per se -- it just 1194 means nobody will ever be able to refer to this debuginfo by 1195 handle since nobody will know what the handle value is. */ 1196 } 1197} 1198 1199 1200/*--------- PDB (windows debug info) reading --------- */ 1201 1202/* this should really return ULong, as per VG_(di_notify_mmap). */ 1203void VG_(di_notify_pdb_debuginfo)( Int fd_obj, Addr avma_obj, 1204 SizeT total_size, PtrdiffT bias_obj ) 1205{ 1206 Int i, r, sz_exename; 1207 ULong obj_mtime, pdb_mtime; 1208 HChar* pdbname = NULL; 1209 HChar* dot; 1210 SysRes sres; 1211 Int fd_pdbimage; 1212 SizeT n_pdbimage; 1213 struct vg_stat stat_buf; 1214 1215 if (VG_(clo_verbosity) > 0) { 1216 VG_(message)(Vg_UserMsg, "\n"); 1217 VG_(message)(Vg_UserMsg, 1218 "LOAD_PDB_DEBUGINFO: clreq: fd=%d, avma=%#lx, total_size=%lu, " 1219 "bias=%#lx\n", 1220 fd_obj, avma_obj, total_size, bias_obj 1221 ); 1222 } 1223 1224 /* 'fd' refers to the .exe/.dll we're dealing with. Get its modification 1225 time into obj_mtime. */ 1226 r = VG_(fstat)(fd_obj, &stat_buf); 1227 if (r == -1) 1228 return; /* stat failed ?! */ 1229 vg_assert(r == 0); 1230 obj_mtime = stat_buf.mtime; 1231 1232 /* and get its name into exename. */ 1233 const HChar *exe; 1234 if (! VG_(resolve_filename)(fd_obj, &exe)) 1235 return; /* failed */ 1236 sz_exename = VG_(strlen)(exe); 1237 HChar exename[sz_exename + 1]; 1238 VG_(strcpy)(exename, exe); // make a copy on the stack 1239 1240 if (VG_(clo_verbosity) > 0) { 1241 VG_(message)(Vg_UserMsg, "LOAD_PDB_DEBUGINFO: objname: %s\n", exename); 1242 } 1243 1244 /* Try to get the PDB file name from the executable. */ 1245 pdbname = ML_(find_name_of_pdb_file)(exename); 1246 if (pdbname) { 1247 vg_assert(VG_(strlen)(pdbname) >= 5); /* 5 = strlen("X.pdb") */ 1248 /* So we successfully extracted a name from the PE file. But it's 1249 likely to be of the form 1250 e:\foo\bar\xyzzy\wibble.pdb 1251 and we need to change it into something we can actually open 1252 in Wine-world, which basically means turning it into 1253 $HOME/.wine/drive_e/foo/bar/xyzzy/wibble.pdb 1254 We also take into account $WINEPREFIX, if it is set. 1255 For the moment, if the name isn't fully qualified, just forget it 1256 (we'd have to root around to find where the pdb actually is) 1257 */ 1258 /* Change all the backslashes to forward slashes */ 1259 for (i = 0; pdbname[i]; i++) { 1260 if (pdbname[i] == '\\') 1261 pdbname[i] = '/'; 1262 } 1263 Bool is_quald 1264 = ('a' <= VG_(tolower)(pdbname[0]) && VG_(tolower)(pdbname[0]) <= 'z') 1265 && pdbname[1] == ':' 1266 && pdbname[2] == '/'; 1267 HChar* home = VG_(getenv)("HOME"); 1268 HChar* wpfx = VG_(getenv)("WINEPREFIX"); 1269 if (is_quald && wpfx) { 1270 /* Change e:/foo/bar/xyzzy/wibble.pdb 1271 to $WINEPREFIX/drive_e/foo/bar/xyzzy/wibble.pdb 1272 */ 1273 Int mashedSzB = VG_(strlen)(pdbname) + VG_(strlen)(wpfx) + 50/*misc*/; 1274 HChar* mashed = ML_(dinfo_zalloc)("di.debuginfo.dnpdi.1", mashedSzB); 1275 VG_(snprintf)(mashed, mashedSzB, "%s/drive_%c%s", 1276 wpfx, pdbname[0], &pdbname[2]); 1277 vg_assert(mashed[mashedSzB-1] == 0); 1278 ML_(dinfo_free)(pdbname); 1279 pdbname = mashed; 1280 } 1281 else if (is_quald && home && !wpfx) { 1282 /* Change e:/foo/bar/xyzzy/wibble.pdb 1283 to $HOME/.wine/drive_e/foo/bar/xyzzy/wibble.pdb 1284 */ 1285 Int mashedSzB = VG_(strlen)(pdbname) + VG_(strlen)(home) + 50/*misc*/; 1286 HChar* mashed = ML_(dinfo_zalloc)("di.debuginfo.dnpdi.2", mashedSzB); 1287 VG_(snprintf)(mashed, mashedSzB, "%s/.wine/drive_%c%s", 1288 home, pdbname[0], &pdbname[2]); 1289 vg_assert(mashed[mashedSzB-1] == 0); 1290 ML_(dinfo_free)(pdbname); 1291 pdbname = mashed; 1292 } else { 1293 /* It's not a fully qualified path, or neither $HOME nor $WINE 1294 are set (strange). Give up. */ 1295 ML_(dinfo_free)(pdbname); 1296 pdbname = NULL; 1297 } 1298 } 1299 1300 /* Try s/exe/pdb/ if we don't have a valid pdbname. */ 1301 if (!pdbname) { 1302 /* Try to find a matching PDB file from which to read debuginfo. 1303 Windows PE files have symbol tables and line number information, 1304 but MSVC doesn't seem to use them. */ 1305 /* Why +5 ? Because in the worst case, we could find a dot as the 1306 last character of pdbname, and we'd then put "pdb" right after 1307 it, hence extending it a bit. */ 1308 pdbname = ML_(dinfo_zalloc)("di.debuginfo.lpd1", sz_exename+5); 1309 VG_(strcpy)(pdbname, exename); 1310 vg_assert(pdbname[sz_exename+5-1] == 0); 1311 dot = VG_(strrchr)(pdbname, '.'); 1312 if (!dot) 1313 goto out; /* there's no dot in the exe's name ?! */ 1314 if (dot[1] == 0) 1315 goto out; /* hmm, path ends in "." */ 1316 1317 if ('A' <= dot[1] && dot[1] <= 'Z') 1318 VG_(strcpy)(dot, ".PDB"); 1319 else 1320 VG_(strcpy)(dot, ".pdb"); 1321 1322 vg_assert(pdbname[sz_exename+5-1] == 0); 1323 } 1324 1325 /* See if we can find it, and check it's in-dateness. */ 1326 sres = VG_(stat)(pdbname, &stat_buf); 1327 if (sr_isError(sres)) { 1328 VG_(message)(Vg_UserMsg, "Warning: Missing or un-stat-able %s\n", 1329 pdbname); 1330 if (VG_(clo_verbosity) > 0) 1331 VG_(message)(Vg_UserMsg, "LOAD_PDB_DEBUGINFO: missing: %s\n", pdbname); 1332 goto out; 1333 } 1334 pdb_mtime = stat_buf.mtime; 1335 1336 if (obj_mtime > pdb_mtime + 60ULL) { 1337 /* PDB file is older than PE file. Really, the PDB should be 1338 newer than the PE, but that doesn't always seem to be the 1339 case. Allow the PDB to be up to one minute older. 1340 Otherwise, it's probably out of date, in which case ignore it 1341 or we will either (a) print wrong stack traces or more likely 1342 (b) crash. 1343 */ 1344 VG_(message)(Vg_UserMsg, 1345 "Warning: %s (mtime = %llu)\n" 1346 " is older than %s (mtime = %llu)\n", 1347 pdbname, pdb_mtime, exename, obj_mtime); 1348 } 1349 1350 sres = VG_(open)(pdbname, VKI_O_RDONLY, 0); 1351 if (sr_isError(sres)) { 1352 VG_(message)(Vg_UserMsg, "Warning: Can't open %s\n", pdbname); 1353 goto out; 1354 } 1355 1356 /* Looks promising; go on to try and read stuff from it. But don't 1357 mmap the file. Instead mmap free space and read the file into 1358 it. This is because files on CIFS filesystems that are mounted 1359 '-o directio' can't be mmap'd, and that mount option is needed 1360 to make CIFS work reliably. (See 1361 http://www.nabble.com/Corrupted-data-on-write-to- 1362 Windows-2003-Server-t2782623.html) 1363 This is slower, but at least it works reliably. */ 1364 fd_pdbimage = sr_Res(sres); 1365 n_pdbimage = stat_buf.size; 1366 if (n_pdbimage == 0 || n_pdbimage > 0x7FFFFFFF) { 1367 // 0x7FFFFFFF: why? Because the VG_(read) just below only 1368 // can deal with a signed int as the size of data to read, 1369 // so we can't reliably check for read failure for files 1370 // greater than that size. Hence just skip them; we're 1371 // unlikely to encounter a PDB that large anyway. 1372 VG_(close)(fd_pdbimage); 1373 goto out; 1374 } 1375 sres = VG_(am_mmap_anon_float_valgrind)( n_pdbimage ); 1376 if (sr_isError(sres)) { 1377 VG_(close)(fd_pdbimage); 1378 goto out; 1379 } 1380 1381 void* pdbimage = (void*)sr_Res(sres); 1382 r = VG_(read)( fd_pdbimage, pdbimage, (Int)n_pdbimage ); 1383 if (r < 0 || r != (Int)n_pdbimage) { 1384 VG_(am_munmap_valgrind)( (Addr)pdbimage, n_pdbimage ); 1385 VG_(close)(fd_pdbimage); 1386 goto out; 1387 } 1388 1389 if (VG_(clo_verbosity) > 0) 1390 VG_(message)(Vg_UserMsg, "LOAD_PDB_DEBUGINFO: pdbname: %s\n", pdbname); 1391 1392 /* play safe; always invalidate the CFI cache. I don't know if 1393 this is necessary, but anyway .. */ 1394 cfsi_m_cache__invalidate(); 1395 /* dump old info for this range, if any */ 1396 discard_syms_in_range( avma_obj, total_size ); 1397 1398 { DebugInfo* di = find_or_create_DebugInfo_for(exename); 1399 1400 /* this di must be new, since we just nuked any old stuff in the range */ 1401 vg_assert(di && !di->fsm.have_rx_map && !di->fsm.have_rw_map); 1402 vg_assert(!di->have_dinfo); 1403 1404 /* don't set up any of the di-> fields; let 1405 ML_(read_pdb_debug_info) do it. */ 1406 ML_(read_pdb_debug_info)( di, avma_obj, bias_obj, 1407 pdbimage, n_pdbimage, pdbname, pdb_mtime ); 1408 // JRS fixme: take notice of return value from read_pdb_debug_info, 1409 // and handle failure 1410 vg_assert(di->have_dinfo); // fails if PDB read failed 1411 VG_(am_munmap_valgrind)( (Addr)pdbimage, n_pdbimage ); 1412 VG_(close)(fd_pdbimage); 1413 1414 if (VG_(clo_verbosity) > 0) { 1415 VG_(message)(Vg_UserMsg, "LOAD_PDB_DEBUGINFO: done: " 1416 "%lu syms, %lu src locs, %lu fpo recs\n", 1417 di->symtab_used, di->loctab_used, di->fpo_size); 1418 } 1419 } 1420 1421 out: 1422 if (pdbname) ML_(dinfo_free)(pdbname); 1423} 1424 1425#endif /* defined(VGO_linux) || defined(VGO_darwin) */ 1426 1427 1428/*------------------------------------------------------------*/ 1429/*--- ---*/ 1430/*--- TOP LEVEL: QUERYING EXISTING DEBUG INFO ---*/ 1431/*--- ---*/ 1432/*------------------------------------------------------------*/ 1433 1434void VG_(di_discard_ALL_debuginfo)( void ) 1435{ 1436 DebugInfo *di, *di2; 1437 di = debugInfo_list; 1438 while (di) { 1439 di2 = di->next; 1440 VG_(printf)("XXX rm %p\n", di); 1441 free_DebugInfo( di ); 1442 di = di2; 1443 } 1444} 1445 1446 1447DebugInfoMapping* ML_(find_rx_mapping) ( DebugInfo* di, Addr lo, Addr hi ) 1448{ 1449 Word i; 1450 vg_assert(lo <= hi); 1451 1452 /* Optimization: Try to use the last matched rx mapping first */ 1453 if ( di->last_rx_map 1454 && lo >= di->last_rx_map->avma 1455 && hi < di->last_rx_map->avma + di->last_rx_map->size) 1456 return di->last_rx_map; 1457 1458 for (i = 0; i < VG_(sizeXA)(di->fsm.maps); i++) { 1459 DebugInfoMapping* map = VG_(indexXA)(di->fsm.maps, i); 1460 if ( map->rx && map->size > 0 1461 && lo >= map->avma && hi < map->avma + map->size) { 1462 di->last_rx_map = map; 1463 return map; 1464 } 1465 } 1466 1467 return NULL; 1468} 1469 1470/*------------------------------------------------------------*/ 1471/*--- Types and functions for inlined IP cursor ---*/ 1472/*------------------------------------------------------------*/ 1473struct _InlIPCursor { 1474 Addr eip; // Cursor used to describe calls at eip. 1475 DebugInfo* di; // DebugInfo describing inlined calls at eip 1476 1477 Word inltab_lopos; // The inlined fn calls covering eip are in 1478 Word inltab_hipos; // di->inltab[inltab_lopos..inltab_hipos]. 1479 // Note that not all inlined fn calls in this range 1480 // are necessarily covering eip. 1481 1482 Int curlevel; // Current level to describe. 1483 // 0 means to describe eip itself. 1484 Word cur_inltab; // inltab pos for call inlined at current level. 1485 Word next_inltab; // inltab pos for call inlined at next (towards main) 1486 // level. 1487}; 1488 1489static Bool is_top(const InlIPCursor *iipc) 1490{ 1491 return !iipc || iipc->cur_inltab == -1; 1492} 1493 1494static Bool is_bottom(const InlIPCursor *iipc) 1495{ 1496 return !iipc || iipc->next_inltab == -1; 1497} 1498 1499Bool VG_(next_IIPC)(InlIPCursor *iipc) 1500{ 1501 Word i; 1502 DiInlLoc *hinl = NULL; 1503 Word hinl_pos = -1; 1504 DebugInfo *di; 1505 1506 if (iipc == NULL) 1507 return False; 1508 1509 if (iipc->curlevel <= 0) { 1510 iipc->curlevel--; 1511 return False; 1512 } 1513 1514 di = iipc->di; 1515 for (i = iipc->inltab_lopos; i <= iipc->inltab_hipos; i++) { 1516 if (di->inltab[i].addr_lo <= iipc->eip 1517 && iipc->eip < di->inltab[i].addr_hi 1518 && di->inltab[i].level < iipc->curlevel 1519 && (!hinl || hinl->level < di->inltab[i].level)) { 1520 hinl = &di->inltab[i]; 1521 hinl_pos = i; 1522 } 1523 } 1524 1525 iipc->cur_inltab = iipc->next_inltab; 1526 iipc->next_inltab = hinl_pos; 1527 if (iipc->next_inltab < 0) 1528 iipc->curlevel = 0; // no inlined call anymore, describe eip itself 1529 else 1530 iipc->curlevel = di->inltab[iipc->next_inltab].level; 1531 1532 return True; 1533} 1534 1535/* Forward */ 1536static void search_all_loctabs ( Addr ptr, /*OUT*/DebugInfo** pdi, 1537 /*OUT*/Word* locno ); 1538 1539/* Returns the position after which eip would be inserted in inltab. 1540 (-1 if eip should be inserted before position 0). 1541 This is the highest position with an addr_lo <= eip. 1542 As inltab is sorted on addr_lo, dichotomic search can be done 1543 (note that inltab might have duplicates addr_lo). */ 1544static Word inltab_insert_pos (DebugInfo *di, Addr eip) 1545{ 1546 Word mid, 1547 lo = 0, 1548 hi = di->inltab_used-1; 1549 while (lo <= hi) { 1550 mid = (lo + hi) / 2; 1551 if (eip < di->inltab[mid].addr_lo) { hi = mid-1; continue; } 1552 if (eip > di->inltab[mid].addr_lo) { lo = mid+1; continue; } 1553 lo = mid; break; 1554 } 1555 1556 while (lo <= di->inltab_used-1 && di->inltab[lo].addr_lo <= eip) 1557 lo++; 1558#if 0 1559 for (mid = 0; mid <= di->inltab_used-1; mid++) 1560 if (eip < di->inltab[mid].addr_lo) 1561 break; 1562 vg_assert (lo - 1 == mid - 1); 1563#endif 1564 return lo - 1; 1565} 1566 1567InlIPCursor* VG_(new_IIPC)(Addr eip) 1568{ 1569 DebugInfo* di; 1570 Word locno; 1571 Word i; 1572 InlIPCursor *ret; 1573 Bool avail; 1574 1575 if (!VG_(clo_read_inline_info)) 1576 return NULL; // No way we can find inlined calls. 1577 1578 /* Search the DebugInfo for eip */ 1579 search_all_loctabs ( eip, &di, &locno ); 1580 if (di == NULL || di->inltab_used == 0) 1581 return NULL; // No di (with inltab) containing eip. 1582 1583 /* Search the entry in di->inltab with the highest addr_lo that 1584 contains eip. */ 1585 /* We start from the highest pos in inltab after which eip would 1586 be inserted. */ 1587 for (i = inltab_insert_pos (di, eip); i >= 0; i--) { 1588 if (di->inltab[i].addr_lo <= eip && eip < di->inltab[i].addr_hi) { 1589 break; 1590 } 1591 /* Stop the backward scan when reaching an addr_lo which 1592 cannot anymore contain eip : we know that all ranges before 1593 i also cannot contain eip. */ 1594 if (di->inltab[i].addr_lo < eip - di->maxinl_codesz) 1595 return NULL; 1596 } 1597 1598 if (i < 0) 1599 return NULL; // No entry containing eip. 1600 1601 /* We have found the highest entry containing eip. 1602 Build a cursor. */ 1603 ret = ML_(dinfo_zalloc) ("dinfo.new_IIPC", sizeof(*ret)); 1604 ret->eip = eip; 1605 ret->di = di; 1606 ret->inltab_hipos = i; 1607 for (i = ret->inltab_hipos - 1; i >= 0; i--) { 1608 1609 if (di->inltab[i].addr_lo < eip - di->maxinl_codesz) 1610 break; /* Similar stop backward scan logic as above. */ 1611 } 1612 ret->inltab_lopos = i + 1; 1613 ret->curlevel = MAX_LEVEL; 1614 ret->cur_inltab = -1; 1615 ret->next_inltab = -1; 1616 1617 /* MAX_LEVEL is higher than any stored level. We can use 1618 VG_(next_IIPC) to get to the 'real' first highest call level. */ 1619 avail = VG_(next_IIPC) (ret); 1620 vg_assert (avail); 1621 1622 return ret; 1623} 1624 1625void VG_(delete_IIPC)(InlIPCursor *iipc) 1626{ 1627 if (iipc) 1628 ML_(dinfo_free)( iipc ); 1629} 1630 1631 1632/*------------------------------------------------------------*/ 1633/*--- Use of symbol table & location info to create ---*/ 1634/*--- plausible-looking stack dumps. ---*/ 1635/*------------------------------------------------------------*/ 1636 1637/* Search all symtabs that we know about to locate ptr. If found, set 1638 *pdi to the relevant DebugInfo, and *symno to the symtab entry 1639 *number within that. If not found, *psi is set to NULL. 1640 If findText==True, only text symbols are searched for. 1641 If findText==False, only data symbols are searched for. 1642*/ 1643static void search_all_symtabs ( Addr ptr, /*OUT*/DebugInfo** pdi, 1644 /*OUT*/Word* symno, 1645 Bool match_anywhere_in_sym, 1646 Bool findText ) 1647{ 1648 Word sno; 1649 DebugInfo* di; 1650 Bool inRange; 1651 1652 for (di = debugInfo_list; di != NULL; di = di->next) { 1653 1654 if (findText) { 1655 /* Consider any symbol in the r-x mapped area to be text. 1656 See Comment_Regarding_Text_Range_Checks in storage.c for 1657 details. */ 1658 inRange = di->fsm.have_rx_map 1659 && (ML_(find_rx_mapping)(di, ptr, ptr) != NULL); 1660 } else { 1661 inRange = (di->data_present 1662 && di->data_size > 0 1663 && di->data_avma <= ptr 1664 && ptr < di->data_avma + di->data_size) 1665 || 1666 (di->sdata_present 1667 && di->sdata_size > 0 1668 && di->sdata_avma <= ptr 1669 && ptr < di->sdata_avma + di->sdata_size) 1670 || 1671 (di->bss_present 1672 && di->bss_size > 0 1673 && di->bss_avma <= ptr 1674 && ptr < di->bss_avma + di->bss_size) 1675 || 1676 (di->sbss_present 1677 && di->sbss_size > 0 1678 && di->sbss_avma <= ptr 1679 && ptr < di->sbss_avma + di->sbss_size) 1680 || 1681 (di->rodata_present 1682 && di->rodata_size > 0 1683 && di->rodata_avma <= ptr 1684 && ptr < di->rodata_avma + di->rodata_size); 1685 } 1686 1687 if (!inRange) continue; 1688 1689 sno = ML_(search_one_symtab) ( 1690 di, ptr, match_anywhere_in_sym, findText ); 1691 if (sno == -1) goto not_found; 1692 *symno = sno; 1693 *pdi = di; 1694 return; 1695 1696 } 1697 not_found: 1698 *pdi = NULL; 1699} 1700 1701 1702/* Search all loctabs that we know about to locate ptr. If found, set 1703 *pdi to the relevant DebugInfo, and *locno to the loctab entry 1704 *number within that. If not found, *pdi is set to NULL. */ 1705static void search_all_loctabs ( Addr ptr, /*OUT*/DebugInfo** pdi, 1706 /*OUT*/Word* locno ) 1707{ 1708 Word lno; 1709 DebugInfo* di; 1710 for (di = debugInfo_list; di != NULL; di = di->next) { 1711 if (di->text_present 1712 && di->text_size > 0 1713 && di->text_avma <= ptr 1714 && ptr < di->text_avma + di->text_size) { 1715 lno = ML_(search_one_loctab) ( di, ptr ); 1716 if (lno == -1) goto not_found; 1717 *locno = lno; 1718 *pdi = di; 1719 return; 1720 } 1721 } 1722 not_found: 1723 *pdi = NULL; 1724} 1725 1726 1727/* The whole point of this whole big deal: map a code address to a 1728 plausible symbol name. Returns False if no idea; otherwise True. 1729 Caller supplies buf. If do_cxx_demangling is False, don't do 1730 C++ demangling, regardless of VG_(clo_demangle) -- probably because the 1731 call has come from VG_(get_fnname_raw)(). findText 1732 indicates whether we're looking for a text symbol or a data symbol 1733 -- caller must choose one kind or the other. 1734 Note: the string returned in *BUF is persistent as long as 1735 (1) the DebugInfo it belongs to is not discarded 1736 (2) the segment containing the address is not merged with another segment 1737 (3) the demangler is not invoked again 1738 In other words: if in doubt, save it away. 1739 Also, the returned string is owned by "somebody else". Callers must 1740 not free it or modify it. */ 1741static 1742Bool get_sym_name ( Bool do_cxx_demangling, Bool do_z_demangling, 1743 Bool do_below_main_renaming, 1744 Addr a, const HChar** buf, 1745 Bool match_anywhere_in_sym, Bool show_offset, 1746 Bool findText, /*OUT*/PtrdiffT* offsetP ) 1747{ 1748 DebugInfo* di; 1749 Word sno; 1750 PtrdiffT offset; 1751 1752 search_all_symtabs ( a, &di, &sno, match_anywhere_in_sym, findText ); 1753 if (di == NULL) { 1754 *buf = ""; 1755 return False; 1756 } 1757 1758 vg_assert(di->symtab[sno].pri_name); 1759 VG_(demangle) ( do_cxx_demangling, do_z_demangling, 1760 di->symtab[sno].pri_name, buf ); 1761 1762 /* Do the below-main hack */ 1763 // To reduce the endless nuisance of multiple different names 1764 // for "the frame below main()" screwing up the testsuite, change all 1765 // known incarnations of said into a single name, "(below main)", if 1766 // --show-below-main=yes. 1767 if ( do_below_main_renaming && ! VG_(clo_show_below_main) && 1768 Vg_FnNameBelowMain == VG_(get_fnname_kind)(*buf) ) 1769 { 1770 *buf = "(below main)"; 1771 } 1772 offset = a - di->symtab[sno].avmas.main; 1773 if (offsetP) *offsetP = offset; 1774 1775 if (show_offset && offset != 0) { 1776 static HChar *bufwo; // buf with offset 1777 static SizeT bufwo_szB; 1778 SizeT need, len; 1779 1780 len = VG_(strlen)(*buf); 1781 need = len + 1 + 19 + 1; 1782 if (need > bufwo_szB) { 1783 bufwo = ML_(dinfo_realloc)("get_sym_size", bufwo, need); 1784 bufwo_szB = need; 1785 } 1786 1787 VG_(strcpy)(bufwo, *buf); 1788 VG_(sprintf)(bufwo + len, "%c%ld", 1789 offset < 0 ? '-' : '+', 1790 offset < 0 ? -offset : offset); 1791 *buf = bufwo; 1792 } 1793 1794 return True; 1795} 1796 1797/* ppc64be-linux only: find the TOC pointer (R2 value) that should be in 1798 force at the entry point address of the function containing 1799 guest_code_addr. Returns 0 if not known. */ 1800Addr VG_(get_tocptr) ( Addr guest_code_addr ) 1801{ 1802#if defined(VGA_ppc64be) || defined(VGA_ppc64le) 1803 DebugInfo* si; 1804 Word sno; 1805 search_all_symtabs ( guest_code_addr, 1806 &si, &sno, 1807 True/*match_anywhere_in_fun*/, 1808 True/*consider text symbols only*/ ); 1809 if (si == NULL) 1810 return 0; 1811 else 1812 return GET_TOCPTR_AVMA(si->symtab[sno].avmas); 1813#else 1814 return 0; 1815#endif 1816} 1817 1818/* This is available to tools... always demangle C++ names, 1819 match anywhere in function, but don't show offsets. 1820 NOTE: See important comment about the persistence and memory ownership 1821 of the return string at function get_sym_name */ 1822Bool VG_(get_fnname) ( Addr a, const HChar** buf ) 1823{ 1824 return get_sym_name ( /*C++-demangle*/True, /*Z-demangle*/True, 1825 /*below-main-renaming*/True, 1826 a, buf, 1827 /*match_anywhere_in_fun*/True, 1828 /*show offset?*/False, 1829 /*text syms only*/True, 1830 /*offsetP*/NULL ); 1831} 1832 1833/* This is available to tools... always demangle C++ names, 1834 match anywhere in function, and show offset if nonzero. 1835 NOTE: See important comment about the persistence and memory ownership 1836 of the return string at function get_sym_name */ 1837Bool VG_(get_fnname_w_offset) ( Addr a, const HChar** buf ) 1838{ 1839 return get_sym_name ( /*C++-demangle*/True, /*Z-demangle*/True, 1840 /*below-main-renaming*/True, 1841 a, buf, 1842 /*match_anywhere_in_fun*/True, 1843 /*show offset?*/True, 1844 /*text syms only*/True, 1845 /*offsetP*/NULL ); 1846} 1847 1848/* This is available to tools... always demangle C++ names, 1849 only succeed if 'a' matches first instruction of function, 1850 and don't show offsets. 1851 NOTE: See important comment about the persistence and memory ownership 1852 of the return string at function get_sym_name */ 1853Bool VG_(get_fnname_if_entry) ( Addr a, const HChar** buf ) 1854{ 1855 const HChar *tmp; 1856 Bool res; 1857 1858 res = get_sym_name ( /*C++-demangle*/True, /*Z-demangle*/True, 1859 /*below-main-renaming*/True, 1860 a, &tmp, 1861 /*match_anywhere_in_fun*/False, 1862 /*show offset?*/False, 1863 /*text syms only*/True, 1864 /*offsetP*/NULL ); 1865 if (res) 1866 *buf = tmp; 1867 return res; 1868} 1869 1870/* This is only available to core... don't C++-demangle, don't Z-demangle, 1871 don't rename below-main, match anywhere in function, and don't show 1872 offsets. 1873 NOTE: See important comment about the persistence and memory ownership 1874 of the return string at function get_sym_name */ 1875Bool VG_(get_fnname_raw) ( Addr a, const HChar** buf ) 1876{ 1877 return get_sym_name ( /*C++-demangle*/False, /*Z-demangle*/False, 1878 /*below-main-renaming*/False, 1879 a, buf, 1880 /*match_anywhere_in_fun*/True, 1881 /*show offset?*/False, 1882 /*text syms only*/True, 1883 /*offsetP*/NULL ); 1884} 1885 1886/* This is only available to core... don't demangle C++ names, but do 1887 do Z-demangling and below-main-renaming, match anywhere in function, and 1888 don't show offsets. 1889 NOTE: See important comment about the persistence and memory ownership 1890 of the return string at function get_sym_name */ 1891Bool VG_(get_fnname_no_cxx_demangle) ( Addr a, const HChar** buf, 1892 const InlIPCursor* iipc ) 1893{ 1894 if (is_bottom(iipc)) { 1895 // At the bottom (towards main), we describe the fn at eip. 1896 return get_sym_name ( /*C++-demangle*/False, /*Z-demangle*/True, 1897 /*below-main-renaming*/True, 1898 a, buf, 1899 /*match_anywhere_in_fun*/True, 1900 /*show offset?*/False, 1901 /*text syms only*/True, 1902 /*offsetP*/NULL ); 1903 } else { 1904 const DiInlLoc *next_inl = iipc && iipc->next_inltab >= 0 1905 ? & iipc->di->inltab[iipc->next_inltab] 1906 : NULL; 1907 vg_assert (next_inl); 1908 // The function we are in is called by next_inl. 1909 *buf = next_inl->inlinedfn; 1910 return True; 1911 } 1912} 1913 1914/* mips-linux only: find the offset of current address. This is needed for 1915 stack unwinding for MIPS. 1916*/ 1917Bool VG_(get_inst_offset_in_function)( Addr a, 1918 /*OUT*/PtrdiffT* offset ) 1919{ 1920 const HChar *fnname; 1921 return get_sym_name ( /*C++-demangle*/False, /*Z-demangle*/False, 1922 /*below-main-renaming*/False, 1923 a, &fnname, 1924 /*match_anywhere_in_sym*/True, 1925 /*show offset?*/False, 1926 /*text syms only*/True, 1927 offset ); 1928} 1929 1930Vg_FnNameKind VG_(get_fnname_kind) ( const HChar* name ) 1931{ 1932 if (VG_STREQ("main", name)) { 1933 return Vg_FnNameMain; 1934 1935 } else if ( 1936# if defined(VGO_linux) 1937 VG_STREQ("__libc_start_main", name) || // glibc glibness 1938 VG_STREQ("generic_start_main", name) || // Yellow Dog doggedness 1939# elif defined(VGO_darwin) 1940 // See readmacho.c for an explanation of this. 1941 VG_STREQ("start_according_to_valgrind", name) || // Darwin, darling 1942# else 1943# error "Unknown OS" 1944# endif 1945 0) { 1946 return Vg_FnNameBelowMain; 1947 1948 } else { 1949 return Vg_FnNameNormal; 1950 } 1951} 1952 1953Vg_FnNameKind VG_(get_fnname_kind_from_IP) ( Addr ip ) 1954{ 1955 const HChar *buf; 1956 1957 // We don't demangle, because it's faster not to, and the special names 1958 // we're looking for won't be mangled. 1959 if (VG_(get_fnname_raw) ( ip, &buf )) { 1960 1961 return VG_(get_fnname_kind)(buf); 1962 } else { 1963 return Vg_FnNameNormal; // Don't know the name, treat it as normal. 1964 } 1965} 1966 1967/* Looks up data_addr in the collection of data symbols, and if found 1968 puts a pointer to its name into dname. The name is zero terminated. 1969 Also data_addr's offset from the symbol start is put into *offset. 1970 NOTE: See important comment about the persistence and memory ownership 1971 of the return string at function get_sym_name */ 1972Bool VG_(get_datasym_and_offset)( Addr data_addr, 1973 /*OUT*/const HChar** dname, 1974 /*OUT*/PtrdiffT* offset ) 1975{ 1976 return get_sym_name ( /*C++-demangle*/False, /*Z-demangle*/False, 1977 /*below-main-renaming*/False, 1978 data_addr, dname, 1979 /*match_anywhere_in_sym*/True, 1980 /*show offset?*/False, 1981 /*data syms only please*/False, 1982 offset ); 1983} 1984 1985/* Map a code address to the name of a shared object file or the 1986 executable. Returns False if no idea; otherwise True. 1987 Note: the string returned in *BUF is persistent as long as 1988 (1) the DebugInfo it belongs to is not discarded 1989 (2) the segment containing the address is not merged with another segment 1990*/ 1991Bool VG_(get_objname) ( Addr a, const HChar** buf ) 1992{ 1993 DebugInfo* di; 1994 const NSegment *seg; 1995 const HChar* filename; 1996 1997 /* Look in the debugInfo_list to find the name. In most cases we 1998 expect this to produce a result. */ 1999 for (di = debugInfo_list; di != NULL; di = di->next) { 2000 if (di->text_present 2001 && di->text_size > 0 2002 && di->text_avma <= a 2003 && a < di->text_avma + di->text_size) { 2004 *buf = di->fsm.filename; 2005 return True; 2006 } 2007 } 2008 /* Last-ditch fallback position: if we don't find the address in 2009 the debugInfo_list, ask the address space manager whether it 2010 knows the name of the file associated with this mapping. This 2011 allows us to print the names of exe/dll files in the stack trace 2012 when running programs under wine. */ 2013 if ( (seg = VG_(am_find_nsegment(a))) != NULL 2014 && (filename = VG_(am_get_filename)(seg)) != NULL ) { 2015 *buf = filename; 2016 return True; 2017 } 2018 return False; 2019} 2020 2021/* Map a code address to its DebugInfo. Returns NULL if not found. Doesn't 2022 require debug info. */ 2023DebugInfo* VG_(find_DebugInfo) ( Addr a ) 2024{ 2025 static UWord n_search = 0; 2026 DebugInfo* di; 2027 n_search++; 2028 for (di = debugInfo_list; di != NULL; di = di->next) { 2029 if (di->text_present 2030 && di->text_size > 0 2031 && di->text_avma <= a 2032 && a < di->text_avma + di->text_size) { 2033 if (0 == (n_search & 0xF)) 2034 move_DebugInfo_one_step_forward( di ); 2035 return di; 2036 } 2037 } 2038 return NULL; 2039} 2040 2041/* Map a code address to a filename. Returns True if successful. The 2042 returned string is persistent as long as the DebugInfo to which it 2043 belongs is not discarded. */ 2044Bool VG_(get_filename)( Addr a, const HChar** filename ) 2045{ 2046 DebugInfo* si; 2047 Word locno; 2048 UInt fndn_ix; 2049 2050 search_all_loctabs ( a, &si, &locno ); 2051 if (si == NULL) 2052 return False; 2053 fndn_ix = ML_(fndn_ix) (si, locno); 2054 *filename = ML_(fndn_ix2filename) (si, fndn_ix); 2055 return True; 2056} 2057 2058/* Map a code address to a line number. Returns True if successful. */ 2059Bool VG_(get_linenum)( Addr a, UInt* lineno ) 2060{ 2061 DebugInfo* si; 2062 Word locno; 2063 search_all_loctabs ( a, &si, &locno ); 2064 if (si == NULL) 2065 return False; 2066 *lineno = si->loctab[locno].lineno; 2067 2068 return True; 2069} 2070 2071/* Map a code address to a filename/line number/dir name info. 2072 See prototype for detailed description of behaviour. 2073*/ 2074Bool VG_(get_filename_linenum) ( Addr a, 2075 /*OUT*/const HChar** filename, 2076 /*OUT*/const HChar** dirname, 2077 /*OUT*/UInt* lineno ) 2078{ 2079 DebugInfo* si; 2080 Word locno; 2081 UInt fndn_ix; 2082 2083 search_all_loctabs ( a, &si, &locno ); 2084 if (si == NULL) { 2085 if (dirname) { 2086 *dirname = ""; 2087 } 2088 *filename = ""; // this used to be not initialised.... 2089 return False; 2090 } 2091 2092 fndn_ix = ML_(fndn_ix)(si, locno); 2093 *filename = ML_(fndn_ix2filename) (si, fndn_ix); 2094 *lineno = si->loctab[locno].lineno; 2095 2096 if (dirname) { 2097 /* caller wants directory info too .. */ 2098 *dirname = ML_(fndn_ix2dirname) (si, fndn_ix); 2099 } 2100 2101 return True; 2102} 2103 2104 2105/* Map a function name to its entry point and toc pointer. Is done by 2106 sequential search of all symbol tables, so is very slow. To 2107 mitigate the worst performance effects, you may specify a soname 2108 pattern, and only objects matching that pattern are searched. 2109 Therefore specify "*" to search all the objects. On TOC-afflicted 2110 platforms, a symbol is deemed to be found only if it has a nonzero 2111 TOC pointer. */ 2112Bool VG_(lookup_symbol_SLOW)(const HChar* sopatt, const HChar* name, 2113 SymAVMAs* avmas) 2114{ 2115 Bool require_pToc = False; 2116 Int i; 2117 const DebugInfo* si; 2118 Bool debug = False; 2119# if defined(VG_PLAT_USES_PPCTOC) 2120 require_pToc = True; 2121# endif 2122 for (si = debugInfo_list; si; si = si->next) { 2123 if (debug) 2124 VG_(printf)("lookup_symbol_SLOW: considering %s\n", si->soname); 2125 if (!VG_(string_match)(sopatt, si->soname)) { 2126 if (debug) 2127 VG_(printf)(" ... skip\n"); 2128 continue; 2129 } 2130 for (i = 0; i < si->symtab_used; i++) { 2131 const HChar* pri_name = si->symtab[i].pri_name; 2132 vg_assert(pri_name); 2133 if (0==VG_(strcmp)(name, pri_name) 2134 && (require_pToc ? GET_TOCPTR_AVMA(si->symtab[i].avmas) : True)) { 2135 *avmas = si->symtab[i].avmas; 2136 return True; 2137 } 2138 const HChar** sec_names = si->symtab[i].sec_names; 2139 if (sec_names) { 2140 vg_assert(sec_names[0]); 2141 while (*sec_names) { 2142 if (0==VG_(strcmp)(name, *sec_names) 2143 && (require_pToc 2144 ? GET_TOCPTR_AVMA(si->symtab[i].avmas) : True)) { 2145 *avmas = si->symtab[i].avmas; 2146 return True; 2147 } 2148 sec_names++; 2149 } 2150 } 2151 } 2152 } 2153 return False; 2154} 2155 2156 2157/* VG_(describe_IP): return info on code address, function name and 2158 filename. The returned string is allocated in a static buffer and will 2159 be overwritten in the next invocation. */ 2160 2161/* Copy str into *buf starting at n, ensuring that buf is zero-terminated. 2162 Return the index of the terminating null character. */ 2163static SizeT 2164putStr( SizeT n, HChar** buf, SizeT *bufsiz, const HChar* str ) 2165{ 2166 SizeT slen = VG_(strlen)(str); 2167 SizeT need = n + slen + 1; 2168 2169 if (need > *bufsiz) { 2170 if (need < 256) need = 256; 2171 *bufsiz = need; 2172 *buf = ML_(dinfo_realloc)("putStr", *buf, *bufsiz); 2173 } 2174 2175 VG_(strcpy)(*buf + n, str); 2176 2177 return n + slen; 2178} 2179 2180/* Same as putStr, but escaping chars for XML output. */ 2181static SizeT 2182putStrEsc( SizeT n, HChar** buf, SizeT *bufsiz, const HChar* str ) 2183{ 2184 HChar alt[2]; 2185 2186 for (; *str != 0; str++) { 2187 switch (*str) { 2188 case '&': 2189 n = putStr( n, buf, bufsiz, "&"); 2190 break; 2191 case '<': 2192 n = putStr( n, buf, bufsiz, "<"); 2193 break; 2194 case '>': 2195 n = putStr( n, buf, bufsiz, ">"); 2196 break; 2197 default: 2198 alt[0] = *str; 2199 alt[1] = 0; 2200 n = putStr( n, buf, bufsiz, alt ); 2201 break; 2202 } 2203 } 2204 return n; 2205} 2206 2207const HChar* VG_(describe_IP)(Addr eip, const InlIPCursor *iipc) 2208{ 2209 static HChar *buf = NULL; 2210 static SizeT bufsiz = 0; 2211# define APPEND(_str) \ 2212 n = putStr(n, &buf, &bufsiz, _str) 2213# define APPEND_ESC(_str) \ 2214 n = putStrEsc(n, &buf, &bufsiz, _str) 2215 2216 UInt lineno; 2217 HChar ibuf[50]; // large enough 2218 SizeT n = 0; 2219 2220 vg_assert (!iipc || iipc->eip == eip); 2221 2222 const HChar *buf_fn; 2223 const HChar *buf_obj; 2224 const HChar *buf_srcloc; 2225 const HChar *buf_dirname; 2226 2227 Bool know_dirinfo; 2228 Bool know_fnname; 2229 Bool know_objname; 2230 Bool know_srcloc; 2231 2232 if (is_bottom(iipc)) { 2233 // At the bottom (towards main), we describe the fn at eip. 2234 know_fnname = VG_(clo_sym_offsets) 2235 ? VG_(get_fnname_w_offset) (eip, &buf_fn) 2236 : VG_(get_fnname) (eip, &buf_fn); 2237 } else { 2238 const DiInlLoc *next_inl = iipc && iipc->next_inltab >= 0 2239 ? & iipc->di->inltab[iipc->next_inltab] 2240 : NULL; 2241 vg_assert (next_inl); 2242 // The function we are in is called by next_inl. 2243 buf_fn = next_inl->inlinedfn; 2244 know_fnname = True; 2245 2246 // INLINED???? 2247 // ??? Can we compute an offset for an inlined fn call ? 2248 // ??? Offset from what ? The beginning of the inl info ? 2249 // ??? But that is not necessarily the beginning of the fn 2250 // ??? as e.g. an inlined fn call can be in several ranges. 2251 // ??? Currently never showing an offset. 2252 } 2253 2254 know_objname = VG_(get_objname)(eip, &buf_obj); 2255 2256 if (is_top(iipc)) { 2257 // The source for the highest level is in the loctab entry. 2258 know_srcloc = VG_(get_filename_linenum)( 2259 eip, 2260 &buf_srcloc, 2261 &buf_dirname, 2262 &lineno 2263 ); 2264 know_dirinfo = buf_dirname[0] != '\0'; 2265 } else { 2266 const DiInlLoc *cur_inl = iipc && iipc->cur_inltab >= 0 2267 ? & iipc->di->inltab[iipc->cur_inltab] 2268 : NULL; 2269 vg_assert (cur_inl); 2270 2271 know_dirinfo = False; 2272 buf_dirname = ""; 2273 // The fndn_ix and lineno for the caller of the inlined fn is in cur_inl. 2274 if (cur_inl->fndn_ix == 0) { 2275 buf_srcloc = "???"; 2276 } else { 2277 FnDn *fndn = VG_(indexEltNumber) (iipc->di->fndnpool, 2278 cur_inl->fndn_ix); 2279 if (fndn->dirname) { 2280 buf_dirname = fndn->dirname; 2281 know_dirinfo = True; 2282 } 2283 buf_srcloc = fndn->filename; 2284 } 2285 lineno = cur_inl->lineno; 2286 know_srcloc = True; 2287 } 2288 2289 if (VG_(clo_xml)) { 2290 2291 Bool human_readable = True; 2292 const HChar* maybe_newline = human_readable ? "\n " : ""; 2293 const HChar* maybe_newline2 = human_readable ? "\n " : ""; 2294 2295 /* Print in XML format, dumping in as much info as we know. 2296 Ensure all tags are balanced. */ 2297 APPEND("<frame>"); 2298 VG_(sprintf)(ibuf,"<ip>0x%llX</ip>", (ULong)eip); 2299 APPEND(maybe_newline); 2300 APPEND(ibuf); 2301 if (know_objname) { 2302 APPEND(maybe_newline); 2303 APPEND("<obj>"); 2304 APPEND_ESC(buf_obj); 2305 APPEND("</obj>"); 2306 } 2307 if (know_fnname) { 2308 APPEND(maybe_newline); 2309 APPEND("<fn>"); 2310 APPEND_ESC(buf_fn); 2311 APPEND("</fn>"); 2312 } 2313 if (know_srcloc) { 2314 if (know_dirinfo) { 2315 APPEND(maybe_newline); 2316 APPEND("<dir>"); 2317 APPEND_ESC(buf_dirname); 2318 APPEND("</dir>"); 2319 } 2320 APPEND(maybe_newline); 2321 APPEND("<file>"); 2322 APPEND_ESC(buf_srcloc); 2323 APPEND("</file>"); 2324 APPEND(maybe_newline); 2325 APPEND("<line>"); 2326 VG_(sprintf)(ibuf,"%d",lineno); 2327 APPEND(ibuf); 2328 APPEND("</line>"); 2329 } 2330 APPEND(maybe_newline2); 2331 APPEND("</frame>"); 2332 2333 } else { 2334 2335 /* Print for humans to read */ 2336 // 2337 // Possible forms: 2338 // 2339 // 0x80483BF: really (a.c:20) 2340 // 0x80483BF: really (in /foo/a.out) 2341 // 0x80483BF: really (in ???) 2342 // 0x80483BF: ??? (in /foo/a.out) 2343 // 0x80483BF: ??? (a.c:20) 2344 // 0x80483BF: ??? 2345 // 2346 VG_(sprintf)(ibuf,"0x%llX: ", (ULong)eip); 2347 APPEND(ibuf); 2348 if (know_fnname) { 2349 APPEND(buf_fn); 2350 } else { 2351 APPEND("???"); 2352 } 2353 if (know_srcloc) { 2354 APPEND(" ("); 2355 // Get the directory name, if any, possibly pruned, into dirname. 2356 const HChar* dirname = NULL; 2357 if (know_dirinfo && VG_(sizeXA)(VG_(clo_fullpath_after)) > 0) { 2358 Int i; 2359 dirname = buf_dirname; 2360 // Remove leading prefixes from the dirname. 2361 // If user supplied --fullpath-after=foo, this will remove 2362 // a leading string which matches '.*foo' (not greedy). 2363 for (i = 0; i < VG_(sizeXA)(VG_(clo_fullpath_after)); i++) { 2364 const HChar* prefix = 2365 *(HChar**) VG_(indexXA)( VG_(clo_fullpath_after), i ); 2366 HChar* str = VG_(strstr)(dirname, prefix); 2367 if (str) { 2368 dirname = str + VG_(strlen)(prefix); 2369 break; 2370 } 2371 } 2372 /* remove leading "./" */ 2373 if (dirname[0] == '.' && dirname[1] == '/') 2374 dirname += 2; 2375 } 2376 // do we have any interesting directory name to show? If so 2377 // add it in. 2378 if (dirname && dirname[0] != 0) { 2379 APPEND(dirname); 2380 APPEND("/"); 2381 } 2382 APPEND(buf_srcloc); 2383 APPEND(":"); 2384 VG_(sprintf)(ibuf,"%d",lineno); 2385 APPEND(ibuf); 2386 APPEND(")"); 2387 } else if (know_objname) { 2388 APPEND(" (in "); 2389 APPEND(buf_obj); 2390 APPEND(")"); 2391 } else if (know_fnname) { 2392 // Nb: do this in two steps because "??)" is a trigraph! 2393 APPEND(" (in ???"); 2394 APPEND(")"); 2395 } 2396 2397 } 2398 return buf; 2399 2400# undef APPEND 2401# undef APPEND_ESC 2402} 2403 2404 2405/*--------------------------------------------------------------*/ 2406/*--- ---*/ 2407/*--- TOP LEVEL: FOR UNWINDING THE STACK USING ---*/ 2408/*--- DWARF3 .eh_frame INFO ---*/ 2409/*--- ---*/ 2410/*--------------------------------------------------------------*/ 2411 2412/* Gather up all the constant pieces of info needed to evaluate 2413 a CfiExpr into one convenient struct. */ 2414typedef 2415 struct { 2416 const D3UnwindRegs* uregs; 2417 Addr min_accessible; 2418 Addr max_accessible; 2419 } 2420 CfiExprEvalContext; 2421 2422/* Evaluate the CfiExpr rooted at ix in exprs given the context eec. 2423 *ok is set to False on failure, but not to True on success. The 2424 caller must set it to True before calling. */ 2425__attribute__((noinline)) 2426static 2427UWord evalCfiExpr ( const XArray* exprs, Int ix, 2428 const CfiExprEvalContext* eec, Bool* ok ) 2429{ 2430 UWord w, wL, wR; 2431 Addr a; 2432 const CfiExpr* e; 2433 vg_assert(sizeof(Addr) == sizeof(UWord)); 2434 e = VG_(indexXA)( exprs, ix ); 2435 switch (e->tag) { 2436 case Cex_Unop: 2437 w = evalCfiExpr( exprs, e->Cex.Unop.ix, eec, ok ); 2438 if (!(*ok)) return 0; 2439 switch (e->Cex.Unop.op) { 2440 case Cunop_Abs: return (Word) w < 0 ? - w : w; 2441 case Cunop_Neg: return - (Word) w; 2442 case Cunop_Not: return ~ w; 2443 default: goto unhandled; 2444 } 2445 /*NOTREACHED*/ 2446 case Cex_Binop: 2447 wL = evalCfiExpr( exprs, e->Cex.Binop.ixL, eec, ok ); 2448 if (!(*ok)) return 0; 2449 wR = evalCfiExpr( exprs, e->Cex.Binop.ixR, eec, ok ); 2450 if (!(*ok)) return 0; 2451 switch (e->Cex.Binop.op) { 2452 case Cbinop_Add: return wL + wR; 2453 case Cbinop_Sub: return wL - wR; 2454 case Cbinop_And: return wL & wR; 2455 case Cbinop_Mul: return wL * wR; 2456 case Cbinop_Shl: return wL << wR; 2457 case Cbinop_Shr: return wL >> wR; 2458 case Cbinop_Eq: return wL == wR ? 1 : 0; 2459 case Cbinop_Ge: return (Word) wL >= (Word) wR ? 1 : 0; 2460 case Cbinop_Gt: return (Word) wL > (Word) wR ? 1 : 0; 2461 case Cbinop_Le: return (Word) wL <= (Word) wR ? 1 : 0; 2462 case Cbinop_Lt: return (Word) wL < (Word) wR ? 1 : 0; 2463 case Cbinop_Ne: return wL != wR ? 1 : 0; 2464 default: goto unhandled; 2465 } 2466 /*NOTREACHED*/ 2467 case Cex_CfiReg: 2468 switch (e->Cex.CfiReg.reg) { 2469# if defined(VGA_x86) || defined(VGA_amd64) 2470 case Creg_IA_IP: return eec->uregs->xip; 2471 case Creg_IA_SP: return eec->uregs->xsp; 2472 case Creg_IA_BP: return eec->uregs->xbp; 2473# elif defined(VGA_arm) 2474 case Creg_ARM_R15: return eec->uregs->r15; 2475 case Creg_ARM_R14: return eec->uregs->r14; 2476 case Creg_ARM_R13: return eec->uregs->r13; 2477 case Creg_ARM_R12: return eec->uregs->r12; 2478 case Creg_ARM_R7: return eec->uregs->r7; 2479# elif defined(VGA_s390x) 2480 case Creg_S390_IA: return eec->uregs->ia; 2481 case Creg_S390_SP: return eec->uregs->sp; 2482 case Creg_S390_FP: return eec->uregs->fp; 2483 case Creg_S390_LR: return eec->uregs->lr; 2484# elif defined(VGA_mips32) || defined(VGA_mips64) 2485 case Creg_IA_IP: return eec->uregs->pc; 2486 case Creg_IA_SP: return eec->uregs->sp; 2487 case Creg_IA_BP: return eec->uregs->fp; 2488 case Creg_MIPS_RA: return eec->uregs->ra; 2489# elif defined(VGA_ppc32) || defined(VGA_ppc64be) \ 2490 || defined(VGA_ppc64le) 2491# elif defined(VGP_arm64_linux) 2492 case Creg_ARM64_X30: return eec->uregs->x30; 2493# elif defined(VGA_tilegx) 2494 case Creg_TILEGX_IP: return eec->uregs->pc; 2495 case Creg_TILEGX_SP: return eec->uregs->sp; 2496 case Creg_TILEGX_BP: return eec->uregs->fp; 2497 case Creg_TILEGX_LR: return eec->uregs->lr; 2498# else 2499# error "Unsupported arch" 2500# endif 2501 default: goto unhandled; 2502 } 2503 /*NOTREACHED*/ 2504 case Cex_Const: 2505 return e->Cex.Const.con; 2506 case Cex_Deref: 2507 a = evalCfiExpr( exprs, e->Cex.Deref.ixAddr, eec, ok ); 2508 if (!(*ok)) return 0; 2509 if (a < eec->min_accessible 2510 || a > eec->max_accessible - sizeof(UWord) + 1) { 2511 *ok = False; 2512 return 0; 2513 } 2514 /* let's hope it doesn't trap! */ 2515 return ML_(read_UWord)((void *)a); 2516 default: 2517 goto unhandled; 2518 } 2519 /*NOTREACHED*/ 2520 unhandled: 2521 VG_(printf)("\n\nevalCfiExpr: unhandled\n"); 2522 ML_(ppCfiExpr)( exprs, ix ); 2523 VG_(printf)("\n"); 2524 vg_assert(0); 2525 /*NOTREACHED*/ 2526 return 0; 2527} 2528 2529 2530/* Search all the DebugInfos in the entire system, to find the DiCfSI_m 2531 that pertains to 'ip'. 2532 2533 If found, set *diP to the DebugInfo in which it resides, and 2534 *cfsi_mP to the cfsi_m pointer in that DebugInfo's cfsi_m_pool. 2535 2536 If not found, set *diP to (DebugInfo*)1 and *cfsi_mP to zero. 2537*/ 2538__attribute__((noinline)) 2539static void find_DiCfSI ( /*OUT*/DebugInfo** diP, 2540 /*OUT*/DiCfSI_m** cfsi_mP, 2541 Addr ip ) 2542{ 2543 DebugInfo* di; 2544 Word i = -1; 2545 2546 static UWord n_search = 0; 2547 static UWord n_steps = 0; 2548 n_search++; 2549 2550 if (0) VG_(printf)("search for %#lx\n", ip); 2551 2552 for (di = debugInfo_list; di != NULL; di = di->next) { 2553 Word j; 2554 n_steps++; 2555 2556 /* Use the per-DebugInfo summary address ranges to skip 2557 inapplicable DebugInfos quickly. */ 2558 if (di->cfsi_used == 0) 2559 continue; 2560 if (ip < di->cfsi_minavma || ip > di->cfsi_maxavma) 2561 continue; 2562 2563 /* It might be in this DebugInfo. Search it. */ 2564 j = ML_(search_one_cfitab)( di, ip ); 2565 vg_assert(j >= -1 && j < (Word)di->cfsi_used); 2566 2567 if (j != -1) { 2568 i = j; 2569 break; /* found it */ 2570 } 2571 } 2572 2573 if (i == -1) { 2574 2575 /* we didn't find it. */ 2576 *diP = (DebugInfo*)1; 2577 *cfsi_mP = 0; 2578 2579 } else { 2580 2581 /* found a di corresponding to ip. */ 2582 /* ensure that di is 4-aligned (at least), so it can't possibly 2583 be equal to (DebugInfo*)1. */ 2584 vg_assert(di && VG_IS_4_ALIGNED(di)); 2585 *cfsi_mP = ML_(get_cfsi_m) (di, i); 2586 if (*cfsi_mP == NULL) { 2587 // This is a cfsi hole. Report no cfi information found. 2588 *diP = (DebugInfo*)1; 2589 // But we will still perform the hack below. 2590 } else { 2591 *diP = di; 2592 } 2593 2594 /* Start of performance-enhancing hack: once every 64 (chosen 2595 hackily after profiling) successful searches, move the found 2596 DebugInfo one step closer to the start of the list. This 2597 makes future searches cheaper. For starting konqueror on 2598 amd64, this in fact reduces the total amount of searching 2599 done by the above find-the-right-DebugInfo loop by more than 2600 a factor of 20. */ 2601 if ((n_search & 0xF) == 0) { 2602 /* Move di one step closer to the start of the list. */ 2603 move_DebugInfo_one_step_forward( di ); 2604 } 2605 /* End of performance-enhancing hack. */ 2606 2607 if (0 && ((n_search & 0x7FFFF) == 0)) 2608 VG_(printf)("find_DiCfSI: %lu searches, " 2609 "%lu DebugInfos looked at\n", 2610 n_search, n_steps); 2611 2612 } 2613 2614} 2615 2616 2617/* Now follows a mechanism for caching queries to find_DiCfSI, since 2618 they are extremely frequent on amd64-linux, during stack unwinding. 2619 2620 Each cache entry binds an ip value to a (di, cfsi_m*) pair. Possible 2621 values: 2622 2623 di is non-null, cfsi_m* >= 0 ==> cache slot in use, "cfsi_m*" 2624 di is (DebugInfo*)1 ==> cache slot in use, no associated di 2625 di is NULL ==> cache slot not in use 2626 2627 Hence simply zeroing out the entire cache invalidates all 2628 entries. 2629 2630 We can map an ip value directly to a (di, cfsi_m*) pair as 2631 once a DebugInfo is read, adding new DiCfSI_m* is not possible 2632 anymore, as the cfsi_m_pool is frozen once the reading is terminated. 2633 Also, the cache is invalidated when new debuginfo is read due to 2634 an mmap or some debuginfo is discarded due to an munmap. */ 2635 2636// Prime number, giving about 6Kbytes cache on 32 bits, 2637// 12Kbytes cache on 64 bits. 2638#define N_CFSI_M_CACHE 509 2639 2640typedef 2641 struct { Addr ip; DebugInfo* di; DiCfSI_m* cfsi_m; } 2642 CFSI_m_CacheEnt; 2643 2644static CFSI_m_CacheEnt cfsi_m_cache[N_CFSI_M_CACHE]; 2645 2646static void cfsi_m_cache__invalidate ( void ) { 2647 VG_(memset)(&cfsi_m_cache, 0, sizeof(cfsi_m_cache)); 2648 CF_info_generation++; 2649} 2650 2651UInt VG_(CF_info_generation) (void) 2652{ 2653 return CF_info_generation; 2654} 2655 2656static inline CFSI_m_CacheEnt* cfsi_m_cache__find ( Addr ip ) 2657{ 2658 UWord hash = ip % N_CFSI_M_CACHE; 2659 CFSI_m_CacheEnt* ce = &cfsi_m_cache[hash]; 2660 static UWord n_q = 0, n_m = 0; 2661 2662 n_q++; 2663 if (0 && 0 == (n_q & 0x1FFFFF)) 2664 VG_(printf)("QQQ %lu %lu\n", n_q, n_m); 2665 2666 if (LIKELY(ce->ip == ip) && LIKELY(ce->di != NULL)) { 2667 /* found an entry in the cache .. */ 2668 } else { 2669 /* not found in cache. Search and update. */ 2670 n_m++; 2671 ce->ip = ip; 2672 find_DiCfSI( &ce->di, &ce->cfsi_m, ip ); 2673 } 2674 2675 if (UNLIKELY(ce->di == (DebugInfo*)1)) { 2676 /* no DiCfSI for this address */ 2677 return NULL; 2678 } else { 2679 /* found a DiCfSI for this address */ 2680 return ce; 2681 } 2682} 2683 2684 2685inline 2686static Addr compute_cfa ( const D3UnwindRegs* uregs, 2687 Addr min_accessible, Addr max_accessible, 2688 const DebugInfo* di, const DiCfSI_m* cfsi_m ) 2689{ 2690 CfiExprEvalContext eec; 2691 Addr cfa; 2692 Bool ok; 2693 2694 /* Compute the CFA. */ 2695 cfa = 0; 2696 switch (cfsi_m->cfa_how) { 2697# if defined(VGA_x86) || defined(VGA_amd64) 2698 case CFIC_IA_SPREL: 2699 cfa = cfsi_m->cfa_off + uregs->xsp; 2700 break; 2701 case CFIC_IA_BPREL: 2702 cfa = cfsi_m->cfa_off + uregs->xbp; 2703 break; 2704# elif defined(VGA_arm) 2705 case CFIC_ARM_R13REL: 2706 cfa = cfsi_m->cfa_off + uregs->r13; 2707 break; 2708 case CFIC_ARM_R12REL: 2709 cfa = cfsi_m->cfa_off + uregs->r12; 2710 break; 2711 case CFIC_ARM_R11REL: 2712 cfa = cfsi_m->cfa_off + uregs->r11; 2713 break; 2714 case CFIC_ARM_R7REL: 2715 cfa = cfsi_m->cfa_off + uregs->r7; 2716 break; 2717# elif defined(VGA_s390x) 2718 case CFIC_IA_SPREL: 2719 cfa = cfsi_m->cfa_off + uregs->sp; 2720 break; 2721 case CFIR_MEMCFAREL: 2722 { 2723 Addr a = uregs->sp + cfsi_m->cfa_off; 2724 if (a < min_accessible || a > max_accessible-sizeof(Addr)) 2725 break; 2726 cfa = ML_(read_Addr)((void *)a); 2727 break; 2728 } 2729 case CFIR_SAME: 2730 cfa = uregs->fp; 2731 break; 2732 case CFIC_IA_BPREL: 2733 cfa = cfsi_m->cfa_off + uregs->fp; 2734 break; 2735# elif defined(VGA_mips32) || defined(VGA_mips64) 2736 case CFIC_IA_SPREL: 2737 cfa = cfsi_m->cfa_off + uregs->sp; 2738 break; 2739 case CFIR_SAME: 2740 cfa = uregs->fp; 2741 break; 2742 case CFIC_IA_BPREL: 2743 cfa = cfsi_m->cfa_off + uregs->fp; 2744 break; 2745# elif defined(VGA_ppc32) || defined(VGA_ppc64be) || defined(VGA_ppc64le) 2746# elif defined(VGP_arm64_linux) 2747 case CFIC_ARM64_SPREL: 2748 cfa = cfsi_m->cfa_off + uregs->sp; 2749 break; 2750 case CFIC_ARM64_X29REL: 2751 cfa = cfsi_m->cfa_off + uregs->x29; 2752 break; 2753# elif defined(VGA_tilegx) 2754 case CFIC_IA_SPREL: 2755 cfa = cfsi_m->cfa_off + uregs->sp; 2756 break; 2757 case CFIR_SAME: 2758 cfa = uregs->fp; 2759 break; 2760 case CFIC_IA_BPREL: 2761 cfa = cfsi_m->cfa_off + uregs->fp; 2762 break; 2763# else 2764# error "Unsupported arch" 2765# endif 2766 case CFIC_EXPR: /* available on all archs */ 2767 if (0) { 2768 VG_(printf)("CFIC_EXPR: "); 2769 ML_(ppCfiExpr)(di->cfsi_exprs, cfsi_m->cfa_off); 2770 VG_(printf)("\n"); 2771 } 2772 eec.uregs = uregs; 2773 eec.min_accessible = min_accessible; 2774 eec.max_accessible = max_accessible; 2775 ok = True; 2776 cfa = evalCfiExpr(di->cfsi_exprs, cfsi_m->cfa_off, &eec, &ok ); 2777 if (!ok) return 0; 2778 break; 2779 default: 2780 vg_assert(0); 2781 } 2782 return cfa; 2783} 2784 2785 2786/* Get the call frame address (CFA) given an IP/SP/FP triple. */ 2787/* NOTE: This function may rearrange the order of entries in the 2788 DebugInfo list. */ 2789Addr ML_(get_CFA) ( Addr ip, Addr sp, Addr fp, 2790 Addr min_accessible, Addr max_accessible ) 2791{ 2792 CFSI_m_CacheEnt* ce; 2793 2794 ce = cfsi_m_cache__find(ip); 2795 2796 if (UNLIKELY(ce == NULL)) 2797 return 0; /* no info. Nothing we can do. */ 2798 2799 /* Temporary impedance-matching kludge so that this keeps working 2800 on x86-linux and amd64-linux. */ 2801# if defined(VGA_x86) || defined(VGA_amd64) 2802 { D3UnwindRegs uregs; 2803 uregs.xip = ip; 2804 uregs.xsp = sp; 2805 uregs.xbp = fp; 2806 return compute_cfa(&uregs, 2807 min_accessible, max_accessible, ce->di, ce->cfsi_m); 2808 } 2809#elif defined(VGA_s390x) 2810 { D3UnwindRegs uregs; 2811 uregs.ia = ip; 2812 uregs.sp = sp; 2813 uregs.fp = fp; 2814 return compute_cfa(&uregs, 2815 min_accessible, max_accessible, ce->di, ce->cfsi_m); 2816 } 2817#elif defined(VGA_mips32) || defined(VGA_mips64) || defined(VGA_tilegx) 2818 { D3UnwindRegs uregs; 2819 uregs.pc = ip; 2820 uregs.sp = sp; 2821 uregs.fp = fp; 2822 return compute_cfa(&uregs, 2823 min_accessible, max_accessible, ce->di, ce->cfsi_m); 2824 } 2825 2826# else 2827 return 0; /* indicates failure */ 2828# endif 2829} 2830 2831 2832/* The main function for DWARF2/3 CFI-based stack unwinding. Given a 2833 set of registers in UREGS, modify it to hold the register values 2834 for the previous frame, if possible. Returns True if successful. 2835 If not successful, *UREGS is not changed. 2836 2837 For x86 and amd64, the unwound registers are: {E,R}IP, 2838 {E,R}SP, {E,R}BP. 2839 2840 For arm, the unwound registers are: R7 R11 R12 R13 R14 R15. 2841 2842 For arm64, the unwound registers are: X29(FP) X30(LR) SP PC. 2843*/ 2844Bool VG_(use_CF_info) ( /*MOD*/D3UnwindRegs* uregsHere, 2845 Addr min_accessible, 2846 Addr max_accessible ) 2847{ 2848 DebugInfo* di; 2849 DiCfSI_m* cfsi_m = NULL; 2850 Addr cfa, ipHere = 0; 2851 CFSI_m_CacheEnt* ce; 2852 CfiExprEvalContext eec __attribute__((unused)); 2853 D3UnwindRegs uregsPrev; 2854 2855# if defined(VGA_x86) || defined(VGA_amd64) 2856 ipHere = uregsHere->xip; 2857# elif defined(VGA_arm) 2858 ipHere = uregsHere->r15; 2859# elif defined(VGA_s390x) 2860 ipHere = uregsHere->ia; 2861# elif defined(VGA_mips32) || defined(VGA_mips64) 2862 ipHere = uregsHere->pc; 2863# elif defined(VGA_ppc32) || defined(VGA_ppc64be) || defined(VGA_ppc64le) 2864# elif defined(VGP_arm64_linux) 2865 ipHere = uregsHere->pc; 2866# elif defined(VGA_tilegx) 2867 ipHere = uregsHere->pc; 2868# else 2869# error "Unknown arch" 2870# endif 2871 ce = cfsi_m_cache__find(ipHere); 2872 2873 if (UNLIKELY(ce == NULL)) 2874 return False; /* no info. Nothing we can do. */ 2875 2876 di = ce->di; 2877 cfsi_m = ce->cfsi_m; 2878 2879 if (0) { 2880 VG_(printf)("found cfsi_m (but printing fake base/len): "); 2881 ML_(ppDiCfSI)(di->cfsi_exprs, 0, 0, cfsi_m); 2882 } 2883 2884 VG_(bzero_inline)(&uregsPrev, sizeof(uregsPrev)); 2885 2886 /* First compute the CFA. */ 2887 cfa = compute_cfa(uregsHere, 2888 min_accessible, max_accessible, di, cfsi_m); 2889 if (UNLIKELY(cfa == 0)) 2890 return False; 2891 2892 /* Now we know the CFA, use it to roll back the registers we're 2893 interested in. */ 2894 2895# define COMPUTE(_prev, _here, _how, _off) \ 2896 do { \ 2897 switch (_how) { \ 2898 case CFIR_UNKNOWN: \ 2899 return False; \ 2900 case CFIR_SAME: \ 2901 _prev = _here; break; \ 2902 case CFIR_MEMCFAREL: { \ 2903 Addr a = cfa + (Word)_off; \ 2904 if (a < min_accessible \ 2905 || a > max_accessible-sizeof(Addr)) \ 2906 return False; \ 2907 _prev = ML_(read_Addr)((void *)a); \ 2908 break; \ 2909 } \ 2910 case CFIR_CFAREL: \ 2911 _prev = cfa + (Word)_off; \ 2912 break; \ 2913 case CFIR_EXPR: \ 2914 if (0) \ 2915 ML_(ppCfiExpr)(di->cfsi_exprs,_off); \ 2916 eec.uregs = uregsHere; \ 2917 eec.min_accessible = min_accessible; \ 2918 eec.max_accessible = max_accessible; \ 2919 Bool ok = True; \ 2920 _prev = evalCfiExpr(di->cfsi_exprs, _off, &eec, &ok ); \ 2921 if (!ok) return False; \ 2922 break; \ 2923 default: \ 2924 vg_assert(0); \ 2925 } \ 2926 } while (0) 2927 2928# if defined(VGA_x86) || defined(VGA_amd64) 2929 COMPUTE(uregsPrev.xip, uregsHere->xip, cfsi_m->ra_how, cfsi_m->ra_off); 2930 COMPUTE(uregsPrev.xsp, uregsHere->xsp, cfsi_m->sp_how, cfsi_m->sp_off); 2931 COMPUTE(uregsPrev.xbp, uregsHere->xbp, cfsi_m->bp_how, cfsi_m->bp_off); 2932# elif defined(VGA_arm) 2933 COMPUTE(uregsPrev.r15, uregsHere->r15, cfsi_m->ra_how, cfsi_m->ra_off); 2934 COMPUTE(uregsPrev.r14, uregsHere->r14, cfsi_m->r14_how, cfsi_m->r14_off); 2935 COMPUTE(uregsPrev.r13, uregsHere->r13, cfsi_m->r13_how, cfsi_m->r13_off); 2936 COMPUTE(uregsPrev.r12, uregsHere->r12, cfsi_m->r12_how, cfsi_m->r12_off); 2937 COMPUTE(uregsPrev.r11, uregsHere->r11, cfsi_m->r11_how, cfsi_m->r11_off); 2938 COMPUTE(uregsPrev.r7, uregsHere->r7, cfsi_m->r7_how, cfsi_m->r7_off); 2939# elif defined(VGA_s390x) 2940 COMPUTE(uregsPrev.ia, uregsHere->ia, cfsi_m->ra_how, cfsi_m->ra_off); 2941 COMPUTE(uregsPrev.sp, uregsHere->sp, cfsi_m->sp_how, cfsi_m->sp_off); 2942 COMPUTE(uregsPrev.fp, uregsHere->fp, cfsi_m->fp_how, cfsi_m->fp_off); 2943# elif defined(VGA_mips32) || defined(VGA_mips64) 2944 COMPUTE(uregsPrev.pc, uregsHere->pc, cfsi_m->ra_how, cfsi_m->ra_off); 2945 COMPUTE(uregsPrev.sp, uregsHere->sp, cfsi_m->sp_how, cfsi_m->sp_off); 2946 COMPUTE(uregsPrev.fp, uregsHere->fp, cfsi_m->fp_how, cfsi_m->fp_off); 2947# elif defined(VGA_ppc32) || defined(VGA_ppc64be) || defined(VGA_ppc64le) 2948# elif defined(VGP_arm64_linux) 2949 COMPUTE(uregsPrev.pc, uregsHere->pc, cfsi_m->ra_how, cfsi_m->ra_off); 2950 COMPUTE(uregsPrev.sp, uregsHere->sp, cfsi_m->sp_how, cfsi_m->sp_off); 2951 COMPUTE(uregsPrev.x30, uregsHere->x30, cfsi_m->x30_how, cfsi_m->x30_off); 2952 COMPUTE(uregsPrev.x29, uregsHere->x29, cfsi_m->x29_how, cfsi_m->x29_off); 2953# elif defined(VGA_tilegx) 2954 COMPUTE(uregsPrev.pc, uregsHere->pc, cfsi_m->ra_how, cfsi_m->ra_off); 2955 COMPUTE(uregsPrev.sp, uregsHere->sp, cfsi_m->sp_how, cfsi_m->sp_off); 2956 COMPUTE(uregsPrev.fp, uregsHere->fp, cfsi_m->fp_how, cfsi_m->fp_off); 2957# else 2958# error "Unknown arch" 2959# endif 2960 2961# undef COMPUTE 2962 2963 *uregsHere = uregsPrev; 2964 return True; 2965} 2966 2967 2968/*--------------------------------------------------------------*/ 2969/*--- ---*/ 2970/*--- TOP LEVEL: FOR UNWINDING THE STACK USING ---*/ 2971/*--- MSVC FPO INFO ---*/ 2972/*--- ---*/ 2973/*--------------------------------------------------------------*/ 2974 2975Bool VG_(use_FPO_info) ( /*MOD*/Addr* ipP, 2976 /*MOD*/Addr* spP, 2977 /*MOD*/Addr* fpP, 2978 Addr min_accessible, 2979 Addr max_accessible ) 2980{ 2981 Word i; 2982 const DebugInfo* di; 2983 FPO_DATA* fpo = NULL; 2984 Addr spHere; 2985 2986 static UWord n_search = 0; 2987 static UWord n_steps = 0; 2988 n_search++; 2989 2990 if (0) VG_(printf)("search FPO for %#lx\n", *ipP); 2991 2992 for (di = debugInfo_list; di != NULL; di = di->next) { 2993 n_steps++; 2994 2995 /* Use the per-DebugInfo summary address ranges to skip 2996 inapplicable DebugInfos quickly. */ 2997 if (di->fpo == NULL) 2998 continue; 2999 if (*ipP < di->fpo_minavma || *ipP > di->fpo_maxavma) 3000 continue; 3001 3002 i = ML_(search_one_fpotab)( di, *ipP ); 3003 if (i != -1) { 3004 Word j; 3005 if (0) { 3006 /* debug printing only */ 3007 VG_(printf)("look for %#lx size %ld i %ld\n", 3008 *ipP, di->fpo_size, i); 3009 for (j = 0; j < di->fpo_size; j++) 3010 VG_(printf)("[%02ld] %#x %d\n", 3011 j, di->fpo[j].ulOffStart, di->fpo[j].cbProcSize); 3012 } 3013 vg_assert(i >= 0 && i < di->fpo_size); 3014 fpo = &di->fpo[i]; 3015 break; 3016 } 3017 } 3018 3019 if (fpo == NULL) 3020 return False; 3021 3022 if (0 && ((n_search & 0x7FFFF) == 0)) 3023 VG_(printf)("VG_(use_FPO_info): %lu searches, " 3024 "%lu DebugInfos looked at\n", 3025 n_search, n_steps); 3026 3027 3028 /* Start of performance-enhancing hack: once every 64 (chosen 3029 hackily after profiling) successful searches, move the found 3030 DebugInfo one step closer to the start of the list. This makes 3031 future searches cheaper. For starting konqueror on amd64, this 3032 in fact reduces the total amount of searching done by the above 3033 find-the-right-DebugInfo loop by more than a factor of 20. */ 3034 if ((n_search & 0x3F) == 0) { 3035 /* Move si one step closer to the start of the list. */ 3036 //move_DebugInfo_one_step_forward( di ); 3037 } 3038 /* End of performance-enhancing hack. */ 3039 3040 if (0) { 3041 VG_(printf)("found fpo: "); 3042 //ML_(ppFPO)(fpo); 3043 } 3044 3045 /* 3046 Stack layout is: 3047 %esp-> 3048 4*.cbRegs {%edi, %esi, %ebp, %ebx} 3049 4*.cdwLocals 3050 return_pc 3051 4*.cdwParams 3052 prior_%esp-> 3053 3054 Typical code looks like: 3055 sub $4*.cdwLocals,%esp 3056 Alternative to above for >=4KB (and sometimes for smaller): 3057 mov $size,%eax 3058 call __chkstk # WinNT performs page-by-page probe! 3059 __chkstk is much like alloc(), except that on return 3060 %eax= 5+ &CALL. Thus it could be used as part of 3061 Position Independent Code to locate the Global Offset Table. 3062 push %ebx 3063 push %ebp 3064 push %esi 3065 Other once-only instructions often scheduled >here<. 3066 push %edi 3067 3068 If the pc is within the first .cbProlog bytes of the function, 3069 then you must disassemble to see how many registers have been pushed, 3070 because instructions in the prolog may be scheduled for performance. 3071 The order of PUSH is always %ebx, %ebp, %esi, %edi, with trailing 3072 registers not pushed when .cbRegs < 4. This seems somewhat strange 3073 because %ebp is the register whose usage you want to minimize, 3074 yet it is in the first half of the PUSH list. 3075 3076 I don't know what happens when the compiler constructs an outgoing CALL. 3077 %esp could move if outgoing parameters are PUSHed, and this affects 3078 traceback for errors during the PUSHes. */ 3079 3080 spHere = *spP; 3081 3082 *ipP = ML_(read_Addr)((void *)(spHere + 4*(fpo->cbRegs + fpo->cdwLocals))); 3083 *spP = spHere + 4*(fpo->cbRegs + fpo->cdwLocals + 1 3084 + fpo->cdwParams); 3085 *fpP = ML_(read_Addr)((void *)(spHere + 4*2)); 3086 return True; 3087} 3088 3089 3090/*--------------------------------------------------------------*/ 3091/*--- ---*/ 3092/*--- TOP LEVEL: GENERATE DESCRIPTION OF DATA ADDRESSES ---*/ 3093/*--- FROM DWARF3 DEBUG INFO ---*/ 3094/*--- ---*/ 3095/*--------------------------------------------------------------*/ 3096 3097/* Try to make p2XA(dst, fmt, args..) turn into 3098 VG_(xaprintf)(dst, fmt, args) without having to resort to 3099 vararg macros. As usual with everything to do with varargs, it's 3100 an ugly hack. 3101 3102 //#define p2XA(dstxa, format, args...) 3103 // VG_(xaprintf)(dstxa, format, ##args) 3104*/ 3105#define p2XA VG_(xaprintf) 3106 3107/* Add a zero-terminating byte to DST, which must be an XArray* of 3108 HChar. */ 3109static void zterm_XA ( XArray* dst ) 3110{ 3111 HChar zero = 0; 3112 (void) VG_(addBytesToXA)( dst, &zero, 1 ); 3113} 3114 3115 3116/* Evaluate the location expression/list for var, to see whether or 3117 not data_addr falls within the variable. If so also return the 3118 offset of data_addr from the start of the variable. Note that 3119 regs, which supplies ip,sp,fp values, will be NULL for global 3120 variables, and non-NULL for local variables. */ 3121static Bool data_address_is_in_var ( /*OUT*/PtrdiffT* offset, 3122 const XArray* /* TyEnt */ tyents, 3123 const DiVariable* var, 3124 const RegSummary* regs, 3125 Addr data_addr, 3126 const DebugInfo* di ) 3127{ 3128 MaybeULong mul; 3129 SizeT var_szB; 3130 GXResult res; 3131 Bool show = False; 3132 3133 vg_assert(var->name); 3134 vg_assert(var->gexpr); 3135 3136 /* Figure out how big the variable is. */ 3137 mul = ML_(sizeOfType)(tyents, var->typeR); 3138 /* If this var has a type whose size is unknown, zero, or 3139 impossibly large, it should never have been added. ML_(addVar) 3140 should have rejected it. */ 3141 vg_assert(mul.b == True); 3142 vg_assert(mul.ul > 0); 3143 if (sizeof(void*) == 4) vg_assert(mul.ul < (1ULL << 32)); 3144 /* After this point, we assume we can truncate mul.ul to a host word 3145 safely (without loss of info). */ 3146 3147 var_szB = (SizeT)mul.ul; /* NB: truncate to host word */ 3148 3149 if (show) { 3150 VG_(printf)("VVVV: data_address_%#lx_is_in_var: %s :: ", 3151 data_addr, var->name ); 3152 ML_(pp_TyEnt_C_ishly)( tyents, var->typeR ); 3153 VG_(printf)("\n"); 3154 } 3155 3156 /* ignore zero-sized vars; they can never match anything. */ 3157 if (var_szB == 0) { 3158 if (show) 3159 VG_(printf)("VVVV: -> Fail (variable is zero sized)\n"); 3160 return False; 3161 } 3162 3163 res = ML_(evaluate_GX)( var->gexpr, var->fbGX, regs, di ); 3164 3165 if (show) { 3166 VG_(printf)("VVVV: -> "); 3167 ML_(pp_GXResult)( res ); 3168 VG_(printf)("\n"); 3169 } 3170 3171 if (res.kind == GXR_Addr 3172 && res.word <= data_addr 3173 && data_addr < res.word + var_szB) { 3174 *offset = data_addr - res.word; 3175 return True; 3176 } else { 3177 return False; 3178 } 3179} 3180 3181 3182/* Format the acquired information into DN(AME)1 and DN(AME)2, which 3183 are XArray*s of HChar, that have been initialised by the caller. 3184 Resulting strings will be zero terminated. Information is 3185 formatted in an understandable way. Not so easy. If frameNo is 3186 -1, this is assumed to be a global variable; else a local 3187 variable. */ 3188static void format_message ( /*MOD*/XArray* /* of HChar */ dn1, 3189 /*MOD*/XArray* /* of HChar */ dn2, 3190 Addr data_addr, 3191 const DebugInfo* di, 3192 const DiVariable* var, 3193 PtrdiffT var_offset, 3194 PtrdiffT residual_offset, 3195 const XArray* /*HChar*/ described, 3196 Int frameNo, 3197 ThreadId tid ) 3198{ 3199 Bool have_descr, have_srcloc; 3200 Bool xml = VG_(clo_xml); 3201 const HChar* vo_plural = var_offset == 1 ? "" : "s"; 3202 const HChar* ro_plural = residual_offset == 1 ? "" : "s"; 3203 const HChar* basetag = "auxwhat"; /* a constant */ 3204 HChar tagL[32], tagR[32], xagL[32], xagR[32]; 3205 const HChar *fileName = ML_(fndn_ix2filename)(di, var->fndn_ix); 3206 // fileName will be "???" if var->fndn_ix == 0. 3207 // fileName will only be used if have_descr is True. 3208 3209 if (frameNo < -1) { 3210 vg_assert(0); /* Not allowed */ 3211 } 3212 else if (frameNo == -1) { 3213 vg_assert(tid == VG_INVALID_THREADID); 3214 } 3215 else /* (frameNo >= 0) */ { 3216 vg_assert(tid != VG_INVALID_THREADID); 3217 } 3218 3219 vg_assert(dn1 && dn2); 3220 vg_assert(described); 3221 vg_assert(var && var->name); 3222 have_descr = VG_(sizeXA)(described) > 0 3223 && *(HChar*)VG_(indexXA)(described,0) != '\0'; 3224 have_srcloc = var->fndn_ix > 0 && var->lineNo > 0; 3225 3226 tagL[0] = tagR[0] = xagL[0] = xagR[0] = 0; 3227 if (xml) { 3228 VG_(sprintf)(tagL, "<%s>", basetag); // <auxwhat> 3229 VG_(sprintf)(tagR, "</%s>", basetag); // </auxwhat> 3230 VG_(sprintf)(xagL, "<x%s>", basetag); // <xauxwhat> 3231 VG_(sprintf)(xagR, "</x%s>", basetag); // </xauxwhat> 3232 } 3233 3234# define TAGL(_xa) p2XA(_xa, "%s", tagL) 3235# define TAGR(_xa) p2XA(_xa, "%s", tagR) 3236# define XAGL(_xa) p2XA(_xa, "%s", xagL) 3237# define XAGR(_xa) p2XA(_xa, "%s", xagR) 3238# define TXTL(_xa) p2XA(_xa, "%s", "<text>") 3239# define TXTR(_xa) p2XA(_xa, "%s", "</text>") 3240 3241 /* ------ local cases ------ */ 3242 3243 if ( frameNo >= 0 && (!have_srcloc) && (!have_descr) ) { 3244 /* no srcloc, no description: 3245 Location 0x7fefff6cf is 543 bytes inside local var "a", 3246 in frame #1 of thread 1 3247 */ 3248 if (xml) { 3249 TAGL( dn1 ); 3250 p2XA( dn1, 3251 "Location 0x%lx is %lu byte%s inside local var \"%pS\",", 3252 data_addr, var_offset, vo_plural, var->name ); 3253 TAGR( dn1 ); 3254 TAGL( dn2 ); 3255 p2XA( dn2, 3256 "in frame #%d of thread %d", frameNo, (Int)tid ); 3257 TAGR( dn2 ); 3258 } else { 3259 p2XA( dn1, 3260 "Location 0x%lx is %lu byte%s inside local var \"%s\",", 3261 data_addr, var_offset, vo_plural, var->name ); 3262 p2XA( dn2, 3263 "in frame #%d of thread %d", frameNo, (Int)tid ); 3264 } 3265 } 3266 else 3267 if ( frameNo >= 0 && have_srcloc && (!have_descr) ) { 3268 /* no description: 3269 Location 0x7fefff6cf is 543 bytes inside local var "a" 3270 declared at dsyms7.c:17, in frame #1 of thread 1 3271 */ 3272 if (xml) { 3273 TAGL( dn1 ); 3274 p2XA( dn1, 3275 "Location 0x%lx is %lu byte%s inside local var \"%pS\"", 3276 data_addr, var_offset, vo_plural, var->name ); 3277 TAGR( dn1 ); 3278 XAGL( dn2 ); 3279 TXTL( dn2 ); 3280 p2XA( dn2, 3281 "declared at %pS:%d, in frame #%d of thread %d", 3282 fileName, var->lineNo, frameNo, (Int)tid ); 3283 TXTR( dn2 ); 3284 // FIXME: also do <dir> 3285 p2XA( dn2, 3286 " <file>%pS</file> <line>%d</line> ", 3287 fileName, var->lineNo ); 3288 XAGR( dn2 ); 3289 } else { 3290 p2XA( dn1, 3291 "Location 0x%lx is %lu byte%s inside local var \"%s\"", 3292 data_addr, var_offset, vo_plural, var->name ); 3293 p2XA( dn2, 3294 "declared at %s:%d, in frame #%d of thread %d", 3295 fileName, var->lineNo, frameNo, (Int)tid ); 3296 } 3297 } 3298 else 3299 if ( frameNo >= 0 && (!have_srcloc) && have_descr ) { 3300 /* no srcloc: 3301 Location 0x7fefff6cf is 2 bytes inside a[3].xyzzy[21].c2 3302 in frame #1 of thread 1 3303 */ 3304 if (xml) { 3305 TAGL( dn1 ); 3306 p2XA( dn1, 3307 "Location 0x%lx is %lu byte%s inside %pS%pS", 3308 data_addr, residual_offset, ro_plural, var->name, 3309 (HChar*)(VG_(indexXA)(described,0)) ); 3310 TAGR( dn1 ); 3311 TAGL( dn2 ); 3312 p2XA( dn2, 3313 "in frame #%d of thread %d", frameNo, (Int)tid ); 3314 TAGR( dn2 ); 3315 } else { 3316 p2XA( dn1, 3317 "Location 0x%lx is %lu byte%s inside %s%s", 3318 data_addr, residual_offset, ro_plural, var->name, 3319 (HChar*)(VG_(indexXA)(described,0)) ); 3320 p2XA( dn2, 3321 "in frame #%d of thread %d", frameNo, (Int)tid ); 3322 } 3323 } 3324 else 3325 if ( frameNo >= 0 && have_srcloc && have_descr ) { 3326 /* Location 0x7fefff6cf is 2 bytes inside a[3].xyzzy[21].c2, 3327 declared at dsyms7.c:17, in frame #1 of thread 1 */ 3328 if (xml) { 3329 TAGL( dn1 ); 3330 p2XA( dn1, 3331 "Location 0x%lx is %lu byte%s inside %pS%pS,", 3332 data_addr, residual_offset, ro_plural, var->name, 3333 (HChar*)(VG_(indexXA)(described,0)) ); 3334 TAGR( dn1 ); 3335 XAGL( dn2 ); 3336 TXTL( dn2 ); 3337 p2XA( dn2, 3338 "declared at %pS:%d, in frame #%d of thread %d", 3339 fileName, var->lineNo, frameNo, (Int)tid ); 3340 TXTR( dn2 ); 3341 // FIXME: also do <dir> 3342 p2XA( dn2, 3343 " <file>%pS</file> <line>%d</line> ", 3344 fileName, var->lineNo ); 3345 XAGR( dn2 ); 3346 } else { 3347 p2XA( dn1, 3348 "Location 0x%lx is %lu byte%s inside %s%s,", 3349 data_addr, residual_offset, ro_plural, var->name, 3350 (HChar*)(VG_(indexXA)(described,0)) ); 3351 p2XA( dn2, 3352 "declared at %s:%d, in frame #%d of thread %d", 3353 fileName, var->lineNo, frameNo, (Int)tid ); 3354 } 3355 } 3356 else 3357 /* ------ global cases ------ */ 3358 if ( frameNo >= -1 && (!have_srcloc) && (!have_descr) ) { 3359 /* no srcloc, no description: 3360 Location 0x7fefff6cf is 543 bytes inside global var "a" 3361 */ 3362 if (xml) { 3363 TAGL( dn1 ); 3364 p2XA( dn1, 3365 "Location 0x%lx is %lu byte%s inside global var \"%pS\"", 3366 data_addr, var_offset, vo_plural, var->name ); 3367 TAGR( dn1 ); 3368 } else { 3369 p2XA( dn1, 3370 "Location 0x%lx is %lu byte%s inside global var \"%s\"", 3371 data_addr, var_offset, vo_plural, var->name ); 3372 } 3373 } 3374 else 3375 if ( frameNo >= -1 && have_srcloc && (!have_descr) ) { 3376 /* no description: 3377 Location 0x7fefff6cf is 543 bytes inside global var "a" 3378 declared at dsyms7.c:17 3379 */ 3380 if (xml) { 3381 TAGL( dn1 ); 3382 p2XA( dn1, 3383 "Location 0x%lx is %lu byte%s inside global var \"%pS\"", 3384 data_addr, var_offset, vo_plural, var->name ); 3385 TAGR( dn1 ); 3386 XAGL( dn2 ); 3387 TXTL( dn2 ); 3388 p2XA( dn2, 3389 "declared at %pS:%d", 3390 fileName, var->lineNo); 3391 TXTR( dn2 ); 3392 // FIXME: also do <dir> 3393 p2XA( dn2, 3394 " <file>%pS</file> <line>%d</line> ", 3395 fileName, var->lineNo ); 3396 XAGR( dn2 ); 3397 } else { 3398 p2XA( dn1, 3399 "Location 0x%lx is %lu byte%s inside global var \"%s\"", 3400 data_addr, var_offset, vo_plural, var->name ); 3401 p2XA( dn2, 3402 "declared at %s:%d", 3403 fileName, var->lineNo); 3404 } 3405 } 3406 else 3407 if ( frameNo >= -1 && (!have_srcloc) && have_descr ) { 3408 /* no srcloc: 3409 Location 0x7fefff6cf is 2 bytes inside a[3].xyzzy[21].c2, 3410 a global variable 3411 */ 3412 if (xml) { 3413 TAGL( dn1 ); 3414 p2XA( dn1, 3415 "Location 0x%lx is %lu byte%s inside %pS%pS,", 3416 data_addr, residual_offset, ro_plural, var->name, 3417 (HChar*)(VG_(indexXA)(described,0)) ); 3418 TAGR( dn1 ); 3419 TAGL( dn2 ); 3420 p2XA( dn2, 3421 "a global variable"); 3422 TAGR( dn2 ); 3423 } else { 3424 p2XA( dn1, 3425 "Location 0x%lx is %lu byte%s inside %s%s,", 3426 data_addr, residual_offset, ro_plural, var->name, 3427 (char*)(VG_(indexXA)(described,0)) ); 3428 p2XA( dn2, 3429 "a global variable"); 3430 } 3431 } 3432 else 3433 if ( frameNo >= -1 && have_srcloc && have_descr ) { 3434 /* Location 0x7fefff6cf is 2 bytes inside a[3].xyzzy[21].c2, 3435 a global variable declared at dsyms7.c:17 */ 3436 if (xml) { 3437 TAGL( dn1 ); 3438 p2XA( dn1, 3439 "Location 0x%lx is %lu byte%s inside %pS%pS,", 3440 data_addr, residual_offset, ro_plural, var->name, 3441 (HChar*)(VG_(indexXA)(described,0)) ); 3442 TAGR( dn1 ); 3443 XAGL( dn2 ); 3444 TXTL( dn2 ); 3445 p2XA( dn2, 3446 "a global variable declared at %pS:%d", 3447 fileName, var->lineNo); 3448 TXTR( dn2 ); 3449 // FIXME: also do <dir> 3450 p2XA( dn2, 3451 " <file>%pS</file> <line>%d</line> ", 3452 fileName, var->lineNo ); 3453 XAGR( dn2 ); 3454 } else { 3455 p2XA( dn1, 3456 "Location 0x%lx is %lu byte%s inside %s%s,", 3457 data_addr, residual_offset, ro_plural, var->name, 3458 (HChar*)(VG_(indexXA)(described,0)) ); 3459 p2XA( dn2, 3460 "a global variable declared at %s:%d", 3461 fileName, var->lineNo); 3462 } 3463 } 3464 else 3465 vg_assert(0); 3466 3467 /* Zero terminate both strings */ 3468 zterm_XA( dn1 ); 3469 zterm_XA( dn2 ); 3470 3471# undef TAGL 3472# undef TAGR 3473# undef XAGL 3474# undef XAGR 3475# undef TXTL 3476# undef TXTR 3477} 3478 3479 3480/* Determine if data_addr is a local variable in the frame 3481 characterised by (ip,sp,fp), and if so write its description at the 3482 ends of DNAME{1,2}, which are XArray*s of HChar, that have been 3483 initialised by the caller, zero terminate both, and return True. 3484 If it's not a local variable in said frame, return False. */ 3485static 3486Bool consider_vars_in_frame ( /*MOD*/XArray* /* of HChar */ dname1, 3487 /*MOD*/XArray* /* of HChar */ dname2, 3488 Addr data_addr, 3489 Addr ip, Addr sp, Addr fp, 3490 /* shown to user: */ 3491 ThreadId tid, Int frameNo ) 3492{ 3493 Word i; 3494 DebugInfo* di; 3495 RegSummary regs; 3496 Bool debug = False; 3497 3498 static UInt n_search = 0; 3499 static UInt n_steps = 0; 3500 n_search++; 3501 if (debug) 3502 VG_(printf)("QQQQ: cvif: ip,sp,fp %#lx,%#lx,%#lx\n", ip,sp,fp); 3503 /* first, find the DebugInfo that pertains to 'ip'. */ 3504 for (di = debugInfo_list; di; di = di->next) { 3505 n_steps++; 3506 /* text segment missing? unlikely, but handle it .. */ 3507 if (!di->text_present || di->text_size == 0) 3508 continue; 3509 /* Ok. So does this text mapping bracket the ip? */ 3510 if (di->text_avma <= ip && ip < di->text_avma + di->text_size) 3511 break; 3512 } 3513 3514 /* Didn't find it. Strange -- means ip is a code address outside 3515 of any mapped text segment. Unlikely but not impossible -- app 3516 could be generating code to run. */ 3517 if (!di) 3518 return False; 3519 3520 if (0 && ((n_search & 0x1) == 0)) 3521 VG_(printf)("consider_vars_in_frame: %u searches, " 3522 "%u DebugInfos looked at\n", 3523 n_search, n_steps); 3524 /* Start of performance-enhancing hack: once every ??? (chosen 3525 hackily after profiling) successful searches, move the found 3526 DebugInfo one step closer to the start of the list. This makes 3527 future searches cheaper. */ 3528 if ((n_search & 0xFFFF) == 0) { 3529 /* Move si one step closer to the start of the list. */ 3530 move_DebugInfo_one_step_forward( di ); 3531 } 3532 /* End of performance-enhancing hack. */ 3533 3534 /* any var info at all? */ 3535 if (!di->varinfo) 3536 return False; 3537 3538 /* Work through the scopes from most deeply nested outwards, 3539 looking for code address ranges that bracket 'ip'. The 3540 variables on each such address range found are in scope right 3541 now. Don't descend to level zero as that is the global 3542 scope. */ 3543 regs.ip = ip; 3544 regs.sp = sp; 3545 regs.fp = fp; 3546 3547 /* "for each scope, working outwards ..." */ 3548 for (i = VG_(sizeXA)(di->varinfo) - 1; i >= 1; i--) { 3549 XArray* vars; 3550 Word j; 3551 DiAddrRange* arange; 3552 OSet* this_scope 3553 = *(OSet**)VG_(indexXA)( di->varinfo, i ); 3554 if (debug) 3555 VG_(printf)("QQQQ: considering scope %ld\n", (Word)i); 3556 if (!this_scope) 3557 continue; 3558 /* Find the set of variables in this scope that 3559 bracket the program counter. */ 3560 arange = VG_(OSetGen_LookupWithCmp)( 3561 this_scope, &ip, 3562 ML_(cmp_for_DiAddrRange_range) 3563 ); 3564 if (!arange) 3565 continue; 3566 /* stay sane */ 3567 vg_assert(arange->aMin <= arange->aMax); 3568 /* It must bracket the ip we asked for, else 3569 ML_(cmp_for_DiAddrRange_range) is somehow broken. */ 3570 vg_assert(arange->aMin <= ip && ip <= arange->aMax); 3571 /* It must have an attached XArray of DiVariables. */ 3572 vars = arange->vars; 3573 vg_assert(vars); 3574 /* But it mustn't cover the entire address range. We only 3575 expect that to happen for the global scope (level 0), which 3576 we're not looking at here. Except, it may cover the entire 3577 address range, but in that case the vars array must be 3578 empty. */ 3579 vg_assert(! (arange->aMin == (Addr)0 3580 && arange->aMax == ~(Addr)0 3581 && VG_(sizeXA)(vars) > 0) ); 3582 for (j = 0; j < VG_(sizeXA)( vars ); j++) { 3583 DiVariable* var = (DiVariable*)VG_(indexXA)( vars, j ); 3584 PtrdiffT offset; 3585 if (debug) 3586 VG_(printf)("QQQQ: var:name=%s %#lx-%#lx %#lx\n", 3587 var->name,arange->aMin,arange->aMax,ip); 3588 if (data_address_is_in_var( &offset, di->admin_tyents, 3589 var, ®s, 3590 data_addr, di )) { 3591 PtrdiffT residual_offset = 0; 3592 XArray* described = ML_(describe_type)( &residual_offset, 3593 di->admin_tyents, 3594 var->typeR, offset ); 3595 format_message( dname1, dname2, 3596 data_addr, di, var, offset, residual_offset, 3597 described, frameNo, tid ); 3598 VG_(deleteXA)( described ); 3599 return True; 3600 } 3601 } 3602 } 3603 3604 return False; 3605} 3606 3607/* Try to form some description of DATA_ADDR by looking at the DWARF3 3608 debug info we have. This considers all global variables, and 8 3609 frames in the stacks of all threads. Result is written at the ends 3610 of DNAME{1,2}V, which are XArray*s of HChar, that have been 3611 initialised by the caller, and True is returned. If no description 3612 is created, False is returned. Regardless of the return value, 3613 DNAME{1,2}V are guaranteed to be zero terminated after the call. 3614 3615 Note that after the call, DNAME{1,2} may have more than one 3616 trailing zero, so callers should establish the useful text length 3617 using VG_(strlen) on the contents, rather than VG_(sizeXA) on the 3618 XArray itself. 3619*/ 3620Bool VG_(get_data_description)( 3621 /*MOD*/ void* /* really, XArray* of HChar */ dname1v, 3622 /*MOD*/ void* /* really, XArray* of HChar */ dname2v, 3623 Addr data_addr 3624 ) 3625{ 3626# define N_FRAMES 8 3627 Addr ips[N_FRAMES], sps[N_FRAMES], fps[N_FRAMES]; 3628 UInt n_frames; 3629 3630 Addr stack_min, stack_max; 3631 ThreadId tid; 3632 Bool found; 3633 DebugInfo* di; 3634 Word j; 3635 3636 XArray* dname1 = (XArray*)dname1v; 3637 XArray* dname2 = (XArray*)dname2v; 3638 3639 if (0) VG_(printf)("get_data_description: dataaddr %#lx\n", data_addr); 3640 /* First, see if data_addr is (or is part of) a global variable. 3641 Loop over the DebugInfos we have. Check data_addr against the 3642 outermost scope of all of them, as that should be a global 3643 scope. */ 3644 for (di = debugInfo_list; di != NULL; di = di->next) { 3645 OSet* global_scope; 3646 Word gs_size; 3647 Addr zero; 3648 DiAddrRange* global_arange; 3649 Word i; 3650 XArray* vars; 3651 3652 /* text segment missing? unlikely, but handle it .. */ 3653 if (!di->text_present || di->text_size == 0) 3654 continue; 3655 /* any var info at all? */ 3656 if (!di->varinfo) 3657 continue; 3658 /* perhaps this object didn't contribute any vars at all? */ 3659 if (VG_(sizeXA)( di->varinfo ) == 0) 3660 continue; 3661 global_scope = *(OSet**)VG_(indexXA)( di->varinfo, 0 ); 3662 vg_assert(global_scope); 3663 gs_size = VG_(OSetGen_Size)( global_scope ); 3664 /* The global scope might be completely empty if this 3665 compilation unit declared locals but nothing global. */ 3666 if (gs_size == 0) 3667 continue; 3668 /* But if it isn't empty, then it must contain exactly one 3669 element, which covers the entire address range. */ 3670 vg_assert(gs_size == 1); 3671 /* Fish out the global scope and check it is as expected. */ 3672 zero = 0; 3673 global_arange 3674 = VG_(OSetGen_Lookup)( global_scope, &zero ); 3675 /* The global range from (Addr)0 to ~(Addr)0 must exist */ 3676 vg_assert(global_arange); 3677 vg_assert(global_arange->aMin == (Addr)0 3678 && global_arange->aMax == ~(Addr)0); 3679 /* Any vars in this range? */ 3680 if (!global_arange->vars) 3681 continue; 3682 /* Ok, there are some vars in the global scope of this 3683 DebugInfo. Wade through them and see if the data addresses 3684 of any of them bracket data_addr. */ 3685 vars = global_arange->vars; 3686 for (i = 0; i < VG_(sizeXA)( vars ); i++) { 3687 PtrdiffT offset; 3688 DiVariable* var = (DiVariable*)VG_(indexXA)( vars, i ); 3689 vg_assert(var->name); 3690 /* Note we use a NULL RegSummary* here. It can't make any 3691 sense for a global variable to have a location expression 3692 which depends on a SP/FP/IP value. So don't supply any. 3693 This means, if the evaluation of the location 3694 expression/list requires a register, we have to let it 3695 fail. */ 3696 if (data_address_is_in_var( &offset, di->admin_tyents, var, 3697 NULL/* RegSummary* */, 3698 data_addr, di )) { 3699 PtrdiffT residual_offset = 0; 3700 XArray* described = ML_(describe_type)( &residual_offset, 3701 di->admin_tyents, 3702 var->typeR, offset ); 3703 format_message( dname1, dname2, 3704 data_addr, di, var, offset, residual_offset, 3705 described, -1/*frameNo*/, 3706 VG_INVALID_THREADID ); 3707 VG_(deleteXA)( described ); 3708 zterm_XA( dname1 ); 3709 zterm_XA( dname2 ); 3710 return True; 3711 } 3712 } 3713 } 3714 3715 /* Ok, well it's not a global variable. So now let's snoop around 3716 in the stacks of all the threads. First try to figure out which 3717 thread's stack data_addr is in. */ 3718 3719 /* Perhaps it's on a thread's stack? */ 3720 found = False; 3721 VG_(thread_stack_reset_iter)(&tid); 3722 while ( VG_(thread_stack_next)(&tid, &stack_min, &stack_max) ) { 3723 if (stack_min >= stack_max) 3724 continue; /* ignore obviously stupid cases */ 3725 if (stack_min - VG_STACK_REDZONE_SZB <= data_addr 3726 && data_addr <= stack_max) { 3727 found = True; 3728 break; 3729 } 3730 } 3731 if (!found) { 3732 zterm_XA( dname1 ); 3733 zterm_XA( dname2 ); 3734 return False; 3735 } 3736 3737 /* We conclude data_addr is in thread tid's stack. Unwind the 3738 stack to get a bunch of (ip,sp,fp) triples describing the 3739 frames, and for each frame, consider the local variables. */ 3740 n_frames = VG_(get_StackTrace)( tid, ips, N_FRAMES, 3741 sps, fps, 0/*first_ip_delta*/ ); 3742 3743 vg_assert(n_frames >= 0 && n_frames <= N_FRAMES); 3744 for (j = 0; j < n_frames; j++) { 3745 if (consider_vars_in_frame( dname1, dname2, 3746 data_addr, 3747 ips[j], 3748 sps[j], fps[j], tid, j )) { 3749 zterm_XA( dname1 ); 3750 zterm_XA( dname2 ); 3751 return True; 3752 } 3753 /* Now, it appears that gcc sometimes appears to produce 3754 location lists whose ranges don't actually cover the call 3755 instruction, even though the address of the variable in 3756 question is passed as a parameter in the call. AFAICS this 3757 is simply a bug in gcc - how can the variable be claimed not 3758 exist in memory (on the stack) for the duration of a call in 3759 which its address is passed? But anyway, in the particular 3760 case I investigated (memcheck/tests/varinfo6.c, call to croak 3761 on line 2999, local var budget declared at line 3115 3762 appearing not to exist across the call to mainSort on line 3763 3143, "gcc.orig (GCC) 3.4.4 20050721 (Red Hat 3.4.4-2)" on 3764 amd64), the variable's location list does claim it exists 3765 starting at the first byte of the first instruction after the 3766 call instruction. So, call consider_vars_in_frame a second 3767 time, but this time add 1 to the IP. GDB handles this 3768 example with no difficulty, which leads me to believe that 3769 either (1) I misunderstood something, or (2) GDB has an 3770 equivalent kludge. */ 3771 if (j > 0 /* this is a non-innermost frame */ 3772 && consider_vars_in_frame( dname1, dname2, 3773 data_addr, 3774 ips[j] + 1, 3775 sps[j], fps[j], tid, j )) { 3776 zterm_XA( dname1 ); 3777 zterm_XA( dname2 ); 3778 return True; 3779 } 3780 } 3781 3782 /* We didn't find anything useful. */ 3783 zterm_XA( dname1 ); 3784 zterm_XA( dname2 ); 3785 return False; 3786# undef N_FRAMES 3787} 3788 3789 3790////////////////////////////////////////////////////////////////// 3791// // 3792// Support for other kinds of queries to the Dwarf3 var info // 3793// // 3794////////////////////////////////////////////////////////////////// 3795 3796/* Figure out if the variable 'var' has a location that is linearly 3797 dependent on a stack pointer value, or a frame pointer value, and 3798 if it is, add a description of it to 'blocks'. Otherwise ignore 3799 it. If 'arrays_only' is True, also ignore it unless it has an 3800 array type. */ 3801 3802static 3803void analyse_deps ( /*MOD*/XArray* /* of FrameBlock */ blocks, 3804 const XArray* /* TyEnt */ tyents, 3805 Addr ip, const DebugInfo* di, const DiVariable* var, 3806 Bool arrays_only ) 3807{ 3808 GXResult res_sp_6k, res_sp_7k, res_fp_6k, res_fp_7k; 3809 RegSummary regs; 3810 MaybeULong mul; 3811 Bool isVec; 3812 TyEnt* ty; 3813 3814 Bool debug = False; 3815 if (0&&debug) 3816 VG_(printf)("adeps: var %s\n", var->name ); 3817 3818 /* Figure out how big the variable is. */ 3819 mul = ML_(sizeOfType)(tyents, var->typeR); 3820 /* If this var has a type whose size is unknown, zero, or 3821 impossibly large, it should never have been added. ML_(addVar) 3822 should have rejected it. */ 3823 vg_assert(mul.b == True); 3824 vg_assert(mul.ul > 0); 3825 if (sizeof(void*) == 4) vg_assert(mul.ul < (1ULL << 32)); 3826 /* After this point, we assume we can truncate mul.ul to a host word 3827 safely (without loss of info). */ 3828 3829 /* skip if non-array and we're only interested in arrays */ 3830 ty = ML_(TyEnts__index_by_cuOff)( tyents, NULL, var->typeR ); 3831 vg_assert(ty); 3832 vg_assert(ty->tag == Te_UNKNOWN || ML_(TyEnt__is_type)(ty)); 3833 if (ty->tag == Te_UNKNOWN) 3834 return; /* perhaps we should complain in this case? */ 3835 isVec = ty->tag == Te_TyArray; 3836 if (arrays_only && !isVec) 3837 return; 3838 3839 if (0) {ML_(pp_TyEnt_C_ishly)(tyents, var->typeR); 3840 VG_(printf)(" %s\n", var->name);} 3841 3842 /* Do some test evaluations of the variable's location expression, 3843 in order to guess whether it is sp-relative, fp-relative, or 3844 none. A crude hack, which can be interpreted roughly as finding 3845 the first derivative of the location expression w.r.t. the 3846 supplied frame and stack pointer values. */ 3847 regs.fp = 0; 3848 regs.ip = ip; 3849 regs.sp = 6 * 1024; 3850 res_sp_6k = ML_(evaluate_GX)( var->gexpr, var->fbGX, ®s, di ); 3851 3852 regs.fp = 0; 3853 regs.ip = ip; 3854 regs.sp = 7 * 1024; 3855 res_sp_7k = ML_(evaluate_GX)( var->gexpr, var->fbGX, ®s, di ); 3856 3857 regs.fp = 6 * 1024; 3858 regs.ip = ip; 3859 regs.sp = 0; 3860 res_fp_6k = ML_(evaluate_GX)( var->gexpr, var->fbGX, ®s, di ); 3861 3862 regs.fp = 7 * 1024; 3863 regs.ip = ip; 3864 regs.sp = 0; 3865 res_fp_7k = ML_(evaluate_GX)( var->gexpr, var->fbGX, ®s, di ); 3866 3867 vg_assert(res_sp_6k.kind == res_sp_7k.kind); 3868 vg_assert(res_sp_6k.kind == res_fp_6k.kind); 3869 vg_assert(res_sp_6k.kind == res_fp_7k.kind); 3870 3871 if (res_sp_6k.kind == GXR_Addr) { 3872 StackBlock block; 3873 GXResult res; 3874 UWord sp_delta = res_sp_7k.word - res_sp_6k.word; 3875 UWord fp_delta = res_fp_7k.word - res_fp_6k.word; 3876 vg_assert(sp_delta == 0 || sp_delta == 1024); 3877 vg_assert(fp_delta == 0 || fp_delta == 1024); 3878 3879 if (sp_delta == 0 && fp_delta == 0) { 3880 /* depends neither on sp nor fp, so it can't be a stack 3881 local. Ignore it. */ 3882 } 3883 else 3884 if (sp_delta == 1024 && fp_delta == 0) { 3885 regs.sp = regs.fp = 0; 3886 regs.ip = ip; 3887 res = ML_(evaluate_GX)( var->gexpr, var->fbGX, ®s, di ); 3888 vg_assert(res.kind == GXR_Addr); 3889 if (debug) 3890 VG_(printf)(" %5ld .. %5ld (sp) %s\n", 3891 res.word, res.word + ((UWord)mul.ul) - 1, var->name); 3892 block.base = res.word; 3893 block.szB = (SizeT)mul.ul; 3894 block.spRel = True; 3895 block.isVec = isVec; 3896 VG_(memset)( &block.name[0], 0, sizeof(block.name) ); 3897 if (var->name) 3898 VG_(strncpy)( &block.name[0], var->name, sizeof(block.name)-1 ); 3899 block.name[ sizeof(block.name)-1 ] = 0; 3900 VG_(addToXA)( blocks, &block ); 3901 } 3902 else 3903 if (sp_delta == 0 && fp_delta == 1024) { 3904 regs.sp = regs.fp = 0; 3905 regs.ip = ip; 3906 res = ML_(evaluate_GX)( var->gexpr, var->fbGX, ®s, di ); 3907 vg_assert(res.kind == GXR_Addr); 3908 if (debug) 3909 VG_(printf)(" %5ld .. %5ld (FP) %s\n", 3910 res.word, res.word + ((UWord)mul.ul) - 1, var->name); 3911 block.base = res.word; 3912 block.szB = (SizeT)mul.ul; 3913 block.spRel = False; 3914 block.isVec = isVec; 3915 VG_(memset)( &block.name[0], 0, sizeof(block.name) ); 3916 if (var->name) 3917 VG_(strncpy)( &block.name[0], var->name, sizeof(block.name)-1 ); 3918 block.name[ sizeof(block.name)-1 ] = 0; 3919 VG_(addToXA)( blocks, &block ); 3920 } 3921 else { 3922 vg_assert(0); 3923 } 3924 } 3925} 3926 3927 3928/* Get an XArray of StackBlock which describe the stack (auto) blocks 3929 for this ip. The caller is expected to free the XArray at some 3930 point. If 'arrays_only' is True, only array-typed blocks are 3931 returned; otherwise blocks of all types are returned. */ 3932 3933void* /* really, XArray* of StackBlock */ 3934 VG_(di_get_stack_blocks_at_ip)( Addr ip, Bool arrays_only ) 3935{ 3936 /* This is a derivation of consider_vars_in_frame() above. */ 3937 Word i; 3938 DebugInfo* di; 3939 Bool debug = False; 3940 3941 XArray* res = VG_(newXA)( ML_(dinfo_zalloc), "di.debuginfo.dgsbai.1", 3942 ML_(dinfo_free), 3943 sizeof(StackBlock) ); 3944 3945 static UInt n_search = 0; 3946 static UInt n_steps = 0; 3947 n_search++; 3948 if (debug) 3949 VG_(printf)("QQQQ: dgsbai: ip %#lx\n", ip); 3950 /* first, find the DebugInfo that pertains to 'ip'. */ 3951 for (di = debugInfo_list; di; di = di->next) { 3952 n_steps++; 3953 /* text segment missing? unlikely, but handle it .. */ 3954 if (!di->text_present || di->text_size == 0) 3955 continue; 3956 /* Ok. So does this text mapping bracket the ip? */ 3957 if (di->text_avma <= ip && ip < di->text_avma + di->text_size) 3958 break; 3959 } 3960 3961 /* Didn't find it. Strange -- means ip is a code address outside 3962 of any mapped text segment. Unlikely but not impossible -- app 3963 could be generating code to run. */ 3964 if (!di) 3965 return res; /* currently empty */ 3966 3967 if (0 && ((n_search & 0x1) == 0)) 3968 VG_(printf)("VG_(di_get_stack_blocks_at_ip): %u searches, " 3969 "%u DebugInfos looked at\n", 3970 n_search, n_steps); 3971 /* Start of performance-enhancing hack: once every ??? (chosen 3972 hackily after profiling) successful searches, move the found 3973 DebugInfo one step closer to the start of the list. This makes 3974 future searches cheaper. */ 3975 if ((n_search & 0xFFFF) == 0) { 3976 /* Move si one step closer to the start of the list. */ 3977 move_DebugInfo_one_step_forward( di ); 3978 } 3979 /* End of performance-enhancing hack. */ 3980 3981 /* any var info at all? */ 3982 if (!di->varinfo) 3983 return res; /* currently empty */ 3984 3985 /* Work through the scopes from most deeply nested outwards, 3986 looking for code address ranges that bracket 'ip'. The 3987 variables on each such address range found are in scope right 3988 now. Don't descend to level zero as that is the global 3989 scope. */ 3990 3991 /* "for each scope, working outwards ..." */ 3992 for (i = VG_(sizeXA)(di->varinfo) - 1; i >= 1; i--) { 3993 XArray* vars; 3994 Word j; 3995 DiAddrRange* arange; 3996 OSet* this_scope 3997 = *(OSet**)VG_(indexXA)( di->varinfo, i ); 3998 if (debug) 3999 VG_(printf)("QQQQ: considering scope %ld\n", (Word)i); 4000 if (!this_scope) 4001 continue; 4002 /* Find the set of variables in this scope that 4003 bracket the program counter. */ 4004 arange = VG_(OSetGen_LookupWithCmp)( 4005 this_scope, &ip, 4006 ML_(cmp_for_DiAddrRange_range) 4007 ); 4008 if (!arange) 4009 continue; 4010 /* stay sane */ 4011 vg_assert(arange->aMin <= arange->aMax); 4012 /* It must bracket the ip we asked for, else 4013 ML_(cmp_for_DiAddrRange_range) is somehow broken. */ 4014 vg_assert(arange->aMin <= ip && ip <= arange->aMax); 4015 /* It must have an attached XArray of DiVariables. */ 4016 vars = arange->vars; 4017 vg_assert(vars); 4018 /* But it mustn't cover the entire address range. We only 4019 expect that to happen for the global scope (level 0), which 4020 we're not looking at here. Except, it may cover the entire 4021 address range, but in that case the vars array must be 4022 empty. */ 4023 vg_assert(! (arange->aMin == (Addr)0 4024 && arange->aMax == ~(Addr)0 4025 && VG_(sizeXA)(vars) > 0) ); 4026 for (j = 0; j < VG_(sizeXA)( vars ); j++) { 4027 DiVariable* var = (DiVariable*)VG_(indexXA)( vars, j ); 4028 if (debug) 4029 VG_(printf)("QQQQ: var:name=%s %#lx-%#lx %#lx\n", 4030 var->name,arange->aMin,arange->aMax,ip); 4031 analyse_deps( res, di->admin_tyents, ip, 4032 di, var, arrays_only ); 4033 } 4034 } 4035 4036 return res; 4037} 4038 4039 4040/* Get an array of GlobalBlock which describe the global blocks owned 4041 by the shared object characterised by the given di_handle. Asserts 4042 if the handle is invalid. The caller is responsible for freeing 4043 the array at some point. If 'arrays_only' is True, only 4044 array-typed blocks are returned; otherwise blocks of all types are 4045 returned. */ 4046 4047void* /* really, XArray* of GlobalBlock */ 4048 VG_(di_get_global_blocks_from_dihandle) ( ULong di_handle, 4049 Bool arrays_only ) 4050{ 4051 /* This is a derivation of consider_vars_in_frame() above. */ 4052 4053 DebugInfo* di; 4054 XArray* gvars; /* XArray* of GlobalBlock */ 4055 Word nScopes, scopeIx; 4056 4057 /* The first thing to do is find the DebugInfo that 4058 pertains to 'di_handle'. */ 4059 vg_assert(di_handle > 0); 4060 for (di = debugInfo_list; di; di = di->next) { 4061 if (di->handle == di_handle) 4062 break; 4063 } 4064 4065 /* If this fails, we were unable to find any DebugInfo with the 4066 given handle. This is considered an error on the part of the 4067 caller. */ 4068 vg_assert(di != NULL); 4069 4070 /* we'll put the collected variables in here. */ 4071 gvars = VG_(newXA)( ML_(dinfo_zalloc), "di.debuginfo.dggbfd.1", 4072 ML_(dinfo_free), sizeof(GlobalBlock) ); 4073 4074 /* any var info at all? */ 4075 if (!di->varinfo) 4076 return gvars; 4077 4078 /* we'll iterate over all the variables we can find, even if 4079 it seems senseless to visit stack-allocated variables */ 4080 /* Iterate over all scopes */ 4081 nScopes = VG_(sizeXA)( di->varinfo ); 4082 for (scopeIx = 0; scopeIx < nScopes; scopeIx++) { 4083 4084 /* Iterate over each (code) address range at the current scope */ 4085 DiAddrRange* range; 4086 OSet* /* of DiAddrInfo */ scope 4087 = *(OSet**)VG_(indexXA)( di->varinfo, scopeIx ); 4088 vg_assert(scope); 4089 VG_(OSetGen_ResetIter)(scope); 4090 while ( (range = VG_(OSetGen_Next)(scope)) ) { 4091 4092 /* Iterate over each variable in the current address range */ 4093 Word nVars, varIx; 4094 vg_assert(range->vars); 4095 nVars = VG_(sizeXA)( range->vars ); 4096 for (varIx = 0; varIx < nVars; varIx++) { 4097 4098 Bool isVec; 4099 GXResult res; 4100 MaybeULong mul; 4101 GlobalBlock gb; 4102 TyEnt* ty; 4103 DiVariable* var = VG_(indexXA)( range->vars, varIx ); 4104 vg_assert(var->name); 4105 if (0) VG_(printf)("at depth %ld var %s ", scopeIx, var->name ); 4106 4107 /* Now figure out if this variable has a constant address 4108 (that is, independent of FP, SP, phase of moon, etc), 4109 and if so, what the address is. Any variable with a 4110 constant address is deemed to be a global so we collect 4111 it. */ 4112 if (0) { VG_(printf)("EVAL: "); ML_(pp_GX)(var->gexpr); 4113 VG_(printf)("\n"); } 4114 res = ML_(evaluate_trivial_GX)( var->gexpr, di ); 4115 4116 /* Not a constant address => not interesting */ 4117 if (res.kind != GXR_Addr) { 4118 if (0) VG_(printf)("FAIL\n"); 4119 continue; 4120 } 4121 4122 /* Ok, it's a constant address. See if we want to collect 4123 it. */ 4124 if (0) VG_(printf)("%#lx\n", res.word); 4125 4126 /* Figure out how big the variable is. */ 4127 mul = ML_(sizeOfType)(di->admin_tyents, var->typeR); 4128 4129 /* If this var has a type whose size is unknown, zero, or 4130 impossibly large, it should never have been added. 4131 ML_(addVar) should have rejected it. */ 4132 vg_assert(mul.b == True); 4133 vg_assert(mul.ul > 0); 4134 if (sizeof(void*) == 4) vg_assert(mul.ul < (1ULL << 32)); 4135 /* After this point, we assume we can truncate mul.ul to a 4136 host word safely (without loss of info). */ 4137 4138 /* skip if non-array and we're only interested in 4139 arrays */ 4140 ty = ML_(TyEnts__index_by_cuOff)( di->admin_tyents, NULL, 4141 var->typeR ); 4142 vg_assert(ty); 4143 vg_assert(ty->tag == Te_UNKNOWN || ML_(TyEnt__is_type)(ty)); 4144 if (ty->tag == Te_UNKNOWN) 4145 continue; /* perhaps we should complain in this case? */ 4146 4147 isVec = ty->tag == Te_TyArray; 4148 if (arrays_only && !isVec) continue; 4149 4150 /* Ok, so collect it! */ 4151 vg_assert(var->name); 4152 vg_assert(di->soname); 4153 if (0) VG_(printf)("XXXX %s %s %d\n", var->name, 4154 ML_(fndn_ix2filename)(di, var->fndn_ix), 4155 var->lineNo); 4156 VG_(memset)(&gb, 0, sizeof(gb)); 4157 gb.addr = res.word; 4158 gb.szB = (SizeT)mul.ul; 4159 gb.isVec = isVec; 4160 VG_(strncpy)(&gb.name[0], var->name, sizeof(gb.name)-1); 4161 VG_(strncpy)(&gb.soname[0], di->soname, sizeof(gb.soname)-1); 4162 vg_assert(gb.name[ sizeof(gb.name)-1 ] == 0); 4163 vg_assert(gb.soname[ sizeof(gb.soname)-1 ] == 0); 4164 4165 VG_(addToXA)( gvars, &gb ); 4166 4167 } /* for (varIx = 0; varIx < nVars; varIx++) */ 4168 4169 } /* while ( (range = VG_(OSetGen_Next)(scope)) ) */ 4170 4171 } /* for (scopeIx = 0; scopeIx < nScopes; scopeIx++) */ 4172 4173 return gvars; 4174} 4175 4176 4177/*------------------------------------------------------------*/ 4178/*--- DebugInfo accessor functions ---*/ 4179/*------------------------------------------------------------*/ 4180 4181const DebugInfo* VG_(next_DebugInfo)(const DebugInfo* di) 4182{ 4183 if (di == NULL) 4184 return debugInfo_list; 4185 return di->next; 4186} 4187 4188Addr VG_(DebugInfo_get_text_avma)(const DebugInfo* di) 4189{ 4190 return di->text_present ? di->text_avma : 0; 4191} 4192 4193SizeT VG_(DebugInfo_get_text_size)(const DebugInfo* di) 4194{ 4195 return di->text_present ? di->text_size : 0; 4196} 4197 4198Addr VG_(DebugInfo_get_bss_avma)(const DebugInfo* di) 4199{ 4200 return di->bss_present ? di->bss_avma : 0; 4201} 4202 4203SizeT VG_(DebugInfo_get_bss_size)(const DebugInfo* di) 4204{ 4205 return di->bss_present ? di->bss_size : 0; 4206} 4207 4208Addr VG_(DebugInfo_get_plt_avma)(const DebugInfo* di) 4209{ 4210 return di->plt_present ? di->plt_avma : 0; 4211} 4212 4213SizeT VG_(DebugInfo_get_plt_size)(const DebugInfo* di) 4214{ 4215 return di->plt_present ? di->plt_size : 0; 4216} 4217 4218Addr VG_(DebugInfo_get_gotplt_avma)(const DebugInfo* di) 4219{ 4220 return di->gotplt_present ? di->gotplt_avma : 0; 4221} 4222 4223SizeT VG_(DebugInfo_get_gotplt_size)(const DebugInfo* di) 4224{ 4225 return di->gotplt_present ? di->gotplt_size : 0; 4226} 4227 4228Addr VG_(DebugInfo_get_got_avma)(const DebugInfo* di) 4229{ 4230 return di->got_present ? di->got_avma : 0; 4231} 4232 4233SizeT VG_(DebugInfo_get_got_size)(const DebugInfo* di) 4234{ 4235 return di->got_present ? di->got_size : 0; 4236} 4237 4238const HChar* VG_(DebugInfo_get_soname)(const DebugInfo* di) 4239{ 4240 return di->soname; 4241} 4242 4243const HChar* VG_(DebugInfo_get_filename)(const DebugInfo* di) 4244{ 4245 return di->fsm.filename; 4246} 4247 4248PtrdiffT VG_(DebugInfo_get_text_bias)(const DebugInfo* di) 4249{ 4250 return di->text_present ? di->text_bias : 0; 4251} 4252 4253Int VG_(DebugInfo_syms_howmany) ( const DebugInfo *si ) 4254{ 4255 return si->symtab_used; 4256} 4257 4258void VG_(DebugInfo_syms_getidx) ( const DebugInfo *si, 4259 Int idx, 4260 /*OUT*/SymAVMAs* avmas, 4261 /*OUT*/UInt* size, 4262 /*OUT*/const HChar** pri_name, 4263 /*OUT*/const HChar*** sec_names, 4264 /*OUT*/Bool* isText, 4265 /*OUT*/Bool* isIFunc ) 4266{ 4267 vg_assert(idx >= 0 && idx < si->symtab_used); 4268 if (avmas) *avmas = si->symtab[idx].avmas; 4269 if (size) *size = si->symtab[idx].size; 4270 if (pri_name) *pri_name = si->symtab[idx].pri_name; 4271 if (sec_names) *sec_names = si->symtab[idx].sec_names; 4272 if (isText) *isText = si->symtab[idx].isText; 4273 if (isIFunc) *isIFunc = si->symtab[idx].isIFunc; 4274} 4275 4276 4277/*------------------------------------------------------------*/ 4278/*--- SectKind query functions ---*/ 4279/*------------------------------------------------------------*/ 4280 4281/* Convert a VgSectKind to a string, which must be copied if you want 4282 to change it. */ 4283const HChar* VG_(pp_SectKind)( VgSectKind kind ) 4284{ 4285 switch (kind) { 4286 case Vg_SectUnknown: return "Unknown"; 4287 case Vg_SectText: return "Text"; 4288 case Vg_SectData: return "Data"; 4289 case Vg_SectBSS: return "BSS"; 4290 case Vg_SectGOT: return "GOT"; 4291 case Vg_SectPLT: return "PLT"; 4292 case Vg_SectOPD: return "OPD"; 4293 case Vg_SectGOTPLT: return "GOTPLT"; 4294 default: vg_assert(0); 4295 } 4296} 4297 4298/* Given an address 'a', make a guess of which section of which object 4299 it comes from. If name is non-NULL, then the object's name is put 4300 in *name. The returned name, if any, should be saved away, if there is 4301 a chance that a debug-info will be discarded and the name is being 4302 used later on. */ 4303VgSectKind VG_(DebugInfo_sect_kind)( /*OUT*/const HChar** name, Addr a) 4304{ 4305 DebugInfo* di; 4306 VgSectKind res = Vg_SectUnknown; 4307 4308 for (di = debugInfo_list; di != NULL; di = di->next) { 4309 4310 if (0) 4311 VG_(printf)( 4312 "addr=%#lx di=%p %s got=%#lx,%ld plt=%#lx,%ld " 4313 "data=%#lx,%ld bss=%#lx,%ld\n", 4314 a, di, di->fsm.filename, 4315 di->got_avma, di->got_size, 4316 di->plt_avma, di->plt_size, 4317 di->data_avma, di->data_size, 4318 di->bss_avma, di->bss_size); 4319 4320 if (di->text_present 4321 && di->text_size > 0 4322 && a >= di->text_avma && a < di->text_avma + di->text_size) { 4323 res = Vg_SectText; 4324 break; 4325 } 4326 if (di->data_present 4327 && di->data_size > 0 4328 && a >= di->data_avma && a < di->data_avma + di->data_size) { 4329 res = Vg_SectData; 4330 break; 4331 } 4332 if (di->sdata_present 4333 && di->sdata_size > 0 4334 && a >= di->sdata_avma && a < di->sdata_avma + di->sdata_size) { 4335 res = Vg_SectData; 4336 break; 4337 } 4338 if (di->bss_present 4339 && di->bss_size > 0 4340 && a >= di->bss_avma && a < di->bss_avma + di->bss_size) { 4341 res = Vg_SectBSS; 4342 break; 4343 } 4344 if (di->sbss_present 4345 && di->sbss_size > 0 4346 && a >= di->sbss_avma && a < di->sbss_avma + di->sbss_size) { 4347 res = Vg_SectBSS; 4348 break; 4349 } 4350 if (di->plt_present 4351 && di->plt_size > 0 4352 && a >= di->plt_avma && a < di->plt_avma + di->plt_size) { 4353 res = Vg_SectPLT; 4354 break; 4355 } 4356 if (di->got_present 4357 && di->got_size > 0 4358 && a >= di->got_avma && a < di->got_avma + di->got_size) { 4359 res = Vg_SectGOT; 4360 break; 4361 } 4362 if (di->gotplt_present 4363 && di->gotplt_size > 0 4364 && a >= di->gotplt_avma && a < di->gotplt_avma + di->gotplt_size) { 4365 res = Vg_SectGOTPLT; 4366 break; 4367 } 4368 if (di->opd_present 4369 && di->opd_size > 0 4370 && a >= di->opd_avma && a < di->opd_avma + di->opd_size) { 4371 res = Vg_SectOPD; 4372 break; 4373 } 4374 /* we could also check for .eh_frame, if anyone really cares */ 4375 } 4376 4377 vg_assert( (di == NULL && res == Vg_SectUnknown) 4378 || (di != NULL && res != Vg_SectUnknown) ); 4379 4380 if (name) { 4381 if (di && di->fsm.filename) { 4382 *name = di->fsm.filename; 4383 } else { 4384 *name = "???"; 4385 } 4386 } 4387 4388 return res; 4389 4390} 4391 4392/*--------------------------------------------------------------------*/ 4393/*--- end ---*/ 4394/*--------------------------------------------------------------------*/ 4395