Merge branch 'master' into NewInstpoint
[dyninst.git] / parseAPI / src / IA_IAPI.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(IA_IAPI_H)
33 #define IA_IAPI_H
34
35 #include <boost/tuple/tuple.hpp>
36 #include <boost/static_assert.hpp>
37
38 #include "InstructionAdapter.h"
39 #include "InstructionDecoder.h"
40 #include "Instruction.h"
41
42 #include "dyntypes.h"
43
44 #include "CFG.h"
45
46 namespace Dyninst {
47 namespace InsnAdapter {
48
49 class IA_IAPI : public InstructionAdapter {
50     friend class image_func;
51     friend class IA_platformDetails;
52     friend class IA_x86Details;
53     friend class IA_powerDetails;
54     public:
55         IA_IAPI(Dyninst::InstructionAPI::InstructionDecoder dec_,
56                 Address start_, 
57                 Dyninst::ParseAPI::CodeObject* o,
58                 Dyninst::ParseAPI::CodeRegion* r,
59                 Dyninst::InstructionSource *isrc,
60                 Dyninst::ParseAPI::Block * curBlk_);
61                 // We have a iterator, and so can't use the implicit copiers
62                 IA_IAPI(const IA_IAPI &); 
63                 IA_IAPI &operator=(const IA_IAPI &r);
64
65                 virtual ~IA_IAPI() {
66         }
67         void reset(Dyninst::InstructionAPI::InstructionDecoder dec_,
68           Address start, ParseAPI::CodeObject *o,
69           ParseAPI::CodeRegion *r, InstructionSource *isrc, ParseAPI::Block *);
70
71         Dyninst::InstructionAPI::Instruction::Ptr getInstruction();
72     
73         virtual bool hasCFT() const;
74         virtual size_t getSize() const;
75         virtual bool isFrameSetupInsn() const;
76         virtual bool isAbortOrInvalidInsn() const;
77         virtual bool isGarbageInsn() const; //true for insns indicative of bad parse, for defensive mode
78         virtual void
79                 getNewEdges(std::vector<std::pair< Address, 
80                                 Dyninst::ParseAPI::EdgeTypeEnum> >&outEdges, 
81                 Dyninst::ParseAPI::Function * context,
82                 Dyninst::ParseAPI::Block * currBlk,
83                 unsigned int num_insns,
84                 dyn_hash_map<Address, std::string> *pltFuncs) const;
85         virtual InstrumentableLevel getInstLevel(Dyninst::ParseAPI::Function *, unsigned int num_insns ) const;
86         virtual bool isDynamicCall() const;
87         virtual bool isAbsoluteCall() const;
88         virtual bool simulateJump() const;
89         virtual void advance();
90         virtual bool retreat();
91         virtual bool isNop() const;
92         virtual bool isLeave() const;
93         virtual bool isDelaySlot() const;
94         virtual bool isRelocatable(InstrumentableLevel lvl) const;
95         virtual bool isTailCall(Dyninst::ParseAPI::Function *,unsigned int) const;
96         virtual std::pair<bool, Address> getCFT() const;
97         virtual bool isStackFramePreamble() const;
98         virtual bool savesFP() const;
99         virtual bool cleansStack() const;
100         virtual bool isConditional() const;
101         virtual bool isBranch() const;
102         virtual bool isInterruptOrSyscall() const;
103         virtual bool isSyscall() const;
104         virtual bool isInterrupt() const;
105         virtual bool isCall() const;
106         virtual bool isReturnAddrSave(Address &ret_addr) const;
107         virtual bool isNopJump() const;
108         virtual bool sliceReturn(ParseAPI::Block* bit, Address ret_addr, ParseAPI::Function * func) const;
109 private:
110         virtual bool isRealCall() const;
111         virtual bool isThunk() const;
112         bool parseJumpTable(Dyninst::ParseAPI::Block* currBlk,
113              std::vector<std::pair< Address, Dyninst::ParseAPI::EdgeTypeEnum > >& outEdges) const;
114         bool isIPRelativeBranch() const;
115         bool isFrameSetupInsn(Dyninst::InstructionAPI::Instruction::Ptr i) const;
116         virtual bool isReturn(Dyninst::ParseAPI::Function *, Dyninst::ParseAPI::Block* currBlk) const;
117         bool isFakeCall() const;
118         const char *isIATcall() const;
119         bool isLinkerStub() const;
120
121
122         Dyninst::InstructionAPI::InstructionDecoder dec;
123
124         /*
125          * Decoded instruction cache: contains the linear
126          * sequence of instructions decoded by the decoder
127          * underlying this adapter.
128          * 
129          * - curInsnIter == *(allInsns.end()-1)
130          * - (super)->current = curInsnIter->first
131          */
132 public:
133         typedef std::vector< 
134             std::pair<Address, 
135             Dyninst::InstructionAPI::Instruction::Ptr> 
136         > allInsns_t;
137 private:
138         allInsns_t allInsns;
139         Dyninst::InstructionAPI::Instruction::Ptr curInsn() const;
140         allInsns_t::iterator curInsnIter;
141
142         mutable bool validCFT;
143         mutable std::pair<bool, Address> cachedCFT;
144         mutable bool validLinkerStubState;
145         mutable bool cachedLinkerStubState;
146         mutable std::pair<bool, bool> hascftstatus;
147         mutable std::pair<bool, bool> tailCall;
148         static std::map<Architecture, Dyninst::InstructionAPI::RegisterAST::Ptr> framePtr;
149         static std::map<Architecture, Dyninst::InstructionAPI::RegisterAST::Ptr> stackPtr;
150         static std::map<Architecture, Dyninst::InstructionAPI::RegisterAST::Ptr> thePC;
151         static std::map<Address, bool> thunkAtTarget;
152         static void initASTs();
153 };
154
155 }
156 }
157
158
159 #endif // !defined(IA_IAPI_H)