r204417 - PR19215: When writing/reading a PCH that imported a module, store the location

Richard Smith richard-llvm at metafoo.co.uk
Thu Mar 20 17:33:59 PDT 2014


Author: rsmith
Date: Thu Mar 20 19:33:59 2014
New Revision: 204417

URL: http://llvm.org/viewvc/llvm-project?rev=204417&view=rev
Log:
PR19215: When writing/reading a PCH that imported a module, store the location
at which that PCH imported each visible submodule of the module. Such locations
are needed when synthesizing macro directives resulting from the import.

Added:
    cfe/trunk/test/Modules/Inputs/macro-undef-through-pch/
    cfe/trunk/test/Modules/Inputs/macro-undef-through-pch/A.h
    cfe/trunk/test/Modules/Inputs/macro-undef-through-pch/foo.h
    cfe/trunk/test/Modules/Inputs/macro-undef-through-pch/module.map
    cfe/trunk/test/Modules/macro-undef-through-pch.m
Modified:
    cfe/trunk/include/clang/Serialization/ASTReader.h
    cfe/trunk/lib/Serialization/ASTReader.cpp
    cfe/trunk/lib/Serialization/ASTWriter.cpp

Modified: cfe/trunk/include/clang/Serialization/ASTReader.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTReader.h?rev=204417&r1=204416&r2=204417&view=diff
==============================================================================
--- cfe/trunk/include/clang/Serialization/ASTReader.h (original)
+++ cfe/trunk/include/clang/Serialization/ASTReader.h Thu Mar 20 19:33:59 2014
@@ -767,9 +767,14 @@ private:
   // \brief A list of late parsed template function data.
   SmallVector<uint64_t, 1> LateParsedTemplates;
 
+  struct ImportedSubmodule {
+    serialization::SubmoduleID ID;
+    SourceLocation ImportLoc;
+  };
+
   /// \brief A list of modules that were imported by precompiled headers or
   /// any other non-module AST file.
-  SmallVector<serialization::SubmoduleID, 2> ImportedModules;
+  SmallVector<ImportedSubmodule, 2> ImportedModules;
   //@}
 
   /// \brief The directory that the PCH we are reading is stored in.

Modified: cfe/trunk/lib/Serialization/ASTReader.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReader.cpp?rev=204417&r1=204416&r2=204417&view=diff
==============================================================================
--- cfe/trunk/lib/Serialization/ASTReader.cpp (original)
+++ cfe/trunk/lib/Serialization/ASTReader.cpp Thu Mar 20 19:33:59 2014
@@ -1811,6 +1811,7 @@ void ASTReader::installImportedMacro(Ide
     // Use the location at which the containing module file was first imported
     // for now.
     ImportLoc = MMI->F->DirectImportLoc;
+    assert(ImportLoc.isValid() && "no import location for a visible macro?");
   }
 
   llvm::SmallVectorImpl<DefMacroDirective*> *Prev =
@@ -3012,9 +3013,11 @@ bool ASTReader::ReadASTBlock(ModuleFile
         // If we aren't loading a module (which has its own exports), make
         // all of the imported modules visible.
         // FIXME: Deal with macros-only imports.
-        for (unsigned I = 0, N = Record.size(); I != N; ++I) {
-          if (unsigned GlobalID = getGlobalSubmoduleID(F, Record[I]))
-            ImportedModules.push_back(GlobalID);
+        for (unsigned I = 0, N = Record.size(); I != N; /**/) {
+          unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]);
+          SourceLocation Loc = ReadSourceLocation(F, Record, I);
+          if (GlobalID)
+            ImportedModules.push_back({GlobalID, Loc});
         }
       }
       break;
@@ -3669,12 +3672,14 @@ void ASTReader::InitializeContext() {
     Context.setcudaConfigureCallDecl(
                            cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0])));
   }
-  
+
   // Re-export any modules that were imported by a non-module AST file.
