From 1d78e2101ab75f01615a45467c44da7181cccedb Mon Sep 17 00:00:00 2001 From: =?utf8?q?Duncan=20P=2E=20N=2E=20Exon=C2=A0Smith?= Date: Wed, 14 Oct 2020 17:54:44 -0400 Subject: [PATCH] clang/Basic: ContentCache::InvalidFlag => ContentCache::IsBufferInvalid, NFC Move a flag out of the `MemoryBuffer*` to unblock changing it to a `unique_ptr`. There are plenty of bits available in the bitfield below. Differential Revision: https://reviews.llvm.org/D89431 --- clang/include/clang/Basic/SourceManager.h | 15 +++++---------- clang/lib/Basic/SourceManager.cpp | 10 +++++----- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/clang/include/clang/Basic/SourceManager.h b/clang/include/clang/Basic/SourceManager.h index 480fa51..569ef00 100644 --- a/clang/include/clang/Basic/SourceManager.h +++ b/clang/include/clang/Basic/SourceManager.h @@ -95,9 +95,6 @@ namespace SrcMgr { /// This object owns the MemoryBuffer object. class alignas(8) ContentCache { enum CCFlags { - /// Whether the buffer is invalid. - InvalidFlag = 0x01, - /// Whether the buffer should not be freed on destruction. DoNotFreeFlag = 0x02 }; @@ -151,18 +148,21 @@ namespace SrcMgr { /// after serialization and deserialization. unsigned IsTransient : 1; + mutable unsigned IsBufferInvalid : 1; + ContentCache(const FileEntry *Ent = nullptr) : ContentCache(Ent, Ent) {} ContentCache(const FileEntry *Ent, const FileEntry *contentEnt) : Buffer(nullptr, false), OrigEntry(Ent), ContentsEntry(contentEnt), - BufferOverridden(false), IsFileVolatile(false), IsTransient(false) {} + BufferOverridden(false), IsFileVolatile(false), IsTransient(false), + IsBufferInvalid(false) {} /// The copy ctor does not allow copies where source object has either /// a non-NULL Buffer or SourceLineCache. Ownership of allocated memory /// is not transferred, so this is a logical error. ContentCache(const ContentCache &RHS) : Buffer(nullptr, false), BufferOverridden(false), - IsFileVolatile(false), IsTransient(false) { + IsFileVolatile(false), IsTransient(false), IsBufferInvalid(false) { OrigEntry = RHS.OrigEntry; ContentsEntry = RHS.ContentsEntry; @@ -216,11 +216,6 @@ namespace SrcMgr { /// with the given buffer. void replaceBuffer(const llvm::MemoryBuffer *B, bool DoNotFree = false); - /// Determine whether the buffer itself is invalid. - bool isBufferInvalid() const { - return Buffer.getInt() & InvalidFlag; - } - /// Determine whether the buffer should be freed. bool shouldFreeBuffer() const { return (Buffer.getInt() & DoNotFreeFlag) == 0; diff --git a/clang/lib/Basic/SourceManager.cpp b/clang/lib/Basic/SourceManager.cpp index 27d2f39..c831d26 100644 --- a/clang/lib/Basic/SourceManager.cpp +++ b/clang/lib/Basic/SourceManager.cpp @@ -123,7 +123,7 @@ ContentCache::getBufferOrNone(DiagnosticsEngine &Diag, FileManager &FM, SourceLocation Loc) const { // Lazily create the Buffer for ContentCaches that wrap files. If we already // computed it, just return what we have. - if (isBufferInvalid()) + if (IsBufferInvalid) return None; if (auto *B = Buffer.getPointer()) return B->getMemBufferRef(); @@ -144,7 +144,7 @@ ContentCache::getBufferOrNone(DiagnosticsEngine &Diag, FileManager &FM, Diag.Report(Loc, diag::err_file_too_large) << ContentsEntry->getName(); - Buffer.setInt(Buffer.getInt() | InvalidFlag); + IsBufferInvalid = true; return None; } @@ -164,7 +164,7 @@ ContentCache::getBufferOrNone(DiagnosticsEngine &Diag, FileManager &FM, Diag.Report(Loc, diag::err_cannot_open_file) << ContentsEntry->getName() << BufferOrError.getError().message(); - Buffer.setInt(Buffer.getInt() | InvalidFlag); + IsBufferInvalid = true; return None; } @@ -180,7 +180,7 @@ ContentCache::getBufferOrNone(DiagnosticsEngine &Diag, FileManager &FM, Diag.Report(Loc, diag::err_file_modified) << ContentsEntry->getName(); - Buffer.setInt(Buffer.getInt() | InvalidFlag); + IsBufferInvalid = true; return None; } @@ -193,7 +193,7 @@ ContentCache::getBufferOrNone(DiagnosticsEngine &Diag, FileManager &FM, if (InvalidBOM) { Diag.Report(Loc, diag::err_unsupported_bom) << InvalidBOM << ContentsEntry->getName(); - Buffer.setInt(Buffer.getInt() | InvalidFlag); + IsBufferInvalid = true; return None; } -- 2.7.4