Skip to content

Commit 2cb73cd

Browse files
committed
[lldb] Thread mangling flavor together with node pointer
LLDB performs many analysis as transformations by converting a mangled name into a demangle tree and later on back to a mangled name. Unfortunately there's no cheap way for a demangle tree to carry its mangled name's mangling flavor. This patch threads the mangling flavor along with the demangle tree so when converting a demangle tree back to a mangled name we reconstruct it with the same mangling flavor as the original type.
1 parent 16092ea commit 2cb73cd

13 files changed

+323
-137
lines changed

lldb/source/Plugins/ExpressionParser/Swift/SwiftExpressionParser.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
#include "SwiftExpressionParser.h"
1414

15+
#include "Plugins/TypeSystem/Swift/SwiftASTContext.h"
1516
#include "SwiftASTManipulator.h"
1617
#include "SwiftDiagnostic.h"
1718
#include "SwiftExpressionSourceCode.h"
@@ -1181,8 +1182,9 @@ AddArchetypeTypeAliases(std::unique_ptr<SwiftASTManipulator> &code_manipulator,
11811182
llvm::StringRef &type_name = pair.getFirst();
11821183
MetadataPointerInfo &info = pair.getSecond();
11831184

1184-
auto dependent_type =
1185-
typeref_typesystem->CreateGenericTypeParamType(info.depth, info.index);
1185+
auto flavor = SwiftLanguageRuntime::GetManglingFlavor(type_name);
1186+
auto dependent_type = typeref_typesystem->CreateGenericTypeParamType(
1187+
info.depth, info.index, flavor);
11861188
auto bound_type =
11871189
runtime->BindGenericTypeParameters(stack_frame, dependent_type);
11881190
if (!bound_type) {

lldb/source/Plugins/ExpressionParser/Swift/SwiftExpressionSourceCode.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
//===----------------------------------------------------------------------===//
88

99
#include "SwiftExpressionSourceCode.h"
10+
#include "Plugins/LanguageRuntime/Swift/SwiftLanguageRuntime.h"
1011
#include "SwiftPersistentExpressionState.h"
1112

1213
#include "Plugins/ExpressionParser/Swift/SwiftASTManipulator.h"
@@ -60,10 +61,14 @@ static llvm::Expected<std::string> TransformPackType(
6061
if (!ts)
6162
return llvm::createStringError(llvm::errc::not_supported,
6263
"no typeref typesystem");
64+
65+
auto mangled_name = type.GetMangledTypeName().GetStringRef();
66+
auto flavor = SwiftLanguageRuntime::GetManglingFlavor(mangled_name);
67+
6368
using namespace swift::Demangle;
6469
Demangler dem;
65-
NodePointer node = ts->GetCanonicalDemangleTree(
66-
dem, type.GetMangledTypeName().GetStringRef());
70+
71+
NodePointer node = ts->GetCanonicalDemangleTree(dem, mangled_name);
6772

6873
node = TypeSystemSwiftTypeRef::Transform(dem, node, [](NodePointer n) {
6974
if (n->getKind() == Node::Kind::SILPackIndirect &&
@@ -76,7 +81,8 @@ static llvm::Expected<std::string> TransformPackType(
7681
});
7782

7883
bool error = false;
79-
ConstString type_name = ts->RemangleAsType(dem, node).GetMangledTypeName();
84+
ConstString type_name =
85+
ts->RemangleAsType(dem, node, flavor).GetMangledTypeName();
8086
swift::Demangle::DemangleOptions options;
8187
options = swift::Demangle::DemangleOptions::SimplifiedUIDemangleOptions();
8288
options.DisplayStdlibModule = false;

lldb/source/Plugins/LanguageRuntime/Swift/SwiftLanguageRuntime.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "lldb/Core/PluginInterface.h"
2121
#include "lldb/Target/LanguageRuntime.h"
2222
#include "lldb/lldb-private.h"
23+
#include "swift/Demangling/ManglingFlavor.h"
2324

2425
#include <optional>
2526
#include "llvm/ADT/StringSet.h"
@@ -132,6 +133,12 @@ class SwiftLanguageRuntime : public LanguageRuntime {
132133
/// since some day we may want to support more than one swift variant.
133134
static bool IsSwiftMangledName(llvm::StringRef name);
134135

136+
static swift::Mangle::ManglingFlavor
137+
GetManglingFlavor(llvm::StringRef mangledName) {
138+
if (mangledName.starts_with("$e") || mangledName.starts_with("_$e"))
139+
return swift::Mangle::ManglingFlavor::Embedded;
140+
return swift::Mangle::ManglingFlavor::Default;
141+
}
135142
enum class FuncletComparisonResult {
136143
NotBothFunclets,
137144
DifferentAsyncFunctions,
@@ -271,6 +278,7 @@ class SwiftLanguageRuntime : public LanguageRuntime {
271278
/// context.
272279
static void GetGenericParameterNamesForFunction(
273280
const SymbolContext &sc, const ExecutionContext *exe_ctx,
281+
swift::Mangle::ManglingFlavor flavor,
274282
llvm::DenseMap<ArchetypePath, llvm::StringRef> &dict);
275283

276284
/// Invoke callback for each DependentGenericParamType.

lldb/source/Plugins/LanguageRuntime/Swift/SwiftLanguageRuntimeDynamicTypeResolution.cpp

Lines changed: 54 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
#include "swift/AST/ASTMangler.h"
3737
#include "swift/AST/ASTWalker.h"
3838
#include "swift/Demangling/Demangle.h"
39+
#include "swift/Demangling/ManglingFlavor.h"
3940
#include "swift/RemoteInspection/ReflectionContext.h"
4041
#include "swift/RemoteInspection/TypeRefBuilder.h"
4142
#include "swift/Strings.h"
@@ -318,8 +319,11 @@ class LLDBTypeInfoProvider : public swift::remote::TypeInfoProvider {
318319
auto *node = dem.demangleSymbol(wrapped);
319320
if (!node) {
320321
// Try `mangledName` as plain ObjC class name. Ex: NSObject, NSView, etc.
322+
// Since this looking up an ObjC type, the default mangling falvor should
323+
// be used.
321324
auto maybeMangled = swift_demangle::mangleClass(
322-
dem, swift::MANGLING_MODULE_OBJC, mangledName);
325+
dem, swift::MANGLING_MODULE_OBJC, mangledName,
326+
swift::Mangle::ManglingFlavor::Default);
323327
if (!maybeMangled.isSuccess()) {
324328
LLDB_LOG(GetLog(LLDBLog::Types),
325329
"[LLDBTypeInfoProvider] invalid mangled name: {0}",
@@ -641,7 +645,9 @@ CompilerType GetWeakReferent(TypeSystemSwiftTypeRef &ts, CompilerType type) {
641645
if (!n || n->getKind() != Node::Kind::SugaredOptional || !n->hasChildren())
642646
return {};
643647
n = n->getFirstChild();
644-
return ts.RemangleAsType(dem, n);
648+
return ts.RemangleAsType(
649+
dem, n,
650+
SwiftLanguageRuntime::GetManglingFlavor(type.GetMangledTypeName()));
645651
}
646652

647653
CompilerType GetTypeFromTypeRef(TypeSystemSwiftTypeRef &ts,
@@ -650,7 +656,8 @@ CompilerType GetTypeFromTypeRef(TypeSystemSwiftTypeRef &ts,
650656
return {};
651657
swift::Demangle::Demangler dem;
652658
swift::Demangle::NodePointer node = type_ref->getDemangling(dem);
653-
return ts.RemangleAsType(dem, node);
659+
// TODO: the mangling flavor should come from the TypeRef.
660+
return ts.RemangleAsType(dem, node, ts.GetManglingFlavor());
654661
}
655662

656663
struct ExistentialSyntheticChild {
@@ -1567,8 +1574,9 @@ bool SwiftLanguageRuntimeImpl::GetDynamicTypeAndAddress_Pack(
15671574

15681575
swift::Demangle::Demangler dem;
15691576

1570-
auto expand_pack_type = [&](ConstString mangled_pack_type,
1571-
bool indirect) -> swift::Demangle::NodePointer {
1577+
auto expand_pack_type = [&](ConstString mangled_pack_type, bool indirect,
1578+
swift::Mangle::ManglingFlavor flavor)
1579+
-> swift::Demangle::NodePointer {
15721580
// Find pack_type in the pack_expansions.
15731581
unsigned i = 0;
15741582
SwiftLanguageRuntime::GenericSignature::PackExpansion *pack_expansion =
@@ -1698,7 +1706,7 @@ bool SwiftLanguageRuntimeImpl::GetDynamicTypeAndAddress_Pack(
16981706
auto bound_typeref = reflection_ctx->ApplySubstitutions(
16991707
type_ref, substitutions, ts->GetDescriptorFinder());
17001708
swift::Demangle::NodePointer node = bound_typeref->getDemangling(dem);
1701-
CompilerType type = ts->RemangleAsType(dem, node);
1709+
CompilerType type = ts->RemangleAsType(dem, node, flavor);
17021710

17031711
// Add the substituted type to the tuple.
17041712
elements.push_back({{}, type});
@@ -1724,6 +1732,9 @@ bool SwiftLanguageRuntimeImpl::GetDynamicTypeAndAddress_Pack(
17241732
auto node = dem_ctx.demangleSymbolAsNode(
17251733
pack_type.GetMangledTypeName().GetStringRef());
17261734

1735+
auto flavor =
1736+
SwiftLanguageRuntime::GetManglingFlavor(pack_type.GetMangledTypeName());
1737+
17271738
// Expand all the pack types that appear in the incoming type,
17281739
// either at the root level or as arguments of bound generic types.
17291740
bool indirect = false;
@@ -1739,18 +1750,18 @@ bool SwiftLanguageRuntimeImpl::GetDynamicTypeAndAddress_Pack(
17391750
if (node->getNumChildren() != 1)
17401751
return node;
17411752
node = node->getChild(0);
1742-
CompilerType pack_type = ts->RemangleAsType(dem, node);
1753+
CompilerType pack_type = ts->RemangleAsType(dem, node, flavor);
17431754
ConstString mangled_pack_type = pack_type.GetMangledTypeName();
17441755
LLDB_LOG(log, "decoded pack_expansion type: {0}", mangled_pack_type);
1745-
auto result = expand_pack_type(mangled_pack_type, indirect);
1756+
auto result = expand_pack_type(mangled_pack_type, indirect, flavor);
17461757
if (!result) {
17471758
LLDB_LOG(log, "failed to expand pack type: {0}", mangled_pack_type);
17481759
return node;
17491760
}
17501761
return result;
17511762
});
17521763

1753-
CompilerType expanded_type = ts->RemangleAsType(dem, transformed);
1764+
CompilerType expanded_type = ts->RemangleAsType(dem, transformed, flavor);
17541765
pack_type_or_name.SetCompilerType(expanded_type);
17551766

17561767
AddressType address_type;
@@ -1824,7 +1835,8 @@ bool SwiftLanguageRuntimeImpl::GetDynamicTypeAndAddress_Class(
18241835
// useful to users.
18251836
if (IsPrivateNSClass(node))
18261837
return false;
1827-
class_type_or_name.SetCompilerType(ts->RemangleAsType(dem, node));
1838+
class_type_or_name.SetCompilerType(ts->RemangleAsType(
1839+
dem, node, swift::Mangle::ManglingFlavor::Default));
18281840
found = true;
18291841
return true;
18301842
}
@@ -1854,9 +1866,13 @@ bool SwiftLanguageRuntimeImpl::GetDynamicTypeAndAddress_Class(
18541866
class_type.GetMangledTypeName(), instance_ptr);
18551867
return false;
18561868
}
1869+
1870+
auto flavor =
1871+
SwiftLanguageRuntime::GetManglingFlavor(class_type.GetMangledTypeName());
1872+
18571873
swift::Demangle::Demangler dem;
18581874
swift::Demangle::NodePointer node = typeref->getDemangling(dem);
1859-
CompilerType dynamic_type = ts->RemangleAsType(dem, node);
1875+
CompilerType dynamic_type = ts->RemangleAsType(dem, node, flavor);
18601876
LLDB_LOG(log, "dynamic type of instance_ptr {0:x} is {1}", instance_ptr,
18611877
class_type.GetMangledTypeName());
18621878
class_type_or_name.SetCompilerType(dynamic_type);
@@ -2022,7 +2038,10 @@ bool SwiftLanguageRuntimeImpl::GetDynamicTypeAndAddress_Existential(
20222038
return false;
20232039
swift::Demangle::Demangler dem;
20242040
swift::Demangle::NodePointer node = typeref->getDemangling(dem);
2025-
class_type_or_name.SetCompilerType(ts->RemangleAsType(dem, node));
2041+
auto flavor = SwiftLanguageRuntime::GetManglingFlavor(
2042+
existential_type.GetMangledTypeName());
2043+
2044+
class_type_or_name.SetCompilerType(ts->RemangleAsType(dem, node, flavor));
20262045
address.SetRawAddress(out_address.getAddressData());
20272046

20282047
#ifndef NDEBUG
@@ -2087,7 +2106,10 @@ bool SwiftLanguageRuntimeImpl::GetDynamicTypeAndAddress_ExistentialMetatype(
20872106
meta->addChild(node, dem);
20882107
wrapped->addChild(meta,dem);
20892108

2090-
meta_type = tr_ts->RemangleAsType(dem, wrapped);
2109+
auto flavor =
2110+
SwiftLanguageRuntime::GetManglingFlavor(meta_type.GetMangledTypeName());
2111+
meta_type =
2112+
tss->GetTypeSystemSwiftTypeRef()->RemangleAsType(dem, wrapped, flavor);
20912113
class_type_or_name.SetCompilerType(meta_type);
20922114
address.SetRawAddress(ptr);
20932115
return true;
@@ -2113,7 +2135,9 @@ CompilerType SwiftLanguageRuntimeImpl::GetTypeFromMetadata(TypeSystemSwift &ts,
21132135
using namespace swift::Demangle;
21142136
Demangler dem;
21152137
NodePointer node = type_ref->getDemangling(dem);
2116-
return tr_ts->RemangleAsType(dem, node);
2138+
// TODO: the mangling flavor should come from the TypeRef.
2139+
return ts.GetTypeSystemSwiftTypeRef()->RemangleAsType(
2140+
dem, node, ts.GetTypeSystemSwiftTypeRef()->GetManglingFlavor());
21172141
}
21182142

21192143
std::optional<lldb::addr_t>
@@ -2236,7 +2260,10 @@ CompilerType SwiftLanguageRuntimeImpl::BindGenericTypeParameters(
22362260
type_ref, substitutions,
22372261
tr_ts->GetDescriptorFinder());
22382262
NodePointer node = bound_type_ref->getDemangling(dem);
2239-
return tr_ts->RemangleAsType(dem, node);
2263+
return ts->GetTypeSystemSwiftTypeRef()->RemangleAsType(
2264+
dem, node,
2265+
SwiftLanguageRuntime::GetManglingFlavor(
2266+
unbound_type.GetMangledTypeName()));
22402267
}
22412268

22422269
CompilerType
@@ -2278,10 +2305,12 @@ SwiftLanguageRuntimeImpl::BindGenericTypeParameters(StackFrame &stack_frame,
22782305
return;
22792306
substitutions.insert({{depth, index}, type_ref});
22802307
});
2308+
auto flavor =
2309+
SwiftLanguageRuntime::GetManglingFlavor(mangled_name.GetStringRef());
22812310

22822311
// Nothing to do if there are no type parameters.
22832312
auto get_canonical = [&]() {
2284-
auto mangling = mangleNode(canonical);
2313+
auto mangling = mangleNode(canonical, flavor);
22852314
if (!mangling.isSuccess())
22862315
return CompilerType();
22872316
return ts.GetTypeFromMangledTypename(ConstString(mangling.result()));
@@ -2315,7 +2344,7 @@ SwiftLanguageRuntimeImpl::BindGenericTypeParameters(StackFrame &stack_frame,
23152344
"No scratch context available.");
23162345
return ts.GetTypeFromMangledTypename(mangled_name);
23172346
}
2318-
CompilerType bound_type = scratch_ctx->RemangleAsType(dem, node);
2347+
CompilerType bound_type = scratch_ctx->RemangleAsType(dem, node, flavor);
23192348
LLDB_LOG(GetLog(LLDBLog::Expressions | LLDBLog::Types), "Bound {0} -> {1}.",
23202349
mangled_name, bound_type.GetMangledTypeName());
23212350
return bound_type;
@@ -2640,6 +2669,13 @@ bool SwiftLanguageRuntimeImpl::GetDynamicTypeAndAddress_ClangType(
26402669

26412670
std::string remangled;
26422671
{
2672+
auto type = in_value.GetCompilerType();
2673+
std::optional<swift::Mangle::ManglingFlavor> mangling_flavor =
2674+
SwiftLanguageRuntime::GetManglingFlavor(
2675+
type.GetMangledTypeName().GetStringRef());
2676+
if (!mangling_flavor)
2677+
return false;
2678+
26432679
// Create a mangle tree for Swift.Optional<$module.$class>
26442680
using namespace swift::Demangle;
26452681
NodeFactory factory;
@@ -2668,7 +2704,7 @@ bool SwiftLanguageRuntimeImpl::GetDynamicTypeAndAddress_ClangType(
26682704
factory);
26692705
cty->addChild(c, factory);
26702706

2671-
auto mangling = mangleNode(global);
2707+
auto mangling = mangleNode(global, *mangling_flavor);
26722708
if (!mangling.isSuccess())
26732709
return false;
26742710
remangled = mangling.result();

lldb/source/Plugins/LanguageRuntime/Swift/SwiftLanguageRuntimeNames.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828

2929
#include "Plugins/Process/Utility/RegisterContext_x86.h"
3030
#include "Utility/ARM64_DWARF_Registers.h"
31+
#include "swift/Demangling/ManglingFlavor.h"
3132
#include "llvm/ADT/SmallSet.h"
3233

3334
using namespace lldb;
@@ -622,6 +623,7 @@ bool SwiftLanguageRuntime::IsSwiftMangledName(llvm::StringRef name) {
622623

623624
void SwiftLanguageRuntime::GetGenericParameterNamesForFunction(
624625
const SymbolContext &const_sc, const ExecutionContext *exe_ctx,
626+
swift::Mangle::ManglingFlavor flavor,
625627
llvm::DenseMap<SwiftLanguageRuntime::ArchetypePath, StringRef> &dict) {
626628
// This terrifying cast avoids having too many differences with llvm.org.
627629
SymbolContext &sc = const_cast<SymbolContext &>(const_sc);
@@ -681,7 +683,8 @@ void SwiftLanguageRuntime::GetGenericParameterNamesForFunction(
681683
llvm::dyn_cast_or_null<TypeSystemSwift>(type_system_or_err->get());
682684
if (!ts)
683685
break;
684-
CompilerType generic_type = ts->CreateGenericTypeParamType(depth, index);
686+
CompilerType generic_type =
687+
ts->CreateGenericTypeParamType(depth, index, flavor);
685688
CompilerType bound_type =
686689
runtime->BindGenericTypeParameters(*frame, generic_type);
687690
type_name = bound_type.GetDisplayTypeName();
@@ -735,7 +738,9 @@ std::string SwiftLanguageRuntime::DemangleSymbolAsString(
735738
// Resolve generic parameters in the current function.
736739
options.GenericParameterName = [&](uint64_t depth, uint64_t index) {
737740
if (!did_init) {
738-
GetGenericParameterNamesForFunction(*sc, exe_ctx, dict);
741+
GetGenericParameterNamesForFunction(
742+
*sc, exe_ctx, SwiftLanguageRuntime::GetManglingFlavor(symbol),
743+
dict);
739744
did_init = true;
740745
}
741746
auto it = dict.find({depth, index});
@@ -1205,6 +1210,7 @@ SwiftLanguageRuntime::GetGenericSignature(StringRef function_name,
12051210
GenericSignature signature;
12061211
unsigned num_generic_params = 0;
12071212

1213+
auto flavor = SwiftLanguageRuntime::GetManglingFlavor(function_name);
12081214
// Walk to the function type.
12091215
Context ctx;
12101216
auto *node = SwiftLanguageRuntime::DemangleSymbolAsNode(function_name, ctx);
@@ -1313,10 +1319,10 @@ SwiftLanguageRuntime::GetGenericSignature(StringRef function_name,
13131319

13141320
// Store the various type packs.
13151321
swift::Demangle::Demangler dem;
1316-
auto mangling = swift::Demangle::mangleNode(type_node);
1322+
auto mangling = swift::Demangle::mangleNode(type_node, flavor);
13171323
if (mangling.isSuccess())
13181324
signature.pack_expansions.back().mangled_type =
1319-
ts.RemangleAsType(dem, type_node).GetMangledTypeName();
1325+
ts.RemangleAsType(dem, type_node, flavor).GetMangledTypeName();
13201326

13211327
// Assuming that there are no nested pack_expansions.
13221328
return false;

lldb/source/Plugins/LanguageRuntime/Swift/SwiftLanguageRuntimeRemoteAST.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
//
1111
//===----------------------------------------------------------------------===//
1212

13+
#include "Plugins/TypeSystem/Swift/SwiftASTContext.h"
1314
#include "ReflectionContextInterface.h"
1415
#include "SwiftLanguageRuntimeImpl.h"
1516
#include "lldb/Symbol/VariableList.h"

lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserSwiftDescriptorFinder.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "DWARFDIE.h"
2222

2323
#include "Plugins/TypeSystem/Swift/TypeSystemSwiftTypeRef.h"
24+
#include "swift/Demangling/ManglingFlavor.h"
2425
#include "swift/RemoteInspection/TypeLowering.h"
2526

2627
#include "lldb/Utility/LLDBLog.h"
@@ -63,7 +64,9 @@ getTypeAndDie(TypeSystemSwiftTypeRef &ts,
6364
const swift::reflection::TypeRef *TR) {
6465
swift::Demangle::Demangler dem;
6566
swift::Demangle::NodePointer node = TR->getDemangling(dem);
66-
auto type = ts.RemangleAsType(dem, node);
67+
// TODO: mangling flavor should come from the TypeRef.
68+
auto type =
69+
ts.RemangleAsType(dem, node, swift::Mangle::ManglingFlavor::Embedded);
6770
if (!type) {
6871
if (auto log = GetLog(LLDBLog::Types)) {
6972
std::stringstream ss;

0 commit comments

Comments
 (0)