-  for (unsigned I = 0, N = ImportedModules.size(); I != N; ++I) {
-    if (Module *Imported = getSubmodule(ImportedModules[I]))
+  // FIXME: This does not make macro-only imports visible again. It also doesn't
+  // make #includes mapped to module imports visible.
+  for (auto &Import : ImportedModules) {
+    if (Module *Imported = getSubmodule(Import.ID))
       makeModuleVisible(Imported, Module::AllVisible,
-                        /*ImportLoc=*/SourceLocation(),
+                        /*ImportLoc=*/Import.ImportLoc,
                         /*Complain=*/false);
   }
   ImportedModules.clear();

Modified: cfe/trunk/lib/Serialization/ASTWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriter.cpp?rev=204417&r1=204416&r2=204417&view=diff
==============================================================================
--- cfe/trunk/lib/Serialization/ASTWriter.cpp (original)
+++ cfe/trunk/lib/Serialization/ASTWriter.cpp Thu Mar 20 19:33:59 2014
@@ -4281,20 +4281,33 @@ void ASTWriter::WriteASTCore(Sema &SemaR
 
   if (!WritingModule) {
     // Write the submodules that were imported, if any.
-    RecordData ImportedModules;
+    struct ModuleInfo { uint64_t ID; Module *M; };
+    llvm::SmallVector<ModuleInfo, 64> Imports;
     for (const auto *I : Context.local_imports()) {
       assert(SubmoduleIDs.find(I->getImportedModule()) != SubmoduleIDs.end());
-      ImportedModules.push_back(SubmoduleIDs[I->getImportedModule()]);
+      Imports.push_back({SubmoduleIDs[I->getImportedModule()],
+                         I->getImportedModule()});
     }
-    if (!ImportedModules.empty()) {
-      // Sort module IDs.
-      llvm::array_pod_sort(ImportedModules.begin(), ImportedModules.end());
-      
-      // Unique module IDs.
-      ImportedModules.erase(std::unique(ImportedModules.begin(), 
-                                        ImportedModules.end()),
-                            ImportedModules.end());
-      
+
+    if (!Imports.empty()) {
+      auto Cmp = [](const ModuleInfo &A, const ModuleInfo &B) {
+        return A.ID < B.ID;
+      };
+
+      // Sort and deduplicate module IDs.
+      std::sort(Imports.begin(), Imports.end(), Cmp);
+      Imports.erase(std::unique(Imports.begin(), Imports.end(), Cmp),
+                    Imports.end());
+
+      RecordData ImportedModules;
+      for (const auto &Import : Imports) {
+        ImportedModules.push_back(Import.ID);
+        // FIXME: If the module has macros imported then later has declarations
+        // imported, this location won't be the right one as a location for the
+        // declaration imports.
+        AddSourceLocation(Import.M->MacroVisibilityLoc, ImportedModules);
+      }
+
       Stream.EmitRecord(IMPORTED_MODULES, ImportedModules);
     }
   }

Added: cfe/trunk/test/Modules/Inputs/macro-undef-through-pch/A.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/macro-undef-through-pch/A.h?rev=204417&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/macro-undef-through-pch/A.h (added)
+++ cfe/trunk/test/Modules/Inputs/macro-undef-through-pch/A.h Thu Mar 20 19:33:59 2014
@@ -0,0 +1,2 @@
+#define AB
+#undef AB

Added: cfe/trunk/test/Modules/Inputs/macro-undef-through-pch/foo.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/macro-undef-through-pch/foo.h?rev=204417&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/macro-undef-through-pch/foo.h (added)
+++ cfe/trunk/test/Modules/Inputs/macro-undef-through-pch/foo.h Thu Mar 20 19:33:59 2014
@@ -0,0 +1 @@
+ at import A;

Added: cfe/trunk/test/Modules/Inputs/macro-undef-through-pch/module.map
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/macro-undef-through-pch/module.map?rev=204417&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/macro-undef-through-pch/module.map (added)
+++ cfe/trunk/test/Modules/Inputs/macro-undef-through-pch/module.map Thu Mar 20 19:33:59 2014
@@ -0,0 +1,3 @@
+module A {
+  header "A.h"
+}

Added: cfe/trunk/test/Modules/macro-undef-through-pch.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/macro-undef-through-pch.m?rev=204417&view=auto
==============================================================================
--- cfe/trunk/test/Modules/macro-undef-through-pch.m (added)
+++ cfe/trunk/test/Modules/macro-undef-through-pch.m Thu Mar 20 19:33:59 2014
@@ -0,0 +1,8 @@
+// RUN: rm -rf %t
+// RUN: %clang_cc1 -x objective-c-header -fmodules -fmodules-cache-path=%t \
+// RUN:            -I%S/Inputs/macro-undef-through-pch -emit-pch \
+// RUN:            %S/Inputs/macro-undef-through-pch/foo.h -o %t.pch
+// RUN: %clang_cc1 -x objective-c -fmodules -fmodules-cache-path=%t -include-pch %t.pch %s
+
+// PR19215
+#undef AB





More information about the cfe-commits mailing list