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