Calculation of immediate operand in logical immediate instructions was done wrong...
[dyninst.git] / instructionAPI / h / Register.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 #if !defined(REGISTER_H)
32 #define REGISTER_H
33
34 #include "Expression.h"
35 #include <vector>
36 #include <map>
37 #include <sstream>
38
39 #include "dyn_regs.h"
40
41 namespace Dyninst
42 {
43   namespace InstructionAPI
44   {
45     /// A %RegisterAST object represents a register contained in an operand.
46     /// As a %RegisterAST is a %Expression, it may contain the physical register's contents if
47     /// they are known.
48     ///
49     class INSTRUCTION_EXPORT RegisterAST : public Expression
50     {
51     public:
52       /// \brief A type definition for a reference-counted pointer to a %RegisterAST.
53       typedef boost::shared_ptr<RegisterAST> Ptr;
54       
55       /// Construct a register, assigning it the ID \c id.
56       RegisterAST(MachRegister r);
57       RegisterAST(MachRegister r, unsigned int lowbit, unsigned int highbit);
58       RegisterAST(MachRegister r, unsigned int lowbit, unsigned int highbit, Result_Type regType);
59   
60       virtual ~RegisterAST();
61       
62       /// By definition, a %RegisterAST object has no children.
63       /// \param children Since a %RegisterAST has no children, the \c children parameter is unchanged by this method.
64       virtual void getChildren(vector<InstructionAST::Ptr>& children) const;
65       virtual void getChildren(vector<Expression::Ptr>& children) const;
66
67       /// By definition, the use set of a %RegisterAST object is itself.
68       /// \param uses This %RegisterAST will be inserted into \c uses.
69       virtual void getUses(set<InstructionAST::Ptr>& uses);
70
71       /// \c isUsed returns true if \c findMe is a %RegisterAST that represents
72       /// the same register as this %RegisterAST, and false otherwise.
73       virtual bool isUsed(InstructionAST::Ptr findMe) const;
74
75       /// The \c format method on a %RegisterAST object returns the name associated with its ID.
76       virtual std::string format(formatStyle how = defaultStyle) const;
77
78       /// Utility function to get a Register object that represents the program counter.
79       ///
80       /// \c makePC is provided to support platform-independent control flow analysis.
81       static RegisterAST makePC(Dyninst::Architecture arch);
82
83       /// We define a partial ordering on registers by their register number so that they may be placed into sets
84       /// or other sorted containers.
85       bool operator<(const RegisterAST& rhs) const;
86
87       /// The \c getID function returns the ID number of a register.
88       MachRegister getID() const;
89       unsigned int lowBit() const {
90           return m_Low; }
91     unsigned int highBit() const {
92         return m_High; }
93
94       /// Utility function to hide aliasing complexity on platforms (IA-32) that allow addressing part 
95       /// or all of a register
96       // Note: not const because it may return *this...
97       static RegisterAST::Ptr promote(const InstructionAST::Ptr reg);
98       static RegisterAST::Ptr promote(const RegisterAST* reg);
99       
100       virtual void apply(Visitor* v);
101       virtual bool bind(Expression* e, const Result& val);
102
103     protected:
104       virtual bool isStrictEqual(const InstructionAST& rhs) const;
105       virtual bool isFlag() const;
106       virtual bool checkRegID(MachRegister id, unsigned int low, unsigned int high) const;
107       MachRegister getPromotedReg() const;
108       
109     private:
110       MachRegister m_Reg;
111       unsigned int m_Low;
112       unsigned int m_High;
113     };
114     
115   };
116 };
117
118
119   
120
121 #endif // !defined(REGISTER_H)