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