forked from OSchip/llvm-project
Fix pr27728.
Sorry for the lack testcase. There is one in the pr, but it depends on std::sort and the .ll version is 110 lines, so I don't think it is wort it. The bug was that we were sorting after adding a terminator, and the sorting algorithm could end up putting the terminator in the middle of the List vector. With that we would create a Spans map entry keyed on nullptr which would then be added to CUs and fail in that sorting. llvm-svn: 270165
This commit is contained in:
parent
a769fd50ba
commit
78d947b4f5
|
@ -1554,24 +1554,12 @@ void DwarfDebug::emitDebugARanges() {
|
|||
}
|
||||
}
|
||||
|
||||
// Add terminating symbols for each section.
|
||||
for (const auto &I : SectionMap) {
|
||||
MCSection *Section = I.first;
|
||||
MCSymbol *Sym = nullptr;
|
||||
|
||||
if (Section)
|
||||
Sym = Asm->OutStreamer->endSection(Section);
|
||||
|
||||
// Insert a final terminator.
|
||||
SectionMap[Section].push_back(SymbolCU(nullptr, Sym));
|
||||
}
|
||||
|
||||
DenseMap<DwarfCompileUnit *, std::vector<ArangeSpan>> Spans;
|
||||
|
||||
for (auto &I : SectionMap) {
|
||||
const MCSection *Section = I.first;
|
||||
MCSection *Section = I.first;
|
||||
SmallVector<SymbolCU, 8> &List = I.second;
|
||||
if (List.size() < 2)
|
||||
if (List.size() < 1)
|
||||
continue;
|
||||
|
||||
// If we have no section (e.g. common), just write out
|
||||
|
@ -1581,8 +1569,8 @@ void DwarfDebug::emitDebugARanges() {
|
|||
ArangeSpan Span;
|
||||
Span.Start = Cur.Sym;
|
||||
Span.End = nullptr;
|
||||
if (Cur.CU)
|
||||
Spans[Cur.CU].push_back(Span);
|
||||
assert(Cur.CU);
|
||||
Spans[Cur.CU].push_back(Span);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
@ -1602,6 +1590,9 @@ void DwarfDebug::emitDebugARanges() {
|
|||
return IA < IB;
|
||||
});
|
||||
|
||||
// Insert a final terminator.
|
||||
List.push_back(SymbolCU(nullptr, Asm->OutStreamer->endSection(Section)));
|
||||
|
||||
// Build spans between each label.
|
||||
const MCSymbol *StartSym = List[0].Sym;
|
||||
for (size_t n = 1, e = List.size(); n < e; n++) {
|
||||
|
@ -1613,6 +1604,7 @@ void DwarfDebug::emitDebugARanges() {
|
|||
ArangeSpan Span;
|
||||
Span.Start = StartSym;
|
||||
Span.End = Cur.Sym;
|
||||
assert(Prev.CU);
|
||||
Spans[Prev.CU].push_back(Span);
|
||||
StartSym = Cur.Sym;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue