priv_storage.h revision 092b6268cc4a38ae9ee41d1e3355937536ddc579
1eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 2eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/*--------------------------------------------------------------------*/ 3eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/*--- Format-neutral storage of and querying of info acquired from ---*/ 4eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/*--- ELF/XCOFF stabs/dwarf1/dwarf2 debug info. ---*/ 5eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/*--- priv_storage.h ---*/ 6eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/*--------------------------------------------------------------------*/ 7eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 8eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* 9eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj This file is part of Valgrind, a dynamic binary instrumentation 10eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj framework. 11eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 124d474d086188fd1f29fa97dbd84d8ea2e589a9b8sewardj Copyright (C) 2000-2008 Julian Seward 13eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj jseward@acm.org 14eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 15eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj This program is free software; you can redistribute it and/or 16eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj modify it under the terms of the GNU General Public License as 17eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj published by the Free Software Foundation; either version 2 of the 18eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj License, or (at your option) any later version. 19eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 20eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj This program is distributed in the hope that it will be useful, but 21eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj WITHOUT ANY WARRANTY; without even the implied warranty of 22eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 23eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj General Public License for more details. 24eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 25eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj You should have received a copy of the GNU General Public License 26eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj along with this program; if not, write to the Free Software 27eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 28eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 02111-1307, USA. 29eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 30eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj The GNU General Public License is contained in the file COPYING. 31eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj*/ 32eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* 33eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj Stabs reader greatly improved by Nick Nethercote, Apr 02. 34eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj This module was also extensively hacked on by Jeremy Fitzhardinge 35eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj and Tom Hughes. 36eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj*/ 37c6d3f6f0aec8607dded979fd15a9876a486ec682sewardj/* See comment at top of debuginfo.c for explanation of 38c6d3f6f0aec8607dded979fd15a9876a486ec682sewardj the _svma / _avma / _image / _bias naming scheme. 39c6d3f6f0aec8607dded979fd15a9876a486ec682sewardj*/ 40b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* Note this is not freestanding; needs pub_core_xarray.h and 41b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj priv_tytypes.h to be included before it. */ 42eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 43eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#ifndef __PRIV_STORAGE_H 44eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#define __PRIV_STORAGE_H 45eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 46eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* --------------------- SYMBOLS --------------------- */ 47eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 48eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* A structure to hold an ELF/XCOFF symbol (very crudely). */ 49eadcd86d1b0f59efed44c162ef4378ccfb528290sewardjtypedef 50eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj struct { 51eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj Addr addr; /* lowest address of entity */ 52eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj Addr tocptr; /* ppc64-linux only: value that R2 should have */ 53eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj UChar *name; /* name */ 54b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj UInt size; /* size in bytes */ 55b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool isText; 56eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj } 57eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj DiSym; 58eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 59eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* --------------------- SRCLOCS --------------------- */ 60eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 61eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Line count at which overflow happens, due to line numbers being 62eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj stored as shorts in `struct nlist' in a.out.h. */ 63eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#define LINENO_OVERFLOW (1 << (sizeof(short) * 8)) 64eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 65eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#define LINENO_BITS 20 66eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#define LOC_SIZE_BITS (32 - LINENO_BITS) 67eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#define MAX_LINENO ((1 << LINENO_BITS) - 1) 68eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 69eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Unlikely to have any lines with instruction ranges > 4096 bytes */ 70eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#define MAX_LOC_SIZE ((1 << LOC_SIZE_BITS) - 1) 71eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 72eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Number used to detect line number overflows; if one line is 73b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 60000-odd smaller than the previous, it was probably an overflow. 74eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj */ 75eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#define OVERFLOW_DIFFERENCE (LINENO_OVERFLOW - 5000) 76eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 77eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* A structure to hold addr-to-source info for a single line. There 78eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj can be a lot of these, hence the dense packing. */ 79eadcd86d1b0f59efed44c162ef4378ccfb528290sewardjtypedef 80eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj struct { 81eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj /* Word 1 */ 82eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj Addr addr; /* lowest address for this line */ 83eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj /* Word 2 */ 84eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj UShort size:LOC_SIZE_BITS; /* # bytes; we catch overflows of this */ 85eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj UInt lineno:LINENO_BITS; /* source line number, or zero */ 86eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj /* Word 3 */ 87eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj UChar* filename; /* source filename */ 88eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj /* Word 4 */ 89eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj UChar* dirname; /* source directory name */ 90eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj } 91eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj DiLoc; 92eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 93eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* --------------------- CF INFO --------------------- */ 94eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 95eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* A structure to summarise DWARF2/3 CFA info for the code address 96eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj range [base .. base+len-1]. In short, if you know (sp,fp,ip) at 97eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj some point and ip is in the range [base .. base+len-1], it tells 98eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj you how to calculate (sp,fp) for the caller of the current frame 99eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj and also ra, the return address of the current frame. 100eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 101eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj First off, calculate CFA, the Canonical Frame Address, thusly: 102eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 10372427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj cfa = case cfa_how of 10472427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj CFIC_SPREL -> sp + cfa_off 10572427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj CFIC_FPREL -> fp + cfa_off 10672427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj CFIR_EXPR -> expr whose index is in cfa_off 107eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 108eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj Once that is done, the previous frame's sp/fp values and this 109eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj frame's ra value can be calculated like this: 110eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 111eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj old_sp/fp/ra 112eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj = case sp/fp/ra_how of 113eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj CFIR_UNKNOWN -> we don't know, sorry 114eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj CFIR_SAME -> same as it was before (sp/fp only) 115eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj CFIR_CFAREL -> cfa + sp/fp/ra_off 116eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj CFIR_MEMCFAREL -> *( cfa + sp/fp/ra_off ) 11772427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj CFIR_EXPR -> expr whose index is in sp/fp/ra_off 118eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj*/ 119eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 12072427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj#define CFIC_SPREL ((UChar)1) 12172427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj#define CFIC_FPREL ((UChar)2) 12272427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj#define CFIC_EXPR ((UChar)3) 12372427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj 12472427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj#define CFIR_UNKNOWN ((UChar)4) 12572427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj#define CFIR_SAME ((UChar)5) 12672427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj#define CFIR_CFAREL ((UChar)6) 12772427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj#define CFIR_MEMCFAREL ((UChar)7) 12872427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj#define CFIR_EXPR ((UChar)8) 129eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 130eadcd86d1b0f59efed44c162ef4378ccfb528290sewardjtypedef 131eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj struct { 132eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj Addr base; 133eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj UInt len; 13472427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj UChar cfa_how; /* a CFIC_ value */ 13572427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj UChar ra_how; /* a CFIR_ value */ 13672427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj UChar sp_how; /* a CFIR_ value */ 13772427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj UChar fp_how; /* a CFIR_ value */ 138eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj Int cfa_off; 139eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj Int ra_off; 140eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj Int sp_off; 141eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj Int fp_off; 142eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj } 143eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj DiCfSI; 144eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 14572427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj 14672427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjtypedef 14772427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj enum { 14872427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj Cop_Add=0x321, 14972427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj Cop_Sub, 1507888e2204fff6e7429236b4227ed16594e7743b9sewardj Cop_And, 1517888e2204fff6e7429236b4227ed16594e7743b9sewardj Cop_Mul 15272427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj } 15372427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj CfiOp; 15472427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj 15572427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjtypedef 15672427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj enum { 15772427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj Creg_SP=0x213, 15872427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj Creg_FP, 15972427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj Creg_IP 16072427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj } 16172427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj CfiReg; 16272427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj 16372427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjtypedef 16472427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj enum { 16572427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj Cex_Undef=0x123, 16672427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj Cex_Deref, 16772427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj Cex_Const, 16872427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj Cex_Binop, 16972427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj Cex_CfiReg, 17072427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj Cex_DwReg 17172427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj } 17272427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj CfiExprTag; 17372427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj 17472427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjtypedef 17572427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj struct { 17672427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj CfiExprTag tag; 17772427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj union { 17872427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj struct { 17972427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj } Undef; 18072427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj struct { 18172427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj Int ixAddr; 18272427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj } Deref; 18372427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj struct { 18472427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj UWord con; 18572427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj } Const; 18672427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj struct { 18772427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj CfiOp op; 18872427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj Int ixL; 18972427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj Int ixR; 19072427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj } Binop; 19172427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj struct { 19272427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj CfiReg reg; 19372427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj } CfiReg; 19472427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj struct { 19572427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj Int reg; 19672427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj } DwReg; 19772427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj } 19872427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj Cex; 19972427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj } 20072427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj CfiExpr; 20172427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj 20272427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjextern Int ML_(CfiExpr_Undef) ( XArray* dst ); 20372427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjextern Int ML_(CfiExpr_Deref) ( XArray* dst, Int ixAddr ); 20472427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjextern Int ML_(CfiExpr_Const) ( XArray* dst, UWord con ); 20572427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjextern Int ML_(CfiExpr_Binop) ( XArray* dst, CfiOp op, Int ixL, Int ixR ); 20672427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjextern Int ML_(CfiExpr_CfiReg)( XArray* dst, CfiReg reg ); 20772427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjextern Int ML_(CfiExpr_DwReg) ( XArray* dst, Int reg ); 20872427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj 20972427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjextern void ML_(ppCfiExpr)( XArray* src, Int ix ); 21072427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj 211b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* --------------------- VARIABLES --------------------- */ 212b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 213b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjtypedef 214b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj struct { 215b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr aMin; 216b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr aMax; 217b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj XArray* /* of DiVariable */ vars; 218b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj } 219b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj DiAddrRange; 220b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 221b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjtypedef 222b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj struct { 223b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj UChar* name; /* in DebugInfo.strchunks */ 224b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Type* type; /* on DebugInfo.admin list */ 225b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj GExpr* gexpr; /* on DebugInfo.gexprs list */ 226b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj GExpr* fbGX; /* SHARED. */ 227b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj UChar* fileName; /* where declared; may be NULL. in 228b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj DebugInfo.strchunks */ 229b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Int lineNo; /* where declared; may be zero. */ 230b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj } 231b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj DiVariable; 232b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 233b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjWord 234b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjML_(cmp_for_DiAddrRange_range) ( const void* keyV, const void* elemV ); 235b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 236b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* --------------------- DEBUGINFO --------------------- */ 237eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 238eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* This is the top-level data type. It's a structure which contains 239b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj information pertaining to one mapped ELF object. This type is 240eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj exported only abstractly - in pub_tool_debuginfo.h. */ 241eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 242eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#define SEGINFO_STRCHUNKSIZE (64*1024) 243eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 244b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjstruct _DebugInfo { 245b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 246b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* Admin stuff */ 247b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 248b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj struct _DebugInfo* next; /* list of DebugInfos */ 249b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool mark; /* marked for deletion? */ 250b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 251b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* Used for debugging only - indicate what stuff to dump whilst 252b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj reading stuff into the seginfo. Are computed as early in the 253b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj lifetime of the DebugInfo as possible -- at the point when it is 254b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj created. Use these when deciding what to spew out; do not use 255b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj the global VG_(clo_blah) flags. */ 256b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 257b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool trace_symtab; /* symbols, our style */ 258b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool trace_cfi; /* dwarf frame unwind, our style */ 259b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool ddump_syms; /* mimic /usr/bin/readelf --syms */ 260b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool ddump_line; /* mimic /usr/bin/readelf --debug-dump=line */ 261b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool ddump_frames; /* mimic /usr/bin/readelf --debug-dump=frames */ 262b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 263b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* Fields that must be filled in before we can start reading 264b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj anything from the ELF file. These fields are filled in by 265b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj VG_(di_notify_mmap) and its immediate helpers. */ 266eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 267b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj UChar* filename; /* in mallocville (VG_AR_DINFO) */ 268b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj UChar* memname; /* also in VG_AR_DINFO. AIX5 only: .a member name */ 269b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 270b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool have_rx_map; /* did we see a r?x mapping yet for the file? */ 271b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool have_rw_map; /* did we see a rw? mapping yet for the file? */ 272b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 273b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr rx_map_avma; /* these fields record the file offset, length */ 274b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj SizeT rx_map_size; /* and map address of the r?x mapping we believe */ 275b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj OffT rx_map_foff; /* is the .text segment mapping */ 276b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 277b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr rw_map_avma; /* ditto, for the rw? mapping we believe is the */ 278b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj SizeT rw_map_size; /* .data segment mapping */ 279b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj OffT rw_map_foff; 280b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 281b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* Once both a rw? and r?x mapping for .filename have been 282b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj observed, we can go on to read the symbol tables and debug info. 283b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj .have_dinfo flags when that has happened. */ 284b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* If have_dinfo is False, then all fields except "*rx_map*" and 285b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj "*rw_map*" are invalid and should not be consulted. */ 286b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool have_dinfo; /* initially False */ 287b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 288b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* All the rest of the fields in this structure are filled in once 289b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj we have committed to reading the symbols and debug info (that 290b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj is, at the point where .have_dinfo is set to True). */ 291b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 292b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* The file's soname. FIXME: ensure this is always allocated in 293b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj VG_AR_DINFO. */ 294eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj UChar* soname; 295eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 296b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* Description of some important mapped segments. The presence or 297b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj absence of the mapping is denoted by the _present field, since 298b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj in some obscure circumstances (to do with data/sdata/bss) it is 299b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj possible for the mapping to be present but have zero size. 300b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Certainly text_ is mandatory on all platforms; not sure about 301b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj the rest though. */ 302b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* .text */ 303b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool text_present; 304b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr text_avma; 305b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr text_svma; 306b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj SizeT text_size; 307b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj OffT text_bias; 308b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* .data */ 309b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool data_present; 310b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr data_svma; 311b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr data_avma; 312b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj SizeT data_size; 313b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj OffT data_bias; 314b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* .sdata */ 315b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool sdata_present; 316b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr sdata_svma; 317b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr sdata_avma; 318b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj SizeT sdata_size; 319b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj OffT sdata_bias; 320b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* .bss */ 321b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool bss_present; 322b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr bss_svma; 323b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr bss_avma; 324b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj SizeT bss_size; 325b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj OffT bss_bias; 326b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* .plt */ 327b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool plt_present; 328b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr plt_avma; 329b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj SizeT plt_size; 330b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* .got */ 331b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool got_present; 332b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr got_avma; 333b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj SizeT got_size; 334092b6268cc4a38ae9ee41d1e3355937536ddc579bart /* .got.plt */ 335092b6268cc4a38ae9ee41d1e3355937536ddc579bart Bool gotplt_present; 336092b6268cc4a38ae9ee41d1e3355937536ddc579bart Addr gotplt_avma; 337092b6268cc4a38ae9ee41d1e3355937536ddc579bart SizeT gotplt_size; 338b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* .opd -- needed on ppc64-linux for finding symbols */ 339b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool opd_present; 340b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr opd_avma; 341b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj SizeT opd_size; 342b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* .ehframe -- needed on amd64-linux for stack unwinding */ 343b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool ehframe_present; 344b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr ehframe_avma; 345b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj SizeT ehframe_size; 346b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 347b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* Sorted tables of stuff we snarfed from the file. This is the 348b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj eventual product of reading the debug info. All this stuff 349b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj lives in VG_AR_DINFO. */ 350b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 351eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj /* An expandable array of symbols. */ 352eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj DiSym* symtab; 353b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj UWord symtab_used; 354b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj UWord symtab_size; 355eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj /* An expandable array of locations. */ 356eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj DiLoc* loctab; 357b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj UWord loctab_used; 358b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj UWord loctab_size; 359eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj /* An expandable array of CFI summary info records. Also includes 360eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj summary address bounds, showing the min and max address covered 36172427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj by any of the records, as an aid to fast searching. And, if the 36272427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj records require any expression nodes, they are stored in 36372427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj cfsi_exprs. */ 364eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj DiCfSI* cfsi; 365eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj UInt cfsi_used; 366eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj UInt cfsi_size; 367b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr cfsi_minavma; 368b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr cfsi_maxavma; 369b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj XArray* cfsi_exprs; /* XArray of CfiExpr */ 370eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 371eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj /* Expandable arrays of characters -- the string table. Pointers 372eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj into this are stable (the arrays are not reallocated). */ 373eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj struct strchunk { 374eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj UInt strtab_used; 375b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj struct strchunk* next; 376eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj UChar strtab[SEGINFO_STRCHUNKSIZE]; 377eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj } *strchunks; 378eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 379b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* Variable scope information, as harvested from Dwarf3 files. 380eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 381b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj In short it's an 382f767d967b9ef331dcd7d0cd4584f6570cd829333sewardj 383b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj array of (array of PC address ranges and variables) 384b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 385b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj The outer array indexes over scopes, with Entry 0 containing 386b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj information on variables which exist for any value of the program 387b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj counter (PC) -- that is, the outermost scope. Entries 1, 2, 3, 388b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj etc contain information on increasinly deeply nested variables. 389b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 390b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Each inner array is an array of (an address range, and a set 391b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj of variables that are in scope over that address range). 392b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 393b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj The address ranges may not overlap. 394b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 395b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Since Entry 0 in the outer array holds information on variables 396b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj that exist for any value of the PC (that is, global vars), it 397b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj follows that Entry 0's inner array can only have one address 398b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj range pair, one that covers the entire address space. 399b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj */ 400b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj XArray* /* of OSet of DiAddrRange */varinfo; 401b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 402b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* These are lists of the relevant typed objects, held here 403b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj expressly for the purposes of visiting each object exactly once 404b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj when we need to delete them. */ 405b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 406b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* A list of TyAdmin structs, and the payloads that they refer 407b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj to. */ 408b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj TyAdmin* admin_tyadmins; 409b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 410b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* A list of guarded DWARF3 expressions. */ 411b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj GExpr* admin_gexprs; 412eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj}; 413eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 414eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* --------------------- functions --------------------- */ 415eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 416eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* ------ Adding ------ */ 417eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 418eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Add a symbol to si's symbol table. */ 419b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern void ML_(addSym) ( struct _DebugInfo* di, DiSym* sym ); 420eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 421b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* Add a line-number record to a DebugInfo. */ 422eadcd86d1b0f59efed44c162ef4378ccfb528290sewardjextern 423b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjvoid ML_(addLineInfo) ( struct _DebugInfo* di, 424eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj UChar* filename, 425eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj UChar* dirname, /* NULL is allowable */ 426eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj Addr this, Addr next, Int lineno, Int entry); 427eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 428eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Add a CFI summary record. The supplied DiCfSI is copied. */ 429b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern void ML_(addDiCfSI) ( struct _DebugInfo* di, DiCfSI* cfsi ); 430eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 431b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* Add a string to the string table of a DebugInfo. If len==-1, 432eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj ML_(addStr) will itself measure the length of the string. */ 433b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern UChar* ML_(addStr) ( struct _DebugInfo* di, UChar* str, Int len ); 434b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 435b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern void ML_(addVar)( struct _DebugInfo* di, 436b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Int level, 437b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr aMin, 438b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr aMax, 439b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj UChar* name, 440b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Type* type, 441b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj GExpr* gexpr, 442b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj GExpr* fbGX, /* SHARED. */ 443b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj UChar* fileName, /* where decl'd - may be NULL */ 444b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Int lineNo, /* where decl'd - may be zero */ 445b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool show ); 446b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 447b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* Canonicalise the tables held by 'di', in preparation for use. Call 448eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj this after finishing adding entries to these tables. */ 449b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern void ML_(canonicaliseTables) ( struct _DebugInfo* di ); 450eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 451eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* ------ Searching ------ */ 452eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 453eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Find a symbol-table index containing the specified pointer, or -1 454eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj if not found. Binary search. */ 455b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern Int ML_(search_one_symtab) ( struct _DebugInfo* di, Addr ptr, 456b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool match_anywhere_in_sym, 457b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool findText ); 458eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 459eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Find a location-table index containing the specified pointer, or -1 460eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj if not found. Binary search. */ 461b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern Int ML_(search_one_loctab) ( struct _DebugInfo* di, Addr ptr ); 462eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 463eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Find a CFI-table index containing the specified pointer, or -1 if 464eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj not found. Binary search. */ 465b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern Int ML_(search_one_cfitab) ( struct _DebugInfo* di, Addr ptr ); 466eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 467eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* ------ Misc ------ */ 468eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 469eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Show a non-fatal debug info reading error. Use vg_panic if 470b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj terminal. 'serious' errors are always shown, not 'serious' ones 471b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj are shown only at verbosity level 2 and above. */ 472b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern 473b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjvoid ML_(symerr) ( struct _DebugInfo* di, Bool serious, HChar* msg ); 474eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 475eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Print a symbol. */ 476eadcd86d1b0f59efed44c162ef4378ccfb528290sewardjextern void ML_(ppSym) ( Int idx, DiSym* sym ); 477eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 478eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Print a call-frame-info summary. */ 47972427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjextern void ML_(ppDiCfSI) ( XArray* /* of CfiExpr */ exprs, DiCfSI* si ); 480eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 481eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 482eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#define TRACE_SYMTAB(format, args...) \ 483b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj if (di->trace_symtab) { VG_(printf)(format, ## args); } 484eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 485eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 486eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#endif /* ndef __PRIV_STORAGE_H */ 487eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 488eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/*--------------------------------------------------------------------*/ 489eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/*--- end ---*/ 490eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/*--------------------------------------------------------------------*/ 491