Skip to content

Commit 5bbb632

Browse files
authored
Merge pull request #1331 from adrian-prantl/soft-validation
Downgrade the TypeSystemSwiftTypeRef string validation errors
2 parents 34a0333 + 9e2b1bd commit 5bbb632

File tree

4 files changed

+88
-23
lines changed

4 files changed

+88
-23
lines changed

lldb/include/lldb/Target/SwiftLanguageRuntime.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -132,8 +132,9 @@ class SwiftLanguageRuntime : public LanguageRuntime {
132132
/// since some day we may want to support more than one swift variant.
133133
static bool IsSwiftMangledName(const char *name);
134134

135+
enum DemangleMode { eSimplified, eTypeName, eDisplayTypeName };
135136
static std::string DemangleSymbolAsString(llvm::StringRef symbol,
136-
bool simplified = false,
137+
DemangleMode mode,
137138
const SymbolContext *sc = nullptr);
138139

139140
class MethodName {

lldb/source/Core/Mangled.cpp

+3-2
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,7 @@ ConstString Mangled::GetDemangledName(lldb::LanguageType language,
385385
if (log)
386386
log->Printf("demangle swift: %s", mangled_name);
387387
std::string demangled(SwiftLanguageRuntime::DemangleSymbolAsString(
388-
mangled_name, false, sc));
388+
mangled_name, SwiftLanguageRuntime::eTypeName, sc));
389389
// Don't cache the demangled name the function isn't available yet.
390390
if (!sc || !sc->function)
391391
return ConstString(demangled);
@@ -429,7 +429,8 @@ ConstString Mangled::GetDisplayDemangledName(lldb::LanguageType language,
429429

430430
std::string demangled_std =
431431
SwiftLanguageRuntime::DemangleSymbolAsString(
432-
m_mangled.GetStringRef(), true, sc);
432+
m_mangled.GetStringRef(), SwiftLanguageRuntime::eSimplified,
433+
sc);
433434
if (!demangled_std.empty()) {
434435
demangled.SetCString(demangled_std.c_str());
435436
display_cache->Insert(mangled, demangled);

lldb/source/Symbol/TypeSystemSwiftTypeRef.cpp

+69-17
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
#include "lldb/Symbol/SwiftASTContext.h"
1414

15+
#include "lldb/Symbol/CompileUnit.h"
1516
#include "lldb/Symbol/TypeList.h"
1617
#include "lldb/Symbol/TypeMap.h"
1718
#include "lldb/Target/SwiftLanguageRuntime.h"
@@ -385,13 +386,15 @@ GetNodeForPrinting(const std::string &m_description, lldb_private::Module &M,
385386
GetClangImporterFn get_clangimporter,
386387
swift::Demangle::Demangler &Dem,
387388
swift::Demangle::NodePointer node,
389+
bool resolve_objc_module,
388390
bool desugar = true) {
389391
if (!node)
390392
return node;
391393
using namespace swift::Demangle;
392394
auto getNodeForPrinting = [&](NodePointer node) -> NodePointer {
393395
return GetNodeForPrinting(m_description, M, get_apinotes_manager,
394-
get_clangimporter, Dem, node, desugar);
396+
get_clangimporter, Dem, node, resolve_objc_module,
397+
desugar);
395398
};
396399

397400
NodePointer canonical = nullptr;
@@ -415,13 +418,17 @@ GetNodeForPrinting(const std::string &m_description, lldb_private::Module &M,
415418
llvm::SmallVector<CompilerContext, 4> DeclCtx;
416419
clang_type->GetDeclContext(DeclCtx);
417420
StringRef toplevel_module;
418-
for (auto &Context : DeclCtx)
419-
if (Context.kind == CompilerContextKind::Module) {
420-
toplevel_module = Context.name.GetStringRef();
421+
if (resolve_objc_module) {
422+
for (auto &Context : DeclCtx)
423+
if (Context.kind == CompilerContextKind::Module) {
424+
toplevel_module = Context.name.GetStringRef();
425+
break;
426+
}
427+
if (toplevel_module.empty())
421428
break;
422-
}
423-
if (toplevel_module.empty())
424-
break;
429+
} else {
430+
toplevel_module = swift::MANGLING_MODULE_OBJC;
431+
}
425432

426433
// Create a new node with the Clang module instead of "__C".
427434
NodePointer renamed = Dem.createNode(kind);
@@ -630,13 +637,13 @@ static swift::Demangle::NodePointer GetDemangleTreeForPrinting(
630637
const std::string &m_description, lldb_private::Module *Module,
631638
GetAPINotesManagerFn get_apinotes_manager,
632639
GetClangImporterFn get_clangimporter, swift::Demangle::Demangler &Dem,
633-
const char *mangled_name) {
640+
const char *mangled_name, bool resolve_objc_module) {
634641
NodePointer node = Dem.demangleSymbol(mangled_name);
635642
if (!Module)
636643
return node;
637644
NodePointer canonical =
638645
GetNodeForPrinting(m_description, *Module, get_apinotes_manager,
639-
get_clangimporter, Dem, node);
646+
get_clangimporter, Dem, node, resolve_objc_module);
640647
return canonical;
641648
}
642649

@@ -742,9 +749,19 @@ template <typename T> bool Equivalent(T l, T r) { return l == r; }
742749
template <> bool Equivalent<CompilerType>(CompilerType l, CompilerType r) {
743750
return l.GetMangledTypeName() == r.GetMangledTypeName();
744751
} // namespace
745-
// This one is particularly taylored for GetName().
752+
/// This one is particularly taylored for GetTypeName() and
753+
/// GetDisplayTypeName().
754+
///
755+
/// String divergences are mostly cosmetic in nature and usually
756+
/// TypeSystemSwiftTypeRef is returning more accurate results. They only really
757+
/// matter for GetTypeName() and there only if there is a data formatter
758+
/// matching that name.
746759
template <> bool Equivalent<ConstString>(ConstString l, ConstString r) {
747760
if (l != r) {
761+
// Failure. Dump it for easier debugging.
762+
llvm::dbgs() << "TypeSystemSwiftTypeRef diverges from SwiftASTContext: "
763+
<< l.GetStringRef() << " != " << r.GetStringRef() << "\n";
764+
748765
// For some reason the Swift type dumper doesn't attach a module
749766
// name to the AnyObject protocol, and only that one.
750767
std::string l_prime = std::regex_replace(
@@ -757,8 +774,29 @@ template <> bool Equivalent<ConstString>(ConstString l, ConstString r) {
757774
r.GetStringRef().contains("__ObjC.") || r.GetStringRef().contains(" -> ()"))
758775
return true;
759776

760-
// Failure. Dump it for easier debugging.
761-
llvm::dbgs() << l.GetStringRef() << " != " << r.GetStringRef() << "\n";
777+
std::string r_prime =
778+
std::regex_replace(r.GetStringRef().str(), std::regex("NS"), "");
779+
if (l.GetStringRef() == llvm::StringRef(r_prime))
780+
return true;
781+
782+
// The way it is currently configured, ASTPrinter's always-qualify
783+
// mode is turned off. In this mode,
784+
// TypePrinter::shouldPrintFullyQualified() insists on never
785+
// printing qualifiers for types that come from Clang modules, but
786+
// the way this is implemented this rule also fires for types from
787+
// SDK overlays, which are technically Swift modules. Detecting
788+
// this in TypeSystemSwiftTypeRef is so complicated that it just
789+
// isn't worth the effort and we accept over-qualified types
790+
// instead. It would be best to just always qualify types not from
791+
// the current module.
792+
l_prime = std::regex_replace(
793+
l.GetStringRef().str(), std::regex("(CoreGraphics|Foundation|)\\."), "");
794+
if (llvm::StringRef(l_prime) == r.GetStringRef())
795+
return true;
796+
797+
#ifndef STRICT_VALIDATION
798+
return true;
799+
#endif
762800
}
763801
return l == r;
764802
}
@@ -1040,19 +1078,33 @@ ConstString TypeSystemSwiftTypeRef::GetTypeName(opaque_compiler_type_t type) {
10401078
return GetAPINotesManager(source, id);
10411079
},
10421080
[&]() { return m_swift_ast_context->GetClangImporter(); }, Dem,
1043-
AsMangledName(type));
1081+
AsMangledName(type), true);
10441082
std::string remangled = mangleNode(print_node);
1045-
bool simplified = false;
1046-
return ConstString(
1047-
SwiftLanguageRuntime::DemangleSymbolAsString(remangled, simplified));
1083+
return ConstString(SwiftLanguageRuntime::DemangleSymbolAsString(
1084+
remangled, SwiftLanguageRuntime::eTypeName));
10481085
};
10491086
VALIDATE_AND_RETURN(impl,
10501087
m_swift_ast_context->GetTypeName(ReconstructType(type)));
10511088
}
10521089
ConstString
10531090
TypeSystemSwiftTypeRef::GetDisplayTypeName(opaque_compiler_type_t type,
10541091
const SymbolContext *sc) {
1055-
return m_swift_ast_context->GetDisplayTypeName(ReconstructType(type), sc);
1092+
auto impl = [&]() {
1093+
using namespace swift::Demangle;
1094+
Demangler Dem;
1095+
NodePointer print_node = GetDemangleTreeForPrinting(
1096+
m_description, GetModule(),
1097+
[&](ClangExternalASTSourceCallbacks *source, unsigned id) {
1098+
return GetAPINotesManager(source, id);
1099+
},
1100+
[&]() { return m_swift_ast_context->GetClangImporter(); }, Dem,
1101+
AsMangledName(type), false);
1102+
std::string remangled = mangleNode(print_node);
1103+
return ConstString(SwiftLanguageRuntime::DemangleSymbolAsString(
1104+
remangled, SwiftLanguageRuntime::eDisplayTypeName, sc));
1105+
};
1106+
VALIDATE_AND_RETURN(
1107+
impl, m_swift_ast_context->GetDisplayTypeName(ReconstructType(type), sc));
10561108
}
10571109
uint32_t TypeSystemSwiftTypeRef::GetTypeInfo(
10581110
opaque_compiler_type_t type, CompilerType *pointee_or_element_clang_type) {

lldb/source/Target/SwiftLanguageRuntimeNames.cpp

+14-3
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "swift/Demangling/Demangle.h"
1717
#include "swift/Demangling/Demangler.h"
1818
#include "lldb/Symbol/Block.h"
19+
#include "lldb/Symbol/CompileUnit.h"
1920
#include "lldb/Symbol/VariableList.h"
2021
#include "lldb/Target/RegisterContext.h"
2122
#include "lldb/Target/ThreadPlanRunToAddress.h"
@@ -379,17 +380,27 @@ void SwiftLanguageRuntime::GetGenericParameterNamesForFunction(
379380
}
380381

381382
std::string
382-
SwiftLanguageRuntime::DemangleSymbolAsString(StringRef symbol, bool simplified,
383+
SwiftLanguageRuntime::DemangleSymbolAsString(StringRef symbol, DemangleMode mode,
383384
const SymbolContext *sc) {
384385
bool did_init = false;
385386
llvm::DenseMap<ArchetypePath, StringRef> dict;
386387
swift::Demangle::DemangleOptions options;
387-
if (simplified)
388+
switch (mode) {
389+
case eSimplified:
388390
options = swift::Demangle::DemangleOptions::SimplifiedUIDemangleOptions();
389-
else {
391+
break;
392+
case eTypeName:
390393
options.DisplayModuleNames = true;
391394
options.ShowPrivateDiscriminators = false;
392395
options.DisplayExtensionContexts = false;
396+
break;
397+
case eDisplayTypeName:
398+
options = swift::Demangle::DemangleOptions::SimplifiedUIDemangleOptions();
399+
options.DisplayStdlibModule = false;
400+
options.DisplayObjCModule = false;
401+
options.QualifyEntities = true;
402+
options.DisplayModuleNames = true;
403+
break;
393404
}
394405

395406
if (sc) {

0 commit comments

Comments
 (0)