BreakpointResolverFileRegex.cpp revision 263363
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#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,
33    RegularExpression &regex
34) :
35    BreakpointResolver (bkpt, BreakpointResolver::FileLineResolver),
36    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
58    CompileUnit *cu = context.comp_unit;
59    FileSpec cu_file_spec = *(static_cast<FileSpec *>(cu));
60    std::vector<uint32_t> line_matches;
61    context.target_sp->GetSourceManager().FindLinesMatchingRegex(cu_file_spec, m_regex, 1, UINT32_MAX, line_matches);
62
63    uint32_t num_matches = line_matches.size();
64    for (uint32_t i = 0; i < num_matches; i++)
65    {
66        SymbolContextList sc_list;
67        const bool search_inlines = false;
68        const bool exact = false;
69
70        cu->ResolveSymbolContext (cu_file_spec, line_matches[i], search_inlines, exact, eSymbolContextEverything, sc_list);
71        const bool skip_prologue = true;
72
73        BreakpointResolver::SetSCMatchesByLine (filter, sc_list, skip_prologue, m_regex.GetText());
74    }
75    assert (m_breakpoint != NULL);
76
77    return Searcher::eCallbackReturnContinue;
78}
79
80Searcher::Depth
81BreakpointResolverFileRegex::GetDepth()
82{
83    return Searcher::eDepthCompUnit;
84}
85
86void
87BreakpointResolverFileRegex::GetDescription (Stream *s)
88{
89    s->Printf ("source regex = \"%s\"", m_regex.GetText());
90}
91
92void
93BreakpointResolverFileRegex::Dump (Stream *s) const
94{
95
96}
97
98