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