Removed obsolete reference to obsolete sunos support
[dyninst.git] / dyninstAPI / src / Object.h
1 /*
2  * Copyright (c) 1996 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  * This license is for research uses.  For such uses, there is no
12  * charge. We define "research use" to mean you may freely use it
13  * inside your organization for whatever purposes you see fit. But you
14  * may not re-distribute Paradyn or parts of Paradyn, in any form
15  * source or binary (including derivatives), electronic or otherwise,
16  * to any other organization or entity without our permission.
17  * 
18  * (for other uses, please contact us at paradyn@cs.wisc.edu)
19  * 
20  * All warranties, including without limitation, any warranty of
21  * merchantability or fitness for a particular purpose, are hereby
22  * excluded.
23  * 
24  * By your use of Paradyn, you understand and agree that we (or any
25  * other person or entity with proprietary rights in Paradyn) are
26  * under no obligation to provide either maintenance services,
27  * update services, notices of latent defects, or correction of
28  * defects for Paradyn.
29  * 
30  * Even if advised of the possibility of such damages, under no
31  * circumstances shall we (or any other person or entity with
32  * proprietary rights in the software licensed hereunder) be liable
33  * to you or any third party for direct, indirect, or consequential
34  * damages of any character regardless of type of action, including,
35  * without limitation, loss of profits, loss of use, loss of good
36  * will, or computer failure or malfunction.  You agree to indemnify
37  * us (and any other person or entity with proprietary rights in the
38  * software licensed hereunder) for any and all liability it may
39  * incur to third parties resulting from your use of Paradyn.
40  */
41
42 /************************************************************************
43  * $Id: Object.h,v 1.27 1999/05/15 20:24:42 wylie Exp $
44  * Object.h: interface to objects, symbols, lines and instructions.
45 ************************************************************************/
46
47
48 #if !defined(_Object_h_)
49 #define _Object_h_
50
51 /************************************************************************
52  * header files.
53 ************************************************************************/
54
55 #include "util/h/Dictionary.h"
56 #include "util/h/String.h"
57 // trace data streams
58 #include "util/h/ByteArray.h"
59 #include "util/h/Symbol.h"
60 #include "util/h/Types.h"
61 #include "util/h/Vector.h"
62 #include "util/h/lprintf.h"
63
64 extern int symbol_compare(const void *x, const void *y);
65
66 // relocation information for calls to functions not in this image
67 // on sparc-solaris: target_addr_ = rel_addr_ = PLT entry addr
68 // on x86-solaris: target_addr_ = PLT entry addr
69 //                 rel_addr_ =  GOT entry addr  corr. to PLT_entry
70 class relocationEntry {
71 public:
72     relocationEntry():target_addr_(0),rel_addr_(0),name_(0){}   
73     relocationEntry(Address ta,Address ra, string n):target_addr_(ta),
74         rel_addr_(ra),name_(n){}   
75     relocationEntry(const relocationEntry& ra): target_addr_(ra.target_addr_), 
76         rel_addr_(ra.rel_addr_), name_(ra.name_) { }
77     ~relocationEntry(){}
78
79     const relocationEntry& operator= (const relocationEntry &ra) {
80         target_addr_ = ra.target_addr_; rel_addr_ = ra.rel_addr_; 
81         name_ = ra.name_; 
82         return *this;
83     }
84     Address target_addr() const { return target_addr_; }
85     Address rel_addr() const { return rel_addr_; }
86     const string &name() const { return name_; }
87
88     // dump output.  Currently setup as a debugging aid, not really
89     //  for object persistance....
90     ostream & operator<<(ostream &s) const;
91     friend ostream &operator<<(ostream &os, relocationEntry &q);
92
93 private:
94    Address target_addr_;        // target address of call instruction 
95    Address rel_addr_;           // address of corresponding relocation entry 
96    string  name_;
97 };
98
99 /************************************************************************
100  * class AObject
101  *
102  *  WHAT IS THIS CLASS????  COMMENTS????
103  *  Looks like it has a dictionary hash of symbols, as well as
104  *   a ptr to to the code section, an offset into the code section,
105  *   and a length of the code section, and ditto for the data
106  *   section....
107 ************************************************************************/
108
109 class AObject {
110 public:
111
112     unsigned  nsymbols () const { return symbols_.size(); }
113
114     bool      get_symbol (const string &name, Symbol &symbol) {
115         if (!symbols_.defines(name)) {
116             return false;
117         }
118         symbol = symbols_[name];
119         return true;
120     }
121
122     const Word*       code_ptr () const { return code_ptr_; } 
123     Address           code_off () const { return code_off_; }
124     Address           code_len () const { return code_len_; }
125
126     const Word*       data_ptr () const { return data_ptr_; }
127     Address           data_off () const { return data_off_; }
128     Address           data_len () const { return data_len_; }
129
130     virtual  bool   needs_function_binding()  const;
131     virtual  bool   get_func_binding_table(vector<relocationEntry> &) const;
132     virtual  bool   get_func_binding_table_ptr(const vector<relocationEntry> *&) const;
133     
134     // for debuggering....
135     const ostream &dump_state_info(ostream &s);
136
137 protected:
138     virtual ~AObject() {}
139     // explicitly protected
140     AObject(const string file , void (*err_func)(const char *)): file_(file), 
141         symbols_(string::hash), code_ptr_(0), code_off_(0), code_len_(0), 
142         data_ptr_(0), data_off_(0), data_len_(0),err_func_(err_func){} 
143
144     AObject(const AObject &obj): file_(obj.file_), symbols_(obj.symbols_), 
145         code_ptr_(obj.code_ptr_), code_off_(obj.code_off_), 
146         code_len_(obj.code_len_), data_ptr_(obj.data_ptr_), 
147         data_off_(obj.data_off_), data_len_(obj.data_len_), 
148         err_func_(obj.err_func_) {}   
149
150     AObject&  operator= (const AObject &obj) {   
151
152          if (this == &obj) { return *this; }
153          file_      = obj.file_;        symbols_   = obj.symbols_;
154          code_ptr_  = obj.code_ptr_;    code_off_  = obj.code_off_;
155          code_len_  = obj.code_len_;    data_ptr_  = obj.data_ptr_;
156          data_off_  = obj.data_off_;    data_len_  = obj.data_len_;
157          err_func_  = obj.err_func_;
158          return *this;
159     }
160
161     string                          file_;
162     dictionary_hash<string, Symbol> symbols_;
163
164     Word*    code_ptr_;
165     Address code_off_;
166     Address code_len_;
167
168     Word*    data_ptr_;
169     Address  data_off_;
170     Address data_len_;
171
172     void (*err_func_)(const char*);
173
174 private:
175     friend class SymbolIter;
176 };
177
178 /************************************************************************
179  * include the architecture-operating system specific object files.
180 ************************************************************************/
181
182 #undef HAVE_SPECIFIC_OBJECT
183
184 #if defined(sparc_sun_solaris2_4) || defined(i386_unknown_solaris2_5)
185 #include "util/h/Object-elf32.h"
186 #define HAVE_SPECIFIC_OBJECT
187 #endif /* defined(sparc_sun_solaris2_4) */
188
189 #if defined(i386_unknown_linux2_0)
190 #include "util/h/Object-elf32.h"
191 #define HAVE_SPECIFIC_OBJECT
192 #endif /* defined(i386_unknown_linux2_0) */
193
194 #if defined(mips_sgi_irix6_4)
195 #include "util/h/Object-elf32.h"
196 #define HAVE_SPECIFIC_OBJECT
197 #endif /* defined(mips_sgi_irix6_4) */
198
199 #if defined(rs6000_ibm_aix4_1)
200 #include "util/h/Object-aix.h"
201 #define HAVE_SPECIFIC_OBJECT
202 #endif /* defined(rs6000_ibm_aix4_1) */
203
204 #if defined(i386_unknown_nt4_0)
205 #include "util/h/Object-nt.h"
206 #define HAVE_SPECIFIC_OBJECT
207 #endif /* defined(i386_unknown_nt4_0) */
208
209 #if defined(alpha_dec_osf4_0)
210 #include "util/h/Object-coff.h"
211 #define HAVE_SPECIFIC_OBJECT
212 #endif /* defined(alpha_dec_osf4_0) */
213
214 #if !defined(HAVE_SPECIFIC_OBJECT)
215 #error "unable to locate system-specific object files"
216 #endif /* !defined(HAVE_SPECIFIC_OBJECT) */
217
218 /************************************************************************
219  * class SymbolIter
220 ************************************************************************/
221
222 class SymbolIter {
223 public:
224      SymbolIter (const Object     &obj): si_(obj.symbols_) {}
225      SymbolIter (const SymbolIter &src): si_(src.si_) {}
226     ~SymbolIter () {}
227
228     void  reset () { si_.reset(); }
229
230    operator bool() const {
231       return si_;
232    }
233    void operator++(int) { si_++; }
234    
235    const string &currkey() const {
236       return si_.currkey();
237    }
238    const Symbol &currval() const {
239       return si_.currval();
240    }
241
242 private:
243     dictionary_hash_iter<string, Symbol> si_;
244
245     SymbolIter& operator= (const SymbolIter &); // explicitly disallowed
246 };
247
248 #endif /* !defined(_Object_h_) */