Index: include/lldb/Breakpoint/BreakpointResolverName.h =================================================================== --- include/lldb/Breakpoint/BreakpointResolverName.h +++ include/lldb/Breakpoint/BreakpointResolverName.h @@ -35,7 +35,8 @@ const char *name, uint32_t name_type_mask, Breakpoint::MatchType type, - bool skip_prologue); + bool skip_prologue, + lldb::LanguageType language = lldb::eLanguageTypeUnknown); // This one takes an array of names. It is always MatchType = Exact. BreakpointResolverName (Breakpoint *bkpt, @@ -42,24 +43,28 @@ const char *names[], size_t num_names, uint32_t name_type_mask, - bool skip_prologue); + bool skip_prologue, + lldb::LanguageType language = lldb::eLanguageTypeUnknown); // This one takes a C++ array of names. It is always MatchType = Exact. BreakpointResolverName (Breakpoint *bkpt, std::vector names, uint32_t name_type_mask, - bool skip_prologue); + bool skip_prologue, + lldb::LanguageType language = lldb::eLanguageTypeUnknown); // Creates a function breakpoint by regular expression. Takes over control of the lifespan of func_regex. BreakpointResolverName (Breakpoint *bkpt, RegularExpression &func_regex, - bool skip_prologue); + bool skip_prologue, + lldb::LanguageType language = lldb::eLanguageTypeUnknown); BreakpointResolverName (Breakpoint *bkpt, const char *class_name, const char *method, Breakpoint::MatchType type, - bool skip_prologue); + bool skip_prologue, + lldb::LanguageType language = lldb::eLanguageTypeUnknown); virtual ~BreakpointResolverName (); @@ -115,6 +120,7 @@ RegularExpression m_regex; Breakpoint::MatchType m_match_type; bool m_skip_prologue; + lldb::LanguageType m_language; void AddNameLookup (const ConstString &name, uint32_t name_type_mask); Index: include/lldb/Core/Module.h =================================================================== --- include/lldb/Core/Module.h +++ include/lldb/Core/Module.h @@ -1083,6 +1083,10 @@ /// return a \a lookup_name of "b", with \a match_name_after_lookup /// set to true to indicate any matches will need to be checked /// to make sure they contain \a name. + /// + /// @param[out] language + /// If known, the language to use for determining the + /// lookup_name_type_mask. //------------------------------------------------------------------ static void PrepareForFunctionNameLookup (const ConstString &name, @@ -1089,7 +1093,8 @@ uint32_t name_type_mask, ConstString &lookup_name, uint32_t &lookup_name_type_mask, - bool &match_name_after_lookup); + bool &match_name_after_lookup, + lldb::LanguageType language = lldb::eLanguageTypeUnknown); protected: //------------------------------------------------------------------ Index: source/Breakpoint/BreakpointResolverName.cpp =================================================================== --- source/Breakpoint/BreakpointResolverName.cpp +++ source/Breakpoint/BreakpointResolverName.cpp @@ -31,12 +31,14 @@ const char *name_cstr, uint32_t name_type_mask, Breakpoint::MatchType type, - bool skip_prologue) : + bool skip_prologue, + LanguageType language) : BreakpointResolver (bkpt, BreakpointResolver::NameResolver), m_class_name (), m_regex (), m_match_type (type), - m_skip_prologue (skip_prologue) + m_skip_prologue (skip_prologue), + m_language (language) { if (m_match_type == Breakpoint::Regexp) @@ -59,10 +61,12 @@ const char *names[], size_t num_names, uint32_t name_type_mask, - bool skip_prologue) : + bool skip_prologue, + LanguageType language) : BreakpointResolver (bkpt, BreakpointResolver::NameResolver), m_match_type (Breakpoint::Exact), - m_skip_prologue (skip_prologue) + m_skip_prologue (skip_prologue), + m_language (language) { for (size_t i = 0; i < num_names; i++) { @@ -73,10 +77,12 @@ BreakpointResolverName::BreakpointResolverName (Breakpoint *bkpt, std::vector names, uint32_t name_type_mask, - bool skip_prologue) : + bool skip_prologue, + LanguageType language) : BreakpointResolver (bkpt, BreakpointResolver::NameResolver), m_match_type (Breakpoint::Exact), - m_skip_prologue (skip_prologue) + m_skip_prologue (skip_prologue), + m_language (language) { for (const std::string& name : names) { @@ -86,12 +92,14 @@ BreakpointResolverName::BreakpointResolverName (Breakpoint *bkpt, RegularExpression &func_regex, - bool skip_prologue) : + bool skip_prologue, + LanguageType language) : BreakpointResolver (bkpt, BreakpointResolver::NameResolver), m_class_name (NULL), m_regex (func_regex), m_match_type (Breakpoint::Regexp), - m_skip_prologue (skip_prologue) + m_skip_prologue (skip_prologue), + m_language (language) { } @@ -101,13 +109,15 @@ const char *class_name, const char *method, Breakpoint::MatchType type, - bool skip_prologue + bool skip_prologue, + LanguageType language ) : BreakpointResolver (bkpt, BreakpointResolver::NameResolver), m_class_name (class_name), m_regex (), m_match_type (type), - m_skip_prologue (skip_prologue) + m_skip_prologue (skip_prologue), + m_language (language) { LookupInfo lookup; lookup.name.SetCString(method); @@ -127,7 +137,8 @@ m_class_name(rhs.m_class_name), m_regex(rhs.m_regex), m_match_type (rhs.m_match_type), - m_skip_prologue (rhs.m_skip_prologue) + m_skip_prologue (rhs.m_skip_prologue), + m_language (rhs.m_language) { } @@ -154,7 +165,7 @@ { LookupInfo lookup; lookup.name = name; - Module::PrepareForFunctionNameLookup(lookup.name, name_type_mask, lookup.lookup_name, lookup.name_type_mask, lookup.match_name_after_lookup); + Module::PrepareForFunctionNameLookup(lookup.name, name_type_mask, lookup.lookup_name, lookup.name_type_mask, lookup.match_name_after_lookup, m_language); m_lookups.push_back (lookup); } } Index: source/Core/Module.cpp =================================================================== --- source/Core/Module.cpp +++ source/Core/Module.cpp @@ -1741,7 +1741,8 @@ uint32_t name_type_mask, ConstString &lookup_name, uint32_t &lookup_name_type_mask, - bool &match_name_after_lookup) + bool &match_name_after_lookup, + LanguageType language) { const char *name_cstr = name.GetCString(); lookup_name_type_mask = eFunctionNameTypeNone; Index: source/Target/Target.cpp =================================================================== --- source/Target/Target.cpp +++ source/Target/Target.cpp @@ -43,6 +43,7 @@ #include "lldb/Interpreter/OptionValues.h" #include "lldb/Interpreter/Property.h" #include "lldb/Symbol/ClangASTContext.h" +#include "lldb/Symbol/CompileUnit.h" #include "lldb/Symbol/ObjectFile.h" #include "lldb/Target/LanguageRuntime.h" #include "lldb/Target/ObjCLanguageRuntime.h" @@ -411,10 +412,28 @@ if (skip_prologue == eLazyBoolCalculate) skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo; + // If the language is unknown, set it to the langage of the + // selected frame's CU. + LanguageType language = lldb::eLanguageTypeUnknown; + if (m_process_sp) + { + ThreadSP sel_thread_sp(m_process_sp->GetThreadList().GetSelectedThread()); + if (sel_thread_sp) + { + StackFrameSP sel_frame_sp = sel_thread_sp->GetSelectedFrame(); + if (sel_frame_sp) + { + CompileUnit *cu = sel_frame_sp->GetSymbolContext(eSymbolContextCompUnit).comp_unit; + if (cu) + language = cu->GetLanguage(); + } + } + } BreakpointResolverSP resolver_sp (new BreakpointResolverName (NULL, func_names, func_name_type_mask, - skip_prologue)); + skip_prologue, + language)); bp_sp = CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true); } return bp_sp;