199451b44SJordan Rupprechtimport lldb 299451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 399451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 499451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 599451b44SJordan Rupprecht 699451b44SJordan Rupprecht 799451b44SJordan Rupprechtclass TestMacros(TestBase): 8*2238dcc3SJonas Devlieghere @skipIf(compiler="clang", compiler_version=["<", "9.0"]) 999451b44SJordan Rupprecht @expectedFailureAll( 10*2238dcc3SJonas Devlieghere compiler="clang", bugnumber="clang does not emit .debug_macro[.dwo] sections." 11*2238dcc3SJonas Devlieghere ) 12da459043SStella Stamenova @expectedFailureAll( 13da459043SStella Stamenova debug_info="dwo", 14*2238dcc3SJonas Devlieghere bugnumber="GCC produces multiple .debug_macro.dwo sections and the spec is unclear as to what it means", 15*2238dcc3SJonas Devlieghere ) 16*2238dcc3SJonas Devlieghere @expectedFailureAll(hostoslist=["windows"], compiler="gcc", triple=".*-android") 17da459043SStella Stamenova @expectedFailureAll( 1899451b44SJordan Rupprecht compiler="gcc", 19*2238dcc3SJonas Devlieghere compiler_version=["<", "5.1"], 20*2238dcc3SJonas Devlieghere bugnumber=".debug_macro was introduced in DWARF 5, GCC supports it since version 5.1", 21*2238dcc3SJonas Devlieghere ) 2299451b44SJordan Rupprecht def test_expr_with_macros(self): 2399451b44SJordan Rupprecht self.build() 2499451b44SJordan Rupprecht 2599451b44SJordan Rupprecht # Get main source file 2699451b44SJordan Rupprecht src_file = "main.cpp" 2799451b44SJordan Rupprecht hdr_file = "macro1.h" 2899451b44SJordan Rupprecht src_file_spec = lldb.SBFileSpec(src_file) 2999451b44SJordan Rupprecht self.assertTrue(src_file_spec.IsValid(), "Main source file") 3099451b44SJordan Rupprecht 3199451b44SJordan Rupprecht (target, process, thread, bp1) = lldbutil.run_to_source_breakpoint( 32*2238dcc3SJonas Devlieghere self, "Break here", src_file_spec 33*2238dcc3SJonas Devlieghere ) 3499451b44SJordan Rupprecht 3599451b44SJordan Rupprecht # Get frame for current thread 3699451b44SJordan Rupprecht frame = thread.GetSelectedFrame() 3799451b44SJordan Rupprecht 3899451b44SJordan Rupprecht result = frame.EvaluateExpression("MACRO_1") 3999451b44SJordan Rupprecht self.assertTrue( 40*2238dcc3SJonas Devlieghere result.IsValid() and result.GetValue() == "100", "MACRO_1 = 100" 41*2238dcc3SJonas Devlieghere ) 4299451b44SJordan Rupprecht 4399451b44SJordan Rupprecht result = frame.EvaluateExpression("MACRO_2") 4499451b44SJordan Rupprecht self.assertTrue( 45*2238dcc3SJonas Devlieghere result.IsValid() and result.GetValue() == "200", "MACRO_2 = 200" 46*2238dcc3SJonas Devlieghere ) 4799451b44SJordan Rupprecht 4899451b44SJordan Rupprecht result = frame.EvaluateExpression("ONE") 49*2238dcc3SJonas Devlieghere self.assertTrue(result.IsValid() and result.GetValue() == "1", "ONE = 1") 5099451b44SJordan Rupprecht 5199451b44SJordan Rupprecht result = frame.EvaluateExpression("TWO") 52*2238dcc3SJonas Devlieghere self.assertTrue(result.IsValid() and result.GetValue() == "2", "TWO = 2") 5399451b44SJordan Rupprecht 5499451b44SJordan Rupprecht result = frame.EvaluateExpression("THREE") 55*2238dcc3SJonas Devlieghere self.assertTrue(result.IsValid() and result.GetValue() == "3", "THREE = 3") 5699451b44SJordan Rupprecht 5799451b44SJordan Rupprecht result = frame.EvaluateExpression("FOUR") 58*2238dcc3SJonas Devlieghere self.assertTrue(result.IsValid() and result.GetValue() == "4", "FOUR = 4") 5999451b44SJordan Rupprecht 6099451b44SJordan Rupprecht result = frame.EvaluateExpression("HUNDRED") 6199451b44SJordan Rupprecht self.assertTrue( 62*2238dcc3SJonas Devlieghere result.IsValid() and result.GetValue() == "100", "HUNDRED = 100" 63*2238dcc3SJonas Devlieghere ) 6499451b44SJordan Rupprecht 6599451b44SJordan Rupprecht result = frame.EvaluateExpression("THOUSAND") 6699451b44SJordan Rupprecht self.assertTrue( 67*2238dcc3SJonas Devlieghere result.IsValid() and result.GetValue() == "1000", "THOUSAND = 1000" 68*2238dcc3SJonas Devlieghere ) 6999451b44SJordan Rupprecht 7099451b44SJordan Rupprecht result = frame.EvaluateExpression("MILLION") 71*2238dcc3SJonas Devlieghere self.assertTrue( 72*2238dcc3SJonas Devlieghere result.IsValid() and result.GetValue() == "1000000", "MILLION = 1000000" 73*2238dcc3SJonas Devlieghere ) 7499451b44SJordan Rupprecht 7599451b44SJordan Rupprecht result = frame.EvaluateExpression("MAX(ONE, TWO)") 7699451b44SJordan Rupprecht self.assertTrue( 77*2238dcc3SJonas Devlieghere result.IsValid() and result.GetValue() == "2", "MAX(ONE, TWO) = 2" 78*2238dcc3SJonas Devlieghere ) 7999451b44SJordan Rupprecht 8099451b44SJordan Rupprecht result = frame.EvaluateExpression("MAX(THREE, TWO)") 8199451b44SJordan Rupprecht self.assertTrue( 82*2238dcc3SJonas Devlieghere result.IsValid() and result.GetValue() == "3", "MAX(THREE, TWO) = 3" 83*2238dcc3SJonas Devlieghere ) 8499451b44SJordan Rupprecht 8599451b44SJordan Rupprecht # Get the thread of the process 8699451b44SJordan Rupprecht thread.StepOver() 8799451b44SJordan Rupprecht 8899451b44SJordan Rupprecht # Get frame for current thread 8999451b44SJordan Rupprecht frame = thread.GetSelectedFrame() 9099451b44SJordan Rupprecht 9199451b44SJordan Rupprecht result = frame.EvaluateExpression("MACRO_2") 9299451b44SJordan Rupprecht self.assertTrue( 93*2238dcc3SJonas Devlieghere result.GetError().Fail(), "Printing MACRO_2 fails in the mail file" 94*2238dcc3SJonas Devlieghere ) 9599451b44SJordan Rupprecht 9699451b44SJordan Rupprecht result = frame.EvaluateExpression("FOUR") 9799451b44SJordan Rupprecht self.assertTrue( 98*2238dcc3SJonas Devlieghere result.GetError().Fail(), "Printing FOUR fails in the main file" 99*2238dcc3SJonas Devlieghere ) 10099451b44SJordan Rupprecht 10199451b44SJordan Rupprecht thread.StepInto() 10299451b44SJordan Rupprecht 10399451b44SJordan Rupprecht # Get frame for current thread 10499451b44SJordan Rupprecht frame = thread.GetSelectedFrame() 10599451b44SJordan Rupprecht 10699451b44SJordan Rupprecht result = frame.EvaluateExpression("ONE") 107*2238dcc3SJonas Devlieghere self.assertTrue(result.IsValid() and result.GetValue() == "1", "ONE = 1") 10899451b44SJordan Rupprecht 10999451b44SJordan Rupprecht result = frame.EvaluateExpression("MAX(ONE, TWO)") 11099451b44SJordan Rupprecht self.assertTrue( 111*2238dcc3SJonas Devlieghere result.IsValid() and result.GetValue() == "2", "MAX(ONE, TWO) = 2" 112*2238dcc3SJonas Devlieghere ) 11399451b44SJordan Rupprecht 11499451b44SJordan Rupprecht # This time, MACRO_1 and MACRO_2 are not visible. 11599451b44SJordan Rupprecht result = frame.EvaluateExpression("MACRO_1") 116*2238dcc3SJonas Devlieghere self.assertTrue( 117*2238dcc3SJonas Devlieghere result.GetError().Fail(), "Printing MACRO_1 fails in the header file" 118*2238dcc3SJonas Devlieghere ) 11999451b44SJordan Rupprecht 12099451b44SJordan Rupprecht result = frame.EvaluateExpression("MACRO_2") 121*2238dcc3SJonas Devlieghere self.assertTrue( 122*2238dcc3SJonas Devlieghere result.GetError().Fail(), "Printing MACRO_2 fails in the header file" 123*2238dcc3SJonas Devlieghere ) 1249f3a3e1fSRaphael Isemann 1259f3a3e1fSRaphael Isemann # Check that the macro definitions do not trigger bogus Clang 1269f3a3e1fSRaphael Isemann # diagnostics about macro redefinitions. 1279f3a3e1fSRaphael Isemann result = frame.EvaluateExpression("does_not_parse") 1289f3a3e1fSRaphael Isemann self.assertNotIn("macro redefined", str(result.GetError())) 1299f3a3e1fSRaphael Isemann self.assertNotIn("redefining builtin macro", str(result.GetError())) 130