priv_storage.h revision 160d5a82d2d5d7d0964140dea17751c1daa3315e
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 */
352c4431bfe04c7490ea2d74939d222d87f13f30960njn   Bool     text_present;
353c4431bfe04c7490ea2d74939d222d87f13f30960njn   Addr     text_avma;
354c4431bfe04c7490ea2d74939d222d87f13f30960njn   Addr     text_svma;
355c4431bfe04c7490ea2d74939d222d87f13f30960njn   SizeT    text_size;
356c4431bfe04c7490ea2d74939d222d87f13f30960njn   PtrdiffT text_bias;
357b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* .data */
358c4431bfe04c7490ea2d74939d222d87f13f30960njn   Bool     data_present;
359c4431bfe04c7490ea2d74939d222d87f13f30960njn   Addr     data_svma;
360c4431bfe04c7490ea2d74939d222d87f13f30960njn   Addr     data_avma;
361c4431bfe04c7490ea2d74939d222d87f13f30960njn   SizeT    data_size;
362c4431bfe04c7490ea2d74939d222d87f13f30960njn   PtrdiffT data_bias;
363b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* .sdata */
364c4431bfe04c7490ea2d74939d222d87f13f30960njn   Bool     sdata_present;
365c4431bfe04c7490ea2d74939d222d87f13f30960njn   Addr     sdata_svma;
366c4431bfe04c7490ea2d74939d222d87f13f30960njn   Addr     sdata_avma;
367c4431bfe04c7490ea2d74939d222d87f13f30960njn   SizeT    sdata_size;
368c4431bfe04c7490ea2d74939d222d87f13f30960njn   PtrdiffT sdata_bias;
369160d5a82d2d5d7d0964140dea17751c1daa3315etom   /* .rodata */
370160d5a82d2d5d7d0964140dea17751c1daa3315etom   Bool     rodata_present;
371160d5a82d2d5d7d0964140dea17751c1daa3315etom   Addr     rodata_svma;
372160d5a82d2d5d7d0964140dea17751c1daa3315etom   Addr     rodata_avma;
373160d5a82d2d5d7d0964140dea17751c1daa3315etom   SizeT    rodata_size;
374160d5a82d2d5d7d0964140dea17751c1daa3315etom   PtrdiffT rodata_bias;
375b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* .bss */
376c4431bfe04c7490ea2d74939d222d87f13f30960njn   Bool     bss_present;
377c4431bfe04c7490ea2d74939d222d87f13f30960njn   Addr     bss_svma;
378c4431bfe04c7490ea2d74939d222d87f13f30960njn   Addr     bss_avma;
379c4431bfe04c7490ea2d74939d222d87f13f30960njn   SizeT    bss_size;
380c4431bfe04c7490ea2d74939d222d87f13f30960njn   PtrdiffT bss_bias;
381160d5a82d2d5d7d0964140dea17751c1daa3315etom   /* .sbss */
382160d5a82d2d5d7d0964140dea17751c1daa3315etom   Bool     sbss_present;
383160d5a82d2d5d7d0964140dea17751c1daa3315etom   Addr     sbss_svma;
384160d5a82d2d5d7d0964140dea17751c1daa3315etom   Addr     sbss_avma;
385160d5a82d2d5d7d0964140dea17751c1daa3315etom   SizeT    sbss_size;
386160d5a82d2d5d7d0964140dea17751c1daa3315etom   PtrdiffT sbss_bias;
387b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* .plt */
388b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Bool   plt_present;
389b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Addr	  plt_avma;
390b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   SizeT  plt_size;
391b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* .got */
392b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Bool   got_present;
393b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Addr   got_avma;
394b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   SizeT  got_size;
395092b6268cc4a38ae9ee41d1e3355937536ddc579bart   /* .got.plt */
396092b6268cc4a38ae9ee41d1e3355937536ddc579bart   Bool   gotplt_present;
397092b6268cc4a38ae9ee41d1e3355937536ddc579bart   Addr   gotplt_avma;
398092b6268cc4a38ae9ee41d1e3355937536ddc579bart   SizeT  gotplt_size;
399b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* .opd -- needed on ppc64-linux for finding symbols */
400b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Bool   opd_present;
401b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Addr   opd_avma;
402b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   SizeT  opd_size;
403b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* .ehframe -- needed on amd64-linux for stack unwinding */
404b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Bool   ehframe_present;
405b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Addr   ehframe_avma;
406b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   SizeT  ehframe_size;
407b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
408b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* Sorted tables of stuff we snarfed from the file.  This is the
409b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      eventual product of reading the debug info.  All this stuff
410b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      lives in VG_AR_DINFO. */
411b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
412eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   /* An expandable array of symbols. */
413eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   DiSym*  symtab;
414b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   UWord   symtab_used;
415b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   UWord   symtab_size;
416eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   /* An expandable array of locations. */
417eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   DiLoc*  loctab;
418b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   UWord   loctab_used;
419b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   UWord   loctab_size;
420eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   /* An expandable array of CFI summary info records.  Also includes
421eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj      summary address bounds, showing the min and max address covered
42272427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj      by any of the records, as an aid to fast searching.  And, if the
42372427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj      records require any expression nodes, they are stored in
42472427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardj      cfsi_exprs. */
425eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   DiCfSI* cfsi;
426f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj   UWord   cfsi_used;
427f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj   UWord   cfsi_size;
428b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Addr    cfsi_minavma;
429b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   Addr    cfsi_maxavma;
430b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   XArray* cfsi_exprs; /* XArray of CfiExpr */
431eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
432eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   /* Expandable arrays of characters -- the string table.  Pointers
433eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj      into this are stable (the arrays are not reallocated). */
434eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   struct strchunk {
435eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj      UInt   strtab_used;
436b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      struct strchunk* next;
437eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj      UChar  strtab[SEGINFO_STRCHUNKSIZE];
438eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   } *strchunks;
439eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
440b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   /* Variable scope information, as harvested from Dwarf3 files.
441eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
442b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      In short it's an
443f767d967b9ef331dcd7d0cd4584f6570cd829333sewardj
444b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj         array of (array of PC address ranges and variables)
445b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
446b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      The outer array indexes over scopes, with Entry 0 containing
447b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      information on variables which exist for any value of the program
448b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      counter (PC) -- that is, the outermost scope.  Entries 1, 2, 3,
449b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      etc contain information on increasinly deeply nested variables.
450b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
451b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      Each inner array is an array of (an address range, and a set
452b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      of variables that are in scope over that address range).
453b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
454b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      The address ranges may not overlap.
455b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
456b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      Since Entry 0 in the outer array holds information on variables
457b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      that exist for any value of the PC (that is, global vars), it
458b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      follows that Entry 0's inner array can only have one address
459b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      range pair, one that covers the entire address space.
460b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   */
461b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   XArray* /* of OSet of DiAddrRange */varinfo;
462b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
4639c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj   /* These are arrays of the relevant typed objects, held here
4649c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj      partially for the purposes of visiting each object exactly once
465b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj      when we need to delete them. */
466b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
4679c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj   /* An array of TyEnts.  These are needed to make sense of any types
4689c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj      in the .varinfo.  Also, when deleting this DebugInfo, we must
4699c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj      first traverse this array and throw away malloc'd stuff hanging
4709c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj      off it -- by calling ML_(TyEnt__make_EMPTY) on each entry. */
4719c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj   XArray* /* of TyEnt */ admin_tyents;
472b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
4739c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj   /* An array of guarded DWARF3 expressions. */
4749c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj   XArray* admin_gexprs;
475eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj};
476eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
477eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* --------------------- functions --------------------- */
478eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
479eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* ------ Adding ------ */
480eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
481eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Add a symbol to si's symbol table. */
482b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern void ML_(addSym) ( struct _DebugInfo* di, DiSym* sym );
483eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
484b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* Add a line-number record to a DebugInfo. */
485eadcd86d1b0f59efed44c162ef4378ccfb528290sewardjextern
486b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjvoid ML_(addLineInfo) ( struct _DebugInfo* di,
487eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj                        UChar*   filename,
488eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj                        UChar*   dirname,  /* NULL is allowable */
489eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj                        Addr this, Addr next, Int lineno, Int entry);
490eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
491eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Add a CFI summary record.  The supplied DiCfSI is copied. */
492b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern void ML_(addDiCfSI) ( struct _DebugInfo* di, DiCfSI* cfsi );
493eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
494b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* Add a string to the string table of a DebugInfo.  If len==-1,
495eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   ML_(addStr) will itself measure the length of the string. */
496b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern UChar* ML_(addStr) ( struct _DebugInfo* di, UChar* str, Int len );
497b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
498b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern void ML_(addVar)( struct _DebugInfo* di,
499b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj                         Int    level,
500b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj                         Addr   aMin,
501b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj                         Addr   aMax,
502b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj                         UChar* name,
5039c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj                         UWord  typeR, /* a cuOff */
504b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj                         GExpr* gexpr,
505b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj                         GExpr* fbGX, /* SHARED. */
506b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj                         UChar* fileName, /* where decl'd - may be NULL */
507b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj                         Int    lineNo, /* where decl'd - may be zero */
508b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj                         Bool   show );
509b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj
510b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj/* Canonicalise the tables held by 'di', in preparation for use.  Call
511eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   this after finishing adding entries to these tables. */
512b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern void ML_(canonicaliseTables) ( struct _DebugInfo* di );
513eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
514eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* ------ Searching ------ */
515eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
516eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Find a symbol-table index containing the specified pointer, or -1
517eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   if not found.  Binary search.  */
518f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardjextern Word ML_(search_one_symtab) ( struct _DebugInfo* di, Addr ptr,
519f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj                                     Bool match_anywhere_in_sym,
520f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardj                                     Bool findText );
521eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
522eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Find a location-table index containing the specified pointer, or -1
523eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   if not found.  Binary search.  */
524f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardjextern Word ML_(search_one_loctab) ( struct _DebugInfo* di, Addr ptr );
525eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
526eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Find a CFI-table index containing the specified pointer, or -1 if
527eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj   not found.  Binary search.  */
528f98e1c03ce4bea1fb092cdea5571c41f29f6df9bsewardjextern Word ML_(search_one_cfitab) ( struct _DebugInfo* di, Addr ptr );
529eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
530eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* ------ Misc ------ */
531eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
532eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Show a non-fatal debug info reading error.  Use vg_panic if
533b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   terminal.  'serious' errors are always shown, not 'serious' ones
534b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   are shown only at verbosity level 2 and above. */
535b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjextern
536b8b79addf04dd5d0b558916e26df0b1927cbd758sewardjvoid ML_(symerr) ( struct _DebugInfo* di, Bool serious, HChar* msg );
537eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
538eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Print a symbol. */
539eadcd86d1b0f59efed44c162ef4378ccfb528290sewardjextern void ML_(ppSym) ( Int idx, DiSym* sym );
540eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
541eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/* Print a call-frame-info summary. */
54272427fa91a5e05e3323b5a8a407bd8d7b04c75ccsewardjextern void ML_(ppDiCfSI) ( XArray* /* of CfiExpr */ exprs, DiCfSI* si );
543eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
544eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
545eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#define TRACE_SYMTAB(format, args...) \
546b8b79addf04dd5d0b558916e26df0b1927cbd758sewardj   if (di->trace_symtab) { VG_(printf)(format, ## args); }
547eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
548eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
549eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj#endif /* ndef __PRIV_STORAGE_H */
550eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj
551eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/*--------------------------------------------------------------------*/
552eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/*--- end                                                          ---*/
553eadcd86d1b0f59efed44c162ef4378ccfb528290sewardj/*--------------------------------------------------------------------*/
554