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 & 6442325b3cfSDavid Spickett when found in field names.""" 6452325b3cfSDavid Spickett self.setup_flags_test( 6462325b3cfSDavid Spickett '<field name="E&" start="0" end="0"/>' 6472325b3cfSDavid Spickett '<field name="D"" start="1" end="1"/>' 6482325b3cfSDavid Spickett '<field name="C'" start="2" end="2"/>' 6492325b3cfSDavid Spickett '<field name="B>" start="3" end="3"/>' 6502325b3cfSDavid Spickett '<field name="A<" 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 & 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&" value="0"/> 886*208a08c3SDavid Spickett <evalue name="B"" value="1"/> 887*208a08c3SDavid Spickett <evalue name="C'" value="2"/> 888*208a08c3SDavid Spickett <evalue name="D>" value="3"/> 889*208a08c3SDavid Spickett <evalue name="E<" 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