From ce74a798dd7365300dd26fafbd3a57f2d928fd3b Mon Sep 17 00:00:00 2001
From: Antonio Flores Montoya <afloresmontoya@grammatech.com>
Date: Mon, 29 Jul 2019 11:47:13 -0400
Subject: [PATCH] collect additional pointer locations

---
 include/ehp.hpp  | 4 ++++
 src/ehp.cpp      | 5 +++++
 src/ehp_priv.hpp | 6 ++++++
 3 files changed, 15 insertions(+)

diff --git a/include/ehp.hpp b/include/ehp.hpp
index 14946ff..08446f0 100644
--- a/include/ehp.hpp
+++ b/include/ehp.hpp
@@ -142,9 +142,13 @@ class LSDA_t
 	virtual void print() const=0;
 	virtual uint64_t getLandingPadBaseAddress() const = 0;
     virtual const CallSiteVector_t* getCallSites() const =0;
+	virtual uint64_t getCallSiteTableAddress() const = 0;
+	virtual uint64_t getCallSiteTableAddressLocation() const = 0;
 	virtual uint8_t getCallSiteTableEncoding() const = 0;
     virtual const TypeTableVector_t* getTypeTable() const =0;
 	virtual uint64_t getTypeTableAddress() const = 0;
+	virtual uint64_t getTypeTableAddressLocation() const = 0;
+    virtual uint64_t getCallSiteTableLength() const = 0;
 	virtual uint8_t getTypeTableEncoding() const = 0;
 	unique_ptr<LSDA_t> factory(const string lsda_data, const uint64_t lsda_start_addr);
 };
diff --git a/src/ehp.cpp b/src/ehp.cpp
index dda3976..9415e23 100644
--- a/src/ehp.cpp
+++ b/src/ehp.cpp
@@ -1348,17 +1348,22 @@ bool lsda_t<ptrsize>::parse_lsda(
 	auto type_table_pos=0;
 	if(type_table_encoding!=DW_EH_PE_omit)
 	{
+		type_table_addr_location = pos + data_addr;
 		if(this->read_uleb128(type_table_offset, pos, (const uint8_t* const)data.data(), max))
 			return true;
 		type_table_addr=lsda_addr+type_table_offset+(pos-start_pos);
 		type_table_pos=pos+type_table_offset;
 	}
 	else
+	{
 		type_table_addr=0;
+		type_table_addr_location=0;
+	}
 
 	if(this->read_type(cs_table_encoding, pos, (const uint8_t* const)data.data(), max))
 		return true;
 
+	cs_table_start_addr_location = pos + data_addr;
 	if(this->read_uleb128(cs_table_length, pos, (const uint8_t* const)data.data(), max))
 		return true;
 
diff --git a/src/ehp_priv.hpp b/src/ehp_priv.hpp
index 492edd2..735bbde 100644
--- a/src/ehp_priv.hpp
+++ b/src/ehp_priv.hpp
@@ -309,9 +309,11 @@ class lsda_t : public LSDA_t, private eh_frame_util_t<ptrsize>
 	uint8_t type_table_encoding;
 	uint64_t type_table_offset;
 	uint64_t type_table_addr;
+	uint64_t type_table_addr_location;
 	uint8_t cs_table_encoding;
 	uint64_t cs_table_start_offset;
 	uint64_t cs_table_start_addr;
+	uint64_t cs_table_start_addr_location;
 	uint64_t cs_table_length;
 	uint64_t cs_table_end_addr;
 	uint64_t action_table_start_addr;
@@ -341,10 +343,14 @@ class lsda_t : public LSDA_t, private eh_frame_util_t<ptrsize>
 	void print() const;
 	uint64_t getLandingPadBaseAddress() const {  return landing_pad_base_addr; }
 	const CallSiteVector_t* getCallSites() const ;
+	uint64_t getCallSiteTableAddress() const { return cs_table_start_addr; }
+	uint64_t getCallSiteTableAddressLocation() const { return cs_table_start_addr_location; }
+	uint64_t getCallSiteTableLength() const { return cs_table_length; }
 	uint8_t getCallSiteTableEncoding() const { return cs_table_encoding; }
 	const call_site_table_t<ptrsize> getCallSitesInternal() const { return call_site_table;}
 	const TypeTableVector_t* getTypeTable() const ;
 	uint64_t getTypeTableAddress() const { return type_table_addr; }
+	uint64_t getTypeTableAddressLocation() const { return type_table_addr_location; }
 	uint8_t getTypeTableEncoding() const { return type_table_encoding; }
 
 };
-- 
GitLab