[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
This commit is contained in:
Alex Langford 2019-07-01 20:36:33 +00:00
parent 975120a21b
commit d7fcee62f1
8 changed files with 36 additions and 47 deletions

View File

@ -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);

View File

@ -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) {}

View File

@ -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

View File

@ -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() {

View File

@ -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

View File

@ -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 {

View File

@ -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,

View File

@ -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) {