From aae58b0c3efb5fa9f97a3e4b1c1a2d31077efe5b Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Tue, 16 Mar 2010 20:01:30 +0000 Subject: [PATCH] Audit all getBuffer() callers (for both the FullSourceLoc and SourceManager versions), updating those callers that need to recover gracefully from failure. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@98665 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Basic/SourceLocation.h | 4 ++-- lib/Basic/SourceLocation.cpp | 8 ++++---- lib/Basic/SourceManager.cpp | 13 ++++++------- lib/Lex/PPLexerChange.cpp | 6 ++++-- 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/include/clang/Basic/SourceLocation.h b/include/clang/Basic/SourceLocation.h index 34dfecd9b6..adfe213095 100644 --- a/include/clang/Basic/SourceLocation.h +++ b/include/clang/Basic/SourceLocation.h @@ -208,11 +208,11 @@ public: const char *getCharacterData() const; - const llvm::MemoryBuffer* getBuffer() const; + const llvm::MemoryBuffer* getBuffer(bool *Invalid = 0) const; /// getBufferData - Return a StringRef to the source buffer data for the /// specified FileID. - llvm::StringRef getBufferData() const; + llvm::StringRef getBufferData(bool *Invalid = 0) const; /// getDecomposedLoc - Decompose the specified location into a raw FileID + /// Offset pair. The first element is the FileID, the second is the diff --git a/lib/Basic/SourceLocation.cpp b/lib/Basic/SourceLocation.cpp index 126d640364..85e5595dc2 100644 --- a/lib/Basic/SourceLocation.cpp +++ b/lib/Basic/SourceLocation.cpp @@ -110,13 +110,13 @@ const char *FullSourceLoc::getCharacterData() const { return SrcMgr->getCharacterData(*this); } -const llvm::MemoryBuffer* FullSourceLoc::getBuffer() const { +const llvm::MemoryBuffer* FullSourceLoc::getBuffer(bool *Invalid) const { assert(isValid()); - return SrcMgr->getBuffer(SrcMgr->getFileID(*this)); + return SrcMgr->getBuffer(SrcMgr->getFileID(*this), Invalid); } -llvm::StringRef FullSourceLoc::getBufferData() const { - return getBuffer()->getBuffer(); +llvm::StringRef FullSourceLoc::getBufferData(bool *Invalid) const { + return getBuffer(Invalid)->getBuffer(); } std::pair FullSourceLoc::getDecomposedLoc() const { diff --git a/lib/Basic/SourceManager.cpp b/lib/Basic/SourceManager.cpp index 4007ccf2a6..254aec0226 100644 --- a/lib/Basic/SourceManager.cpp +++ b/lib/Basic/SourceManager.cpp @@ -475,15 +475,14 @@ bool SourceManager::overrideFileContents(const FileEntry *SourceFile, } llvm::StringRef SourceManager::getBufferData(FileID FID, bool *Invalid) const { + bool MyInvalid = false; + const llvm::MemoryBuffer *Buf = getBuffer(FID, &MyInvalid); if (Invalid) - *Invalid = false; - - const llvm::MemoryBuffer *Buf = getBuffer(FID); - if (!Buf) { - if (*Invalid) - *Invalid = true; + *Invalid = MyInvalid; + + if (MyInvalid) return ""; - } + return Buf->getBuffer(); } diff --git a/lib/Lex/PPLexerChange.cpp b/lib/Lex/PPLexerChange.cpp index 81e6bf8090..6d1c132fc0 100644 --- a/lib/Lex/PPLexerChange.cpp +++ b/lib/Lex/PPLexerChange.cpp @@ -80,8 +80,10 @@ bool Preprocessor::EnterSourceFile(FileID FID, const DirectoryLookup *CurDir, } // Get the MemoryBuffer for this FID, if it fails, we fail. - const llvm::MemoryBuffer *InputFile = getSourceManager().getBuffer(FID); - if (!InputFile) + bool Invalid = false; + const llvm::MemoryBuffer *InputFile = getSourceManager().getBuffer(FID, + &Invalid); + if (Invalid) return true; EnterSourceFileWithLexer(new Lexer(FID, InputFile, *this), CurDir); -- 2.50.1