|
12 | 12 |
|
13 | 13 | #include "Plugins/ExpressionParser/Swift/SwiftASTManipulator.h"
|
14 | 14 | #include "Plugins/TypeSystem/Swift/SwiftASTContext.h"
|
| 15 | +#include "lldb/Symbol/Variable.h" |
15 | 16 | #include "lldb/Target/Language.h"
|
16 | 17 | #include "lldb/Target/Platform.h"
|
17 | 18 | #include "lldb/Target/Target.h"
|
@@ -114,6 +115,56 @@ struct CallsAndArgs {
|
114 | 115 | std::string lldb_call;
|
115 | 116 | };
|
116 | 117 |
|
| 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 | +} |
117 | 168 | /// Constructs the signatures for the expression evaluation functions based on
|
118 | 169 | /// the metadata variables in scope and any variadic functiontion parameters.
|
119 | 170 | /// For every outermost metadata pointer in scope ($τ_0_0, $τ_0_1, etc), we want
|
@@ -149,50 +200,35 @@ static llvm::Expected<CallsAndArgs> MakeGenericSignaturesAndCalls(
|
149 | 200 | llvm::ArrayRef<SwiftASTManipulator::VariableInfo> local_variables,
|
150 | 201 | const std::optional<SwiftLanguageRuntime::GenericSignature> &generic_sig,
|
151 | 202 | 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); |
158 | 204 | // The number of metadata variables could be > if the function is in
|
159 | 205 | // a generic context.
|
160 | 206 | if (generic_sig &&
|
161 | 207 | (metadata_variables.size() < generic_sig->dependent_generic_param_count))
|
162 | 208 | return llvm::createStringError(llvm::errc::not_supported,
|
163 | 209 | "Inconsistent generic signature");
|
164 | 210 |
|
| 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 | + |
165 | 216 | llvm::SmallDenseMap<std::pair<unsigned, unsigned>, llvm::SmallString<4>> subs;
|
166 | 217 | std::string generic_params;
|
167 | 218 | std::string generic_params_no_packs;
|
168 | 219 | llvm::raw_string_ostream s_generic_params(generic_params);
|
169 | 220 | 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); |
189 | 225 | 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; |
192 | 228 | 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}); |
196 | 232 | }
|
197 | 233 |
|
198 | 234 | if (!generic_params.empty())
|
|
0 commit comments