Author: dperchik
Date: Fri Dec  4 13:34:00 2015
New Revision: 254753

URL: http://llvm.org/viewvc/llvm-project?rev=254753&view=rev
Log:
Fix breakpoint language filtering for other C variants (like C99) and Pascal.

This patch fixes setting breakpoints on symbol for variants of C and
Pascal where the language is "unknown" within the filter-by-language
process added in r252356. It also renames GetLanguageForSymbolByName to
GuessLanguageForSymbolByName and adds comments explaining the pitfalls
of the flawed assumption that the language can be determined solely from
the name and target.

Reviewed by: jingham
Subscribers: lldb-commits
Differential Revision: http://reviews.llvm.org/D15175

Modified:
    lldb/trunk/include/lldb/Target/LanguageRuntime.h
    lldb/trunk/source/Breakpoint/BreakpointResolverName.cpp
    lldb/trunk/source/Target/LanguageRuntime.cpp

Modified: lldb/trunk/include/lldb/Target/LanguageRuntime.h
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/LanguageRuntime.h?rev=254753&r1=254752&r2=254753&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Target/LanguageRuntime.h (original)
+++ lldb/trunk/include/lldb/Target/LanguageRuntime.h Fri Dec  4 13:34:00 2015
@@ -118,7 +118,7 @@ public:
     }
     
     static lldb::LanguageType
-    GetLanguageForSymbolByName (Target &target, const char *symbol_name);
+    GuessLanguageForSymbolByName (Target &target, const char *symbol_name);
     
     Target&
     GetTargetRef()

Modified: lldb/trunk/source/Breakpoint/BreakpointResolverName.cpp
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Breakpoint/BreakpointResolverName.cpp?rev=254753&r1=254752&r2=254753&view=diff
==============================================================================
--- lldb/trunk/source/Breakpoint/BreakpointResolverName.cpp (original)
+++ lldb/trunk/source/Breakpoint/BreakpointResolverName.cpp Fri Dec  4 13:34:00 
2015
@@ -279,8 +279,9 @@ BreakpointResolverName::SearchCallback(S
                 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(S
                     }
                     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;
                     }
                 }

Modified: lldb/trunk/source/Target/LanguageRuntime.cpp
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/LanguageRuntime.cpp?rev=254753&r1=254752&r2=254753&view=diff
==============================================================================
--- lldb/trunk/source/Target/LanguageRuntime.cpp (original)
+++ lldb/trunk/source/Target/LanguageRuntime.cpp Fri Dec  4 13:34:00 2015
@@ -347,15 +347,20 @@ LanguageRuntime::CreateExceptionSearchFi
 }
 
 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))


_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to