Skip to content

Commit 47ee1ae

Browse files
committed
[lldb][gardening] Refactor "MakeGenericSignaturesAndCalls"
1 parent 2e7485f commit 47ee1ae

File tree

1 file changed

+51
-24
lines changed

1 file changed

+51
-24
lines changed

lldb/source/Plugins/ExpressionParser/Swift/SwiftExpressionSourceCode.cpp

Lines changed: 51 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,47 @@ struct CallsAndArgs {
114114
std::string lldb_call;
115115
};
116116

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+
}
117158
/// Constructs the signatures for the expression evaluation functions based on
118159
/// the metadata variables in scope and any variadic functiontion parameters.
119160
/// For every outermost metadata pointer in scope ($τ_0_0, $τ_0_1, etc), we want
@@ -149,50 +190,36 @@ static llvm::Expected<CallsAndArgs> MakeGenericSignaturesAndCalls(
149190
llvm::ArrayRef<SwiftASTManipulator::VariableInfo> local_variables,
150191
const std::optional<SwiftLanguageRuntime::GenericSignature> &generic_sig,
151192
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);
158194
// The number of metadata variables could be > if the function is in
159195
// a generic context.
160196
if (generic_sig &&
161197
(metadata_variables.size() < generic_sig->dependent_generic_param_count))
162198
return llvm::createStringError(llvm::errc::not_supported,
163199
"Inconsistent generic signature");
164200

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+
165206
llvm::SmallDenseMap<std::pair<unsigned, unsigned>, llvm::SmallString<4>> subs;
166207
std::string generic_params;
167208
std::string generic_params_no_packs;
168209
llvm::raw_string_ostream s_generic_params(generic_params);
169210
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];
171214
llvm::SmallString<4> archetype_name;
172215
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-
}
189216
if (is_pack)
190217
s_archetype_name << "each ";
191218
s_archetype_name << "T" << i;
192219
if (!is_pack)
193220
s_generic_params_no_packs << archetype_name << ",";
194-
subs.insert({{depth, index}, archetype_name});
195221
s_generic_params << archetype_name << ",";
222+
subs.insert({{depth, index}, archetype_name});
196223
}
197224

198225
if (!generic_params.empty())

0 commit comments

Comments
 (0)