diff options
author | Johnny Chen <johnny.chen@apple.com> | 2010-11-09 17:51:11 +0000 |
---|---|---|
committer | Johnny Chen <johnny.chen@apple.com> | 2010-11-09 17:51:11 +0000 |
commit | 22c3f3028dc930bf00d13cff8faa76d0cf3f5b6c (patch) | |
tree | 5b085f66c276d9ac25003668d8616a08dd039539 | |
parent | 91bfeb10b524ac5de08b57953fca0e92e38b7fc7 (diff) | |
download | bcm5719-llvm-22c3f3028dc930bf00d13cff8faa76d0cf3f5b6c.tar.gz bcm5719-llvm-22c3f3028dc930bf00d13cff8faa76d0cf3f5b6c.zip |
Add a test for expression parser crash which has been fixed.
llvm-svn: 118590
-rw-r--r-- | lldb/test/expression_command/radar_8638051/Makefile | 5 | ||||
-rw-r--r-- | lldb/test/expression_command/radar_8638051/Test8638051.py | 43 | ||||
-rw-r--r-- | lldb/test/expression_command/radar_8638051/main.c | 54 |
3 files changed, 102 insertions, 0 deletions
diff --git a/lldb/test/expression_command/radar_8638051/Makefile b/lldb/test/expression_command/radar_8638051/Makefile new file mode 100644 index 00000000000..0d70f259501 --- /dev/null +++ b/lldb/test/expression_command/radar_8638051/Makefile @@ -0,0 +1,5 @@ +LEVEL = ../../make + +C_SOURCES := main.c + +include $(LEVEL)/Makefile.rules diff --git a/lldb/test/expression_command/radar_8638051/Test8638051.py b/lldb/test/expression_command/radar_8638051/Test8638051.py new file mode 100644 index 00000000000..89c8b9e8aef --- /dev/null +++ b/lldb/test/expression_command/radar_8638051/Test8638051.py @@ -0,0 +1,43 @@ +""" +Test the robustness of lldb expression parser. +""" + +import os, time +import unittest2 +import lldb +from lldbtest import * + +class Radar8638051TestCase(TestBase): + + mydir = os.path.join("expression_command", "radar_8638051") + + def test_expr_commands(self): + """The following expression commands should not crash.""" + self.buildDefault() + + self.runCmd("file a.out", CURRENT_EXECUTABLE_SET) + + self.runCmd("breakpoint set -n c") + + self.runCmd("run", RUN_SUCCEEDED) + + self.expect("expression val", + startstr = "(int) $0 = 1") + # (int) $0 = 1 + + self.expect("expression *(&val)", + startstr = "(int) $1 = 1") + # (int) $1 = 1 + + # rdar://problem/8638051 + # lldb expression command: Could this crash be avoided + self.expect("expression &val", + startstr = "(int *) $2 = ") + # (int *) $2 = 0x.... + + +if __name__ == '__main__': + import atexit + lldb.SBDebugger.Initialize() + atexit.register(lambda: lldb.SBDebugger.Terminate()) + unittest2.main() diff --git a/lldb/test/expression_command/radar_8638051/main.c b/lldb/test/expression_command/radar_8638051/main.c new file mode 100644 index 00000000000..1329fd69a2e --- /dev/null +++ b/lldb/test/expression_command/radar_8638051/main.c @@ -0,0 +1,54 @@ +//===-- main.c --------------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +#include <stdio.h> + +// This simple program is to demonstrate the capability of the lldb command +// "breakpoint command add" to add a set of commands to a breakpoint to be +// executed when the breakpoint is hit. +// +// In particular, we want to break within c(), but only if the immediate caller +// is a(). + +int a(int); +int b(int); +int c(int); + +int a(int val) +{ + if (val <= 1) + return b(val); + else if (val >= 3) + return c(val); // Find the line number where c's parent frame is a here. + + return val; +} + +int b(int val) +{ + return c(val); +} + +int c(int val) +{ + return val + 3; +} + +int main (int argc, char const *argv[]) +{ + int A1 = a(1); // a(1) -> b(1) -> c(1) + printf("a(1) returns %d\n", A1); + + int B2 = b(2); // b(2) -> c(2) + printf("b(2) returns %d\n", B2); + + int A3 = a(3); // a(3) -> c(3) + printf("a(3) returns %d\n", A3); + + return 0; +} |