blob: 7eb56a806a34bb6493ec52af2977454b1035ab0f [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"
Enrico Granatad760907c2012-02-17 03:18:30 +000011
Caroline Tice98f930f2010-09-20 05:20:02 +000012#include "lldb/API/SBStream.h"
Enrico Granatad760907c2012-02-17 03:18:30 +000013#include "lldb/API/SBTypeFilter.h"
14#include "lldb/API/SBTypeFormat.h"
15#include "lldb/API/SBTypeSummary.h"
16#include "lldb/API/SBTypeSynthetic.h"
Chris Lattner24943d22010-06-08 16:52:24 +000017
Johnny Chenecd4feb2011-10-14 00:42:25 +000018#include "lldb/Breakpoint/Watchpoint.h"
Chris Lattner24943d22010-06-08 16:52:24 +000019#include "lldb/Core/DataExtractor.h"
Enrico Granatad760907c2012-02-17 03:18:30 +000020#include "lldb/Core/DataVisualization.h"
Caroline Tice7826c882010-10-26 03:11:13 +000021#include "lldb/Core/Log.h"
Chris Lattner24943d22010-06-08 16:52:24 +000022#include "lldb/Core/Module.h"
Greg Clayton0fb0bcc2011-08-03 22:57:10 +000023#include "lldb/Core/Scalar.h"
Chris Lattner24943d22010-06-08 16:52:24 +000024#include "lldb/Core/Stream.h"
25#include "lldb/Core/StreamFile.h"
26#include "lldb/Core/Value.h"
27#include "lldb/Core/ValueObject.h"
Enrico Granata979e20d2011-07-29 19:53:35 +000028#include "lldb/Core/ValueObjectConstResult.h"
Chris Lattner24943d22010-06-08 16:52:24 +000029#include "lldb/Symbol/Block.h"
30#include "lldb/Symbol/ObjectFile.h"
Greg Clayton0a19a1b2012-02-04 02:27:34 +000031#include "lldb/Symbol/Type.h"
Chris Lattner24943d22010-06-08 16:52:24 +000032#include "lldb/Symbol/Variable.h"
Johnny Chenecd4feb2011-10-14 00:42:25 +000033#include "lldb/Symbol/VariableList.h"
Chris Lattner24943d22010-06-08 16:52:24 +000034#include "lldb/Target/ExecutionContext.h"
35#include "lldb/Target/Process.h"
36#include "lldb/Target/StackFrame.h"
Greg Claytonbdcda462010-12-20 20:49:23 +000037#include "lldb/Target/Target.h"
Chris Lattner24943d22010-06-08 16:52:24 +000038#include "lldb/Target/Thread.h"
39
Eli Friedman7a62c8b2010-06-09 07:44:37 +000040#include "lldb/API/SBProcess.h"
41#include "lldb/API/SBTarget.h"
42#include "lldb/API/SBThread.h"
43#include "lldb/API/SBFrame.h"
44#include "lldb/API/SBDebugger.h"
Chris Lattner24943d22010-06-08 16:52:24 +000045
46using namespace lldb;
47using namespace lldb_private;
48
49SBValue::SBValue () :
Greg Clayton63094e02010-06-23 01:19:29 +000050 m_opaque_sp ()
Chris Lattner24943d22010-06-08 16:52:24 +000051{
52}
53
54SBValue::SBValue (const lldb::ValueObjectSP &value_sp) :
Greg Clayton63094e02010-06-23 01:19:29 +000055 m_opaque_sp (value_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000056{
57}
58
Greg Clayton538eb822010-11-05 23:17:00 +000059SBValue::SBValue(const SBValue &rhs) :
60 m_opaque_sp (rhs.m_opaque_sp)
61{
62}
63
Greg Claytond68e0892011-09-09 23:04:00 +000064SBValue &
Greg Clayton538eb822010-11-05 23:17:00 +000065SBValue::operator = (const SBValue &rhs)
66{
67 if (this != &rhs)
68 m_opaque_sp = rhs.m_opaque_sp;
69 return *this;
70}
71
Chris Lattner24943d22010-06-08 16:52:24 +000072SBValue::~SBValue()
73{
74}
75
76bool
Greg Claytond68e0892011-09-09 23:04:00 +000077SBValue::IsValid ()
Chris Lattner24943d22010-06-08 16:52:24 +000078{
Greg Clayton49ce6822010-10-31 03:01:06 +000079 // If this function ever changes to anything that does more than just
80 // check if the opaque shared pointer is non NULL, then we need to update
81 // all "if (m_opaque_sp)" code in this file.
82 return m_opaque_sp.get() != NULL;
Chris Lattner24943d22010-06-08 16:52:24 +000083}
84
Jim Inghame0bd5712011-12-19 20:39:44 +000085void
86SBValue::Clear()
87{
88 m_opaque_sp.reset();
89}
90
Greg Claytonc5f728c2010-10-06 22:10:17 +000091SBError
92SBValue::GetError()
93{
94 SBError sb_error;
95
Greg Clayton0a19a1b2012-02-04 02:27:34 +000096 lldb::ValueObjectSP value_sp(GetSP());
97 if (value_sp)
98 sb_error.SetError(value_sp->GetError());
Greg Clayton334d33a2012-01-30 07:41:31 +000099 else
100 sb_error.SetErrorString("error: invalid value");
Greg Claytonc5f728c2010-10-06 22:10:17 +0000101
102 return sb_error;
103}
104
Johnny Chen968958c2011-07-07 20:46:23 +0000105user_id_t
106SBValue::GetID()
107{
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000108 lldb::ValueObjectSP value_sp(GetSP());
109 if (value_sp)
110 return value_sp->GetID();
Johnny Chen968958c2011-07-07 20:46:23 +0000111 return LLDB_INVALID_UID;
112}
113
Chris Lattner24943d22010-06-08 16:52:24 +0000114const char *
115SBValue::GetName()
116{
Greg Clayton49ce6822010-10-31 03:01:06 +0000117
118 const char *name = NULL;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000119 lldb::ValueObjectSP value_sp(GetSP());
120 if (value_sp)
121 name = value_sp->GetName().GetCString();
Greg Clayton49ce6822010-10-31 03:01:06 +0000122
Greg Claytone005f2c2010-11-06 01:53:30 +0000123 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton3f5ee7f2010-10-29 04:59:35 +0000124 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000125 {
126 if (name)
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000127 log->Printf ("SBValue(%p)::GetName () => \"%s\"", value_sp.get(), name);
Greg Clayton49ce6822010-10-31 03:01:06 +0000128 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000129 log->Printf ("SBValue(%p)::GetName () => NULL", value_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +0000130 }
Caroline Tice7826c882010-10-26 03:11:13 +0000131
Greg Clayton49ce6822010-10-31 03:01:06 +0000132 return name;
Chris Lattner24943d22010-06-08 16:52:24 +0000133}
134
135const char *
136SBValue::GetTypeName ()
137{
Greg Clayton49ce6822010-10-31 03:01:06 +0000138 const char *name = NULL;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000139 lldb::ValueObjectSP value_sp(GetSP());
140 if (value_sp)
141 name = value_sp->GetTypeName().GetCString();
Greg Claytone005f2c2010-11-06 01:53:30 +0000142 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000143 if (log)
144 {
145 if (name)
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000146 log->Printf ("SBValue(%p)::GetTypeName () => \"%s\"", value_sp.get(), name);
Greg Clayton49ce6822010-10-31 03:01:06 +0000147 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000148 log->Printf ("SBValue(%p)::GetTypeName () => NULL", value_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +0000149 }
150
151 return name;
Chris Lattner24943d22010-06-08 16:52:24 +0000152}
153
154size_t
155SBValue::GetByteSize ()
156{
157 size_t result = 0;
158
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000159 lldb::ValueObjectSP value_sp(GetSP());
160 if (value_sp)
161 result = value_sp->GetByteSize();
Chris Lattner24943d22010-06-08 16:52:24 +0000162
Greg Claytone005f2c2010-11-06 01:53:30 +0000163 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000164 if (log)
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000165 log->Printf ("SBValue(%p)::GetByteSize () => %zu", value_sp.get(), result);
Greg Clayton49ce6822010-10-31 03:01:06 +0000166
Chris Lattner24943d22010-06-08 16:52:24 +0000167 return result;
168}
169
170bool
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000171SBValue::IsInScope ()
172{
Chris Lattner24943d22010-06-08 16:52:24 +0000173 bool result = false;
174
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000175 lldb::ValueObjectSP value_sp(GetSP());
176 if (value_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000177 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000178 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
179 if (target_sp)
Greg Claytonb9dcc512011-06-29 18:28:50 +0000180 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000181 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
182 result = value_sp->IsInScope ();
Greg Claytonb9dcc512011-06-29 18:28:50 +0000183 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000184 }
Chris Lattner24943d22010-06-08 16:52:24 +0000185
Greg Claytone005f2c2010-11-06 01:53:30 +0000186 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000187 if (log)
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000188 log->Printf ("SBValue(%p)::IsInScope () => %i", value_sp.get(), result);
Greg Clayton49ce6822010-10-31 03:01:06 +0000189
Chris Lattner24943d22010-06-08 16:52:24 +0000190 return result;
191}
192
193const char *
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000194SBValue::GetValue ()
195{
Greg Clayton49ce6822010-10-31 03:01:06 +0000196 const char *cstr = NULL;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000197 lldb::ValueObjectSP value_sp(GetSP());
198 if (value_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000199 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000200 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
201 if (target_sp)
Greg Claytonb9dcc512011-06-29 18:28:50 +0000202 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000203 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
204 cstr = value_sp->GetValueAsCString ();
Greg Claytonb9dcc512011-06-29 18:28:50 +0000205 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000206 }
Greg Claytone005f2c2010-11-06 01:53:30 +0000207 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000208 if (log)
209 {
210 if (cstr)
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000211 log->Printf ("SBValue(%p)::GetValue => \"%s\"", value_sp.get(), cstr);
Greg Clayton49ce6822010-10-31 03:01:06 +0000212 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000213 log->Printf ("SBValue(%p)::GetValue => NULL", value_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +0000214 }
215
216 return cstr;
Chris Lattner24943d22010-06-08 16:52:24 +0000217}
218
Greg Claytonf3d0b0c2010-10-27 03:32:59 +0000219ValueType
220SBValue::GetValueType ()
221{
Greg Clayton49ce6822010-10-31 03:01:06 +0000222 ValueType result = eValueTypeInvalid;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000223 lldb::ValueObjectSP value_sp(GetSP());
224 if (value_sp)
225 result = value_sp->GetValueType();
Greg Claytone005f2c2010-11-06 01:53:30 +0000226 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000227 if (log)
228 {
229 switch (result)
230 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000231 case eValueTypeInvalid: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeInvalid", value_sp.get()); break;
232 case eValueTypeVariableGlobal: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableGlobal", value_sp.get()); break;
233 case eValueTypeVariableStatic: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableStatic", value_sp.get()); break;
234 case eValueTypeVariableArgument:log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableArgument", value_sp.get()); break;
235 case eValueTypeVariableLocal: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableLocal", value_sp.get()); break;
236 case eValueTypeRegister: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeRegister", value_sp.get()); break;
237 case eValueTypeRegisterSet: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeRegisterSet", value_sp.get()); break;
238 case eValueTypeConstResult: log->Printf ("SBValue(%p)::GetValueType () => eValueTypeConstResult", value_sp.get()); break;
239 default: log->Printf ("SBValue(%p)::GetValueType () => %i ???", value_sp.get(), result); break;
Greg Clayton49ce6822010-10-31 03:01:06 +0000240 }
241 }
242 return result;
Greg Claytonf3d0b0c2010-10-27 03:32:59 +0000243}
244
Jim Ingham4ae51962010-09-10 23:12:17 +0000245const char *
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000246SBValue::GetObjectDescription ()
247{
Greg Clayton49ce6822010-10-31 03:01:06 +0000248 const char *cstr = NULL;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000249 lldb::ValueObjectSP value_sp(GetSP());
250 if (value_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000251 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000252 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
253 if (target_sp)
Greg Claytonb9dcc512011-06-29 18:28:50 +0000254 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000255 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
256 cstr = value_sp->GetObjectDescription ();
Greg Claytonb9dcc512011-06-29 18:28:50 +0000257 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000258 }
Greg Claytone005f2c2010-11-06 01:53:30 +0000259 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000260 if (log)
261 {
262 if (cstr)
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000263 log->Printf ("SBValue(%p)::GetObjectDescription => \"%s\"", value_sp.get(), cstr);
Greg Clayton49ce6822010-10-31 03:01:06 +0000264 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000265 log->Printf ("SBValue(%p)::GetObjectDescription => NULL", value_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +0000266 }
267 return cstr;
Jim Ingham4ae51962010-09-10 23:12:17 +0000268}
269
Enrico Granata979e20d2011-07-29 19:53:35 +0000270SBType
271SBValue::GetType()
272{
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000273 SBType sb_type;
274 lldb::ValueObjectSP value_sp(GetSP());
275 TypeImplSP type_sp;
276 if (value_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +0000277 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000278 type_sp.reset (new TypeImpl(ClangASTType (value_sp->GetClangAST(), value_sp->GetClangType())));
279 sb_type.SetSP(type_sp);
Enrico Granata979e20d2011-07-29 19:53:35 +0000280 }
281 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
282 if (log)
283 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000284 if (type_sp)
285 log->Printf ("SBValue(%p)::GetType => SBType(%p)", value_sp.get(), type_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +0000286 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000287 log->Printf ("SBValue(%p)::GetType => NULL", value_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +0000288 }
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000289 return sb_type;
Enrico Granata979e20d2011-07-29 19:53:35 +0000290}
291
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000292bool
293SBValue::GetValueDidChange ()
294{
Greg Clayton49ce6822010-10-31 03:01:06 +0000295 bool result = false;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000296 lldb::ValueObjectSP value_sp(GetSP());
297 if (value_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000298 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000299 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
300 if (target_sp)
Greg Claytonb9dcc512011-06-29 18:28:50 +0000301 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000302 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
303 result = value_sp->GetValueDidChange ();
Greg Claytonb9dcc512011-06-29 18:28:50 +0000304 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000305 }
Greg Claytone005f2c2010-11-06 01:53:30 +0000306 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000307 if (log)
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000308 log->Printf ("SBValue(%p)::GetValueDidChange => %i", value_sp.get(), result);
Greg Clayton49ce6822010-10-31 03:01:06 +0000309
310 return result;
Chris Lattner24943d22010-06-08 16:52:24 +0000311}
312
313const char *
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000314SBValue::GetSummary ()
315{
Greg Clayton49ce6822010-10-31 03:01:06 +0000316 const char *cstr = NULL;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000317 lldb::ValueObjectSP value_sp(GetSP());
318 if (value_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000319 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000320 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
321 if (target_sp)
Greg Claytonb9dcc512011-06-29 18:28:50 +0000322 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000323 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
324 cstr = value_sp->GetSummaryAsCString();
Greg Claytonb9dcc512011-06-29 18:28:50 +0000325 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000326 }
Greg Claytone005f2c2010-11-06 01:53:30 +0000327 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000328 if (log)
329 {
330 if (cstr)
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000331 log->Printf ("SBValue(%p)::GetSummary => \"%s\"", value_sp.get(), cstr);
Greg Clayton49ce6822010-10-31 03:01:06 +0000332 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000333 log->Printf ("SBValue(%p)::GetSummary => NULL", value_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +0000334 }
335 return cstr;
Chris Lattner24943d22010-06-08 16:52:24 +0000336}
337
338const char *
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000339SBValue::GetLocation ()
340{
Greg Clayton49ce6822010-10-31 03:01:06 +0000341 const char *cstr = NULL;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000342 lldb::ValueObjectSP value_sp(GetSP());
343 if (value_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000344 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000345 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
346 if (target_sp)
Greg Claytonb9dcc512011-06-29 18:28:50 +0000347 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000348 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
349 cstr = value_sp->GetLocationAsCString();
Greg Claytonb9dcc512011-06-29 18:28:50 +0000350 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000351 }
Greg Claytone005f2c2010-11-06 01:53:30 +0000352 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000353 if (log)
354 {
355 if (cstr)
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000356 log->Printf ("SBValue(%p)::GetSummary => \"%s\"", value_sp.get(), cstr);
Greg Clayton49ce6822010-10-31 03:01:06 +0000357 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000358 log->Printf ("SBValue(%p)::GetSummary => NULL", value_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +0000359 }
360 return cstr;
Chris Lattner24943d22010-06-08 16:52:24 +0000361}
362
363bool
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000364SBValue::SetValueFromCString (const char *value_str)
365{
Chris Lattner24943d22010-06-08 16:52:24 +0000366 bool success = false;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000367 lldb::ValueObjectSP value_sp(GetSP());
368 if (value_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000369 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000370 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
371 if (target_sp)
Greg Claytonb9dcc512011-06-29 18:28:50 +0000372 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000373 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
374 success = value_sp->SetValueFromCString (value_str);
Greg Claytonb9dcc512011-06-29 18:28:50 +0000375 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000376 }
Chris Lattner24943d22010-06-08 16:52:24 +0000377 return success;
378}
379
Enrico Granatad760907c2012-02-17 03:18:30 +0000380lldb::SBTypeFormat
381SBValue::GetTypeFormat ()
382{
383 lldb::SBTypeFormat format;
384 lldb::ValueObjectSP value_sp(GetSP());
385 if (value_sp)
386 {
387 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
388 if (value_sp->UpdateValueIfNeeded(true))
389 {
390 lldb::TypeFormatImplSP format_sp = value_sp->GetValueFormat();
391 if (format_sp)
392 format.SetSP(format_sp);
393 }
394 }
395 return format;
396}
397
398lldb::SBTypeSummary
399SBValue::GetTypeSummary ()
400{
401 lldb::SBTypeSummary summary;
402 lldb::ValueObjectSP value_sp(GetSP());
403 if (value_sp)
404 {
405 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
406 if (value_sp->UpdateValueIfNeeded(true))
407 {
408 lldb::TypeSummaryImplSP summary_sp = value_sp->GetSummaryFormat();
409 if (summary_sp)
410 summary.SetSP(summary_sp);
411 }
412 }
413 return summary;
414}
415
416lldb::SBTypeFilter
417SBValue::GetTypeFilter ()
418{
419 lldb::SBTypeFilter filter;
420 lldb::ValueObjectSP value_sp(GetSP());
421 if (value_sp)
422 {
423 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
424 if (value_sp->UpdateValueIfNeeded(true))
425 {
426 lldb::SyntheticChildrenSP synthetic_sp = value_sp->GetSyntheticChildren();
427
428 if (synthetic_sp && !synthetic_sp->IsScripted())
429 {
430 TypeFilterImplSP filter_sp = std::tr1::static_pointer_cast<TypeFilterImpl>(synthetic_sp);
431 filter.SetSP(filter_sp);
432 }
433 }
434 }
435 return filter;
436}
437
438lldb::SBTypeSynthetic
439SBValue::GetTypeSynthetic ()
440{
441 lldb::SBTypeSynthetic synthetic;
442 lldb::ValueObjectSP value_sp(GetSP());
443 if (value_sp)
444 {
445 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
446 if (value_sp->UpdateValueIfNeeded(true))
447 {
448 lldb::SyntheticChildrenSP children_sp = value_sp->GetSyntheticChildren();
449
450 if (children_sp && children_sp->IsScripted())
451 {
452 TypeSyntheticImplSP synth_sp = std::tr1::static_pointer_cast<TypeSyntheticImpl>(children_sp);
453 synthetic.SetSP(synth_sp);
454 }
455 }
456 }
457 return synthetic;
458}
459
Enrico Granata979e20d2011-07-29 19:53:35 +0000460lldb::SBValue
Greg Claytond68e0892011-09-09 23:04:00 +0000461SBValue::CreateChildAtOffset (const char *name, uint32_t offset, SBType type)
Enrico Granata979e20d2011-07-29 19:53:35 +0000462{
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000463 lldb::SBValue sb_value;
464 lldb::ValueObjectSP value_sp(GetSP());
465 lldb::ValueObjectSP new_value_sp;
466 if (value_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +0000467 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000468 TypeImplSP type_sp (type.GetSP());
Enrico Granata979e20d2011-07-29 19:53:35 +0000469 if (type.IsValid())
470 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000471 sb_value = SBValue(value_sp->GetSyntheticChildAtOffset(offset, type_sp->GetClangASTType(), true));
472 new_value_sp = sb_value.GetSP();
473 if (new_value_sp)
474 new_value_sp->SetName(ConstString(name));
Enrico Granata979e20d2011-07-29 19:53:35 +0000475 }
476 }
477 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
478 if (log)
479 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000480 if (new_value_sp)
481 log->Printf ("SBValue(%p)::GetChildAtOffset => \"%s\"", value_sp.get(), new_value_sp->GetName().AsCString());
Enrico Granata979e20d2011-07-29 19:53:35 +0000482 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000483 log->Printf ("SBValue(%p)::GetChildAtOffset => NULL", value_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +0000484 }
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000485 return sb_value;
Enrico Granata979e20d2011-07-29 19:53:35 +0000486}
487
488lldb::SBValue
Greg Claytond68e0892011-09-09 23:04:00 +0000489SBValue::Cast (SBType type)
Enrico Granata979e20d2011-07-29 19:53:35 +0000490{
Greg Clayton4eb01a72012-01-31 04:25:15 +0000491 lldb::SBValue sb_value;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000492 lldb::ValueObjectSP value_sp(GetSP());
493 TypeImplSP type_sp (type.GetSP());
494 if (value_sp && type_sp)
495 sb_value.SetSP(value_sp->Cast(type_sp->GetClangASTType()));
Greg Clayton4eb01a72012-01-31 04:25:15 +0000496 return sb_value;
Enrico Granata979e20d2011-07-29 19:53:35 +0000497}
498
499lldb::SBValue
500SBValue::CreateValueFromExpression (const char *name, const char* expression)
501{
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000502 lldb::SBValue sb_value;
503 lldb::ValueObjectSP value_sp(GetSP());
504 lldb::ValueObjectSP new_value_sp;
505 if (value_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +0000506 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000507 value_sp->GetUpdatePoint().GetTargetSP()->EvaluateExpression (expression,
508 value_sp->GetExecutionContextScope()->CalculateStackFrame(),
509 eExecutionPolicyOnlyWhenNeeded,
510 false, // coerce to id
511 true, // unwind on error
512 true, // keep in memory
513 eNoDynamicValues,
514 new_value_sp);
515 if (new_value_sp)
Johnny Chen9fd2e382011-12-20 01:52:44 +0000516 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000517 new_value_sp->SetName(ConstString(name));
518 sb_value.SetSP(new_value_sp);
Johnny Chen9fd2e382011-12-20 01:52:44 +0000519 }
Enrico Granata979e20d2011-07-29 19:53:35 +0000520 }
521 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
522 if (log)
523 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000524 if (new_value_sp)
525 log->Printf ("SBValue(%p)::GetChildFromExpression => \"%s\"", value_sp.get(), new_value_sp->GetName().AsCString());
Enrico Granata979e20d2011-07-29 19:53:35 +0000526 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000527 log->Printf ("SBValue(%p)::GetChildFromExpression => NULL", value_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +0000528 }
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000529 return sb_value;
Enrico Granata979e20d2011-07-29 19:53:35 +0000530}
531
532lldb::SBValue
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000533SBValue::CreateValueFromAddress(const char* name, lldb::addr_t address, SBType sb_type)
Enrico Granata979e20d2011-07-29 19:53:35 +0000534{
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000535 lldb::SBValue sb_value;
536 lldb::ValueObjectSP value_sp(GetSP());
537 lldb::ValueObjectSP new_value_sp;
538 lldb::TypeImplSP type_impl_sp (sb_type.GetSP());
539 if (value_sp && type_impl_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +0000540 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000541 ClangASTType pointee_ast_type(type_impl_sp->GetASTContext(), type_impl_sp->GetClangASTType().GetPointerType ());
542 lldb::TypeImplSP pointee_type_impl_sp (new TypeImpl(pointee_ast_type));
543 if (pointee_type_impl_sp)
Enrico Granatac9310302011-08-04 17:07:02 +0000544 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000545
546 lldb::DataBufferSP buffer(new lldb_private::DataBufferHeap(&address,sizeof(lldb::addr_t)));
547
548 ValueObjectSP ptr_result_valobj_sp(ValueObjectConstResult::Create (value_sp->GetExecutionContextScope(),
549 pointee_type_impl_sp->GetASTContext(),
550 pointee_type_impl_sp->GetOpaqueQualType(),
551 ConstString(name),
552 buffer,
553 lldb::endian::InlHostByteOrder(),
554 GetTarget().GetProcess().GetAddressByteSize()));
555
556 if (ptr_result_valobj_sp)
557 {
558 ptr_result_valobj_sp->GetValue().SetValueType(Value::eValueTypeLoadAddress);
559 Error err;
560 new_value_sp = ptr_result_valobj_sp->Dereference(err);
561 if (new_value_sp)
562 new_value_sp->SetName(ConstString(name));
563 }
564 sb_value.SetSP(new_value_sp);
Enrico Granatac9310302011-08-04 17:07:02 +0000565 }
Enrico Granata979e20d2011-07-29 19:53:35 +0000566 }
567 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
568 if (log)
569 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000570 if (new_value_sp)
571 log->Printf ("SBValue(%p)::CreateValueFromAddress => \"%s\"", value_sp.get(), new_value_sp->GetName().AsCString());
Johnny Chena713b862011-08-09 22:38:07 +0000572 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000573 log->Printf ("SBValue(%p)::CreateValueFromAddress => NULL", value_sp.get());
Johnny Chena713b862011-08-09 22:38:07 +0000574 }
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000575 return sb_value;
Enrico Granata979e20d2011-07-29 19:53:35 +0000576}
577
Enrico Granata91544802011-09-06 19:20:51 +0000578lldb::SBValue
Greg Claytond68e0892011-09-09 23:04:00 +0000579SBValue::CreateValueFromData (const char* name, SBData data, SBType type)
Enrico Granata91544802011-09-06 19:20:51 +0000580{
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000581 lldb::SBValue sb_value;
582 lldb::ValueObjectSP new_value_sp;
583 lldb::ValueObjectSP value_sp(GetSP());
584 if (value_sp)
Enrico Granata91544802011-09-06 19:20:51 +0000585 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000586 new_value_sp = ValueObjectConstResult::Create (value_sp->GetExecutionContextScope(),
587 type.m_opaque_sp->GetASTContext() ,
588 type.m_opaque_sp->GetOpaqueQualType(),
589 ConstString(name),
590 *data.m_opaque_sp,
591 LLDB_INVALID_ADDRESS);
592 new_value_sp->SetAddressTypeOfChildren(eAddressTypeLoad);
593 sb_value.SetSP(new_value_sp);
Enrico Granata91544802011-09-06 19:20:51 +0000594 }
595 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
596 if (log)
597 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000598 if (new_value_sp)
599 log->Printf ("SBValue(%p)::GetChildFromExpression => \"%s\"", value_sp.get(), new_value_sp->GetName().AsCString());
Enrico Granata91544802011-09-06 19:20:51 +0000600 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000601 log->Printf ("SBValue(%p)::GetChildFromExpression => NULL", value_sp.get());
Enrico Granata91544802011-09-06 19:20:51 +0000602 }
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000603 return sb_value;
Enrico Granata91544802011-09-06 19:20:51 +0000604}
605
Chris Lattner24943d22010-06-08 16:52:24 +0000606SBValue
607SBValue::GetChildAtIndex (uint32_t idx)
608{
Greg Clayton8f64c472011-07-15 19:31:49 +0000609 const bool can_create_synthetic = false;
610 lldb::DynamicValueType use_dynamic = eNoDynamicValues;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000611 lldb::ValueObjectSP value_sp(GetSP());
612 if (value_sp)
613 use_dynamic = value_sp->GetUpdatePoint().GetTargetSP()->GetPreferDynamicValue();
Greg Clayton8f64c472011-07-15 19:31:49 +0000614 return GetChildAtIndex (idx, use_dynamic, can_create_synthetic);
Jim Inghame41494a2011-04-16 00:01:13 +0000615}
616
617SBValue
Greg Clayton8f64c472011-07-15 19:31:49 +0000618SBValue::GetChildAtIndex (uint32_t idx, lldb::DynamicValueType use_dynamic, bool can_create_synthetic)
Jim Inghame41494a2011-04-16 00:01:13 +0000619{
Chris Lattner24943d22010-06-08 16:52:24 +0000620 lldb::ValueObjectSP child_sp;
621
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000622 lldb::ValueObjectSP value_sp(GetSP());
623 if (value_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000624 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000625 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
626 if (target_sp)
Greg Claytonb9dcc512011-06-29 18:28:50 +0000627 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000628 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
Greg Clayton8f64c472011-07-15 19:31:49 +0000629 const bool can_create = true;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000630 child_sp = value_sp->GetChildAtIndex (idx, can_create);
Greg Clayton8f64c472011-07-15 19:31:49 +0000631 if (can_create_synthetic && !child_sp)
Greg Claytonfab305b2011-05-20 23:51:26 +0000632 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000633 if (value_sp->IsPointerType())
Greg Claytonb9dcc512011-06-29 18:28:50 +0000634 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000635 child_sp = value_sp->GetSyntheticArrayMemberFromPointer(idx, can_create);
Greg Clayton8f64c472011-07-15 19:31:49 +0000636 }
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000637 else if (value_sp->IsArrayType())
Greg Clayton8f64c472011-07-15 19:31:49 +0000638 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000639 child_sp = value_sp->GetSyntheticArrayMemberFromArray(idx, can_create);
Greg Clayton8f64c472011-07-15 19:31:49 +0000640 }
641 }
642
643 if (child_sp)
644 {
645 if (use_dynamic != lldb::eNoDynamicValues)
646 {
647 lldb::ValueObjectSP dynamic_sp(child_sp->GetDynamicValue (use_dynamic));
Greg Claytonb9dcc512011-06-29 18:28:50 +0000648 if (dynamic_sp)
649 child_sp = dynamic_sp;
650 }
Greg Claytonfab305b2011-05-20 23:51:26 +0000651 }
Jim Inghame41494a2011-04-16 00:01:13 +0000652 }
653 }
654
Chris Lattner24943d22010-06-08 16:52:24 +0000655 SBValue sb_value (child_sp);
Greg Claytone005f2c2010-11-06 01:53:30 +0000656 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000657 if (log)
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000658 log->Printf ("SBValue(%p)::GetChildAtIndex (%u) => SBValue(%p)", value_sp.get(), idx, value_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +0000659
Chris Lattner24943d22010-06-08 16:52:24 +0000660 return sb_value;
661}
662
663uint32_t
664SBValue::GetIndexOfChildWithName (const char *name)
665{
Greg Clayton49ce6822010-10-31 03:01:06 +0000666 uint32_t idx = UINT32_MAX;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000667 lldb::ValueObjectSP value_sp(GetSP());
668 if (value_sp)
Greg Claytonfab305b2011-05-20 23:51:26 +0000669 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000670 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
671 if (target_sp)
Greg Claytonb9dcc512011-06-29 18:28:50 +0000672 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000673 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
Greg Claytonfab305b2011-05-20 23:51:26 +0000674
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000675 idx = value_sp->GetIndexOfChildWithName (ConstString(name));
Greg Claytonb9dcc512011-06-29 18:28:50 +0000676 }
Greg Claytonfab305b2011-05-20 23:51:26 +0000677 }
Greg Claytone005f2c2010-11-06 01:53:30 +0000678 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000679 if (log)
680 {
681 if (idx == UINT32_MAX)
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000682 log->Printf ("SBValue(%p)::GetIndexOfChildWithName (name=\"%s\") => NOT FOUND", value_sp.get(), name);
Greg Clayton49ce6822010-10-31 03:01:06 +0000683 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000684 log->Printf ("SBValue(%p)::GetIndexOfChildWithName (name=\"%s\") => %u", value_sp.get(), name, idx);
Greg Clayton49ce6822010-10-31 03:01:06 +0000685 }
686 return idx;
Chris Lattner24943d22010-06-08 16:52:24 +0000687}
688
689SBValue
690SBValue::GetChildMemberWithName (const char *name)
691{
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000692 lldb::ValueObjectSP value_sp(GetSP());
693 if (value_sp)
Johnny Chen446ccaa2011-06-29 21:19:39 +0000694 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000695 lldb::DynamicValueType use_dynamic_value = eNoDynamicValues;
696 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
697 if (target_sp)
698 {
699 Mutex::Locker api_locker (target_sp->GetAPIMutex());
700 use_dynamic_value = target_sp->GetPreferDynamicValue();
701 }
Johnny Chen446ccaa2011-06-29 21:19:39 +0000702 return GetChildMemberWithName (name, use_dynamic_value);
703 }
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000704 return SBValue();
Jim Inghame41494a2011-04-16 00:01:13 +0000705}
706
707SBValue
Jim Ingham10de7d12011-05-04 03:43:18 +0000708SBValue::GetChildMemberWithName (const char *name, lldb::DynamicValueType use_dynamic_value)
Jim Inghame41494a2011-04-16 00:01:13 +0000709{
Chris Lattner24943d22010-06-08 16:52:24 +0000710 lldb::ValueObjectSP child_sp;
711 const ConstString str_name (name);
712
Greg Clayton905acaf2011-05-20 22:07:17 +0000713
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000714 lldb::ValueObjectSP value_sp(GetSP());
715 if (value_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000716 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000717 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
718 if (target_sp)
Jim Inghame41494a2011-04-16 00:01:13 +0000719 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000720 Mutex::Locker api_locker (target_sp->GetAPIMutex());
721 child_sp = value_sp->GetChildMemberWithName (str_name, true);
Greg Claytonb9dcc512011-06-29 18:28:50 +0000722 if (use_dynamic_value != lldb::eNoDynamicValues)
Greg Claytonfab305b2011-05-20 23:51:26 +0000723 {
Greg Claytonb9dcc512011-06-29 18:28:50 +0000724 if (child_sp)
725 {
726 lldb::ValueObjectSP dynamic_sp = child_sp->GetDynamicValue (use_dynamic_value);
727 if (dynamic_sp)
728 child_sp = dynamic_sp;
729 }
Greg Claytonfab305b2011-05-20 23:51:26 +0000730 }
Jim Inghame41494a2011-04-16 00:01:13 +0000731 }
732 }
733
Chris Lattner24943d22010-06-08 16:52:24 +0000734 SBValue sb_value (child_sp);
Greg Clayton49ce6822010-10-31 03:01:06 +0000735
Greg Claytone005f2c2010-11-06 01:53:30 +0000736 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000737 if (log)
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000738 log->Printf ("SBValue(%p)::GetChildMemberWithName (name=\"%s\") => SBValue(%p)", value_sp.get(), name, value_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +0000739
Chris Lattner24943d22010-06-08 16:52:24 +0000740 return sb_value;
741}
742
Enrico Granataf7a9b142011-07-15 02:26:42 +0000743lldb::SBValue
Jim Ingham1b425752011-12-08 19:44:08 +0000744SBValue::GetDynamicValue (lldb::DynamicValueType use_dynamic)
745{
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000746 lldb::ValueObjectSP value_sp(GetSP());
747 if (value_sp)
Jim Ingham1b425752011-12-08 19:44:08 +0000748 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000749 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
750 if (target_sp)
Jim Ingham1b425752011-12-08 19:44:08 +0000751 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000752 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
753 return SBValue (value_sp->GetDynamicValue(use_dynamic));
Jim Ingham1b425752011-12-08 19:44:08 +0000754 }
755 }
756
757 return SBValue();
758}
759
760lldb::SBValue
761SBValue::GetStaticValue ()
762{
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000763 lldb::ValueObjectSP value_sp(GetSP());
764 if (value_sp)
Jim Ingham1b425752011-12-08 19:44:08 +0000765 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000766 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
767 if (target_sp)
Jim Ingham1b425752011-12-08 19:44:08 +0000768 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000769 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
770 return SBValue(value_sp->GetStaticValue());
Jim Ingham1b425752011-12-08 19:44:08 +0000771 }
772 }
773
774 return SBValue();
775}
776
777bool
778SBValue::IsDynamic()
779{
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000780 lldb::ValueObjectSP value_sp(GetSP());
781 if (value_sp)
Jim Ingham1b425752011-12-08 19:44:08 +0000782 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000783 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
784 if (target_sp)
Jim Ingham1b425752011-12-08 19:44:08 +0000785 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000786 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
787 return value_sp->IsDynamic();
Jim Ingham1b425752011-12-08 19:44:08 +0000788 }
789 }
790 return false;
791}
792
793lldb::SBValue
Enrico Granataf7a9b142011-07-15 02:26:42 +0000794SBValue::GetValueForExpressionPath(const char* expr_path)
795{
796 lldb::ValueObjectSP child_sp;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000797 lldb::ValueObjectSP value_sp(GetSP());
798 if (value_sp)
Enrico Granataf7a9b142011-07-15 02:26:42 +0000799 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000800 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
801 if (target_sp)
Enrico Granataf7a9b142011-07-15 02:26:42 +0000802 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000803 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
Enrico Granataf7a9b142011-07-15 02:26:42 +0000804 // using default values for all the fancy options, just do it if you can
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000805 child_sp = value_sp->GetValueForExpressionPath(expr_path);
Enrico Granataf7a9b142011-07-15 02:26:42 +0000806 }
807 }
808
809 SBValue sb_value (child_sp);
810
811 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
812 if (log)
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000813 log->Printf ("SBValue(%p)::GetValueForExpressionPath (expr_path=\"%s\") => SBValue(%p)", value_sp.get(), expr_path, value_sp.get());
Enrico Granataf7a9b142011-07-15 02:26:42 +0000814
815 return sb_value;
816}
Chris Lattner24943d22010-06-08 16:52:24 +0000817
Greg Clayton0fb0bcc2011-08-03 22:57:10 +0000818int64_t
Enrico Granatac92eb402011-08-04 01:41:02 +0000819SBValue::GetValueAsSigned(SBError& error, int64_t fail_value)
820{
Jim Ingham574c3d62011-08-12 23:34:31 +0000821 error.Clear();
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000822 lldb::ValueObjectSP value_sp(GetSP());
823 if (value_sp)
Enrico Granatac92eb402011-08-04 01:41:02 +0000824 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000825 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
826 if (target_sp)
Enrico Granatac92eb402011-08-04 01:41:02 +0000827 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000828 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
Enrico Granatac92eb402011-08-04 01:41:02 +0000829 Scalar scalar;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000830 if (value_sp->ResolveValue (scalar))
Enrico Granatac92eb402011-08-04 01:41:02 +0000831 return scalar.GetRawBits64(fail_value);
832 else
833 error.SetErrorString("could not get value");
834 }
835 else
836 error.SetErrorString("could not get target");
837 }
838 error.SetErrorString("invalid SBValue");
839 return fail_value;
840}
841
842uint64_t
843SBValue::GetValueAsUnsigned(SBError& error, uint64_t fail_value)
844{
Jim Ingham574c3d62011-08-12 23:34:31 +0000845 error.Clear();
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000846 lldb::ValueObjectSP value_sp(GetSP());
847 if (value_sp)
Enrico Granatac92eb402011-08-04 01:41:02 +0000848 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000849 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
850 if (target_sp)
Enrico Granatac92eb402011-08-04 01:41:02 +0000851 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000852 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
Enrico Granatac92eb402011-08-04 01:41:02 +0000853 Scalar scalar;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000854 if (value_sp->ResolveValue (scalar))
Enrico Granatac92eb402011-08-04 01:41:02 +0000855 return scalar.GetRawBits64(fail_value);
856 else
857 error.SetErrorString("could not get value");
858 }
859 else
860 error.SetErrorString("could not get target");
861 }
862 error.SetErrorString("invalid SBValue");
863 return fail_value;
864}
865
866int64_t
Greg Clayton0fb0bcc2011-08-03 22:57:10 +0000867SBValue::GetValueAsSigned(int64_t fail_value)
868{
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000869 lldb::ValueObjectSP value_sp(GetSP());
870 if (value_sp)
Greg Clayton0fb0bcc2011-08-03 22:57:10 +0000871 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000872 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
873 if (target_sp)
Greg Clayton0fb0bcc2011-08-03 22:57:10 +0000874 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000875 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
Greg Clayton0fb0bcc2011-08-03 22:57:10 +0000876 Scalar scalar;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000877 if (value_sp->ResolveValue (scalar))
Greg Clayton0fb0bcc2011-08-03 22:57:10 +0000878 return scalar.GetRawBits64(fail_value);
879 }
880 }
881 return fail_value;
882}
883
884uint64_t
885SBValue::GetValueAsUnsigned(uint64_t fail_value)
886{
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000887 lldb::ValueObjectSP value_sp(GetSP());
888 if (value_sp)
Greg Clayton0fb0bcc2011-08-03 22:57:10 +0000889 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000890 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
891 if (target_sp)
Greg Clayton0fb0bcc2011-08-03 22:57:10 +0000892 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000893 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
Greg Clayton0fb0bcc2011-08-03 22:57:10 +0000894 Scalar scalar;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000895 if (value_sp->ResolveValue (scalar))
Greg Clayton0fb0bcc2011-08-03 22:57:10 +0000896 return scalar.GetRawBits64(fail_value);
897 }
898 }
899 return fail_value;
900}
901
Chris Lattner24943d22010-06-08 16:52:24 +0000902uint32_t
903SBValue::GetNumChildren ()
904{
905 uint32_t num_children = 0;
906
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000907 lldb::ValueObjectSP value_sp(GetSP());
908 if (value_sp)
Greg Claytonfab305b2011-05-20 23:51:26 +0000909 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000910 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
911 if (target_sp)
Greg Claytonb9dcc512011-06-29 18:28:50 +0000912 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000913 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
Greg Claytonfab305b2011-05-20 23:51:26 +0000914
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000915 num_children = value_sp->GetNumChildren();
Greg Claytonb9dcc512011-06-29 18:28:50 +0000916 }
Greg Claytonfab305b2011-05-20 23:51:26 +0000917 }
Greg Clayton49ce6822010-10-31 03:01:06 +0000918
Greg Claytone005f2c2010-11-06 01:53:30 +0000919 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000920 if (log)
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000921 log->Printf ("SBValue(%p)::GetNumChildren () => %u", value_sp.get(), num_children);
Chris Lattner24943d22010-06-08 16:52:24 +0000922
923 return num_children;
924}
925
Chris Lattner24943d22010-06-08 16:52:24 +0000926
927SBValue
928SBValue::Dereference ()
929{
Greg Clayton49ce6822010-10-31 03:01:06 +0000930 SBValue sb_value;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000931 lldb::ValueObjectSP value_sp(GetSP());
932 if (value_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000933 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000934 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
935 if (target_sp)
Greg Claytonb9dcc512011-06-29 18:28:50 +0000936 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000937 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
Greg Claytonfab305b2011-05-20 23:51:26 +0000938
Greg Claytonb9dcc512011-06-29 18:28:50 +0000939 Error error;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000940 sb_value = value_sp->Dereference (error);
Greg Claytonb9dcc512011-06-29 18:28:50 +0000941 }
Chris Lattner24943d22010-06-08 16:52:24 +0000942 }
Greg Claytone005f2c2010-11-06 01:53:30 +0000943 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000944 if (log)
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000945 log->Printf ("SBValue(%p)::Dereference () => SBValue(%p)", value_sp.get(), value_sp.get());
Greg Clayton49ce6822010-10-31 03:01:06 +0000946
947 return sb_value;
Chris Lattner24943d22010-06-08 16:52:24 +0000948}
949
950bool
Greg Clayton49ce6822010-10-31 03:01:06 +0000951SBValue::TypeIsPointerType ()
Chris Lattner24943d22010-06-08 16:52:24 +0000952{
953 bool is_ptr_type = false;
954
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000955 lldb::ValueObjectSP value_sp(GetSP());
956 if (value_sp)
Greg Claytonfab305b2011-05-20 23:51:26 +0000957 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000958 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
959 if (target_sp)
Greg Claytonb9dcc512011-06-29 18:28:50 +0000960 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000961 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
Greg Claytonfab305b2011-05-20 23:51:26 +0000962
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000963 is_ptr_type = value_sp->IsPointerType();
Greg Claytonb9dcc512011-06-29 18:28:50 +0000964 }
Greg Claytonfab305b2011-05-20 23:51:26 +0000965 }
Greg Clayton49ce6822010-10-31 03:01:06 +0000966
Greg Claytone005f2c2010-11-06 01:53:30 +0000967 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000968 if (log)
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000969 log->Printf ("SBValue(%p)::TypeIsPointerType () => %i", value_sp.get(), is_ptr_type);
Greg Clayton49ce6822010-10-31 03:01:06 +0000970
Chris Lattner24943d22010-06-08 16:52:24 +0000971
972 return is_ptr_type;
973}
974
Chris Lattner24943d22010-06-08 16:52:24 +0000975void *
976SBValue::GetOpaqueType()
977{
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000978 lldb::ValueObjectSP value_sp(GetSP());
979 if (value_sp)
Greg Claytonfab305b2011-05-20 23:51:26 +0000980 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000981 TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
982 if (target_sp)
Greg Claytonb9dcc512011-06-29 18:28:50 +0000983 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000984 Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
Greg Claytonfab305b2011-05-20 23:51:26 +0000985
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000986 return value_sp->GetClangType();
Greg Claytonb9dcc512011-06-29 18:28:50 +0000987 }
Greg Claytonfab305b2011-05-20 23:51:26 +0000988 }
Chris Lattner24943d22010-06-08 16:52:24 +0000989 return NULL;
990}
991
Enrico Granata979e20d2011-07-29 19:53:35 +0000992lldb::SBTarget
993SBValue::GetTarget()
994{
Greg Clayton334d33a2012-01-30 07:41:31 +0000995 SBTarget sb_target;
996 TargetSP target_sp;
Greg Clayton0a19a1b2012-02-04 02:27:34 +0000997 lldb::ValueObjectSP value_sp(GetSP());
998 if (value_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +0000999 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001000 target_sp = value_sp->GetUpdatePoint().GetTargetSP();
Greg Clayton334d33a2012-01-30 07:41:31 +00001001 sb_target.SetSP (target_sp);
Enrico Granata979e20d2011-07-29 19:53:35 +00001002 }
1003 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1004 if (log)
1005 {
Greg Clayton334d33a2012-01-30 07:41:31 +00001006 if (target_sp.get() == NULL)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001007 log->Printf ("SBValue(%p)::GetTarget () => NULL", value_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001008 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001009 log->Printf ("SBValue(%p)::GetTarget () => %p", value_sp.get(), target_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001010 }
Greg Clayton334d33a2012-01-30 07:41:31 +00001011 return sb_target;
Enrico Granata979e20d2011-07-29 19:53:35 +00001012}
1013
1014lldb::SBProcess
1015SBValue::GetProcess()
1016{
Greg Clayton334d33a2012-01-30 07:41:31 +00001017 SBProcess sb_process;
1018 ProcessSP process_sp;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001019 lldb::ValueObjectSP value_sp(GetSP());
1020 if (value_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +00001021 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001022 process_sp = value_sp->GetUpdatePoint().GetProcessSP();
Greg Clayton334d33a2012-01-30 07:41:31 +00001023 if (process_sp)
1024 sb_process.SetSP (process_sp);
Enrico Granata979e20d2011-07-29 19:53:35 +00001025 }
1026 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1027 if (log)
1028 {
Greg Clayton334d33a2012-01-30 07:41:31 +00001029 if (process_sp.get() == NULL)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001030 log->Printf ("SBValue(%p)::GetProcess () => NULL", value_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001031 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001032 log->Printf ("SBValue(%p)::GetProcess () => %p", value_sp.get(), process_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001033 }
Greg Clayton334d33a2012-01-30 07:41:31 +00001034 return sb_process;
Enrico Granata979e20d2011-07-29 19:53:35 +00001035}
1036
1037lldb::SBThread
1038SBValue::GetThread()
1039{
Greg Clayton90c52142012-01-30 02:53:15 +00001040 SBThread sb_thread;
1041 ThreadSP thread_sp;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001042 lldb::ValueObjectSP value_sp(GetSP());
1043 if (value_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +00001044 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001045 if (value_sp->GetExecutionContextScope())
Enrico Granata979e20d2011-07-29 19:53:35 +00001046 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001047 thread_sp = value_sp->GetExecutionContextScope()->CalculateThread()->shared_from_this();
Greg Clayton90c52142012-01-30 02:53:15 +00001048 sb_thread.SetThread(thread_sp);
Enrico Granata979e20d2011-07-29 19:53:35 +00001049 }
1050 }
1051 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1052 if (log)
1053 {
Greg Clayton90c52142012-01-30 02:53:15 +00001054 if (thread_sp.get() == NULL)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001055 log->Printf ("SBValue(%p)::GetThread () => NULL", value_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001056 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001057 log->Printf ("SBValue(%p)::GetThread () => %p", value_sp.get(), thread_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001058 }
Greg Clayton90c52142012-01-30 02:53:15 +00001059 return sb_thread;
Enrico Granata979e20d2011-07-29 19:53:35 +00001060}
1061
1062lldb::SBFrame
1063SBValue::GetFrame()
1064{
Greg Clayton334d33a2012-01-30 07:41:31 +00001065 SBFrame sb_frame;
1066 StackFrameSP frame_sp;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001067 lldb::ValueObjectSP value_sp(GetSP());
1068 if (value_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +00001069 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001070 if (value_sp->GetExecutionContextScope())
Enrico Granata979e20d2011-07-29 19:53:35 +00001071 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001072 frame_sp = value_sp->GetExecutionContextScope()->CalculateStackFrame()->shared_from_this();
Greg Clayton334d33a2012-01-30 07:41:31 +00001073 sb_frame.SetFrameSP (frame_sp);
Enrico Granata979e20d2011-07-29 19:53:35 +00001074 }
1075 }
1076 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1077 if (log)
1078 {
Greg Clayton334d33a2012-01-30 07:41:31 +00001079 if (frame_sp.get() == NULL)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001080 log->Printf ("SBValue(%p)::GetFrame () => NULL", value_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001081 else
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001082 log->Printf ("SBValue(%p)::GetFrame () => %p", value_sp.get(), frame_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001083 }
Greg Clayton334d33a2012-01-30 07:41:31 +00001084 return sb_frame;
Enrico Granata979e20d2011-07-29 19:53:35 +00001085}
1086
1087
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001088lldb::ValueObjectSP
1089SBValue::GetSP () const
Chris Lattner24943d22010-06-08 16:52:24 +00001090{
Greg Clayton63094e02010-06-23 01:19:29 +00001091 return m_opaque_sp;
Chris Lattner24943d22010-06-08 16:52:24 +00001092}
1093
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001094void
1095SBValue::SetSP (const lldb::ValueObjectSP &sp)
Chris Lattner24943d22010-06-08 16:52:24 +00001096{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001097 m_opaque_sp = sp;
Chris Lattner24943d22010-06-08 16:52:24 +00001098}
Caroline Tice98f930f2010-09-20 05:20:02 +00001099
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001100
Caroline Tice98f930f2010-09-20 05:20:02 +00001101bool
Greg Clayton49ce6822010-10-31 03:01:06 +00001102SBValue::GetExpressionPath (SBStream &description)
1103{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001104 lldb::ValueObjectSP value_sp(GetSP());
1105 if (value_sp)
Greg Clayton49ce6822010-10-31 03:01:06 +00001106 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001107 value_sp->GetExpressionPath (description.ref(), false);
Greg Claytonb01000f2011-01-17 03:46:26 +00001108 return true;
1109 }
1110 return false;
1111}
1112
1113bool
1114SBValue::GetExpressionPath (SBStream &description, bool qualify_cxx_base_classes)
1115{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001116 lldb::ValueObjectSP value_sp(GetSP());
1117 if (value_sp)
Greg Claytonb01000f2011-01-17 03:46:26 +00001118 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001119 value_sp->GetExpressionPath (description.ref(), qualify_cxx_base_classes);
Greg Clayton49ce6822010-10-31 03:01:06 +00001120 return true;
1121 }
1122 return false;
1123}
1124
1125bool
Caroline Tice98f930f2010-09-20 05:20:02 +00001126SBValue::GetDescription (SBStream &description)
1127{
Greg Clayton96154be2011-11-13 06:57:31 +00001128 Stream &strm = description.ref();
1129
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001130 lldb::ValueObjectSP value_sp(GetSP());
1131 if (value_sp)
Caroline Tice98f930f2010-09-20 05:20:02 +00001132 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001133 ValueObject::DumpValueObject (strm, value_sp.get());
Caroline Tice98f930f2010-09-20 05:20:02 +00001134 }
1135 else
Greg Clayton96154be2011-11-13 06:57:31 +00001136 strm.PutCString ("No value");
Caroline Tice98f930f2010-09-20 05:20:02 +00001137
1138 return true;
1139}
Greg Claytone179a582011-01-05 18:43:15 +00001140
1141lldb::Format
Greg Claytond68e0892011-09-09 23:04:00 +00001142SBValue::GetFormat ()
Greg Claytone179a582011-01-05 18:43:15 +00001143{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001144 lldb::ValueObjectSP value_sp(GetSP());
1145 if (value_sp)
1146 return value_sp->GetFormat();
Greg Claytone179a582011-01-05 18:43:15 +00001147 return eFormatDefault;
1148}
1149
1150void
1151SBValue::SetFormat (lldb::Format format)
1152{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001153 lldb::ValueObjectSP value_sp(GetSP());
1154 if (value_sp)
1155 value_sp->SetFormat(format);
Greg Claytone179a582011-01-05 18:43:15 +00001156}
1157
Enrico Granata979e20d2011-07-29 19:53:35 +00001158lldb::SBValue
1159SBValue::AddressOf()
1160{
1161 SBValue sb_value;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001162 lldb::ValueObjectSP value_sp(GetSP());
1163 if (value_sp)
Enrico Granata979e20d2011-07-29 19:53:35 +00001164 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001165 Target* target = value_sp->GetUpdatePoint().GetTargetSP().get();
Enrico Granata91544802011-09-06 19:20:51 +00001166 if (target)
Enrico Granata979e20d2011-07-29 19:53:35 +00001167 {
Enrico Granata91544802011-09-06 19:20:51 +00001168 Mutex::Locker api_locker (target->GetAPIMutex());
Enrico Granata979e20d2011-07-29 19:53:35 +00001169 Error error;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001170 sb_value = value_sp->AddressOf (error);
Enrico Granata979e20d2011-07-29 19:53:35 +00001171 }
1172 }
1173 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1174 if (log)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001175 log->Printf ("SBValue(%p)::GetPointerToObject () => SBValue(%p)", value_sp.get(), value_sp.get());
Enrico Granata979e20d2011-07-29 19:53:35 +00001176
1177 return sb_value;
Johnny Chena713b862011-08-09 22:38:07 +00001178}
Enrico Granata91544802011-09-06 19:20:51 +00001179
1180lldb::addr_t
1181SBValue::GetLoadAddress()
1182{
1183 lldb::addr_t value = LLDB_INVALID_ADDRESS;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001184 lldb::ValueObjectSP value_sp(GetSP());
1185 if (value_sp)
Enrico Granata91544802011-09-06 19:20:51 +00001186 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001187 Target* target = value_sp->GetUpdatePoint().GetTargetSP().get();
Enrico Granata91544802011-09-06 19:20:51 +00001188 if (target)
1189 {
1190 Mutex::Locker api_locker (target->GetAPIMutex());
1191 const bool scalar_is_load_address = true;
1192 AddressType addr_type;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001193 value = value_sp->GetAddressOf(scalar_is_load_address, &addr_type);
Enrico Granata91544802011-09-06 19:20:51 +00001194 if (addr_type == eAddressTypeFile)
1195 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001196 Module* module = value_sp->GetModule();
Enrico Granata91544802011-09-06 19:20:51 +00001197 if (!module)
1198 value = LLDB_INVALID_ADDRESS;
1199 else
1200 {
1201 Address addr;
1202 module->ResolveFileAddress(value, addr);
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001203 value = addr.GetLoadAddress(value_sp->GetUpdatePoint().GetTargetSP().get());
Enrico Granata91544802011-09-06 19:20:51 +00001204 }
1205 }
1206 else if (addr_type == eAddressTypeHost || addr_type == eAddressTypeInvalid)
1207 value = LLDB_INVALID_ADDRESS;
1208 }
1209 }
1210 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1211 if (log)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001212 log->Printf ("SBValue(%p)::GetLoadAddress () => (%llu)", value_sp.get(), value);
Enrico Granata91544802011-09-06 19:20:51 +00001213
1214 return value;
1215}
1216
1217lldb::SBAddress
1218SBValue::GetAddress()
1219{
1220 Address addr;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001221 lldb::ValueObjectSP value_sp(GetSP());
1222 if (value_sp)
Enrico Granata91544802011-09-06 19:20:51 +00001223 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001224 Target* target = value_sp->GetUpdatePoint().GetTargetSP().get();
Enrico Granata91544802011-09-06 19:20:51 +00001225 if (target)
1226 {
1227 lldb::addr_t value = LLDB_INVALID_ADDRESS;
1228 Mutex::Locker api_locker (target->GetAPIMutex());
1229 const bool scalar_is_load_address = true;
1230 AddressType addr_type;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001231 value = value_sp->GetAddressOf(scalar_is_load_address, &addr_type);
Enrico Granata91544802011-09-06 19:20:51 +00001232 if (addr_type == eAddressTypeFile)
1233 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001234 Module* module = value_sp->GetModule();
Enrico Granata91544802011-09-06 19:20:51 +00001235 if (module)
1236 module->ResolveFileAddress(value, addr);
1237 }
1238 else if (addr_type == eAddressTypeLoad)
1239 {
1240 // no need to check the return value on this.. if it can actually do the resolve
1241 // addr will be in the form (section,offset), otherwise it will simply be returned
1242 // as (NULL, value)
1243 addr.SetLoadAddress(value, target);
1244 }
1245 }
1246 }
1247 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1248 if (log)
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001249 log->Printf ("SBValue(%p)::GetAddress () => (%s,%llu)", value_sp.get(), (addr.GetSection() ? addr.GetSection()->GetName().GetCString() : "NULL"), addr.GetOffset());
Enrico Granata91544802011-09-06 19:20:51 +00001250 return SBAddress(new Address(addr));
1251}
1252
1253lldb::SBData
1254SBValue::GetPointeeData (uint32_t item_idx,
1255 uint32_t item_count)
1256{
1257 lldb::SBData sb_data;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001258 lldb::ValueObjectSP value_sp(GetSP());
1259 if (value_sp)
Enrico Granata91544802011-09-06 19:20:51 +00001260 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001261 Target* target = value_sp->GetUpdatePoint().GetTargetSP().get();
Enrico Granata91544802011-09-06 19:20:51 +00001262 if (target)
1263 {
1264 DataExtractorSP data_sp(new DataExtractor());
1265 Mutex::Locker api_locker (target->GetAPIMutex());
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001266 value_sp->GetPointeeData(*data_sp, item_idx, item_count);
Enrico Granata91544802011-09-06 19:20:51 +00001267 if (data_sp->GetByteSize() > 0)
1268 *sb_data = data_sp;
1269 }
1270 }
1271 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1272 if (log)
1273 log->Printf ("SBValue(%p)::GetPointeeData (%d, %d) => SBData(%p)",
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001274 value_sp.get(),
Enrico Granata91544802011-09-06 19:20:51 +00001275 item_idx,
1276 item_count,
1277 sb_data.get());
1278
1279 return sb_data;
1280}
1281
1282lldb::SBData
1283SBValue::GetData ()
1284{
1285 lldb::SBData sb_data;
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001286 lldb::ValueObjectSP value_sp(GetSP());
1287 if (value_sp)
Enrico Granata91544802011-09-06 19:20:51 +00001288 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001289 TargetSP target_sp (value_sp->GetUpdatePoint().GetTargetSP());
1290 if (target_sp)
Enrico Granata91544802011-09-06 19:20:51 +00001291 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001292 Mutex::Locker api_locker (target_sp->GetAPIMutex());
Enrico Granata91544802011-09-06 19:20:51 +00001293 DataExtractorSP data_sp(new DataExtractor());
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001294 value_sp->GetData(*data_sp);
Enrico Granata91544802011-09-06 19:20:51 +00001295 if (data_sp->GetByteSize() > 0)
1296 *sb_data = data_sp;
1297 }
1298 }
1299 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1300 if (log)
1301 log->Printf ("SBValue(%p)::GetData () => SBData(%p)",
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001302 value_sp.get(),
Enrico Granata91544802011-09-06 19:20:51 +00001303 sb_data.get());
1304
1305 return sb_data;
1306}
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001307
1308lldb::SBWatchpoint
1309SBValue::Watch (bool resolve_location, bool read, bool write)
1310{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001311 SBWatchpoint sb_watchpoint;
1312
1313 // If the SBValue is not valid, there's no point in even trying to watch it.
1314 lldb::ValueObjectSP value_sp(GetSP());
1315 TargetSP target_sp (GetTarget().GetSP());
1316 if (value_sp && target_sp)
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001317 {
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001318 // Read and Write cannot both be false.
1319 if (!read && !write)
1320 return sb_watchpoint;
1321
1322 // If the value is not in scope, don't try and watch and invalid value
1323 if (!IsInScope())
1324 return sb_watchpoint;
1325
1326 addr_t addr = GetLoadAddress();
1327 if (addr == LLDB_INVALID_ADDRESS)
1328 return sb_watchpoint;
1329 size_t byte_size = GetByteSize();
1330 if (byte_size == 0)
1331 return sb_watchpoint;
1332
1333 uint32_t watch_type = 0;
1334 if (read)
1335 watch_type |= LLDB_WATCH_TYPE_READ;
1336 if (write)
1337 watch_type |= LLDB_WATCH_TYPE_WRITE;
1338
1339 WatchpointSP watchpoint_sp = target_sp->CreateWatchpoint(addr, byte_size, watch_type);
1340
1341 if (watchpoint_sp)
1342 {
1343 sb_watchpoint.SetSP (watchpoint_sp);
1344 Declaration decl;
1345 if (value_sp->GetDeclaration (decl))
1346 {
1347 if (decl.GetFile())
1348 {
1349 StreamString ss;
1350 // True to show fullpath for declaration file.
1351 decl.DumpStopContext(&ss, true);
1352 watchpoint_sp->SetDeclInfo(ss.GetString());
1353 }
1354 }
1355 }
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001356 }
1357 return sb_watchpoint;
1358}
1359
1360lldb::SBWatchpoint
1361SBValue::WatchPointee (bool resolve_location, bool read, bool write)
1362{
Greg Clayton0a19a1b2012-02-04 02:27:34 +00001363 SBWatchpoint sb_watchpoint;
1364 if (IsInScope() && GetType().IsPointerType())
1365 sb_watchpoint = Dereference().Watch (resolve_location, read, write);
Greg Clayton1fa6b3d2011-10-13 18:08:26 +00001366 return sb_watchpoint;
1367}
1368