forked from OSchip/llvm-project
[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:
parent
975120a21b
commit
d7fcee62f1
|
@ -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);
|
||||
|
|
|
@ -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) {}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in New Issue