Remove incorrect export declaration
[dyninst.git] / symtabAPI / h / Symbol.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 /************************************************************************
32  * $Id: Symbol.h,v 1.20 2008/11/03 15:19:24 jaw Exp $
33  * Symbol.h: symbol table objects.
34 ************************************************************************/
35
36 #if !defined(_Symbol_h_)
37 #define _Symbol_h_
38
39
40 /************************************************************************
41  * header files.
42 ************************************************************************/
43
44 #include "symutil.h"
45 #include "Annotatable.h"
46 #include "Serialization.h"
47
48 #ifndef CASE_RETURN_STR
49 #define CASE_RETURN_STR(x) case x: return #x
50 #endif
51
52
53 namespace Dyninst{
54 namespace SymtabAPI{
55
56 class Module;
57 class typeCommon;
58 class localVarCollection;
59 class Region;
60 class Aggregate;
61 class Function;
62 class Variable;
63 class Type;
64 class typeCollection;
65 class Symtab;
66
67 /************************************************************************
68  * class Symbol
69 ************************************************************************/
70
71 class SYMTAB_EXPORT Symbol : public Serializable,
72                public AnnotatableSparse 
73 {
74    friend class typeCommon;
75    friend class Symtab;
76    friend class AObject;
77    friend class Object;
78    friend class Aggregate;
79    friend class relocationEntry;
80
81    friend std::string parseStabString(Module *, int linenum, char *, int, 
82          typeCommon *);
83
84    public:
85
86    enum SymbolType {
87       ST_UNKNOWN,
88       ST_FUNCTION,
89       ST_OBJECT,
90       ST_MODULE,
91       ST_SECTION,
92       ST_TLS,
93       ST_DELETED,
94       ST_INDIRECT,
95       ST_NOTYPE
96    };
97
98    static const char *symbolType2Str(SymbolType t);
99
100    enum SymbolLinkage {
101       SL_UNKNOWN,
102       SL_GLOBAL,
103       SL_LOCAL,
104       SL_WEAK
105    };
106
107    static const char *symbolLinkage2Str(SymbolLinkage t);
108
109    enum SymbolTag {
110       TAG_UNKNOWN,
111       TAG_USER,
112       TAG_LIBRARY,
113       TAG_INTERNAL
114    };
115
116    static const char *symbolTag2Str(SymbolTag t);
117
118    enum SymbolVisibility {
119        SV_UNKNOWN,
120        SV_DEFAULT,
121        SV_INTERNAL,
122        SV_HIDDEN,
123        SV_PROTECTED
124    };
125    static const char *symbolVisibility2Str(SymbolVisibility t);
126
127    Symbol();
128
129    static Symbol *magicEmitElfSymbol();
130
131    Symbol (const std::string& name,
132                          SymbolType t,
133                          SymbolLinkage l,
134                          SymbolVisibility v,
135                          Offset o,
136                          Module *module = NULL, 
137                          Region *r = NULL, 
138                          unsigned s = 0,
139                          bool d = false,
140                          bool a = false,
141                          int index= -1,
142                          int strindex = -1,
143                          bool cs = false);
144    ~Symbol();
145
146    bool          operator== (const Symbol &) const;
147
148    /***********************************************************
149      Name Output Functions
150     ***********************************************************/                
151    const std::string&      getMangledName () const;
152    const std::string&    getPrettyName() const;
153    const std::string&      getTypedName() const;
154
155    Module *getModule() const { return module_; } 
156    Symtab *getSymtab() const;
157    SymbolType getType () const { return type_; }
158    SymbolLinkage getLinkage () const { return linkage_; }
159    Offset getOffset() const { return offset_; }
160    Offset getPtrOffset() const { return ptr_offset_; }
161    Offset getLocalTOC() const { return localTOC_; }
162    unsigned getSize() const { return size_; }
163    Region *getRegion() const { return region_; }
164
165    bool isInDynSymtab() const { return (type_ != ST_DELETED) && isDynamic_; }
166    bool isInSymtab() const { return (type_ != ST_DELETED) && !isDynamic_; }
167    bool isAbsolute() const { return isAbsolute_; }
168    bool isCommonStorage() const { return isCommonStorage_; }
169
170    bool              isFunction()            const;
171    bool              setFunction(Function * func);
172    Function *        getFunction()           const;
173
174    bool              isVariable()            const;
175    bool              setVariable(Variable *var);
176    Variable *        getVariable()           const;
177
178    SymbolVisibility getVisibility() const { return visibility_; }
179
180    int getIndex() const { return index_; }
181    bool setIndex(int index) { index_ = index; return true; }
182    int getStrIndex() const { return strindex_; }
183    bool setStrIndex(int strindex) { strindex_ = strindex; return true; }
184    void setReferringSymbol (Symbol *referringSymbol);
185    Symbol* getReferringSymbol ();
186
187    //////////////// Modification
188    bool setOffset (Offset newOffset);
189    bool setPtrOffset (Offset newOffset);
190    bool setLocalTOC (Offset localTOC);
191    bool setSize(unsigned ns);
192    bool setRegion(Region *r);
193    bool setModule(Module *mod);
194
195    bool setMangledName(std::string name);
196
197    bool setSymbolType(SymbolType sType);
198
199    SymbolTag            tag ()               const;
200    bool  setDynamic(bool d) { isDynamic_ = d; return true;}
201    bool  setAbsolute(bool a) { isAbsolute_ = a; return true; }
202    bool  setCommonStorage(bool cs) { isCommonStorage_ = cs; return true; }
203
204    bool  setVersionFileName(std::string &fileName);
205    bool  setVersions(std::vector<std::string> &vers);
206    bool  setVersionNum(unsigned verNum);
207    void setVersionHidden() { versionHidden_ = true; }
208
209    bool  getVersionFileName(std::string &fileName);
210    bool  getVersions(std::vector<std::string> *&vers);
211    bool  getVersionNum(unsigned &verNum);
212    bool  getVersionHidden() { return versionHidden_; }
213
214    friend
215       std::ostream& operator<< (std::ostream &os, const Symbol &s);
216
217    public:
218    static std::string emptyString;
219    int getInternalType() { return internal_type_; }
220    void setInternalType(int i) { internal_type_ = i; }
221
222    private:
223
224    Module*       module_;
225    SymbolType    type_;
226    int           internal_type_;
227    SymbolLinkage linkage_;
228    SymbolVisibility visibility_;
229    Offset        offset_;
230    Offset        ptr_offset_;  // Function descriptor offset.  Not available on all platforms.
231    Offset        localTOC_;
232    Region*       region_;
233    Symbol*       referring_;
234    unsigned      size_;  // size of this symbol. This is NOT available on all platforms.
235
236    bool          isDynamic_;
237    bool          isAbsolute_;
238
239    Aggregate *   aggregate_; // Pointer to Function or Variable container, if appropriate.
240
241    std::string mangledName_;
242    std::string prettyName_;
243    std::string typedName_;
244
245    SymbolTag     tag_;
246    int index_;
247    int strindex_;
248
249    bool          isCommonStorage_;
250
251    std::vector<std::string> verNames_;
252
253    bool versionHidden_;
254
255    void restore_module_and_region(SerializerBase *, 
256                    std::string &, Offset) THROW_SPEC (SerializerError);
257
258    public:
259
260    Serializable * serialize_impl(SerializerBase *, 
261                    const char *tag = "Symbol") THROW_SPEC (SerializerError);
262 };
263
264 class SYMTAB_EXPORT LookupInterface 
265 {
266    public:
267       LookupInterface();
268       virtual bool getAllSymbolsByType(std::vector<Symbol *> &ret,
269             Symbol::SymbolType sType) = 0;
270       virtual bool findSymbol(std::vector<Symbol *> &ret,
271                                             const std::string& name,
272                                             Symbol::SymbolType sType = Symbol::ST_UNKNOWN,
273                                             NameType nameType = anyName,
274                                             bool isRegex = false,
275                                             bool checkCase = false,
276                                             bool includeUndefined = false) = 0;
277       virtual bool findType(Type *&type, std::string name) = 0;
278       virtual bool findVariableType(Type *&type, std::string name)= 0;
279
280       virtual ~LookupInterface();
281 };
282
283 std::ostream& operator<< (std::ostream &os, const Symbol &s);
284
285 }//namespace SymtabAPI
286 }//namespace Dyninst
287
288 #endif /* !defined(_Symbol_h_) */