Loading libunwindstack/DwarfDebugFrame.h +2 −2 Original line number Diff line number Diff line Loading @@ -26,9 +26,9 @@ namespace unwindstack { template <typename AddressType> class DwarfDebugFrame : public DwarfSectionImpl<AddressType> { class DwarfDebugFrame : public DwarfSectionImplNoHdr<AddressType> { public: DwarfDebugFrame(Memory* memory) : DwarfSectionImpl<AddressType>(memory) { DwarfDebugFrame(Memory* memory) : DwarfSectionImplNoHdr<AddressType>(memory) { this->cie32_value_ = static_cast<uint32_t>(-1); this->cie64_value_ = static_cast<uint64_t>(-1); } Loading libunwindstack/DwarfEhFrame.h +2 −2 Original line number Diff line number Diff line Loading @@ -25,9 +25,9 @@ namespace unwindstack { template <typename AddressType> class DwarfEhFrame : public DwarfSectionImpl<AddressType> { class DwarfEhFrame : public DwarfSectionImplNoHdr<AddressType> { public: DwarfEhFrame(Memory* memory) : DwarfSectionImpl<AddressType>(memory) {} DwarfEhFrame(Memory* memory) : DwarfSectionImplNoHdr<AddressType>(memory) {} virtual ~DwarfEhFrame() = default; uint64_t GetCieOffsetFromFde32(uint32_t pointer) override { Loading libunwindstack/DwarfEhFrameWithHdr.cpp +30 −4 Original line number Diff line number Diff line Loading @@ -39,6 +39,7 @@ bool DwarfEhFrameWithHdr<AddressType>::Init(uint64_t offset, uint64_t size, uint memory_.clear_text_offset(); memory_.set_data_offset(offset); memory_.set_cur_offset(offset); pc_offset_ = offset; // Read the first four bytes all at once. uint8_t data[4]; Loading Loading @@ -88,12 +89,22 @@ bool DwarfEhFrameWithHdr<AddressType>::Init(uint64_t offset, uint64_t size, uint } template <typename AddressType> const DwarfFde* DwarfEhFrameWithHdr<AddressType>::GetFdeFromIndex(size_t index) { const FdeInfo* info = GetFdeInfoFromIndex(index); if (info == nullptr) { const DwarfFde* DwarfEhFrameWithHdr<AddressType>::GetFdeFromPc(uint64_t pc) { uint64_t fde_offset; if (!GetFdeOffsetFromPc(pc, &fde_offset)) { return nullptr; } return this->GetFdeFromOffset(info->offset); const DwarfFde* fde = this->GetFdeFromOffset(fde_offset); if (fde == nullptr) { return nullptr; } // Guaranteed pc >= pc_start, need to check pc in the fde range. if (pc < fde->pc_end) { return fde; } last_error_.code = DWARF_ERROR_ILLEGAL_STATE; return nullptr; } template <typename AddressType> Loading Loading @@ -241,6 +252,21 @@ bool DwarfEhFrameWithHdr<AddressType>::GetFdeOffsetFromPc(uint64_t pc, uint64_t* } } template <typename AddressType> void DwarfEhFrameWithHdr<AddressType>::GetFdes(std::vector<const DwarfFde*>* fdes) { for (size_t i = 0; i < fde_count_; i++) { const FdeInfo* info = GetFdeInfoFromIndex(i); if (info == nullptr) { break; } const DwarfFde* fde = this->GetFdeFromOffset(info->offset); if (fde == nullptr) { break; } fdes->push_back(fde); } } // Explicitly instantiate DwarfEhFrameWithHdr template class DwarfEhFrameWithHdr<uint32_t>; template class DwarfEhFrameWithHdr<uint64_t>; Loading libunwindstack/DwarfEhFrameWithHdr.h +22 −6 Original line number Diff line number Diff line Loading @@ -21,7 +21,7 @@ #include <unordered_map> #include "DwarfEhFrame.h" #include <unwindstack/DwarfSection.h> namespace unwindstack { Loading @@ -29,12 +29,12 @@ namespace unwindstack { class Memory; template <typename AddressType> class DwarfEhFrameWithHdr : public DwarfEhFrame<AddressType> { class DwarfEhFrameWithHdr : public DwarfSectionImpl<AddressType> { public: // Add these so that the protected members of DwarfSectionImpl // can be accessed without needing a this->. using DwarfSectionImpl<AddressType>::memory_; using DwarfSectionImpl<AddressType>::fde_count_; using DwarfSectionImpl<AddressType>::pc_offset_; using DwarfSectionImpl<AddressType>::entries_offset_; using DwarfSectionImpl<AddressType>::entries_end_; using DwarfSectionImpl<AddressType>::last_error_; Loading @@ -45,14 +45,27 @@ class DwarfEhFrameWithHdr : public DwarfEhFrame<AddressType> { uint64_t offset; }; DwarfEhFrameWithHdr(Memory* memory) : DwarfEhFrame<AddressType>(memory) {} DwarfEhFrameWithHdr(Memory* memory) : DwarfSectionImpl<AddressType>(memory) {} virtual ~DwarfEhFrameWithHdr() = default; uint64_t GetCieOffsetFromFde32(uint32_t pointer) override { return this->memory_.cur_offset() - pointer - 4; } uint64_t GetCieOffsetFromFde64(uint64_t pointer) override { return this->memory_.cur_offset() - pointer - 8; } uint64_t AdjustPcFromFde(uint64_t pc) override { // The eh_frame uses relative pcs. return pc + this->memory_.cur_offset() - 4; } bool Init(uint64_t offset, uint64_t size, uint64_t load_bias) override; bool GetFdeOffsetFromPc(uint64_t pc, uint64_t* fde_offset) override; const DwarfFde* GetFdeFromPc(uint64_t pc) override; const DwarfFde* GetFdeFromIndex(size_t index) override; bool GetFdeOffsetFromPc(uint64_t pc, uint64_t* fde_offset); const FdeInfo* GetFdeInfoFromIndex(size_t index); Loading @@ -60,6 +73,8 @@ class DwarfEhFrameWithHdr : public DwarfEhFrame<AddressType> { bool GetFdeOffsetBinary(uint64_t pc, uint64_t* fde_offset, uint64_t total_entries); void GetFdes(std::vector<const DwarfFde*>* fdes) override; protected: uint8_t version_; uint8_t ptr_encoding_; Loading @@ -71,6 +86,7 @@ class DwarfEhFrameWithHdr : public DwarfEhFrame<AddressType> { uint64_t entries_data_offset_; uint64_t cur_entries_offset_ = 0; uint64_t fde_count_; std::unordered_map<uint64_t, FdeInfo> fde_info_; }; Loading libunwindstack/DwarfSection.cpp +371 −466 File changed.Preview size limit exceeded, changes collapsed. Show changes Loading
libunwindstack/DwarfDebugFrame.h +2 −2 Original line number Diff line number Diff line Loading @@ -26,9 +26,9 @@ namespace unwindstack { template <typename AddressType> class DwarfDebugFrame : public DwarfSectionImpl<AddressType> { class DwarfDebugFrame : public DwarfSectionImplNoHdr<AddressType> { public: DwarfDebugFrame(Memory* memory) : DwarfSectionImpl<AddressType>(memory) { DwarfDebugFrame(Memory* memory) : DwarfSectionImplNoHdr<AddressType>(memory) { this->cie32_value_ = static_cast<uint32_t>(-1); this->cie64_value_ = static_cast<uint64_t>(-1); } Loading
libunwindstack/DwarfEhFrame.h +2 −2 Original line number Diff line number Diff line Loading @@ -25,9 +25,9 @@ namespace unwindstack { template <typename AddressType> class DwarfEhFrame : public DwarfSectionImpl<AddressType> { class DwarfEhFrame : public DwarfSectionImplNoHdr<AddressType> { public: DwarfEhFrame(Memory* memory) : DwarfSectionImpl<AddressType>(memory) {} DwarfEhFrame(Memory* memory) : DwarfSectionImplNoHdr<AddressType>(memory) {} virtual ~DwarfEhFrame() = default; uint64_t GetCieOffsetFromFde32(uint32_t pointer) override { Loading
libunwindstack/DwarfEhFrameWithHdr.cpp +30 −4 Original line number Diff line number Diff line Loading @@ -39,6 +39,7 @@ bool DwarfEhFrameWithHdr<AddressType>::Init(uint64_t offset, uint64_t size, uint memory_.clear_text_offset(); memory_.set_data_offset(offset); memory_.set_cur_offset(offset); pc_offset_ = offset; // Read the first four bytes all at once. uint8_t data[4]; Loading Loading @@ -88,12 +89,22 @@ bool DwarfEhFrameWithHdr<AddressType>::Init(uint64_t offset, uint64_t size, uint } template <typename AddressType> const DwarfFde* DwarfEhFrameWithHdr<AddressType>::GetFdeFromIndex(size_t index) { const FdeInfo* info = GetFdeInfoFromIndex(index); if (info == nullptr) { const DwarfFde* DwarfEhFrameWithHdr<AddressType>::GetFdeFromPc(uint64_t pc) { uint64_t fde_offset; if (!GetFdeOffsetFromPc(pc, &fde_offset)) { return nullptr; } return this->GetFdeFromOffset(info->offset); const DwarfFde* fde = this->GetFdeFromOffset(fde_offset); if (fde == nullptr) { return nullptr; } // Guaranteed pc >= pc_start, need to check pc in the fde range. if (pc < fde->pc_end) { return fde; } last_error_.code = DWARF_ERROR_ILLEGAL_STATE; return nullptr; } template <typename AddressType> Loading Loading @@ -241,6 +252,21 @@ bool DwarfEhFrameWithHdr<AddressType>::GetFdeOffsetFromPc(uint64_t pc, uint64_t* } } template <typename AddressType> void DwarfEhFrameWithHdr<AddressType>::GetFdes(std::vector<const DwarfFde*>* fdes) { for (size_t i = 0; i < fde_count_; i++) { const FdeInfo* info = GetFdeInfoFromIndex(i); if (info == nullptr) { break; } const DwarfFde* fde = this->GetFdeFromOffset(info->offset); if (fde == nullptr) { break; } fdes->push_back(fde); } } // Explicitly instantiate DwarfEhFrameWithHdr template class DwarfEhFrameWithHdr<uint32_t>; template class DwarfEhFrameWithHdr<uint64_t>; Loading
libunwindstack/DwarfEhFrameWithHdr.h +22 −6 Original line number Diff line number Diff line Loading @@ -21,7 +21,7 @@ #include <unordered_map> #include "DwarfEhFrame.h" #include <unwindstack/DwarfSection.h> namespace unwindstack { Loading @@ -29,12 +29,12 @@ namespace unwindstack { class Memory; template <typename AddressType> class DwarfEhFrameWithHdr : public DwarfEhFrame<AddressType> { class DwarfEhFrameWithHdr : public DwarfSectionImpl<AddressType> { public: // Add these so that the protected members of DwarfSectionImpl // can be accessed without needing a this->. using DwarfSectionImpl<AddressType>::memory_; using DwarfSectionImpl<AddressType>::fde_count_; using DwarfSectionImpl<AddressType>::pc_offset_; using DwarfSectionImpl<AddressType>::entries_offset_; using DwarfSectionImpl<AddressType>::entries_end_; using DwarfSectionImpl<AddressType>::last_error_; Loading @@ -45,14 +45,27 @@ class DwarfEhFrameWithHdr : public DwarfEhFrame<AddressType> { uint64_t offset; }; DwarfEhFrameWithHdr(Memory* memory) : DwarfEhFrame<AddressType>(memory) {} DwarfEhFrameWithHdr(Memory* memory) : DwarfSectionImpl<AddressType>(memory) {} virtual ~DwarfEhFrameWithHdr() = default; uint64_t GetCieOffsetFromFde32(uint32_t pointer) override { return this->memory_.cur_offset() - pointer - 4; } uint64_t GetCieOffsetFromFde64(uint64_t pointer) override { return this->memory_.cur_offset() - pointer - 8; } uint64_t AdjustPcFromFde(uint64_t pc) override { // The eh_frame uses relative pcs. return pc + this->memory_.cur_offset() - 4; } bool Init(uint64_t offset, uint64_t size, uint64_t load_bias) override; bool GetFdeOffsetFromPc(uint64_t pc, uint64_t* fde_offset) override; const DwarfFde* GetFdeFromPc(uint64_t pc) override; const DwarfFde* GetFdeFromIndex(size_t index) override; bool GetFdeOffsetFromPc(uint64_t pc, uint64_t* fde_offset); const FdeInfo* GetFdeInfoFromIndex(size_t index); Loading @@ -60,6 +73,8 @@ class DwarfEhFrameWithHdr : public DwarfEhFrame<AddressType> { bool GetFdeOffsetBinary(uint64_t pc, uint64_t* fde_offset, uint64_t total_entries); void GetFdes(std::vector<const DwarfFde*>* fdes) override; protected: uint8_t version_; uint8_t ptr_encoding_; Loading @@ -71,6 +86,7 @@ class DwarfEhFrameWithHdr : public DwarfEhFrame<AddressType> { uint64_t entries_data_offset_; uint64_t cur_entries_offset_ = 0; uint64_t fde_count_; std::unordered_map<uint64_t, FdeInfo> fde_info_; }; Loading
libunwindstack/DwarfSection.cpp +371 −466 File changed.Preview size limit exceeded, changes collapsed. Show changes