blob: a6d319a90457f2d3ecb2f3bc9eaa752819cbf95a [file] [log] [blame]
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001//===- DWARFDebugLoc.h ------------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef LLVM_DEBUGINFO_DWARF_DWARFDEBUGLOC_H
11#define LLVM_DEBUGINFO_DWARF_DWARFDEBUGLOC_H
12
13#include "llvm/ADT/Optional.h"
14#include "llvm/ADT/SmallVector.h"
15#include "llvm/DebugInfo/DWARF/DWARFDataExtractor.h"
16#include "llvm/DebugInfo/DWARF/DWARFRelocMap.h"
17#include <cstdint>
18
19namespace llvm {
20class DWARFUnit;
21class MCRegisterInfo;
22class raw_ostream;
23
24class DWARFDebugLoc {
25public:
26 /// A single location within a location list.
27 struct Entry {
28 /// The beginning address of the instruction range.
29 uint64_t Begin;
30 /// The ending address of the instruction range.
31 uint64_t End;
32 /// The location of the variable within the specified range.
33 SmallVector<char, 4> Loc;
34 };
35
36 /// A list of locations that contain one variable.
37 struct LocationList {
38 /// The beginning offset where this location list is stored in the debug_loc
39 /// section.
40 unsigned Offset;
41 /// All the locations in which the variable is stored.
42 SmallVector<Entry, 2> Entries;
43 /// Dump this list on OS.
44 void dump(raw_ostream &OS, bool IsLittleEndian, unsigned AddressSize,
45 const MCRegisterInfo *MRI, unsigned Indent) const;
46 };
47
48private:
49 using LocationLists = SmallVector<LocationList, 4>;
50
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;
54
55 unsigned AddressSize;
56
57 bool IsLittleEndian;
58
59public:
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;
63
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);
67
68 /// Return the location list at the given offset or nullptr.
69 LocationList const *getLocationListAtOffset(uint64_t Offset) const;
70
71 Optional<LocationList> parseOneLocationList(DWARFDataExtractor Data,
72 uint32_t *Offset);
73};
74
75class DWARFDebugLocDWO {
76public:
77 struct Entry {
78 uint64_t Start;
79 uint32_t Length;
80 SmallVector<char, 4> Loc;
81 };
82
83 struct LocationList {
84 unsigned Offset;
85 SmallVector<Entry, 2> Entries;
86 void dump(raw_ostream &OS, bool IsLittleEndian, unsigned AddressSize,
87 const MCRegisterInfo *RegInfo, unsigned Indent) const;
88 };
89
90private:
91 using LocationLists = SmallVector<LocationList, 4>;
92
93 LocationLists Locations;
94
95 unsigned AddressSize;
96
97 bool IsLittleEndian;
98
99public:
100 void parse(DataExtractor data);
101 void dump(raw_ostream &OS, const MCRegisterInfo *RegInfo,
102 Optional<uint64_t> Offset) const;
103
104 /// Return the location list at the given offset or nullptr.
105 LocationList const *getLocationListAtOffset(uint64_t Offset) const;
106
107 static Optional<LocationList> parseOneLocationList(DataExtractor Data,
108 uint32_t *Offset);
109};
110
111} // end namespace llvm
112
113#endif // LLVM_DEBUGINFO_DWARF_DWARFDEBUGLOC_H