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