diff options
| author | Jonas Devlieghere <jonas@devlieghere.com> | 2019-10-09 19:22:02 +0000 |
|---|---|---|
| committer | Jonas Devlieghere <jonas@devlieghere.com> | 2019-10-09 19:22:02 +0000 |
| commit | 87aa9c9e4d41ed881453e2fab85b3d25f648bb55 (patch) | |
| tree | 63efe79832bf3de4f63e4e81c62e73923947b882 /lldb/test/Shell/Reproducer | |
| parent | fd18e94697c987d5f24e25aa4e27adaffff3cce4 (diff) | |
| download | bcm5719-llvm-87aa9c9e4d41ed881453e2fab85b3d25f648bb55.tar.gz bcm5719-llvm-87aa9c9e4d41ed881453e2fab85b3d25f648bb55.zip | |
Re-land "[test] Split LLDB tests into API, Shell & Unit"
The original patch got reverted because it broke `check-lldb` on a clean
build. This fixes that.
llvm-svn: 374201
Diffstat (limited to 'lldb/test/Shell/Reproducer')
22 files changed, 427 insertions, 0 deletions
diff --git a/lldb/test/Shell/Reproducer/Functionalities/Inputs/DataFormatter.in b/lldb/test/Shell/Reproducer/Functionalities/Inputs/DataFormatter.in new file mode 100644 index 00000000000..5c4e821656d --- /dev/null +++ b/lldb/test/Shell/Reproducer/Functionalities/Inputs/DataFormatter.in @@ -0,0 +1,7 @@ +breakpoint set -f foo.cpp -l 11 +run +frame var foo +next +frame var foo +cont +reproducer generate diff --git a/lldb/test/Shell/Reproducer/Functionalities/Inputs/foo.cpp b/lldb/test/Shell/Reproducer/Functionalities/Inputs/foo.cpp new file mode 100644 index 00000000000..91f27388d0c --- /dev/null +++ b/lldb/test/Shell/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) { + static Foo foo(1, 2.22); + return 0; +} diff --git a/lldb/test/Shell/Reproducer/Functionalities/Inputs/stepping.c b/lldb/test/Shell/Reproducer/Functionalities/Inputs/stepping.c new file mode 100644 index 00000000000..7b56eb22193 --- /dev/null +++ b/lldb/test/Shell/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; +} diff --git a/lldb/test/Shell/Reproducer/Functionalities/TestDataFormatter.test b/lldb/test/Shell/Reproducer/Functionalities/TestDataFormatter.test new file mode 100644 index 00000000000..8ee181e8035 --- /dev/null +++ b/lldb/test/Shell/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: %clangxx %S/Inputs/foo.cpp -g -o %t.out + +# RUN: %lldb -x -b -s %S/Inputs/DataFormatter.in --capture --capture-path %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 diff --git a/lldb/test/Shell/Reproducer/Functionalities/TestImageList.test b/lldb/test/Shell/Reproducer/Functionalities/TestImageList.test new file mode 100644 index 00000000000..d0abae164f0 --- /dev/null +++ b/lldb/test/Shell/Reproducer/Functionalities/TestImageList.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.txt + +# RUN: echo "CAPTURE" >> %t.txt +# RUN: %lldb -x -b --capture --capture-path %t.repro \ +# RUN: -o 'run' \ +# 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]] diff --git a/lldb/test/Shell/Reproducer/Functionalities/TestStepping.test b/lldb/test/Shell/Reproducer/Functionalities/TestStepping.test new file mode 100644 index 00000000000..f43680f3e22 --- /dev/null +++ b/lldb/test/Shell/Reproducer/Functionalities/TestStepping.test @@ -0,0 +1,100 @@ +# UNSUPPORTED: system-windows, system-freebsd + +# This tests that stepping continues to work when replaying a reproducer. + +# RUN: rm -rf %t.repro +# 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 --capture-path %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 diff --git a/lldb/test/Shell/Reproducer/Inputs/FileCapture.in b/lldb/test/Shell/Reproducer/Inputs/FileCapture.in new file mode 100644 index 00000000000..2c69487575e --- /dev/null +++ b/lldb/test/Shell/Reproducer/Inputs/FileCapture.in @@ -0,0 +1,4 @@ +run +reproducer status +reproducer dump -p files +reproducer generate diff --git a/lldb/test/Shell/Reproducer/Inputs/GDBRemoteCapture.in b/lldb/test/Shell/Reproducer/Inputs/GDBRemoteCapture.in new file mode 100644 index 00000000000..e632c821d57 --- /dev/null +++ b/lldb/test/Shell/Reproducer/Inputs/GDBRemoteCapture.in @@ -0,0 +1,6 @@ +breakpoint set -f simple.c -l 12 +run +bt +cont +reproducer status +reproducer generate diff --git a/lldb/test/Shell/Reproducer/Inputs/simple.c b/lldb/test/Shell/Reproducer/Inputs/simple.c new file mode 100644 index 00000000000..ef14878bcf9 --- /dev/null +++ b/lldb/test/Shell/Reproducer/Inputs/simple.c @@ -0,0 +1,18 @@ +//===-- main.c --------------------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include <stdio.h> + +void foo() { + printf("testing\n"); +} + +int main (int argc, char const *argv[]) { + foo(); + return 0; +} diff --git a/lldb/test/Shell/Reproducer/Modules/Inputs/Bar.h b/lldb/test/Shell/Reproducer/Modules/Inputs/Bar.h new file mode 100644 index 00000000000..d004baf3168 --- /dev/null +++ b/lldb/test/Shell/Reproducer/Modules/Inputs/Bar.h @@ -0,0 +1,3 @@ +struct Bar { + int success; +}; diff --git a/lldb/test/Shell/Reproducer/Modules/Inputs/Foo.h b/lldb/test/Shell/Reproducer/Modules/Inputs/Foo.h new file mode 100644 index 00000000000..1fe02e89786 --- /dev/null +++ b/lldb/test/Shell/Reproducer/Modules/Inputs/Foo.h @@ -0,0 +1 @@ +struct Foo {}; diff --git a/lldb/test/Shell/Reproducer/Modules/Inputs/ModuleCXX.in b/lldb/test/Shell/Reproducer/Modules/Inputs/ModuleCXX.in new file mode 100644 index 00000000000..0f5bb7864f2 --- /dev/null +++ b/lldb/test/Shell/Reproducer/Modules/Inputs/ModuleCXX.in @@ -0,0 +1,6 @@ +breakpoint set -f main.cpp -l 5 +run +expr -l Objective-C++ -- @import Foo +expr -l Objective-C++ -- @import Bar +expr -- Bar() +reproducer generate diff --git a/lldb/test/Shell/Reproducer/Modules/Inputs/main.cpp b/lldb/test/Shell/Reproducer/Modules/Inputs/main.cpp new file mode 100644 index 00000000000..e6a331bb405 --- /dev/null +++ b/lldb/test/Shell/Reproducer/Modules/Inputs/main.cpp @@ -0,0 +1,9 @@ +#include "Foo.h" + +void stop() {} + +int main(int argc, char **argv) { + Foo foo; + stop(); // break here. + return 0; +} diff --git a/lldb/test/Shell/Reproducer/Modules/Inputs/module.modulemap b/lldb/test/Shell/Reproducer/Modules/Inputs/module.modulemap new file mode 100644 index 00000000000..4221d0f9134 --- /dev/null +++ b/lldb/test/Shell/Reproducer/Modules/Inputs/module.modulemap @@ -0,0 +1,7 @@ +module Foo { + header "Foo.h" +} + +module Bar { + header "Bar.h" +} diff --git a/lldb/test/Shell/Reproducer/Modules/TestModuleCXX.test b/lldb/test/Shell/Reproducer/Modules/TestModuleCXX.test new file mode 100644 index 00000000000..843c7e6d1ff --- /dev/null +++ b/lldb/test/Shell/Reproducer/Modules/TestModuleCXX.test @@ -0,0 +1,37 @@ +# REQUIRES: system-darwin + +# Start fresh. +# RUN: rm -rf %t.repro +# RUN: rm -rf %t.root +# RUN: rm -rf %t.clang-cache +# RUN: rm -rf %t.lldb-cache + +# Create a temporary root we can remove later. +# RUN: mkdir -p %t.root +# RUN: mkdir -p %t.clang-cache +# RUN: mkdir -p %t.lldb-cache +# RUN: cp %S/Inputs/main.cpp %t.root +# RUN: cp %S/Inputs/Foo.h %t.root +# RUN: cp %S/Inputs/Bar.h %t.root +# RUN: cp %S/Inputs/module.modulemap %t.root + +# Compile the test case form the temporary root. +# RUN: %clang %t.root/main.cpp -g -fmodules -fcxx-modules -fmodules-cache-path=%t.clang-cache -o %t.root/a.out + +# Capture the debug session. +# RUN: %lldb -x -b -o 'settings set symbols.clang-modules-cache-path %t.lldb-cache' -s %S/Inputs/ModuleCXX.in --capture --capture-path %t.repro %t.root/a.out | FileCheck %s --check-prefix CAPTURE +# CAPTURE: (success = 0) + +# RUN: cat %t.repro/files.yaml | FileCheck %s --check-prefix YAML +# YAML-DAG: Foo.h +# YAML-DAG: Bar.h +# YAML-DAG: module.modulemap + +# Remove the temporary root. +# RUN: rm -rf %t.root +# RUN: rm -rf %t.clang-cache +# RUN: rm -rf %t.lldb-cache + +# Replay the debug session. +# RUN: %lldb -x -b -o 'settings set symbols.clang-modules-cache-path %t.lldb-cache' -s %S/Inputs/ModuleCXX.in --replay %t.repro %t.root/a.out | FileCheck %s --check-prefix REPLAY +# REPLAY: (success = 0) diff --git a/lldb/test/Shell/Reproducer/TestDriverOptions.test b/lldb/test/Shell/Reproducer/TestDriverOptions.test new file mode 100644 index 00000000000..4b5dfbf063c --- /dev/null +++ b/lldb/test/Shell/Reproducer/TestDriverOptions.test @@ -0,0 +1,17 @@ +# Check that errors are propagated to the driver. +# +# RUN: not %lldb --capture --capture-path %t/bogus/bogus 2>&1 | FileCheck %s --check-prefix INVALID-CAPTURE +# RUN: not %lldb --replay %t/bogus/bogus 2>&1 | FileCheck %s --check-prefix INVALID-REPLAY +# +# INVALID-CAPTURE: unable to create reproducer directory +# INVALID-REPLAY: unable to load reproducer index + +# Check that all option combination work as expected. +# +# RUN: %lldb --capture --capture-path %t.repro -b -o 'reproducer status' 2>&1 | FileCheck %s --check-prefix NO-WARNING --check-prefix STATUS-CAPTURE +# RUN: %lldb --capture -b -o 'reproducer status' 2>&1 | FileCheck %s --check-prefix NO-WARNING --check-prefix STATUS-CAPTURE +# RUN: %lldb --capture-path %t.repro -b -o 'reproducer status' 2>&1 | FileCheck %s --check-prefix WARNING --check-prefix STATUS-CAPTURE +# +# NO-WARNING-NOT: warning: -capture-path specified without -capture +# WARNING: warning: -capture-path specified without -capture +# STATUS-CAPTURE: Reproducer is in capture mode. diff --git a/lldb/test/Shell/Reproducer/TestDump.test b/lldb/test/Shell/Reproducer/TestDump.test new file mode 100644 index 00000000000..2e717152057 --- /dev/null +++ b/lldb/test/Shell/Reproducer/TestDump.test @@ -0,0 +1,26 @@ +# UNSUPPORTED: system-windows +# This tests the reproducer dump functionality. + +# Generate a reproducer. +# RUN: mkdir -p %t +# RUN: rm -rf %t.repro +# RUN: %clang %S/Inputs/simple.c -g -o %t/reproducer.out +# RUN: %lldb -x -b -s %S/Inputs/FileCapture.in -o 'reproducer dump -p files' --capture --capture-path %t.repro %t/reproducer.out + +# RUN: %lldb -b -o 'reproducer dump -p files -f %t.repro' | FileCheck %s --check-prefix FILES +# FILES-DAG: 'reproducer.out' +# FILES-DAG: 'FileCapture.in' + +# RUN: %lldb -b -o 'reproducer dump -p version -f %t.repro' | FileCheck %s --check-prefix VERSION +# VERSION: lldb version + +# RUN: %lldb -b -o 'reproducer dump -p commands -f %t.repro' | FileCheck %s --check-prefix COMMANDS +# COMMANDS: command source +# COMMANDS: target create +# COMMANDS: command source + +# RUN: %lldb -b -o 'reproducer dump -p gdb -f %t.repro' | FileCheck %s --check-prefix GDB +# GDB: send packet: $QStartNoAckMode#b0 +# GDB: read packet: $OK#9a + +# RUN: %lldb --replay %t.repro | FileCheck %s --check-prefix FILES diff --git a/lldb/test/Shell/Reproducer/TestFileRepro.test b/lldb/test/Shell/Reproducer/TestFileRepro.test new file mode 100644 index 00000000000..31b76703689 --- /dev/null +++ b/lldb/test/Shell/Reproducer/TestFileRepro.test @@ -0,0 +1,24 @@ +# REQUIRES: system-darwin + +# This tests the replaying of GDB remote packets. +# +# We issue the same commands and ensure the output is identical to the original +# process. To ensure we're not actually running the original binary we check +# that the string "testing" is not printed. + +# RUN: rm -rf %t.repro +# RUN: %clang %S/Inputs/simple.c -g -o %t.out +# RUN: %lldb -x -b -s %S/Inputs/FileCapture.in --capture --capture-path %t.repro %t.out | FileCheck %s --check-prefix CHECK --check-prefix CAPTURE +# RUN: rm %t.out +# RUN: %lldb --replay %t.repro | FileCheck %s --check-prefix CHECK --check-prefix REPLAY +# RUN: cat %t.repro/version.txt | FileCheck %s --check-prefix VERSION + +# CAPTURE: testing +# REPLAY-NOT: testing + +# CHECK: Process {{.*}} exited + +# CAPTURE: Reproducer is in capture mode. +# CAPTURE: Reproducer written + +# VERSION: lldb version diff --git a/lldb/test/Shell/Reproducer/TestGDBRemoteRepro.test b/lldb/test/Shell/Reproducer/TestGDBRemoteRepro.test new file mode 100644 index 00000000000..09e566ffb95 --- /dev/null +++ b/lldb/test/Shell/Reproducer/TestGDBRemoteRepro.test @@ -0,0 +1,27 @@ +# UNSUPPORTED: system-windows, system-freebsd + +# This tests the replaying of GDB remote packets. +# +# We issue the same commands and ensure the output is identical to the original +# process. To ensure we're not actually running the original binary we check +# that the string "testing" is not printed. + +# RUN: rm -rf %t.repro +# RUN: %clang %S/Inputs/simple.c -g -o %t.out +# RUN: %lldb -x -b -s %S/Inputs/GDBRemoteCapture.in --capture --capture-path %t.repro %t.out | FileCheck %s --check-prefix CHECK --check-prefix CAPTURE +# RUN: env FOO=BAR %lldb --replay %t.repro | FileCheck %s --check-prefix CHECK --check-prefix REPLAY + +# CHECK: Breakpoint 1 +# CHECK: Process {{.*}} stopped +# CHECK: Process {{.*}} launched +# CHECK: thread {{.*}} stop reason = breakpoint +# CHECK: frame {{.*}} simple.c + +# CAPTURE: testing +# REPLAY-NOT: testing + +# CHECK: Process {{.*}} resuming +# CHECK: Process {{.*}} exited + +# CAPTURE: Reproducer is in capture mode. +# CAPTURE: Reproducer written diff --git a/lldb/test/Shell/Reproducer/TestRelativePath.test b/lldb/test/Shell/Reproducer/TestRelativePath.test new file mode 100644 index 00000000000..1c871ee81e8 --- /dev/null +++ b/lldb/test/Shell/Reproducer/TestRelativePath.test @@ -0,0 +1,8 @@ +# This tests relative capture paths. + +# RUN: mkdir -p %t +# RUN: cd %t +# RUN: rm -rf ./foo +# RUN: %clang %S/Inputs/simple.c -g -o %t/reproducer.out +# RUN: %lldb -x -b -s %S/Inputs/FileCapture.in -o 'reproducer dump -p files' --capture --capture-path ./foo %t/reproducer.out +# RUN: %lldb --replay ./foo diff --git a/lldb/test/Shell/Reproducer/TestReuseDirectory.test b/lldb/test/Shell/Reproducer/TestReuseDirectory.test new file mode 100644 index 00000000000..76c74b7ee1d --- /dev/null +++ b/lldb/test/Shell/Reproducer/TestReuseDirectory.test @@ -0,0 +1,17 @@ +# UNSUPPORTED: system-windows, system-freebsd + +# Test that we can capture twice to the same directory without breaking the +# reproducer functionality. + +# RUN: rm -rf %t.repro +# RUN: %clang %S/Inputs/simple.c -g -o %t.out +# RUN: %lldb -x -b -s %S/Inputs/GDBRemoteCapture.in --capture --capture-path %t.repro %t.out | FileCheck %S/TestGDBRemoteRepro.test --check-prefix CHECK --check-prefix CAPTURE +# RUN: %lldb -x -b -s %S/Inputs/GDBRemoteCapture.in --capture --capture-path %t.repro %t.out | FileCheck %S/TestGDBRemoteRepro.test --check-prefix CHECK --check-prefix CAPTURE +# RUN: %lldb --replay %t.repro | FileCheck %S/TestGDBRemoteRepro.test --check-prefix CHECK --check-prefix REPLAY + +# Test that we can replay from a different location, i.e. that the reproducer +# is relocatable. + +# RUN: rm -rf %t.repro_moved +# RUN: mv %t.repro %t.repro_moved +# RUN: %lldb --replay %t.repro_moved | FileCheck %S/TestGDBRemoteRepro.test --check-prefix CHECK --check-prefix REPLAY diff --git a/lldb/test/Shell/Reproducer/TestSynchronous.test b/lldb/test/Shell/Reproducer/TestSynchronous.test new file mode 100644 index 00000000000..f32ce8c5722 --- /dev/null +++ b/lldb/test/Shell/Reproducer/TestSynchronous.test @@ -0,0 +1,14 @@ +# REQUIRES: python +# Ensure that replay happens in synchronous mode. + +# RUN: rm -rf %t.repro +# RUN: %lldb -x -b --capture --capture-path %t.repro -o 'script lldb.debugger.SetAsync(True)' -o 'script lldb.debugger.GetAsync()' -o 'reproducer generate' | FileCheck %s --check-prefix CAPTURE +# RUN: %lldb --replay %t.repro | FileCheck %s --check-prefix REPLAY + +# CAPTURE: script lldb.debugger.SetAsync(True) +# CAPTURE-NEXT: script lldb.debugger.GetAsync() +# CAPTURE-NEXT: True + +# REPLAY: script lldb.debugger.SetAsync(True) +# REPLAY-NEXT: script lldb.debugger.GetAsync() +# REPLAY-NEXT: False |

