36
36
#include " swift/AST/ASTMangler.h"
37
37
#include " swift/AST/ASTWalker.h"
38
38
#include " swift/Demangling/Demangle.h"
39
+ #include " swift/Demangling/ManglingFlavor.h"
39
40
#include " swift/RemoteInspection/ReflectionContext.h"
40
41
#include " swift/RemoteInspection/TypeRefBuilder.h"
41
42
#include " swift/Strings.h"
@@ -318,8 +319,11 @@ class LLDBTypeInfoProvider : public swift::remote::TypeInfoProvider {
318
319
auto *node = dem.demangleSymbol (wrapped);
319
320
if (!node) {
320
321
// 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.
321
324
auto maybeMangled = swift_demangle::mangleClass (
322
- dem, swift::MANGLING_MODULE_OBJC, mangledName);
325
+ dem, swift::MANGLING_MODULE_OBJC, mangledName,
326
+ swift::Mangle::ManglingFlavor::Default);
323
327
if (!maybeMangled.isSuccess ()) {
324
328
LLDB_LOG (GetLog (LLDBLog::Types),
325
329
" [LLDBTypeInfoProvider] invalid mangled name: {0}" ,
@@ -641,7 +645,9 @@ CompilerType GetWeakReferent(TypeSystemSwiftTypeRef &ts, CompilerType type) {
641
645
if (!n || n->getKind () != Node::Kind::SugaredOptional || !n->hasChildren ())
642
646
return {};
643
647
n = n->getFirstChild ();
644
- return ts.RemangleAsType (dem, n);
648
+ return ts.RemangleAsType (
649
+ dem, n,
650
+ SwiftLanguageRuntime::GetManglingFlavor (type.GetMangledTypeName ()));
645
651
}
646
652
647
653
CompilerType GetTypeFromTypeRef (TypeSystemSwiftTypeRef &ts,
@@ -650,7 +656,8 @@ CompilerType GetTypeFromTypeRef(TypeSystemSwiftTypeRef &ts,
650
656
return {};
651
657
swift::Demangle::Demangler dem;
652
658
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 ());
654
661
}
655
662
656
663
struct ExistentialSyntheticChild {
@@ -1567,8 +1574,9 @@ bool SwiftLanguageRuntimeImpl::GetDynamicTypeAndAddress_Pack(
1567
1574
1568
1575
swift::Demangle::Demangler dem;
1569
1576
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 {
1572
1580
// Find pack_type in the pack_expansions.
1573
1581
unsigned i = 0 ;
1574
1582
SwiftLanguageRuntime::GenericSignature::PackExpansion *pack_expansion =
@@ -1698,7 +1706,7 @@ bool SwiftLanguageRuntimeImpl::GetDynamicTypeAndAddress_Pack(
1698
1706
auto bound_typeref = reflection_ctx->ApplySubstitutions (
1699
1707
type_ref, substitutions, ts->GetDescriptorFinder ());
1700
1708
swift::Demangle::NodePointer node = bound_typeref->getDemangling (dem);
1701
- CompilerType type = ts->RemangleAsType (dem, node);
1709
+ CompilerType type = ts->RemangleAsType (dem, node, flavor );
1702
1710
1703
1711
// Add the substituted type to the tuple.
1704
1712
elements.push_back ({{}, type});
@@ -1724,6 +1732,9 @@ bool SwiftLanguageRuntimeImpl::GetDynamicTypeAndAddress_Pack(
1724
1732
auto node = dem_ctx.demangleSymbolAsNode (
1725
1733
pack_type.GetMangledTypeName ().GetStringRef ());
1726
1734
1735
+ auto flavor =
1736
+ SwiftLanguageRuntime::GetManglingFlavor (pack_type.GetMangledTypeName ());
1737
+
1727
1738
// Expand all the pack types that appear in the incoming type,
1728
1739
// either at the root level or as arguments of bound generic types.
1729
1740
bool indirect = false ;
@@ -1739,18 +1750,18 @@ bool SwiftLanguageRuntimeImpl::GetDynamicTypeAndAddress_Pack(
1739
1750
if (node->getNumChildren () != 1 )
1740
1751
return node;
1741
1752
node = node->getChild (0 );
1742
- CompilerType pack_type = ts->RemangleAsType (dem, node);
1753
+ CompilerType pack_type = ts->RemangleAsType (dem, node, flavor );
1743
1754
ConstString mangled_pack_type = pack_type.GetMangledTypeName ();
1744
1755
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 );
1746
1757
if (!result) {
1747
1758
LLDB_LOG (log, " failed to expand pack type: {0}" , mangled_pack_type);
1748
1759
return node;
1749
1760
}
1750
1761
return result;
1751
1762
});
1752
1763
1753
- CompilerType expanded_type = ts->RemangleAsType (dem, transformed);
1764
+ CompilerType expanded_type = ts->RemangleAsType (dem, transformed, flavor );
1754
1765
pack_type_or_name.SetCompilerType (expanded_type);
1755
1766
1756
1767
AddressType address_type;
@@ -1824,7 +1835,8 @@ bool SwiftLanguageRuntimeImpl::GetDynamicTypeAndAddress_Class(
1824
1835
// useful to users.
1825
1836
if (IsPrivateNSClass (node))
1826
1837
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));
1828
1840
found = true ;
1829
1841
return true ;
1830
1842
}
@@ -1854,9 +1866,13 @@ bool SwiftLanguageRuntimeImpl::GetDynamicTypeAndAddress_Class(
1854
1866
class_type.GetMangledTypeName (), instance_ptr);
1855
1867
return false ;
1856
1868
}
1869
+
1870
+ auto flavor =
1871
+ SwiftLanguageRuntime::GetManglingFlavor (class_type.GetMangledTypeName ());
1872
+
1857
1873
swift::Demangle::Demangler dem;
1858
1874
swift::Demangle::NodePointer node = typeref->getDemangling (dem);
1859
- CompilerType dynamic_type = ts->RemangleAsType (dem, node);
1875
+ CompilerType dynamic_type = ts->RemangleAsType (dem, node, flavor );
1860
1876
LLDB_LOG (log, " dynamic type of instance_ptr {0:x} is {1}" , instance_ptr,
1861
1877
class_type.GetMangledTypeName ());
1862
1878
class_type_or_name.SetCompilerType (dynamic_type);
@@ -2022,7 +2038,10 @@ bool SwiftLanguageRuntimeImpl::GetDynamicTypeAndAddress_Existential(
2022
2038
return false ;
2023
2039
swift::Demangle::Demangler dem;
2024
2040
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));
2026
2045
address.SetRawAddress (out_address.getAddressData ());
2027
2046
2028
2047
#ifndef NDEBUG
@@ -2087,7 +2106,10 @@ bool SwiftLanguageRuntimeImpl::GetDynamicTypeAndAddress_ExistentialMetatype(
2087
2106
meta->addChild (node, dem);
2088
2107
wrapped->addChild (meta,dem);
2089
2108
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);
2091
2113
class_type_or_name.SetCompilerType (meta_type);
2092
2114
address.SetRawAddress (ptr);
2093
2115
return true ;
@@ -2113,7 +2135,9 @@ CompilerType SwiftLanguageRuntimeImpl::GetTypeFromMetadata(TypeSystemSwift &ts,
2113
2135
using namespace swift ::Demangle;
2114
2136
Demangler dem;
2115
2137
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 ());
2117
2141
}
2118
2142
2119
2143
std::optional<lldb::addr_t >
@@ -2236,7 +2260,10 @@ CompilerType SwiftLanguageRuntimeImpl::BindGenericTypeParameters(
2236
2260
type_ref, substitutions,
2237
2261
tr_ts->GetDescriptorFinder ());
2238
2262
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 ()));
2240
2267
}
2241
2268
2242
2269
CompilerType
@@ -2278,10 +2305,12 @@ SwiftLanguageRuntimeImpl::BindGenericTypeParameters(StackFrame &stack_frame,
2278
2305
return ;
2279
2306
substitutions.insert ({{depth, index}, type_ref});
2280
2307
});
2308
+ auto flavor =
2309
+ SwiftLanguageRuntime::GetManglingFlavor (mangled_name.GetStringRef ());
2281
2310
2282
2311
// Nothing to do if there are no type parameters.
2283
2312
auto get_canonical = [&]() {
2284
- auto mangling = mangleNode (canonical);
2313
+ auto mangling = mangleNode (canonical, flavor );
2285
2314
if (!mangling.isSuccess ())
2286
2315
return CompilerType ();
2287
2316
return ts.GetTypeFromMangledTypename (ConstString (mangling.result ()));
@@ -2315,7 +2344,7 @@ SwiftLanguageRuntimeImpl::BindGenericTypeParameters(StackFrame &stack_frame,
2315
2344
" No scratch context available." );
2316
2345
return ts.GetTypeFromMangledTypename (mangled_name);
2317
2346
}
2318
- CompilerType bound_type = scratch_ctx->RemangleAsType (dem, node);
2347
+ CompilerType bound_type = scratch_ctx->RemangleAsType (dem, node, flavor );
2319
2348
LLDB_LOG (GetLog (LLDBLog::Expressions | LLDBLog::Types), " Bound {0} -> {1}." ,
2320
2349
mangled_name, bound_type.GetMangledTypeName ());
2321
2350
return bound_type;
@@ -2640,6 +2669,13 @@ bool SwiftLanguageRuntimeImpl::GetDynamicTypeAndAddress_ClangType(
2640
2669
2641
2670
std::string remangled;
2642
2671
{
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
+
2643
2679
// Create a mangle tree for Swift.Optional<$module.$class>
2644
2680
using namespace swift ::Demangle;
2645
2681
NodeFactory factory;
@@ -2668,7 +2704,7 @@ bool SwiftLanguageRuntimeImpl::GetDynamicTypeAndAddress_ClangType(
2668
2704
factory);
2669
2705
cty->addChild (c, factory);
2670
2706
2671
- auto mangling = mangleNode (global);
2707
+ auto mangling = mangleNode (global, *mangling_flavor );
2672
2708
if (!mangling.isSuccess ())
2673
2709
return false ;
2674
2710
remangled = mangling.result ();
0 commit comments