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