1 //===-- BreakpointResolverFileRegex.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/BreakpointResolverFileRegex.h" 11 12 // C Includes 13 // C++ Includes 14 // Other libraries and framework includes 15 // Project includes 16 #include "lldb/Breakpoint/BreakpointLocation.h" 17 #include "lldb/Core/SourceManager.h" 18 #include "lldb/Core/Log.h" 19 #include "lldb/Core/StreamString.h" 20 #include "lldb/Symbol/CompileUnit.h" 21 #include "lldb/Target/Target.h" 22 23 using namespace lldb; 24 using namespace lldb_private; 25 26 //---------------------------------------------------------------------- 27 // BreakpointResolverFileRegex: 28 //---------------------------------------------------------------------- 29 BreakpointResolverFileRegex::BreakpointResolverFileRegex 30 ( 31 Breakpoint *bkpt, 32 RegularExpression ®ex 33 ) : 34 BreakpointResolver (bkpt, BreakpointResolver::FileLineResolver), 35 m_regex (regex) 36 { 37 } 38 39 BreakpointResolverFileRegex::~BreakpointResolverFileRegex () 40 { 41 } 42 43 Searcher::CallbackReturn 44 BreakpointResolverFileRegex::SearchCallback 45 ( 46 SearchFilter &filter, 47 SymbolContext &context, 48 Address *addr, 49 bool containing 50 ) 51 { 52 53 assert (m_breakpoint != NULL); 54 if (!context.target_sp) 55 return eCallbackReturnContinue; 56 57 CompileUnit *cu = context.comp_unit; 58 FileSpec cu_file_spec = *(static_cast<FileSpec *>(cu)); 59 std::vector<uint32_t> line_matches; 60 context.target_sp->GetSourceManager().FindLinesMatchingRegex(cu_file_spec, m_regex, 1, UINT32_MAX, line_matches); 61 62 uint32_t num_matches = line_matches.size(); 63 for (uint32_t i = 0; i < num_matches; i++) 64 { 65 SymbolContextList sc_list; 66 const bool search_inlines = false; 67 const bool exact = false; 68 69 cu->ResolveSymbolContext (cu_file_spec, line_matches[i], search_inlines, exact, eSymbolContextEverything, sc_list); 70 const bool skip_prologue = true; 71 72 BreakpointResolver::SetSCMatchesByLine (filter, sc_list, skip_prologue, m_regex.GetText()); 73 } 74 assert (m_breakpoint != NULL); 75 76 return Searcher::eCallbackReturnContinue; 77 } 78 79 Searcher::Depth 80 BreakpointResolverFileRegex::GetDepth() 81 { 82 return Searcher::eDepthCompUnit; 83 } 84 85 void 86 BreakpointResolverFileRegex::GetDescription (Stream *s) 87 { 88 s->Printf ("source regex = \"%s\"", m_regex.GetText()); 89 } 90 91 void 92 BreakpointResolverFileRegex::Dump (Stream *s) const 93 { 94 95 } 96 97 lldb::BreakpointResolverSP 98 BreakpointResolverFileRegex::CopyForBreakpoint (Breakpoint &breakpoint) 99 { 100 lldb::BreakpointResolverSP ret_sp(new BreakpointResolverFileRegex(&breakpoint, m_regex)); 101 return ret_sp; 102 } 103 104