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