forked from OSchip/llvm-project
Added some simple testcases for figuring out breakpoints by name in
classes & namespaces. llvm-svn: 141629
This commit is contained in:
parent
44c78f809b
commit
32fc9601a1
|
@ -0,0 +1,5 @@
|
|||
LEVEL = ../../../make
|
||||
|
||||
CXX_SOURCES := nested.cpp
|
||||
|
||||
include $(LEVEL)/Makefile.rules
|
|
@ -0,0 +1,102 @@
|
|||
"""
|
||||
Test lldb breakpoint command for CPP methods & functions in a namespace.
|
||||
"""
|
||||
|
||||
import os, time
|
||||
import unittest2
|
||||
import lldb
|
||||
from lldbtest import *
|
||||
|
||||
class CPPBreakpointTestCase(TestBase):
|
||||
|
||||
mydir = os.path.join("lang", "cpp", "breakpoints")
|
||||
|
||||
@unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
|
||||
def test_with_dsym(self):
|
||||
"""Test a sequence of breakpoint command add, list, and delete."""
|
||||
self.buildDsym()
|
||||
self.cpp_breakpoints()
|
||||
|
||||
def test_with_dwarf(self):
|
||||
"""Test a sequence of breakpoint command add, list, and delete."""
|
||||
self.buildDwarf()
|
||||
self.cpp_breakpoints()
|
||||
|
||||
def setUp(self):
|
||||
# Call super's setUp().
|
||||
TestBase.setUp(self)
|
||||
|
||||
def cpp_breakpoints (self):
|
||||
"""Test a sequence of breakpoint command add, list, and delete."""
|
||||
exe = os.path.join(os.getcwd(), "a.out")
|
||||
|
||||
# Create a target from the debugger.
|
||||
|
||||
target = self.dbg.CreateTarget (exe)
|
||||
self.assertTrue(target, VALID_TARGET)
|
||||
|
||||
a_out_module = lldb.SBFileSpecList()
|
||||
a_out_module.Append(lldb.SBFileSpec(exe))
|
||||
|
||||
nested_comp_unit = lldb.SBFileSpecList()
|
||||
nested_comp_unit.Append (lldb.SBFileSpec("nested.cpp"))
|
||||
|
||||
# First provide ONLY the method name. This should get everybody...
|
||||
auto_break = target.BreakpointCreateByName ("Function",
|
||||
lldb.eFunctionNameTypeAuto,
|
||||
a_out_module,
|
||||
nested_comp_unit)
|
||||
self.assertTrue (auto_break.GetNumLocations() == 5)
|
||||
|
||||
# Now add the Baz class specifier. This should get the version contained in Bar,
|
||||
# AND the one contained in ::
|
||||
auto_break = target.BreakpointCreateByName ("Baz::Function",
|
||||
lldb.eFunctionNameTypeAuto,
|
||||
a_out_module,
|
||||
nested_comp_unit)
|
||||
self.assertTrue (auto_break.GetNumLocations() == 2)
|
||||
|
||||
# Then add the Bar::Baz specifier. This should get the version contained in Bar only
|
||||
auto_break = target.BreakpointCreateByName ("Bar::Baz::Function",
|
||||
lldb.eFunctionNameTypeAuto,
|
||||
a_out_module,
|
||||
nested_comp_unit)
|
||||
self.assertTrue (auto_break.GetNumLocations() == 1)
|
||||
|
||||
plain_method_break = target.BreakpointCreateByName ("Function",
|
||||
lldb.eFunctionNameTypeMethod,
|
||||
a_out_module,
|
||||
nested_comp_unit)
|
||||
self.assertTrue (plain_method_break.GetNumLocations() == 3)
|
||||
|
||||
plain_method_break = target.BreakpointCreateByName ("Baz::Function",
|
||||
lldb.eFunctionNameTypeMethod,
|
||||
a_out_module,
|
||||
nested_comp_unit)
|
||||
self.assertTrue (plain_method_break.GetNumLocations() == 2)
|
||||
|
||||
plain_method_break = target.BreakpointCreateByName ("Bar::Baz::Function",
|
||||
lldb.eFunctionNameTypeMethod,
|
||||
a_out_module,
|
||||
nested_comp_unit)
|
||||
self.assertTrue (plain_method_break.GetNumLocations() == 1)
|
||||
|
||||
plain_method_break = target.BreakpointCreateByName ("Function",
|
||||
lldb.eFunctionNameTypeBase,
|
||||
a_out_module,
|
||||
nested_comp_unit)
|
||||
self.assertTrue (plain_method_break.GetNumLocations() == 2)
|
||||
|
||||
plain_method_break = target.BreakpointCreateByName ("Bar::Function",
|
||||
lldb.eFunctionNameTypeBase,
|
||||
a_out_module,
|
||||
nested_comp_unit)
|
||||
self.assertTrue (plain_method_break.GetNumLocations() == 1)
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
import atexit
|
||||
lldb.SBDebugger.Initialize()
|
||||
atexit.register(lambda: lldb.SBDebugger.Terminate())
|
||||
unittest2.main()
|
|
@ -0,0 +1,76 @@
|
|||
#include <stdio.h>
|
||||
|
||||
namespace Foo
|
||||
{
|
||||
namespace Bar
|
||||
{
|
||||
class Baz
|
||||
{
|
||||
public:
|
||||
Baz (int value):m_value(value) {}
|
||||
int Function ()
|
||||
{
|
||||
printf ("%s returning: %d.\n", __FUNCTION__, m_value);
|
||||
return m_value;
|
||||
}
|
||||
private:
|
||||
int m_value;
|
||||
};
|
||||
|
||||
class Baz2
|
||||
{
|
||||
public:
|
||||
Baz2 (int value):m_value(value) {}
|
||||
int Function ()
|
||||
{
|
||||
printf ("%s returning: %d.\n", __FUNCTION__, m_value);
|
||||
return m_value;
|
||||
}
|
||||
private:
|
||||
int m_value;
|
||||
};
|
||||
|
||||
static int bar_value = 20;
|
||||
int Function ()
|
||||
{
|
||||
printf ("%s returning: %d.\n", __FUNCTION__, bar_value);
|
||||
return bar_value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class Baz
|
||||
{
|
||||
public:
|
||||
Baz (int value):m_value(value) {}
|
||||
int Function ()
|
||||
{
|
||||
printf ("%s returning: %d.\n", __FUNCTION__, m_value);
|
||||
return m_value;
|
||||
}
|
||||
private:
|
||||
int m_value;
|
||||
};
|
||||
|
||||
int
|
||||
Function ()
|
||||
{
|
||||
printf ("I am a global function, I return 333.\n");
|
||||
return 333;
|
||||
}
|
||||
|
||||
int main ()
|
||||
{
|
||||
Foo::Bar::Baz mine(200);
|
||||
Foo::Bar::Baz2 mine2(300);
|
||||
::Baz bare_baz (500);
|
||||
|
||||
printf ("Yup, got %d from Baz.\n", mine.Function());
|
||||
printf ("Yup, got %d from Baz.\n", mine2.Function());
|
||||
printf ("Yup, got %d from Baz.\n", bare_baz.Function());
|
||||
printf ("And got %d from Bar.\n", Foo::Bar::Function());
|
||||
printf ("And got %d from ::.\n", ::Function());
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
Loading…
Reference in New Issue