Skip to content

Commit 795e6fe

Browse files
committed
Implement TypeSystemSwiftTyperef::GetDisplayTypeName() (mostly NFC)
When the always-qualify mode is turned off, TyperPrinter::shouldPrintFullyQualified() insists on never printing qualifiers for types that come from Clang modules, but the way this is implemented this rule also fires for types from SDK overlays, which are technically Swift modules. Because of this the TypeSystemSwiftTyperef variant occasionally emits more-qualified names than the SwiftASTContext variant. Fixing this is so complex that it isn't worth the effort. It would be better to generally switch to a representation where all non-local types are always qualified. rdar://problem/63700540
1 parent 34a0333 commit 795e6fe

File tree

4 files changed

+75
-21
lines changed

4 files changed

+75
-21
lines changed

lldb/include/lldb/Target/SwiftLanguageRuntime.h

Lines changed: 2 additions & 1 deletion
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

Lines changed: 3 additions & 2 deletions
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

Lines changed: 56 additions & 15 deletions
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,7 +749,7 @@ 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 GetName() and GetDisplayName().
746753
template <> bool Equivalent<ConstString>(ConstString l, ConstString r) {
747754
if (l != r) {
748755
// For some reason the Swift type dumper doesn't attach a module
@@ -757,6 +764,26 @@ template <> bool Equivalent<ConstString>(ConstString l, ConstString r) {
757764
r.GetStringRef().contains("__ObjC.") || r.GetStringRef().contains(" -> ()"))
758765
return true;
759766

767+
std::string r_prime =
768+
std::regex_replace(r.GetStringRef().str(), std::regex("NS"), "");
769+
if (l.GetStringRef() == llvm::StringRef(r_prime))
770+
return true;
771+
772+
// The way it is currently configured, ASTPrinter's always-qualify
773+
// mode is turned off. In this mode,
774+
// TypePrinter::shouldPrintFullyQualified() insists on never
775+
// printing qualifiers for types that come from Clang modules, but
776+
// the way this is implemented this rule also fires for types from
777+
// SDK overlays, which are technically Swift modules. Detecting
778+
// this in TypeSystemSwiftTypeRef is so complicated that it just
779+
// isn't worth the effort and we accept over-qualified types
780+
// instead. It would be best to just always qualify types not from
781+
// the current module.
782+
l_prime = std::regex_replace(
783+
l.GetStringRef().str(), std::regex("(CoreGraphics|Foundation|)\\."), "");
784+
if (llvm::StringRef(l_prime) == r.GetStringRef())
785+
return true;
786+
760787
// Failure. Dump it for easier debugging.
761788
llvm::dbgs() << l.GetStringRef() << " != " << r.GetStringRef() << "\n";
762789
}
@@ -1040,19 +1067,33 @@ ConstString TypeSystemSwiftTypeRef::GetTypeName(opaque_compiler_type_t type) {
10401067
return GetAPINotesManager(source, id);
10411068
},
10421069
[&]() { return m_swift_ast_context->GetClangImporter(); }, Dem,
1043-
AsMangledName(type));
1070+
AsMangledName(type), true);
10441071
std::string remangled = mangleNode(print_node);
1045-
bool simplified = false;
1046-
return ConstString(
1047-
SwiftLanguageRuntime::DemangleSymbolAsString(remangled, simplified));
1072+
return ConstString(SwiftLanguageRuntime::DemangleSymbolAsString(
1073+
remangled, SwiftLanguageRuntime::eTypeName));
10481074
};
10491075
VALIDATE_AND_RETURN(impl,
10501076
m_swift_ast_context->GetTypeName(ReconstructType(type)));
10511077
}
10521078
ConstString
10531079
TypeSystemSwiftTypeRef::GetDisplayTypeName(opaque_compiler_type_t type,
10541080
const SymbolContext *sc) {
1055-
return m_swift_ast_context->GetDisplayTypeName(ReconstructType(type), sc);
1081+
auto impl = [&]() {
1082+
using namespace swift::Demangle;
1083+
Demangler Dem;
1084+
NodePointer print_node = GetDemangleTreeForPrinting(
1085+
m_description, GetModule(),
1086+
[&](ClangExternalASTSourceCallbacks *source, unsigned id) {
1087+
return GetAPINotesManager(source, id);
1088+
},
1089+
[&]() { return m_swift_ast_context->GetClangImporter(); }, Dem,
1090+
AsMangledName(type), false);
1091+
std::string remangled = mangleNode(print_node);
1092+
return ConstString(SwiftLanguageRuntime::DemangleSymbolAsString(
1093+
remangled, SwiftLanguageRuntime::eDisplayTypeName, sc));
1094+
};
1095+
VALIDATE_AND_RETURN(
1096+
impl, m_swift_ast_context->GetDisplayTypeName(ReconstructType(type), sc));
10561097
}
10571098
uint32_t TypeSystemSwiftTypeRef::GetTypeInfo(
10581099
opaque_compiler_type_t type, CompilerType *pointee_or_element_clang_type) {

lldb/source/Target/SwiftLanguageRuntimeNames.cpp

Lines changed: 14 additions & 3 deletions
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)