Fixed forgotten rename of isPPC64V2API to getABIVersion in
[dyninst.git] / symtabAPI / src / Object.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: Object.h,v 1.20 2008/06/23 18:45:48 legendre Exp $
33  * Object.h: interface to objects, symbols, lines and instructions.
34 ************************************************************************/
35
36
37 #if !defined(_Object_h_)
38 #define _Object_h_
39
40 /************************************************************************
41  * header files.
42 ************************************************************************/
43
44 // trace data streams
45 #include <string>
46 #include <vector>
47
48 #include "Symbol.h"
49 #include "Symtab.h"
50 #include "LineInformation.h"
51 #include "common/src/headers.h"
52 #include "common/src/MappedFile.h"
53 #include "common/src/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 AObject {
79 public:
80     SYMTAB_EXPORT unsigned nsymbols () const;
81     
82     SYMTAB_EXPORT bool get_symbols( std::string & name, std::vector< Symbol *> & symbols);
83
84     SYMTAB_EXPORT char*       code_ptr () const; 
85     SYMTAB_EXPORT Offset           code_off () const;
86     SYMTAB_EXPORT Offset           code_len () const;
87
88     SYMTAB_EXPORT char*       data_ptr () const;
89     SYMTAB_EXPORT Offset           data_off () const;
90     SYMTAB_EXPORT Offset           data_len () const;
91
92     SYMTAB_EXPORT bool        is_aout  () const;
93     SYMTAB_EXPORT bool        isDynamic() const;
94
95     SYMTAB_EXPORT unsigned            no_of_sections () const;
96     SYMTAB_EXPORT unsigned            no_of_symbols  () const;
97
98     SYMTAB_EXPORT bool getAllExceptions(std::vector<ExceptionBlock *>&excpBlocks) const;
99     SYMTAB_EXPORT std::vector<Region *> getAllRegions() const;
100
101     SYMTAB_EXPORT supportedLanguages pickLanguage(std::string &working_module, char *working_options,
102                                                                     supportedLanguages working_lang);
103
104     SYMTAB_EXPORT Offset loader_off() const;
105     SYMTAB_EXPORT unsigned loader_len() const;
106     SYMTAB_EXPORT int getAddressWidth() const;
107
108     bool isStaticBinary() const {return is_static_binary_;}
109
110     SYMTAB_EXPORT virtual char *  mem_image() const;
111
112     SYMTAB_EXPORT virtual  bool   needs_function_binding()  const;
113     SYMTAB_EXPORT virtual  bool   get_func_binding_table(std::vector<relocationEntry> &) const;
114     SYMTAB_EXPORT virtual  bool   get_func_binding_table_ptr(const std::vector<relocationEntry> *&) const; 
115     SYMTAB_EXPORT virtual  bool   addRelocationEntry(relocationEntry &re);
116     SYMTAB_EXPORT bool   getSegments(std::vector<Segment> &segs) const;
117
118     SYMTAB_EXPORT bool have_deferred_parsing( void ) const;
119     // for debuggering....
120     SYMTAB_EXPORT const std::ostream &dump_state_info(std::ostream &s);
121
122     SYMTAB_EXPORT void * getErrFunc() const;
123     SYMTAB_EXPORT dyn_hash_map< std::string, std::vector< Symbol *> > *getAllSymbols();
124     
125     SYMTAB_EXPORT virtual bool hasFrameDebugInfo() {return false;}
126     SYMTAB_EXPORT virtual bool getRegValueAtFrame(Address /*pc*/,
127                                                   Dyninst::MachRegister /*reg*/, 
128                                                   Dyninst::MachRegisterVal & /*reg_result*/,
129                                                   Dyninst::SymtabAPI::MemRegReader * /*reader*/) {return false;}
130     
131     SYMTAB_EXPORT virtual Dyninst::Architecture getArch() { return Arch_none; };
132     SYMTAB_EXPORT const std::string findModuleForSym(Symbol *sym);
133     SYMTAB_EXPORT void clearSymsToMods();
134     SYMTAB_EXPORT bool hasError() const;
135     SYMTAB_EXPORT virtual bool isBigEndianDataEncoding() const { return false; }
136     SYMTAB_EXPORT virtual bool getABIVersion(int &major, int &minor) const { return false; }
137     
138     virtual void setTruncateLinePaths(bool value);
139     virtual bool getTruncateLinePaths();
140     virtual Region::RegionType getRelType() const { return Region::RT_INVALID; }
141
142     // Only implemented for ELF right now
143     SYMTAB_EXPORT virtual void getSegmentsSymReader(std::vector<SymSegment> &) {};
144         SYMTAB_EXPORT virtual void rebase(Offset) {};
145 protected:
146     SYMTAB_EXPORT virtual ~AObject();
147     // explicitly protected
148     SYMTAB_EXPORT AObject(MappedFile *, void (*err_func)(const char *));
149
150     MappedFile *mf;
151
152     std::vector< Region *> regions_;
153
154     // XXX symbols_ is the owner of Symbol pointers; memory
155     //     is reclaimed from this structure
156     dyn_hash_map< std::string, std::vector< Symbol *> > symbols_;
157         std::map< Symbol *, std::string > symsToModules_;
158     dyn_hash_map<Offset, std::vector<Symbol *> > symsByOffset_;
159     std::vector<std::pair<std::string, Offset> > modules_;
160
161     char*   code_ptr_;
162     Offset code_off_;
163     Offset code_len_;
164
165     char*   data_ptr_;
166     Offset data_off_;
167     Offset data_len_;
168
169     Offset code_vldS_;
170     Offset code_vldE_;
171
172     Offset data_vldS_;
173     Offset data_vldE_;
174
175     Offset loader_off_; //only used on aix right now.  could be
176     Offset loader_len_; //needed on other platforms in the future
177
178 //    Offset loadAddress_;
179 //    Offset entryAddress_;
180 //    Offset baseAddress_;
181  
182     bool is_aout_;
183     bool is_dynamic_;
184     bool has_error;
185
186     bool is_static_binary_;
187
188     unsigned no_of_sections_;
189     unsigned no_of_symbols_;
190
191     bool deferredParse;
192     bool parsedAllLineInfo;
193     
194     void (*err_func_)(const char*);
195     int addressWidth_nbytes;
196
197     std::vector<ExceptionBlock> catch_addrs_; //Addresses of C++ try/catch blocks;
198     
199 private:
200     friend class SymbolIter;
201     friend class Symtab;
202
203     // declared but not implemented; no copying allowed
204     AObject(const AObject &obj);
205     const AObject& operator=(const AObject &obj);
206 };
207
208 }//namepsace Symtab
209 }//namespace Dyninst
210
211 /************************************************************************
212  * include the architecture-operating system specific object files.
213 ************************************************************************/
214
215 #if defined(os_linux) || defined(os_bg) || defined(os_freebsd) || defined(os_vxworks)
216 #include "Object-elf.h"
217 #elif defined(os_windows)
218 #include "Object-nt.h"
219 #else
220 #error "unknown platform"
221 #endif
222
223 /************************************************************************
224  * class SymbolIter
225 ************************************************************************/
226
227 namespace Dyninst{
228 namespace SymtabAPI{
229
230 class SymbolIter {
231  private:
232    dyn_hash_map< std::string, std::vector< Symbol *> > *symbols;
233    unsigned int currentPositionInVector;
234    dyn_hash_map< std::string, std::vector< Symbol *> >::iterator symbolIterator;
235    
236  public:
237    SymbolIter( Object & obj );
238    SymbolIter( const SymbolIter & src );
239    ~SymbolIter ();
240    
241    void reset ();
242    
243    operator bool() const;
244    void operator++ ( int );
245    const std::string & currkey() const;
246    
247    /* If it's important that this be const, we could try to initialize
248       currentVector to '& symbolIterator.currval()' in the constructor. */
249    Symbol *currval();
250    
251  private:       
252    
253    SymbolIter & operator = ( const SymbolIter & ); // explicitly disallowed
254 }; /* end class SymbolIter() */
255
256 }//namepsace SymtabAPI
257 }//namespace Dyninst
258
259 #endif /* !defined(_Object_h_) */