xref: /llvm-project/lldb/test/API/functionalities/gdb_remote_client/TestXMLRegisterFlags.py (revision 208a08c3b7b00c05629c3f18811aac81f17cd81b)
1e07a421dSDavid Spickett""" Check that register fields found in target XML are properly processed.
2e07a421dSDavid Spickett
3e07a421dSDavid SpickettThese tests make XML out of string substitution. This can lead to some strange
4e07a421dSDavid Spickettfailures. Check that the final XML is valid and each child is indented more than
5e07a421dSDavid Spickettthe parent tag.
6e07a421dSDavid Spickett"""
7e07a421dSDavid Spickett
8e07a421dSDavid Spickettfrom textwrap import dedent
9e07a421dSDavid Spickettimport lldb
10e07a421dSDavid Spickettfrom lldbsuite.test.lldbtest import *
11e07a421dSDavid Spickettfrom lldbsuite.test.decorators import *
12e07a421dSDavid Spickettfrom lldbsuite.test.gdbclientutils import *
13e07a421dSDavid Spickettfrom lldbsuite.test.lldbgdbclient import GDBRemoteTestBase
14e07a421dSDavid Spickett
152238dcc3SJonas Devlieghere
16e07a421dSDavid Spickettclass MultiDocResponder(MockGDBServerResponder):
17e07a421dSDavid Spickett    # docs is a dictionary of filename -> file content.
18e07a421dSDavid Spickett    def __init__(self, docs):
19e07a421dSDavid Spickett        super().__init__()
20e07a421dSDavid Spickett        self.docs = docs
21e07a421dSDavid Spickett
22e07a421dSDavid Spickett    def qXferRead(self, obj, annex, offset, length):
23e07a421dSDavid Spickett        try:
24e07a421dSDavid Spickett            return self.docs[annex], False
25e07a421dSDavid Spickett        except KeyError:
262238dcc3SJonas Devlieghere            return (None,)
27e07a421dSDavid Spickett
28e07a421dSDavid Spickett    def readRegister(self, regnum):
29e07a421dSDavid Spickett        return "E01"
30e07a421dSDavid Spickett
31e07a421dSDavid Spickett    def readRegisters(self):
322238dcc3SJonas Devlieghere        return "".join(
332238dcc3SJonas Devlieghere            [
34e07a421dSDavid Spickett                # Data for all registers requested by the tests below.
35e07a421dSDavid Spickett                # 0x7 and 0xE are used because their lsb and msb are opposites, which
36e07a421dSDavid Spickett                # is needed for a byte order test.
372238dcc3SJonas Devlieghere                "77777777EEEEEEEE",  # 64 bit x0/r0
382238dcc3SJonas Devlieghere                "7777EEEE",  # 32 bit cpsr/fpc
392238dcc3SJonas Devlieghere                "0000000000000000",  # 64 bit pc/pswa
402238dcc3SJonas Devlieghere            ]
412238dcc3SJonas Devlieghere        )
422238dcc3SJonas Devlieghere
43e07a421dSDavid Spickett
44e07a421dSDavid Spickettclass TestXMLRegisterFlags(GDBRemoteTestBase):
45e07a421dSDavid Spickett    def setup_multidoc_test(self, docs):
46e07a421dSDavid Spickett        self.server.responder = MultiDocResponder(docs)
472238dcc3SJonas Devlieghere        target = self.dbg.CreateTarget("")
48e07a421dSDavid Spickett
49e07a421dSDavid Spickett        if self.TraceOn():
50e07a421dSDavid Spickett            self.runCmd("log enable gdb-remote packets process")
51e07a421dSDavid Spickett            self.addTearDownHook(
522238dcc3SJonas Devlieghere                lambda: self.runCmd("log disable gdb-remote packets process")
532238dcc3SJonas Devlieghere            )
54e07a421dSDavid Spickett
55e07a421dSDavid Spickett        process = self.connect(target)
562238dcc3SJonas Devlieghere        lldbutil.expect_state_changes(
572238dcc3SJonas Devlieghere            self, self.dbg.GetListener(), process, [lldb.eStateStopped]
582238dcc3SJonas Devlieghere        )
59e07a421dSDavid Spickett
60e07a421dSDavid Spickett    def setup_register_test(self, registers):
61e07a421dSDavid Spickett        self.setup_multidoc_test(
62e07a421dSDavid Spickett            # This *must* begin with the opening tag, leading whitespace is not allowed.
632238dcc3SJonas Devlieghere            {
642238dcc3SJonas Devlieghere                "target.xml": dedent(
652238dcc3SJonas Devlieghere                    """\
66e07a421dSDavid Spickett            <?xml version="1.0"?>
67e07a421dSDavid Spickett              <target version="1.0">
68e07a421dSDavid Spickett                <architecture>aarch64</architecture>
69e07a421dSDavid Spickett                <feature name="org.gnu.gdb.aarch64.core">
70e07a421dSDavid Spickett                  {}
71e07a421dSDavid Spickett                </feature>
722238dcc3SJonas Devlieghere            </target>"""
732238dcc3SJonas Devlieghere                ).format(registers)
742238dcc3SJonas Devlieghere            }
752238dcc3SJonas Devlieghere        )
76e07a421dSDavid Spickett
77e07a421dSDavid Spickett    def setup_flags_test(self, flags):
78e07a421dSDavid Spickett        # pc is required here though we don't look at it in the tests.
79e07a421dSDavid Spickett        # x0 is only used by some tests but always including it keeps the data ordering
80e07a421dSDavid Spickett        # the same throughout.
812238dcc3SJonas Devlieghere        self.setup_register_test(
822238dcc3SJonas Devlieghere            """\
83e07a421dSDavid Spickett          <flags id="cpsr_flags" size="4">
84e07a421dSDavid Spickett            {}
85e07a421dSDavid Spickett          </flags>
86e07a421dSDavid Spickett          <reg name="pc" bitsize="64"/>
87e07a421dSDavid Spickett          <reg name="x0" regnum="0" bitsize="64" type="x0_flags"/>
88e07a421dSDavid Spickett          <reg name="cpsr" regnum="33" bitsize="32" type="cpsr_flags"/>""".format(
892238dcc3SJonas Devlieghere                flags
902238dcc3SJonas Devlieghere            )
912238dcc3SJonas Devlieghere        )
92e07a421dSDavid Spickett
93e07a421dSDavid Spickett    @skipIfXmlSupportMissing
94e07a421dSDavid Spickett    @skipIfRemote
95e07a421dSDavid Spickett    def test_no_flags(self):
96e07a421dSDavid Spickett        self.setup_flags_test("")
97e07a421dSDavid Spickett        self.expect("register read cpsr", substrs=["= 0xeeee7777"])
98e07a421dSDavid Spickett
99e07a421dSDavid Spickett    @skipIfXmlSupportMissing
100e07a421dSDavid Spickett    @skipIfRemote
101e07a421dSDavid Spickett    def test_single_field_pad_msb(self):
102e07a421dSDavid Spickett        self.setup_flags_test("""<field name="SP" start="0" end="0"/>""")
103e07a421dSDavid Spickett        # Pads from 31 to 1.
104e07a421dSDavid Spickett        self.expect("register read cpsr", substrs=["(SP = 1)"])
105e07a421dSDavid Spickett
106e07a421dSDavid Spickett    @skipIfXmlSupportMissing
107e07a421dSDavid Spickett    @skipIfRemote
108e07a421dSDavid Spickett    def test_single_field_pad_lsb(self):
109e07a421dSDavid Spickett        self.setup_flags_test("""<field name="SP" start="31" end="31"/>""")
110e07a421dSDavid Spickett        self.expect("register read cpsr", substrs=["(SP = 1)"])
111e07a421dSDavid Spickett
112e07a421dSDavid Spickett    @skipIfXmlSupportMissing
113e07a421dSDavid Spickett    @skipIfRemote
114e07a421dSDavid Spickett    def test_multiple_fields_sorted(self):
1152238dcc3SJonas Devlieghere        self.setup_flags_test(
1162238dcc3SJonas Devlieghere            """<field name="SP" start="0" end="0"/>
1172238dcc3SJonas Devlieghere                                 <field name="EL" start="1" end="2"/>"""
1182238dcc3SJonas Devlieghere        )
119e07a421dSDavid Spickett
120e07a421dSDavid Spickett        # Fields should be sorted with MSB on the left.
121e07a421dSDavid Spickett        self.expect("register read cpsr", substrs=["(EL = 3, SP = 1)"])
122e07a421dSDavid Spickett
123e07a421dSDavid Spickett    @skipIfXmlSupportMissing
124e07a421dSDavid Spickett    @skipIfRemote
125e07a421dSDavid Spickett    def test_ignore_invalid_start_end(self):
126e07a421dSDavid Spickett        self.setup_flags_test(
127e07a421dSDavid Spickett            # Is valid so is used.
128e07a421dSDavid Spickett            '<field name="EL" start="2" end="3"/>'
129e07a421dSDavid Spickett            # Start/end cannot be negative, ignored.
130e07a421dSDavid Spickett            '<field name="SP" start="-1" end="2"/>'
131e07a421dSDavid Spickett            '<field name="SP2" start="1" end="-5"/>'
132e07a421dSDavid Spickett            # Start is not <= end, ignored.
133e07a421dSDavid Spickett            '<field name="ABC" start="12" end="10"/>'
134e07a421dSDavid Spickett            # Start cannot be >= (size of register in bits)
135e07a421dSDavid Spickett            '<field name="?" start="32" end="29"/>'
136e07a421dSDavid Spickett            # End cannot be >= (size of register in bits)
1372238dcc3SJonas Devlieghere            '<field name="DEF" start="30" end="35"/>'
1382238dcc3SJonas Devlieghere        )
139e07a421dSDavid Spickett
140e07a421dSDavid Spickett        self.expect("register read cpsr", substrs=["(EL = 1)"])
141e07a421dSDavid Spickett
142e07a421dSDavid Spickett    @skipIfXmlSupportMissing
143e07a421dSDavid Spickett    @skipIfRemote
144e07a421dSDavid Spickett    def test_field_overlap(self):
145e07a421dSDavid Spickett        self.setup_flags_test(
146e07a421dSDavid Spickett            '<field name="?" start="10" end="12"/>'
147e07a421dSDavid Spickett            # A overlaps B
148e07a421dSDavid Spickett            '<field name="A" start="0" end="3"/>'
1492238dcc3SJonas Devlieghere            '<field name="B" start="0" end="0"/>'
1502238dcc3SJonas Devlieghere        )
151e07a421dSDavid Spickett
152e07a421dSDavid Spickett        # Ignore the whole flags set, it is unlikely to be valid.
153e07a421dSDavid Spickett        self.expect("register read cpsr", substrs=["("], matching=False)
154e07a421dSDavid Spickett
155e07a421dSDavid Spickett    @skipIfXmlSupportMissing
156e07a421dSDavid Spickett    @skipIfRemote
157e07a421dSDavid Spickett    def test_field_required_attributes(self):
158e07a421dSDavid Spickett        # Fields must have a name, start and end. Any without are ignored.
159e07a421dSDavid Spickett        self.setup_flags_test(
160e07a421dSDavid Spickett            # Missing name
161e07a421dSDavid Spickett            '<field start="0" end="0"/>'
162e07a421dSDavid Spickett            # Missing start
163e07a421dSDavid Spickett            '<field name="A" end="0"/>'
164e07a421dSDavid Spickett            # Missing end
165e07a421dSDavid Spickett            '<field name="B" start="0"/>'
166e07a421dSDavid Spickett            # Valid
1672238dcc3SJonas Devlieghere            '<field name="C" start="0" end="0"/>'
1682238dcc3SJonas Devlieghere        )
169e07a421dSDavid Spickett
170e07a421dSDavid Spickett        self.expect("register read cpsr", substrs=["(C = 1)"])
171e07a421dSDavid Spickett
172e07a421dSDavid Spickett    @skipIfXmlSupportMissing
173e07a421dSDavid Spickett    @skipIfRemote
174e07a421dSDavid Spickett    def test_little_endian_target_order(self):
175e07a421dSDavid Spickett        # We are using little endian AArch64 here.
1762238dcc3SJonas Devlieghere        self.setup_register_test(
1772238dcc3SJonas Devlieghere            """\
178e07a421dSDavid Spickett           <flags id="cpsr_flags" size="4">
179e07a421dSDavid Spickett             <field name="lsb" start="0" end="0"/>
180e07a421dSDavid Spickett             <field name="msb" start="31" end="31"/>
181e07a421dSDavid Spickett           </flags>
182e07a421dSDavid Spickett           <flags id="x0_flags" size="8">
183e07a421dSDavid Spickett             <field name="lsb" start="0" end="0"/>
184e07a421dSDavid Spickett             <field name="msb" start="63" end="63"/>
185e07a421dSDavid Spickett           </flags>
186e07a421dSDavid Spickett           <reg name="pc" bitsize="64"/>
187e07a421dSDavid Spickett           <reg name="x0" regnum="0" bitsize="64" type="x0_flags"/>
1882238dcc3SJonas Devlieghere           <reg name="cpsr" regnum="33" bitsize="32" type="cpsr_flags"/>"""
1892238dcc3SJonas Devlieghere        )
190e07a421dSDavid Spickett
191e07a421dSDavid Spickett        # If lldb used the wrong byte ordering for the value for printing fields,
192e07a421dSDavid Spickett        # these field values would flip. Since the top and bottom bits of 0x7 and 0xE
193e07a421dSDavid Spickett        # are different.
1942238dcc3SJonas Devlieghere        self.expect(
1952238dcc3SJonas Devlieghere            "register read cpsr x0",
1962238dcc3SJonas Devlieghere            substrs=[
197e07a421dSDavid Spickett                "    cpsr = 0xeeee7777\n"
198e07a421dSDavid Spickett                "         = (msb = 1, lsb = 1)\n"
199e07a421dSDavid Spickett                "      x0 = 0xeeeeeeee77777777\n"
2002238dcc3SJonas Devlieghere                "         = (msb = 1, lsb = 1)"
2012238dcc3SJonas Devlieghere            ],
2022238dcc3SJonas Devlieghere        )
203e07a421dSDavid Spickett
204e07a421dSDavid Spickett    @skipIfXmlSupportMissing
205e07a421dSDavid Spickett    @skipIfRemote
206e07a421dSDavid Spickett    # Unlike AArch64, we do need the backend present for this test to work.
207e07a421dSDavid Spickett    @skipIfLLVMTargetMissing("SystemZ")
208e07a421dSDavid Spickett    def test_big_endian_target_order(self):
209e07a421dSDavid Spickett        # s390x/SystemZ is big endian.
2102238dcc3SJonas Devlieghere        self.setup_multidoc_test(
2112238dcc3SJonas Devlieghere            {
2122238dcc3SJonas Devlieghere                "target.xml": dedent(
2132238dcc3SJonas Devlieghere                    """\
214e07a421dSDavid Spickett              <?xml version="1.0"?>
215e07a421dSDavid Spickett              <target version="1.0">
216e07a421dSDavid Spickett                <architecture>s390x</architecture>
217e07a421dSDavid Spickett                <feature name="org.gnu.gdb.s390x.core">
218e07a421dSDavid Spickett                  <flags id="r0_flags" size="8">
219e07a421dSDavid Spickett                    <field name="lsb" start="0" end="0"/>
220e07a421dSDavid Spickett                    <field name="msb" start="63" end="63"/>
221e07a421dSDavid Spickett                  </flags>
222e07a421dSDavid Spickett                  <flags id="fpc_flags" size="4">
223e07a421dSDavid Spickett                    <field name="lsb" start="0" end="0"/>
224e07a421dSDavid Spickett                    <field name="msb" start="31" end="31"/>
225e07a421dSDavid Spickett                  </flags>
226e07a421dSDavid Spickett                  <reg name="r0" bitsize="64" type="r0_flags"/>
227e07a421dSDavid Spickett                  <reg name="fpc" bitsize="32" type="fpc_flags"/>
228e07a421dSDavid Spickett                  <reg name="pswa" bitsize="64"/>
229e07a421dSDavid Spickett                </feature>
2302238dcc3SJonas Devlieghere              </target>"""
2312238dcc3SJonas Devlieghere                )
2322238dcc3SJonas Devlieghere            }
2332238dcc3SJonas Devlieghere        )
234e07a421dSDavid Spickett
235e07a421dSDavid Spickett        # If we did not swap correctly, these fields would show as 1s when run on
236e07a421dSDavid Spickett        # a little endian host.
2372238dcc3SJonas Devlieghere        self.expect(
2382238dcc3SJonas Devlieghere            "register read r0 fpc",
2392238dcc3SJonas Devlieghere            substrs=[
240e07a421dSDavid Spickett                "      r0 = 0x77777777eeeeeeee\n"
241e07a421dSDavid Spickett                "         = (msb = 0, lsb = 0)\n"
242e07a421dSDavid Spickett                "     fpc = 0x7777eeee\n"
243e07a421dSDavid Spickett                "         = (msb = 0, lsb = 0)\n"
2442238dcc3SJonas Devlieghere            ],
2452238dcc3SJonas Devlieghere        )
246e07a421dSDavid Spickett
247e07a421dSDavid Spickett    @skipIfXmlSupportMissing
248e07a421dSDavid Spickett    @skipIfRemote
249e07a421dSDavid Spickett    def test_many_flag_sets(self):
2502238dcc3SJonas Devlieghere        self.setup_register_test(
2512238dcc3SJonas Devlieghere            """\
252e07a421dSDavid Spickett          <flags id="cpsr_flags" size="4">
253e07a421dSDavid Spickett            <field name="correct" start="0" end="0"/>
254e07a421dSDavid Spickett          </flags>
255e07a421dSDavid Spickett          <flags id="cpsr_flags_alt" size="4">
256e07a421dSDavid Spickett            <field name="incorrect" start="0" end="0"/>
257e07a421dSDavid Spickett          </flags>
258e07a421dSDavid Spickett          <flags id="x0_flags" size="8">
259e07a421dSDavid Spickett            <field name="foo" start="0" end="0"/>
260e07a421dSDavid Spickett          </flags>
261e07a421dSDavid Spickett          <reg name="pc" bitsize="64"/>
262e07a421dSDavid Spickett          <reg name="x0" regnum="0" bitsize="64" type="x0_flags"/>
2632238dcc3SJonas Devlieghere          <reg name="cpsr" regnum="33" bitsize="32" type="cpsr_flags"/>"""
2642238dcc3SJonas Devlieghere        )
265e07a421dSDavid Spickett
2662238dcc3SJonas Devlieghere        self.expect(
2672238dcc3SJonas Devlieghere            "register read cpsr x0",
2682238dcc3SJonas Devlieghere            substrs=[
269e07a421dSDavid Spickett                "    cpsr = 0xeeee7777\n"
270e07a421dSDavid Spickett                "         = (correct = 1)\n"
271e07a421dSDavid Spickett                "      x0 = 0xeeeeeeee77777777\n"
2722238dcc3SJonas Devlieghere                "         = (foo = 1)"
2732238dcc3SJonas Devlieghere            ],
2742238dcc3SJonas Devlieghere        )
275e07a421dSDavid Spickett
276e07a421dSDavid Spickett    @skipIfXmlSupportMissing
277e07a421dSDavid Spickett    @skipIfRemote
278e07a421dSDavid Spickett    def test_repeated_flag_set(self):
279e07a421dSDavid Spickett        # The second definition of "cpsr_flags" should be ignored.
280e07a421dSDavid Spickett        # This is because we assign the types to registers as we go. If we allowed
281e07a421dSDavid Spickett        # the later flag set, it would destroy the first definition, making the
282e07a421dSDavid Spickett        # pointer to the flags invalid.
2832238dcc3SJonas Devlieghere        self.setup_register_test(
2842238dcc3SJonas Devlieghere            """\
285e07a421dSDavid Spickett          <flags id="cpsr_flags" size="4">
286e07a421dSDavid Spickett            <field name="correct" start="0" end="0"/>
287e07a421dSDavid Spickett          </flags>
288e07a421dSDavid Spickett          <flags id="cpsr_flags" size="4">
289e07a421dSDavid Spickett            <field name="incorrect" start="0" end="0"/>
290e07a421dSDavid Spickett          </flags>
291e07a421dSDavid Spickett          <reg name="pc" bitsize="64"/>
2922238dcc3SJonas Devlieghere          <reg name="cpsr" regnum="33" bitsize="32" type="cpsr_flags"/>"""
2932238dcc3SJonas Devlieghere        )
294e07a421dSDavid Spickett
295e07a421dSDavid Spickett        self.expect("register read cpsr", substrs=["(correct = 1)"])
296e07a421dSDavid Spickett
297e07a421dSDavid Spickett    @skipIfXmlSupportMissing
298e07a421dSDavid Spickett    @skipIfRemote
299e07a421dSDavid Spickett    def test_missing_flags(self):
3002238dcc3SJonas Devlieghere        self.setup_register_test(
3012238dcc3SJonas Devlieghere            """\
302e07a421dSDavid Spickett          <reg name="pc" bitsize="64"/>
3032238dcc3SJonas Devlieghere          <reg name="cpsr" regnum="33" bitsize="32" type="cpsr_flags"/>"""
3042238dcc3SJonas Devlieghere        )
305e07a421dSDavid Spickett
306e07a421dSDavid Spickett        # Register prints with default formatting only if we can't find the
307e07a421dSDavid Spickett        # flags type.
308e07a421dSDavid Spickett        self.expect("register read cpsr", substrs=["cpsr = 0xeeee7777"])
309e07a421dSDavid Spickett        self.expect("register read cpsr", substrs=["("], matching=False)
310e07a421dSDavid Spickett
311e07a421dSDavid Spickett    @skipIfXmlSupportMissing
312e07a421dSDavid Spickett    @skipIfRemote
313e07a421dSDavid Spickett    def test_flags_invalid_size(self):
314e07a421dSDavid Spickett        # We're not using the size for anything yet so just check that we handle
315e07a421dSDavid Spickett        # it not being a positive integer.
3162238dcc3SJonas Devlieghere        self.setup_register_test(
3172238dcc3SJonas Devlieghere            """\
318e07a421dSDavid Spickett          <flags id="cpsr_flags" size="???">
319e07a421dSDavid Spickett            <field name="A" start="0" end="0"/>
320e07a421dSDavid Spickett          </flags>
321e07a421dSDavid Spickett          <flags id="cpsr_flags" size="-1">
322e07a421dSDavid Spickett            <field name="B" start="0" end="0"/>
323e07a421dSDavid Spickett          </flags>
324e07a421dSDavid Spickett          <flags id="cpsr_flags" size="4">
325e07a421dSDavid Spickett            <field name="C" start="0" end="0"/>
326e07a421dSDavid Spickett          </flags>
327e07a421dSDavid Spickett          <reg name="pc" bitsize="64"/>
3282238dcc3SJonas Devlieghere          <reg name="cpsr" regnum="33" bitsize="32" type="cpsr_flags"/>"""
3292238dcc3SJonas Devlieghere        )
330e07a421dSDavid Spickett
331e07a421dSDavid Spickett        # Only the final set has a valid size, use that.
332e07a421dSDavid Spickett        self.expect("register read cpsr", substrs=["(C = 1)"])
333e07a421dSDavid Spickett
334e07a421dSDavid Spickett    @skipIfXmlSupportMissing
335e07a421dSDavid Spickett    @skipIfRemote
336e07a421dSDavid Spickett    def test_flags_unknown_attribute(self):
337e07a421dSDavid Spickett        # Unknown attributes on flags or field are ignored.
3382238dcc3SJonas Devlieghere        self.setup_register_test(
3392238dcc3SJonas Devlieghere            """\
340e07a421dSDavid Spickett          <flags id="cpsr_flags" size="4" stuff="abcd">
341e07a421dSDavid Spickett            <field name="A" start="0" abcd="???" end="0"/>
342e07a421dSDavid Spickett          </flags>
343e07a421dSDavid Spickett          <reg name="pc" bitsize="64"/>
3442238dcc3SJonas Devlieghere          <reg name="cpsr" regnum="33" bitsize="32" type="cpsr_flags"/>"""
3452238dcc3SJonas Devlieghere        )
346e07a421dSDavid Spickett
347e07a421dSDavid Spickett        self.expect("register read cpsr", substrs=["(A = 1)"])
348e07a421dSDavid Spickett
349e07a421dSDavid Spickett    @skipIfXmlSupportMissing
350e07a421dSDavid Spickett    @skipIfRemote
351aa278487SEymen Ünay    def test_flags_required_attributes(self):
352e07a421dSDavid Spickett        # flags must have an id and size so the flags with "C" is the only valid one
353e07a421dSDavid Spickett        # here.
3542238dcc3SJonas Devlieghere        self.setup_register_test(
3552238dcc3SJonas Devlieghere            """\
356e07a421dSDavid Spickett          <flags size="4">
357e07a421dSDavid Spickett            <field name="A" start="0" end="0"/>
358e07a421dSDavid Spickett          </flags>
359e07a421dSDavid Spickett          <flags id="cpsr_flags">
360e07a421dSDavid Spickett            <field name="B" start="0" end="0"/>
361e07a421dSDavid Spickett          </flags>
362e07a421dSDavid Spickett          <flags id="cpsr_flags" size="4">
363e07a421dSDavid Spickett            <field name="C" start="0" end="0"/>
364e07a421dSDavid Spickett          </flags>
365e07a421dSDavid Spickett          <reg name="pc" bitsize="64"/>
3662238dcc3SJonas Devlieghere          <reg name="cpsr" regnum="33" bitsize="32" type="cpsr_flags"/>"""
3672238dcc3SJonas Devlieghere        )
368e07a421dSDavid Spickett
369e07a421dSDavid Spickett        self.expect("register read cpsr", substrs=["(C = 1)"])
370e07a421dSDavid Spickett
371e07a421dSDavid Spickett    @skipIfXmlSupportMissing
372e07a421dSDavid Spickett    @skipIfRemote
373dbc34e2bSDavid Spickett    def test_flags_register_size_mismatch(self):
374dbc34e2bSDavid Spickett        # If the size of the flag set found does not match the size of the
375dbc34e2bSDavid Spickett        # register, we discard the flags.
3762238dcc3SJonas Devlieghere        self.setup_register_test(
3772238dcc3SJonas Devlieghere            """\
378dbc34e2bSDavid Spickett          <flags id="cpsr_flags" size="8">
379dbc34e2bSDavid Spickett            <field name="C" start="0" end="0"/>
380dbc34e2bSDavid Spickett          </flags>
381dbc34e2bSDavid Spickett          <reg name="pc" bitsize="64"/>
3822238dcc3SJonas Devlieghere          <reg name="cpsr" regnum="33" bitsize="32" type="cpsr_flags"/>"""
3832238dcc3SJonas Devlieghere        )
384dbc34e2bSDavid Spickett
385dbc34e2bSDavid Spickett        self.expect("register read cpsr", substrs=["(C = 1)"], matching=False)
386dbc34e2bSDavid Spickett
387dbc34e2bSDavid Spickett    @skipIfXmlSupportMissing
388dbc34e2bSDavid Spickett    @skipIfRemote
389e07a421dSDavid Spickett    def test_flags_set_even_if_format_set(self):
390e07a421dSDavid Spickett        # lldb also sends "format". If that is set, we should still read the
391e07a421dSDavid Spickett        # flags type.
3922238dcc3SJonas Devlieghere        self.setup_register_test(
3932238dcc3SJonas Devlieghere            """\
394e07a421dSDavid Spickett          <flags id="cpsr_flags" size="4">
395e07a421dSDavid Spickett            <field name="B" start="0" end="0"/>
396e07a421dSDavid Spickett          </flags>
397e07a421dSDavid Spickett          <reg name="pc" bitsize="64"/>
398e07a421dSDavid Spickett          <reg name="cpsr" regnum="33" bitsize="32" type="cpsr_flags"
3992238dcc3SJonas Devlieghere            format="example"/>"""
4002238dcc3SJonas Devlieghere        )
401e07a421dSDavid Spickett
402e07a421dSDavid Spickett        self.expect("register read cpsr", substrs=["(B = 1)"])
403e07a421dSDavid Spickett
404e07a421dSDavid Spickett    @skipIfXmlSupportMissing
405e07a421dSDavid Spickett    @skipIfRemote
406e07a421dSDavid Spickett    def test_flags_set_even_if_encoding_set(self):
407e07a421dSDavid Spickett        # lldb also sends "encoding". If that is set, we should still read the
408e07a421dSDavid Spickett        # flags type.
4092238dcc3SJonas Devlieghere        self.setup_register_test(
4102238dcc3SJonas Devlieghere            """\
411e07a421dSDavid Spickett          <flags id="cpsr_flags" size="4">
412e07a421dSDavid Spickett            <field name="B" start="0" end="0"/>
413e07a421dSDavid Spickett          </flags>
414e07a421dSDavid Spickett          <reg name="pc" bitsize="64"/>
415e07a421dSDavid Spickett          <reg name="cpsr" regnum="33" bitsize="32" type="cpsr_flags"
4162238dcc3SJonas Devlieghere            encoding="example"/>"""
4172238dcc3SJonas Devlieghere        )
418e07a421dSDavid Spickett
419e07a421dSDavid Spickett        self.expect("register read cpsr", substrs=["(B = 1)"])
420e07a421dSDavid Spickett
421e07a421dSDavid Spickett    @skipIfXmlSupportMissing
422e07a421dSDavid Spickett    @skipIfRemote
423e07a421dSDavid Spickett    def test_flags_set_even_if_encoding_and_format_set(self):
424e07a421dSDavid Spickett        # As above but both encoding and format are set.
4252238dcc3SJonas Devlieghere        self.setup_register_test(
4262238dcc3SJonas Devlieghere            """\
427e07a421dSDavid Spickett          <flags id="cpsr_flags" size="4">
428e07a421dSDavid Spickett            <field name="B" start="0" end="0"/>
429e07a421dSDavid Spickett          </flags>
430e07a421dSDavid Spickett          <reg name="pc" bitsize="64"/>
431e07a421dSDavid Spickett          <reg name="cpsr" regnum="33" bitsize="32" type="cpsr_flags"
4322238dcc3SJonas Devlieghere            encoding="example" format="example"/>"""
4332238dcc3SJonas Devlieghere        )
434e07a421dSDavid Spickett
435e07a421dSDavid Spickett        self.expect("register read cpsr", substrs=["(B = 1)"])
436e07a421dSDavid Spickett
437e07a421dSDavid Spickett    @skipIfXmlSupportMissing
438e07a421dSDavid Spickett    @skipIfRemote
439e07a421dSDavid Spickett    def test_flags_multiple_lines(self):
440e07a421dSDavid Spickett        # Since we use C types they follow lldb's usual decisions as to whether
441e07a421dSDavid Spickett        # to print them on one line or many. Long field names will usually mean
442e07a421dSDavid Spickett        # many lines.
443e07a421dSDavid Spickett        self.setup_flags_test(
444e07a421dSDavid Spickett            '<field name="this_is_a_long_field_0" start="0" end="0"/>'
445e07a421dSDavid Spickett            '<field name="this_is_a_long_field_1" start="1" end="1"/>'
446e07a421dSDavid Spickett            '<field name="this_is_a_long_field_2" start="2" end="2"/>'
4472238dcc3SJonas Devlieghere            '<field name="this_is_a_long_field_3" start="3" end="3"/>'
4482238dcc3SJonas Devlieghere        )
449e07a421dSDavid Spickett
4502238dcc3SJonas Devlieghere        self.expect(
4512238dcc3SJonas Devlieghere            "register read cpsr",
4522238dcc3SJonas Devlieghere            substrs=[
453e07a421dSDavid Spickett                "    cpsr = 0xeeee7777\n"
454e07a421dSDavid Spickett                "         = {\n"
455e07a421dSDavid Spickett                "             this_is_a_long_field_3 = 0\n"
456e07a421dSDavid Spickett                "             this_is_a_long_field_2 = 1\n"
457e07a421dSDavid Spickett                "             this_is_a_long_field_1 = 1\n"
458e07a421dSDavid Spickett                "             this_is_a_long_field_0 = 1\n"
4592238dcc3SJonas Devlieghere                "           }"
4602238dcc3SJonas Devlieghere            ],
4612238dcc3SJonas Devlieghere        )
462e07a421dSDavid Spickett
463e07a421dSDavid Spickett    @skipIfXmlSupportMissing
464e07a421dSDavid Spickett    @skipIfRemote
465e07a421dSDavid Spickett    def test_flags_child_limit(self):
466e07a421dSDavid Spickett        # Flags print like C types so they should follow the child limit setting.
467e07a421dSDavid Spickett        self.runCmd("settings set target.max-children-count 3")
468e07a421dSDavid Spickett        self.setup_flags_test(
469e07a421dSDavid Spickett            '<field name="field_0" start="0" end="0"/>'
470e07a421dSDavid Spickett            '<field name="field_1" start="1" end="1"/>'
4712238dcc3SJonas Devlieghere            '<field name="field_2" start="2" end="2"/>'
4722238dcc3SJonas Devlieghere        )
473e07a421dSDavid Spickett
474e07a421dSDavid Spickett        self.expect("register read cpsr", substrs=["= (field_2 = 1, field_1 = 1, ...)"])
475e07a421dSDavid Spickett
476e07a421dSDavid Spickett    @skipIfXmlSupportMissing
477e07a421dSDavid Spickett    @skipIfRemote
478c9083beaSDavid Spickett    def test_format_disables_flags(self):
479c9083beaSDavid Spickett        # If asked for a specific format, don't print flags after it.
480c9083beaSDavid Spickett        self.setup_flags_test('<field name="field_0" start="0" end="0"/>')
481c9083beaSDavid Spickett
482c9083beaSDavid Spickett        self.expect("register read cpsr --format X", substrs=["cpsr = 0xEEEE7777"])
4832238dcc3SJonas Devlieghere        self.expect(
4842238dcc3SJonas Devlieghere            "register read cpsr --format X", substrs=["field_0"], matching=False
4852238dcc3SJonas Devlieghere        )
486c9083beaSDavid Spickett
487c9083beaSDavid Spickett    @skipIfXmlSupportMissing
488c9083beaSDavid Spickett    @skipIfRemote
489e07a421dSDavid Spickett    def test_xml_includes(self):
490e07a421dSDavid Spickett        # Certain targets e.g. s390x QEMU split their defintions over multiple
491e07a421dSDavid Spickett        # files that are included into target.xml.
4922238dcc3SJonas Devlieghere        self.setup_multidoc_test(
4932238dcc3SJonas Devlieghere            {
494e07a421dSDavid Spickett                # The formatting is very specific here. lldb doesn't like leading
495e07a421dSDavid Spickett                # spaces, and nested tags must be indented more than their parent.
4962238dcc3SJonas Devlieghere                "target.xml": dedent(
4972238dcc3SJonas Devlieghere                    """\
498e07a421dSDavid Spickett               <?xml version="1.0"?>
499e07a421dSDavid Spickett               <target version="1.0">
500e07a421dSDavid Spickett                 <architecture>aarch64</architecture>
501e07a421dSDavid Spickett                 <xi:include href="core.xml"/>
5022238dcc3SJonas Devlieghere               </target>"""
5032238dcc3SJonas Devlieghere                ),
5042238dcc3SJonas Devlieghere                "core.xml": dedent(
5052238dcc3SJonas Devlieghere                    """\
506e07a421dSDavid Spickett                <?xml version="1.0"?>
507e07a421dSDavid Spickett                <feature name="org.gnu.gdb.aarch64.core">
508e07a421dSDavid Spickett                  <flags id="cpsr_flags" size="4">
509e07a421dSDavid Spickett                    <field name="B" start="0" end="0"/>
510e07a421dSDavid Spickett                  </flags>
511e07a421dSDavid Spickett                  <reg name="pc" bitsize="64"/>
512e07a421dSDavid Spickett                  <reg name="x0" regnum="0" bitsize="64" type="x0_flags"/>
513e07a421dSDavid Spickett                  <reg name="cpsr" regnum="33" bitsize="32" type="cpsr_flags"/>
514e07a421dSDavid Spickett                </feature>
5152238dcc3SJonas Devlieghere            """
5162238dcc3SJonas Devlieghere                ),
5172238dcc3SJonas Devlieghere            }
5182238dcc3SJonas Devlieghere        )
519e07a421dSDavid Spickett
520e07a421dSDavid Spickett        self.expect("register read cpsr", substrs=["(B = 1)"])
521e07a421dSDavid Spickett
522e07a421dSDavid Spickett    @skipIfXmlSupportMissing
523e07a421dSDavid Spickett    @skipIfRemote
524e07a421dSDavid Spickett    def test_xml_includes_multiple(self):
5252238dcc3SJonas Devlieghere        self.setup_multidoc_test(
5262238dcc3SJonas Devlieghere            {
5272238dcc3SJonas Devlieghere                "target.xml": dedent(
5282238dcc3SJonas Devlieghere                    """\
529e07a421dSDavid Spickett               <?xml version="1.0"?>
530e07a421dSDavid Spickett               <target version="1.0">
531e07a421dSDavid Spickett                 <architecture>aarch64</architecture>
532e07a421dSDavid Spickett                 <xi:include href="core.xml"/>
533e07a421dSDavid Spickett                 <xi:include href="core-2.xml"/>
5342238dcc3SJonas Devlieghere               </target>"""
5352238dcc3SJonas Devlieghere                ),
5362238dcc3SJonas Devlieghere                "core.xml": dedent(
5372238dcc3SJonas Devlieghere                    """\
538e07a421dSDavid Spickett                <?xml version="1.0"?>
539e07a421dSDavid Spickett                <feature name="org.gnu.gdb.aarch64.core">
540dbc34e2bSDavid Spickett                  <flags id="x0_flags" size="8">
541e07a421dSDavid Spickett                    <field name="B" start="0" end="0"/>
542e07a421dSDavid Spickett                  </flags>
543e07a421dSDavid Spickett                  <reg name="pc" bitsize="64"/>
544e07a421dSDavid Spickett                  <reg name="x0" regnum="0" bitsize="64" type="x0_flags"/>
5452238dcc3SJonas Devlieghere                </feature>"""
5462238dcc3SJonas Devlieghere                ),
5472238dcc3SJonas Devlieghere                "core-2.xml": dedent(
5482238dcc3SJonas Devlieghere                    """\
549e07a421dSDavid Spickett                <?xml version="1.0"?>
550e07a421dSDavid Spickett                <feature name="org.gnu.gdb.aarch64.core">
551e07a421dSDavid Spickett                  <flags id="cpsr_flags" size="4">
552e07a421dSDavid Spickett                    <field name="C" start="0" end="0"/>
553e07a421dSDavid Spickett                  </flags>
554e07a421dSDavid Spickett                  <reg name="cpsr" regnum="33" bitsize="32" type="cpsr_flags"/>
555e07a421dSDavid Spickett                </feature>
5562238dcc3SJonas Devlieghere            """
5572238dcc3SJonas Devlieghere                ),
5582238dcc3SJonas Devlieghere            }
5592238dcc3SJonas Devlieghere        )
560e07a421dSDavid Spickett
561e07a421dSDavid Spickett        self.expect("register read x0 cpsr", substrs=["(B = 1)", "(C = 1)"])
562e07a421dSDavid Spickett
563e07a421dSDavid Spickett    @skipIfXmlSupportMissing
564e07a421dSDavid Spickett    @skipIfRemote
565e07a421dSDavid Spickett    def test_xml_includes_flags_redefined(self):
5662238dcc3SJonas Devlieghere        self.setup_multidoc_test(
5672238dcc3SJonas Devlieghere            {
5682238dcc3SJonas Devlieghere                "target.xml": dedent(
5692238dcc3SJonas Devlieghere                    """\
570e07a421dSDavid Spickett               <?xml version="1.0"?>
571e07a421dSDavid Spickett               <target version="1.0">
572e07a421dSDavid Spickett                 <architecture>aarch64</architecture>
573e07a421dSDavid Spickett                 <xi:include href="core.xml"/>
574e07a421dSDavid Spickett                 <xi:include href="core-2.xml"/>
5752238dcc3SJonas Devlieghere               </target>"""
5762238dcc3SJonas Devlieghere                ),
577e07a421dSDavid Spickett                # Treating xi:include as a textual include, my_flags is first defined
578e07a421dSDavid Spickett                # in core.xml. The second definition in core-2.xml
579e07a421dSDavid Spickett                # is ignored.
5802238dcc3SJonas Devlieghere                "core.xml": dedent(
5812238dcc3SJonas Devlieghere                    """\
582e07a421dSDavid Spickett                <?xml version="1.0"?>
583e07a421dSDavid Spickett                <feature name="org.gnu.gdb.aarch64.core">
584dbc34e2bSDavid Spickett                  <flags id="my_flags" size="8">
585e07a421dSDavid Spickett                    <field name="correct" start="0" end="0"/>
586e07a421dSDavid Spickett                  </flags>
587e07a421dSDavid Spickett                  <reg name="pc" bitsize="64"/>
588e07a421dSDavid Spickett                  <reg name="x0" regnum="0" bitsize="64" type="my_flags"/>
5892238dcc3SJonas Devlieghere                </feature>"""
5902238dcc3SJonas Devlieghere                ),
591dbc34e2bSDavid Spickett                # The my_flags here is ignored, so x1 will use the my_flags from above.
5922238dcc3SJonas Devlieghere                "core-2.xml": dedent(
5932238dcc3SJonas Devlieghere                    """\
594e07a421dSDavid Spickett                <?xml version="1.0"?>
595e07a421dSDavid Spickett                <feature name="org.gnu.gdb.aarch64.core">
596dbc34e2bSDavid Spickett                  <flags id="my_flags" size="8">
597e07a421dSDavid Spickett                    <field name="incorrect" start="0" end="0"/>
598e07a421dSDavid Spickett                  </flags>
599dbc34e2bSDavid Spickett                  <reg name="x1" regnum="33" bitsize="64" type="my_flags"/>
600e07a421dSDavid Spickett                </feature>
6012238dcc3SJonas Devlieghere            """
6022238dcc3SJonas Devlieghere                ),
6032238dcc3SJonas Devlieghere            }
6042238dcc3SJonas Devlieghere        )
605e07a421dSDavid Spickett
606e07a421dSDavid Spickett        self.expect("register read x0", substrs=["(correct = 1)"])
607dbc34e2bSDavid Spickett        self.expect("register read x1", substrs=["(correct = 1)"])
608bcfe5a52SDavid Spickett
609bcfe5a52SDavid Spickett    @skipIfXmlSupportMissing
610bcfe5a52SDavid Spickett    @skipIfRemote
611bcfe5a52SDavid Spickett    def test_flags_in_register_info(self):
612bcfe5a52SDavid Spickett        # See RegisterFlags for comprehensive formatting tests.
613bcfe5a52SDavid Spickett        self.setup_flags_test(
614bcfe5a52SDavid Spickett            '<field name="D" start="0" end="7"/>'
615bcfe5a52SDavid Spickett            '<field name="C" start="8" end="15"/>'
616bcfe5a52SDavid Spickett            '<field name="B" start="16" end="23"/>'
617bcfe5a52SDavid Spickett            '<field name="A" start="24" end="31"/>'
618bcfe5a52SDavid Spickett        )
619bcfe5a52SDavid Spickett
620bcfe5a52SDavid Spickett        # The table should split according to terminal width.
621bcfe5a52SDavid Spickett        self.runCmd("settings set term-width 17")
622bcfe5a52SDavid Spickett
623ecbe78c1SJonas Devlieghere        self.expect(
624ecbe78c1SJonas Devlieghere            "register info cpsr",
625bcfe5a52SDavid Spickett            substrs=[
626bcfe5a52SDavid Spickett                "       Name: cpsr\n"
627bcfe5a52SDavid Spickett                "       Size: 4 bytes (32 bits)\n"
628bcfe5a52SDavid Spickett                "    In sets: general (index 0)\n"
629bcfe5a52SDavid Spickett                "\n"
630bcfe5a52SDavid Spickett                "| 31-24 | 23-16 |\n"
631bcfe5a52SDavid Spickett                "|-------|-------|\n"
632bcfe5a52SDavid Spickett                "|   A   |   B   |\n"
633bcfe5a52SDavid Spickett                "\n"
634bcfe5a52SDavid Spickett                "| 15-8 | 7-0 |\n"
635bcfe5a52SDavid Spickett                "|------|-----|\n"
636ecbe78c1SJonas Devlieghere                "|  C   |  D  |"
637ecbe78c1SJonas Devlieghere            ],
638ecbe78c1SJonas Devlieghere        )
6392325b3cfSDavid Spickett
6402325b3cfSDavid Spickett    @skipIfXmlSupportMissing
6412325b3cfSDavid Spickett    @skipIfRemote
6422325b3cfSDavid Spickett    def test_flags_name_xml_reserved_characters(self):
6432325b3cfSDavid Spickett        """Check that lldb converts reserved character replacements like &amp;
6442325b3cfSDavid Spickett        when found in field names."""
6452325b3cfSDavid Spickett        self.setup_flags_test(
6462325b3cfSDavid Spickett            '<field name="E&amp;" start="0" end="0"/>'
6472325b3cfSDavid Spickett            '<field name="D&quot;" start="1" end="1"/>'
6482325b3cfSDavid Spickett            '<field name="C&apos;" start="2" end="2"/>'
6492325b3cfSDavid Spickett            '<field name="B&gt;" start="3" end="3"/>'
6502325b3cfSDavid Spickett            '<field name="A&lt;" start="4" end="4"/>'
6512325b3cfSDavid Spickett        )
6522325b3cfSDavid Spickett
6532325b3cfSDavid Spickett        self.expect(
6542325b3cfSDavid Spickett            "register info cpsr",
6552325b3cfSDavid Spickett            substrs=["| A< | B> | C' | D\" | E& |"],
6562325b3cfSDavid Spickett        )
657*208a08c3SDavid Spickett
658*208a08c3SDavid Spickett    @skipIfXmlSupportMissing
659*208a08c3SDavid Spickett    @skipIfRemote
660*208a08c3SDavid Spickett    def test_no_enum(self):
661*208a08c3SDavid Spickett        """Check that lldb does not try to print an enum when there isn't one."""
662*208a08c3SDavid Spickett
663*208a08c3SDavid Spickett        self.setup_flags_test('<field name="E" start="0" end="0">' "</field>")
664*208a08c3SDavid Spickett
665*208a08c3SDavid Spickett        self.expect("register info cpsr", patterns=["E:.*$"], matching=False)
666*208a08c3SDavid Spickett
667*208a08c3SDavid Spickett    @skipIfXmlSupportMissing
668*208a08c3SDavid Spickett    @skipIfRemote
669*208a08c3SDavid Spickett    def test_enum_type_not_found(self):
670*208a08c3SDavid Spickett        """Check that lldb uses the default format if we don't find the enum type."""
671*208a08c3SDavid Spickett        self.setup_register_test(
672*208a08c3SDavid Spickett            """\
673*208a08c3SDavid Spickett          <flags id="cpsr_flags" size="4">
674*208a08c3SDavid Spickett            <field name="E" start="0" end="0" type="some_enum"/>
675*208a08c3SDavid Spickett          </flags>
676*208a08c3SDavid Spickett          <reg name="pc" bitsize="64"/>
677*208a08c3SDavid Spickett          <reg name="x0" regnum="0" bitsize="64"/>
678*208a08c3SDavid Spickett          <reg name="cpsr" regnum="33" bitsize="32" type="cpsr_flags"/>"""
679*208a08c3SDavid Spickett        )
680*208a08c3SDavid Spickett
681*208a08c3SDavid Spickett        self.expect("register read cpsr", patterns=["\(E = 1\)$"])
682*208a08c3SDavid Spickett
683*208a08c3SDavid Spickett    @skipIfXmlSupportMissing
684*208a08c3SDavid Spickett    @skipIfRemote
685*208a08c3SDavid Spickett    def test_enum_duplicated_evalue(self):
686*208a08c3SDavid Spickett        """Check that lldb only uses the last instance of a evalue for each
687*208a08c3SDavid Spickett        value."""
688*208a08c3SDavid Spickett        self.setup_register_test(
689*208a08c3SDavid Spickett            """\
690*208a08c3SDavid Spickett          <enum id="some_enum" size="4">
691*208a08c3SDavid Spickett            <evalue name="abc" value="1"/>
692*208a08c3SDavid Spickett            <evalue name="def" value="1"/>
693*208a08c3SDavid Spickett            <evalue name="geh" value="2"/>
694*208a08c3SDavid Spickett          </enum>
695*208a08c3SDavid Spickett          <flags id="cpsr_flags" size="4">
696*208a08c3SDavid Spickett            <field name="E" start="0" end="1" type="some_enum"/>
697*208a08c3SDavid Spickett          </flags>
698*208a08c3SDavid Spickett          <reg name="pc" bitsize="64"/>
699*208a08c3SDavid Spickett          <reg name="x0" regnum="0" bitsize="64"/>
700*208a08c3SDavid Spickett          <reg name="cpsr" regnum="33" bitsize="32" type="cpsr_flags"/>"""
701*208a08c3SDavid Spickett        )
702*208a08c3SDavid Spickett
703*208a08c3SDavid Spickett        self.expect("register info cpsr", patterns=["E: 1 = def, 2 = geh$"])
704*208a08c3SDavid Spickett        self.expect("register read cpsr", patterns=["\(E = def \| geh\)$"])
705*208a08c3SDavid Spickett
706*208a08c3SDavid Spickett    @skipIfXmlSupportMissing
707*208a08c3SDavid Spickett    @skipIfRemote
708*208a08c3SDavid Spickett    def test_enum_duplicated(self):
709*208a08c3SDavid Spickett        """Check that lldb only uses the last instance of enums with the same
710*208a08c3SDavid Spickett        id."""
711*208a08c3SDavid Spickett        self.setup_register_test(
712*208a08c3SDavid Spickett            """\
713*208a08c3SDavid Spickett          <enum id="some_enum" size="4">
714*208a08c3SDavid Spickett            <evalue name="abc" value="1"/>
715*208a08c3SDavid Spickett          </enum>
716*208a08c3SDavid Spickett          <enum id="some_enum" size="4">
717*208a08c3SDavid Spickett            <evalue name="def" value="1"/>
718*208a08c3SDavid Spickett          </enum>
719*208a08c3SDavid Spickett          <flags id="cpsr_flags" size="4">
720*208a08c3SDavid Spickett            <field name="E" start="0" end="0" type="some_enum"/>
721*208a08c3SDavid Spickett          </flags>
722*208a08c3SDavid Spickett          <reg name="pc" bitsize="64"/>
723*208a08c3SDavid Spickett          <reg name="x0" regnum="0" bitsize="64"/>
724*208a08c3SDavid Spickett          <reg name="cpsr" regnum="33" bitsize="32" type="cpsr_flags"/>"""
725*208a08c3SDavid Spickett        )
726*208a08c3SDavid Spickett
727*208a08c3SDavid Spickett        self.expect("register info cpsr", patterns=["E: 1 = def$"])
728*208a08c3SDavid Spickett        self.expect("register read cpsr", patterns=["\(E = def\)$"])
729*208a08c3SDavid Spickett
730*208a08c3SDavid Spickett    @skipIfXmlSupportMissing
731*208a08c3SDavid Spickett    @skipIfRemote
732*208a08c3SDavid Spickett    def test_enum_use_first_valid(self):
733*208a08c3SDavid Spickett        """Check that lldb uses the first enum that parses correctly and ignores
734*208a08c3SDavid Spickett        the rest."""
735*208a08c3SDavid Spickett        self.setup_register_test(
736*208a08c3SDavid Spickett            """\
737*208a08c3SDavid Spickett          <enum id="some_enum" size="4"/>
738*208a08c3SDavid Spickett          <enum size="4">
739*208a08c3SDavid Spickett            <evalue name="invalid" value="1"/>
740*208a08c3SDavid Spickett          </enum>
741*208a08c3SDavid Spickett          <enum id="some_enum" size="4">
742*208a08c3SDavid Spickett            <evalue name="valid" value="1"/>
743*208a08c3SDavid Spickett          </enum>
744*208a08c3SDavid Spickett          <enum id="another_enum" size="4">
745*208a08c3SDavid Spickett            <evalue name="invalid" value="1"/>
746*208a08c3SDavid Spickett          </enum>
747*208a08c3SDavid Spickett          <flags id="cpsr_flags" size="4">
748*208a08c3SDavid Spickett            <field name="E" start="0" end="0" type="some_enum"/>
749*208a08c3SDavid Spickett          </flags>
750*208a08c3SDavid Spickett          <reg name="pc" bitsize="64"/>
751*208a08c3SDavid Spickett          <reg name="x0" regnum="0" bitsize="64"/>
752*208a08c3SDavid Spickett          <reg name="cpsr" regnum="33" bitsize="32" type="cpsr_flags"/>"""
753*208a08c3SDavid Spickett        )
754*208a08c3SDavid Spickett
755*208a08c3SDavid Spickett        self.expect("register info cpsr", patterns=["E: 1 = valid$"])
756*208a08c3SDavid Spickett
757*208a08c3SDavid Spickett    @skipIfXmlSupportMissing
758*208a08c3SDavid Spickett    @skipIfRemote
759*208a08c3SDavid Spickett    def test_evalue_empty_name(self):
760*208a08c3SDavid Spickett        """Check that lldb ignores evalues with an empty name."""
761*208a08c3SDavid Spickett
762*208a08c3SDavid Spickett        # The only potential use case for empty names is to shadow an evalue
763*208a08c3SDavid Spickett        # declared later so that it's name is hidden should the debugger only
764*208a08c3SDavid Spickett        # pick one of them. This behaviour would be debugger specific so the protocol
765*208a08c3SDavid Spickett        # would probably not care or leave it up to us, and I think it's not a
766*208a08c3SDavid Spickett        # useful thing to allow.
767*208a08c3SDavid Spickett
768*208a08c3SDavid Spickett        self.setup_register_test(
769*208a08c3SDavid Spickett            """\
770*208a08c3SDavid Spickett          <enum id="some_enum" size="4">
771*208a08c3SDavid Spickett            <evalue name="" value="1"/>
772*208a08c3SDavid Spickett            <evalue name="valid" value="2"/>
773*208a08c3SDavid Spickett          </enum>
774*208a08c3SDavid Spickett          <flags id="cpsr_flags" size="4">
775*208a08c3SDavid Spickett            <field name="E" start="0" end="1" type="some_enum"/>
776*208a08c3SDavid Spickett          </flags>
777*208a08c3SDavid Spickett          <reg name="pc" bitsize="64"/>
778*208a08c3SDavid Spickett          <reg name="x0" regnum="0" bitsize="64"/>
779*208a08c3SDavid Spickett          <reg name="cpsr" regnum="33" bitsize="32" type="cpsr_flags"/>"""
780*208a08c3SDavid Spickett        )
781*208a08c3SDavid Spickett
782*208a08c3SDavid Spickett        self.expect("register info cpsr", patterns=["E: 2 = valid$"])
783*208a08c3SDavid Spickett
784*208a08c3SDavid Spickett    @skipIfXmlSupportMissing
785*208a08c3SDavid Spickett    @skipIfRemote
786*208a08c3SDavid Spickett    def test_evalue_invalid_value(self):
787*208a08c3SDavid Spickett        """Check that lldb ignores evalues with an invalid value."""
788*208a08c3SDavid Spickett        self.setup_register_test(
789*208a08c3SDavid Spickett            """\
790*208a08c3SDavid Spickett          <enum id="some_enum" size="4">
791*208a08c3SDavid Spickett            <evalue name="negative_dec" value="-1"/>
792*208a08c3SDavid Spickett            <evalue name="negative_hex" value="-0x1"/>
793*208a08c3SDavid Spickett            <evalue name="negative_bin" value="-0b1"/>
794*208a08c3SDavid Spickett            <evalue name="negative_float" value="-0.5"/>
795*208a08c3SDavid Spickett            <evalue name="nan" value="aardvark"/>
796*208a08c3SDavid Spickett            <evalue name="dec" value="1"/>
797*208a08c3SDavid Spickett            <evalue name="hex" value="0x2"/>
798*208a08c3SDavid Spickett            <evalue name="octal" value="03"/>
799*208a08c3SDavid Spickett            <evalue name="float" value="0.5"/>
800*208a08c3SDavid Spickett            <evalue name="bin" value="0b100"/>
801*208a08c3SDavid Spickett          </enum>
802*208a08c3SDavid Spickett          <flags id="cpsr_flags" size="4">
803*208a08c3SDavid Spickett            <field name="E" start="0" end="2" type="some_enum"/>
804*208a08c3SDavid Spickett          </flags>
805*208a08c3SDavid Spickett          <reg name="pc" bitsize="64"/>
806*208a08c3SDavid Spickett          <reg name="x0" regnum="0" bitsize="64"/>
807*208a08c3SDavid Spickett          <reg name="cpsr" regnum="33" bitsize="32" type="cpsr_flags"/>"""
808*208a08c3SDavid Spickett        )
809*208a08c3SDavid Spickett
810*208a08c3SDavid Spickett        self.expect(
811*208a08c3SDavid Spickett            "register info cpsr", patterns=["E: 1 = dec, 2 = hex, 3 = octal, 4 = bin$"]
812*208a08c3SDavid Spickett        )
813*208a08c3SDavid Spickett
814*208a08c3SDavid Spickett    @skipIfXmlSupportMissing
815*208a08c3SDavid Spickett    @skipIfRemote
816*208a08c3SDavid Spickett    def test_evalue_out_of_range(self):
817*208a08c3SDavid Spickett        """Check that lldb will not use an enum type if one of its evalues
818*208a08c3SDavid Spickett        exceeds the size of the field it is applied to."""
819*208a08c3SDavid Spickett        self.setup_register_test(
820*208a08c3SDavid Spickett            """\
821*208a08c3SDavid Spickett          <enum id="some_enum" size="4">
822*208a08c3SDavid Spickett            <evalue name="A" value="0"/>
823*208a08c3SDavid Spickett            <evalue name="B" value="2"/>
824*208a08c3SDavid Spickett          </enum>
825*208a08c3SDavid Spickett          <flags id="cpsr_flags" size="4">
826*208a08c3SDavid Spickett            <field name="E" start="0" end="0" type="some_enum"/>
827*208a08c3SDavid Spickett          </flags>
828*208a08c3SDavid Spickett          <reg name="pc" bitsize="64"/>
829*208a08c3SDavid Spickett          <reg name="x0" regnum="0" bitsize="64"/>
830*208a08c3SDavid Spickett          <reg name="cpsr" regnum="33" bitsize="32" type="cpsr_flags"/>"""
831*208a08c3SDavid Spickett        )
832*208a08c3SDavid Spickett
833*208a08c3SDavid Spickett        # The whole eunm is rejected even if just 1 value is out of range.
834*208a08c3SDavid Spickett        self.expect("register info cpsr", patterns=["E: 0 = "], matching=False)
835*208a08c3SDavid Spickett
836*208a08c3SDavid Spickett    @skipIfXmlSupportMissing
837*208a08c3SDavid Spickett    @skipIfRemote
838*208a08c3SDavid Spickett    def test_enum_ignore_unknown_attributes(self):
839*208a08c3SDavid Spickett        """Check that lldb ignores unknown attributes on an enum or evalue."""
840*208a08c3SDavid Spickett        self.setup_register_test(
841*208a08c3SDavid Spickett            """\
842*208a08c3SDavid Spickett          <enum id="some_enum" size="4" foo=\"bar\">
843*208a08c3SDavid Spickett            <evalue name="valid" value="1" colour=\"red"/>
844*208a08c3SDavid Spickett          </enum>
845*208a08c3SDavid Spickett          <flags id="cpsr_flags" size="4">
846*208a08c3SDavid Spickett            <field name="E" start="0" end="0" type="some_enum"/>
847*208a08c3SDavid Spickett          </flags>
848*208a08c3SDavid Spickett          <reg name="pc" bitsize="64"/>
849*208a08c3SDavid Spickett          <reg name="x0" regnum="0" bitsize="64"/>
850*208a08c3SDavid Spickett          <reg name="cpsr" regnum="33" bitsize="32" type="cpsr_flags"/>"""
851*208a08c3SDavid Spickett        )
852*208a08c3SDavid Spickett
853*208a08c3SDavid Spickett        self.expect("register info cpsr", patterns=["E: 1 = valid$"])
854*208a08c3SDavid Spickett
855*208a08c3SDavid Spickett    @skipIfXmlSupportMissing
856*208a08c3SDavid Spickett    @skipIfRemote
857*208a08c3SDavid Spickett    def test_evalue_required_attributes(self):
858*208a08c3SDavid Spickett        """Check that lldb rejects any evalue missing a name and/or value."""
859*208a08c3SDavid Spickett        self.setup_register_test(
860*208a08c3SDavid Spickett            """\
861*208a08c3SDavid Spickett          <enum id="some_enum" size="4">
862*208a08c3SDavid Spickett            <evalue name="foo"/>
863*208a08c3SDavid Spickett            <evalue value="1"/>
864*208a08c3SDavid Spickett            <evalue />
865*208a08c3SDavid Spickett            <evalue name="valid" value="1"/>
866*208a08c3SDavid Spickett          </enum>
867*208a08c3SDavid Spickett          <flags id="cpsr_flags" size="4">
868*208a08c3SDavid Spickett            <field name="E" start="0" end="0" type="some_enum"/>
869*208a08c3SDavid Spickett          </flags>
870*208a08c3SDavid Spickett          <reg name="pc" bitsize="64"/>
871*208a08c3SDavid Spickett          <reg name="x0" regnum="0" bitsize="64"/>
872*208a08c3SDavid Spickett          <reg name="cpsr" regnum="33" bitsize="32" type="cpsr_flags"/>"""
873*208a08c3SDavid Spickett        )
874*208a08c3SDavid Spickett
875*208a08c3SDavid Spickett        self.expect("register info cpsr", patterns=["E: 1 = valid$"])
876*208a08c3SDavid Spickett
877*208a08c3SDavid Spickett    @skipIfXmlSupportMissing
878*208a08c3SDavid Spickett    @skipIfRemote
879*208a08c3SDavid Spickett    def test_evalue_name_xml_reserved_characters(self):
880*208a08c3SDavid Spickett        """Check that lldb converts reserved character replacements like &amp;
881*208a08c3SDavid Spickett        when found in evalue names."""
882*208a08c3SDavid Spickett        self.setup_register_test(
883*208a08c3SDavid Spickett            """\
884*208a08c3SDavid Spickett          <enum id="some_enum" size="4">
885*208a08c3SDavid Spickett            <evalue name="A&amp;"  value="0"/>
886*208a08c3SDavid Spickett            <evalue name="B&quot;" value="1"/>
887*208a08c3SDavid Spickett            <evalue name="C&apos;" value="2"/>
888*208a08c3SDavid Spickett            <evalue name="D&gt;"   value="3"/>
889*208a08c3SDavid Spickett            <evalue name="E&lt;"   value="4"/>
890*208a08c3SDavid Spickett          </enum>
891*208a08c3SDavid Spickett          <flags id="cpsr_flags" size="4">
892*208a08c3SDavid Spickett            <field name="E" start="0" end="2" type="some_enum"/>
893*208a08c3SDavid Spickett          </flags>
894*208a08c3SDavid Spickett          <reg name="pc" bitsize="64"/>
895*208a08c3SDavid Spickett          <reg name="x0" regnum="0" bitsize="64"/>
896*208a08c3SDavid Spickett          <reg name="cpsr" regnum="33" bitsize="32" type="cpsr_flags"/>"""
897*208a08c3SDavid Spickett        )
898*208a08c3SDavid Spickett
899*208a08c3SDavid Spickett        self.expect(
900*208a08c3SDavid Spickett            "register info cpsr",
901*208a08c3SDavid Spickett            patterns=["E: 0 = A&, 1 = B\", 2 = C', 3 = D>, 4 = E<$"],
902*208a08c3SDavid Spickett        )
903*208a08c3SDavid Spickett
904*208a08c3SDavid Spickett    @skipIfXmlSupportMissing
905*208a08c3SDavid Spickett    @skipIfRemote
906*208a08c3SDavid Spickett    def test_enum_value_range(self):
907*208a08c3SDavid Spickett        """Check that lldb ignores enums whose values would not fit into
908*208a08c3SDavid Spickett        their field."""
909*208a08c3SDavid Spickett
910*208a08c3SDavid Spickett        self.setup_register_test(
911*208a08c3SDavid Spickett            """\
912*208a08c3SDavid Spickett          <enum id="some_enum" size="4">
913*208a08c3SDavid Spickett            <evalue name="A" value="0"/>
914*208a08c3SDavid Spickett            <evalue name="B" value="1"/>
915*208a08c3SDavid Spickett            <evalue name="C" value="2"/>
916*208a08c3SDavid Spickett            <evalue name="D" value="3"/>
917*208a08c3SDavid Spickett            <evalue name="E" value="4"/>
918*208a08c3SDavid Spickett          </enum>
919*208a08c3SDavid Spickett          <flags id="cpsr_flags" size="4">
920*208a08c3SDavid Spickett            <field name="foo" start="0" end="1" type="some_enum"/>
921*208a08c3SDavid Spickett            <field name="bar" start="2" end="10" type="some_enum"/>
922*208a08c3SDavid Spickett          </flags>
923*208a08c3SDavid Spickett          <reg name="pc" bitsize="64"/>
924*208a08c3SDavid Spickett          <reg name="x0" regnum="0" bitsize="64"/>
925*208a08c3SDavid Spickett          <reg name="cpsr" regnum="33" bitsize="32" type="cpsr_flags"/>"""
926*208a08c3SDavid Spickett        )
927*208a08c3SDavid Spickett
928*208a08c3SDavid Spickett        # some_enum can apply to foo
929*208a08c3SDavid Spickett        self.expect(
930*208a08c3SDavid Spickett            "register info cpsr", patterns=["bar: 0 = A, 1 = B, 2 = C, 3 = D, 4 = E$"]
931*208a08c3SDavid Spickett        )
932*208a08c3SDavid Spickett        # but not to bar
933*208a08c3SDavid Spickett        self.expect("register info cpsr", patterns=["foo: "], matching=False)
934*208a08c3SDavid Spickett
935*208a08c3SDavid Spickett    @skipIfXmlSupportMissing
936*208a08c3SDavid Spickett    @skipIfRemote
937*208a08c3SDavid Spickett    def test_evalue_value_limits(self):
938*208a08c3SDavid Spickett        """Check that lldb can handle an evalue for a field up to 64 bits
939*208a08c3SDavid Spickett        in size and anything greater is ignored."""
940*208a08c3SDavid Spickett
941*208a08c3SDavid Spickett        self.setup_register_test(
942*208a08c3SDavid Spickett            """\
943*208a08c3SDavid Spickett          <enum id="some_enum" size="8">
944*208a08c3SDavid Spickett            <evalue name="min" value="0"/>
945*208a08c3SDavid Spickett            <evalue name="max" value="0xffffffffffffffff"/>
946*208a08c3SDavid Spickett            <evalue name="invalid" value="0xfffffffffffffffff"/>
947*208a08c3SDavid Spickett          </enum>
948*208a08c3SDavid Spickett          <flags id="x0_flags" size="8">
949*208a08c3SDavid Spickett            <field name="foo" start="0" end="63" type="some_enum"/>
950*208a08c3SDavid Spickett          </flags>
951*208a08c3SDavid Spickett          <reg name="pc" bitsize="64"/>
952*208a08c3SDavid Spickett          <reg name="x0" regnum="0" bitsize="64" type="x0_flags"/>
953*208a08c3SDavid Spickett          <reg name="cpsr" regnum="33" bitsize="32"/>"""
954*208a08c3SDavid Spickett        )
955*208a08c3SDavid Spickett
956*208a08c3SDavid Spickett        self.expect(
957*208a08c3SDavid Spickett            "register info x0", patterns=["foo: 0 = min, 18446744073709551615 = max$"]
958*208a08c3SDavid Spickett        )
959*208a08c3SDavid Spickett
960*208a08c3SDavid Spickett    @skipIfXmlSupportMissing
961*208a08c3SDavid Spickett    @skipIfRemote
962*208a08c3SDavid Spickett    def test_field_size_limit(self):
963*208a08c3SDavid Spickett        """Check that lldb ignores any field > 64 bits. We can't handle those
964*208a08c3SDavid Spickett        correctly."""
965*208a08c3SDavid Spickett
966*208a08c3SDavid Spickett        self.setup_register_test(
967*208a08c3SDavid Spickett            """\
968*208a08c3SDavid Spickett          <flags id="x0_flags" size="8">
969*208a08c3SDavid Spickett            <field name="invalid" start="0" end="64"/>
970*208a08c3SDavid Spickett            <field name="valid" start="0" end="63"/>
971*208a08c3SDavid Spickett          </flags>
972*208a08c3SDavid Spickett          <reg name="pc" bitsize="64"/>
973*208a08c3SDavid Spickett          <reg name="x0" regnum="0" bitsize="64" type="x0_flags"/>
974*208a08c3SDavid Spickett          <reg name="cpsr" regnum="33" bitsize="32"/>"""
975*208a08c3SDavid Spickett        )
976*208a08c3SDavid Spickett
977*208a08c3SDavid Spickett        self.expect(
978*208a08c3SDavid Spickett            "register info x0", substrs=["| 63-0  |\n" "|-------|\n" "| valid |"]
979*208a08c3SDavid Spickett        )
980*208a08c3SDavid Spickett
981*208a08c3SDavid Spickett    @skipIfXmlSupportMissing
982*208a08c3SDavid Spickett    @skipIfRemote
983*208a08c3SDavid Spickett    def test_many_fields_same_enum(self):
984*208a08c3SDavid Spickett        """Check that an enum can be reused by many fields, and fields of many
985*208a08c3SDavid Spickett        registers."""
986*208a08c3SDavid Spickett
987*208a08c3SDavid Spickett        self.setup_register_test(
988*208a08c3SDavid Spickett            """\
989*208a08c3SDavid Spickett          <enum id="some_enum" size="8">
990*208a08c3SDavid Spickett            <evalue name="valid" value="1"/>
991*208a08c3SDavid Spickett          </enum>
992*208a08c3SDavid Spickett          <flags id="x0_flags" size="8">
993*208a08c3SDavid Spickett            <field name="f1" start="0" end="0" type="some_enum"/>
994*208a08c3SDavid Spickett            <field name="f2" start="1" end="1" type="some_enum"/>
995*208a08c3SDavid Spickett          </flags>
996*208a08c3SDavid Spickett          <flags id="cpsr_flags" size="4">
997*208a08c3SDavid Spickett            <field name="f1" start="0" end="0" type="some_enum"/>
998*208a08c3SDavid Spickett            <field name="f2" start="1" end="1" type="some_enum"/>
999*208a08c3SDavid Spickett          </flags>
1000*208a08c3SDavid Spickett          <reg name="pc" bitsize="64"/>
1001*208a08c3SDavid Spickett          <reg name="x0" regnum="0" bitsize="64" type="x0_flags"/>
1002*208a08c3SDavid Spickett          <reg name="cpsr" regnum="33" bitsize="32" type="cpsr_flags"/>"""
1003*208a08c3SDavid Spickett        )
1004*208a08c3SDavid Spickett
1005*208a08c3SDavid Spickett        expected_info = [
1006*208a08c3SDavid Spickett            dedent(
1007*208a08c3SDavid Spickett                """\
1008*208a08c3SDavid Spickett             f2: 1 = valid
1009*208a08c3SDavid Spickett
1010*208a08c3SDavid Spickett             f1: 1 = valid$"""
1011*208a08c3SDavid Spickett            )
1012*208a08c3SDavid Spickett        ]
1013*208a08c3SDavid Spickett        self.expect("register info x0", patterns=expected_info)
1014*208a08c3SDavid Spickett
1015*208a08c3SDavid Spickett        self.expect("register info cpsr", patterns=expected_info)
1016*208a08c3SDavid Spickett
1017*208a08c3SDavid Spickett        expected_read = ["\(f2 = valid, f1 = valid\)$"]
1018*208a08c3SDavid Spickett        self.expect("register read x0", patterns=expected_read)
1019*208a08c3SDavid Spickett        self.expect("register read cpsr", patterns=expected_read)
1020*208a08c3SDavid Spickett
1021*208a08c3SDavid Spickett    @skipIfXmlSupportMissing
1022*208a08c3SDavid Spickett    @skipIfRemote
1023*208a08c3SDavid Spickett    def test_fields_same_name_different_enum(self):
1024*208a08c3SDavid Spickett        """Check that lldb does something sensible when there are two fields with
1025*208a08c3SDavid Spickett        the same name, but their enum types differ."""
1026*208a08c3SDavid Spickett
1027*208a08c3SDavid Spickett        # It's unlikely anyone would do this intentionally but it is allowed by
1028*208a08c3SDavid Spickett        # the protocol spec so we have to cope with it.
1029*208a08c3SDavid Spickett        self.setup_register_test(
1030*208a08c3SDavid Spickett            """\
1031*208a08c3SDavid Spickett          <enum id="foo_enum" size="8">
1032*208a08c3SDavid Spickett            <evalue name="foo_0" value="1"/>
1033*208a08c3SDavid Spickett          </enum>
1034*208a08c3SDavid Spickett          <enum id="foo_alt_enum" size="8">
1035*208a08c3SDavid Spickett            <evalue name="foo_1" value="1"/>
1036*208a08c3SDavid Spickett          </enum>
1037*208a08c3SDavid Spickett          <flags id="x0_flags" size="8">
1038*208a08c3SDavid Spickett            <field name="foo" start="0" end="0" type="foo_enum"/>
1039*208a08c3SDavid Spickett            <field name="foo" start="1" end="1" type="foo_alt_enum"/>
1040*208a08c3SDavid Spickett          </flags>
1041*208a08c3SDavid Spickett          <reg name="pc" bitsize="64"/>
1042*208a08c3SDavid Spickett          <reg name="x0" regnum="0" bitsize="64" type="x0_flags"/>
1043*208a08c3SDavid Spickett          <reg name="cpsr" regnum="33" bitsize="32"/>"""
1044*208a08c3SDavid Spickett        )
1045*208a08c3SDavid Spickett
1046*208a08c3SDavid Spickett        self.expect(
1047*208a08c3SDavid Spickett            "register info x0",
1048*208a08c3SDavid Spickett            patterns=[
1049*208a08c3SDavid Spickett                dedent(
1050*208a08c3SDavid Spickett                    """\
1051*208a08c3SDavid Spickett             foo: 1 = foo_1
1052*208a08c3SDavid Spickett
1053*208a08c3SDavid Spickett             foo: 1 = foo_0$"""
1054*208a08c3SDavid Spickett                )
1055*208a08c3SDavid Spickett            ],
1056*208a08c3SDavid Spickett        )
1057*208a08c3SDavid Spickett
1058*208a08c3SDavid Spickett        self.expect("register read x0", patterns=["\(foo = foo_1, foo = foo_0\)$"])
1059