priv_storage.h revision f98e1c03ce4bea1fb092cdea5571c41f29f6df9b
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 */
2249c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj      UWord  typeR; /* a cuOff */
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
2519c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj   /* An abstract handle, which can be used by entities outside of
2529c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj      m_debuginfo to (in an abstract datatype sense) refer to this
2539c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj      struct _DebugInfo.  A .handle of zero is invalid; valid handles
2549c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj      are 1 and above.  The same handle is never issued twice (in any
2559c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj      given run of Valgrind), so a handle becomes invalid when the
2569c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj      associated struct _DebugInfo is discarded, and remains invalid
2579c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj      forever thereafter.  The .handle field is set as soon as this
2589c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj      structure is allocated. */
2599c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj   ULong handle;
2609c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj
261b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* Used for debugging only - indicate what stuff to dump whilst
262b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      reading stuff into the seginfo.  Are computed as early in the
263b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      lifetime of the DebugInfo as possible -- at the point when it is
264b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      created.  Use these when deciding what to spew out; do not use
265b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      the global VG_(clo_blah) flags. */
266b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
267b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Bool trace_symtab; /* symbols, our style */
268b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Bool trace_cfi;    /* dwarf frame unwind, our style */
269b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Bool ddump_syms;   /* mimic /usr/bin/readelf --syms */
270b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Bool ddump_line;   /* mimic /usr/bin/readelf --debug-dump=line */
271b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Bool ddump_frames; /* mimic /usr/bin/readelf --debug-dump=frames */
272b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
273b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* Fields that must be filled in before we can start reading
274b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      anything from the ELF file.  These fields are filled in by
275b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      VG_(di_notify_mmap) and its immediate helpers. */
276eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
277b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   UChar* filename; /* in mallocville (VG_AR_DINFO) */
278b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   UChar* memname;  /* also in VG_AR_DINFO.  AIX5 only: .a member name */
279b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
280b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Bool  have_rx_map; /* did we see a r?x mapping yet for the file? */
281b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Bool  have_rw_map; /* did we see a rw? mapping yet for the file? */
282b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
283b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Addr  rx_map_avma; /* these fields record the file offset, length */
284b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   SizeT rx_map_size; /* and map address of the r?x mapping we believe */
285b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   OffT  rx_map_foff; /* is the .text segment mapping */
286b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
287b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Addr  rw_map_avma; /* ditto, for the rw? mapping we believe is the */
288b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   SizeT rw_map_size; /* .data segment mapping */
289b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   OffT  rw_map_foff;
290b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
291b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* Once both a rw? and r?x mapping for .filename have been
292b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      observed, we can go on to read the symbol tables and debug info.
293b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      .have_dinfo flags when that has happened. */
294b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* If have_dinfo is False, then all fields except "*rx_map*" and
295b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      "*rw_map*" are invalid and should not be consulted. */
296b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Bool  have_dinfo; /* initially False */
297b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
298b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* All the rest of the fields in this structure are filled in once
299b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      we have committed to reading the symbols and debug info (that
300b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      is, at the point where .have_dinfo is set to True). */
301b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
302b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* The file's soname.  FIXME: ensure this is always allocated in
303b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      VG_AR_DINFO. */
304eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   UChar* soname;
305eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
306b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* Description of some important mapped segments.  The presence or
307b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      absence of the mapping is denoted by the _present field, since
308b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      in some obscure circumstances (to do with data/sdata/bss) it is
309b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      possible for the mapping to be present but have zero size.
310b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      Certainly text_ is mandatory on all platforms; not sure about
311f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj      the rest though.
312f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj
313f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj      Comment_on_IMPORTANT_CFSI_REPRESENTATIONAL_INVARIANTS: we require that
314f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj
315f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj      either (rx_map_size == 0 && cfsi == NULL) (the degenerate case)
316f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj
317f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj      or the normal case, which is the AND of the following:
318f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj      (0) rx_map_size > 0
319f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj      (1) no two DebugInfos with rx_map_size > 0
320f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj          have overlapping [rx_map_avma,+rx_map_size)
321f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj      (2) [cfsi_minavma,cfsi_maxavma] does not extend
322f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj          beyond [rx_map_avma,+rx_map_size); that is, the former is a
323f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj          subrange or equal to the latter.
324f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj      (3) all DiCfSI in the cfsi array all have ranges that fall within
325f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj          [rx_map_avma,+rx_map_size).
326f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj      (4) all DiCfSI in the cfsi array are non-overlapping
327f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj
328f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj      The cumulative effect of these restrictions is to ensure that
329f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj      all the DiCfSI records in the entire system are non overlapping.
330f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj      Hence any address falls into either exactly one DiCfSI record,
331f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj      or none.  Hence it is safe to cache the results of searches for
332f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj      DiCfSI records.  This is the whole point of these restrictions.
333f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj      The caching of DiCfSI searches is done in VG_(use_CF_info).  The
334f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj      cache is flushed after any change to debugInfo_list.  DiCfSI
335f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj      searches are cached because they are central to stack unwinding
336f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj      on amd64-linux.
337f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj
338f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj      Where are these invariants imposed and checked?
339f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj
340f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj      They are checked after a successful read of debuginfo into
341f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj      a DebugInfo*, in check_CFSI_related_invariants.
342f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj
343f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj      (1) is not really imposed anywhere.  We simply assume that the
344f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj      kernel will not map the text segments from two different objects
345f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj      into the same space.  Sounds reasonable.
346f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj
347f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj      (2) follows from (4) and (3).  It is ensured by canonicaliseCFI.
348f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj      (3) is ensured by ML_(addDiCfSI).
349f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj      (4) is ensured by canonicaliseCFI.
350f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj   */
351b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* .text */
352b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Bool   text_present;
353b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Addr   text_avma;
354b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Addr   text_svma;
355b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   SizeT  text_size;
356b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   OffT   text_bias;
357b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* .data */
358b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Bool   data_present;
359b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Addr   data_svma;
360b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Addr   data_avma;
361b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   SizeT  data_size;
362b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   OffT   data_bias;
363b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* .sdata */
364b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Bool   sdata_present;
365b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Addr   sdata_svma;
366b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Addr   sdata_avma;
367b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   SizeT  sdata_size;
368b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   OffT   sdata_bias;
369b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* .bss */
370b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Bool   bss_present;
371b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Addr   bss_svma;
372b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Addr   bss_avma;
373b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   SizeT  bss_size;
374b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   OffT   bss_bias;
375b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* .plt */
376b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Bool   plt_present;
377b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Addr	  plt_avma;
378b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   SizeT  plt_size;
379b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* .got */
380b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Bool   got_present;
381b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Addr   got_avma;
382b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   SizeT  got_size;
383092b6268cc4a38ae9ee41d1e3355937536ddc579bart   /* .got.plt */
384092b6268cc4a38ae9ee41d1e3355937536ddc579bart   Bool   gotplt_present;
385092b6268cc4a38ae9ee41d1e3355937536ddc579bart   Addr   gotplt_avma;
386092b6268cc4a38ae9ee41d1e3355937536ddc579bart   SizeT  gotplt_size;
387b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* .opd -- needed on ppc64-linux for finding symbols */
388b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Bool   opd_present;
389b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Addr   opd_avma;
390b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   SizeT  opd_size;
391b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* .ehframe -- needed on amd64-linux for stack unwinding */
392b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Bool   ehframe_present;
393b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Addr   ehframe_avma;
394b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   SizeT  ehframe_size;
395b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
396b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* Sorted tables of stuff we snarfed from the file.  This is the
397b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      eventual product of reading the debug info.  All this stuff
398b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      lives in VG_AR_DINFO. */
399b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
400eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   /* An expandable array of symbols. */
401eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   DiSym*  symtab;
402b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   UWord   symtab_used;
403b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   UWord   symtab_size;
404eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   /* An expandable array of locations. */
405eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   DiLoc*  loctab;
406b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   UWord   loctab_used;
407b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   UWord   loctab_size;
408eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   /* An expandable array of CFI summary info records.  Also includes
409eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj      summary address bounds, showing the min and max address covered
41072427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj      by any of the records, as an aid to fast searching.  And, if the
41172427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj      records require any expression nodes, they are stored in
41272427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj      cfsi_exprs. */
413eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   DiCfSI* cfsi;
414f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj   UWord   cfsi_used;
415f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj   UWord   cfsi_size;
416b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Addr    cfsi_minavma;
417b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Addr    cfsi_maxavma;
418b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   XArray* cfsi_exprs; /* XArray of CfiExpr */
419eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
420eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   /* Expandable arrays of characters -- the string table.  Pointers
421eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj      into this are stable (the arrays are not reallocated). */
422eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   struct strchunk {
423eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj      UInt   strtab_used;
424b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      struct strchunk* next;
425eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj      UChar  strtab[SEGINFO_STRCHUNKSIZE];
426eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   } *strchunks;
427eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
428b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* Variable scope information, as harvested from Dwarf3 files.
429eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
430b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      In short it's an
431f767d967b9ef331dcd7d0cd4584f6570cd829333sewardj
432b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj         array of (array of PC address ranges and variables)
433b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
434b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      The outer array indexes over scopes, with Entry 0 containing
435b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      information on variables which exist for any value of the program
436b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      counter (PC) -- that is, the outermost scope.  Entries 1, 2, 3,
437b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      etc contain information on increasinly deeply nested variables.
438b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
439b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      Each inner array is an array of (an address range, and a set
440b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      of variables that are in scope over that address range).
441b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
442b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      The address ranges may not overlap.
443b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
444b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      Since Entry 0 in the outer array holds information on variables
445b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      that exist for any value of the PC (that is, global vars), it
446b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      follows that Entry 0's inner array can only have one address
447b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      range pair, one that covers the entire address space.
448b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   */
449b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   XArray* /* of OSet of DiAddrRange */varinfo;
450b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
4519c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj   /* These are arrays of the relevant typed objects, held here
4529c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj      partially for the purposes of visiting each object exactly once
453b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      when we need to delete them. */
454b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
4559c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj   /* An array of TyEnts.  These are needed to make sense of any types
4569c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj      in the .varinfo.  Also, when deleting this DebugInfo, we must
4579c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj      first traverse this array and throw away malloc'd stuff hanging
4589c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj      off it -- by calling ML_(TyEnt__make_EMPTY) on each entry. */
4599c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj   XArray* /* of TyEnt */ admin_tyents;
460b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
4619c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj   /* An array of guarded DWARF3 expressions. */
4629c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj   XArray* admin_gexprs;
463eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj};
464eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
465eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* --------------------- functions --------------------- */
466eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
467eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* ------ Adding ------ */
468eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
469eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Add a symbol to si's symbol table. */
470b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern void ML_(addSym) ( struct _DebugInfo* di, DiSym* sym );
471eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
472b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* Add a line-number record to a DebugInfo. */
473eadcd86d1b0f59efed44c162ef4378ccfb528290sewardjextern
474b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjvoid ML_(addLineInfo) ( struct _DebugInfo* di,
475eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj                        UChar*   filename,
476eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj                        UChar*   dirname,  /* NULL is allowable */
477eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj                        Addr this, Addr next, Int lineno, Int entry);
478eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
479eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Add a CFI summary record.  The supplied DiCfSI is copied. */
480b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern void ML_(addDiCfSI) ( struct _DebugInfo* di, DiCfSI* cfsi );
481eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
482b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* Add a string to the string table of a DebugInfo.  If len==-1,
483eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   ML_(addStr) will itself measure the length of the string. */
484b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern UChar* ML_(addStr) ( struct _DebugInfo* di, UChar* str, Int len );
485b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
486b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern void ML_(addVar)( struct _DebugInfo* di,
487b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj                         Int    level,
488b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj                         Addr   aMin,
489b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj                         Addr   aMax,
490b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj                         UChar* name,
4919c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj                         UWord  typeR, /* a cuOff */
492b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj                         GExpr* gexpr,
493b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj                         GExpr* fbGX, /* SHARED. */
494b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj                         UChar* fileName, /* where decl'd - may be NULL */
495b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj                         Int    lineNo, /* where decl'd - may be zero */
496b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj                         Bool   show );
497b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
498b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* Canonicalise the tables held by 'di', in preparation for use.  Call
499eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   this after finishing adding entries to these tables. */
500b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern void ML_(canonicaliseTables) ( struct _DebugInfo* di );
501eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
502eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* ------ Searching ------ */
503eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
504eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Find a symbol-table index containing the specified pointer, or -1
505eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   if not found.  Binary search.  */
506f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardjextern Word ML_(search_one_symtab) ( struct _DebugInfo* di, Addr ptr,
507f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj                                     Bool match_anywhere_in_sym,
508f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj                                     Bool findText );
509eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
510eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Find a location-table index containing the specified pointer, or -1
511eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   if not found.  Binary search.  */
512f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardjextern Word ML_(search_one_loctab) ( struct _DebugInfo* di, Addr ptr );
513eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
514eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Find a CFI-table index containing the specified pointer, or -1 if
515eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   not found.  Binary search.  */
516f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardjextern Word ML_(search_one_cfitab) ( struct _DebugInfo* di, Addr ptr );
517eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
518eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* ------ Misc ------ */
519eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
520eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Show a non-fatal debug info reading error.  Use vg_panic if
521b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   terminal.  'serious' errors are always shown, not 'serious' ones
522b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   are shown only at verbosity level 2 and above. */
523b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern
524b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjvoid ML_(symerr) ( struct _DebugInfo* di, Bool serious, HChar* msg );
525eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
526eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Print a symbol. */
527eadcd86d1b0f59efed44c162ef4378ccfb528290sewardjextern void ML_(ppSym) ( Int idx, DiSym* sym );
528eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
529eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Print a call-frame-info summary. */
53072427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjextern void ML_(ppDiCfSI) ( XArray* /* of CfiExpr */ exprs, DiCfSI* si );
531eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
532eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
533eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#define TRACE_SYMTAB(format, args...) \
534b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   if (di->trace_symtab) { VG_(printf)(format, ## args); }
535eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
536eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
537eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#endif /* ndef __PRIV_STORAGE_H */
538eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
539eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/*--------------------------------------------------------------------*/
540eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/*--- end                                                          ---*/
541eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/*--------------------------------------------------------------------*/
542