@@ -114,6 +114,47 @@ struct CallsAndArgs {
114
114
std::string lldb_call;
115
115
};
116
116
117
+ static llvm::SmallVector<const SwiftASTManipulator::VariableInfo *>
118
+ CollectMetadataVariables (
119
+ llvm::ArrayRef<SwiftASTManipulator::VariableInfo> local_variables) {
120
+ llvm::SmallVector<const SwiftASTManipulator::VariableInfo *>
121
+ metadata_variables;
122
+ for (auto &var : local_variables)
123
+ if (var.IsOutermostMetadataPointer ())
124
+ metadata_variables.push_back (&var);
125
+ return metadata_variables;
126
+ }
127
+
128
+ struct PackAndIndex {
129
+ bool is_pack = false ;
130
+ unsigned depth, index;
131
+
132
+ PackAndIndex (bool is_pack, unsigned depth, unsigned index)
133
+ : is_pack(is_pack), depth(depth), index(index) {}
134
+ };
135
+
136
+ static llvm::Expected<llvm::SmallVector<PackAndIndex>> CollectPacksAndIndexes (
137
+ llvm::ArrayRef<const SwiftASTManipulator::VariableInfo *>
138
+ metadata_variables,
139
+ const std::optional<SwiftLanguageRuntime::GenericSignature> &generic_sig) {
140
+ llvm::SmallVector<PackAndIndex> pack_and_indexes;
141
+
142
+ if (generic_sig) {
143
+ for (auto &generic_param : generic_sig->generic_params )
144
+ pack_and_indexes.emplace_back (generic_param.is_pack , generic_param.depth , generic_param.index );
145
+ } else {
146
+ for (auto *metadata_variable : metadata_variables) {
147
+ auto maybe_depth_and_index =
148
+ ParseSwiftGenericParameter (metadata_variable->GetName ().str ());
149
+ if (!maybe_depth_and_index)
150
+ return llvm::createStringError (llvm::errc::not_supported,
151
+ " unexpected metadata variable" );
152
+ pack_and_indexes.emplace_back (false , maybe_depth_and_index->first ,
153
+ maybe_depth_and_index->second );
154
+ }
155
+ }
156
+ return pack_and_indexes;
157
+ }
117
158
// / Constructs the signatures for the expression evaluation functions based on
118
159
// / the metadata variables in scope and any variadic functiontion parameters.
119
160
// / For every outermost metadata pointer in scope ($τ_0_0, $τ_0_1, etc), we want
@@ -149,50 +190,36 @@ static llvm::Expected<CallsAndArgs> MakeGenericSignaturesAndCalls(
149
190
llvm::ArrayRef<SwiftASTManipulator::VariableInfo> local_variables,
150
191
const std::optional<SwiftLanguageRuntime::GenericSignature> &generic_sig,
151
192
bool needs_object_ptr) {
152
- llvm::SmallVector<const SwiftASTManipulator::VariableInfo *>
153
- metadata_variables;
154
- for (auto &var : local_variables)
155
- if (var.IsOutermostMetadataPointer ())
156
- metadata_variables.push_back (&var);
157
-
193
+ auto metadata_variables = CollectMetadataVariables (local_variables);
158
194
// The number of metadata variables could be > if the function is in
159
195
// a generic context.
160
196
if (generic_sig &&
161
197
(metadata_variables.size () < generic_sig->dependent_generic_param_count ))
162
198
return llvm::createStringError (llvm::errc::not_supported,
163
199
" Inconsistent generic signature" );
164
200
201
+ auto maybe_pack_and_indexes = CollectPacksAndIndexes (metadata_variables, generic_sig);
202
+ if (!maybe_pack_and_indexes)
203
+ return maybe_pack_and_indexes.takeError ();
204
+ auto pack_and_indexes = *maybe_pack_and_indexes;
205
+
165
206
llvm::SmallDenseMap<std::pair<unsigned , unsigned >, llvm::SmallString<4 >> subs;
166
207
std::string generic_params;
167
208
std::string generic_params_no_packs;
168
209
llvm::raw_string_ostream s_generic_params (generic_params);
169
210
llvm::raw_string_ostream s_generic_params_no_packs (generic_params_no_packs);
170
- for (size_t i = 0 ; i < metadata_variables.size (); ++i) {
211
+
212
+ for (size_t i = 0 ; i < pack_and_indexes.size (); ++i) {
213
+ auto &[is_pack, depth, index] = pack_and_indexes[i];
171
214
llvm::SmallString<4 > archetype_name;
172
215
llvm::raw_svector_ostream s_archetype_name (archetype_name);
173
- bool is_pack = false ;
174
- unsigned depth, index;
175
- if (generic_sig) {
176
- auto &gp = generic_sig->generic_params [i];
177
- is_pack = gp.is_pack ;
178
- depth = gp.depth ;
179
- index = gp.index ;
180
- } else {
181
- auto di =
182
- ParseSwiftGenericParameter (metadata_variables[i]->GetName ().str ());
183
- if (!di)
184
- return llvm::createStringError (llvm::errc::not_supported,
185
- " unexpected metadata variable" );
186
- depth = di->first ;
187
- index = di->second ;
188
- }
189
216
if (is_pack)
190
217
s_archetype_name << " each " ;
191
218
s_archetype_name << " T" << i;
192
219
if (!is_pack)
193
220
s_generic_params_no_packs << archetype_name << " ," ;
194
- subs.insert ({{depth, index}, archetype_name});
195
221
s_generic_params << archetype_name << " ," ;
222
+ subs.insert ({{depth, index}, archetype_name});
196
223
}
197
224
198
225
if (!generic_params.empty ())
0 commit comments