From 9e90afedeaa8474d158a452205f6271172c7d78d Mon Sep 17 00:00:00 2001 From: Jason Hiser <jdhiser@gmail.com> Date: Tue, 31 Jul 2018 14:53:28 +0000 Subject: [PATCH] added findFDE(addr) api for efficiency --- include/ehp.hpp | 1 + src/ehp.cpp | 10 +++++++++- src/ehp_priv.hpp | 2 ++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/include/ehp.hpp b/include/ehp.hpp index 4301bb1..0dd31dd 100644 --- a/include/ehp.hpp +++ b/include/ehp.hpp @@ -147,6 +147,7 @@ class EHFrameParser_t virtual void print() const=0; virtual const shared_ptr<FDEVector_t> getFDEs() const =0; virtual const shared_ptr<CIEVector_t> getCIEs() const =0; + virtual const shared_ptr<FDEContents_t> findFDE(uint64_t addr) const =0; static unique_ptr<const EHFrameParser_t> factory(const string filename); static unique_ptr<const EHFrameParser_t> factory( diff --git a/src/ehp.cpp b/src/ehp.cpp index ddb1ac7..2961e3b 100644 --- a/src/ehp.cpp +++ b/src/ehp.cpp @@ -1675,8 +1675,16 @@ const shared_ptr<CIEVector_t> split_eh_frame_impl_t<ptrsize>::getCIEs() const [](const cie_contents_t<ptrsize> &a){ return shared_ptr<CIEContents_t>(new cie_contents_t<ptrsize>(a));}); return ret; } - +template <int ptrsize> +const shared_ptr<FDEContents_t> split_eh_frame_impl_t<ptrsize>::findFDE(uint64_t addr) const +{ + + const auto tofind=fde_contents_t<ptrsize>( addr, addr+1); + const auto fde_it=fdes.find(tofind); + const auto raw_ret_ptr = (fde_it==fdes.end()) ? nullptr : new fde_contents_t<ptrsize>(*fde_it); + return shared_ptr<FDEContents_t>(raw_ret_ptr); +} unique_ptr<const EHFrameParser_t> EHFrameParser_t::factory(const string filename) { diff --git a/src/ehp_priv.hpp b/src/ehp_priv.hpp index e6bc922..1f6c53d 100644 --- a/src/ehp_priv.hpp +++ b/src/ehp_priv.hpp @@ -403,6 +403,8 @@ class split_eh_frame_impl_t : public EHFrameParser_t virtual const shared_ptr<FDEVector_t> getFDEs() const; virtual const shared_ptr<CIEVector_t> getCIEs() const; + virtual const shared_ptr<FDEContents_t> findFDE(uint64_t addr) const; + }; -- GitLab