@@ -45,34 +45,31 @@ static const char *GetUserCodeStartMarker() {
45
45
static const char *GetUserCodeEndMarker () { return " \n /*__LLDB_USER_END__*/" ; }
46
46
47
47
// / Remove SILPacktype and print the name with substitutions applied.
48
- static std::string TransformPackType (
48
+ static llvm::Expected< std::string> TransformPackType (
49
49
CompilerType type,
50
50
llvm::SmallDenseMap<std::pair<unsigned , unsigned >, llvm::SmallString<4 >>
51
51
subs) {
52
52
auto tss = type.GetTypeSystem ().dyn_cast_or_null <TypeSystemSwift>();
53
53
if (!tss)
54
- return " <unexpected typesystem>" ;
54
+ return llvm::createStringError (llvm::errc::not_supported,
55
+ " unexpected typesystem" );
55
56
auto &ts = tss->GetTypeSystemSwiftTypeRef ();
56
57
using namespace swift ::Demangle;
57
58
Demangler dem;
58
59
NodePointer node = ts.GetCanonicalDemangleTree (
59
60
dem, type.GetMangledTypeName ().GetStringRef ());
60
61
61
62
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 ) {
63
65
n = n->getFirstChild ();
64
66
if (n->getKind () == Node::Kind::Type && n->getNumChildren () == 1 )
65
67
return n->getFirstChild ();
66
68
}
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
- // }
73
69
return n;
74
70
});
75
71
72
+ bool error = false ;
76
73
ConstString type_name = ts.RemangleAsType (dem, node).GetMangledTypeName ();
77
74
swift::Demangle::DemangleOptions options;
78
75
options = swift::Demangle::DemangleOptions::SimplifiedUIDemangleOptions ();
@@ -87,10 +84,15 @@ static std::string TransformPackType(
87
84
auto it = subs.find ({depth, index});
88
85
if (it != subs.end ())
89
86
return it->second .str ().str ();
90
- return " <unexpected generic parameter>" ;
87
+ error = true ;
88
+ return " $error" ;
91
89
};
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;
94
96
}
95
97
96
98
struct CallsAndArgs {
@@ -101,7 +103,7 @@ struct CallsAndArgs {
101
103
};
102
104
103
105
// / 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 .
105
107
// / For every outermost metadata pointer in scope ($τ_0_0, $τ_0_1, etc), we want
106
108
// / to generate:
107
109
// /
@@ -110,15 +112,15 @@ struct CallsAndArgs {
110
112
// / func $__lldb_user_expr<T0, T1, ..., Tn>
111
113
// / (_ $__lldb_arg: UnsafeMutablePointer<(T0, T1, ..., Tn)>)
112
114
// /
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:
115
117
// /
116
118
// / func $__lldb_trampoline<T0, T1, ..., Tn>
117
119
// / (_ $__lldb_arg: UnsafeMutablePointer<(T0, T1, ..., Tn)>,
118
120
// / _ $__lldb_injected_self: inout $__lldb_context)
119
121
// /
120
122
// / - A $__lldb_sink signature that matches the number of parameters of the
121
- // / trampoline:
123
+ // / trampoline:
122
124
// /
123
125
// / func $__lldb_sink(_ $__lldb_arg : UnsafeMutablePointer<Any>,
124
126
// / _: $__lldb_builtin_ptr_t, // the self variable
@@ -129,7 +131,8 @@ struct CallsAndArgs {
129
131
// /
130
132
// / - And a matching call to the sink function:
131
133
// /
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)
133
136
static llvm::Expected<CallsAndArgs> MakeGenericSignaturesAndCalls (
134
137
llvm::ArrayRef<SwiftASTManipulator::VariableInfo> local_variables,
135
138
const llvm::Optional<SwiftLanguageRuntime::GenericSignature> &generic_sig,
@@ -143,8 +146,8 @@ static llvm::Expected<CallsAndArgs> MakeGenericSignaturesAndCalls(
143
146
// a generic context.
144
147
if (generic_sig &&
145
148
(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" );
148
151
149
152
llvm::SmallDenseMap<std::pair<unsigned , unsigned >, llvm::SmallString<4 >> subs;
150
153
std::string generic_params;
@@ -165,8 +168,8 @@ static llvm::Expected<CallsAndArgs> MakeGenericSignaturesAndCalls(
165
168
auto di =
166
169
ParseSwiftGenericParameter (metadata_variables[i].GetName ().str ());
167
170
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" );
170
173
depth = di->first ;
171
174
index = di->second ;
172
175
}
@@ -190,9 +193,13 @@ static llvm::Expected<CallsAndArgs> MakeGenericSignaturesAndCalls(
190
193
<< " >(_ $__lldb_arg: UnsafeMutablePointer<("
191
194
<< generic_params_no_packs << " )>" ;
192
195
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 ();
194
200
user_expr_stream << " , _ " << var.GetName () << " : "
195
- << TransformPackType (var.GetType (), subs);
201
+ << *pack_type;
202
+ }
196
203
user_expr_stream << " )" ;
197
204
198
205
std::string trampoline;
0 commit comments