@@ -1777,6 +1777,9 @@ CreatePackType(swift::Demangle::Demangler &dem, TypeSystemSwiftTypeRef &ts,
1777
1777
llvm::Expected<CompilerType>
1778
1778
SwiftLanguageRuntime::BindGenericPackType (StackFrame &frame,
1779
1779
CompilerType pack_type, bool *is_indirect) {
1780
+ // This mode is used only by GetDynamicTypeAndAddress_Pack(). It would be
1781
+ // cleaner if we could get rid of it.
1782
+ bool rewrite_indirect_packs = (is_indirect != nullptr );
1780
1783
swift::Demangle::Demangler dem;
1781
1784
Target &target = GetProcess ().GetTarget ();
1782
1785
size_t ptr_size = GetProcess ().GetAddressByteSize ();
@@ -1798,9 +1801,10 @@ SwiftLanguageRuntime::BindGenericPackType(StackFrame &frame,
1798
1801
" cannot decode pack_expansion type: failed to decode generic signature "
1799
1802
" from function name" );
1800
1803
1801
- auto expand_pack_type = [&](ConstString mangled_pack_type, bool indirect,
1804
+ auto expand_pack_type = [&](ConstString mangled_pack_type,
1805
+ bool rewrite_indirect,
1802
1806
swift::Mangle::ManglingFlavor flavor)
1803
- -> llvm::Expected<swift::Demangle::NodePointer> {
1807
+ -> llvm::Expected<swift::Demangle::NodePointer> {
1804
1808
// Find pack_type in the pack_expansions.
1805
1809
unsigned i = 0 ;
1806
1810
SwiftLanguageRuntime::GenericSignature::PackExpansion *pack_expansion =
@@ -1933,30 +1937,31 @@ SwiftLanguageRuntime::BindGenericPackType(StackFrame &frame,
1933
1937
// Add the substituted type to the tuple.
1934
1938
elements.push_back ({{}, type});
1935
1939
}
1936
- if (indirect) {
1940
+
1941
+ // TODO: Could we get rid of this code path?
1942
+ if (rewrite_indirect) {
1937
1943
// Create a tuple type with all the concrete types in the pack.
1938
1944
CompilerType tuple = ts->CreateTupleType (elements);
1939
1945
// TODO: Remove unnecessary mangling roundtrip.
1940
1946
// Wrap the type inside a SILPackType to mark it for GetChildAtIndex.
1941
- CompilerType sil_pack_type = ts->CreateSILPackType (tuple, indirect );
1947
+ CompilerType sil_pack_type = ts->CreateSILPackType (tuple, rewrite_indirect );
1942
1948
swift::Demangle::NodePointer global =
1943
1949
dem.demangleSymbol (sil_pack_type.GetMangledTypeName ().GetStringRef ());
1944
1950
using Kind = Node::Kind;
1945
1951
auto *dem_sil_pack_type =
1946
1952
swift_demangle::ChildAtPath (global, {Kind::TypeMangling, Kind::Type});
1947
1953
return dem_sil_pack_type;
1948
- } else {
1949
- return CreatePackType (dem, *ts, elements);
1950
1954
}
1955
+ return CreatePackType (dem, *ts, elements);
1951
1956
};
1952
1957
1953
1958
swift::Demangle::Context dem_ctx;
1954
1959
auto node = dem_ctx.demangleSymbolAsNode (
1955
1960
pack_type.GetMangledTypeName ().GetStringRef ());
1956
1961
1962
+ bool indirect = false ;
1957
1963
auto flavor =
1958
1964
SwiftLanguageRuntime::GetManglingFlavor (pack_type.GetMangledTypeName ());
1959
- bool indirect = false ;
1960
1965
1961
1966
// Expand all the pack types that appear in the incoming type,
1962
1967
// either at the root level or as arguments of bound generic types.
@@ -1978,13 +1983,16 @@ SwiftLanguageRuntime::BindGenericPackType(StackFrame &frame,
1978
1983
ConstString mangled_pack_type = pack_type.GetMangledTypeName ();
1979
1984
LLDB_LOG (GetLog (LLDBLog::Types), " decoded pack_expansion type: {0}" ,
1980
1985
mangled_pack_type);
1981
- return expand_pack_type (mangled_pack_type, indirect, flavor);
1986
+ return expand_pack_type (mangled_pack_type,
1987
+ rewrite_indirect_packs && indirect, flavor);
1982
1988
});
1983
1989
1984
1990
if (!transformed)
1985
1991
return transformed.takeError ();
1992
+
1986
1993
if (is_indirect)
1987
1994
*is_indirect = indirect;
1995
+
1988
1996
return ts->RemangleAsType (dem, *transformed, flavor);
1989
1997
}
1990
1998
@@ -2636,14 +2644,19 @@ SwiftLanguageRuntime::BindGenericTypeParameters(StackFrame &stack_frame,
2636
2644
LLDB_SCOPED_TIMER ();
2637
2645
using namespace swift ::Demangle;
2638
2646
2639
- Status error;
2640
2647
ThreadSafeReflectionContext reflection_ctx = GetReflectionContext ();
2641
2648
if (!reflection_ctx) {
2642
2649
LLDB_LOG (GetLog (LLDBLog::Expressions | LLDBLog::Types),
2643
2650
" No reflection context available." );
2644
2651
return ts.GetTypeFromMangledTypename (mangled_name);
2645
2652
}
2646
2653
2654
+
2655
+ ConstString func_name = stack_frame.GetSymbolContext (eSymbolContextFunction)
2656
+ .GetFunctionName (Mangled::ePreferMangled);
2657
+ // Extract the generic signature from the function symbol.
2658
+ auto generic_signature =
2659
+ SwiftLanguageRuntime::GetGenericSignature (func_name.GetStringRef (), ts);
2647
2660
Demangler dem;
2648
2661
2649
2662
NodePointer canonical = TypeSystemSwiftTypeRef::GetStaticSelfType (
@@ -2655,6 +2668,9 @@ SwiftLanguageRuntime::BindGenericTypeParameters(StackFrame &stack_frame,
2655
2668
ForEachGenericParameter (canonical, [&](unsigned depth, unsigned index) {
2656
2669
if (substitutions.count ({depth, index}))
2657
2670
return ;
2671
+ // Packs will be substituted in a second pass.
2672
+ if (generic_signature && generic_signature->IsPack (depth, index))
2673
+ return ;
2658
2674
StreamString mdvar_name;
2659
2675
mdvar_name.Printf (u8" $\u03C4 _%d_%d" , depth, index);
2660
2676
@@ -2684,7 +2700,8 @@ SwiftLanguageRuntime::BindGenericTypeParameters(StackFrame &stack_frame,
2684
2700
return CompilerType ();
2685
2701
return ts.GetTypeFromMangledTypename (ConstString (mangling.result ()));
2686
2702
};
2687
- if (substitutions.empty ())
2703
+ if (substitutions.empty () &&
2704
+ !(generic_signature && generic_signature->HasPacks ()))
2688
2705
return get_canonical ();
2689
2706
2690
2707
// Build a TypeRef from the demangle tree.
@@ -2727,6 +2744,17 @@ SwiftLanguageRuntime::BindGenericTypeParameters(StackFrame &stack_frame,
2727
2744
CompilerType bound_type = scratch_ctx->RemangleAsType (dem, node, flavor);
2728
2745
LLDB_LOG (GetLog (LLDBLog::Expressions | LLDBLog::Types), " Bound {0} -> {1}." ,
2729
2746
mangled_name, bound_type.GetMangledTypeName ());
2747
+
2748
+ if (generic_signature && generic_signature->HasPacks ()) {
2749
+ auto bound_type_or_err = BindGenericPackType (stack_frame, bound_type);
2750
+ if (!bound_type_or_err) {
2751
+ LLDB_LOG_ERROR (GetLog (LLDBLog::Expressions | LLDBLog::Types),
2752
+ bound_type_or_err.takeError (), " {0}" );
2753
+ return bound_type;
2754
+ }
2755
+ bound_type = *bound_type_or_err;
2756
+ }
2757
+
2730
2758
return bound_type;
2731
2759
}
2732
2760
@@ -3458,7 +3486,7 @@ SwiftLanguageRuntime::GetSwiftRuntimeTypeInfo(
3458
3486
// GetCanonicalType() returned an Expected.
3459
3487
return llvm::createStringError (
3460
3488
" could not get canonical type (possibly due to unresolved typealias)" );
3461
- }
3489
+ }
3462
3490
3463
3491
// Resolve all generic type parameters in the type for the current
3464
3492
// frame. Generic parameter binding has to happen in the scratch
0 commit comments