do a dance with predefines, and finally enable reading of macros from
authorChris Lattner <sabre@nondot.org>
Fri, 10 Apr 2009 22:13:17 +0000 (22:13 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 10 Apr 2009 22:13:17 +0000 (22:13 +0000)
PCH.  This works now, except for limitations not being able to do things
with identifiers.  The basic example in the testcase works though.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68832 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Lex/Preprocessor.h
lib/Frontend/PCHReader.cpp
lib/Lex/Preprocessor.cpp
test/PCH/variables.c
test/PCH/variables.h
tools/clang-cc/clang-cc.cpp

index 0bf6126d587f49d8e0ae84dc81d58b6a45ece84c..656ebed89951f8462f32cf2cdb233dddc5282936 100644 (file)
@@ -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
index d5923086c7a0fc2dc25f46934eb4ded713c883d2..eaba610137dd23ff63674830618fb90c9acc8c74 100644 (file)
@@ -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;
 }
 
index be47fcc8fe35db8220c50d0f5e963459b200579e..5735d01716489339aea3ec3f04a00f776b4443a3 100644 (file)
@@ -45,7 +45,7 @@ using namespace clang;
 
 PreprocessorFactory::~PreprocessorFactory() {}
 
-bool PreprocessorFactory::FinishInitialization(Preprocessor *PP) {
+bool PreprocessorFactory::FinishInitialization(Preprocessor *PP, bool UsesPCH) {
   return false;
 }
 
index ffb9ec08c0ea4e350094bfa22d49fb38e7185165..aad40ceb91629d52636316cb68f5dcda5e67ea29 100644 (file)
@@ -8,3 +8,6 @@ double z; // expected-error{{redefinition}}
 
 //double VeryHappy; // FIXME: xpected-error{{redefinition}}
 
+
+int Q = A_MACRO_IN_THE_PCH;
+
index 4c5012d68baf64681a1909a1b72bf6f834c016e4..6bf82c44830e0c1ea182257905a0525b17fb68c2 100644 (file)
@@ -10,3 +10,4 @@ float z;
 #define MAKE_HAPPY(X) X##Happy
 int MAKE_HAPPY(Very);
 
+#define A_MACRO_IN_THE_PCH 492
index a155ac8c06be0e091847fce55d5f27845dfb8655..dfdc1953fea55676a83e9e4c5f08241819ad026a 100644 (file)
@@ -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,