[Lldb-commits] [lldb] r346053 - Add an SBExpressionOptions setting mirroring the "exec" command's --allow-jit.

Jim Ingham via lldb-commits lldb-commits at lists.llvm.org
Fri Nov 2 16:42:40 PDT 2018


Author: jingham
Date: Fri Nov  2 16:42:40 2018
New Revision: 346053

URL: http://llvm.org/viewvc/llvm-project?rev=346053&view=rev
Log:
Add an SBExpressionOptions setting mirroring the "exec" command's --allow-jit.

<rdar://problem/44809176>

Differential Revision: https://reviews.llvm.org/D54056

Added:
    lldb/trunk/packages/Python/lldbsuite/test/expression_command/dont_allow_jit/
    lldb/trunk/packages/Python/lldbsuite/test/expression_command/dont_allow_jit/Makefile
    lldb/trunk/packages/Python/lldbsuite/test/expression_command/dont_allow_jit/TestSampleTest.py
    lldb/trunk/packages/Python/lldbsuite/test/expression_command/dont_allow_jit/main.c
Modified:
    lldb/trunk/include/lldb/API/SBExpressionOptions.h
    lldb/trunk/scripts/interface/SBExpressionOptions.i
    lldb/trunk/source/API/SBExpressionOptions.cpp

Modified: lldb/trunk/include/lldb/API/SBExpressionOptions.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/API/SBExpressionOptions.h?rev=346053&r1=346052&r2=346053&view=diff
==============================================================================
--- lldb/trunk/include/lldb/API/SBExpressionOptions.h (original)
+++ lldb/trunk/include/lldb/API/SBExpressionOptions.h Fri Nov  2 16:42:40 2018
@@ -90,6 +90,12 @@ public:
   bool GetTopLevel();
 
   void SetTopLevel(bool b = true);
