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