blob: daaeea089ca9015e00d08d18d82b90c688b38dfd [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- 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
Eli Friedman7a62c8b2010-06-09 07:44:37 +000010#include "lldb/API/SBValue.h"
Caroline Tice98f930f2010-09-20 05:20:02 +000011#include "lldb/API/SBStream.h"
Chris Lattner24943d22010-06-08 16:52:24 +000012
Johnny Chenecd4feb2011-10-14 00:42:25 +000013#include "lldb/Breakpoint/Watchpoint.h"
Chris Lattner24943d22010-06-08 16:52:24 +000014#include "lldb/Core/DataExtractor.h"
Caroline Tice7826c882010-10-26 03:11:13 +000015#include "lldb/Core/Log.h"
Chris Lattner24943d22010-06-08 16:52:24 +000016#include "lldb/Core/Module.h"
Greg Clayton0fb0bcc2011-08-03 22:57:10 +000017#include "lldb/Core/Scalar.h"
Chris Lattner24943d22010-06-08 16:52:24 +000018#include "lldb/Core/Stream.h"
19#include "lldb/Core/StreamFile.h"
20#include "lldb/Core/Value.h"
21#include "lldb/Core/ValueObject.h"
Enrico Granata979e20d2011-07-29 19:53:35 +000022#include "lldb/Core/ValueObjectConstResult.h"
Chris Lattner24943d22010-06-08 16:52:24 +000023#include "lldb/Symbol/Block.h"
24#include "lldb/Symbol/ObjectFile.h"
25#include "lldb/Symbol/Variable.h"
Johnny Chenecd4feb2011-10-14 00:42:25 +000026#include "lldb/Symbol/VariableList.h"
Chris Lattner24943d22010-06-08 16:52:24 +000027#include "lldb/Target/ExecutionContext.h"
28#include "lldb/Target/Process.h"
29#include "lldb/Target/StackFrame.h"
Greg Claytonbdcda462010-12-20 20:49:23 +000030#include "lldb/Target/Target.h"
Chris Lattner24943d22010-06-08 16:52:24 +000031#include "lldb/Target/Thread.h"
32
Eli Friedman7a62c8b2010-06-09 07:44:37 +000033#include "lldb/API/SBProcess.h"
34#include "lldb/API/SBTarget.h"
35#include "lldb/API/SBThread.h"
36#include "lldb/API/SBFrame.h"
37#include "lldb/API/SBDebugger.h"
Chris Lattner24943d22010-06-08 16:52:24 +000038
39using namespace lldb;
40using namespace lldb_private;
41
42SBValue::SBValue () :
Greg Clayton63094e02010-06-23 01:19:29 +000043 m_opaque_sp ()
Chris Lattner24943d22010-06-08 16:52:24 +000044{
45}
46
47SBValue::SBValue (const lldb::ValueObjectSP &value_sp) :
Greg Clayton63094e02010-06-23 01:19:29 +000048 m_opaque_sp (value_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000049{
50}
51
Greg Clayton538eb822010-11-05 23:17:00 +000052SBValue::SBValue(const SBValue &rhs) :
53 m_opaque_sp (rhs.m_opaque_sp)
54{
55}
56
Greg Claytond68e0892011-09-09 23:04:00 +000057SBValue &
Greg Clayton538eb822010-11-05 23:17:00 +000058SBValue::operator = (const SBValue &rhs)
59{
60 if (this != &rhs)
61 m_opaque_sp = rhs.m_opaque_sp;
62 return *this;
63}
64
Chris Lattner24943d22010-06-08 16:52:24 +000065SBValue::~SBValue()
66{
67}
68
69bool
Greg Claytond68e0892011-09-09 23:04:00 +000070SBValue::IsValid ()
Chris Lattner24943d22010-06-08 16:52:24 +000071{
Greg Clayton49ce6822010-10-31 03:01:06 +000072 // If this function ever changes to anything that does more than just
73 // check if the opaque shared pointer is non NULL, then we need to update
74 // all "if (m_opaque_sp)" code in this file.
75 return m_opaque_sp.get() != NULL;
Chris Lattner24943d22010-06-08 16:52:24 +000076}
77
Greg Claytonc5f728c2010-10-06 22:10:17 +000078SBError
79SBValue::GetError()
80{
81 SBError sb_error;
82
83 if (m_opaque_sp.get())
84 sb_error.SetError(m_opaque_sp->GetError());
85
86 return sb_error;
87}
88
Johnny Chen968958c2011-07-07 20:46:23 +000089user_id_t
90SBValue::GetID()
91{
92 if (m_opaque_sp)
93 return m_opaque_sp->GetID();
94 return LLDB_INVALID_UID;
95}
96
Chris Lattner24943d22010-06-08 16:52:24 +000097const char *
98SBValue::GetName()
99{
Greg Clayton49ce6822010-10-31 03:01:06 +0000100
101 const char *name = NULL;
102 if (m_opaque_sp)
103 name = m_opaque_sp->GetName().GetCString();
104
Greg Claytone005f2c2010-11-06 01:53:30 +0000105 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000106 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000107 {
108 if (name)
109 log->Printf ("SBValue(%p)::GetName () => \"%s\"", m_opaque_sp.get(), name);
110 else
Jason Molenda7e5fa7f2011-09-20 21:44:10 +0000111 log->Printf ("SBValue(%p)::GetName () => NULL", m_opaque_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +0000112 }
Caroline Tice7826c882010-10-26 03:11:13 +0000113
Greg Clayton49ce6822010-10-31 03:01:06 +0000114 return name;
Chris Lattner24943d22010-06-08 16:52:24 +0000115}
116
117const char *
118SBValue::GetTypeName ()
119{
Greg Clayton49ce6822010-10-31 03:01:06 +0000120 const char *name = NULL;
121 if (m_opaque_sp)
122 name = m_opaque_sp->GetTypeName().GetCString();
Greg Claytone005f2c2010-11-06 01:53:30 +0000123 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000124 if (log)
125 {
126 if (name)
127 log->Printf ("SBValue(%p)::GetTypeName () => \"%s\"", m_opaque_sp.get(), name);
128 else
129 log->Printf ("SBValue(%p)::GetTypeName () => NULL", m_opaque_sp.get());
130 }
131
132 return name;
Chris Lattner24943d22010-06-08 16:52:24 +0000133}
134
135size_t
136SBValue::GetByteSize ()
137{
138 size_t result = 0;
139
Greg Clayton49ce6822010-10-31 03:01:06 +0000140 if (m_opaque_sp)
Greg Clayton63094e02010-06-23 01:19:29 +0000141 result = m_opaque_sp->GetByteSize();
Chris Lattner24943d22010-06-08 16:52:24 +0000142
Greg Claytone005f2c2010-11-06 01:53:30 +0000143 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000144 if (log)
145 log->Printf ("SBValue(%p)::GetByteSize () => %zu", m_opaque_sp.get(), result);
146
Chris Lattner24943d22010-06-08 16:52:24 +0000147 return result;
148}
149
150bool
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000151SBValue::IsInScope ()
152{
Chris Lattner24943d22010-06-08 16:52:24 +0000153 bool result = false;
154
Greg Clayton49ce6822010-10-31 03:01:06 +0000155 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000156 {
Enrico Granata979e20d2011-07-29 19:53:35 +0000157 if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
Greg Claytonb9dcc512011-06-29 18:28:50 +0000158 {
Enrico Granata979e20d2011-07-29 19:53:35 +0000159 Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
Greg Claytonb9dcc512011-06-29 18:28:50 +0000160 result = m_opaque_sp->IsInScope ();
161 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000162 }
Chris Lattner24943d22010-06-08 16:52:24 +0000163
Greg Claytone005f2c2010-11-06 01:53:30 +0000164 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000165 if (log)
166 log->Printf ("SBValue(%p)::IsInScope () => %i", m_opaque_sp.get(), result);
167
Chris Lattner24943d22010-06-08 16:52:24 +0000168 return result;
169}
170
171const char *
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000172SBValue::GetValue ()
173{
Greg Clayton49ce6822010-10-31 03:01:06 +0000174 const char *cstr = NULL;
Greg Claytonbdcda462010-12-20 20:49:23 +0000175 if (m_opaque_sp)
176 {
Enrico Granata979e20d2011-07-29 19:53:35 +0000177 if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
Greg Claytonb9dcc512011-06-29 18:28:50 +0000178 {
Enrico Granata979e20d2011-07-29 19:53:35 +0000179 Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
Greg Claytonb9dcc512011-06-29 18:28:50 +0000180 cstr = m_opaque_sp->GetValueAsCString ();
181 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000182 }
Greg Claytone005f2c2010-11-06 01:53:30 +0000183 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000184 if (log)
185 {
186 if (cstr)
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000187 log->Printf ("SBValue(%p)::GetValue => \"%s\"", m_opaque_sp.get(), cstr);
Greg Clayton49ce6822010-10-31 03:01:06 +0000188 else
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000189 log->Printf ("SBValue(%p)::GetValue => NULL", m_opaque_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +0000190 }
191
192 return cstr;
Chris Lattner24943d22010-06-08 16:52:24 +0000193}
194
Greg Claytonf3d0b0c2010-10-27 03:32:59 +0000195ValueType
196SBValue::GetValueType ()
197{
Greg Clayton49ce6822010-10-31 03:01:06 +0000198 ValueType result = eValueTypeInvalid;
Greg Claytonf3d0b0c2010-10-27 03:32:59 +0000199 if (m_opaque_sp)
Greg Clayton49ce6822010-10-31 03:01:06 +0000200 result = m_opaque_sp->GetValueType();
Greg Claytone005f2c2010-11-06 01:53:30 +0000201 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000202 if (log)
203 {
204 switch (result)
205 {
206 case eValueTypeInvalid: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeInvalid", m_opaque_sp.get()); break;
207 case eValueTypeVariableGlobal: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableGlobal", m_opaque_sp.get()); break;
208 case eValueTypeVariableStatic: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableStatic", m_opaque_sp.get()); break;
209 case eValueTypeVariableArgument:log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableArgument", m_opaque_sp.get()); break;
210 case eValueTypeVariableLocal: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableLocal", m_opaque_sp.get()); break;
211 case eValueTypeRegister: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeRegister", m_opaque_sp.get()); break;
212 case eValueTypeRegisterSet: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeRegisterSet", m_opaque_sp.get()); break;
213 case eValueTypeConstResult: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeConstResult", m_opaque_sp.get()); break;
214 default: log->Printf ("SBValue(%p)::GetValueType () => %i ???", m_opaque_sp.get(), result); break;
215 }
216 }
217 return result;
Greg Claytonf3d0b0c2010-10-27 03:32:59 +0000218}
219
Jim Ingham4ae51962010-09-10 23:12:17 +0000220const char *
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000221SBValue::GetObjectDescription ()
222{
Greg Clayton49ce6822010-10-31 03:01:06 +0000223 const char *cstr = NULL;
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000224 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000225 {
Enrico Granata979e20d2011-07-29 19:53:35 +0000226 if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
Greg Claytonb9dcc512011-06-29 18:28:50 +0000227 {
Enrico Granata979e20d2011-07-29 19:53:35 +0000228 Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
Greg Claytonb9dcc512011-06-29 18:28:50 +0000229 cstr = m_opaque_sp->GetObjectDescription ();
230 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000231 }
Greg Claytone005f2c2010-11-06 01:53:30 +0000232 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000233 if (log)
234 {
235 if (cstr)
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000236 log->Printf ("SBValue(%p)::GetObjectDescription => \"%s\"", m_opaque_sp.get(), cstr);
Greg Clayton49ce6822010-10-31 03:01:06 +0000237 else
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000238 log->Printf ("SBValue(%p)::GetObjectDescription => NULL", m_opaque_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +0000239 }
240 return cstr;
Jim Ingham4ae51962010-09-10 23:12:17 +0000241}
242
Enrico Granata979e20d2011-07-29 19:53:35 +0000243SBType
244SBValue::GetType()
245{
246 SBType result;
247 if (m_opaque_sp)
248 {
249 if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
250 {
251 Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
Greg Clayton0fb0bcc2011-08-03 22:57:10 +0000252 result = SBType(ClangASTType (m_opaque_sp->GetClangAST(), m_opaque_sp->GetClangType()));
Enrico Granata979e20d2011-07-29 19:53:35 +0000253 }
254 }
255 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
256 if (log)
257 {
258 if (result.IsValid())
259 log->Printf ("SBValue(%p)::GetType => %p", m_opaque_sp.get(), &result);
260 else
261 log->Printf ("SBValue(%p)::GetType => NULL", m_opaque_sp.get());
262 }
263 return result;
264}
265
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000266bool
267SBValue::GetValueDidChange ()
268{
Greg Clayton49ce6822010-10-31 03:01:06 +0000269 bool result = false;
270 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000271 {
Enrico Granata979e20d2011-07-29 19:53:35 +0000272 if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
Greg Claytonb9dcc512011-06-29 18:28:50 +0000273 {
Enrico Granata979e20d2011-07-29 19:53:35 +0000274 Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
Greg Claytonb9dcc512011-06-29 18:28:50 +0000275 result = m_opaque_sp->GetValueDidChange ();
276 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000277 }
Greg Claytone005f2c2010-11-06 01:53:30 +0000278 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000279 if (log)
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000280 log->Printf ("SBValue(%p)::GetValueDidChange => %i", m_opaque_sp.get(), result);
Greg Clayton49ce6822010-10-31 03:01:06 +0000281
282 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000283}
284
285const char *
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000286SBValue::GetSummary ()
287{
Greg Clayton49ce6822010-10-31 03:01:06 +0000288 const char *cstr = NULL;
289 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000290 {
Enrico Granata979e20d2011-07-29 19:53:35 +0000291 if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
Greg Claytonb9dcc512011-06-29 18:28:50 +0000292 {
Enrico Granata979e20d2011-07-29 19:53:35 +0000293 Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
Greg Claytonb9dcc512011-06-29 18:28:50 +0000294 cstr = m_opaque_sp->GetSummaryAsCString();
295 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000296 }
Greg Claytone005f2c2010-11-06 01:53:30 +0000297 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000298 if (log)
299 {
300 if (cstr)
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000301 log->Printf ("SBValue(%p)::GetSummary => \"%s\"", m_opaque_sp.get(), cstr);
Greg Clayton49ce6822010-10-31 03:01:06 +0000302 else
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000303 log->Printf ("SBValue(%p)::GetSummary => NULL", m_opaque_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +0000304 }
305 return cstr;
Chris Lattner24943d22010-06-08 16:52:24 +0000306}
307
308const char *
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000309SBValue::GetLocation ()
310{
Greg Clayton49ce6822010-10-31 03:01:06 +0000311 const char *cstr = NULL;
312 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000313 {
Enrico Granata979e20d2011-07-29 19:53:35 +0000314 if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
Greg Claytonb9dcc512011-06-29 18:28:50 +0000315 {
Enrico Granata979e20d2011-07-29 19:53:35 +0000316 Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
Greg Claytonb9dcc512011-06-29 18:28:50 +0000317 cstr = m_opaque_sp->GetLocationAsCString();
318 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000319 }
Greg Claytone005f2c2010-11-06 01:53:30 +0000320 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000321 if (log)
322 {
323 if (cstr)
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000324 log->Printf ("SBValue(%p)::GetSummary => \"%s\"", m_opaque_sp.get(), cstr);
Greg Clayton49ce6822010-10-31 03:01:06 +0000325 else
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000326 log->Printf ("SBValue(%p)::GetSummary => NULL", m_opaque_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +0000327 }
328 return cstr;
Chris Lattner24943d22010-06-08 16:52:24 +0000329}
330
331bool
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000332SBValue::SetValueFromCString (const char *value_str)
333{
Chris Lattner24943d22010-06-08 16:52:24 +0000334 bool success = false;
Greg Clayton49ce6822010-10-31 03:01:06 +0000335 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000336 {
Enrico Granata979e20d2011-07-29 19:53:35 +0000337 if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
Greg Claytonb9dcc512011-06-29 18:28:50 +0000338 {
Enrico Granata979e20d2011-07-29 19:53:35 +0000339 Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
Greg Claytonb9dcc512011-06-29 18:28:50 +0000340 success = m_opaque_sp->SetValueFromCString (value_str);
341 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000342 }
Chris Lattner24943d22010-06-08 16:52:24 +0000343 return success;
344}
345
Enrico Granata979e20d2011-07-29 19:53:35 +0000346lldb::SBValue
Greg Claytond68e0892011-09-09 23:04:00 +0000347SBValue::CreateChildAtOffset (const char *name, uint32_t offset, SBType type)
Enrico Granata979e20d2011-07-29 19:53:35 +0000348{
349 lldb::SBValue result;
350 if (m_opaque_sp)
351 {
352 if (type.IsValid())
353 {
Greg Clayton0fb0bcc2011-08-03 22:57:10 +0000354 result = SBValue(m_opaque_sp->GetSyntheticChildAtOffset(offset, type.m_opaque_sp->GetClangASTType(), true));
Enrico Granata979e20d2011-07-29 19:53:35 +0000355 result.m_opaque_sp->SetName(ConstString(name));
356 }
357 }
358 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
359 if (log)
360 {
361 if (result.IsValid())
Jason Molenda7e5fa7f2011-09-20 21:44:10 +0000362 log->Printf ("SBValue(%p)::GetChildAtOffset => \"%s\"", m_opaque_sp.get(), result.m_opaque_sp->GetName().AsCString());
Enrico Granata979e20d2011-07-29 19:53:35 +0000363 else
364 log->Printf ("SBValue(%p)::GetChildAtOffset => NULL", m_opaque_sp.get());
365 }
366 return result;
367}
368
369lldb::SBValue
Greg Claytond68e0892011-09-09 23:04:00 +0000370SBValue::Cast (SBType type)
Enrico Granata979e20d2011-07-29 19:53:35 +0000371{
372 return CreateChildAtOffset(m_opaque_sp->GetName().GetCString(), 0, type);
373}
374
375lldb::SBValue
376SBValue::CreateValueFromExpression (const char *name, const char* expression)
377{
378 lldb::SBValue result;
379 if (m_opaque_sp)
380 {
381 ValueObjectSP result_valobj_sp;
Greg Claytond68e0892011-09-09 23:04:00 +0000382 m_opaque_sp->GetUpdatePoint().GetTargetSP()->EvaluateExpression (expression,
Jim Ingham1586d972011-12-17 01:35:57 +0000383 m_opaque_sp->GetExecutionContextScope()->CalculateStackFrame(),
Sean Callanana8428a42011-09-22 00:41:11 +0000384 eExecutionPolicyOnlyWhenNeeded,
Sean Callanan47dc4572011-09-15 02:13:07 +0000385 true, // unwind on error
386 true, // keep in memory
387 eNoDynamicValues,
Greg Claytond68e0892011-09-09 23:04:00 +0000388 result_valobj_sp);
Enrico Granata979e20d2011-07-29 19:53:35 +0000389 result_valobj_sp->SetName(ConstString(name));
390 result = SBValue(result_valobj_sp);
391 }
392 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
393 if (log)
394 {
395 if (result.IsValid())
Jason Molenda7e5fa7f2011-09-20 21:44:10 +0000396 log->Printf ("SBValue(%p)::GetChildFromExpression => \"%s\"", m_opaque_sp.get(), result.m_opaque_sp->GetName().AsCString());
Enrico Granata979e20d2011-07-29 19:53:35 +0000397 else
398 log->Printf ("SBValue(%p)::GetChildFromExpression => NULL", m_opaque_sp.get());
399 }
400 return result;
401}
402
403lldb::SBValue
Greg Claytond68e0892011-09-09 23:04:00 +0000404SBValue::CreateValueFromAddress(const char* name, lldb::addr_t address, SBType type)
Enrico Granata979e20d2011-07-29 19:53:35 +0000405{
406 lldb::SBValue result;
Johnny Chen943485c2011-12-15 01:55:36 +0000407 if (m_opaque_sp && type.IsValid() && type.GetPointerType().IsValid())
Enrico Granata979e20d2011-07-29 19:53:35 +0000408 {
Enrico Granata979e20d2011-07-29 19:53:35 +0000409 SBType real_type(type.GetPointerType());
410
411 lldb::DataBufferSP buffer(new lldb_private::DataBufferHeap(&address,sizeof(lldb::addr_t)));
412
Jim Ingham1586d972011-12-17 01:35:57 +0000413 ValueObjectSP ptr_result_valobj_sp(ValueObjectConstResult::Create (m_opaque_sp->GetExecutionContextScope(),
Greg Claytond68e0892011-09-09 23:04:00 +0000414 real_type.m_opaque_sp->GetASTContext(),
415 real_type.m_opaque_sp->GetOpaqueQualType(),
416 ConstString(name),
417 buffer,
418 lldb::endian::InlHostByteOrder(),
419 GetTarget().GetProcess().GetAddressByteSize()));
Enrico Granata979e20d2011-07-29 19:53:35 +0000420
Enrico Granatac9310302011-08-04 17:07:02 +0000421 ValueObjectSP result_valobj_sp;
422
423 ptr_result_valobj_sp->GetValue().SetValueType(Value::eValueTypeLoadAddress);
424 if (ptr_result_valobj_sp)
425 {
426 Error err;
427 result_valobj_sp = ptr_result_valobj_sp->Dereference(err);
428 if (result_valobj_sp)
429 result_valobj_sp->SetName(ConstString(name));
430 }
Enrico Granata979e20d2011-07-29 19:53:35 +0000431 result = SBValue(result_valobj_sp);
432 }
433 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
434 if (log)
435 {
436 if (result.IsValid())
Jason Molenda7e5fa7f2011-09-20 21:44:10 +0000437 log->Printf ("SBValue(%p)::GetChildFromAddress => \"%s\"", m_opaque_sp.get(), result.m_opaque_sp->GetName().AsCString());
Johnny Chena713b862011-08-09 22:38:07 +0000438 else
439 log->Printf ("SBValue(%p)::GetChildFromAddress => NULL", m_opaque_sp.get());
440 }
Enrico Granata979e20d2011-07-29 19:53:35 +0000441 return result;
442}
443
Enrico Granata91544802011-09-06 19:20:51 +0000444lldb::SBValue
Greg Claytond68e0892011-09-09 23:04:00 +0000445SBValue::CreateValueFromData (const char* name, SBData data, SBType type)
Enrico Granata91544802011-09-06 19:20:51 +0000446{
447 SBValue result;
448
449 AddressType addr_of_children_priv = eAddressTypeLoad;
450
451 if (m_opaque_sp)
452 {
453 ValueObjectSP valobj_sp;
454 valobj_sp = ValueObjectConstResult::Create (m_opaque_sp->GetExecutionContextScope(),
455 type.m_opaque_sp->GetASTContext() ,
456 type.m_opaque_sp->GetOpaqueQualType(),
457 ConstString(name),
458 *data.m_opaque_sp,
459 LLDB_INVALID_ADDRESS);
460 valobj_sp->SetAddressTypeOfChildren(addr_of_children_priv);
461 result = SBValue(valobj_sp);
462 }
463 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
464 if (log)
465 {
466 if (result.IsValid())
Jason Molenda7e5fa7f2011-09-20 21:44:10 +0000467 log->Printf ("SBValue(%p)::GetChildFromExpression => \"%s\"", m_opaque_sp.get(), result.m_opaque_sp->GetName().AsCString());
Enrico Granata91544802011-09-06 19:20:51 +0000468 else
469 log->Printf ("SBValue(%p)::GetChildFromExpression => NULL", m_opaque_sp.get());
470 }
471 return result;
472}
473
Chris Lattner24943d22010-06-08 16:52:24 +0000474SBValue
475SBValue::GetChildAtIndex (uint32_t idx)
476{
Greg Clayton8f64c472011-07-15 19:31:49 +0000477 const bool can_create_synthetic = false;
478 lldb::DynamicValueType use_dynamic = eNoDynamicValues;
Johnny Chen446ccaa2011-06-29 21:19:39 +0000479 if (m_opaque_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +0000480 use_dynamic = m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetPreferDynamicValue();
Greg Clayton8f64c472011-07-15 19:31:49 +0000481 return GetChildAtIndex (idx, use_dynamic, can_create_synthetic);
Jim Inghame41494a2011-04-16 00:01:13 +0000482}
483
484SBValue
Greg Clayton8f64c472011-07-15 19:31:49 +0000485SBValue::GetChildAtIndex (uint32_t idx, lldb::DynamicValueType use_dynamic, bool can_create_synthetic)
Jim Inghame41494a2011-04-16 00:01:13 +0000486{
Chris Lattner24943d22010-06-08 16:52:24 +0000487 lldb::ValueObjectSP child_sp;
488
Greg Clayton49ce6822010-10-31 03:01:06 +0000489 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000490 {
Enrico Granata979e20d2011-07-29 19:53:35 +0000491 if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
Greg Claytonb9dcc512011-06-29 18:28:50 +0000492 {
Enrico Granata979e20d2011-07-29 19:53:35 +0000493 Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
Greg Clayton8f64c472011-07-15 19:31:49 +0000494 const bool can_create = true;
495 child_sp = m_opaque_sp->GetChildAtIndex (idx, can_create);
496 if (can_create_synthetic && !child_sp)
Greg Claytonfab305b2011-05-20 23:51:26 +0000497 {
Greg Clayton8f64c472011-07-15 19:31:49 +0000498 if (m_opaque_sp->IsPointerType())
Greg Claytonb9dcc512011-06-29 18:28:50 +0000499 {
Greg Clayton8f64c472011-07-15 19:31:49 +0000500 child_sp = m_opaque_sp->GetSyntheticArrayMemberFromPointer(idx, can_create);
501 }
502 else if (m_opaque_sp->IsArrayType())
503 {
504 child_sp = m_opaque_sp->GetSyntheticArrayMemberFromArray(idx, can_create);
505 }
506 }
507
508 if (child_sp)
509 {
510 if (use_dynamic != lldb::eNoDynamicValues)
511 {
512 lldb::ValueObjectSP dynamic_sp(child_sp->GetDynamicValue (use_dynamic));
Greg Claytonb9dcc512011-06-29 18:28:50 +0000513 if (dynamic_sp)
514 child_sp = dynamic_sp;
515 }
Greg Claytonfab305b2011-05-20 23:51:26 +0000516 }
Jim Inghame41494a2011-04-16 00:01:13 +0000517 }
518 }
519
Chris Lattner24943d22010-06-08 16:52:24 +0000520 SBValue sb_value (child_sp);
Greg Claytone005f2c2010-11-06 01:53:30 +0000521 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000522 if (log)
523 log->Printf ("SBValue(%p)::GetChildAtIndex (%u) => SBValue(%p)", m_opaque_sp.get(), idx, sb_value.get());
524
Chris Lattner24943d22010-06-08 16:52:24 +0000525 return sb_value;
526}
527
528uint32_t
529SBValue::GetIndexOfChildWithName (const char *name)
530{
Greg Clayton49ce6822010-10-31 03:01:06 +0000531 uint32_t idx = UINT32_MAX;
532 if (m_opaque_sp)
Greg Claytonfab305b2011-05-20 23:51:26 +0000533 {
Enrico Granata979e20d2011-07-29 19:53:35 +0000534 if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
Greg Claytonb9dcc512011-06-29 18:28:50 +0000535 {
Enrico Granata979e20d2011-07-29 19:53:35 +0000536 Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
Greg Claytonfab305b2011-05-20 23:51:26 +0000537
Greg Claytonb9dcc512011-06-29 18:28:50 +0000538 idx = m_opaque_sp->GetIndexOfChildWithName (ConstString(name));
539 }
Greg Claytonfab305b2011-05-20 23:51:26 +0000540 }
Greg Claytone005f2c2010-11-06 01:53:30 +0000541 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000542 if (log)
543 {
544 if (idx == UINT32_MAX)
Jason Molenda7e5fa7f2011-09-20 21:44:10 +0000545 log->Printf ("SBValue(%p)::GetIndexOfChildWithName (name=\"%s\") => NOT FOUND", m_opaque_sp.get(), name);
Greg Clayton49ce6822010-10-31 03:01:06 +0000546 else
547 log->Printf ("SBValue(%p)::GetIndexOfChildWithName (name=\"%s\") => %u", m_opaque_sp.get(), name, idx);
548 }
549 return idx;
Chris Lattner24943d22010-06-08 16:52:24 +0000550}
551
552SBValue
553SBValue::GetChildMemberWithName (const char *name)
554{
Johnny Chen446ccaa2011-06-29 21:19:39 +0000555 if (m_opaque_sp)
556 {
Enrico Granata979e20d2011-07-29 19:53:35 +0000557 lldb::DynamicValueType use_dynamic_value = m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetPreferDynamicValue();
Johnny Chen446ccaa2011-06-29 21:19:39 +0000558 return GetChildMemberWithName (name, use_dynamic_value);
559 }
560 else
561 return GetChildMemberWithName (name, eNoDynamicValues);
Jim Inghame41494a2011-04-16 00:01:13 +0000562}
563
564SBValue
Jim Ingham10de7d12011-05-04 03:43:18 +0000565SBValue::GetChildMemberWithName (const char *name, lldb::DynamicValueType use_dynamic_value)
Jim Inghame41494a2011-04-16 00:01:13 +0000566{
Chris Lattner24943d22010-06-08 16:52:24 +0000567 lldb::ValueObjectSP child_sp;
568 const ConstString str_name (name);
569
Greg Clayton905acaf2011-05-20 22:07:17 +0000570
Greg Clayton49ce6822010-10-31 03:01:06 +0000571 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000572 {
Enrico Granata979e20d2011-07-29 19:53:35 +0000573 if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
Jim Inghame41494a2011-04-16 00:01:13 +0000574 {
Enrico Granata979e20d2011-07-29 19:53:35 +0000575 Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
Greg Claytonb9dcc512011-06-29 18:28:50 +0000576 child_sp = m_opaque_sp->GetChildMemberWithName (str_name, true);
577 if (use_dynamic_value != lldb::eNoDynamicValues)
Greg Claytonfab305b2011-05-20 23:51:26 +0000578 {
Greg Claytonb9dcc512011-06-29 18:28:50 +0000579 if (child_sp)
580 {
581 lldb::ValueObjectSP dynamic_sp = child_sp->GetDynamicValue (use_dynamic_value);
582 if (dynamic_sp)
583 child_sp = dynamic_sp;
584 }
Greg Claytonfab305b2011-05-20 23:51:26 +0000585 }
Jim Inghame41494a2011-04-16 00:01:13 +0000586 }
587 }
588
Chris Lattner24943d22010-06-08 16:52:24 +0000589 SBValue sb_value (child_sp);
Greg Clayton49ce6822010-10-31 03:01:06 +0000590
Greg Claytone005f2c2010-11-06 01:53:30 +0000591 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000592 if (log)
593 log->Printf ("SBValue(%p)::GetChildMemberWithName (name=\"%s\") => SBValue(%p)", m_opaque_sp.get(), name, sb_value.get());
594
Chris Lattner24943d22010-06-08 16:52:24 +0000595 return sb_value;
596}
597
Enrico Granataf7a9b142011-07-15 02:26:42 +0000598lldb::SBValue
Jim Ingham1b425752011-12-08 19:44:08 +0000599SBValue::GetDynamicValue (lldb::DynamicValueType use_dynamic)
600{
601 if (m_opaque_sp)
602 {
603 if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
604 {
605 Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
606 return SBValue (m_opaque_sp->GetDynamicValue(use_dynamic));
607 }
608 }
609
610 return SBValue();
611}
612
613lldb::SBValue
614SBValue::GetStaticValue ()
615{
616 if (m_opaque_sp)
617 {
618 if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
619 {
620 Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
621 return SBValue(m_opaque_sp->GetStaticValue());
622 }
623 }
624
625 return SBValue();
626}
627
628bool
629SBValue::IsDynamic()
630{
631 if (m_opaque_sp)
632 {
633 if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
634 {
635 Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
636 return m_opaque_sp->IsDynamic();
637 }
638 }
639 return false;
640}
641
642lldb::SBValue
Enrico Granataf7a9b142011-07-15 02:26:42 +0000643SBValue::GetValueForExpressionPath(const char* expr_path)
644{
645 lldb::ValueObjectSP child_sp;
646 if (m_opaque_sp)
647 {
Enrico Granata979e20d2011-07-29 19:53:35 +0000648 if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
Enrico Granataf7a9b142011-07-15 02:26:42 +0000649 {
Enrico Granata979e20d2011-07-29 19:53:35 +0000650 Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
Enrico Granataf7a9b142011-07-15 02:26:42 +0000651 // using default values for all the fancy options, just do it if you can
652 child_sp = m_opaque_sp->GetValueForExpressionPath(expr_path);
653 }
654 }
655
656 SBValue sb_value (child_sp);
657
658 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
659 if (log)
660 log->Printf ("SBValue(%p)::GetValueForExpressionPath (expr_path=\"%s\") => SBValue(%p)", m_opaque_sp.get(), expr_path, sb_value.get());
661
662 return sb_value;
663}
Chris Lattner24943d22010-06-08 16:52:24 +0000664
Greg Clayton0fb0bcc2011-08-03 22:57:10 +0000665int64_t
Enrico Granatac92eb402011-08-04 01:41:02 +0000666SBValue::GetValueAsSigned(SBError& error, int64_t fail_value)
667{
Jim Ingham574c3d62011-08-12 23:34:31 +0000668 error.Clear();
Enrico Granatac92eb402011-08-04 01:41:02 +0000669 if (m_opaque_sp)
670 {
671 if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
672 {
673 Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
674 Scalar scalar;
675 if (m_opaque_sp->ResolveValue (scalar))
676 return scalar.GetRawBits64(fail_value);
677 else
678 error.SetErrorString("could not get value");
679 }
680 else
681 error.SetErrorString("could not get target");
682 }
683 error.SetErrorString("invalid SBValue");
684 return fail_value;
685}
686
687uint64_t
688SBValue::GetValueAsUnsigned(SBError& error, uint64_t fail_value)
689{
Jim Ingham574c3d62011-08-12 23:34:31 +0000690 error.Clear();
Enrico Granatac92eb402011-08-04 01:41:02 +0000691 if (m_opaque_sp)
692 {
693 if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
694 {
695 Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
696 Scalar scalar;
697 if (m_opaque_sp->ResolveValue (scalar))
698 return scalar.GetRawBits64(fail_value);
699 else
700 error.SetErrorString("could not get value");
701 }
702 else
703 error.SetErrorString("could not get target");
704 }
705 error.SetErrorString("invalid SBValue");
706 return fail_value;
707}
708
709int64_t
Greg Clayton0fb0bcc2011-08-03 22:57:10 +0000710SBValue::GetValueAsSigned(int64_t fail_value)
711{
712 if (m_opaque_sp)
713 {
714 if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
715 {
716 Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
717 Scalar scalar;
718 if (m_opaque_sp->ResolveValue (scalar))
719 return scalar.GetRawBits64(fail_value);
720 }
721 }
722 return fail_value;
723}
724
725uint64_t
726SBValue::GetValueAsUnsigned(uint64_t fail_value)
727{
728 if (m_opaque_sp)
729 {
730 if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
731 {
732 Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
733 Scalar scalar;
734 if (m_opaque_sp->ResolveValue (scalar))
735 return scalar.GetRawBits64(fail_value);
736 }
737 }
738 return fail_value;
739}
740
Chris Lattner24943d22010-06-08 16:52:24 +0000741uint32_t
742SBValue::GetNumChildren ()
743{
744 uint32_t num_children = 0;
745
Greg Clayton49ce6822010-10-31 03:01:06 +0000746 if (m_opaque_sp)
Greg Claytonfab305b2011-05-20 23:51:26 +0000747 {
Enrico Granata979e20d2011-07-29 19:53:35 +0000748 if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
Greg Claytonb9dcc512011-06-29 18:28:50 +0000749 {
Enrico Granata979e20d2011-07-29 19:53:35 +0000750 Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
Greg Claytonfab305b2011-05-20 23:51:26 +0000751
Greg Claytonb9dcc512011-06-29 18:28:50 +0000752 num_children = m_opaque_sp->GetNumChildren();
753 }
Greg Claytonfab305b2011-05-20 23:51:26 +0000754 }
Greg Clayton49ce6822010-10-31 03:01:06 +0000755
Greg Claytone005f2c2010-11-06 01:53:30 +0000756 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000757 if (log)
758 log->Printf ("SBValue(%p)::GetNumChildren () => %u", m_opaque_sp.get(), num_children);
Chris Lattner24943d22010-06-08 16:52:24 +0000759
760 return num_children;
761}
762
Chris Lattner24943d22010-06-08 16:52:24 +0000763
764SBValue
765SBValue::Dereference ()
766{
Greg Clayton49ce6822010-10-31 03:01:06 +0000767 SBValue sb_value;
768 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000769 {
Enrico Granata979e20d2011-07-29 19:53:35 +0000770 if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
Greg Claytonb9dcc512011-06-29 18:28:50 +0000771 {
Enrico Granata979e20d2011-07-29 19:53:35 +0000772 Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
Greg Claytonfab305b2011-05-20 23:51:26 +0000773
Greg Claytonb9dcc512011-06-29 18:28:50 +0000774 Error error;
775 sb_value = m_opaque_sp->Dereference (error);
776 }
Chris Lattner24943d22010-06-08 16:52:24 +0000777 }
Greg Claytone005f2c2010-11-06 01:53:30 +0000778 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000779 if (log)
780 log->Printf ("SBValue(%p)::Dereference () => SBValue(%p)", m_opaque_sp.get(), sb_value.get());
781
782 return sb_value;
Chris Lattner24943d22010-06-08 16:52:24 +0000783}
784
785bool
Greg Clayton49ce6822010-10-31 03:01:06 +0000786SBValue::TypeIsPointerType ()
Chris Lattner24943d22010-06-08 16:52:24 +0000787{
788 bool is_ptr_type = false;
789
Greg Clayton49ce6822010-10-31 03:01:06 +0000790 if (m_opaque_sp)
Greg Claytonfab305b2011-05-20 23:51:26 +0000791 {
Enrico Granata979e20d2011-07-29 19:53:35 +0000792 if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
Greg Claytonb9dcc512011-06-29 18:28:50 +0000793 {
Enrico Granata979e20d2011-07-29 19:53:35 +0000794 Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
Greg Claytonfab305b2011-05-20 23:51:26 +0000795
Greg Claytonb9dcc512011-06-29 18:28:50 +0000796 is_ptr_type = m_opaque_sp->IsPointerType();
797 }
Greg Claytonfab305b2011-05-20 23:51:26 +0000798 }
Greg Clayton49ce6822010-10-31 03:01:06 +0000799
Greg Claytone005f2c2010-11-06 01:53:30 +0000800 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000801 if (log)
802 log->Printf ("SBValue(%p)::TypeIsPointerType () => %i", m_opaque_sp.get(), is_ptr_type);
803
Chris Lattner24943d22010-06-08 16:52:24 +0000804
805 return is_ptr_type;
806}
807
Chris Lattner24943d22010-06-08 16:52:24 +0000808void *
809SBValue::GetOpaqueType()
810{
Greg Clayton63094e02010-06-23 01:19:29 +0000811 if (m_opaque_sp)
Greg Claytonfab305b2011-05-20 23:51:26 +0000812 {
Enrico Granata979e20d2011-07-29 19:53:35 +0000813 if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
Greg Claytonb9dcc512011-06-29 18:28:50 +0000814 {
Enrico Granata979e20d2011-07-29 19:53:35 +0000815 Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
Greg Claytonfab305b2011-05-20 23:51:26 +0000816
Greg Claytonb9dcc512011-06-29 18:28:50 +0000817 return m_opaque_sp->GetClangType();
818 }
Greg Claytonfab305b2011-05-20 23:51:26 +0000819 }
Chris Lattner24943d22010-06-08 16:52:24 +0000820 return NULL;
821}
822
Enrico Granata979e20d2011-07-29 19:53:35 +0000823lldb::SBTarget
824SBValue::GetTarget()
825{
826 SBTarget result;
827 if (m_opaque_sp)
828 {
829 if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
830 {
831 result = SBTarget(lldb::TargetSP(m_opaque_sp->GetUpdatePoint().GetTargetSP()));
832 }
833 }
834 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
835 if (log)
836 {
837 if (result.get() == NULL)
838 log->Printf ("SBValue(%p)::GetTarget () => NULL", m_opaque_sp.get());
839 else
840 log->Printf ("SBValue(%p)::GetTarget () => %p", m_opaque_sp.get(), result.get());
841 }
842 return result;
843}
844
845lldb::SBProcess
846SBValue::GetProcess()
847{
848 SBProcess result;
849 if (m_opaque_sp)
850 {
Enrico Granata91544802011-09-06 19:20:51 +0000851 Target* target = m_opaque_sp->GetUpdatePoint().GetTargetSP().get();
852 if (target)
Enrico Granata979e20d2011-07-29 19:53:35 +0000853 {
Enrico Granata91544802011-09-06 19:20:51 +0000854 result = SBProcess(lldb::ProcessSP(target->GetProcessSP()));
Enrico Granata979e20d2011-07-29 19:53:35 +0000855 }
856 }
857 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
858 if (log)
859 {
860 if (result.get() == NULL)
861 log->Printf ("SBValue(%p)::GetProcess () => NULL", m_opaque_sp.get());
862 else
863 log->Printf ("SBValue(%p)::GetProcess () => %p", m_opaque_sp.get(), result.get());
864 }
865 return result;
866}
867
868lldb::SBThread
869SBValue::GetThread()
870{
871 SBThread result;
872 if (m_opaque_sp)
873 {
Jim Ingham1586d972011-12-17 01:35:57 +0000874 if (m_opaque_sp->GetExecutionContextScope())
Enrico Granata979e20d2011-07-29 19:53:35 +0000875 {
Jim Ingham1586d972011-12-17 01:35:57 +0000876 result = SBThread(m_opaque_sp->GetExecutionContextScope()->CalculateThread()->GetSP());
Enrico Granata979e20d2011-07-29 19:53:35 +0000877 }
878 }
879 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
880 if (log)
881 {
882 if (result.get() == NULL)
883 log->Printf ("SBValue(%p)::GetThread () => NULL", m_opaque_sp.get());
884 else
885 log->Printf ("SBValue(%p)::GetThread () => %p", m_opaque_sp.get(), result.get());
886 }
887 return result;
888}
889
890lldb::SBFrame
891SBValue::GetFrame()
892{
893 SBFrame result;
894 if (m_opaque_sp)
895 {
Jim Ingham1586d972011-12-17 01:35:57 +0000896 if (m_opaque_sp->GetExecutionContextScope())
Enrico Granata979e20d2011-07-29 19:53:35 +0000897 {
Jim Ingham1586d972011-12-17 01:35:57 +0000898 result.SetFrame (m_opaque_sp->GetExecutionContextScope()->CalculateStackFrame()->GetSP());
Enrico Granata979e20d2011-07-29 19:53:35 +0000899 }
900 }
901 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
902 if (log)
903 {
904 if (result.get() == NULL)
905 log->Printf ("SBValue(%p)::GetFrame () => NULL", m_opaque_sp.get());
906 else
907 log->Printf ("SBValue(%p)::GetFrame () => %p", m_opaque_sp.get(), result.get());
908 }
909 return result;
910}
911
912
Chris Lattner24943d22010-06-08 16:52:24 +0000913// Mimic shared pointer...
914lldb_private::ValueObject *
915SBValue::get() const
916{
Greg Clayton63094e02010-06-23 01:19:29 +0000917 return m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000918}
919
920lldb_private::ValueObject *
921SBValue::operator->() const
922{
Greg Clayton63094e02010-06-23 01:19:29 +0000923 return m_opaque_sp.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000924}
925
926lldb::ValueObjectSP &
927SBValue::operator*()
928{
Greg Clayton63094e02010-06-23 01:19:29 +0000929 return m_opaque_sp;
Chris Lattner24943d22010-06-08 16:52:24 +0000930}
931
932const lldb::ValueObjectSP &
933SBValue::operator*() const
934{
Greg Clayton63094e02010-06-23 01:19:29 +0000935 return m_opaque_sp;
Chris Lattner24943d22010-06-08 16:52:24 +0000936}
Caroline Tice98f930f2010-09-20 05:20:02 +0000937
938bool
Greg Clayton49ce6822010-10-31 03:01:06 +0000939SBValue::GetExpressionPath (SBStream &description)
940{
941 if (m_opaque_sp)
942 {
Greg Claytonb01000f2011-01-17 03:46:26 +0000943 m_opaque_sp->GetExpressionPath (description.ref(), false);
944 return true;
945 }
946 return false;
947}
948
949bool
950SBValue::GetExpressionPath (SBStream &description, bool qualify_cxx_base_classes)
951{
952 if (m_opaque_sp)
953 {
954 m_opaque_sp->GetExpressionPath (description.ref(), qualify_cxx_base_classes);
Greg Clayton49ce6822010-10-31 03:01:06 +0000955 return true;
956 }
957 return false;
958}
959
960bool
Caroline Tice98f930f2010-09-20 05:20:02 +0000961SBValue::GetDescription (SBStream &description)
962{
Greg Clayton96154be2011-11-13 06:57:31 +0000963 Stream &strm = description.ref();
964
Caroline Tice98f930f2010-09-20 05:20:02 +0000965 if (m_opaque_sp)
966 {
Greg Clayton96154be2011-11-13 06:57:31 +0000967 ValueObject::DumpValueObject (strm, m_opaque_sp.get());
Caroline Tice98f930f2010-09-20 05:20:02 +0000968 }
969 else
Greg Clayton96154be2011-11-13 06:57:31 +0000970 strm.PutCString ("No value");
Caroline Tice98f930f2010-09-20 05:20:02 +0000971
972 return true;
973}
Greg Claytone179a582011-01-05 18:43:15 +0000974
975lldb::Format
Greg Claytond68e0892011-09-09 23:04:00 +0000976SBValue::GetFormat ()
Greg Claytone179a582011-01-05 18:43:15 +0000977{
978 if (m_opaque_sp)
979 return m_opaque_sp->GetFormat();
980 return eFormatDefault;
981}
982
983void
984SBValue::SetFormat (lldb::Format format)
985{
986 if (m_opaque_sp)
987 m_opaque_sp->SetFormat(format);
988}
989
Enrico Granata979e20d2011-07-29 19:53:35 +0000990lldb::SBValue
991SBValue::AddressOf()
992{
993 SBValue sb_value;
994 if (m_opaque_sp)
995 {
Enrico Granata91544802011-09-06 19:20:51 +0000996 Target* target = m_opaque_sp->GetUpdatePoint().GetTargetSP().get();
997 if (target)
Enrico Granata979e20d2011-07-29 19:53:35 +0000998 {
Enrico Granata91544802011-09-06 19:20:51 +0000999 Mutex::Locker api_locker (target->GetAPIMutex());
Enrico Granata979e20d2011-07-29 19:53:35 +00001000 Error error;
1001 sb_value = m_opaque_sp->AddressOf (error);
1002 }
1003 }
1004 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1005 if (log)
1006 log->Printf ("SBValue(%p)::GetPointerToObject () => SBValue(%p)", m_opaque_sp.get(), sb_value.get());
1007
1008 return sb_value;
Johnny Chena713b862011-08-09 22:38:07 +00001009}
Enrico Granata91544802011-09-06 19:20:51 +00001010
1011lldb::addr_t
1012SBValue::GetLoadAddress()
1013{
1014 lldb::addr_t value = LLDB_INVALID_ADDRESS;
1015 if (m_opaque_sp)
1016 {
1017 Target* target = m_opaque_sp->GetUpdatePoint().GetTargetSP().get();
1018 if (target)
1019 {
1020 Mutex::Locker api_locker (target->GetAPIMutex());
1021 const bool scalar_is_load_address = true;
1022 AddressType addr_type;
1023 value = m_opaque_sp->GetAddressOf(scalar_is_load_address, &addr_type);
1024 if (addr_type == eAddressTypeFile)
1025 {
1026 Module* module = m_opaque_sp->GetModule();
1027 if (!module)
1028 value = LLDB_INVALID_ADDRESS;
1029 else
1030 {
1031 Address addr;
1032 module->ResolveFileAddress(value, addr);
1033 value = addr.GetLoadAddress(m_opaque_sp->GetUpdatePoint().GetTargetSP().get());
1034 }
1035 }
1036 else if (addr_type == eAddressTypeHost || addr_type == eAddressTypeInvalid)
1037 value = LLDB_INVALID_ADDRESS;
1038 }
1039 }
1040 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1041 if (log)
1042 log->Printf ("SBValue(%p)::GetLoadAddress () => (%llu)", m_opaque_sp.get(), value);
1043
1044 return value;
1045}
1046
1047lldb::SBAddress
1048SBValue::GetAddress()
1049{
1050 Address addr;
1051 if (m_opaque_sp)
1052 {
1053 Target* target = m_opaque_sp->GetUpdatePoint().GetTargetSP().get();
1054 if (target)
1055 {
1056 lldb::addr_t value = LLDB_INVALID_ADDRESS;
1057 Mutex::Locker api_locker (target->GetAPIMutex());
1058 const bool scalar_is_load_address = true;
1059 AddressType addr_type;
1060 value = m_opaque_sp->GetAddressOf(scalar_is_load_address, &addr_type);
1061 if (addr_type == eAddressTypeFile)
1062 {
1063 Module* module = m_opaque_sp->GetModule();
1064 if (module)
1065 module->ResolveFileAddress(value, addr);
1066 }
1067 else if (addr_type == eAddressTypeLoad)
1068 {
1069 // no need to check the return value on this.. if it can actually do the resolve
1070 // addr will be in the form (section,offset), otherwise it will simply be returned
1071 // as (NULL, value)
1072 addr.SetLoadAddress(value, target);
1073 }
1074 }
1075 }
1076 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1077 if (log)
1078 log->Printf ("SBValue(%p)::GetAddress () => (%s,%llu)", m_opaque_sp.get(), (addr.GetSection() ? addr.GetSection()->GetName().GetCString() : "NULL"), addr.GetOffset());
1079 return SBAddress(new Address(addr));
1080}
1081
1082lldb::SBData
1083SBValue::GetPointeeData (uint32_t item_idx,
1084 uint32_t item_count)
1085{
1086 lldb::SBData sb_data;
1087 if (m_opaque_sp)
1088 {
1089 Target* target = m_opaque_sp->GetUpdatePoint().GetTargetSP().get();
1090 if (target)
1091 {
1092 DataExtractorSP data_sp(new DataExtractor());
1093 Mutex::Locker api_locker (target->GetAPIMutex());
1094 m_opaque_sp->GetPointeeData(*data_sp, item_idx, item_count);
1095 if (data_sp->GetByteSize() > 0)
1096 *sb_data = data_sp;
1097 }
1098 }
1099 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1100 if (log)
1101 log->Printf ("SBValue(%p)::GetPointeeData (%d, %d) => SBData(%p)",
1102 m_opaque_sp.get(),
1103 item_idx,
1104 item_count,
1105 sb_data.get());
1106
1107 return sb_data;
1108}
1109
1110lldb::SBData
1111SBValue::GetData ()
1112{
1113 lldb::SBData sb_data;
1114 if (m_opaque_sp)
1115 {
1116 Target* target = m_opaque_sp->GetUpdatePoint().GetTargetSP().get();
1117 if (target)
1118 {
1119 DataExtractorSP data_sp(new DataExtractor());
1120 Mutex::Locker api_locker (target->GetAPIMutex());
1121 m_opaque_sp->GetData(*data_sp);
1122 if (data_sp->GetByteSize() > 0)
1123 *sb_data = data_sp;
1124 }
1125 }
1126 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1127 if (log)
1128 log->Printf ("SBValue(%p)::GetData () => SBData(%p)",
1129 m_opaque_sp.get(),
1130 sb_data.get());
1131
1132 return sb_data;
1133}
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001134
1135lldb::SBWatchpoint
1136SBValue::Watch (bool resolve_location, bool read, bool write)
1137{
1138 lldb::SBWatchpoint sb_watchpoint;
Johnny Chenecd4feb2011-10-14 00:42:25 +00001139 if (!m_opaque_sp)
1140 return sb_watchpoint;
1141
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001142 Target* target = m_opaque_sp->GetUpdatePoint().GetTargetSP().get();
1143 if (target)
1144 {
1145 Mutex::Locker api_locker (target->GetAPIMutex());
Johnny Chenecd4feb2011-10-14 00:42:25 +00001146 sb_watchpoint = WatchValue(read, write, false);
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001147 }
Johnny Chenecd4feb2011-10-14 00:42:25 +00001148 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1149 if (log)
1150 log->Printf ("SBValue(%p)::Watch (resolve_location=%i, read=%i, write=%i) => wp(%p)",
1151 m_opaque_sp.get(), resolve_location, read, write, sb_watchpoint.get());
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001152 return sb_watchpoint;
1153}
1154
1155lldb::SBWatchpoint
1156SBValue::WatchPointee (bool resolve_location, bool read, bool write)
1157{
1158 lldb::SBWatchpoint sb_watchpoint;
Johnny Chenecd4feb2011-10-14 00:42:25 +00001159 if (!m_opaque_sp)
1160 return sb_watchpoint;
1161
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001162 Target* target = m_opaque_sp->GetUpdatePoint().GetTargetSP().get();
1163 if (target)
1164 {
1165 Mutex::Locker api_locker (target->GetAPIMutex());
Johnny Chenecd4feb2011-10-14 00:42:25 +00001166 sb_watchpoint = WatchValue(read, write, true);
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001167 }
Johnny Chenecd4feb2011-10-14 00:42:25 +00001168 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1169 if (log)
1170 log->Printf ("SBValue(%p)::WatchPointee (resolve_location=%i, read=%i, write=%i) => wp(%p)",
1171 m_opaque_sp.get(), resolve_location, read, write, sb_watchpoint.get());
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001172 return sb_watchpoint;
1173}
1174
Johnny Chenecd4feb2011-10-14 00:42:25 +00001175// Helper function for SBValue::Watch() and SBValue::WatchPointee().
1176SBWatchpoint
1177SBValue::WatchValue(bool read, bool write, bool watch_pointee)
1178{
1179 SBWatchpoint sb_wp_empty;
1180
1181 // If the SBValue is not valid, there's no point in even trying to watch it.
1182 if (!IsValid() || !GetFrame().IsValid())
1183 return sb_wp_empty;
1184
1185 // Read and Write cannot both be false.
1186 if (!read && !write)
1187 return sb_wp_empty;
1188
1189 // If we are watching the pointee, check that the SBValue is a pointer type.
1190 if (watch_pointee && !GetType().IsPointerType())
1191 return sb_wp_empty;
1192
1193 addr_t addr;
1194 size_t size;
1195 if (watch_pointee) {
1196 addr = GetValueAsUnsigned(LLDB_INVALID_ADDRESS);
1197 size = GetType().GetPointeeType().GetByteSize();
1198 } else {
1199 addr = GetLoadAddress();
1200 size = GetByteSize();
1201 }
1202
1203 // Sanity check the address and the size before calling Target::CreateWatchpoint().
1204 if (addr == LLDB_INVALID_ADDRESS || size == 0)
1205 return sb_wp_empty;
1206
1207 uint32_t watch_type = (read ? LLDB_WATCH_TYPE_READ : 0) |
1208 (write ? LLDB_WATCH_TYPE_WRITE : 0);
1209 WatchpointSP wp_sp = GetFrame().m_opaque_sp->GetThread().GetProcess().GetTarget().
1210 CreateWatchpoint(addr, size, watch_type);
1211
1212 if (wp_sp) {
1213 // StackFrame::GetInScopeVariableList(true) to get file globals as well.
1214 VariableListSP var_list_sp(GetFrame().m_opaque_sp->GetInScopeVariableList(true));
1215 VariableSP var_sp = var_list_sp->FindVariable(ConstString(GetName()));
1216 if (var_sp && var_sp->GetDeclaration().GetFile()) {
1217 StreamString ss;
1218 // True to show fullpath for declaration file.
1219 var_sp->GetDeclaration().DumpStopContext(&ss, true);
1220 wp_sp->SetDeclInfo(ss.GetString());
1221 }
1222 }
1223 return wp_sp;
1224}
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001225