1 //===-- BreakpointResolverAddress.cpp ---------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "lldb/Breakpoint/BreakpointResolverAddress.h"
14 // Other libraries and framework includes
17 #include "lldb/Breakpoint/BreakpointLocation.h"
18 #include "lldb/Core/Log.h"
19 #include "lldb/Core/Module.h"
20 #include "lldb/Core/StreamString.h"
21 #include "lldb/Target/Process.h"
22 #include "lldb/Target/Target.h"
25 using namespace lldb_private;
27 //----------------------------------------------------------------------
28 // BreakpointResolverAddress:
29 //----------------------------------------------------------------------
30 BreakpointResolverAddress::BreakpointResolverAddress
34 const FileSpec &module_spec
36 BreakpointResolver (bkpt, BreakpointResolver::AddressResolver),
38 m_resolved_addr(LLDB_INVALID_ADDRESS),
39 m_module_filespec(module_spec)
43 BreakpointResolverAddress::BreakpointResolverAddress
48 BreakpointResolver (bkpt, BreakpointResolver::AddressResolver),
50 m_resolved_addr(LLDB_INVALID_ADDRESS),
55 BreakpointResolverAddress::~BreakpointResolverAddress ()
61 BreakpointResolverAddress::ResolveBreakpoint (SearchFilter &filter)
63 // If the address is not section relative, then we should not try to re-resolve it, it is just some
64 // random address and we wouldn't know what to do on reload. But if it is section relative, we need to
65 // re-resolve it since the section it's in may have shifted on re-run.
66 bool re_resolve = false;
67 if (m_addr.GetSection() || m_module_filespec)
69 else if (m_breakpoint->GetNumLocations() == 0)
73 BreakpointResolver::ResolveBreakpoint(filter);
77 BreakpointResolverAddress::ResolveBreakpointInModules
83 // See comment in ResolveBreakpoint.
84 bool re_resolve = false;
85 if (m_addr.GetSection())
87 else if (m_breakpoint->GetNumLocations() == 0)
91 BreakpointResolver::ResolveBreakpointInModules (filter, modules);
94 Searcher::CallbackReturn
95 BreakpointResolverAddress::SearchCallback
98 SymbolContext &context,
103 assert (m_breakpoint != NULL);
105 if (filter.AddressPasses (m_addr))
107 if (m_breakpoint->GetNumLocations() == 0)
109 // If the address is just an offset, and we're given a module, see if we can find the appropriate module
110 // loaded in the binary, and fix up m_addr to use that.
111 if (!m_addr.IsSectionOffset() && m_module_filespec)
113 Target &target = m_breakpoint->GetTarget();
114 ModuleSpec module_spec(m_module_filespec);
115 ModuleSP module_sp = target.GetImages().FindFirstModule(module_spec);
119 if (module_sp->ResolveFileAddress(m_addr.GetOffset(), tmp_address))
120 m_addr = tmp_address;
124 m_resolved_addr = m_addr.GetLoadAddress(&m_breakpoint->GetTarget());
125 BreakpointLocationSP bp_loc_sp(AddLocation(m_addr));
126 if (bp_loc_sp && !m_breakpoint->IsInternal())
129 bp_loc_sp->GetDescription(&s, lldb::eDescriptionLevelVerbose);
130 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
132 log->Printf ("Added location: %s\n", s.GetData());
137 BreakpointLocationSP loc_sp = m_breakpoint->GetLocationAtIndex(0);
138 lldb::addr_t cur_load_location = m_addr.GetLoadAddress(&m_breakpoint->GetTarget());
139 if (cur_load_location != m_resolved_addr)
141 m_resolved_addr = cur_load_location;
142 loc_sp->ClearBreakpointSite();
143 loc_sp->ResolveBreakpointSite();
147 return Searcher::eCallbackReturnStop;
151 BreakpointResolverAddress::GetDepth()
153 return Searcher::eDepthTarget;
157 BreakpointResolverAddress::GetDescription (Stream *s)
159 s->PutCString ("address = ");
160 m_addr.Dump(s, m_breakpoint->GetTarget().GetProcessSP().get(), Address::DumpStyleModuleWithFileAddress, Address::DumpStyleLoadAddress);
164 BreakpointResolverAddress::Dump (Stream *s) const
169 lldb::BreakpointResolverSP
170 BreakpointResolverAddress::CopyForBreakpoint (Breakpoint &breakpoint)
172 lldb::BreakpointResolverSP ret_sp(new BreakpointResolverAddress(&breakpoint, m_addr));