]> granicus.if.org Git - clang/commitdiff
[modules] When building a module, make sure we don't serialize out HeaderFileInfo...
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Wed, 8 May 2013 23:46:46 +0000 (23:46 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Wed, 8 May 2013 23:46:46 +0000 (23:46 +0000)
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

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

include/clang/Lex/HeaderSearch.h
include/clang/Lex/ModuleMap.h
lib/Lex/HeaderSearch.cpp
lib/Lex/ModuleMap.cpp
lib/Serialization/ASTWriter.cpp
test/Modules/self-import-header/af.framework/Headers/a1.h [new file with mode: 0644]
test/Modules/self-import-header/af.framework/Headers/a2.h [new file with mode: 0644]
test/Modules/self-import-header/af.framework/module.map [new file with mode: 0644]
test/Modules/self-import-header/depend_builtin/h1.h [new file with mode: 0644]
test/Modules/self-import-header/depend_builtin/module.map [new file with mode: 0644]
test/Modules/self-import-header/test.m [new file with mode: 0644]

index 8a5a798560de047aaad549caf9d4acba8860c48c..5c748a538f6f87a7673ba8ab2ea121e80994ad0c 100644 (file)
@@ -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.
index dc75f1803cb7af047a223467ef82878c3c2008f2..9fe97d01110bead3d15ffa91bf2b45983c8aad7a 100644 (file)
@@ -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;
 
index 304bd6969a684e1b058ad60033a7163cbd626f28..5e56e3d1130911b4b383dffa22cb0109a3001237 100644 (file)
@@ -866,12 +866,14 @@ bool HeaderSearch::isFileMultipleIncludeGuarded(const FileEntry *File) {
       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) {
index 3e7a44c0e35d3ea0a708b41ab12ef497bd81f00f..de234853fbf3793f12a40f8aef2183eedccbfe10 100644 (file)
@@ -87,7 +87,7 @@ ModuleMap::ModuleMap(FileManager &FileMgr, DiagnosticConsumer &DC,
                      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 Name, Module *Parent, bool IsFramework,
   // 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, const FileEntry *Header,
     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);
 }
index b8ada04e5d8aac2f53316c89685e6b5d6900d3b6..a96ecd7b86c25547a43c8de8f23d51fb01ab01df 100644 (file)
@@ -1542,6 +1542,8 @@ void ASTWriter::WriteHeaderSearch(const HeaderSearch &HS, StringRef isysroot) {
     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();
diff --git a/test/Modules/self-import-header/af.framework/Headers/a1.h b/test/Modules/self-import-header/af.framework/Headers/a1.h
new file mode 100644 (file)
index 0000000..31ae279
--- /dev/null
@@ -0,0 +1,4 @@
+@import DepBuiltin;
+
+@interface Foo
+@end
diff --git a/test/Modules/self-import-header/af.framework/Headers/a2.h b/test/Modules/self-import-header/af.framework/Headers/a2.h
new file mode 100644 (file)
index 0000000..cc7e6e2
--- /dev/null
@@ -0,0 +1 @@
+#import "a1.h"
diff --git a/test/Modules/self-import-header/af.framework/module.map b/test/Modules/self-import-header/af.framework/module.map
new file mode 100644 (file)
index 0000000..8717683
--- /dev/null
@@ -0,0 +1,4 @@
+framework module af {
+  header "a1.h"
+  header "a2.h"
+}
diff --git a/test/Modules/self-import-header/depend_builtin/h1.h b/test/Modules/self-import-header/depend_builtin/h1.h
new file mode 100644 (file)
index 0000000..13298ef
--- /dev/null
@@ -0,0 +1 @@
+#include <float.h>
diff --git a/test/Modules/self-import-header/depend_builtin/module.map b/test/Modules/self-import-header/depend_builtin/module.map
new file mode 100644 (file)
index 0000000..a736ad8
--- /dev/null
@@ -0,0 +1,5 @@
+module DepBuiltin {
+header "h1.h"
+  export *
+}
+
diff --git a/test/Modules/self-import-header/test.m b/test/Modules/self-import-header/test.m
new file mode 100644 (file)
index 0000000..52cae7e
--- /dev/null
@@ -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;