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