priv_storage.h revision 535fb1b49a80f2e880f755ee618381de3e222ddf
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 1203f8d3fc25f5a45c5826259d1b33b7f310117279sewardj Copyright (C) 2000-2012 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 46535fb1b49a80f2e880f755ee618381de3e222ddfflorian#include "pub_core_basics.h" // Addr 47535fb1b49a80f2e880f755ee618381de3e222ddfflorian#include "pub_core_xarray.h" // XArray 48535fb1b49a80f2e880f755ee618381de3e222ddfflorian#include "priv_d3basics.h" // GExpr et al. 49535fb1b49a80f2e880f755ee618381de3e222ddfflorian#include "priv_image.h" // DiCursor 50535fb1b49a80f2e880f755ee618381de3e222ddfflorian 51eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* --------------------- SYMBOLS --------------------- */ 52eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 53a5cace0c2a3e212931badbf6398a0cd98393121asewardj/* A structure to hold an ELF/MachO symbol (very crudely). Usually 54a5cace0c2a3e212931badbf6398a0cd98393121asewardj the symbol only has one name, which is stored in ::pri_name, and 55a5cace0c2a3e212931badbf6398a0cd98393121asewardj ::sec_names is NULL. If there are other names, these are stored in 56a5cace0c2a3e212931badbf6398a0cd98393121asewardj ::sec_names, which is a NULL terminated vector holding the names. 57a5cace0c2a3e212931badbf6398a0cd98393121asewardj The vector is allocated in VG_AR_DINFO, the names themselves live 58a5cace0c2a3e212931badbf6398a0cd98393121asewardj in DebugInfo::strchunks. 59a5cace0c2a3e212931badbf6398a0cd98393121asewardj 60a5cace0c2a3e212931badbf6398a0cd98393121asewardj From the point of view of ELF, the primary vs secondary distinction 61a5cace0c2a3e212931badbf6398a0cd98393121asewardj is artificial: they are all just names associated with the address, 62a5cace0c2a3e212931badbf6398a0cd98393121asewardj none of which has higher precedence than any other. However, from 63a5cace0c2a3e212931badbf6398a0cd98393121asewardj the point of view of mapping an address to a name to display to the 64a5cace0c2a3e212931badbf6398a0cd98393121asewardj user, we need to choose one "preferred" name, and so that might as 65a5cace0c2a3e212931badbf6398a0cd98393121asewardj well be installed as the pri_name, whilst all others can live in 66a5cace0c2a3e212931badbf6398a0cd98393121asewardj sec_names[]. This has the convenient side effect that, in the 67a5cace0c2a3e212931badbf6398a0cd98393121asewardj common case where there is only one name for the address, 68a5cace0c2a3e212931badbf6398a0cd98393121asewardj sec_names[] does not need to be allocated. 69a5cace0c2a3e212931badbf6398a0cd98393121asewardj*/ 70eadcd86d1b0f59efed44c162ef4378ccfb528290sewardjtypedef 71eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj struct { 72a5cace0c2a3e212931badbf6398a0cd98393121asewardj Addr addr; /* lowest address of entity */ 73a5cace0c2a3e212931badbf6398a0cd98393121asewardj Addr tocptr; /* ppc64-linux only: value that R2 should have */ 741636d33c13958b9c0e7d3059cdd5005746418eb2florian HChar* pri_name; /* primary name, never NULL */ 751636d33c13958b9c0e7d3059cdd5005746418eb2florian HChar** sec_names; /* NULL, or a NULL term'd array of other names */ 76a5cace0c2a3e212931badbf6398a0cd98393121asewardj // XXX: this could be shrunk (on 32-bit platforms) by using 30 77a5cace0c2a3e212931badbf6398a0cd98393121asewardj // bits for the size and 1 bit each for isText and isIFunc. If you 78a5cace0c2a3e212931badbf6398a0cd98393121asewardj // do this, make sure that all assignments to the latter two use 79a5cace0c2a3e212931badbf6398a0cd98393121asewardj // 0 or 1 (or True or False), and that a positive number larger 80a5cace0c2a3e212931badbf6398a0cd98393121asewardj // than 1 is never used to represent True. 81a5cace0c2a3e212931badbf6398a0cd98393121asewardj UInt size; /* size in bytes */ 82a5cace0c2a3e212931badbf6398a0cd98393121asewardj Bool isText; 83a5cace0c2a3e212931badbf6398a0cd98393121asewardj Bool isIFunc; /* symbol is an indirect function? */ 84eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj } 85eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj DiSym; 86eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 87eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* --------------------- SRCLOCS --------------------- */ 88eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 89eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Line count at which overflow happens, due to line numbers being 90eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj stored as shorts in `struct nlist' in a.out.h. */ 91eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#define LINENO_OVERFLOW (1 << (sizeof(short) * 8)) 92eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 93eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#define LINENO_BITS 20 94eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#define LOC_SIZE_BITS (32 - LINENO_BITS) 95eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#define MAX_LINENO ((1 << LINENO_BITS) - 1) 96eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 97eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Unlikely to have any lines with instruction ranges > 4096 bytes */ 98eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#define MAX_LOC_SIZE ((1 << LOC_SIZE_BITS) - 1) 99eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 100eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Number used to detect line number overflows; if one line is 101b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 60000-odd smaller than the previous, it was probably an overflow. 102eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj */ 103eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#define OVERFLOW_DIFFERENCE (LINENO_OVERFLOW - 5000) 104eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 105eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* A structure to hold addr-to-source info for a single line. There 106eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj can be a lot of these, hence the dense packing. */ 107eadcd86d1b0f59efed44c162ef4378ccfb528290sewardjtypedef 108eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj struct { 109eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj /* Word 1 */ 110eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj Addr addr; /* lowest address for this line */ 111eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj /* Word 2 */ 112eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj UShort size:LOC_SIZE_BITS; /* # bytes; we catch overflows of this */ 113eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj UInt lineno:LINENO_BITS; /* source line number, or zero */ 114eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj /* Word 3 */ 1151636d33c13958b9c0e7d3059cdd5005746418eb2florian const HChar* filename; /* source filename */ 116eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj /* Word 4 */ 1171636d33c13958b9c0e7d3059cdd5005746418eb2florian const HChar* dirname; /* source directory name */ 118eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj } 119eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj DiLoc; 120eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 121eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* --------------------- CF INFO --------------------- */ 122eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 1233026f71684a930286186aa10fef266c304672e8fsewardj/* DiCfSI: a structure to summarise DWARF2/3 CFA info for the code 1243026f71684a930286186aa10fef266c304672e8fsewardj address range [base .. base+len-1]. 1253026f71684a930286186aa10fef266c304672e8fsewardj 1263026f71684a930286186aa10fef266c304672e8fsewardj On x86 and amd64 ("IA"), if you know ({e,r}sp, {e,r}bp, {e,r}ip) at 1273026f71684a930286186aa10fef266c304672e8fsewardj some point and {e,r}ip is in the range [base .. base+len-1], it 1283026f71684a930286186aa10fef266c304672e8fsewardj tells you how to calculate ({e,r}sp, {e,r}bp) for the caller of the 1293026f71684a930286186aa10fef266c304672e8fsewardj current frame and also ra, the return address of the current frame. 130eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 131eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj First off, calculate CFA, the Canonical Frame Address, thusly: 132eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 13372427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj cfa = case cfa_how of 1343026f71684a930286186aa10fef266c304672e8fsewardj CFIC_IA_SPREL -> {e,r}sp + cfa_off 1353026f71684a930286186aa10fef266c304672e8fsewardj CFIC_IA_BPREL -> {e,r}bp + cfa_off 1363026f71684a930286186aa10fef266c304672e8fsewardj CFIR_IA_EXPR -> expr whose index is in cfa_off 137eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 1383026f71684a930286186aa10fef266c304672e8fsewardj Once that is done, the previous frame's {e,r}sp/{e,r}bp values and 1393026f71684a930286186aa10fef266c304672e8fsewardj this frame's {e,r}ra value can be calculated like this: 140eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 1413026f71684a930286186aa10fef266c304672e8fsewardj old_{e,r}sp/{e,r}bp/ra 1423026f71684a930286186aa10fef266c304672e8fsewardj = case {e,r}sp/{e,r}bp/ra_how of 143eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj CFIR_UNKNOWN -> we don't know, sorry 144eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj CFIR_SAME -> same as it was before (sp/fp only) 1453026f71684a930286186aa10fef266c304672e8fsewardj CFIR_CFAREL -> cfa + sp/bp/ra_off 1463026f71684a930286186aa10fef266c304672e8fsewardj CFIR_MEMCFAREL -> *( cfa + sp/bp/ra_off ) 1473026f71684a930286186aa10fef266c304672e8fsewardj CFIR_EXPR -> expr whose index is in sp/bp/ra_off 148eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 1493026f71684a930286186aa10fef266c304672e8fsewardj On ARM it's pretty much the same, except we have more registers to 1503026f71684a930286186aa10fef266c304672e8fsewardj keep track of: 15172427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj 1523026f71684a930286186aa10fef266c304672e8fsewardj cfa = case cfa_how of 1533026f71684a930286186aa10fef266c304672e8fsewardj CFIC_R13REL -> r13 + cfa_off 1543026f71684a930286186aa10fef266c304672e8fsewardj CFIC_R12REL -> r12 + cfa_off 1553026f71684a930286186aa10fef266c304672e8fsewardj CFIC_R11REL -> r11 + cfa_off 156fa5ce5616a17e79828fbc79f30b02b5085151e3csewardj CFIC_R7REL -> r7 + cfa_off 1573026f71684a930286186aa10fef266c304672e8fsewardj CFIR_EXPR -> expr whose index is in cfa_off 158eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 159fa5ce5616a17e79828fbc79f30b02b5085151e3csewardj old_r14/r13/r12/r11/r7/ra 160fa5ce5616a17e79828fbc79f30b02b5085151e3csewardj = case r14/r13/r12/r11/r7/ra_how of 1613026f71684a930286186aa10fef266c304672e8fsewardj CFIR_UNKNOWN -> we don't know, sorry 162fa5ce5616a17e79828fbc79f30b02b5085151e3csewardj CFIR_SAME -> same as it was before (r14/r13/r12/r11/r7 only) 163fa5ce5616a17e79828fbc79f30b02b5085151e3csewardj CFIR_CFAREL -> cfa + r14/r13/r12/r11/r7/ra_off 164fa5ce5616a17e79828fbc79f30b02b5085151e3csewardj CFIR_MEMCFAREL -> *( cfa + r14/r13/r12/r11/r7/ra_off ) 165fa5ce5616a17e79828fbc79f30b02b5085151e3csewardj CFIR_EXPR -> expr whose index is in r14/r13/r12/r11/r7/ra_off 166b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj 167b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj On s390x we have a similar logic as x86 or amd64. We need the stack pointer 168b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj (r15), the frame pointer r11 (like BP) and together with the instruction 169b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj address in the PSW we can calculate the previous values: 170b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj cfa = case cfa_how of 171b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj CFIC_IA_SPREL -> r15 + cfa_off 172b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj CFIC_IA_BPREL -> r11 + cfa_off 173b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj CFIR_IA_EXPR -> expr whose index is in cfa_off 174b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj 175b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj old_sp/fp/ra 176b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj = case sp/fp/ra_how of 177b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj CFIR_UNKNOWN -> we don't know, sorry 178b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj CFIR_SAME -> same as it was before (sp/fp only) 179b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj CFIR_CFAREL -> cfa + sp/fp/ra_off 180b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj CFIR_MEMCFAREL -> *( cfa + sp/fp/ra_off ) 181b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj CFIR_EXPR -> expr whose index is in sp/fp/ra_off 1823026f71684a930286186aa10fef266c304672e8fsewardj*/ 1833026f71684a930286186aa10fef266c304672e8fsewardj 1843026f71684a930286186aa10fef266c304672e8fsewardj#define CFIC_IA_SPREL ((UChar)1) 1853026f71684a930286186aa10fef266c304672e8fsewardj#define CFIC_IA_BPREL ((UChar)2) 1863026f71684a930286186aa10fef266c304672e8fsewardj#define CFIC_IA_EXPR ((UChar)3) 1873026f71684a930286186aa10fef266c304672e8fsewardj#define CFIC_ARM_R13REL ((UChar)4) 1883026f71684a930286186aa10fef266c304672e8fsewardj#define CFIC_ARM_R12REL ((UChar)5) 1893026f71684a930286186aa10fef266c304672e8fsewardj#define CFIC_ARM_R11REL ((UChar)6) 190fa5ce5616a17e79828fbc79f30b02b5085151e3csewardj#define CFIC_ARM_R7REL ((UChar)7) 191fa5ce5616a17e79828fbc79f30b02b5085151e3csewardj#define CFIC_EXPR ((UChar)8) /* all targets */ 1923026f71684a930286186aa10fef266c304672e8fsewardj 1933026f71684a930286186aa10fef266c304672e8fsewardj#define CFIR_UNKNOWN ((UChar)64) 1943026f71684a930286186aa10fef266c304672e8fsewardj#define CFIR_SAME ((UChar)65) 1953026f71684a930286186aa10fef266c304672e8fsewardj#define CFIR_CFAREL ((UChar)66) 1963026f71684a930286186aa10fef266c304672e8fsewardj#define CFIR_MEMCFAREL ((UChar)67) 1973026f71684a930286186aa10fef266c304672e8fsewardj#define CFIR_EXPR ((UChar)68) 1983026f71684a930286186aa10fef266c304672e8fsewardj 1993026f71684a930286186aa10fef266c304672e8fsewardj#if defined(VGA_x86) || defined(VGA_amd64) 200eadcd86d1b0f59efed44c162ef4378ccfb528290sewardjtypedef 201eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj struct { 202eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj Addr base; 203eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj UInt len; 2043026f71684a930286186aa10fef266c304672e8fsewardj UChar cfa_how; /* a CFIC_IA value */ 20572427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj UChar ra_how; /* a CFIR_ value */ 20672427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj UChar sp_how; /* a CFIR_ value */ 2073026f71684a930286186aa10fef266c304672e8fsewardj UChar bp_how; /* a CFIR_ value */ 208eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj Int cfa_off; 209eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj Int ra_off; 210eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj Int sp_off; 2113026f71684a930286186aa10fef266c304672e8fsewardj Int bp_off; 2123026f71684a930286186aa10fef266c304672e8fsewardj } 2133026f71684a930286186aa10fef266c304672e8fsewardj DiCfSI; 2143026f71684a930286186aa10fef266c304672e8fsewardj#elif defined(VGA_arm) 2153026f71684a930286186aa10fef266c304672e8fsewardjtypedef 2163026f71684a930286186aa10fef266c304672e8fsewardj struct { 2173026f71684a930286186aa10fef266c304672e8fsewardj Addr base; 2183026f71684a930286186aa10fef266c304672e8fsewardj UInt len; 2193026f71684a930286186aa10fef266c304672e8fsewardj UChar cfa_how; /* a CFIC_ value */ 2203026f71684a930286186aa10fef266c304672e8fsewardj UChar ra_how; /* a CFIR_ value */ 2213026f71684a930286186aa10fef266c304672e8fsewardj UChar r14_how; /* a CFIR_ value */ 2223026f71684a930286186aa10fef266c304672e8fsewardj UChar r13_how; /* a CFIR_ value */ 2233026f71684a930286186aa10fef266c304672e8fsewardj UChar r12_how; /* a CFIR_ value */ 2243026f71684a930286186aa10fef266c304672e8fsewardj UChar r11_how; /* a CFIR_ value */ 225fa5ce5616a17e79828fbc79f30b02b5085151e3csewardj UChar r7_how; /* a CFIR_ value */ 2263026f71684a930286186aa10fef266c304672e8fsewardj Int cfa_off; 2273026f71684a930286186aa10fef266c304672e8fsewardj Int ra_off; 2283026f71684a930286186aa10fef266c304672e8fsewardj Int r14_off; 2293026f71684a930286186aa10fef266c304672e8fsewardj Int r13_off; 2303026f71684a930286186aa10fef266c304672e8fsewardj Int r12_off; 2313026f71684a930286186aa10fef266c304672e8fsewardj Int r11_off; 232fa5ce5616a17e79828fbc79f30b02b5085151e3csewardj Int r7_off; 233eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj } 234eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj DiCfSI; 2353026f71684a930286186aa10fef266c304672e8fsewardj#elif defined(VGA_ppc32) || defined(VGA_ppc64) 236f5f1e12bd89408917c1ffeb22ec23a1fd11b7a23sewardj/* Just have a struct with the common fields in, so that code that 237f5f1e12bd89408917c1ffeb22ec23a1fd11b7a23sewardj processes the common fields doesn't have to be ifdef'd against 238f5f1e12bd89408917c1ffeb22ec23a1fd11b7a23sewardj VGP_/VGA_ symbols. These are not used in any way on ppc32/64-linux 239f5f1e12bd89408917c1ffeb22ec23a1fd11b7a23sewardj at the moment. */ 240f5f1e12bd89408917c1ffeb22ec23a1fd11b7a23sewardjtypedef 241f5f1e12bd89408917c1ffeb22ec23a1fd11b7a23sewardj struct { 242f5f1e12bd89408917c1ffeb22ec23a1fd11b7a23sewardj Addr base; 243f5f1e12bd89408917c1ffeb22ec23a1fd11b7a23sewardj UInt len; 244f5f1e12bd89408917c1ffeb22ec23a1fd11b7a23sewardj UChar cfa_how; /* a CFIC_ value */ 245f5f1e12bd89408917c1ffeb22ec23a1fd11b7a23sewardj UChar ra_how; /* a CFIR_ value */ 246f5f1e12bd89408917c1ffeb22ec23a1fd11b7a23sewardj Int cfa_off; 247f5f1e12bd89408917c1ffeb22ec23a1fd11b7a23sewardj Int ra_off; 248f5f1e12bd89408917c1ffeb22ec23a1fd11b7a23sewardj } 249f5f1e12bd89408917c1ffeb22ec23a1fd11b7a23sewardj DiCfSI; 250b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj#elif defined(VGA_s390x) 251b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardjtypedef 252b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj struct { 253b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj Addr base; 254b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj UInt len; 255b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj UChar cfa_how; /* a CFIC_ value */ 256b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj UChar sp_how; /* a CFIR_ value */ 257b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj UChar ra_how; /* a CFIR_ value */ 258b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj UChar fp_how; /* a CFIR_ value */ 259b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj Int cfa_off; 260b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj Int sp_off; 261b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj Int ra_off; 262b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj Int fp_off; 263b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj } 264b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj DiCfSI; 2654df0bfc0614379192c780c944415dc420d9cfe8epetarj#elif defined(VGA_mips32) || defined(VGA_mips64) 2665db15403e889d4db339b342bc2a824ef0bfaa654sewardjtypedef 2675db15403e889d4db339b342bc2a824ef0bfaa654sewardj struct { 2685db15403e889d4db339b342bc2a824ef0bfaa654sewardj Addr base; 2695db15403e889d4db339b342bc2a824ef0bfaa654sewardj UInt len; 2705db15403e889d4db339b342bc2a824ef0bfaa654sewardj UChar cfa_how; /* a CFIC_ value */ 2715db15403e889d4db339b342bc2a824ef0bfaa654sewardj UChar ra_how; /* a CFIR_ value */ 2725db15403e889d4db339b342bc2a824ef0bfaa654sewardj UChar sp_how; /* a CFIR_ value */ 2735db15403e889d4db339b342bc2a824ef0bfaa654sewardj UChar fp_how; /* a CFIR_ value */ 2745db15403e889d4db339b342bc2a824ef0bfaa654sewardj Int cfa_off; 2755db15403e889d4db339b342bc2a824ef0bfaa654sewardj Int ra_off; 2765db15403e889d4db339b342bc2a824ef0bfaa654sewardj Int sp_off; 2775db15403e889d4db339b342bc2a824ef0bfaa654sewardj Int fp_off; 2785db15403e889d4db339b342bc2a824ef0bfaa654sewardj } 2795db15403e889d4db339b342bc2a824ef0bfaa654sewardj DiCfSI; 2803026f71684a930286186aa10fef266c304672e8fsewardj#else 2813026f71684a930286186aa10fef266c304672e8fsewardj# error "Unknown arch" 2823026f71684a930286186aa10fef266c304672e8fsewardj#endif 283eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 28472427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj 28572427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjtypedef 28672427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj enum { 28740628facff2285b0fce592381c6e26fdcd2a1252tom Cunop_Abs=0x231, 28840628facff2285b0fce592381c6e26fdcd2a1252tom Cunop_Neg, 28940628facff2285b0fce592381c6e26fdcd2a1252tom Cunop_Not 29040628facff2285b0fce592381c6e26fdcd2a1252tom } 29140628facff2285b0fce592381c6e26fdcd2a1252tom CfiUnop; 29240628facff2285b0fce592381c6e26fdcd2a1252tom 29340628facff2285b0fce592381c6e26fdcd2a1252tomtypedef 29440628facff2285b0fce592381c6e26fdcd2a1252tom enum { 295f6716dd8f025c9ace67541f3360d7f4523496d8atom Cbinop_Add=0x321, 296f6716dd8f025c9ace67541f3360d7f4523496d8atom Cbinop_Sub, 297f6716dd8f025c9ace67541f3360d7f4523496d8atom Cbinop_And, 298f6716dd8f025c9ace67541f3360d7f4523496d8atom Cbinop_Mul, 299f6716dd8f025c9ace67541f3360d7f4523496d8atom Cbinop_Shl, 300f6716dd8f025c9ace67541f3360d7f4523496d8atom Cbinop_Shr, 301f6716dd8f025c9ace67541f3360d7f4523496d8atom Cbinop_Eq, 302f6716dd8f025c9ace67541f3360d7f4523496d8atom Cbinop_Ge, 303f6716dd8f025c9ace67541f3360d7f4523496d8atom Cbinop_Gt, 304f6716dd8f025c9ace67541f3360d7f4523496d8atom Cbinop_Le, 305f6716dd8f025c9ace67541f3360d7f4523496d8atom Cbinop_Lt, 306f6716dd8f025c9ace67541f3360d7f4523496d8atom Cbinop_Ne 30772427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj } 308f6716dd8f025c9ace67541f3360d7f4523496d8atom CfiBinop; 30972427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj 31072427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjtypedef 31172427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj enum { 3123026f71684a930286186aa10fef266c304672e8fsewardj Creg_IA_SP=0x213, 3133026f71684a930286186aa10fef266c304672e8fsewardj Creg_IA_BP, 3143026f71684a930286186aa10fef266c304672e8fsewardj Creg_IA_IP, 3153026f71684a930286186aa10fef266c304672e8fsewardj Creg_ARM_R13, 3163026f71684a930286186aa10fef266c304672e8fsewardj Creg_ARM_R12, 3173026f71684a930286186aa10fef266c304672e8fsewardj Creg_ARM_R15, 318b5b87408c0c99f9f6938d8cd921e2a5f420577c4sewardj Creg_ARM_R14, 3195db15403e889d4db339b342bc2a824ef0bfaa654sewardj Creg_S390_R14, 3205db15403e889d4db339b342bc2a824ef0bfaa654sewardj Creg_MIPS_RA 32172427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj } 32272427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj CfiReg; 32372427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj 32472427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjtypedef 32572427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj enum { 32672427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj Cex_Undef=0x123, 32772427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj Cex_Deref, 32872427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj Cex_Const, 32940628facff2285b0fce592381c6e26fdcd2a1252tom Cex_Unop, 33072427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj Cex_Binop, 33172427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj Cex_CfiReg, 33272427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj Cex_DwReg 33372427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj } 33472427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj CfiExprTag; 33572427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj 33672427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjtypedef 33772427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj struct { 33872427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj CfiExprTag tag; 33972427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj union { 34072427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj struct { 34172427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj } Undef; 34272427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj struct { 34372427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj Int ixAddr; 34472427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj } Deref; 34572427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj struct { 34672427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj UWord con; 34772427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj } Const; 34872427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj struct { 34940628facff2285b0fce592381c6e26fdcd2a1252tom CfiUnop op; 35040628facff2285b0fce592381c6e26fdcd2a1252tom Int ix; 35140628facff2285b0fce592381c6e26fdcd2a1252tom } Unop; 35240628facff2285b0fce592381c6e26fdcd2a1252tom struct { 353f6716dd8f025c9ace67541f3360d7f4523496d8atom CfiBinop op; 35472427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj Int ixL; 35572427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj Int ixR; 35672427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj } Binop; 35772427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj struct { 35872427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj CfiReg reg; 35972427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj } CfiReg; 36072427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj struct { 36172427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj Int reg; 36272427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj } DwReg; 36372427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj } 36472427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj Cex; 36572427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj } 36672427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj CfiExpr; 36772427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj 36872427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjextern Int ML_(CfiExpr_Undef) ( XArray* dst ); 36972427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjextern Int ML_(CfiExpr_Deref) ( XArray* dst, Int ixAddr ); 37072427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjextern Int ML_(CfiExpr_Const) ( XArray* dst, UWord con ); 37140628facff2285b0fce592381c6e26fdcd2a1252tomextern Int ML_(CfiExpr_Unop) ( XArray* dst, CfiUnop op, Int ix ); 372f6716dd8f025c9ace67541f3360d7f4523496d8atomextern Int ML_(CfiExpr_Binop) ( XArray* dst, CfiBinop op, Int ixL, Int ixR ); 37372427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjextern Int ML_(CfiExpr_CfiReg)( XArray* dst, CfiReg reg ); 37472427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjextern Int ML_(CfiExpr_DwReg) ( XArray* dst, Int reg ); 37572427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj 37672427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjextern void ML_(ppCfiExpr)( XArray* src, Int ix ); 37772427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj 378c8259b85b701d25d72aabe9dc0a8154517f96913sewardj/* ---------------- FPO INFO (Windows PE) -------------- */ 379c8259b85b701d25d72aabe9dc0a8154517f96913sewardj 380c8259b85b701d25d72aabe9dc0a8154517f96913sewardj/* for apps using Wine: MSVC++ PDB FramePointerOmitted: somewhat like 381c8259b85b701d25d72aabe9dc0a8154517f96913sewardj a primitive CFI */ 382c8259b85b701d25d72aabe9dc0a8154517f96913sewardjtypedef 383c8259b85b701d25d72aabe9dc0a8154517f96913sewardj struct _FPO_DATA { /* 16 bytes */ 384c8259b85b701d25d72aabe9dc0a8154517f96913sewardj UInt ulOffStart; /* offset of 1st byte of function code */ 385c8259b85b701d25d72aabe9dc0a8154517f96913sewardj UInt cbProcSize; /* # bytes in function */ 386c8259b85b701d25d72aabe9dc0a8154517f96913sewardj UInt cdwLocals; /* # bytes/4 in locals */ 387c8259b85b701d25d72aabe9dc0a8154517f96913sewardj UShort cdwParams; /* # bytes/4 in params */ 388c8259b85b701d25d72aabe9dc0a8154517f96913sewardj UChar cbProlog; /* # bytes in prolog */ 389c8259b85b701d25d72aabe9dc0a8154517f96913sewardj UChar cbRegs :3; /* # regs saved */ 390c8259b85b701d25d72aabe9dc0a8154517f96913sewardj UChar fHasSEH:1; /* Structured Exception Handling */ 391c8259b85b701d25d72aabe9dc0a8154517f96913sewardj UChar fUseBP :1; /* EBP has been used */ 392c8259b85b701d25d72aabe9dc0a8154517f96913sewardj UChar reserved:1; 393c8259b85b701d25d72aabe9dc0a8154517f96913sewardj UChar cbFrame:2; /* frame type */ 394c8259b85b701d25d72aabe9dc0a8154517f96913sewardj } 395c8259b85b701d25d72aabe9dc0a8154517f96913sewardj FPO_DATA; 396c8259b85b701d25d72aabe9dc0a8154517f96913sewardj 397c8259b85b701d25d72aabe9dc0a8154517f96913sewardj#define PDB_FRAME_FPO 0 398c8259b85b701d25d72aabe9dc0a8154517f96913sewardj#define PDB_FRAME_TRAP 1 399c8259b85b701d25d72aabe9dc0a8154517f96913sewardj#define PDB_FRAME_TSS 2 400c8259b85b701d25d72aabe9dc0a8154517f96913sewardj 401b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* --------------------- VARIABLES --------------------- */ 402b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 403b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjtypedef 404b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj struct { 405b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr aMin; 406b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr aMax; 407b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj XArray* /* of DiVariable */ vars; 408b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj } 409b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj DiAddrRange; 410b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 411b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjtypedef 412b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj struct { 4131636d33c13958b9c0e7d3059cdd5005746418eb2florian HChar* name; /* in DebugInfo.strchunks */ 4149c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj UWord typeR; /* a cuOff */ 415b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj GExpr* gexpr; /* on DebugInfo.gexprs list */ 416b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj GExpr* fbGX; /* SHARED. */ 4171636d33c13958b9c0e7d3059cdd5005746418eb2florian HChar* fileName; /* where declared; may be NULL. in 418b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj DebugInfo.strchunks */ 419b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Int lineNo; /* where declared; may be zero. */ 420b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj } 421b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj DiVariable; 422b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 423b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjWord 424b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjML_(cmp_for_DiAddrRange_range) ( const void* keyV, const void* elemV ); 425b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 426b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* --------------------- DEBUGINFO --------------------- */ 427eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 428eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* This is the top-level data type. It's a structure which contains 429b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj information pertaining to one mapped ELF object. This type is 430eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj exported only abstractly - in pub_tool_debuginfo.h. */ 431eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 432a5acac39bf3be7546222b1316faee5ee524be0d1sewardj/* First though, here's an auxiliary data structure. It is only ever 433a5acac39bf3be7546222b1316faee5ee524be0d1sewardj used as part of a struct _DebugInfo. We use it to record 434a5acac39bf3be7546222b1316faee5ee524be0d1sewardj observations about mappings and permission changes to the 435a5acac39bf3be7546222b1316faee5ee524be0d1sewardj associated file, so as to decide when to read debug info. It's 436a5acac39bf3be7546222b1316faee5ee524be0d1sewardj essentially an ultra-trivial finite state machine which, when it 437a5acac39bf3be7546222b1316faee5ee524be0d1sewardj reaches an accept state, signals that we should now read debug info 438a5acac39bf3be7546222b1316faee5ee524be0d1sewardj from the object into the associated struct _DebugInfo. The accept 439a5acac39bf3be7546222b1316faee5ee524be0d1sewardj state is arrived at when have_rx_map and have_rw_map both become 440731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj true. The initial state is one in which we have no observations, 441731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj so have_rx_map and have_rw_map are both false. 442a5acac39bf3be7546222b1316faee5ee524be0d1sewardj 4436b5625bb609b154766d2e138b61e15655f60b710sewardj This all started as a rather ad-hoc solution, but was further 4446b5625bb609b154766d2e138b61e15655f60b710sewardj expanded to handle weird object layouts, e.g. more than one rw 4456b5625bb609b154766d2e138b61e15655f60b710sewardj or rx mapping for one binary. 446731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj 447731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj The normal sequence of events is one of 448731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj 449731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj start --> r-x mapping --> rw- mapping --> accept 450731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj start --> rw- mapping --> r-x mapping --> accept 451731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj 452731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj that is, take the first r-x and rw- mapping we see, and we're done. 453731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj 454731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj On MacOSX 10.7, 32-bit, there appears to be a new variant: 455731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj 456731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj start --> r-- mapping --> rw- mapping 457731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj --> upgrade r-- mapping to r-x mapping --> accept 458731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj 459731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj where the upgrade is done by a call to vm_protect. Hence we 460731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj need to also track this possibility. 461a5acac39bf3be7546222b1316faee5ee524be0d1sewardj*/ 4626b5625bb609b154766d2e138b61e15655f60b710sewardj 4636b5625bb609b154766d2e138b61e15655f60b710sewardjstruct _DebugInfoMapping 464a5acac39bf3be7546222b1316faee5ee524be0d1sewardj{ 4656b5625bb609b154766d2e138b61e15655f60b710sewardj Addr avma; /* these fields record the file offset, length */ 4666b5625bb609b154766d2e138b61e15655f60b710sewardj SizeT size; /* and map address of each mapping */ 4676b5625bb609b154766d2e138b61e15655f60b710sewardj OffT foff; 4686b5625bb609b154766d2e138b61e15655f60b710sewardj Bool rx, rw, ro; /* memory access flags for this mapping */ 4696b5625bb609b154766d2e138b61e15655f60b710sewardj}; 470a5acac39bf3be7546222b1316faee5ee524be0d1sewardj 4716b5625bb609b154766d2e138b61e15655f60b710sewardjstruct _DebugInfoFSM 4726b5625bb609b154766d2e138b61e15655f60b710sewardj{ 4731636d33c13958b9c0e7d3059cdd5005746418eb2florian HChar* filename; /* in mallocville (VG_AR_DINFO) */ 4746b5625bb609b154766d2e138b61e15655f60b710sewardj XArray* maps; /* XArray of _DebugInfoMapping structs */ 475a5acac39bf3be7546222b1316faee5ee524be0d1sewardj Bool have_rx_map; /* did we see a r?x mapping yet for the file? */ 476a5acac39bf3be7546222b1316faee5ee524be0d1sewardj Bool have_rw_map; /* did we see a rw? mapping yet for the file? */ 477731f9cf9fd4d507b44f1a0fdc2d3b8e8efae02e3sewardj Bool have_ro_map; /* did we see a r-- mapping yet for the file? */ 478a5acac39bf3be7546222b1316faee5ee524be0d1sewardj}; 479a5acac39bf3be7546222b1316faee5ee524be0d1sewardj 480a5acac39bf3be7546222b1316faee5ee524be0d1sewardj 481a5acac39bf3be7546222b1316faee5ee524be0d1sewardj/* To do with the string table in struct _DebugInfo (::strchunks) */ 482eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#define SEGINFO_STRCHUNKSIZE (64*1024) 483eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 484a5acac39bf3be7546222b1316faee5ee524be0d1sewardj 485452e89a9f847975609b3ad318943830f2cce841csewardj/* We may encounter more than one .eh_frame section in an object -- 486452e89a9f847975609b3ad318943830f2cce841csewardj unusual but apparently allowed by ELF. See 487452e89a9f847975609b3ad318943830f2cce841csewardj http://sourceware.org/bugzilla/show_bug.cgi?id=12675 488452e89a9f847975609b3ad318943830f2cce841csewardj*/ 489452e89a9f847975609b3ad318943830f2cce841csewardj#define N_EHFRAME_SECTS 2 490452e89a9f847975609b3ad318943830f2cce841csewardj 491a5acac39bf3be7546222b1316faee5ee524be0d1sewardj 492a5acac39bf3be7546222b1316faee5ee524be0d1sewardj/* So, the main structure for holding debug info for one object. */ 493a5acac39bf3be7546222b1316faee5ee524be0d1sewardj 494b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjstruct _DebugInfo { 495b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 496b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* Admin stuff */ 497b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 498b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj struct _DebugInfo* next; /* list of DebugInfos */ 499b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool mark; /* marked for deletion? */ 500b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 5019c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj /* An abstract handle, which can be used by entities outside of 5029c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj m_debuginfo to (in an abstract datatype sense) refer to this 5039c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj struct _DebugInfo. A .handle of zero is invalid; valid handles 5049c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj are 1 and above. The same handle is never issued twice (in any 5059c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj given run of Valgrind), so a handle becomes invalid when the 5069c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj associated struct _DebugInfo is discarded, and remains invalid 5079c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj forever thereafter. The .handle field is set as soon as this 5089c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj structure is allocated. */ 5099c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj ULong handle; 5109c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj 511b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* Used for debugging only - indicate what stuff to dump whilst 512b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj reading stuff into the seginfo. Are computed as early in the 513b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj lifetime of the DebugInfo as possible -- at the point when it is 514b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj created. Use these when deciding what to spew out; do not use 515b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj the global VG_(clo_blah) flags. */ 516b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 517b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool trace_symtab; /* symbols, our style */ 518b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool trace_cfi; /* dwarf frame unwind, our style */ 519b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool ddump_syms; /* mimic /usr/bin/readelf --syms */ 520b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool ddump_line; /* mimic /usr/bin/readelf --debug-dump=line */ 521b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool ddump_frames; /* mimic /usr/bin/readelf --debug-dump=frames */ 522b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 523a5acac39bf3be7546222b1316faee5ee524be0d1sewardj /* The "decide when it is time to read debuginfo" state machine. 524a5acac39bf3be7546222b1316faee5ee524be0d1sewardj This structure must get filled in before we can start reading 525a5acac39bf3be7546222b1316faee5ee524be0d1sewardj anything from the ELF/MachO file. This structure is filled in 526a5acac39bf3be7546222b1316faee5ee524be0d1sewardj by VG_(di_notify_mmap) and its immediate helpers. */ 527a5acac39bf3be7546222b1316faee5ee524be0d1sewardj struct _DebugInfoFSM fsm; 528a5acac39bf3be7546222b1316faee5ee524be0d1sewardj 529a5acac39bf3be7546222b1316faee5ee524be0d1sewardj /* Once the ::fsm has reached an accept state -- typically, when 530a5acac39bf3be7546222b1316faee5ee524be0d1sewardj both a rw? and r?x mapping for .filename have been observed -- 531a5acac39bf3be7546222b1316faee5ee524be0d1sewardj we can go on to read the symbol tables and debug info. 532a5acac39bf3be7546222b1316faee5ee524be0d1sewardj .have_dinfo changes from False to True when the debug info has 533a5acac39bf3be7546222b1316faee5ee524be0d1sewardj been completely read in and postprocessed (canonicalised) and is 534a5acac39bf3be7546222b1316faee5ee524be0d1sewardj now suitable for querying. */ 535a5acac39bf3be7546222b1316faee5ee524be0d1sewardj /* If have_dinfo is False, then all fields below this point are 536a5acac39bf3be7546222b1316faee5ee524be0d1sewardj invalid and should not be consulted. */ 537b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool have_dinfo; /* initially False */ 538b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 539b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* All the rest of the fields in this structure are filled in once 540b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj we have committed to reading the symbols and debug info (that 541b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj is, at the point where .have_dinfo is set to True). */ 542b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 543f1e1aa691d7a2f0f2f933daf060bec5ae6938705philippe /* The file's soname. */ 5441636d33c13958b9c0e7d3059cdd5005746418eb2florian HChar* soname; 545eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 546b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* Description of some important mapped segments. The presence or 547b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj absence of the mapping is denoted by the _present field, since 548b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj in some obscure circumstances (to do with data/sdata/bss) it is 549b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj possible for the mapping to be present but have zero size. 550b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Certainly text_ is mandatory on all platforms; not sure about 551f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj the rest though. 552f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj 553bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj -------------------------------------------------------- 554bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj 555f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj Comment_on_IMPORTANT_CFSI_REPRESENTATIONAL_INVARIANTS: we require that 556f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj 5576b5625bb609b154766d2e138b61e15655f60b710sewardj either (size of all rx maps == 0 && cfsi == NULL) (the degenerate case) 558f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj 559f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj or the normal case, which is the AND of the following: 5606b5625bb609b154766d2e138b61e15655f60b710sewardj (0) size of at least one rx mapping > 0 5616b5625bb609b154766d2e138b61e15655f60b710sewardj (1) no two DebugInfos with some rx mapping of size > 0 5626b5625bb609b154766d2e138b61e15655f60b710sewardj have overlapping rx mappings 5636b5625bb609b154766d2e138b61e15655f60b710sewardj (2) [cfsi_minavma,cfsi_maxavma] does not extend beyond 5646b5625bb609b154766d2e138b61e15655f60b710sewardj [avma,+size) of one rx mapping; that is, the former 5656b5625bb609b154766d2e138b61e15655f60b710sewardj is a subrange or equal to the latter. 566f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj (3) all DiCfSI in the cfsi array all have ranges that fall within 5676b5625bb609b154766d2e138b61e15655f60b710sewardj [avma,+size) of that rx mapping. 568f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj (4) all DiCfSI in the cfsi array are non-overlapping 569f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj 570f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj The cumulative effect of these restrictions is to ensure that 571f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj all the DiCfSI records in the entire system are non overlapping. 572f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj Hence any address falls into either exactly one DiCfSI record, 573f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj or none. Hence it is safe to cache the results of searches for 574f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj DiCfSI records. This is the whole point of these restrictions. 575f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj The caching of DiCfSI searches is done in VG_(use_CF_info). The 576f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj cache is flushed after any change to debugInfo_list. DiCfSI 577f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj searches are cached because they are central to stack unwinding 578f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj on amd64-linux. 579f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj 580f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj Where are these invariants imposed and checked? 581f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj 582f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj They are checked after a successful read of debuginfo into 583f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj a DebugInfo*, in check_CFSI_related_invariants. 584f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj 585f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj (1) is not really imposed anywhere. We simply assume that the 586f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj kernel will not map the text segments from two different objects 587f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj into the same space. Sounds reasonable. 588f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj 589f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj (2) follows from (4) and (3). It is ensured by canonicaliseCFI. 590f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj (3) is ensured by ML_(addDiCfSI). 591f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj (4) is ensured by canonicaliseCFI. 592bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj 593bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj -------------------------------------------------------- 594bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj 595bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj Comment_on_DEBUG_SVMA_and_DEBUG_BIAS_fields: 596bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj 597bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj The _debug_{svma,bias} fields were added as part of a fix to 598bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj #185816. The problem encompassed in that bug report was that it 599bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj wasn't correct to use apply the bias values deduced for a 600bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj primary object to its associated debuginfo object, because the 601bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj debuginfo object (or the primary) could have been prelinked to a 602bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj different SVMA. Hence debuginfo and primary objects need to 603bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj have their own biases. 604bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj 605bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj ------ JRS: (referring to r9329): ------ 606bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj Let me see if I understand the workings correctly. Initially 607bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj the _debug_ values are set to the same values as the "normal" 608bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj ones, as there's a bunch of bits of code like this (in 609bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj readelf.c) 610bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj 611bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj di->text_svma = svma; 612bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj ... 613bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj di->text_bias = rx_bias; 614bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj di->text_debug_svma = svma; 615bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj di->text_debug_bias = rx_bias; 616bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj 617bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj If a debuginfo object subsequently shows up then the 618bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj _debug_svma/bias are set for the debuginfo object. Result is 619bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj that if there's no debuginfo object then the values are the same 620bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj as the primary-object values, and if there is a debuginfo object 621bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj then they will (or at least may) be different. 622bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj 623bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj Then when we need to actually bias something, we'll have to 624bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj decide whether to use the primary bias or the debuginfo bias. 625bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj And the strategy is to use the primary bias for ELF symbols but 626bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj the debuginfo bias for anything pulled out of Dwarf. 627bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj 628bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj ------ THH: ------ 629bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj Correct - the debug_svma and bias values apply to any address 630bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj read from the debug data regardless of where that debug data is 631bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj stored and the other values are used for addresses from other 632bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj places (primarily the symbol table). 633bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj 634bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj ------ JRS: ------ 635bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj Ok; so this was my only area of concern. Are there any 636bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj corner-case scenarios where this wouldn't be right? It sounds 637bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj like we're assuming the ELF symbols come from the primary object 638bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj and, if there is a debug object, then all the Dwarf comes from 639bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj there. But what if (eg) both symbols and Dwarf come from the 640bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj debug object? Is that even possible or allowable? 641bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj 642bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj ------ THH: ------ 643bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj You may have a point... 644bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj 645bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj The current logic is to try and take any one set of data from 646bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj either the base object or the debug object. There are four sets 647bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj of data we consider: 648bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj 649bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj - Symbol Table 650bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj - Stabs 651bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj - DWARF1 652bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj - DWARF2 653bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj 654bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj If we see the primary section for a given set in the base object 655bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj then we ignore all sections relating to that set in the debug 656bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj object. 657bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj 658bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj Now in principle if we saw a secondary section (like debug_line 659bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj say) in the base object, but not the main section (debug_info in 660bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj this case) then we would take debug_info from the debug object 661bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj but would use the debug_line from the base object unless we saw 662bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj a replacement copy in the debug object. That's probably unlikely 663bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj however. 664bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj 665bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj A bigger issue might be, as you say, the symbol table as we will 666bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj pick that up from the debug object if it isn't in the base. The 667bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj dynamic symbol table will always have to be in the base object 668bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj though so we will have to be careful when processing symbols to 669bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj know which table we are reading in that case. 670bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj 671bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj What we probably need to do is tell read_elf_symtab which object 672bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj the symbols it is being asked to read came from. 673bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj 674bcaa2c8a0a0a30e67bfdfd4a140fb886f382e260sewardj (A followup patch to deal with this was committed in r9469). 675f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj */ 676b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* .text */ 677c4431bfe04c7490ea2d74939d222d87f13f30960njn Bool text_present; 678c4431bfe04c7490ea2d74939d222d87f13f30960njn Addr text_avma; 679c4431bfe04c7490ea2d74939d222d87f13f30960njn Addr text_svma; 680c4431bfe04c7490ea2d74939d222d87f13f30960njn SizeT text_size; 681c4431bfe04c7490ea2d74939d222d87f13f30960njn PtrdiffT text_bias; 682402c9eed11b9b60c6e134d05db938e395466cf99tom Addr text_debug_svma; 683402c9eed11b9b60c6e134d05db938e395466cf99tom PtrdiffT text_debug_bias; 684b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* .data */ 685c4431bfe04c7490ea2d74939d222d87f13f30960njn Bool data_present; 686c4431bfe04c7490ea2d74939d222d87f13f30960njn Addr data_svma; 687c4431bfe04c7490ea2d74939d222d87f13f30960njn Addr data_avma; 688c4431bfe04c7490ea2d74939d222d87f13f30960njn SizeT data_size; 689c4431bfe04c7490ea2d74939d222d87f13f30960njn PtrdiffT data_bias; 690402c9eed11b9b60c6e134d05db938e395466cf99tom Addr data_debug_svma; 691402c9eed11b9b60c6e134d05db938e395466cf99tom PtrdiffT data_debug_bias; 692b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* .sdata */ 693c4431bfe04c7490ea2d74939d222d87f13f30960njn Bool sdata_present; 694c4431bfe04c7490ea2d74939d222d87f13f30960njn Addr sdata_svma; 695c4431bfe04c7490ea2d74939d222d87f13f30960njn Addr sdata_avma; 696c4431bfe04c7490ea2d74939d222d87f13f30960njn SizeT sdata_size; 697c4431bfe04c7490ea2d74939d222d87f13f30960njn PtrdiffT sdata_bias; 698402c9eed11b9b60c6e134d05db938e395466cf99tom Addr sdata_debug_svma; 699402c9eed11b9b60c6e134d05db938e395466cf99tom PtrdiffT sdata_debug_bias; 700160d5a82d2d5d7d0964140dea17751c1daa3315etom /* .rodata */ 701160d5a82d2d5d7d0964140dea17751c1daa3315etom Bool rodata_present; 702160d5a82d2d5d7d0964140dea17751c1daa3315etom Addr rodata_svma; 703160d5a82d2d5d7d0964140dea17751c1daa3315etom Addr rodata_avma; 704160d5a82d2d5d7d0964140dea17751c1daa3315etom SizeT rodata_size; 705160d5a82d2d5d7d0964140dea17751c1daa3315etom PtrdiffT rodata_bias; 706402c9eed11b9b60c6e134d05db938e395466cf99tom Addr rodata_debug_svma; 707402c9eed11b9b60c6e134d05db938e395466cf99tom PtrdiffT rodata_debug_bias; 708b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* .bss */ 709c4431bfe04c7490ea2d74939d222d87f13f30960njn Bool bss_present; 710c4431bfe04c7490ea2d74939d222d87f13f30960njn Addr bss_svma; 711c4431bfe04c7490ea2d74939d222d87f13f30960njn Addr bss_avma; 712c4431bfe04c7490ea2d74939d222d87f13f30960njn SizeT bss_size; 713c4431bfe04c7490ea2d74939d222d87f13f30960njn PtrdiffT bss_bias; 714402c9eed11b9b60c6e134d05db938e395466cf99tom Addr bss_debug_svma; 715402c9eed11b9b60c6e134d05db938e395466cf99tom PtrdiffT bss_debug_bias; 716160d5a82d2d5d7d0964140dea17751c1daa3315etom /* .sbss */ 717160d5a82d2d5d7d0964140dea17751c1daa3315etom Bool sbss_present; 718160d5a82d2d5d7d0964140dea17751c1daa3315etom Addr sbss_svma; 719160d5a82d2d5d7d0964140dea17751c1daa3315etom Addr sbss_avma; 720160d5a82d2d5d7d0964140dea17751c1daa3315etom SizeT sbss_size; 721160d5a82d2d5d7d0964140dea17751c1daa3315etom PtrdiffT sbss_bias; 722402c9eed11b9b60c6e134d05db938e395466cf99tom Addr sbss_debug_svma; 723402c9eed11b9b60c6e134d05db938e395466cf99tom PtrdiffT sbss_debug_bias; 724b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* .plt */ 725b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool plt_present; 726b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr plt_avma; 727b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj SizeT plt_size; 728b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* .got */ 729b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool got_present; 730b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr got_avma; 731b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj SizeT got_size; 732092b6268cc4a38ae9ee41d1e3355937536ddc579bart /* .got.plt */ 733092b6268cc4a38ae9ee41d1e3355937536ddc579bart Bool gotplt_present; 734092b6268cc4a38ae9ee41d1e3355937536ddc579bart Addr gotplt_avma; 735092b6268cc4a38ae9ee41d1e3355937536ddc579bart SizeT gotplt_size; 736b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* .opd -- needed on ppc64-linux for finding symbols */ 737b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool opd_present; 738b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr opd_avma; 739b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj SizeT opd_size; 740452e89a9f847975609b3ad318943830f2cce841csewardj /* .ehframe -- needed on amd64-linux for stack unwinding. We might 741452e89a9f847975609b3ad318943830f2cce841csewardj see more than one, hence the arrays. */ 742452e89a9f847975609b3ad318943830f2cce841csewardj UInt n_ehframe; /* 0 .. N_EHFRAME_SECTS */ 743452e89a9f847975609b3ad318943830f2cce841csewardj Addr ehframe_avma[N_EHFRAME_SECTS]; 744452e89a9f847975609b3ad318943830f2cce841csewardj SizeT ehframe_size[N_EHFRAME_SECTS]; 745b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 746b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* Sorted tables of stuff we snarfed from the file. This is the 747b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj eventual product of reading the debug info. All this stuff 748b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj lives in VG_AR_DINFO. */ 749b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 750eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj /* An expandable array of symbols. */ 751eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj DiSym* symtab; 752b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj UWord symtab_used; 753b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj UWord symtab_size; 754eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj /* An expandable array of locations. */ 755eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj DiLoc* loctab; 756b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj UWord loctab_used; 757b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj UWord loctab_size; 758eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj /* An expandable array of CFI summary info records. Also includes 759eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj summary address bounds, showing the min and max address covered 76072427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj by any of the records, as an aid to fast searching. And, if the 76172427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj records require any expression nodes, they are stored in 76272427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj cfsi_exprs. */ 763eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj DiCfSI* cfsi; 764f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj UWord cfsi_used; 765f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj UWord cfsi_size; 766b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr cfsi_minavma; 767b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr cfsi_maxavma; 768b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj XArray* cfsi_exprs; /* XArray of CfiExpr */ 769eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 770c8259b85b701d25d72aabe9dc0a8154517f96913sewardj /* Optimized code under Wine x86: MSVC++ PDB FramePointerOmitted 771c8259b85b701d25d72aabe9dc0a8154517f96913sewardj data. Non-expandable array, hence .size == .used. */ 772c8259b85b701d25d72aabe9dc0a8154517f96913sewardj FPO_DATA* fpo; 773c8259b85b701d25d72aabe9dc0a8154517f96913sewardj UWord fpo_size; 774c8259b85b701d25d72aabe9dc0a8154517f96913sewardj Addr fpo_minavma; 775c8259b85b701d25d72aabe9dc0a8154517f96913sewardj Addr fpo_maxavma; 77654c45db2f978055aeca91aaccb05aac825523e6csewardj Addr fpo_base_avma; 777c8259b85b701d25d72aabe9dc0a8154517f96913sewardj 778eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj /* Expandable arrays of characters -- the string table. Pointers 779eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj into this are stable (the arrays are not reallocated). */ 780eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj struct strchunk { 781eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj UInt strtab_used; 782b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj struct strchunk* next; 7831636d33c13958b9c0e7d3059cdd5005746418eb2florian HChar strtab[SEGINFO_STRCHUNKSIZE]; 784eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj } *strchunks; 785eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 786b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj /* Variable scope information, as harvested from Dwarf3 files. 787eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 788b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj In short it's an 789f767d967b9ef331dcd7d0cd4584f6570cd829333sewardj 790b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj array of (array of PC address ranges and variables) 791b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 792b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj The outer array indexes over scopes, with Entry 0 containing 793b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj information on variables which exist for any value of the program 794b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj counter (PC) -- that is, the outermost scope. Entries 1, 2, 3, 795b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj etc contain information on increasinly deeply nested variables. 796b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 797b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Each inner array is an array of (an address range, and a set 798b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj of variables that are in scope over that address range). 799b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 800b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj The address ranges may not overlap. 801b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 802b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Since Entry 0 in the outer array holds information on variables 803b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj that exist for any value of the PC (that is, global vars), it 804b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj follows that Entry 0's inner array can only have one address 805b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj range pair, one that covers the entire address space. 806b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj */ 807b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj XArray* /* of OSet of DiAddrRange */varinfo; 808b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 8099c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj /* These are arrays of the relevant typed objects, held here 8109c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj partially for the purposes of visiting each object exactly once 811b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj when we need to delete them. */ 812b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 8139c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj /* An array of TyEnts. These are needed to make sense of any types 8149c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj in the .varinfo. Also, when deleting this DebugInfo, we must 8159c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj first traverse this array and throw away malloc'd stuff hanging 8169c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj off it -- by calling ML_(TyEnt__make_EMPTY) on each entry. */ 8179c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj XArray* /* of TyEnt */ admin_tyents; 818b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 8199c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj /* An array of guarded DWARF3 expressions. */ 8209c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj XArray* admin_gexprs; 8216b5625bb609b154766d2e138b61e15655f60b710sewardj 8226b5625bb609b154766d2e138b61e15655f60b710sewardj /* Cached last rx mapping matched and returned by ML_(find_rx_mapping). 8236b5625bb609b154766d2e138b61e15655f60b710sewardj This helps performance a lot during ML_(addLineInfo) etc., which can 8246b5625bb609b154766d2e138b61e15655f60b710sewardj easily be invoked hundreds of thousands of times. */ 8256b5625bb609b154766d2e138b61e15655f60b710sewardj struct _DebugInfoMapping* last_rx_map; 826eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj}; 827eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 828eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* --------------------- functions --------------------- */ 829eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 830eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* ------ Adding ------ */ 831eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 832a5cace0c2a3e212931badbf6398a0cd98393121asewardj/* Add a symbol to si's symbol table. The contents of 'sym' are 833a5cace0c2a3e212931badbf6398a0cd98393121asewardj copied. It is assumed (and checked) that 'sym' only contains one 834a5cace0c2a3e212931badbf6398a0cd98393121asewardj name, so there is no auxiliary ::sec_names vector to duplicate. 835a5cace0c2a3e212931badbf6398a0cd98393121asewardj IOW, the copy is a shallow copy, and there are assertions in place 836a5cace0c2a3e212931badbf6398a0cd98393121asewardj to ensure that's OK. */ 837b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern void ML_(addSym) ( struct _DebugInfo* di, DiSym* sym ); 838eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 839b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* Add a line-number record to a DebugInfo. */ 840eadcd86d1b0f59efed44c162ef4378ccfb528290sewardjextern 841b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjvoid ML_(addLineInfo) ( struct _DebugInfo* di, 8421636d33c13958b9c0e7d3059cdd5005746418eb2florian const HChar* filename, 8431636d33c13958b9c0e7d3059cdd5005746418eb2florian const HChar* dirname, /* NULL is allowable */ 844eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj Addr this, Addr next, Int lineno, Int entry); 845eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 846eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Add a CFI summary record. The supplied DiCfSI is copied. */ 847b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern void ML_(addDiCfSI) ( struct _DebugInfo* di, DiCfSI* cfsi ); 848eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 849b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* Add a string to the string table of a DebugInfo. If len==-1, 850eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj ML_(addStr) will itself measure the length of the string. */ 8516bd9dc18c043927c1196caba20a327238a179c42florianextern HChar* ML_(addStr) ( struct _DebugInfo* di, const HChar* str, Int len ); 852b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 8535d616dfbb8439dfd51a40ddf1dba970938baa1ebsewardj/* Add a string to the string table of a DebugInfo, by copying the 8545d616dfbb8439dfd51a40ddf1dba970938baa1ebsewardj string from the given DiCursor. Measures the length of the string 8555d616dfbb8439dfd51a40ddf1dba970938baa1ebsewardj itself. */ 8565d616dfbb8439dfd51a40ddf1dba970938baa1ebsewardjextern HChar* ML_(addStrFromCursor)( struct _DebugInfo* di, DiCursor c ); 857b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 858b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern void ML_(addVar)( struct _DebugInfo* di, 859b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Int level, 860b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr aMin, 861b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Addr aMax, 8621636d33c13958b9c0e7d3059cdd5005746418eb2florian HChar* name, 8639c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj UWord typeR, /* a cuOff */ 864b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj GExpr* gexpr, 865b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj GExpr* fbGX, /* SHARED. */ 8661636d33c13958b9c0e7d3059cdd5005746418eb2florian HChar* fileName, /* where decl'd - may be NULL */ 867b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Int lineNo, /* where decl'd - may be zero */ 868b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj Bool show ); 869b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj 870b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* Canonicalise the tables held by 'di', in preparation for use. Call 871eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj this after finishing adding entries to these tables. */ 872b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern void ML_(canonicaliseTables) ( struct _DebugInfo* di ); 873eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 8743c9cf3442185b5891e15450d6e3058aeff6796fetom/* Canonicalise the call-frame-info table held by 'di', in preparation 8753c9cf3442185b5891e15450d6e3058aeff6796fetom for use. This is called by ML_(canonicaliseTables) but can also be 8763c9cf3442185b5891e15450d6e3058aeff6796fetom called on it's own to sort just this table. */ 8773c9cf3442185b5891e15450d6e3058aeff6796fetomextern void ML_(canonicaliseCFI) ( struct _DebugInfo* di ); 8783c9cf3442185b5891e15450d6e3058aeff6796fetom 879eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* ------ Searching ------ */ 880eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 881eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Find a symbol-table index containing the specified pointer, or -1 882eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj if not found. Binary search. */ 883f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardjextern Word ML_(search_one_symtab) ( struct _DebugInfo* di, Addr ptr, 884f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj Bool match_anywhere_in_sym, 885f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj Bool findText ); 886eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 887eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Find a location-table index containing the specified pointer, or -1 888eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj if not found. Binary search. */ 889f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardjextern Word ML_(search_one_loctab) ( struct _DebugInfo* di, Addr ptr ); 890eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 891eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Find a CFI-table index containing the specified pointer, or -1 if 892eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj not found. Binary search. */ 893f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardjextern Word ML_(search_one_cfitab) ( struct _DebugInfo* di, Addr ptr ); 894eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 895c8259b85b701d25d72aabe9dc0a8154517f96913sewardj/* Find a FPO-table index containing the specified pointer, or -1 896c8259b85b701d25d72aabe9dc0a8154517f96913sewardj if not found. Binary search. */ 897c8259b85b701d25d72aabe9dc0a8154517f96913sewardjextern Word ML_(search_one_fpotab) ( struct _DebugInfo* di, Addr ptr ); 898c8259b85b701d25d72aabe9dc0a8154517f96913sewardj 899db3f3e6e7bde198592d44642a0da2613a89a8eb5sewardj/* Helper function for the most often needed searching for an rx 900db3f3e6e7bde198592d44642a0da2613a89a8eb5sewardj mapping containing the specified address range. The range must 901db3f3e6e7bde198592d44642a0da2613a89a8eb5sewardj fall entirely within the mapping to be considered to be within it. 902db3f3e6e7bde198592d44642a0da2613a89a8eb5sewardj Asserts if lo > hi; caller must ensure this doesn't happen. */ 9036b5625bb609b154766d2e138b61e15655f60b710sewardjextern struct _DebugInfoMapping* ML_(find_rx_mapping) ( struct _DebugInfo* di, 9046b5625bb609b154766d2e138b61e15655f60b710sewardj Addr lo, Addr hi ); 9056b5625bb609b154766d2e138b61e15655f60b710sewardj 906eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* ------ Misc ------ */ 907eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 908eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Show a non-fatal debug info reading error. Use vg_panic if 909b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj terminal. 'serious' errors are always shown, not 'serious' ones 910b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj are shown only at verbosity level 2 and above. */ 911b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern 9126bd9dc18c043927c1196caba20a327238a179c42florianvoid ML_(symerr) ( struct _DebugInfo* di, Bool serious, const HChar* msg ); 913eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 914eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Print a symbol. */ 915eadcd86d1b0f59efed44c162ef4378ccfb528290sewardjextern void ML_(ppSym) ( Int idx, DiSym* sym ); 916eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 917eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Print a call-frame-info summary. */ 91872427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjextern void ML_(ppDiCfSI) ( XArray* /* of CfiExpr */ exprs, DiCfSI* si ); 919eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 920eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 9215d616dfbb8439dfd51a40ddf1dba970938baa1ebsewardj#define TRACE_SYMTAB_ENABLED (di->trace_symtab) 922eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#define TRACE_SYMTAB(format, args...) \ 9235d616dfbb8439dfd51a40ddf1dba970938baa1ebsewardj if (TRACE_SYMTAB_ENABLED) { VG_(printf)(format, ## args); } 924eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 925eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 926eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#endif /* ndef __PRIV_STORAGE_H */ 927eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj 928eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/*--------------------------------------------------------------------*/ 929eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/*--- end ---*/ 930eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/*--------------------------------------------------------------------*/ 931