priv_tytypes.h revision e739ac0589b4fb43561f801c4faba8c1b89f8680
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
39typedef
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. */
61typedef
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? */
141Bool ML_(TyEnt__is_type)( TyEnt* );
142
143/* Print a TyEnt, debug-style. */
144void ML_(pp_TyEnt)( TyEnt* );
145
146/* Print a whole XArray of TyEnts, debug-style */
147void ML_(pp_TyEnts)( XArray* tyents, HChar* who );
148
149/* Print a TyEnt, C style, chasing stuff as necessary. */
150void 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. */
155Word 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. */
159Word 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. */
164void 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
169MaybeULong 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. */
174XArray* /*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
195typedef
196   struct {
197      struct { UWord cuOff0; TyEnt* ent0;
198               UWord cuOff1; TyEnt* ent1; }
199         ce[N_TYENT_INDEX_CACHE];
200   }
201   TyEntIndexCache;
202
203void 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. */
209TyEnt* 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