Update copyright to LGPL on all files
[dyninst.git] / instructionAPI / h / InstructionDecoder.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_DECODER_H)
33 #define INSTRUCTION_DECODER_H
34
35 #include "InstructionAST.h"
36 #include "Expression.h"
37 #include "Operation.h"
38 #include "Operand.h"
39 #include "Instruction.h"
40
41 #include <vector>
42
43 struct ia32_locations;
44 struct ia32_condition;
45 struct ia32_operand;
46 class ia32_instruction;
47 struct ia32_memacc;
48     
49 namespace Dyninst
50 {
51   namespace InstructionAPI
52   {
53     
54     /// The %InstructionDecoder class decodes instructions, given a buffer of bytes and a length,
55     /// and constructs an %Instruction.
56     /// The %InstructionDecoder will, by default, be constructed to decode machine language
57     /// on the platform on which it has been compiled.  The buffer
58     /// will be treated as if there is an instruction stream starting at the beginning of the buffer.
59     /// %InstructionDecoder objects are given a buffer from which to decode at construction.
60     /// Calls to \c decode will proceed to decode instructions sequentially from that buffer until its
61     /// end is reached.  At that point, all subsequent calls to \c decode will return an invalid
62     /// %Instruction object.
63     ///
64     /// An %InstructionDecoder object may alternately be constructed without designating a buffer,
65     /// and the buffer may be specified at the time \c decode is called.  This method of use may be
66     /// more convenient for users who are decoding non-contiguous instructions.
67
68     class InstructionDecoder
69     {
70       friend class Instruction;
71       
72     public:
73       /// Construct an %InstructionDecoder object that decodes from \c buffer, up to \c size bytes.
74       INSTRUCTION_EXPORT InstructionDecoder(const unsigned char* buffer, size_t size);
75       
76       /// Construct an %InstructionDecoder object with no buffer specified.
77       INSTRUCTION_EXPORT InstructionDecoder();
78       
79       INSTRUCTION_EXPORT ~InstructionDecoder();
80       INSTRUCTION_EXPORT InstructionDecoder(const InstructionDecoder& o);
81       /// Decode the current instruction in this %InstructionDecoder object's buffer, interpreting it as 
82       /// machine language of the type understood by this %InstructionDecoder.
83       /// If the buffer does not contain a valid instruction stream, an invalid %Instruction object
84       /// will be returned.  The %Instruction's \c size field will contain the size of the instruction decoded.
85       INSTRUCTION_EXPORT Instruction::Ptr decode();
86       /// Decode the instruction at \c buffer, interpreting it as machine language of the type
87       /// understood by this %InstructionDecoder.  If the buffer does not contain a valid instruction stream, 
88       /// an invalid %Instruction object will be returned.  The %Instruction's \c size field will contain 
89       /// the size of the instruction decoded.
90       INSTRUCTION_EXPORT Instruction::Ptr decode(const unsigned char* buffer);
91       
92       INSTRUCTION_EXPORT void setMode(bool is64);
93       
94     protected:
95       void resetBuffer(const unsigned char* buffer, unsigned int size);
96       
97       bool decodeOperands(std::vector<Expression::Ptr>& operands);
98
99       bool decodeOneOperand(const ia32_operand& operand,
100                             std::vector<Expression::Ptr>& outputOperands);
101       unsigned int decodeOpcode();
102       
103       Expression::Ptr makeSIBExpression(unsigned int opType);
104       Expression::Ptr makeModRMExpression(unsigned int opType);
105       Expression::Ptr makeAddExpression(Expression::Ptr lhs, Expression::Ptr rhs, Result_Type resultType);
106       Expression::Ptr makeMultiplyExpression(Expression::Ptr lhs, Expression::Ptr rhs, Result_Type resultType);
107       Expression::Ptr getModRMDisplacement();
108       int makeRegisterID(unsigned int intelReg, unsigned int opType, bool isExtendedReg = false);
109       Expression::Ptr decodeImmediate(unsigned int opType, unsigned int position, bool isSigned = false);
110       Result_Type makeSizeType(unsigned int opType);
111       
112     private:
113       void doIA32Decode();
114       
115       ia32_locations* locs;
116       ia32_condition* cond;
117       ia32_memacc* mac;
118       ia32_instruction* decodedInstruction;
119       Operation::Ptr m_Operation;
120       bool is32BitMode;
121       bool sizePrefixPresent;
122       const unsigned char* bufferBegin;
123       size_t bufferSize;
124       const unsigned char* rawInstruction;
125       
126       
127     };
128   };
129 };
130
131 #endif //!defined(INSTRUCTION_DECODER_H)