124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- ThreadPlanStepRange.cpp ---------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ThreadPlanStepRange.h" 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private-log.h" 183aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham#include "lldb/Breakpoint/BreakpointLocation.h" 193aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham#include "lldb/Breakpoint/BreakpointSite.h" 20b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham#include "lldb/Core/Disassembler.h" 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Log.h" 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Stream.h" 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Function.h" 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Symbol.h" 25b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham#include "lldb/Target/ExecutionContext.h" 26643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton#include "lldb/Target/Process.h" 27643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton#include "lldb/Target/RegisterContext.h" 28643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton#include "lldb/Target/StopInfo.h" 29b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham#include "lldb/Target/Target.h" 30643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton#include "lldb/Target/Thread.h" 31b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham#include "lldb/Target/ThreadPlanRunToAddress.h" 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ThreadPlanStepRange: Step through a stack range, either stepping over or into 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// based on the value of \a type. 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 428af1bb72680cb0e90d15341a38f0714f1c16139dJim InghamThreadPlanStepRange::ThreadPlanStepRange (ThreadPlanKind kind, 438af1bb72680cb0e90d15341a38f0714f1c16139dJim Ingham const char *name, 448af1bb72680cb0e90d15341a38f0714f1c16139dJim Ingham Thread &thread, 458af1bb72680cb0e90d15341a38f0714f1c16139dJim Ingham const AddressRange &range, 468af1bb72680cb0e90d15341a38f0714f1c16139dJim Ingham const SymbolContext &addr_context, 478af1bb72680cb0e90d15341a38f0714f1c16139dJim Ingham lldb::RunMode stop_others) : 485b668b5a3437be4066234d08ab99749897ed8d74Jim Ingham ThreadPlan (kind, name, thread, eVoteNoOpinion, eVoteNoOpinion), 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_addr_context (addr_context), 5076e55f722acc41f6eaf35a7f988090f97b2c82e0Jim Ingham m_address_ranges (), 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_stop_others (stop_others), 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_stack_id (), 5354e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton m_no_more_plans (false), 543aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham m_first_run_event (true), 553aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham m_use_fast_step(false) 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 574097bef16c98898ec7eb9c40de8286be2fb30a9dJason Molenda m_use_fast_step = GetTarget().GetUseFastStepping(); 5876e55f722acc41f6eaf35a7f988090f97b2c82e0Jim Ingham AddRange(range); 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_stack_id = m_thread.GetStackFrameAtIndex(0)->GetStackID(); 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanStepRange::~ThreadPlanStepRange () 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 64b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham ClearNextBranchBreakpoint(); 65bc16b9273326b81dc4aae022389a9f8c3bdca66dJim Ingham 66bc16b9273326b81dc4aae022389a9f8c3bdca66dJim Ingham size_t num_instruction_ranges = m_instruction_ranges.size(); 67bc16b9273326b81dc4aae022389a9f8c3bdca66dJim Ingham 68bc16b9273326b81dc4aae022389a9f8c3bdca66dJim Ingham // FIXME: The DisassemblerLLVMC has a reference cycle and won't go away if it has any active instructions. 69bc16b9273326b81dc4aae022389a9f8c3bdca66dJim Ingham // I'll fix that but for now, just clear the list and it will go away nicely. 70bc16b9273326b81dc4aae022389a9f8c3bdca66dJim Ingham for (size_t i = 0; i < num_instruction_ranges; i++) 71bc16b9273326b81dc4aae022389a9f8c3bdca66dJim Ingham { 72bc16b9273326b81dc4aae022389a9f8c3bdca66dJim Ingham if (m_instruction_ranges[i]) 73bc16b9273326b81dc4aae022389a9f8c3bdca66dJim Ingham m_instruction_ranges[i]->GetInstructionList().Clear(); 74bc16b9273326b81dc4aae022389a9f8c3bdca66dJim Ingham } 75b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham} 76b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham 77b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Inghamvoid 78b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim InghamThreadPlanStepRange::DidPush () 79b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham{ 80b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham // See if we can find a "next range" breakpoint: 81b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham SetNextBranchBreakpoint(); 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanStepRange::ValidatePlan (Stream *error) 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerVote 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanStepRange::ShouldReportStop (Event *event_ptr) 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 93952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP)); 945205f0b6585a127acc6ed210021abb6091220a89Greg Clayton 955205f0b6585a127acc6ed210021abb6091220a89Greg Clayton const Vote vote = IsPlanComplete() ? eVoteYes : eVoteNo; 965205f0b6585a127acc6ed210021abb6091220a89Greg Clayton if (log) 97590cce3c99c1a90e76bce9ababe46079bda149c5Greg Clayton log->Printf ("ThreadPlanStepRange::ShouldReportStop() returning vote %i\n", vote); 985205f0b6585a127acc6ed210021abb6091220a89Greg Clayton return vote; 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10176e55f722acc41f6eaf35a7f988090f97b2c82e0Jim Inghamvoid 10276e55f722acc41f6eaf35a7f988090f97b2c82e0Jim InghamThreadPlanStepRange::AddRange(const AddressRange &new_range) 10376e55f722acc41f6eaf35a7f988090f97b2c82e0Jim Ingham{ 10476e55f722acc41f6eaf35a7f988090f97b2c82e0Jim Ingham // For now I'm just adding the ranges. At some point we may want to 10576e55f722acc41f6eaf35a7f988090f97b2c82e0Jim Ingham // condense the ranges if they overlap, though I don't think it is likely 10676e55f722acc41f6eaf35a7f988090f97b2c82e0Jim Ingham // to be very important. 10776e55f722acc41f6eaf35a7f988090f97b2c82e0Jim Ingham m_address_ranges.push_back (new_range); 108bc16b9273326b81dc4aae022389a9f8c3bdca66dJim Ingham 109bc16b9273326b81dc4aae022389a9f8c3bdca66dJim Ingham // Fill the slot for this address range with an empty DisassemblerSP in the instruction ranges. I want the 110bc16b9273326b81dc4aae022389a9f8c3bdca66dJim Ingham // indices to match, but I don't want to do the work to disassemble this range if I don't step into it. 111b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham m_instruction_ranges.push_back (DisassemblerSP()); 11276e55f722acc41f6eaf35a7f988090f97b2c82e0Jim Ingham} 11376e55f722acc41f6eaf35a7f988090f97b2c82e0Jim Ingham 11476e55f722acc41f6eaf35a7f988090f97b2c82e0Jim Inghamvoid 11576e55f722acc41f6eaf35a7f988090f97b2c82e0Jim InghamThreadPlanStepRange::DumpRanges(Stream *s) 11676e55f722acc41f6eaf35a7f988090f97b2c82e0Jim Ingham{ 11776e55f722acc41f6eaf35a7f988090f97b2c82e0Jim Ingham size_t num_ranges = m_address_ranges.size(); 11876e55f722acc41f6eaf35a7f988090f97b2c82e0Jim Ingham if (num_ranges == 1) 11976e55f722acc41f6eaf35a7f988090f97b2c82e0Jim Ingham { 120f4124deeb9532044a38c0774ced872f2709347daGreg Clayton m_address_ranges[0].Dump (s, m_thread.CalculateTarget().get(), Address::DumpStyleLoadAddress); 12176e55f722acc41f6eaf35a7f988090f97b2c82e0Jim Ingham } 12276e55f722acc41f6eaf35a7f988090f97b2c82e0Jim Ingham else 12376e55f722acc41f6eaf35a7f988090f97b2c82e0Jim Ingham { 12476e55f722acc41f6eaf35a7f988090f97b2c82e0Jim Ingham for (size_t i = 0; i < num_ranges; i++) 12576e55f722acc41f6eaf35a7f988090f97b2c82e0Jim Ingham { 12676e55f722acc41f6eaf35a7f988090f97b2c82e0Jim Ingham s->PutCString("%d: "); 127f4124deeb9532044a38c0774ced872f2709347daGreg Clayton m_address_ranges[i].Dump (s, m_thread.CalculateTarget().get(), Address::DumpStyleLoadAddress); 12876e55f722acc41f6eaf35a7f988090f97b2c82e0Jim Ingham } 12976e55f722acc41f6eaf35a7f988090f97b2c82e0Jim Ingham } 13076e55f722acc41f6eaf35a7f988090f97b2c82e0Jim Ingham} 13176e55f722acc41f6eaf35a7f988090f97b2c82e0Jim Ingham 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanStepRange::InRange () 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 135952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP)); 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool ret_value = false; 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::addr_t pc_load_addr = m_thread.GetRegisterContext()->GetPC(); 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14076e55f722acc41f6eaf35a7f988090f97b2c82e0Jim Ingham size_t num_ranges = m_address_ranges.size(); 14176e55f722acc41f6eaf35a7f988090f97b2c82e0Jim Ingham for (size_t i = 0; i < num_ranges; i++) 14276e55f722acc41f6eaf35a7f988090f97b2c82e0Jim Ingham { 143f4124deeb9532044a38c0774ced872f2709347daGreg Clayton ret_value = m_address_ranges[i].ContainsLoadAddress(pc_load_addr, m_thread.CalculateTarget().get()); 14476e55f722acc41f6eaf35a7f988090f97b2c82e0Jim Ingham if (ret_value) 14576e55f722acc41f6eaf35a7f988090f97b2c82e0Jim Ingham break; 14676e55f722acc41f6eaf35a7f988090f97b2c82e0Jim Ingham } 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!ret_value) 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // See if we've just stepped to another part of the same line number... 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StackFrame *frame = m_thread.GetStackFrameAtIndex(0).get(); 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContext new_context(frame->GetSymbolContext(eSymbolContextEverything)); 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_addr_context.line_entry.IsValid() && new_context.line_entry.IsValid()) 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1560f4d0f392fbcd4d2a8b06b2f048ad842d92ee834Jim Ingham if (m_addr_context.line_entry.file == new_context.line_entry.file) 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1580f4d0f392fbcd4d2a8b06b2f048ad842d92ee834Jim Ingham if (m_addr_context.line_entry.line == new_context.line_entry.line) 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1600f4d0f392fbcd4d2a8b06b2f048ad842d92ee834Jim Ingham m_addr_context = new_context; 16176e55f722acc41f6eaf35a7f988090f97b2c82e0Jim Ingham AddRange(m_addr_context.line_entry.range); 1620f4d0f392fbcd4d2a8b06b2f048ad842d92ee834Jim Ingham ret_value = true; 1630f4d0f392fbcd4d2a8b06b2f048ad842d92ee834Jim Ingham if (log) 1640f4d0f392fbcd4d2a8b06b2f048ad842d92ee834Jim Ingham { 1650f4d0f392fbcd4d2a8b06b2f048ad842d92ee834Jim Ingham StreamString s; 16669f834fc45d92c3edd5350a0a2c090952a981f67Jim Ingham m_addr_context.line_entry.Dump (&s, 16769f834fc45d92c3edd5350a0a2c090952a981f67Jim Ingham m_thread.CalculateTarget().get(), 16869f834fc45d92c3edd5350a0a2c090952a981f67Jim Ingham true, 16969f834fc45d92c3edd5350a0a2c090952a981f67Jim Ingham Address::DumpStyleLoadAddress, 17069f834fc45d92c3edd5350a0a2c090952a981f67Jim Ingham Address::DumpStyleLoadAddress, 17169f834fc45d92c3edd5350a0a2c090952a981f67Jim Ingham true); 1720f4d0f392fbcd4d2a8b06b2f048ad842d92ee834Jim Ingham 1730f4d0f392fbcd4d2a8b06b2f048ad842d92ee834Jim Ingham log->Printf ("Step range plan stepped to another range of same line: %s", s.GetData()); 1740f4d0f392fbcd4d2a8b06b2f048ad842d92ee834Jim Ingham } 1750f4d0f392fbcd4d2a8b06b2f048ad842d92ee834Jim Ingham } 176f4124deeb9532044a38c0774ced872f2709347daGreg Clayton else if (new_context.line_entry.range.GetBaseAddress().GetLoadAddress(m_thread.CalculateTarget().get()) 1770f4d0f392fbcd4d2a8b06b2f048ad842d92ee834Jim Ingham != pc_load_addr) 1780f4d0f392fbcd4d2a8b06b2f048ad842d92ee834Jim Ingham { 1790f4d0f392fbcd4d2a8b06b2f048ad842d92ee834Jim Ingham // Another thing that sometimes happens here is that we step out of one line into the MIDDLE of another 1800f4d0f392fbcd4d2a8b06b2f048ad842d92ee834Jim Ingham // line. So far I mostly see this due to bugs in the debug information. 1810f4d0f392fbcd4d2a8b06b2f048ad842d92ee834Jim Ingham // But we probably don't want to be in the middle of a line range, so in that case reset the stepping 1820f4d0f392fbcd4d2a8b06b2f048ad842d92ee834Jim Ingham // range to the line we've stepped into the middle of and continue. 1830f4d0f392fbcd4d2a8b06b2f048ad842d92ee834Jim Ingham m_addr_context = new_context; 18476e55f722acc41f6eaf35a7f988090f97b2c82e0Jim Ingham m_address_ranges.clear(); 18576e55f722acc41f6eaf35a7f988090f97b2c82e0Jim Ingham AddRange(m_addr_context.line_entry.range); 1860f4d0f392fbcd4d2a8b06b2f048ad842d92ee834Jim Ingham ret_value = true; 1870f4d0f392fbcd4d2a8b06b2f048ad842d92ee834Jim Ingham if (log) 1880f4d0f392fbcd4d2a8b06b2f048ad842d92ee834Jim Ingham { 1890f4d0f392fbcd4d2a8b06b2f048ad842d92ee834Jim Ingham StreamString s; 19069f834fc45d92c3edd5350a0a2c090952a981f67Jim Ingham m_addr_context.line_entry.Dump (&s, 19169f834fc45d92c3edd5350a0a2c090952a981f67Jim Ingham m_thread.CalculateTarget().get(), 19269f834fc45d92c3edd5350a0a2c090952a981f67Jim Ingham true, 19369f834fc45d92c3edd5350a0a2c090952a981f67Jim Ingham Address::DumpStyleLoadAddress, 19469f834fc45d92c3edd5350a0a2c090952a981f67Jim Ingham Address::DumpStyleLoadAddress, 19569f834fc45d92c3edd5350a0a2c090952a981f67Jim Ingham true); 1960f4d0f392fbcd4d2a8b06b2f048ad842d92ee834Jim Ingham 1970f4d0f392fbcd4d2a8b06b2f048ad842d92ee834Jim Ingham log->Printf ("Step range plan stepped to the middle of new line(%d): %s, continuing to clear this line.", 1980f4d0f392fbcd4d2a8b06b2f048ad842d92ee834Jim Ingham new_context.line_entry.line, 1990f4d0f392fbcd4d2a8b06b2f048ad842d92ee834Jim Ingham s.GetData()); 2000f4d0f392fbcd4d2a8b06b2f048ad842d92ee834Jim Ingham } 2010f4d0f392fbcd4d2a8b06b2f048ad842d92ee834Jim Ingham 20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 2040f4d0f392fbcd4d2a8b06b2f048ad842d92ee834Jim Ingham 20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!ret_value && log) 2105f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf ("Step range plan out of range to 0x%" PRIx64, pc_load_addr); 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ret_value; 21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanStepRange::InSymbol() 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::addr_t cur_pc = m_thread.GetRegisterContext()->GetPC(); 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_addr_context.function != NULL) 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 221f4124deeb9532044a38c0774ced872f2709347daGreg Clayton return m_addr_context.function->GetAddressRange().ContainsLoadAddress (cur_pc, m_thread.CalculateTarget().get()); 22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 2230c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton else if (m_addr_context.symbol) 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2250c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton AddressRange range(m_addr_context.symbol->GetAddress(), m_addr_context.symbol->GetByteSize()); 2260c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton return range.ContainsLoadAddress (cur_pc, m_thread.CalculateTarget().get()); 22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// FIXME: This should also handle inlining if we aren't going to do inlining in the 23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// main stack. 23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Ideally we should remember the whole stack frame list, and then compare that 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// to the current list. 23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 237441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Inghamlldb::FrameComparison 238441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim InghamThreadPlanStepRange::CompareCurrentFrameToStartFrame() 23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 240441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham FrameComparison frame_order; 2410e81b6475a71b32d1edf30a26487c003cc308bf3Jim Ingham 242441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham StackID cur_frame_id = m_thread.GetStackFrameAtIndex(0)->GetStackID(); 2430e81b6475a71b32d1edf30a26487c003cc308bf3Jim Ingham 244441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham if (cur_frame_id == m_stack_id) 24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 246441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham frame_order = eFrameCompareEqual; 24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 248441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham else if (cur_frame_id < m_stack_id) 24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 250441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham frame_order = eFrameCompareYounger; 25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 254441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham frame_order = eFrameCompareOlder; 25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 256441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham return frame_order; 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanStepRange::StopOthers () 26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_stop_others == lldb::eOnlyThisThread 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner || m_stop_others == lldb::eOnlyDuringStepping) 26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 269b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim InghamInstructionList * 270b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim InghamThreadPlanStepRange::GetInstructionsForAddress(lldb::addr_t addr, size_t &range_index, size_t &insn_offset) 271b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham{ 272b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham size_t num_ranges = m_address_ranges.size(); 273b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham for (size_t i = 0; i < num_ranges; i++) 274b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham { 275b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham if (m_address_ranges[i].ContainsLoadAddress(addr, &GetTarget())) 276b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham { 277b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham // Some joker added a zero size range to the stepping range... 278b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham if (m_address_ranges[i].GetByteSize() == 0) 279b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham return NULL; 280b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham 281b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham if (!m_instruction_ranges[i]) 282b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham { 283b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham //Disassemble the address range given: 284b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham ExecutionContext exe_ctx (m_thread.GetProcess()); 2857d4083837c5a258375fdc185d464b4ed15759a4bJim Ingham const char *plugin_name = NULL; 2867d4083837c5a258375fdc185d464b4ed15759a4bJim Ingham const char *flavor = NULL; 287b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham m_instruction_ranges[i] = Disassembler::DisassembleRange(GetTarget().GetArchitecture(), 2887d4083837c5a258375fdc185d464b4ed15759a4bJim Ingham plugin_name, 2897d4083837c5a258375fdc185d464b4ed15759a4bJim Ingham flavor, 290b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham exe_ctx, 291b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham m_address_ranges[i]); 292b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham 293b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham } 294b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham if (!m_instruction_ranges[i]) 295b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham return NULL; 296b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham else 297b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham { 298b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham // Find where we are in the instruction list as well. If we aren't at an instruction, 299b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham // return NULL. In this case, we're probably lost, and shouldn't try to do anything fancy. 300b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham 301b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham insn_offset = m_instruction_ranges[i]->GetInstructionList().GetIndexOfInstructionAtLoadAddress(addr, GetTarget()); 302b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham if (insn_offset == UINT32_MAX) 303b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham return NULL; 304b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham else 305b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham { 306b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham range_index = i; 307b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham return &m_instruction_ranges[i]->GetInstructionList(); 308b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham } 309b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham } 310b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham } 311b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham } 312b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham return NULL; 313b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham} 314b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham 315b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Inghamvoid 316b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim InghamThreadPlanStepRange::ClearNextBranchBreakpoint() 317b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham{ 318b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham if (m_next_branch_bp_sp) 319b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham { 320952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP)); 3213aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham if (log) 3223aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham log->Printf ("Removing next branch breakpoint: %d.", m_next_branch_bp_sp->GetID()); 323b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham GetTarget().RemoveBreakpointByID (m_next_branch_bp_sp->GetID()); 324b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham m_next_branch_bp_sp.reset(); 325b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham } 326b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham} 327b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham 328b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Inghambool 329b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim InghamThreadPlanStepRange::SetNextBranchBreakpoint () 330b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham{ 3313aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham if (m_next_branch_bp_sp) 3323aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham return true; 3333aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham 334952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP)); 335b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham // Stepping through ranges using breakpoints doesn't work yet, but with this off we fall back to instruction 336b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham // single stepping. 3373aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham if (!m_use_fast_step) 3383aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham return false; 3393aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham 340b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham lldb::addr_t cur_addr = GetThread().GetRegisterContext()->GetPC(); 341b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham // Find the current address in our address ranges, and fetch the disassembly if we haven't already: 342b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham size_t pc_index; 343b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham size_t range_index; 344b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham InstructionList *instructions = GetInstructionsForAddress (cur_addr, range_index, pc_index); 345b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham if (instructions == NULL) 346b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham return false; 347b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham else 348b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham { 349b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham uint32_t branch_index; 350b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham branch_index = instructions->GetIndexOfNextBranchInstruction (pc_index); 351b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham 352b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham Address run_to_address; 353b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham 354b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham // If we didn't find a branch, run to the end of the range. 355b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham if (branch_index == UINT32_MAX) 356b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham { 3573aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham branch_index = instructions->GetSize() - 1; 358b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham } 3593aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham 360b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham if (branch_index - pc_index > 1) 361b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham { 362b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham const bool is_internal = true; 363b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham run_to_address = instructions->GetInstructionAtIndex(branch_index)->GetAddress(); 364b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham m_next_branch_bp_sp = GetTarget().CreateBreakpoint(run_to_address, is_internal); 365090f83176695d86197b0e86b67dee4160ec5003dJim Ingham if (m_next_branch_bp_sp) 366090f83176695d86197b0e86b67dee4160ec5003dJim Ingham { 3673aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham if (log) 3683aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham { 3693aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham lldb::break_id_t bp_site_id = LLDB_INVALID_BREAK_ID; 3703aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham BreakpointLocationSP bp_loc = m_next_branch_bp_sp->GetLocationAtIndex(0); 3713aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham if (bp_loc) 3723aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham { 3733aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham BreakpointSiteSP bp_site = bp_loc->GetBreakpointSite(); 3743aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham if (bp_site) 3753aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham { 3763aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham bp_site_id = bp_site->GetID(); 3773aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham } 3783aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham } 3793aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham log->Printf ("ThreadPlanStepRange::SetNextBranchBreakpoint - Setting breakpoint %d (site %d) to run to address 0x%" PRIx64, 3803aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham m_next_branch_bp_sp->GetID(), 3813aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham bp_site_id, 3823aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham run_to_address.GetLoadAddress(&m_thread.GetProcess()->GetTarget())); 3833aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham } 384090f83176695d86197b0e86b67dee4160ec5003dJim Ingham m_next_branch_bp_sp->SetThreadID(m_thread.GetID()); 385090f83176695d86197b0e86b67dee4160ec5003dJim Ingham m_next_branch_bp_sp->SetBreakpointKind ("next-branch-location"); 3863aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham return true; 387090f83176695d86197b0e86b67dee4160ec5003dJim Ingham } 388090f83176695d86197b0e86b67dee4160ec5003dJim Ingham else 389090f83176695d86197b0e86b67dee4160ec5003dJim Ingham return false; 390b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham } 391b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham } 392b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham return false; 393b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham} 394b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham 395b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Inghambool 396b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim InghamThreadPlanStepRange::NextRangeBreakpointExplainsStop (lldb::StopInfoSP stop_info_sp) 397b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham{ 398952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP)); 399b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham if (!m_next_branch_bp_sp) 400b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham return false; 401b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham 402b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham break_id_t bp_site_id = stop_info_sp->GetValue(); 403b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham BreakpointSiteSP bp_site_sp = m_thread.GetProcess()->GetBreakpointSiteList().FindByID(bp_site_id); 4043aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham if (!bp_site_sp) 4053aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham return false; 4063aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham else if (!bp_site_sp->IsBreakpointAtThisSite (m_next_branch_bp_sp->GetID())) 407b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham return false; 408b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham else 4093aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham { 4103aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham // If we've hit the next branch breakpoint, then clear it. 4113aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham size_t num_owners = bp_site_sp->GetNumberOfOwners(); 4123aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham bool explains_stop = true; 4133aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham // If all the owners are internal, then we are probably just stepping over this range from multiple threads, 4143aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham // or multiple frames, so we want to continue. If one is not internal, then we should not explain the stop, 4153aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham // and let the user breakpoint handle the stop. 4163aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham for (size_t i = 0; i < num_owners; i++) 4173aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham { 4183aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham if (!bp_site_sp->GetOwnerAtIndex(i)->GetBreakpoint().IsInternal()) 4193aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham { 4203aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham explains_stop = false; 4213aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham break; 4223aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham } 4233aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham } 4243aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham if (log) 4253aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham log->Printf ("ThreadPlanStepRange::NextRangeBreakpointExplainsStop - Hit next range breakpoint which has %zu owners - explains stop: %u.", 4263aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham num_owners, 4273aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham explains_stop); 4283aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham ClearNextBranchBreakpoint(); 4293aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham return explains_stop; 4303aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham } 431b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham} 432b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham 433b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Inghambool 43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanStepRange::WillStop () 43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 440745ac7a5826fe7c392007941a4046bfb1a8dff81Jim InghamThreadPlanStepRange::GetPlanRunState () 44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 442b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham if (m_next_branch_bp_sp) 443b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham return eStateRunning; 444b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham else 445b2cf58a817f6c0d15b2077316810c17d9c8ac173Jim Ingham return eStateStepping; 44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanStepRange::MischiefManaged () 45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 45169f834fc45d92c3edd5350a0a2c090952a981f67Jim Ingham // If we have pushed some plans between ShouldStop & MischiefManaged, then we're not done... 45269f834fc45d92c3edd5350a0a2c090952a981f67Jim Ingham // I do this check first because we might have stepped somewhere that will fool InRange into 45369f834fc45d92c3edd5350a0a2c090952a981f67Jim Ingham // thinking it needs to step past the end of that line. This happens, for instance, when stepping 45469f834fc45d92c3edd5350a0a2c090952a981f67Jim Ingham // over inlined code that is in the middle of the current line. 45569f834fc45d92c3edd5350a0a2c090952a981f67Jim Ingham 45669f834fc45d92c3edd5350a0a2c090952a981f67Jim Ingham if (!m_no_more_plans) 45769f834fc45d92c3edd5350a0a2c090952a981f67Jim Ingham return false; 45869f834fc45d92c3edd5350a0a2c090952a981f67Jim Ingham 45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool done = true; 46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!IsPlanComplete()) 46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (InRange()) 46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner done = false; 46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 466441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham else 46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 468441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham FrameComparison frame_order = CompareCurrentFrameToStartFrame(); 469441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham if (frame_order != eFrameCompareOlder) 470441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham { 471441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham if (m_no_more_plans) 472441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham done = true; 473441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham else 474441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham done = false; 475441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham } 47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 477441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham done = true; 47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (done) 48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 483952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP)); 48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf("Completed step through range plan."); 4863aaa2c2d1ff6e944d02f3692525c25058b41db21Jim Ingham ClearNextBranchBreakpoint(); 48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ThreadPlan::MischiefManaged (); 48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 49688e3de205708f14431559072ca258899b5ac31ccJim Ingham 49788e3de205708f14431559072ca258899b5ac31ccJim Inghambool 49888e3de205708f14431559072ca258899b5ac31ccJim InghamThreadPlanStepRange::IsPlanStale () 49988e3de205708f14431559072ca258899b5ac31ccJim Ingham{ 500952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP)); 50188e3de205708f14431559072ca258899b5ac31ccJim Ingham FrameComparison frame_order = CompareCurrentFrameToStartFrame(); 50288e3de205708f14431559072ca258899b5ac31ccJim Ingham 50388e3de205708f14431559072ca258899b5ac31ccJim Ingham if (frame_order == eFrameCompareOlder) 50488e3de205708f14431559072ca258899b5ac31ccJim Ingham { 50588e3de205708f14431559072ca258899b5ac31ccJim Ingham if (log) 50688e3de205708f14431559072ca258899b5ac31ccJim Ingham { 50788e3de205708f14431559072ca258899b5ac31ccJim Ingham log->Printf("ThreadPlanStepRange::IsPlanStale returning true, we've stepped out."); 50888e3de205708f14431559072ca258899b5ac31ccJim Ingham } 50988e3de205708f14431559072ca258899b5ac31ccJim Ingham return true; 51088e3de205708f14431559072ca258899b5ac31ccJim Ingham } 51188e3de205708f14431559072ca258899b5ac31ccJim Ingham else if (frame_order == eFrameCompareEqual && InSymbol()) 51288e3de205708f14431559072ca258899b5ac31ccJim Ingham { 51388e3de205708f14431559072ca258899b5ac31ccJim Ingham // If we are not in a place we should step through, we've gotten stale. 51488e3de205708f14431559072ca258899b5ac31ccJim Ingham // One tricky bit here is that some stubs don't push a frame, so we should. 51588e3de205708f14431559072ca258899b5ac31ccJim Ingham // check that we are in the same symbol. 51688e3de205708f14431559072ca258899b5ac31ccJim Ingham if (!InRange()) 51788e3de205708f14431559072ca258899b5ac31ccJim Ingham { 51888e3de205708f14431559072ca258899b5ac31ccJim Ingham return true; 51988e3de205708f14431559072ca258899b5ac31ccJim Ingham } 52088e3de205708f14431559072ca258899b5ac31ccJim Ingham } 52188e3de205708f14431559072ca258899b5ac31ccJim Ingham return false; 52288e3de205708f14431559072ca258899b5ac31ccJim Ingham} 523