Index: clang/test/lit.cfg.py =================================================================== --- clang/test/lit.cfg.py +++ clang/test/lit.cfg.py @@ -58,8 +58,6 @@ tools = [ 'c-index-test', 'clang-check', 'clang-diff', 'clang-format', 'opt', - ToolSubst('%test_debuginfo', command=os.path.join( - config.llvm_src_root, 'utils', 'test_debuginfo.pl')), ToolSubst('%clang_func_map', command=FindTool( 'clang-func-mapping'), unresolved='ignore'), ] Index: debuginfo-tests/CMakeLists.txt =================================================================== --- /dev/null +++ debuginfo-tests/CMakeLists.txt @@ -0,0 +1,36 @@ +# Debug Info tests. These tests invoke clang to generate programs with +# various types of debug info, and then run those programs under a debugger +# such as GDB or LLDB to verify the results. + +set(DEBUGINFO_TESTS_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) +set(DEBUGINFO_TESTS_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) + +set(DEBUGINFO_TEST_DEPS + clang + llvm-config + FileCheck + count + not + ) + +get_target_property(CLANG_SOURCE_DIR clang SOURCE_DIR) + +if (TARGET lld) + set(DEBUGINFO_TESTS_HAS_LLD 1) + list(APPEND DEBUGINFO_TEST_DEPS lld) + get_target_property(LLD_SOURCE_DIR lld SOURCE_DIR) +endif() + +configure_lit_site_cfg( + ${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.py.in + ${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg.py + MAIN_CONFIG + ${CMAKE_CURRENT_SOURCE_DIR}/lit.cfg.py + ) + +add_lit_testsuite(check-debuginfo "Running debug info integration tests" + ${CMAKE_CURRENT_BINARY_DIR} + DEPENDS ${DEBUGINFO_TEST_DEPS} + ) + +set_target_properties(check-debuginfo PROPERTIES FOLDER "Debug info tests") \ No newline at end of file Index: debuginfo-tests/lit.cfg.py =================================================================== --- /dev/null +++ debuginfo-tests/lit.cfg.py @@ -0,0 +1,57 @@ +# -*- Python -*- + +import os +import platform +import re +import subprocess +import tempfile + +import lit.formats +import lit.util + +from lit.llvm import llvm_config +from lit.llvm.subst import ToolSubst +from lit.llvm.subst import FindTool + +# Configuration file for the 'lit' test runner. + +# name: The name of this test suite. +config.name = 'debuginfo-tests' + +# testFormat: The test format to use to interpret tests. +# +# For now we require '&&' between commands, until they get globally killed and +# the test runner updated. +config.test_format = lit.formats.ShTest(not llvm_config.use_lit_shell) + +# suffixes: A list of file extensions to treat as test files. +config.suffixes = ['.c', '.cpp', '.m'] + +# excludes: A list of directories to exclude from the testsuite. The 'Inputs' +# subdirectories contain auxiliary inputs for various tests in their parent +# directories. +config.excludes = ['Inputs'] + +# test_source_root: The root path where tests are located. +config.test_source_root = os.path.join(config.debuginfo_tests_src_root, 'tests') + +# test_exec_root: The root path where tests should be run. +config.test_exec_root = config.debuginfo_tests_obj_root + +llvm_config.use_default_substitutions() + +llvm_config.use_clang() + +if config.llvm_use_sanitizer: + # Propagate path to symbolizer for ASan/MSan. + llvm_config.with_system_environment( + ['ASAN_SYMBOLIZER_PATH', 'MSAN_SYMBOLIZER_PATH']) + +tool_dirs = [config.llvm_tools_dir] + +tools = [ + ToolSubst('%test_debuginfo', command=os.path.join( + config.llvm_src_root, 'utils', 'test_debuginfo.pl')), +] + +llvm_config.add_tool_substitutions(tools, tool_dirs) Index: debuginfo-tests/lit.site.cfg.py.in =================================================================== --- /dev/null +++ debuginfo-tests/lit.site.cfg.py.in @@ -0,0 +1,25 @@ +@LIT_SITE_CFG_IN_HEADER@ + +import lit.util + +config.test_exec_root = "@CMAKE_BINARY_DIR@" + +config.llvm_src_root = "@LLVM_SOURCE_DIR@" +config.llvm_obj_root = "@LLVM_BINARY_DIR@" +config.llvm_tools_dir = "@LLVM_TOOLS_DIR@" +config.llvm_libs_dir = "@LLVM_LIBS_DIR@" +config.llvm_shlib_dir = "@SHLIBDIR@" +config.llvm_plugin_ext = "@LLVM_PLUGIN_EXT@" +config.debuginfo_tests_obj_root = "@DEBUGINFO_TESTS_BINARY_DIR@" +config.debuginfo_tests_src_root = "@DEBUGINFO_TESTS_SOURCE_DIR@" +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.llvm_use_sanitizer = "@LLVM_USE_SANITIZER@" + +@LIT_SITE_CFG_IN_FOOTER@ + +# Let the main config do the real work. +lit_config.load_config(config, "@DEBUGINFO_TESTS_SOURCE_DIR@/lit.cfg.py") Index: debuginfo-tests/tests/aggregate-indirect-arg.cpp =================================================================== --- debuginfo-tests/tests/aggregate-indirect-arg.cpp +++ debuginfo-tests/tests/aggregate-indirect-arg.cpp @@ -1,6 +1,6 @@ // RUN: %clangxx %target_itanium_abi_host_triple -O0 -g %s -c -o %t.o // RUN: %clangxx %target_itanium_abi_host_triple %t.o -o %t.out -// RUN: %test_debuginfo %s %t.out +// RUN: %test_debuginfo %s %t.out // Radar 8945514 // DEBUGGER: break 22 // DEBUGGER: r Index: debuginfo-tests/tests/block_var.m =================================================================== --- debuginfo-tests/tests/block_var.m +++ debuginfo-tests/tests/block_var.m @@ -1,6 +1,6 @@ // RUN: %clang %target_itanium_abi_host_triple -O0 -g %s -c -o %t.o // RUN: %clang %target_itanium_abi_host_triple %t.o -o %t.out -framework Foundation -// RUN: %test_debuginfo %s %t.out +// RUN: %test_debuginfo %s %t.out // REQUIRES: system-darwin Index: debuginfo-tests/tests/blocks.m =================================================================== --- debuginfo-tests/tests/blocks.m +++ debuginfo-tests/tests/blocks.m @@ -1,6 +1,6 @@ // RUN: %clang %target_itanium_abi_host_triple -O0 -g %s -c -o %t.o // RUN: %clang %target_itanium_abi_host_triple %t.o -o %t.out -framework Foundation -// RUN: %test_debuginfo %s %t.out +// RUN: %test_debuginfo %s %t.out // REQUIRES: system-darwin // Radar 9279956 @@ -24,9 +24,9 @@ int master = 0; __block int m2 = 0; __block int dbTransaction = 0; - int (^x)(void) = ^(void) { (void) self; - (void) master; - (void) dbTransaction; + int (^x)(void) = ^(void) { (void) self; + (void) master; + (void) dbTransaction; m2++; return m2; }; Index: debuginfo-tests/tests/ctor.cpp =================================================================== --- debuginfo-tests/tests/ctor.cpp +++ debuginfo-tests/tests/ctor.cpp @@ -1,12 +1,12 @@ // RUN: %clangxx %target_itanium_abi_host_triple -O0 -g %s -c -o %t.o // RUN: %clangxx %target_itanium_abi_host_triple %t.o -o %t.out -// RUN: %test_debuginfo %s %t.out +// RUN: %test_debuginfo %s %t.out // DEBUGGER: break 14 // DEBUGGER: r // DEBUGGER: p *this -// CHECK-NEXT-NOT: Cannot access memory at address +// CHECK-NEXT-NOT: Cannot access memory at address class A { public: Index: debuginfo-tests/tests/foreach.m =================================================================== --- debuginfo-tests/tests/foreach.m +++ debuginfo-tests/tests/foreach.m @@ -1,6 +1,6 @@ // RUN: %clang %target_itanium_abi_host_triple -O0 -g %s -c -o %t.o // RUN: %clang %target_itanium_abi_host_triple %t.o -o %t.out -framework Foundation -// RUN: %test_debuginfo %s %t.out +// RUN: %test_debuginfo %s %t.out // // REQUIRES: system-darwin // Radar 8757124 @@ -19,7 +19,7 @@ for (NSString *thing in things) { NSLog (@"%@", thing); } - + things = [NSArray arrayWithObjects:@"aaa", @"bbb", @"ccc" , nil]; for (NSString *thing in things) { NSLog (@"%@", thing); Index: debuginfo-tests/tests/sret.cpp =================================================================== --- debuginfo-tests/tests/sret.cpp +++ debuginfo-tests/tests/sret.cpp @@ -1,6 +1,6 @@ // RUN: %clangxx %target_itanium_abi_host_triple -O0 -g %s -c -o %t.o // RUN: %clangxx %target_itanium_abi_host_triple %t.o -o %t.out -// RUN: %test_debuginfo %s %t.out +// RUN: %test_debuginfo %s %t.out // Radar 8775834 // DEBUGGER: break 62 // DEBUGGER: r @@ -24,7 +24,7 @@ int m_int; }; -A::A (int i) : +A::A (int i) : m_int(i) { } @@ -50,11 +50,11 @@ { public: B () {} - + A AInstance(); }; -A +A B::AInstance() { A a(12); @@ -65,7 +65,7 @@ { B b; int return_val = b.AInstance().get_int(); - + A a(b.AInstance()); return return_val; } Index: debuginfo-tests/tests/vla.c =================================================================== --- debuginfo-tests/tests/vla.c +++ debuginfo-tests/tests/vla.c @@ -1,7 +1,7 @@ // This test case verifies the debug location for variable-length arrays. // RUN: %clang %target_itanium_abi_host_triple -O0 -g %s -c -o %t.o // RUN: %clang %target_itanium_abi_host_triple %t.o -o %t.out -// RUN: %test_debuginfo %s %t.out +// RUN: %test_debuginfo %s %t.out // // DEBUGGER: break 18 // DEBUGGER: r Index: llvm/CMakeLists.txt =================================================================== --- llvm/CMakeLists.txt +++ llvm/CMakeLists.txt @@ -110,7 +110,7 @@ # LLVM_EXTERNAL_${project}_SOURCE_DIR using LLVM_ALL_PROJECTS # This allows an easy way of setting up a build directory for llvm and another # one for llvm+clang+... using the same sources. -set(LLVM_ALL_PROJECTS "clang;libcxx;libcxxabi;lldb;compiler-rt;lld;polly") +set(LLVM_ALL_PROJECTS "clang;libcxx;libcxxabi;lldb;compiler-rt;debuginfo-tests;lld;polly") set(LLVM_ENABLE_PROJECTS "" CACHE STRING "Semicolon-separated list of projects to build (${LLVM_ALL_PROJECTS}), or \"all\".") if( LLVM_ENABLE_PROJECTS STREQUAL "all" ) @@ -877,13 +877,18 @@ endif() if( LLVM_INCLUDE_TESTS ) - if(EXISTS ${LLVM_MAIN_SRC_DIR}/projects/test-suite AND TARGET clang) + if(TARGET clang) include(LLVMExternalProjectUtils) - llvm_ExternalProject_Add(test-suite ${LLVM_MAIN_SRC_DIR}/projects/test-suite - USE_TOOLCHAIN - EXCLUDE_FROM_ALL - NO_INSTALL - ALWAYS_CLEAN) + if (EXISTS ${LLVM_MAIN_SRC_DIR}/projects/test-suite) + llvm_ExternalProject_Add(test-suite ${LLVM_MAIN_SRC_DIR}/projects/test-suite + USE_TOOLCHAIN + TOOLCHAIN_TOOLS clang lld clang-cl + EXCLUDE_FROM_ALL + NO_INSTALL + ALWAYS_CLEAN) + endif() + + add_llvm_external_project(debuginfo-tests projects/debuginfo-tests) endif() add_subdirectory(utils/lit) add_subdirectory(test) Index: llvm/projects/CMakeLists.txt =================================================================== --- llvm/projects/CMakeLists.txt +++ llvm/projects/CMakeLists.txt @@ -10,6 +10,7 @@ (NOT ${entry} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR}/libcxxabi) AND (NOT ${entry} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR}/libunwind) AND (NOT ${entry} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR}/test-suite) AND + (NOT ${entry} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR}/debuginfo-tests) AND (NOT ${entry} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR}/parallel-libs) AND (NOT ${entry} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR}/openmp)) add_subdirectory(${entry}) Index: llvm/utils/lit/lit/llvm/config.py =================================================================== --- llvm/utils/lit/lit/llvm/config.py +++ llvm/utils/lit/lit/llvm/config.py @@ -27,8 +27,9 @@ # For tests that require Windows to run. features.add('system-windows') + lit_tools_dir = getattr(config, 'lit_tools_dir', None) # Seek sane tools in directories and set to $PATH. - path = self.lit_config.getToolsPath(config.lit_tools_dir, + path = self.lit_config.getToolsPath(lit_tools_dir, config.environment['PATH'], ['cmp.exe', 'grep.exe', 'sed.exe']) if path is not None: @@ -413,8 +414,10 @@ self.config.substitutions.append( ('%target_itanium_abi_host_triple', '')) - self.config.substitutions.append( - ('%src_include_dir', self.config.clang_src_dir + '/include')) + clang_src_dir = getattr(self.config, 'clang_src_dir', None) + if clang_src_dir: + self.config.substitutions.append( + ('%src_include_dir', os.path.join(clang_src_dir, 'include'))) # FIXME: Find nicer way to prohibit this. self.config.substitutions.append(