priv_storage.h revision 731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3
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 129eecbbb9a9cbbd30b903c09a9e04d8efc20bda33sewardj Copyright (C) 2000-2010 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 48a5cace0c2a3e212931badbf6398a0cd98393121asewardj/* A structure to hold an ELF/MachO symbol (very crudely). Usually 49a5cace0c2a3e212931badbf6398a0cd98393121asewardj the symbol only has one name, which is stored in ::pri_name, and 50a5cace0c2a3e212931badbf6398a0cd98393121asewardj ::sec_names is NULL. If there are other names, these are stored in 51a5cace0c2a3e212931badbf6398a0cd98393121asewardj ::sec_names, which is a NULL terminated vector holding the names. 52a5cace0c2a3e212931badbf6398a0cd98393121asewardj The vector is allocated in VG_AR_DINFO, the names themselves live 53a5cace0c2a3e212931badbf6398a0cd98393121asewardj in DebugInfo::strchunks. 54a5cace0c2a3e212931badbf6398a0cd98393121asewardj 55a5cace0c2a3e212931badbf6398a0cd98393121asewardj From the point of view of ELF, the primary vs secondary distinction 56a5cace0c2a3e212931badbf6398a0cd98393121asewardj is artificial: they are all just names associated with the address, 57a5cace0c2a3e212931badbf6398a0cd98393121asewardj none of which has higher precedence than any other. However, from 58a5cace0c2a3e212931badbf6398a0cd98393121asewardj the point of view of mapping an address to a name to display to the 59a5cace0c2a3e212931badbf6398a0cd98393121asewardj user, we need to choose one "preferred" name, and so that might as 60a5cace0c2a3e212931badbf6398a0cd98393121asewardj well be installed as the pri_name, whilst all others can live in 61a5cace0c2a3e212931badbf6398a0cd98393121asewardj sec_names[]. This has the convenient side effect that, in the 62a5cace0c2a3e212931badbf6398a0cd98393121asewardj common case where there is only one name for the address, 63a5cace0c2a3e212931badbf6398a0cd98393121asewardj sec_names[] does not need to be allocated. 64a5cace0c2a3e212931badbf6398a0cd98393121asewardj*/ 65eadcd86d1b0f59efed44c162ef4378ccfb528290sewardjtypedef 66eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj struct { 67a5cace0c2a3e212931badbf6398a0cd98393121asewardj Addr addr; /* lowest address of entity */ 68a5cace0c2a3e212931badbf6398a0cd98393121asewardj Addr tocptr; /* ppc64-linux only: value that R2 should have */ 69a5cace0c2a3e212931badbf6398a0cd98393121asewardj UChar* pri_name; /* primary name, never NULL */ 70a5cace0c2a3e212931badbf6398a0cd98393121asewardj UChar** sec_names; /* NULL, or a NULL term'd array of other names */ 71a5cace0c2a3e212931badbf6398a0cd98393121asewardj // XXX: this could be shrunk (on 32-bit platforms) by using 30 72a5cace0c2a3e212931badbf6398a0cd98393121asewardj // bits for the size and 1 bit each for isText and isIFunc. If you 73a5cace0c2a3e212931badbf6398a0cd98393121asewardj // do this, make sure that all assignments to the latter two use 74a5cace0c2a3e212931badbf6398a0cd98393121asewardj // 0 or 1 (or True or False), and that a positive number larger 75a5cace0c2a3e212931badbf6398a0cd98393121asewardj // than 1 is never used to represent True. 76a5cace0c2a3e212931badbf6398a0cd98393121asewardj UInt size; /* size in bytes */ 77a5cace0c2a3e212931badbf6398a0cd98393121asewardj Bool isText; 78a5cace0c2a3e212931badbf6398a0cd98393121asewardj Bool isIFunc; /* symbol is an indirect function? */ 79eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj } 80eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj DiSym; 81eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 82eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* --------------------- SRCLOCS --------------------- */ 83eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 84eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Line count at which overflow happens, due to line numbers being 85eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj stored as shorts in `struct nlist' in a.out.h. */ 86eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#define LINENO_OVERFLOW (1 << (sizeof(short) * 8)) 87eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 88eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#define LINENO_BITS 20 89eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#define LOC_SIZE_BITS (32 - LINENO_BITS) 90eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#define MAX_LINENO ((1 << LINENO_BITS) - 1) 91eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 92eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Unlikely to have any lines with instruction ranges > 4096 bytes */ 93eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#define MAX_LOC_SIZE ((1 << LOC_SIZE_BITS) - 1) 94eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 95eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Number used to detect line number overflows; if one line is 96b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 60000-odd smaller than the previous, it was probably an overflow. 97eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj */ 98eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#define OVERFLOW_DIFFERENCE (LINENO_OVERFLOW - 5000) 99eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 100eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* A structure to hold addr-to-source info for a single line. There 101eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj can be a lot of these, hence the dense packing. */ 102eadcd86d1b0f59efed44c162ef4378ccfb528290sewardjtypedef 103eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj struct { 104eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj /* Word 1 */ 105eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj Addr addr; /* lowest address for this line */ 106eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj /* Word 2 */ 107eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj UShort size:LOC_SIZE_BITS; /* # bytes; we catch overflows of this */ 108eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj UInt lineno:LINENO_BITS; /* source line number, or zero */ 109eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj /* Word 3 */ 110eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj UChar* filename; /* source filename */ 111eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj /* Word 4 */ 112eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj UChar* dirname; /* source directory name */ 113eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj } 114eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj DiLoc; 115eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 116eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* --------------------- CF INFO --------------------- */ 117eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 1183026f71684a930286186aa10fef266c304672e8fsewardj/* DiCfSI: a structure to summarise DWARF2/3 CFA info for the code 1193026f71684a930286186aa10fef266c304672e8fsewardj address range [base .. base+len-1]. 1203026f71684a930286186aa10fef266c304672e8fsewardj 1213026f71684a930286186aa10fef266c304672e8fsewardj On x86 and amd64 ("IA"), if you know ({e,r}sp, {e,r}bp, {e,r}ip) at 1223026f71684a930286186aa10fef266c304672e8fsewardj some point and {e,r}ip is in the range [base .. base+len-1], it 1233026f71684a930286186aa10fef266c304672e8fsewardj tells you how to calculate ({e,r}sp, {e,r}bp) for the caller of the 1243026f71684a930286186aa10fef266c304672e8fsewardj current frame and also ra, the return address of the current frame. 125eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 126eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj First off, calculate CFA, the Canonical Frame Address, thusly: 127eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 12872427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj cfa = case cfa_how of 1293026f71684a930286186aa10fef266c304672e8fsewardj CFIC_IA_SPREL -> {e,r}sp + cfa_off 1303026f71684a930286186aa10fef266c304672e8fsewardj CFIC_IA_BPREL -> {e,r}bp + cfa_off 1313026f71684a930286186aa10fef266c304672e8fsewardj CFIR_IA_EXPR -> expr whose index is in cfa_off 132eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 1333026f71684a930286186aa10fef266c304672e8fsewardj Once that is done, the previous frame's {e,r}sp/{e,r}bp values and 1343026f71684a930286186aa10fef266c304672e8fsewardj this frame's {e,r}ra value can be calculated like this: 135eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 1363026f71684a930286186aa10fef266c304672e8fsewardj old_{e,r}sp/{e,r}bp/ra 1373026f71684a930286186aa10fef266c304672e8fsewardj = case {e,r}sp/{e,r}bp/ra_how of 138eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj CFIR_UNKNOWN -> we don't know, sorry 139eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj CFIR_SAME -> same as it was before (sp/fp only) 1403026f71684a930286186aa10fef266c304672e8fsewardj CFIR_CFAREL -> cfa + sp/bp/ra_off 1413026f71684a930286186aa10fef266c304672e8fsewardj CFIR_MEMCFAREL -> *( cfa + sp/bp/ra_off ) 1423026f71684a930286186aa10fef266c304672e8fsewardj CFIR_EXPR -> expr whose index is in sp/bp/ra_off 143eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 1443026f71684a930286186aa10fef266c304672e8fsewardj On ARM it's pretty much the same, except we have more registers to 1453026f71684a930286186aa10fef266c304672e8fsewardj keep track of: 14672427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj 1473026f71684a930286186aa10fef266c304672e8fsewardj cfa = case cfa_how of 1483026f71684a930286186aa10fef266c304672e8fsewardj CFIC_R13REL -> r13 + cfa_off 1493026f71684a930286186aa10fef266c304672e8fsewardj CFIC_R12REL -> r12 + cfa_off 1503026f71684a930286186aa10fef266c304672e8fsewardj CFIC_R11REL -> r11 + cfa_off 151fa5ce5616a17e79828fbc79f30b02b5085151e3csewardj CFIC_R7REL -> r7 + cfa_off 1523026f71684a930286186aa10fef266c304672e8fsewardj CFIR_EXPR -> expr whose index is in cfa_off 153eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 154fa5ce5616a17e79828fbc79f30b02b5085151e3csewardj old_r14/r13/r12/r11/r7/ra 155fa5ce5616a17e79828fbc79f30b02b5085151e3csewardj = case r14/r13/r12/r11/r7/ra_how of 1563026f71684a930286186aa10fef266c304672e8fsewardj CFIR_UNKNOWN -> we don't know, sorry 157fa5ce5616a17e79828fbc79f30b02b5085151e3csewardj CFIR_SAME -> same as it was before (r14/r13/r12/r11/r7 only) 158fa5ce5616a17e79828fbc79f30b02b5085151e3csewardj CFIR_CFAREL -> cfa + r14/r13/r12/r11/r7/ra_off 159fa5ce5616a17e79828fbc79f30b02b5085151e3csewardj CFIR_MEMCFAREL -> *( cfa + r14/r13/r12/r11/r7/ra_off ) 160fa5ce5616a17e79828fbc79f30b02b5085151e3csewardj CFIR_EXPR -> expr whose index is in r14/r13/r12/r11/r7/ra_off 161b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj 162b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj On s390x we have a similar logic as x86 or amd64. We need the stack pointer 163b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj (r15), the frame pointer r11 (like BP) and together with the instruction 164b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj address in the PSW we can calculate the previous values: 165b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj cfa = case cfa_how of 166b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj CFIC_IA_SPREL -> r15 + cfa_off 167b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj CFIC_IA_BPREL -> r11 + cfa_off 168b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj CFIR_IA_EXPR -> expr whose index is in cfa_off 169b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj 170b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj old_sp/fp/ra 171b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj = case sp/fp/ra_how of 172b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj CFIR_UNKNOWN -> we don't know, sorry 173b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj CFIR_SAME -> same as it was before (sp/fp only) 174b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj CFIR_CFAREL -> cfa + sp/fp/ra_off 175b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj CFIR_MEMCFAREL -> *( cfa + sp/fp/ra_off ) 176b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj CFIR_EXPR -> expr whose index is in sp/fp/ra_off 1773026f71684a930286186aa10fef266c304672e8fsewardj*/ 1783026f71684a930286186aa10fef266c304672e8fsewardj 1793026f71684a930286186aa10fef266c304672e8fsewardj#define CFIC_IA_SPREL ((UChar)1) 1803026f71684a930286186aa10fef266c304672e8fsewardj#define CFIC_IA_BPREL ((UChar)2) 1813026f71684a930286186aa10fef266c304672e8fsewardj#define CFIC_IA_EXPR ((UChar)3) 1823026f71684a930286186aa10fef266c304672e8fsewardj#define CFIC_ARM_R13REL ((UChar)4) 1833026f71684a930286186aa10fef266c304672e8fsewardj#define CFIC_ARM_R12REL ((UChar)5) 1843026f71684a930286186aa10fef266c304672e8fsewardj#define CFIC_ARM_R11REL ((UChar)6) 185fa5ce5616a17e79828fbc79f30b02b5085151e3csewardj#define CFIC_ARM_R7REL ((UChar)7) 186fa5ce5616a17e79828fbc79f30b02b5085151e3csewardj#define CFIC_EXPR ((UChar)8) /* all targets */ 1873026f71684a930286186aa10fef266c304672e8fsewardj 1883026f71684a930286186aa10fef266c304672e8fsewardj#define CFIR_UNKNOWN ((UChar)64) 1893026f71684a930286186aa10fef266c304672e8fsewardj#define CFIR_SAME ((UChar)65) 1903026f71684a930286186aa10fef266c304672e8fsewardj#define CFIR_CFAREL ((UChar)66) 1913026f71684a930286186aa10fef266c304672e8fsewardj#define CFIR_MEMCFAREL ((UChar)67) 1923026f71684a930286186aa10fef266c304672e8fsewardj#define CFIR_EXPR ((UChar)68) 1933026f71684a930286186aa10fef266c304672e8fsewardj 1943026f71684a930286186aa10fef266c304672e8fsewardj#if defined(VGA_x86) || defined(VGA_amd64) 195eadcd86d1b0f59efed44c162ef4378ccfb528290sewardjtypedef 196eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj struct { 197eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj Addr base; 198eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj UInt len; 1993026f71684a930286186aa10fef266c304672e8fsewardj UChar cfa_how; /* a CFIC_IA value */ 20072427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj UChar ra_how; /* a CFIR_ value */ 20172427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj UChar sp_how; /* a CFIR_ value */ 2023026f71684a930286186aa10fef266c304672e8fsewardj UChar bp_how; /* a CFIR_ value */ 203eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj Int cfa_off; 204eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj Int ra_off; 205eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj Int sp_off; 2063026f71684a930286186aa10fef266c304672e8fsewardj Int bp_off; 2073026f71684a930286186aa10fef266c304672e8fsewardj } 2083026f71684a930286186aa10fef266c304672e8fsewardj DiCfSI; 2093026f71684a930286186aa10fef266c304672e8fsewardj#elif defined(VGA_arm) 2103026f71684a930286186aa10fef266c304672e8fsewardjtypedef 2113026f71684a930286186aa10fef266c304672e8fsewardj struct { 2123026f71684a930286186aa10fef266c304672e8fsewardj Addr base; 2133026f71684a930286186aa10fef266c304672e8fsewardj UInt len; 2143026f71684a930286186aa10fef266c304672e8fsewardj UChar cfa_how; /* a CFIC_ value */ 2153026f71684a930286186aa10fef266c304672e8fsewardj UChar ra_how; /* a CFIR_ value */ 2163026f71684a930286186aa10fef266c304672e8fsewardj UChar r14_how; /* a CFIR_ value */ 2173026f71684a930286186aa10fef266c304672e8fsewardj UChar r13_how; /* a CFIR_ value */ 2183026f71684a930286186aa10fef266c304672e8fsewardj UChar r12_how; /* a CFIR_ value */ 2193026f71684a930286186aa10fef266c304672e8fsewardj UChar r11_how; /* a CFIR_ value */ 220fa5ce5616a17e79828fbc79f30b02b5085151e3csewardj UChar r7_how; /* a CFIR_ value */ 2213026f71684a930286186aa10fef266c304672e8fsewardj Int cfa_off; 2223026f71684a930286186aa10fef266c304672e8fsewardj Int ra_off; 2233026f71684a930286186aa10fef266c304672e8fsewardj Int r14_off; 2243026f71684a930286186aa10fef266c304672e8fsewardj Int r13_off; 2253026f71684a930286186aa10fef266c304672e8fsewardj Int r12_off; 2263026f71684a930286186aa10fef266c304672e8fsewardj Int r11_off; 227fa5ce5616a17e79828fbc79f30b02b5085151e3csewardj Int r7_off; 228eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj } 229eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj DiCfSI; 2303026f71684a930286186aa10fef266c304672e8fsewardj#elif defined(VGA_ppc32) || defined(VGA_ppc64) 231f5f1e12bd89408917c1ffeb22ec23a1fd11b7a23sewardj/* Just have a struct with the common fields in, so that code that 232f5f1e12bd89408917c1ffeb22ec23a1fd11b7a23sewardj processes the common fields doesn't have to be ifdef'd against 233f5f1e12bd89408917c1ffeb22ec23a1fd11b7a23sewardj VGP_/VGA_ symbols. These are not used in any way on ppc32/64-linux 234f5f1e12bd89408917c1ffeb22ec23a1fd11b7a23sewardj at the moment. */ 235f5f1e12bd89408917c1ffeb22ec23a1fd11b7a23sewardjtypedef 236f5f1e12bd89408917c1ffeb22ec23a1fd11b7a23sewardj struct { 237f5f1e12bd89408917c1ffeb22ec23a1fd11b7a23sewardj Addr base; 238f5f1e12bd89408917c1ffeb22ec23a1fd11b7a23sewardj UInt len; 239f5f1e12bd89408917c1ffeb22ec23a1fd11b7a23sewardj UChar cfa_how; /* a CFIC_ value */ 240f5f1e12bd89408917c1ffeb22ec23a1fd11b7a23sewardj UChar ra_how; /* a CFIR_ value */ 241f5f1e12bd89408917c1ffeb22ec23a1fd11b7a23sewardj Int cfa_off; 242f5f1e12bd89408917c1ffeb22ec23a1fd11b7a23sewardj Int ra_off; 243f5f1e12bd89408917c1ffeb22ec23a1fd11b7a23sewardj } 244f5f1e12bd89408917c1ffeb22ec23a1fd11b7a23sewardj DiCfSI; 245b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#elif defined(VGA_s390x) 246b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardjtypedef 247b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj struct { 248b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj Addr base; 249b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj UInt len; 250b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj UChar cfa_how; /* a CFIC_ value */ 251b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj UChar sp_how; /* a CFIR_ value */ 252b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj UChar ra_how; /* a CFIR_ value */ 253b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj UChar fp_how; /* a CFIR_ value */ 254b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj Int cfa_off; 255b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj Int sp_off; 256b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj Int ra_off; 257b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj Int fp_off; 258b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj } 259b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj DiCfSI; 2603026f71684a930286186aa10fef266c304672e8fsewardj#else 2613026f71684a930286186aa10fef266c304672e8fsewardj# error "Unknown arch" 2623026f71684a930286186aa10fef266c304672e8fsewardj#endif 263eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 26472427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj 26572427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjtypedef 26672427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj enum { 26772427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj Cop_Add=0x321, 26872427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj Cop_Sub, 2697888e2204fff6e7429236b4227ed16594e7743b9sewardj Cop_And, 2700b98239b3e0abd430dbc913454d63c7e3d8c8b12tom Cop_Mul, 2710b98239b3e0abd430dbc913454d63c7e3d8c8b12tom Cop_Shl, 2720b98239b3e0abd430dbc913454d63c7e3d8c8b12tom Cop_Shr, 2730b98239b3e0abd430dbc913454d63c7e3d8c8b12tom Cop_Eq, 2740b98239b3e0abd430dbc913454d63c7e3d8c8b12tom Cop_Ge, 2750b98239b3e0abd430dbc913454d63c7e3d8c8b12tom Cop_Gt, 2760b98239b3e0abd430dbc913454d63c7e3d8c8b12tom Cop_Le, 2770b98239b3e0abd430dbc913454d63c7e3d8c8b12tom Cop_Lt, 2780b98239b3e0abd430dbc913454d63c7e3d8c8b12tom Cop_Ne 27972427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj } 28072427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj CfiOp; 28172427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj 28272427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjtypedef 28372427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj enum { 2843026f71684a930286186aa10fef266c304672e8fsewardj Creg_IA_SP=0x213, 2853026f71684a930286186aa10fef266c304672e8fsewardj Creg_IA_BP, 2863026f71684a930286186aa10fef266c304672e8fsewardj Creg_IA_IP, 2873026f71684a930286186aa10fef266c304672e8fsewardj Creg_ARM_R13, 2883026f71684a930286186aa10fef266c304672e8fsewardj Creg_ARM_R12, 2893026f71684a930286186aa10fef266c304672e8fsewardj Creg_ARM_R15, 290b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj Creg_ARM_R14, 291b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj Creg_S390_R14 29272427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj } 29372427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj CfiReg; 29472427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj 29572427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjtypedef 29672427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj enum { 29772427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj Cex_Undef=0x123, 29872427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj Cex_Deref, 29972427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj Cex_Const, 30072427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj Cex_Binop, 30172427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj Cex_CfiReg, 30272427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj Cex_DwReg 30372427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj } 30472427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj CfiExprTag; 30572427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj 30672427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjtypedef 30772427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj struct { 30872427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj CfiExprTag tag; 30972427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj union { 31072427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj struct { 31172427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj } Undef; 31272427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj struct { 31372427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj Int ixAddr; 31472427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj } Deref; 31572427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj struct { 31672427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj UWord con; 31772427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj } Const; 31872427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj struct { 31972427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj CfiOp op; 32072427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj Int ixL; 32172427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj Int ixR; 32272427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj } Binop; 32372427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj struct { 32472427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj CfiReg reg; 32572427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj } CfiReg; 32672427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj struct { 32772427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj Int reg; 32872427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj } DwReg; 32972427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj } 33072427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj Cex; 33172427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj } 33272427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj CfiExpr; 33372427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj 33472427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjextern Int ML_(CfiExpr_Undef) ( XArray* dst ); 33572427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjextern Int ML_(CfiExpr_Deref) ( XArray* dst, Int ixAddr ); 33672427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjextern Int ML_(CfiExpr_Const) ( XArray* dst, UWord con ); 33772427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjextern Int ML_(CfiExpr_Binop) ( XArray* dst, CfiOp op, Int ixL, Int ixR ); 33872427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjextern Int ML_(CfiExpr_CfiReg)( XArray* dst, CfiReg reg ); 33972427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjextern Int ML_(CfiExpr_DwReg) ( XArray* dst, Int reg ); 34072427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj 34172427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjextern void ML_(ppCfiExpr)( XArray* src, Int ix ); 34272427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj 343c8259b85b701d25d72aabe9dc0a8154517f96913sewardj/* ---------------- FPO INFO (Windows PE) -------------- */ 344c8259b85b701d25d72aabe9dc0a8154517f96913sewardj 345c8259b85b701d25d72aabe9dc0a8154517f96913sewardj/* for apps using Wine: MSVC++ PDB FramePointerOmitted: somewhat like 346c8259b85b701d25d72aabe9dc0a8154517f96913sewardj a primitive CFI */ 347c8259b85b701d25d72aabe9dc0a8154517f96913sewardjtypedef 348c8259b85b701d25d72aabe9dc0a8154517f96913sewardj struct _FPO_DATA { /* 16 bytes */ 349c8259b85b701d25d72aabe9dc0a8154517f96913sewardj UInt ulOffStart; /* offset of 1st byte of function code */ 350c8259b85b701d25d72aabe9dc0a8154517f96913sewardj UInt cbProcSize; /* # bytes in function */ 351c8259b85b701d25d72aabe9dc0a8154517f96913sewardj UInt cdwLocals; /* # bytes/4 in locals */ 352c8259b85b701d25d72aabe9dc0a8154517f96913sewardj UShort cdwParams; /* # bytes/4 in params */ 353c8259b85b701d25d72aabe9dc0a8154517f96913sewardj UChar cbProlog; /* # bytes in prolog */ 354c8259b85b701d25d72aabe9dc0a8154517f96913sewardj UChar cbRegs :3; /* # regs saved */ 355c8259b85b701d25d72aabe9dc0a8154517f96913sewardj UChar fHasSEH:1; /* Structured Exception Handling */ 356c8259b85b701d25d72aabe9dc0a8154517f96913sewardj UChar fUseBP :1; /* EBP has been used */ 357c8259b85b701d25d72aabe9dc0a8154517f96913sewardj UChar reserved:1; 358c8259b85b701d25d72aabe9dc0a8154517f96913sewardj UChar cbFrame:2; /* frame type */ 359c8259b85b701d25d72aabe9dc0a8154517f96913sewardj } 360c8259b85b701d25d72aabe9dc0a8154517f96913sewardj FPO_DATA; 361c8259b85b701d25d72aabe9dc0a8154517f96913sewardj 362c8259b85b701d25d72aabe9dc0a8154517f96913sewardj#define PDB_FRAME_FPO 0 363c8259b85b701d25d72aabe9dc0a8154517f96913sewardj#define PDB_FRAME_TRAP 1 364c8259b85b701d25d72aabe9dc0a8154517f96913sewardj#define PDB_FRAME_TSS 2 365c8259b85b701d25d72aabe9dc0a8154517f96913sewardj 366b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* --------------------- VARIABLES --------------------- */ 367b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 368b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjtypedef 369b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj struct { 370b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr aMin; 371b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr aMax; 372b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj XArray* /* of DiVariable */ vars; 373b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj } 374b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj DiAddrRange; 375b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 376b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjtypedef 377b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj struct { 378b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj UChar* name; /* in DebugInfo.strchunks */ 3799c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj UWord typeR; /* a cuOff */ 380b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj GExpr* gexpr; /* on DebugInfo.gexprs list */ 381b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj GExpr* fbGX; /* SHARED. */ 382b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj UChar* fileName; /* where declared; may be NULL. in 383b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj DebugInfo.strchunks */ 384b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Int lineNo; /* where declared; may be zero. */ 385b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj } 386b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj DiVariable; 387b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 388b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjWord 389b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjML_(cmp_for_DiAddrRange_range) ( const void* keyV, const void* elemV ); 390b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 391b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* --------------------- DEBUGINFO --------------------- */ 392eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 393eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* This is the top-level data type. It's a structure which contains 394b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj information pertaining to one mapped ELF object. This type is 395eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj exported only abstractly - in pub_tool_debuginfo.h. */ 396eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 397a5acac39bf3be7546222b1316faee5ee524be0d1sewardj/* First though, here's an auxiliary data structure. It is only ever 398a5acac39bf3be7546222b1316faee5ee524be0d1sewardj used as part of a struct _DebugInfo. We use it to record 399a5acac39bf3be7546222b1316faee5ee524be0d1sewardj observations about mappings and permission changes to the 400a5acac39bf3be7546222b1316faee5ee524be0d1sewardj associated file, so as to decide when to read debug info. It's 401a5acac39bf3be7546222b1316faee5ee524be0d1sewardj essentially an ultra-trivial finite state machine which, when it 402a5acac39bf3be7546222b1316faee5ee524be0d1sewardj reaches an accept state, signals that we should now read debug info 403a5acac39bf3be7546222b1316faee5ee524be0d1sewardj from the object into the associated struct _DebugInfo. The accept 404a5acac39bf3be7546222b1316faee5ee524be0d1sewardj state is arrived at when have_rx_map and have_rw_map both become 405731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj true. The initial state is one in which we have no observations, 406731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj so have_rx_map and have_rw_map are both false. 407a5acac39bf3be7546222b1316faee5ee524be0d1sewardj 408a5acac39bf3be7546222b1316faee5ee524be0d1sewardj This is all rather ad-hoc; for example it has no way to record more 409a5acac39bf3be7546222b1316faee5ee524be0d1sewardj than one rw or rx mapping for a given object, not because such 410a5acac39bf3be7546222b1316faee5ee524be0d1sewardj events have never been observed, but because we've never needed to 411a5acac39bf3be7546222b1316faee5ee524be0d1sewardj note more than the first one of any such in order when to decide to 412a5acac39bf3be7546222b1316faee5ee524be0d1sewardj read debug info. It may be that in future we need to track more 413a5acac39bf3be7546222b1316faee5ee524be0d1sewardj state in order to make the decision, so this struct would then get 414a5acac39bf3be7546222b1316faee5ee524be0d1sewardj expanded. 415731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj 416731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj The normal sequence of events is one of 417731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj 418731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj start --> r-x mapping --> rw- mapping --> accept 419731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj start --> rw- mapping --> r-x mapping --> accept 420731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj 421731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj that is, take the first r-x and rw- mapping we see, and we're done. 422731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj 423731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj On MacOSX 10.7, 32-bit, there appears to be a new variant: 424731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj 425731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj start --> r-- mapping --> rw- mapping 426731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj --> upgrade r-- mapping to r-x mapping --> accept 427731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj 428731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj where the upgrade is done by a call to vm_protect. Hence we 429731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj need to also track this possibility. 430a5acac39bf3be7546222b1316faee5ee524be0d1sewardj*/ 431a5acac39bf3be7546222b1316faee5ee524be0d1sewardjstruct _DebugInfoFSM 432a5acac39bf3be7546222b1316faee5ee524be0d1sewardj{ 433731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj /* --- all targets --- */ 434a5acac39bf3be7546222b1316faee5ee524be0d1sewardj UChar* filename; /* in mallocville (VG_AR_DINFO) */ 435a5acac39bf3be7546222b1316faee5ee524be0d1sewardj 436a5acac39bf3be7546222b1316faee5ee524be0d1sewardj Bool have_rx_map; /* did we see a r?x mapping yet for the file? */ 437a5acac39bf3be7546222b1316faee5ee524be0d1sewardj Bool have_rw_map; /* did we see a rw? mapping yet for the file? */ 438a5acac39bf3be7546222b1316faee5ee524be0d1sewardj 439a5acac39bf3be7546222b1316faee5ee524be0d1sewardj Addr rx_map_avma; /* these fields record the file offset, length */ 440a5acac39bf3be7546222b1316faee5ee524be0d1sewardj SizeT rx_map_size; /* and map address of the r?x mapping we believe */ 441a5acac39bf3be7546222b1316faee5ee524be0d1sewardj OffT rx_map_foff; /* is the .text segment mapping */ 442a5acac39bf3be7546222b1316faee5ee524be0d1sewardj 443a5acac39bf3be7546222b1316faee5ee524be0d1sewardj Addr rw_map_avma; /* ditto, for the rw? mapping we believe is the */ 444a5acac39bf3be7546222b1316faee5ee524be0d1sewardj SizeT rw_map_size; /* .data segment mapping */ 445a5acac39bf3be7546222b1316faee5ee524be0d1sewardj OffT rw_map_foff; 446731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj 447731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj /* --- OSX 10.7, 32-bit only --- */ 448731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj Bool have_ro_map; /* did we see a r-- mapping yet for the file? */ 449731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj 450731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj Addr ro_map_avma; /* file offset, length, avma for said mapping */ 451731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj SizeT ro_map_size; 452731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj OffT ro_map_foff; 453a5acac39bf3be7546222b1316faee5ee524be0d1sewardj}; 454a5acac39bf3be7546222b1316faee5ee524be0d1sewardj 455a5acac39bf3be7546222b1316faee5ee524be0d1sewardj 456a5acac39bf3be7546222b1316faee5ee524be0d1sewardj/* To do with the string table in struct _DebugInfo (::strchunks) */ 457eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#define SEGINFO_STRCHUNKSIZE (64*1024) 458eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 459a5acac39bf3be7546222b1316faee5ee524be0d1sewardj 460452e89a9f847975609b3ad318943830f2cce841csewardj/* We may encounter more than one .eh_frame section in an object -- 461452e89a9f847975609b3ad318943830f2cce841csewardj unusual but apparently allowed by ELF. See 462452e89a9f847975609b3ad318943830f2cce841csewardj http://sourceware.org/bugzilla/show_bug.cgi?id=12675 463452e89a9f847975609b3ad318943830f2cce841csewardj*/ 464452e89a9f847975609b3ad318943830f2cce841csewardj#define N_EHFRAME_SECTS 2 465452e89a9f847975609b3ad318943830f2cce841csewardj 466a5acac39bf3be7546222b1316faee5ee524be0d1sewardj 467a5acac39bf3be7546222b1316faee5ee524be0d1sewardj/* So, the main structure for holding debug info for one object. */ 468a5acac39bf3be7546222b1316faee5ee524be0d1sewardj 469b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjstruct _DebugInfo { 470b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 471b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* Admin stuff */ 472b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 473b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj struct _DebugInfo* next; /* list of DebugInfos */ 474b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool mark; /* marked for deletion? */ 475b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 4769c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj /* An abstract handle, which can be used by entities outside of 4779c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj m_debuginfo to (in an abstract datatype sense) refer to this 4789c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj struct _DebugInfo. A .handle of zero is invalid; valid handles 4799c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj are 1 and above. The same handle is never issued twice (in any 4809c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj given run of Valgrind), so a handle becomes invalid when the 4819c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj associated struct _DebugInfo is discarded, and remains invalid 4829c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj forever thereafter. The .handle field is set as soon as this 4839c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj structure is allocated. */ 4849c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj ULong handle; 4859c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj 486b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* Used for debugging only - indicate what stuff to dump whilst 487b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj reading stuff into the seginfo. Are computed as early in the 488b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj lifetime of the DebugInfo as possible -- at the point when it is 489b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj created. Use these when deciding what to spew out; do not use 490b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj the global VG_(clo_blah) flags. */ 491b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 492b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool trace_symtab; /* symbols, our style */ 493b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool trace_cfi; /* dwarf frame unwind, our style */ 494b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool ddump_syms; /* mimic /usr/bin/readelf --syms */ 495b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool ddump_line; /* mimic /usr/bin/readelf --debug-dump=line */ 496b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool ddump_frames; /* mimic /usr/bin/readelf --debug-dump=frames */ 497b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 498a5acac39bf3be7546222b1316faee5ee524be0d1sewardj /* The "decide when it is time to read debuginfo" state machine. 499a5acac39bf3be7546222b1316faee5ee524be0d1sewardj This structure must get filled in before we can start reading 500a5acac39bf3be7546222b1316faee5ee524be0d1sewardj anything from the ELF/MachO file. This structure is filled in 501a5acac39bf3be7546222b1316faee5ee524be0d1sewardj by VG_(di_notify_mmap) and its immediate helpers. */ 502a5acac39bf3be7546222b1316faee5ee524be0d1sewardj struct _DebugInfoFSM fsm; 503a5acac39bf3be7546222b1316faee5ee524be0d1sewardj 504a5acac39bf3be7546222b1316faee5ee524be0d1sewardj /* Once the ::fsm has reached an accept state -- typically, when 505a5acac39bf3be7546222b1316faee5ee524be0d1sewardj both a rw? and r?x mapping for .filename have been observed -- 506a5acac39bf3be7546222b1316faee5ee524be0d1sewardj we can go on to read the symbol tables and debug info. 507a5acac39bf3be7546222b1316faee5ee524be0d1sewardj .have_dinfo changes from False to True when the debug info has 508a5acac39bf3be7546222b1316faee5ee524be0d1sewardj been completely read in and postprocessed (canonicalised) and is 509a5acac39bf3be7546222b1316faee5ee524be0d1sewardj now suitable for querying. */ 510a5acac39bf3be7546222b1316faee5ee524be0d1sewardj /* If have_dinfo is False, then all fields below this point are 511a5acac39bf3be7546222b1316faee5ee524be0d1sewardj invalid and should not be consulted. */ 512b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool have_dinfo; /* initially False */ 513b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 514b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* All the rest of the fields in this structure are filled in once 515b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj we have committed to reading the symbols and debug info (that 516b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj is, at the point where .have_dinfo is set to True). */ 517b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 518b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* The file's soname. FIXME: ensure this is always allocated in 519b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj VG_AR_DINFO. */ 520eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj UChar* soname; 521eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 522b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* Description of some important mapped segments. The presence or 523b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj absence of the mapping is denoted by the _present field, since 524b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj in some obscure circumstances (to do with data/sdata/bss) it is 525b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj possible for the mapping to be present but have zero size. 526b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Certainly text_ is mandatory on all platforms; not sure about 527f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj the rest though. 528f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj 529bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj -------------------------------------------------------- 530bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj 531f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj Comment_on_IMPORTANT_CFSI_REPRESENTATIONAL_INVARIANTS: we require that 532f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj 533f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj either (rx_map_size == 0 && cfsi == NULL) (the degenerate case) 534f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj 535f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj or the normal case, which is the AND of the following: 536f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj (0) rx_map_size > 0 537f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj (1) no two DebugInfos with rx_map_size > 0 538f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj have overlapping [rx_map_avma,+rx_map_size) 539f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj (2) [cfsi_minavma,cfsi_maxavma] does not extend 540f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj beyond [rx_map_avma,+rx_map_size); that is, the former is a 541f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj subrange or equal to the latter. 542f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj (3) all DiCfSI in the cfsi array all have ranges that fall within 543f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj [rx_map_avma,+rx_map_size). 544f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj (4) all DiCfSI in the cfsi array are non-overlapping 545f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj 546f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj The cumulative effect of these restrictions is to ensure that 547f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj all the DiCfSI records in the entire system are non overlapping. 548f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj Hence any address falls into either exactly one DiCfSI record, 549f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj or none. Hence it is safe to cache the results of searches for 550f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj DiCfSI records. This is the whole point of these restrictions. 551f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj The caching of DiCfSI searches is done in VG_(use_CF_info). The 552f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj cache is flushed after any change to debugInfo_list. DiCfSI 553f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj searches are cached because they are central to stack unwinding 554f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj on amd64-linux. 555f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj 556f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj Where are these invariants imposed and checked? 557f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj 558f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj They are checked after a successful read of debuginfo into 559f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj a DebugInfo*, in check_CFSI_related_invariants. 560f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj 561f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj (1) is not really imposed anywhere. We simply assume that the 562f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj kernel will not map the text segments from two different objects 563f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj into the same space. Sounds reasonable. 564f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj 565f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj (2) follows from (4) and (3). It is ensured by canonicaliseCFI. 566f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj (3) is ensured by ML_(addDiCfSI). 567f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj (4) is ensured by canonicaliseCFI. 568bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj 569bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj -------------------------------------------------------- 570bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj 571bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj Comment_on_DEBUG_SVMA_and_DEBUG_BIAS_fields: 572bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj 573bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj The _debug_{svma,bias} fields were added as part of a fix to 574bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj #185816. The problem encompassed in that bug report was that it 575bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj wasn't correct to use apply the bias values deduced for a 576bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj primary object to its associated debuginfo object, because the 577bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj debuginfo object (or the primary) could have been prelinked to a 578bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj different SVMA. Hence debuginfo and primary objects need to 579bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj have their own biases. 580bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj 581bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj ------ JRS: (referring to r9329): ------ 582bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj Let me see if I understand the workings correctly. Initially 583bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj the _debug_ values are set to the same values as the "normal" 584bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj ones, as there's a bunch of bits of code like this (in 585bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj readelf.c) 586bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj 587bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj di->text_svma = svma; 588bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj ... 589bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj di->text_bias = rx_bias; 590bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj di->text_debug_svma = svma; 591bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj di->text_debug_bias = rx_bias; 592bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj 593bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj If a debuginfo object subsequently shows up then the 594bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj _debug_svma/bias are set for the debuginfo object. Result is 595bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj that if there's no debuginfo object then the values are the same 596bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj as the primary-object values, and if there is a debuginfo object 597bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj then they will (or at least may) be different. 598bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj 599bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj Then when we need to actually bias something, we'll have to 600bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj decide whether to use the primary bias or the debuginfo bias. 601bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj And the strategy is to use the primary bias for ELF symbols but 602bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj the debuginfo bias for anything pulled out of Dwarf. 603bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj 604bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj ------ THH: ------ 605bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj Correct - the debug_svma and bias values apply to any address 606bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj read from the debug data regardless of where that debug data is 607bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj stored and the other values are used for addresses from other 608bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj places (primarily the symbol table). 609bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj 610bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj ------ JRS: ------ 611bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj Ok; so this was my only area of concern. Are there any 612bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj corner-case scenarios where this wouldn't be right? It sounds 613bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj like we're assuming the ELF symbols come from the primary object 614bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj and, if there is a debug object, then all the Dwarf comes from 615bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj there. But what if (eg) both symbols and Dwarf come from the 616bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj debug object? Is that even possible or allowable? 617bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj 618bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj ------ THH: ------ 619bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj You may have a point... 620bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj 621bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj The current logic is to try and take any one set of data from 622bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj either the base object or the debug object. There are four sets 623bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj of data we consider: 624bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj 625bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj - Symbol Table 626bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj - Stabs 627bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj - DWARF1 628bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj - DWARF2 629bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj 630bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj If we see the primary section for a given set in the base object 631bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj then we ignore all sections relating to that set in the debug 632bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj object. 633bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj 634bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj Now in principle if we saw a secondary section (like debug_line 635bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj say) in the base object, but not the main section (debug_info in 636bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj this case) then we would take debug_info from the debug object 637bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj but would use the debug_line from the base object unless we saw 638bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj a replacement copy in the debug object. That's probably unlikely 639bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj however. 640bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj 641bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj A bigger issue might be, as you say, the symbol table as we will 642bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj pick that up from the debug object if it isn't in the base. The 643bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj dynamic symbol table will always have to be in the base object 644bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj though so we will have to be careful when processing symbols to 645bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj know which table we are reading in that case. 646bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj 647bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj What we probably need to do is tell read_elf_symtab which object 648bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj the symbols it is being asked to read came from. 649bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj 650bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj (A followup patch to deal with this was committed in r9469). 651f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj */ 652b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* .text */ 653c4431bfe04c7490ea2d74939d222d87f13f30960njn Bool text_present; 654c4431bfe04c7490ea2d74939d222d87f13f30960njn Addr text_avma; 655c4431bfe04c7490ea2d74939d222d87f13f30960njn Addr text_svma; 656c4431bfe04c7490ea2d74939d222d87f13f30960njn SizeT text_size; 657c4431bfe04c7490ea2d74939d222d87f13f30960njn PtrdiffT text_bias; 658402c9eed11b9b60c6e134d05db938e395466cf99tom Addr text_debug_svma; 659402c9eed11b9b60c6e134d05db938e395466cf99tom PtrdiffT text_debug_bias; 660b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* .data */ 661c4431bfe04c7490ea2d74939d222d87f13f30960njn Bool data_present; 662c4431bfe04c7490ea2d74939d222d87f13f30960njn Addr data_svma; 663c4431bfe04c7490ea2d74939d222d87f13f30960njn Addr data_avma; 664c4431bfe04c7490ea2d74939d222d87f13f30960njn SizeT data_size; 665c4431bfe04c7490ea2d74939d222d87f13f30960njn PtrdiffT data_bias; 666402c9eed11b9b60c6e134d05db938e395466cf99tom Addr data_debug_svma; 667402c9eed11b9b60c6e134d05db938e395466cf99tom PtrdiffT data_debug_bias; 668b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* .sdata */ 669c4431bfe04c7490ea2d74939d222d87f13f30960njn Bool sdata_present; 670c4431bfe04c7490ea2d74939d222d87f13f30960njn Addr sdata_svma; 671c4431bfe04c7490ea2d74939d222d87f13f30960njn Addr sdata_avma; 672c4431bfe04c7490ea2d74939d222d87f13f30960njn SizeT sdata_size; 673c4431bfe04c7490ea2d74939d222d87f13f30960njn PtrdiffT sdata_bias; 674402c9eed11b9b60c6e134d05db938e395466cf99tom Addr sdata_debug_svma; 675402c9eed11b9b60c6e134d05db938e395466cf99tom PtrdiffT sdata_debug_bias; 676160d5a82d2d5d7d0964140dea17751c1daa3315etom /* .rodata */ 677160d5a82d2d5d7d0964140dea17751c1daa3315etom Bool rodata_present; 678160d5a82d2d5d7d0964140dea17751c1daa3315etom Addr rodata_svma; 679160d5a82d2d5d7d0964140dea17751c1daa3315etom Addr rodata_avma; 680160d5a82d2d5d7d0964140dea17751c1daa3315etom SizeT rodata_size; 681160d5a82d2d5d7d0964140dea17751c1daa3315etom PtrdiffT rodata_bias; 682402c9eed11b9b60c6e134d05db938e395466cf99tom Addr rodata_debug_svma; 683402c9eed11b9b60c6e134d05db938e395466cf99tom PtrdiffT rodata_debug_bias; 684b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* .bss */ 685c4431bfe04c7490ea2d74939d222d87f13f30960njn Bool bss_present; 686c4431bfe04c7490ea2d74939d222d87f13f30960njn Addr bss_svma; 687c4431bfe04c7490ea2d74939d222d87f13f30960njn Addr bss_avma; 688c4431bfe04c7490ea2d74939d222d87f13f30960njn SizeT bss_size; 689c4431bfe04c7490ea2d74939d222d87f13f30960njn PtrdiffT bss_bias; 690402c9eed11b9b60c6e134d05db938e395466cf99tom Addr bss_debug_svma; 691402c9eed11b9b60c6e134d05db938e395466cf99tom PtrdiffT bss_debug_bias; 692160d5a82d2d5d7d0964140dea17751c1daa3315etom /* .sbss */ 693160d5a82d2d5d7d0964140dea17751c1daa3315etom Bool sbss_present; 694160d5a82d2d5d7d0964140dea17751c1daa3315etom Addr sbss_svma; 695160d5a82d2d5d7d0964140dea17751c1daa3315etom Addr sbss_avma; 696160d5a82d2d5d7d0964140dea17751c1daa3315etom SizeT sbss_size; 697160d5a82d2d5d7d0964140dea17751c1daa3315etom PtrdiffT sbss_bias; 698402c9eed11b9b60c6e134d05db938e395466cf99tom Addr sbss_debug_svma; 699402c9eed11b9b60c6e134d05db938e395466cf99tom PtrdiffT sbss_debug_bias; 700b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* .plt */ 701b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool plt_present; 702b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr plt_avma; 703b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj SizeT plt_size; 704b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* .got */ 705b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool got_present; 706b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr got_avma; 707b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj SizeT got_size; 708092b6268cc4a38ae9ee41d1e3355937536ddc579bart /* .got.plt */ 709092b6268cc4a38ae9ee41d1e3355937536ddc579bart Bool gotplt_present; 710092b6268cc4a38ae9ee41d1e3355937536ddc579bart Addr gotplt_avma; 711092b6268cc4a38ae9ee41d1e3355937536ddc579bart SizeT gotplt_size; 712b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* .opd -- needed on ppc64-linux for finding symbols */ 713b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool opd_present; 714b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr opd_avma; 715b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj SizeT opd_size; 716452e89a9f847975609b3ad318943830f2cce841csewardj /* .ehframe -- needed on amd64-linux for stack unwinding. We might 717452e89a9f847975609b3ad318943830f2cce841csewardj see more than one, hence the arrays. */ 718452e89a9f847975609b3ad318943830f2cce841csewardj UInt n_ehframe; /* 0 .. N_EHFRAME_SECTS */ 719452e89a9f847975609b3ad318943830f2cce841csewardj Addr ehframe_avma[N_EHFRAME_SECTS]; 720452e89a9f847975609b3ad318943830f2cce841csewardj SizeT ehframe_size[N_EHFRAME_SECTS]; 721b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 722b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* Sorted tables of stuff we snarfed from the file. This is the 723b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj eventual product of reading the debug info. All this stuff 724b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj lives in VG_AR_DINFO. */ 725b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 726eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj /* An expandable array of symbols. */ 727eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj DiSym* symtab; 728b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj UWord symtab_used; 729b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj UWord symtab_size; 730eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj /* An expandable array of locations. */ 731eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj DiLoc* loctab; 732b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj UWord loctab_used; 733b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj UWord loctab_size; 734eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj /* An expandable array of CFI summary info records. Also includes 735eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj summary address bounds, showing the min and max address covered 73672427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj by any of the records, as an aid to fast searching. And, if the 73772427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj records require any expression nodes, they are stored in 73872427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj cfsi_exprs. */ 739eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj DiCfSI* cfsi; 740f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj UWord cfsi_used; 741f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj UWord cfsi_size; 742b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr cfsi_minavma; 743b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr cfsi_maxavma; 744b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj XArray* cfsi_exprs; /* XArray of CfiExpr */ 745eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 746c8259b85b701d25d72aabe9dc0a8154517f96913sewardj /* Optimized code under Wine x86: MSVC++ PDB FramePointerOmitted 747c8259b85b701d25d72aabe9dc0a8154517f96913sewardj data. Non-expandable array, hence .size == .used. */ 748c8259b85b701d25d72aabe9dc0a8154517f96913sewardj FPO_DATA* fpo; 749c8259b85b701d25d72aabe9dc0a8154517f96913sewardj UWord fpo_size; 750c8259b85b701d25d72aabe9dc0a8154517f96913sewardj Addr fpo_minavma; 751c8259b85b701d25d72aabe9dc0a8154517f96913sewardj Addr fpo_maxavma; 752c8259b85b701d25d72aabe9dc0a8154517f96913sewardj 753eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj /* Expandable arrays of characters -- the string table. Pointers 754eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj into this are stable (the arrays are not reallocated). */ 755eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj struct strchunk { 756eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj UInt strtab_used; 757b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj struct strchunk* next; 758eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj UChar strtab[SEGINFO_STRCHUNKSIZE]; 759eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj } *strchunks; 760eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 761b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* Variable scope information, as harvested from Dwarf3 files. 762eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 763b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj In short it's an 764f767d967b9ef331dcd7d0cd4584f6570cd829333sewardj 765b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj array of (array of PC address ranges and variables) 766b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 767b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj The outer array indexes over scopes, with Entry 0 containing 768b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj information on variables which exist for any value of the program 769b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj counter (PC) -- that is, the outermost scope. Entries 1, 2, 3, 770b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj etc contain information on increasinly deeply nested variables. 771b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 772b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Each inner array is an array of (an address range, and a set 773b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj of variables that are in scope over that address range). 774b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 775b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj The address ranges may not overlap. 776b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 777b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Since Entry 0 in the outer array holds information on variables 778b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj that exist for any value of the PC (that is, global vars), it 779b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj follows that Entry 0's inner array can only have one address 780b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj range pair, one that covers the entire address space. 781b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj */ 782b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj XArray* /* of OSet of DiAddrRange */varinfo; 783b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 7849c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj /* These are arrays of the relevant typed objects, held here 7859c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj partially for the purposes of visiting each object exactly once 786b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj when we need to delete them. */ 787b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 7889c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj /* An array of TyEnts. These are needed to make sense of any types 7899c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj in the .varinfo. Also, when deleting this DebugInfo, we must 7909c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj first traverse this array and throw away malloc'd stuff hanging 7919c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj off it -- by calling ML_(TyEnt__make_EMPTY) on each entry. */ 7929c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj XArray* /* of TyEnt */ admin_tyents; 793b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 7949c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj /* An array of guarded DWARF3 expressions. */ 7959c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj XArray* admin_gexprs; 796eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj}; 797eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 798eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* --------------------- functions --------------------- */ 799eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 800eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* ------ Adding ------ */ 801eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 802a5cace0c2a3e212931badbf6398a0cd98393121asewardj/* Add a symbol to si's symbol table. The contents of 'sym' are 803a5cace0c2a3e212931badbf6398a0cd98393121asewardj copied. It is assumed (and checked) that 'sym' only contains one 804a5cace0c2a3e212931badbf6398a0cd98393121asewardj name, so there is no auxiliary ::sec_names vector to duplicate. 805a5cace0c2a3e212931badbf6398a0cd98393121asewardj IOW, the copy is a shallow copy, and there are assertions in place 806a5cace0c2a3e212931badbf6398a0cd98393121asewardj to ensure that's OK. */ 807b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern void ML_(addSym) ( struct _DebugInfo* di, DiSym* sym ); 808eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 809b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* Add a line-number record to a DebugInfo. */ 810eadcd86d1b0f59efed44c162ef4378ccfb528290sewardjextern 811b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjvoid ML_(addLineInfo) ( struct _DebugInfo* di, 812eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj UChar* filename, 813eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj UChar* dirname, /* NULL is allowable */ 814eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj Addr this, Addr next, Int lineno, Int entry); 815eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 816f76d27a697a7b0bf3b84490baf60623fc96a23afnjn/* Shrink completed tables to save memory. */ 817f76d27a697a7b0bf3b84490baf60623fc96a23afnjnextern 818f76d27a697a7b0bf3b84490baf60623fc96a23afnjnvoid ML_(shrinkSym) ( struct _DebugInfo *di ); 819f76d27a697a7b0bf3b84490baf60623fc96a23afnjnextern 820f76d27a697a7b0bf3b84490baf60623fc96a23afnjnvoid ML_(shrinkLineInfo) ( struct _DebugInfo *di ); 821f76d27a697a7b0bf3b84490baf60623fc96a23afnjn 822eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Add a CFI summary record. The supplied DiCfSI is copied. */ 823b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern void ML_(addDiCfSI) ( struct _DebugInfo* di, DiCfSI* cfsi ); 824eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 825b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* Add a string to the string table of a DebugInfo. If len==-1, 826eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj ML_(addStr) will itself measure the length of the string. */ 827b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern UChar* ML_(addStr) ( struct _DebugInfo* di, UChar* str, Int len ); 828b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 829b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern void ML_(addVar)( struct _DebugInfo* di, 830b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Int level, 831b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr aMin, 832b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr aMax, 833b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj UChar* name, 8349c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj UWord typeR, /* a cuOff */ 835b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj GExpr* gexpr, 836b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj GExpr* fbGX, /* SHARED. */ 837b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj UChar* fileName, /* where decl'd - may be NULL */ 838b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Int lineNo, /* where decl'd - may be zero */ 839b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool show ); 840b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 841b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* Canonicalise the tables held by 'di', in preparation for use. Call 842eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj this after finishing adding entries to these tables. */ 843b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern void ML_(canonicaliseTables) ( struct _DebugInfo* di ); 844eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 8453c9cf3442185b5891e15450d6e3058aeff6796fetom/* Canonicalise the call-frame-info table held by 'di', in preparation 8463c9cf3442185b5891e15450d6e3058aeff6796fetom for use. This is called by ML_(canonicaliseTables) but can also be 8473c9cf3442185b5891e15450d6e3058aeff6796fetom called on it's own to sort just this table. */ 8483c9cf3442185b5891e15450d6e3058aeff6796fetomextern void ML_(canonicaliseCFI) ( struct _DebugInfo* di ); 8493c9cf3442185b5891e15450d6e3058aeff6796fetom 850eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* ------ Searching ------ */ 851eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 852eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Find a symbol-table index containing the specified pointer, or -1 853eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj if not found. Binary search. */ 854f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardjextern Word ML_(search_one_symtab) ( struct _DebugInfo* di, Addr ptr, 855f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj Bool match_anywhere_in_sym, 856f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj Bool findText ); 857eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 858eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Find a location-table index containing the specified pointer, or -1 859eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj if not found. Binary search. */ 860f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardjextern Word ML_(search_one_loctab) ( struct _DebugInfo* di, Addr ptr ); 861eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 862eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Find a CFI-table index containing the specified pointer, or -1 if 863eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj not found. Binary search. */ 864f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardjextern Word ML_(search_one_cfitab) ( struct _DebugInfo* di, Addr ptr ); 865eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 866c8259b85b701d25d72aabe9dc0a8154517f96913sewardj/* Find a FPO-table index containing the specified pointer, or -1 867c8259b85b701d25d72aabe9dc0a8154517f96913sewardj if not found. Binary search. */ 868c8259b85b701d25d72aabe9dc0a8154517f96913sewardjextern Word ML_(search_one_fpotab) ( struct _DebugInfo* di, Addr ptr ); 869c8259b85b701d25d72aabe9dc0a8154517f96913sewardj 870eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* ------ Misc ------ */ 871eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 872eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Show a non-fatal debug info reading error. Use vg_panic if 873b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj terminal. 'serious' errors are always shown, not 'serious' ones 874b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj are shown only at verbosity level 2 and above. */ 875b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern 876b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjvoid ML_(symerr) ( struct _DebugInfo* di, Bool serious, HChar* msg ); 877eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 878eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Print a symbol. */ 879eadcd86d1b0f59efed44c162ef4378ccfb528290sewardjextern void ML_(ppSym) ( Int idx, DiSym* sym ); 880eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 881eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Print a call-frame-info summary. */ 88272427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjextern void ML_(ppDiCfSI) ( XArray* /* of CfiExpr */ exprs, DiCfSI* si ); 883eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 884eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 885eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#define TRACE_SYMTAB(format, args...) \ 886b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj if (di->trace_symtab) { VG_(printf)(format, ## args); } 887eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 888eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 889eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#endif /* ndef __PRIV_STORAGE_H */ 890eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 891eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/*--------------------------------------------------------------------*/ 892eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/*--- end ---*/ 893eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/*--------------------------------------------------------------------*/ 894