Index: lit/CMakeLists.txt =================================================================== --- lit/CMakeLists.txt +++ lit/CMakeLists.txt @@ -11,6 +11,8 @@ set(ENABLE_SHARED 0) endif(BUILD_SHARED_LIBS) +option(LLDB_TEST_CLANG "Use in-tree clang when testing lldb" Off) + configure_lit_site_cfg( ${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.in ${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg) @@ -20,17 +22,32 @@ ) set(LLDB_TEST_DEPS + FileCheck + debugserver LLDBUnitTests + lldb + not ) + +if(LLDB_TEST_CLANG) + list(APPELND LLDB_TEST_DEPS clang) +endif() + set(LLDB_TEST_PARAMS lldb_site_config=${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg ) -add_lit_testsuite(check-lldb-unit "Running lldb unit test suite" +add_lit_testsuite(check-lldb-lit "Running lldb lit test suite" ${CMAKE_CURRENT_BINARY_DIR} PARAMS lldb_site_config=${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg lldb_unit_site_config=${CMAKE_CURRENT_BINARY_DIR}/Unit/lit.site.cfg DEPENDS ${LLDB_TEST_DEPS} ) -set_target_properties(check-lldb-unit PROPERTIES FOLDER "LLDB tests") +set_target_properties(check-lldb-lit PROPERTIES FOLDER "LLDB tests") + +add_lit_testsuites(LLDB ${CMAKE_CURRENT_SOURCE_DIR} + PARAMS lldb_site_config=${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg + lldb_unit_site_config=${CMAKE_CURRENT_BINARY_DIR}/Unit/lit.site.cfg + DEPENDS ${LLDB_TEST_DEPS} + ) Index: lit/Expr/Inputs/anonymous-struct.cpp =================================================================== --- /dev/null +++ lit/Expr/Inputs/anonymous-struct.cpp @@ -0,0 +1,26 @@ +#include + +typedef struct { + float f; + int i; +} my_untagged_struct; + +double multiply(my_untagged_struct *s) +{ + return s->f * s->i; +} + +double multiply(my_untagged_struct *s, int x) +{ + return multiply(s) * x; +} + +int main(int argc, char **argv) +{ + my_untagged_struct s = { + .f = (float)argc, + .i = argc, + }; + // lldb testsuite break + return !(multiply(&s, argc) == pow(argc, 3)); +} Index: lit/Expr/Inputs/call-function.cpp =================================================================== --- /dev/null +++ lit/Expr/Inputs/call-function.cpp @@ -0,0 +1,53 @@ +#include +#include +#include + +struct Five +{ + int number; + const char *name; +}; + +Five +returnsFive() +{ + Five my_five = {5, "five"}; + return my_five; +} + +unsigned int +fib(unsigned int n) +{ + if (n < 2) + return n; + else + return fib(n - 1) + fib(n - 2); +} + +int +add(int a, int b) +{ + return a + b; +} + +bool +stringCompare(const char *str) +{ + if (strcmp( str, "Hello world" ) == 0) + return true; + else + return false; +} + +int main (int argc, char const *argv[]) +{ + std::string str = "Hello world"; + std::cout << str << std::endl; + std::cout << str.c_str() << std::endl; + Five main_five = returnsFive(); +#if 0 + print str + print str.c_str() +#endif + return 0; // Please test these expressions while stopped at this line: +} Index: lit/Expr/TestCallStdStringFunction.test =================================================================== --- /dev/null +++ lit/Expr/TestCallStdStringFunction.test @@ -0,0 +1,17 @@ +# XFAIL: windows +# -> llvm.org/pr21765 + +# XFAIL: compiler-icc +# -> llvm.org/pr14437 + +# XFAIL: freebsd +# -> llvm.org/pr17807 + +# RUN: %cxx %p/Inputs/call-function.cpp -g -o %t && %lldb -b -s %s -- %t | FileCheck %s + +breakpoint set --file call-function.cpp --line 52 +run +print str +# CHECK: Hello world +print str.c_str() +# CHECK: Hello world Index: lit/Expr/TestCallStopAndContinue.test =================================================================== --- /dev/null +++ lit/Expr/TestCallStopAndContinue.test @@ -0,0 +1,12 @@ +# XFAIL: windows +# -> llvm.org/pr24489 + +# RUN: %cxx %p/Inputs/call-function.cpp -g -o %t && %lldb -b -s %s -o continue -o "thread list" -- %t 2>&1 | FileCheck %s + +breakpoint set --file call-function.cpp --line 52 +run +breakpoint set --file call-function.cpp --line 14 +expression -i false -- returnsFive() +# CHECK: Execution was interrupted, reason: breakpoint +# CHECK: stop reason = User Expression thread plan +# CHECK: Completed expression: (Five) $0 = (number = 5 {{.*}}, name = "five") Index: lit/Expr/TestCallUserAnonTypedef.test =================================================================== --- /dev/null +++ lit/Expr/TestCallUserAnonTypedef.test @@ -0,0 +1,11 @@ +# XFAIL: windows + +# XFAIL: armhf-linux +# -> llvm.org/pr27868 + +# RUN: %cxx %p/Inputs/anonymous-struct.cpp -g -o %t && %lldb -b -s %s -- %t | FileCheck %s + +breakpoint set --file anonymous-struct.cpp --line 24 +run +expression multiply(&s) +# CHECK: $0 = 1 Index: lit/Expr/TestCallUserDefinedFunction.test =================================================================== --- /dev/null +++ lit/Expr/TestCallUserDefinedFunction.test @@ -0,0 +1,20 @@ +# XFAIL: windows +# -> llvm.org/pr24489 + +# RUN: %cxx %p/Inputs/call-function.cpp -g -o %t && %lldb -b -s %s -- %t | FileCheck %s + +breakpoint set --file call-function.cpp --line 52 +run +expression fib(5) +# CHECK: $0 = 5 +expression add(4,8) +# CHECK: $1 = 12 + +expression add(add(5,2),add(3,4)) +# CHECK: $2 = 14 +expression add(add(5,2),fib(5)) +# CHECK: $3 = 12 +expression stringCompare((const char*) "Hello world") +# CHECK: $4 = true +expression stringCompare((const char*) "Hellworld") +# CHECK: $5 = false Index: lit/Expr/lit.local.cfg =================================================================== --- /dev/null +++ lit/Expr/lit.local.cfg @@ -0,0 +1 @@ +config.suffixes = ['.test'] Index: lit/Unit/lit.cfg =================================================================== --- lit/Unit/lit.cfg +++ lit/Unit/lit.cfg @@ -6,6 +6,19 @@ import lit.formats +# Check that the object root is known. +if config.test_exec_root is None: + # Otherwise, we haven't loaded the site specific configuration (the user is + # probably trying to run on a test file directly, and either the site + # configuration hasn't been created by the build system, or we are in an + # out-of-tree build situation). + + # Check for 'llvm_unit_site_config' user parameter, and use that if available. + site_cfg = lit_config.params.get('lldb_unit_site_config', None) + if site_cfg and os.path.exists(site_cfg): + lit_config.load_config(config, site_cfg) + raise SystemExit + # name: The name of this test suite. config.name = 'lldb-Unit' Index: lit/Unit/lit.site.cfg.in =================================================================== --- lit/Unit/lit.site.cfg.in +++ lit/Unit/lit.site.cfg.in @@ -1,5 +1,6 @@ @LIT_SITE_CFG_IN_HEADER@ +config.test_exec_root = "@LLVM_BINARY_DIR@" config.llvm_src_root = "@LLVM_SOURCE_DIR@" config.llvm_obj_root = "@LLVM_BINARY_DIR@" config.llvm_tools_dir = "@LLVM_TOOLS_DIR@" Index: lit/lit.cfg =================================================================== --- lit/lit.cfg +++ lit/lit.cfg @@ -112,17 +112,82 @@ lit_config.load_config(config, site_cfg) raise SystemExit +# Register substitutions +config.substitutions.append(('%python', config.python_executable)) +config.substitutions.append(('%host_cc', config.host_cc)) +config.substitutions.append(('%host_cxx', config.host_cxx)) + +cc = config.host_cc +cxx = config.host_cxx +debugserver = '%s/debugserver' % llvm_tools_dir + +if config.test_clang: + cc = '%s/clang' % llvm_tools_dir + cxx = '%s/clang++' % llvm_tools_dir + +if platform.system() in ['Darwin']: + try: + out = lit.util.capture(['xcrun', '--show-sdk-path']).strip() + res = 0 + except OSError: + res = -1 + if res == 0 and out: + sdk_path = out + lit_config.note('using SDKROOT: %r' % sdk_path) + cxx += " -isysroot %s" % sdk_path + debugserver = '%s/Library/Frameworks/LLDB.frameworks/Resources/debugserver' % config.llvm_obj_root + + +config.substitutions.append(('%cc', cc)) +config.substitutions.append(('%cxx', cxx)) + +config.substitutions.append(('%lldb', '%s/lldb' % llvm_tools_dir)) +config.substitutions.append(('%debugserver', debugserver)) + +for pattern in [r"\bFileCheck\b", + r"\| \bnot\b"]: + tool_match = re.match(r"^(\\)?((\| )?)\W+b([0-9A-Za-z-_]+)\\b\W*$", + pattern) + tool_pipe = tool_match.group(2) + tool_name = tool_match.group(4) + tool_path = config.llvm_tools_dir + '/' + tool_name + if not tool_path: + # Warn, but still provide a substitution. + lit_config.note( + 'Did not find ' + tool_name + ' in ' + config.llvm_tools_dir) + config.substitutions.append((pattern, tool_pipe + tool_path)) + # Shell execution if platform.system() not in ['Windows'] or lit_config.getBashPath() != '': config.available_features.add('shell') # Running on Darwin OS if platform.system() in ['Darwin']: + config.available_features.add('darwin') config.available_features.add('system-linker-mach-o') # Running on ELF based *nix if platform.system() in ['FreeBSD', 'Linux']: config.available_features.add('system-linker-elf') + if platform.system() in ['FreeBSD']: + config.available_features.add('freebsd') + else: + config.available_features.add('linux') + +if platform.system() in ['Windows']: + config.available_features.add('windows') + +if re.match(r'^arm(hf.*-linux)|(.*-linux-gnuabihf)', config.target_triple): + config.available_features.add("armhf-linux") + +if re.match(r'icc', cc): + config.available_features.add("compiler-icc") +elif re.match(r'clang', cc): + config.available_features.add("compiler-clang") +elif re.match(r'gcc', cc): + config.available_features.add("compiler-gcc") +elif re.match(r'cl', cc): + config.available_features.add("compiler-msvc") # llvm-config knows whether it is compiled with asserts (and) # whether we are operating in release/debug mode. Index: lit/lit.site.cfg.in =================================================================== --- lit/lit.site.cfg.in +++ lit/lit.site.cfg.in @@ -8,6 +8,12 @@ config.lldb_obj_root = "@LLDB_BINARY_DIR@" config.target_triple = "@TARGET_TRIPLE@" config.python_executable = "@PYTHON_EXECUTABLE@" +config.host_cc = "@CMAKE_C_COMPILER@" +config.host_cxx = "@CMAKE_CXX_COMPILER@" + +test_clang = "@LLDB_TEST_CLANG@".lower() + +config.test_clang = test_clang == "on" or test_clang == "true" or test_clang == "1" # Support substitution of the tools and libs dirs with user parameters. This is # used when we can't determine the tool dir at configuration time.