1*30fdc8d8SChris Lattner //===-- BreakpointResolverFileLine.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/BreakpointResolverFileLine.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/Breakpoint/BreakpointLocation.h" 17*30fdc8d8SChris Lattner #include "lldb/Core/Log.h" 18*30fdc8d8SChris Lattner #include "lldb/Core/StreamString.h" 19*30fdc8d8SChris Lattner #include "lldb/lldb-private-log.h" 20*30fdc8d8SChris Lattner 21*30fdc8d8SChris Lattner using namespace lldb; 22*30fdc8d8SChris Lattner using namespace lldb_private; 23*30fdc8d8SChris Lattner 24*30fdc8d8SChris Lattner //---------------------------------------------------------------------- 25*30fdc8d8SChris Lattner // BreakpointResolverFileLine: 26*30fdc8d8SChris Lattner //---------------------------------------------------------------------- 27*30fdc8d8SChris Lattner BreakpointResolverFileLine::BreakpointResolverFileLine 28*30fdc8d8SChris Lattner ( 29*30fdc8d8SChris Lattner Breakpoint *bkpt, 30*30fdc8d8SChris Lattner const FileSpec &file_spec, 31*30fdc8d8SChris Lattner uint32_t line_no, 32*30fdc8d8SChris Lattner bool check_inlines 33*30fdc8d8SChris Lattner ) : 34*30fdc8d8SChris Lattner BreakpointResolver (bkpt), 35*30fdc8d8SChris Lattner m_file_spec (file_spec), 36*30fdc8d8SChris Lattner m_line_number (line_no), 37*30fdc8d8SChris Lattner m_inlines (check_inlines) 38*30fdc8d8SChris Lattner { 39*30fdc8d8SChris Lattner } 40*30fdc8d8SChris Lattner 41*30fdc8d8SChris Lattner BreakpointResolverFileLine::~BreakpointResolverFileLine () 42*30fdc8d8SChris Lattner { 43*30fdc8d8SChris Lattner } 44*30fdc8d8SChris Lattner 45*30fdc8d8SChris Lattner Searcher::CallbackReturn 46*30fdc8d8SChris Lattner BreakpointResolverFileLine::SearchCallback 47*30fdc8d8SChris Lattner ( 48*30fdc8d8SChris Lattner SearchFilter &filter, 49*30fdc8d8SChris Lattner SymbolContext &context, 50*30fdc8d8SChris Lattner Address *addr, 51*30fdc8d8SChris Lattner bool containing 52*30fdc8d8SChris Lattner ) 53*30fdc8d8SChris Lattner { 54*30fdc8d8SChris Lattner SymbolContextList sc_list; 55*30fdc8d8SChris Lattner uint32_t sc_list_size; 56*30fdc8d8SChris Lattner CompileUnit *cu = context.comp_unit; 57*30fdc8d8SChris Lattner 58*30fdc8d8SChris Lattner assert (m_breakpoint != NULL); 59*30fdc8d8SChris Lattner Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS); 60*30fdc8d8SChris Lattner 61*30fdc8d8SChris Lattner sc_list_size = cu->ResolveSymbolContext (m_file_spec, m_line_number, m_inlines, false, eSymbolContextEverything, sc_list); 62*30fdc8d8SChris Lattner for (int i = 0; i < sc_list_size; i++) 63*30fdc8d8SChris Lattner { 64*30fdc8d8SChris Lattner SymbolContext sc; 65*30fdc8d8SChris Lattner if (sc_list.GetContextAtIndex(i, sc)) 66*30fdc8d8SChris Lattner { 67*30fdc8d8SChris Lattner Address line_start = sc.line_entry.range.GetBaseAddress(); 68*30fdc8d8SChris Lattner if (line_start.IsValid()) 69*30fdc8d8SChris Lattner { 70*30fdc8d8SChris Lattner BreakpointLocationSP bp_loc_sp (m_breakpoint->AddLocation(line_start)); 71*30fdc8d8SChris Lattner if (log && bp_loc_sp && !m_breakpoint->IsInternal()) 72*30fdc8d8SChris Lattner { 73*30fdc8d8SChris Lattner StreamString s; 74*30fdc8d8SChris Lattner bp_loc_sp->GetDescription (&s, lldb::eDescriptionLevelVerbose); 75*30fdc8d8SChris Lattner log->Printf ("Added location: %s\n", s.GetData()); 76*30fdc8d8SChris Lattner } 77*30fdc8d8SChris Lattner } 78*30fdc8d8SChris Lattner else 79*30fdc8d8SChris Lattner { 80*30fdc8d8SChris Lattner if (log) 81*30fdc8d8SChris Lattner log->Printf ("error: Unable to set breakpoint at file address 0x%llx for %s:%d\n", 82*30fdc8d8SChris Lattner line_start.GetFileAddress(), 83*30fdc8d8SChris Lattner m_file_spec.GetFilename().AsCString("<Unknown>"), 84*30fdc8d8SChris Lattner m_line_number); 85*30fdc8d8SChris Lattner } 86*30fdc8d8SChris Lattner } 87*30fdc8d8SChris Lattner else 88*30fdc8d8SChris Lattner { 89*30fdc8d8SChris Lattner #if 0 90*30fdc8d8SChris Lattner s << "error: Breakpoint at '" << pos->c_str() << "' isn't resolved yet: \n"; 91*30fdc8d8SChris Lattner if (sc.line_entry.address.Dump(&s, Address::DumpStyleSectionNameOffset)) 92*30fdc8d8SChris Lattner s.EOL(); 93*30fdc8d8SChris Lattner if (sc.line_entry.address.Dump(&s, Address::DumpStyleSectionPointerOffset)) 94*30fdc8d8SChris Lattner s.EOL(); 95*30fdc8d8SChris Lattner if (sc.line_entry.address.Dump(&s, Address::DumpStyleFileAddress)) 96*30fdc8d8SChris Lattner s.EOL(); 97*30fdc8d8SChris Lattner if (sc.line_entry.address.Dump(&s, Address::DumpStyleLoadAddress)) 98*30fdc8d8SChris Lattner s.EOL(); 99*30fdc8d8SChris Lattner #endif 100*30fdc8d8SChris Lattner } 101*30fdc8d8SChris Lattner } 102*30fdc8d8SChris Lattner return Searcher::eCallbackReturnContinue; 103*30fdc8d8SChris Lattner } 104*30fdc8d8SChris Lattner 105*30fdc8d8SChris Lattner Searcher::Depth 106*30fdc8d8SChris Lattner BreakpointResolverFileLine::GetDepth() 107*30fdc8d8SChris Lattner { 108*30fdc8d8SChris Lattner return Searcher::eDepthCompUnit; 109*30fdc8d8SChris Lattner } 110*30fdc8d8SChris Lattner 111*30fdc8d8SChris Lattner void 112*30fdc8d8SChris Lattner BreakpointResolverFileLine::GetDescription (Stream *s) 113*30fdc8d8SChris Lattner { 114*30fdc8d8SChris Lattner s->Printf ("File and line breakpoint - file: \"%s\" line: %u", m_file_spec.GetFilename().AsCString(), m_line_number); 115*30fdc8d8SChris Lattner } 116*30fdc8d8SChris Lattner 117*30fdc8d8SChris Lattner void 118*30fdc8d8SChris Lattner BreakpointResolverFileLine::Dump (Stream *s) const 119*30fdc8d8SChris Lattner { 120*30fdc8d8SChris Lattner 121*30fdc8d8SChris Lattner } 122*30fdc8d8SChris Lattner 123