From 1c87449b66df7e22468d73b9793a0389078594ea Mon Sep 17 00:00:00 2001
From: jdh8d <jdh8d@git.zephyr-software.com>
Date: Fri, 2 Mar 2018 15:32:28 +0000
Subject: [PATCH] mg handles enter insn, better monero test scripts, speed opts
 for eh-frame-parsing, better cpp eh test scripts

Former-commit-id: f33bb141da75011ce1357106d44fa8c74bdab570
---
 libIRDB/src/core/decode_cs.cpp  | 21 +++++++++++++++++++--
 libIRDB/test/eh_frame.hpp       | 14 ++++++++++++--
 libIRDB/test/split_eh_frame.cpp | 18 +++++++-----------
 3 files changed, 38 insertions(+), 15 deletions(-)

diff --git a/libIRDB/src/core/decode_cs.cpp b/libIRDB/src/core/decode_cs.cpp
index ff59991ca..79c48b52c 100644
--- a/libIRDB/src/core/decode_cs.cpp
+++ b/libIRDB/src/core/decode_cs.cpp
@@ -152,7 +152,9 @@ void DecodedInstructionCapstone_t::Disassemble(const virtual_offset_t start_addr
 	
 	}
 
-	if(string(insn->mnemonic)=="fcompi")
+	const auto mnemonic=string(insn->mnemonic);
+
+	if(mnemonic=="fcompi")
 		strcpy(insn->mnemonic, "fcomip"); // bad opcode out of capstone.
 	else if(string(insn->mnemonic)=="movsq")
 		strcpy(insn->op_str, ""); // force into MOVS
@@ -163,6 +165,20 @@ void DecodedInstructionCapstone_t::Disassemble(const virtual_offset_t start_addr
 	else if(string(insn->mnemonic)=="movsb")
 		strcpy(insn->op_str, ""); // force into MOVS
 
+	if(mnemonic=="movabs")
+	{
+		if(insn->detail->x86.operands[0].type==X86_OP_MEM)
+		{
+			insn->detail->x86.operands[0].imm=insn->detail->x86.operands[0].mem.disp;
+			insn->detail->x86.operands[0].type=X86_OP_IMM;
+		}
+		if(insn->detail->x86.operands[1].type==X86_OP_MEM)
+		{
+			insn->detail->x86.operands[1].imm=insn->detail->x86.operands[1].mem.disp;
+			insn->detail->x86.operands[1].type=X86_OP_IMM;
+		}
+	}
+
 	const auto cs_freer=[](cs_insn * insn) -> void 
 		{  
 			cs_free(insn,1); 
@@ -421,13 +437,14 @@ string DecodedInstructionCapstone_t::getMnemonic() const
 
 	});
 
-
 	// get the cs insn via casting.
 	const auto the_insn=static_cast<cs_insn*>(my_insn.get());
+
 	
 	// get mnemonic as a string
 	auto mnemonic=string(the_insn->mnemonic);
 
+
 	// remove any prefixes by finding the last space and removing anything before it.
 	const auto space_pos=mnemonic.rfind(" ");
 	if(space_pos!=string::npos)
diff --git a/libIRDB/test/eh_frame.hpp b/libIRDB/test/eh_frame.hpp
index 87c0a9965..553e48063 100644
--- a/libIRDB/test/eh_frame.hpp
+++ b/libIRDB/test/eh_frame.hpp
@@ -316,10 +316,16 @@ class fde_contents_t : eh_frame_util_t<ptrsize>
 
 	public:
 	fde_contents_t() ;
+	fde_contents_t(const uint64_t start_addr, const uint64_t end_addr)
+		: 
+		fde_start_addr(start_addr),
+		fde_end_addr(end_addr)
+	{} 
 
 	bool appliesTo(const libIRDB::Instruction_t* insn) const;
 
-	uint64_t GetFDEStartAddress() const ;
+	uint64_t GetFDEStartAddress() const { return fde_start_addr; } 
+	uint64_t GetFDEEndAddress() const {return fde_end_addr; }
 
 	const cie_contents_t<ptrsize>& GetCIE() const ;
 	cie_contents_t<ptrsize>& GetCIE() ;
