Skip to content
Snippets Groups Projects
STARSInstruction.h 4.63 KiB
Newer Older
#ifndef STARSInstruction_h
#define STARSInstruction_h

#include <cstddef>
#include <cstdint>

#include <assert.h>
#include <map>

#include "interfaces/STARSTypes.h"
#include "interfaces/SMPDBInterface.h"
#include "interfaces/abstract/STARSInstructionID.h"
class STARS_Instruction_t
{
	public:

		// Constructors and destructors
		STARS_Instruction_t(const STARS_InstructionID_t& p_id) : m_id(p_id) 
		{ 
			objects_created++;
			p_id.AddIDToInsnMapping(this);
		}
		virtual ~STARS_Instruction_t()
		{
				objects_destroyed++;
		}
jdh8d's avatar
jdh8d committed

		// 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
		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);
		virtual STARS_ea_t GetFallThroughInstID(void) = 0; // return inst ID addr for fall-through from this inst
clc5q's avatar
clc5q committed
		virtual STARSOpndTypePtr MakeVoidOpnd(void) const = 0;
		virtual STARSOpndTypePtr MakeImmediateOpnd(STARS_uval_t value) const = 0;
		virtual STARSOpndTypePtr MakeRegOpnd(STARS_regnum_t RegNum, bool DefaultToMachineWidth = true) = 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;
clc5q's avatar
clc5q committed
		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;
		virtual bool IsPushFromFixedCall(void) const { return false; } // Is push from a call that became a push/jump pair?
		virtual bool IsJumpFromFixedCall(void) const { return false; } // 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);

		static void DumpCreationStats(std::ostream & out)
		{
                        out<<"#ATTRIBUTE STARS_Instruction_t_created: "<<std::dec<<objects_created<<std::endl;
                        out<<"#ATTRIBUTE STARS_Instruction_t_destroyed: "<<std::dec<<objects_destroyed<<std::endl;
                        out<<"#ATTRIBUTE STARS_Instruction_t_current : "<<std::dec<<objects_created-objects_destroyed<<std::endl;
		}

	protected:
		STARS_InstructionID_t m_id;


	private:
		static uint64_t objects_created;
		static uint64_t objects_destroyed;