Files
clang-p2996/lldb/test/expression_command/formatters/TestFormatters.py
Sean Callanan 0886e5657b Fixed a problem with the IR interpreter that caused
it to generate result variables that were not bound
to their underlying data.  This allowed the SBValue
class to use the interpreter (if possible).

Also made sure that any result variables that point
to stack allocations in the stack frame of the
interpreted expressions do not get live data.

llvm-svn: 140285
2011-09-22 00:41:11 +00:00

176 lines
6.5 KiB
Python

"""
Test using LLDB data formatters with frozen objects coming from the expression parser.
"""
import unittest2
import lldb
import lldbutil
from lldbtest import *
class ExprFormattersTestCase(TestBase):
mydir = os.path.join("expression_command", "formatters")
def setUp(self):
# Call super's setUp().
TestBase.setUp(self)
# Find the line number to break for main.cpp.
self.line = line_number('main.cpp',
'// Stop here')
@unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
def test_with_dsym(self):
"""Test expr + formatters for good interoperability."""
self.buildDsym()
self.do_my_test()
def test_with_dwarf_(self):
"""Test expr + formatters for good interoperability."""
self.buildDsym()
self.do_my_test()
def do_my_test(self):
# This is the function to remove the custom formats in order to have a
# clean slate for the next test case.
def cleanup():
self.runCmd('type summary clear', check=False)
self.runCmd('type synthetic clear', check=False)
# Execute the cleanup function during test case tear down.
self.addTearDownHook(cleanup)
"""Test expr + formatters for good interoperability."""
self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)
self.expect("breakpoint set -f main.cpp -l %d" % self.line,
BREAKPOINT_CREATED,
startstr = "Breakpoint created: 1: file ='main.cpp', line = %d" %
self.line)
self.runCmd("run", RUN_SUCCEEDED)
self.runCmd("script import formatters")
self.runCmd("script import foosynth")
self.runCmd("frame variable foo1 -T")
self.runCmd("frame variable foo1.b -T")
self.runCmd("frame variable foo1.b.b_ref -T")
self.expect("p *(new foo(47))",
substrs = ['(int) a = 47', '(bar) b = {', '(int) i = 94', '(baz) b = {', '(int) k = 99'])
self.runCmd("type summary add -F formatters.foo_SummaryProvider foo")
self.expect("p new int(12)",
substrs = ['(int *) $', ' = 0x'])
self.runCmd("type summary add -s \"${var%pointer} -> ${*var%decimal}\" \"int *\"")
self.expect("p new int(12)",
substrs = ['(int *) $', '= 0x', ' -> 12'])
self.expect("p foo1.a_ptr",
substrs = ['(int *) $', '= 0x', ' -> 13'])
self.expect("p foo1",
substrs = ['(foo) $', ' = a = 12, a_ptr = ', ' -> 13, i = 24, i_ptr = ', ' -> 25'])
self.expect("p new foo(47)",
substrs = ['(foo *) $', ' a = 47, a_ptr = ', ' -> 48, i = 94, i_ptr = ', ' -> 95'])
self.expect("p foo2",
substrs = ['(foo) $', ' = a = 121, a_ptr = ', ' -> 122, i = 242, i_ptr = ', ' -> 243'])
object_name = self.res.GetOutput()
object_name = object_name[7:]
object_name = object_name[0:object_name.find(' =')]
self.expect("frame variable foo2",
substrs = ['(foo)', 'foo2', ' = a = 121, a_ptr = ', ' -> 122, i = 242, i_ptr = ', ' -> 243'])
self.expect("p $" + object_name,
substrs = ['(foo) $', ' = a = 121, a_ptr = ', ' -> 122, i = 242, i_ptr = ', ' -> 243', ', h = 245 , k = 247'])
self.runCmd("type summary delete foo")
self.runCmd("type synthetic add --python-class foosynth.FooSyntheticProvider foo")
self.expect("p $" + object_name,
substrs = ['(foo) $', ' = {', '(int) *i_ptr = 243'])
self.runCmd("n")
self.runCmd("n")
self.runCmd("type synthetic delete foo")
self.runCmd("type summary add -F formatters.foo_SummaryProvider foo")
self.expect("p foo2",
substrs = ['(foo) $', ' = a = 7777, a_ptr = ', ' -> 122, i = 242, i_ptr = ', ' -> 8888'])
self.expect("p $" + object_name + '.a',
substrs = ['7777'])
self.expect("p *$" + object_name + '.b.i_ptr',
substrs = ['8888'])
self.expect("p $" + object_name,
substrs = ['(foo) $', ' = a = 121, a_ptr = ', ' -> 122, i = 242, i_ptr = ', ' -> 8888', 'h = 245 , k = 247'])
self.runCmd("type summary delete foo")
self.runCmd("type synthetic add --python-class foosynth.FooSyntheticProvider foo")
self.expect("p $" + object_name,
substrs = ['(foo) $', ' = {', '(int) *i_ptr = 8888'])
self.runCmd("n")
self.runCmd("type synthetic delete foo")
self.runCmd("type summary add -F formatters.foo_SummaryProvider foo")
self.expect("p $" + object_name,
substrs = ['(foo) $', ' = a = 121, a_ptr = ', ' -> 122, i = 242, i_ptr = ', ' -> 8888', 'h = 9999 , k = 247'])
process = self.dbg.GetSelectedTarget().GetProcess()
thread = process.GetThreadAtIndex(0)
frame = thread.GetSelectedFrame()
frozen = frame.EvaluateExpression("$" + object_name + ".a_ptr")
a_data = frozen.GetPointeeData()
error = lldb.SBError()
self.assertTrue(a_data.GetUnsignedInt32(error, 0) == 122, '*a_ptr = 122')
self.runCmd("n");self.runCmd("n");self.runCmd("n");
self.expect("frame variable numbers",
substrs = ['1','2','3','4','5'])
self.expect("p numbers",
substrs = ['1','2','3','4','5'])
frozen = frame.EvaluateExpression("&numbers")
a_data = frozen.GetPointeeData(0, 1)
self.assertTrue(a_data.GetUnsignedInt32(error, 0) == 1, 'numbers[0] == 1')
self.assertTrue(a_data.GetUnsignedInt32(error, 4) == 2, 'numbers[1] == 2')
self.assertTrue(a_data.GetUnsignedInt32(error, 8) == 3, 'numbers[2] == 3')
self.assertTrue(a_data.GetUnsignedInt32(error, 12) == 4, 'numbers[3] == 4')
self.assertTrue(a_data.GetUnsignedInt32(error, 16) == 5, 'numbers[4] == 5')
frozen = frame.EvaluateExpression("numbers")
a_data = frozen.GetData()
self.assertTrue(a_data.GetUnsignedInt32(error, 0) == 1, 'numbers[0] == 1')
self.assertTrue(a_data.GetUnsignedInt32(error, 4) == 2, 'numbers[1] == 2')
self.assertTrue(a_data.GetUnsignedInt32(error, 8) == 3, 'numbers[2] == 3')
self.assertTrue(a_data.GetUnsignedInt32(error, 12) == 4, 'numbers[3] == 4')
self.assertTrue(a_data.GetUnsignedInt32(error, 16) == 5, 'numbers[4] == 5')
if __name__ == '__main__':
import atexit
lldb.SBDebugger.Initialize()
atexit.register(lambda: lldb.SBDebugger.Terminate())
unittest2.main()