#ifndef STARSInstruction_h #define STARSInstruction_h #include <memory> #include <cstddef> #include <cstdint> #include <assert.h> #include <map> #include "interfaces/STARSTypes.h" #include "interfaces/SMPDBInterface.h" #include "interfaces/abstract/STARSInstructionID.h" class SMPInstr; class STARS_Instruction_t { public: // Constructors and destructors STARS_Instruction_t(const STARS_InstructionID_t& p_id) : m_id(p_id) { p_id.AddIDToInsnMapping(this);} // Data initialization methods virtual bool STARS_GetCmd(void) = 0; // Get (accessor) methods virtual uint16_t GetSize(void) const = 0; // Size of instruction in bytes virtual uint16_t GetIDAOpcode(void) = 0; virtual STARS_InstructionID_t GetNextInstructionID(void) const = 0; virtual STARS_InstructionID_t GetTargetInstructionID(void) const = 0; virtual uint32_t GetInstFeatures(void) const = 0; virtual STARSOpndTypePtr GetOpnd(std::size_t OpndNum) const = 0; // Set (mutator) methods virtual void SetOpUsed(std::size_t OpndNum) = 0; // set the USE bit virtual void SetOpNotUsed(std::size_t OpndNum) = 0; // reset the USE bit virtual void SetOpDefed(std::size_t OpndNum) = 0; // set the DEF bit virtual void SetOpNotDefed(std::size_t OpndNum) = 0; // reset the DEF bit virtual void RemoveIDAOp1ForIMUL(void) = 0; // Fix up IDA Pro IMUL instruction by removing operand 1 // Query methods virtual bool HasRepeatIfEqualPrefix(void) const = 0; virtual bool HasRepeatIfNotEqualPrefix(void) const = 0; virtual bool HasAnyRepeatPrefix(void) const = 0; virtual bool OpcodeDefaultsTo64BitOperands(void); virtual bool Has64BitOperands(void) = 0; virtual bool Uses64BitAddressing(void) const = 0; virtual bool Uses32BitAddressing(void) const = 0; virtual bool IsRegOpnd(std::size_t OpndNum) const = 0; virtual bool IsImmedOpnd(std::size_t OpndNum) const = 0; virtual bool RegOpndMatches(std::size_t OpndNum, STARS_regnum_t RegNum) const = 0; virtual bool IsUseOpnd(std::size_t OpndNum) const = 0; virtual bool IsDefOpnd(std::size_t OpndNum) const = 0; virtual bool IsBranchToFarChunk(SMPInstr *CurrInst, STARS_ea_t &TargetAddr) = 0; virtual bool HasImplicitlyModifiedRegs(void) const = 0; // Modifies regs that do not appear as operands, e.g. many mul/div virtual STARS_InstructionID_Set_t GetReferencedInstructionIDs(bool &success) = 0; virtual STARS_InstructionID_Set_t GetTargetedInstructionIDs(bool &success); // Operand creation methods virtual STARSOpndTypePtr MakeVoidOpnd(void) const = 0; virtual STARSOpndTypePtr MakeImmediateOpnd(STARS_uval_t value) const = 0; virtual STARSOpndTypePtr MakeRegOpnd(STARS_regnum_t RegNum) = 0; virtual STARSOpndTypePtr MakeFloatingPointRegOpnd(STARS_regnum_t RegNum) = 0; virtual STARSOpndTypePtr MakeMMXRegOpnd(STARS_regnum_t RegNum) = 0; virtual STARSOpndTypePtr MakeXMMRegOpnd(STARS_regnum_t RegNum) = 0; virtual STARSOpndTypePtr MakeYMMRegOpnd(STARS_regnum_t RegNum) = 0; virtual STARSOpndTypePtr MakeNearPointerOpnd(STARS_ea_t TargetAddr) const = 0; virtual STARSOpndTypePtr MakeMemDisplacementOpnd(STARS_regnum_t BaseRegNum, STARS_regnum_t IndexRegNum, uint16_t ScaleFactor, STARS_ea_t offset) = 0; virtual STARSOpndTypePtr MakeMemPhraseOpnd(STARS_regnum_t BaseRegNum, STARS_regnum_t IndexRegNum, uint16_t ScaleFactor) = 0; // Analysis methods virtual bool IsPushFromFixedCall(void) const = 0; // Is push from a call that became a push/jump pair? // Analyze the indirect jump at IndirJumpInst, put switch table info in TableInfo if available, return false otherwise. // Note: The TableInfo.FollowNodeNum field must be determined by later analysis. virtual bool AnalyzeSwitchStatement(SMPInstr *IndirJumpInst, struct SwitchTableInfo &TableInfo); virtual void Dump() { } ; protected: STARS_InstructionID_t m_id; }; #endif