diff options
author | Reid Kleckner <rnk@google.com> | 2019-05-28 23:03:33 +0000 |
---|---|---|
committer | Reid Kleckner <rnk@google.com> | 2019-05-28 23:03:33 +0000 |
commit | 75d38f1e4894b3835258810847c59df78c42d549 (patch) | |
tree | e1f5a8e9932ae8c40ada9cf5d1004e66db1970f2 /debuginfo-tests | |
parent | b73ea75b384df86d6db36aff02e7f5e5f744c48d (diff) | |
download | bcm5719-llvm-75d38f1e4894b3835258810847c59df78c42d549.tar.gz bcm5719-llvm-75d38f1e4894b3835258810847c59df78c42d549.zip |
Add debuginfo-tests that use cdb on Windows
This is an initial prototype of how we can run debugger integration
tests on Windows. cdb and windbg share a command language and debugger
engine. Visual Studio has its own, but we should at least be able to use
cdb as the basis for optimized debug info integration tests.
There's a lot of work to do here still. For example:
- Make fewer assumptions about the SDK location
- Don't assume x64 (important, I need x86 testing)
- More environment isolation, have lit setup vcvars instead of passing
LIB and INCLUDE down.
- Write a .py file to replace the grep+sed RUN line
But, this seemed like a good enough concept to commit as is, since it's
useful to me already.
Reviewers: aprantl, zturner
Differential Revision: https://reviews.llvm.org/D54187
llvm-svn: 361889
Diffstat (limited to 'debuginfo-tests')
-rw-r--r-- | debuginfo-tests/CMakeLists.txt | 3 | ||||
-rw-r--r-- | debuginfo-tests/lit.cfg.py | 35 | ||||
-rw-r--r-- | debuginfo-tests/lit.site.cfg.py.in | 1 | ||||
-rw-r--r-- | debuginfo-tests/win_cdb/README.txt | 6 | ||||
-rw-r--r-- | debuginfo-tests/win_cdb/hello.c | 14 | ||||
-rw-r--r-- | debuginfo-tests/win_cdb/lit.local.cfg.py | 2 | ||||
-rw-r--r-- | debuginfo-tests/win_cdb/realigned-frame.cpp | 34 |
7 files changed, 90 insertions, 5 deletions
diff --git a/debuginfo-tests/CMakeLists.txt b/debuginfo-tests/CMakeLists.txt index fbab61c527d..db35d5d5960 100644 --- a/debuginfo-tests/CMakeLists.txt +++ b/debuginfo-tests/CMakeLists.txt @@ -13,6 +13,9 @@ set(DEBUGINFO_TEST_DEPS not ) +# Indicate if this is an MSVC environment. +pythonize_bool(MSVC) + configure_lit_site_cfg( ${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.py.in ${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg.py diff --git a/debuginfo-tests/lit.cfg.py b/debuginfo-tests/lit.cfg.py index a806c125555..c47f453f74c 100644 --- a/debuginfo-tests/lit.cfg.py +++ b/debuginfo-tests/lit.cfg.py @@ -38,6 +38,36 @@ config.test_source_root = os.path.join(config.debuginfo_tests_src_root) # test_exec_root: The root path where tests should be run. config.test_exec_root = config.debuginfo_tests_obj_root +tools = [ + ToolSubst('%test_debuginfo', command=os.path.join( + config.debuginfo_tests_src_root, 'test_debuginfo.pl')), +] + +def get_required_attr(config, attr_name): + attr_value = getattr(config, attr_name, None) + if attr_value == None: + lit_config.fatal( + "No attribute %r in test configuration! You may need to run " + "tests from your build directory or add this attribute " + "to lit.site.cfg " % attr_name) + return attr_value + +# If this is an MSVC environment, the tests at the root of the tree are +# unsupported. The local win_cdb test suite, however, is supported. +is_msvc = get_required_attr(config, "is_msvc") +if is_msvc: + # FIXME: We should add some llvm lit utility code to find the Windows SDK + # and set up the environment appopriately. + win_sdk = 'C:/Program Files (x86)/Windows Kits/10/' + arch = 'x64' + config.unsupported = True + llvm_config.with_system_environment(['LIB', 'LIBPATH', 'INCLUDE']) + # Clear _NT_SYMBOL_PATH to prevent cdb from attempting to load symbols from + # the network. + llvm_config.with_environment('_NT_SYMBOL_PATH', '') + tools.append(ToolSubst('%cdb', '"%s"' % os.path.join(win_sdk, 'Debuggers', + arch, 'cdb.exe'))) + llvm_config.use_default_substitutions() # clang_src_dir is not used by these tests, but is required by @@ -53,11 +83,6 @@ if config.llvm_use_sanitizer: tool_dirs = [config.llvm_tools_dir] -tools = [ - ToolSubst('%test_debuginfo', command=os.path.join( - config.debuginfo_tests_src_root, 'test_debuginfo.pl')), -] - llvm_config.add_tool_substitutions(tools, tool_dirs) lit.util.usePlatformSdkOnDarwin(config, lit_config) diff --git a/debuginfo-tests/lit.site.cfg.py.in b/debuginfo-tests/lit.site.cfg.py.in index 70169ddb1d7..491f4546c1d 100644 --- a/debuginfo-tests/lit.site.cfg.py.in +++ b/debuginfo-tests/lit.site.cfg.py.in @@ -17,6 +17,7 @@ config.has_lld = lit.util.pythonize_bool("@DEBUGINFO_TESTS_HAS_LLD@") config.host_triple = "@LLVM_HOST_TRIPLE@" config.target_triple = "@TARGET_TRIPLE@" config.host_arch = "@HOST_ARCH@" +config.is_msvc = @MSVC_PYBOOL@ config.llvm_use_sanitizer = "@LLVM_USE_SANITIZER@" diff --git a/debuginfo-tests/win_cdb/README.txt b/debuginfo-tests/win_cdb/README.txt new file mode 100644 index 00000000000..ebb90dfdc1d --- /dev/null +++ b/debuginfo-tests/win_cdb/README.txt @@ -0,0 +1,6 @@ +These are debug info integration tests similar to the ones in the parent +directory, except that these are designed to test compatibility between clang, +lld, and cdb, the command line debugger that ships as part of the Microsoft +Windows SDK. The debugger command language that cdb uses is very different from +gdb and LLDB, so it's useful to be able to write some tests directly in the cdb +command language. diff --git a/debuginfo-tests/win_cdb/hello.c b/debuginfo-tests/win_cdb/hello.c new file mode 100644 index 00000000000..00a15e8dbed --- /dev/null +++ b/debuginfo-tests/win_cdb/hello.c @@ -0,0 +1,14 @@ +// RUN: %clang_cl %s -o %t.exe -fuse-ld=lld -Z7 +// RUN: grep DE[B]UGGER: %s | sed -e 's/.*DE[B]UGGER: //' > %t.script +// RUN: %cdb -cf %t.script %t.exe | FileCheck %s --check-prefixes=DEBUGGER,CHECK + +#include <stdio.h> +int main() { + printf("hello world\n"); + int x = 42; + __debugbreak(); + // DEBUGGER: g + // DEBUGGER: dv + // CHECK: x = 0n42 +} +// DEBUGGER: q diff --git a/debuginfo-tests/win_cdb/lit.local.cfg.py b/debuginfo-tests/win_cdb/lit.local.cfg.py new file mode 100644 index 00000000000..e4d61b1fbb6 --- /dev/null +++ b/debuginfo-tests/win_cdb/lit.local.cfg.py @@ -0,0 +1,2 @@ +# The win_cdb tests are supported when cmake was run in an MSVC environment. +config.unsupported = not config.is_msvc diff --git a/debuginfo-tests/win_cdb/realigned-frame.cpp b/debuginfo-tests/win_cdb/realigned-frame.cpp new file mode 100644 index 00000000000..a964b43e0cb --- /dev/null +++ b/debuginfo-tests/win_cdb/realigned-frame.cpp @@ -0,0 +1,34 @@ +// RUN: %clang_cl %s -o %t.exe -fuse-ld=lld -Z7 +// RUN: grep DE[B]UGGER: %s | sed -e 's/.*DE[B]UGGER: //' > %t.script +// RUN: %cdb -cf %t.script %t.exe | FileCheck %s --check-prefixes=DEBUGGER,CHECK + +// From https://llvm.org/pr38857, where we had issues with stack realignment. + +struct Foo { + int x = 42; + int __declspec(noinline) foo(); + void __declspec(noinline) bar(int *a, int *b, double *c); +}; +int Foo::foo() { + int a = 1; + int b = 2; + double __declspec(align(32)) force_alignment = 0.42; + bar(&a, &b, &force_alignment); + // DEBUGGER: g + // DEBUGGER: .frame 1 + // DEBUGGER: dv + // CHECK: a = 0n1 + // CHECK: b = 0n2 + // CHECK: force_alignment = 0.41999{{.*}} + // DEBUGGER: q + x += (int)force_alignment; + return x; +} +void Foo::bar(int *a, int *b, double *c) { + __debugbreak(); + *c += *a + *b; +} +int main() { + Foo o; + o.foo(); +} |