Index: lit/Reproducer/Functionalities/Inputs/DataFormatter.in =================================================================== --- /dev/null +++ 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: lit/Reproducer/Functionalities/Inputs/Stepping.in =================================================================== --- /dev/null +++ lit/Reproducer/Functionalities/Inputs/Stepping.in @@ -0,0 +1,51 @@ +# Set breakpoints in a,b and c and verify we stop there when stepping. +breakpoint set -f stepping.c -l 42 +breakpoint set -f stepping.c -l 20 +breakpoint set -f stepping.c -l 29 +breakpoint set -f stepping.c -l 34 + +# Start the process. +run + +# Stop in main because of breakpoint 1. +next + +# Stop in a because of breakpoint 2. +next + +# Stop in b because of breakpoint 3. +next + +# Stop in c because of breakpoint 4. +bt + +# Continue and stop resulting from the step overs. +cont +cont +cont + +# Disable our breakpoints. +breakpoint disable 1 +breakpoint disable 2 +breakpoint disable 3 +breakpoint disable 4 + +# Continue to line 48. +next +next + +# Step into C. +thread step-in +thread step-in +thread step-in +thread step-in +thread step-in + +# Verify that we're in C. +bt + +# Finally continue until the end. +cont + +# Generate the reproducer. +reproducer generate Index: lit/Reproducer/Functionalities/Inputs/foo.cpp =================================================================== --- /dev/null +++ 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: lit/Reproducer/Functionalities/Inputs/stepping.c =================================================================== --- /dev/null +++ lit/Reproducer/Functionalities/Inputs/stepping.c @@ -0,0 +1,51 @@ +//===-- stepping.c ----------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +#include + +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: lit/Reproducer/Functionalities/TestDataFormatter.test =================================================================== --- /dev/null +++ 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/dataformatter +# RUN: %clang -x c++ %S/Inputs/foo.cpp -g -o %t.out + +# RUN: %lldb -x -b -s %S/Inputs/DataFormatter.in --capture %T/dataformatter %t.out | FileCheck %s +# RUN: %lldb --replay %T/dataformatter %t.out | 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: lit/Reproducer/Functionalities/TestImagineList.test =================================================================== --- /dev/null +++ lit/Reproducer/Functionalities/TestImagineList.test @@ -0,0 +1,32 @@ +# 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/imagelist \ +# RUN: -o 'image list' \ +# RUN: -o 'reproducer generate' \ +# RUN: %t.out >> %t.txt 2>&1 + +# RUN: rm -rf + +# RUN: echo "REPLAY" >> %t.txt +# RUN: %lldb -x -b --replay %T/imagelist %t.out >> %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: lit/Reproducer/Functionalities/TestStepping.test =================================================================== --- /dev/null +++ lit/Reproducer/Functionalities/TestStepping.test @@ -0,0 +1,51 @@ +# UNSUPPORTED: system-windows, system-freebsd + +# This tests that stepping continues to work when replaying a reproducer. + +# RUN: rm -rf %T/stepping +# RUN: %clang %S/Inputs/stepping.c -g -o %t.out + +# RUN: %lldb -x -b -s %S/Inputs/Stepping.in --capture %T/stepping %t.out | FileCheck %s --check-prefix CHECK --check-prefix CAPTURE +# RUN: %lldb --replay %T/stepping %t.out | FileCheck %s --check-prefix CHECK --check-prefix REPLAY + +# CHECK: Breakpoint 1: {{.*}} stepping.c:42 +# CHECK: Breakpoint 2: {{.*}} stepping.c:20 +# CHECK: Breakpoint 3: {{.*}} stepping.c:29 +# CHECK: Breakpoint 4: {{.*}} stepping.c:34 + +# CHECK: Process {{.*}} stopped +# CHECK: stop reason = breakpoint 1.1 +# CHECK: Process {{.*}} stopped +# CHECK: stop reason = breakpoint 2.1 +# CHECK: Process {{.*}} stopped +# CHECK: stop reason = breakpoint 3.1 +# CHECK: Process {{.*}} stopped +# CHECK: stop reason = breakpoint 4.1 + +# CHECK: frame #0: {{.*}}`c +# CHECK: frame #1: {{.*}}`b +# CHECK: frame #2: {{.*}}`a + +# CHECK: Process {{.*}} resuming +# CHECK: Process {{.*}} stopped + +# CHECK: stop reason = step over +# CHECK: stop reason = step over +# CHECK: stop reason = step over + +# CHECK: 1 breakpoints disabled. +# CHECK: 1 breakpoints disabled. +# CHECK: 1 breakpoints disabled. +# CHECK: 1 breakpoints disabled. + +# CHECK: stop reason = step over +# CHECK: stop reason = step over + +# CHECK: stop reason = step in +# CHECK: stop reason = step in +# CHECK: stop reason = step in +# CHECK: stop reason = step in +# CHECK: stop reason = step in + +# CHECK: Process {{.*}} resuming +# CHECK: Process {{.*}} exited with status = 0