Skip to content

Commit 9afc37b

Browse files
committed
[lldb][gardening] Refactor "MakeGenericSignaturesAndCalls"
1 parent 2e7485f commit 9afc37b

File tree

1 file changed

+66
-30
lines changed

1 file changed

+66
-30
lines changed

Diff for: lldb/source/Plugins/ExpressionParser/Swift/SwiftExpressionSourceCode.cpp

+66-30
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
#include "Plugins/ExpressionParser/Swift/SwiftASTManipulator.h"
1414
#include "Plugins/TypeSystem/Swift/SwiftASTContext.h"
15+
#include "lldb/Symbol/Variable.h"
1516
#include "lldb/Target/Language.h"
1617
#include "lldb/Target/Platform.h"
1718
#include "lldb/Target/Target.h"
@@ -114,6 +115,56 @@ struct CallsAndArgs {
114115
std::string lldb_call;
115116
};
116117

118+
static llvm::SmallVector<const SwiftASTManipulator::VariableInfo *>
119+
CollectMetadataVariables(
120+
llvm::ArrayRef<SwiftASTManipulator::VariableInfo> local_variables) {
121+
llvm::SmallVector<const SwiftASTManipulator::VariableInfo *>
122+
metadata_variables;
123+
for (auto &var : local_variables)
124+
if (var.IsOutermostMetadataPointer())
125+
metadata_variables.push_back(&var);
126+
return metadata_variables;
127+
}
128+
129+
struct MetadataInfo {
130+
bool is_pack = false;
131+
unsigned depth;
132+
unsigned index;
133+
llvm::StringRef archetype_name;
134+
135+
MetadataInfo(bool is_pack, unsigned depth, unsigned index, llvm::StringRef archetype_name)
136+
: is_pack(is_pack), depth(depth), index(index), archetype_name(archetype_name) {}
137+
};
138+
139+
static llvm::Expected<llvm::SmallVector<MetadataInfo>> CollectMetadataInfos(
140+
llvm::ArrayRef<const SwiftASTManipulator::VariableInfo *>
141+
metadata_variables,
142+
const std::optional<SwiftLanguageRuntime::GenericSignature> &generic_sig) {
143+
llvm::SmallVector<MetadataInfo> metadata_info;
144+
145+
for (size_t i = 0; i < metadata_variables.size(); ++i) {
146+
auto variable_sp =
147+
llvm::cast<SwiftASTManipulatorBase::VariableMetadataVariable>(
148+
metadata_variables[i]->GetMetadata())
149+
->m_variable_sp;
150+
auto archetype_name = variable_sp->GetType()->GetName();
151+
if (generic_sig)
152+
metadata_info.emplace_back(generic_sig->generic_params[i].is_pack,
153+
generic_sig->generic_params[i].depth,
154+
generic_sig->generic_params[i].index,
155+
archetype_name);
156+
else {
157+
auto maybe_depth_and_index =
158+
ParseSwiftGenericParameter(metadata_variables[i]->GetName().str());
159+
if (!maybe_depth_and_index)
160+
return llvm::createStringError(llvm::errc::not_supported,
161+
"unexpected metadata variable");
162+
metadata_info.emplace_back(false, maybe_depth_and_index->first,
163+
maybe_depth_and_index->second, archetype_name);
164+
}
165+
}
166+
return metadata_info;
167+
}
117168
/// Constructs the signatures for the expression evaluation functions based on
118169
/// the metadata variables in scope and any variadic functiontion parameters.
119170
/// For every outermost metadata pointer in scope ($τ_0_0, $τ_0_1, etc), we want
@@ -149,50 +200,35 @@ static llvm::Expected<CallsAndArgs> MakeGenericSignaturesAndCalls(
149200
llvm::ArrayRef<SwiftASTManipulator::VariableInfo> local_variables,
150201
const std::optional<SwiftLanguageRuntime::GenericSignature> &generic_sig,
151202
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-
203+
auto metadata_variables = CollectMetadataVariables(local_variables);
158204
// The number of metadata variables could be > if the function is in
159205
// a generic context.
160206
if (generic_sig &&
161207
(metadata_variables.size() < generic_sig->dependent_generic_param_count))
162208
return llvm::createStringError(llvm::errc::not_supported,
163209
"Inconsistent generic signature");
164210

211+
auto maybe_metadata_infos = CollectMetadataInfos(metadata_variables, generic_sig);
212+
if (!maybe_metadata_infos)
213+
return maybe_metadata_infos.takeError();
214+
auto metadata_infos = *maybe_metadata_infos;
215+
165216
llvm::SmallDenseMap<std::pair<unsigned, unsigned>, llvm::SmallString<4>> subs;
166217
std::string generic_params;
167218
std::string generic_params_no_packs;
168219
llvm::raw_string_ostream s_generic_params(generic_params);
169220
llvm::raw_string_ostream s_generic_params_no_packs(generic_params_no_packs);
170-
for (size_t i = 0; i < metadata_variables.size(); ++i) {
171-
llvm::SmallString<4> archetype_name;
172-
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-
}
221+
222+
for (auto &[is_pack, depth, index, archetype_name] : metadata_infos) {
223+
llvm::SmallString<4> sig_archetype_name;
224+
llvm::raw_svector_ostream s_sig_archetype_name(sig_archetype_name);
189225
if (is_pack)
190-
s_archetype_name << "each ";
191-
s_archetype_name << "T" << i;
226+
s_sig_archetype_name << "each ";
227+
s_sig_archetype_name << archetype_name;
192228
if (!is_pack)
193-
s_generic_params_no_packs << archetype_name << ",";
194-
subs.insert({{depth, index}, archetype_name});
195-
s_generic_params << archetype_name << ",";
229+
s_generic_params_no_packs << sig_archetype_name << ",";
230+
s_generic_params << sig_archetype_name << ",";
231+
subs.insert({{depth, index}, sig_archetype_name});
196232
}
197233

198234
if (!generic_params.empty())

0 commit comments

Comments
 (0)