diff --git a/include/swift/Remote/MetadataReader.h b/include/swift/Remote/MetadataReader.h index 59b9ba031c295..b5b99b8befe59 100644 --- a/include/swift/Remote/MetadataReader.h +++ b/include/swift/Remote/MetadataReader.h @@ -2659,6 +2659,26 @@ class MetadataReader { return resultAddress; } + Demangle::NodePointer + buildContextDescriptorManglingForSymbol(llvm::StringRef symbol, + Demangler &dem) { + if (auto demangledSymbol = buildContextManglingForSymbol(symbol, dem)) { + // Look through Type nodes since we're building up a mangling here. + if (demangledSymbol->getKind() == Demangle::Node::Kind::Type) { + demangledSymbol = demangledSymbol->getChild(0); + } + return demangledSymbol; + } + + return nullptr; + } + + Demangle::NodePointer + buildContextDescriptorManglingForSymbol(const std::string &symbol, + Demangler &dem) { + return buildContextDescriptorManglingForSymbol(dem.copyString(symbol), dem); + } + Demangle::NodePointer buildContextDescriptorMangling(const ParentContextDescriptorRef &descriptor, Demangler &dem, int recursion_limit) { @@ -2672,15 +2692,7 @@ class MetadataReader { // Try to demangle the symbol name to figure out what context it would // point to. - auto demangledSymbol = buildContextManglingForSymbol(descriptor.getSymbol(), - dem); - if (!demangledSymbol) - return nullptr; - // Look through Type notes since we're building up a mangling here. - if (demangledSymbol->getKind() == Demangle::Node::Kind::Type){ - demangledSymbol = demangledSymbol->getChild(0); - } - return demangledSymbol; + return buildContextDescriptorManglingForSymbol(descriptor.getSymbol(), dem); } Demangle::NodePointer @@ -2690,6 +2702,18 @@ class MetadataReader { return nullptr; } + // Check if the Reader can provide a symbol for this descriptor, and if it + // can, use that instead. + if (auto remoteAbsolutePointer = + Reader->resolvePointerAsSymbol(descriptor.getRemoteAddress())) { + auto symbol = remoteAbsolutePointer->getSymbol(); + if (!symbol.empty()) { + if (auto demangledSymbol = buildContextDescriptorManglingForSymbol(symbol, dem)) { + return demangledSymbol; + } + } + } + // Read the parent descriptor. auto parentDescriptorResult = readParentContextDescriptor(descriptor);