Skip to content

Commit 7c96e2b

Browse files
Merge pull request #6518 from adrian-prantl/review-feedback
Improve documentation and clean up error handling
2 parents a604e1c + 22210cd commit 7c96e2b

File tree

2 files changed

+30
-24
lines changed

2 files changed

+30
-24
lines changed

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -894,7 +894,6 @@ llvm::Optional<swift::Type> SwiftASTManipulator::GetSwiftTypeForVariable(
894894
return {};
895895
return swift::Type(it->second);
896896
}
897-
//swift_ast_ctx->GetBuiltinRawPointerType());
898897
return {};
899898
}
900899

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

Lines changed: 30 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -45,34 +45,31 @@ static const char *GetUserCodeStartMarker() {
4545
static const char *GetUserCodeEndMarker() { return "\n/*__LLDB_USER_END__*/"; }
4646

4747
/// Remove SILPacktype and print the name with substitutions applied.
48-
static std::string TransformPackType(
48+
static llvm::Expected<std::string> TransformPackType(
4949
CompilerType type,
5050
llvm::SmallDenseMap<std::pair<unsigned, unsigned>, llvm::SmallString<4>>
5151
subs) {
5252
auto tss = type.GetTypeSystem().dyn_cast_or_null<TypeSystemSwift>();
5353
if (!tss)
54-
return "<unexpected typesystem>";
54+
return llvm::createStringError(llvm::errc::not_supported,
55+
"unexpected typesystem");
5556
auto &ts = tss->GetTypeSystemSwiftTypeRef();
5657
using namespace swift::Demangle;
5758
Demangler dem;
5859
NodePointer node = ts.GetCanonicalDemangleTree(
5960
dem, type.GetMangledTypeName().GetStringRef());
6061

6162
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) {
6365
n = n->getFirstChild();
6466
if (n->getKind() == Node::Kind::Type && n->getNumChildren() == 1)
6567
return n->getFirstChild();
6668
}
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-
//}
7369
return n;
7470
});
7571

72+
bool error = false;
7673
ConstString type_name = ts.RemangleAsType(dem, node).GetMangledTypeName();
7774
swift::Demangle::DemangleOptions options;
7875
options = swift::Demangle::DemangleOptions::SimplifiedUIDemangleOptions();
@@ -87,10 +84,15 @@ static std::string TransformPackType(
8784
auto it = subs.find({depth, index});
8885
if (it != subs.end())
8986
return it->second.str().str();
90-
return "<unexpected generic parameter>";
87+
error = true;
88+
return "$error";
9189
};
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;
9496
}
9597

9698
struct CallsAndArgs {
@@ -101,7 +103,7 @@ struct CallsAndArgs {
101103
};
102104

103105
/// 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.
105107
/// For every outermost metadata pointer in scope ($τ_0_0, $τ_0_1, etc), we want
106108
/// to generate:
107109
///
@@ -110,15 +112,15 @@ struct CallsAndArgs {
110112
/// func $__lldb_user_expr<T0, T1, ..., Tn>
111113
/// (_ $__lldb_arg: UnsafeMutablePointer<(T0, T1, ..., Tn)>)
112114
///
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:
115117
///
116118
/// func $__lldb_trampoline<T0, T1, ..., Tn>
117119
/// (_ $__lldb_arg: UnsafeMutablePointer<(T0, T1, ..., Tn)>,
118120
/// _ $__lldb_injected_self: inout $__lldb_context)
119121
///
120122
/// - A $__lldb_sink signature that matches the number of parameters of the
121-
/// trampoline:
123+
/// trampoline:
122124
///
123125
/// func $__lldb_sink(_ $__lldb_arg : UnsafeMutablePointer<Any>,
124126
/// _: $__lldb_builtin_ptr_t, // the self variable
@@ -129,7 +131,8 @@ struct CallsAndArgs {
129131
///
130132
/// - And a matching call to the sink function:
131133
///
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)
133136
static llvm::Expected<CallsAndArgs> MakeGenericSignaturesAndCalls(
134137
llvm::ArrayRef<SwiftASTManipulator::VariableInfo> local_variables,
135138
const llvm::Optional<SwiftLanguageRuntime::GenericSignature> &generic_sig,
@@ -143,8 +146,8 @@ static llvm::Expected<CallsAndArgs> MakeGenericSignaturesAndCalls(
143146
// a generic context.
144147
if (generic_sig &&
145148
(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");
148151

149152
llvm::SmallDenseMap<std::pair<unsigned, unsigned>, llvm::SmallString<4>> subs;
150153
std::string generic_params;
@@ -165,8 +168,8 @@ static llvm::Expected<CallsAndArgs> MakeGenericSignaturesAndCalls(
165168
auto di =
166169
ParseSwiftGenericParameter(metadata_variables[i].GetName().str());
167170
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");
170173
depth = di->first;
171174
index = di->second;
172175
}
@@ -190,9 +193,13 @@ static llvm::Expected<CallsAndArgs> MakeGenericSignaturesAndCalls(
190193
<< ">(_ $__lldb_arg: UnsafeMutablePointer<("
191194
<< generic_params_no_packs << ")>";
192195
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();
194200
user_expr_stream << ", _ " << var.GetName() << ": "
195-
<< TransformPackType(var.GetType(), subs);
201+
<< *pack_type;
202+
}
196203
user_expr_stream << ")";
197204

198205
std::string trampoline;

0 commit comments

Comments
 (0)