1*eb293b8fSAndroid Build Coastguard Worker /* 2*eb293b8fSAndroid Build Coastguard Worker * Copyright (C) 2016 The Android Open Source Project 3*eb293b8fSAndroid Build Coastguard Worker * 4*eb293b8fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*eb293b8fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*eb293b8fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*eb293b8fSAndroid Build Coastguard Worker * 8*eb293b8fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*eb293b8fSAndroid Build Coastguard Worker * 10*eb293b8fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*eb293b8fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*eb293b8fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*eb293b8fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*eb293b8fSAndroid Build Coastguard Worker * limitations under the License. 15*eb293b8fSAndroid Build Coastguard Worker */ 16*eb293b8fSAndroid Build Coastguard Worker 17*eb293b8fSAndroid Build Coastguard Worker #pragma once 18*eb293b8fSAndroid Build Coastguard Worker 19*eb293b8fSAndroid Build Coastguard Worker #include <stdint.h> 20*eb293b8fSAndroid Build Coastguard Worker 21*eb293b8fSAndroid Build Coastguard Worker #include <memory> 22*eb293b8fSAndroid Build Coastguard Worker #include <unordered_map> 23*eb293b8fSAndroid Build Coastguard Worker #include <vector> 24*eb293b8fSAndroid Build Coastguard Worker 25*eb293b8fSAndroid Build Coastguard Worker #include <unwindstack/DwarfSection.h> 26*eb293b8fSAndroid Build Coastguard Worker 27*eb293b8fSAndroid Build Coastguard Worker namespace unwindstack { 28*eb293b8fSAndroid Build Coastguard Worker 29*eb293b8fSAndroid Build Coastguard Worker // Forward declarations. 30*eb293b8fSAndroid Build Coastguard Worker class Memory; 31*eb293b8fSAndroid Build Coastguard Worker struct SectionInfo; 32*eb293b8fSAndroid Build Coastguard Worker 33*eb293b8fSAndroid Build Coastguard Worker template <typename AddressType> 34*eb293b8fSAndroid Build Coastguard Worker class DwarfEhFrameWithHdr : public DwarfSectionImpl<AddressType> { 35*eb293b8fSAndroid Build Coastguard Worker public: 36*eb293b8fSAndroid Build Coastguard Worker // Add these so that the protected members of DwarfSectionImpl 37*eb293b8fSAndroid Build Coastguard Worker // can be accessed without needing a this->. 38*eb293b8fSAndroid Build Coastguard Worker using DwarfSectionImpl<AddressType>::memory_; 39*eb293b8fSAndroid Build Coastguard Worker using DwarfSectionImpl<AddressType>::last_error_; 40*eb293b8fSAndroid Build Coastguard Worker 41*eb293b8fSAndroid Build Coastguard Worker struct FdeInfo { 42*eb293b8fSAndroid Build Coastguard Worker AddressType pc; 43*eb293b8fSAndroid Build Coastguard Worker uint64_t offset; 44*eb293b8fSAndroid Build Coastguard Worker }; 45*eb293b8fSAndroid Build Coastguard Worker DwarfEhFrameWithHdr(std::shared_ptr<Memory> & memory)46*eb293b8fSAndroid Build Coastguard Worker DwarfEhFrameWithHdr(std::shared_ptr<Memory>& memory) : DwarfSectionImpl<AddressType>(memory) {} 47*eb293b8fSAndroid Build Coastguard Worker virtual ~DwarfEhFrameWithHdr() = default; 48*eb293b8fSAndroid Build Coastguard Worker GetCieOffsetFromFde32(uint32_t pointer)49*eb293b8fSAndroid Build Coastguard Worker uint64_t GetCieOffsetFromFde32(uint32_t pointer) override { 50*eb293b8fSAndroid Build Coastguard Worker return memory_.cur_offset() - pointer - 4; 51*eb293b8fSAndroid Build Coastguard Worker } 52*eb293b8fSAndroid Build Coastguard Worker GetCieOffsetFromFde64(uint64_t pointer)53*eb293b8fSAndroid Build Coastguard Worker uint64_t GetCieOffsetFromFde64(uint64_t pointer) override { 54*eb293b8fSAndroid Build Coastguard Worker return memory_.cur_offset() - pointer - 8; 55*eb293b8fSAndroid Build Coastguard Worker } 56*eb293b8fSAndroid Build Coastguard Worker AdjustPcFromFde(uint64_t pc)57*eb293b8fSAndroid Build Coastguard Worker uint64_t AdjustPcFromFde(uint64_t pc) override { 58*eb293b8fSAndroid Build Coastguard Worker // The eh_frame uses relative pcs. 59*eb293b8fSAndroid Build Coastguard Worker return pc + memory_.cur_offset() - 4; 60*eb293b8fSAndroid Build Coastguard Worker } 61*eb293b8fSAndroid Build Coastguard Worker 62*eb293b8fSAndroid Build Coastguard Worker bool EhFrameInit(const SectionInfo& info); 63*eb293b8fSAndroid Build Coastguard Worker bool Init(const SectionInfo& info) override; 64*eb293b8fSAndroid Build Coastguard Worker 65*eb293b8fSAndroid Build Coastguard Worker const DwarfFde* GetFdeFromPc(uint64_t pc) override; 66*eb293b8fSAndroid Build Coastguard Worker 67*eb293b8fSAndroid Build Coastguard Worker bool GetFdeOffsetFromPc(uint64_t pc, uint64_t* fde_offset); 68*eb293b8fSAndroid Build Coastguard Worker 69*eb293b8fSAndroid Build Coastguard Worker const FdeInfo* GetFdeInfoFromIndex(size_t index); 70*eb293b8fSAndroid Build Coastguard Worker 71*eb293b8fSAndroid Build Coastguard Worker void GetFdes(std::vector<const DwarfFde*>* fdes) override; 72*eb293b8fSAndroid Build Coastguard Worker 73*eb293b8fSAndroid Build Coastguard Worker protected: 74*eb293b8fSAndroid Build Coastguard Worker uint8_t version_ = 0; 75*eb293b8fSAndroid Build Coastguard Worker uint8_t table_encoding_ = 0; 76*eb293b8fSAndroid Build Coastguard Worker size_t table_entry_size_ = 0; 77*eb293b8fSAndroid Build Coastguard Worker 78*eb293b8fSAndroid Build Coastguard Worker uint64_t hdr_entries_offset_ = 0; 79*eb293b8fSAndroid Build Coastguard Worker uint64_t hdr_entries_data_offset_ = 0; 80*eb293b8fSAndroid Build Coastguard Worker uint64_t hdr_section_bias_ = 0; 81*eb293b8fSAndroid Build Coastguard Worker 82*eb293b8fSAndroid Build Coastguard Worker uint64_t fde_count_ = 0; 83*eb293b8fSAndroid Build Coastguard Worker std::unordered_map<uint64_t, FdeInfo> fde_info_; 84*eb293b8fSAndroid Build Coastguard Worker }; 85*eb293b8fSAndroid Build Coastguard Worker 86*eb293b8fSAndroid Build Coastguard Worker } // namespace unwindstack 87