Index: lldb/lit/Reproducer/Functionalities/Inputs/DataFormatter.in =================================================================== --- /dev/null +++ lldb/lit/Reproducer/Functionalities/Inputs/DataFormatter.in @@ -0,0 +1,7 @@ +breakpoint set -f foo.cpp -l 11 +run +frame var +next +frame var +cont +reproducer generate Index: lldb/lit/Reproducer/Functionalities/Inputs/foo.cpp =================================================================== --- /dev/null +++ lldb/lit/Reproducer/Functionalities/Inputs/foo.cpp @@ -0,0 +1,13 @@ +class Foo { +public: + Foo(int i, double d) : m_i(i), m_d(d){}; + +private: + int m_i; + int m_d; +}; + +int main(int argc, char **argv) { + Foo foo(1, 2.22); + return 0; +} Index: lldb/lit/Reproducer/Functionalities/Inputs/stepping.c =================================================================== --- /dev/null +++ lldb/lit/Reproducer/Functionalities/Inputs/stepping.c @@ -0,0 +1,37 @@ +int a(int); +int b(int); +int c(int); +int complex(int, int, int); + +int a(int val) { + int return_value = val; + + if (val <= 1) { + return_value = b(val); + } else if (val >= 3) { + return_value = c(val); + } + + return return_value; +} + +int b(int val) { + int rc = c(val); + return rc; +} + +int c(int val) { return val + 3; } + +int complex(int first, int second, int third) { return first + second + third; } + +int main(int argc, char const *argv[]) { + int A1 = a(1); + + int B2 = b(2); + + int A3 = a(3); + + int A4 = complex(a(1), b(2), c(3)); + + return 0; +} Index: lldb/lit/Reproducer/Functionalities/TestDataFormatter.test =================================================================== --- /dev/null +++ lldb/lit/Reproducer/Functionalities/TestDataFormatter.test @@ -0,0 +1,16 @@ +# UNSUPPORTED: system-windows, system-freebsd + +# This tests that data formatters continue to work when replaying a reproducer. + +# RUN: rm -rf %t.repro +# RUN: %clang -x c++ %S/Inputs/foo.cpp -g -o %t.out + +# RUN: %lldb -x -b -s %S/Inputs/DataFormatter.in --capture %t.repro %t.out | FileCheck %s +# RUN: %lldb --replay %t.repro | FileCheck %s + +# CHECK: stop reason = breakpoint 1.1 +# CHECK: (Foo) foo = (m_i = 0, m_d = 0) +# CHECK: stop reason = step over +# CHECK: (Foo) foo = (m_i = 1, m_d = 2) +# CHECK: Process {{.*}} resuming +# CHECK: Process {{.*}} exited with status = 0 Index: lldb/lit/Reproducer/Functionalities/TestImagineList.test =================================================================== --- /dev/null +++ lldb/lit/Reproducer/Functionalities/TestImagineList.test @@ -0,0 +1,30 @@ +# UNSUPPORTED: system-windows, system-freebsd + +# This tests that image list works when replaying. We arbitrarily assume +# there's at least two entries and compare that they're identical. + +# RUN: %clang %S/Inputs/stepping.c -g -o %t.out + +# RUN: rm -rf %T/imagelist +# RUN: rm -rf %t.txt + +# RUN: echo "CAPTURE" >> %t.txt +# RUN: %lldb -x -b --capture %t.repro \ +# RUN: -o 'image list' \ +# RUN: -o 'reproducer generate' \ +# RUN: %t.out >> %t.txt 2>&1 + +# RUN: echo "REPLAY" >> %t.txt +# RUN: %lldb -x -b --replay %t.repro >> %t.txt 2>&1 + +# RUN: cat %t.txt | FileCheck %s + +# CHECK: CAPTURE +# CHECK: image list +# CHECK: [ 0] [[ZERO:.*]] +# CHECK: [ 1] [[ONE:.*]] + +# CHECK: REPLAY +# CHECK: image list +# CHECK: [ 0] {{.*}}[[ZERO]] +# CHECK: [ 1] {{.*}}[[ONE]] Index: lldb/lit/Reproducer/Functionalities/TestStepping.test =================================================================== --- /dev/null +++ lldb/lit/Reproducer/Functionalities/TestStepping.test @@ -0,0 +1,99 @@ +# UNSUPPORTED: system-windows, system-freebsd + +# This tests that stepping continues to work when replaying a reproducer. + +# RUN: %clang %S/Inputs/stepping.c -O0 -g -o %t.out +# RUN: grep -v '#' %s > %t.in + +# RUN: %lldb -x -b -s %t.in --capture %t.repro %t.out | FileCheck %s --check-prefix CHECK +# RUN: %lldb --replay %t.repro | FileCheck %s --check-prefix CHECK + +# Set breakpoints in a,b and c and verify we stop there when stepping. + +breakpoint set -f stepping.c -l 28 +# CHECK: Breakpoint 1: {{.*}} stepping.c:28 + +breakpoint set -f stepping.c -l 10 +# CHECK: Breakpoint 2: {{.*}} stepping.c:10 + +breakpoint set -f stepping.c -l 19 +# CHECK: Breakpoint 3: {{.*}} stepping.c:19 + +breakpoint set -f stepping.c -l 23 +# CHECK: Breakpoint 4: {{.*}} stepping.c:23 + +run +# CHECK: Process {{.*}} stopped +# CHECK: stop reason = breakpoint 1.1 + +next +# CHECK: Process {{.*}} stopped +# CHECK: stop reason = breakpoint 2.1 + +next +# CHECK: Process {{.*}} stopped +# CHECK: stop reason = breakpoint 3.1 + +next +# CHECK: Process {{.*}} stopped +# CHECK: stop reason = breakpoint 4.1 + +bt +# CHECK: frame #0: {{.*}}`c +# CHECK: frame #1: {{.*}}`b +# CHECK: frame #2: {{.*}}`a + +# Continue and stop resulting from the step overs. + +cont +# CHECK: Process {{.*}} resuming +# CHECK: Process {{.*}} stopped +# CHECK: stop reason = step over +cont +# CHECK: Process {{.*}} resuming +# CHECK: Process {{.*}} stopped +# CHECK: stop reason = step over +cont +# CHECK: Process {{.*}} resuming +# CHECK: Process {{.*}} stopped +# CHECK: stop reason = step over + +breakpoint disable 1 +# CHECK: 1 breakpoints disabled. + +breakpoint disable 2 +# CHECK: 1 breakpoints disabled. + +breakpoint disable 3 +# CHECK: 1 breakpoints disabled. + +breakpoint disable 4 +# CHECK: 1 breakpoints disabled. + +# Continue to line 48. + +next +# CHECK: stop reason = step over +next +# CHECK: stop reason = step over + +# Step into c. +thread step-in +# CHECK: stop reason = step in +thread step-in +# CHECK: stop reason = step in +thread step-in +# CHECK: stop reason = step in +thread step-in +# CHECK: stop reason = step in +thread step-in +# CHECK: stop reason = step in + +# Finally continue until the end. + +cont +# CHECK: Process {{.*}} resuming +# CHECK: Process {{.*}} exited with status = 0 + +# Generate the reproducer. +reproducer generate