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