@@ -100,10 +100,19 @@ void GDBIndex::updateGdbIndexSection(
100
100
Data += SymbolTableOffset - CUTypesOffset;
101
101
102
102
// Calculate the size of the new address table.
103
+ const auto IsValidAddressRange = [](const DebugAddressRange &Range) {
104
+ return Range.HighPC > Range.LowPC ;
105
+ };
106
+
103
107
uint32_t NewAddressTableSize = 0 ;
104
108
for (const auto &CURangesPair : ARangesSectionWriter.getCUAddressRanges ()) {
105
109
const SmallVector<DebugAddressRange, 2 > &Ranges = CURangesPair.second ;
106
- NewAddressTableSize += Ranges.size () * 20 ;
110
+ NewAddressTableSize +=
111
+ llvm::count_if (Ranges,
112
+ [&IsValidAddressRange](const DebugAddressRange &Range) {
113
+ return IsValidAddressRange (Range);
114
+ }) *
115
+ 20 ;
107
116
}
108
117
109
118
// Difference between old and new table (and section) sizes.
@@ -201,10 +210,15 @@ void GDBIndex::updateGdbIndexSection(
201
210
const uint32_t UpdatedCUIndex = RemapCUIndex (OriginalCUIndex);
202
211
const DebugAddressRangesVector &Ranges = CURangesPair.second ;
203
212
for (const DebugAddressRange &Range : Ranges) {
204
- write64le (Buffer, Range.LowPC );
205
- write64le (Buffer + 8 , Range.HighPC );
206
- write32le (Buffer + 16 , UpdatedCUIndex);
207
- Buffer += 20 ;
213
+ // Don't emit ranges that break gdb,
214
+ // https://sourceware.org/bugzilla/show_bug.cgi?id=33247.
215
+ // We've seen [0, 0) ranges here, for instance.
216
+ if (IsValidAddressRange (Range)) {
217
+ write64le (Buffer, Range.LowPC );
218
+ write64le (Buffer + 8 , Range.HighPC );
219
+ write32le (Buffer + 16 , UpdatedCUIndex);
220
+ Buffer += 20 ;
221
+ }
208
222
}
209
223
}
210
224
0 commit comments