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 &regex
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