Skip to content

Commit

Permalink
Add debuginfo-tests that use cdb on Windows
Browse files Browse the repository at this point in the history
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
  • Loading branch information
rnk committed May 28, 2019
1 parent b73ea75 commit 75d38f1
Show file tree
Hide file tree
Showing 7 changed files with 90 additions and 5 deletions.
3 changes: 3 additions & 0 deletions debuginfo-tests/CMakeLists.txt
Expand Up @@ -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
Expand Down
35 changes: 30 additions & 5 deletions debuginfo-tests/lit.cfg.py
Expand Up @@ -38,6 +38,36 @@
# 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
Expand All @@ -53,11 +83,6 @@

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)
Expand Down
1 change: 1 addition & 0 deletions debuginfo-tests/lit.site.cfg.py.in
Expand Up @@ -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@"

Expand Down
6 changes: 6 additions & 0 deletions 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.
14 changes: 14 additions & 0 deletions 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
2 changes: 2 additions & 0 deletions 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
34 changes: 34 additions & 0 deletions 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();
}

0 comments on commit 75d38f1

Please sign in to comment.