Skip to content
Snippets Groups Projects
STARS_IRDB_Instruction.cpp 76.8 KiB
Newer Older

#include "SMPDataFlowAnalysis.h"
#include "interfaces/abstract/STARSInterface.h"
#include "interfaces/irdb/STARSInstruction.h"
#include "interfaces/irdb/STARSOp.h"
#include "interfaces/STARSTypes.h"

// #include <bea_deprecated.hpp>
using namespace libIRDB;
#ifndef ALLOF
#define ALLOF(a) begin(a),end(a)
#endif

STARSOpndTypePtr STARS_IRDB_Instruction_t::VoidOpndsPtr=dynamic_pointer_cast<STARS_op_t>(std::make_shared<STARS_IRDB_op_t>());


static uint32_t UseMacros[STARS_UA_MAXOP] = {STARS_CF_USE1, STARS_CF_USE2, STARS_CF_USE3, STARS_CF_USE4, STARS_CF_USE5, STARS_CF_USE6};

static uint32_t DefMacros[STARS_UA_MAXOP] = {STARS_CF_CHG1, STARS_CF_CHG2, STARS_CF_CHG3, STARS_CF_CHG4, STARS_CF_CHG5, STARS_CF_CHG6};

STARS_InstructionID_t STARS_IRDB_Instruction_t::GetNextInstructionID(void) const
{
	Instruction_t *FallthroughID = irdb_insn->GetFallthrough();
	if (nullptr == FallthroughID) {
		// For robustness, permit a no-op to have no fall through inst.
		cerr << "ERROR: No fallthrough inst in GetNextInstructionID()" << endl;
		return STARS_InstructionID_t(STARS_BADADDR);
	}
	else {
		return STARS_InstructionID_t(FallthroughID->GetBaseID());
	}
}
uint16_t STARS_IRDB_Instruction_t::GetIDAOpcode(void) 
	if (this->IDAOpcodeCached) {
		return this->IDAOpcode;  // optimization
	}

