Author: akirtzidis
Date: Wed May  8 18:46:46 2013
New Revision: 181489

URL: http://llvm.org/viewvc/llvm-project?rev=181489&view=rev
Log:
[modules] When building a module, make sure we don't serialize out 
HeaderFileInfo for headers not belonging to the module.

After r180934 we may initiate module map parsing for modules not related to the 
module what we are building,
make sure we ignore the header file info of headers from such modules.

First part of rdar://13840148

Added:
    cfe/trunk/test/Modules/self-import-header/
    cfe/trunk/test/Modules/self-import-header/af.framework/
    cfe/trunk/test/Modules/self-import-header/af.framework/Headers/
    cfe/trunk/test/Modules/self-import-header/af.framework/Headers/a1.h
    cfe/trunk/test/Modules/self-import-header/af.framework/Headers/a2.h
    cfe/trunk/test/Modules/self-import-header/af.framework/module.map
    cfe/trunk/test/Modules/self-import-header/depend_builtin/
    cfe/trunk/test/Modules/self-import-header/depend_builtin/h1.h
    cfe/trunk/test/Modules/self-import-header/depend_builtin/module.map
    cfe/trunk/test/Modules/self-import-header/test.m
Modified:
    cfe/trunk/include/clang/Lex/HeaderSearch.h
    cfe/trunk/include/clang/Lex/ModuleMap.h
    cfe/trunk/lib/Lex/HeaderSearch.cpp
    cfe/trunk/lib/Lex/ModuleMap.cpp
    cfe/trunk/lib/Serialization/ASTWriter.cpp