@@ -343,6 +349,10 @@ class fde_contents_t : eh_frame_util_t<ptrsize>
 
 };
 
+template <int ptrsize>
+bool operator<(const fde_contents_t<ptrsize>& a, const fde_contents_t<ptrsize>& b) { return a.GetFDEEndAddress()-1 < b.GetFDEStartAddress(); }
+
+
 class split_eh_frame_t 
 {
 	public:
@@ -367,7 +377,7 @@ class split_eh_frame_impl_t : public split_eh_frame_t
 	libIRDB::DataScoop_t* gcc_except_table_scoop;
 	OffsetMap_t offset_to_insn_map;
 	std::vector<cie_contents_t <ptrsize> > cies;
-	std::vector<fde_contents_t <ptrsize> > fdes;
+	std::set<fde_contents_t <ptrsize> > fdes;
 
 
 	bool init_offset_map();
diff --git a/libIRDB/test/split_eh_frame.cpp b/libIRDB/test/split_eh_frame.cpp
index b10819b62..a25a315da 100644
--- a/libIRDB/test/split_eh_frame.cpp
+++ b/libIRDB/test/split_eh_frame.cpp
@@ -1547,9 +1547,6 @@ bool fde_contents_t<ptrsize>::appliesTo(const Instruction_t* insn) const
 	return ( fde_start_addr<=insn_addr && insn_addr<fde_end_addr );
 }
 
-template <int ptrsize>
-uint64_t fde_contents_t<ptrsize>::GetFDEStartAddress() const { return fde_start_addr; }
-
 template <int ptrsize>
 const cie_contents_t<ptrsize>& fde_contents_t<ptrsize>::GetCIE() const { return cie_info; }
 
@@ -1719,7 +1716,8 @@ bool split_eh_frame_impl_t<ptrsize>::iterate_fdes()
 			//cout << "FDE length="<< dec << act_length << " cie=[" << setw(6) << hex << cie_position << "]" << endl;
 			if(f.parse_fde(old_position, cie_position, data, max, eh_addr, gcc_except_table_scoop))
 				return true;
-			fdes.push_back(f);
+			const auto old_fde_size=fdes.size();
+			fdes.insert(f);
 		}
 		//cout << "----------------------------------------"<<endl;
 		
@@ -1811,10 +1809,8 @@ void split_eh_frame_impl_t<ptrsize>::build_ir() const
 	// find the right cie and fde, and build the IR from those for this instruction.
 	auto build_ir_insn=[&](Instruction_t* insn) -> void
 	{
-		auto fie_it=find_if(fdes.begin(), fdes.end(), [&](const fde_contents_t<ptrsize>  &p)
-		{
-			return p.appliesTo(insn);
-		});
+		const auto tofind=fde_contents_t<ptrsize>( insn->GetAddress()->GetVirtualOffset(), insn->GetAddress()->GetVirtualOffset()+1 );
+		const auto fie_it=fdes.find(tofind);
 
 		if(fie_it!=fdes.end())
 		{
@@ -2011,12 +2007,12 @@ void split_eh_frame_impl_t<ptrsize>::build_ir() const
 template <int ptrsize>
 libIRDB::Instruction_t* split_eh_frame_impl_t<ptrsize>::find_lp(libIRDB::Instruction_t* i) const 
 {
-	const auto fde_it=find_if(fdes.begin(), fdes.end(), [&](const fde_contents_t <ptrsize>& fde)
-		{ return fde.appliesTo(i); });
+	const auto tofind=fde_contents_t<ptrsize>( i->GetAddress()->GetVirtualOffset(), i->GetAddress()->GetVirtualOffset()+1);
+	const auto fde_it=fdes.find(tofind);
 
 	if(fde_it==fdes.end())
 		return NULL;
-
+	
 	const auto &the_fde=*fde_it;
 	const auto &the_lsda=the_fde.GetLSDA();
 	const auto &cstab  = the_lsda.GetCallSites();
-- 
GitLab