Skip to content

Commit 7ac9b16

Browse files
committed
[Bridging PCH] Populate bridging lookup table when reading MK_PCH module.
1 parent 56c4acf commit 7ac9b16

File tree

3 files changed

+25
-14
lines changed

3 files changed

+25
-14
lines changed

lib/ClangImporter/ClangImporter.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -662,7 +662,8 @@ ClangImporter::create(ASTContext &ctx,
662662

663663
// Install a Clang module file extension to build Swift name lookup tables.
664664
invocation->getFrontendOpts().ModuleFileExtensions.push_back(
665-
new SwiftNameLookupExtension(importer->Impl.LookupTables,
665+
new SwiftNameLookupExtension(importer->Impl.BridgingHeaderLookupTable,
666+
importer->Impl.LookupTables,
666667
importer->Impl.SwiftContext,
667668
importer->Impl.platformAvailability,
668669
importer->Impl.InferImportAsMember));

lib/ClangImporter/ImporterImpl.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1165,16 +1165,18 @@ namespace importer {
11651165
bool shouldSuppressDeclImport(const clang::Decl *decl);
11661166

11671167
class SwiftNameLookupExtension : public clang::ModuleFileExtension {
1168+
std::unique_ptr<SwiftLookupTable> &pchLookupTable;
11681169
LookupTableMap &lookupTables;
11691170
ASTContext &swiftCtx;
11701171
const PlatformAvailability &availability;
11711172
const bool inferImportAsMember;
11721173

11731174
public:
1174-
SwiftNameLookupExtension(LookupTableMap &tables, ASTContext &ctx,
1175+
SwiftNameLookupExtension(std::unique_ptr<SwiftLookupTable> &pchLookupTable,
1176+
LookupTableMap &tables, ASTContext &ctx,
11751177
const PlatformAvailability &avail, bool inferIAM)
1176-
: lookupTables(tables), swiftCtx(ctx), availability(avail),
1177-
inferImportAsMember(inferIAM) {}
1178+
: pchLookupTable(pchLookupTable), lookupTables(tables), swiftCtx(ctx),
1179+
availability(avail), inferImportAsMember(inferIAM) {}
11781180

11791181
clang::ModuleFileExtensionMetadata getExtensionMetadata() const override;
11801182
llvm::hash_code hashExtension(llvm::hash_code code) const override;

lib/ClangImporter/SwiftLookupTable.cpp

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1688,23 +1688,31 @@ SwiftNameLookupExtension::createExtensionReader(
16881688
assert(metadata.MajorVersion == SWIFT_LOOKUP_TABLE_VERSION_MAJOR);
16891689
assert(metadata.MinorVersion == SWIFT_LOOKUP_TABLE_VERSION_MINOR);
16901690

1691-
// Check whether we already have an entry in the set of lookup tables.
1692-
auto &entry = lookupTables[mod.ModuleName];
1693-
if (entry) return nullptr;
1694-
1695-
// Local function used to remove this entry when the reader goes away.
1696-
std::string moduleName = mod.ModuleName;
1697-
auto onRemove = [this, moduleName]() {
1698-
lookupTables.erase(moduleName);
1699-
};
1691+
std::function<void()> onRemove = [](){};
1692+
std::unique_ptr<SwiftLookupTable> *target = nullptr;
1693+
1694+
if (mod.Kind == clang::serialization::MK_PCH) {
1695+
// PCH imports unconditionally overwrite the provided pchLookupTable.
1696+
target = &pchLookupTable;
1697+
} else {
1698+
// Check whether we already have an entry in the set of lookup tables.
1699+
target = &lookupTables[mod.ModuleName];
1700+
if (*target) return nullptr;
1701+
1702+
// Local function used to remove this entry when the reader goes away.
1703+
std::string moduleName = mod.ModuleName;
1704+
onRemove = [this, moduleName]() {
1705+
lookupTables.erase(moduleName);
1706+
};
1707+
}
17001708

17011709
// Create the reader.
17021710
auto tableReader = SwiftLookupTableReader::create(this, reader, mod, onRemove,
17031711
stream);
17041712
if (!tableReader) return nullptr;
17051713

17061714
// Create the lookup table.
1707-
entry.reset(new SwiftLookupTable(tableReader.get()));
1715+
target->reset(new SwiftLookupTable(tableReader.get()));
17081716

17091717
// Return the new reader.
17101718
return std::move(tableReader);

0 commit comments

Comments
 (0)