#define CHECK_FOR_INSN(token) \
	if (disasm.getMnemonic() == string(#token) ) { /*string(disasm.Instruction.Mnemonic) == string(#token) + " ")  */ \
		this->IDAOpcode = STARS_NN_##token; \
		this->IDAOpcodeCached = true;   \
		return this->IDAOpcode; }	\
jdh8d's avatar
jdh8d committed
#define CHECK_FOR_INSN_RENAME(token,str) \
	if (disasm.getMnemonic() == string(str) ) { /*if (string(disasm.Instruction.Mnemonic) == string(str) + " ")  */ \
		this->IDAOpcode = STARS_NN_##token; \
		this->IDAOpcodeCached = true;   \
		return this->IDAOpcode; }	\
	if(disasm.isUnconditionalBranch() /*string(disasm.Instruction.Mnemonic)==string("jmp")+" "*/ )
		if (irdb_insn->GetTarget()) {
			this->IDAOpcode = STARS_NN_jmp;
		}
		else {
			this->IDAOpcode = STARS_NN_jmpni;
		}
		this->IDAOpcodeCached = true;
		return this->IDAOpcode;
	else if(disasm.isCall() /*string(disasm.Instruction.Mnemonic)==string("call")+" "*/ )
		if (irdb_insn->GetTarget()) {
			this->IDAOpcode = STARS_NN_call;
		}
		else {
			this->IDAOpcode = STARS_NN_callni;
		}
		this->IDAOpcodeCached = true;
		return this->IDAOpcode;
	CHECK_FOR_INSN(aaa);                 
	CHECK_FOR_INSN(aad);                 
	CHECK_FOR_INSN(aam);                 
	CHECK_FOR_INSN(aas);                 
	CHECK_FOR_INSN(adc);                 
	CHECK_FOR_INSN(add);                 
	CHECK_FOR_INSN(and);                 
	CHECK_FOR_INSN(arpl);                
	CHECK_FOR_INSN(bound);               
	CHECK_FOR_INSN(bsf);                 
	CHECK_FOR_INSN(bsr);                 
	CHECK_FOR_INSN(bt);                  
	CHECK_FOR_INSN(btc);                 
	CHECK_FOR_INSN(btr);                 
	CHECK_FOR_INSN(bts);                 
	CHECK_FOR_INSN(call);                
	CHECK_FOR_INSN(callfi);              
	CHECK_FOR_INSN(callni);              
	CHECK_FOR_INSN(cbw);                 
	CHECK_FOR_INSN(cwde);                
	CHECK_FOR_INSN(cdqe);                
	CHECK_FOR_INSN(clc);                 
	CHECK_FOR_INSN(cld);                 
	CHECK_FOR_INSN(cli);                 
	CHECK_FOR_INSN(clts);                
	CHECK_FOR_INSN(cmc);                 
	CHECK_FOR_INSN(cmp);                 
jdh8d's avatar
jdh8d committed
	CHECK_FOR_INSN_RENAME(cmps, "cmpsb");                
jdh8d's avatar
 
jdh8d committed
	CHECK_FOR_INSN_RENAME(cmps, "cmpsd");                
	CHECK_FOR_INSN_RENAME(cmps, "cmpsw");                
	CHECK_FOR_INSN_RENAME(cmps, "cmpsq");                
	CHECK_FOR_INSN_RENAME(cmps, "cmps");                
	CHECK_FOR_INSN(cwd);                 
	CHECK_FOR_INSN(cdq);                 
	CHECK_FOR_INSN(cqo);                 
	CHECK_FOR_INSN(daa);                 
	CHECK_FOR_INSN(das);                 
	CHECK_FOR_INSN(dec);                 
	CHECK_FOR_INSN(div);                 
	CHECK_FOR_INSN(enterw);              
	CHECK_FOR_INSN(enter);               
	CHECK_FOR_INSN(enterd);              
	CHECK_FOR_INSN(enterq);              
	CHECK_FOR_INSN(hlt);                 
	CHECK_FOR_INSN(idiv);                
	CHECK_FOR_INSN(imul);                
	CHECK_FOR_INSN(in);                  
	CHECK_FOR_INSN(inc);                 
jdh8d's avatar
 
jdh8d committed
	CHECK_FOR_INSN_RENAME(ins, "insb");
	CHECK_FOR_INSN_RENAME(ins, "insw");
	CHECK_FOR_INSN_RENAME(ins, "insd");
	CHECK_FOR_INSN_RENAME(ins, "insq");
	CHECK_FOR_INSN(ins);                 
	CHECK_FOR_INSN(int);                 
	CHECK_FOR_INSN(into);                
	CHECK_FOR_INSN(int3);                
	CHECK_FOR_INSN(iretw);               
	CHECK_FOR_INSN(iret);                
	CHECK_FOR_INSN(iretd);               
	CHECK_FOR_INSN(iretq);               
	CHECK_FOR_INSN(ja);                  
	CHECK_FOR_INSN(jae);                 
	CHECK_FOR_INSN(jb);                  
	CHECK_FOR_INSN(jbe);                 
	CHECK_FOR_INSN(jc);                  
	CHECK_FOR_INSN(jcxz);                
	CHECK_FOR_INSN(jecxz);               
	CHECK_FOR_INSN(jrcxz);               
	CHECK_FOR_INSN(je);                  
	CHECK_FOR_INSN(jg);                  
	CHECK_FOR_INSN(jge);                 
	CHECK_FOR_INSN(jl);                  
	CHECK_FOR_INSN(jle);                 
	CHECK_FOR_INSN(jna);                 
	CHECK_FOR_INSN(jnae);                
	CHECK_FOR_INSN(jnb);                 
	CHECK_FOR_INSN(jnbe);                
	CHECK_FOR_INSN(jnc);                 
	CHECK_FOR_INSN(jne);                 
	CHECK_FOR_INSN(jng);                 
	CHECK_FOR_INSN(jnge);                
	CHECK_FOR_INSN(jnl);                 
	CHECK_FOR_INSN(jnle);                
	CHECK_FOR_INSN(jno);                 
	CHECK_FOR_INSN(jnp);                 
	CHECK_FOR_INSN(jns);                 
	CHECK_FOR_INSN(jnz);                 
	CHECK_FOR_INSN(jo);                  
	CHECK_FOR_INSN(jp);                  
	CHECK_FOR_INSN(jpe);                 
	CHECK_FOR_INSN(jpo);                 
	CHECK_FOR_INSN(js);                  
	CHECK_FOR_INSN(jz);                  
	CHECK_FOR_INSN(jmp);                 
jdh8d's avatar
 
jdh8d committed
	CHECK_FOR_INSN_RENAME(jmpfi, "jmp far");               
	CHECK_FOR_INSN(jmpfi);               
	CHECK_FOR_INSN(jmpni);               
	CHECK_FOR_INSN(jmpshort);            
	CHECK_FOR_INSN(lahf);                
	CHECK_FOR_INSN(lar);                 
	CHECK_FOR_INSN(lea);                 
	CHECK_FOR_INSN(leavew);              
	CHECK_FOR_INSN(leave);               
	CHECK_FOR_INSN(leaved);              
	CHECK_FOR_INSN(leaveq);              
	CHECK_FOR_INSN(lgdt);                
	CHECK_FOR_INSN(lidt);                
	CHECK_FOR_INSN(lgs);                 
	CHECK_FOR_INSN(lss);                 
	CHECK_FOR_INSN(lds);                 
	CHECK_FOR_INSN(les);                 
	CHECK_FOR_INSN(lfs);                 
	CHECK_FOR_INSN(lldt);                
	CHECK_FOR_INSN(lmsw);                
	CHECK_FOR_INSN(lock);                
jdh8d's avatar
 
jdh8d committed
	CHECK_FOR_INSN_RENAME(lods, "lodsb");                
	CHECK_FOR_INSN_RENAME(lods, "lodsw");                
	CHECK_FOR_INSN_RENAME(lods, "lodsd");                
	CHECK_FOR_INSN_RENAME(lods, "lodsq");                
	CHECK_FOR_INSN(lods);                
Loading
Loading full blame...