1 | //===- DWARFDataExtractor.h -------------------------------------*- C++ -*-===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | #ifndef LLVM_DEBUGINFO_DWARF_DWARFDATAEXTRACTOR_H |
10 | #define |
11 | |
12 | #include "llvm/BinaryFormat/Dwarf.h" |
13 | #include "llvm/DebugInfo/DWARF/DWARFSection.h" |
14 | #include "llvm/Support/DataExtractor.h" |
15 | |
16 | namespace llvm { |
17 | class DWARFObject; |
18 | |
19 | /// A DataExtractor (typically for an in-memory copy of an object-file section) |
20 | /// plus a relocation map for that section, if there is one. |
21 | class : public DataExtractor { |
22 | const DWARFObject * = nullptr; |
23 | const DWARFSection * = nullptr; |
24 | |
25 | public: |
26 | /// Constructor for the normal case of extracting data from a DWARF section. |
27 | /// The DWARFSection's lifetime must be at least as long as the extractor's. |
28 | (const DWARFObject &Obj, const DWARFSection &Section, |
29 | bool IsLittleEndian, uint8_t AddressSize) |
30 | : DataExtractor(Section.Data, IsLittleEndian, AddressSize), Obj(&Obj), |
31 | Section(&Section) {} |
32 | |
33 | /// Constructor for cases when there are no relocations. |
34 | (StringRef Data, bool IsLittleEndian, uint8_t AddressSize) |
35 | : DataExtractor(Data, IsLittleEndian, AddressSize) {} |
36 | (ArrayRef<uint8_t> Data, bool IsLittleEndian, |
37 | uint8_t AddressSize) |
38 | : DataExtractor( |
39 | StringRef(reinterpret_cast<const char *>(Data.data()), Data.size()), |
40 | IsLittleEndian, AddressSize) {} |
41 | |
42 | /// Truncating constructor |
43 | (const DWARFDataExtractor &Other, size_t Length) |
44 | : DataExtractor(Other.getData().substr(Start: 0, N: Length), Other.isLittleEndian(), |
45 | Other.getAddressSize()), |
46 | Obj(Other.Obj), Section(Other.Section) {} |
47 | |
48 | /// Extracts the DWARF "initial length" field, which can either be a 32-bit |
49 | /// value smaller than 0xfffffff0, or the value 0xffffffff followed by a |
50 | /// 64-bit length. Returns the actual length, and the DWARF format which is |
51 | /// encoded in the field. In case of errors, it returns {0, DWARF32} and |
52 | /// leaves the offset unchanged. |
53 | std::pair<uint64_t, dwarf::DwarfFormat> |
54 | (uint64_t *Off, Error *Err = nullptr) const; |
55 | |
56 | std::pair<uint64_t, dwarf::DwarfFormat> (Cursor &C) const { |
57 | return getInitialLength(Off: &getOffset(C), Err: &getError(C)); |
58 | } |
59 | |
60 | /// Extracts a value and applies a relocation to the result if |
61 | /// one exists for the given offset. |
62 | uint64_t (uint32_t Size, uint64_t *Off, |
63 | uint64_t *SectionIndex = nullptr, |
64 | Error *Err = nullptr) const; |
65 | uint64_t (Cursor &C, uint32_t Size, |
66 | uint64_t *SectionIndex = nullptr) const { |
67 | return getRelocatedValue(Size, Off: &getOffset(C), SectionIndex, Err: &getError(C)); |
68 | } |
69 | |
70 | /// Extracts an address-sized value and applies a relocation to the result if |
71 | /// one exists for the given offset. |
72 | uint64_t (uint64_t *Off, uint64_t *SecIx = nullptr) const { |
73 | return getRelocatedValue(Size: getAddressSize(), Off, SectionIndex: SecIx); |
74 | } |
75 | uint64_t (Cursor &C, uint64_t *SecIx = nullptr) const { |
76 | return getRelocatedValue(Size: getAddressSize(), Off: &getOffset(C), SectionIndex: SecIx, |
77 | Err: &getError(C)); |
78 | } |
79 | |
80 | /// Extracts a DWARF-encoded pointer in \p Offset using \p Encoding. |
81 | /// There is a DWARF encoding that uses a PC-relative adjustment. |
82 | /// For these values, \p AbsPosOffset is used to fix them, which should |
83 | /// reflect the absolute address of this pointer. |
84 | std::optional<uint64_t> (uint64_t *Offset, uint8_t Encoding, |
85 | uint64_t AbsPosOffset = 0) const; |
86 | }; |
87 | |
88 | } // end namespace llvm |
89 | |
90 | #endif // LLVM_DEBUGINFO_DWARF_DWARFDATAEXTRACTOR_H |
91 | |