windows build fixes and some more work on symtab serialization
[dyninst.git] / symtabAPI / src / Object.h
1 /*
2  * Copyright (c) 1996-2007 Barton P. Miller
3  * 
4  * We provide the Paradyn Parallel Performance Tools (below
5  * described as "Paradyn") on an AS IS basis, and do not warrant its
6  * validity or performance.  We reserve the right to update, modify,
7  * or discontinue this software at any time.  We shall have no
8  * obligation to supply such updates or modifications or any other
9  * form of support to you.
10  * 
11  * By your use of Paradyn, you understand and agree that we (or any
12  * other person or entity with proprietary rights in Paradyn) are
13  * under no obligation to provide either maintenance services,
14  * update services, notices of latent defects, or correction of
15  * defects for Paradyn.
16  * 
17  * This library is free software; you can redistribute it and/or
18  * modify it under the terms of the GNU Lesser General Public
19  * License as published by the Free Software Foundation; either
20  * version 2.1 of the License, or (at your option) any later version.
21  * 
22  * This library is distributed in the hope that it will be useful,
23  * but WITHOUT ANY WARRANTY; without even the implied warranty of
24  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
25  * Lesser General Public License for more details.
26  * 
27  * You should have received a copy of the GNU Lesser General Public
28  * License along with this library; if not, write to the Free Software
29  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
30  */
31
32 /************************************************************************
33  * $Id: Object.h,v 1.20 2008/06/23 18:45:48 legendre Exp $
34  * Object.h: interface to objects, symbols, lines and instructions.
35 ************************************************************************/
36
37
38 #if !defined(_Object_h_)
39 #define _Object_h_
40
41 /************************************************************************
42  * header files.
43 ************************************************************************/
44
45 // trace data streams
46 #include <string>
47 #include <vector>
48
49 #include "symtabAPI/h/Symbol.h"
50 #include "symtabAPI/h/LineInformation.h"
51 #include "common/h/headers.h"
52 #include "common/h/MappedFile.h"
53 #include "common/h/lprintf.h"
54
55 namespace Dyninst{
56 namespace SymtabAPI{
57
58 extern bool symbol_compare(const Symbol *s1, const Symbol *s2);
59
60 class Symtab;
61 class Region;
62 class ExceptionBlock;
63 class relocationEntry;
64
65 const char WILDCARD_CHARACTER = '?';
66 const char MULTIPLE_WILDCARD_CHARACTER = '*';
67
68 /************************************************************************
69  * class AObject
70  *
71  *  WHAT IS THIS CLASS????  COMMENTS????
72  *  Looks like it has a dictionary hash of symbols, as well as
73  *   a ptr to to the code section, an offset into the code section,
74  *   and a length of the code section, and ditto for the data
75  *   section....
76 ************************************************************************/
77
78 class MemRegReader;
79
80 class AObject {
81 public:
82     SYMTAB_EXPORT AObject() {};
83     SYMTAB_EXPORT unsigned nsymbols () const;
84     
85     SYMTAB_EXPORT bool get_symbols( std::string & name, std::vector< Symbol *> & symbols);
86
87     SYMTAB_EXPORT char*       code_ptr () const; 
88     SYMTAB_EXPORT Offset           code_off () const;
89     SYMTAB_EXPORT Offset           code_len () const;
90
91     SYMTAB_EXPORT char*       data_ptr () const;
92     SYMTAB_EXPORT Offset           data_off () const;
93     SYMTAB_EXPORT Offset           data_len () const;
94
95     SYMTAB_EXPORT bool        is_aout  () const;
96     SYMTAB_EXPORT bool        isDynamic() const;
97
98     SYMTAB_EXPORT unsigned            no_of_sections () const;
99     SYMTAB_EXPORT unsigned            no_of_symbols  () const;
100
101     SYMTAB_EXPORT bool getAllExceptions(std::vector<ExceptionBlock *>&excpBlocks) const;
102     SYMTAB_EXPORT std::vector<Region *> getAllRegions() const;
103
104     SYMTAB_EXPORT supportedLanguages pickLanguage(std::string &working_module, char *working_options,
105                                                                     supportedLanguages working_lang);
106
107     SYMTAB_EXPORT Offset loader_off() const;
108     SYMTAB_EXPORT unsigned loader_len() const;
109     SYMTAB_EXPORT int getAddressWidth() const;
110
111     SYMTAB_EXPORT virtual char *  mem_image() const;
112
113     SYMTAB_EXPORT virtual  bool   needs_function_binding()  const;
114     SYMTAB_EXPORT virtual  bool   get_func_binding_table(std::vector<relocationEntry> &) const;
115     SYMTAB_EXPORT virtual  bool   get_func_binding_table_ptr(const std::vector<relocationEntry> *&) const; 
116     SYMTAB_EXPORT virtual  bool   addRelocationEntry(relocationEntry &re);
117     SYMTAB_EXPORT bool   getSegments(std::vector<Segment> &segs) const;
118
119     SYMTAB_EXPORT bool have_deferred_parsing( void ) const;
120     // for debuggering....
121     SYMTAB_EXPORT const std::ostream &dump_state_info(std::ostream &s);
122
123     SYMTAB_EXPORT void * getErrFunc() const;
124     SYMTAB_EXPORT dyn_hash_map< std::string, std::vector< Symbol *> > *getAllSymbols();
125     SYMTAB_EXPORT MappedFile *getMappedFileForDebugInfo() { return mfForDebugInfo; }
126     
127     SYMTAB_EXPORT virtual bool hasFrameDebugInfo() {return false;}
128     SYMTAB_EXPORT virtual bool getRegValueAtFrame(Address /*pc*/,
129                                                   Dyninst::MachRegister /*reg*/, 
130                                                   Dyninst::MachRegisterVal & /*reg_result*/,
131                                                   MemRegReader * /*reader*/) {return false;}
132     
133     SYMTAB_EXPORT const std::string findModuleForSym(Symbol *sym);
134     SYMTAB_EXPORT void clearSymsToMods();
135
136 protected:
137     SYMTAB_EXPORT virtual ~AObject();
138     // explicitly protected
139     SYMTAB_EXPORT AObject(MappedFile * , MappedFile *, void (*err_func)(const char *));
140     SYMTAB_EXPORT AObject(MappedFile * , MappedFile *, 
141                       dyn_hash_map<std::string, LineInformation> &, 
142                       void (*)(const char *)) { assert(0); }
143     SYMTAB_EXPORT AObject(const AObject &obj);
144
145     MappedFile *mf;
146     MappedFile *mfForDebugInfo;
147
148     std::vector< Region *> regions_;
149
150     dyn_hash_map< std::string, std::vector< Symbol *> > symbols_;
151         std::map< Symbol *, std::string > symsToModules_;
152     dyn_hash_map<Offset, std::vector<Symbol *> > symsByOffset_;
153
154     char*   code_ptr_;
155     Offset code_off_;
156     Offset code_len_;
157
158     char*   data_ptr_;
159     Offset data_off_;
160     Offset data_len_;
161
162     Offset code_vldS_;
163     Offset code_vldE_;
164
165     Offset data_vldS_;
166     Offset data_vldE_;
167
168     Offset loader_off_; //only used on aix right now.  could be
169     Offset loader_len_; //needed on other platforms in the future
170
171 //    Offset loadAddress_;
172 //    Offset entryAddress_;
173 //    Offset baseAddress_;
174     
175     bool is_aout_;
176     bool is_dynamic_;
177
178     unsigned no_of_sections_;
179     unsigned no_of_symbols_;
180
181     bool deferredParse;
182     void (*err_func_)(const char*);
183     int addressWidth_nbytes;
184
185     std::vector<ExceptionBlock> catch_addrs_; //Addresses of C++ try/catch blocks;
186     
187 private:
188     friend class SymbolIter;
189     friend class Symtab;
190
191 };
192
193 }//namepsace Symtab
194 }//namespace Dyninst
195
196 /************************************************************************
197  * include the architecture-operating system specific object files.
198 ************************************************************************/
199
200 #if defined(os_solaris) || defined(os_linux) || defined(os_bluegene)
201 #include "Object-elf.h"
202 #elif defined(os_aix)
203 #include "Object-xcoff.h"
204 #elif defined(os_windows)
205 #include "Object-nt.h"
206 #elif defined(os_osf)
207 #include "Object-coff.h"
208 #else
209 #error "unknown platform"
210 #endif
211
212 /************************************************************************
213  * class SymbolIter
214 ************************************************************************/
215
216 namespace Dyninst{
217 namespace SymtabAPI{
218
219 class SymbolIter {
220  private:
221    dyn_hash_map< std::string, std::vector< Symbol *> > *symbols;
222    unsigned int currentPositionInVector;
223    dyn_hash_map< std::string, std::vector< Symbol *> >::iterator symbolIterator;
224    
225  public:
226    SymbolIter( Object & obj );
227    SymbolIter( const SymbolIter & src );
228    ~SymbolIter ();
229    
230    void reset ();
231    
232    operator bool() const;
233    void operator++ ( int );
234    const std::string & currkey() const;
235    
236    /* If it's important that this be const, we could try to initialize
237       currentVector to '& symbolIterator.currval()' in the constructor. */
238    Symbol *currval();
239    
240  private:       
241    
242    SymbolIter & operator = ( const SymbolIter & ); // explicitly disallowed
243 }; /* end class SymbolIter() */
244
245 }//namepsace SymtabAPI
246 }//namespace Dyninst
247
248 #endif /* !defined(_Object_h_) */