1*99451b44SJordan Rupprecht""" 2*99451b44SJordan RupprechtTest calling user defined functions using expression evaluation. 3*99451b44SJordan Rupprecht 4*99451b44SJordan RupprechtNote: 5*99451b44SJordan Rupprecht LLDBs current first choice of evaluating functions is using the IR interpreter, 6*99451b44SJordan Rupprecht which is only supported on Hexagon. Otherwise JIT is used for the evaluation. 7*99451b44SJordan Rupprecht 8*99451b44SJordan Rupprecht""" 9*99451b44SJordan Rupprecht 10*99451b44SJordan Rupprecht 11*99451b44SJordan Rupprecht 12*99451b44SJordan Rupprechtimport lldb 13*99451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 14*99451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 15*99451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 16*99451b44SJordan Rupprecht 17*99451b44SJordan Rupprecht 18*99451b44SJordan Rupprechtclass ExprCommandCallUserDefinedFunction(TestBase): 19*99451b44SJordan Rupprecht 20*99451b44SJordan Rupprecht mydir = TestBase.compute_mydir(__file__) 21*99451b44SJordan Rupprecht 22*99451b44SJordan Rupprecht def setUp(self): 23*99451b44SJordan Rupprecht # Call super's setUp(). 24*99451b44SJordan Rupprecht TestBase.setUp(self) 25*99451b44SJordan Rupprecht # Find the line number to break for main.c. 26*99451b44SJordan Rupprecht self.line = line_number( 27*99451b44SJordan Rupprecht 'main.cpp', 28*99451b44SJordan Rupprecht '// Please test these expressions while stopped at this line:') 29*99451b44SJordan Rupprecht 30*99451b44SJordan Rupprecht def test(self): 31*99451b44SJordan Rupprecht """Test return values of user defined function calls.""" 32*99451b44SJordan Rupprecht self.build() 33*99451b44SJordan Rupprecht 34*99451b44SJordan Rupprecht # Set breakpoint in main and run exe 35*99451b44SJordan Rupprecht self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET) 36*99451b44SJordan Rupprecht lldbutil.run_break_set_by_file_and_line( 37*99451b44SJordan Rupprecht self, "main.cpp", self.line, num_expected_locations=-1, loc_exact=True) 38*99451b44SJordan Rupprecht 39*99451b44SJordan Rupprecht self.runCmd("run", RUN_SUCCEEDED) 40*99451b44SJordan Rupprecht 41*99451b44SJordan Rupprecht # Test recursive function call. 42*99451b44SJordan Rupprecht self.expect_expr("fib(5)", result_type="unsigned int", result_value="5") 43*99451b44SJordan Rupprecht 44*99451b44SJordan Rupprecht # Test function with more than one paramter 45*99451b44SJordan Rupprecht self.expect_expr("add(4, 8)", result_type="int", result_value="12") 46*99451b44SJordan Rupprecht 47*99451b44SJordan Rupprecht # Test nesting function calls in function paramters 48*99451b44SJordan Rupprecht self.expect_expr("add(add(5,2),add(3,4))", result_type="int", result_value="14") 49*99451b44SJordan Rupprecht self.expect_expr("add(add(5,2),fib(5))", result_type="int", result_value="12") 50*99451b44SJordan Rupprecht 51*99451b44SJordan Rupprecht # Test function with pointer paramter 52*99451b44SJordan Rupprecht self.expect_expr('stringCompare((const char*) \"Hello world\")', result_type="bool", result_value="true") 53*99451b44SJordan Rupprecht self.expect_expr('stringCompare((const char*) \"Hellworld\")', result_type="bool", result_value="false") 54