diff options
Diffstat (limited to 'source/Breakpoint/BreakpointResolverName.cpp')
-rw-r--r-- | source/Breakpoint/BreakpointResolverName.cpp | 94 |
1 files changed, 38 insertions, 56 deletions
diff --git a/source/Breakpoint/BreakpointResolverName.cpp b/source/Breakpoint/BreakpointResolverName.cpp index 9ae3fe5256d4..dfa09c2342f9 100644 --- a/source/Breakpoint/BreakpointResolverName.cpp +++ b/source/Breakpoint/BreakpointResolverName.cpp @@ -22,6 +22,7 @@ #include "lldb/Symbol/Symbol.h" #include "lldb/Symbol/SymbolContext.h" #include "Plugins/Language/ObjC/ObjCLanguage.h" +#include "Plugins/Language/CPlusPlus/CPlusPlusLanguage.h" using namespace lldb; using namespace lldb_private; @@ -31,8 +32,9 @@ BreakpointResolverName::BreakpointResolverName (Breakpoint *bkpt, uint32_t name_type_mask, LanguageType language, Breakpoint::MatchType type, + lldb::addr_t offset, bool skip_prologue) : - BreakpointResolver (bkpt, BreakpointResolver::NameResolver), + BreakpointResolver (bkpt, BreakpointResolver::NameResolver, offset), m_class_name (), m_regex (), m_match_type (type), @@ -60,8 +62,9 @@ BreakpointResolverName::BreakpointResolverName (Breakpoint *bkpt, size_t num_names, uint32_t name_type_mask, LanguageType language, + lldb::addr_t offset, bool skip_prologue) : - BreakpointResolver (bkpt, BreakpointResolver::NameResolver), + BreakpointResolver (bkpt, BreakpointResolver::NameResolver, offset), m_match_type (Breakpoint::Exact), m_language (language), m_skip_prologue (skip_prologue) @@ -76,8 +79,9 @@ BreakpointResolverName::BreakpointResolverName (Breakpoint *bkpt, std::vector<std::string> names, uint32_t name_type_mask, LanguageType language, + lldb::addr_t offset, bool skip_prologue) : - BreakpointResolver (bkpt, BreakpointResolver::NameResolver), + BreakpointResolver (bkpt, BreakpointResolver::NameResolver, offset), m_match_type (Breakpoint::Exact), m_language (language), m_skip_prologue (skip_prologue) @@ -91,8 +95,9 @@ BreakpointResolverName::BreakpointResolverName (Breakpoint *bkpt, BreakpointResolverName::BreakpointResolverName (Breakpoint *bkpt, RegularExpression &func_regex, lldb::LanguageType language, + lldb::addr_t offset, bool skip_prologue) : - BreakpointResolver (bkpt, BreakpointResolver::NameResolver), + BreakpointResolver (bkpt, BreakpointResolver::NameResolver, offset), m_class_name (nullptr), m_regex (func_regex), m_match_type (Breakpoint::Regexp), @@ -101,30 +106,33 @@ BreakpointResolverName::BreakpointResolverName (Breakpoint *bkpt, { } -BreakpointResolverName::BreakpointResolverName(Breakpoint *bkpt, - const char *class_name, - const char *method, - Breakpoint::MatchType type, - bool skip_prologue ) : - BreakpointResolver (bkpt, BreakpointResolver::NameResolver), +BreakpointResolverName::BreakpointResolverName +( + Breakpoint *bkpt, + const char *class_name, + const char *method, + Breakpoint::MatchType type, + lldb::addr_t offset, + bool skip_prologue +) : + BreakpointResolver (bkpt, BreakpointResolver::NameResolver, offset), m_class_name (class_name), m_regex (), m_match_type (type), m_language (eLanguageTypeUnknown), m_skip_prologue (skip_prologue) { - LookupInfo lookup; - lookup.name.SetCString(method); - lookup.lookup_name = lookup.name; - lookup.name_type_mask = eFunctionNameTypeMethod; - lookup.match_name_after_lookup = false; + Module::LookupInfo lookup; + lookup.SetName(ConstString(method)); + lookup.SetLookupName(lookup.GetName()); + lookup.SetNameTypeMask(eFunctionNameTypeMethod); m_lookups.push_back (lookup); } BreakpointResolverName::~BreakpointResolverName() = default; BreakpointResolverName::BreakpointResolverName(const BreakpointResolverName &rhs) : - BreakpointResolver(rhs.m_breakpoint, BreakpointResolver::NameResolver), + BreakpointResolver(rhs.m_breakpoint, BreakpointResolver::NameResolver, rhs.m_offset), m_lookups(rhs.m_lookups), m_class_name(rhs.m_class_name), m_regex(rhs.m_regex), @@ -144,47 +152,20 @@ BreakpointResolverName::AddNameLookup (const ConstString &name, uint32_t name_ty objc_method.GetFullNames(objc_names, true); for (ConstString objc_name : objc_names) { - LookupInfo lookup; - lookup.name = name; - lookup.lookup_name = objc_name; - lookup.name_type_mask = eFunctionNameTypeFull; - lookup.match_name_after_lookup = false; + Module::LookupInfo lookup; + lookup.SetName(name); + lookup.SetLookupName(objc_name); + lookup.SetNameTypeMask(eFunctionNameTypeFull); m_lookups.push_back (lookup); } } else { - LookupInfo lookup; - lookup.name = name; - Module::PrepareForFunctionNameLookup(lookup.name, name_type_mask, m_language, lookup.lookup_name, lookup.name_type_mask, lookup.match_name_after_lookup); + Module::LookupInfo lookup(name, name_type_mask, m_language); m_lookups.push_back (lookup); } } -void -BreakpointResolverName::LookupInfo::Prune (SymbolContextList &sc_list, size_t start_idx) const -{ - if (match_name_after_lookup && name) - { - SymbolContext sc; - size_t i = start_idx; - while (i < sc_list.GetSize()) - { - if (!sc_list.GetContextAtIndex(i, sc)) - break; - ConstString full_name (sc.GetFunctionName()); - if (full_name && ::strstr(full_name.GetCString(), name.GetCString()) == nullptr) - { - sc_list.RemoveContextAtIndex(i); - } - else - { - ++i; - } - } - } -} - // FIXME: Right now we look at the module level, and call the module's "FindFunctions". // Greg says he will add function tables, maybe at the CompileUnit level to accelerate function // lookup. At that point, we should switch the depth to CompileUnit, and look in these tables. @@ -222,16 +203,17 @@ BreakpointResolverName::SearchCallback(SearchFilter &filter, case Breakpoint::Exact: if (context.module_sp) { - for (const LookupInfo &lookup : m_lookups) + for (const auto &lookup : m_lookups) { const size_t start_func_idx = func_list.GetSize(); - context.module_sp->FindFunctions(lookup.lookup_name, + context.module_sp->FindFunctions(lookup.GetLookupName(), nullptr, - lookup.name_type_mask, + lookup.GetNameTypeMask(), include_symbols, include_inlines, append, func_list); + const size_t end_func_idx = func_list.GetSize(); if (start_func_idx < end_func_idx) @@ -344,7 +326,7 @@ BreakpointResolverName::SearchCallback(SearchFilter &filter, { if (filter.AddressPasses(break_addr)) { - BreakpointLocationSP bp_loc_sp (m_breakpoint->AddLocation(break_addr, &new_location)); + BreakpointLocationSP bp_loc_sp (AddLocation(break_addr, &new_location)); bp_loc_sp->SetIsReExported(is_reexported); if (bp_loc_sp && new_location && !m_breakpoint->IsInternal()) { @@ -379,15 +361,15 @@ BreakpointResolverName::GetDescription (Stream *s) { size_t num_names = m_lookups.size(); if (num_names == 1) - s->Printf("name = '%s'", m_lookups[0].name.GetCString()); + s->Printf("name = '%s'", m_lookups[0].GetName().GetCString()); else { s->Printf("names = {"); - for (size_t i = 0; i < num_names - 1; i++) + for (size_t i = 0; i < num_names; i++) { - s->Printf ("'%s', ", m_lookups[i].name.GetCString()); + s->Printf ("%s'%s'", (i == 0 ? "" : ", "), m_lookups[i].GetName().GetCString()); } - s->Printf ("'%s'}", m_lookups[num_names - 1].name.GetCString()); + s->Printf ("}"); } } if (m_language != eLanguageTypeUnknown) |