r181489 - [modules] When building a module, make sure we don't serialize out HeaderFileInfo for headers not belonging to the module.

Argyrios Kyrtzidis akyrtzi at gmail.com
Wed May 8 16:46:46 PDT 2013


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 @@
+ at import DepBuiltin;
+
+ at interface Foo
+ at 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
+
+ at import af;





More information about the cfe-commits mailing list