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