Home | History | Annotate | Download | only in Target
      1 //===-- ThreadPlanShouldStopHere.cpp ----------------------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #include "lldb/Target/RegisterContext.h"
     11 #include "lldb/Target/Thread.h"
     12 #include "lldb/Target/ThreadPlanShouldStopHere.h"
     13 #include "lldb/Core/Log.h"
     14 
     15 using namespace lldb;
     16 using namespace lldb_private;
     17 
     18 // C Includes
     19 // C++ Includes
     20 // Other libraries and framework includes
     21 // Project includes
     22 
     23 //----------------------------------------------------------------------
     24 // ThreadPlanShouldStopHere constructor
     25 //----------------------------------------------------------------------
     26 ThreadPlanShouldStopHere::ThreadPlanShouldStopHere(ThreadPlan *owner, ThreadPlanShouldStopHereCallback callback, void *baton) :
     27     m_callback (callback),
     28     m_baton (baton),
     29     m_owner (owner),
     30     m_flags (ThreadPlanShouldStopHere::eNone)
     31 {
     32 }
     33 
     34 //----------------------------------------------------------------------
     35 // Destructor
     36 //----------------------------------------------------------------------
     37 ThreadPlanShouldStopHere::~ThreadPlanShouldStopHere()
     38 {
     39 }
     40 
     41 void
     42 ThreadPlanShouldStopHere::SetShouldStopHereCallback (ThreadPlanShouldStopHereCallback callback, void *baton)
     43 {
     44     m_callback = callback;
     45     m_baton = baton;
     46 }
     47 
     48 ThreadPlanSP
     49 ThreadPlanShouldStopHere::InvokeShouldStopHereCallback ()
     50 {
     51     if (m_callback)
     52     {
     53         ThreadPlanSP return_plan_sp(m_callback (m_owner, m_flags, m_baton));
     54         Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP));
     55         if (log)
     56         {
     57             lldb::addr_t current_addr = m_owner->GetThread().GetRegisterContext()->GetPC(0);
     58 
     59             if (return_plan_sp)
     60             {
     61                 StreamString s;
     62                 return_plan_sp->GetDescription (&s, lldb::eDescriptionLevelFull);
     63                 log->Printf ("ShouldStopHere callback found a step out plan from 0x%" PRIx64 ": %s.", current_addr, s.GetData());
     64             }
     65             else
     66             {
     67                 log->Printf ("ShouldStopHere callback didn't find a step out plan from: 0x%" PRIx64 ".", current_addr);
     68             }
     69         }
     70         return return_plan_sp;
     71     }
     72     else
     73         return ThreadPlanSP();
     74 }
     75