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 @@ -901,10 +901,18 @@ /// Retrieve the memory buffer associated with the given file. /// - /// \param Invalid If non-NULL, will be set \c true if an error - /// occurs while retrieving the memory buffer. - const llvm::MemoryBuffer *getMemoryBufferForFile(const FileEntry *File, - bool *Invalid = nullptr); + /// Returns None if the buffer is not valid. + llvm::Optional + getMemoryBufferForFileOrNone(const FileEntry *File); + + /// Retrieve the memory buffer associated with the given file. + /// + /// Returns a fake buffer if there isn't a real one. + llvm::MemoryBufferRef getMemoryBufferForFileOrFake(const FileEntry *File) { + if (auto B = getMemoryBufferForFileOrNone(File)) + return *B; + return getFakeBufferForRecovery()->getMemBufferRef(); + } /// Override the contents of the given source file by providing an /// already-allocated buffer. diff --git a/clang/include/clang/Frontend/PrecompiledPreamble.h b/clang/include/clang/Frontend/PrecompiledPreamble.h --- a/clang/include/clang/Frontend/PrecompiledPreamble.h +++ b/clang/include/clang/Frontend/PrecompiledPreamble.h @@ -26,6 +26,7 @@ namespace llvm { class MemoryBuffer; +class MemoryBufferRef; namespace vfs { class FileSystem; } @@ -216,7 +217,7 @@ static PreambleFileHash createForFile(off_t Size, time_t ModTime); static PreambleFileHash - createForMemoryBuffer(const llvm::MemoryBuffer *Buffer); + createForMemoryBuffer(const llvm::MemoryBufferRef &Buffer); friend bool operator==(const PreambleFileHash &LHS, const PreambleFileHash &RHS) { 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 @@ -701,14 +701,11 @@ return SourceLocation::getMacroLoc(NextLocalOffset - (TokLength + 1)); } -const llvm::MemoryBuffer * -SourceManager::getMemoryBufferForFile(const FileEntry *File, bool *Invalid) { +llvm::Optional +SourceManager::getMemoryBufferForFileOrNone(const FileEntry *File) { const SrcMgr::ContentCache *IR = getOrCreateContentCache(File); assert(IR && "getOrCreateContentCache() cannot return NULL"); - auto *B = IR->getBufferPointer(Diag, getFileManager(), SourceLocation()); - if (Invalid) - *Invalid = !B; - return B ? B : getFakeBufferForRecovery(); + return IR->getBufferOrNone(Diag, getFileManager(), SourceLocation()); } void SourceManager::overrideFileContents(const FileEntry *SourceFile, diff --git a/clang/lib/Frontend/PrecompiledPreamble.cpp b/clang/lib/Frontend/PrecompiledPreamble.cpp --- a/clang/lib/Frontend/PrecompiledPreamble.cpp +++ b/clang/lib/Frontend/PrecompiledPreamble.cpp @@ -463,7 +463,8 @@ PrecompiledPreamble::PreambleFileHash::createForFile(File->getSize(), ModTime); } else { - const llvm::MemoryBuffer *Buffer = SourceMgr.getMemoryBufferForFile(File); + llvm::MemoryBufferRef Buffer = + SourceMgr.getMemoryBufferForFileOrFake(File); FilesInPreamble[File->getName()] = PrecompiledPreamble::PreambleFileHash::createForMemoryBuffer(Buffer); } @@ -549,7 +550,7 @@ llvm::StringMap OverridenFileBuffers; for (const auto &RB : PreprocessorOpts.RemappedFileBuffers) { const PrecompiledPreamble::PreambleFileHash PreambleHash = - PreambleFileHash::createForMemoryBuffer(RB.second); + PreambleFileHash::createForMemoryBuffer(RB.second->getMemBufferRef()); llvm::vfs::Status Status; if (moveOnNoError(VFS->status(RB.first), Status)) OverriddenFiles[Status.getUniqueID()] = PreambleHash; @@ -783,13 +784,13 @@ PrecompiledPreamble::PreambleFileHash PrecompiledPreamble::PreambleFileHash::createForMemoryBuffer( - const llvm::MemoryBuffer *Buffer) { + const llvm::MemoryBufferRef &Buffer) { PreambleFileHash Result; - Result.Size = Buffer->getBufferSize(); + Result.Size = Buffer.getBufferSize(); Result.ModTime = 0; llvm::MD5 MD5Ctx; - MD5Ctx.update(Buffer->getBuffer().data()); + MD5Ctx.update(Buffer.getBuffer().data()); MD5Ctx.final(Result.MD5); return Result; diff --git a/clang/lib/Lex/Preprocessor.cpp b/clang/lib/Lex/Preprocessor.cpp --- a/clang/lib/Lex/Preprocessor.cpp +++ b/clang/lib/Lex/Preprocessor.cpp @@ -395,12 +395,10 @@ assert(CompleteLine && CompleteColumn && "Starts from 1:1"); assert(!CodeCompletionFile && "Already set"); - using llvm::MemoryBuffer; - // Load the actual file's contents. - bool Invalid = false; - const MemoryBuffer *Buffer = SourceMgr.getMemoryBufferForFile(File, &Invalid); - if (Invalid) + Optional Buffer = + SourceMgr.getMemoryBufferForFileOrNone(File); + if (!Buffer) return true; // Find the byte position of the truncation point.