1"""Test the SBData APIs.""" 2 3 4 5from math import fabs 6import lldb 7from lldbsuite.test.decorators import * 8from lldbsuite.test.lldbtest import * 9from lldbsuite.test import lldbutil 10 11 12class SBDataAPICase(TestBase): 13 NO_DEBUG_INFO_TESTCASE = True 14 15 def setUp(self): 16 # Call super's setUp(). 17 TestBase.setUp(self) 18 # Find the line number to break on inside main.cpp. 19 self.line = line_number('main.cpp', '// set breakpoint here') 20 21 def test_byte_order_and_address_byte_size(self): 22 """Test the SBData::SetData() to ensure the byte order and address 23 byte size are obeyed""" 24 addr_data = b'\x11\x22\x33\x44\x55\x66\x77\x88' 25 error = lldb.SBError() 26 data = lldb.SBData() 27 data.SetData(error, addr_data, lldb.eByteOrderBig, 4) 28 addr = data.GetAddress(error, 0) 29 self.assertEqual(addr, 0x11223344); 30 data.SetData(error, addr_data, lldb.eByteOrderBig, 8) 31 addr = data.GetAddress(error, 0) 32 self.assertEqual(addr, 0x1122334455667788); 33 data.SetData(error, addr_data, lldb.eByteOrderLittle, 4) 34 addr = data.GetAddress(error, 0) 35 self.assertEqual(addr, 0x44332211); 36 data.SetData(error, addr_data, lldb.eByteOrderLittle, 8) 37 addr = data.GetAddress(error, 0) 38 self.assertEqual(addr, 0x8877665544332211); 39 40 def test_byte_order_and_address_byte_size_with_ownership(self): 41 """Test the SBData::SetDataWithOwnership() to ensure the byte order 42 and address byte size are obeyed even when source date is released""" 43 addr_data = b'\x11\x22\x33\x44\x55\x66\x77\x88' 44 error = lldb.SBError() 45 data = lldb.SBData() 46 data.SetDataWithOwnership(error, addr_data, lldb.eByteOrderBig, 8) 47 del addr_data 48 addr = data.GetAddress(error, 0) 49 self.assertEqual(addr, 0x1122334455667788); 50 51 def test_with_run_command(self): 52 """Test the SBData APIs.""" 53 self.build() 54 self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET) 55 56 lldbutil.run_break_set_by_file_and_line( 57 self, "main.cpp", self.line, num_expected_locations=1, loc_exact=True) 58 59 self.runCmd("run", RUN_SUCCEEDED) 60 61 # The stop reason of the thread should be breakpoint. 62 self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, 63 substrs=['stopped', 64 'stop reason = breakpoint']) 65 66 target = self.dbg.GetSelectedTarget() 67 68 process = target.GetProcess() 69 70 thread = lldbutil.get_stopped_thread( 71 process, lldb.eStopReasonBreakpoint) 72 self.assertIsNotNone(thread) 73 74 frame = thread.GetSelectedFrame() 75 foobar = frame.FindVariable('foobar') 76 self.assertTrue(foobar.IsValid()) 77 data = foobar.GetPointeeData(0, 2) 78 offset = 0 79 error = lldb.SBError() 80 81 self.assert_data(data.GetUnsignedInt32, offset, 1) 82 offset += 4 83 low = data.GetSignedInt16(error, offset) 84 self.assertSuccess(error) 85 offset += 2 86 high = data.GetSignedInt16(error, offset) 87 self.assertSuccess(error) 88 offset += 2 89 self.assertTrue( 90 (low == 9 and high == 0) or ( 91 low == 0 and high == 9), 92 'foo[0].b == 9') 93 self.assertTrue( 94 fabs( 95 data.GetFloat( 96 error, 97 offset) - 98 3.14) < 1, 99 'foo[0].c == 3.14') 100 self.assertSuccess(error) 101 offset += 4 102 self.assert_data(data.GetUnsignedInt32, offset, 8) 103 offset += 4 104 self.assert_data(data.GetUnsignedInt32, offset, 5) 105 offset += 4 106 107 self.runCmd("n") 108 109 offset = 16 110 111 self.assert_data(data.GetUnsignedInt32, offset, 5) 112 113 data = foobar.GetPointeeData(1, 1) 114 115 offset = 0 116 117 self.assert_data(data.GetSignedInt32, offset, 8) 118 offset += 4 119 self.assert_data(data.GetSignedInt32, offset, 7) 120 offset += 8 121 self.assertEqual( 122 data.GetUnsignedInt32(error, offset), 0, 123 'do not read beyond end') 124 self.assertTrue(not error.Success()) 125 error.Clear() # clear the error for the next test 126 127 star_foobar = foobar.Dereference() 128 self.assertTrue(star_foobar.IsValid()) 129 130 data = star_foobar.GetData() 131 132 offset = 0 133 self.assert_data(data.GetUnsignedInt32, offset, 1) 134 offset += 4 135 self.assert_data(data.GetUnsignedInt32, offset, 9) 136 137 foobar_addr = star_foobar.GetLoadAddress() 138 foobar_addr += 12 139 140 # http://llvm.org/bugs/show_bug.cgi?id=11579 141 # lldb::SBValue::CreateValueFromAddress does not verify SBType::GetPointerType succeeds 142 # This should not crash LLDB. 143 nothing = foobar.CreateValueFromAddress( 144 "nothing", foobar_addr, star_foobar.GetType().GetBasicType( 145 lldb.eBasicTypeInvalid)) 146 147 new_foobar = foobar.CreateValueFromAddress( 148 "f00", foobar_addr, star_foobar.GetType()) 149 self.assertTrue(new_foobar.IsValid()) 150 data = new_foobar.GetData() 151 152 self.assertEqual(data.uint32[0], 8, 'then foo[1].a == 8') 153 self.assertEqual(data.uint32[1], 7, 'then foo[1].b == 7') 154 # exploiting that sizeof(uint32) == sizeof(float) 155 self.assertTrue(fabs(data.float[2] - 3.14) < 1, 'foo[1].c == 3.14') 156 157 self.runCmd("n") 158 159 offset = 0 160 self.assert_data(data.GetUnsignedInt32, offset, 8) 161 offset += 4 162 self.assert_data(data.GetUnsignedInt32, offset, 7) 163 offset += 4 164 self.assertTrue( 165 fabs( 166 data.GetFloat( 167 error, 168 offset) - 169 3.14) < 1, 170 'foo[1].c == 3.14') 171 self.assertSuccess(error) 172 173 data = new_foobar.GetData() 174 175 offset = 0 176 self.assert_data(data.GetUnsignedInt32, offset, 8) 177 offset += 4 178 self.assert_data(data.GetUnsignedInt32, offset, 7) 179 offset += 4 180 self.assertTrue( 181 fabs( 182 data.GetFloat( 183 error, 184 offset) - 185 6.28) < 1, 186 'foo[1].c == 6.28') 187 self.assertSuccess(error) 188 189 self.runCmd("n") 190 191 barfoo = frame.FindVariable('barfoo') 192 193 data = barfoo.GetData() 194 offset = 0 195 self.assert_data(data.GetUnsignedInt32, offset, 1) 196 offset += 4 197 self.assert_data(data.GetUnsignedInt32, offset, 2) 198 offset += 4 199 self.assertTrue( 200 fabs( 201 data.GetFloat( 202 error, 203 offset) - 204 3) < 1, 205 'barfoo[0].c == 3') 206 self.assertSuccess(error) 207 offset += 4 208 self.assert_data(data.GetUnsignedInt32, offset, 4) 209 offset += 4 210 self.assert_data(data.GetUnsignedInt32, offset, 5) 211 offset += 4 212 self.assertTrue( 213 fabs( 214 data.GetFloat( 215 error, 216 offset) - 217 6) < 1, 218 'barfoo[1].c == 6') 219 self.assertSuccess(error) 220 221 new_object = barfoo.CreateValueFromData( 222 "new_object", data, barfoo.GetType().GetBasicType( 223 lldb.eBasicTypeInt)) 224 self.assertEqual(new_object.GetValue(), "1", 'new_object == 1') 225 226 if data.GetByteOrder() == lldb.eByteOrderBig: 227 data.SetData( 228 error, 229 '\0\0\0A', 230 data.GetByteOrder(), 231 data.GetAddressByteSize()) 232 else: 233 data.SetData( 234 error, 235 'A\0\0\0', 236 data.GetByteOrder(), 237 data.GetAddressByteSize()) 238 self.assertSuccess(error) 239 240 data2 = lldb.SBData() 241 data2.SetData( 242 error, 243 'BCD', 244 data.GetByteOrder(), 245 data.GetAddressByteSize()) 246 self.assertSuccess(error) 247 248 data.Append(data2) 249 250 # this breaks on EBCDIC 251 offset = 0 252 self.assert_data(data.GetUnsignedInt32, offset, 65) 253 offset += 4 254 self.assert_data(data.GetUnsignedInt8, offset, 66) 255 offset += 1 256 self.assert_data(data.GetUnsignedInt8, offset, 67) 257 offset += 1 258 self.assert_data(data.GetUnsignedInt8, offset, 68) 259 offset += 1 260 261 # check the new API calls introduced per LLVM llvm.org/prenhancement request 262 # 11619 (Allow creating SBData values from arrays or primitives in 263 # Python) 264 265 hello_str = "hello!" 266 data2 = lldb.SBData.CreateDataFromCString( 267 process.GetByteOrder(), process.GetAddressByteSize(), hello_str) 268 self.assertEqual(len(data2.uint8), len(hello_str)) 269 self.assertEqual(data2.uint8[0], 104, 'h == 104') 270 self.assertEqual(data2.uint8[1], 101, 'e == 101') 271 self.assertEqual(data2.uint8[2], 108, 'l == 108') 272 self.assert_data(data2.GetUnsignedInt8, 3, 108) # l 273 self.assertEqual(data2.uint8[4], 111, 'o == 111') 274 self.assert_data(data2.GetUnsignedInt8, 5, 33) # ! 275 276 uint_lists = [[1, 2, 3, 4, 5], [int(i) for i in [1, 2, 3, 4, 5]]] 277 int_lists = [[2, -2], [int(i) for i in [2, -2]]] 278 279 for l in uint_lists: 280 data2 = lldb.SBData.CreateDataFromUInt64Array( 281 process.GetByteOrder(), process.GetAddressByteSize(), l) 282 self.assert_data(data2.GetUnsignedInt64, 0, 1) 283 self.assert_data(data2.GetUnsignedInt64, 8, 2) 284 self.assert_data(data2.GetUnsignedInt64, 16, 3) 285 self.assert_data(data2.GetUnsignedInt64, 24, 4) 286 self.assert_data(data2.GetUnsignedInt64, 32, 5) 287 288 self.assertEqual( 289 data2.uint64s, [1, 2, 3, 4, 5], 290 'read_data_helper failure: data2 == [1,2,3,4,5]') 291 292 for l in int_lists: 293 data2 = lldb.SBData.CreateDataFromSInt32Array( 294 process.GetByteOrder(), process.GetAddressByteSize(), l) 295 self.assertEqual( 296 data2.sint32[0:2], [2, -2], 'signed32 data2 = [2,-2]') 297 298 data2.Append( 299 lldb.SBData.CreateDataFromSInt64Array( 300 process.GetByteOrder(), 301 process.GetAddressByteSize(), 302 int_lists[0])) 303 self.assert_data(data2.GetSignedInt32, 0, 2) 304 self.assert_data(data2.GetSignedInt32, 4, -2) 305 self.assertEqual( 306 data2.sint64[1:3], [2, -2], 'signed64 data2 = [2,-2]') 307 308 for l in int_lists: 309 data2 = lldb.SBData.CreateDataFromSInt64Array( 310 process.GetByteOrder(), process.GetAddressByteSize(), l) 311 self.assert_data(data2.GetSignedInt64, 0, 2) 312 self.assert_data(data2.GetSignedInt64, 8, -2) 313 self.assertEqual( 314 data2.sint64[0:2], [2, -2], 'signed64 data2 = [2,-2]') 315 316 for l in uint_lists: 317 data2 = lldb.SBData.CreateDataFromUInt32Array( 318 process.GetByteOrder(), process.GetAddressByteSize(), l) 319 self.assert_data(data2.GetUnsignedInt32, 0, 1) 320 self.assert_data(data2.GetUnsignedInt32, 4, 2) 321 self.assert_data(data2.GetUnsignedInt32, 8, 3) 322 self.assert_data(data2.GetUnsignedInt32, 12, 4) 323 self.assert_data(data2.GetUnsignedInt32, 16, 5) 324 325 bool_list = [True, True, False, False, True, False] 326 327 data2 = lldb.SBData.CreateDataFromSInt32Array( 328 process.GetByteOrder(), process.GetAddressByteSize(), bool_list) 329 self.assertEqual( 330 data2.sint32[0:6], [1, 1, 0, 0, 1, 0], 331 'signed32 data2 = [1, 1, 0, 0, 1, 0]') 332 333 data2 = lldb.SBData.CreateDataFromUInt32Array( 334 process.GetByteOrder(), process.GetAddressByteSize(), bool_list) 335 self.assertEqual( 336 data2.uint32[0:6], [1, 1, 0, 0, 1, 0], 337 'unsigned32 data2 = [1, 1, 0, 0, 1, 0]') 338 339 data2 = lldb.SBData.CreateDataFromSInt64Array( 340 process.GetByteOrder(), process.GetAddressByteSize(), bool_list) 341 self.assertEqual( 342 data2.sint64[0:6], [1, 1, 0, 0, 1, 0], 343 'signed64 data2 = [1, 1, 0, 0, 1, 0]') 344 345 data2 = lldb.SBData.CreateDataFromUInt64Array( 346 process.GetByteOrder(), process.GetAddressByteSize(), bool_list) 347 self.assertEqual( 348 data2.uint64[0:6], [1, 1, 0, 0, 1, 0], 349 'signed64 data2 = [1, 1, 0, 0, 1, 0]') 350 351 data2 = lldb.SBData.CreateDataFromDoubleArray( 352 process.GetByteOrder(), process.GetAddressByteSize(), [ 353 3.14, 6.28, 2.71]) 354 self.assertTrue( 355 fabs( 356 data2.GetDouble( 357 error, 358 0) - 359 3.14) < 0.5, 360 'double data2[0] = 3.14') 361 self.assertSuccess(error) 362 self.assertTrue( 363 fabs( 364 data2.GetDouble( 365 error, 366 8) - 367 6.28) < 0.5, 368 'double data2[1] = 6.28') 369 self.assertSuccess(error) 370 self.assertTrue( 371 fabs( 372 data2.GetDouble( 373 error, 374 16) - 375 2.71) < 0.5, 376 'double data2[2] = 2.71') 377 self.assertSuccess(error) 378 379 data2 = lldb.SBData() 380 381 data2.SetDataFromCString(hello_str) 382 self.assertEqual(len(data2.uint8), len(hello_str)) 383 self.assert_data(data2.GetUnsignedInt8, 0, 104) 384 self.assert_data(data2.GetUnsignedInt8, 1, 101) 385 self.assert_data(data2.GetUnsignedInt8, 2, 108) 386 self.assert_data(data2.GetUnsignedInt8, 3, 108) 387 self.assert_data(data2.GetUnsignedInt8, 4, 111) 388 self.assert_data(data2.GetUnsignedInt8, 5, 33) 389 390 data2.SetDataFromUInt64Array([1, 2, 3, 4, 5]) 391 self.assert_data(data2.GetUnsignedInt64, 0, 1) 392 self.assert_data(data2.GetUnsignedInt64, 8, 2) 393 self.assert_data(data2.GetUnsignedInt64, 16, 3) 394 self.assert_data(data2.GetUnsignedInt64, 24, 4) 395 self.assert_data(data2.GetUnsignedInt64, 32, 5) 396 397 self.assertEqual( 398 data2.uint64[0], 1, 399 'read_data_helper failure: set data2[0] = 1') 400 self.assertEqual( 401 data2.uint64[1], 2, 402 'read_data_helper failure: set data2[1] = 2') 403 self.assertEqual( 404 data2.uint64[2], 3, 405 'read_data_helper failure: set data2[2] = 3') 406 self.assertEqual( 407 data2.uint64[3], 4, 408 'read_data_helper failure: set data2[3] = 4') 409 self.assertEqual( 410 data2.uint64[4], 5, 411 'read_data_helper failure: set data2[4] = 5') 412 413 self.assertTrue( 414 data2.uint64[ 415 0:2] == [ 416 1, 417 2], 418 'read_data_helper failure: set data2[0:2] = [1,2]') 419 420 data2.SetDataFromSInt32Array([2, -2]) 421 self.assert_data(data2.GetSignedInt32, 0, 2) 422 self.assert_data(data2.GetSignedInt32, 4, -2) 423 424 data2.SetDataFromSInt64Array([2, -2]) 425 self.assert_data(data2.GetSignedInt64, 0, 2) 426 self.assert_data(data2.GetSignedInt64, 8, -2) 427 428 data2.SetDataFromUInt32Array([1, 2, 3, 4, 5]) 429 self.assert_data(data2.GetUnsignedInt32, 0, 1) 430 self.assert_data(data2.GetUnsignedInt32, 4, 2) 431 self.assert_data(data2.GetUnsignedInt32, 8, 3) 432 self.assert_data(data2.GetUnsignedInt32, 12, 4) 433 self.assert_data(data2.GetUnsignedInt32, 16, 5) 434 435 self.assertEqual( 436 data2.uint32[0], 1, 437 'read_data_helper failure: set 32-bit data2[0] = 1') 438 self.assertEqual( 439 data2.uint32[1], 2, 440 'read_data_helper failure: set 32-bit data2[1] = 2') 441 self.assertEqual( 442 data2.uint32[2], 3, 443 'read_data_helper failure: set 32-bit data2[2] = 3') 444 self.assertEqual( 445 data2.uint32[3], 4, 446 'read_data_helper failure: set 32-bit data2[3] = 4') 447 self.assertEqual( 448 data2.uint32[4], 5, 449 'read_data_helper failure: set 32-bit data2[4] = 5') 450 451 data2.SetDataFromDoubleArray([3.14, 6.28, 2.71]) 452 self.assertTrue(fabs(data2.GetDouble(error, 0) - 3.14) 453 < 0.5, 'set double data2[0] = 3.14') 454 self.assertTrue(fabs(data2.GetDouble(error, 8) - 6.28) 455 < 0.5, 'set double data2[1] = 6.28') 456 self.assertTrue(fabs(data2.GetDouble(error, 16) - 2.71) 457 < 0.5, 'set double data2[2] = 2.71') 458 459 self.assertTrue( 460 fabs( 461 data2.double[0] - 462 3.14) < 0.5, 463 'read_data_helper failure: set double data2[0] = 3.14') 464 self.assertTrue( 465 fabs( 466 data2.double[1] - 467 6.28) < 0.5, 468 'read_data_helper failure: set double data2[1] = 6.28') 469 self.assertTrue( 470 fabs( 471 data2.double[2] - 472 2.71) < 0.5, 473 'read_data_helper failure: set double data2[2] = 2.71') 474 475 def assert_data(self, func, arg, expected): 476 """ Asserts func(SBError error, arg) == expected. """ 477 error = lldb.SBError() 478 result = func(error, arg) 479 if not error.Success(): 480 stream = lldb.SBStream() 481 error.GetDescription(stream) 482 self.assertTrue( 483 error.Success(), "%s(error, %s) did not succeed: %s" % 484 (func.__name__, arg, stream.GetData())) 485 self.assertTrue( 486 expected == result, "%s(error, %s) == %s != %s" % 487 (func.__name__, arg, result, expected)) 488