Remove incorrect export declaration
[dyninst.git] / patchAPI / h / PatchModifier.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 #ifndef _PATCH_MODIFIER_H_
32 #define _PATCH_MODIFIER_H_
33
34 #include "dyntypes.h"
35
36 // A collection of methods for user-triggered modification of a PatchAPI CFG,
37 // including "canned" capabilities such as replacing a function or low-level
38 // capabilities such as splitting blocks or redirecting edges. 
39
40 #include "PatchMgr.h"
41 #include "PatchCommon.h"
42
43
44 namespace Dyninst {
45 namespace PatchAPI {
46    class PatchEdge;
47    class PatchBlock;
48    class PatchFunction;
49    class PatchModifier;
50
51 class PATCHAPI_EXPORT InsertedCode {
52    friend class PatchModifier;
53
54   public:
55   InsertedCode() : entry_(NULL) {};
56
57    typedef boost::shared_ptr<InsertedCode> Ptr;
58    PatchBlock *entry() { return entry_; }
59    const std::vector<PatchEdge *> &exits() { return exits_;}
60    const std::set<PatchBlock *> &blocks() { return blocks_; }
61   private:
62    
63    PatchBlock *entry_;
64    std::vector<PatchEdge *> exits_;
65    std::set<PatchBlock *> blocks_;
66 };   
67    
68
69 class PATCHAPI_EXPORT PatchModifier {
70   public:
71    // These are all static methods as this class has no state; so really, 
72    // it's just a namespace. 
73
74    // Redirect the target of an existing edge. 
75    static bool redirect(PatchEdge *edge, PatchBlock *target);
76
77    // Split a block at a provided point.; we double-check whether the address
78    // is a valid instruction boundary unless trust is true. 
79    static PatchBlock *split(PatchBlock *, Address, 
80                                             bool trust = false, 
81                                             Address newlast = (Address)-1);
82    
83    // Remove a block from the CFG; the block must be unreachable
84    // (that is, have no in-edges) unless force is true.
85    static bool remove(std::vector<PatchBlock *> &blocks, bool force = false);
86
87    // As the above, but for functions. 
88    static bool remove(PatchFunction *);
89
90    static InsertedCode::Ptr insert(PatchObject *, SnippetPtr snip, Point *point);
91    static InsertedCode::Ptr insert(PatchObject *, void *start, unsigned size);
92
93   private:
94    static InsertedCode::Ptr insert(PatchObject *, void *start, unsigned size, Address base);
95 };
96
97 };
98 };
99
100 #endif
101