priv_tytypes.h revision 436e89c602e787e7a27dd6624b09beed41a0da8a
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-2013 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#include "pub_core_basics.h" // UWord 40#include "pub_core_xarray.h" // XArray 41#include "priv_misc.h" // MaybeULong 42 43typedef 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. */ 68typedef 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 XArray* /* of UWord */ fieldRs; 120 Bool complete; 121 Bool isStruct; 122 } TyStOrUn; 123 struct { 124 HChar* name; /* in mallocville */ 125 Int szB; 126 XArray* /* of UWord */ atomRs; 127 } TyEnum; 128 struct { 129 UWord typeR; 130 XArray* /* of UWord */ boundRs; 131 } TyArray; 132 struct { 133 } TyFn; 134 struct { 135 UChar qual; /* C:const V:volatile */ 136 UWord typeR; 137 } TyQual; 138 struct { 139 Bool isFake; /* True == introduced by the reader */ 140 } TyVoid; 141 } Te; 142 } 143 TyEnt; 144 145/* Does this TyEnt denote a type, as opposed to some other kind of 146 thing? */ 147Bool ML_(TyEnt__is_type)( TyEnt* ); 148 149/* Print a TyEnt, debug-style. */ 150void ML_(pp_TyEnt)( TyEnt* ); 151 152/* Print a whole XArray of TyEnts, debug-style */ 153void ML_(pp_TyEnts)( XArray* tyents, const HChar* who ); 154 155/* Print a TyEnt, C style, chasing stuff as necessary. */ 156void ML_(pp_TyEnt_C_ishly)( XArray* /* of TyEnt */ tyents, 157 UWord cuOff ); 158 159/* Generates a total ordering on TyEnts based only on their .cuOff 160 fields. */ 161Word ML_(TyEnt__cmp_by_cuOff_only) ( const TyEnt* te1, const TyEnt* te2 ); 162 163/* Generates a total ordering on TyEnts based on everything except 164 their .cuOff fields. */ 165Word ML_(TyEnt__cmp_by_all_except_cuOff) ( const TyEnt* te1, const TyEnt* te2 ); 166 167/* Free up all directly or indirectly heap-allocated stuff attached to 168 this TyEnt, and set its tag to Te_EMPTY. The .cuOff field is 169 unchanged. */ 170void ML_(TyEnt__make_EMPTY) ( TyEnt* te ); 171 172/* How big is this type? If .b in the returned struct is False, the 173 size is unknown. */ 174 175MaybeULong ML_(sizeOfType)( XArray* /* of TyEnt */ tyents, 176 UWord cuOff ); 177 178/* Describe where in the type 'offset' falls. Caller must 179 deallocate the resulting XArray. */ 180XArray* /*UChar*/ ML_(describe_type)( /*OUT*/PtrdiffT* residual_offset, 181 XArray* /* of TyEnt */ tyents, 182 UWord ty_cuOff, 183 PtrdiffT offset ); 184 185 186/* A fast-lookup cache for ML_(TyEnts__index_by_cuOff). Nothing 187 particularly surprising here; it's 2 way set associative, with some 188 number of ways, doesn't particularly have to be a power of 2. In 189 order to have a way to indicate an invalid entry, we set the second 190 value of the pair to NULL, and keep checking for it, since 191 unfortunately there's no obvious cuOff number that we could put in 192 the first word of the pair that could indicate an invalid entry. 193 194 4096 arrived at as the best value for an E6600 loading Qt-4.4.1 195 Designer and all associated libraries, compiled by gcc-4.3.1, 196 -g -O, 64-bit, which is at least a moderately good stress test, 197 with the largest library being about 150MB.*/ 198 199#define N_TYENT_INDEX_CACHE 4096 200 201typedef 202 struct { 203 struct { UWord cuOff0; TyEnt* ent0; 204 UWord cuOff1; TyEnt* ent1; } 205 ce[N_TYENT_INDEX_CACHE]; 206 } 207 TyEntIndexCache; 208 209void ML_(TyEntIndexCache__invalidate) ( TyEntIndexCache* cache ); 210 211/* 'ents' is an XArray of TyEnts, sorted by their .cuOff fields. Find 212 the entry which has .cuOff field as specified. Returns NULL if not 213 found. Asserts if more than one entry has the specified .cuOff 214 value. */ 215TyEnt* ML_(TyEnts__index_by_cuOff) ( XArray* /* of TyEnt */ ents, 216 TyEntIndexCache* cache, 217 UWord cuOff_to_find ); 218 219#endif /* ndef __PRIV_TYTYPES_H */ 220 221/*--------------------------------------------------------------------*/ 222/*--- end priv_tytypes.h ---*/ 223/*--------------------------------------------------------------------*/ 224