From 203717232e816d42973f05f1c9fbc950914d71dc Mon Sep 17 00:00:00 2001 From: Rusty Wagner Date: Tue, 23 Jul 2019 22:40:39 -0400 Subject: Early HLIL testing --- highlevelilinstruction.h | 713 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 713 insertions(+) create mode 100644 highlevelilinstruction.h (limited to 'highlevelilinstruction.h') diff --git a/highlevelilinstruction.h b/highlevelilinstruction.h new file mode 100644 index 00000000..2ec67fd3 --- /dev/null +++ b/highlevelilinstruction.h @@ -0,0 +1,713 @@ +// Copyright (c) 2019 Vector 35 Inc +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. + +#pragma once + +#include +#include +#include +#ifdef BINARYNINJACORE_LIBRARY +#include "variable.h" +#else +#include "binaryninjaapi.h" +#endif +#include "mediumlevelilinstruction.h" + +#ifdef BINARYNINJACORE_LIBRARY +namespace BinaryNinjaCore +#else +namespace BinaryNinja +#endif +{ + class HighLevelILFunction; + + template + struct HighLevelILInstructionAccessor {}; + + struct HighLevelILInstruction; + struct HighLevelILConstantInstruction; + struct HighLevelILOneOperandInstruction; + struct HighLevelILTwoOperandInstruction; + struct HighLevelILTwoOperandWithCarryInstruction; + struct HighLevelILDoublePrecisionInstruction; + struct MediumLevelILInstruction; + class HighLevelILOperand; + class HighLevelILOperandList; + + enum HighLevelILOperandType + { + IntegerHighLevelOperand, + IndexHighLevelOperand, + IntrinsicHighLevelOperand, + ExprHighLevelOperand, + VariableHighLevelOperand, + SSAVariableHighLevelOperand, + ExprListHighLevelOperand, + SSAVariableListHighLevelOperand + }; + + enum HighLevelILOperandUsage + { + SourceExprHighLevelOperandUsage, + VariableHighLevelOperandUsage, + SSAVariableHighLevelOperandUsage, + DestSSAVariableHighLevelOperandUsage, + DestExprHighLevelOperandUsage, + LeftExprHighLevelOperandUsage, + RightExprHighLevelOperandUsage, + CarryExprHighLevelOperandUsage, + IndexExprHighLevelOperandUsage, + ConditionExprHighLevelOperandUsage, + TrueExprHighLevelOperandUsage, + FalseExprHighLevelOperandUsage, + LoopExprHighLevelOperandUsage, + InitExprHighLevelOperandUsage, + UpdateExprHighLevelOperandUsage, + DefaultExprHighLevelOperandUsage, + HighExprHighLevelOperandUsage, + LowExprHighLevelOperandUsage, + OffsetHighLevelOperandUsage, + ConstantHighLevelOperandUsage, + VectorHighLevelOperandUsage, + IntrinsicHighLevelOperandUsage, + TargetHighLevelOperandUsage, + ParameterExprsHighLevelOperandUsage, + SourceExprsHighLevelOperandUsage, + DestExprsHighLevelOperandUsage, + BlockExprsHighLevelOperandUsage, + CasesHighLevelOperandUsage, + SourceSSAVariablesHighLevelOperandUsage + }; +} + +namespace std +{ + template<> struct hash + { + typedef BNHighLevelILOperation argument_type; + typedef int result_type; + result_type operator()(argument_type const& value) const + { + return (result_type)value; + } + }; + +#ifdef BINARYNINJACORE_LIBRARY + template<> struct hash +#else + template<> struct hash +#endif + { +#ifdef BINARYNINJACORE_LIBRARY + typedef BinaryNinjaCore::HighLevelILOperandUsage argument_type; +#else + typedef BinaryNinja::HighLevelILOperandUsage argument_type; +#endif + typedef int result_type; + result_type operator()(argument_type const& value) const + { + return (result_type)value; + } + }; +} + +#ifdef BINARYNINJACORE_LIBRARY +namespace BinaryNinjaCore +#else +namespace BinaryNinja +#endif +{ + class HighLevelILInstructionAccessException: public std::exception + { + public: + HighLevelILInstructionAccessException(): std::exception() {} + virtual const char* what() const NOEXCEPT { return "invalid access to HLIL instruction"; } + }; + + class HighLevelILIntegerList + { + struct ListIterator + { +#ifdef BINARYNINJACORE_LIBRARY + HighLevelILFunction* function; +#else + Ref function; +#endif + BNHighLevelILInstruction instr; + size_t operand, count; + + bool operator==(const ListIterator& a) const; + bool operator!=(const ListIterator& a) const; + bool operator<(const ListIterator& a) const; + ListIterator& operator++(); + uint64_t operator*(); + HighLevelILFunction* GetFunction() const { return function; } + }; + + ListIterator m_start; + + public: + typedef ListIterator const_iterator; + + HighLevelILIntegerList(HighLevelILFunction* func, const BNHighLevelILInstruction& instr, size_t count); + + const_iterator begin() const; + const_iterator end() const; + size_t size() const; + uint64_t operator[](size_t i) const; + + operator std::vector() const; + }; + + class HighLevelILInstructionList + { + struct ListIterator + { + size_t instructionIndex; + HighLevelILIntegerList::const_iterator pos; + bool operator==(const ListIterator& a) const { return pos == a.pos; } + bool operator!=(const ListIterator& a) const { return pos != a.pos; } + bool operator<(const ListIterator& a) const { return pos < a.pos; } + ListIterator& operator++() { ++pos; return *this; } + const HighLevelILInstruction operator*(); + }; + + HighLevelILIntegerList m_list; + + public: + typedef ListIterator const_iterator; + + HighLevelILInstructionList(HighLevelILFunction* func, const BNHighLevelILInstruction& instr, size_t count); + + const_iterator begin() const; + const_iterator end() const; + size_t size() const; + const HighLevelILInstruction operator[](size_t i) const; + + operator std::vector() const; + }; + + class HighLevelILSSAVariableList + { + struct ListIterator + { + HighLevelILIntegerList::const_iterator pos; + bool operator==(const ListIterator& a) const { return pos == a.pos; } + bool operator!=(const ListIterator& a) const { return pos != a.pos; } + bool operator<(const ListIterator& a) const { return pos < a.pos; } + ListIterator& operator++() { ++pos; ++pos; return *this; } + const SSAVariable operator*(); + }; + + HighLevelILIntegerList m_list; + + public: + typedef ListIterator const_iterator; + + HighLevelILSSAVariableList(HighLevelILFunction* func, const BNHighLevelILInstruction& instr, size_t count); + + const_iterator begin() const; + const_iterator end() const; + size_t size() const; + const SSAVariable operator[](size_t i) const; + + operator std::vector() const; + }; + + struct HighLevelILInstructionBase: public BNHighLevelILInstruction + { +#ifdef BINARYNINJACORE_LIBRARY + HighLevelILFunction* function; +#else + Ref function; +#endif + size_t exprIndex; + + static std::unordered_map operandTypeForUsage; + static std::unordered_map> operationOperandUsage; + static std::unordered_map> operationOperandIndex; + + HighLevelILOperandList GetOperands() const; + + uint64_t GetRawOperandAsInteger(size_t operand) const; + size_t GetRawOperandAsIndex(size_t operand) const; + HighLevelILInstruction GetRawOperandAsExpr(size_t operand) const; + Variable GetRawOperandAsVariable(size_t operand) const; + SSAVariable GetRawOperandAsSSAVariable(size_t operand) const; + HighLevelILInstructionList GetRawOperandAsExprList(size_t operand) const; + HighLevelILSSAVariableList GetRawOperandAsSSAVariableList(size_t operand) const; + + void UpdateRawOperand(size_t operandIndex, ExprId value); + void UpdateRawOperandAsSSAVariableList(size_t operandIndex, const std::vector& vars); + void UpdateRawOperandAsExprList(size_t operandIndex, const std::vector& exprs); + void UpdateRawOperandAsExprList(size_t operandIndex, const std::vector& exprs); + + size_t GetMediumLevelILExprIndex() const; + bool HasMediumLevelIL() const; + MediumLevelILInstruction GetMediumLevelIL() const; + MediumLevelILInstruction GetMediumLevelILSSAForm() const; + + void Replace(ExprId expr); + + size_t GetInstructionIndex() const; + HighLevelILInstruction GetInstruction() const; + + template + HighLevelILInstructionAccessor& As() + { + if (operation != N) + throw HighLevelILInstructionAccessException(); + return *(HighLevelILInstructionAccessor*)this; + } + HighLevelILOneOperandInstruction& AsOneOperand() + { + return *(HighLevelILOneOperandInstruction*)this; + } + HighLevelILTwoOperandInstruction& AsTwoOperand() + { + return *(HighLevelILTwoOperandInstruction*)this; + } + HighLevelILTwoOperandWithCarryInstruction& AsTwoOperandWithCarry() + { + return *(HighLevelILTwoOperandWithCarryInstruction*)this; + } + + template + const HighLevelILInstructionAccessor& As() const + { + if (operation != N) + throw HighLevelILInstructionAccessException(); + return *(const HighLevelILInstructionAccessor*)this; + } + const HighLevelILConstantInstruction& AsConstant() const + { + return *(const HighLevelILConstantInstruction*)this; + } + const HighLevelILOneOperandInstruction& AsOneOperand() const + { + return *(const HighLevelILOneOperandInstruction*)this; + } + const HighLevelILTwoOperandInstruction& AsTwoOperand() const + { + return *(const HighLevelILTwoOperandInstruction*)this; + } + const HighLevelILTwoOperandWithCarryInstruction& AsTwoOperandWithCarry() const + { + return *(const HighLevelILTwoOperandWithCarryInstruction*)this; + } + }; + + struct HighLevelILInstruction: public HighLevelILInstructionBase + { + HighLevelILInstruction(); + HighLevelILInstruction(HighLevelILFunction* func, const BNHighLevelILInstruction& instr, size_t expr); + HighLevelILInstruction(const HighLevelILInstructionBase& instr); + + void VisitExprs(const std::function& func) const; + + ExprId CopyTo(HighLevelILFunction* dest) const; + ExprId CopyTo(HighLevelILFunction* dest, + const std::function& subExprHandler) const; + + // Templated accessors for instruction operands, use these for efficient access to a known instruction + template HighLevelILInstruction GetSourceExpr() const { return As().GetSourceExpr(); } + template Variable GetVariable() const { return As().GetVariable(); } + template SSAVariable GetSSAVariable() const { return As().GetSSAVariable(); } + template SSAVariable GetDestSSAVariable() const { return As().GetDestSSAVariable(); } + template HighLevelILInstruction GetDestExpr() const { return As().GetDestExpr(); } + template HighLevelILInstruction GetLeftExpr() const { return As().GetLeftExpr(); } + template HighLevelILInstruction GetRightExpr() const { return As().GetRightExpr(); } + template HighLevelILInstruction GetCarryExpr() const { return As().GetCarryExpr(); } + template HighLevelILInstruction GetIndexExpr() const { return As().GetIndexExpr(); } + template HighLevelILInstruction GetConditionExpr() const { return As().GetConditionExpr(); } + template HighLevelILInstruction GetTrueExpr() const { return As().GetTrueExpr(); } + template HighLevelILInstruction GetFalseExpr() const { return As().GetFalseExpr(); } + template HighLevelILInstruction GetLoopExpr() const { return As().GetLoopExpr(); } + template HighLevelILInstruction GetInitExpr() const { return As().GetInitExpr(); } + template HighLevelILInstruction GetUpdateExpr() const { return As().GetUpdateExpr(); } + template HighLevelILInstruction GetDefaultExpr() const { return As().GetDefaultExpr(); } + template HighLevelILInstruction GetHighExpr() const { return As().GetHighExpr(); } + template HighLevelILInstruction GetLowExpr() const { return As().GetLowExpr(); } + template uint64_t GetOffset() const { return As().GetOffset(); } + template int64_t GetConstant() const { return As().GetConstant(); } + template int64_t GetVector() const { return As().GetVector(); } + template uint32_t GetIntrinsic() const { return As().GetIntrinsic(); } + template size_t GetTarget() const { return As().GetTarget(); } + template HighLevelILInstructionList GetParameterExprs() const { return As().GetParameterExprs(); } + template HighLevelILInstructionList GetSourceExprs() const { return As().GetSourceExprs(); } + template HighLevelILInstructionList GetDestExprs() const { return As().GetDestExprs(); } + template HighLevelILInstructionList GetBlockExprs() const { return As().GetBlockExprs(); } + template HighLevelILInstructionList GetCases() const { return As().GetCases(); } + template HighLevelILSSAVariableList GetSourceSSAVariables() const { return As().GetSourceSSAVariables(); } + + template void SetSSAVersion(size_t version) { As().SetSSAVersion(version); } + template void SetParameterExprs(const std::vector& params) { As().SetParameterExprs(params); } + template void SetParameterExprs(const std::vector& params) { As().SetParameterExprs(params); } + template void SetSourceExprs(const std::vector& params) { As().SetSourceExprs(params); } + template void SetSourceExprs(const std::vector& params) { As().SetSourceExprs(params); } + template void SetDestExprs(const std::vector& params) { As().SetDestExprs(params); } + template void SetDestExprs(const std::vector& params) { As().SetDestExprs(params); } + template void SetBlockExprs(const std::vector& params) { As().SetBlockExprs(params); } + template void SetBlockExprs(const std::vector& params) { As().SetBlockExprs(params); } + template void SetCases(const std::vector& params) { As().SetCases(params); } + template void SetCases(const std::vector& params) { As().SetCases(params); } + template void SetSourceSSAVariables(const std::vector& vars) { As().SetSourceSSAVariables(vars); } + + bool GetOperandIndexForUsage(HighLevelILOperandUsage usage, size_t& operandIndex) const; + + // Generic accessors for instruction operands, these will throw a HighLevelILInstructionAccessException + // on type mismatch. These are slower than the templated versions above. + HighLevelILInstruction GetSourceExpr() const; + Variable GetVariable() const; + SSAVariable GetSSAVariable() const; + SSAVariable GetDestSSAVariable() const; + HighLevelILInstruction GetDestExpr() const; + HighLevelILInstruction GetLeftExpr() const; + HighLevelILInstruction GetRightExpr() const; + HighLevelILInstruction GetCarryExpr() const; + HighLevelILInstruction GetIndexExpr() const; + HighLevelILInstruction GetConditionExpr() const; + HighLevelILInstruction GetTrueExpr() const; + HighLevelILInstruction GetFalseExpr() const; + HighLevelILInstruction GetLoopExpr() const; + HighLevelILInstruction GetInitExpr() const; + HighLevelILInstruction GetUpdateExpr() const; + HighLevelILInstruction GetDefaultExpr() const; + HighLevelILInstruction GetHighExpr() const; + HighLevelILInstruction GetLowExpr() const; + uint64_t GetOffset() const; + int64_t GetConstant() const; + int64_t GetVector() const; + uint32_t GetIntrinsic() const; + size_t GetTarget() const; + HighLevelILInstructionList GetParameterExprs() const; + HighLevelILInstructionList GetSourceExprs() const; + HighLevelILInstructionList GetDestExprs() const; + HighLevelILInstructionList GetBlockExprs() const; + HighLevelILInstructionList GetCases() const; + HighLevelILSSAVariableList GetSourceSSAVariables() const; + }; + + class HighLevelILOperand + { + HighLevelILInstruction m_instr; + HighLevelILOperandUsage m_usage; + HighLevelILOperandType m_type; + size_t m_operandIndex; + + public: + HighLevelILOperand(const HighLevelILInstruction& instr, HighLevelILOperandUsage usage, + size_t operandIndex); + + HighLevelILOperandType GetType() const { return m_type; } + HighLevelILOperandUsage GetUsage() const { return m_usage; } + + uint64_t GetInteger() const; + size_t GetIndex() const; + uint32_t GetIntrinsic() const; + HighLevelILInstruction GetExpr() const; + Variable GetVariable() const; + SSAVariable GetSSAVariable() const; + HighLevelILInstructionList GetExprList() const; + HighLevelILSSAVariableList GetSSAVariableList() const; + }; + + class HighLevelILOperandList + { + struct ListIterator + { + const HighLevelILOperandList* owner; + std::vector::const_iterator pos; + bool operator==(const ListIterator& a) const { return pos == a.pos; } + bool operator!=(const ListIterator& a) const { return pos != a.pos; } + bool operator<(const ListIterator& a) const { return pos < a.pos; } + ListIterator& operator++() { ++pos; return *this; } + const HighLevelILOperand operator*(); + }; + + HighLevelILInstruction m_instr; + const std::vector& m_usageList; + const std::unordered_map& m_operandIndexMap; + + public: + typedef ListIterator const_iterator; + + HighLevelILOperandList(const HighLevelILInstruction& instr, + const std::vector& usageList, + const std::unordered_map& operandIndexMap); + + const_iterator begin() const; + const_iterator end() const; + size_t size() const; + const HighLevelILOperand operator[](size_t i) const; + + operator std::vector() const; + }; + + struct HighLevelILConstantInstruction: public HighLevelILInstructionBase + { + int64_t GetConstant() const { return GetRawOperandAsInteger(0); } + }; + + struct HighLevelILOneOperandInstruction: public HighLevelILInstructionBase + { + HighLevelILInstruction GetSourceExpr() const { return GetRawOperandAsExpr(0); } + }; + + struct HighLevelILTwoOperandInstruction: public HighLevelILInstructionBase + { + HighLevelILInstruction GetLeftExpr() const { return GetRawOperandAsExpr(0); } + HighLevelILInstruction GetRightExpr() const { return GetRawOperandAsExpr(1); } + }; + + struct HighLevelILTwoOperandWithCarryInstruction: public HighLevelILInstructionBase + { + HighLevelILInstruction GetLeftExpr() const { return GetRawOperandAsExpr(0); } + HighLevelILInstruction GetRightExpr() const { return GetRawOperandAsExpr(1); } + HighLevelILInstruction GetCarryExpr() const { return GetRawOperandAsExpr(2); } + }; + + // Implementations of each instruction to fetch the correct operand value for the valid operands, these + // are derived from HighLevelILInstructionBase so that invalid operand accessor functions will generate + // a compiler error. + template <> struct HighLevelILInstructionAccessor: public HighLevelILInstructionBase + { + HighLevelILInstructionList GetBlockExprs() const { return GetRawOperandAsExprList(0); } + }; + template <> struct HighLevelILInstructionAccessor: public HighLevelILInstructionBase + { + HighLevelILInstruction GetConditionExpr() const { return GetRawOperandAsExpr(0); } + HighLevelILInstruction GetTrueExpr() const { return GetRawOperandAsExpr(1); } + HighLevelILInstruction GetFalseExpr() const { return GetRawOperandAsExpr(2); } + }; + template <> struct HighLevelILInstructionAccessor: public HighLevelILInstructionBase + { + HighLevelILInstruction GetConditionExpr() const { return GetRawOperandAsExpr(0); } + HighLevelILInstruction GetLoopExpr() const { return GetRawOperandAsExpr(1); } + }; + template <> struct HighLevelILInstructionAccessor: public HighLevelILInstructionBase + { + HighLevelILInstruction GetLoopExpr() const { return GetRawOperandAsExpr(0); } + HighLevelILInstruction GetConditionExpr() const { return GetRawOperandAsExpr(1); } + }; + template <> struct HighLevelILInstructionAccessor: public HighLevelILInstructionBase + { + HighLevelILInstruction GetInitExpr() const { return GetRawOperandAsExpr(0); } + HighLevelILInstruction GetConditionExpr() const { return GetRawOperandAsExpr(1); } + HighLevelILInstruction GetUpdateExpr() const { return GetRawOperandAsExpr(2); } + HighLevelILInstruction GetLoopExpr() const { return GetRawOperandAsExpr(3); } + }; + template <> struct HighLevelILInstructionAccessor: public HighLevelILInstructionBase + { + HighLevelILInstruction GetConditionExpr() const { return GetRawOperandAsExpr(0); } + HighLevelILInstruction GetDefaultExpr() const { return GetRawOperandAsExpr(1); } + HighLevelILInstructionList GetCases() const { return GetRawOperandAsExprList(2); } + }; + template <> struct HighLevelILInstructionAccessor: public HighLevelILInstructionBase + { + HighLevelILInstruction GetConditionExpr() const { return GetRawOperandAsExpr(0); } + HighLevelILInstruction GetTrueExpr() const { return GetRawOperandAsExpr(1); } + }; + template <> struct HighLevelILInstructionAccessor: public HighLevelILInstructionBase + { + size_t GetTarget() const { return GetRawOperandAsIndex(0); } + }; + template <> struct HighLevelILInstructionAccessor: public HighLevelILInstructionBase + { + size_t GetTarget() const { return GetRawOperandAsIndex(0); } + }; + + template <> struct HighLevelILInstructionAccessor: public HighLevelILInstructionBase + { + HighLevelILInstructionList GetSourceExprs() const { return GetRawOperandAsExprList(0); } + void SetSourceExprs(const std::vector& exprs) { UpdateRawOperandAsExprList(0, exprs); } + }; + + template <> struct HighLevelILInstructionAccessor: public HighLevelILInstructionBase + { + HighLevelILInstruction GetDestExpr() const { return GetRawOperandAsExpr(0); } + HighLevelILInstruction GetSourceExpr() const { return GetRawOperandAsExpr(1); } + }; + + template <> struct HighLevelILInstructionAccessor: public HighLevelILInstructionBase + { + HighLevelILInstruction GetSourceExpr() const { return GetRawOperandAsExpr(0); } + uint64_t GetOffset() const { return GetRawOperandAsInteger(1); } + }; + template <> struct HighLevelILInstructionAccessor: public HighLevelILInstructionBase + { + HighLevelILInstruction GetSourceExpr() const { return GetRawOperandAsExpr(0); } + uint64_t GetOffset() const { return GetRawOperandAsInteger(1); } + }; + template <> struct HighLevelILInstructionAccessor: public HighLevelILInstructionBase + { + HighLevelILInstruction GetSourceExpr() const { return GetRawOperandAsExpr(0); } + HighLevelILInstruction GetIndexExpr() const { return GetRawOperandAsExpr(1); } + }; + template <> struct HighLevelILInstructionAccessor: public HighLevelILInstructionBase + { + HighLevelILInstruction GetHighExpr() const { return GetRawOperandAsExpr(0); } + HighLevelILInstruction GetLowExpr() const { return GetRawOperandAsExpr(1); } + }; + + template <> struct HighLevelILInstructionAccessor: public HighLevelILInstructionBase + { + Variable GetVariable() const { return GetRawOperandAsVariable(0); } + }; + template <> struct HighLevelILInstructionAccessor: public HighLevelILInstructionBase + { + SSAVariable GetSSAVariable() const { return GetRawOperandAsSSAVariable(0); } + void SetSSAVersion(size_t version) { UpdateRawOperand(1, version); } + }; + template <> struct HighLevelILInstructionAccessor: public HighLevelILInstructionBase + { + SSAVariable GetDestSSAVariable() const { return GetRawOperandAsSSAVariable(0); } + HighLevelILSSAVariableList GetSourceSSAVariables() const { return GetRawOperandAsSSAVariableList(2); } + void SetSourceSSAVariables(const std::vector& vars) { UpdateRawOperandAsSSAVariableList(2, vars); } + }; + + template <> struct HighLevelILInstructionAccessor: public HighLevelILInstructionBase + { + HighLevelILInstruction GetDestExpr() const { return GetRawOperandAsExpr(0); } + }; + + template <> struct HighLevelILInstructionAccessor: public HighLevelILInstructionBase + { + HighLevelILInstruction GetDestExpr() const { return GetRawOperandAsExpr(0); } + HighLevelILInstructionList GetParameterExprs() const { return GetRawOperandAsExprList(1); } + }; + template <> struct HighLevelILInstructionAccessor: public HighLevelILInstructionBase + { + HighLevelILInstructionList GetParameterExprs() const { return GetRawOperandAsExprList(0); } + }; + template <> struct HighLevelILInstructionAccessor: public HighLevelILInstructionBase + { + HighLevelILInstruction GetDestExpr() const { return GetRawOperandAsExpr(0); } + HighLevelILInstructionList GetParameterExprs() const { return GetRawOperandAsExprList(1); } + }; + + template <> struct HighLevelILInstructionAccessor: public HighLevelILInstructionBase + { + HighLevelILInstructionList GetDestExprs() const { return GetRawOperandAsExprList(0); } + HighLevelILInstruction GetSourceExpr() const { return GetRawOperandAsExpr(2); } + }; + + template <> struct HighLevelILInstructionAccessor: public HighLevelILInstructionBase + { + uint32_t GetIntrinsic() const { return (uint32_t)GetRawOperandAsInteger(2); } + HighLevelILInstructionList GetParameterExprs() const { return GetRawOperandAsExprList(3); } + }; + + template <> struct HighLevelILInstructionAccessor: public HighLevelILInstructionBase + { + int64_t GetVector() const { return GetRawOperandAsInteger(0); } + }; + + template <> struct HighLevelILInstructionAccessor: public HighLevelILConstantInstruction + { + int64_t GetConstant() const { return GetRawOperandAsInteger(0); } + int64_t GetOffset() const { return GetRawOperandAsInteger(1); } + }; + + template <> struct HighLevelILInstructionAccessor: public HighLevelILInstructionBase {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILInstructionBase {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILInstructionBase {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILInstructionBase {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILInstructionBase {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILInstructionBase {}; + + template <> struct HighLevelILInstructionAccessor: public HighLevelILConstantInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILConstantInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILConstantInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILConstantInstruction {}; + + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandInstruction {}; + + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandWithCarryInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandWithCarryInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandWithCarryInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILTwoOperandWithCarryInstruction {}; + + template <> struct HighLevelILInstructionAccessor: public HighLevelILOneOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILOneOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILOneOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILOneOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILOneOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILOneOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILOneOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILOneOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILOneOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILOneOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILOneOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILOneOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILOneOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILOneOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILOneOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILOneOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILOneOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILOneOperandInstruction {}; + template <> struct HighLevelILInstructionAccessor: public HighLevelILOneOperandInstruction {}; +} -- cgit v1.3.1