1*30fdc8d8SChris Lattner //===-- BreakpointResolverAddress.cpp ---------------------------*- C++ -*-===// 2*30fdc8d8SChris Lattner // 3*30fdc8d8SChris Lattner // The LLVM Compiler Infrastructure 4*30fdc8d8SChris Lattner // 5*30fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source 6*30fdc8d8SChris Lattner // License. See LICENSE.TXT for details. 7*30fdc8d8SChris Lattner // 8*30fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 9*30fdc8d8SChris Lattner 10*30fdc8d8SChris Lattner #include "lldb/Breakpoint/BreakpointResolverAddress.h" 11*30fdc8d8SChris Lattner 12*30fdc8d8SChris Lattner // C Includes 13*30fdc8d8SChris Lattner // C++ Includes 14*30fdc8d8SChris Lattner // Other libraries and framework includes 15*30fdc8d8SChris Lattner // Project includes 16*30fdc8d8SChris Lattner #include "lldb/lldb-private-log.h" 17*30fdc8d8SChris Lattner 18*30fdc8d8SChris Lattner #include "lldb/Breakpoint/BreakpointLocation.h" 19*30fdc8d8SChris Lattner #include "lldb/Core/Log.h" 20*30fdc8d8SChris Lattner #include "lldb/Core/StreamString.h" 21*30fdc8d8SChris Lattner #include "lldb/Target/Target.h" 22*30fdc8d8SChris Lattner 23*30fdc8d8SChris Lattner using namespace lldb; 24*30fdc8d8SChris Lattner using namespace lldb_private; 25*30fdc8d8SChris Lattner 26*30fdc8d8SChris Lattner //---------------------------------------------------------------------- 27*30fdc8d8SChris Lattner // BreakpointResolverAddress: 28*30fdc8d8SChris Lattner //---------------------------------------------------------------------- 29*30fdc8d8SChris Lattner BreakpointResolverAddress::BreakpointResolverAddress 30*30fdc8d8SChris Lattner ( 31*30fdc8d8SChris Lattner Breakpoint *bkpt, 32*30fdc8d8SChris Lattner const Address &addr 33*30fdc8d8SChris Lattner ) : 34*30fdc8d8SChris Lattner BreakpointResolver (bkpt), 35*30fdc8d8SChris Lattner m_addr (addr) 36*30fdc8d8SChris Lattner { 37*30fdc8d8SChris Lattner } 38*30fdc8d8SChris Lattner 39*30fdc8d8SChris Lattner BreakpointResolverAddress::~BreakpointResolverAddress () 40*30fdc8d8SChris Lattner { 41*30fdc8d8SChris Lattner 42*30fdc8d8SChris Lattner } 43*30fdc8d8SChris Lattner 44*30fdc8d8SChris Lattner void 45*30fdc8d8SChris Lattner BreakpointResolverAddress::ResolveBreakpoint (SearchFilter &filter) 46*30fdc8d8SChris Lattner { 47*30fdc8d8SChris Lattner // The address breakpoint only takes once, so if we've already set it we're done. 48*30fdc8d8SChris Lattner if (m_breakpoint->GetNumLocations() > 0) 49*30fdc8d8SChris Lattner return; 50*30fdc8d8SChris Lattner else 51*30fdc8d8SChris Lattner BreakpointResolver::ResolveBreakpoint(filter); 52*30fdc8d8SChris Lattner } 53*30fdc8d8SChris Lattner 54*30fdc8d8SChris Lattner void 55*30fdc8d8SChris Lattner BreakpointResolverAddress::ResolveBreakpointInModules 56*30fdc8d8SChris Lattner ( 57*30fdc8d8SChris Lattner SearchFilter &filter, 58*30fdc8d8SChris Lattner ModuleList &modules 59*30fdc8d8SChris Lattner ) 60*30fdc8d8SChris Lattner { 61*30fdc8d8SChris Lattner // The address breakpoint only takes once, so if we've already set it we're done. 62*30fdc8d8SChris Lattner if (m_breakpoint->GetNumLocations() > 0) 63*30fdc8d8SChris Lattner return; 64*30fdc8d8SChris Lattner else 65*30fdc8d8SChris Lattner BreakpointResolver::ResolveBreakpointInModules (filter, modules); 66*30fdc8d8SChris Lattner } 67*30fdc8d8SChris Lattner 68*30fdc8d8SChris Lattner Searcher::CallbackReturn 69*30fdc8d8SChris Lattner BreakpointResolverAddress::SearchCallback 70*30fdc8d8SChris Lattner ( 71*30fdc8d8SChris Lattner SearchFilter &filter, 72*30fdc8d8SChris Lattner SymbolContext &context, 73*30fdc8d8SChris Lattner Address *addr, 74*30fdc8d8SChris Lattner bool containing 75*30fdc8d8SChris Lattner ) 76*30fdc8d8SChris Lattner { 77*30fdc8d8SChris Lattner assert (m_breakpoint != NULL); 78*30fdc8d8SChris Lattner 79*30fdc8d8SChris Lattner if (filter.AddressPasses (m_addr)) 80*30fdc8d8SChris Lattner { 81*30fdc8d8SChris Lattner BreakpointLocationSP bp_loc_sp(m_breakpoint->AddLocation(m_addr)); 82*30fdc8d8SChris Lattner if (bp_loc_sp && !m_breakpoint->IsInternal()) 83*30fdc8d8SChris Lattner { 84*30fdc8d8SChris Lattner StreamString s; 85*30fdc8d8SChris Lattner bp_loc_sp->GetDescription(&s, lldb::eDescriptionLevelVerbose); 86*30fdc8d8SChris Lattner Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS); 87*30fdc8d8SChris Lattner if (log) 88*30fdc8d8SChris Lattner log->Printf ("Added location: %s\n", s.GetData()); 89*30fdc8d8SChris Lattner } 90*30fdc8d8SChris Lattner } 91*30fdc8d8SChris Lattner return Searcher::eCallbackReturnStop; 92*30fdc8d8SChris Lattner } 93*30fdc8d8SChris Lattner 94*30fdc8d8SChris Lattner Searcher::Depth 95*30fdc8d8SChris Lattner BreakpointResolverAddress::GetDepth() 96*30fdc8d8SChris Lattner { 97*30fdc8d8SChris Lattner return Searcher::eDepthTarget; 98*30fdc8d8SChris Lattner } 99*30fdc8d8SChris Lattner 100*30fdc8d8SChris Lattner void 101*30fdc8d8SChris Lattner BreakpointResolverAddress::GetDescription (Stream *s) 102*30fdc8d8SChris Lattner { 103*30fdc8d8SChris Lattner s->PutCString ("Address breakpoint: "); 104*30fdc8d8SChris Lattner m_addr.Dump(s, m_breakpoint->GetTarget().GetProcessSP().get(), Address::DumpStyleLoadAddress, Address::DumpStyleModuleWithFileAddress); 105*30fdc8d8SChris Lattner } 106*30fdc8d8SChris Lattner 107*30fdc8d8SChris Lattner void 108*30fdc8d8SChris Lattner BreakpointResolverAddress::Dump (Stream *s) const 109*30fdc8d8SChris Lattner { 110*30fdc8d8SChris Lattner 111*30fdc8d8SChris Lattner } 112