Skip to content

Commit

Permalink
[Target] Generalize language-specific behavior in ThreadPlanStepThrough
Browse files Browse the repository at this point in the history
Summary:
When creating a ThreadPlan to step through a trampoline, we ask the
ObjC language runtime and the CPP language runtime to come up with such a thread
plan if the dynamic loader fails to give us one. I don't see why this behavior
can't be language agnostic.

Differential Revision: https://reviews.llvm.org/D61921

llvm-svn: 362164
  • Loading branch information
bulbazord committed May 30, 2019
1 parent 365e592 commit e5a7a85
Show file tree
Hide file tree
Showing 4 changed files with 14 additions and 20 deletions.
2 changes: 1 addition & 1 deletion lldb/include/lldb/Target/CPPLanguageRuntime.h
Expand Up @@ -61,7 +61,7 @@ class CPPLanguageRuntime : public LanguageRuntime {
/// \return
/// A ThreadPlan Shared pointer
lldb::ThreadPlanSP GetStepThroughTrampolinePlan(Thread &thread,
bool stop_others);
bool stop_others) override;

bool IsRuntimeSupportValue(ValueObject &valobj) override;
protected:
Expand Down
3 changes: 3 additions & 0 deletions lldb/include/lldb/Target/LanguageRuntime.h
Expand Up @@ -143,6 +143,9 @@ class LanguageRuntime : public PluginInterface {
return false;
}

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; }
Expand Down
3 changes: 0 additions & 3 deletions lldb/include/lldb/Target/ObjCLanguageRuntime.h
Expand Up @@ -216,9 +216,6 @@ class ObjCLanguageRuntime : public LanguageRuntime {

virtual bool HasReadObjCLibrary() = 0;

virtual lldb::ThreadPlanSP GetStepThroughTrampolinePlan(Thread &thread,
bool stop_others) = 0;

lldb::addr_t LookupInMethodCache(lldb::addr_t class_addr, lldb::addr_t sel);

void AddToMethodCache(lldb::addr_t class_addr, lldb::addr_t sel,
Expand Down
26 changes: 10 additions & 16 deletions lldb/source/Target/ThreadPlanStepThrough.cpp
Expand Up @@ -8,9 +8,8 @@

#include "lldb/Target/ThreadPlanStepThrough.h"
#include "lldb/Breakpoint/Breakpoint.h"
#include "lldb/Target/CPPLanguageRuntime.h"
#include "lldb/Target/DynamicLoader.h"
#include "lldb/Target/ObjCLanguageRuntime.h"
#include "lldb/Target/LanguageRuntime.h"
#include "lldb/Target/Process.h"
#include "lldb/Target/RegisterContext.h"
#include "lldb/Target/Target.h"
Expand Down Expand Up @@ -85,22 +84,17 @@ void ThreadPlanStepThrough::LookForPlanToStepThroughFromCurrentPC() {
m_sub_plan_sp =
loader->GetStepThroughTrampolinePlan(m_thread, m_stop_others);

// If that didn't come up with anything, try the ObjC runtime plugin:
if (!m_sub_plan_sp.get()) {
ObjCLanguageRuntime *objc_runtime =
m_thread.GetProcess()->GetObjCLanguageRuntime();
if (objc_runtime)
// If the DynamicLoader was unable to provide us with a ThreadPlan, then we
// try the LanguageRuntimes.
if (!m_sub_plan_sp) {
for (LanguageRuntime *runtime :
m_thread.GetProcess()->GetLanguageRuntimes()) {
m_sub_plan_sp =
objc_runtime->GetStepThroughTrampolinePlan(m_thread, m_stop_others);

CPPLanguageRuntime *cpp_runtime =
m_thread.GetProcess()->GetCPPLanguageRuntime();
runtime->GetStepThroughTrampolinePlan(m_thread, m_stop_others);

// If the ObjC runtime did not provide us with a step though plan then if we
// have it check the C++ runtime for a step though plan.
if (!m_sub_plan_sp.get() && cpp_runtime)
m_sub_plan_sp =
cpp_runtime->GetStepThroughTrampolinePlan(m_thread, m_stop_others);
if (m_sub_plan_sp)
break;
}
}

Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_STEP));
Expand Down

0 comments on commit e5a7a85

Please sign in to comment.