More gcc 4.8 fixes.
[dyninst.git] / symtabAPI / h / Collections.h
1 /*
2  * See the dyninst/COPYRIGHT file for copyright information.
3  * 
4  * We provide the Paradyn Tools (below described as "Paradyn")
5  * on an AS IS basis, and do not warrant its validity or performance.
6  * We reserve the right to update, modify, or discontinue this
7  * software at any time.  We shall have no obligation to supply such
8  * updates or modifications or any other form of support to you.
9  * 
10  * By your use of Paradyn, you understand and agree that we (or any
11  * other person or entity with proprietary rights in Paradyn) are
12  * under no obligation to provide either maintenance services,
13  * update services, notices of latent defects, or correction of
14  * defects for Paradyn.
15  * 
16  * This library is free software; you can redistribute it and/or
17  * modify it under the terms of the GNU Lesser General Public
18  * License as published by the Free Software Foundation; either
19  * version 2.1 of the License, or (at your option) any later version.
20  * 
21  * This library is distributed in the hope that it will be useful,
22  * but WITHOUT ANY WARRANTY; without even the implied warranty of
23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
24  * Lesser General Public License for more details.
25  * 
26  * You should have received a copy of the GNU Lesser General Public
27  * License along with this library; if not, write to the Free Software
28  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
29  */
30
31 #ifndef _Collections_h_
32 #define _Collections_h_
33
34 #include "Type.h"
35 #include "Variable.h"
36 #include "Serialization.h"
37
38 namespace Dyninst {
39
40 namespace SymtabAPI {
41
42 class Module;
43 class Symtab;
44 class localVar;
45 class DwarfWalker;
46
47 /*
48  * This class contains a collection of local variables.
49  * Each function will have one of these objects associated with it.
50  * This object will store all the local variables within this function.
51  * Note: This class is unaware of scope.
52  */
53
54
55 class SYMTAB_EXPORT localVarCollection : public AnnotationContainer<localVar *> {
56   
57   std::vector<localVar* > localVars;
58   
59   bool addItem_impl(localVar *);
60 public:
61   localVarCollection(){}
62   ~localVarCollection();
63
64   void addLocalVar(localVar * var);
65   localVar * findLocalVar(std::string &name);
66   std::vector<localVar *> *getAllVars();  
67
68   Serializable *ac_serialize_impl(SerializerBase *, const char * = "localVarCollection") THROW_SPEC (SerializerError);
69 };
70   
71
72
73 /*
74  * Due to DWARF weirdness, this can be shared between multiple BPatch_modules.
75  * So we reference-count to make life easier.
76  */
77 class SYMTAB_EXPORT typeCollection : public Serializable//, public AnnotatableSparse 
78 {
79     friend class Symtab;
80     friend class Object;
81     friend class Module;
82     friend class Type;
83     friend class DwarfWalker;
84
85     dyn_hash_map<std::string, Type *> typesByName;
86     dyn_hash_map<std::string, Type *> globalVarsByName;
87     dyn_hash_map<int, Type *> typesByID;
88
89
90     // DWARF:
91     /* Cache type collections on a per-image basis.  (Since
92        BPatch_functions are solitons, we don't have to cache them.) */
93     static dyn_hash_map< void *, typeCollection * > fileToTypesMap;
94         //static dyn_hash_map<int, std::vector<std::pair<dataClass, Type **> > > deferred_lookups;
95         static bool doDeferredLookups(typeCollection *);
96
97     // DWARF...
98     bool dwarfParsed_;
99
100         Serializable *serialize_impl(SerializerBase *, const char * = "typeCollection") THROW_SPEC (SerializerError);
101         public:
102     typeCollection();
103     ~typeCollection();
104 public:
105         static void addDeferredLookup(int, dataClass, Type **);
106
107     static typeCollection *getModTypeCollection(Module *mod);
108 #if 0
109     static typeCollection *getGlobalTypeCollection();
110     static void freeTypeCollection(typeCollection *tc);
111 #endif
112
113     // DWARF...
114     bool dwarfParsed() { return dwarfParsed_; }
115     void setDwarfParsed() { dwarfParsed_ = true; }
116
117     Type        *findType(std::string name);
118     Type        *findType(const int ID);
119     Type        *findTypeLocal(std::string name);
120     Type        *findTypeLocal(const int ID);
121     void        addType(Type *type);
122     void        addGlobalVariable(std::string &name, Type *type);
123
124     /* Some debug formats allow forward references.  Rather than
125        fill in forward in a second pass, generate placeholder
126        types, and fill them in as we go.  Because we require
127        One True Pointer for each type (in parseStab.C), when
128        updating a type, return that One True Pointer. */
129     Type * findOrCreateType( const int ID );
130     template<class T>
131     T* addOrUpdateType(T* type);
132
133     Type *findVariableType(std::string &name);
134
135     std::vector<Type *> *getAllTypes();
136     std::vector<std::pair<std::string, Type *> > *getAllGlobalVariables();
137     void clearNumberedTypes();
138 };
139
140 /*
141  * This class defines the collection for the built-in Types
142  * gnu ( and AIX??) use negative numbers to define other types
143  * in terms of these built-in types.
144  * This collection is global and built in the BPatch_image constructor.
145  * This means that only one collection of built-in types is made
146  * per image.  jdd 4/21/99
147  *
148  */
149
150 class SYMTAB_EXPORT builtInTypeCollection {
151    
152     dyn_hash_map<std::string, Type *> builtInTypesByName;
153     dyn_hash_map<int, Type *> builtInTypesByID;
154 public:
155
156     builtInTypeCollection();
157     ~builtInTypeCollection();
158
159     Type        *findBuiltInType(std::string &name);
160     Type        *findBuiltInType(const int ID);
161     void        addBuiltInType(Type *type);
162     std::vector<Type *> *getAllBuiltInTypes();
163    
164 };
165
166 }// namespace SymtabAPI
167 }// namespace Dyninst
168
169 #endif /* _Collections_h_ */
170
171
172