SourceManager: Make LastLineNoContentCache and ContentCache::SourceLineCache mutable, NFC

Avoid some noisy `const_cast`s by making `ContentCache::SourceLineCache`
and `SourceManager::LastLineNoContentCache` both mutable.

Differential Revision: https://reviews.llvm.org/D89914
This commit is contained in:
Duncan P. N. Exon Smith 2020-10-21 17:48:28 -04:00
parent 0f0fd383b4
commit 5431c37b55
3 changed files with 15 additions and 17 deletions

View File

@ -146,7 +146,7 @@ namespace SrcMgr {
///
/// This is lazily computed. The lines are owned by the SourceManager
/// BumpPointerAllocator object.
LineOffsetMapping SourceLineCache;
mutable LineOffsetMapping SourceLineCache;
/// Indicates whether the buffer itself was provided to override
/// the actual file contents.
@ -719,7 +719,7 @@ class SourceManager : public RefCountedBase<SourceManager> {
/// These ivars serve as a cache used in the getLineNumber
/// method which is used to speedup getLineNumber calls to nearby locations.
mutable FileID LastLineNoFileIDQuery;
mutable SrcMgr::ContentCache *LastLineNoContentCache;
mutable const SrcMgr::ContentCache *LastLineNoContentCache;
mutable unsigned LastLineNoFilePos;
mutable unsigned LastLineNoResult;

View File

@ -1261,20 +1261,20 @@ unsigned SourceManager::getPresumedColumnNumber(SourceLocation Loc,
#endif
static LLVM_ATTRIBUTE_NOINLINE void
ComputeLineNumbers(DiagnosticsEngine &Diag, ContentCache *FI,
ComputeLineNumbers(DiagnosticsEngine &Diag, const ContentCache &FI,
llvm::BumpPtrAllocator &Alloc,
const SourceManager &SM, bool &Invalid);
static void ComputeLineNumbers(DiagnosticsEngine &Diag, ContentCache *FI,
static void ComputeLineNumbers(DiagnosticsEngine &Diag, const ContentCache &FI,
llvm::BumpPtrAllocator &Alloc,
const SourceManager &SM, bool &Invalid) {
// Note that calling 'getBuffer()' may lazily page in the file.
llvm::Optional<llvm::MemoryBufferRef> Buffer =
FI->getBufferOrNone(Diag, SM.getFileManager(), SourceLocation());
FI.getBufferOrNone(Diag, SM.getFileManager(), SourceLocation());
Invalid = !Buffer;
if (Invalid)
return;
FI->SourceLineCache = LineOffsetMapping::get(*Buffer, Alloc);
FI.SourceLineCache = LineOffsetMapping::get(*Buffer, Alloc);
}
LineOffsetMapping LineOffsetMapping::get(llvm::MemoryBufferRef Buffer,
@ -1324,7 +1324,7 @@ unsigned SourceManager::getLineNumber(FileID FID, unsigned FilePos,
return 1;
}
ContentCache *Content;
const ContentCache *Content;
if (LastLineNoFileIDQuery == FID)
Content = LastLineNoContentCache;
else {
@ -1336,14 +1336,14 @@ unsigned SourceManager::getLineNumber(FileID FID, unsigned FilePos,
return 1;
}
Content = const_cast<ContentCache *>(&Entry.getFile().getContentCache());
Content = &Entry.getFile().getContentCache();
}
// If this is the first use of line information for this buffer, compute the
/// SourceLineCache for it on demand.
if (!Content->SourceLineCache) {
bool MyInvalid = false;
ComputeLineNumbers(Diag, Content, ContentCacheAlloc, *this, MyInvalid);
ComputeLineNumbers(Diag, *Content, ContentCacheAlloc, *this, MyInvalid);
if (Invalid)
*Invalid = MyInvalid;
if (MyInvalid)
@ -1685,14 +1685,13 @@ SourceLocation SourceManager::translateLineCol(FileID FID,
if (Line == 1 && Col == 1)
return FileLoc;
ContentCache *Content =
const_cast<ContentCache *>(&Entry.getFile().getContentCache());
const ContentCache *Content = &Entry.getFile().getContentCache();
// If this is the first use of line information for this buffer, compute the
// SourceLineCache for it on demand.
if (!Content->SourceLineCache) {
bool MyInvalid = false;
ComputeLineNumbers(Diag, Content, ContentCacheAlloc, *this, MyInvalid);
ComputeLineNumbers(Diag, *Content, ContentCacheAlloc, *this, MyInvalid);
if (MyInvalid)
return SourceLocation();
}

View File

@ -37,11 +37,10 @@ SourceLocation ScratchBuffer::getToken(const char *Buf, unsigned Len,
else {
// Clear out the source line cache if it's already been computed.
// FIXME: Allow this to be incrementally extended.
auto *ContentCache = const_cast<SrcMgr::ContentCache *>(
&SourceMgr.getSLocEntry(SourceMgr.getFileID(BufferStartLoc))
.getFile()
.getContentCache());
ContentCache->SourceLineCache = SrcMgr::LineOffsetMapping();
SourceMgr.getSLocEntry(SourceMgr.getFileID(BufferStartLoc))
.getFile()
.getContentCache()
.SourceLineCache = SrcMgr::LineOffsetMapping();
}
// Prefix the token with a \n, so that it looks like it is the first thing on