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