]> granicus.if.org Git - clang/commitdiff
add a PPCallback handler for a skipped #include, patch by
authorChris Lattner <sabre@nondot.org>
Mon, 19 Apr 2010 20:44:31 +0000 (20:44 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 19 Apr 2010 20:44:31 +0000 (20:44 +0000)
Zhanyong Wan!

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

include/clang/Lex/PPCallbacks.h
lib/Lex/PPDirectives.cpp

index e891e94d4cbc52733cc9a4bf3b0f19d2d6fc69c1..d74124e9c79bd2ca39a1f222faaf0a2f205f57f4 100644 (file)
@@ -44,6 +44,14 @@ public:
                            SrcMgr::CharacteristicKind FileType) {
   }
 
+  /// FileSkipped - This callback is invoked whenever a source file is
+  /// skipped as the result of header guard optimization.  ParentFile
+  /// is the file that #includes the skipped file.  FilenameTok is the
+  /// token in ParentFile that indicates the skipped file.
+  virtual void FileSkipped(const FileEntry &ParentFile,
+                           const Token &FilenameTok,
+                           SrcMgr::CharacteristicKind FileType) {
+  }
 
   /// EndOfMainFile - This callback is invoked when the end of the main file is
   /// reach, no subsequent callbacks will be made.
@@ -96,6 +104,13 @@ public:
     Second->FileChanged(Loc, Reason, FileType);
   }
 
+  virtual void FileSkipped(const FileEntry &ParentFile,
+                           const Token &FilenameTok,
+                           SrcMgr::CharacteristicKind FileType) {
+    First->FileSkipped(ParentFile, FilenameTok, FileType);
+    Second->FileSkipped(ParentFile, FilenameTok, FileType);
+  }
+
   virtual void EndOfMainFile() {
     First->EndOfMainFile();
     Second->EndOfMainFile();
index 8033e475c8c447f9dd156b9c2ae5de04005ad71d..eb8664585f3fd4ede153be194e211beb9a722e5c 100644 (file)
@@ -1088,11 +1088,6 @@ void Preprocessor::HandleIncludeDirective(Token &IncludeTok,
     return;
   }
 
-  // Ask HeaderInfo if we should enter this #include file.  If not, #including
-  // this file will have no effect.
-  if (!HeaderInfo.ShouldEnterIncludeFile(File, isImport))
-    return;
-
   // The #included file will be considered to be a system header if either it is
   // in a system include directory, or if the #includer is a system include
   // header.
@@ -1100,6 +1095,15 @@ void Preprocessor::HandleIncludeDirective(Token &IncludeTok,
     std::max(HeaderInfo.getFileDirFlavor(File),
              SourceMgr.getFileCharacteristic(FilenameTok.getLocation()));
 
+  // Ask HeaderInfo if we should enter this #include file.  If not, #including
+  // this file will have no effect.
+  if (!HeaderInfo.ShouldEnterIncludeFile(File, isImport)) {
+    if (Callbacks) {
+      Callbacks->FileSkipped(*File, FilenameTok, FileCharacter);
+    }
+    return;
+  }
+
   // Look up the file, create a File ID for it.
   FileID FID = SourceMgr.createFileID(File, FilenameTok.getLocation(),
                                       FileCharacter);
@@ -1667,4 +1671,3 @@ void Preprocessor::HandleElifDirective(Token &ElifToken) {
   return SkipExcludedConditionalBlock(CI.IfLoc, /*Foundnonskip*/true,
                                       /*FoundElse*/CI.FoundElse);
 }
-