Modified: cfe/trunk/include/clang/Lex/HeaderSearch.h
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/HeaderSearch.h?rev=181489&r1=181488&r2=181489&view=diff
==============================================================================
--- cfe/trunk/include/clang/Lex/HeaderSearch.h (original)
+++ cfe/trunk/include/clang/Lex/HeaderSearch.h Wed May  8 18:46:46 2013
@@ -53,6 +53,9 @@ struct HeaderFileInfo {
 
   /// \brief Whether this header is part of a module.
   unsigned isModuleHeader : 1;
+
+  /// \brief Whether this header is part of the module that we are building.
+  unsigned isCompilingModuleHeader : 1;
   
   /// \brief Whether this structure is considered to already have been
   /// "resolved", meaning that it was loaded from the external source.
@@ -93,8 +96,8 @@ struct HeaderFileInfo {
   
   HeaderFileInfo()
     : isImport(false), isPragmaOnce(false), DirInfo(SrcMgr::C_User), 
-      External(false), isModuleHeader(false), Resolved(false),
-      IndexHeaderMapHeader(false),
+      External(false), isModuleHeader(false), isCompilingModuleHeader(false),
+      Resolved(false), IndexHeaderMapHeader(false),
       NumIncludes(0), ControllingMacroID(0), ControllingMacro(0)  {}
 
   /// \brief Retrieve the controlling macro for this header file, if
@@ -405,7 +408,7 @@ public:
   }
 
   /// \brief Mark the specified file as part of a module.
-  void MarkFileModuleHeader(const FileEntry *File);
+  void MarkFileModuleHeader(const FileEntry *File, bool 
IsCompiledModuleHeader);
 
   /// \brief Increment the count for the number of times the specified
   /// FileEntry has been entered.

Modified: cfe/trunk/include/clang/Lex/ModuleMap.h
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/ModuleMap.h?rev=181489&r1=181488&r2=181489&view=diff
==============================================================================
--- cfe/trunk/include/clang/Lex/ModuleMap.h (original)
+++ cfe/trunk/include/clang/Lex/ModuleMap.h Wed May  8 18:46:46 2013
@@ -52,6 +52,9 @@ class ModuleMap {
   /// These are always simple C language options.
   LangOptions MMapLangOpts;
 
+  // The module that we are building; related to \c LangOptions::CurrentModule.
+  Module *CompilingModule;
+
   /// \brief The top-level modules that are known.
   llvm::StringMap<Module *> Modules;
 

Modified: cfe/trunk/lib/Lex/HeaderSearch.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/HeaderSearch.cpp?rev=181489&r1=181488&r2=181489&view=diff
==============================================================================
--- cfe/trunk/lib/Lex/HeaderSearch.cpp (original)
+++ cfe/trunk/lib/Lex/HeaderSearch.cpp Wed May  8 18:46:46 2013
@@ -866,12 +866,14 @@ bool HeaderSearch::isFileMultipleInclude
       HFI.ControllingMacro || HFI.ControllingMacroID;
 }
 
-void HeaderSearch::MarkFileModuleHeader(const FileEntry *FE) {
+void HeaderSearch::MarkFileModuleHeader(const FileEntry *FE,
+                                        bool isCompilingModuleHeader) {
   if (FE->getUID() >= FileInfo.size())
     FileInfo.resize(FE->getUID()+1);
 
   HeaderFileInfo &HFI = FileInfo[FE->getUID()];
   HFI.isModuleHeader = true;
+  HFI.isCompilingModuleHeader = isCompilingModuleHeader;
 }
 
 void HeaderSearch::setHeaderFileInfoForUID(HeaderFileInfo HFI, unsigned UID) {

Modified: cfe/trunk/lib/Lex/ModuleMap.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/ModuleMap.cpp?rev=181489&r1=181488&r2=181489&view=diff
==============================================================================
--- cfe/trunk/lib/Lex/ModuleMap.cpp (original)
+++ cfe/trunk/lib/Lex/ModuleMap.cpp Wed May  8 18:46:46 2013
@@ -87,7 +87,7 @@ ModuleMap::ModuleMap(FileManager &FileMg
                      const LangOptions &LangOpts, const TargetInfo *Target,
                      HeaderSearch &HeaderInfo)
   : LangOpts(LangOpts), Target(Target), HeaderInfo(HeaderInfo),
-    BuiltinIncludeDir(0)
+    BuiltinIncludeDir(0), CompilingModule(0)
 {
   IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(new DiagnosticIDs);
   Diags = IntrusiveRefCntPtr<DiagnosticsEngine>(
@@ -388,8 +388,13 @@ ModuleMap::findOrCreateModule(StringRef
   // Create a new module with this name.
   Module *Result = new Module(Name, SourceLocation(), Parent, IsFramework, 
                               IsExplicit);
-  if (!Parent)
+  if (!Parent) {
     Modules[Name] = Result;
+    if (!LangOpts.CurrentModule.empty() && !CompilingModule &&
+        Name == LangOpts.CurrentModule) {
+      CompilingModule = Result;
+    }
+  }
   return std::make_pair(Result, true);
 }
 
@@ -605,7 +610,8 @@ void ModuleMap::addHeader(Module *Mod, c
     Mod->ExcludedHeaders.push_back(Header);
   } else {
     Mod->Headers.push_back(Header);
-    HeaderInfo.MarkFileModuleHeader(Header);
+    bool isCompilingModuleHeader = Mod->getTopLevelModule() == CompilingModule;
+    HeaderInfo.MarkFileModuleHeader(Header, isCompilingModuleHeader);
   }
   Headers[Header] = KnownHeader(Mod, Excluded);
 }

Modified: cfe/trunk/lib/Serialization/ASTWriter.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriter.cpp?rev=181489&r1=181488&r2=181489&view=diff
==============================================================================
--- cfe/trunk/lib/Serialization/ASTWriter.cpp (original)
+++ cfe/trunk/lib/Serialization/ASTWriter.cpp Wed May  8 18:46:46 2013
@@ -1542,6 +1542,8 @@ void ASTWriter::WriteHeaderSearch(const
     const HeaderFileInfo &HFI = HS.getFileInfo(File);
     if (HFI.External && Chain)
       continue;
+    if (HFI.isModuleHeader && !HFI.isCompilingModuleHeader)
+      continue;
 
     // Turn the file name into an absolute path, if it isn't already.
     const char *Filename = File->getName();

Added: cfe/trunk/test/Modules/self-import-header/af.framework/Headers/a1.h
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/self-import-header/af.framework/Headers/a1.h?rev=181489&view=auto
==============================================================================
--- cfe/trunk/test/Modules/self-import-header/af.framework/Headers/a1.h (added)
+++ cfe/trunk/test/Modules/self-import-header/af.framework/Headers/a1.h Wed May 
 8 18:46:46 2013
@@ -0,0 +1,4 @@
+@import DepBuiltin;
+
+@interface Foo
+@end

Added: cfe/trunk/test/Modules/self-import-header/af.framework/Headers/a2.h
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/self-import-header/af.framework/Headers/a2.h?rev=181489&view=auto
==============================================================================
--- cfe/trunk/test/Modules/self-import-header/af.framework/Headers/a2.h (added)
+++ cfe/trunk/test/Modules/self-import-header/af.framework/Headers/a2.h Wed May 
 8 18:46:46 2013
@@ -0,0 +1 @@
+#import "a1.h"

Added: cfe/trunk/test/Modules/self-import-header/af.framework/module.map
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/self-import-header/af.framework/module.map?rev=181489&view=auto
==============================================================================
--- cfe/trunk/test/Modules/self-import-header/af.framework/module.map (added)
+++ cfe/trunk/test/Modules/self-import-header/af.framework/module.map Wed May  
8 18:46:46 2013
@@ -0,0 +1,4 @@
+framework module af {
+  header "a1.h"
+  header "a2.h"
+}

Added: cfe/trunk/test/Modules/self-import-header/depend_builtin/h1.h
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/self-import-header/depend_builtin/h1.h?rev=181489&view=auto
==============================================================================
--- cfe/trunk/test/Modules/self-import-header/depend_builtin/h1.h (added)
+++ cfe/trunk/test/Modules/self-import-header/depend_builtin/h1.h Wed May  8 
18:46:46 2013
@@ -0,0 +1 @@
+#include <float.h>

Added: cfe/trunk/test/Modules/self-import-header/depend_builtin/module.map
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/self-import-header/depend_builtin/module.map?rev=181489&view=auto
==============================================================================
--- cfe/trunk/test/Modules/self-import-header/depend_builtin/module.map (added)
+++ cfe/trunk/test/Modules/self-import-header/depend_builtin/module.map Wed May 
 8 18:46:46 2013
@@ -0,0 +1,5 @@
+module DepBuiltin {
+header "h1.h"
+  export *
+}
+

Added: cfe/trunk/test/Modules/self-import-header/test.m
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/self-import-header/test.m?rev=181489&view=auto
==============================================================================
--- cfe/trunk/test/Modules/self-import-header/test.m (added)
+++ cfe/trunk/test/Modules/self-import-header/test.m Wed May  8 18:46:46 2013
@@ -0,0 +1,7 @@
+// rdar://13840148
+
+// RUN: rm -rf %t
+// RUN: %clang -fsyntax-only -isysroot %S/../Inputs/System/usr/include 
-fmodules -fmodules-cache-path=%t \
+// RUN:    -F %S -I %S %s -D__need_wint_t -Werror=implicit-function-declaration
+
+@import af;


_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to