xref: /llvm-project/lldb/test/API/commands/expression/macros/TestMacros.py (revision 2238dcc39358353cac21df75c3c3286ab20b8f53)
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