SBValue.cpp revision 0a19a1b9c25117854f226256805239d95153ed2d
1//===-- SBValue.cpp ---------------------------------------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10#include "lldb/API/SBValue.h" 11#include "lldb/API/SBStream.h" 12 13#include "lldb/Breakpoint/Watchpoint.h" 14#include "lldb/Core/DataExtractor.h" 15#include "lldb/Core/Log.h" 16#include "lldb/Core/Module.h" 17#include "lldb/Core/Scalar.h" 18#include "lldb/Core/Stream.h" 19#include "lldb/Core/StreamFile.h" 20#include "lldb/Core/Value.h" 21#include "lldb/Core/ValueObject.h" 22#include "lldb/Core/ValueObjectConstResult.h" 23#include "lldb/Symbol/Block.h" 24#include "lldb/Symbol/ObjectFile.h" 25#include "lldb/Symbol/Type.h" 26#include "lldb/Symbol/Variable.h" 27#include "lldb/Symbol/VariableList.h" 28#include "lldb/Target/ExecutionContext.h" 29#include "lldb/Target/Process.h" 30#include "lldb/Target/StackFrame.h" 31#include "lldb/Target/Target.h" 32#include "lldb/Target/Thread.h" 33 34#include "lldb/API/SBProcess.h" 35#include "lldb/API/SBTarget.h" 36#include "lldb/API/SBThread.h" 37#include "lldb/API/SBFrame.h" 38#include "lldb/API/SBDebugger.h" 39 40using namespace lldb; 41using namespace lldb_private; 42 43SBValue::SBValue () : 44 m_opaque_sp () 45{ 46} 47 48SBValue::SBValue (const lldb::ValueObjectSP &value_sp) : 49 m_opaque_sp (value_sp) 50{ 51} 52 53SBValue::SBValue(const SBValue &rhs) : 54 m_opaque_sp (rhs.m_opaque_sp) 55{ 56} 57 58SBValue & 59SBValue::operator = (const SBValue &rhs) 60{ 61 if (this != &rhs) 62 m_opaque_sp = rhs.m_opaque_sp; 63 return *this; 64} 65 66SBValue::~SBValue() 67{ 68} 69 70bool 71SBValue::IsValid () 72{ 73 // If this function ever changes to anything that does more than just 74 // check if the opaque shared pointer is non NULL, then we need to update 75 // all "if (m_opaque_sp)" code in this file. 76 return m_opaque_sp.get() != NULL; 77} 78 79void 80SBValue::Clear() 81{ 82 m_opaque_sp.reset(); 83} 84 85SBError 86SBValue::GetError() 87{ 88 SBError sb_error; 89 90 lldb::ValueObjectSP value_sp(GetSP()); 91 if (value_sp) 92 sb_error.SetError(value_sp->GetError()); 93 else 94 sb_error.SetErrorString("error: invalid value"); 95 96 return sb_error; 97} 98 99user_id_t 100SBValue::GetID() 101{ 102 lldb::ValueObjectSP value_sp(GetSP()); 103 if (value_sp) 104 return value_sp->GetID(); 105 return LLDB_INVALID_UID; 106} 107 108const char * 109SBValue::GetName() 110{ 111 112 const char *name = NULL; 113 lldb::ValueObjectSP value_sp(GetSP()); 114 if (value_sp) 115 name = value_sp->GetName().GetCString(); 116 117 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 118 if (log) 119 { 120 if (name) 121 log->Printf ("SBValue(%p)::GetName () => \"%s\"", value_sp.get(), name); 122 else 123 log->Printf ("SBValue(%p)::GetName () => NULL", value_sp.get()); 124 } 125 126 return name; 127} 128 129const char * 130SBValue::GetTypeName () 131{ 132 const char *name = NULL; 133 lldb::ValueObjectSP value_sp(GetSP()); 134 if (value_sp) 135 name = value_sp->GetTypeName().GetCString(); 136 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 137 if (log) 138 { 139 if (name) 140 log->Printf ("SBValue(%p)::GetTypeName () => \"%s\"", value_sp.get(), name); 141 else 142 log->Printf ("SBValue(%p)::GetTypeName () => NULL", value_sp.get()); 143 } 144 145 return name; 146} 147 148size_t 149SBValue::GetByteSize () 150{ 151 size_t result = 0; 152 153 lldb::ValueObjectSP value_sp(GetSP()); 154 if (value_sp) 155 result = value_sp->GetByteSize(); 156 157 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 158 if (log) 159 log->Printf ("SBValue(%p)::GetByteSize () => %zu", value_sp.get(), result); 160 161 return result; 162} 163 164bool 165SBValue::IsInScope () 166{ 167 bool result = false; 168 169 lldb::ValueObjectSP value_sp(GetSP()); 170 if (value_sp) 171 { 172 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP()); 173 if (target_sp) 174 { 175 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex()); 176 result = value_sp->IsInScope (); 177 } 178 } 179 180 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 181 if (log) 182 log->Printf ("SBValue(%p)::IsInScope () => %i", value_sp.get(), result); 183 184 return result; 185} 186 187const char * 188SBValue::GetValue () 189{ 190 const char *cstr = NULL; 191 lldb::ValueObjectSP value_sp(GetSP()); 192 if (value_sp) 193 { 194 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP()); 195 if (target_sp) 196 { 197 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex()); 198 cstr = value_sp->GetValueAsCString (); 199 } 200 } 201 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 202 if (log) 203 { 204 if (cstr) 205 log->Printf ("SBValue(%p)::GetValue => \"%s\"", value_sp.get(), cstr); 206 else 207 log->Printf ("SBValue(%p)::GetValue => NULL", value_sp.get()); 208 } 209 210 return cstr; 211} 212 213ValueType 214SBValue::GetValueType () 215{ 216 ValueType result = eValueTypeInvalid; 217 lldb::ValueObjectSP value_sp(GetSP()); 218 if (value_sp) 219 result = value_sp->GetValueType(); 220 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 221 if (log) 222 { 223 switch (result) 224 { 225 case eValueTypeInvalid: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeInvalid", value_sp.get()); break; 226 case eValueTypeVariableGlobal: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableGlobal", value_sp.get()); break; 227 case eValueTypeVariableStatic: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableStatic", value_sp.get()); break; 228 case eValueTypeVariableArgument:log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableArgument", value_sp.get()); break; 229 case eValueTypeVariableLocal: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableLocal", value_sp.get()); break; 230 case eValueTypeRegister: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeRegister", value_sp.get()); break; 231 case eValueTypeRegisterSet: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeRegisterSet", value_sp.get()); break; 232 case eValueTypeConstResult: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeConstResult", value_sp.get()); break; 233 default: log->Printf ("SBValue(%p)::GetValueType () => %i ???", value_sp.get(), result); break; 234 } 235 } 236 return result; 237} 238 239const char * 240SBValue::GetObjectDescription () 241{ 242 const char *cstr = NULL; 243 lldb::ValueObjectSP value_sp(GetSP()); 244 if (value_sp) 245 { 246 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP()); 247 if (target_sp) 248 { 249 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex()); 250 cstr = value_sp->GetObjectDescription (); 251 } 252 } 253 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 254 if (log) 255 { 256 if (cstr) 257 log->Printf ("SBValue(%p)::GetObjectDescription => \"%s\"", value_sp.get(), cstr); 258 else 259 log->Printf ("SBValue(%p)::GetObjectDescription => NULL", value_sp.get()); 260 } 261 return cstr; 262} 263 264SBType 265SBValue::GetType() 266{ 267 SBType sb_type; 268 lldb::ValueObjectSP value_sp(GetSP()); 269 TypeImplSP type_sp; 270 if (value_sp) 271 { 272 type_sp.reset (new TypeImpl(ClangASTType (value_sp->GetClangAST(), value_sp->GetClangType()))); 273 sb_type.SetSP(type_sp); 274 } 275 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 276 if (log) 277 { 278 if (type_sp) 279 log->Printf ("SBValue(%p)::GetType => SBType(%p)", value_sp.get(), type_sp.get()); 280 else 281 log->Printf ("SBValue(%p)::GetType => NULL", value_sp.get()); 282 } 283 return sb_type; 284} 285 286bool 287SBValue::GetValueDidChange () 288{ 289 bool result = false; 290 lldb::ValueObjectSP value_sp(GetSP()); 291 if (value_sp) 292 { 293 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP()); 294 if (target_sp) 295 { 296 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex()); 297 result = value_sp->GetValueDidChange (); 298 } 299 } 300 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 301 if (log) 302 log->Printf ("SBValue(%p)::GetValueDidChange => %i", value_sp.get(), result); 303 304 return result; 305} 306 307const char * 308SBValue::GetSummary () 309{ 310 const char *cstr = NULL; 311 lldb::ValueObjectSP value_sp(GetSP()); 312 if (value_sp) 313 { 314 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP()); 315 if (target_sp) 316 { 317 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex()); 318 cstr = value_sp->GetSummaryAsCString(); 319 } 320 } 321 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 322 if (log) 323 { 324 if (cstr) 325 log->Printf ("SBValue(%p)::GetSummary => \"%s\"", value_sp.get(), cstr); 326 else 327 log->Printf ("SBValue(%p)::GetSummary => NULL", value_sp.get()); 328 } 329 return cstr; 330} 331 332const char * 333SBValue::GetLocation () 334{ 335 const char *cstr = NULL; 336 lldb::ValueObjectSP value_sp(GetSP()); 337 if (value_sp) 338 { 339 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP()); 340 if (target_sp) 341 { 342 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex()); 343 cstr = value_sp->GetLocationAsCString(); 344 } 345 } 346 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 347 if (log) 348 { 349 if (cstr) 350 log->Printf ("SBValue(%p)::GetSummary => \"%s\"", value_sp.get(), cstr); 351 else 352 log->Printf ("SBValue(%p)::GetSummary => NULL", value_sp.get()); 353 } 354 return cstr; 355} 356 357bool 358SBValue::SetValueFromCString (const char *value_str) 359{ 360 bool success = false; 361 lldb::ValueObjectSP value_sp(GetSP()); 362 if (value_sp) 363 { 364 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP()); 365 if (target_sp) 366 { 367 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex()); 368 success = value_sp->SetValueFromCString (value_str); 369 } 370 } 371 return success; 372} 373 374lldb::SBValue 375SBValue::CreateChildAtOffset (const char *name, uint32_t offset, SBType type) 376{ 377 lldb::SBValue sb_value; 378 lldb::ValueObjectSP value_sp(GetSP()); 379 lldb::ValueObjectSP new_value_sp; 380 if (value_sp) 381 { 382 TypeImplSP type_sp (type.GetSP()); 383 if (type.IsValid()) 384 { 385 sb_value = SBValue(value_sp->GetSyntheticChildAtOffset(offset, type_sp->GetClangASTType(), true)); 386 new_value_sp = sb_value.GetSP(); 387 if (new_value_sp) 388 new_value_sp->SetName(ConstString(name)); 389 } 390 } 391 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 392 if (log) 393 { 394 if (new_value_sp) 395 log->Printf ("SBValue(%p)::GetChildAtOffset => \"%s\"", value_sp.get(), new_value_sp->GetName().AsCString()); 396 else 397 log->Printf ("SBValue(%p)::GetChildAtOffset => NULL", value_sp.get()); 398 } 399 return sb_value; 400} 401 402lldb::SBValue 403SBValue::Cast (SBType type) 404{ 405 lldb::SBValue sb_value; 406 lldb::ValueObjectSP value_sp(GetSP()); 407 TypeImplSP type_sp (type.GetSP()); 408 if (value_sp && type_sp) 409 sb_value.SetSP(value_sp->Cast(type_sp->GetClangASTType())); 410 return sb_value; 411} 412 413lldb::SBValue 414SBValue::CreateValueFromExpression (const char *name, const char* expression) 415{ 416 lldb::SBValue sb_value; 417 lldb::ValueObjectSP value_sp(GetSP()); 418 lldb::ValueObjectSP new_value_sp; 419 if (value_sp) 420 { 421 value_sp->GetUpdatePoint().GetTargetSP()->EvaluateExpression (expression, 422 value_sp->GetExecutionContextScope()->CalculateStackFrame(), 423 eExecutionPolicyOnlyWhenNeeded, 424 false, // coerce to id 425 true, // unwind on error 426 true, // keep in memory 427 eNoDynamicValues, 428 new_value_sp); 429 if (new_value_sp) 430 { 431 new_value_sp->SetName(ConstString(name)); 432 sb_value.SetSP(new_value_sp); 433 } 434 } 435 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 436 if (log) 437 { 438 if (new_value_sp) 439 log->Printf ("SBValue(%p)::GetChildFromExpression => \"%s\"", value_sp.get(), new_value_sp->GetName().AsCString()); 440 else 441 log->Printf ("SBValue(%p)::GetChildFromExpression => NULL", value_sp.get()); 442 } 443 return sb_value; 444} 445 446lldb::SBValue 447SBValue::CreateValueFromAddress(const char* name, lldb::addr_t address, SBType sb_type) 448{ 449 lldb::SBValue sb_value; 450 lldb::ValueObjectSP value_sp(GetSP()); 451 lldb::ValueObjectSP new_value_sp; 452 lldb::TypeImplSP type_impl_sp (sb_type.GetSP()); 453 if (value_sp && type_impl_sp) 454 { 455 ClangASTType pointee_ast_type(type_impl_sp->GetASTContext(), type_impl_sp->GetClangASTType().GetPointerType ()); 456 lldb::TypeImplSP pointee_type_impl_sp (new TypeImpl(pointee_ast_type)); 457 if (pointee_type_impl_sp) 458 { 459 460 lldb::DataBufferSP buffer(new lldb_private::DataBufferHeap(&address,sizeof(lldb::addr_t))); 461 462 ValueObjectSP ptr_result_valobj_sp(ValueObjectConstResult::Create (value_sp->GetExecutionContextScope(), 463 pointee_type_impl_sp->GetASTContext(), 464 pointee_type_impl_sp->GetOpaqueQualType(), 465 ConstString(name), 466 buffer, 467 lldb::endian::InlHostByteOrder(), 468 GetTarget().GetProcess().GetAddressByteSize())); 469 470 if (ptr_result_valobj_sp) 471 { 472 ptr_result_valobj_sp->GetValue().SetValueType(Value::eValueTypeLoadAddress); 473 Error err; 474 new_value_sp = ptr_result_valobj_sp->Dereference(err); 475 if (new_value_sp) 476 new_value_sp->SetName(ConstString(name)); 477 } 478 sb_value.SetSP(new_value_sp); 479 } 480 } 481 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 482 if (log) 483 { 484 if (new_value_sp) 485 log->Printf ("SBValue(%p)::CreateValueFromAddress => \"%s\"", value_sp.get(), new_value_sp->GetName().AsCString()); 486 else 487 log->Printf ("SBValue(%p)::CreateValueFromAddress => NULL", value_sp.get()); 488 } 489 return sb_value; 490} 491 492lldb::SBValue 493SBValue::CreateValueFromData (const char* name, SBData data, SBType type) 494{ 495 lldb::SBValue sb_value; 496 lldb::ValueObjectSP new_value_sp; 497 lldb::ValueObjectSP value_sp(GetSP()); 498 if (value_sp) 499 { 500 new_value_sp = ValueObjectConstResult::Create (value_sp->GetExecutionContextScope(), 501 type.m_opaque_sp->GetASTContext() , 502 type.m_opaque_sp->GetOpaqueQualType(), 503 ConstString(name), 504 *data.m_opaque_sp, 505 LLDB_INVALID_ADDRESS); 506 new_value_sp->SetAddressTypeOfChildren(eAddressTypeLoad); 507 sb_value.SetSP(new_value_sp); 508 } 509 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 510 if (log) 511 { 512 if (new_value_sp) 513 log->Printf ("SBValue(%p)::GetChildFromExpression => \"%s\"", value_sp.get(), new_value_sp->GetName().AsCString()); 514 else 515 log->Printf ("SBValue(%p)::GetChildFromExpression => NULL", value_sp.get()); 516 } 517 return sb_value; 518} 519 520SBValue 521SBValue::GetChildAtIndex (uint32_t idx) 522{ 523 const bool can_create_synthetic = false; 524 lldb::DynamicValueType use_dynamic = eNoDynamicValues; 525 lldb::ValueObjectSP value_sp(GetSP()); 526 if (value_sp) 527 use_dynamic = value_sp->GetUpdatePoint().GetTargetSP()->GetPreferDynamicValue(); 528 return GetChildAtIndex (idx, use_dynamic, can_create_synthetic); 529} 530 531SBValue 532SBValue::GetChildAtIndex (uint32_t idx, lldb::DynamicValueType use_dynamic, bool can_create_synthetic) 533{ 534 lldb::ValueObjectSP child_sp; 535 536 lldb::ValueObjectSP value_sp(GetSP()); 537 if (value_sp) 538 { 539 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP()); 540 if (target_sp) 541 { 542 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex()); 543 const bool can_create = true; 544 child_sp = value_sp->GetChildAtIndex (idx, can_create); 545 if (can_create_synthetic && !child_sp) 546 { 547 if (value_sp->IsPointerType()) 548 { 549 child_sp = value_sp->GetSyntheticArrayMemberFromPointer(idx, can_create); 550 } 551 else if (value_sp->IsArrayType()) 552 { 553 child_sp = value_sp->GetSyntheticArrayMemberFromArray(idx, can_create); 554 } 555 } 556 557 if (child_sp) 558 { 559 if (use_dynamic != lldb::eNoDynamicValues) 560 { 561 lldb::ValueObjectSP dynamic_sp(child_sp->GetDynamicValue (use_dynamic)); 562 if (dynamic_sp) 563 child_sp = dynamic_sp; 564 } 565 } 566 } 567 } 568 569 SBValue sb_value (child_sp); 570 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 571 if (log) 572 log->Printf ("SBValue(%p)::GetChildAtIndex (%u) => SBValue(%p)", value_sp.get(), idx, value_sp.get()); 573 574 return sb_value; 575} 576 577uint32_t 578SBValue::GetIndexOfChildWithName (const char *name) 579{ 580 uint32_t idx = UINT32_MAX; 581 lldb::ValueObjectSP value_sp(GetSP()); 582 if (value_sp) 583 { 584 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP()); 585 if (target_sp) 586 { 587 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex()); 588 589 idx = value_sp->GetIndexOfChildWithName (ConstString(name)); 590 } 591 } 592 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 593 if (log) 594 { 595 if (idx == UINT32_MAX) 596 log->Printf ("SBValue(%p)::GetIndexOfChildWithName (name=\"%s\") => NOT FOUND", value_sp.get(), name); 597 else 598 log->Printf ("SBValue(%p)::GetIndexOfChildWithName (name=\"%s\") => %u", value_sp.get(), name, idx); 599 } 600 return idx; 601} 602 603SBValue 604SBValue::GetChildMemberWithName (const char *name) 605{ 606 lldb::ValueObjectSP value_sp(GetSP()); 607 if (value_sp) 608 { 609 lldb::DynamicValueType use_dynamic_value = eNoDynamicValues; 610 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP()); 611 if (target_sp) 612 { 613 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 614 use_dynamic_value = target_sp->GetPreferDynamicValue(); 615 } 616 return GetChildMemberWithName (name, use_dynamic_value); 617 } 618 return SBValue(); 619} 620 621SBValue 622SBValue::GetChildMemberWithName (const char *name, lldb::DynamicValueType use_dynamic_value) 623{ 624 lldb::ValueObjectSP child_sp; 625 const ConstString str_name (name); 626 627 628 lldb::ValueObjectSP value_sp(GetSP()); 629 if (value_sp) 630 { 631 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP()); 632 if (target_sp) 633 { 634 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 635 child_sp = value_sp->GetChildMemberWithName (str_name, true); 636 if (use_dynamic_value != lldb::eNoDynamicValues) 637 { 638 if (child_sp) 639 { 640 lldb::ValueObjectSP dynamic_sp = child_sp->GetDynamicValue (use_dynamic_value); 641 if (dynamic_sp) 642 child_sp = dynamic_sp; 643 } 644 } 645 } 646 } 647 648 SBValue sb_value (child_sp); 649 650 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 651 if (log) 652 log->Printf ("SBValue(%p)::GetChildMemberWithName (name=\"%s\") => SBValue(%p)", value_sp.get(), name, value_sp.get()); 653 654 return sb_value; 655} 656 657lldb::SBValue 658SBValue::GetDynamicValue (lldb::DynamicValueType use_dynamic) 659{ 660 lldb::ValueObjectSP value_sp(GetSP()); 661 if (value_sp) 662 { 663 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP()); 664 if (target_sp) 665 { 666 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex()); 667 return SBValue (value_sp->GetDynamicValue(use_dynamic)); 668 } 669 } 670 671 return SBValue(); 672} 673 674lldb::SBValue 675SBValue::GetStaticValue () 676{ 677 lldb::ValueObjectSP value_sp(GetSP()); 678 if (value_sp) 679 { 680 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP()); 681 if (target_sp) 682 { 683 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex()); 684 return SBValue(value_sp->GetStaticValue()); 685 } 686 } 687 688 return SBValue(); 689} 690 691bool 692SBValue::IsDynamic() 693{ 694 lldb::ValueObjectSP value_sp(GetSP()); 695 if (value_sp) 696 { 697 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP()); 698 if (target_sp) 699 { 700 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex()); 701 return value_sp->IsDynamic(); 702 } 703 } 704 return false; 705} 706 707lldb::SBValue 708SBValue::GetValueForExpressionPath(const char* expr_path) 709{ 710 lldb::ValueObjectSP child_sp; 711 lldb::ValueObjectSP value_sp(GetSP()); 712 if (value_sp) 713 { 714 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP()); 715 if (target_sp) 716 { 717 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex()); 718 // using default values for all the fancy options, just do it if you can 719 child_sp = value_sp->GetValueForExpressionPath(expr_path); 720 } 721 } 722 723 SBValue sb_value (child_sp); 724 725 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 726 if (log) 727 log->Printf ("SBValue(%p)::GetValueForExpressionPath (expr_path=\"%s\") => SBValue(%p)", value_sp.get(), expr_path, value_sp.get()); 728 729 return sb_value; 730} 731 732int64_t 733SBValue::GetValueAsSigned(SBError& error, int64_t fail_value) 734{ 735 error.Clear(); 736 lldb::ValueObjectSP value_sp(GetSP()); 737 if (value_sp) 738 { 739 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP()); 740 if (target_sp) 741 { 742 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex()); 743 Scalar scalar; 744 if (value_sp->ResolveValue (scalar)) 745 return scalar.GetRawBits64(fail_value); 746 else 747 error.SetErrorString("could not get value"); 748 } 749 else 750 error.SetErrorString("could not get target"); 751 } 752 error.SetErrorString("invalid SBValue"); 753 return fail_value; 754} 755 756uint64_t 757SBValue::GetValueAsUnsigned(SBError& error, uint64_t fail_value) 758{ 759 error.Clear(); 760 lldb::ValueObjectSP value_sp(GetSP()); 761 if (value_sp) 762 { 763 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP()); 764 if (target_sp) 765 { 766 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex()); 767 Scalar scalar; 768 if (value_sp->ResolveValue (scalar)) 769 return scalar.GetRawBits64(fail_value); 770 else 771 error.SetErrorString("could not get value"); 772 } 773 else 774 error.SetErrorString("could not get target"); 775 } 776 error.SetErrorString("invalid SBValue"); 777 return fail_value; 778} 779 780int64_t 781SBValue::GetValueAsSigned(int64_t fail_value) 782{ 783 lldb::ValueObjectSP value_sp(GetSP()); 784 if (value_sp) 785 { 786 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP()); 787 if (target_sp) 788 { 789 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex()); 790 Scalar scalar; 791 if (value_sp->ResolveValue (scalar)) 792 return scalar.GetRawBits64(fail_value); 793 } 794 } 795 return fail_value; 796} 797 798uint64_t 799SBValue::GetValueAsUnsigned(uint64_t fail_value) 800{ 801 lldb::ValueObjectSP value_sp(GetSP()); 802 if (value_sp) 803 { 804 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP()); 805 if (target_sp) 806 { 807 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex()); 808 Scalar scalar; 809 if (value_sp->ResolveValue (scalar)) 810 return scalar.GetRawBits64(fail_value); 811 } 812 } 813 return fail_value; 814} 815 816uint32_t 817SBValue::GetNumChildren () 818{ 819 uint32_t num_children = 0; 820 821 lldb::ValueObjectSP value_sp(GetSP()); 822 if (value_sp) 823 { 824 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP()); 825 if (target_sp) 826 { 827 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex()); 828 829 num_children = value_sp->GetNumChildren(); 830 } 831 } 832 833 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 834 if (log) 835 log->Printf ("SBValue(%p)::GetNumChildren () => %u", value_sp.get(), num_children); 836 837 return num_children; 838} 839 840 841SBValue 842SBValue::Dereference () 843{ 844 SBValue sb_value; 845 lldb::ValueObjectSP value_sp(GetSP()); 846 if (value_sp) 847 { 848 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP()); 849 if (target_sp) 850 { 851 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex()); 852 853 Error error; 854 sb_value = value_sp->Dereference (error); 855 } 856 } 857 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 858 if (log) 859 log->Printf ("SBValue(%p)::Dereference () => SBValue(%p)", value_sp.get(), value_sp.get()); 860 861 return sb_value; 862} 863 864bool 865SBValue::TypeIsPointerType () 866{ 867 bool is_ptr_type = false; 868 869 lldb::ValueObjectSP value_sp(GetSP()); 870 if (value_sp) 871 { 872 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP()); 873 if (target_sp) 874 { 875 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex()); 876 877 is_ptr_type = value_sp->IsPointerType(); 878 } 879 } 880 881 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 882 if (log) 883 log->Printf ("SBValue(%p)::TypeIsPointerType () => %i", value_sp.get(), is_ptr_type); 884 885 886 return is_ptr_type; 887} 888 889void * 890SBValue::GetOpaqueType() 891{ 892 lldb::ValueObjectSP value_sp(GetSP()); 893 if (value_sp) 894 { 895 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP()); 896 if (target_sp) 897 { 898 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex()); 899 900 return value_sp->GetClangType(); 901 } 902 } 903 return NULL; 904} 905 906lldb::SBTarget 907SBValue::GetTarget() 908{ 909 SBTarget sb_target; 910 TargetSP target_sp; 911 lldb::ValueObjectSP value_sp(GetSP()); 912 if (value_sp) 913 { 914 target_sp = value_sp->GetUpdatePoint().GetTargetSP(); 915 sb_target.SetSP (target_sp); 916 } 917 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 918 if (log) 919 { 920 if (target_sp.get() == NULL) 921 log->Printf ("SBValue(%p)::GetTarget () => NULL", value_sp.get()); 922 else 923 log->Printf ("SBValue(%p)::GetTarget () => %p", value_sp.get(), target_sp.get()); 924 } 925 return sb_target; 926} 927 928lldb::SBProcess 929SBValue::GetProcess() 930{ 931 SBProcess sb_process; 932 ProcessSP process_sp; 933 lldb::ValueObjectSP value_sp(GetSP()); 934 if (value_sp) 935 { 936 process_sp = value_sp->GetUpdatePoint().GetProcessSP(); 937 if (process_sp) 938 sb_process.SetSP (process_sp); 939 } 940 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 941 if (log) 942 { 943 if (process_sp.get() == NULL) 944 log->Printf ("SBValue(%p)::GetProcess () => NULL", value_sp.get()); 945 else 946 log->Printf ("SBValue(%p)::GetProcess () => %p", value_sp.get(), process_sp.get()); 947 } 948 return sb_process; 949} 950 951lldb::SBThread 952SBValue::GetThread() 953{ 954 SBThread sb_thread; 955 ThreadSP thread_sp; 956 lldb::ValueObjectSP value_sp(GetSP()); 957 if (value_sp) 958 { 959 if (value_sp->GetExecutionContextScope()) 960 { 961 thread_sp = value_sp->GetExecutionContextScope()->CalculateThread()->shared_from_this(); 962 sb_thread.SetThread(thread_sp); 963 } 964 } 965 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 966 if (log) 967 { 968 if (thread_sp.get() == NULL) 969 log->Printf ("SBValue(%p)::GetThread () => NULL", value_sp.get()); 970 else 971 log->Printf ("SBValue(%p)::GetThread () => %p", value_sp.get(), thread_sp.get()); 972 } 973 return sb_thread; 974} 975 976lldb::SBFrame 977SBValue::GetFrame() 978{ 979 SBFrame sb_frame; 980 StackFrameSP frame_sp; 981 lldb::ValueObjectSP value_sp(GetSP()); 982 if (value_sp) 983 { 984 if (value_sp->GetExecutionContextScope()) 985 { 986 frame_sp = value_sp->GetExecutionContextScope()->CalculateStackFrame()->shared_from_this(); 987 sb_frame.SetFrameSP (frame_sp); 988 } 989 } 990 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 991 if (log) 992 { 993 if (frame_sp.get() == NULL) 994 log->Printf ("SBValue(%p)::GetFrame () => NULL", value_sp.get()); 995 else 996 log->Printf ("SBValue(%p)::GetFrame () => %p", value_sp.get(), frame_sp.get()); 997 } 998 return sb_frame; 999} 1000 1001 1002lldb::ValueObjectSP 1003SBValue::GetSP () const 1004{ 1005 return m_opaque_sp; 1006} 1007 1008void 1009SBValue::SetSP (const lldb::ValueObjectSP &sp) 1010{ 1011 m_opaque_sp = sp; 1012} 1013 1014 1015bool 1016SBValue::GetExpressionPath (SBStream &description) 1017{ 1018 lldb::ValueObjectSP value_sp(GetSP()); 1019 if (value_sp) 1020 { 1021 value_sp->GetExpressionPath (description.ref(), false); 1022 return true; 1023 } 1024 return false; 1025} 1026 1027bool 1028SBValue::GetExpressionPath (SBStream &description, bool qualify_cxx_base_classes) 1029{ 1030 lldb::ValueObjectSP value_sp(GetSP()); 1031 if (value_sp) 1032 { 1033 value_sp->GetExpressionPath (description.ref(), qualify_cxx_base_classes); 1034 return true; 1035 } 1036 return false; 1037} 1038 1039bool 1040SBValue::GetDescription (SBStream &description) 1041{ 1042 Stream &strm = description.ref(); 1043 1044 lldb::ValueObjectSP value_sp(GetSP()); 1045 if (value_sp) 1046 { 1047 ValueObject::DumpValueObject (strm, value_sp.get()); 1048 } 1049 else 1050 strm.PutCString ("No value"); 1051 1052 return true; 1053} 1054 1055lldb::Format 1056SBValue::GetFormat () 1057{ 1058 lldb::ValueObjectSP value_sp(GetSP()); 1059 if (value_sp) 1060 return value_sp->GetFormat(); 1061 return eFormatDefault; 1062} 1063 1064void 1065SBValue::SetFormat (lldb::Format format) 1066{ 1067 lldb::ValueObjectSP value_sp(GetSP()); 1068 if (value_sp) 1069 value_sp->SetFormat(format); 1070} 1071 1072lldb::SBValue 1073SBValue::AddressOf() 1074{ 1075 SBValue sb_value; 1076 lldb::ValueObjectSP value_sp(GetSP()); 1077 if (value_sp) 1078 { 1079 Target* target = value_sp->GetUpdatePoint().GetTargetSP().get(); 1080 if (target) 1081 { 1082 Mutex::Locker api_locker (target->GetAPIMutex()); 1083 Error error; 1084 sb_value = value_sp->AddressOf (error); 1085 } 1086 } 1087 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1088 if (log) 1089 log->Printf ("SBValue(%p)::GetPointerToObject () => SBValue(%p)", value_sp.get(), value_sp.get()); 1090 1091 return sb_value; 1092} 1093 1094lldb::addr_t 1095SBValue::GetLoadAddress() 1096{ 1097 lldb::addr_t value = LLDB_INVALID_ADDRESS; 1098 lldb::ValueObjectSP value_sp(GetSP()); 1099 if (value_sp) 1100 { 1101 Target* target = value_sp->GetUpdatePoint().GetTargetSP().get(); 1102 if (target) 1103 { 1104 Mutex::Locker api_locker (target->GetAPIMutex()); 1105 const bool scalar_is_load_address = true; 1106 AddressType addr_type; 1107 value = value_sp->GetAddressOf(scalar_is_load_address, &addr_type); 1108 if (addr_type == eAddressTypeFile) 1109 { 1110 Module* module = value_sp->GetModule(); 1111 if (!module) 1112 value = LLDB_INVALID_ADDRESS; 1113 else 1114 { 1115 Address addr; 1116 module->ResolveFileAddress(value, addr); 1117 value = addr.GetLoadAddress(value_sp->GetUpdatePoint().GetTargetSP().get()); 1118 } 1119 } 1120 else if (addr_type == eAddressTypeHost || addr_type == eAddressTypeInvalid) 1121 value = LLDB_INVALID_ADDRESS; 1122 } 1123 } 1124 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1125 if (log) 1126 log->Printf ("SBValue(%p)::GetLoadAddress () => (%llu)", value_sp.get(), value); 1127 1128 return value; 1129} 1130 1131lldb::SBAddress 1132SBValue::GetAddress() 1133{ 1134 Address addr; 1135 lldb::ValueObjectSP value_sp(GetSP()); 1136 if (value_sp) 1137 { 1138 Target* target = value_sp->GetUpdatePoint().GetTargetSP().get(); 1139 if (target) 1140 { 1141 lldb::addr_t value = LLDB_INVALID_ADDRESS; 1142 Mutex::Locker api_locker (target->GetAPIMutex()); 1143 const bool scalar_is_load_address = true; 1144 AddressType addr_type; 1145 value = value_sp->GetAddressOf(scalar_is_load_address, &addr_type); 1146 if (addr_type == eAddressTypeFile) 1147 { 1148 Module* module = value_sp->GetModule(); 1149 if (module) 1150 module->ResolveFileAddress(value, addr); 1151 } 1152 else if (addr_type == eAddressTypeLoad) 1153 { 1154 // no need to check the return value on this.. if it can actually do the resolve 1155 // addr will be in the form (section,offset), otherwise it will simply be returned 1156 // as (NULL, value) 1157 addr.SetLoadAddress(value, target); 1158 } 1159 } 1160 } 1161 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1162 if (log) 1163 log->Printf ("SBValue(%p)::GetAddress () => (%s,%llu)", value_sp.get(), (addr.GetSection() ? addr.GetSection()->GetName().GetCString() : "NULL"), addr.GetOffset()); 1164 return SBAddress(new Address(addr)); 1165} 1166 1167lldb::SBData 1168SBValue::GetPointeeData (uint32_t item_idx, 1169 uint32_t item_count) 1170{ 1171 lldb::SBData sb_data; 1172 lldb::ValueObjectSP value_sp(GetSP()); 1173 if (value_sp) 1174 { 1175 Target* target = value_sp->GetUpdatePoint().GetTargetSP().get(); 1176 if (target) 1177 { 1178 DataExtractorSP data_sp(new DataExtractor()); 1179 Mutex::Locker api_locker (target->GetAPIMutex()); 1180 value_sp->GetPointeeData(*data_sp, item_idx, item_count); 1181 if (data_sp->GetByteSize() > 0) 1182 *sb_data = data_sp; 1183 } 1184 } 1185 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1186 if (log) 1187 log->Printf ("SBValue(%p)::GetPointeeData (%d, %d) => SBData(%p)", 1188 value_sp.get(), 1189 item_idx, 1190 item_count, 1191 sb_data.get()); 1192 1193 return sb_data; 1194} 1195 1196lldb::SBData 1197SBValue::GetData () 1198{ 1199 lldb::SBData sb_data; 1200 lldb::ValueObjectSP value_sp(GetSP()); 1201 if (value_sp) 1202 { 1203 TargetSP target_sp (value_sp->GetUpdatePoint().GetTargetSP()); 1204 if (target_sp) 1205 { 1206 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 1207 DataExtractorSP data_sp(new DataExtractor()); 1208 value_sp->GetData(*data_sp); 1209 if (data_sp->GetByteSize() > 0) 1210 *sb_data = data_sp; 1211 } 1212 } 1213 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1214 if (log) 1215 log->Printf ("SBValue(%p)::GetData () => SBData(%p)", 1216 value_sp.get(), 1217 sb_data.get()); 1218 1219 return sb_data; 1220} 1221 1222lldb::SBWatchpoint 1223SBValue::Watch (bool resolve_location, bool read, bool write) 1224{ 1225 SBWatchpoint sb_watchpoint; 1226 1227 // If the SBValue is not valid, there's no point in even trying to watch it. 1228 lldb::ValueObjectSP value_sp(GetSP()); 1229 TargetSP target_sp (GetTarget().GetSP()); 1230 if (value_sp && target_sp) 1231 { 1232 // Read and Write cannot both be false. 1233 if (!read && !write) 1234 return sb_watchpoint; 1235 1236 // If the value is not in scope, don't try and watch and invalid value 1237 if (!IsInScope()) 1238 return sb_watchpoint; 1239 1240 addr_t addr = GetLoadAddress(); 1241 if (addr == LLDB_INVALID_ADDRESS) 1242 return sb_watchpoint; 1243 size_t byte_size = GetByteSize(); 1244 if (byte_size == 0) 1245 return sb_watchpoint; 1246 1247 uint32_t watch_type = 0; 1248 if (read) 1249 watch_type |= LLDB_WATCH_TYPE_READ; 1250 if (write) 1251 watch_type |= LLDB_WATCH_TYPE_WRITE; 1252 1253 WatchpointSP watchpoint_sp = target_sp->CreateWatchpoint(addr, byte_size, watch_type); 1254 1255 if (watchpoint_sp) 1256 { 1257 sb_watchpoint.SetSP (watchpoint_sp); 1258 Declaration decl; 1259 if (value_sp->GetDeclaration (decl)) 1260 { 1261 if (decl.GetFile()) 1262 { 1263 StreamString ss; 1264 // True to show fullpath for declaration file. 1265 decl.DumpStopContext(&ss, true); 1266 watchpoint_sp->SetDeclInfo(ss.GetString()); 1267 } 1268 } 1269 } 1270 } 1271 return sb_watchpoint; 1272} 1273 1274lldb::SBWatchpoint 1275SBValue::WatchPointee (bool resolve_location, bool read, bool write) 1276{ 1277 SBWatchpoint sb_watchpoint; 1278 if (IsInScope() && GetType().IsPointerType()) 1279 sb_watchpoint = Dereference().Watch (resolve_location, read, write); 1280 return sb_watchpoint; 1281} 1282 1283