From d7fcee62f114c5f96bc0d8430af40ce198231daa Mon Sep 17 00:00:00 2001 From: Alex Langford Date: Mon, 1 Jul 2019 20:36:33 +0000 Subject: [PATCH] [Core] Generalize ValueObject::IsRuntimeSupportValue Summary: Instead of falling back to ObjCLanguageRuntime, we should be falling back to every loaded language runtime. This makes ValueObject more language agnostic. Reviewers: labath, compnerd, JDevlieghere, davide Subscribers: lldb-commits Differential Revision: https://reviews.llvm.org/D63240 llvm-svn: 364845 --- lldb/include/lldb/Target/CPPLanguageRuntime.h | 2 +- lldb/include/lldb/Target/LanguageRuntime.h | 6 ++-- lldb/include/lldb/Target/ObjCLanguageRuntime.h | 3 +- lldb/source/Core/ValueObject.cpp | 32 ++++++++++++++-------- .../SymbolFile/DWARF/DWARFASTParserClang.cpp | 3 +- lldb/source/Symbol/Function.cpp | 8 ++++-- lldb/source/Target/CPPLanguageRuntime.cpp | 16 ++--------- lldb/source/Target/ObjCLanguageRuntime.cpp | 13 --------- 8 files changed, 36 insertions(+), 47 deletions(-) diff --git a/lldb/include/lldb/Target/CPPLanguageRuntime.h b/lldb/include/lldb/Target/CPPLanguageRuntime.h index 7d15ace..7b7d8ac 100644 --- a/lldb/include/lldb/Target/CPPLanguageRuntime.h +++ b/lldb/include/lldb/Target/CPPLanguageRuntime.h @@ -78,7 +78,7 @@ public: lldb::ThreadPlanSP GetStepThroughTrampolinePlan(Thread &thread, bool stop_others) override; - bool IsRuntimeSupportValue(ValueObject &valobj) override; + bool IsWhitelistedRuntimeValue(ConstString name) override; protected: // Classes that inherit from CPPLanguageRuntime can see and modify these CPPLanguageRuntime(Process *process); diff --git a/lldb/include/lldb/Target/LanguageRuntime.h b/lldb/include/lldb/Target/LanguageRuntime.h index 54be5a7..3521f46 100644 --- a/lldb/include/lldb/Target/LanguageRuntime.h +++ b/lldb/include/lldb/Target/LanguageRuntime.h @@ -152,9 +152,9 @@ public: virtual lldb::ThreadPlanSP GetStepThroughTrampolinePlan(Thread &thread, bool stop_others) = 0; - /// Identify whether a value is a language implementation detaul - /// that should be hidden from the user interface by default. - virtual bool IsRuntimeSupportValue(ValueObject &valobj) { return false; } + /// Identify whether a name is a runtime value that should not be hidden by + /// from the user interface. + virtual bool IsWhitelistedRuntimeValue(ConstString name) { return false; } virtual void ModulesDidLoad(const ModuleList &module_list) {} diff --git a/lldb/include/lldb/Target/ObjCLanguageRuntime.h b/lldb/include/lldb/Target/ObjCLanguageRuntime.h index 79737c9..1fc8744 100644 --- a/lldb/include/lldb/Target/ObjCLanguageRuntime.h +++ b/lldb/include/lldb/Target/ObjCLanguageRuntime.h @@ -301,8 +301,7 @@ public: /// Check whether the name is "self" or "_cmd" and should show up in /// "frame variable". - static bool IsWhitelistedRuntimeValue(ConstString name); - bool IsRuntimeSupportValue(ValueObject &valobj) override; + bool IsWhitelistedRuntimeValue(ConstString name) override; protected: // Classes that inherit from ObjCLanguageRuntime can see and modify these diff --git a/lldb/source/Core/ValueObject.cpp b/lldb/source/Core/ValueObject.cpp index 409f3d6..73cd133 100644 --- a/lldb/source/Core/ValueObject.cpp +++ b/lldb/source/Core/ValueObject.cpp @@ -1695,18 +1695,28 @@ bool ValueObject::IsPossibleDynamicType() { bool ValueObject::IsRuntimeSupportValue() { Process *process(GetProcessSP().get()); - if (process) { - LanguageRuntime *runtime = - process->GetLanguageRuntime(GetObjectRuntimeLanguage()); - if (!runtime) - runtime = ObjCLanguageRuntime::Get(*process); - if (runtime) - return runtime->IsRuntimeSupportValue(*this); - // If there is no language runtime, trust the compiler to mark all - // runtime support variables as artificial. - return GetVariable() && GetVariable()->IsArtificial(); + if (!process) + return false; + + // We trust the the compiler did the right thing and marked runtime support + // values as artificial. + if (!GetVariable() || !GetVariable()->IsArtificial()) + return false; + + LanguageType lang = eLanguageTypeUnknown; + if (auto *sym_ctx_scope = GetSymbolContextScope()) { + if (auto *func = sym_ctx_scope->CalculateSymbolContextFunction()) + lang = func->GetLanguage(); + else if (auto *comp_unit = + sym_ctx_scope->CalculateSymbolContextCompileUnit()) + lang = comp_unit->GetLanguage(); } - return false; + + if (auto *runtime = process->GetLanguageRuntime(lang)) + if (runtime->IsWhitelistedRuntimeValue(GetName())) + return false; + + return true; } bool ValueObject::IsNilReference() { diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp index 5a2de48..b85ab54 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp @@ -2371,7 +2371,8 @@ Function *DWARFASTParserClang::ParseFunctionFromDWARF(CompileUnit &comp_unit, func_name.SetValue(ConstString(mangled), true); else if ((die.GetParent().Tag() == DW_TAG_compile_unit || die.GetParent().Tag() == DW_TAG_partial_unit) && - Language::LanguageIsCPlusPlus(die.GetLanguage()) && name && + Language::LanguageIsCPlusPlus(die.GetLanguage()) && + !Language::LanguageIsObjC(die.GetLanguage()) && name && strcmp(name, "main") != 0) { // If the mangled name is not present in the DWARF, generate the // demangled name using the decl context. We skip if the function is diff --git a/lldb/source/Symbol/Function.cpp b/lldb/source/Symbol/Function.cpp index 83350e7..951392c 100644 --- a/lldb/source/Symbol/Function.cpp +++ b/lldb/source/Symbol/Function.cpp @@ -589,10 +589,14 @@ uint32_t Function::GetPrologueByteSize() { } lldb::LanguageType Function::GetLanguage() const { + lldb::LanguageType lang = m_mangled.GuessLanguage(); + if (lang != lldb::eLanguageTypeUnknown) + return lang; + if (m_comp_unit) return m_comp_unit->GetLanguage(); - else - return lldb::eLanguageTypeUnknown; + + return lldb::eLanguageTypeUnknown; } ConstString Function::GetName() const { diff --git a/lldb/source/Target/CPPLanguageRuntime.cpp b/lldb/source/Target/CPPLanguageRuntime.cpp index 8e503bd..e10a117 100644 --- a/lldb/source/Target/CPPLanguageRuntime.cpp +++ b/lldb/source/Target/CPPLanguageRuntime.cpp @@ -43,20 +43,8 @@ CPPLanguageRuntime::~CPPLanguageRuntime() {} CPPLanguageRuntime::CPPLanguageRuntime(Process *process) : LanguageRuntime(process) {} -bool CPPLanguageRuntime::IsRuntimeSupportValue(ValueObject &valobj) { - // All runtime support values have to be marked as artificial by the - // compiler. But not all artificial variables should be hidden from - // the user. - if (!valobj.GetVariable()) - return false; - if (!valobj.GetVariable()->IsArtificial()) - return false; - - // Whitelist "this" and since there is no ObjC++ runtime, any ObjC names. - ConstString name = valobj.GetName(); - if (name == g_this) - return false; - return !ObjCLanguageRuntime::IsWhitelistedRuntimeValue(name); +bool CPPLanguageRuntime::IsWhitelistedRuntimeValue(ConstString name) { + return name == g_this; } bool CPPLanguageRuntime::GetObjectDescription(Stream &str, diff --git a/lldb/source/Target/ObjCLanguageRuntime.cpp b/lldb/source/Target/ObjCLanguageRuntime.cpp index ef059a8..5e80098 100644 --- a/lldb/source/Target/ObjCLanguageRuntime.cpp +++ b/lldb/source/Target/ObjCLanguageRuntime.cpp @@ -46,19 +46,6 @@ bool ObjCLanguageRuntime::IsWhitelistedRuntimeValue(ConstString name) { return name == g_self || name == g_cmd; } -bool ObjCLanguageRuntime::IsRuntimeSupportValue(ValueObject &valobj) { - // All runtime support values have to be marked as artificial by the - // compiler. But not all artificial variables should be hidden from - // the user. - if (!valobj.GetVariable()) - return false; - if (!valobj.GetVariable()->IsArtificial()) - return false; - - // Whitelist "self" and "_cmd". - return !IsWhitelistedRuntimeValue(valobj.GetName()); -} - bool ObjCLanguageRuntime::AddClass(ObjCISA isa, const ClassDescriptorSP &descriptor_sp, const char *class_name) { -- 2.7.4