]> granicus.if.org Git - clang/commitdiff
emit function-like and object-like macros to the PCH file.
authorChris Lattner <sabre@nondot.org>
Fri, 10 Apr 2009 18:00:12 +0000 (18:00 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 10 Apr 2009 18:00:12 +0000 (18:00 +0000)
Note that we don't do anything useful with identifier infos yet
and don't emit the tokens that the macros are defined to.

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

include/clang/Frontend/PCHBitCodes.h
include/clang/Lex/Preprocessor.h
lib/Frontend/PCHWriter.cpp

index e4e50e3aa6b7e132f986d1d787b892b15e9d8560..a8257bf00795ad9b7e2c868d4b2ed4212dfda42e 100644 (file)
@@ -115,6 +115,26 @@ namespace clang {
       /// macro instantiation.
       SM_SLOC_INSTANTIATION_ENTRY = 4
     };
+    
+    /// \brief Record types used within a preprocessor block.
+    enum PreprocessorRecordTypes {
+      // The macros in the PP section are a PP_MACRO_* instance followed by a
+      // list of PP_TOKEN instances for each token in the definition.
+
+      /// \brief An object-like macro definition.
+      /// [PP_MACRO_OBJECT_LIKE, IdentInfoID, SLoc, IsUsed]
+      PP_MACRO_OBJECT_LIKE = 1,
+
+      /// \brief A function-like macro definition.
+      /// [PP_MACRO_FUNCTION_LIKE, <ObjectLikeStuff>, IsC99Varargs, IsGNUVarars,
+      ///  NumArgs, ArgIdentInfoID* ]
+      PP_MACRO_FUNCTION_LIKE = 2,
+      
+      /// \brief Describes one token.
+      /// [PPTOKEN, SLoc, Length, IdentInfoID, Kind, Flags]
+      PP_TOKEN = 3
+    };
+    
 
     /// \defgroup PCHAST Precompiled header AST constants
     ///
index 68cb372c478590224d1f33553faa53f8dfddacbc..f5b4b361a563b0a71d1a9a5433ee35aa36772d1e 100644 (file)
@@ -585,6 +585,12 @@ public:
   /// current line until the tok::eom token is found.
   void DiscardUntilEndOfDirective();
   
+  /// SawDateOrTime - This returns true if the preprocessor has seen a use of
+  /// __DATE__ or __TIME__ in the file so far.
+  bool SawDateOrTime() const {
+    return DATELoc != SourceLocation() || TIMELoc != SourceLocation();
+  }
+  
 private:
   
   void PushIncludeMacroStack() {
index f80d46ab5d9de061e73559a38dca2554d35af3a4..05447dcd6ac8f5f369b97e0c05bbf3209083e5f4 100644 (file)
@@ -17,6 +17,8 @@
 #include "clang/AST/DeclContextInternals.h"
 #include "clang/AST/DeclVisitor.h"
 #include "clang/AST/Type.h"
+#include "clang/Lex/MacroInfo.h"
+#include "clang/Lex/Preprocessor.h"
 #include "clang/Basic/FileManager.h"
 #include "clang/Basic/SourceManager.h"
 #include "llvm/Bitcode/BitstreamWriter.h"
@@ -481,8 +483,56 @@ void PCHWriter::WritePreprocessor(Preprocessor &PP) {
   // Enter the preprocessor block.
   S.EnterSubblock(pch::PREPROCESSOR_BLOCK_ID, 3);
   
+  // If the PCH file contains __DATE__ or __TIME__ emit a warning about this.
+  // FIXME: use diagnostics subsystem for localization etc.
+  if (PP.SawDateOrTime())
+    fprintf(stderr, "warning: precompiled header used __DATE__ or __TIME__.\n");
   
+  RecordData Record;
+
+  // Loop over all the macro definitions that are live at the end of the file,
+  // emitting each to the PP section.
+  // FIXME: Eventually we want to emit an index so that we can lazily load
+  // macros.
+  for (Preprocessor::macro_iterator I = PP.macro_begin(), E = PP.macro_end();
+       I != E; ++I) {
+    MacroInfo *MI = I->second;
+
+    // Don't emit builtin macros like __LINE__ to the PCH file unless they have
+    // been redefined by the header (in which case they are not isBuiltinMacro).
+    if (MI->isBuiltinMacro())
+      continue;
+
+    IdentifierInfo *II = I->first;
+    
+    // FIXME: Output the identifier Info ID #!
+    Record.push_back((intptr_t)II); 
+    Record.push_back(MI->getDefinitionLoc().getRawEncoding());
+    Record.push_back(MI->isUsed());
+    
+    unsigned Code;
+    if (MI->isObjectLike()) {
+      Code = pch::PP_MACRO_OBJECT_LIKE;
+    } else {
+      Code = pch::PP_MACRO_FUNCTION_LIKE;
+      
+      Record.push_back(MI->isC99Varargs());
+      Record.push_back(MI->isGNUVarargs());
+      Record.push_back(MI->getNumArgs());
+      for (MacroInfo::arg_iterator I = MI->arg_begin(), E = MI->arg_end();
+           I != E; ++I)
+        // FIXME: Output the identifier Info ID #!
+        Record.push_back((intptr_t)II); 
+    }
+    S.EmitRecord(Code, Record);
+    Record.clear();
 
+    // FIXME: Emit the tokens array.
+    
+  }
+  
+  // TODO: someday when PP supports __COUNTER__, emit a record for its value if
+  // non-zero.
   
   S.ExitBlock();
 }