103c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham//===-- BreakpointResolverFileRegex.cpp --------------------------*- C++ -*-===//
203c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham//
303c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham//                     The LLVM Compiler Infrastructure
403c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham//
503c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham// This file is distributed under the University of Illinois Open Source
603c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham// License. See LICENSE.TXT for details.
703c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham//
803c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham//===----------------------------------------------------------------------===//
903c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham
1003c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham#include "lldb/Breakpoint/BreakpointResolverFileRegex.h"
1103c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham
1203c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham// C Includes
1303c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham// C++ Includes
1403c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham// Other libraries and framework includes
1503c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham// Project includes
1603c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham#include "lldb/Breakpoint/BreakpointLocation.h"
1703c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham#include "lldb/Core/SourceManager.h"
1803c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham#include "lldb/Core/Log.h"
1903c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham#include "lldb/Core/StreamString.h"
2049ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/CompileUnit.h"
2103c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham#include "lldb/Target/Target.h"
2203c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham#include "lldb/lldb-private-log.h"
2303c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham
2403c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Inghamusing namespace lldb;
2503c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Inghamusing namespace lldb_private;
2603c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham
2703c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham//----------------------------------------------------------------------
2803c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham// BreakpointResolverFileRegex:
2903c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham//----------------------------------------------------------------------
3003c8ee5aeafcd6c43f10002a4f8096af01780f86Jim InghamBreakpointResolverFileRegex::BreakpointResolverFileRegex
3103c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham(
3203c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham    Breakpoint *bkpt,
3303c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham    RegularExpression &regex
3403c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham) :
3503c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham    BreakpointResolver (bkpt, BreakpointResolver::FileLineResolver),
3603c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham    m_regex (regex)
3703c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham{
3803c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham}
3903c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham
4003c8ee5aeafcd6c43f10002a4f8096af01780f86Jim InghamBreakpointResolverFileRegex::~BreakpointResolverFileRegex ()
4103c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham{
4203c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham}
4303c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham
4403c8ee5aeafcd6c43f10002a4f8096af01780f86Jim InghamSearcher::CallbackReturn
4503c8ee5aeafcd6c43f10002a4f8096af01780f86Jim InghamBreakpointResolverFileRegex::SearchCallback
4603c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham(
4703c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham    SearchFilter &filter,
4803c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham    SymbolContext &context,
4903c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham    Address *addr,
5003c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham    bool containing
5103c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham)
5203c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham{
5303c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham
5403c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham    assert (m_breakpoint != NULL);
5503c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham    if (!context.target_sp)
5603c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham        return eCallbackReturnContinue;
5703c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham
58952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
5903c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham
6003c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham    CompileUnit *cu = context.comp_unit;
6103c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham    FileSpec cu_file_spec = *(static_cast<FileSpec *>(cu));
62d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham    std::vector<uint32_t> line_matches;
63d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham    context.target_sp->GetSourceManager().FindLinesMatchingRegex(cu_file_spec, m_regex, 1, UINT32_MAX, line_matches);
64d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham    uint32_t num_matches = line_matches.size();
653e11c7ec050648ba865f1d451f8cb46fd39072a8Andy Gibbs    for (uint32_t i = 0; i < num_matches; i++)
6603c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham    {
67d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham        uint32_t start_idx = 0;
68d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham        bool exact = false;
69d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham        while (1)
7003c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham        {
71d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham            LineEntry line_entry;
72d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham
73d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham            // Cycle through all the line entries that might match this one:
74d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham            start_idx = cu->FindLineEntry (start_idx, line_matches[i], NULL, exact, &line_entry);
75d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham            if (start_idx == UINT32_MAX)
76d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham                break;
77d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham            exact = true;
78d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham            start_idx++;
7903c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham
80d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham            Address line_start = line_entry.range.GetBaseAddress();
81d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham            if (line_start.IsValid())
82d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham            {
83d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham                if (filter.AddressPasses(line_start))
8403c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham                {
85d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham                    BreakpointLocationSP bp_loc_sp (m_breakpoint->AddLocation(line_start));
86d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham                    if (log && bp_loc_sp && !m_breakpoint->IsInternal())
8703c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham                    {
88d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham                        StreamString s;
89d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham                        bp_loc_sp->GetDescription (&s, lldb::eDescriptionLevelVerbose);
90d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham                        log->Printf ("Added location: %s\n", s.GetData());
9103c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham                    }
9203c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham                }
93d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham                else if (log)
9403c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham                {
955f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea                    log->Printf ("Breakpoint at file address 0x%" PRIx64 " for %s:%d didn't pass filter.\n",
96d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham                                 line_start.GetFileAddress(),
97d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham                                 cu_file_spec.GetFilename().AsCString("<Unknown>"),
98d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham                                 line_matches[i]);
9903c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham                }
10003c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham            }
101d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham            else
102d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham            {
103d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham                if (log)
1045f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea                    log->Printf ("error: Unable to set breakpoint at file address 0x%" PRIx64 " for %s:%d\n",
105d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham                                 line_start.GetFileAddress(),
106d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham                                 cu_file_spec.GetFilename().AsCString("<Unknown>"),
107d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham                                 line_matches[i]);
108d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham            }
109d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham
11003c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham        }
11103c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham    }
112d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham    assert (m_breakpoint != NULL);
113d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham
11403c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham    return Searcher::eCallbackReturnContinue;
11503c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham}
11603c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham
11703c8ee5aeafcd6c43f10002a4f8096af01780f86Jim InghamSearcher::Depth
11803c8ee5aeafcd6c43f10002a4f8096af01780f86Jim InghamBreakpointResolverFileRegex::GetDepth()
11903c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham{
12003c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham    return Searcher::eDepthCompUnit;
12103c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham}
12203c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham
12303c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Inghamvoid
12403c8ee5aeafcd6c43f10002a4f8096af01780f86Jim InghamBreakpointResolverFileRegex::GetDescription (Stream *s)
12503c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham{
126d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham    s->Printf ("source regex = \"%s\"", m_regex.GetText());
12703c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham}
12803c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham
12903c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Inghamvoid
13003c8ee5aeafcd6c43f10002a4f8096af01780f86Jim InghamBreakpointResolverFileRegex::Dump (Stream *s) const
13103c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham{
13203c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham
13303c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham}
13403c8ee5aeafcd6c43f10002a4f8096af01780f86Jim Ingham
135