summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lldb/include/lldb/Target/LanguageRuntime.h2
-rw-r--r--lldb/source/Breakpoint/BreakpointResolverName.cpp11
-rw-r--r--lldb/source/Target/LanguageRuntime.cpp21
3 files changed, 23 insertions, 11 deletions
diff --git a/lldb/include/lldb/Target/LanguageRuntime.h b/lldb/include/lldb/Target/LanguageRuntime.h
index f94517f0f4a..9cbc90e9764 100644
--- a/lldb/include/lldb/Target/LanguageRuntime.h
+++ b/lldb/include/lldb/Target/LanguageRuntime.h
@@ -118,7 +118,7 @@ public:
}
static lldb::LanguageType
- GetLanguageForSymbolByName (Target &target, const char *symbol_name);
+ GuessLanguageForSymbolByName (Target &target, const char *symbol_name);
Target&
GetTargetRef()
diff --git a/lldb/source/Breakpoint/BreakpointResolverName.cpp b/lldb/source/Breakpoint/BreakpointResolverName.cpp
index c5b3242fc59..c115f64e00c 100644
--- a/lldb/source/Breakpoint/BreakpointResolverName.cpp
+++ b/lldb/source/Breakpoint/BreakpointResolverName.cpp
@@ -279,8 +279,9 @@ BreakpointResolverName::SearchCallback(SearchFilter &filter,
const char *name = sc.GetFunctionName(Mangled::ePreferMangled).AsCString();
if (name)
{
- LanguageType sym_language = LanguageRuntime::GetLanguageForSymbolByName(target, name);
- if (m_language == eLanguageTypeC)
+ LanguageType sym_language = LanguageRuntime::GuessLanguageForSymbolByName(target, name);
+ if (Language::LanguageIsC(m_language) ||
+ Language::LanguageIsPascal(m_language))
{
// We don't currently have a way to say "This symbol name is C" so for now, C means
// not ObjC and not C++, etc...
@@ -293,6 +294,12 @@ BreakpointResolverName::SearchCallback(SearchFilter &filter,
}
else if (sym_language != m_language)
{
+ // Note: This code prevents us from being able to find symbols
+ // like 'printf' if the target language's option is set. It
+ // would be better to limit this filtering to only when the
+ // breakpoint's language option is set (and not the target's),
+ // but we can't know if m_language was set from the target or
+ // breakpoint option.
remove_it = true;
}
}
diff --git a/lldb/source/Target/LanguageRuntime.cpp b/lldb/source/Target/LanguageRuntime.cpp
index 0d67436a38e..09ecc2a9bc8 100644
--- a/lldb/source/Target/LanguageRuntime.cpp
+++ b/lldb/source/Target/LanguageRuntime.cpp
@@ -347,15 +347,20 @@ LanguageRuntime::CreateExceptionSearchFilter ()
}
lldb::LanguageType
-LanguageRuntime::GetLanguageForSymbolByName (Target &target, const char *symbol_name)
+LanguageRuntime::GuessLanguageForSymbolByName (Target &target, const char *symbol_name)
{
- // This is not the right way to do this. Different targets could have different ways of mangling names
- // from a given language. So we should ask the various LanguageRuntime plugin instances for this target
- // to recognize the name. But right now the plugin instances depend on the process, not the target.
- // That is unfortunate, because I want to use this for filtering breakpoints by language, and so I need to know
- // the "language for symbol-name" prior to running. So we'd have to make a "LanguageRuntimeTarget" and
- // "LanguageRuntimeProcess", and direct the questions that don't need a running process to the former, and that
- // do to the latter.
+ // We "guess" the language because we can't determine a symbol's language from it's name.
+ // For example, a Pascal symbol can be mangled using the C++ Itanium scheme, and defined
+ // in a compilation unit within the same module as other C++ units.
+ //
+ // In addition, different targets could have different ways of mangling names from a given
+ // language, likewise compilation units within those targets. It would help to be able to
+ // ask the various LanguageRuntime plugin instances for this target to recognize the name,
+ // but right now the plugin instances depend on the process, not the target. That is
+ // unfortunate, because to use this for filtering breakpoints by language, we need to know
+ // the "language for symbol-name" prior to running. So we'd have to make a
+ // "LanguageRuntimeTarget" and "LanguageRuntimeProcess", and direct the questions that don't
+ // need a running process to the former, and that do to the latter.
//
// That's more work than I want to do for this feature.
if (CPlusPlusLanguage::IsCPPMangledName (symbol_name))
OpenPOWER on IntegriCloud