1//===- 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
114