From 2022dd833e0ccc214eead5d59a0f46046e4c2999 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Mon, 27 Oct 2025 10:48:02 +0100 Subject: [PATCH] Swift: Address review comments --- swift/extractor/mangler/SwiftMangler.cpp | 23 ++++++++++++----------- swift/extractor/mangler/SwiftMangler.h | 14 ++++++++++++-- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/swift/extractor/mangler/SwiftMangler.cpp b/swift/extractor/mangler/SwiftMangler.cpp index b44921853ba..8d7d2a8a065 100644 --- a/swift/extractor/mangler/SwiftMangler.cpp +++ b/swift/extractor/mangler/SwiftMangler.cpp @@ -40,7 +40,8 @@ std::string_view getTypeKindStr(const swift::TypeBase* type) { } // namespace -std::unordered_map SwiftMangler::preloadedExtensionIndexes; +std::unordered_map + SwiftMangler::preloadedExtensionIndexes; SwiftMangledName SwiftMangler::initMangled(const swift::TypeBase* type) { return {getTypeKindStr(type), '_'}; @@ -104,15 +105,15 @@ SwiftMangledName SwiftMangler::visitExtensionDecl(const swift::ExtensionDecl* de auto parent = getParent(decl); auto target = decl->getExtendedType(); - return initMangled(decl) << fetch(target) << getExtensionIndex(decl, parent); + auto index = getExtensionIndex(decl, parent); + return initMangled(decl) << fetch(target) << index.index + << (index.kind == ExtensionKind::clang ? "_clang" : ""); } -unsigned SwiftMangler::getExtensionIndex(const swift::ExtensionDecl* decl, - const swift::Decl* parent) { +SwiftMangler::ExtensionIndex SwiftMangler::getExtensionIndex(const swift::ExtensionDecl* decl, + const swift::Decl* parent) { // to avoid iterating multiple times on the parent of multiple extensions, we preload extension // indexes once for each encountered parent into the `preloadedExtensionIndexes` mapping. - // Because we mangle declarations only once in a given trap/dispatcher context, we can safely - // discard preloaded indexes on use if (auto found = SwiftMangler::preloadedExtensionIndexes.find(decl); found != SwiftMangler::preloadedExtensionIndexes.end()) { return found->second; @@ -141,8 +142,8 @@ void SwiftMangler::indexExtensions(llvm::ArrayRef siblings) { auto index = 0u; for (auto sibling : siblings) { if (sibling->getKind() == swift::DeclKind::Extension) { - SwiftMangler::preloadedExtensionIndexes.emplace(sibling, index); - index += 2; + SwiftMangler::preloadedExtensionIndexes.try_emplace(sibling, ExtensionKind::swift, index); + index++; } } } @@ -153,15 +154,15 @@ void SwiftMangler::indexClangExtensions(const clang::Module* clangModule, return; } - auto index = 1u; + auto index = 0u; for (const auto& submodule : clangModule->submodules()) { if (auto* swiftSubmodule = moduleLoader->getWrapperForModule(submodule)) { llvm::SmallVector children; swiftSubmodule->getTopLevelDecls(children); for (const auto child : children) { if (child->getKind() == swift::DeclKind::Extension) { - SwiftMangler::preloadedExtensionIndexes.emplace(child, index); - index += 2; + SwiftMangler::preloadedExtensionIndexes.try_emplace(child, ExtensionKind::clang, index); + index++; } } } diff --git a/swift/extractor/mangler/SwiftMangler.h b/swift/extractor/mangler/SwiftMangler.h index da93f3473f6..caf70718633 100644 --- a/swift/extractor/mangler/SwiftMangler.h +++ b/swift/extractor/mangler/SwiftMangler.h @@ -106,7 +106,17 @@ class SwiftMangler : private swift::TypeVisitor, SwiftMangledName visitPackExpansionType(const swift::PackExpansionType* type); private: - static std::unordered_map preloadedExtensionIndexes; + enum class ExtensionKind : bool { + swift, + clang, + }; + + struct ExtensionIndex { + const ExtensionKind kind : 1; + const uint32_t index : 31; + }; + + static std::unordered_map preloadedExtensionIndexes; virtual SwiftMangledName fetch(const swift::Decl* decl) = 0; virtual SwiftMangledName fetch(const swift::TypeBase* type) = 0; @@ -115,7 +125,7 @@ class SwiftMangler : private swift::TypeVisitor, void indexExtensions(llvm::ArrayRef siblings); void indexClangExtensions(const clang::Module* clangModule, swift::ClangModuleLoader* moduleLoader); - unsigned int getExtensionIndex(const swift::ExtensionDecl* decl, const swift::Decl* parent); + ExtensionIndex getExtensionIndex(const swift::ExtensionDecl* decl, const swift::Decl* parent); static SwiftMangledName initMangled(const swift::TypeBase* type); SwiftMangledName initMangled(const swift::Decl* decl); SwiftMangledName visitTypeDiscriminatedValueDecl(const swift::ValueDecl* decl);