1969795f1SJim Ingham //===-- BreakpointResolverFileRegex.cpp --------------------------*- C++ -*-===// 2969795f1SJim Ingham // 3969795f1SJim Ingham // The LLVM Compiler Infrastructure 4969795f1SJim Ingham // 5969795f1SJim Ingham // This file is distributed under the University of Illinois Open Source 6969795f1SJim Ingham // License. See LICENSE.TXT for details. 7969795f1SJim Ingham // 8969795f1SJim Ingham //===----------------------------------------------------------------------===// 9969795f1SJim Ingham 10969795f1SJim Ingham #include "lldb/Breakpoint/BreakpointResolverFileRegex.h" 11969795f1SJim Ingham 12969795f1SJim Ingham // C Includes 13969795f1SJim Ingham // C++ Includes 14969795f1SJim Ingham // Other libraries and framework includes 15969795f1SJim Ingham // Project includes 16969795f1SJim Ingham #include "lldb/Breakpoint/BreakpointLocation.h" 17969795f1SJim Ingham #include "lldb/Core/SourceManager.h" 18969795f1SJim Ingham #include "lldb/Core/Log.h" 19969795f1SJim Ingham #include "lldb/Core/StreamString.h" 201f746071SGreg Clayton #include "lldb/Symbol/CompileUnit.h" 21969795f1SJim Ingham #include "lldb/Target/Target.h" 22969795f1SJim Ingham 23969795f1SJim Ingham using namespace lldb; 24969795f1SJim Ingham using namespace lldb_private; 25969795f1SJim Ingham 26969795f1SJim Ingham //---------------------------------------------------------------------- 27969795f1SJim Ingham // BreakpointResolverFileRegex: 28969795f1SJim Ingham //---------------------------------------------------------------------- 29969795f1SJim Ingham BreakpointResolverFileRegex::BreakpointResolverFileRegex 30969795f1SJim Ingham ( 31969795f1SJim Ingham Breakpoint *bkpt, 32055ad9beSIlia K RegularExpression ®ex, 33*76bb8d67SJim Ingham const std::unordered_set<std::string> &func_names, 34055ad9beSIlia K bool exact_match 35969795f1SJim Ingham ) : 36969795f1SJim Ingham BreakpointResolver (bkpt, BreakpointResolver::FileLineResolver), 37055ad9beSIlia K m_regex (regex), 38*76bb8d67SJim Ingham m_exact_match (exact_match), 39*76bb8d67SJim Ingham m_function_names(func_names) 40969795f1SJim Ingham { 41969795f1SJim Ingham } 42969795f1SJim Ingham 43969795f1SJim Ingham BreakpointResolverFileRegex::~BreakpointResolverFileRegex () 44969795f1SJim Ingham { 45969795f1SJim Ingham } 46969795f1SJim Ingham 47969795f1SJim Ingham Searcher::CallbackReturn 48969795f1SJim Ingham BreakpointResolverFileRegex::SearchCallback 49969795f1SJim Ingham ( 50969795f1SJim Ingham SearchFilter &filter, 51969795f1SJim Ingham SymbolContext &context, 52969795f1SJim Ingham Address *addr, 53969795f1SJim Ingham bool containing 54969795f1SJim Ingham ) 55969795f1SJim Ingham { 56969795f1SJim Ingham 57969795f1SJim Ingham assert (m_breakpoint != NULL); 58969795f1SJim Ingham if (!context.target_sp) 59969795f1SJim Ingham return eCallbackReturnContinue; 60969795f1SJim Ingham 61969795f1SJim Ingham CompileUnit *cu = context.comp_unit; 62969795f1SJim Ingham FileSpec cu_file_spec = *(static_cast<FileSpec *>(cu)); 63969795f1SJim Ingham std::vector<uint32_t> line_matches; 64969795f1SJim Ingham context.target_sp->GetSourceManager().FindLinesMatchingRegex(cu_file_spec, m_regex, 1, UINT32_MAX, line_matches); 65f642373cSJim Ingham 66969795f1SJim Ingham uint32_t num_matches = line_matches.size(); 67a297a97eSAndy Gibbs for (uint32_t i = 0; i < num_matches; i++) 68969795f1SJim Ingham { 69f642373cSJim Ingham SymbolContextList sc_list; 70f642373cSJim Ingham const bool search_inlines = false; 71969795f1SJim Ingham 72055ad9beSIlia K cu->ResolveSymbolContext (cu_file_spec, line_matches[i], search_inlines, m_exact_match, eSymbolContextEverything, sc_list); 73*76bb8d67SJim Ingham // Find all the function names: 74*76bb8d67SJim Ingham if (!m_function_names.empty()) 75*76bb8d67SJim Ingham { 76*76bb8d67SJim Ingham std::vector<size_t> sc_to_remove; 77*76bb8d67SJim Ingham for (size_t i = 0; i < sc_list.GetSize(); i++) 78*76bb8d67SJim Ingham { 79*76bb8d67SJim Ingham SymbolContext sc_ctx; 80*76bb8d67SJim Ingham sc_list.GetContextAtIndex(i, sc_ctx); 81*76bb8d67SJim Ingham std::string name(sc_ctx.GetFunctionName(Mangled::NamePreference::ePreferDemangledWithoutArguments).AsCString()); 82*76bb8d67SJim Ingham if (!m_function_names.count(name)) 83*76bb8d67SJim Ingham { 84*76bb8d67SJim Ingham sc_to_remove.push_back(i); 85*76bb8d67SJim Ingham } 86*76bb8d67SJim Ingham } 87*76bb8d67SJim Ingham 88*76bb8d67SJim Ingham if (!sc_to_remove.empty()) 89*76bb8d67SJim Ingham { 90*76bb8d67SJim Ingham std::vector<size_t>::reverse_iterator iter; 91*76bb8d67SJim Ingham std::vector<size_t>::reverse_iterator rend = sc_to_remove.rend(); 92*76bb8d67SJim Ingham for (iter = sc_to_remove.rbegin(); iter != rend; iter++) 93*76bb8d67SJim Ingham { 94*76bb8d67SJim Ingham sc_list.RemoveContextAtIndex(*iter); 95*76bb8d67SJim Ingham } 96*76bb8d67SJim Ingham } 97*76bb8d67SJim Ingham } 98*76bb8d67SJim Ingham 99f642373cSJim Ingham const bool skip_prologue = true; 100969795f1SJim Ingham 101f642373cSJim Ingham BreakpointResolver::SetSCMatchesByLine (filter, sc_list, skip_prologue, m_regex.GetText()); 102969795f1SJim Ingham } 103969795f1SJim Ingham assert (m_breakpoint != NULL); 104969795f1SJim Ingham 105969795f1SJim Ingham return Searcher::eCallbackReturnContinue; 106969795f1SJim Ingham } 107969795f1SJim Ingham 108969795f1SJim Ingham Searcher::Depth 109969795f1SJim Ingham BreakpointResolverFileRegex::GetDepth() 110969795f1SJim Ingham { 111969795f1SJim Ingham return Searcher::eDepthCompUnit; 112969795f1SJim Ingham } 113969795f1SJim Ingham 114969795f1SJim Ingham void 115969795f1SJim Ingham BreakpointResolverFileRegex::GetDescription (Stream *s) 116969795f1SJim Ingham { 117055ad9beSIlia K s->Printf ("source regex = \"%s\", exact_match = %d", m_regex.GetText(), m_exact_match); 118969795f1SJim Ingham } 119969795f1SJim Ingham 120969795f1SJim Ingham void 121969795f1SJim Ingham BreakpointResolverFileRegex::Dump (Stream *s) const 122969795f1SJim Ingham { 123969795f1SJim Ingham 124969795f1SJim Ingham } 125969795f1SJim Ingham 12633df7cd3SJim Ingham lldb::BreakpointResolverSP 12733df7cd3SJim Ingham BreakpointResolverFileRegex::CopyForBreakpoint (Breakpoint &breakpoint) 12833df7cd3SJim Ingham { 129*76bb8d67SJim Ingham lldb::BreakpointResolverSP ret_sp(new BreakpointResolverFileRegex(&breakpoint, m_regex, m_function_names, m_exact_match)); 13033df7cd3SJim Ingham return ret_sp; 13133df7cd3SJim Ingham } 13233df7cd3SJim Ingham 133*76bb8d67SJim Ingham void 134*76bb8d67SJim Ingham BreakpointResolverFileRegex::AddFunctionName(const char *func_name) 135*76bb8d67SJim Ingham { 136*76bb8d67SJim Ingham m_function_names.insert(func_name); 137*76bb8d67SJim Ingham } 138*76bb8d67SJim Ingham 139