@@ -45,34 +45,31 @@ static const char *GetUserCodeStartMarker() {
4545static const char *GetUserCodeEndMarker () { return " \n /*__LLDB_USER_END__*/" ; }
4646
4747// / Remove SILPacktype and print the name with substitutions applied.
48- static std::string TransformPackType (
48+ static llvm::Expected< std::string> TransformPackType (
4949 CompilerType type,
5050 llvm::SmallDenseMap<std::pair<unsigned , unsigned >, llvm::SmallString<4 >>
5151 subs) {
5252 auto tss = type.GetTypeSystem ().dyn_cast_or_null <TypeSystemSwift>();
5353 if (!tss)
54- return " <unexpected typesystem>" ;
54+ return llvm::createStringError (llvm::errc::not_supported,
55+ " unexpected typesystem" );
5556 auto &ts = tss->GetTypeSystemSwiftTypeRef ();
5657 using namespace swift ::Demangle;
5758 Demangler dem;
5859 NodePointer node = ts.GetCanonicalDemangleTree (
5960 dem, type.GetMangledTypeName ().GetStringRef ());
6061
6162 node = TypeSystemSwiftTypeRef::Transform (dem, node, [](NodePointer n) {
62- if (n->getKind () == Node::Kind::SILPackIndirect && n->getNumChildren () == 1 ) {
63+ if (n->getKind () == Node::Kind::SILPackIndirect &&
64+ n->getNumChildren () == 1 ) {
6365 n = n->getFirstChild ();
6466 if (n->getKind () == Node::Kind::Type && n->getNumChildren () == 1 )
6567 return n->getFirstChild ();
6668 }
67- // if (n->getKind() == Node::Kind::Pack && n->getNumChildren() == 2) {
68- // auto pack = dem.createNode(Node::Kind::PackExpansion);
69- // pack->addChild(n/*->getChild(0)*/, dem);
70- // //pack->addChild(n->getChild(1), dem);
71- // return pack;
72- // }
7369 return n;
7470 });
7571
72+ bool error = false ;
7673 ConstString type_name = ts.RemangleAsType (dem, node).GetMangledTypeName ();
7774 swift::Demangle::DemangleOptions options;
7875 options = swift::Demangle::DemangleOptions::SimplifiedUIDemangleOptions ();
@@ -87,10 +84,15 @@ static std::string TransformPackType(
8784 auto it = subs.find ({depth, index});
8885 if (it != subs.end ())
8986 return it->second .str ().str ();
90- return " <unexpected generic parameter>" ;
87+ error = true ;
88+ return " $error" ;
9189 };
92- return swift::Demangle::demangleSymbolAsString (type_name.GetStringRef (),
93- options);
90+ std::string name = swift::Demangle::demangleSymbolAsString (
91+ type_name.GetStringRef (), options);
92+ if (error)
93+ return llvm::createStringError (llvm::errc::not_supported,
94+ " unexpected generic parameter" );
95+ return name;
9496}
9597
9698struct CallsAndArgs {
@@ -101,7 +103,7 @@ struct CallsAndArgs {
101103};
102104
103105// / Constructs the signatures for the expression evaluation functions based on
104- // / the metadata variables in scope.
106+ // / the metadata variables in scope and any variadic functiontion parameters .
105107// / For every outermost metadata pointer in scope ($τ_0_0, $τ_0_1, etc), we want
106108// / to generate:
107109// /
@@ -110,15 +112,15 @@ struct CallsAndArgs {
110112// / func $__lldb_user_expr<T0, T1, ..., Tn>
111113// / (_ $__lldb_arg: UnsafeMutablePointer<(T0, T1, ..., Tn)>)
112114// /
113- // / - A $__lldb_trampoline signature like the above, but that also takes in a
114- // / pointer to self:
115+ // / - An optional $__lldb_trampoline signature like the above, but
116+ // / that also takes in a pointer to self:
115117// /
116118// / func $__lldb_trampoline<T0, T1, ..., Tn>
117119// / (_ $__lldb_arg: UnsafeMutablePointer<(T0, T1, ..., Tn)>,
118120// / _ $__lldb_injected_self: inout $__lldb_context)
119121// /
120122// / - A $__lldb_sink signature that matches the number of parameters of the
121- // / trampoline:
123+ // / trampoline:
122124// /
123125// / func $__lldb_sink(_ $__lldb_arg : UnsafeMutablePointer<Any>,
124126// / _: $__lldb_builtin_ptr_t, // the self variable
@@ -129,7 +131,8 @@ struct CallsAndArgs {
129131// /
130132// / - And a matching call to the sink function:
131133// /
132- // / lldb_sink($__lldb_arg, $__lldb_injected_self, $τ_0_0, $τ_0_1, ..., $τ_0_n)
134+ // / lldb_sink($__lldb_arg, [$__lldb_injected_self, [pack args, pack counts...]],
135+ // / $τ_0_0, $τ_0_1, ..., $τ_0_n)
133136static llvm::Expected<CallsAndArgs> MakeGenericSignaturesAndCalls (
134137 llvm::ArrayRef<SwiftASTManipulator::VariableInfo> local_variables,
135138 const llvm::Optional<SwiftLanguageRuntime::GenericSignature> &generic_sig,
@@ -143,8 +146,8 @@ static llvm::Expected<CallsAndArgs> MakeGenericSignaturesAndCalls(
143146 // a generic context.
144147 if (generic_sig &&
145148 (metadata_variables.size () < generic_sig->dependent_generic_param_count ))
146- return llvm::make_error< llvm::StringError>(
147- llvm::inconvertibleErrorCode (), " Inconsistent generic signature" );
149+ return llvm::createStringError ( llvm::errc::not_supported,
150+ " Inconsistent generic signature" );
148151
149152 llvm::SmallDenseMap<std::pair<unsigned , unsigned >, llvm::SmallString<4 >> subs;
150153 std::string generic_params;
@@ -165,8 +168,8 @@ static llvm::Expected<CallsAndArgs> MakeGenericSignaturesAndCalls(
165168 auto di =
166169 ParseSwiftGenericParameter (metadata_variables[i].GetName ().str ());
167170 if (!di)
168- return llvm::make_error< llvm::StringError>(
169- llvm::inconvertibleErrorCode (), " unexpected metadata variable" );
171+ return llvm::createStringError ( llvm::errc::not_supported,
172+ " unexpected metadata variable" );
170173 depth = di->first ;
171174 index = di->second ;
172175 }
@@ -190,9 +193,13 @@ static llvm::Expected<CallsAndArgs> MakeGenericSignaturesAndCalls(
190193 << " >(_ $__lldb_arg: UnsafeMutablePointer<("
191194 << generic_params_no_packs << " )>" ;
192195 for (auto &var : local_variables)
193- if (var.GetType ().GetTypeInfo () & lldb::eTypeIsPack)
196+ if (var.GetType ().GetTypeInfo () & lldb::eTypeIsPack) {
197+ auto pack_type = TransformPackType (var.GetType (), subs);
198+ if (!pack_type)
199+ return pack_type.takeError ();
194200 user_expr_stream << " , _ " << var.GetName () << " : "
195- << TransformPackType (var.GetType (), subs);
201+ << *pack_type;
202+ }
196203 user_expr_stream << " )" ;
197204
198205 std::string trampoline;
0 commit comments