* Correctly open the first dependency that matches the ABI of its parent.
[dyninst.git] / dyninstAPI / h / BPatch_binaryEdit.h
1 /*
2  * Copyright (c) 1996-2004 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 #ifndef _BPatch_binaryEdit_h_
43 #define _BPatch_binaryEdit_h_
44
45
46 #include "BPatch_snippet.h"
47 #include "BPatch_dll.h"
48 #include "BPatch_Vector.h"
49 #include "BPatch_image.h"
50 #include "BPatch_eventLock.h"
51 #include "BPatch_point.h"
52 #include "BPatch_addressSpace.h"
53
54 #include "BPatch_callbacks.h"
55
56 #include <vector>
57
58 #include <stdio.h>
59 #include <signal.h>
60
61 class process;
62 class BinaryEdit;
63 class AddressSpace;
64 class dyn_thread;
65 class miniTrampHandle;
66 class miniTramp;
67 class BPatch;
68 class BPatch_thread;
69 class BPatch_process;
70 class BPatch_funcMap;
71 class BPatch_instpMap;
72 class int_function;
73 class rpcMgr;
74 struct batchInsertionRecord;
75
76 class BPATCH_DLL_EXPORT BPatch_binaryEdit : public BPatch_addressSpace {
77     friend class BPatch;
78     friend class BPatch_image;
79     friend class BPatch_function;
80     friend class BPatch_frame;
81     friend class BPatch_module;
82     friend class BPatch_basicBlock;
83     friend class BPatch_flowGraph;
84     friend class BPatch_loopTreeNode;
85     friend class BPatch_point;
86     friend class BPatch_funcCallExpr;
87     friend class BPatch_instruction;
88     friend class AstNode; // AST needs to translate instPoint to
89     friend class AstOperatorNode;
90     friend class AstMemoryNode;
91
92     private:
93     std::map<std::string, BinaryEdit *> llBinEdits;
94     BinaryEdit *origBinEdit;
95
96     BinaryEdit *rtLib;
97
98     BPatch_binaryEdit(const char *path, bool openDependencies);
99     bool creation_error;
100
101     bool replaceTrapHandler();
102     
103
104     protected:
105     void getAS(std::vector<AddressSpace *> &as);
106
107     public:
108
109     bool isMultiThreadCapable() const;
110     bool getType();
111     bool getTerminated() {return false;}
112     bool getMutationsActive() {return true;}
113
114     // BPatch_binaryEdit::writeFile
115     API_EXPORT(Int, (outFile),
116                bool,writeFile,(const char * outFile));
117
118   
119     //  BPatch_binaryEdit::~BPatch_binaryEdit
120     //
121     //  Destructor
122     API_EXPORT_DTOR(_dtor, (),
123     ~,BPatch_binaryEdit,());
124
125     API_EXPORT(Int, (),
126     BPatch_image *,getImage,());
127
128     //  BPatch_binaryEdit::beginInsertionSet()
129     //
130     //  Start the batch insertion of multiple points; all calls to insertSnippet*
131     //  after this call will not actually instrument until finalizeInsertionSet is
132     //  called
133
134     API_EXPORT_V(Int, (),
135                  void, beginInsertionSet, ());
136
137     //  BPatch_binaryEdit::finalizeInsertionSet()
138     //
139     //  Finalizes all instrumentation logically added since a call to beginInsertionSet.
140     //  Returns true if all instrumentation was successfully inserted; otherwise, none
141     //  was. Individual instrumentation can be manipulated via the BPatchSnippetHandles
142     //  returned from individual calls to insertSnippet.
143     //
144     //  atomic: if true, all instrumentation will be removed if any fails to go in.
145     //  modified: if provided, and set to true by finalizeInsertionSet, additional
146     //            steps were taken to make the installation work, such as modifying
147     //            process state.  Note that such steps will be taken whether or not
148     //            a variable is provided.
149
150     API_EXPORT(Int, (atomic, modified),
151                bool, finalizeInsertionSet, (bool atomic, bool *modified = NULL));
152                                        
153     // BPatch_binaryEdit::loadLibrary
154     //
155     //  Load a shared library into the mutatee's address space
156     //  Returns true if successful
157
158     API_EXPORT_VIRT(Int, (libname, reload),
159     bool, loadLibrary,(const char *libname, bool reload = false));
160 };    
161
162 #endif /* BPatch_binaryEdit_h_ */