130fdc8d8SChris Lattner //===-- ThreadPlanStepOverRange.cpp -----------------------------*- C++ -*-===// 230fdc8d8SChris Lattner // 330fdc8d8SChris Lattner // The LLVM Compiler Infrastructure 430fdc8d8SChris Lattner // 530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source 630fdc8d8SChris Lattner // License. See LICENSE.TXT for details. 730fdc8d8SChris Lattner // 830fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 930fdc8d8SChris Lattner 1030fdc8d8SChris Lattner #include "lldb/Target/ThreadPlanStepOverRange.h" 1130fdc8d8SChris Lattner 1230fdc8d8SChris Lattner // C Includes 1330fdc8d8SChris Lattner // C++ Includes 1430fdc8d8SChris Lattner // Other libraries and framework includes 1530fdc8d8SChris Lattner // Project includes 1630fdc8d8SChris Lattner 1730fdc8d8SChris Lattner #include "lldb/lldb-private-log.h" 1830fdc8d8SChris Lattner #include "lldb/Core/Log.h" 1930fdc8d8SChris Lattner #include "lldb/Core/Stream.h" 2030fdc8d8SChris Lattner #include "lldb/Target/Process.h" 2130fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h" 2230fdc8d8SChris Lattner #include "lldb/Target/Thread.h" 2330fdc8d8SChris Lattner #include "lldb/Target/ThreadPlanStepOut.h" 2430fdc8d8SChris Lattner #include "lldb/Target/ThreadPlanStepThrough.h" 2530fdc8d8SChris Lattner 2630fdc8d8SChris Lattner using namespace lldb_private; 2730fdc8d8SChris Lattner 2830fdc8d8SChris Lattner 2930fdc8d8SChris Lattner //---------------------------------------------------------------------- 3030fdc8d8SChris Lattner // ThreadPlanStepOverRange: Step through a stack range, either stepping over or into 3130fdc8d8SChris Lattner // based on the value of \a type. 3230fdc8d8SChris Lattner //---------------------------------------------------------------------- 3330fdc8d8SChris Lattner 3430fdc8d8SChris Lattner ThreadPlanStepOverRange::ThreadPlanStepOverRange 3530fdc8d8SChris Lattner ( 3630fdc8d8SChris Lattner Thread &thread, 3730fdc8d8SChris Lattner const AddressRange &range, 3830fdc8d8SChris Lattner const SymbolContext &addr_context, 3930fdc8d8SChris Lattner lldb::RunMode stop_others, 4030fdc8d8SChris Lattner bool okay_to_discard 4130fdc8d8SChris Lattner ) : 42*b01e742aSJim Ingham ThreadPlanStepRange (ThreadPlan::eKindStepOverRange, "Step range stepping over", thread, range, addr_context, stop_others) 4330fdc8d8SChris Lattner { 4430fdc8d8SChris Lattner SetOkayToDiscard (okay_to_discard); 4530fdc8d8SChris Lattner } 4630fdc8d8SChris Lattner 4730fdc8d8SChris Lattner ThreadPlanStepOverRange::~ThreadPlanStepOverRange () 4830fdc8d8SChris Lattner { 4930fdc8d8SChris Lattner } 5030fdc8d8SChris Lattner 5130fdc8d8SChris Lattner void 5230fdc8d8SChris Lattner ThreadPlanStepOverRange::GetDescription (Stream *s, lldb::DescriptionLevel level) 5330fdc8d8SChris Lattner { 5430fdc8d8SChris Lattner if (level == lldb::eDescriptionLevelBrief) 5530fdc8d8SChris Lattner s->Printf("step over"); 5630fdc8d8SChris Lattner else 5730fdc8d8SChris Lattner { 5830fdc8d8SChris Lattner s->Printf ("stepping through range (stepping over functions): "); 5930fdc8d8SChris Lattner m_address_range.Dump (s, &m_thread.GetProcess(), Address::DumpStyleLoadAddress); 6030fdc8d8SChris Lattner } 6130fdc8d8SChris Lattner } 6230fdc8d8SChris Lattner 6330fdc8d8SChris Lattner bool 6430fdc8d8SChris Lattner ThreadPlanStepOverRange::ShouldStop (Event *event_ptr) 6530fdc8d8SChris Lattner { 6630fdc8d8SChris Lattner Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP); 6730fdc8d8SChris Lattner 6830fdc8d8SChris Lattner if (log) 6930fdc8d8SChris Lattner { 7030fdc8d8SChris Lattner StreamString s; 7130fdc8d8SChris Lattner s.Address (m_thread.GetRegisterContext()->GetPC(), m_thread.GetProcess().GetAddressByteSize()); 7230fdc8d8SChris Lattner log->Printf("ThreadPlanStepOverRange reached %s.", s.GetData()); 7330fdc8d8SChris Lattner } 7430fdc8d8SChris Lattner 7530fdc8d8SChris Lattner // If we're still in the range, keep going. 7630fdc8d8SChris Lattner if (InRange()) 7730fdc8d8SChris Lattner return false; 7830fdc8d8SChris Lattner 7930fdc8d8SChris Lattner // If we're out of the range but in the same frame or in our caller's frame 8030fdc8d8SChris Lattner // then we should stop. 8130fdc8d8SChris Lattner // When stepping out we only step if we are forcing running one thread. 8230fdc8d8SChris Lattner bool stop_others; 8330fdc8d8SChris Lattner if (m_stop_others == lldb::eOnlyThisThread) 8430fdc8d8SChris Lattner stop_others = true; 8530fdc8d8SChris Lattner else 8630fdc8d8SChris Lattner stop_others = false; 8730fdc8d8SChris Lattner 8830fdc8d8SChris Lattner ThreadPlan* new_plan = NULL; 8930fdc8d8SChris Lattner 9030fdc8d8SChris Lattner if (FrameIsOlder()) 9130fdc8d8SChris Lattner return true; 9230fdc8d8SChris Lattner else if (FrameIsYounger()) 9330fdc8d8SChris Lattner { 9430fdc8d8SChris Lattner new_plan = m_thread.QueueThreadPlanForStepOut (false, NULL, true, stop_others, lldb::eVoteNo, lldb::eVoteNoOpinion); 9530fdc8d8SChris Lattner } 9630fdc8d8SChris Lattner else if (!InSymbol()) 9730fdc8d8SChris Lattner { 9830fdc8d8SChris Lattner // This one is a little tricky. Sometimes we may be in a stub or something similar, 9930fdc8d8SChris Lattner // in which case we need to get out of there. But if we are in a stub then it's 10030fdc8d8SChris Lattner // likely going to be hard to get out from here. It is probably easiest to step into the 10130fdc8d8SChris Lattner // stub, and then it will be straight-forward to step out. 10230fdc8d8SChris Lattner new_plan = m_thread.QueueThreadPlanForStepThrough (false, stop_others); 10330fdc8d8SChris Lattner } 10430fdc8d8SChris Lattner 10530fdc8d8SChris Lattner if (new_plan == NULL) 10630fdc8d8SChris Lattner m_no_more_plans = true; 10730fdc8d8SChris Lattner else 10830fdc8d8SChris Lattner m_no_more_plans = false; 10930fdc8d8SChris Lattner 11030fdc8d8SChris Lattner if (new_plan == NULL) 11130fdc8d8SChris Lattner { 11230fdc8d8SChris Lattner // For efficiencies sake, we know we're done here so we don't have to do this 11330fdc8d8SChris Lattner // calculation again in MischiefManaged. 11430fdc8d8SChris Lattner SetPlanComplete(); 11530fdc8d8SChris Lattner return true; 11630fdc8d8SChris Lattner } 11730fdc8d8SChris Lattner else 11830fdc8d8SChris Lattner return false; 11930fdc8d8SChris Lattner } 120