130fdc8d8SChris Lattner //===-- BreakpointResolverAddress.cpp ---------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
330fdc8d8SChris Lattner //                     The LLVM Compiler Infrastructure
430fdc8d8SChris Lattner //
530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source
630fdc8d8SChris Lattner // License. See LICENSE.TXT for details.
730fdc8d8SChris Lattner //
830fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
930fdc8d8SChris Lattner 
1030fdc8d8SChris Lattner #include "lldb/Breakpoint/BreakpointResolverAddress.h"
1130fdc8d8SChris Lattner 
1230fdc8d8SChris Lattner // C Includes
1330fdc8d8SChris Lattner // C++ Includes
1430fdc8d8SChris Lattner // Other libraries and framework includes
1530fdc8d8SChris Lattner // Project includes
1630fdc8d8SChris Lattner #include "lldb/lldb-private-log.h"
1730fdc8d8SChris Lattner 
1830fdc8d8SChris Lattner #include "lldb/Breakpoint/BreakpointLocation.h"
1930fdc8d8SChris Lattner #include "lldb/Core/Log.h"
2030fdc8d8SChris Lattner #include "lldb/Core/StreamString.h"
2130fdc8d8SChris Lattner #include "lldb/Target/Target.h"
2230fdc8d8SChris Lattner 
2330fdc8d8SChris Lattner using namespace lldb;
2430fdc8d8SChris Lattner using namespace lldb_private;
2530fdc8d8SChris Lattner 
2630fdc8d8SChris Lattner //----------------------------------------------------------------------
2730fdc8d8SChris Lattner // BreakpointResolverAddress:
2830fdc8d8SChris Lattner //----------------------------------------------------------------------
2930fdc8d8SChris Lattner BreakpointResolverAddress::BreakpointResolverAddress
3030fdc8d8SChris Lattner (
3130fdc8d8SChris Lattner     Breakpoint *bkpt,
3230fdc8d8SChris Lattner     const Address &addr
3330fdc8d8SChris Lattner ) :
34*b7234e40SJohnny Chen     BreakpointResolver (bkpt, BreakpointResolver::AddressResolver),
3530fdc8d8SChris Lattner     m_addr (addr)
3630fdc8d8SChris Lattner {
3730fdc8d8SChris Lattner }
3830fdc8d8SChris Lattner 
3930fdc8d8SChris Lattner BreakpointResolverAddress::~BreakpointResolverAddress ()
4030fdc8d8SChris Lattner {
4130fdc8d8SChris Lattner 
4230fdc8d8SChris Lattner }
4330fdc8d8SChris Lattner 
4430fdc8d8SChris Lattner void
4530fdc8d8SChris Lattner BreakpointResolverAddress::ResolveBreakpoint (SearchFilter &filter)
4630fdc8d8SChris Lattner {
4730fdc8d8SChris Lattner     // The address breakpoint only takes once, so if we've already set it we're done.
4830fdc8d8SChris Lattner     if (m_breakpoint->GetNumLocations() > 0)
4930fdc8d8SChris Lattner         return;
5030fdc8d8SChris Lattner     else
5130fdc8d8SChris Lattner         BreakpointResolver::ResolveBreakpoint(filter);
5230fdc8d8SChris Lattner }
5330fdc8d8SChris Lattner 
5430fdc8d8SChris Lattner void
5530fdc8d8SChris Lattner BreakpointResolverAddress::ResolveBreakpointInModules
5630fdc8d8SChris Lattner (
5730fdc8d8SChris Lattner     SearchFilter &filter,
5830fdc8d8SChris Lattner     ModuleList &modules
5930fdc8d8SChris Lattner )
6030fdc8d8SChris Lattner {
6130fdc8d8SChris Lattner     // The address breakpoint only takes once, so if we've already set it we're done.
6230fdc8d8SChris Lattner     if (m_breakpoint->GetNumLocations() > 0)
6330fdc8d8SChris Lattner         return;
6430fdc8d8SChris Lattner     else
6530fdc8d8SChris Lattner         BreakpointResolver::ResolveBreakpointInModules (filter, modules);
6630fdc8d8SChris Lattner }
6730fdc8d8SChris Lattner 
6830fdc8d8SChris Lattner Searcher::CallbackReturn
6930fdc8d8SChris Lattner BreakpointResolverAddress::SearchCallback
7030fdc8d8SChris Lattner (
7130fdc8d8SChris Lattner     SearchFilter &filter,
7230fdc8d8SChris Lattner     SymbolContext &context,
7330fdc8d8SChris Lattner     Address *addr,
7430fdc8d8SChris Lattner     bool containing
7530fdc8d8SChris Lattner )
7630fdc8d8SChris Lattner {
7730fdc8d8SChris Lattner     assert (m_breakpoint != NULL);
7830fdc8d8SChris Lattner 
7930fdc8d8SChris Lattner     if (filter.AddressPasses (m_addr))
8030fdc8d8SChris Lattner     {
8130fdc8d8SChris Lattner         BreakpointLocationSP bp_loc_sp(m_breakpoint->AddLocation(m_addr));
8230fdc8d8SChris Lattner         if (bp_loc_sp && !m_breakpoint->IsInternal())
8330fdc8d8SChris Lattner         {
8430fdc8d8SChris Lattner             StreamString s;
8530fdc8d8SChris Lattner             bp_loc_sp->GetDescription(&s, lldb::eDescriptionLevelVerbose);
8630fdc8d8SChris Lattner             Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS);
8730fdc8d8SChris Lattner             if (log)
8830fdc8d8SChris Lattner                 log->Printf ("Added location: %s\n", s.GetData());
8930fdc8d8SChris Lattner         }
9030fdc8d8SChris Lattner     }
9130fdc8d8SChris Lattner     return Searcher::eCallbackReturnStop;
9230fdc8d8SChris Lattner }
9330fdc8d8SChris Lattner 
9430fdc8d8SChris Lattner Searcher::Depth
9530fdc8d8SChris Lattner BreakpointResolverAddress::GetDepth()
9630fdc8d8SChris Lattner {
9730fdc8d8SChris Lattner     return Searcher::eDepthTarget;
9830fdc8d8SChris Lattner }
9930fdc8d8SChris Lattner 
10030fdc8d8SChris Lattner void
10130fdc8d8SChris Lattner BreakpointResolverAddress::GetDescription (Stream *s)
10230fdc8d8SChris Lattner {
1030c5cd90dSGreg Clayton     s->PutCString ("address = ");
10430fdc8d8SChris Lattner     m_addr.Dump(s, m_breakpoint->GetTarget().GetProcessSP().get(), Address::DumpStyleLoadAddress, Address::DumpStyleModuleWithFileAddress);
10530fdc8d8SChris Lattner }
10630fdc8d8SChris Lattner 
10730fdc8d8SChris Lattner void
10830fdc8d8SChris Lattner BreakpointResolverAddress::Dump (Stream *s) const
10930fdc8d8SChris Lattner {
11030fdc8d8SChris Lattner 
11130fdc8d8SChris Lattner }
112