• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 /*--------------------------------------------------------------------*/
3 /*--- Obtaining information about an address.  pub_tool_addrinfo.h ---*/
4 /*--------------------------------------------------------------------*/
5 
6 /*
7    This file is part of Valgrind, a dynamic binary instrumentation
8    framework.
9 
10    Copyright (C) 2000-2013 Julian Seward
11       jseward@acm.org
12 
13    This program is free software; you can redistribute it and/or
14    modify it under the terms of the GNU General Public License as
15    published by the Free Software Foundation; either version 2 of the
16    License, or (at your option) any later version.
17 
18    This program is distributed in the hope that it will be useful, but
19    WITHOUT ANY WARRANTY; without even the implied warranty of
20    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21    General Public License for more details.
22 
23    You should have received a copy of the GNU General Public License
24    along with this program; if not, write to the Free Software
25    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
26    02111-1307, USA.
27 
28    The GNU General Public License is contained in the file COPYING.
29 */
30 
31 #ifndef __PUB_TOOL_ADDRINFO_H
32 #define __PUB_TOOL_ADDRINFO_H
33 
34 #include "pub_tool_basics.h"   // VG_ macro
35 
36 /*====================================================================*/
37 /*=== Obtaining information about an address                       ===*/
38 /*====================================================================*/
39 
40 // Different kinds of blocks.
41 // Block_Mallocd is used by tools that maintain detailed information about
42 //   Client allocated heap blocks.
43 // Block_Freed is used by tools such as memcheck that maintain a 'quarantine'
44 //   list of blocks freed by the Client but not yet physically freed.
45 // Block_MempoolChunk and Block_UserG are used for mempool or user defined heap
46 //   blocks.
47 // Block_ClientArenaMallocd and Block_ClientArenaFree are used when the tool
48 //   replaces the malloc/free/... functions but does not maintain detailed
49 //   information about Client allocated heap blocks.
50 // Block_ValgrindArenaMallocd and Block_ValgrindArenaFree are used for heap
51 //   blocks of Valgrind internal heap.
52 typedef enum {
53    Block_Mallocd = 111,
54    Block_Freed,
55    Block_MempoolChunk,
56    Block_UserG,
57    Block_ClientArenaMallocd,
58    Block_ClientArenaFree,
59    Block_ValgrindArenaMallocd,
60    Block_ValgrindArenaFree,
61 } BlockKind;
62 
63 /* ------------------ Addresses -------------------- */
64 
65 /* The classification of a faulting address. */
66 typedef
67    enum {
68       Addr_Undescribed, // as-yet unclassified
69       Addr_Unknown,     // classification yielded nothing useful
70       Addr_Block,       // in malloc'd/free'd block
71       Addr_Stack,       // on a thread's stack
72       Addr_DataSym,     // in a global data sym
73       Addr_Variable,    // variable described by the debug info
74       Addr_SectKind     // last-ditch classification attempt
75    }
76    AddrTag;
77 
78 typedef
79    struct _AddrInfo
80    AddrInfo;
81 
82 struct _AddrInfo {
83    AddrTag tag;
84    union {
85       // As-yet unclassified.
86       struct { } Undescribed;
87 
88       // On a stack.
89       struct {
90          ThreadId tid;        // Which thread's stack?
91       } Stack;
92 
93       // This covers heap blocks (normal and from mempools), user-defined
94       // blocks and Arena blocks.
95       struct {
96          BlockKind   block_kind;
97          const HChar* block_desc;   // "block","mempool","user-defined",arena
98          SizeT       block_szB;
99          PtrdiffT    rwoffset;
100          ExeContext* allocated_at;  // might be null_ExeContext.
101          ExeContext* freed_at;      // might be null_ExeContext.
102       } Block;
103 
104       // In a global .data symbol.  This holds the first 127 chars of
105       // the variable's name (zero terminated), plus a (memory) offset.
106       struct {
107          HChar    name[128];
108          PtrdiffT offset;
109       } DataSym;
110 
111       // Is described by Dwarf debug info.  XArray*s of HChar.
112       struct {
113          XArray* /* of HChar */ descr1;
114          XArray* /* of HChar */ descr2;
115       } Variable;
116 
117       // Could only narrow it down to be the PLT/GOT/etc of a given
118       // object.  Better than nothing, perhaps.
119       struct {
120          HChar      objname[128];
121          VgSectKind kind;
122       } SectKind;
123 
124       // Classification yielded nothing useful.
125       struct { } Unknown;
126 
127    } Addr;
128 };
129 
130 
131 /* Describe an address as best you can, putting the result in ai.
132    On entry, ai->tag must be equal to Addr_Undescribed.
133    This might allocate some memory, that can be cleared with
134    VG_(clear_addrinfo). */
135 extern void VG_(describe_addr) ( Addr a, /*OUT*/AddrInfo* ai );
136 
137 extern void VG_(clear_addrinfo) ( AddrInfo* ai);
138 
139 /* Prints the AddrInfo ai describing a. */
140 extern void VG_(pp_addrinfo) ( Addr a, AddrInfo* ai );
141 
142 /* Same as VG_(pp_addrinfo) but provides some memcheck specific behaviour:
143    * maybe_gcc indicates Addr a was just below the stack ptr when the error
144      with a was encountered.
145    * the message for Unknown tag is slightly different, as memcheck
146      has a recently freed list. */
147 extern void VG_(pp_addrinfo_mc) ( Addr a, AddrInfo* ai, Bool maybe_gcc );
148 
149 #endif   // __PUB_TOOL_ADDRINFO_H
150 
151 /*--------------------------------------------------------------------*/
152 /*--- end                                                          ---*/
153 /*--------------------------------------------------------------------*/
154