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