@@ -1767,6 +1767,9 @@ CreatePackType(swift::Demangle::Demangler &dem, TypeSystemSwiftTypeRef &ts,
1767
1767
llvm::Expected<CompilerType>
1768
1768
SwiftLanguageRuntime::BindGenericPackType (StackFrame &frame,
1769
1769
CompilerType pack_type, bool *is_indirect) {
1770
+ // This mode is used only by GetDynamicTypeAndAddress_Pack(). It would be
1771
+ // cleaner if we could get rid of it.
1772
+ bool rewrite_indirect_packs = (is_indirect != nullptr );
1770
1773
swift::Demangle::Demangler dem;
1771
1774
Target &target = GetProcess ().GetTarget ();
1772
1775
size_t ptr_size = GetProcess ().GetAddressByteSize ();
@@ -1788,9 +1791,10 @@ SwiftLanguageRuntime::BindGenericPackType(StackFrame &frame,
1788
1791
" cannot decode pack_expansion type: failed to decode generic signature "
1789
1792
" from function name" );
1790
1793
1791
- auto expand_pack_type = [&](ConstString mangled_pack_type, bool indirect,
1794
+ auto expand_pack_type = [&](ConstString mangled_pack_type,
1795
+ bool rewrite_indirect,
1792
1796
swift::Mangle::ManglingFlavor flavor)
1793
- -> llvm::Expected<swift::Demangle::NodePointer> {
1797
+ -> llvm::Expected<swift::Demangle::NodePointer> {
1794
1798
// Find pack_type in the pack_expansions.
1795
1799
unsigned i = 0 ;
1796
1800
SwiftLanguageRuntime::GenericSignature::PackExpansion *pack_expansion =
@@ -1923,30 +1927,31 @@ SwiftLanguageRuntime::BindGenericPackType(StackFrame &frame,
1923
1927
// Add the substituted type to the tuple.
1924
1928
elements.push_back ({{}, type});
1925
1929
}
1926
- if (indirect) {
1930
+
1931
+ // TODO: Could we get rid of this code path?
1932
+ if (rewrite_indirect) {
1927
1933
// Create a tuple type with all the concrete types in the pack.
1928
1934
CompilerType tuple = ts->CreateTupleType (elements);
1929
1935
// TODO: Remove unnecessary mangling roundtrip.
1930
1936
// Wrap the type inside a SILPackType to mark it for GetChildAtIndex.
1931
- CompilerType sil_pack_type = ts->CreateSILPackType (tuple, indirect );
1937
+ CompilerType sil_pack_type = ts->CreateSILPackType (tuple, rewrite_indirect );
1932
1938
swift::Demangle::NodePointer global =
1933
1939
dem.demangleSymbol (sil_pack_type.GetMangledTypeName ().GetStringRef ());
1934
1940
using Kind = Node::Kind;
1935
1941
auto *dem_sil_pack_type =
1936
1942
swift_demangle::ChildAtPath (global, {Kind::TypeMangling, Kind::Type});
1937
1943
return dem_sil_pack_type;
1938
- } else {
1939
- return CreatePackType (dem, *ts, elements);
1940
1944
}
1945
+ return CreatePackType (dem, *ts, elements);
1941
1946
};
1942
1947
1943
1948
swift::Demangle::Context dem_ctx;
1944
1949
auto node = dem_ctx.demangleSymbolAsNode (
1945
1950
pack_type.GetMangledTypeName ().GetStringRef ());
1946
1951
1952
+ bool indirect = false ;
1947
1953
auto flavor =
1948
1954
SwiftLanguageRuntime::GetManglingFlavor (pack_type.GetMangledTypeName ());
1949
- bool indirect = false ;
1950
1955
1951
1956
// Expand all the pack types that appear in the incoming type,
1952
1957
// either at the root level or as arguments of bound generic types.
@@ -1968,13 +1973,16 @@ SwiftLanguageRuntime::BindGenericPackType(StackFrame &frame,
1968
1973
ConstString mangled_pack_type = pack_type.GetMangledTypeName ();
1969
1974
LLDB_LOG (GetLog (LLDBLog::Types), " decoded pack_expansion type: {0}" ,
1970
1975
mangled_pack_type);
1971
- return expand_pack_type (mangled_pack_type, indirect, flavor);
1976
+ return expand_pack_type (mangled_pack_type,
1977
+ rewrite_indirect_packs && indirect, flavor);
1972
1978
});
1973
1979
1974
1980
if (!transformed)
1975
1981
return transformed.takeError ();
1982
+
1976
1983
if (is_indirect)
1977
1984
*is_indirect = indirect;
1985
+
1978
1986
return ts->RemangleAsType (dem, *transformed, flavor);
1979
1987
}
1980
1988
@@ -2626,14 +2634,19 @@ SwiftLanguageRuntime::BindGenericTypeParameters(StackFrame &stack_frame,
2626
2634
LLDB_SCOPED_TIMER ();
2627
2635
using namespace swift ::Demangle;
2628
2636
2629
- Status error;
2630
2637
ThreadSafeReflectionContext reflection_ctx = GetReflectionContext ();
2631
2638
if (!reflection_ctx) {
2632
2639
LLDB_LOG (GetLog (LLDBLog::Expressions | LLDBLog::Types),
2633
2640
" No reflection context available." );
2634
2641
return ts.GetTypeFromMangledTypename (mangled_name);
2635
2642
}
2636
2643
2644
+
2645
+ ConstString func_name = stack_frame.GetSymbolContext (eSymbolContextFunction)
2646
+ .GetFunctionName (Mangled::ePreferMangled);
2647
+ // Extract the generic signature from the function symbol.
2648
+ auto generic_signature =
2649
+ SwiftLanguageRuntime::GetGenericSignature (func_name.GetStringRef (), ts);
2637
2650
Demangler dem;
2638
2651
2639
2652
NodePointer canonical = TypeSystemSwiftTypeRef::GetStaticSelfType (
@@ -2645,6 +2658,9 @@ SwiftLanguageRuntime::BindGenericTypeParameters(StackFrame &stack_frame,
2645
2658
ForEachGenericParameter (canonical, [&](unsigned depth, unsigned index) {
2646
2659
if (substitutions.count ({depth, index}))
2647
2660
return ;
2661
+ // Packs will be substituted in a second pass.
2662
+ if (generic_signature && generic_signature->IsPack (depth, index))
2663
+ return ;
2648
2664
StreamString mdvar_name;
2649
2665
mdvar_name.Printf (u8" $\u03C4 _%d_%d" , depth, index);
2650
2666
@@ -2674,7 +2690,8 @@ SwiftLanguageRuntime::BindGenericTypeParameters(StackFrame &stack_frame,
2674
2690
return CompilerType ();
2675
2691
return ts.GetTypeFromMangledTypename (ConstString (mangling.result ()));
2676
2692
};
2677
- if (substitutions.empty ())
2693
+ if (substitutions.empty () &&
2694
+ !(generic_signature && generic_signature->HasPacks ()))
2678
2695
return get_canonical ();
2679
2696
2680
2697
// Build a TypeRef from the demangle tree.
@@ -2717,6 +2734,17 @@ SwiftLanguageRuntime::BindGenericTypeParameters(StackFrame &stack_frame,
2717
2734
CompilerType bound_type = scratch_ctx->RemangleAsType (dem, node, flavor);
2718
2735
LLDB_LOG (GetLog (LLDBLog::Expressions | LLDBLog::Types), " Bound {0} -> {1}." ,
2719
2736
mangled_name, bound_type.GetMangledTypeName ());
2737
+
2738
+ if (generic_signature && generic_signature->HasPacks ()) {
2739
+ auto bound_type_or_err = BindGenericPackType (stack_frame, bound_type);
2740
+ if (!bound_type_or_err) {
2741
+ LLDB_LOG_ERROR (GetLog (LLDBLog::Expressions | LLDBLog::Types),
2742
+ bound_type_or_err.takeError (), " {0}" );
2743
+ return bound_type;
2744
+ }
2745
+ bound_type = *bound_type_or_err;
2746
+ }
2747
+
2720
2748
return bound_type;
2721
2749
}
2722
2750
@@ -3449,7 +3477,7 @@ SwiftLanguageRuntime::GetSwiftRuntimeTypeInfo(
3449
3477
// GetCanonicalType() returned an Expected.
3450
3478
return llvm::createStringError (
3451
3479
" could not get canonical type (possibly due to unresolved typealias)" );
3452
- }
3480
+ }
3453
3481
3454
3482
// Resolve all generic type parameters in the type for the current
3455
3483
// frame. Generic parameter binding has to happen in the scratch
0 commit comments