Remove incorrect export declaration
[dyninst.git] / symtabAPI / h / Function.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(_Function_h_)
37 #define _Function_h_
38
39 #include "Annotatable.h"
40 #include "Serialization.h"
41 #include "Aggregate.h"
42 #include "Variable.h"
43 #include "IBSTree.h"
44
45 SYMTAB_EXPORT std::ostream &operator<<(std::ostream &os, const Dyninst::SymtabAPI::Function &);
46
47 namespace Dyninst{
48 namespace SymtabAPI{
49
50 class Symbol;
51 class Type;
52 class FunctionBase;
53 class DwarfWalker;
54
55 class SYMTAB_EXPORT FuncRange {
56   public:
57    FuncRange(Dyninst::Offset off_, size_t size_, FunctionBase *cont_) :
58      container(cont_),
59      off(off_),
60      size(size_)
61    {
62    }
63    
64    FunctionBase *container;
65    Dyninst::Offset off;
66    unsigned long size;
67
68    //For interval tree
69    Dyninst::Offset low() const { return off; }
70    Dyninst::Offset high() const { return off + size; }
71    typedef Dyninst::Offset type;
72 };
73
74 typedef IBSTree<FuncRange> FuncRangeLookup;
75 typedef std::vector<FuncRange> FuncRangeCollection;
76 typedef std::vector<FunctionBase *> InlineCollection;
77 typedef std::vector<FuncRange> FuncRangeCollection;
78
79 class SYMTAB_EXPORT FunctionBase : public Aggregate
80 {
81    friend class InlinedFunction;
82    friend class Function;
83    friend class DwarfWalker;
84   public:
85    /***** Return Type Information *****/
86    Type  * getReturnType() const;
87    
88    /***** Local Variable Information *****/
89    bool findLocalVariable(std::vector<localVar *>&vars, std::string name);
90    bool getLocalVariables(std::vector<localVar *>&vars);
91    bool getParams(std::vector<localVar *>&params);
92
93    bool operator==(const FunctionBase &);
94
95    FunctionBase *getInlinedParent();
96    const InlineCollection &getInlines();
97    
98    const FuncRangeCollection &getRanges();
99    
100    /***** Frame Pointer Information *****/
101    bool setFramePtr(std::vector<VariableLocation> *locs);
102    std::vector<VariableLocation> &getFramePtrRefForInit();
103    std::vector<VariableLocation> &getFramePtr();   
104
105    /***** Opaque data object pointers, usable by user ****/
106    void *getData();
107    void setData(void *d);
108
109    /* internal helper functions */
110    bool addLocalVar(localVar *);
111    bool addParam(localVar *);
112    bool setReturnType(Type *);
113
114   protected:
115    FunctionBase(Symbol *);
116    FunctionBase(Module *);
117    FunctionBase();
118    ~FunctionBase();
119
120    localVarCollection *locals;
121    localVarCollection *params;
122
123    Type          *retType_;
124    unsigned functionSize_;
125
126    InlineCollection inlines;
127    FunctionBase *inline_parent;
128
129    FuncRangeCollection ranges;
130    std::vector<VariableLocation> frameBase_;
131    bool frameBaseExpanded_;
132    void *data;
133
134    void expandLocation(const VariableLocation &loc,
135                        std::vector<VariableLocation> &ret);
136 };
137
138 class SYMTAB_EXPORT Function : public FunctionBase
139 {
140    friend class Symtab;
141         friend std::ostream &::operator<<(std::ostream &os, const Dyninst::SymtabAPI::Function &);
142    
143  private:
144    Function(Symbol *sym);
145    
146  public:
147    
148    Function();
149    virtual ~Function();
150    
151    /* Symbol management */
152    bool removeSymbol(Symbol *sym);      
153    
154    /***** IA64-Specific Frame Pointer Information *****/
155    bool  setFramePtrRegnum(int regnum);
156    int   getFramePtrRegnum() const;
157    
158    /***** PPC64 Linux Specific Information *****/
159    Offset getPtrOffset() const;
160    Offset getTOCOffset() const;
161    
162    Serializable * serialize_impl(SerializerBase *sb, 
163                                 const char *tag = "Function") THROW_SPEC (SerializerError);
164
165    unsigned getSize();
166 };
167
168 class SYMTAB_EXPORT InlinedFunction : public FunctionBase
169 {
170    friend class Symtab;
171    friend class DwarfWalker;
172   protected:
173    InlinedFunction(FunctionBase *parent);
174    ~InlinedFunction();
175   public:
176    std::pair<std::string, Dyninst::Offset> getCallsite();
177    virtual bool removeSymbol(Symbol *sym);
178   private:
179    std::string callsite_file;
180    Dyninst::Offset callsite_line;
181 };
182
183 }
184 }
185
186 #endif