mirror of
https://github.com/intel/llvm.git
synced 2026-01-20 10:58:11 +08:00
the function it is being asked to step through, so that even if we get the trampoline target wrong (for instance) we will still not lose control. The other fix here is to tighten up the handling of the case where the current plan doesn't explain the stop, but a plan above us does. In that case, if the plan that does explain the stop says it is done, we need to clean up the plans below it and continue on with our processing. llvm-svn: 145740
75 lines
2.3 KiB
C++
75 lines
2.3 KiB
C++
//===-- ThreadPlanShouldStopHere.cpp ----------------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "lldb/Target/RegisterContext.h"
|
|
#include "lldb/Target/Thread.h"
|
|
#include "lldb/Target/ThreadPlanShouldStopHere.h"
|
|
#include "lldb/Core/Log.h"
|
|
|
|
using namespace lldb;
|
|
using namespace lldb_private;
|
|
|
|
// C Includes
|
|
// C++ Includes
|
|
// Other libraries and framework includes
|
|
// Project includes
|
|
|
|
//----------------------------------------------------------------------
|
|
// ThreadPlanShouldStopHere constructor
|
|
//----------------------------------------------------------------------
|
|
ThreadPlanShouldStopHere::ThreadPlanShouldStopHere(ThreadPlan *owner, ThreadPlanShouldStopHereCallback callback, void *baton) :
|
|
m_callback (callback),
|
|
m_baton (baton),
|
|
m_owner (owner),
|
|
m_flags (ThreadPlanShouldStopHere::eNone)
|
|
{
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
// Destructor
|
|
//----------------------------------------------------------------------
|
|
ThreadPlanShouldStopHere::~ThreadPlanShouldStopHere()
|
|
{
|
|
}
|
|
|
|
void
|
|
ThreadPlanShouldStopHere::SetShouldStopHereCallback (ThreadPlanShouldStopHereCallback callback, void *baton)
|
|
{
|
|
m_callback = callback;
|
|
m_baton = baton;
|
|
}
|
|
|
|
ThreadPlan *
|
|
ThreadPlanShouldStopHere::InvokeShouldStopHereCallback ()
|
|
{
|
|
if (m_callback)
|
|
{
|
|
ThreadPlan *return_plan = m_callback (m_owner, m_flags, m_baton);
|
|
LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP));
|
|
if (log)
|
|
{
|
|
lldb::addr_t current_addr = m_owner->GetThread().GetRegisterContext()->GetPC(0);
|
|
|
|
if (return_plan)
|
|
{
|
|
StreamString s;
|
|
return_plan->GetDescription (&s, lldb::eDescriptionLevelFull);
|
|
log->Printf ("ShouldStopHere callback found a step out plan from 0x%llx: %s.", current_addr, s.GetData());
|
|
}
|
|
else
|
|
{
|
|
log->Printf ("ShouldStopHere callback didn't find a step out plan from: 0x%llx.", current_addr);
|
|
}
|
|
}
|
|
return return_plan;
|
|
}
|
|
else
|
|
return NULL;
|
|
}
|