From: Ted Kremenek Date: Sun, 22 Mar 2009 06:42:39 +0000 (+0000) Subject: PTHManager::Create(): X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=22f0d09298ef05136f1ef6ebc4469b482cbd73e7;p=clang PTHManager::Create(): - Make the Diagnostic::Level for PTH errors to be specified by the caller clang (driver): - Set the PTHManager diagnostic level to "Diagnostic::Error" for -include-pth (a hard error) and Diagnostic::Warning for -token-cache (we can still proceed). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67462 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Driver/clang.cpp b/Driver/clang.cpp index 9c0ce10901..160c252304 100644 --- a/Driver/clang.cpp +++ b/Driver/clang.cpp @@ -1156,15 +1156,20 @@ public: if (!TokenCache.empty() && !ImplicitIncludePTH.empty()) { fprintf(stderr, "error: cannot use both -token-cache and -include-pth " "options\n"); - exit (1); + exit(1); } // Use PTH? if (!TokenCache.empty() || !ImplicitIncludePTH.empty()) { const std::string& x = TokenCache.empty() ? ImplicitIncludePTH:TokenCache; - PTHMgr.reset(PTHManager::Create(x, &Diags)); + PTHMgr.reset(PTHManager::Create(x, &Diags, + TokenCache.empty() ? Diagnostic::Error + : Diagnostic::Warning)); } + if (Diags.hasErrorOccurred()) + exit(1); + // Create the Preprocessor. llvm::OwningPtr PP(new Preprocessor(Diags, LangInfo, Target, SourceMgr, HeaderInfo, diff --git a/include/clang/Lex/PTHManager.h b/include/clang/Lex/PTHManager.h index 6c3cabb164..507576473f 100644 --- a/include/clang/Lex/PTHManager.h +++ b/include/clang/Lex/PTHManager.h @@ -17,6 +17,7 @@ #include "clang/Lex/PTHLexer.h" #include "clang/Basic/LangOptions.h" #include "clang/Basic/IdentifierTable.h" +#include "clang/Basic/Diagnostic.h" #include "llvm/ADT/DenseMap.h" #include "llvm/Support/Allocator.h" #include @@ -118,7 +119,8 @@ public: /// Create - This method creates PTHManager objects. The 'file' argument /// is the name of the PTH file. This method returns NULL upon failure. - static PTHManager *Create(const std::string& file, Diagnostic* Diags = 0); + static PTHManager *Create(const std::string& file, Diagnostic* Diags = 0, + Diagnostic::Level failureLevel=Diagnostic::Warning); void setPreprocessor(Preprocessor *pp) { PP = pp; } diff --git a/lib/Lex/PTHLexer.cpp b/lib/Lex/PTHLexer.cpp index e547ce551b..923b26cf7d 100644 --- a/lib/Lex/PTHLexer.cpp +++ b/lib/Lex/PTHLexer.cpp @@ -583,21 +583,23 @@ PTHManager::~PTHManager() { free(PerIDCache); } -static void InvalidPTH(Diagnostic *Diags, const char* Msg = 0) { +static void InvalidPTH(Diagnostic *Diags, Diagnostic::Level level, + const char* Msg = 0) { if (!Diags) return; if (!Msg) Msg = "Invalid or corrupted PTH file"; - unsigned DiagID = Diags->getCustomDiagID(Diagnostic::Warning, Msg); + unsigned DiagID = Diags->getCustomDiagID(level, Msg); Diags->Report(FullSourceLoc(), DiagID); } -PTHManager* PTHManager::Create(const std::string& file, Diagnostic* Diags) { +PTHManager* PTHManager::Create(const std::string& file, Diagnostic* Diags, + Diagnostic::Level level) { // Memory map the PTH file. llvm::OwningPtr File(llvm::MemoryBuffer::getFile(file.c_str())); if (!File) { if (Diags) { - unsigned DiagID = Diags->getCustomDiagID(Diagnostic::Warning, + unsigned DiagID = Diags->getCustomDiagID(level, "PTH file %0 could not be read"); Diags->Report(FullSourceLoc(), DiagID) << file; } @@ -613,7 +615,7 @@ PTHManager* PTHManager::Create(const std::string& file, Diagnostic* Diags) { // Check the prologue of the file. if ((BufEnd - BufBeg) < (signed) (sizeof("cfe-pth") + 3 + 4) || memcmp(BufBeg, "cfe-pth", sizeof("cfe-pth") - 1) != 0) { - InvalidPTH(Diags); + InvalidPTH(Diags, level); return 0; } @@ -622,7 +624,7 @@ PTHManager* PTHManager::Create(const std::string& file, Diagnostic* Diags) { unsigned Version = ReadLE32(p); if (Version != PTHManager::Version) { - InvalidPTH(Diags, + InvalidPTH(Diags, level, Version < PTHManager::Version ? "PTH file uses an older PTH format that is no longer supported" : "PTH file uses a newer PTH format that cannot be read"); @@ -633,7 +635,7 @@ PTHManager* PTHManager::Create(const std::string& file, Diagnostic* Diags) { const unsigned char *PrologueOffset = p; if (PrologueOffset >= BufEnd) { - InvalidPTH(Diags); + InvalidPTH(Diags, level); return 0; } @@ -643,7 +645,7 @@ PTHManager* PTHManager::Create(const std::string& file, Diagnostic* Diags) { const unsigned char* FileTable = BufBeg + ReadLE32(FileTableOffset); if (!(FileTable > BufBeg && FileTable < BufEnd)) { - InvalidPTH(Diags); + InvalidPTH(Diags, level); return 0; // FIXME: Proper error diagnostic? } @@ -652,7 +654,7 @@ PTHManager* PTHManager::Create(const std::string& file, Diagnostic* Diags) { // Warn if the PTH file is empty. We still want to create a PTHManager // as the PTH could be used with -include-pth. if (FL->isEmpty()) - InvalidPTH(Diags, "PTH file contains no cached source data"); + InvalidPTH(Diags, level, "PTH file contains no cached source data"); // Get the location of the table mapping from persistent ids to the // data needed to reconstruct identifiers. @@ -660,7 +662,7 @@ PTHManager* PTHManager::Create(const std::string& file, Diagnostic* Diags) { const unsigned char* IData = BufBeg + ReadLE32(IDTableOffset); if (!(IData >= BufBeg && IData < BufEnd)) { - InvalidPTH(Diags); + InvalidPTH(Diags, level); return 0; } @@ -669,23 +671,18 @@ PTHManager* PTHManager::Create(const std::string& file, Diagnostic* Diags) { const unsigned char* StringIdTableOffset = PrologueOffset + sizeof(uint32_t)*1; const unsigned char* StringIdTable = BufBeg + ReadLE32(StringIdTableOffset); if (!(StringIdTable >= BufBeg && StringIdTable < BufEnd)) { - InvalidPTH(Diags); + InvalidPTH(Diags, level); return 0; } llvm::OwningPtr SL(PTHStringIdLookup::Create(StringIdTable, BufBeg)); - // Issue a warning about the PTH file containing no identifiers. - if (!FL->isEmpty() && SL->isEmpty()) { - InvalidPTH(Diags, "PTH file contains no identifiers."); - } - // Get the location of the spelling cache. const unsigned char* spellingBaseOffset = PrologueOffset + sizeof(uint32_t)*3; const unsigned char* spellingBase = BufBeg + ReadLE32(spellingBaseOffset); if (!(spellingBase >= BufBeg && spellingBase < BufEnd)) { - InvalidPTH(Diags); + InvalidPTH(Diags, level); return 0; } @@ -700,7 +697,8 @@ PTHManager* PTHManager::Create(const std::string& file, Diagnostic* Diags) { if (NumIds) { PerIDCache = (IdentifierInfo**)calloc(NumIds, sizeof(*PerIDCache)); if (!PerIDCache) { - InvalidPTH(Diags, "Could not allocate memory for processing PTH file"); + InvalidPTH(Diags, level, + "Could not allocate memory for processing PTH file"); return 0; } }