priv_storage.h revision 160d5a82d2d5d7d0964140dea17751c1daa3315e
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 */ 2249c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj UWord typeR; /* a cuOff */ 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 2519c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj /* An abstract handle, which can be used by entities outside of 2529c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj m_debuginfo to (in an abstract datatype sense) refer to this 2539c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj struct _DebugInfo. A .handle of zero is invalid; valid handles 2549c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj are 1 and above. The same handle is never issued twice (in any 2559c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj given run of Valgrind), so a handle becomes invalid when the 2569c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj associated struct _DebugInfo is discarded, and remains invalid 2579c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj forever thereafter. The .handle field is set as soon as this 2589c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj structure is allocated. */ 2599c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj ULong handle; 2609c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj 261b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* Used for debugging only - indicate what stuff to dump whilst 262b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj reading stuff into the seginfo. Are computed as early in the 263b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj lifetime of the DebugInfo as possible -- at the point when it is 264b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj created. Use these when deciding what to spew out; do not use 265b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj the global VG_(clo_blah) flags. */ 266b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 267b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool trace_symtab; /* symbols, our style */ 268b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool trace_cfi; /* dwarf frame unwind, our style */ 269b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool ddump_syms; /* mimic /usr/bin/readelf --syms */ 270b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool ddump_line; /* mimic /usr/bin/readelf --debug-dump=line */ 271b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool ddump_frames; /* mimic /usr/bin/readelf --debug-dump=frames */ 272b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 273b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* Fields that must be filled in before we can start reading 274b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj anything from the ELF file. These fields are filled in by 275b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj VG_(di_notify_mmap) and its immediate helpers. */ 276eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 277b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj UChar* filename; /* in mallocville (VG_AR_DINFO) */ 278b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj UChar* memname; /* also in VG_AR_DINFO. AIX5 only: .a member name */ 279b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 280b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool have_rx_map; /* did we see a r?x mapping yet for the file? */ 281b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool have_rw_map; /* did we see a rw? mapping yet for the file? */ 282b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 283b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr rx_map_avma; /* these fields record the file offset, length */ 284b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj SizeT rx_map_size; /* and map address of the r?x mapping we believe */ 285b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj OffT rx_map_foff; /* is the .text segment mapping */ 286b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 287b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr rw_map_avma; /* ditto, for the rw? mapping we believe is the */ 288b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj SizeT rw_map_size; /* .data segment mapping */ 289b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj OffT rw_map_foff; 290b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 291b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* Once both a rw? and r?x mapping for .filename have been 292b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj observed, we can go on to read the symbol tables and debug info. 293b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj .have_dinfo flags when that has happened. */ 294b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* If have_dinfo is False, then all fields except "*rx_map*" and 295b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj "*rw_map*" are invalid and should not be consulted. */ 296b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool have_dinfo; /* initially False */ 297b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 298b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* All the rest of the fields in this structure are filled in once 299b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj we have committed to reading the symbols and debug info (that 300b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj is, at the point where .have_dinfo is set to True). */ 301b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 302b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* The file's soname. FIXME: ensure this is always allocated in 303b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj VG_AR_DINFO. */ 304eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj UChar* soname; 305eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 306b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* Description of some important mapped segments. The presence or 307b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj absence of the mapping is denoted by the _present field, since 308b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj in some obscure circumstances (to do with data/sdata/bss) it is 309b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj possible for the mapping to be present but have zero size. 310b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Certainly text_ is mandatory on all platforms; not sure about 311f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj the rest though. 312f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj 313f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj Comment_on_IMPORTANT_CFSI_REPRESENTATIONAL_INVARIANTS: we require that 314f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj 315f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj either (rx_map_size == 0 && cfsi == NULL) (the degenerate case) 316f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj 317f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj or the normal case, which is the AND of the following: 318f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj (0) rx_map_size > 0 319f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj (1) no two DebugInfos with rx_map_size > 0 320f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj have overlapping [rx_map_avma,+rx_map_size) 321f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj (2) [cfsi_minavma,cfsi_maxavma] does not extend 322f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj beyond [rx_map_avma,+rx_map_size); that is, the former is a 323f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj subrange or equal to the latter. 324f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj (3) all DiCfSI in the cfsi array all have ranges that fall within 325f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj [rx_map_avma,+rx_map_size). 326f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj (4) all DiCfSI in the cfsi array are non-overlapping 327f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj 328f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj The cumulative effect of these restrictions is to ensure that 329f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj all the DiCfSI records in the entire system are non overlapping. 330f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj Hence any address falls into either exactly one DiCfSI record, 331f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj or none. Hence it is safe to cache the results of searches for 332f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj DiCfSI records. This is the whole point of these restrictions. 333f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj The caching of DiCfSI searches is done in VG_(use_CF_info). The 334f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj cache is flushed after any change to debugInfo_list. DiCfSI 335f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj searches are cached because they are central to stack unwinding 336f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj on amd64-linux. 337f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj 338f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj Where are these invariants imposed and checked? 339f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj 340f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj They are checked after a successful read of debuginfo into 341f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj a DebugInfo*, in check_CFSI_related_invariants. 342f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj 343f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj (1) is not really imposed anywhere. We simply assume that the 344f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj kernel will not map the text segments from two different objects 345f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj into the same space. Sounds reasonable. 346f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj 347f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj (2) follows from (4) and (3). It is ensured by canonicaliseCFI. 348f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj (3) is ensured by ML_(addDiCfSI). 349f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj (4) is ensured by canonicaliseCFI. 350f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj */ 351b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* .text */ 352c4431bfe04c7490ea2d74939d222d87f13f30960njn Bool text_present; 353c4431bfe04c7490ea2d74939d222d87f13f30960njn Addr text_avma; 354c4431bfe04c7490ea2d74939d222d87f13f30960njn Addr text_svma; 355c4431bfe04c7490ea2d74939d222d87f13f30960njn SizeT text_size; 356c4431bfe04c7490ea2d74939d222d87f13f30960njn PtrdiffT text_bias; 357b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* .data */ 358c4431bfe04c7490ea2d74939d222d87f13f30960njn Bool data_present; 359c4431bfe04c7490ea2d74939d222d87f13f30960njn Addr data_svma; 360c4431bfe04c7490ea2d74939d222d87f13f30960njn Addr data_avma; 361c4431bfe04c7490ea2d74939d222d87f13f30960njn SizeT data_size; 362c4431bfe04c7490ea2d74939d222d87f13f30960njn PtrdiffT data_bias; 363b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* .sdata */ 364c4431bfe04c7490ea2d74939d222d87f13f30960njn Bool sdata_present; 365c4431bfe04c7490ea2d74939d222d87f13f30960njn Addr sdata_svma; 366c4431bfe04c7490ea2d74939d222d87f13f30960njn Addr sdata_avma; 367c4431bfe04c7490ea2d74939d222d87f13f30960njn SizeT sdata_size; 368c4431bfe04c7490ea2d74939d222d87f13f30960njn PtrdiffT sdata_bias; 369160d5a82d2d5d7d0964140dea17751c1daa3315etom /* .rodata */ 370160d5a82d2d5d7d0964140dea17751c1daa3315etom Bool rodata_present; 371160d5a82d2d5d7d0964140dea17751c1daa3315etom Addr rodata_svma; 372160d5a82d2d5d7d0964140dea17751c1daa3315etom Addr rodata_avma; 373160d5a82d2d5d7d0964140dea17751c1daa3315etom SizeT rodata_size; 374160d5a82d2d5d7d0964140dea17751c1daa3315etom PtrdiffT rodata_bias; 375b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* .bss */ 376c4431bfe04c7490ea2d74939d222d87f13f30960njn Bool bss_present; 377c4431bfe04c7490ea2d74939d222d87f13f30960njn Addr bss_svma; 378c4431bfe04c7490ea2d74939d222d87f13f30960njn Addr bss_avma; 379c4431bfe04c7490ea2d74939d222d87f13f30960njn SizeT bss_size; 380c4431bfe04c7490ea2d74939d222d87f13f30960njn PtrdiffT bss_bias; 381160d5a82d2d5d7d0964140dea17751c1daa3315etom /* .sbss */ 382160d5a82d2d5d7d0964140dea17751c1daa3315etom Bool sbss_present; 383160d5a82d2d5d7d0964140dea17751c1daa3315etom Addr sbss_svma; 384160d5a82d2d5d7d0964140dea17751c1daa3315etom Addr sbss_avma; 385160d5a82d2d5d7d0964140dea17751c1daa3315etom SizeT sbss_size; 386160d5a82d2d5d7d0964140dea17751c1daa3315etom PtrdiffT sbss_bias; 387b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* .plt */ 388b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool plt_present; 389b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr plt_avma; 390b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj SizeT plt_size; 391b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* .got */ 392b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool got_present; 393b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr got_avma; 394b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj SizeT got_size; 395092b6268cc4a38ae9ee41d1e3355937536ddc579bart /* .got.plt */ 396092b6268cc4a38ae9ee41d1e3355937536ddc579bart Bool gotplt_present; 397092b6268cc4a38ae9ee41d1e3355937536ddc579bart Addr gotplt_avma; 398092b6268cc4a38ae9ee41d1e3355937536ddc579bart SizeT gotplt_size; 399b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* .opd -- needed on ppc64-linux for finding symbols */ 400b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool opd_present; 401b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr opd_avma; 402b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj SizeT opd_size; 403b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* .ehframe -- needed on amd64-linux for stack unwinding */ 404b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool ehframe_present; 405b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr ehframe_avma; 406b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj SizeT ehframe_size; 407b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 408b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* Sorted tables of stuff we snarfed from the file. This is the 409b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj eventual product of reading the debug info. All this stuff 410b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj lives in VG_AR_DINFO. */ 411b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 412eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj /* An expandable array of symbols. */ 413eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj DiSym* symtab; 414b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj UWord symtab_used; 415b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj UWord symtab_size; 416eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj /* An expandable array of locations. */ 417eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj DiLoc* loctab; 418b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj UWord loctab_used; 419b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj UWord loctab_size; 420eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj /* An expandable array of CFI summary info records. Also includes 421eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj summary address bounds, showing the min and max address covered 42272427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj by any of the records, as an aid to fast searching. And, if the 42372427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj records require any expression nodes, they are stored in 42472427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj cfsi_exprs. */ 425eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj DiCfSI* cfsi; 426f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj UWord cfsi_used; 427f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj UWord cfsi_size; 428b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr cfsi_minavma; 429b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr cfsi_maxavma; 430b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj XArray* cfsi_exprs; /* XArray of CfiExpr */ 431eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 432eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj /* Expandable arrays of characters -- the string table. Pointers 433eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj into this are stable (the arrays are not reallocated). */ 434eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj struct strchunk { 435eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj UInt strtab_used; 436b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj struct strchunk* next; 437eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj UChar strtab[SEGINFO_STRCHUNKSIZE]; 438eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj } *strchunks; 439eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 440b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* Variable scope information, as harvested from Dwarf3 files. 441eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 442b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj In short it's an 443f767d967b9ef331dcd7d0cd4584f6570cd829333sewardj 444b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj array of (array of PC address ranges and variables) 445b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 446b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj The outer array indexes over scopes, with Entry 0 containing 447b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj information on variables which exist for any value of the program 448b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj counter (PC) -- that is, the outermost scope. Entries 1, 2, 3, 449b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj etc contain information on increasinly deeply nested variables. 450b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 451b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Each inner array is an array of (an address range, and a set 452b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj of variables that are in scope over that address range). 453b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 454b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj The address ranges may not overlap. 455b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 456b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Since Entry 0 in the outer array holds information on variables 457b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj that exist for any value of the PC (that is, global vars), it 458b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj follows that Entry 0's inner array can only have one address 459b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj range pair, one that covers the entire address space. 460b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj */ 461b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj XArray* /* of OSet of DiAddrRange */varinfo; 462b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 4639c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj /* These are arrays of the relevant typed objects, held here 4649c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj partially for the purposes of visiting each object exactly once 465b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj when we need to delete them. */ 466b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 4679c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj /* An array of TyEnts. These are needed to make sense of any types 4689c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj in the .varinfo. Also, when deleting this DebugInfo, we must 4699c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj first traverse this array and throw away malloc'd stuff hanging 4709c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj off it -- by calling ML_(TyEnt__make_EMPTY) on each entry. */ 4719c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj XArray* /* of TyEnt */ admin_tyents; 472b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 4739c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj /* An array of guarded DWARF3 expressions. */ 4749c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj XArray* admin_gexprs; 475eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj}; 476eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 477eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* --------------------- functions --------------------- */ 478eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 479eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* ------ Adding ------ */ 480eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 481eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Add a symbol to si's symbol table. */ 482b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern void ML_(addSym) ( struct _DebugInfo* di, DiSym* sym ); 483eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 484b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* Add a line-number record to a DebugInfo. */ 485eadcd86d1b0f59efed44c162ef4378ccfb528290sewardjextern 486b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjvoid ML_(addLineInfo) ( struct _DebugInfo* di, 487eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj UChar* filename, 488eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj UChar* dirname, /* NULL is allowable */ 489eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj Addr this, Addr next, Int lineno, Int entry); 490eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 491eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Add a CFI summary record. The supplied DiCfSI is copied. */ 492b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern void ML_(addDiCfSI) ( struct _DebugInfo* di, DiCfSI* cfsi ); 493eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 494b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* Add a string to the string table of a DebugInfo. If len==-1, 495eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj ML_(addStr) will itself measure the length of the string. */ 496b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern UChar* ML_(addStr) ( struct _DebugInfo* di, UChar* str, Int len ); 497b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 498b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern void ML_(addVar)( struct _DebugInfo* di, 499b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Int level, 500b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr aMin, 501b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr aMax, 502b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj UChar* name, 5039c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj UWord typeR, /* a cuOff */ 504b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj GExpr* gexpr, 505b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj GExpr* fbGX, /* SHARED. */ 506b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj UChar* fileName, /* where decl'd - may be NULL */ 507b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Int lineNo, /* where decl'd - may be zero */ 508b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool show ); 509b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 510b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* Canonicalise the tables held by 'di', in preparation for use. Call 511eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj this after finishing adding entries to these tables. */ 512b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern void ML_(canonicaliseTables) ( struct _DebugInfo* di ); 513eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 514eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* ------ Searching ------ */ 515eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 516eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Find a symbol-table index containing the specified pointer, or -1 517eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj if not found. Binary search. */ 518f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardjextern Word ML_(search_one_symtab) ( struct _DebugInfo* di, Addr ptr, 519f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj Bool match_anywhere_in_sym, 520f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj Bool findText ); 521eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 522eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Find a location-table index containing the specified pointer, or -1 523eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj if not found. Binary search. */ 524f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardjextern Word ML_(search_one_loctab) ( struct _DebugInfo* di, Addr ptr ); 525eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 526eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Find a CFI-table index containing the specified pointer, or -1 if 527eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj not found. Binary search. */ 528f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardjextern Word ML_(search_one_cfitab) ( struct _DebugInfo* di, Addr ptr ); 529eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 530eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* ------ Misc ------ */ 531eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 532eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Show a non-fatal debug info reading error. Use vg_panic if 533b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj terminal. 'serious' errors are always shown, not 'serious' ones 534b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj are shown only at verbosity level 2 and above. */ 535b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern 536b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjvoid ML_(symerr) ( struct _DebugInfo* di, Bool serious, HChar* msg ); 537eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 538eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Print a symbol. */ 539eadcd86d1b0f59efed44c162ef4378ccfb528290sewardjextern void ML_(ppSym) ( Int idx, DiSym* sym ); 540eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 541eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Print a call-frame-info summary. */ 54272427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjextern void ML_(ppDiCfSI) ( XArray* /* of CfiExpr */ exprs, DiCfSI* si ); 543eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 544eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 545eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#define TRACE_SYMTAB(format, args...) \ 546b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj if (di->trace_symtab) { VG_(printf)(format, ## args); } 547eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 548eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 549eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#endif /* ndef __PRIV_STORAGE_H */ 550eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 551eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/*--------------------------------------------------------------------*/ 552eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/*--- end ---*/ 553eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/*--------------------------------------------------------------------*/ 554