aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2009-11-12 02:53:48 +0000
committerDaniel Dunbar <daniel@zuster.org>2009-11-12 02:53:48 +0000
commit3574f46cf495ec61618fd6864b045c5b1d0d5068 (patch)
tree3af5a0d167e302b97b3a14a387d13dd3a0d47be8
parentc67a5f9038188c9361efe76f44e77746f94e309c (diff)
Switch PTHManager to using diagnostics for most errors.
Also, always give errors on a token-cache PTH failure. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@86939 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/clang/Basic/DiagnosticLexKinds.td8
-rw-r--r--include/clang/Lex/PTHManager.h3
-rw-r--r--lib/Lex/PTHLexer.cpp39
-rw-r--r--tools/clang-cc/clang-cc.cpp4
4 files changed, 25 insertions, 29 deletions
diff --git a/include/clang/Basic/DiagnosticLexKinds.td b/include/clang/Basic/DiagnosticLexKinds.td
index bbc551373d..7f3f4ea1fc 100644
--- a/include/clang/Basic/DiagnosticLexKinds.td
+++ b/include/clang/Basic/DiagnosticLexKinds.td
@@ -90,6 +90,14 @@ def warn_octal_escape_too_large : ExtWarn<"octal escape sequence out of range">;
def warn_hex_escape_too_large : ExtWarn<"hex escape sequence out of range">;
//===----------------------------------------------------------------------===//
+// PTH Diagnostics
+//===----------------------------------------------------------------------===//
+def err_pth_cannot_read : Error<
+ "PTH file '%0' could not be read">;
+def err_invalid_pth_file : Error<
+ "invalid or corrupt PTH file '%0'">;
+
+//===----------------------------------------------------------------------===//
// Preprocessor Diagnostics
//===----------------------------------------------------------------------===//
def pp_hash_warning : Warning<"#warning%0">, InGroup<DiagGroup<"#warnings">>;
diff --git a/include/clang/Lex/PTHManager.h b/include/clang/Lex/PTHManager.h
index ff1a17259e..ac5594e55d 100644
--- a/include/clang/Lex/PTHManager.h
+++ b/include/clang/Lex/PTHManager.h
@@ -119,8 +119,7 @@ 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,
- Diagnostic::Level failureLevel=Diagnostic::Warning);
+ static PTHManager *Create(const std::string& file, Diagnostic &Diags);
void setPreprocessor(Preprocessor *pp) { PP = pp; }
diff --git a/lib/Lex/PTHLexer.cpp b/lib/Lex/PTHLexer.cpp
index 60deeb325c..d6a73cc74f 100644
--- a/lib/Lex/PTHLexer.cpp
+++ b/lib/Lex/PTHLexer.cpp
@@ -15,6 +15,7 @@
#include "clang/Basic/FileManager.h"
#include "clang/Basic/IdentifierTable.h"
#include "clang/Basic/OnDiskHashTable.h"
+#include "clang/Lex/LexDiagnostic.h"
#include "clang/Lex/PTHLexer.h"
#include "clang/Lex/Preprocessor.h"
#include "clang/Lex/PTHManager.h"
@@ -407,26 +408,17 @@ PTHManager::~PTHManager() {
free(PerIDCache);
}
-static void InvalidPTH(Diagnostic *Diags, Diagnostic::Level level,
- const char* Msg = 0) {
- if (!Diags) return;
- if (!Msg) Msg = "Invalid or corrupted PTH file";
- Diags->Report(Diags->getCustomDiagID(level, Msg));
+static void InvalidPTH(Diagnostic &Diags, const char *Msg) {
+ Diags.Report(Diags.getCustomDiagID(Diagnostic::Error, Msg));
}
-PTHManager* PTHManager::Create(const std::string& file, Diagnostic* Diags,
- Diagnostic::Level level) {
+PTHManager* PTHManager::Create(const std::string& file, Diagnostic &Diags) {
// Memory map the PTH file.
llvm::OwningPtr<llvm::MemoryBuffer>
File(llvm::MemoryBuffer::getFile(file.c_str()));
if (!File) {
- if (Diags) {
- unsigned DiagID =Diags->getCustomDiagID(level,
- "PTH file %0 could not be read");
- Diags->Report(DiagID) << file;
- }
-
+ Diags.Report(diag::err_invalid_pth_file) << file;
return 0;
}
@@ -438,7 +430,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, level);
+ Diags.Report(diag::err_invalid_pth_file) << file;
return 0;
}
@@ -446,8 +438,8 @@ PTHManager* PTHManager::Create(const std::string& file, Diagnostic* Diags,
const unsigned char *p = BufBeg + (sizeof("cfe-pth") - 1);
unsigned Version = ReadLE32(p);
- if (Version != PTHManager::Version) {
- InvalidPTH(Diags, level,
+ if (Version < PTHManager::Version) {
+ InvalidPTH(Diags,
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");
@@ -458,7 +450,7 @@ PTHManager* PTHManager::Create(const std::string& file, Diagnostic* Diags,
const unsigned char *PrologueOffset = p;
if (PrologueOffset >= BufEnd) {
- InvalidPTH(Diags, level);
+ Diags.Report(diag::err_invalid_pth_file) << file;
return 0;
}
@@ -468,7 +460,7 @@ PTHManager* PTHManager::Create(const std::string& file, Diagnostic* Diags,
const unsigned char* FileTable = BufBeg + ReadLE32(FileTableOffset);
if (!(FileTable > BufBeg && FileTable < BufEnd)) {
- InvalidPTH(Diags, level);
+ Diags.Report(diag::err_invalid_pth_file) << file;
return 0; // FIXME: Proper error diagnostic?
}
@@ -477,7 +469,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, level, "PTH file contains no cached source data");
+ InvalidPTH(Diags, "PTH file contains no cached source data");
// Get the location of the table mapping from persistent ids to the
// data needed to reconstruct identifiers.
@@ -485,7 +477,7 @@ PTHManager* PTHManager::Create(const std::string& file, Diagnostic* Diags,
const unsigned char* IData = BufBeg + ReadLE32(IDTableOffset);
if (!(IData >= BufBeg && IData < BufEnd)) {
- InvalidPTH(Diags, level);
+ Diags.Report(diag::err_invalid_pth_file) << file;
return 0;
}
@@ -494,7 +486,7 @@ 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, level);
+ Diags.Report(diag::err_invalid_pth_file) << file;
return 0;
}
@@ -505,7 +497,7 @@ PTHManager* PTHManager::Create(const std::string& file, Diagnostic* Diags,
const unsigned char* spellingBaseOffset = PrologueOffset + sizeof(uint32_t)*3;
const unsigned char* spellingBase = BufBeg + ReadLE32(spellingBaseOffset);
if (!(spellingBase >= BufBeg && spellingBase < BufEnd)) {
- InvalidPTH(Diags, level);
+ Diags.Report(diag::err_invalid_pth_file) << file;
return 0;
}
@@ -520,8 +512,7 @@ PTHManager* PTHManager::Create(const std::string& file, Diagnostic* Diags,
if (NumIds) {
PerIDCache = (IdentifierInfo**)calloc(NumIds, sizeof(*PerIDCache));
if (!PerIDCache) {
- InvalidPTH(Diags, level,
- "Could not allocate memory for processing PTH file");
+ InvalidPTH(Diags, "Could not allocate memory for processing PTH file");
return 0;
}
}
diff --git a/tools/clang-cc/clang-cc.cpp b/tools/clang-cc/clang-cc.cpp
index 403eddb195..5803b12910 100644
--- a/tools/clang-cc/clang-cc.cpp
+++ b/tools/clang-cc/clang-cc.cpp
@@ -392,9 +392,7 @@ CreatePreprocessor(Diagnostic &Diags, const LangOptions &LangInfo,
if (!TokenCache.empty() || !PPOpts.getImplicitPTHInclude().empty()) {
const std::string& x = TokenCache.empty() ?
PPOpts.getImplicitPTHInclude() : TokenCache;
- PTHMgr = PTHManager::Create(x, &Diags,
- TokenCache.empty() ? Diagnostic::Error
- : Diagnostic::Warning);
+ PTHMgr = PTHManager::Create(x, Diags);
}
if (Diags.hasErrorOccurred())