Home | History | Annotate | Download | only in m_debuginfo
      1 
      2 /*--------------------------------------------------------------------*/
      3 /*--- Representation of source level types.         priv_tytypes.h ---*/
      4 /*--------------------------------------------------------------------*/
      5 
      6 /*
      7    This file is part of Valgrind, a dynamic binary instrumentation
      8    framework.
      9 
     10    Copyright (C) 2008-2017 OpenWorks LLP
     11       info (at) open-works.co.uk
     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    Neither the names of the U.S. Department of Energy nor the
     31    University of California nor the names of its contributors may be
     32    used to endorse or promote products derived from this software
     33    without prior written permission.
     34 */
     35 
     36 #ifndef __PRIV_TYTYPES_H
     37 #define __PRIV_TYTYPES_H
     38 
     39 #include "pub_core_basics.h"   // UWord
     40 #include "pub_core_xarray.h"   // XArray
     41 #include "priv_misc.h"         // MaybeULong
     42 
     43 typedef
     44    enum {
     45       Te_EMPTY=10, /* empty (contains no info) */
     46       Te_INDIR,    /* indirection to some other TyEnt */
     47       Te_UNKNOWN,  /* denotes a unknown type/field/whatever */
     48       Te_Atom,     /* name & 64-bit const, iow, enumeration member */
     49       Te_Field,    /* struct/class field defn */
     50       Te_Bound,    /* array bounds indication, for one dimension */
     51       Te_TyBase,   /* base type */
     52       Te_TyPtr,    /* pointer type */
     53       Te_TyRef,    /* reference type */
     54       Te_TyPtrMbr, /* pointer to member type */
     55       Te_TyRvalRef,/* rvalue reference type */
     56       Te_TyTyDef,  /* a renaming of some other type */
     57       Te_TyStOrUn, /* structure or union type */
     58       Te_TyEnum,   /* an enum type */
     59       Te_TyArray,  /* an array type */
     60       Te_TyFn,     /* function type */
     61       Te_TyQual,   /* qualified type */
     62       Te_TyVoid    /* void type */
     63    }
     64    TyEntTag;
     65 
     66 /* Fields ending in "R" are references to other TyEnts.  Fields ending
     67    in "Rs" are XArray*s of references to other TyEnts. */
     68 typedef
     69    struct {
     70       UWord    cuOff;
     71       TyEntTag tag;
     72       union {
     73          struct {
     74          } EMPTY;
     75          struct {
     76             UWord indR;
     77          } INDIR;
     78          struct {
     79          } UNKNOWN;
     80          struct {
     81             HChar* name; /* in mallocville */
     82             Bool   valueKnown; /* atoms w/ unknown value are possible */
     83             Long   value;
     84          } Atom;
     85          struct {
     86             HChar* name;  /* in mallocville */
     87             UWord  typeR; /* should be Te_TyXXXX */
     88             union {
     89                UChar* loc;   /* location expr, in mallocville */
     90                Word offset;  /* or offset from the beginning of containing
     91                                 entity */
     92             } pos;
     93             Word  nLoc;  /* number of bytes in .pos.loc if >= 0, or -1
     94                             if .pos.offset should be used instead */
     95             Bool   isStruct;
     96          } Field;
     97          struct {
     98             Bool knownL;
     99             Bool knownU;
    100             Long boundL;
    101             Long boundU;
    102          } Bound;
    103          struct {
    104             HChar* name; /* in mallocville */
    105             Int    szB;
    106             UChar  enc; /* S:signed U:unsigned F:floating C:complex float */
    107          } TyBase;
    108          struct {
    109             Int   szB;
    110             UWord typeR;
    111          } TyPorR;
    112          struct {
    113             HChar* name;  /* in mallocville */
    114             UWord  typeR; /* MAY BE D3_INVALID_CUOFF, denoting unknown */
    115          } TyTyDef;
    116          struct {
    117             HChar*  name; /* in mallocville */
    118             UWord   szB;
    119             UWord   typeR;
    120             XArray* /* of UWord */ fieldRs;
    121             Bool    complete;
    122             Bool    isStruct;
    123          } TyStOrUn;
    124          struct {
    125             HChar*  name; /* in mallocville */
    126             Int     szB;
    127             XArray* /* of UWord */ atomRs;
    128          } TyEnum;
    129          struct {
    130             UWord   typeR;
    131             XArray* /* of UWord */ boundRs;
    132          } TyArray;
    133          struct {
    134          } TyFn;
    135          struct {
    136             UChar qual; /* C:const V:volatile R:restrict */
    137             UWord typeR;
    138          } TyQual;
    139          struct {
    140             Bool isFake; /* True == introduced by the reader */
    141          } TyVoid;
    142       } Te;
    143    }
    144    TyEnt;
    145 
    146 /* Does this TyEnt denote a type, as opposed to some other kind of
    147    thing? */
    148 Bool ML_(TyEnt__is_type)( const TyEnt* );
    149 
    150 /* Print a TyEnt, debug-style. */
    151 void ML_(pp_TyEnt)( const TyEnt* );
    152 
    153 /* Print a whole XArray of TyEnts, debug-style */
    154 void ML_(pp_TyEnts)( const XArray* tyents, const HChar* who );
    155 
    156 /* Print a TyEnt, C style, chasing stuff as necessary. */
    157 void ML_(pp_TyEnt_C_ishly)( const XArray* /* of TyEnt */ tyents,
    158                             UWord cuOff );
    159 
    160 /* Generates a total ordering on TyEnts based only on their .cuOff
    161    fields. */
    162 Word ML_(TyEnt__cmp_by_cuOff_only) ( const TyEnt* te1, const TyEnt* te2 );
    163 
    164 /* Generates a total ordering on TyEnts based on everything except
    165    their .cuOff fields. */
    166 Word ML_(TyEnt__cmp_by_all_except_cuOff) ( const TyEnt* te1, const TyEnt* te2 );
    167 
    168 /* Free up all directly or indirectly heap-allocated stuff attached to
    169    this TyEnt, and set its tag to Te_EMPTY.  The .cuOff field is
    170    unchanged. */
    171 void ML_(TyEnt__make_EMPTY) ( TyEnt* te );
    172 
    173 /* How big is this type?  If .b in the returned struct is False, the
    174    size is unknown. */
    175 
    176 MaybeULong ML_(sizeOfType)( const XArray* /* of TyEnt */ tyents,
    177                             UWord cuOff );
    178 
    179 /* Describe where in the type 'offset' falls.  Caller must
    180    deallocate the resulting XArray. */
    181 XArray* /*UChar*/ ML_(describe_type)( /*OUT*/PtrdiffT* residual_offset,
    182                                       const XArray* /* of TyEnt */ tyents,
    183                                       UWord ty_cuOff,
    184                                       PtrdiffT offset );
    185 
    186 
    187 /* A fast-lookup cache for ML_(TyEnts__index_by_cuOff).  Nothing
    188    particularly surprising here; it's 2 way set associative, with some
    189    number of ways, doesn't particularly have to be a power of 2.  In
    190    order to have a way to indicate an invalid entry, we set the second
    191    value of the pair to NULL, and keep checking for it, since
    192    unfortunately there's no obvious cuOff number that we could put in
    193    the first word of the pair that could indicate an invalid entry.
    194 
    195    4096 arrived at as the best value for an E6600 loading Qt-4.4.1
    196    Designer and all associated libraries, compiled by gcc-4.3.1,
    197    -g -O, 64-bit, which is at least a moderately good stress test,
    198    with the largest library being about 150MB.*/
    199 
    200 #define N_TYENT_INDEX_CACHE 4096
    201 
    202 typedef
    203    struct {
    204       struct { UWord cuOff0; TyEnt* ent0;
    205                UWord cuOff1; TyEnt* ent1; }
    206          ce[N_TYENT_INDEX_CACHE];
    207    }
    208    TyEntIndexCache;
    209 
    210 void ML_(TyEntIndexCache__invalidate) ( TyEntIndexCache* cache );
    211 
    212 /* 'ents' is an XArray of TyEnts, sorted by their .cuOff fields.  Find
    213    the entry which has .cuOff field as specified.  Returns NULL if not
    214    found.  Asserts if more than one entry has the specified .cuOff
    215    value. */
    216 TyEnt* ML_(TyEnts__index_by_cuOff) ( const XArray* /* of TyEnt */ ents,
    217                                      TyEntIndexCache* cache,
    218                                      UWord cuOff_to_find );
    219 
    220 #endif /* ndef __PRIV_TYTYPES_H */
    221 
    222 /*--------------------------------------------------------------------*/
    223 /*--- end                                           priv_tytypes.h ---*/
    224 /*--------------------------------------------------------------------*/
    225