Skip to content

Commit 7702f58

Browse files
committed
[lldb] Check for ErrorType in SwiftASTContext::ReconstructType
rdar://150211941 (cherry-picked from commit 3d35807)
1 parent 93b8dff commit 7702f58

File tree

5 files changed

+26
-23
lines changed

5 files changed

+26
-23
lines changed

lldb/source/Plugins/TypeSystem/Swift/SwiftASTContext.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "Plugins/ExpressionParser/Swift/SwiftPersistentExpressionState.h"
1717

1818
#include "SwiftASTContext.h"
19+
#include "SwiftDemangle.h"
1920
#include "TypeSystemSwift.h"
2021
#include "TypeSystemSwiftTypeRef.h"
2122
#include "lldb/Utility/Log.h"
@@ -4686,6 +4687,12 @@ SwiftASTContext::ReconstructType(ConstString mangled_typename) {
46864687
"\" is not a valid Swift mangled name");
46874688
}
46884689

4690+
if (swift_demangle::ContainsError(mangled_typename)) {
4691+
LOG_PRINTF(GetLog(LLDBLog::Types),
4692+
"(\"%s\") -- cannot reconstruct ErrorType", mangled_cstr);
4693+
return llvm::createStringError("cannot reconstruct ErrorType");
4694+
}
4695+
46894696
LOG_VERBOSE_PRINTF(GetLog(LLDBLog::Types), "(\"%s\")", mangled_cstr);
46904697

46914698
ThreadSafeASTContext ast_ctx = GetASTContext();

lldb/source/Plugins/TypeSystem/Swift/SwiftDemangle.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,20 @@ GetMangledName(swift::Demangle::Demangler &dem,
224224
return mangleNode(global, flavor);
225225
}
226226

227+
/// Returns true if this type contains an error node anywhere.
228+
inline bool ContainsError(StringRef mangled_name) {
229+
using namespace swift::Demangle;
230+
Demangler dem;
231+
NodePointer node = GetDemangledType(dem, mangled_name);
232+
return swift_demangle::FindIf(node, [](NodePointer node) -> bool {
233+
// This node is an in-band error, not a Swift.Error type, which is a
234+
// protocol.
235+
if (node->getKind() == Node::Kind::ErrorType)
236+
return true;
237+
return false;
238+
});
239+
}
240+
227241
} // namespace swift_demangle
228242
} // namespace lldb_private
229243

lldb/source/Plugins/TypeSystem/Swift/TypeSystemSwiftTypeRef.cpp

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2332,7 +2332,7 @@ void *TypeSystemSwiftTypeRef::ReconstructType(opaque_compiler_type_t type,
23322332
return nullptr;
23332333

23342334
// This can crash SwiftASTContext.
2335-
if (ContainsError(type))
2335+
if (swift_demangle::ContainsError(AsMangledName(type)))
23362336
return nullptr;
23372337

23382338
auto swift_ast_context = GetSwiftASTContext(GetSymbolContext(exe_ctx));
@@ -2950,20 +2950,6 @@ bool TypeSystemSwiftTypeRef::IsExpressionEvaluatorDefined(
29502950
});
29512951
}
29522952

2953-
bool TypeSystemSwiftTypeRef::ContainsError(
2954-
lldb::opaque_compiler_type_t type) {
2955-
using namespace swift::Demangle;
2956-
const auto *mangled_name = AsMangledName(type);
2957-
Demangler dem;
2958-
NodePointer node = GetDemangledType(dem, mangled_name);
2959-
return swift_demangle::FindIf(node, [](NodePointer node) -> bool {
2960-
// This node is an in-band error, not a Swift.Error type, which is a protocol.
2961-
if (node->getKind() == Node::Kind::ErrorType)
2962-
return true;
2963-
return false;
2964-
});
2965-
}
2966-
29672953
CompilerType TypeSystemSwiftTypeRef::CreateGenericTypeParamType(
29682954
unsigned int depth, unsigned int index,
29692955
swift::Mangle::ManglingFlavor flavor) {

lldb/source/Plugins/TypeSystem/Swift/TypeSystemSwiftTypeRef.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -458,9 +458,6 @@ class TypeSystemSwiftTypeRef : public TypeSystemSwift {
458458
swift::Mangle::ManglingFlavor
459459
GetManglingFlavor(ExecutionContext *exe_ctx = nullptr);
460460

461-
/// Returns true if this type contains an error node anywhere.
462-
bool ContainsError(lldb::opaque_compiler_type_t type);
463-
464461
protected:
465462
/// Determine whether the fallback is enabled via setting.
466463
bool UseSwiftASTContextFallback(const char *func_name,

lldb/unittests/Symbol/TestTypeSystemSwiftTypeRef.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,13 @@
1212

1313
#include "gtest/gtest.h"
1414

15-
#include "Plugins/TypeSystem/Swift/TypeSystemSwiftTypeRef.h"
1615
#include "Plugins/LanguageRuntime/Swift/SwiftLanguageRuntime.h"
17-
#include "llvm/ADT/StringRef.h"
16+
#include "Plugins/TypeSystem/Swift/SwiftDemangle.h"
17+
#include "Plugins/TypeSystem/Swift/TypeSystemSwiftTypeRef.h"
1818
#include "swift/Demangling/Demangle.h"
1919
#include "swift/Demangling/Demangler.h"
2020
#include "swift/Strings.h"
21+
#include "llvm/ADT/StringRef.h"
2122

2223
using namespace lldb;
2324
using namespace lldb_private;
@@ -1036,9 +1037,7 @@ TEST_F(TestTypeSystemSwiftTypeRef, Error) {
10361037
NodeBuilder b(dem);
10371038
{
10381039
NodePointer n = b.GlobalType(b.Node(Node::Kind::ErrorType, "Fatal Error"));
1039-
CompilerType t = GetCompilerType(b.Mangle(n));
1040-
lldb::opaque_compiler_type_t opaque = t.GetOpaqueQualType();
1041-
ASSERT_TRUE(m_swift_ts->ContainsError(opaque));
1040+
ASSERT_TRUE(swift_demangle::ContainsError(b.Mangle(n)));
10421041
}
10431042
}
10441043

0 commit comments

Comments
 (0)