Update copyright to LGPL on all files
[dyninst.git] / dyninstAPI / src / InstructionAdapter.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 #if !defined(INSTRUCTION_ADAPTER_H)
33 #define INSTRUCTION_ADAPTER_H
34
35 #include "image-func.h"
36 #include "instPoint.h"
37
38 #if !defined(ESSENTIAL_PARSING_ENUMS)
39 #define ESSENTIAL_PARSING_ENUMS
40 enum EdgeTypeEnum {
41    ET_CALL,
42    ET_COND_TAKEN,
43    ET_COND_NOT_TAKEN,
44    ET_INDIR,
45    ET_DIRECT,
46    ET_FALLTHROUGH,
47    ET_CATCH,
48    ET_FUNLINK,  // connect block ended by call instruction with next block
49                // (see BIT)
50    ET_NOEDGE
51 };
52
53 // Function return status. We initially assume that all functions
54 // do not return. Unresolvable control flow edges change the status
55 // to UNKNOWN, and return instructions (or the equivalent) change
56 // status to RETURN
57 enum FuncReturnStatus {
58     RS_UNSET,       // convenience for parsing
59     RS_NORETURN,
60     RS_UNKNOWN,
61     RS_RETURN
62 };
63 // There are three levels of function-level "instrumentability":
64 // 1) The function can be instrumented normally with no problems (normal case)
65 // 2) The function contains unresolved indirect branches; we have to assume
66 //    these can go anywhere in the function to be safe, so we must instrument
67 //    safely (e.g., with traps)
68 // 3) The function is flatly uninstrumentable and must not be touched.
69 enum InstrumentableLevel {
70     NORMAL,
71     HAS_BR_INDIR,
72     UNINSTRUMENTABLE
73 };
74 #endif //!defined(ESSENTIAL_PARSING_ENUMS)
75
76 class InstructionAdapter
77 {
78     public:
79         InstructionAdapter(Address start, image_func* f);
80         InstructionAdapter(Address start, image* im);
81         virtual ~InstructionAdapter();
82     // Implemented
83     virtual bool hasCFT() const = 0;
84     virtual size_t getSize() const = 0;
85     virtual bool isFrameSetupInsn() const = 0;
86     virtual bool isAbortOrInvalidInsn() const = 0;
87     virtual bool isAllocInsn() const = 0;
88     // TODO
89     virtual void
90             getNewEdges(pdvector<std::pair< Address, EdgeTypeEnum> >&
91             outEdges, image_basicBlock* currBlk,
92             unsigned int num_insns,
93             dictionary_hash<Address, std::string> *pltFuncs) const =
94 0;
95     virtual bool isDynamicCall() const = 0;
96     virtual bool isAbsoluteCall() const = 0;
97     virtual InstrumentableLevel getInstLevel(unsigned int num_insns) const;
98     virtual FuncReturnStatus getReturnStatus(image_basicBlock* currBlk, unsigned int num_insns) const ;
99     virtual instPointType_t getPointType(unsigned int num_insns,
100                                          dictionary_hash<Address, std::string>
101 *pltFuncs) const;
102     virtual bool hasUnresolvedControlFlow(image_basicBlock* currBlk, unsigned int num_insns)
103 const;
104             virtual bool simulateJump() const= 0;
105     virtual void advance() = 0;
106     virtual bool isNop() const = 0;
107     virtual bool isLeave() const = 0;
108     virtual bool isDelaySlot() const = 0;
109     virtual bool isRelocatable(InstrumentableLevel lvl) const = 0;
110     virtual Address getAddr() const;
111     virtual Address getPrevAddr() const;
112     virtual Address getNextAddr() const;
113     virtual bool checkEntry() const = 0;
114     virtual Address getCFT() const = 0;
115     virtual bool isStackFramePreamble(int& frameSize) const = 0;
116     virtual bool savesFP() const = 0;
117     virtual bool cleansStack() const = 0;
118     virtual bool isConditional() const = 0;
119     virtual bool isBranch() const = 0;
120     virtual bool isInterruptOrSyscall() const = 0;
121     protected:
122         virtual bool isReturn() const = 0;
123         virtual bool isCall() const = 0;
124         virtual bool isTailCall(unsigned int num_insns) const = 0;
125         virtual bool isRealCall() const = 0;
126         Address current;
127     Address previous;
128     mutable bool parsedJumpTable;
129     mutable bool successfullyParsedJumpTable;
130     mutable bool isDynamicCall_;
131     mutable bool checkedDynamicCall_;
132     mutable bool isInvalidCallTarget_;
133     mutable bool checkedInvalidCallTarget_;
134     image_func* context;
135     image* img;
136 };
137
138
139 #endif // !defined(INSTRUCTION_ADAPTER_H)