[Lldb-commits] [lldb] r300012 - Teach SBFrame how to guess its language.
Jim Ingham via lldb-commits
lldb-commits at lists.llvm.org
Tue Apr 11 17:19:55 PDT 2017
Author: jingham
Date: Tue Apr 11 19:19:54 2017
New Revision: 300012
URL: http://llvm.org/viewvc/llvm-project?rev=300012&view=rev
Log:
Teach SBFrame how to guess its language.
<rdar://problem/31411646>
Added:
lldb/trunk/packages/Python/lldbsuite/test/functionalities/frame-language/
lldb/trunk/packages/Python/lldbsuite/test/functionalities/frame-language/Makefile
lldb/trunk/packages/Python/lldbsuite/test/functionalities/frame-language/TestGuessLanguage.py
lldb/trunk/packages/Python/lldbsuite/test/functionalities/frame-language/main.cpp
lldb/trunk/packages/Python/lldbsuite/test/functionalities/frame-language/other-2.cpp
lldb/trunk/packages/Python/lldbsuite/test/functionalities/frame-language/other.cpp
lldb/trunk/packages/Python/lldbsuite/test/functionalities/frame-language/other.h
lldb/trunk/packages/Python/lldbsuite/test/functionalities/frame-language/somefunc.c
Modified:
lldb/trunk/include/lldb/API/SBFrame.h
lldb/trunk/scripts/interface/SBFrame.i
lldb/trunk/source/API/SBFrame.cpp
lldb/trunk/source/Core/Mangled.cpp
lldb/trunk/source/Target/StackFrame.cpp
Modified: lldb/trunk/include/lldb/API/SBFrame.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/API/SBFrame.h?rev=300012&r1=300011&r2=300012&view=diff
==============================================================================
--- lldb/trunk/include/lldb/API/SBFrame.h (original)
+++ lldb/trunk/include/lldb/API/SBFrame.h Tue Apr 11 19:19:54 2017
@@ -78,6 +78,10 @@ public:
const char *GetDisplayFunctionName();
const char *GetFunctionName() const;
+
+ // Return the frame function's language. If there isn't a function, then
+ // guess the language type from the mangled name.
+ lldb::LanguageType GuessLanguage() const;
/// Return true if this frame represents an inlined function.
///
Added: lldb/trunk/packages/Python/lldbsuite/test/functionalities/frame-language/Makefile
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/frame-language/Makefile?rev=300012&view=auto
==============================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/functionalities/frame-language/Makefile (added)
+++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/frame-language/Makefile Tue Apr 11 19:19:54 2017
@@ -0,0 +1,12 @@
+LEVEL = ../../make
+
+CXX_SOURCES := main.cpp other.cpp other-2.cpp
+C_SOURCES := somefunc.c
+
+include $(LEVEL)/Makefile.rules
+
+other-2.o: other-2.cpp
+ $(CXX) $(CFLAGS_NO_DEBUG) -c other-2.cpp
+
+somefunc.o: somefunc.c
+ $(CC) $(CFLAGS) -std=c99 -c somefunc.c
\ No newline at end of file
Added: lldb/trunk/packages/Python/lldbsuite/test/functionalities/frame-language/TestGuessLanguage.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/frame-language/TestGuessLanguage.py?rev=300012&view=auto
==============================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/functionalities/frame-language/TestGuessLanguage.py (added)
+++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/frame-language/TestGuessLanguage.py Tue Apr 11 19:19:54 2017
@@ -0,0 +1,81 @@
+"""
+Test the SB API SBFrame::GuessLanguage.
+"""
+
+from __future__ import print_function
+
+
+import os
+import time
+import re
+import lldb
+import lldbsuite.test.lldbutil as lldbutil
+from lldbsuite.test.lldbtest import *
+
+
+class TestFrameGuessLanguage(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ # If your test case doesn't stress debug info, the
+ # set this to true. That way it won't be run once for
+ # each debug info format.
+ NO_DEBUG_INFO_TESTCASE = True
+
+ def test_guess_language(self):
+ """Test GuessLanguage for C and C++."""
+ self.build()
+ self.do_test()
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+
+ def check_language(self, thread, frame_no, test_lang):
+ frame = thread.frames[frame_no]
+ self.assertTrue(frame.IsValid(), "Frame %d was not valid."%(frame_no))
+ lang = frame.GuessLanguage()
+ self.assertEqual(lang, test_lang)
+
+ def do_test(self):
+ """Test GuessLanguage for C & C++."""
+ exe = os.path.join(os.getcwd(), "a.out")
+
+ # Create a target by the debugger.
+ target = self.dbg.CreateTarget(exe)
+ self.assertTrue(target, VALID_TARGET)
+
+ # Now create a breakpoint in main.c at the source matching
+ # "Set a breakpoint here"
+ breakpoint = target.BreakpointCreateBySourceRegex(
+ "Set breakpoint here", lldb.SBFileSpec("somefunc.c"))
+ self.assertTrue(breakpoint and
+ breakpoint.GetNumLocations() >= 1,
+ VALID_BREAKPOINT)
+
+ error = lldb.SBError()
+ # This is the launch info. If you want to launch with arguments or
+ # environment variables, add them using SetArguments or
+ # SetEnvironmentEntries
+
+ launch_info = lldb.SBLaunchInfo(None)
+ process = target.Launch(launch_info, error)
+ self.assertTrue(process, PROCESS_IS_VALID)
+
+ # Did we hit our breakpoint?
+ from lldbsuite.test.lldbutil import get_threads_stopped_at_breakpoint
+ threads = get_threads_stopped_at_breakpoint(process, breakpoint)
+ self.assertTrue(
+ len(threads) == 1,
+ "There should be a thread stopped at our breakpoint")
+
+ # The hit count for the breakpoint should be 1.
+ self.assertTrue(breakpoint.GetHitCount() == 1)
+
+ thread = threads[0]
+ self.check_language(thread, 0, lldb.eLanguageTypeC99)
+ self.check_language(thread, 1, lldb.eLanguageTypeC_plus_plus)
+ self.check_language(thread, 2, lldb.eLanguageTypeC_plus_plus)
+
+
+
Added: lldb/trunk/packages/Python/lldbsuite/test/functionalities/frame-language/main.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/frame-language/main.cpp?rev=300012&view=auto
==============================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/functionalities/frame-language/main.cpp (added)
+++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/frame-language/main.cpp Tue Apr 11 19:19:54 2017
@@ -0,0 +1,10 @@
+#include <stdio.h>
+#include "other.h"
+
+int
+main()
+{
+ int test_var = 10;
+ Other::DoSomethingElse();
+ return 0;
+}
Added: lldb/trunk/packages/Python/lldbsuite/test/functionalities/frame-language/other-2.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/frame-language/other-2.cpp?rev=300012&view=auto
==============================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/functionalities/frame-language/other-2.cpp (added)
+++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/frame-language/other-2.cpp Tue Apr 11 19:19:54 2017
@@ -0,0 +1,7 @@
+#include "other.h"
+
+void
+Other::DoSomethingElse()
+{
+ DoSomething();
+}
Added: lldb/trunk/packages/Python/lldbsuite/test/functionalities/frame-language/other.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/frame-language/other.cpp?rev=300012&view=auto
==============================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/functionalities/frame-language/other.cpp (added)
+++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/frame-language/other.cpp Tue Apr 11 19:19:54 2017
@@ -0,0 +1,10 @@
+#include "other.h"
+
+extern "C" void some_func();
+
+void
+Other::DoSomething()
+{
+ some_func();
+}
+
Added: lldb/trunk/packages/Python/lldbsuite/test/functionalities/frame-language/other.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/frame-language/other.h?rev=300012&view=auto
==============================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/functionalities/frame-language/other.h (added)
+++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/frame-language/other.h Tue Apr 11 19:19:54 2017
@@ -0,0 +1,7 @@
+class Other
+{
+ public:
+ static void DoSomething();
+ static void DoSomethingElse();
+};
+
Added: lldb/trunk/packages/Python/lldbsuite/test/functionalities/frame-language/somefunc.c
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/frame-language/somefunc.c?rev=300012&view=auto
==============================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/functionalities/frame-language/somefunc.c (added)
+++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/frame-language/somefunc.c Tue Apr 11 19:19:54 2017
@@ -0,0 +1,7 @@
+#include <stdio.h>
+
+void
+some_func()
+{
+ printf("Set breakpoint here.");
+}
Modified: lldb/trunk/scripts/interface/SBFrame.i
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/interface/SBFrame.i?rev=300012&r1=300011&r2=300012&view=diff
==============================================================================
--- lldb/trunk/scripts/interface/SBFrame.i (original)
+++ lldb/trunk/scripts/interface/SBFrame.i Tue Apr 11 19:19:54 2017
@@ -133,6 +133,14 @@ public:
const char *
GetFunctionName() const;
+
+ %feature("docstring", "
+ /// Returns the language of the frame's SBFunction, or if there.
+ /// is no SBFunction, guess the language from the mangled name.
+ /// .
+ ") GuessLanguage;
+ lldb::LanguageType
+ GuessLanguage() const;
%feature("docstring", "
/// Return true if this frame represents an inlined function.
Modified: lldb/trunk/source/API/SBFrame.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBFrame.cpp?rev=300012&r1=300011&r2=300012&view=diff
==============================================================================
--- lldb/trunk/source/API/SBFrame.cpp (original)
+++ lldb/trunk/source/API/SBFrame.cpp Tue Apr 11 19:19:54 2017
@@ -1370,6 +1370,25 @@ const char *SBFrame::GetFunctionName() {
return static_cast<const SBFrame *>(this)->GetFunctionName();
}
+lldb::LanguageType SBFrame::GuessLanguage() const {
+ std::unique_lock<std::recursive_mutex> lock;
+ ExecutionContext exe_ctx(m_opaque_sp.get(), lock);
+
+ StackFrame *frame = nullptr;
+ Target *target = exe_ctx.GetTargetPtr();
+ Process *process = exe_ctx.GetProcessPtr();
+ if (target && process) {
+ Process::StopLocker stop_locker;
+ if (stop_locker.TryLock(&process->GetRunLock())) {
+ frame = exe_ctx.GetFramePtr();
+ if (frame) {
+ return frame->GuessLanguage();
+ }
+ }
+ }
+ return eLanguageTypeUnknown;
+}
+
const char *SBFrame::GetFunctionName() const {
Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
const char *name = nullptr;
Modified: lldb/trunk/source/Core/Mangled.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Mangled.cpp?rev=300012&r1=300011&r2=300012&view=diff
==============================================================================
--- lldb/trunk/source/Core/Mangled.cpp (original)
+++ lldb/trunk/source/Core/Mangled.cpp Tue Apr 11 19:19:54 2017
@@ -432,6 +432,14 @@ lldb::LanguageType Mangled::GuessLanguag
else if (ObjCLanguage::IsPossibleObjCMethodName(mangled_name))
return lldb::eLanguageTypeObjC;
}
+ } else {
+ // ObjC names aren't really mangled, so they won't necessarily be in the
+ // mangled name slot.
+ ConstString demangled_name = GetDemangledName(lldb::eLanguageTypeUnknown);
+ if (demangled_name
+ && ObjCLanguage::IsPossibleObjCMethodName(demangled_name.GetCString()))
+ return lldb::eLanguageTypeObjC;
+
}
return lldb::eLanguageTypeUnknown;
}
Modified: lldb/trunk/source/Target/StackFrame.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/StackFrame.cpp?rev=300012&r1=300011&r2=300012&view=diff
==============================================================================
--- lldb/trunk/source/Target/StackFrame.cpp (original)
+++ lldb/trunk/source/Target/StackFrame.cpp Tue Apr 11 19:19:54 2017
@@ -1212,9 +1212,14 @@ lldb::LanguageType StackFrame::GuessLang
LanguageType lang_type = GetLanguage();
if (lang_type == eLanguageTypeUnknown) {
- Function *f = GetSymbolContext(eSymbolContextFunction).function;
- if (f) {
- lang_type = f->GetMangled().GuessLanguage();
+ SymbolContext sc = GetSymbolContext(eSymbolContextFunction
+ | eSymbolContextSymbol);
+ if (sc.function) {
+ lang_type = sc.function->GetMangled().GuessLanguage();
+ }
+ else if (sc.symbol)
+ {
+ lang_type = sc.symbol->GetMangled().GuessLanguage();
}
}
More information about the lldb-commits
mailing list