diff --git a/clang/include/clang/Basic/SourceManager.h b/clang/include/clang/Basic/SourceManager.h --- a/clang/include/clang/Basic/SourceManager.h +++ b/clang/include/clang/Basic/SourceManager.h @@ -95,9 +95,6 @@ /// 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 @@ /// 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 @@ /// 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 --- a/clang/lib/Basic/SourceManager.cpp +++ b/clang/lib/Basic/SourceManager.cpp @@ -123,7 +123,7 @@ 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 @@ Diag.Report(Loc, diag::err_file_too_large) << ContentsEntry->getName(); - Buffer.setInt(Buffer.getInt() | InvalidFlag); + IsBufferInvalid = true; return None; } @@ -164,7 +164,7 @@ 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 @@ Diag.Report(Loc, diag::err_file_modified) << ContentsEntry->getName(); - Buffer.setInt(Buffer.getInt() | InvalidFlag); + IsBufferInvalid = true; return None; } @@ -193,7 +193,7 @@ if (InvalidBOM) { Diag.Report(Loc, diag::err_unsupported_bom) << InvalidBOM << ContentsEntry->getName(); - Buffer.setInt(Buffer.getInt() | InvalidFlag); + IsBufferInvalid = true; return None; }