priv_storage.h revision 092b6268cc4a38ae9ee41d1e3355937536ddc579
1eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
2eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/*--------------------------------------------------------------------*/
3eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/*--- Format-neutral storage of and querying of info acquired from ---*/
4eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/*--- ELF/XCOFF stabs/dwarf1/dwarf2 debug info.                    ---*/
5eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/*---                                               priv_storage.h ---*/
6eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/*--------------------------------------------------------------------*/
7eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
8eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/*
9eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   This file is part of Valgrind, a dynamic binary instrumentation
10eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   framework.
11eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
124d474d086188fd1f29fa97dbd84d8ea2e589a9b8sewardj   Copyright (C) 2000-2008 Julian Seward
13eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj      jseward@acm.org
14eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
15eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   This program is free software; you can redistribute it and/or
16eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   modify it under the terms of the GNU General Public License as
17eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   published by the Free Software Foundation; either version 2 of the
18eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   License, or (at your option) any later version.
19eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
20eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   This program is distributed in the hope that it will be useful, but
21eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   WITHOUT ANY WARRANTY; without even the implied warranty of
22eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
23eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   General Public License for more details.
24eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
25eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   You should have received a copy of the GNU General Public License
26eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   along with this program; if not, write to the Free Software
27eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
28eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   02111-1307, USA.
29eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
30eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   The GNU General Public License is contained in the file COPYING.
31eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj*/
32eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/*
33eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   Stabs reader greatly improved by Nick Nethercote, Apr 02.
34eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   This module was also extensively hacked on by Jeremy Fitzhardinge
35eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   and Tom Hughes.
36eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj*/
37c6d3f6f0aec8607dded979fd15a9876a486ec682sewardj/* See comment at top of debuginfo.c for explanation of
38c6d3f6f0aec8607dded979fd15a9876a486ec682sewardj   the _svma / _avma / _image / _bias naming scheme.
39c6d3f6f0aec8607dded979fd15a9876a486ec682sewardj*/
40b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* Note this is not freestanding; needs pub_core_xarray.h and
41b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   priv_tytypes.h to be included before it. */
42eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
43eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#ifndef __PRIV_STORAGE_H
44eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#define __PRIV_STORAGE_H
45eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
46eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* --------------------- SYMBOLS --------------------- */
47eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
48eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* A structure to hold an ELF/XCOFF symbol (very crudely). */
49eadcd86d1b0f59efed44c162ef4378ccfb528290sewardjtypedef
50eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   struct {
51eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj      Addr  addr;   /* lowest address of entity */
52eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj      Addr  tocptr; /* ppc64-linux only: value that R2 should have */
53eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj      UChar *name;  /* name */
54b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      UInt  size;   /* size in bytes */
55b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      Bool  isText;
56eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   }
57eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   DiSym;
58eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
59eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* --------------------- SRCLOCS --------------------- */
60eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
61eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Line count at which overflow happens, due to line numbers being
62eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   stored as shorts in `struct nlist' in a.out.h. */
63eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#define LINENO_OVERFLOW (1 << (sizeof(short) * 8))
64eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
65eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#define LINENO_BITS     20
66eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#define LOC_SIZE_BITS  (32 - LINENO_BITS)
67eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#define MAX_LINENO     ((1 << LINENO_BITS) - 1)
68eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
69eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Unlikely to have any lines with instruction ranges > 4096 bytes */
70eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#define MAX_LOC_SIZE   ((1 << LOC_SIZE_BITS) - 1)
71eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
72eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Number used to detect line number overflows; if one line is
73b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   60000-odd smaller than the previous, it was probably an overflow.
74eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj */
75eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#define OVERFLOW_DIFFERENCE     (LINENO_OVERFLOW - 5000)
76eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
77eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* A structure to hold addr-to-source info for a single line.  There
78eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj  can be a lot of these, hence the dense packing. */
79eadcd86d1b0f59efed44c162ef4378ccfb528290sewardjtypedef
80eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   struct {
81eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj      /* Word 1 */
82eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj      Addr   addr;               /* lowest address for this line */
83eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj      /* Word 2 */
84eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj      UShort size:LOC_SIZE_BITS; /* # bytes; we catch overflows of this */
85eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj      UInt   lineno:LINENO_BITS; /* source line number, or zero */
86eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj      /* Word 3 */
87eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj      UChar*  filename;          /* source filename */
88eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj      /* Word 4 */
89eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj      UChar*  dirname;           /* source directory name */
90eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   }
91eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   DiLoc;
92eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
93eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* --------------------- CF INFO --------------------- */
94eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
95eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* A structure to summarise DWARF2/3 CFA info for the code address
96eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   range [base .. base+len-1].  In short, if you know (sp,fp,ip) at
97eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   some point and ip is in the range [base .. base+len-1], it tells
98eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   you how to calculate (sp,fp) for the caller of the current frame
99eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   and also ra, the return address of the current frame.
100eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
101eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   First off, calculate CFA, the Canonical Frame Address, thusly:
102eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
10372427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj     cfa = case cfa_how of
10472427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj              CFIC_SPREL -> sp + cfa_off
10572427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj              CFIC_FPREL -> fp + cfa_off
10672427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj              CFIR_EXPR  -> expr whose index is in cfa_off
107eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
108eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   Once that is done, the previous frame's sp/fp values and this
109eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   frame's ra value can be calculated like this:
110eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
111eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj      old_sp/fp/ra
112eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj         = case sp/fp/ra_how of
113eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj              CFIR_UNKNOWN   -> we don't know, sorry
114eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj              CFIR_SAME      -> same as it was before (sp/fp only)
115eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj              CFIR_CFAREL    -> cfa + sp/fp/ra_off
116eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj              CFIR_MEMCFAREL -> *( cfa + sp/fp/ra_off )
11772427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj              CFIR_EXPR      -> expr whose index is in sp/fp/ra_off
118eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj*/
119eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
12072427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj#define CFIC_SPREL     ((UChar)1)
12172427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj#define CFIC_FPREL     ((UChar)2)
12272427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj#define CFIC_EXPR      ((UChar)3)
12372427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj
12472427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj#define CFIR_UNKNOWN   ((UChar)4)
12572427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj#define CFIR_SAME      ((UChar)5)
12672427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj#define CFIR_CFAREL    ((UChar)6)
12772427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj#define CFIR_MEMCFAREL ((UChar)7)
12872427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj#define CFIR_EXPR      ((UChar)8)
129eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
130eadcd86d1b0f59efed44c162ef4378ccfb528290sewardjtypedef
131eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   struct {
132eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj      Addr  base;
133eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj      UInt  len;
13472427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj      UChar cfa_how; /* a CFIC_ value */
13572427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj      UChar ra_how;  /* a CFIR_ value */
13672427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj      UChar sp_how;  /* a CFIR_ value */
13772427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj      UChar fp_how;  /* a CFIR_ value */
138eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj      Int   cfa_off;
139eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj      Int   ra_off;
140eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj      Int   sp_off;
141eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj      Int   fp_off;
142eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   }
143eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   DiCfSI;
144eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
14572427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj
14672427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjtypedef
14772427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj   enum {
14872427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj      Cop_Add=0x321,
14972427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj      Cop_Sub,
1507888e2204fff6e7429236b4227ed16594e7743b9sewardj      Cop_And,
1517888e2204fff6e7429236b4227ed16594e7743b9sewardj      Cop_Mul
15272427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj   }
15372427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj   CfiOp;
15472427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj
15572427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjtypedef
15672427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj   enum {
15772427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj      Creg_SP=0x213,
15872427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj      Creg_FP,
15972427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj      Creg_IP
16072427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj   }
16172427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj   CfiReg;
16272427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj
16372427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjtypedef
16472427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj   enum {
16572427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj      Cex_Undef=0x123,
16672427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj      Cex_Deref,
16772427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj      Cex_Const,
16872427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj      Cex_Binop,
16972427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj      Cex_CfiReg,
17072427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj      Cex_DwReg
17172427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj   }
17272427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj   CfiExprTag;
17372427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj
17472427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjtypedef
17572427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj   struct {
17672427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj      CfiExprTag tag;
17772427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj      union {
17872427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj         struct {
17972427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj         } Undef;
18072427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj         struct {
18172427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj            Int ixAddr;
18272427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj         } Deref;
18372427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj         struct {
18472427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj            UWord con;
18572427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj         } Const;
18672427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj         struct {
18772427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj            CfiOp op;
18872427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj            Int ixL;
18972427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj            Int ixR;
19072427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj         } Binop;
19172427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj         struct {
19272427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj            CfiReg reg;
19372427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj         } CfiReg;
19472427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj         struct {
19572427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj            Int reg;
19672427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj         } DwReg;
19772427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj      }
19872427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj      Cex;
19972427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj   }
20072427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj   CfiExpr;
20172427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj
20272427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjextern Int ML_(CfiExpr_Undef) ( XArray* dst );
20372427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjextern Int ML_(CfiExpr_Deref) ( XArray* dst, Int ixAddr );
20472427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjextern Int ML_(CfiExpr_Const) ( XArray* dst, UWord con );
20572427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjextern Int ML_(CfiExpr_Binop) ( XArray* dst, CfiOp op, Int ixL, Int ixR );
20672427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjextern Int ML_(CfiExpr_CfiReg)( XArray* dst, CfiReg reg );
20772427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjextern Int ML_(CfiExpr_DwReg) ( XArray* dst, Int reg );
20872427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj
20972427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjextern void ML_(ppCfiExpr)( XArray* src, Int ix );
21072427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj
211b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* --------------------- VARIABLES --------------------- */
212b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
213b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjtypedef
214b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   struct {
215b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      Addr    aMin;
216b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      Addr    aMax;
217b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      XArray* /* of DiVariable */ vars;
218b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   }
219b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   DiAddrRange;
220b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
221b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjtypedef
222b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   struct {
223b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      UChar* name;  /* in DebugInfo.strchunks */
224b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      Type*  type;  /* on DebugInfo.admin list */
225b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      GExpr* gexpr; /* on DebugInfo.gexprs list */
226b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      GExpr* fbGX;  /* SHARED. */
227b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      UChar* fileName; /* where declared; may be NULL. in
228b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj                          DebugInfo.strchunks */
229b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      Int    lineNo;   /* where declared; may be zero. */
230b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   }
231b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   DiVariable;
232b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
233b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjWord
234b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjML_(cmp_for_DiAddrRange_range) ( const void* keyV, const void* elemV );
235b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
236b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* --------------------- DEBUGINFO --------------------- */
237eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
238eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* This is the top-level data type.  It's a structure which contains
239b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   information pertaining to one mapped ELF object.  This type is
240eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   exported only abstractly - in pub_tool_debuginfo.h. */
241eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
242eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#define SEGINFO_STRCHUNKSIZE (64*1024)
243eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
244b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjstruct _DebugInfo {
245b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
246b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* Admin stuff */
247b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
248b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   struct _DebugInfo* next;   /* list of DebugInfos */
249b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Bool               mark;   /* marked for deletion? */
250b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
251b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* Used for debugging only - indicate what stuff to dump whilst
252b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      reading stuff into the seginfo.  Are computed as early in the
253b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      lifetime of the DebugInfo as possible -- at the point when it is
254b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      created.  Use these when deciding what to spew out; do not use
255b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      the global VG_(clo_blah) flags. */
256b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
257b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Bool trace_symtab; /* symbols, our style */
258b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Bool trace_cfi;    /* dwarf frame unwind, our style */
259b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Bool ddump_syms;   /* mimic /usr/bin/readelf --syms */
260b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Bool ddump_line;   /* mimic /usr/bin/readelf --debug-dump=line */
261b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Bool ddump_frames; /* mimic /usr/bin/readelf --debug-dump=frames */
262b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
263b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* Fields that must be filled in before we can start reading
264b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      anything from the ELF file.  These fields are filled in by
265b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      VG_(di_notify_mmap) and its immediate helpers. */
266eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
267b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   UChar* filename; /* in mallocville (VG_AR_DINFO) */
268b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   UChar* memname;  /* also in VG_AR_DINFO.  AIX5 only: .a member name */
269b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
270b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Bool  have_rx_map; /* did we see a r?x mapping yet for the file? */
271b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Bool  have_rw_map; /* did we see a rw? mapping yet for the file? */
272b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
273b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Addr  rx_map_avma; /* these fields record the file offset, length */
274b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   SizeT rx_map_size; /* and map address of the r?x mapping we believe */
275b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   OffT  rx_map_foff; /* is the .text segment mapping */
276b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
277b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Addr  rw_map_avma; /* ditto, for the rw? mapping we believe is the */
278b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   SizeT rw_map_size; /* .data segment mapping */
279b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   OffT  rw_map_foff;
280b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
281b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* Once both a rw? and r?x mapping for .filename have been
282b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      observed, we can go on to read the symbol tables and debug info.
283b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      .have_dinfo flags when that has happened. */
284b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* If have_dinfo is False, then all fields except "*rx_map*" and
285b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      "*rw_map*" are invalid and should not be consulted. */
286b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Bool  have_dinfo; /* initially False */
287b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
288b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* All the rest of the fields in this structure are filled in once
289b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      we have committed to reading the symbols and debug info (that
290b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      is, at the point where .have_dinfo is set to True). */
291b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
292b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* The file's soname.  FIXME: ensure this is always allocated in
293b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      VG_AR_DINFO. */
294eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   UChar* soname;
295eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
296b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* Description of some important mapped segments.  The presence or
297b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      absence of the mapping is denoted by the _present field, since
298b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      in some obscure circumstances (to do with data/sdata/bss) it is
299b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      possible for the mapping to be present but have zero size.
300b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      Certainly text_ is mandatory on all platforms; not sure about
301b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      the rest though. */
302b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* .text */
303b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Bool   text_present;
304b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Addr   text_avma;
305b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Addr   text_svma;
306b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   SizeT  text_size;
307b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   OffT   text_bias;
308b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* .data */
309b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Bool   data_present;
310b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Addr   data_svma;
311b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Addr   data_avma;
312b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   SizeT  data_size;
313b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   OffT   data_bias;
314b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* .sdata */
315b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Bool   sdata_present;
316b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Addr   sdata_svma;
317b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Addr   sdata_avma;
318b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   SizeT  sdata_size;
319b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   OffT   sdata_bias;
320b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* .bss */
321b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Bool   bss_present;
322b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Addr   bss_svma;
323b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Addr   bss_avma;
324b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   SizeT  bss_size;
325b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   OffT   bss_bias;
326b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* .plt */
327b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Bool   plt_present;
328b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Addr	  plt_avma;
329b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   SizeT  plt_size;
330b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* .got */
331b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Bool   got_present;
332b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Addr   got_avma;
333b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   SizeT  got_size;
334092b6268cc4a38ae9ee41d1e3355937536ddc579bart   /* .got.plt */
335092b6268cc4a38ae9ee41d1e3355937536ddc579bart   Bool   gotplt_present;
336092b6268cc4a38ae9ee41d1e3355937536ddc579bart   Addr   gotplt_avma;
337092b6268cc4a38ae9ee41d1e3355937536ddc579bart   SizeT  gotplt_size;
338b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* .opd -- needed on ppc64-linux for finding symbols */
339b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Bool   opd_present;
340b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Addr   opd_avma;
341b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   SizeT  opd_size;
342b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* .ehframe -- needed on amd64-linux for stack unwinding */
343b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Bool   ehframe_present;
344b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Addr   ehframe_avma;
345b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   SizeT  ehframe_size;
346b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
347b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* Sorted tables of stuff we snarfed from the file.  This is the
348b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      eventual product of reading the debug info.  All this stuff
349b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      lives in VG_AR_DINFO. */
350b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
351eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   /* An expandable array of symbols. */
352eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   DiSym*  symtab;
353b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   UWord   symtab_used;
354b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   UWord   symtab_size;
355eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   /* An expandable array of locations. */
356eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   DiLoc*  loctab;
357b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   UWord   loctab_used;
358b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   UWord   loctab_size;
359eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   /* An expandable array of CFI summary info records.  Also includes
360eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj      summary address bounds, showing the min and max address covered
36172427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj      by any of the records, as an aid to fast searching.  And, if the
36272427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj      records require any expression nodes, they are stored in
36372427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj      cfsi_exprs. */
364eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   DiCfSI* cfsi;
365eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   UInt    cfsi_used;
366eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   UInt    cfsi_size;
367b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Addr    cfsi_minavma;
368b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Addr    cfsi_maxavma;
369b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   XArray* cfsi_exprs; /* XArray of CfiExpr */
370eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
371eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   /* Expandable arrays of characters -- the string table.  Pointers
372eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj      into this are stable (the arrays are not reallocated). */
373eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   struct strchunk {
374eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj      UInt   strtab_used;
375b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      struct strchunk* next;
376eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj      UChar  strtab[SEGINFO_STRCHUNKSIZE];
377eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   } *strchunks;
378eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
379b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* Variable scope information, as harvested from Dwarf3 files.
380eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
381b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      In short it's an
382f767d967b9ef331dcd7d0cd4584f6570cd829333sewardj
383b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj         array of (array of PC address ranges and variables)
384b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
385b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      The outer array indexes over scopes, with Entry 0 containing
386b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      information on variables which exist for any value of the program
387b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      counter (PC) -- that is, the outermost scope.  Entries 1, 2, 3,
388b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      etc contain information on increasinly deeply nested variables.
389b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
390b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      Each inner array is an array of (an address range, and a set
391b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      of variables that are in scope over that address range).
392b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
393b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      The address ranges may not overlap.
394b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
395b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      Since Entry 0 in the outer array holds information on variables
396b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      that exist for any value of the PC (that is, global vars), it
397b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      follows that Entry 0's inner array can only have one address
398b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      range pair, one that covers the entire address space.
399b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   */
400b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   XArray* /* of OSet of DiAddrRange */varinfo;
401b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
402b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* These are lists of the relevant typed objects, held here
403b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      expressly for the purposes of visiting each object exactly once
404b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      when we need to delete them. */
405b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
406b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* A list of TyAdmin structs, and the payloads that they refer
407b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      to. */
408b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   TyAdmin* admin_tyadmins;
409b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
410b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* A list of guarded DWARF3 expressions. */
411b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   GExpr*   admin_gexprs;
412eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj};
413eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
414eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* --------------------- functions --------------------- */
415eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
416eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* ------ Adding ------ */
417eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
418eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Add a symbol to si's symbol table. */
419b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern void ML_(addSym) ( struct _DebugInfo* di, DiSym* sym );
420eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
421b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* Add a line-number record to a DebugInfo. */
422eadcd86d1b0f59efed44c162ef4378ccfb528290sewardjextern
423b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjvoid ML_(addLineInfo) ( struct _DebugInfo* di,
424eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj                        UChar*   filename,
425eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj                        UChar*   dirname,  /* NULL is allowable */
426eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj                        Addr this, Addr next, Int lineno, Int entry);
427eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
428eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Add a CFI summary record.  The supplied DiCfSI is copied. */
429b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern void ML_(addDiCfSI) ( struct _DebugInfo* di, DiCfSI* cfsi );
430eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
431b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* Add a string to the string table of a DebugInfo.  If len==-1,
432eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   ML_(addStr) will itself measure the length of the string. */
433b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern UChar* ML_(addStr) ( struct _DebugInfo* di, UChar* str, Int len );
434b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
435b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern void ML_(addVar)( struct _DebugInfo* di,
436b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj                         Int    level,
437b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj                         Addr   aMin,
438b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj                         Addr   aMax,
439b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj                         UChar* name,
440b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj                         Type*  type,
441b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj                         GExpr* gexpr,
442b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj                         GExpr* fbGX, /* SHARED. */
443b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj                         UChar* fileName, /* where decl'd - may be NULL */
444b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj                         Int    lineNo, /* where decl'd - may be zero */
445b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj                         Bool   show );
446b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
447b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* Canonicalise the tables held by 'di', in preparation for use.  Call
448eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   this after finishing adding entries to these tables. */
449b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern void ML_(canonicaliseTables) ( struct _DebugInfo* di );
450eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
451eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* ------ Searching ------ */
452eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
453eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Find a symbol-table index containing the specified pointer, or -1
454eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   if not found.  Binary search.  */
455b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern Int ML_(search_one_symtab) ( struct _DebugInfo* di, Addr ptr,
456b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj                                    Bool match_anywhere_in_sym,
457b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj                                    Bool findText );
458eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
459eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Find a location-table index containing the specified pointer, or -1
460eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   if not found.  Binary search.  */
461b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern Int ML_(search_one_loctab) ( struct _DebugInfo* di, Addr ptr );
462eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
463eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Find a CFI-table index containing the specified pointer, or -1 if
464eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   not found.  Binary search.  */
465b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern Int ML_(search_one_cfitab) ( struct _DebugInfo* di, Addr ptr );
466eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
467eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* ------ Misc ------ */
468eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
469eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Show a non-fatal debug info reading error.  Use vg_panic if
470b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   terminal.  'serious' errors are always shown, not 'serious' ones
471b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   are shown only at verbosity level 2 and above. */
472b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern
473b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjvoid ML_(symerr) ( struct _DebugInfo* di, Bool serious, HChar* msg );
474eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
475eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Print a symbol. */
476eadcd86d1b0f59efed44c162ef4378ccfb528290sewardjextern void ML_(ppSym) ( Int idx, DiSym* sym );
477eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
478eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Print a call-frame-info summary. */
47972427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjextern void ML_(ppDiCfSI) ( XArray* /* of CfiExpr */ exprs, DiCfSI* si );
480eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
481eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
482eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#define TRACE_SYMTAB(format, args...) \
483b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   if (di->trace_symtab) { VG_(printf)(format, ## args); }
484eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
485eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
486eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#endif /* ndef __PRIV_STORAGE_H */
487eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
488eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/*--------------------------------------------------------------------*/
489eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/*--- end                                                          ---*/
490eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/*--------------------------------------------------------------------*/
491