aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/clang/Lex/Preprocessor.h2
-rw-r--r--lib/Frontend/PCHReader.cpp10
-rw-r--r--lib/Lex/Preprocessor.cpp2
-rw-r--r--test/PCH/variables.c3
-rw-r--r--test/PCH/variables.h1
-rw-r--r--tools/clang-cc/clang-cc.cpp16
6 files changed, 22 insertions, 12 deletions
diff --git a/include/clang/Lex/Preprocessor.h b/include/clang/Lex/Preprocessor.h
index 0bf6126d58..656ebed899 100644
--- a/include/clang/Lex/Preprocessor.h
+++ b/include/clang/Lex/Preprocessor.h
@@ -788,7 +788,7 @@ class PreprocessorFactory {
public:
virtual ~PreprocessorFactory();
virtual Preprocessor* CreatePreprocessor() = 0;
- virtual bool FinishInitialization(Preprocessor *PP);
+ virtual bool FinishInitialization(Preprocessor *PP, bool usesPCH);
};
} // end namespace clang
diff --git a/lib/Frontend/PCHReader.cpp b/lib/Frontend/PCHReader.cpp
index d5923086c7..eaba610137 100644
--- a/lib/Frontend/PCHReader.cpp
+++ b/lib/Frontend/PCHReader.cpp
@@ -271,11 +271,7 @@ bool PCHReader::ReadPreprocessorBlock() {
}
// Finally, install the macro.
- II = II;
-#if 0
- // FIXME: Do this when predefines buffer is worked out.
PP.setMacroInfo(II, MI);
-#endif
// Remember that we saw this macro last so that we add the tokens that
// form its body to it.
@@ -466,6 +462,12 @@ bool PCHReader::ReadPCH(const std::string &FileName) {
// Load the translation unit declaration
ReadDeclRecord(DeclOffsets[0], 0);
+ // If everything looks like it will be ok, then the PCH file load succeeded.
+ // Since the PCH file contains everything that is in the preprocessor's
+ // predefines buffer (and we validated that they are the same) clear out the
+ // predefines buffer so that it doesn't get processed again.
+ PP.setPredefines("");
+
return false;
}
diff --git a/lib/Lex/Preprocessor.cpp b/lib/Lex/Preprocessor.cpp
index be47fcc8fe..5735d01716 100644
--- a/lib/Lex/Preprocessor.cpp
+++ b/lib/Lex/Preprocessor.cpp
@@ -45,7 +45,7 @@ using namespace clang;
PreprocessorFactory::~PreprocessorFactory() {}
-bool PreprocessorFactory::FinishInitialization(Preprocessor *PP) {
+bool PreprocessorFactory::FinishInitialization(Preprocessor *PP, bool UsesPCH) {
return false;
}
diff --git a/test/PCH/variables.c b/test/PCH/variables.c
index ffb9ec08c0..aad40ceb91 100644
--- a/test/PCH/variables.c
+++ b/test/PCH/variables.c
@@ -8,3 +8,6 @@ double z; // expected-error{{redefinition}}
//double VeryHappy; // FIXME: xpected-error{{redefinition}}
+
+int Q = A_MACRO_IN_THE_PCH;
+
diff --git a/test/PCH/variables.h b/test/PCH/variables.h
index 4c5012d68b..6bf82c4483 100644
--- a/test/PCH/variables.h
+++ b/test/PCH/variables.h
@@ -10,3 +10,4 @@ float z;
#define MAKE_HAPPY(X) X##Happy
int MAKE_HAPPY(Very);
+#define A_MACRO_IN_THE_PCH 492
diff --git a/tools/clang-cc/clang-cc.cpp b/tools/clang-cc/clang-cc.cpp
index a155ac8c06..dfdc1953fe 100644
--- a/tools/clang-cc/clang-cc.cpp
+++ b/tools/clang-cc/clang-cc.cpp
@@ -1442,7 +1442,7 @@ static void InitializePredefinedMacros(const TargetInfo &TI,
///
static bool InitializePreprocessor(Preprocessor &PP,
bool InitializeSourceMgr,
- const std::string &InFile) {
+ const std::string &InFile, bool UsesPCH) {
FileManager &FileMgr = PP.getFileManager();
// Figure out where to get and map in the main file.
@@ -1476,6 +1476,11 @@ static bool InitializePreprocessor(Preprocessor &PP,
}
}
+ // If the file is using PCH, then the PCH will include all the predefines, no
+ // need to install them now.
+ if (UsesPCH)
+ return false;
+
std::vector<char> PredefineBuffer;
// Install things like __POWERPC__, __GNUC__, etc into the macro table.
@@ -1765,10 +1770,9 @@ public:
return PP.take();
}
- virtual bool FinishInitialization(Preprocessor *PP) {
- if (InitializePreprocessor(*PP, InitializeSourceMgr, InFile)) {
+ virtual bool FinishInitialization(Preprocessor *PP, bool UsesPCH) {
+ if (InitializePreprocessor(*PP, InitializeSourceMgr, InFile, UsesPCH))
return true;
- }
/// FIXME: PP can only handle one callback
if (ProgAction != PrintPreprocessedInput) {
@@ -2097,7 +2101,7 @@ static void ProcessInputFile(Preprocessor &PP, PreprocessorFactory &PPF,
// than earlier) because this initialization creates new source
// location entries in the source manager, which must come after
// the source location entries for the PCH file.
- if (PPF.FinishInitialization(&PP))
+ if (PPF.FinishInitialization(&PP, true /*uses PCH*/))
return;
}
@@ -2308,7 +2312,7 @@ int main(int argc, char **argv) {
continue;
if (ImplicitIncludePCH.empty()
- && PPFactory.FinishInitialization(PP.get()))
+ && PPFactory.FinishInitialization(PP.get(), false))
continue;
// Create the HTMLDiagnosticsClient if we are using one. Otherwise,