SBValue.cpp revision 851e30ec6a1b1d2c154bb7d69ed0d05b5fd14705
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 12#include "lldb/API/SBStream.h" 13#include "lldb/API/SBTypeFilter.h" 14#include "lldb/API/SBTypeFormat.h" 15#include "lldb/API/SBTypeSummary.h" 16#include "lldb/API/SBTypeSynthetic.h" 17 18#include "lldb/Breakpoint/Watchpoint.h" 19#include "lldb/Core/DataExtractor.h" 20#include "lldb/Core/DataVisualization.h" 21#include "lldb/Core/Log.h" 22#include "lldb/Core/Module.h" 23#include "lldb/Core/Scalar.h" 24#include "lldb/Core/Section.h" 25#include "lldb/Core/Stream.h" 26#include "lldb/Core/StreamFile.h" 27#include "lldb/Core/Value.h" 28#include "lldb/Core/ValueObject.h" 29#include "lldb/Core/ValueObjectConstResult.h" 30#include "lldb/Symbol/Block.h" 31#include "lldb/Symbol/ObjectFile.h" 32#include "lldb/Symbol/Type.h" 33#include "lldb/Symbol/Variable.h" 34#include "lldb/Symbol/VariableList.h" 35#include "lldb/Target/ExecutionContext.h" 36#include "lldb/Target/Process.h" 37#include "lldb/Target/StackFrame.h" 38#include "lldb/Target/Target.h" 39#include "lldb/Target/Thread.h" 40 41#include "lldb/API/SBProcess.h" 42#include "lldb/API/SBTarget.h" 43#include "lldb/API/SBThread.h" 44#include "lldb/API/SBFrame.h" 45#include "lldb/API/SBDebugger.h" 46 47using namespace lldb; 48using namespace lldb_private; 49 50SBValue::SBValue () : 51 m_opaque_sp () 52{ 53} 54 55SBValue::SBValue (const lldb::ValueObjectSP &value_sp) 56{ 57 SetSP(value_sp); // whenever setting the SP call SetSP() since it knows how to deal with synthetic values properly 58} 59 60SBValue::SBValue(const SBValue &rhs) 61{ 62 SetSP(rhs.m_opaque_sp); // whenever setting the SP call SetSP() since it knows how to deal with synthetic values properly 63} 64 65SBValue & 66SBValue::operator = (const SBValue &rhs) 67{ 68 if (this != &rhs) 69 { 70 SetSP(rhs.m_opaque_sp); // whenever setting the SP call SetSP() since it knows how to deal with synthetic values properly 71 } 72 return *this; 73} 74 75SBValue::~SBValue() 76{ 77} 78 79bool 80SBValue::IsValid () 81{ 82 // If this function ever changes to anything that does more than just 83 // check if the opaque shared pointer is non NULL, then we need to update 84 // all "if (m_opaque_sp)" code in this file. 85 return m_opaque_sp.get() != NULL; 86} 87 88void 89SBValue::Clear() 90{ 91 m_opaque_sp.reset(); 92} 93 94SBError 95SBValue::GetError() 96{ 97 SBError sb_error; 98 99 lldb::ValueObjectSP value_sp(GetSP()); 100 if (value_sp) 101 sb_error.SetError(value_sp->GetError()); 102 else 103 sb_error.SetErrorString("error: invalid value"); 104 105 return sb_error; 106} 107 108user_id_t 109SBValue::GetID() 110{ 111 lldb::ValueObjectSP value_sp(GetSP()); 112 if (value_sp) 113 return value_sp->GetID(); 114 return LLDB_INVALID_UID; 115} 116 117const char * 118SBValue::GetName() 119{ 120 121 const char *name = NULL; 122 lldb::ValueObjectSP value_sp(GetSP()); 123 if (value_sp) 124 name = value_sp->GetName().GetCString(); 125 126 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 127 if (log) 128 { 129 if (name) 130 log->Printf ("SBValue(%p)::GetName () => \"%s\"", value_sp.get(), name); 131 else 132 log->Printf ("SBValue(%p)::GetName () => NULL", value_sp.get()); 133 } 134 135 return name; 136} 137 138const char * 139SBValue::GetTypeName () 140{ 141 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 142 const char *name = NULL; 143 lldb::ValueObjectSP value_sp(GetSP()); 144 if (value_sp) 145 { 146 // For a dynamic type we might have to run code to determine the type we are going to report, 147 // and we might not have updated the type before we get asked this. So make sure to get the API lock. 148 149 ProcessSP process_sp(value_sp->GetProcessSP()); 150 Process::StopLocker stop_locker; 151 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock())) 152 { 153 if (log) 154 log->Printf ("SBValue(%p)::GetTypeName() => error: process is running", value_sp.get()); 155 } 156 else 157 { 158 TargetSP target_sp(value_sp->GetTargetSP()); 159 if (target_sp) 160 { 161 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 162 name = value_sp->GetQualifiedTypeName().GetCString(); 163 } 164 } 165 } 166 167 if (log) 168 { 169 if (name) 170 log->Printf ("SBValue(%p)::GetTypeName () => \"%s\"", value_sp.get(), name); 171 else 172 log->Printf ("SBValue(%p)::GetTypeName () => NULL", value_sp.get()); 173 } 174 175 return name; 176} 177 178size_t 179SBValue::GetByteSize () 180{ 181 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 182 size_t result = 0; 183 184 lldb::ValueObjectSP value_sp(GetSP()); 185 if (value_sp) 186 { 187 // For a dynamic type we might have to run code to determine the type we are going to report, 188 // and we might not have updated the type before we get asked this. So make sure to get the API lock. 189 190 ProcessSP process_sp(value_sp->GetProcessSP()); 191 Process::StopLocker stop_locker; 192 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock())) 193 { 194 if (log) 195 log->Printf ("SBValue(%p)::GetTypeName() => error: process is running", value_sp.get()); 196 } 197 else 198 { 199 TargetSP target_sp(value_sp->GetTargetSP()); 200 if (target_sp) 201 { 202 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 203 result = value_sp->GetByteSize(); 204 } 205 } 206 } 207 208 if (log) 209 log->Printf ("SBValue(%p)::GetByteSize () => %llu", value_sp.get(), (uint64_t)result); 210 211 return result; 212} 213 214bool 215SBValue::IsInScope () 216{ 217 bool result = false; 218 219 lldb::ValueObjectSP value_sp(GetSP()); 220 if (value_sp) 221 { 222 TargetSP target_sp(value_sp->GetTargetSP()); 223 if (target_sp) 224 { 225 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 226 result = value_sp->IsInScope (); 227 } 228 } 229 230 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 231 if (log) 232 log->Printf ("SBValue(%p)::IsInScope () => %i", value_sp.get(), result); 233 234 return result; 235} 236 237const char * 238SBValue::GetValue () 239{ 240 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 241 242 const char *cstr = NULL; 243 lldb::ValueObjectSP value_sp(GetSP()); 244 if (value_sp) 245 { 246 ProcessSP process_sp(value_sp->GetProcessSP()); 247 Process::StopLocker stop_locker; 248 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock())) 249 { 250 if (log) 251 log->Printf ("SBValue(%p)::GetValue() => error: process is running", value_sp.get()); 252 } 253 else 254 { 255 TargetSP target_sp(value_sp->GetTargetSP()); 256 if (target_sp) 257 { 258 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 259 cstr = value_sp->GetValueAsCString (); 260 } 261 } 262 } 263 if (log) 264 { 265 if (cstr) 266 log->Printf ("SBValue(%p)::GetValue() => \"%s\"", value_sp.get(), cstr); 267 else 268 log->Printf ("SBValue(%p)::GetValue() => NULL", value_sp.get()); 269 } 270 271 return cstr; 272} 273 274ValueType 275SBValue::GetValueType () 276{ 277 ValueType result = eValueTypeInvalid; 278 lldb::ValueObjectSP value_sp(GetSP()); 279 if (value_sp) 280 result = value_sp->GetValueType(); 281 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 282 if (log) 283 { 284 switch (result) 285 { 286 case eValueTypeInvalid: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeInvalid", value_sp.get()); break; 287 case eValueTypeVariableGlobal: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableGlobal", value_sp.get()); break; 288 case eValueTypeVariableStatic: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableStatic", value_sp.get()); break; 289 case eValueTypeVariableArgument:log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableArgument", value_sp.get()); break; 290 case eValueTypeVariableLocal: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableLocal", value_sp.get()); break; 291 case eValueTypeRegister: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeRegister", value_sp.get()); break; 292 case eValueTypeRegisterSet: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeRegisterSet", value_sp.get()); break; 293 case eValueTypeConstResult: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeConstResult", value_sp.get()); break; 294 default: log->Printf ("SBValue(%p)::GetValueType () => %i ???", value_sp.get(), result); break; 295 } 296 } 297 return result; 298} 299 300const char * 301SBValue::GetObjectDescription () 302{ 303 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 304 const char *cstr = NULL; 305 lldb::ValueObjectSP value_sp(GetSP()); 306 if (value_sp) 307 { 308 ProcessSP process_sp(value_sp->GetProcessSP()); 309 Process::StopLocker stop_locker; 310 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock())) 311 { 312 if (log) 313 log->Printf ("SBValue(%p)::GetObjectDescription() => error: process is running", value_sp.get()); 314 } 315 else 316 { 317 TargetSP target_sp(value_sp->GetTargetSP()); 318 if (target_sp) 319 { 320 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 321 cstr = value_sp->GetObjectDescription (); 322 } 323 } 324 } 325 if (log) 326 { 327 if (cstr) 328 log->Printf ("SBValue(%p)::GetObjectDescription() => \"%s\"", value_sp.get(), cstr); 329 else 330 log->Printf ("SBValue(%p)::GetObjectDescription() => NULL", value_sp.get()); 331 } 332 return cstr; 333} 334 335SBType 336SBValue::GetType() 337{ 338 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 339 SBType sb_type; 340 lldb::ValueObjectSP value_sp(GetSP()); 341 TypeImplSP type_sp; 342 if (value_sp) 343 { 344 ProcessSP process_sp(value_sp->GetProcessSP()); 345 Process::StopLocker stop_locker; 346 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock())) 347 { 348 if (log) 349 log->Printf ("SBValue(%p)::GetType() => error: process is running", value_sp.get()); 350 } 351 else 352 { 353 TargetSP target_sp(value_sp->GetTargetSP()); 354 if (target_sp) 355 { 356 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 357 type_sp.reset (new TypeImpl(ClangASTType (value_sp->GetClangAST(), value_sp->GetClangType()))); 358 sb_type.SetSP(type_sp); 359 } 360 } 361 } 362 if (log) 363 { 364 if (type_sp) 365 log->Printf ("SBValue(%p)::GetType => SBType(%p)", value_sp.get(), type_sp.get()); 366 else 367 log->Printf ("SBValue(%p)::GetType => NULL", value_sp.get()); 368 } 369 return sb_type; 370} 371 372bool 373SBValue::GetValueDidChange () 374{ 375 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 376 bool result = false; 377 lldb::ValueObjectSP value_sp(GetSP()); 378 if (value_sp) 379 { 380 ProcessSP process_sp(value_sp->GetProcessSP()); 381 Process::StopLocker stop_locker; 382 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock())) 383 { 384 if (log) 385 log->Printf ("SBValue(%p)::GetValueDidChange() => error: process is running", value_sp.get()); 386 } 387 else 388 { 389 TargetSP target_sp(value_sp->GetTargetSP()); 390 if (target_sp) 391 { 392 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 393 result = value_sp->GetValueDidChange (); 394 } 395 } 396 } 397 if (log) 398 log->Printf ("SBValue(%p)::GetValueDidChange() => %i", value_sp.get(), result); 399 400 return result; 401} 402 403#ifndef LLDB_DISABLE_PYTHON 404const char * 405SBValue::GetSummary () 406{ 407 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 408 const char *cstr = NULL; 409 lldb::ValueObjectSP value_sp(GetSP()); 410 if (value_sp) 411 { 412 ProcessSP process_sp(value_sp->GetProcessSP()); 413 Process::StopLocker stop_locker; 414 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock())) 415 { 416 if (log) 417 log->Printf ("SBValue(%p)::GetSummary() => error: process is running", value_sp.get()); 418 } 419 else 420 { 421 TargetSP target_sp(value_sp->GetTargetSP()); 422 if (target_sp) 423 { 424 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 425 cstr = value_sp->GetSummaryAsCString(); 426 } 427 } 428 } 429 if (log) 430 { 431 if (cstr) 432 log->Printf ("SBValue(%p)::GetSummary() => \"%s\"", value_sp.get(), cstr); 433 else 434 log->Printf ("SBValue(%p)::GetSummary() => NULL", value_sp.get()); 435 } 436 return cstr; 437} 438#endif // LLDB_DISABLE_PYTHON 439 440const char * 441SBValue::GetLocation () 442{ 443 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 444 const char *cstr = NULL; 445 lldb::ValueObjectSP value_sp(GetSP()); 446 if (value_sp) 447 { 448 ProcessSP process_sp(value_sp->GetProcessSP()); 449 Process::StopLocker stop_locker; 450 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock())) 451 { 452 if (log) 453 log->Printf ("SBValue(%p)::GetLocation() => error: process is running", value_sp.get()); 454 } 455 else 456 { 457 TargetSP target_sp(value_sp->GetTargetSP()); 458 if (target_sp) 459 { 460 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 461 cstr = value_sp->GetLocationAsCString(); 462 } 463 } 464 } 465 if (log) 466 { 467 if (cstr) 468 log->Printf ("SBValue(%p)::GetLocation() => \"%s\"", value_sp.get(), cstr); 469 else 470 log->Printf ("SBValue(%p)::GetLocation() => NULL", value_sp.get()); 471 } 472 return cstr; 473} 474 475// Deprecated - use the one that takes an lldb::SBError 476bool 477SBValue::SetValueFromCString (const char *value_str) 478{ 479 lldb::SBError dummy; 480 return SetValueFromCString(value_str,dummy); 481} 482 483bool 484SBValue::SetValueFromCString (const char *value_str, lldb::SBError& error) 485{ 486 bool success = false; 487 lldb::ValueObjectSP value_sp(GetSP()); 488 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 489 if (value_sp) 490 { 491 ProcessSP process_sp(value_sp->GetProcessSP()); 492 Process::StopLocker stop_locker; 493 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock())) 494 { 495 if (log) 496 log->Printf ("SBValue(%p)::SetValueFromCString() => error: process is running", value_sp.get()); 497 } 498 else 499 { 500 TargetSP target_sp(value_sp->GetTargetSP()); 501 if (target_sp) 502 { 503 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 504 success = value_sp->SetValueFromCString (value_str,error.ref()); 505 } 506 } 507 } 508 if (log) 509 log->Printf ("SBValue(%p)::SetValueFromCString(\"%s\") => %i", value_sp.get(), value_str, success); 510 511 return success; 512} 513 514lldb::SBTypeFormat 515SBValue::GetTypeFormat () 516{ 517 lldb::SBTypeFormat format; 518 lldb::ValueObjectSP value_sp(GetSP()); 519 if (value_sp) 520 { 521 ProcessSP process_sp(value_sp->GetProcessSP()); 522 Process::StopLocker stop_locker; 523 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock())) 524 { 525 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 526 if (log) 527 log->Printf ("SBValue(%p)::GetTypeFormat() => error: process is running", value_sp.get()); 528 } 529 else 530 { 531 TargetSP target_sp(value_sp->GetTargetSP()); 532 if (target_sp) 533 { 534 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 535 if (value_sp->UpdateValueIfNeeded(true)) 536 { 537 lldb::TypeFormatImplSP format_sp = value_sp->GetValueFormat(); 538 if (format_sp) 539 format.SetSP(format_sp); 540 } 541 } 542 } 543 } 544 return format; 545} 546 547#ifndef LLDB_DISABLE_PYTHON 548lldb::SBTypeSummary 549SBValue::GetTypeSummary () 550{ 551 lldb::SBTypeSummary summary; 552 lldb::ValueObjectSP value_sp(GetSP()); 553 if (value_sp) 554 { 555 ProcessSP process_sp(value_sp->GetProcessSP()); 556 Process::StopLocker stop_locker; 557 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock())) 558 { 559 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 560 if (log) 561 log->Printf ("SBValue(%p)::GetTypeSummary() => error: process is running", value_sp.get()); 562 } 563 else 564 { 565 TargetSP target_sp(value_sp->GetTargetSP()); 566 if (target_sp) 567 { 568 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 569 if (value_sp->UpdateValueIfNeeded(true)) 570 { 571 lldb::TypeSummaryImplSP summary_sp = value_sp->GetSummaryFormat(); 572 if (summary_sp) 573 summary.SetSP(summary_sp); 574 } 575 } 576 } 577 } 578 return summary; 579} 580#endif // LLDB_DISABLE_PYTHON 581 582lldb::SBTypeFilter 583SBValue::GetTypeFilter () 584{ 585 lldb::SBTypeFilter filter; 586 lldb::ValueObjectSP value_sp(GetSP()); 587 if (value_sp) 588 { 589 ProcessSP process_sp(value_sp->GetProcessSP()); 590 Process::StopLocker stop_locker; 591 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock())) 592 { 593 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 594 if (log) 595 log->Printf ("SBValue(%p)::GetTypeFilter() => error: process is running", value_sp.get()); 596 } 597 else 598 { 599 TargetSP target_sp(value_sp->GetTargetSP()); 600 if (target_sp) 601 { 602 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 603 if (value_sp->UpdateValueIfNeeded(true)) 604 { 605 lldb::SyntheticChildrenSP synthetic_sp = value_sp->GetSyntheticChildren(); 606 607 if (synthetic_sp && !synthetic_sp->IsScripted()) 608 { 609 TypeFilterImplSP filter_sp = STD_STATIC_POINTER_CAST(TypeFilterImpl,synthetic_sp); 610 filter.SetSP(filter_sp); 611 } 612 } 613 } 614 } 615 } 616 return filter; 617} 618 619#ifndef LLDB_DISABLE_PYTHON 620lldb::SBTypeSynthetic 621SBValue::GetTypeSynthetic () 622{ 623 lldb::SBTypeSynthetic synthetic; 624 lldb::ValueObjectSP value_sp(GetSP()); 625 if (value_sp) 626 { 627 ProcessSP process_sp(value_sp->GetProcessSP()); 628 Process::StopLocker stop_locker; 629 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock())) 630 { 631 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 632 if (log) 633 log->Printf ("SBValue(%p)::GetTypeSynthetic() => error: process is running", value_sp.get()); 634 } 635 else 636 { 637 TargetSP target_sp(value_sp->GetTargetSP()); 638 if (target_sp) 639 { 640 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 641 if (value_sp->UpdateValueIfNeeded(true)) 642 { 643 lldb::SyntheticChildrenSP children_sp = value_sp->GetSyntheticChildren(); 644 645 if (children_sp && children_sp->IsScripted()) 646 { 647 TypeSyntheticImplSP synth_sp = STD_STATIC_POINTER_CAST(TypeSyntheticImpl,children_sp); 648 synthetic.SetSP(synth_sp); 649 } 650 } 651 } 652 } 653 } 654 return synthetic; 655} 656#endif 657 658lldb::SBValue 659SBValue::CreateChildAtOffset (const char *name, uint32_t offset, SBType type) 660{ 661 lldb::SBValue sb_value; 662 lldb::ValueObjectSP value_sp(GetSP()); 663 lldb::ValueObjectSP new_value_sp; 664 if (value_sp) 665 { 666 ProcessSP process_sp(value_sp->GetProcessSP()); 667 Process::StopLocker stop_locker; 668 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock())) 669 { 670 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 671 if (log) 672 log->Printf ("SBValue(%p)::CreateChildAtOffset() => error: process is running", value_sp.get()); 673 } 674 else 675 { 676 TargetSP target_sp(value_sp->GetTargetSP()); 677 if (target_sp) 678 { 679 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 680 TypeImplSP type_sp (type.GetSP()); 681 if (type.IsValid()) 682 { 683 sb_value = SBValue(value_sp->GetSyntheticChildAtOffset(offset, type_sp->GetClangASTType(), true)); 684 new_value_sp = sb_value.GetSP(); 685 if (new_value_sp) 686 new_value_sp->SetName(ConstString(name)); 687 } 688 } 689 } 690 } 691 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 692 if (log) 693 { 694 if (new_value_sp) 695 log->Printf ("SBValue(%p)::CreateChildAtOffset => \"%s\"", value_sp.get(), new_value_sp->GetName().AsCString()); 696 else 697 log->Printf ("SBValue(%p)::CreateChildAtOffset => NULL", value_sp.get()); 698 } 699 return sb_value; 700} 701 702lldb::SBValue 703SBValue::Cast (SBType type) 704{ 705 lldb::SBValue sb_value; 706 lldb::ValueObjectSP value_sp(GetSP()); 707 TypeImplSP type_sp (type.GetSP()); 708 if (value_sp && type_sp) 709 sb_value.SetSP(value_sp->Cast(type_sp->GetClangASTType())); 710 return sb_value; 711} 712 713lldb::SBValue 714SBValue::CreateValueFromExpression (const char *name, const char* expression) 715{ 716 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 717 lldb::SBValue sb_value; 718 lldb::ValueObjectSP value_sp(GetSP()); 719 lldb::ValueObjectSP new_value_sp; 720 if (value_sp) 721 { 722 ExecutionContext exe_ctx (value_sp->GetExecutionContextRef()); 723 ProcessSP process_sp(exe_ctx.GetProcessSP()); 724 Process::StopLocker stop_locker; 725 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock())) 726 { 727 if (log) 728 log->Printf ("SBValue(%p)::CreateValueFromExpression() => error: process is running", value_sp.get()); 729 } 730 else 731 { 732 Target* target = exe_ctx.GetTargetPtr(); 733 if (target) 734 { 735 Target::EvaluateExpressionOptions options; 736 options.SetKeepInMemory(true); 737 target->EvaluateExpression (expression, 738 exe_ctx.GetFramePtr(), 739 new_value_sp, 740 options); 741 if (new_value_sp) 742 { 743 new_value_sp->SetName(ConstString(name)); 744 sb_value.SetSP(new_value_sp); 745 } 746 } 747 } 748 } 749 if (log) 750 { 751 if (new_value_sp) 752 log->Printf ("SBValue(%p)::CreateValueFromExpression(name=\"%s\", expression=\"%s\") => SBValue (%p)", 753 value_sp.get(), 754 name, 755 expression, 756 new_value_sp.get()); 757 else 758 log->Printf ("SBValue(%p)::CreateValueFromExpression(name=\"%s\", expression=\"%s\") => NULL", 759 value_sp.get(), 760 name, 761 expression); 762 } 763 return sb_value; 764} 765 766lldb::SBValue 767SBValue::CreateValueFromAddress(const char* name, lldb::addr_t address, SBType sb_type) 768{ 769 lldb::SBValue sb_value; 770 lldb::ValueObjectSP value_sp(GetSP()); 771 lldb::ValueObjectSP new_value_sp; 772 lldb::TypeImplSP type_impl_sp (sb_type.GetSP()); 773 if (value_sp && type_impl_sp) 774 { 775 ClangASTType pointee_ast_type(type_impl_sp->GetASTContext(), type_impl_sp->GetClangASTType().GetPointerType ()); 776 lldb::TypeImplSP pointee_type_impl_sp (new TypeImpl(pointee_ast_type)); 777 if (pointee_type_impl_sp) 778 { 779 780 lldb::DataBufferSP buffer(new lldb_private::DataBufferHeap(&address,sizeof(lldb::addr_t))); 781 782 ExecutionContext exe_ctx (value_sp->GetExecutionContextRef()); 783 ValueObjectSP ptr_result_valobj_sp(ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(), 784 pointee_type_impl_sp->GetASTContext(), 785 pointee_type_impl_sp->GetOpaqueQualType(), 786 ConstString(name), 787 buffer, 788 lldb::endian::InlHostByteOrder(), 789 exe_ctx.GetAddressByteSize())); 790 791 if (ptr_result_valobj_sp) 792 { 793 ptr_result_valobj_sp->GetValue().SetValueType(Value::eValueTypeLoadAddress); 794 Error err; 795 new_value_sp = ptr_result_valobj_sp->Dereference(err); 796 if (new_value_sp) 797 new_value_sp->SetName(ConstString(name)); 798 } 799 sb_value.SetSP(new_value_sp); 800 } 801 } 802 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 803 if (log) 804 { 805 if (new_value_sp) 806 log->Printf ("SBValue(%p)::CreateValueFromAddress => \"%s\"", value_sp.get(), new_value_sp->GetName().AsCString()); 807 else 808 log->Printf ("SBValue(%p)::CreateValueFromAddress => NULL", value_sp.get()); 809 } 810 return sb_value; 811} 812 813lldb::SBValue 814SBValue::CreateValueFromData (const char* name, SBData data, SBType type) 815{ 816 lldb::SBValue sb_value; 817 lldb::ValueObjectSP new_value_sp; 818 lldb::ValueObjectSP value_sp(GetSP()); 819 if (value_sp) 820 { 821 ExecutionContext exe_ctx (value_sp->GetExecutionContextRef()); 822 823 new_value_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(), 824 type.m_opaque_sp->GetASTContext() , 825 type.m_opaque_sp->GetOpaqueQualType(), 826 ConstString(name), 827 *data.m_opaque_sp, 828 LLDB_INVALID_ADDRESS); 829 new_value_sp->SetAddressTypeOfChildren(eAddressTypeLoad); 830 sb_value.SetSP(new_value_sp); 831 } 832 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 833 if (log) 834 { 835 if (new_value_sp) 836 log->Printf ("SBValue(%p)::CreateValueFromData => \"%s\"", value_sp.get(), new_value_sp->GetName().AsCString()); 837 else 838 log->Printf ("SBValue(%p)::CreateValueFromData => NULL", value_sp.get()); 839 } 840 return sb_value; 841} 842 843SBValue 844SBValue::GetChildAtIndex (uint32_t idx) 845{ 846 const bool can_create_synthetic = false; 847 lldb::DynamicValueType use_dynamic = eNoDynamicValues; 848 lldb::ValueObjectSP value_sp(GetSP()); 849 if (value_sp) 850 { 851 TargetSP target_sp(value_sp->GetTargetSP()); 852 if (target_sp) 853 use_dynamic = target_sp->GetPreferDynamicValue(); 854 } 855 return GetChildAtIndex (idx, use_dynamic, can_create_synthetic); 856} 857 858SBValue 859SBValue::GetChildAtIndex (uint32_t idx, lldb::DynamicValueType use_dynamic, bool can_create_synthetic) 860{ 861 lldb::ValueObjectSP child_sp; 862 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 863 864 lldb::ValueObjectSP value_sp(GetSP()); 865 if (value_sp) 866 { 867 ProcessSP process_sp(value_sp->GetProcessSP()); 868 Process::StopLocker stop_locker; 869 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock())) 870 { 871 if (log) 872 log->Printf ("SBValue(%p)::GetChildAtIndex() => error: process is running", value_sp.get()); 873 } 874 else 875 { 876 TargetSP target_sp(value_sp->GetTargetSP()); 877 if (target_sp) 878 { 879 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 880 const bool can_create = true; 881 child_sp = value_sp->GetChildAtIndex (idx, can_create); 882 if (can_create_synthetic && !child_sp) 883 { 884 if (value_sp->IsPointerType()) 885 { 886 child_sp = value_sp->GetSyntheticArrayMemberFromPointer(idx, can_create); 887 } 888 else if (value_sp->IsArrayType()) 889 { 890 child_sp = value_sp->GetSyntheticArrayMemberFromArray(idx, can_create); 891 } 892 } 893 894 if (child_sp) 895 { 896 if (use_dynamic != lldb::eNoDynamicValues) 897 { 898 lldb::ValueObjectSP dynamic_sp(child_sp->GetDynamicValue (use_dynamic)); 899 if (dynamic_sp) 900 child_sp = dynamic_sp; 901 } 902 } 903 } 904 } 905 } 906 907 SBValue sb_value (child_sp); 908 if (log) 909 log->Printf ("SBValue(%p)::GetChildAtIndex (%u) => SBValue(%p)", value_sp.get(), idx, value_sp.get()); 910 911 return sb_value; 912} 913 914uint32_t 915SBValue::GetIndexOfChildWithName (const char *name) 916{ 917 uint32_t idx = UINT32_MAX; 918 lldb::ValueObjectSP value_sp(GetSP()); 919 if (value_sp) 920 { 921 TargetSP target_sp(value_sp->GetTargetSP()); 922 if (target_sp) 923 { 924 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 925 926 idx = value_sp->GetIndexOfChildWithName (ConstString(name)); 927 } 928 } 929 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 930 if (log) 931 { 932 if (idx == UINT32_MAX) 933 log->Printf ("SBValue(%p)::GetIndexOfChildWithName (name=\"%s\") => NOT FOUND", value_sp.get(), name); 934 else 935 log->Printf ("SBValue(%p)::GetIndexOfChildWithName (name=\"%s\") => %u", value_sp.get(), name, idx); 936 } 937 return idx; 938} 939 940SBValue 941SBValue::GetChildMemberWithName (const char *name) 942{ 943 lldb::ValueObjectSP value_sp(GetSP()); 944 if (value_sp) 945 { 946 lldb::DynamicValueType use_dynamic_value = eNoDynamicValues; 947 TargetSP target_sp(value_sp->GetTargetSP()); 948 if (target_sp) 949 { 950 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 951 use_dynamic_value = target_sp->GetPreferDynamicValue(); 952 } 953 return GetChildMemberWithName (name, use_dynamic_value); 954 } 955 return SBValue(); 956} 957 958SBValue 959SBValue::GetChildMemberWithName (const char *name, lldb::DynamicValueType use_dynamic_value) 960{ 961 lldb::ValueObjectSP child_sp; 962 const ConstString str_name (name); 963 964 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 965 966 lldb::ValueObjectSP value_sp(GetSP()); 967 if (value_sp) 968 { 969 ProcessSP process_sp(value_sp->GetProcessSP()); 970 Process::StopLocker stop_locker; 971 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock())) 972 { 973 if (log) 974 log->Printf ("SBValue(%p)::GetChildMemberWithName() => error: process is running", value_sp.get()); 975 } 976 else 977 { 978 TargetSP target_sp(value_sp->GetTargetSP()); 979 if (target_sp) 980 { 981 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 982 child_sp = value_sp->GetChildMemberWithName (str_name, true); 983 if (use_dynamic_value != lldb::eNoDynamicValues) 984 { 985 if (child_sp) 986 { 987 lldb::ValueObjectSP dynamic_sp = child_sp->GetDynamicValue (use_dynamic_value); 988 if (dynamic_sp) 989 child_sp = dynamic_sp; 990 } 991 } 992 } 993 } 994 } 995 996 SBValue sb_value (child_sp); 997 998 if (log) 999 log->Printf ("SBValue(%p)::GetChildMemberWithName (name=\"%s\") => SBValue(%p)", value_sp.get(), name, value_sp.get()); 1000 1001 return sb_value; 1002} 1003 1004lldb::SBValue 1005SBValue::GetDynamicValue (lldb::DynamicValueType use_dynamic) 1006{ 1007 lldb::ValueObjectSP value_sp(GetSP()); 1008 if (value_sp) 1009 { 1010 ProcessSP process_sp(value_sp->GetProcessSP()); 1011 Process::StopLocker stop_locker; 1012 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock())) 1013 { 1014 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1015 if (log) 1016 log->Printf ("SBValue(%p)::GetDynamicValue() => error: process is running", value_sp.get()); 1017 } 1018 else 1019 { 1020 TargetSP target_sp(value_sp->GetTargetSP()); 1021 if (target_sp) 1022 { 1023 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 1024 return SBValue (value_sp->GetDynamicValue(use_dynamic)); 1025 } 1026 } 1027 } 1028 1029 return SBValue(); 1030} 1031 1032lldb::SBValue 1033SBValue::GetStaticValue () 1034{ 1035 lldb::ValueObjectSP value_sp(GetSP()); 1036 if (value_sp) 1037 { 1038 TargetSP target_sp(value_sp->GetTargetSP()); 1039 if (target_sp) 1040 { 1041 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 1042 return SBValue(value_sp->GetStaticValue()); 1043 } 1044 } 1045 1046 return SBValue(); 1047} 1048 1049lldb::SBValue 1050SBValue::GetNonSyntheticValue () 1051{ 1052 SBValue sb_value; 1053 lldb::ValueObjectSP value_sp(GetSP()); 1054 if (value_sp) 1055 { 1056 if (value_sp->IsSynthetic()) 1057 { 1058 TargetSP target_sp(value_sp->GetTargetSP()); 1059 if (target_sp) 1060 { 1061 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 1062 // deliberately breaking the rules here to optimize the case where we DO NOT want 1063 // the synthetic value to be returned to the user - if we did not do this, we would have to tell 1064 // the target to suppress the synthetic value, and then return the flag to its original value 1065 if (value_sp->GetNonSyntheticValue()) 1066 sb_value.m_opaque_sp = value_sp->GetNonSyntheticValue(); 1067 } 1068 } 1069 } 1070 return sb_value; 1071} 1072 1073bool 1074SBValue::IsDynamic() 1075{ 1076 lldb::ValueObjectSP value_sp(GetSP()); 1077 if (value_sp) 1078 { 1079 TargetSP target_sp(value_sp->GetTargetSP()); 1080 if (target_sp) 1081 { 1082 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 1083 return value_sp->IsDynamic(); 1084 } 1085 } 1086 return false; 1087} 1088 1089lldb::SBValue 1090SBValue::GetValueForExpressionPath(const char* expr_path) 1091{ 1092 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1093 lldb::ValueObjectSP child_sp; 1094 lldb::ValueObjectSP value_sp(GetSP()); 1095 if (value_sp) 1096 { 1097 ProcessSP process_sp(value_sp->GetProcessSP()); 1098 Process::StopLocker stop_locker; 1099 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock())) 1100 { 1101 if (log) 1102 log->Printf ("SBValue(%p)::GetValueForExpressionPath() => error: process is running", value_sp.get()); 1103 } 1104 else 1105 { 1106 TargetSP target_sp(value_sp->GetTargetSP()); 1107 if (target_sp) 1108 { 1109 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 1110 // using default values for all the fancy options, just do it if you can 1111 child_sp = value_sp->GetValueForExpressionPath(expr_path); 1112 } 1113 } 1114 } 1115 1116 SBValue sb_value (child_sp); 1117 1118 if (log) 1119 log->Printf ("SBValue(%p)::GetValueForExpressionPath (expr_path=\"%s\") => SBValue(%p)", value_sp.get(), expr_path, value_sp.get()); 1120 1121 return sb_value; 1122} 1123 1124int64_t 1125SBValue::GetValueAsSigned(SBError& error, int64_t fail_value) 1126{ 1127 error.Clear(); 1128 lldb::ValueObjectSP value_sp(GetSP()); 1129 if (value_sp) 1130 { 1131 ProcessSP process_sp(value_sp->GetProcessSP()); 1132 Process::StopLocker stop_locker; 1133 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock())) 1134 { 1135 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1136 if (log) 1137 log->Printf ("SBValue(%p)::GetValueAsSigned() => error: process is running", value_sp.get()); 1138 error.SetErrorString("process is running"); 1139 } 1140 else 1141 { 1142 TargetSP target_sp(value_sp->GetTargetSP()); 1143 if (target_sp) 1144 { 1145 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 1146 Scalar scalar; 1147 if (value_sp->ResolveValue (scalar)) 1148 return scalar.GetRawBits64(fail_value); 1149 else 1150 error.SetErrorString("could not get value"); 1151 } 1152 else 1153 error.SetErrorString("could not get target"); 1154 } 1155 } 1156 error.SetErrorString("invalid SBValue"); 1157 return fail_value; 1158} 1159 1160uint64_t 1161SBValue::GetValueAsUnsigned(SBError& error, uint64_t fail_value) 1162{ 1163 error.Clear(); 1164 lldb::ValueObjectSP value_sp(GetSP()); 1165 if (value_sp) 1166 { 1167 ProcessSP process_sp(value_sp->GetProcessSP()); 1168 Process::StopLocker stop_locker; 1169 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock())) 1170 { 1171 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1172 if (log) 1173 log->Printf ("SBValue(%p)::GetValueAsUnsigned() => error: process is running", value_sp.get()); 1174 error.SetErrorString("process is running"); 1175 } 1176 else 1177 { 1178 TargetSP target_sp(value_sp->GetTargetSP()); 1179 if (target_sp) 1180 { 1181 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 1182 Scalar scalar; 1183 if (value_sp->ResolveValue (scalar)) 1184 return scalar.GetRawBits64(fail_value); 1185 else 1186 error.SetErrorString("could not get value"); 1187 } 1188 else 1189 error.SetErrorString("could not get target"); 1190 } 1191 } 1192 error.SetErrorString("invalid SBValue"); 1193 return fail_value; 1194} 1195 1196int64_t 1197SBValue::GetValueAsSigned(int64_t fail_value) 1198{ 1199 lldb::ValueObjectSP value_sp(GetSP()); 1200 if (value_sp) 1201 { 1202 ProcessSP process_sp(value_sp->GetProcessSP()); 1203 Process::StopLocker stop_locker; 1204 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock())) 1205 { 1206 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1207 if (log) 1208 log->Printf ("SBValue(%p)::GetValueAsSigned() => error: process is running", value_sp.get()); 1209 } 1210 else 1211 { 1212 TargetSP target_sp(value_sp->GetTargetSP()); 1213 if (target_sp) 1214 { 1215 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 1216 Scalar scalar; 1217 if (value_sp->ResolveValue (scalar)) 1218 return scalar.GetRawBits64(fail_value); 1219 } 1220 } 1221 } 1222 return fail_value; 1223} 1224 1225uint64_t 1226SBValue::GetValueAsUnsigned(uint64_t fail_value) 1227{ 1228 lldb::ValueObjectSP value_sp(GetSP()); 1229 if (value_sp) 1230 { 1231 ProcessSP process_sp(value_sp->GetProcessSP()); 1232 Process::StopLocker stop_locker; 1233 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock())) 1234 { 1235 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1236 if (log) 1237 log->Printf ("SBValue(%p)::GetValueAsUnsigned() => error: process is running", value_sp.get()); 1238 } 1239 else 1240 { 1241 TargetSP target_sp(value_sp->GetTargetSP()); 1242 if (target_sp) 1243 { 1244 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 1245 Scalar scalar; 1246 if (value_sp->ResolveValue (scalar)) 1247 return scalar.GetRawBits64(fail_value); 1248 } 1249 } 1250 } 1251 return fail_value; 1252} 1253 1254uint32_t 1255SBValue::GetNumChildren () 1256{ 1257 uint32_t num_children = 0; 1258 1259 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1260 lldb::ValueObjectSP value_sp(GetSP()); 1261 if (value_sp) 1262 { 1263 ProcessSP process_sp(value_sp->GetProcessSP()); 1264 Process::StopLocker stop_locker; 1265 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock())) 1266 { 1267 if (log) 1268 log->Printf ("SBValue(%p)::GetNumChildren() => error: process is running", value_sp.get()); 1269 } 1270 else 1271 { 1272 TargetSP target_sp(value_sp->GetTargetSP()); 1273 if (target_sp) 1274 { 1275 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 1276 1277 num_children = value_sp->GetNumChildren(); 1278 } 1279 } 1280 } 1281 1282 if (log) 1283 log->Printf ("SBValue(%p)::GetNumChildren () => %u", value_sp.get(), num_children); 1284 1285 return num_children; 1286} 1287 1288 1289SBValue 1290SBValue::Dereference () 1291{ 1292 SBValue sb_value; 1293 lldb::ValueObjectSP value_sp(GetSP()); 1294 if (value_sp) 1295 { 1296 TargetSP target_sp(value_sp->GetTargetSP()); 1297 if (target_sp) 1298 { 1299 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 1300 1301 Error error; 1302 sb_value = value_sp->Dereference (error); 1303 } 1304 } 1305 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1306 if (log) 1307 log->Printf ("SBValue(%p)::Dereference () => SBValue(%p)", value_sp.get(), value_sp.get()); 1308 1309 return sb_value; 1310} 1311 1312bool 1313SBValue::TypeIsPointerType () 1314{ 1315 bool is_ptr_type = false; 1316 1317 lldb::ValueObjectSP value_sp(GetSP()); 1318 if (value_sp) 1319 { 1320 TargetSP target_sp(value_sp->GetTargetSP()); 1321 if (target_sp) 1322 { 1323 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 1324 1325 is_ptr_type = value_sp->IsPointerType(); 1326 } 1327 } 1328 1329 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1330 if (log) 1331 log->Printf ("SBValue(%p)::TypeIsPointerType () => %i", value_sp.get(), is_ptr_type); 1332 1333 1334 return is_ptr_type; 1335} 1336 1337void * 1338SBValue::GetOpaqueType() 1339{ 1340 lldb::ValueObjectSP value_sp(GetSP()); 1341 if (value_sp) 1342 { 1343 TargetSP target_sp(value_sp->GetTargetSP()); 1344 if (target_sp) 1345 { 1346 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 1347 1348 return value_sp->GetClangType(); 1349 } 1350 } 1351 return NULL; 1352} 1353 1354lldb::SBTarget 1355SBValue::GetTarget() 1356{ 1357 SBTarget sb_target; 1358 TargetSP target_sp; 1359 lldb::ValueObjectSP value_sp(GetSP()); 1360 if (value_sp) 1361 { 1362 target_sp = value_sp->GetTargetSP(); 1363 sb_target.SetSP (target_sp); 1364 } 1365 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1366 if (log) 1367 { 1368 if (target_sp.get() == NULL) 1369 log->Printf ("SBValue(%p)::GetTarget () => NULL", value_sp.get()); 1370 else 1371 log->Printf ("SBValue(%p)::GetTarget () => %p", value_sp.get(), target_sp.get()); 1372 } 1373 return sb_target; 1374} 1375 1376lldb::SBProcess 1377SBValue::GetProcess() 1378{ 1379 SBProcess sb_process; 1380 ProcessSP process_sp; 1381 lldb::ValueObjectSP value_sp(GetSP()); 1382 if (value_sp) 1383 { 1384 process_sp = value_sp->GetProcessSP(); 1385 if (process_sp) 1386 sb_process.SetSP (process_sp); 1387 } 1388 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1389 if (log) 1390 { 1391 if (process_sp.get() == NULL) 1392 log->Printf ("SBValue(%p)::GetProcess () => NULL", value_sp.get()); 1393 else 1394 log->Printf ("SBValue(%p)::GetProcess () => %p", value_sp.get(), process_sp.get()); 1395 } 1396 return sb_process; 1397} 1398 1399lldb::SBThread 1400SBValue::GetThread() 1401{ 1402 SBThread sb_thread; 1403 ThreadSP thread_sp; 1404 lldb::ValueObjectSP value_sp(GetSP()); 1405 if (value_sp) 1406 { 1407 thread_sp = value_sp->GetThreadSP(); 1408 sb_thread.SetThread(thread_sp); 1409 } 1410 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1411 if (log) 1412 { 1413 if (thread_sp.get() == NULL) 1414 log->Printf ("SBValue(%p)::GetThread () => NULL", value_sp.get()); 1415 else 1416 log->Printf ("SBValue(%p)::GetThread () => %p", value_sp.get(), thread_sp.get()); 1417 } 1418 return sb_thread; 1419} 1420 1421lldb::SBFrame 1422SBValue::GetFrame() 1423{ 1424 SBFrame sb_frame; 1425 StackFrameSP frame_sp; 1426 lldb::ValueObjectSP value_sp(GetSP()); 1427 if (value_sp) 1428 { 1429 frame_sp = value_sp->GetFrameSP(); 1430 sb_frame.SetFrameSP (frame_sp); 1431 } 1432 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1433 if (log) 1434 { 1435 if (frame_sp.get() == NULL) 1436 log->Printf ("SBValue(%p)::GetFrame () => NULL", value_sp.get()); 1437 else 1438 log->Printf ("SBValue(%p)::GetFrame () => %p", value_sp.get(), frame_sp.get()); 1439 } 1440 return sb_frame; 1441} 1442 1443 1444lldb::ValueObjectSP 1445SBValue::GetSP () const 1446{ 1447 return m_opaque_sp; 1448} 1449 1450void 1451SBValue::SetSP (const lldb::ValueObjectSP &sp) 1452{ 1453 m_opaque_sp = sp; 1454 if (IsValid() && m_opaque_sp->HasSyntheticValue()) 1455 m_opaque_sp = m_opaque_sp->GetSyntheticValue(); 1456} 1457 1458 1459bool 1460SBValue::GetExpressionPath (SBStream &description) 1461{ 1462 lldb::ValueObjectSP value_sp(GetSP()); 1463 if (value_sp) 1464 { 1465 value_sp->GetExpressionPath (description.ref(), false); 1466 return true; 1467 } 1468 return false; 1469} 1470 1471bool 1472SBValue::GetExpressionPath (SBStream &description, bool qualify_cxx_base_classes) 1473{ 1474 lldb::ValueObjectSP value_sp(GetSP()); 1475 if (value_sp) 1476 { 1477 value_sp->GetExpressionPath (description.ref(), qualify_cxx_base_classes); 1478 return true; 1479 } 1480 return false; 1481} 1482 1483bool 1484SBValue::GetDescription (SBStream &description) 1485{ 1486 Stream &strm = description.ref(); 1487 1488 lldb::ValueObjectSP value_sp(GetSP()); 1489 if (value_sp) 1490 { 1491 ProcessSP process_sp(value_sp->GetProcessSP()); 1492 Process::StopLocker stop_locker; 1493 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock())) 1494 { 1495 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1496 if (log) 1497 log->Printf ("SBValue(%p)::GetDescription() => error: process is running", value_sp.get()); 1498 } 1499 else 1500 { 1501 ValueObject::DumpValueObject (strm, value_sp.get()); 1502 } 1503 } 1504 else 1505 strm.PutCString ("No value"); 1506 1507 return true; 1508} 1509 1510lldb::Format 1511SBValue::GetFormat () 1512{ 1513 lldb::ValueObjectSP value_sp(GetSP()); 1514 if (value_sp) 1515 return value_sp->GetFormat(); 1516 return eFormatDefault; 1517} 1518 1519void 1520SBValue::SetFormat (lldb::Format format) 1521{ 1522 lldb::ValueObjectSP value_sp(GetSP()); 1523 if (value_sp) 1524 value_sp->SetFormat(format); 1525} 1526 1527lldb::SBValue 1528SBValue::AddressOf() 1529{ 1530 SBValue sb_value; 1531 lldb::ValueObjectSP value_sp(GetSP()); 1532 if (value_sp) 1533 { 1534 TargetSP target_sp (value_sp->GetTargetSP()); 1535 if (target_sp) 1536 { 1537 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 1538 Error error; 1539 sb_value = value_sp->AddressOf (error); 1540 } 1541 } 1542 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1543 if (log) 1544 log->Printf ("SBValue(%p)::AddressOf () => SBValue(%p)", value_sp.get(), value_sp.get()); 1545 1546 return sb_value; 1547} 1548 1549lldb::addr_t 1550SBValue::GetLoadAddress() 1551{ 1552 lldb::addr_t value = LLDB_INVALID_ADDRESS; 1553 lldb::ValueObjectSP value_sp(GetSP()); 1554 if (value_sp) 1555 { 1556 TargetSP target_sp (value_sp->GetTargetSP()); 1557 if (target_sp) 1558 { 1559 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 1560 const bool scalar_is_load_address = true; 1561 AddressType addr_type; 1562 value = value_sp->GetAddressOf(scalar_is_load_address, &addr_type); 1563 if (addr_type == eAddressTypeFile) 1564 { 1565 ModuleSP module_sp (value_sp->GetModule()); 1566 if (!module_sp) 1567 value = LLDB_INVALID_ADDRESS; 1568 else 1569 { 1570 Address addr; 1571 module_sp->ResolveFileAddress(value, addr); 1572 value = addr.GetLoadAddress(target_sp.get()); 1573 } 1574 } 1575 else if (addr_type == eAddressTypeHost || addr_type == eAddressTypeInvalid) 1576 value = LLDB_INVALID_ADDRESS; 1577 } 1578 } 1579 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1580 if (log) 1581 log->Printf ("SBValue(%p)::GetLoadAddress () => (%llu)", value_sp.get(), value); 1582 1583 return value; 1584} 1585 1586lldb::SBAddress 1587SBValue::GetAddress() 1588{ 1589 Address addr; 1590 lldb::ValueObjectSP value_sp(GetSP()); 1591 if (value_sp) 1592 { 1593 TargetSP target_sp (value_sp->GetTargetSP()); 1594 if (target_sp) 1595 { 1596 lldb::addr_t value = LLDB_INVALID_ADDRESS; 1597 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 1598 const bool scalar_is_load_address = true; 1599 AddressType addr_type; 1600 value = value_sp->GetAddressOf(scalar_is_load_address, &addr_type); 1601 if (addr_type == eAddressTypeFile) 1602 { 1603 ModuleSP module_sp (value_sp->GetModule()); 1604 if (module_sp) 1605 module_sp->ResolveFileAddress(value, addr); 1606 } 1607 else if (addr_type == eAddressTypeLoad) 1608 { 1609 // no need to check the return value on this.. if it can actually do the resolve 1610 // addr will be in the form (section,offset), otherwise it will simply be returned 1611 // as (NULL, value) 1612 addr.SetLoadAddress(value, target_sp.get()); 1613 } 1614 } 1615 } 1616 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1617 if (log) 1618 log->Printf ("SBValue(%p)::GetAddress () => (%s,%llu)", value_sp.get(), (addr.GetSection() ? addr.GetSection()->GetName().GetCString() : "NULL"), addr.GetOffset()); 1619 return SBAddress(new Address(addr)); 1620} 1621 1622lldb::SBData 1623SBValue::GetPointeeData (uint32_t item_idx, 1624 uint32_t item_count) 1625{ 1626 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1627 lldb::SBData sb_data; 1628 lldb::ValueObjectSP value_sp(GetSP()); 1629 if (value_sp) 1630 { 1631 ProcessSP process_sp(value_sp->GetProcessSP()); 1632 Process::StopLocker stop_locker; 1633 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock())) 1634 { 1635 if (log) 1636 log->Printf ("SBValue(%p)::GetPointeeData() => error: process is running", value_sp.get()); 1637 } 1638 else 1639 { 1640 TargetSP target_sp (value_sp->GetTargetSP()); 1641 if (target_sp) 1642 { 1643 DataExtractorSP data_sp(new DataExtractor()); 1644 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 1645 value_sp->GetPointeeData(*data_sp, item_idx, item_count); 1646 if (data_sp->GetByteSize() > 0) 1647 *sb_data = data_sp; 1648 } 1649 } 1650 } 1651 if (log) 1652 log->Printf ("SBValue(%p)::GetPointeeData (%d, %d) => SBData(%p)", 1653 value_sp.get(), 1654 item_idx, 1655 item_count, 1656 sb_data.get()); 1657 1658 return sb_data; 1659} 1660 1661lldb::SBData 1662SBValue::GetData () 1663{ 1664 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1665 lldb::SBData sb_data; 1666 lldb::ValueObjectSP value_sp(GetSP()); 1667 if (value_sp) 1668 { 1669 ProcessSP process_sp(value_sp->GetProcessSP()); 1670 Process::StopLocker stop_locker; 1671 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock())) 1672 { 1673 if (log) 1674 log->Printf ("SBValue(%p)::GetData() => error: process is running", value_sp.get()); 1675 } 1676 else 1677 { 1678 TargetSP target_sp (value_sp->GetTargetSP()); 1679 if (target_sp) 1680 { 1681 Mutex::Locker api_locker (target_sp->GetAPIMutex()); 1682 DataExtractorSP data_sp(new DataExtractor()); 1683 value_sp->GetData(*data_sp); 1684 if (data_sp->GetByteSize() > 0) 1685 *sb_data = data_sp; 1686 } 1687 } 1688 } 1689 if (log) 1690 log->Printf ("SBValue(%p)::GetData () => SBData(%p)", 1691 value_sp.get(), 1692 sb_data.get()); 1693 1694 return sb_data; 1695} 1696 1697lldb::SBWatchpoint 1698SBValue::Watch (bool resolve_location, bool read, bool write, SBError &error) 1699{ 1700 SBWatchpoint sb_watchpoint; 1701 1702 // If the SBValue is not valid, there's no point in even trying to watch it. 1703 lldb::ValueObjectSP value_sp(GetSP()); 1704 TargetSP target_sp (GetTarget().GetSP()); 1705 if (value_sp && target_sp) 1706 { 1707 // Can't watch this if the process is running 1708 ProcessSP process_sp(value_sp->GetProcessSP()); 1709 Process::StopLocker stop_locker; 1710 if (process_sp && !stop_locker.TryLock(&process_sp->GetRunLock())) 1711 { 1712 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1713 if (log) 1714 log->Printf ("SBValue(%p)::Watch() => error: process is running", value_sp.get()); 1715 return sb_watchpoint; 1716 } 1717 1718 // Read and Write cannot both be false. 1719 if (!read && !write) 1720 return sb_watchpoint; 1721 1722 // If the value is not in scope, don't try and watch and invalid value 1723 if (!IsInScope()) 1724 return sb_watchpoint; 1725 1726 addr_t addr = GetLoadAddress(); 1727 if (addr == LLDB_INVALID_ADDRESS) 1728 return sb_watchpoint; 1729 size_t byte_size = GetByteSize(); 1730 if (byte_size == 0) 1731 return sb_watchpoint; 1732 1733 uint32_t watch_type = 0; 1734 if (read) 1735 watch_type |= LLDB_WATCH_TYPE_READ; 1736 if (write) 1737 watch_type |= LLDB_WATCH_TYPE_WRITE; 1738 1739 Error rc; 1740 WatchpointSP watchpoint_sp = target_sp->CreateWatchpoint(addr, byte_size, watch_type, rc); 1741 error.SetError(rc); 1742 1743 if (watchpoint_sp) 1744 { 1745 sb_watchpoint.SetSP (watchpoint_sp); 1746 Declaration decl; 1747 if (value_sp->GetDeclaration (decl)) 1748 { 1749 if (decl.GetFile()) 1750 { 1751 StreamString ss; 1752 // True to show fullpath for declaration file. 1753 decl.DumpStopContext(&ss, true); 1754 watchpoint_sp->SetDeclInfo(ss.GetString()); 1755 } 1756 } 1757 } 1758 } 1759 return sb_watchpoint; 1760} 1761 1762// FIXME: Remove this method impl (as well as the decl in .h) once it is no longer needed. 1763// Backward compatibility fix in the interim. 1764lldb::SBWatchpoint 1765SBValue::Watch (bool resolve_location, bool read, bool write) 1766{ 1767 SBError error; 1768 return Watch(resolve_location, read, write, error); 1769} 1770 1771lldb::SBWatchpoint 1772SBValue::WatchPointee (bool resolve_location, bool read, bool write, SBError &error) 1773{ 1774 SBWatchpoint sb_watchpoint; 1775 if (IsInScope() && GetType().IsPointerType()) 1776 sb_watchpoint = Dereference().Watch (resolve_location, read, write, error); 1777 return sb_watchpoint; 1778} 1779 1780