1//===- DWARFDebugArangeSet.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_DWARFDEBUGARANGESET_H
11#define LLVM_DEBUGINFO_DWARFDEBUGARANGESET_H
12
13#include "llvm/ADT/iterator_range.h"
14#include "llvm/Support/DataExtractor.h"
15#include <cstdint>
16#include <vector>
17
18namespace llvm {
19
20class raw_ostream;
21
22class DWARFDebugArangeSet {
23public:
24  struct Header {
25    /// The total length of the entries for that set, not including the length
26    /// field itself.
27    uint32_t Length;
28    /// The offset from the beginning of the .debug_info section of the
29    /// compilation unit entry referenced by the table.
30    uint32_t CuOffset;
31    /// The DWARF version number.
32    uint16_t Version;
33    /// The size in bytes of an address on the target architecture. For segmented
34    /// addressing, this is the size of the offset portion of the address.
35    uint8_t AddrSize;
36    /// The size in bytes of a segment descriptor on the target architecture.
37    /// If the target system uses a flat address space, this value is 0.
38    uint8_t SegSize;
39  };
40
41  struct Descriptor {
42    uint64_t Address;
43    uint64_t Length;
44
45    uint64_t getEndAddress() const { return Address + Length; }
46  };
47
48private:
49  typedef std::vector<Descriptor> DescriptorColl;
50  typedef iterator_range<DescriptorColl::const_iterator> desc_iterator_range;
51
52  uint32_t Offset;
53  Header HeaderData;
54  DescriptorColl ArangeDescriptors;
55
56public:
57  DWARFDebugArangeSet() { clear(); }
58
59  void clear();
60  bool extract(DataExtractor data, uint32_t *offset_ptr);
61  void dump(raw_ostream &OS) const;
62
63  uint32_t getCompileUnitDIEOffset() const { return HeaderData.CuOffset; }
64
65  const Header &getHeader() const { return HeaderData; }
66
67  desc_iterator_range descriptors() const {
68    return desc_iterator_range(ArangeDescriptors.begin(),
69                               ArangeDescriptors.end());
70  }
71};
72
73} // end namespace llvm
74
75#endif // LLVM_DEBUGINFO_DWARFDEBUGARANGESET_H
76