@@ -1200,10 +1200,10 @@ unsigned SourceManager::getColumnNumber(FileID FID, unsigned FilePos,
1200
1200
const char *Buf = MemBuf->getBufferStart ();
1201
1201
// See if we just calculated the line number for this FilePos and can use
1202
1202
// that to lookup the start of the line instead of searching for it.
1203
- if (LastLineNoFileIDQuery == FID &&
1204
- LastLineNoContentCache->SourceLineCache != nullptr &&
1205
- LastLineNoResult < LastLineNoContentCache-> NumLines ) {
1206
- unsigned *SourceLineCache = LastLineNoContentCache->SourceLineCache ;
1203
+ if (LastLineNoFileIDQuery == FID && LastLineNoContentCache-> SourceLineCache &&
1204
+ LastLineNoResult < LastLineNoContentCache->SourceLineCache . size ()) {
1205
+ const unsigned *SourceLineCache =
1206
+ LastLineNoContentCache->SourceLineCache . begin () ;
1207
1207
unsigned LineStart = SourceLineCache[LastLineNoResult - 1 ];
1208
1208
unsigned LineEnd = SourceLineCache[LastLineNoResult];
1209
1209
if (FilePos >= LineStart && FilePos < LineEnd) {
@@ -1274,15 +1274,20 @@ static void ComputeLineNumbers(DiagnosticsEngine &Diag, ContentCache *FI,
1274
1274
if (Invalid)
1275
1275
return ;
1276
1276
1277
+ FI->SourceLineCache = LineOffsetMapping::get (*Buffer, Alloc);
1278
+ }
1279
+
1280
+ LineOffsetMapping LineOffsetMapping::get (llvm::MemoryBufferRef Buffer,
1281
+ llvm::BumpPtrAllocator &Alloc) {
1277
1282
// Find the file offsets of all of the *physical* source lines. This does
1278
1283
// not look at trigraphs, escaped newlines, or anything else tricky.
1279
1284
SmallVector<unsigned , 256 > LineOffsets;
1280
1285
1281
1286
// Line #1 starts at char 0.
1282
1287
LineOffsets.push_back (0 );
1283
1288
1284
- const unsigned char *Buf = (const unsigned char *)Buffer-> getBufferStart ();
1285
- const unsigned char *End = (const unsigned char *)Buffer-> getBufferEnd ();
1289
+ const unsigned char *Buf = (const unsigned char *)Buffer. getBufferStart ();
1290
+ const unsigned char *End = (const unsigned char *)Buffer. getBufferEnd ();
1286
1291
const std::size_t BufLen = End - Buf;
1287
1292
unsigned I = 0 ;
1288
1293
while (I < BufLen) {
@@ -1297,10 +1302,14 @@ static void ComputeLineNumbers(DiagnosticsEngine &Diag, ContentCache *FI,
1297
1302
++I;
1298
1303
}
1299
1304
1300
- // Copy the offsets into the FileInfo structure.
1301
- FI->NumLines = LineOffsets.size ();
1302
- FI->SourceLineCache = Alloc.Allocate <unsigned >(LineOffsets.size ());
1303
- std::copy (LineOffsets.begin (), LineOffsets.end (), FI->SourceLineCache );
1305
+ return LineOffsetMapping (LineOffsets, Alloc);
1306
+ }
1307
+
1308
+ LineOffsetMapping::LineOffsetMapping (ArrayRef<unsigned > LineOffsets,
1309
+ llvm::BumpPtrAllocator &Alloc)
1310
+ : Storage(Alloc.Allocate<unsigned >(LineOffsets.size() + 1)) {
1311
+ Storage[0 ] = LineOffsets.size ();
1312
+ std::copy (LineOffsets.begin (), LineOffsets.end (), Storage + 1 );
1304
1313
}
1305
1314
1306
1315
// / getLineNumber - Given a SourceLocation, return the spelling line number
@@ -1344,9 +1353,9 @@ unsigned SourceManager::getLineNumber(FileID FID, unsigned FilePos,
1344
1353
1345
1354
// Okay, we know we have a line number table. Do a binary search to find the
1346
1355
// line number that this character position lands on.
1347
- unsigned *SourceLineCache = Content->SourceLineCache ;
1348
- unsigned *SourceLineCacheStart = SourceLineCache;
1349
- unsigned *SourceLineCacheEnd = SourceLineCache + Content->NumLines ;
1356
+ const unsigned *SourceLineCache = Content->SourceLineCache . begin () ;
1357
+ const unsigned *SourceLineCacheStart = SourceLineCache;
1358
+ const unsigned *SourceLineCacheEnd = Content->SourceLineCache . end () ;
1350
1359
1351
1360
unsigned QueriedFilePos = FilePos+1 ;
1352
1361
@@ -1385,13 +1394,13 @@ unsigned SourceManager::getLineNumber(FileID FID, unsigned FilePos,
1385
1394
}
1386
1395
}
1387
1396
} else {
1388
- if (LastLineNoResult < Content->NumLines )
1397
+ if (LastLineNoResult < Content->SourceLineCache . size () )
1389
1398
SourceLineCacheEnd = SourceLineCache+LastLineNoResult+1 ;
1390
1399
}
1391
1400
}
1392
1401
1393
- unsigned *Pos
1394
- = std::lower_bound (SourceLineCache, SourceLineCacheEnd, QueriedFilePos);
1402
+ const unsigned *Pos =
1403
+ std::lower_bound (SourceLineCache, SourceLineCacheEnd, QueriedFilePos);
1395
1404
unsigned LineNo = Pos-SourceLineCacheStart;
1396
1405
1397
1406
LastLineNoFileIDQuery = FID;
@@ -1693,7 +1702,7 @@ SourceLocation SourceManager::translateLineCol(FileID FID,
1693
1702
if (!Buffer)
1694
1703
return SourceLocation ();
1695
1704
1696
- if (Line > Content->NumLines ) {
1705
+ if (Line > Content->SourceLineCache . size () ) {
1697
1706
unsigned Size = Buffer->getBufferSize ();
1698
1707
if (Size > 0 )
1699
1708
--Size;
@@ -2105,7 +2114,7 @@ void SourceManager::PrintStats() const {
2105
2114
unsigned NumLineNumsComputed = 0 ;
2106
2115
unsigned NumFileBytesMapped = 0 ;
2107
2116
for (fileinfo_iterator I = fileinfo_begin (), E = fileinfo_end (); I != E; ++I){
2108
- NumLineNumsComputed += I->second ->SourceLineCache != nullptr ;
2117
+ NumLineNumsComputed += bool ( I->second ->SourceLineCache ) ;
2109
2118
NumFileBytesMapped += I->second ->getSizeBytesMapped ();
2110
2119
}
2111
2120
unsigned NumMacroArgsComputed = MacroArgsCacheMap.size ();
0 commit comments