Recommit [NFC] Better encapsulation of llvm::Optional Storage
[llvm-complete.git] / include / llvm / DebugInfo / DWARF / DWARFDebugLoc.h
blobdbed95944326e919b5880650d51b26e8e7176129
1 //===- DWARFDebugLoc.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 //===----------------------------------------------------------------------===//
9 #ifndef LLVM_DEBUGINFO_DWARF_DWARFDEBUGLOC_H
10 #define LLVM_DEBUGINFO_DWARF_DWARFDEBUGLOC_H
12 #include "llvm/ADT/Optional.h"
13 #include "llvm/ADT/SmallVector.h"
14 #include "llvm/DebugInfo/DWARF/DWARFDataExtractor.h"
15 #include "llvm/DebugInfo/DWARF/DWARFRelocMap.h"
16 #include <cstdint>
18 namespace llvm {
19 class DWARFUnit;
20 class MCRegisterInfo;
21 class raw_ostream;
23 class DWARFDebugLoc {
24 public:
25 /// A single location within a location list.
26 struct Entry {
27 /// The beginning address of the instruction range.
28 uint64_t Begin;
29 /// The ending address of the instruction range.
30 uint64_t End;
31 /// The location of the variable within the specified range.
32 SmallVector<char, 4> Loc;
35 /// A list of locations that contain one variable.
36 struct LocationList {
37 /// The beginning offset where this location list is stored in the debug_loc
38 /// section.
39 unsigned Offset;
40 /// All the locations in which the variable is stored.
41 SmallVector<Entry, 2> Entries;
42 /// Dump this list on OS.
43 void dump(raw_ostream &OS, bool IsLittleEndian, unsigned AddressSize,
44 const MCRegisterInfo *MRI, uint64_t BaseAddress,
45 unsigned Indent) const;
48 private:
49 using LocationLists = SmallVector<LocationList, 4>;
51 /// A list of all the variables in the debug_loc section, each one describing
52 /// the locations in which the variable is stored.
53 LocationLists Locations;
55 unsigned AddressSize;
57 bool IsLittleEndian;
59 public:
60 /// Print the location lists found within the debug_loc section.
61 void dump(raw_ostream &OS, const MCRegisterInfo *RegInfo,
62 Optional<uint64_t> Offset) const;
64 /// Parse the debug_loc section accessible via the 'data' parameter using the
65 /// address size also given in 'data' to interpret the address ranges.
66 void parse(const DWARFDataExtractor &data);
68 /// Return the location list at the given offset or nullptr.
69 LocationList const *getLocationListAtOffset(uint64_t Offset) const;
71 Optional<LocationList> parseOneLocationList(DWARFDataExtractor Data,
72 uint32_t *Offset);
75 class DWARFDebugLoclists {
76 public:
77 struct Entry {
78 uint8_t Kind;
79 uint64_t Value0;
80 uint64_t Value1;
81 SmallVector<char, 4> Loc;
84 struct LocationList {
85 unsigned Offset;
86 SmallVector<Entry, 2> Entries;
87 void dump(raw_ostream &OS, uint64_t BaseAddr, bool IsLittleEndian,
88 unsigned AddressSize, const MCRegisterInfo *RegInfo,
89 unsigned Indent) const;
92 private:
93 using LocationLists = SmallVector<LocationList, 4>;
95 LocationLists Locations;
97 unsigned AddressSize;
99 bool IsLittleEndian;
101 public:
102 void parse(DataExtractor data, unsigned Version);
103 void dump(raw_ostream &OS, uint64_t BaseAddr, const MCRegisterInfo *RegInfo,
104 Optional<uint64_t> Offset) const;
106 /// Return the location list at the given offset or nullptr.
107 LocationList const *getLocationListAtOffset(uint64_t Offset) const;
109 static Optional<LocationList>
110 parseOneLocationList(DataExtractor Data, unsigned *Offset, unsigned Version);
113 } // end namespace llvm
115 #endif // LLVM_DEBUGINFO_DWARF_DWARFDEBUGLOC_H