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 ®ex 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