1358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer//===-- DWARFDebugArangeSet.h -----------------------------------*- C++ -*-===//
2358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer//
3358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer//                     The LLVM Compiler Infrastructure
4358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer//
5358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer// This file is distributed under the University of Illinois Open Source
6358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer// License. See LICENSE.TXT for details.
7358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer//
8358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer//===----------------------------------------------------------------------===//
9358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer
1037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#ifndef LLVM_LIB_DEBUGINFO_DWARFDEBUGARANGESET_H
1137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#define LLVM_LIB_DEBUGINFO_DWARFDEBUGARANGESET_H
12358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer
1336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/ADT/iterator_range.h"
14358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer#include "llvm/Support/DataExtractor.h"
15358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer#include <vector>
16358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer
17358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramernamespace llvm {
18358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer
19358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramerclass raw_ostream;
20358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer
21358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramerclass DWARFDebugArangeSet {
22358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramerpublic:
23358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer  struct Header {
24358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer    // The total length of the entries for that set, not including the length
25358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer    // field itself.
26358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer    uint32_t Length;
27358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer    // The offset from the beginning of the .debug_info section of the
28358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer    // compilation unit entry referenced by the table.
29358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer    uint32_t CuOffset;
30d6361c0954247c4b5978b7f3dc5f42bcfa6bafc7Benjamin Kramer    // The DWARF version number.
31d6361c0954247c4b5978b7f3dc5f42bcfa6bafc7Benjamin Kramer    uint16_t Version;
32358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer    // The size in bytes of an address on the target architecture. For segmented
33358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer    // addressing, this is the size of the offset portion of the address.
34358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer    uint8_t AddrSize;
35358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer    // The size in bytes of a segment descriptor on the target architecture.
36358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer    // If the target system uses a flat address space, this value is 0.
37358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer    uint8_t SegSize;
38358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer  };
39358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer
40358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer  struct Descriptor {
41358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer    uint64_t Address;
42358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer    uint64_t Length;
43358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer    uint64_t getEndAddress() const { return Address + Length; }
44358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer  };
45358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer
46358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramerprivate:
47358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer  typedef std::vector<Descriptor> DescriptorColl;
4836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  typedef iterator_range<DescriptorColl::const_iterator> desc_iterator_range;
49358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer
50358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer  uint32_t Offset;
517b1bea3ccbf2d1cff66d4287e0cb7bc045802d31Rafael Espindola  Header HeaderData;
52358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer  DescriptorColl ArangeDescriptors;
53358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer
54358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramerpublic:
55358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer  DWARFDebugArangeSet() { clear(); }
56358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer  void clear();
57358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer  bool extract(DataExtractor data, uint32_t *offset_ptr);
58358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer  void dump(raw_ostream &OS) const;
59358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer
607b1bea3ccbf2d1cff66d4287e0cb7bc045802d31Rafael Espindola  uint32_t getCompileUnitDIEOffset() const { return HeaderData.CuOffset; }
6136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
6236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  desc_iterator_range descriptors() const {
6336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return desc_iterator_range(ArangeDescriptors.begin(),
6436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                               ArangeDescriptors.end());
65358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer  }
66358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer};
67358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer
68358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer}
69358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer
70358f4fd9ee078b3c79597fc688855fb48bc1f356Benjamin Kramer#endif
71