From 3f99810787978140ff5898284a9f08a7f559f9e6 Mon Sep 17 00:00:00 2001 From: Adrian McCarthy Date: Wed, 4 May 2016 23:32:35 +0000 Subject: [PATCH] XFail TestLambdas.py on Windows after fixing some of the problems 1. Fixed semicolon placement in the lambda in the test itself. 2. Fixed lldbinline tests in general so that we don't attempt tests on platforms that don't use the given type of debug info. (For example, no DWO tests on Windows.) This fixes one of the two failures on Windows. (TestLambdas.py was the only inline test that wasn't XFailed or skipped on Windows.) 3. Set the error string in IRInterpreter::CanInterpret so that the caller doesn't print (null) instead of an explanation. I don't entirely understand the error, so feel free to suggest a better wording. 4. XFailed the test on Windows. The interpreter won't evaluate the lambda because the module has multiple function bodies. I don't exactly understand why that's a problem for the interpreter nor why the problem arises only on Windows. Differential Revision: http://reviews.llvm.org/D19606 llvm-svn: 268573 --- .../lldbsuite/test/lang/cpp/lambdas/TestLambdas.py | 2 +- .../lldbsuite/test/lang/cpp/lambdas/main.cpp | 6 +++--- lldb/packages/Python/lldbsuite/test/lldbinline.py | 14 +++++++++----- lldb/source/Expression/IRInterpreter.cpp | 14 +++++++++++--- 4 files changed, 24 insertions(+), 12 deletions(-) diff --git a/lldb/packages/Python/lldbsuite/test/lang/cpp/lambdas/TestLambdas.py b/lldb/packages/Python/lldbsuite/test/lang/cpp/lambdas/TestLambdas.py index f08c0dcbda983..97cc177aab70d 100644 --- a/lldb/packages/Python/lldbsuite/test/lang/cpp/lambdas/TestLambdas.py +++ b/lldb/packages/Python/lldbsuite/test/lang/cpp/lambdas/TestLambdas.py @@ -1,4 +1,4 @@ from lldbsuite.test import lldbinline from lldbsuite.test import decorators -lldbinline.MakeInlineTest(__file__, globals(), []) +lldbinline.MakeInlineTest(__file__, globals(), [lldbinline.expectedFailureAll(oslist=["windows"])]) diff --git a/lldb/packages/Python/lldbsuite/test/lang/cpp/lambdas/main.cpp b/lldb/packages/Python/lldbsuite/test/lang/cpp/lambdas/main.cpp index 8d387d2ffb67a..3cce3baf2924c 100644 --- a/lldb/packages/Python/lldbsuite/test/lang/cpp/lambdas/main.cpp +++ b/lldb/packages/Python/lldbsuite/test/lang/cpp/lambdas/main.cpp @@ -11,7 +11,7 @@ int main (int argc, char const *argv[]) { - printf("Stop here\n"); //% self.runCmd("expression auto $add = [](int a, int b) { return a + b };") - //% self.expect("expression $add(2,3)", substrs = ['= 5']) - return 0; + printf("Stop here\n"); //% self.runCmd("expression auto $add = [](int a, int b) { return a + b; }") + //% self.expect("expression $add(2,3)", substrs = ['= 5']) + return 0; } diff --git a/lldb/packages/Python/lldbsuite/test/lldbinline.py b/lldb/packages/Python/lldbsuite/test/lldbinline.py index ac2e2573c1af4..010298cb2b825 100644 --- a/lldb/packages/Python/lldbsuite/test/lldbinline.py +++ b/lldb/packages/Python/lldbsuite/test/lldbinline.py @@ -186,7 +186,7 @@ def ApplyDecoratorsToFunction(func, decorators): elif hasattr(decorators, '__call__'): tmp = decorators(tmp) return tmp - + def MakeInlineTest(__file, __globals, decorators=None): # Adjust the filename if it ends in .pyc. We want filenames to @@ -200,13 +200,17 @@ def MakeInlineTest(__file, __globals, decorators=None): InlineTest.mydir = TestBase.compute_mydir(__file) test_name, _ = os.path.splitext(file_basename) - # Build the test case + # Build the test case test = type(test_name, (InlineTest,), {'using_dsym': None}) test.name = test_name - test.test_with_dsym = ApplyDecoratorsToFunction(test._InlineTest__test_with_dsym, decorators) - test.test_with_dwarf = ApplyDecoratorsToFunction(test._InlineTest__test_with_dwarf, decorators) - test.test_with_dwo = ApplyDecoratorsToFunction(test._InlineTest__test_with_dwo, decorators) + target_platform = lldb.DBG.GetSelectedPlatform().GetTriple().split('-')[2] + if test_categories.is_supported_on_platform("dsym", target_platform): + test.test_with_dsym = ApplyDecoratorsToFunction(test._InlineTest__test_with_dsym, decorators) + if test_categories.is_supported_on_platform("dwarf", target_platform): + test.test_with_dwarf = ApplyDecoratorsToFunction(test._InlineTest__test_with_dwarf, decorators) + if test_categories.is_supported_on_platform("dwo", target_platform): + test.test_with_dwo = ApplyDecoratorsToFunction(test._InlineTest__test_with_dwo, decorators) # Add the test case to the globals, and hide InlineTest __globals.update({test_name : test}) diff --git a/lldb/source/Expression/IRInterpreter.cpp b/lldb/source/Expression/IRInterpreter.cpp index 2871a066013a5..42d6dc116f9f3 100644 --- a/lldb/source/Expression/IRInterpreter.cpp +++ b/lldb/source/Expression/IRInterpreter.cpp @@ -477,6 +477,7 @@ static const char *memory_write_error = "Interpreter couldn't writ static const char *memory_read_error = "Interpreter couldn't read from memory"; static const char *infinite_loop_error = "Interpreter ran for too many cycles"; //static const char *bad_result_error = "Result of expression is in bad memory"; +static const char *too_many_functions_error = "Interpreter doesn't handle modules with multiple function bodies."; static bool CanResolveConstant (llvm::Constant *constant) @@ -506,7 +507,7 @@ CanResolveConstant (llvm::Constant *constant) Constant *base = dyn_cast(*op_cursor); if (!base) return false; - + return CanResolveConstant(base); } } @@ -535,7 +536,13 @@ IRInterpreter::CanInterpret (llvm::Module &module, if (fi->begin() != fi->end()) { if (saw_function_with_body) + { + if (log) + log->Printf("More than one function in the module has a body"); + error.SetErrorToGenericError(); + error.SetErrorString(too_many_functions_error); return false; + } saw_function_with_body = true; } } @@ -664,7 +671,7 @@ IRInterpreter::CanInterpret (llvm::Module &module, return false; } } - + if (Constant *constant = llvm::dyn_cast(operand)) { if (!CanResolveConstant(constant)) @@ -680,7 +687,8 @@ IRInterpreter::CanInterpret (llvm::Module &module, } - return true;} + return true; +} bool IRInterpreter::Interpret (llvm::Module &module,