LLVM: lib/DebugInfo/DWARF/DWARFDebugAranges.cpp Source File (original) (raw)

1

2

3

4

5

6

7

8

16#include

17#include

18#include

19

20using namespace llvm;

21

22void DWARFDebugAranges::extract(

27 return;

29 DWARFDebugArangeSet Set;

30

32 if (Error E = Set.extract(DebugArangesData, &Offset, WarningHandler)) {

33 RecoverableErrorHandler(std::move(E));

34 return;

35 }

36 uint64_t CUOffset = Set.getCompileUnitDIEOffset();

37 for (const auto &Desc : Set.descriptors()) {

38 uint64_t LowPC = Desc.Address;

39 uint64_t HighPC = Desc.getEndAddress();

40 appendRange(CUOffset, LowPC, HighPC);

41 }

42 ParsedCUOffsets.insert(CUOffset);

43 }

44}

45

47 clear();

48 if (!CTX)

49 return;

50

51

56

57

58

59

62 if (ParsedCUOffsets.insert(CUOffset).second) {

64 if (!CURanges)

66 else

67 for (const auto &R : *CURanges)

68 appendRange(CUOffset, R.LowPC, R.HighPC);

69 }

70 }

71

72 construct();

73}

74

75void DWARFDebugAranges::clear() {

76 Endpoints.clear();

77 Aranges.clear();

78 ParsedCUOffsets.clear();

79}

80

81void DWARFDebugAranges::appendRange(uint64_t CUOffset, uint64_t LowPC,

83 if (LowPC >= HighPC)

84 return;

85 Endpoints.emplace_back(LowPC, CUOffset, true);

86 Endpoints.emplace_back(HighPC, CUOffset, false);

87}

88

89void DWARFDebugAranges::construct() {

90 std::multiset<uint64_t> ValidCUs;

91

93 uint64_t PrevAddress = -1ULL;

94 for (const auto &E : Endpoints) {

95 if (PrevAddress < E.Address && !ValidCUs.empty()) {

96

97

98

99 if (!Aranges.empty() && Aranges.back().HighPC() == PrevAddress &&

100 ValidCUs.find(Aranges.back().CUOffset) != ValidCUs.end()) {

101 Aranges.back().setHighPC(E.Address);

102 } else {

103 Aranges.emplace_back(PrevAddress, E.Address, *ValidCUs.begin());

104 }

105 }

106

107 if (E.IsRangeStart) {

108 ValidCUs.insert(E.CUOffset);

109 } else {

110 auto CUPos = ValidCUs.find(E.CUOffset);

111 assert(CUPos != ValidCUs.end());

112 ValidCUs.erase(CUPos);

113 }

114 PrevAddress = E.Address;

115 }

116 assert(ValidCUs.empty());

117

118

119 Endpoints.clear();

120 Endpoints.shrink_to_fit();

121}

122

124 RangeCollIterator It =

126 if (It != Aranges.end() && It->LowPC <= Address)

127 return It->CUOffset;

128 return -1ULL;

129}

assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")

static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")

DWARFContext This data structure is the top level entity that deals with dwarf debug information pars...

function_ref< void(Error)> getRecoverableErrorHandler()

compile_unit_range compile_units()

Get compile units in this context.

function_ref< void(Error)> getWarningHandler()

bool isLittleEndian() const

const DWARFObject & getDWARFObj() const

void generate(DWARFContext *CTX)

Definition DWARFDebugAranges.cpp:46

uint64_t findAddress(uint64_t Address) const

Definition DWARFDebugAranges.cpp:123

virtual StringRef getArangesSection() const

Lightweight error class with error context and mandatory checking.

Tagged union holding either a T or a Error.

Error takeError()

Take ownership of the stored error.

An efficient, type-erasing, non-owning reference to a callable.

This is an optimization pass for GlobalISel generic memory operations.

auto partition_point(R &&Range, Predicate P)

Binary search for the first iterator in a range where a predicate is false.

void sort(IteratorTy Start, IteratorTy End)