Home | History | Annotate | Download | only in include
      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 (at) 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