+  
+  // Gets whether we will JIT an expression if it cannot be interpreted
+  bool GetAllowJIT();
+  
+  // Sets whether we will JIT an expression if it cannot be interpreted
+  void SetAllowJIT(bool allow);
 
 protected:
   SBExpressionOptions(

Added: lldb/trunk/packages/Python/lldbsuite/test/expression_command/dont_allow_jit/Makefile
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/expression_command/dont_allow_jit/Makefile?rev=346053&view=auto
==============================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/expression_command/dont_allow_jit/Makefile (added)
+++ lldb/trunk/packages/Python/lldbsuite/test/expression_command/dont_allow_jit/Makefile Fri Nov  2 16:42:40 2018
@@ -0,0 +1,6 @@
+LEVEL = ../../make
+
+C_SOURCES := main.c
+CFLAGS_EXTRAS += -std=c99
+
+include $(LEVEL)/Makefile.rules

Added: lldb/trunk/packages/Python/lldbsuite/test/expression_command/dont_allow_jit/TestSampleTest.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/expression_command/dont_allow_jit/TestSampleTest.py?rev=346053&view=auto
==============================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/expression_command/dont_allow_jit/TestSampleTest.py (added)
+++ lldb/trunk/packages/Python/lldbsuite/test/expression_command/dont_allow_jit/TestSampleTest.py Fri Nov  2 16:42:40 2018
@@ -0,0 +1,94 @@
+"""
+Test that --allow-jit=false does disallow JITting:
+"""
+
+from __future__ import print_function
+
+
+import os
+import time
+import re
+import lldb
+import lldbsuite.test.lldbutil as lldbutil
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test.decorators import *
+
+class TestAllowJIT(TestBase):
+
+    mydir = TestBase.compute_mydir(__file__)
+
+    # If your test case doesn't stress debug info, the
+    # set this to true.  That way it won't be run once for
+    # each debug info format.
+    NO_DEBUG_INFO_TESTCASE = True
+
+    @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr21765")
+    def test_allow_jit_expr_command(self):
+        """Test the --allow-jit command line flag"""
+        self.build()
+        self.main_source_file = lldb.SBFileSpec("main.c")
+        self.expr_cmd_test()
+
+    @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr21765")
+    def test_allow_jit_options(self):
+        """Test the SetAllowJIT SBExpressionOption setting"""
+        self.build()
+        self.main_source_file = lldb.SBFileSpec("main.c")
+        self.expr_options_test()
+
+        
+
+    def setUp(self):
+        # Call super's setUp().
+        TestBase.setUp(self)
+
+    def expr_cmd_test(self):
+        (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(self,
+                                   "Set a breakpoint here", self.main_source_file)
+
+        frame = thread.GetFrameAtIndex(0)
+        
+        # First make sure we can call the function with 
+        interp = self.dbg.GetCommandInterpreter()
+        self.expect("expr --allow-jit 1 -- call_me(10)",
+                    substrs = ["(int) $", "= 18"])
+        # Now make sure it fails with the "can't IR interpret message" if allow-jit is false:
+        self.expect("expr --allow-jit 0 -- call_me(10)",
+                    error=True,
+                    substrs = ["Can't run the expression locally"])
+        
+    def expr_options_test(self):
+        (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(self,
+                                   "Set a breakpoint here", self.main_source_file)
+
+        frame = thread.GetFrameAtIndex(0)
+        
+        # First make sure we can call the function with the default option set. 
+        options = lldb.SBExpressionOptions()
+        # Check that the default is to allow JIT:
+        self.assertEqual(options.GetAllowJIT(), True, "Default is true")
+
+        # Now use the options:
+        result = frame.EvaluateExpression("call_me(10)", options)
+        self.assertTrue(result.GetError().Success(), "expression succeeded")
+        self.assertEqual(result.GetValueAsSigned(), 18, "got the right value.")
+
+        # Now disallow JIT and make sure it fails:
+        options.SetAllowJIT(False)
+        # Check that we got the right value:
+        self.assertEqual(options.GetAllowJIT(), False, "Got False after setting to False")
+
+        # Again use it and ensure we fail:
+        result = frame.EvaluateExpression("call_me(10)", options)
+        self.assertTrue(result.GetError().Fail(), "expression failed with no JIT")
+        self.assertTrue("Can't run the expression locally" in result.GetError().GetCString(), "Got right error")
+
+        # Finally set the allow JIT value back to true and make sure that works:
+        options.SetAllowJIT(True)
+        self.assertEqual(options.GetAllowJIT(), True, "Set back to True correctly")
+
+        # And again, make sure this works:
+        result = frame.EvaluateExpression("call_me(10)", options)
+        self.assertTrue(result.GetError().Success(), "expression succeeded")
+        self.assertEqual(result.GetValueAsSigned(), 18, "got the right value.")
+

Added: lldb/trunk/packages/Python/lldbsuite/test/expression_command/dont_allow_jit/main.c
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/expression_command/dont_allow_jit/main.c?rev=346053&view=auto
==============================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/expression_command/dont_allow_jit/main.c (added)
+++ lldb/trunk/packages/Python/lldbsuite/test/expression_command/dont_allow_jit/main.c Fri Nov  2 16:42:40 2018
@@ -0,0 +1,15 @@
+#include <stdio.h>
+
+int
+call_me(int input)
+{
+  return printf("I was called: %d.\n", input);
+}
+
+int
+main()
+{
+  int test_var = 10;
+  printf ("Set a breakpoint here: %d.\n", test_var);
+  return call_me(100);
+}

Modified: lldb/trunk/scripts/interface/SBExpressionOptions.i
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/interface/SBExpressionOptions.i?rev=346053&r1=346052&r2=346053&view=diff
==============================================================================
--- lldb/trunk/scripts/interface/SBExpressionOptions.i (original)
+++ lldb/trunk/scripts/interface/SBExpressionOptions.i Fri Nov  2 16:42:40 2018
@@ -132,6 +132,14 @@ public:
 
     void
     SetTopLevel(bool b = true);
+  
+    %feature("docstring", "Gets whether to JIT an expression if it cannot be interpreted.") GetAllowJIT;
+    bool
+    GetAllowJIT();
+  
+    %feature("docstring", "Sets whether to JIT an expression if it cannot be interpreted.") SetAllowJIT;
+    void
+    SetAllowJIT(bool allow);
 
 protected:
 

Modified: lldb/trunk/source/API/SBExpressionOptions.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBExpressionOptions.cpp?rev=346053&r1=346052&r2=346053&view=diff
==============================================================================
--- lldb/trunk/source/API/SBExpressionOptions.cpp (original)
+++ lldb/trunk/source/API/SBExpressionOptions.cpp Fri Nov  2 16:42:40 2018
@@ -159,6 +159,15 @@ void SBExpressionOptions::SetTopLevel(bo
                                     : m_opaque_ap->default_execution_policy);
 }
 
+bool SBExpressionOptions::GetAllowJIT() {
+  return m_opaque_ap->GetExecutionPolicy() != eExecutionPolicyNever;
+}
+
+void SBExpressionOptions::SetAllowJIT(bool allow) {
+  m_opaque_ap->SetExecutionPolicy(allow ? m_opaque_ap->default_execution_policy
+                                    : eExecutionPolicyNever);
+}
+
 EvaluateExpressionOptions *SBExpressionOptions::get() const {
   return m_opaque_ap.get();
 }




More information about the lldb-commits mailing list