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