blob: e55575620bd2539402a7cc8e83623e41e89ebbd5 [file] [log] [blame]
Jim Ingham969795f2011-09-21 01:17:13 +00001//===-- 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"
Greg Clayton1f746072012-08-29 21:13:06 +000020#include "lldb/Symbol/CompileUnit.h"
Jim Ingham969795f2011-09-21 01:17:13 +000021#include "lldb/Target/Target.h"
22#include "lldb/lldb-private-log.h"
23
24using namespace lldb;
25using namespace lldb_private;
26
27//----------------------------------------------------------------------
28// BreakpointResolverFileRegex:
29//----------------------------------------------------------------------
30BreakpointResolverFileRegex::BreakpointResolverFileRegex
31(
32 Breakpoint *bkpt,
Jim Ingham969795f2011-09-21 01:17:13 +000033 RegularExpression &regex
34) :
35 BreakpointResolver (bkpt, BreakpointResolver::FileLineResolver),
Jim Ingham969795f2011-09-21 01:17:13 +000036 m_regex (regex)
37{
38}
39
40BreakpointResolverFileRegex::~BreakpointResolverFileRegex ()
41{
42}
43
44Searcher::CallbackReturn
45BreakpointResolverFileRegex::SearchCallback
46(
47 SearchFilter &filter,
48 SymbolContext &context,
49 Address *addr,
50 bool containing
51)
52{
53
54 assert (m_breakpoint != NULL);
55 if (!context.target_sp)
56 return eCallbackReturnContinue;
57
Greg Clayton5160ce52013-03-27 23:08:40 +000058 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
Jim Ingham969795f2011-09-21 01:17:13 +000059
60 CompileUnit *cu = context.comp_unit;
61 FileSpec cu_file_spec = *(static_cast<FileSpec *>(cu));
Jim Ingham87df91b2011-09-23 00:54:11 +000062 std::vector<uint32_t> line_matches;
Jim Inghamf6423732013-09-27 01:16:58 +000063 context.target_sp->GetSourceManager().FindLinesMatchingRegex(cu_file_spec, m_regex, 1, UINT32_MAX, line_matches);
64
Jim Ingham87df91b2011-09-23 00:54:11 +000065 uint32_t num_matches = line_matches.size();
Andy Gibbsa297a972013-06-19 19:04:53 +000066 for (uint32_t i = 0; i < num_matches; i++)
Jim Ingham969795f2011-09-21 01:17:13 +000067 {
Jim Inghamf6423732013-09-27 01:16:58 +000068 SymbolContextList sc_list;
69 const bool search_inlines = false;
70 const bool exact = false;
Jim Ingham87df91b2011-09-23 00:54:11 +000071
Jim Inghamf6423732013-09-27 01:16:58 +000072 cu->ResolveSymbolContext (cu_file_spec, line_matches[i], search_inlines, exact, eSymbolContextEverything, sc_list);
73 const bool skip_prologue = true;
74
75 BreakpointResolver::SetSCMatchesByLine (filter, sc_list, skip_prologue, m_regex.GetText());
Jim Ingham969795f2011-09-21 01:17:13 +000076 }
Jim Ingham87df91b2011-09-23 00:54:11 +000077 assert (m_breakpoint != NULL);
78
Jim Ingham969795f2011-09-21 01:17:13 +000079 return Searcher::eCallbackReturnContinue;
80}
81
82Searcher::Depth
83BreakpointResolverFileRegex::GetDepth()
84{
85 return Searcher::eDepthCompUnit;
86}
87
88void
89BreakpointResolverFileRegex::GetDescription (Stream *s)
90{
Jim Ingham87df91b2011-09-23 00:54:11 +000091 s->Printf ("source regex = \"%s\"", m_regex.GetText());
Jim Ingham969795f2011-09-21 01:17:13 +000092}
93
94void
95BreakpointResolverFileRegex::Dump (Stream *s) const
96{
97
98}
99