• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2017 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_DEBUG_FRAME_H
18 #define _LIBUNWINDSTACK_DWARF_DEBUG_FRAME_H
19 
20 #include <stdint.h>
21 
22 #include <vector>
23 
24 #include <unwindstack/DwarfSection.h>
25 
26 namespace unwindstack {
27 
28 template <typename AddressType>
29 class DwarfDebugFrame : public DwarfSectionImpl<AddressType> {
30  public:
31   // Add these so that the protected members of DwarfSectionImpl
32   // can be accessed without needing a this->.
33   using DwarfSectionImpl<AddressType>::memory_;
34   using DwarfSectionImpl<AddressType>::fde_count_;
35   using DwarfSectionImpl<AddressType>::last_error_;
36 
37   struct FdeInfo {
FdeInfoFdeInfo38     FdeInfo(uint64_t offset, uint64_t start, uint64_t length)
39         : offset(offset), start(start), end(start + length) {}
40 
41     uint64_t offset;
42     AddressType start;
43     AddressType end;
44   };
45 
DwarfDebugFrame(Memory * memory)46   DwarfDebugFrame(Memory* memory) : DwarfSectionImpl<AddressType>(memory) {}
47   virtual ~DwarfDebugFrame() = default;
48 
49   bool Init(uint64_t offset, uint64_t size) override;
50 
51   bool GetFdeOffsetFromPc(uint64_t pc, uint64_t* fde_offset) override;
52 
53   const DwarfFde* GetFdeFromIndex(size_t index) override;
54 
IsCie32(uint32_t value32)55   bool IsCie32(uint32_t value32) override { return value32 == static_cast<uint32_t>(-1); }
56 
IsCie64(uint64_t value64)57   bool IsCie64(uint64_t value64) override { return value64 == static_cast<uint64_t>(-1); }
58 
GetCieOffsetFromFde32(uint32_t pointer)59   uint64_t GetCieOffsetFromFde32(uint32_t pointer) override { return offset_ + pointer; }
60 
GetCieOffsetFromFde64(uint64_t pointer)61   uint64_t GetCieOffsetFromFde64(uint64_t pointer) override { return offset_ + pointer; }
62 
AdjustPcFromFde(uint64_t pc)63   uint64_t AdjustPcFromFde(uint64_t pc) override { return pc; }
64 
65   bool GetCieInfo(uint8_t* segment_size, uint8_t* encoding);
66 
67   bool AddFdeInfo(uint64_t entry_offset, uint8_t segment_size, uint8_t encoding);
68 
69   bool CreateSortedFdeList();
70 
71  protected:
72   uint64_t offset_;
73   uint64_t end_offset_;
74 
75   std::vector<FdeInfo> fdes_;
76 };
77 
78 }  // namespace unwindstack
79 
80 #endif  // _LIBUNWINDSTACK_DWARF_DEBUG_FRAME_H
81