Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 33 additions & 9 deletions include/swift/Remote/MetadataReader.h
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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
Expand All @@ -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);

Expand Down