blob: 128db9c57539f440a272036de284cab352e71044 [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- ClangExpressionDeclMap.cpp -----------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "lldb/Expression/ClangExpressionDeclMap.h"
11
12// C Includes
13// C++ Includes
14// Other libraries and framework includes
15// Project includes
Sean Callanan47a5c4c2010-09-23 03:01:22 +000016#include "clang/AST/DeclarationName.h"
Sean Callanana0744822010-11-01 23:22:47 +000017#include "clang/AST/Decl.h"
Chris Lattner24943d22010-06-08 16:52:24 +000018#include "lldb/lldb-private.h"
19#include "lldb/Core/Address.h"
Sean Callanan810f22d2010-07-16 00:09:46 +000020#include "lldb/Core/Error.h"
Sean Callanan6184dfe2010-06-23 00:47:48 +000021#include "lldb/Core/Log.h"
Chris Lattner24943d22010-06-08 16:52:24 +000022#include "lldb/Core/Module.h"
Greg Clayton061b79d2011-05-09 20:18:18 +000023#include "lldb/Core/RegisterValue.h"
Sean Callanan05a5a1b2010-12-16 03:17:46 +000024#include "lldb/Core/ValueObjectConstResult.h"
Sean Callananf48de6d2011-12-10 03:12:34 +000025#include "lldb/Core/ValueObjectVariable.h"
Sean Callanan6e74dbb2011-02-01 23:43:26 +000026#include "lldb/Expression/ASTDumper.h"
Chris Lattner24943d22010-06-08 16:52:24 +000027#include "lldb/Expression/ClangASTSource.h"
Sean Callanana48fe162010-08-11 03:57:18 +000028#include "lldb/Expression/ClangPersistentVariables.h"
Greg Claytoncd548032011-02-01 01:31:41 +000029#include "lldb/Host/Endian.h"
Chris Lattner24943d22010-06-08 16:52:24 +000030#include "lldb/Symbol/ClangASTContext.h"
Greg Clayton6916e352010-11-13 03:52:47 +000031#include "lldb/Symbol/ClangNamespaceDecl.h"
Chris Lattner24943d22010-06-08 16:52:24 +000032#include "lldb/Symbol/CompileUnit.h"
33#include "lldb/Symbol/Function.h"
34#include "lldb/Symbol/ObjectFile.h"
35#include "lldb/Symbol/SymbolContext.h"
Sean Callanan16b53ab2011-10-12 00:12:34 +000036#include "lldb/Symbol/SymbolVendor.h"
Chris Lattner24943d22010-06-08 16:52:24 +000037#include "lldb/Symbol/Type.h"
38#include "lldb/Symbol/TypeList.h"
39#include "lldb/Symbol/Variable.h"
40#include "lldb/Symbol/VariableList.h"
Sean Callananf328c9f2010-07-20 23:31:16 +000041#include "lldb/Target/ExecutionContext.h"
Sean Callanan810f22d2010-07-16 00:09:46 +000042#include "lldb/Target/Process.h"
Sean Callanan17c6a052010-10-05 20:18:48 +000043#include "lldb/Target/RegisterContext.h"
Chris Lattner24943d22010-06-08 16:52:24 +000044#include "lldb/Target/StackFrame.h"
Sean Callananf328c9f2010-07-20 23:31:16 +000045#include "lldb/Target/Target.h"
Jim Ingham78b9ee82010-12-07 01:56:02 +000046#include "lldb/Target/Thread.h"
Chris Lattner24943d22010-06-08 16:52:24 +000047
Greg Clayton3bc52d02010-11-14 22:13:40 +000048using namespace lldb;
Chris Lattner24943d22010-06-08 16:52:24 +000049using namespace lldb_private;
50using namespace clang;
51
Sean Callanan73b520f2011-10-29 01:58:46 +000052ClangExpressionDeclMap::ClangExpressionDeclMap (bool keep_result_in_memory, ExecutionContext &exe_ctx) :
53 ClangASTSource (exe_ctx.GetTargetSP()),
Greg Clayton8de27c72010-10-15 22:48:33 +000054 m_found_entities (),
55 m_struct_members (),
Stephen Wilsondbeb3e12011-04-11 19:41:40 +000056 m_keep_result_in_memory (keep_result_in_memory),
Sean Callananaa301c42010-12-03 01:38:59 +000057 m_parser_vars (),
Stephen Wilsondbeb3e12011-04-11 19:41:40 +000058 m_struct_vars ()
Chris Lattner24943d22010-06-08 16:52:24 +000059{
Sean Callananaa301c42010-12-03 01:38:59 +000060 EnableStructVars();
Chris Lattner24943d22010-06-08 16:52:24 +000061}
62
63ClangExpressionDeclMap::~ClangExpressionDeclMap()
Sean Callananaa301c42010-12-03 01:38:59 +000064{
Sean Callanan6d284ef2011-10-12 22:20:02 +000065 // Note: The model is now that the parser's AST context and all associated
66 // data does not vanish until the expression has been executed. This means
67 // that valuable lookup data (like namespaces) doesn't vanish, but
68
69 DidParse();
Sean Callananaa301c42010-12-03 01:38:59 +000070 DidDematerialize();
71 DisableStructVars();
72}
Sean Callananc2c6f772010-10-26 00:31:56 +000073
Sean Callanan166ba102011-08-01 18:18:33 +000074bool
Greg Clayton427f2902010-12-14 02:59:59 +000075ClangExpressionDeclMap::WillParse(ExecutionContext &exe_ctx)
Sean Callananaa301c42010-12-03 01:38:59 +000076{
77 EnableParserVars();
78 m_parser_vars->m_exe_ctx = &exe_ctx;
Greg Clayton567e7f32011-09-22 04:58:26 +000079
80 Target *target = exe_ctx.GetTargetPtr();
81 if (exe_ctx.GetFramePtr())
82 m_parser_vars->m_sym_ctx = exe_ctx.GetFramePtr()->GetSymbolContext(lldb::eSymbolContextEverything);
83 else if (exe_ctx.GetThreadPtr())
84 m_parser_vars->m_sym_ctx = exe_ctx.GetThreadPtr()->GetStackFrameAtIndex(0)->GetSymbolContext(lldb::eSymbolContextEverything);
85 else if (exe_ctx.GetProcessPtr())
Greg Clayton987c7eb2011-09-17 08:33:22 +000086 {
87 m_parser_vars->m_sym_ctx.Clear();
Greg Clayton567e7f32011-09-22 04:58:26 +000088 m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP();
Greg Clayton987c7eb2011-09-17 08:33:22 +000089 }
Greg Clayton567e7f32011-09-22 04:58:26 +000090 else if (target)
Greg Clayton987c7eb2011-09-17 08:33:22 +000091 {
92 m_parser_vars->m_sym_ctx.Clear();
Greg Clayton567e7f32011-09-22 04:58:26 +000093 m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP();
Greg Clayton987c7eb2011-09-17 08:33:22 +000094 }
Sean Callanan97ad47f2011-09-15 18:41:04 +000095
Greg Clayton567e7f32011-09-22 04:58:26 +000096 if (target)
97 {
98 m_parser_vars->m_persistent_vars = &target->GetPersistentVariables();
Sean Callanan166ba102011-08-01 18:18:33 +000099
Greg Clayton567e7f32011-09-22 04:58:26 +0000100 if (!target->GetScratchClangASTContext())
101 return false;
102 }
Sean Callanan166ba102011-08-01 18:18:33 +0000103
Sean Callanan47dc4572011-09-15 02:13:07 +0000104 m_parser_vars->m_target_info = GetTargetInfo();
105
Sean Callanan166ba102011-08-01 18:18:33 +0000106 return true;
Sean Callananaa301c42010-12-03 01:38:59 +0000107}
108
Greg Clayton427f2902010-12-14 02:59:59 +0000109void
110ClangExpressionDeclMap::DidParse()
Sean Callananaa301c42010-12-03 01:38:59 +0000111{
112 if (m_parser_vars.get())
113 {
Greg Clayton427f2902010-12-14 02:59:59 +0000114 for (size_t entity_index = 0, num_entities = m_found_entities.GetSize();
Sean Callananaa301c42010-12-03 01:38:59 +0000115 entity_index < num_entities;
116 ++entity_index)
117 {
Greg Clayton427f2902010-12-14 02:59:59 +0000118 ClangExpressionVariableSP var_sp(m_found_entities.GetVariableAtIndex(entity_index));
119 if (var_sp &&
120 var_sp->m_parser_vars.get() &&
121 var_sp->m_parser_vars->m_lldb_value)
122 delete var_sp->m_parser_vars->m_lldb_value;
Sean Callananaa301c42010-12-03 01:38:59 +0000123
Greg Clayton427f2902010-12-14 02:59:59 +0000124 var_sp->DisableParserVars();
Sean Callananaa301c42010-12-03 01:38:59 +0000125 }
126
Greg Clayton427f2902010-12-14 02:59:59 +0000127 for (size_t pvar_index = 0, num_pvars = m_parser_vars->m_persistent_vars->GetSize();
Sean Callananaa301c42010-12-03 01:38:59 +0000128 pvar_index < num_pvars;
129 ++pvar_index)
130 {
Greg Clayton427f2902010-12-14 02:59:59 +0000131 ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariableAtIndex(pvar_index));
132 if (pvar_sp)
133 pvar_sp->DisableParserVars();
Sean Callananaa301c42010-12-03 01:38:59 +0000134 }
135
136 DisableParserVars();
Sean Callanan7a60b942010-10-08 01:58:41 +0000137 }
Chris Lattner24943d22010-06-08 16:52:24 +0000138}
139
Sean Callanan8bce6652010-07-13 21:41:46 +0000140// Interface for IRForTarget
141
Sean Callanan47dc4572011-09-15 02:13:07 +0000142ClangExpressionDeclMap::TargetInfo
143ClangExpressionDeclMap::GetTargetInfo()
144{
145 assert (m_parser_vars.get());
146
147 TargetInfo ret;
148
149 ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
Greg Clayton567e7f32011-09-22 04:58:26 +0000150 if (exe_ctx)
Sean Callanan47dc4572011-09-15 02:13:07 +0000151 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000152 Process *process = exe_ctx->GetProcessPtr();
153 if (process)
154 {
155 ret.byte_order = process->GetByteOrder();
156 ret.address_byte_size = process->GetAddressByteSize();
157 }
158 else
159 {
160 Target *target = exe_ctx->GetTargetPtr();
161 if (target)
162 {
163 ret.byte_order = target->GetArchitecture().GetByteOrder();
164 ret.address_byte_size = target->GetArchitecture().GetAddressByteSize();
165 }
166 }
Sean Callanan47dc4572011-09-15 02:13:07 +0000167 }
168
169 return ret;
170}
171
Greg Clayton8de27c72010-10-15 22:48:33 +0000172const ConstString &
173ClangExpressionDeclMap::GetPersistentResultName ()
Sean Callanan82b74c82010-08-12 01:56:52 +0000174{
Sean Callananaa301c42010-12-03 01:38:59 +0000175 assert (m_struct_vars.get());
176 assert (m_parser_vars.get());
Sean Callananaa301c42010-12-03 01:38:59 +0000177 if (!m_struct_vars->m_result_name)
Greg Clayton427f2902010-12-14 02:59:59 +0000178 {
179 Target *target = m_parser_vars->GetTarget();
180 assert (target);
181 m_struct_vars->m_result_name = target->GetPersistentVariables().GetNextPersistentVariableName();
182 }
Sean Callananaa301c42010-12-03 01:38:59 +0000183 return m_struct_vars->m_result_name;
Sean Callanan82b74c82010-08-12 01:56:52 +0000184}
185
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000186lldb::ClangExpressionVariableSP
187ClangExpressionDeclMap::BuildIntegerVariable (const ConstString &name,
188 lldb_private::TypeFromParser type,
189 const llvm::APInt& value)
190{
191 assert (m_parser_vars.get());
Sean Callanan166ba102011-08-01 18:18:33 +0000192
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000193 ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
Greg Clayton567e7f32011-09-22 04:58:26 +0000194 if (exe_ctx == NULL)
195 return lldb::ClangExpressionVariableSP();
196 Target *target = exe_ctx->GetTargetPtr();
197
198 ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000199
Sean Callanan5a55c7a2011-11-18 03:28:09 +0000200 TypeFromUser user_type(m_ast_importer->CopyType(context,
201 type.GetASTContext(),
202 type.GetOpaqueQualType()),
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000203 context);
Sean Callanan47dc4572011-09-15 02:13:07 +0000204
Sean Callanandc5fce12011-12-01 21:04:37 +0000205 if (!user_type.GetOpaqueQualType())
206 {
207 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
208
209 if (log)
210 log->Printf("ClangExpressionDeclMap::BuildIntegerVariable - Couldn't export the type for a constant integer result");
211
212 return lldb::ClangExpressionVariableSP();
213 }
214
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000215 if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx->GetBestExecutionContextScope (),
216 name,
Sean Callanan0e0817d2011-01-04 02:41:41 +0000217 user_type,
Sean Callanan47dc4572011-09-15 02:13:07 +0000218 m_parser_vars->m_target_info.byte_order,
219 m_parser_vars->m_target_info.address_byte_size))
Sean Callanan0e0817d2011-01-04 02:41:41 +0000220 return lldb::ClangExpressionVariableSP();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000221
Sean Callanan0e0817d2011-01-04 02:41:41 +0000222 ClangExpressionVariableSP pvar_sp (m_parser_vars->m_persistent_vars->GetVariable(name));
223
224 if (!pvar_sp)
225 return lldb::ClangExpressionVariableSP();
226
227 uint8_t *pvar_data = pvar_sp->GetValueBytes();
228 if (pvar_data == NULL)
229 return lldb::ClangExpressionVariableSP();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000230
231 uint64_t value64 = value.getLimitedValue();
Sean Callanan47dc4572011-09-15 02:13:07 +0000232
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000233 size_t num_val_bytes = sizeof(value64);
Sean Callanan0e0817d2011-01-04 02:41:41 +0000234 size_t num_data_bytes = pvar_sp->GetByteSize();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000235
236 size_t num_bytes = num_val_bytes;
237 if (num_bytes > num_data_bytes)
238 num_bytes = num_data_bytes;
239
Johnny Chen2bc9eb32011-07-19 19:48:13 +0000240 for (size_t byte_idx = 0;
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000241 byte_idx < num_bytes;
242 ++byte_idx)
243 {
244 uint64_t shift = byte_idx * 8;
245 uint64_t mask = 0xffll << shift;
246 uint8_t cur_byte = (uint8_t)((value64 & mask) >> shift);
247
Sean Callanan47dc4572011-09-15 02:13:07 +0000248 switch (m_parser_vars->m_target_info.byte_order)
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000249 {
Sean Callanan0e0817d2011-01-04 02:41:41 +0000250 case eByteOrderBig:
251 // High Low
252 // Original: |AABBCCDDEEFFGGHH|
253 // Target: |EEFFGGHH|
254
255 pvar_data[num_data_bytes - (1 + byte_idx)] = cur_byte;
256 break;
257 case eByteOrderLittle:
258 // Target: |HHGGFFEE|
259 pvar_data[byte_idx] = cur_byte;
260 break;
261 default:
262 return lldb::ClangExpressionVariableSP();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000263 }
264 }
Sean Callanan6a925532011-01-13 08:53:35 +0000265
266 pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried;
Sean Callanan696cf5f2011-05-07 01:06:41 +0000267 pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
268 pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
Sean Callanan0e0817d2011-01-04 02:41:41 +0000269
270 return pvar_sp;
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000271}
272
Sean Callanan696cf5f2011-05-07 01:06:41 +0000273lldb::ClangExpressionVariableSP
274ClangExpressionDeclMap::BuildCastVariable (const ConstString &name,
Sean Callanan9b6898f2011-07-30 02:42:06 +0000275 VarDecl *decl,
Sean Callanan696cf5f2011-05-07 01:06:41 +0000276 lldb_private::TypeFromParser type)
277{
278 assert (m_parser_vars.get());
279
280 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
281
282 ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
Greg Clayton567e7f32011-09-22 04:58:26 +0000283 if (exe_ctx == NULL)
284 return lldb::ClangExpressionVariableSP();
285 Target *target = exe_ctx->GetTargetPtr();
286 if (target == NULL)
287 return lldb::ClangExpressionVariableSP();
288
289 ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
Sean Callanan696cf5f2011-05-07 01:06:41 +0000290
291 ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl));
292
293 if (!var_sp)
294 var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl);
295
296 if (!var_sp)
297 return ClangExpressionVariableSP();
298
Sean Callanan5a55c7a2011-11-18 03:28:09 +0000299 TypeFromUser user_type(m_ast_importer->CopyType(context,
300 type.GetASTContext(),
301 type.GetOpaqueQualType()),
Sean Callanan696cf5f2011-05-07 01:06:41 +0000302 context);
303
Sean Callanandc5fce12011-12-01 21:04:37 +0000304 if (!user_type.GetOpaqueQualType())
305 {
306 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
307
308 if (log)
309 log->Printf("ClangExpressionDeclMap::BuildCastVariable - Couldn't export the type for a constant cast result");
310
311 return lldb::ClangExpressionVariableSP();
312 }
313
Sean Callanan696cf5f2011-05-07 01:06:41 +0000314 TypeFromUser var_type = var_sp->GetTypeFromUser();
315
Greg Clayton567e7f32011-09-22 04:58:26 +0000316 StackFrame *frame = exe_ctx->GetFramePtr();
317 if (frame == NULL)
318 return lldb::ClangExpressionVariableSP();
319
320 VariableSP var = FindVariableInScope (*frame, var_sp->GetName(), &var_type);
Sean Callanan696cf5f2011-05-07 01:06:41 +0000321
322 if (!var)
323 return lldb::ClangExpressionVariableSP(); // but we should handle this; it may be a persistent variable
324
Greg Clayton567e7f32011-09-22 04:58:26 +0000325 ValueObjectSP var_valobj = frame->GetValueObjectForFrameVariable(var, lldb::eNoDynamicValues);
Sean Callanan696cf5f2011-05-07 01:06:41 +0000326
327 if (!var_valobj)
328 return lldb::ClangExpressionVariableSP();
329
330 ValueObjectSP var_casted_valobj = var_valobj->CastPointerType(name.GetCString(), user_type);
331
332 if (!var_casted_valobj)
333 return lldb::ClangExpressionVariableSP();
334
335 if (log)
336 {
337 StreamString my_stream_string;
338
339 ClangASTType::DumpTypeDescription (var_type.GetASTContext(),
340 var_type.GetOpaqueQualType(),
341 &my_stream_string);
342
343
344 log->Printf("Building cast variable to type: %s", my_stream_string.GetString().c_str());
345 }
346
347 ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->CreatePersistentVariable (var_casted_valobj);
348
349 if (!pvar_sp)
350 return lldb::ClangExpressionVariableSP();
351
352 if (pvar_sp != m_parser_vars->m_persistent_vars->GetVariable(name))
353 return lldb::ClangExpressionVariableSP();
354
355 pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried;
356 pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
357 pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
358
359 return pvar_sp;
360}
361
Sean Callanan47dc4572011-09-15 02:13:07 +0000362bool
363ClangExpressionDeclMap::ResultIsReference (const ConstString &name)
364{
365 ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name);
366
367 return (pvar_sp->m_flags & ClangExpressionVariable::EVIsProgramReference);
368}
369
370bool
371ClangExpressionDeclMap::CompleteResultVariable (lldb::ClangExpressionVariableSP &valobj,
372 lldb_private::Value &value,
373 const ConstString &name,
Sean Callanana8428a42011-09-22 00:41:11 +0000374 lldb_private::TypeFromParser type,
Sean Callanan557ccd62011-10-21 05:18:02 +0000375 bool transient,
376 bool maybe_make_load)
Sean Callanan47dc4572011-09-15 02:13:07 +0000377{
378 assert (m_parser_vars.get());
379
380 ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name);
381
382 if (!pvar_sp)
383 return false;
Sean Callanan557ccd62011-10-21 05:18:02 +0000384
385 if (maybe_make_load &&
386 value.GetValueType() == Value::eValueTypeFileAddress &&
387 m_parser_vars->m_exe_ctx &&
388 m_parser_vars->m_exe_ctx->GetProcessPtr())
389 {
390 value.SetValueType(Value::eValueTypeLoadAddress);
391 }
Sean Callanan47dc4572011-09-15 02:13:07 +0000392
393 if (pvar_sp->m_flags & ClangExpressionVariable::EVIsProgramReference &&
Sean Callanana8428a42011-09-22 00:41:11 +0000394 !pvar_sp->m_live_sp &&
395 !transient)
Sean Callanan47dc4572011-09-15 02:13:07 +0000396 {
397 // The reference comes from the program. We need to set up a live SP for it.
398
Johnny Chendfafa142011-12-16 23:04:52 +0000399 unsigned long long address = value.GetScalar().ULongLong();
400 AddressType address_type = value.GetValueAddressType();
401
Sean Callanan47dc4572011-09-15 02:13:07 +0000402 pvar_sp->m_live_sp = ValueObjectConstResult::Create(m_parser_vars->m_exe_ctx->GetBestExecutionContextScope(),
403 pvar_sp->GetTypeFromUser().GetASTContext(),
404 pvar_sp->GetTypeFromUser().GetOpaqueQualType(),
405 pvar_sp->GetName(),
Johnny Chendfafa142011-12-16 23:04:52 +0000406 address,
407 address_type,
Sean Callanan47dc4572011-09-15 02:13:07 +0000408 pvar_sp->GetByteSize());
409 }
410
411 if (pvar_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry)
412 {
413 pvar_sp->ValueUpdated();
414
415 const size_t pvar_byte_size = pvar_sp->GetByteSize();
416 uint8_t *pvar_data = pvar_sp->GetValueBytes();
417
Sean Callananf48de6d2011-12-10 03:12:34 +0000418 ReadTarget(pvar_data, value, pvar_byte_size);
Sean Callanan47dc4572011-09-15 02:13:07 +0000419
420 pvar_sp->m_flags &= ~(ClangExpressionVariable::EVNeedsFreezeDry);
421 }
422
423 valobj = pvar_sp;
424
425 return true;
426}
427
Sean Callanan8bce6652010-07-13 21:41:46 +0000428bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000429ClangExpressionDeclMap::AddPersistentVariable
430(
Sean Callanan9b6898f2011-07-30 02:42:06 +0000431 const NamedDecl *decl,
Greg Clayton8de27c72010-10-15 22:48:33 +0000432 const ConstString &name,
Sean Callanan6a925532011-01-13 08:53:35 +0000433 TypeFromParser parser_type,
434 bool is_result,
435 bool is_lvalue
Greg Clayton8de27c72010-10-15 22:48:33 +0000436)
Sean Callanana48fe162010-08-11 03:57:18 +0000437{
Sean Callananaa301c42010-12-03 01:38:59 +0000438 assert (m_parser_vars.get());
439
Sean Callanan6a925532011-01-13 08:53:35 +0000440 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000441 ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
Greg Clayton567e7f32011-09-22 04:58:26 +0000442 if (exe_ctx == NULL)
443 return false;
444 Target *target = exe_ctx->GetTargetPtr();
445 if (target == NULL)
446 return false;
447
448 ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
Sean Callanana48fe162010-08-11 03:57:18 +0000449
Sean Callanan0539a802011-12-16 21:06:35 +0000450 TypeFromUser user_type(m_ast_importer->DeportType(context,
451 parser_type.GetASTContext(),
452 parser_type.GetOpaqueQualType()),
Sean Callanan97678d12011-01-13 21:23:32 +0000453 context);
Sean Callanan5a55c7a2011-11-18 03:28:09 +0000454
455 if (!user_type.GetOpaqueQualType())
456 {
457 if (log)
458 log->Printf("Persistent variable's type wasn't copied successfully");
459 return false;
460 }
Sean Callanan47dc4572011-09-15 02:13:07 +0000461
462 if (!m_parser_vars->m_target_info.IsValid())
463 return false;
Sean Callanana48fe162010-08-11 03:57:18 +0000464
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000465 if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx->GetBestExecutionContextScope (),
466 name,
Greg Clayton427f2902010-12-14 02:59:59 +0000467 user_type,
Sean Callanan47dc4572011-09-15 02:13:07 +0000468 m_parser_vars->m_target_info.byte_order,
469 m_parser_vars->m_target_info.address_byte_size))
Sean Callanan8c127202010-08-23 23:09:38 +0000470 return false;
471
Greg Clayton427f2902010-12-14 02:59:59 +0000472 ClangExpressionVariableSP var_sp (m_parser_vars->m_persistent_vars->GetVariable(name));
Sean Callanan8c127202010-08-23 23:09:38 +0000473
Greg Clayton427f2902010-12-14 02:59:59 +0000474 if (!var_sp)
Sean Callanan8c127202010-08-23 23:09:38 +0000475 return false;
476
Sean Callanan6a925532011-01-13 08:53:35 +0000477 if (is_result)
478 var_sp->m_flags |= ClangExpressionVariable::EVNeedsFreezeDry;
479 else
480 var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget; // explicitly-declared persistent variables should persist
481
482 if (is_lvalue)
483 {
484 var_sp->m_flags |= ClangExpressionVariable::EVIsProgramReference;
485 }
486 else
487 {
488 var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
489 var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
490 }
491
492 if (log)
493 log->Printf("Created persistent variable with flags 0x%hx", var_sp->m_flags);
494
Greg Clayton427f2902010-12-14 02:59:59 +0000495 var_sp->EnableParserVars();
Sean Callanan8c127202010-08-23 23:09:38 +0000496
Greg Clayton427f2902010-12-14 02:59:59 +0000497 var_sp->m_parser_vars->m_named_decl = decl;
498 var_sp->m_parser_vars->m_parser_type = parser_type;
Sean Callanan8c127202010-08-23 23:09:38 +0000499
500 return true;
Sean Callanana48fe162010-08-11 03:57:18 +0000501}
502
503bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000504ClangExpressionDeclMap::AddValueToStruct
505(
Sean Callanan9b6898f2011-07-30 02:42:06 +0000506 const NamedDecl *decl,
Greg Clayton8de27c72010-10-15 22:48:33 +0000507 const ConstString &name,
508 llvm::Value *value,
509 size_t size,
510 off_t alignment
511)
Sean Callanan8bce6652010-07-13 21:41:46 +0000512{
Sean Callananaa301c42010-12-03 01:38:59 +0000513 assert (m_struct_vars.get());
514 assert (m_parser_vars.get());
515
Greg Claytone005f2c2010-11-06 01:53:30 +0000516 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan45690fe2010-08-30 22:17:16 +0000517
Sean Callananaa301c42010-12-03 01:38:59 +0000518 m_struct_vars->m_struct_laid_out = false;
Sean Callanan8bce6652010-07-13 21:41:46 +0000519
Sean Callanan8c127202010-08-23 23:09:38 +0000520 if (m_struct_members.GetVariable(decl))
521 return true;
Sean Callanan8bce6652010-07-13 21:41:46 +0000522
Greg Clayton427f2902010-12-14 02:59:59 +0000523 ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl));
Sean Callanan8bce6652010-07-13 21:41:46 +0000524
Greg Clayton427f2902010-12-14 02:59:59 +0000525 if (!var_sp)
526 var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl);
Sean Callanan8bce6652010-07-13 21:41:46 +0000527
Greg Clayton427f2902010-12-14 02:59:59 +0000528 if (!var_sp)
Sean Callanan8c127202010-08-23 23:09:38 +0000529 return false;
530
Sean Callanan45690fe2010-08-30 22:17:16 +0000531 if (log)
Sean Callanan5a55c7a2011-11-18 03:28:09 +0000532 log->Printf("Adding value for (NamedDecl*)%p [%s - %s] to the structure",
Sean Callanan45690fe2010-08-30 22:17:16 +0000533 decl,
Greg Clayton8de27c72010-10-15 22:48:33 +0000534 name.GetCString(),
Greg Clayton427f2902010-12-14 02:59:59 +0000535 var_sp->GetName().GetCString());
Sean Callanan45690fe2010-08-30 22:17:16 +0000536
Sean Callanan8c127202010-08-23 23:09:38 +0000537 // We know entity->m_parser_vars is valid because we used a parser variable
538 // to find it
Greg Clayton427f2902010-12-14 02:59:59 +0000539 var_sp->m_parser_vars->m_llvm_value = value;
Sean Callanan8c127202010-08-23 23:09:38 +0000540
Greg Clayton427f2902010-12-14 02:59:59 +0000541 var_sp->EnableJITVars();
542 var_sp->m_jit_vars->m_alignment = alignment;
543 var_sp->m_jit_vars->m_size = size;
Sean Callanan8c127202010-08-23 23:09:38 +0000544
Greg Clayton427f2902010-12-14 02:59:59 +0000545 m_struct_members.AddVariable(var_sp);
Sean Callanan8bce6652010-07-13 21:41:46 +0000546
547 return true;
548}
549
550bool
551ClangExpressionDeclMap::DoStructLayout ()
552{
Sean Callananaa301c42010-12-03 01:38:59 +0000553 assert (m_struct_vars.get());
554
555 if (m_struct_vars->m_struct_laid_out)
Sean Callanan8bce6652010-07-13 21:41:46 +0000556 return true;
557
Sean Callanan8bce6652010-07-13 21:41:46 +0000558 off_t cursor = 0;
559
Sean Callananaa301c42010-12-03 01:38:59 +0000560 m_struct_vars->m_struct_alignment = 0;
561 m_struct_vars->m_struct_size = 0;
Sean Callanan8bce6652010-07-13 21:41:46 +0000562
Greg Clayton427f2902010-12-14 02:59:59 +0000563 for (size_t member_index = 0, num_members = m_struct_members.GetSize();
Sean Callanan8c127202010-08-23 23:09:38 +0000564 member_index < num_members;
565 ++member_index)
Sean Callanan8bce6652010-07-13 21:41:46 +0000566 {
Greg Clayton427f2902010-12-14 02:59:59 +0000567 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
568 if (!member_sp)
569 return false;
570
571 if (!member_sp->m_jit_vars.get())
Sean Callanan8c127202010-08-23 23:09:38 +0000572 return false;
Sean Callanan8bce6652010-07-13 21:41:46 +0000573
Sean Callanan8c127202010-08-23 23:09:38 +0000574 if (member_index == 0)
Greg Clayton427f2902010-12-14 02:59:59 +0000575 m_struct_vars->m_struct_alignment = member_sp->m_jit_vars->m_alignment;
Sean Callanan8c127202010-08-23 23:09:38 +0000576
Greg Clayton427f2902010-12-14 02:59:59 +0000577 if (cursor % member_sp->m_jit_vars->m_alignment)
578 cursor += (member_sp->m_jit_vars->m_alignment - (cursor % member_sp->m_jit_vars->m_alignment));
Sean Callanan8c127202010-08-23 23:09:38 +0000579
Greg Clayton427f2902010-12-14 02:59:59 +0000580 member_sp->m_jit_vars->m_offset = cursor;
581 cursor += member_sp->m_jit_vars->m_size;
Sean Callanan8bce6652010-07-13 21:41:46 +0000582 }
583
Sean Callananaa301c42010-12-03 01:38:59 +0000584 m_struct_vars->m_struct_size = cursor;
Sean Callanan8bce6652010-07-13 21:41:46 +0000585
Sean Callananaa301c42010-12-03 01:38:59 +0000586 m_struct_vars->m_struct_laid_out = true;
Sean Callanan8bce6652010-07-13 21:41:46 +0000587 return true;
588}
589
Greg Clayton8de27c72010-10-15 22:48:33 +0000590bool ClangExpressionDeclMap::GetStructInfo
591(
592 uint32_t &num_elements,
593 size_t &size,
594 off_t &alignment
595)
Sean Callanan8bce6652010-07-13 21:41:46 +0000596{
Sean Callananaa301c42010-12-03 01:38:59 +0000597 assert (m_struct_vars.get());
598
599 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan8bce6652010-07-13 21:41:46 +0000600 return false;
601
Greg Clayton427f2902010-12-14 02:59:59 +0000602 num_elements = m_struct_members.GetSize();
Sean Callananaa301c42010-12-03 01:38:59 +0000603 size = m_struct_vars->m_struct_size;
604 alignment = m_struct_vars->m_struct_alignment;
Sean Callanan8bce6652010-07-13 21:41:46 +0000605
606 return true;
607}
608
609bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000610ClangExpressionDeclMap::GetStructElement
611(
Sean Callanan9b6898f2011-07-30 02:42:06 +0000612 const NamedDecl *&decl,
Greg Clayton8de27c72010-10-15 22:48:33 +0000613 llvm::Value *&value,
614 off_t &offset,
615 ConstString &name,
616 uint32_t index
617)
Sean Callanan8bce6652010-07-13 21:41:46 +0000618{
Sean Callananaa301c42010-12-03 01:38:59 +0000619 assert (m_struct_vars.get());
620
621 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan8bce6652010-07-13 21:41:46 +0000622 return false;
623
Greg Clayton427f2902010-12-14 02:59:59 +0000624 if (index >= m_struct_members.GetSize())
Sean Callanan8bce6652010-07-13 21:41:46 +0000625 return false;
626
Greg Clayton427f2902010-12-14 02:59:59 +0000627 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(index));
Sean Callanan8bce6652010-07-13 21:41:46 +0000628
Greg Clayton427f2902010-12-14 02:59:59 +0000629 if (!member_sp ||
630 !member_sp->m_parser_vars.get() ||
631 !member_sp->m_jit_vars.get())
Sean Callanan8c127202010-08-23 23:09:38 +0000632 return false;
633
Greg Clayton427f2902010-12-14 02:59:59 +0000634 decl = member_sp->m_parser_vars->m_named_decl;
635 value = member_sp->m_parser_vars->m_llvm_value;
636 offset = member_sp->m_jit_vars->m_offset;
637 name = member_sp->GetName();
Sean Callanan8c127202010-08-23 23:09:38 +0000638
Sean Callanan8bce6652010-07-13 21:41:46 +0000639 return true;
640}
641
Sean Callanan02fbafa2010-07-27 21:39:39 +0000642bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000643ClangExpressionDeclMap::GetFunctionInfo
644(
Sean Callanan9b6898f2011-07-30 02:42:06 +0000645 const NamedDecl *decl,
Greg Clayton8de27c72010-10-15 22:48:33 +0000646 uint64_t &ptr
647)
Sean Callananba992c52010-07-27 02:07:53 +0000648{
Greg Clayton427f2902010-12-14 02:59:59 +0000649 ClangExpressionVariableSP entity_sp(m_found_entities.GetVariable(decl));
Sean Callanan8c127202010-08-23 23:09:38 +0000650
Greg Clayton427f2902010-12-14 02:59:59 +0000651 if (!entity_sp)
Sean Callanan8c127202010-08-23 23:09:38 +0000652 return false;
Sean Callananba992c52010-07-27 02:07:53 +0000653
Sean Callanan8c127202010-08-23 23:09:38 +0000654 // We know m_parser_vars is valid since we searched for the variable by
655 // its NamedDecl
Sean Callananba992c52010-07-27 02:07:53 +0000656
Greg Clayton427f2902010-12-14 02:59:59 +0000657 ptr = entity_sp->m_parser_vars->m_lldb_value->GetScalar().ULongLong();
Sean Callanan8c127202010-08-23 23:09:38 +0000658
659 return true;
Sean Callananba992c52010-07-27 02:07:53 +0000660}
661
Sean Callananca2516d2011-08-16 18:09:29 +0000662static void
663FindCodeSymbolInContext
664(
665 const ConstString &name,
666 SymbolContext &sym_ctx,
667 SymbolContextList &sc_list
668)
669{
670 if (sym_ctx.module_sp)
Sean Callananaa4a5532011-10-13 16:49:47 +0000671 sym_ctx.module_sp->FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list);
Sean Callananca2516d2011-08-16 18:09:29 +0000672
673 if (!sc_list.GetSize())
674 sym_ctx.target_sp->GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list);
675}
676
Sean Callananf5857a02010-07-31 01:32:05 +0000677bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000678ClangExpressionDeclMap::GetFunctionAddress
679(
680 const ConstString &name,
Greg Claytonda7af842011-05-18 22:01:49 +0000681 uint64_t &func_addr
Greg Clayton8de27c72010-10-15 22:48:33 +0000682)
Sean Callananf5857a02010-07-31 01:32:05 +0000683{
Sean Callananaa301c42010-12-03 01:38:59 +0000684 assert (m_parser_vars.get());
685
Sean Callananaba367e2011-05-13 18:27:02 +0000686 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Greg Clayton567e7f32011-09-22 04:58:26 +0000687 ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
688 if (exe_ctx == NULL)
689 return false;
690 Target *target = exe_ctx->GetTargetPtr();
Sean Callananf5857a02010-07-31 01:32:05 +0000691 // Back out in all cases where we're not fully initialized
Greg Clayton567e7f32011-09-22 04:58:26 +0000692 if (target == NULL)
Jim Ingham78b9ee82010-12-07 01:56:02 +0000693 return false;
694 if (!m_parser_vars->m_sym_ctx.target_sp)
Sean Callananf5857a02010-07-31 01:32:05 +0000695 return false;
696
Greg Claytone5748d82010-11-09 23:46:37 +0000697 SymbolContextList sc_list;
Sean Callananf5857a02010-07-31 01:32:05 +0000698
Sean Callananca2516d2011-08-16 18:09:29 +0000699 FindCodeSymbolInContext(name, m_parser_vars->m_sym_ctx, sc_list);
700
Greg Claytone5748d82010-11-09 23:46:37 +0000701 if (!sc_list.GetSize())
Sean Callananaba367e2011-05-13 18:27:02 +0000702 {
703 // We occasionally get debug information in which a const function is reported
704 // as non-const, so the mangled name is wrong. This is a hack to compensate.
705
Sean Callanan0eb21392011-10-25 18:02:05 +0000706 if (!strncmp(name.GetCString(), "_ZN", 3) &&
707 strncmp(name.GetCString(), "_ZNK", 4))
Sean Callananaba367e2011-05-13 18:27:02 +0000708 {
Sean Callanan0eb21392011-10-25 18:02:05 +0000709 std::string fixed_scratch("_ZNK");
710 fixed_scratch.append(name.GetCString() + 3);
711 ConstString fixed_name(fixed_scratch.c_str());
Sean Callananaba367e2011-05-13 18:27:02 +0000712
713 if (log)
Sean Callanan0eb21392011-10-25 18:02:05 +0000714 log->Printf("Failed to find symbols given non-const name %s; trying %s", name.GetCString(), fixed_name.GetCString());
715
716 FindCodeSymbolInContext(fixed_name, m_parser_vars->m_sym_ctx, sc_list);
Sean Callananaba367e2011-05-13 18:27:02 +0000717 }
718 }
719
720 if (!sc_list.GetSize())
Sean Callananf5857a02010-07-31 01:32:05 +0000721 return false;
722
723 SymbolContext sym_ctx;
Greg Claytone5748d82010-11-09 23:46:37 +0000724 sc_list.GetContextAtIndex(0, sym_ctx);
Sean Callananf5857a02010-07-31 01:32:05 +0000725
Greg Claytonda7af842011-05-18 22:01:49 +0000726 const Address *func_so_addr = NULL;
Sean Callananf5857a02010-07-31 01:32:05 +0000727
728 if (sym_ctx.function)
Greg Claytonda7af842011-05-18 22:01:49 +0000729 func_so_addr = &sym_ctx.function->GetAddressRange().GetBaseAddress();
Sean Callananf5857a02010-07-31 01:32:05 +0000730 else if (sym_ctx.symbol)
Greg Claytonda7af842011-05-18 22:01:49 +0000731 func_so_addr = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress();
Sean Callananf5857a02010-07-31 01:32:05 +0000732 else
733 return false;
734
Sean Callananae9f7482011-07-07 23:05:43 +0000735 if (!func_so_addr || !func_so_addr->IsValid())
736 return false;
737
Greg Clayton567e7f32011-09-22 04:58:26 +0000738 func_addr = func_so_addr->GetCallableLoadAddress (target);
Greg Claytonda7af842011-05-18 22:01:49 +0000739
Sean Callananf5857a02010-07-31 01:32:05 +0000740 return true;
741}
742
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000743addr_t
Sean Callanan21ef5bb2011-12-01 02:04:16 +0000744ClangExpressionDeclMap::GetSymbolAddress (Target &target, const ConstString &name, lldb::SymbolType symbol_type)
Sean Callananc7674af2011-01-17 23:42:46 +0000745{
Sean Callananc7674af2011-01-17 23:42:46 +0000746 SymbolContextList sc_list;
747
Sean Callanan21ef5bb2011-12-01 02:04:16 +0000748 target.GetImages().FindSymbolsWithNameAndType(name, symbol_type, sc_list);
Sean Callananc7674af2011-01-17 23:42:46 +0000749
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000750 const uint32_t num_matches = sc_list.GetSize();
751 addr_t symbol_load_addr = LLDB_INVALID_ADDRESS;
752
Sean Callanan21ef5bb2011-12-01 02:04:16 +0000753 for (uint32_t i=0; i<num_matches && (symbol_load_addr == 0 || symbol_load_addr == LLDB_INVALID_ADDRESS); i++)
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000754 {
755 SymbolContext sym_ctx;
756 sc_list.GetContextAtIndex(i, sym_ctx);
Sean Callananc7674af2011-01-17 23:42:46 +0000757
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000758 const Address *sym_address = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress();
Sean Callananae9f7482011-07-07 23:05:43 +0000759
760 if (!sym_address || !sym_address->IsValid())
761 return LLDB_INVALID_ADDRESS;
762
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000763 if (sym_address)
764 {
765 switch (sym_ctx.symbol->GetType())
766 {
767 case eSymbolTypeCode:
768 case eSymbolTypeTrampoline:
769 symbol_load_addr = sym_address->GetCallableLoadAddress (&target);
770 break;
771
772 case eSymbolTypeData:
773 case eSymbolTypeRuntime:
774 case eSymbolTypeVariable:
775 case eSymbolTypeLocal:
776 case eSymbolTypeParam:
777 case eSymbolTypeInvalid:
778 case eSymbolTypeAbsolute:
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000779 case eSymbolTypeException:
780 case eSymbolTypeSourceFile:
781 case eSymbolTypeHeaderFile:
782 case eSymbolTypeObjectFile:
783 case eSymbolTypeCommonBlock:
784 case eSymbolTypeBlock:
785 case eSymbolTypeVariableType:
786 case eSymbolTypeLineEntry:
787 case eSymbolTypeLineHeader:
788 case eSymbolTypeScopeBegin:
789 case eSymbolTypeScopeEnd:
790 case eSymbolTypeAdditional:
791 case eSymbolTypeCompiler:
792 case eSymbolTypeInstrumentation:
793 case eSymbolTypeUndefined:
Greg Clayton3f69eac2011-12-03 02:30:59 +0000794 case eSymbolTypeObjCClass:
795 case eSymbolTypeObjCMetaClass:
796 case eSymbolTypeObjCIVar:
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000797 symbol_load_addr = sym_address->GetLoadAddress (&target);
798 break;
799 }
800 }
801 }
Sean Callananc7674af2011-01-17 23:42:46 +0000802
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000803 return symbol_load_addr;
Sean Callananc7674af2011-01-17 23:42:46 +0000804}
805
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000806addr_t
Sean Callanan21ef5bb2011-12-01 02:04:16 +0000807ClangExpressionDeclMap::GetSymbolAddress (const ConstString &name, lldb::SymbolType symbol_type)
Sean Callanan81974962011-05-08 02:21:26 +0000808{
809 assert (m_parser_vars.get());
810
811 if (!m_parser_vars->m_exe_ctx ||
Greg Clayton567e7f32011-09-22 04:58:26 +0000812 !m_parser_vars->m_exe_ctx->GetTargetPtr())
Sean Callanan81974962011-05-08 02:21:26 +0000813 return false;
814
Sean Callanan21ef5bb2011-12-01 02:04:16 +0000815 return GetSymbolAddress(m_parser_vars->m_exe_ctx->GetTargetRef(), name, symbol_type);
Sean Callanan81974962011-05-08 02:21:26 +0000816}
817
Sean Callanan47dc4572011-09-15 02:13:07 +0000818// Interface for IRInterpreter
819
Sean Callanan557ccd62011-10-21 05:18:02 +0000820Value
821ClangExpressionDeclMap::WrapBareAddress (lldb::addr_t addr)
822{
823 Value ret;
824
825 ret.SetContext(Value::eContextTypeInvalid, NULL);
826
827 if (m_parser_vars->m_exe_ctx && m_parser_vars->m_exe_ctx->GetProcessPtr())
828 ret.SetValueType(Value::eValueTypeLoadAddress);
829 else
830 ret.SetValueType(Value::eValueTypeFileAddress);
831
832 ret.GetScalar() = (unsigned long long)addr;
833
834 return ret;
835}
836
Sean Callanan47dc4572011-09-15 02:13:07 +0000837bool
838ClangExpressionDeclMap::WriteTarget (lldb_private::Value &value,
839 const uint8_t *data,
840 size_t length)
841{
842 assert (m_parser_vars.get());
843
844 ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
845
Greg Clayton567e7f32011-09-22 04:58:26 +0000846 Process *process = exe_ctx->GetProcessPtr();
Sean Callanan47dc4572011-09-15 02:13:07 +0000847 if (value.GetContextType() == Value::eContextTypeRegisterInfo)
848 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000849 if (!process)
Sean Callanan47dc4572011-09-15 02:13:07 +0000850 return false;
851
852 RegisterContext *reg_ctx = exe_ctx->GetRegisterContext();
853 RegisterInfo *reg_info = value.GetRegisterInfo();
854
855 if (!reg_ctx)
856 return false;
857
858 lldb_private::RegisterValue reg_value;
859 Error err;
860
Greg Clayton567e7f32011-09-22 04:58:26 +0000861 if (!reg_value.SetFromMemoryData (reg_info, data, length, process->GetByteOrder(), err))
Sean Callanan47dc4572011-09-15 02:13:07 +0000862 return false;
863
864 return reg_ctx->WriteRegister(reg_info, reg_value);
865 }
866 else
867 {
868 switch (value.GetValueType())
869 {
870 default:
871 return false;
872 case Value::eValueTypeFileAddress:
873 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000874 if (!process)
Sean Callanan47dc4572011-09-15 02:13:07 +0000875 return false;
876
Greg Clayton567e7f32011-09-22 04:58:26 +0000877 Target *target = exe_ctx->GetTargetPtr();
Sean Callanan47dc4572011-09-15 02:13:07 +0000878 Address file_addr;
879
Greg Clayton567e7f32011-09-22 04:58:26 +0000880 if (!target->GetImages().ResolveFileAddress((lldb::addr_t)value.GetScalar().ULongLong(), file_addr))
Sean Callanan47dc4572011-09-15 02:13:07 +0000881 return false;
882
Greg Clayton567e7f32011-09-22 04:58:26 +0000883 lldb::addr_t load_addr = file_addr.GetLoadAddress(target);
Sean Callanan47dc4572011-09-15 02:13:07 +0000884
885 Error err;
Greg Clayton567e7f32011-09-22 04:58:26 +0000886 process->WriteMemory(load_addr, data, length, err);
Sean Callanan47dc4572011-09-15 02:13:07 +0000887
888 return err.Success();
889 }
890 case Value::eValueTypeLoadAddress:
891 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000892 if (!process)
Sean Callanan47dc4572011-09-15 02:13:07 +0000893 return false;
894
895 Error err;
Greg Clayton567e7f32011-09-22 04:58:26 +0000896 process->WriteMemory((lldb::addr_t)value.GetScalar().ULongLong(), data, length, err);
Sean Callanan47dc4572011-09-15 02:13:07 +0000897
898 return err.Success();
899 }
900 case Value::eValueTypeHostAddress:
Sean Callanane1301a62011-12-06 03:41:14 +0000901 {
902 if (value.GetScalar().ULongLong() == 0 || data == NULL)
903 return false;
904 memcpy ((void *)value.GetScalar().ULongLong(), data, length);
905 return true;
906 }
Sean Callanan47dc4572011-09-15 02:13:07 +0000907 case Value::eValueTypeScalar:
908 return false;
909 }
910 }
911}
912
913bool
914ClangExpressionDeclMap::ReadTarget (uint8_t *data,
915 lldb_private::Value &value,
916 size_t length)
917{
918 assert (m_parser_vars.get());
919
920 ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
Greg Clayton567e7f32011-09-22 04:58:26 +0000921
922 Process *process = exe_ctx->GetProcessPtr();
923
Sean Callanan47dc4572011-09-15 02:13:07 +0000924 if (value.GetContextType() == Value::eContextTypeRegisterInfo)
925 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000926 if (!process)
Sean Callanan47dc4572011-09-15 02:13:07 +0000927 return false;
928
929 RegisterContext *reg_ctx = exe_ctx->GetRegisterContext();
930 RegisterInfo *reg_info = value.GetRegisterInfo();
931
932 if (!reg_ctx)
933 return false;
934
935 lldb_private::RegisterValue reg_value;
936 Error err;
937
938 if (!reg_ctx->ReadRegister(reg_info, reg_value))
939 return false;
940
Greg Clayton567e7f32011-09-22 04:58:26 +0000941 return reg_value.GetAsMemoryData(reg_info, data, length, process->GetByteOrder(), err);
Sean Callanan47dc4572011-09-15 02:13:07 +0000942 }
943 else
944 {
945 switch (value.GetValueType())
946 {
947 default:
948 return false;
949 case Value::eValueTypeFileAddress:
950 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000951 Target *target = exe_ctx->GetTargetPtr();
952 if (target == NULL)
Sean Callanan47dc4572011-09-15 02:13:07 +0000953 return false;
954
955 Address file_addr;
956
Greg Clayton567e7f32011-09-22 04:58:26 +0000957 if (!target->GetImages().ResolveFileAddress((lldb::addr_t)value.GetScalar().ULongLong(), file_addr))
Sean Callanan47dc4572011-09-15 02:13:07 +0000958 return false;
959
960 Error err;
Greg Clayton567e7f32011-09-22 04:58:26 +0000961 target->ReadMemory(file_addr, true, data, length, err);
Sean Callanan47dc4572011-09-15 02:13:07 +0000962
963 return err.Success();
964 }
965 case Value::eValueTypeLoadAddress:
966 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000967 if (!process)
Sean Callanan47dc4572011-09-15 02:13:07 +0000968 return false;
969
970 Error err;
Greg Clayton567e7f32011-09-22 04:58:26 +0000971 process->ReadMemory((lldb::addr_t)value.GetScalar().ULongLong(), data, length, err);
Sean Callanan47dc4572011-09-15 02:13:07 +0000972
973 return err.Success();
974 }
975 case Value::eValueTypeHostAddress:
Sean Callanan5a55c7a2011-11-18 03:28:09 +0000976 {
977 void *host_addr = (void*)value.GetScalar().ULongLong();
978
979 if (!host_addr)
980 return false;
981
982 memcpy (data, host_addr, length);
Sean Callanan47dc4572011-09-15 02:13:07 +0000983 return true;
Sean Callanan5a55c7a2011-11-18 03:28:09 +0000984 }
Sean Callanan47dc4572011-09-15 02:13:07 +0000985 case Value::eValueTypeScalar:
986 return false;
987 }
988 }
989}
990
991lldb_private::Value
992ClangExpressionDeclMap::LookupDecl (clang::NamedDecl *decl)
993{
994 assert (m_parser_vars.get());
995
996 ExecutionContext exe_ctx = *m_parser_vars->m_exe_ctx;
997
998 ClangExpressionVariableSP expr_var_sp (m_found_entities.GetVariable(decl));
999 ClangExpressionVariableSP persistent_var_sp (m_parser_vars->m_persistent_vars->GetVariable(decl));
Sean Callanan1c38d102011-11-02 23:24:30 +00001000
Sean Callanan47dc4572011-09-15 02:13:07 +00001001 if (expr_var_sp)
1002 {
Sean Callanan4a078322011-10-13 00:09:20 +00001003 if (!expr_var_sp->m_parser_vars.get() || !expr_var_sp->m_parser_vars->m_lldb_var)
Sean Callanan6d284ef2011-10-12 22:20:02 +00001004 return Value();
1005
Sean Callanan1c38d102011-11-02 23:24:30 +00001006 bool is_reference = expr_var_sp->m_flags & ClangExpressionVariable::EVTypeIsReference;
1007
Sean Callanan4b3cef02011-10-26 21:20:00 +00001008 std::auto_ptr<Value> value(GetVariableValue(exe_ctx, expr_var_sp->m_parser_vars->m_lldb_var, NULL));
1009
Sean Callanan1c38d102011-11-02 23:24:30 +00001010 if (is_reference && value.get() && value->GetValueType() == Value::eValueTypeLoadAddress)
1011 {
1012 Process *process = m_parser_vars->m_exe_ctx->GetProcessPtr();
1013
1014 if (!process)
1015 return Value();
1016
1017 lldb::addr_t value_addr = value->GetScalar().ULongLong();
1018 Error read_error;
1019 addr_t ref_value = process->ReadPointerFromMemory (value_addr, read_error);
1020
1021 if (!read_error.Success())
1022 return Value();
1023
1024 value->GetScalar() = (unsigned long long)ref_value;
1025 }
1026
Sean Callanan4b3cef02011-10-26 21:20:00 +00001027 if (value.get())
1028 return *value;
1029 else
1030 return Value();
Sean Callanan47dc4572011-09-15 02:13:07 +00001031 }
1032 else if (persistent_var_sp)
1033 {
Sean Callanana8428a42011-09-22 00:41:11 +00001034 if ((persistent_var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference ||
1035 persistent_var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) &&
Sean Callanan86a07da2011-10-22 01:58:08 +00001036 persistent_var_sp->m_live_sp &&
Sean Callananf48de6d2011-12-10 03:12:34 +00001037 ((persistent_var_sp->m_live_sp->GetValue().GetValueType() == Value::eValueTypeLoadAddress &&
1038 m_parser_vars->m_exe_ctx->GetProcessSP() &&
1039 m_parser_vars->m_exe_ctx->GetProcessSP()->IsAlive()) ||
1040 (persistent_var_sp->m_live_sp->GetValue().GetValueType() == Value::eValueTypeFileAddress)))
Sean Callanana8428a42011-09-22 00:41:11 +00001041 {
Sean Callanan4b3cef02011-10-26 21:20:00 +00001042 return persistent_var_sp->m_live_sp->GetValue();
Sean Callanana8428a42011-09-22 00:41:11 +00001043 }
1044 else
1045 {
1046 lldb_private::Value ret;
1047 ret.SetValueType(Value::eValueTypeHostAddress);
1048 ret.SetContext(Value::eContextTypeInvalid, NULL);
1049 ret.GetScalar() = (lldb::addr_t)persistent_var_sp->GetValueBytes();
1050 return ret;
1051 }
Sean Callanan47dc4572011-09-15 02:13:07 +00001052 }
1053 else
1054 {
1055 return Value();
1056 }
1057}
1058
Sean Callanan4b3cef02011-10-26 21:20:00 +00001059Value
1060ClangExpressionDeclMap::GetSpecialValue (const ConstString &name)
1061{
1062 assert(m_parser_vars.get());
1063
1064 if (!m_parser_vars->m_exe_ctx)
1065 return Value();
1066
1067 StackFrame *frame = m_parser_vars->m_exe_ctx->GetFramePtr();
1068
1069 if (!frame)
1070 return Value();
1071
1072 VariableList *vars = frame->GetVariableList(false);
1073
1074 if (!vars)
1075 return Value();
1076
1077 lldb::VariableSP var = vars->FindVariable(name);
1078
1079 if (!var ||
1080 !var->IsInScope(frame) ||
1081 !var->LocationIsValidForFrame (frame))
1082 return Value();
1083
1084 std::auto_ptr<Value> value(GetVariableValue(*m_parser_vars->m_exe_ctx, var, NULL));
1085
Sean Callanan41a410d2011-11-03 22:48:37 +00001086 if (value.get() && value->GetValueType() == Value::eValueTypeLoadAddress)
1087 {
1088 Process *process = m_parser_vars->m_exe_ctx->GetProcessPtr();
1089
1090 if (!process)
1091 return Value();
1092
1093 lldb::addr_t value_addr = value->GetScalar().ULongLong();
1094 Error read_error;
1095 addr_t ptr_value = process->ReadPointerFromMemory (value_addr, read_error);
1096
1097 if (!read_error.Success())
1098 return Value();
1099
1100 value->GetScalar() = (unsigned long long)ptr_value;
1101 }
1102
Sean Callanan4b3cef02011-10-26 21:20:00 +00001103 if (value.get())
1104 return *value;
1105 else
1106 return Value();
1107}
1108
Sean Callanan810f22d2010-07-16 00:09:46 +00001109// Interface for CommandObjectExpression
Sean Callananf328c9f2010-07-20 23:31:16 +00001110
1111bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001112ClangExpressionDeclMap::Materialize
1113(
Sean Callananaa301c42010-12-03 01:38:59 +00001114 ExecutionContext &exe_ctx,
Greg Clayton8de27c72010-10-15 22:48:33 +00001115 lldb::addr_t &struct_address,
1116 Error &err
1117)
Sean Callananf328c9f2010-07-20 23:31:16 +00001118{
Sean Callananaa301c42010-12-03 01:38:59 +00001119 EnableMaterialVars();
1120
Greg Clayton567e7f32011-09-22 04:58:26 +00001121 m_material_vars->m_process = exe_ctx.GetProcessPtr();
Sean Callananaa301c42010-12-03 01:38:59 +00001122
Sean Callanan0ddf8062011-05-09 22:04:36 +00001123 bool result = DoMaterialize(false /* dematerialize */,
1124 exe_ctx,
1125 LLDB_INVALID_ADDRESS /* top of stack frame */,
1126 LLDB_INVALID_ADDRESS /* bottom of stack frame */,
1127 NULL, /* result SP */
1128 err);
Sean Callananf328c9f2010-07-20 23:31:16 +00001129
1130 if (result)
Sean Callananaa301c42010-12-03 01:38:59 +00001131 struct_address = m_material_vars->m_materialized_location;
Sean Callananf328c9f2010-07-20 23:31:16 +00001132
1133 return result;
1134}
1135
1136bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001137ClangExpressionDeclMap::GetObjectPointer
1138(
1139 lldb::addr_t &object_ptr,
Sean Callanan3aa7da52010-12-13 22:46:15 +00001140 ConstString &object_name,
Sean Callananaa301c42010-12-03 01:38:59 +00001141 ExecutionContext &exe_ctx,
Sean Callanan047923c2010-12-14 00:42:36 +00001142 Error &err,
1143 bool suppress_type_check
Greg Clayton8de27c72010-10-15 22:48:33 +00001144)
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001145{
Sean Callananaa301c42010-12-03 01:38:59 +00001146 assert (m_struct_vars.get());
1147
Greg Clayton567e7f32011-09-22 04:58:26 +00001148 Target *target = exe_ctx.GetTargetPtr();
1149 Process *process = exe_ctx.GetProcessPtr();
1150 StackFrame *frame = exe_ctx.GetFramePtr();
1151
1152 if (frame == NULL || process == NULL || target == NULL)
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001153 {
Sean Callanane6ea5fe2011-11-15 02:11:17 +00001154 err.SetErrorStringWithFormat("Couldn't load '%s' because the context is incomplete", object_name.AsCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001155 return false;
1156 }
1157
Sean Callananaa301c42010-12-03 01:38:59 +00001158 if (!m_struct_vars->m_object_pointer_type.GetOpaqueQualType())
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001159 {
Sean Callanane6ea5fe2011-11-15 02:11:17 +00001160 err.SetErrorStringWithFormat("Couldn't load '%s' because its type is unknown", object_name.AsCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001161 return false;
1162 }
1163
Greg Clayton567e7f32011-09-22 04:58:26 +00001164 VariableSP object_ptr_var = FindVariableInScope (*frame,
Sean Callanan696cf5f2011-05-07 01:06:41 +00001165 object_name,
1166 (suppress_type_check ? NULL : &m_struct_vars->m_object_pointer_type));
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001167
1168 if (!object_ptr_var)
1169 {
Sean Callanane6ea5fe2011-11-15 02:11:17 +00001170 err.SetErrorStringWithFormat("Couldn't find '%s' with appropriate type in scope", object_name.AsCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001171 return false;
1172 }
1173
Sean Callananaa301c42010-12-03 01:38:59 +00001174 std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(exe_ctx,
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001175 object_ptr_var,
Sean Callananaa301c42010-12-03 01:38:59 +00001176 NULL));
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001177
1178 if (!location_value.get())
1179 {
Sean Callanan3aa7da52010-12-13 22:46:15 +00001180 err.SetErrorStringWithFormat("Couldn't get the location for '%s'", object_name.GetCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001181 return false;
1182 }
1183
Sean Callanan50339fe2011-03-04 00:23:47 +00001184 switch (location_value->GetValueType())
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001185 {
Sean Callanan50339fe2011-03-04 00:23:47 +00001186 default:
Sean Callanan3aa7da52010-12-13 22:46:15 +00001187 err.SetErrorStringWithFormat("'%s' is not in memory; LLDB must be extended to handle registers", object_name.GetCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001188 return false;
Sean Callanan50339fe2011-03-04 00:23:47 +00001189 case Value::eValueTypeLoadAddress:
1190 {
1191 lldb::addr_t value_addr = location_value->GetScalar().ULongLong();
Greg Clayton567e7f32011-09-22 04:58:26 +00001192 uint32_t address_byte_size = target->GetArchitecture().GetAddressByteSize();
Sean Callanan50339fe2011-03-04 00:23:47 +00001193
1194 if (ClangASTType::GetClangTypeBitWidth(m_struct_vars->m_object_pointer_type.GetASTContext(),
1195 m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) != address_byte_size * 8)
1196 {
1197 err.SetErrorStringWithFormat("'%s' is not of an expected pointer size", object_name.GetCString());
1198 return false;
1199 }
1200
Sean Callanan50339fe2011-03-04 00:23:47 +00001201 Error read_error;
Greg Clayton567e7f32011-09-22 04:58:26 +00001202 object_ptr = process->ReadPointerFromMemory (value_addr, read_error);
Greg Claytonc0fa5332011-05-22 22:46:53 +00001203 if (read_error.Fail() || object_ptr == LLDB_INVALID_ADDRESS)
Sean Callanan50339fe2011-03-04 00:23:47 +00001204 {
1205 err.SetErrorStringWithFormat("Coldn't read '%s' from the target: %s", object_name.GetCString(), read_error.AsCString());
1206 return false;
Greg Claytonc0fa5332011-05-22 22:46:53 +00001207 }
Sean Callanan50339fe2011-03-04 00:23:47 +00001208 return true;
1209 }
1210 case Value::eValueTypeScalar:
1211 {
1212 if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
1213 {
1214 StreamString ss;
1215 location_value->Dump(&ss);
1216
1217 err.SetErrorStringWithFormat("%s is a scalar of unhandled type: %s", object_name.GetCString(), ss.GetString().c_str());
1218 return false;
1219 }
1220
Greg Clayton061b79d2011-05-09 20:18:18 +00001221 RegisterInfo *reg_info = location_value->GetRegisterInfo();
Sean Callanan50339fe2011-03-04 00:23:47 +00001222
Greg Clayton061b79d2011-05-09 20:18:18 +00001223 if (!reg_info)
Sean Callanan50339fe2011-03-04 00:23:47 +00001224 {
1225 err.SetErrorStringWithFormat("Couldn't get the register information for %s", object_name.GetCString());
1226 return false;
1227 }
1228
Greg Clayton061b79d2011-05-09 20:18:18 +00001229 RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
Sean Callanan50339fe2011-03-04 00:23:47 +00001230
Greg Clayton061b79d2011-05-09 20:18:18 +00001231 if (!reg_ctx)
Sean Callanan50339fe2011-03-04 00:23:47 +00001232 {
Greg Clayton061b79d2011-05-09 20:18:18 +00001233 err.SetErrorStringWithFormat("Couldn't read register context to read %s from %s", object_name.GetCString(), reg_info->name);
Sean Callanan50339fe2011-03-04 00:23:47 +00001234 return false;
1235 }
1236
Greg Clayton061b79d2011-05-09 20:18:18 +00001237 uint32_t register_number = reg_info->kinds[lldb::eRegisterKindLLDB];
Sean Callanan50339fe2011-03-04 00:23:47 +00001238
Greg Clayton061b79d2011-05-09 20:18:18 +00001239 object_ptr = reg_ctx->ReadRegisterAsUnsigned(register_number, 0x0);
Sean Callanan50339fe2011-03-04 00:23:47 +00001240
1241 return true;
1242 }
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001243 }
1244}
1245
1246bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001247ClangExpressionDeclMap::Dematerialize
1248(
Sean Callananaa301c42010-12-03 01:38:59 +00001249 ExecutionContext &exe_ctx,
Greg Clayton427f2902010-12-14 02:59:59 +00001250 ClangExpressionVariableSP &result_sp,
Sean Callanan0ddf8062011-05-09 22:04:36 +00001251 lldb::addr_t stack_frame_top,
1252 lldb::addr_t stack_frame_bottom,
Greg Clayton8de27c72010-10-15 22:48:33 +00001253 Error &err
1254)
Sean Callananf328c9f2010-07-20 23:31:16 +00001255{
Sean Callanan0ddf8062011-05-09 22:04:36 +00001256 return DoMaterialize(true, exe_ctx, stack_frame_top, stack_frame_bottom, &result_sp, err);
Sean Callananaa301c42010-12-03 01:38:59 +00001257
1258 DidDematerialize();
1259}
1260
1261void
1262ClangExpressionDeclMap::DidDematerialize()
1263{
1264 if (m_material_vars.get())
1265 {
1266 if (m_material_vars->m_materialized_location)
1267 {
1268 //#define SINGLE_STEP_EXPRESSIONS
1269
1270#ifndef SINGLE_STEP_EXPRESSIONS
1271 m_material_vars->m_process->DeallocateMemory(m_material_vars->m_materialized_location);
1272#endif
1273 m_material_vars->m_materialized_location = 0;
1274 }
1275
1276 DisableMaterialVars();
1277 }
Sean Callananf328c9f2010-07-20 23:31:16 +00001278}
1279
Sean Callanan32824aa2010-07-23 22:19:18 +00001280bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001281ClangExpressionDeclMap::DumpMaterializedStruct
1282(
Sean Callananaa301c42010-12-03 01:38:59 +00001283 ExecutionContext &exe_ctx,
Greg Clayton8de27c72010-10-15 22:48:33 +00001284 Stream &s,
1285 Error &err
1286)
Sean Callanan32824aa2010-07-23 22:19:18 +00001287{
Sean Callananaa301c42010-12-03 01:38:59 +00001288 assert (m_struct_vars.get());
1289 assert (m_material_vars.get());
1290
1291 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan32824aa2010-07-23 22:19:18 +00001292 {
1293 err.SetErrorString("Structure hasn't been laid out yet");
1294 return false;
1295 }
Greg Clayton567e7f32011-09-22 04:58:26 +00001296 Process *process = exe_ctx.GetProcessPtr();
1297
1298 if (!process)
Sean Callanan32824aa2010-07-23 22:19:18 +00001299 {
1300 err.SetErrorString("Couldn't find the process");
1301 return false;
1302 }
1303
Greg Clayton567e7f32011-09-22 04:58:26 +00001304 Target *target = exe_ctx.GetTargetPtr();
1305 if (!target)
Sean Callanan32824aa2010-07-23 22:19:18 +00001306 {
1307 err.SetErrorString("Couldn't find the target");
1308 return false;
1309 }
1310
Sean Callanan33711022010-12-07 10:00:20 +00001311 if (!m_material_vars->m_materialized_location)
1312 {
1313 err.SetErrorString("No materialized location");
1314 return false;
1315 }
1316
Greg Claytonc0fa5332011-05-22 22:46:53 +00001317 lldb::DataBufferSP data_sp(new DataBufferHeap(m_struct_vars->m_struct_size, 0));
Sean Callanan32824aa2010-07-23 22:19:18 +00001318
1319 Error error;
Greg Clayton567e7f32011-09-22 04:58:26 +00001320 if (process->ReadMemory (m_material_vars->m_materialized_location,
Greg Claytonc0fa5332011-05-22 22:46:53 +00001321 data_sp->GetBytes(),
1322 data_sp->GetByteSize(), error) != data_sp->GetByteSize())
Sean Callanan32824aa2010-07-23 22:19:18 +00001323 {
1324 err.SetErrorStringWithFormat ("Couldn't read struct from the target: %s", error.AsCString());
1325 return false;
1326 }
1327
Greg Clayton567e7f32011-09-22 04:58:26 +00001328 DataExtractor extractor(data_sp, process->GetByteOrder(), target->GetArchitecture().GetAddressByteSize());
Sean Callanan32824aa2010-07-23 22:19:18 +00001329
Greg Clayton427f2902010-12-14 02:59:59 +00001330 for (size_t member_idx = 0, num_members = m_struct_members.GetSize();
1331 member_idx < num_members;
1332 ++member_idx)
Sean Callanan32824aa2010-07-23 22:19:18 +00001333 {
Greg Clayton427f2902010-12-14 02:59:59 +00001334 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_idx));
Sean Callanan32824aa2010-07-23 22:19:18 +00001335
Greg Clayton427f2902010-12-14 02:59:59 +00001336 if (!member_sp)
1337 return false;
1338
1339 s.Printf("[%s]\n", member_sp->GetName().GetCString());
Sean Callanan8c127202010-08-23 23:09:38 +00001340
Greg Clayton427f2902010-12-14 02:59:59 +00001341 if (!member_sp->m_jit_vars.get())
Sean Callanan8c127202010-08-23 23:09:38 +00001342 return false;
1343
Greg Clayton427f2902010-12-14 02:59:59 +00001344 extractor.Dump (&s, // stream
1345 member_sp->m_jit_vars->m_offset, // offset
1346 lldb::eFormatBytesWithASCII, // format
1347 1, // byte size of individual entries
1348 member_sp->m_jit_vars->m_size, // number of entries
1349 16, // entries per line
1350 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, // address to print
1351 0, // bit size (bitfields only; 0 means ignore)
1352 0); // bit alignment (bitfields only; 0 means ignore)
Sean Callanan32824aa2010-07-23 22:19:18 +00001353
1354 s.PutChar('\n');
1355 }
1356
1357 return true;
1358}
1359
Sean Callananf328c9f2010-07-20 23:31:16 +00001360bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001361ClangExpressionDeclMap::DoMaterialize
1362(
1363 bool dematerialize,
Sean Callananaa301c42010-12-03 01:38:59 +00001364 ExecutionContext &exe_ctx,
Sean Callanan0ddf8062011-05-09 22:04:36 +00001365 lldb::addr_t stack_frame_top,
1366 lldb::addr_t stack_frame_bottom,
Greg Clayton427f2902010-12-14 02:59:59 +00001367 lldb::ClangExpressionVariableSP *result_sp_ptr,
Greg Clayton8de27c72010-10-15 22:48:33 +00001368 Error &err
1369)
Sean Callanan810f22d2010-07-16 00:09:46 +00001370{
Greg Clayton427f2902010-12-14 02:59:59 +00001371 if (result_sp_ptr)
1372 result_sp_ptr->reset();
1373
Sean Callananaa301c42010-12-03 01:38:59 +00001374 assert (m_struct_vars.get());
1375
Greg Claytone005f2c2010-11-06 01:53:30 +00001376 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan82b74c82010-08-12 01:56:52 +00001377
Sean Callananaa301c42010-12-03 01:38:59 +00001378 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan810f22d2010-07-16 00:09:46 +00001379 {
1380 err.SetErrorString("Structure hasn't been laid out yet");
Greg Clayton57067a02011-09-13 04:03:52 +00001381 return false;
Sean Callanan810f22d2010-07-16 00:09:46 +00001382 }
1383
Greg Clayton567e7f32011-09-22 04:58:26 +00001384 StackFrame *frame = exe_ctx.GetFramePtr();
1385 if (!frame)
Sean Callanan45839272010-07-24 01:37:44 +00001386 {
1387 err.SetErrorString("Received null execution frame");
Greg Clayton57067a02011-09-13 04:03:52 +00001388 return false;
Sean Callanan45839272010-07-24 01:37:44 +00001389 }
Greg Clayton567e7f32011-09-22 04:58:26 +00001390 Target *target = exe_ctx.GetTargetPtr();
Sean Callanan45839272010-07-24 01:37:44 +00001391
Greg Clayton567e7f32011-09-22 04:58:26 +00001392 ClangPersistentVariables &persistent_vars = target->GetPersistentVariables();
Sean Callananaa301c42010-12-03 01:38:59 +00001393
1394 if (!m_struct_vars->m_struct_size)
Sean Callanane8a59a82010-09-13 21:34:21 +00001395 {
1396 if (log)
1397 log->PutCString("Not bothering to allocate a struct because no arguments are needed");
1398
Sean Callanan9b6898f2011-07-30 02:42:06 +00001399 m_material_vars->m_allocated_area = NULL;
Sean Callanane8a59a82010-09-13 21:34:21 +00001400
1401 return true;
1402 }
1403
Greg Clayton567e7f32011-09-22 04:58:26 +00001404 const SymbolContext &sym_ctx(frame->GetSymbolContext(lldb::eSymbolContextEverything));
Sean Callanan810f22d2010-07-16 00:09:46 +00001405
Sean Callananf328c9f2010-07-20 23:31:16 +00001406 if (!dematerialize)
Sean Callanan810f22d2010-07-16 00:09:46 +00001407 {
Greg Clayton567e7f32011-09-22 04:58:26 +00001408 Process *process = exe_ctx.GetProcessPtr();
Sean Callananaa301c42010-12-03 01:38:59 +00001409 if (m_material_vars->m_materialized_location)
Sean Callananf328c9f2010-07-20 23:31:16 +00001410 {
Greg Clayton567e7f32011-09-22 04:58:26 +00001411 process->DeallocateMemory(m_material_vars->m_materialized_location);
Sean Callananaa301c42010-12-03 01:38:59 +00001412 m_material_vars->m_materialized_location = 0;
Sean Callananf328c9f2010-07-20 23:31:16 +00001413 }
1414
Sean Callanan7a60b942010-10-08 01:58:41 +00001415 if (log)
1416 log->PutCString("Allocating memory for materialized argument struct");
1417
Greg Clayton567e7f32011-09-22 04:58:26 +00001418 lldb::addr_t mem = process->AllocateMemory(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size,
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001419 lldb::ePermissionsReadable | lldb::ePermissionsWritable,
1420 err);
Sean Callananf328c9f2010-07-20 23:31:16 +00001421
1422 if (mem == LLDB_INVALID_ADDRESS)
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001423 {
1424 err.SetErrorStringWithFormat("Couldn't allocate 0x%llx bytes for materialized argument struct",
1425 (unsigned long long)(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size));
Sean Callananf328c9f2010-07-20 23:31:16 +00001426 return false;
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001427 }
1428
Sean Callananaa301c42010-12-03 01:38:59 +00001429 m_material_vars->m_allocated_area = mem;
Sean Callanan810f22d2010-07-16 00:09:46 +00001430 }
1431
Sean Callananaa301c42010-12-03 01:38:59 +00001432 m_material_vars->m_materialized_location = m_material_vars->m_allocated_area;
Sean Callananf328c9f2010-07-20 23:31:16 +00001433
Sean Callananaa301c42010-12-03 01:38:59 +00001434 if (m_material_vars->m_materialized_location % m_struct_vars->m_struct_alignment)
1435 m_material_vars->m_materialized_location += (m_struct_vars->m_struct_alignment - (m_material_vars->m_materialized_location % m_struct_vars->m_struct_alignment));
Sean Callananf328c9f2010-07-20 23:31:16 +00001436
Greg Clayton427f2902010-12-14 02:59:59 +00001437 for (uint64_t member_index = 0, num_members = m_struct_members.GetSize();
Sean Callanan8c127202010-08-23 23:09:38 +00001438 member_index < num_members;
1439 ++member_index)
Sean Callanan810f22d2010-07-16 00:09:46 +00001440 {
Greg Clayton427f2902010-12-14 02:59:59 +00001441 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
Sean Callanan810f22d2010-07-16 00:09:46 +00001442
Greg Claytona875b642011-01-09 21:07:35 +00001443 if (m_found_entities.ContainsVariable (member_sp))
Sean Callanan8c127202010-08-23 23:09:38 +00001444 {
Greg Claytona875b642011-01-09 21:07:35 +00001445 RegisterInfo *reg_info = member_sp->GetRegisterInfo ();
Greg Clayton427f2902010-12-14 02:59:59 +00001446 if (reg_info)
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001447 {
1448 // This is a register variable
1449
Sean Callananaa301c42010-12-03 01:38:59 +00001450 RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001451
1452 if (!reg_ctx)
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001453 {
1454 err.SetErrorString("Couldn't get register context");
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001455 return false;
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001456 }
1457
Greg Clayton427f2902010-12-14 02:59:59 +00001458 if (!DoMaterializeOneRegister (dematerialize,
1459 exe_ctx,
1460 *reg_ctx,
1461 *reg_info,
1462 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
1463 err))
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001464 return false;
1465 }
1466 else
1467 {
Greg Clayton427f2902010-12-14 02:59:59 +00001468 if (!member_sp->m_jit_vars.get())
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001469 {
1470 err.SetErrorString("Variable being materialized doesn't have necessary state");
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001471 return false;
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001472 }
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001473
Greg Clayton427f2902010-12-14 02:59:59 +00001474 if (!DoMaterializeOneVariable (dematerialize,
1475 exe_ctx,
Sean Callanan6a925532011-01-13 08:53:35 +00001476 sym_ctx,
1477 member_sp,
Greg Clayton427f2902010-12-14 02:59:59 +00001478 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
1479 err))
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001480 return false;
1481 }
Sean Callanan8c127202010-08-23 23:09:38 +00001482 }
Sean Callanan8c127202010-08-23 23:09:38 +00001483 else
1484 {
Greg Claytona875b642011-01-09 21:07:35 +00001485 // No need to look for presistent variables if the name doesn't start
1486 // with with a '$' character...
1487 if (member_sp->GetName().AsCString ("!")[0] == '$' && persistent_vars.ContainsVariable(member_sp))
1488 {
Sean Callanan6a925532011-01-13 08:53:35 +00001489
Greg Claytona875b642011-01-09 21:07:35 +00001490 if (member_sp->GetName() == m_struct_vars->m_result_name)
1491 {
Greg Claytona875b642011-01-09 21:07:35 +00001492 if (log)
1493 log->PutCString("Found result member in the struct");
Sean Callanan6a925532011-01-13 08:53:35 +00001494
Greg Claytona875b642011-01-09 21:07:35 +00001495 if (result_sp_ptr)
1496 *result_sp_ptr = member_sp;
Sean Callanan6a925532011-01-13 08:53:35 +00001497
Greg Claytona875b642011-01-09 21:07:35 +00001498 }
1499
1500 if (!DoMaterializeOnePersistentVariable (dematerialize,
Sean Callanan6a925532011-01-13 08:53:35 +00001501 exe_ctx,
Greg Claytona875b642011-01-09 21:07:35 +00001502 member_sp,
Sean Callanan0ddf8062011-05-09 22:04:36 +00001503 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
1504 stack_frame_top,
1505 stack_frame_bottom,
Greg Claytona875b642011-01-09 21:07:35 +00001506 err))
1507 return false;
1508 }
1509 else
1510 {
1511 err.SetErrorStringWithFormat("Unexpected variable %s", member_sp->GetName().GetCString());
1512 return false;
1513 }
Sean Callanan8c127202010-08-23 23:09:38 +00001514 }
Sean Callanan810f22d2010-07-16 00:09:46 +00001515 }
1516
Sean Callananf328c9f2010-07-20 23:31:16 +00001517 return true;
1518}
1519
Sean Callanana48fe162010-08-11 03:57:18 +00001520bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001521ClangExpressionDeclMap::DoMaterializeOnePersistentVariable
1522(
1523 bool dematerialize,
1524 ExecutionContext &exe_ctx,
Greg Clayton427f2902010-12-14 02:59:59 +00001525 ClangExpressionVariableSP &var_sp,
Greg Clayton8de27c72010-10-15 22:48:33 +00001526 lldb::addr_t addr,
Sean Callanan0ddf8062011-05-09 22:04:36 +00001527 lldb::addr_t stack_frame_top,
1528 lldb::addr_t stack_frame_bottom,
Greg Clayton8de27c72010-10-15 22:48:33 +00001529 Error &err
1530)
Sean Callananaa301c42010-12-03 01:38:59 +00001531{
Sean Callanan6a925532011-01-13 08:53:35 +00001532 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1533
Greg Clayton427f2902010-12-14 02:59:59 +00001534 if (!var_sp)
Sean Callanana48fe162010-08-11 03:57:18 +00001535 {
Greg Clayton427f2902010-12-14 02:59:59 +00001536 err.SetErrorString("Invalid persistent variable");
Sean Callanana48fe162010-08-11 03:57:18 +00001537 return LLDB_INVALID_ADDRESS;
1538 }
1539
Greg Clayton427f2902010-12-14 02:59:59 +00001540 const size_t pvar_byte_size = var_sp->GetByteSize();
Sean Callanana6223432010-08-20 01:02:30 +00001541
Greg Clayton427f2902010-12-14 02:59:59 +00001542 uint8_t *pvar_data = var_sp->GetValueBytes();
1543 if (pvar_data == NULL)
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001544 {
1545 err.SetErrorString("Persistent variable being materialized contains no data");
Sean Callanana6223432010-08-20 01:02:30 +00001546 return false;
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001547 }
Sean Callanana6223432010-08-20 01:02:30 +00001548
Sean Callanana48fe162010-08-11 03:57:18 +00001549 Error error;
Greg Clayton567e7f32011-09-22 04:58:26 +00001550 Process *process = exe_ctx.GetProcessPtr();
1551
Sean Callanan6a925532011-01-13 08:53:35 +00001552 lldb::addr_t mem; // The address of a spare memory area used to hold the persistent variable.
1553
Sean Callanana48fe162010-08-11 03:57:18 +00001554 if (dematerialize)
1555 {
Sean Callanan6a925532011-01-13 08:53:35 +00001556 if (log)
1557 log->Printf("Dematerializing persistent variable with flags 0x%hx", var_sp->m_flags);
1558
1559 if ((var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) ||
1560 (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference))
Sean Callanana48fe162010-08-11 03:57:18 +00001561 {
Sean Callanan6a925532011-01-13 08:53:35 +00001562 // Get the location of the target out of the struct.
1563
1564 Error read_error;
Greg Clayton567e7f32011-09-22 04:58:26 +00001565 mem = process->ReadPointerFromMemory (addr, read_error);
Sean Callanan6a925532011-01-13 08:53:35 +00001566
1567 if (mem == LLDB_INVALID_ADDRESS)
1568 {
1569 err.SetErrorStringWithFormat("Couldn't read address of %s from struct: %s", var_sp->GetName().GetCString(), error.AsCString());
1570 return false;
1571 }
1572
1573 if (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference &&
1574 !var_sp->m_live_sp)
1575 {
1576 // If the reference comes from the program, then the ClangExpressionVariable's
1577 // live variable data hasn't been set up yet. Do this now.
1578
Jim Ingham47da8102011-04-22 23:53:53 +00001579 var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope (),
1580 var_sp->GetTypeFromUser().GetASTContext(),
1581 var_sp->GetTypeFromUser().GetOpaqueQualType(),
1582 var_sp->GetName(),
1583 mem,
1584 eAddressTypeLoad,
1585 pvar_byte_size);
Sean Callanan6a925532011-01-13 08:53:35 +00001586 }
1587
1588 if (!var_sp->m_live_sp)
1589 {
1590 err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", var_sp->GetName().GetCString());
1591 return false;
1592 }
1593
Greg Claytonb3448432011-03-24 21:19:54 +00001594 if (var_sp->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
Sean Callanan6a925532011-01-13 08:53:35 +00001595 {
1596 err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", var_sp->GetName().GetCString());
1597 return false;
1598 }
1599
Sean Callanan97678d12011-01-13 21:23:32 +00001600 if (var_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry ||
1601 var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
Sean Callanan6a925532011-01-13 08:53:35 +00001602 {
1603 mem = var_sp->m_live_sp->GetValue().GetScalar().ULongLong();
1604
1605 if (log)
1606 log->Printf("Dematerializing %s from 0x%llx", var_sp->GetName().GetCString(), (uint64_t)mem);
1607
1608 // Read the contents of the spare memory area
Sean Callanan0ddf8062011-05-09 22:04:36 +00001609
Sean Callanan6a925532011-01-13 08:53:35 +00001610 var_sp->ValueUpdated ();
Greg Clayton567e7f32011-09-22 04:58:26 +00001611 if (process->ReadMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
Sean Callanan6a925532011-01-13 08:53:35 +00001612 {
1613 err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString());
1614 return false;
1615 }
1616
Sean Callanan0ddf8062011-05-09 22:04:36 +00001617 if (stack_frame_top != LLDB_INVALID_ADDRESS &&
1618 stack_frame_bottom != LLDB_INVALID_ADDRESS &&
1619 mem >= stack_frame_bottom &&
1620 mem <= stack_frame_top)
1621 {
1622 // If the variable is resident in the stack frame created by the expression,
1623 // then it cannot be relied upon to stay around. We treat it as needing
1624 // reallocation.
1625
1626 var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
1627 var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
1628 var_sp->m_flags &= ~ClangExpressionVariable::EVIsProgramReference;
1629 }
1630
Sean Callanan6a925532011-01-13 08:53:35 +00001631 var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsFreezeDry;
1632 }
1633
1634 if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation &&
1635 !(var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget))
1636 {
1637 if (m_keep_result_in_memory)
1638 {
1639 var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget;
1640 }
1641 else
1642 {
Greg Clayton567e7f32011-09-22 04:58:26 +00001643 Error deallocate_error = process->DeallocateMemory(mem);
Sean Callanan6a925532011-01-13 08:53:35 +00001644
1645 if (!err.Success())
1646 {
1647 err.SetErrorStringWithFormat ("Couldn't deallocate memory for %s: %s", var_sp->GetName().GetCString(), deallocate_error.AsCString());
1648 return false;
1649 }
1650 }
1651 }
1652 }
1653 else
1654 {
1655 err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
Sean Callanana48fe162010-08-11 03:57:18 +00001656 return false;
1657 }
1658 }
1659 else
1660 {
Sean Callanan6a925532011-01-13 08:53:35 +00001661 if (log)
1662 log->Printf("Materializing persistent variable with flags 0x%hx", var_sp->m_flags);
1663
1664 if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation)
Sean Callanana48fe162010-08-11 03:57:18 +00001665 {
Sean Callanan6a925532011-01-13 08:53:35 +00001666 // Allocate a spare memory area to store the persistent variable's contents.
1667
1668 Error allocate_error;
1669
Greg Clayton567e7f32011-09-22 04:58:26 +00001670 mem = process->AllocateMemory(pvar_byte_size,
Sean Callanan4b3cef02011-10-26 21:20:00 +00001671 lldb::ePermissionsReadable | lldb::ePermissionsWritable,
1672 allocate_error);
Sean Callanan6a925532011-01-13 08:53:35 +00001673
1674 if (mem == LLDB_INVALID_ADDRESS)
1675 {
1676 err.SetErrorStringWithFormat("Couldn't allocate a memory area to store %s: %s", var_sp->GetName().GetCString(), allocate_error.AsCString());
1677 return false;
1678 }
1679
1680 if (log)
1681 log->Printf("Allocated %s (0x%llx) sucessfully", var_sp->GetName().GetCString(), mem);
1682
1683 // Put the location of the spare memory into the live data of the ValueObject.
1684
Jim Ingham47da8102011-04-22 23:53:53 +00001685 var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
1686 var_sp->GetTypeFromUser().GetASTContext(),
1687 var_sp->GetTypeFromUser().GetOpaqueQualType(),
1688 var_sp->GetName(),
1689 mem,
1690 eAddressTypeLoad,
1691 pvar_byte_size);
Sean Callanan6a925532011-01-13 08:53:35 +00001692
1693 // Clear the flag if the variable will never be deallocated.
1694
1695 if (var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
1696 var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsAllocation;
1697
1698 // Write the contents of the variable to the area.
1699
Greg Clayton567e7f32011-09-22 04:58:26 +00001700 if (process->WriteMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
Sean Callanan6a925532011-01-13 08:53:35 +00001701 {
1702 err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString());
1703 return false;
1704 }
1705 }
1706
1707 if ((var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && var_sp->m_live_sp) ||
1708 var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated)
1709 {
Sean Callanan6a925532011-01-13 08:53:35 +00001710 // Now write the location of the area into the struct.
Sean Callanan6a925532011-01-13 08:53:35 +00001711 Error write_error;
Greg Clayton567e7f32011-09-22 04:58:26 +00001712 if (!process->WriteScalarToMemory (addr,
Sean Callanan4b3cef02011-10-26 21:20:00 +00001713 var_sp->m_live_sp->GetValue().GetScalar(),
1714 process->GetAddressByteSize(),
1715 write_error))
Sean Callanan6a925532011-01-13 08:53:35 +00001716 {
1717 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", var_sp->GetName().GetCString(), write_error.AsCString());
1718 return false;
1719 }
1720
1721 if (log)
Greg Claytonc0fa5332011-05-22 22:46:53 +00001722 log->Printf("Materialized %s into 0x%llx", var_sp->GetName().GetCString(), var_sp->m_live_sp->GetValue().GetScalar().ULongLong());
Sean Callanan6a925532011-01-13 08:53:35 +00001723 }
Sean Callanan696cf5f2011-05-07 01:06:41 +00001724 else if (!(var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference))
Sean Callanan6a925532011-01-13 08:53:35 +00001725 {
1726 err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
Sean Callanana48fe162010-08-11 03:57:18 +00001727 return false;
1728 }
1729 }
1730
1731 return true;
1732}
1733
Sean Callananf328c9f2010-07-20 23:31:16 +00001734bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001735ClangExpressionDeclMap::DoMaterializeOneVariable
1736(
1737 bool dematerialize,
1738 ExecutionContext &exe_ctx,
1739 const SymbolContext &sym_ctx,
Sean Callanan6a925532011-01-13 08:53:35 +00001740 ClangExpressionVariableSP &expr_var,
Greg Clayton8de27c72010-10-15 22:48:33 +00001741 lldb::addr_t addr,
1742 Error &err
1743)
Sean Callananf328c9f2010-07-20 23:31:16 +00001744{
Greg Claytone005f2c2010-11-06 01:53:30 +00001745 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Greg Clayton567e7f32011-09-22 04:58:26 +00001746 Target *target = exe_ctx.GetTargetPtr();
1747 Process *process = exe_ctx.GetProcessPtr();
1748 StackFrame *frame = exe_ctx.GetFramePtr();
1749
Sean Callanan6d284ef2011-10-12 22:20:02 +00001750 if (!frame || !process || !target || !m_parser_vars.get() || !expr_var->m_parser_vars.get())
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001751 {
1752 err.SetErrorString("Necessary state for variable materialization isn't present");
Sean Callanancc074622010-09-14 21:59:34 +00001753 return false;
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001754 }
Sean Callanancc074622010-09-14 21:59:34 +00001755
Sean Callanan6a925532011-01-13 08:53:35 +00001756 // Vital information about the value
1757
1758 const ConstString &name(expr_var->GetName());
1759 TypeFromUser type(expr_var->GetTypeFromUser());
1760
Sean Callanan4a078322011-10-13 00:09:20 +00001761 VariableSP &var(expr_var->m_parser_vars->m_lldb_var);
1762 lldb_private::Symbol *sym(expr_var->m_parser_vars->m_lldb_sym);
Sean Callananf328c9f2010-07-20 23:31:16 +00001763
Sean Callanan6f3bde72011-10-27 19:41:13 +00001764 bool is_reference(expr_var->m_flags & ClangExpressionVariable::EVTypeIsReference);
1765
Sean Callanan81974962011-05-08 02:21:26 +00001766 std::auto_ptr<lldb_private::Value> location_value;
Sean Callanan4a078322011-10-13 00:09:20 +00001767
Sean Callanan81974962011-05-08 02:21:26 +00001768 if (var)
1769 {
1770 location_value.reset(GetVariableValue(exe_ctx,
1771 var,
1772 NULL));
1773 }
1774 else if (sym)
Sean Callanan4a078322011-10-13 00:09:20 +00001775 {
Sean Callanan21ef5bb2011-12-01 02:04:16 +00001776 addr_t location_load_addr = GetSymbolAddress(*target, name, lldb::eSymbolTypeAny);
Sean Callanan81974962011-05-08 02:21:26 +00001777
Greg Claytoncbc07cf2011-06-23 04:25:29 +00001778 if (location_load_addr == LLDB_INVALID_ADDRESS)
Sean Callanan81974962011-05-08 02:21:26 +00001779 {
1780 if (log)
Greg Claytonc0fa5332011-05-22 22:46:53 +00001781 err.SetErrorStringWithFormat ("Couldn't find value for global symbol %s",
1782 name.GetCString());
Sean Callanan81974962011-05-08 02:21:26 +00001783 }
1784
Sean Callanan4a078322011-10-13 00:09:20 +00001785 location_value.reset(new Value);
1786
Sean Callanan81974962011-05-08 02:21:26 +00001787 location_value->SetValueType(Value::eValueTypeLoadAddress);
1788 location_value->GetScalar() = location_load_addr;
1789 }
1790 else
Sean Callananf328c9f2010-07-20 23:31:16 +00001791 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001792 err.SetErrorStringWithFormat ("Couldn't find %s with appropriate type",
1793 name.GetCString());
Sean Callananf328c9f2010-07-20 23:31:16 +00001794 return false;
1795 }
1796
Sean Callanan841026f2010-07-23 00:16:21 +00001797 if (log)
Sean Callananfb3058e2011-05-12 23:54:16 +00001798 {
1799 StreamString my_stream_string;
1800
1801 ClangASTType::DumpTypeDescription (type.GetASTContext(),
1802 type.GetOpaqueQualType(),
1803 &my_stream_string);
1804
Greg Claytonc0fa5332011-05-22 22:46:53 +00001805 log->Printf ("%s %s with type %s",
1806 dematerialize ? "Dematerializing" : "Materializing",
1807 name.GetCString(),
1808 my_stream_string.GetString().c_str());
Sean Callananfb3058e2011-05-12 23:54:16 +00001809 }
Sean Callananf328c9f2010-07-20 23:31:16 +00001810
1811 if (!location_value.get())
1812 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001813 err.SetErrorStringWithFormat("Couldn't get value for %s", name.GetCString());
Sean Callananf328c9f2010-07-20 23:31:16 +00001814 return false;
1815 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001816
1817 // The size of the type contained in addr
Sean Callananf328c9f2010-07-20 23:31:16 +00001818
Sean Callanan6a925532011-01-13 08:53:35 +00001819 size_t value_bit_size = ClangASTType::GetClangTypeBitWidth(type.GetASTContext(), type.GetOpaqueQualType());
1820 size_t value_byte_size = value_bit_size % 8 ? ((value_bit_size + 8) / 8) : (value_bit_size / 8);
Sean Callanan17c6a052010-10-05 20:18:48 +00001821
1822 Value::ValueType value_type = location_value->GetValueType();
1823
1824 switch (value_type)
Sean Callananf328c9f2010-07-20 23:31:16 +00001825 {
Sean Callanan17c6a052010-10-05 20:18:48 +00001826 default:
Sean Callananf328c9f2010-07-20 23:31:16 +00001827 {
Sean Callanan17c6a052010-10-05 20:18:48 +00001828 StreamString ss;
1829
1830 location_value->Dump(&ss);
1831
Greg Claytonc0fa5332011-05-22 22:46:53 +00001832 err.SetErrorStringWithFormat ("%s has a value of unhandled type: %s",
1833 name.GetCString(),
1834 ss.GetString().c_str());
Sean Callananf328c9f2010-07-20 23:31:16 +00001835 return false;
1836 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001837 break;
1838 case Value::eValueTypeLoadAddress:
Sean Callananf328c9f2010-07-20 23:31:16 +00001839 {
Sean Callanan6a925532011-01-13 08:53:35 +00001840 if (!dematerialize)
Sean Callanan17c6a052010-10-05 20:18:48 +00001841 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001842 Error write_error;
Sean Callanan6a925532011-01-13 08:53:35 +00001843
Sean Callanan6f3bde72011-10-27 19:41:13 +00001844 if (is_reference)
Sean Callanan6a925532011-01-13 08:53:35 +00001845 {
Sean Callanan6f3bde72011-10-27 19:41:13 +00001846 Error read_error;
1847
1848 addr_t ref_value = process->ReadPointerFromMemory(location_value->GetScalar().ULongLong(), read_error);
1849
1850 if (!read_error.Success())
1851 {
1852 err.SetErrorStringWithFormat ("Couldn't read reference to %s from the target: %s",
1853 name.GetCString(),
1854 read_error.AsCString());
1855 return false;
1856 }
1857
1858 if (!process->WritePointerToMemory(addr,
1859 ref_value,
1860 write_error))
1861 {
1862 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
1863 name.GetCString(),
1864 write_error.AsCString());
1865 return false;
1866 }
1867 }
1868 else
1869 {
1870 if (!process->WriteScalarToMemory (addr,
1871 location_value->GetScalar(),
1872 process->GetAddressByteSize(),
1873 write_error))
1874 {
1875 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
1876 name.GetCString(),
1877 write_error.AsCString());
1878 return false;
1879 }
Sean Callanan6a925532011-01-13 08:53:35 +00001880 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001881 }
Sean Callananf328c9f2010-07-20 23:31:16 +00001882 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001883 break;
1884 case Value::eValueTypeScalar:
1885 {
Greg Clayton6916e352010-11-13 03:52:47 +00001886 if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
Sean Callanan17c6a052010-10-05 20:18:48 +00001887 {
1888 StreamString ss;
Sean Callanan17c6a052010-10-05 20:18:48 +00001889 location_value->Dump(&ss);
1890
Greg Claytonc0fa5332011-05-22 22:46:53 +00001891 err.SetErrorStringWithFormat ("%s is a scalar of unhandled type: %s",
1892 name.GetCString(),
1893 ss.GetString().c_str());
Sean Callanan17c6a052010-10-05 20:18:48 +00001894 return false;
1895 }
1896
Greg Clayton061b79d2011-05-09 20:18:18 +00001897 RegisterInfo *reg_info = location_value->GetRegisterInfo();
Sean Callanan17c6a052010-10-05 20:18:48 +00001898
Greg Clayton061b79d2011-05-09 20:18:18 +00001899 if (!reg_info)
Sean Callanan17c6a052010-10-05 20:18:48 +00001900 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001901 err.SetErrorStringWithFormat ("Couldn't get the register information for %s",
1902 name.GetCString());
Sean Callanan17c6a052010-10-05 20:18:48 +00001903 return false;
1904 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001905
Greg Clayton061b79d2011-05-09 20:18:18 +00001906 RegisterValue reg_value;
1907
1908 RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
1909
1910 if (!reg_ctx)
Sean Callanan17c6a052010-10-05 20:18:48 +00001911 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001912 err.SetErrorStringWithFormat ("Couldn't read register context to read %s from %s",
1913 name.GetCString(),
1914 reg_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001915 return false;
1916 }
1917
Greg Clayton061b79d2011-05-09 20:18:18 +00001918 uint32_t register_byte_size = reg_info->byte_size;
Sean Callanan17c6a052010-10-05 20:18:48 +00001919
1920 if (dematerialize)
1921 {
Sean Callanan6f3bde72011-10-27 19:41:13 +00001922 if (is_reference)
1923 return true; // reference types don't need demateralizing
1924
Sean Callanan6a925532011-01-13 08:53:35 +00001925 // Get the location of the spare memory area out of the variable's live data.
1926
1927 if (!expr_var->m_live_sp)
1928 {
1929 err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", name.GetCString());
1930 return false;
1931 }
1932
Greg Claytonb3448432011-03-24 21:19:54 +00001933 if (expr_var->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
Sean Callanan6a925532011-01-13 08:53:35 +00001934 {
1935 err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", name.GetCString());
1936 return false;
1937 }
1938
Greg Claytonc0fa5332011-05-22 22:46:53 +00001939 Scalar &reg_addr = expr_var->m_live_sp->GetValue().GetScalar();
Sean Callanan6a925532011-01-13 08:53:35 +00001940
Greg Claytonc0fa5332011-05-22 22:46:53 +00001941 err = reg_ctx->ReadRegisterValueFromMemory (reg_info,
1942 reg_addr.ULongLong(),
1943 value_byte_size,
1944 reg_value);
Greg Clayton061b79d2011-05-09 20:18:18 +00001945 if (err.Fail())
Sean Callanan17c6a052010-10-05 20:18:48 +00001946 return false;
Greg Clayton061b79d2011-05-09 20:18:18 +00001947
1948 if (!reg_ctx->WriteRegister (reg_info, reg_value))
Sean Callanan17c6a052010-10-05 20:18:48 +00001949 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001950 err.SetErrorStringWithFormat ("Couldn't write %s to register %s",
1951 name.GetCString(),
1952 reg_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001953 return false;
1954 }
Sean Callanan6a925532011-01-13 08:53:35 +00001955
1956 // Deallocate the spare area and clear the variable's live data.
1957
Greg Clayton567e7f32011-09-22 04:58:26 +00001958 Error deallocate_error = process->DeallocateMemory(reg_addr.ULongLong());
Sean Callanan6a925532011-01-13 08:53:35 +00001959
1960 if (!deallocate_error.Success())
1961 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001962 err.SetErrorStringWithFormat ("Couldn't deallocate spare memory area for %s: %s",
1963 name.GetCString(),
1964 deallocate_error.AsCString());
Sean Callanan6a925532011-01-13 08:53:35 +00001965 return false;
1966 }
1967
1968 expr_var->m_live_sp.reset();
Sean Callanan17c6a052010-10-05 20:18:48 +00001969 }
1970 else
1971 {
Sean Callanan6f3bde72011-10-27 19:41:13 +00001972 Error write_error;
1973
1974 RegisterValue reg_value;
1975
1976 if (!reg_ctx->ReadRegister (reg_info, reg_value))
1977 {
1978 err.SetErrorStringWithFormat ("Couldn't read %s from %s",
1979 name.GetCString(),
1980 reg_info->name);
1981 return false;
1982 }
1983
1984 if (is_reference)
1985 {
1986 write_error = reg_ctx->WriteRegisterValueToMemory(reg_info,
1987 addr,
1988 process->GetAddressByteSize(),
1989 reg_value);
1990
1991 if (!write_error.Success())
1992 {
1993 err.SetErrorStringWithFormat ("Couldn't write %s from register %s to the target: %s",
1994 name.GetCString(),
1995 reg_info->name,
1996 write_error.AsCString());
1997 return false;
1998 }
1999
2000 return true;
2001 }
2002
Sean Callanan6a925532011-01-13 08:53:35 +00002003 // Allocate a spare memory area to place the register's contents into. This memory area will be pointed to by the slot in the
2004 // struct.
2005
2006 Error allocate_error;
2007
Greg Clayton567e7f32011-09-22 04:58:26 +00002008 Scalar reg_addr (process->AllocateMemory (value_byte_size,
Sean Callanan6f3bde72011-10-27 19:41:13 +00002009 lldb::ePermissionsReadable | lldb::ePermissionsWritable,
2010 allocate_error));
Sean Callanan6a925532011-01-13 08:53:35 +00002011
Greg Claytonc0fa5332011-05-22 22:46:53 +00002012 if (reg_addr.ULongLong() == LLDB_INVALID_ADDRESS)
Sean Callanan6a925532011-01-13 08:53:35 +00002013 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00002014 err.SetErrorStringWithFormat ("Couldn't allocate a memory area to store %s: %s",
2015 name.GetCString(),
2016 allocate_error.AsCString());
Sean Callanan6a925532011-01-13 08:53:35 +00002017 return false;
2018 }
2019
2020 // Put the location of the spare memory into the live data of the ValueObject.
2021
Jim Ingham47da8102011-04-22 23:53:53 +00002022 expr_var->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
2023 type.GetASTContext(),
2024 type.GetOpaqueQualType(),
2025 name,
Greg Claytonc0fa5332011-05-22 22:46:53 +00002026 reg_addr.ULongLong(),
Jim Ingham47da8102011-04-22 23:53:53 +00002027 eAddressTypeLoad,
2028 value_byte_size);
Sean Callanan6a925532011-01-13 08:53:35 +00002029
2030 // Now write the location of the area into the struct.
Sean Callanan6f3bde72011-10-27 19:41:13 +00002031
Greg Clayton567e7f32011-09-22 04:58:26 +00002032 if (!process->WriteScalarToMemory (addr,
Sean Callanan6f3bde72011-10-27 19:41:13 +00002033 reg_addr,
2034 process->GetAddressByteSize(),
2035 write_error))
Sean Callanan6a925532011-01-13 08:53:35 +00002036 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00002037 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
2038 name.GetCString(),
2039 write_error.AsCString());
Sean Callanan6a925532011-01-13 08:53:35 +00002040 return false;
2041 }
2042
Sean Callanan6a925532011-01-13 08:53:35 +00002043 if (value_byte_size > register_byte_size)
Sean Callanan17c6a052010-10-05 20:18:48 +00002044 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00002045 err.SetErrorStringWithFormat ("%s is too big to store in %s",
2046 name.GetCString(),
2047 reg_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00002048 return false;
2049 }
Greg Clayton061b79d2011-05-09 20:18:18 +00002050
Greg Clayton061b79d2011-05-09 20:18:18 +00002051 if (!reg_ctx->ReadRegister (reg_info, reg_value))
Sean Callanan17c6a052010-10-05 20:18:48 +00002052 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00002053 err.SetErrorStringWithFormat ("Couldn't read %s from %s",
2054 name.GetCString(),
2055 reg_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00002056 return false;
2057 }
2058
Greg Claytonc0fa5332011-05-22 22:46:53 +00002059 err = reg_ctx->WriteRegisterValueToMemory (reg_info,
2060 reg_addr.ULongLong(),
2061 value_byte_size,
2062 reg_value);
Greg Clayton061b79d2011-05-09 20:18:18 +00002063 if (err.Fail())
Sean Callanan17c6a052010-10-05 20:18:48 +00002064 return false;
Sean Callanan17c6a052010-10-05 20:18:48 +00002065 }
2066 }
Sean Callananf328c9f2010-07-20 23:31:16 +00002067 }
2068
2069 return true;
Sean Callanan810f22d2010-07-16 00:09:46 +00002070}
2071
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002072bool
2073ClangExpressionDeclMap::DoMaterializeOneRegister
2074(
2075 bool dematerialize,
2076 ExecutionContext &exe_ctx,
2077 RegisterContext &reg_ctx,
Greg Claytonb3448432011-03-24 21:19:54 +00002078 const RegisterInfo &reg_info,
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002079 lldb::addr_t addr,
2080 Error &err
2081)
2082{
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002083 uint32_t register_byte_size = reg_info.byte_size;
Greg Clayton061b79d2011-05-09 20:18:18 +00002084 RegisterValue reg_value;
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002085 if (dematerialize)
2086 {
Greg Clayton061b79d2011-05-09 20:18:18 +00002087 Error read_error (reg_ctx.ReadRegisterValueFromMemory(&reg_info, addr, register_byte_size, reg_value));
2088 if (read_error.Fail())
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002089 {
Greg Claytonbdcb6ab2011-01-25 23:55:37 +00002090 err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", reg_info.name, read_error.AsCString());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002091 return false;
2092 }
2093
Greg Clayton061b79d2011-05-09 20:18:18 +00002094 if (!reg_ctx.WriteRegister (&reg_info, reg_value))
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002095 {
Greg Clayton061b79d2011-05-09 20:18:18 +00002096 err.SetErrorStringWithFormat("Couldn't write register %s (dematerialize)", reg_info.name);
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002097 return false;
2098 }
2099 }
2100 else
2101 {
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002102
Greg Clayton061b79d2011-05-09 20:18:18 +00002103 if (!reg_ctx.ReadRegister(&reg_info, reg_value))
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002104 {
Greg Clayton061b79d2011-05-09 20:18:18 +00002105 err.SetErrorStringWithFormat("Couldn't read %s (materialize)", reg_info.name);
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002106 return false;
2107 }
2108
Greg Clayton061b79d2011-05-09 20:18:18 +00002109 Error write_error (reg_ctx.WriteRegisterValueToMemory(&reg_info, addr, register_byte_size, reg_value));
2110 if (write_error.Fail())
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002111 {
Jason Molenda95b7b432011-09-20 00:26:08 +00002112 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", reg_info.name, write_error.AsCString());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002113 return false;
2114 }
2115 }
2116
2117 return true;
2118}
2119
Sean Callanan696cf5f2011-05-07 01:06:41 +00002120lldb::VariableSP
Greg Clayton8de27c72010-10-15 22:48:33 +00002121ClangExpressionDeclMap::FindVariableInScope
2122(
2123 StackFrame &frame,
2124 const ConstString &name,
2125 TypeFromUser *type
2126)
Sean Callananaa301c42010-12-03 01:38:59 +00002127{
Greg Claytone005f2c2010-11-06 01:53:30 +00002128 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanancc074622010-09-14 21:59:34 +00002129
Sean Callananf8b468e2011-08-06 00:28:14 +00002130 ValueObjectSP valobj;
2131 VariableSP var_sp;
2132 Error err;
Sean Callanancc074622010-09-14 21:59:34 +00002133
Sean Callananf8b468e2011-08-06 00:28:14 +00002134 valobj = frame.GetValueForVariableExpressionPath(name.GetCString(),
2135 eNoDynamicValues,
2136 StackFrame::eExpressionPathOptionCheckPtrVsMember,
2137 var_sp,
2138 err);
Greg Clayton3bc52d02010-11-14 22:13:40 +00002139
Sean Callananf8b468e2011-08-06 00:28:14 +00002140 if (!err.Success() ||
2141 !var_sp ||
Sean Callananae9f7482011-07-07 23:05:43 +00002142 !var_sp->IsInScope(&frame) ||
2143 !var_sp->LocationIsValidForFrame (&frame))
2144 return lldb::VariableSP();
Greg Clayton3bc52d02010-11-14 22:13:40 +00002145
2146 if (var_sp && type)
2147 {
2148 if (type->GetASTContext() == var_sp->GetType()->GetClangAST())
2149 {
Greg Clayton04c9c7b2011-02-16 23:00:21 +00002150 if (!ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType()))
Sean Callanan696cf5f2011-05-07 01:06:41 +00002151 return lldb::VariableSP();
Greg Clayton3bc52d02010-11-14 22:13:40 +00002152 }
2153 else
2154 {
2155 if (log)
2156 log->PutCString("Skipping a candidate variable because of different AST contexts");
Sean Callanan696cf5f2011-05-07 01:06:41 +00002157 return lldb::VariableSP();
Greg Clayton3bc52d02010-11-14 22:13:40 +00002158 }
Sean Callanancc074622010-09-14 21:59:34 +00002159 }
Greg Clayton3bc52d02010-11-14 22:13:40 +00002160
Sean Callanan696cf5f2011-05-07 01:06:41 +00002161 return var_sp;
Sean Callanancc074622010-09-14 21:59:34 +00002162}
Sean Callanan336a0002010-07-17 00:43:37 +00002163
Sean Callanan81974962011-05-08 02:21:26 +00002164Symbol *
2165ClangExpressionDeclMap::FindGlobalDataSymbol
2166(
2167 Target &target,
Sean Callananaa4a5532011-10-13 16:49:47 +00002168 const ConstString &name
Sean Callanan81974962011-05-08 02:21:26 +00002169)
2170{
2171 SymbolContextList sc_list;
2172
Sean Callananaa4a5532011-10-13 16:49:47 +00002173 target.GetImages().FindSymbolsWithNameAndType(name,
2174 eSymbolTypeData,
2175 sc_list);
Sean Callanan81974962011-05-08 02:21:26 +00002176
2177 if (sc_list.GetSize())
2178 {
2179 SymbolContext sym_ctx;
2180 sc_list.GetContextAtIndex(0, sym_ctx);
2181
2182 return sym_ctx.symbol;
2183 }
2184
2185 return NULL;
2186}
2187
Sean Callanan47dc4572011-09-15 02:13:07 +00002188lldb::VariableSP
2189ClangExpressionDeclMap::FindGlobalVariable
2190(
2191 Target &target,
Sean Callanan94cd0ca2011-10-12 16:59:31 +00002192 ModuleSP &module,
2193 const ConstString &name,
2194 ClangNamespaceDecl *namespace_decl,
Sean Callanan47dc4572011-09-15 02:13:07 +00002195 TypeFromUser *type
2196)
2197{
2198 VariableList vars;
Sean Callanan47dc4572011-09-15 02:13:07 +00002199
Sean Callanan94cd0ca2011-10-12 16:59:31 +00002200 if (module && namespace_decl)
2201 module->FindGlobalVariables (name, namespace_decl, true, -1, vars);
2202 else
2203 target.GetImages().FindGlobalVariables(name, true, -1, vars);
Sean Callanan47dc4572011-09-15 02:13:07 +00002204
2205 if (vars.GetSize())
2206 {
2207 if (type)
2208 {
2209 for (size_t i = 0; i < vars.GetSize(); ++i)
2210 {
2211 VariableSP var_sp = vars.GetVariableAtIndex(i);
2212
2213 if (type->GetASTContext() == var_sp->GetType()->GetClangAST())
2214 {
2215 if (ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType()))
2216 return var_sp;
2217 }
2218 }
2219 }
2220 else
2221 {
2222 return vars.GetVariableAtIndex(0);
2223 }
2224 }
2225
2226 return VariableSP();
2227}
2228
Chris Lattner24943d22010-06-08 16:52:24 +00002229// Interface for ClangASTSource
Sean Callanan47dc4572011-09-15 02:13:07 +00002230
Sean Callanan16b53ab2011-10-12 00:12:34 +00002231void
Sean Callananf76afff2011-10-28 23:38:38 +00002232ClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context)
Chris Lattner24943d22010-06-08 16:52:24 +00002233{
Sean Callananf76afff2011-10-28 23:38:38 +00002234 assert (m_ast_context);
2235
2236 const ConstString name(context.m_decl_name.getAsString().c_str());
2237
Greg Claytone005f2c2010-11-06 01:53:30 +00002238 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Chris Lattner24943d22010-06-08 16:52:24 +00002239
Sean Callanan9394b5a2011-10-29 19:50:43 +00002240 if (GetImportInProgress())
Sean Callananee8fc722010-11-19 20:20:02 +00002241 {
Sean Callanan67bbb112011-10-14 20:34:21 +00002242 if (log && log->GetVerbose())
Sean Callananee8fc722010-11-19 20:20:02 +00002243 log->Printf("Ignoring a query during an import");
2244 return;
2245 }
Greg Claytone6d72ca2011-06-25 00:44:06 +00002246
Sean Callanan67bbb112011-10-14 20:34:21 +00002247 static unsigned int invocation_id = 0;
2248 unsigned int current_id = invocation_id++;
2249
Sean Callanan16b53ab2011-10-12 00:12:34 +00002250 if (log)
2251 {
2252 if (!context.m_decl_context)
Sean Callanan9394b5a2011-10-29 19:50:43 +00002253 log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in a NULL DeclContext", current_id, name.GetCString());
Sean Callanan16b53ab2011-10-12 00:12:34 +00002254 else if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context.m_decl_context))
Sean Callanan9394b5a2011-10-29 19:50:43 +00002255 log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in '%s'", current_id, name.GetCString(), context_named_decl->getNameAsString().c_str());
Sean Callanan16b53ab2011-10-12 00:12:34 +00002256 else
Sean Callanan9394b5a2011-10-29 19:50:43 +00002257 log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in a '%s'", current_id, name.GetCString(), context.m_decl_context->getDeclKindName());
Sean Callanan16b53ab2011-10-12 00:12:34 +00002258 }
Sean Callanan9394b5a2011-10-29 19:50:43 +00002259
Sean Callanan16b53ab2011-10-12 00:12:34 +00002260 if (const NamespaceDecl *namespace_context = dyn_cast<NamespaceDecl>(context.m_decl_context))
2261 {
Sean Callanan73b520f2011-10-29 01:58:46 +00002262 ClangASTImporter::NamespaceMapSP namespace_map = m_ast_importer->GetNamespaceMap(namespace_context);
Sean Callanana7597062011-10-13 21:08:11 +00002263
Sean Callanan67bbb112011-10-14 20:34:21 +00002264 if (log && log->GetVerbose())
Sean Callanan5a55c7a2011-11-18 03:28:09 +00002265 log->Printf(" CEDM::FEVD[%u] Inspecting (NamespaceMap*)%p (%d entries)",
Sean Callanan67bbb112011-10-14 20:34:21 +00002266 current_id,
2267 namespace_map.get(),
2268 (int)namespace_map->size());
Sean Callanana7597062011-10-13 21:08:11 +00002269
Sean Callanana7cb1fa2011-10-21 22:18:07 +00002270 if (!namespace_map)
2271 return;
2272
Sean Callanan16b53ab2011-10-12 00:12:34 +00002273 for (ClangASTImporter::NamespaceMap::iterator i = namespace_map->begin(), e = namespace_map->end();
2274 i != e;
2275 ++i)
2276 {
2277 if (log)
Sean Callanan9394b5a2011-10-29 19:50:43 +00002278 log->Printf(" CEDM::FEVD[%u] Searching namespace %s in module %s",
Sean Callanan67bbb112011-10-14 20:34:21 +00002279 current_id,
Sean Callanan16b53ab2011-10-12 00:12:34 +00002280 i->second.GetNamespaceDecl()->getNameAsString().c_str(),
2281 i->first->GetFileSpec().GetFilename().GetCString());
2282
Sean Callananc839adc2011-10-13 21:50:33 +00002283 FindExternalVisibleDecls(context,
2284 i->first,
2285 i->second,
Sean Callanan67bbb112011-10-14 20:34:21 +00002286 current_id);
Sean Callanan16b53ab2011-10-12 00:12:34 +00002287 }
2288 }
Sean Callanane6ea5fe2011-11-15 02:11:17 +00002289 else if (isa<TranslationUnitDecl>(context.m_decl_context))
Sean Callanan16b53ab2011-10-12 00:12:34 +00002290 {
2291 ClangNamespaceDecl namespace_decl;
2292
2293 if (log)
Sean Callanan9394b5a2011-10-29 19:50:43 +00002294 log->Printf(" CEDM::FEVD[%u] Searching the root namespace", current_id);
Sean Callanan16b53ab2011-10-12 00:12:34 +00002295
2296 FindExternalVisibleDecls(context,
2297 lldb::ModuleSP(),
2298 namespace_decl,
Sean Callanan67bbb112011-10-14 20:34:21 +00002299 current_id);
Sean Callanan16b53ab2011-10-12 00:12:34 +00002300 }
Sean Callanana7597062011-10-13 21:08:11 +00002301
Sean Callanan9394b5a2011-10-29 19:50:43 +00002302 if (!context.m_found.variable)
2303 ClangASTSource::FindExternalVisibleDecls(context);
Sean Callanan16b53ab2011-10-12 00:12:34 +00002304}
2305
2306void
2307ClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context,
Sean Callanan38d084f2011-10-12 18:44:30 +00002308 lldb::ModuleSP module_sp,
Sean Callanan03f64ca2011-10-12 01:39:28 +00002309 ClangNamespaceDecl &namespace_decl,
Sean Callanan67bbb112011-10-14 20:34:21 +00002310 unsigned int current_id)
Sean Callanan16b53ab2011-10-12 00:12:34 +00002311{
Sean Callananf76afff2011-10-28 23:38:38 +00002312 assert (m_ast_context);
Sean Callanan16b53ab2011-10-12 00:12:34 +00002313
2314 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan9394b5a2011-10-29 19:50:43 +00002315
Greg Claytone5748d82010-11-09 23:46:37 +00002316 SymbolContextList sc_list;
Chris Lattner24943d22010-06-08 16:52:24 +00002317
Sean Callanan9394b5a2011-10-29 19:50:43 +00002318 const ConstString name(context.m_decl_name.getAsString().c_str());
2319
Greg Clayton3bc52d02010-11-14 22:13:40 +00002320 const char *name_unique_cstr = name.GetCString();
2321
2322 if (name_unique_cstr == NULL)
2323 return;
Sean Callanan9394b5a2011-10-29 19:50:43 +00002324
Greg Clayton8de27c72010-10-15 22:48:33 +00002325 // Only look for functions by name out in our symbols if the function
2326 // doesn't start with our phony prefix of '$'
Greg Clayton567e7f32011-09-22 04:58:26 +00002327 Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
2328 StackFrame *frame = m_parser_vars->m_exe_ctx->GetFramePtr();
Sean Callanan03f64ca2011-10-12 01:39:28 +00002329 if (name_unique_cstr[0] == '$' && !namespace_decl)
2330 {
2331 static ConstString g_lldb_class_name ("$__lldb_class");
2332
2333 if (name == g_lldb_class_name)
2334 {
2335 // Clang is looking for the type of "this"
2336
2337 if (!frame)
2338 return;
2339
2340 VariableList *vars = frame->GetVariableList(false);
2341
2342 if (!vars)
2343 return;
2344
2345 lldb::VariableSP this_var = vars->FindVariable(ConstString("this"));
2346
2347 if (!this_var ||
2348 !this_var->IsInScope(frame) ||
2349 !this_var->LocationIsValidForFrame (frame))
2350 return;
2351
2352 Type *this_type = this_var->GetType();
2353
2354 if (!this_type)
2355 return;
2356
Sean Callanan67bbb112011-10-14 20:34:21 +00002357 if (log && log->GetVerbose())
Sean Callanan03f64ca2011-10-12 01:39:28 +00002358 {
Sean Callanan9394b5a2011-10-29 19:50:43 +00002359 log->Printf (" CEDM::FEVD[%u] Type for \"this\" is: ", current_id);
Sean Callanan03f64ca2011-10-12 01:39:28 +00002360 StreamString strm;
2361 this_type->Dump(&strm, true);
2362 log->PutCString (strm.GetData());
2363 }
2364
2365 TypeFromUser this_user_type(this_type->GetClangFullType(),
2366 this_type->GetClangAST());
2367
2368 m_struct_vars->m_object_pointer_type = this_user_type;
2369
2370 void *pointer_target_type = NULL;
2371
2372 if (!ClangASTContext::IsPointerType(this_user_type.GetOpaqueQualType(),
2373 &pointer_target_type))
2374 return;
2375
2376 clang::QualType pointer_target_qual_type = QualType::getFromOpaquePtr(pointer_target_type);
2377
2378 if (pointer_target_qual_type.isConstQualified())
2379 pointer_target_qual_type.removeLocalConst();
2380
2381 TypeFromUser class_user_type(pointer_target_qual_type.getAsOpaquePtr(),
2382 this_type->GetClangAST());
2383
2384 if (log)
2385 {
Greg Claytona23ca422011-10-20 00:47:21 +00002386 ASTDumper ast_dumper(pointer_target_qual_type);
Sean Callanan9394b5a2011-10-29 19:50:43 +00002387 log->Printf(" CEDM::FEVD[%u] Adding type for $__lldb_class: %s", current_id, ast_dumper.GetCString());
Sean Callanan03f64ca2011-10-12 01:39:28 +00002388 }
2389
Sean Callanane3737fd2011-10-18 16:46:55 +00002390 AddOneType(context, class_user_type, current_id, true);
Sean Callanan03f64ca2011-10-12 01:39:28 +00002391
2392 return;
2393 }
2394
2395 static ConstString g_lldb_objc_class_name ("$__lldb_objc_class");
2396 if (name == g_lldb_objc_class_name)
2397 {
2398 // Clang is looking for the type of "*self"
2399
2400 if (!frame)
2401 return;
Sean Callanane6ea5fe2011-11-15 02:11:17 +00002402
2403 SymbolContext sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction);
2404
2405 if (!sym_ctx.function)
2406 return;
2407
2408 clang::DeclContext *decl_context;
2409
2410 if (sym_ctx.block && sym_ctx.block->GetInlinedFunctionInfo())
2411 decl_context = sym_ctx.block->GetClangDeclContextForInlinedFunction();
2412 else
2413 decl_context = sym_ctx.function->GetClangDeclContext();
2414
2415 if (!decl_context)
2416 return;
2417
2418 clang::ObjCMethodDecl *method_decl = llvm::dyn_cast<clang::ObjCMethodDecl>(decl_context);
2419
2420 if (!method_decl)
2421 return;
2422
2423 ObjCInterfaceDecl* self_interface = method_decl->getClassInterface();
2424
2425 if (!self_interface)
2426 return;
2427
2428 const clang::Type *interface_type = self_interface->getTypeForDecl();
2429
2430 TypeFromUser class_user_type(QualType(interface_type, 0).getAsOpaquePtr(),
2431 &method_decl->getASTContext());
2432
2433 if (log)
2434 {
2435 ASTDumper ast_dumper(interface_type);
2436 log->Printf(" FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, ast_dumper.GetCString());
2437 }
2438
2439 AddOneType(context, class_user_type, current_id, false);
Sean Callanan03f64ca2011-10-12 01:39:28 +00002440
2441 VariableList *vars = frame->GetVariableList(false);
2442
Sean Callanan03f64ca2011-10-12 01:39:28 +00002443 lldb::VariableSP self_var = vars->FindVariable(ConstString("self"));
2444
2445 if (!self_var ||
2446 !self_var->IsInScope(frame) ||
2447 !self_var->LocationIsValidForFrame (frame))
2448 return;
2449
2450 Type *self_type = self_var->GetType();
2451
2452 if (!self_type)
2453 return;
2454
2455 TypeFromUser self_user_type(self_type->GetClangFullType(),
2456 self_type->GetClangAST());
2457
2458 m_struct_vars->m_object_pointer_type = self_user_type;
Sean Callanan03f64ca2011-10-12 01:39:28 +00002459 return;
2460 }
2461
2462 // any other $__lldb names should be weeded out now
2463 if (!::strncmp(name_unique_cstr, "$__lldb", sizeof("$__lldb") - 1))
2464 return;
2465
2466 do
2467 {
2468 if (!target)
2469 break;
2470
2471 ClangASTContext *scratch_clang_ast_context = target->GetScratchClangASTContext();
2472
2473 if (!scratch_clang_ast_context)
2474 break;
2475
2476 ASTContext *scratch_ast_context = scratch_clang_ast_context->getASTContext();
2477
2478 if (!scratch_ast_context)
2479 break;
2480
2481 TypeDecl *ptype_type_decl = m_parser_vars->m_persistent_vars->GetPersistentType(name);
2482
2483 if (!ptype_type_decl)
2484 break;
2485
Sean Callanane1301a62011-12-06 03:41:14 +00002486 Decl *parser_ptype_decl = m_ast_importer->CopyDecl(m_ast_context, scratch_ast_context, ptype_type_decl);
Sean Callanan03f64ca2011-10-12 01:39:28 +00002487
2488 if (!parser_ptype_decl)
2489 break;
2490
2491 TypeDecl *parser_ptype_type_decl = dyn_cast<TypeDecl>(parser_ptype_decl);
2492
2493 if (!parser_ptype_type_decl)
2494 break;
2495
2496 if (log)
Sean Callanan9394b5a2011-10-29 19:50:43 +00002497 log->Printf(" CEDM::FEVD[%u] Found persistent type %s", current_id, name.GetCString());
Sean Callanan03f64ca2011-10-12 01:39:28 +00002498
2499 context.AddNamedDecl(parser_ptype_type_decl);
2500 } while (0);
2501
2502 ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name));
2503
2504 if (pvar_sp)
2505 {
Sean Callanan67bbb112011-10-14 20:34:21 +00002506 AddOneVariable(context, pvar_sp, current_id);
Sean Callanan03f64ca2011-10-12 01:39:28 +00002507 return;
2508 }
2509
2510 const char *reg_name(&name.GetCString()[1]);
2511
2512 if (m_parser_vars->m_exe_ctx->GetRegisterContext())
2513 {
2514 const RegisterInfo *reg_info(m_parser_vars->m_exe_ctx->GetRegisterContext()->GetRegisterInfoByName(reg_name));
Sean Callanan9394b5a2011-10-29 19:50:43 +00002515
Sean Callanan03f64ca2011-10-12 01:39:28 +00002516 if (reg_info)
Sean Callanane3737fd2011-10-18 16:46:55 +00002517 {
2518 if (log)
Sean Callanan9394b5a2011-10-29 19:50:43 +00002519 log->Printf(" CEDM::FEVD[%u] Found register %s", current_id, reg_info->name);
Sean Callanane3737fd2011-10-18 16:46:55 +00002520
Sean Callanan67bbb112011-10-14 20:34:21 +00002521 AddOneRegister(context, reg_info, current_id);
Sean Callanane3737fd2011-10-18 16:46:55 +00002522 }
Sean Callanan03f64ca2011-10-12 01:39:28 +00002523 }
2524 }
2525 else
Sean Callanan0fc73582010-07-27 00:55:47 +00002526 {
Sean Callananf8b468e2011-08-06 00:28:14 +00002527 ValueObjectSP valobj;
2528 VariableSP var;
2529 Error err;
2530
Sean Callanan03f64ca2011-10-12 01:39:28 +00002531 if (frame && !namespace_decl)
Greg Clayton8de27c72010-10-15 22:48:33 +00002532 {
Greg Clayton567e7f32011-09-22 04:58:26 +00002533 valobj = frame->GetValueForVariableExpressionPath(name_unique_cstr,
Sean Callanan16b53ab2011-10-12 00:12:34 +00002534 eNoDynamicValues,
2535 StackFrame::eExpressionPathOptionCheckPtrVsMember,
2536 var,
2537 err);
Sean Callanan47dc4572011-09-15 02:13:07 +00002538
2539 // If we found a variable in scope, no need to pull up function names
2540 if (err.Success() && var != NULL)
2541 {
Sean Callanan89e7df32011-11-29 22:03:21 +00002542 AddOneVariable(context, var, valobj, current_id);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002543 context.m_found.variable = true;
Sean Callanan3a546762011-10-25 20:36:57 +00002544 return;
Sean Callanan47dc4572011-09-15 02:13:07 +00002545 }
Greg Clayton8de27c72010-10-15 22:48:33 +00002546 }
Sean Callanan1c226272011-12-10 04:03:38 +00002547
2548 if (target)
Sean Callanan47dc4572011-09-15 02:13:07 +00002549 {
Sean Callanan94cd0ca2011-10-12 16:59:31 +00002550 var = FindGlobalVariable (*target,
Sean Callanan38d084f2011-10-12 18:44:30 +00002551 module_sp,
Sean Callanan94cd0ca2011-10-12 16:59:31 +00002552 name,
2553 &namespace_decl,
Greg Clayton567e7f32011-09-22 04:58:26 +00002554 NULL);
Sean Callanan47dc4572011-09-15 02:13:07 +00002555
2556 if (var)
2557 {
Sean Callananf48de6d2011-12-10 03:12:34 +00002558 valobj = ValueObjectVariable::Create(target, var);
Sean Callanan89e7df32011-11-29 22:03:21 +00002559 AddOneVariable(context, var, valobj, current_id);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002560 context.m_found.variable = true;
Sean Callanan1c226272011-12-10 04:03:38 +00002561 return;
Sean Callanan47dc4572011-09-15 02:13:07 +00002562 }
2563 }
2564
Sean Callanan16c4ec32011-10-12 20:29:25 +00002565 if (!context.m_found.variable)
Greg Clayton8de27c72010-10-15 22:48:33 +00002566 {
Greg Clayton28d5fcc2011-01-27 06:44:37 +00002567 const bool include_symbols = true;
2568 const bool append = false;
Sean Callanana5ec5a32011-10-12 17:38:09 +00002569
Sean Callanan38d084f2011-10-12 18:44:30 +00002570 if (namespace_decl && module_sp)
Sean Callanana5ec5a32011-10-12 17:38:09 +00002571 {
Sean Callanan38d084f2011-10-12 18:44:30 +00002572 module_sp->FindFunctions(name,
2573 &namespace_decl,
2574 eFunctionNameTypeBase,
2575 include_symbols,
2576 append,
2577 sc_list);
Sean Callanana5ec5a32011-10-12 17:38:09 +00002578 }
2579 else
2580 {
2581 target->GetImages().FindFunctions(name,
2582 eFunctionNameTypeBase,
2583 include_symbols,
2584 append,
2585 sc_list);
2586 }
2587
Sean Callanan81974962011-05-08 02:21:26 +00002588 if (sc_list.GetSize())
Greg Clayton8de27c72010-10-15 22:48:33 +00002589 {
Sean Callanan81974962011-05-08 02:21:26 +00002590 Symbol *generic_symbol = NULL;
2591 Symbol *non_extern_symbol = NULL;
2592
2593 for (uint32_t index = 0, num_indices = sc_list.GetSize();
2594 index < num_indices;
2595 ++index)
Greg Clayton8de27c72010-10-15 22:48:33 +00002596 {
Sean Callanan81974962011-05-08 02:21:26 +00002597 SymbolContext sym_ctx;
2598 sc_list.GetContextAtIndex(index, sym_ctx);
2599
2600 if (sym_ctx.function)
2601 {
2602 // TODO only do this if it's a C function; C++ functions may be
2603 // overloaded
Sean Callanan16c4ec32011-10-12 20:29:25 +00002604 if (!context.m_found.function_with_type_info)
Sean Callanan67bbb112011-10-14 20:34:21 +00002605 AddOneFunction(context, sym_ctx.function, NULL, current_id);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002606 context.m_found.function_with_type_info = true;
2607 context.m_found.function = true;
Sean Callanan81974962011-05-08 02:21:26 +00002608 }
2609 else if (sym_ctx.symbol)
2610 {
2611 if (sym_ctx.symbol->IsExternal())
2612 generic_symbol = sym_ctx.symbol;
2613 else
2614 non_extern_symbol = sym_ctx.symbol;
2615 }
Greg Clayton8de27c72010-10-15 22:48:33 +00002616 }
Sean Callanan81974962011-05-08 02:21:26 +00002617
Sean Callanan16c4ec32011-10-12 20:29:25 +00002618 if (!context.m_found.function_with_type_info)
Greg Clayton8de27c72010-10-15 22:48:33 +00002619 {
Sean Callanan81974962011-05-08 02:21:26 +00002620 if (generic_symbol)
Sean Callanan47dc4572011-09-15 02:13:07 +00002621 {
Sean Callanan67bbb112011-10-14 20:34:21 +00002622 AddOneFunction (context, NULL, generic_symbol, current_id);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002623 context.m_found.function = true;
Sean Callanan47dc4572011-09-15 02:13:07 +00002624 }
Sean Callanan81974962011-05-08 02:21:26 +00002625 else if (non_extern_symbol)
Sean Callanan47dc4572011-09-15 02:13:07 +00002626 {
Sean Callanan67bbb112011-10-14 20:34:21 +00002627 AddOneFunction (context, NULL, non_extern_symbol, current_id);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002628 context.m_found.function = true;
Sean Callanan47dc4572011-09-15 02:13:07 +00002629 }
Sean Callanan81974962011-05-08 02:21:26 +00002630 }
Greg Clayton8de27c72010-10-15 22:48:33 +00002631 }
Sean Callanan47dc4572011-09-15 02:13:07 +00002632
Sean Callanan16c4ec32011-10-12 20:29:25 +00002633 if (!context.m_found.variable)
Greg Clayton8de27c72010-10-15 22:48:33 +00002634 {
Sean Callanan16c4ec32011-10-12 20:29:25 +00002635 // We couldn't find a non-symbol variable for this. Now we'll hunt for a generic
Sean Callanan81974962011-05-08 02:21:26 +00002636 // data symbol, and -- if it is found -- treat it as a variable.
2637
Sean Callananaa4a5532011-10-13 16:49:47 +00002638 Symbol *data_symbol = FindGlobalDataSymbol(*target, name);
Sean Callanan81974962011-05-08 02:21:26 +00002639
2640 if (data_symbol)
Sean Callanan47dc4572011-09-15 02:13:07 +00002641 {
Sean Callanan67bbb112011-10-14 20:34:21 +00002642 AddOneGenericVariable(context, *data_symbol, current_id);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002643 context.m_found.variable = true;
Sean Callanan47dc4572011-09-15 02:13:07 +00002644 }
Greg Clayton6916e352010-11-13 03:52:47 +00002645 }
Sean Callanan92aa6662010-09-07 21:49:41 +00002646 }
Sean Callananb549b0a2011-10-27 02:06:03 +00002647 }
Sean Callanan336a0002010-07-17 00:43:37 +00002648}
Greg Claytone6d72ca2011-06-25 00:44:06 +00002649
Sean Callanan336a0002010-07-17 00:43:37 +00002650Value *
Greg Clayton8de27c72010-10-15 22:48:33 +00002651ClangExpressionDeclMap::GetVariableValue
2652(
2653 ExecutionContext &exe_ctx,
Sean Callanan4a078322011-10-13 00:09:20 +00002654 VariableSP &var,
Sean Callanan9b6898f2011-07-30 02:42:06 +00002655 ASTContext *parser_ast_context,
Greg Clayton8de27c72010-10-15 22:48:33 +00002656 TypeFromUser *user_type,
2657 TypeFromParser *parser_type
2658)
Chris Lattner24943d22010-06-08 16:52:24 +00002659{
Greg Claytone005f2c2010-11-06 01:53:30 +00002660 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan6184dfe2010-06-23 00:47:48 +00002661
Chris Lattner24943d22010-06-08 16:52:24 +00002662 Type *var_type = var->GetType();
2663
2664 if (!var_type)
2665 {
Sean Callanan810f22d2010-07-16 00:09:46 +00002666 if (log)
2667 log->PutCString("Skipped a definition because it has no type");
Sean Callanan336a0002010-07-17 00:43:37 +00002668 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00002669 }
2670
Greg Clayton04c9c7b2011-02-16 23:00:21 +00002671 clang_type_t var_opaque_type = var_type->GetClangFullType();
Chris Lattner24943d22010-06-08 16:52:24 +00002672
2673 if (!var_opaque_type)
2674 {
Sean Callanan810f22d2010-07-16 00:09:46 +00002675 if (log)
2676 log->PutCString("Skipped a definition because it has no Clang type");
Sean Callanan336a0002010-07-17 00:43:37 +00002677 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00002678 }
2679
Sean Callanan9b6898f2011-07-30 02:42:06 +00002680 ASTContext *ast = var_type->GetClangASTContext().getASTContext();
Chris Lattner24943d22010-06-08 16:52:24 +00002681
Greg Claytonb01000f2011-01-17 03:46:26 +00002682 if (!ast)
Chris Lattner24943d22010-06-08 16:52:24 +00002683 {
Sean Callanan810f22d2010-07-16 00:09:46 +00002684 if (log)
2685 log->PutCString("There is no AST context for the current execution context");
Sean Callanan336a0002010-07-17 00:43:37 +00002686 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00002687 }
2688
Sean Callanan336a0002010-07-17 00:43:37 +00002689 DWARFExpression &var_location_expr = var->LocationExpression();
2690
Chris Lattner24943d22010-06-08 16:52:24 +00002691 std::auto_ptr<Value> var_location(new Value);
2692
Greg Clayton178710c2010-09-14 02:20:48 +00002693 lldb::addr_t loclist_base_load_addr = LLDB_INVALID_ADDRESS;
2694
Greg Clayton567e7f32011-09-22 04:58:26 +00002695 Target *target = exe_ctx.GetTargetPtr();
2696
Greg Clayton178710c2010-09-14 02:20:48 +00002697 if (var_location_expr.IsLocationList())
2698 {
2699 SymbolContext var_sc;
2700 var->CalculateSymbolContext (&var_sc);
Greg Clayton567e7f32011-09-22 04:58:26 +00002701 loclist_base_load_addr = var_sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress (target);
Greg Clayton178710c2010-09-14 02:20:48 +00002702 }
Chris Lattner24943d22010-06-08 16:52:24 +00002703 Error err;
2704
Greg Claytonbdcb6ab2011-01-25 23:55:37 +00002705 if (!var_location_expr.Evaluate(&exe_ctx, ast, NULL, NULL, NULL, loclist_base_load_addr, NULL, *var_location.get(), &err))
Chris Lattner24943d22010-06-08 16:52:24 +00002706 {
Sean Callanan810f22d2010-07-16 00:09:46 +00002707 if (log)
2708 log->Printf("Error evaluating location: %s", err.AsCString());
Sean Callanan336a0002010-07-17 00:43:37 +00002709 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00002710 }
Greg Claytonb01000f2011-01-17 03:46:26 +00002711
Sean Callanan58baaad2011-07-08 00:39:14 +00002712 void *type_to_use = NULL;
Sean Callanan336a0002010-07-17 00:43:37 +00002713
Sean Callananf328c9f2010-07-20 23:31:16 +00002714 if (parser_ast_context)
2715 {
Greg Claytonb01000f2011-01-17 03:46:26 +00002716 type_to_use = GuardedCopyType(parser_ast_context, ast, var_opaque_type);
Sean Callananf328c9f2010-07-20 23:31:16 +00002717
Sean Callanan4b5eec62010-11-20 02:19:29 +00002718 if (!type_to_use)
2719 {
2720 if (log)
2721 log->Printf("Couldn't copy a variable's type into the parser's AST context");
2722
2723 return NULL;
2724 }
2725
Sean Callananf328c9f2010-07-20 23:31:16 +00002726 if (parser_type)
2727 *parser_type = TypeFromParser(type_to_use, parser_ast_context);
2728 }
Sean Callanan336a0002010-07-17 00:43:37 +00002729 else
2730 type_to_use = var_opaque_type;
Chris Lattner24943d22010-06-08 16:52:24 +00002731
2732 if (var_location.get()->GetContextType() == Value::eContextTypeInvalid)
Greg Clayton6916e352010-11-13 03:52:47 +00002733 var_location.get()->SetContext(Value::eContextTypeClangType, type_to_use);
Chris Lattner24943d22010-06-08 16:52:24 +00002734
2735 if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress)
2736 {
2737 SymbolContext var_sc;
2738 var->CalculateSymbolContext(&var_sc);
Sean Callanan336a0002010-07-17 00:43:37 +00002739
Chris Lattner24943d22010-06-08 16:52:24 +00002740 if (!var_sc.module_sp)
Sean Callanan336a0002010-07-17 00:43:37 +00002741 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00002742
2743 ObjectFile *object_file = var_sc.module_sp->GetObjectFile();
2744
2745 if (!object_file)
Sean Callanan336a0002010-07-17 00:43:37 +00002746 return NULL;
2747
Chris Lattner24943d22010-06-08 16:52:24 +00002748 Address so_addr(var_location->GetScalar().ULongLong(), object_file->GetSectionList());
2749
Greg Clayton567e7f32011-09-22 04:58:26 +00002750 lldb::addr_t load_addr = so_addr.GetLoadAddress(target);
Chris Lattner24943d22010-06-08 16:52:24 +00002751
Sean Callanan47dc4572011-09-15 02:13:07 +00002752 if (load_addr != LLDB_INVALID_ADDRESS)
2753 {
2754 var_location->GetScalar() = load_addr;
2755 var_location->SetValueType(Value::eValueTypeLoadAddress);
2756 }
Chris Lattner24943d22010-06-08 16:52:24 +00002757 }
2758
Sean Callananf328c9f2010-07-20 23:31:16 +00002759 if (user_type)
Greg Claytonb01000f2011-01-17 03:46:26 +00002760 *user_type = TypeFromUser(var_opaque_type, ast);
Sean Callanan336a0002010-07-17 00:43:37 +00002761
2762 return var_location.release();
2763}
2764
2765void
Sean Callanan89e7df32011-11-29 22:03:21 +00002766ClangExpressionDeclMap::AddOneVariable (NameSearchContext &context, VariableSP var, ValueObjectSP valobj, unsigned int current_id)
Sean Callanan336a0002010-07-17 00:43:37 +00002767{
Sean Callananaa301c42010-12-03 01:38:59 +00002768 assert (m_parser_vars.get());
2769
Greg Claytone005f2c2010-11-06 01:53:30 +00002770 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan47dc4572011-09-15 02:13:07 +00002771
Sean Callananf328c9f2010-07-20 23:31:16 +00002772 TypeFromUser ut;
2773 TypeFromParser pt;
Sean Callanan336a0002010-07-17 00:43:37 +00002774
Sean Callananaa301c42010-12-03 01:38:59 +00002775 Value *var_location = GetVariableValue (*m_parser_vars->m_exe_ctx,
Greg Clayton8de27c72010-10-15 22:48:33 +00002776 var,
Sean Callananf76afff2011-10-28 23:38:38 +00002777 m_ast_context,
Greg Clayton8de27c72010-10-15 22:48:33 +00002778 &ut,
2779 &pt);
Sean Callanan336a0002010-07-17 00:43:37 +00002780
Sean Callanan4b5eec62010-11-20 02:19:29 +00002781 if (!var_location)
2782 return;
2783
Sean Callanan6f3bde72011-10-27 19:41:13 +00002784 NamedDecl *var_decl;
2785
2786 bool is_reference = ClangASTContext::IsReferenceType(pt.GetOpaqueQualType());
2787
2788 if (is_reference)
2789 var_decl = context.AddVarDecl(pt.GetOpaqueQualType());
2790 else
2791 var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(pt.GetASTContext(), pt.GetOpaqueQualType()));
2792
Greg Clayton8de27c72010-10-15 22:48:33 +00002793 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton427f2902010-12-14 02:59:59 +00002794 ConstString entity_name(decl_name.c_str());
Sean Callanan89e7df32011-11-29 22:03:21 +00002795 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (valobj));
2796
Greg Clayton427f2902010-12-14 02:59:59 +00002797 assert (entity.get());
2798 entity->EnableParserVars();
2799 entity->m_parser_vars->m_parser_type = pt;
2800 entity->m_parser_vars->m_named_decl = var_decl;
2801 entity->m_parser_vars->m_llvm_value = NULL;
2802 entity->m_parser_vars->m_lldb_value = var_location;
Sean Callanan696cf5f2011-05-07 01:06:41 +00002803 entity->m_parser_vars->m_lldb_var = var;
Chris Lattner24943d22010-06-08 16:52:24 +00002804
Sean Callanan6f3bde72011-10-27 19:41:13 +00002805 if (is_reference)
2806 entity->m_flags |= ClangExpressionVariable::EVTypeIsReference;
2807
Sean Callanan810f22d2010-07-16 00:09:46 +00002808 if (log)
Greg Clayton8de27c72010-10-15 22:48:33 +00002809 {
Sean Callananaa561412011-11-07 23:32:52 +00002810 ASTDumper orig_dumper(ut.GetOpaqueQualType());
Greg Claytona23ca422011-10-20 00:47:21 +00002811 ASTDumper ast_dumper(var_decl);
Sean Callananaa561412011-11-07 23:32:52 +00002812 log->Printf(" CEDM::FEVD[%u] Found variable %s, returned %s (original %s)", current_id, decl_name.c_str(), ast_dumper.GetCString(), orig_dumper.GetCString());
Greg Clayton8de27c72010-10-15 22:48:33 +00002813 }
Sean Callanan8f0dc342010-06-22 23:46:24 +00002814}
2815
2816void
Sean Callanana48fe162010-08-11 03:57:18 +00002817ClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
Sean Callanan67bbb112011-10-14 20:34:21 +00002818 ClangExpressionVariableSP &pvar_sp,
2819 unsigned int current_id)
Sean Callanana48fe162010-08-11 03:57:18 +00002820{
Greg Claytone005f2c2010-11-06 01:53:30 +00002821 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan45690fe2010-08-30 22:17:16 +00002822
Greg Clayton427f2902010-12-14 02:59:59 +00002823 TypeFromUser user_type (pvar_sp->GetTypeFromUser());
Sean Callanana48fe162010-08-11 03:57:18 +00002824
Sean Callananf76afff2011-10-28 23:38:38 +00002825 TypeFromParser parser_type (GuardedCopyType(m_ast_context,
Greg Clayton427f2902010-12-14 02:59:59 +00002826 user_type.GetASTContext(),
2827 user_type.GetOpaqueQualType()),
Sean Callananf76afff2011-10-28 23:38:38 +00002828 m_ast_context);
Sean Callanana48fe162010-08-11 03:57:18 +00002829
Sean Callanandc5fce12011-12-01 21:04:37 +00002830 if (!parser_type.GetOpaqueQualType())
2831 {
2832 if (log)
2833 log->Printf(" CEDM::FEVD[%u] Couldn't import type for pvar %s", current_id, pvar_sp->GetName().GetCString());
2834 return;
2835 }
2836
Sean Callanan6a925532011-01-13 08:53:35 +00002837 NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(parser_type.GetASTContext(), parser_type.GetOpaqueQualType()));
Sean Callanan8c127202010-08-23 23:09:38 +00002838
Greg Clayton427f2902010-12-14 02:59:59 +00002839 pvar_sp->EnableParserVars();
2840 pvar_sp->m_parser_vars->m_parser_type = parser_type;
2841 pvar_sp->m_parser_vars->m_named_decl = var_decl;
2842 pvar_sp->m_parser_vars->m_llvm_value = NULL;
2843 pvar_sp->m_parser_vars->m_lldb_value = NULL;
Sean Callanan45690fe2010-08-30 22:17:16 +00002844
2845 if (log)
Sean Callanana0744822010-11-01 23:22:47 +00002846 {
Greg Claytona23ca422011-10-20 00:47:21 +00002847 ASTDumper ast_dumper(var_decl);
Sean Callanan9394b5a2011-10-29 19:50:43 +00002848 log->Printf(" CEDM::FEVD[%u] Added pvar %s, returned %s", current_id, pvar_sp->GetName().GetCString(), ast_dumper.GetCString());
Sean Callanana0744822010-11-01 23:22:47 +00002849 }
Sean Callanana48fe162010-08-11 03:57:18 +00002850}
2851
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002852void
Sean Callanan81974962011-05-08 02:21:26 +00002853ClangExpressionDeclMap::AddOneGenericVariable(NameSearchContext &context,
Sean Callanan67bbb112011-10-14 20:34:21 +00002854 Symbol &symbol,
2855 unsigned int current_id)
Sean Callanan81974962011-05-08 02:21:26 +00002856{
2857 assert(m_parser_vars.get());
2858
2859 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2860
Greg Clayton567e7f32011-09-22 04:58:26 +00002861 Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
2862
2863 if (target == NULL)
2864 return;
2865
2866 ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
Sean Callanan81974962011-05-08 02:21:26 +00002867
Sean Callananfb3058e2011-05-12 23:54:16 +00002868 TypeFromUser user_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(scratch_ast_context, true)),
Sean Callanan81974962011-05-08 02:21:26 +00002869 scratch_ast_context);
2870
Sean Callananf76afff2011-10-28 23:38:38 +00002871 TypeFromParser parser_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(m_ast_context, true)),
2872 m_ast_context);
Sean Callanan81974962011-05-08 02:21:26 +00002873
Sean Callananfb3058e2011-05-12 23:54:16 +00002874 NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
Sean Callanan81974962011-05-08 02:21:26 +00002875
2876 std::string decl_name(context.m_decl_name.getAsString());
2877 ConstString entity_name(decl_name.c_str());
2878 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
2879 entity_name,
2880 user_type,
Sean Callanan47dc4572011-09-15 02:13:07 +00002881 m_parser_vars->m_target_info.byte_order,
2882 m_parser_vars->m_target_info.address_byte_size));
Sean Callanan81974962011-05-08 02:21:26 +00002883 assert (entity.get());
Sean Callanan81974962011-05-08 02:21:26 +00002884
2885 std::auto_ptr<Value> symbol_location(new Value);
2886
2887 AddressRange &symbol_range = symbol.GetAddressRangeRef();
2888 Address &symbol_address = symbol_range.GetBaseAddress();
Greg Clayton567e7f32011-09-22 04:58:26 +00002889 lldb::addr_t symbol_load_addr = symbol_address.GetLoadAddress(target);
Sean Callanan81974962011-05-08 02:21:26 +00002890
2891 symbol_location->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
2892 symbol_location->GetScalar() = symbol_load_addr;
2893 symbol_location->SetValueType(Value::eValueTypeLoadAddress);
2894
Sean Callananfb3058e2011-05-12 23:54:16 +00002895 entity->EnableParserVars();
Sean Callanan81974962011-05-08 02:21:26 +00002896 entity->m_parser_vars->m_parser_type = parser_type;
2897 entity->m_parser_vars->m_named_decl = var_decl;
2898 entity->m_parser_vars->m_llvm_value = NULL;
2899 entity->m_parser_vars->m_lldb_value = symbol_location.release();
2900 entity->m_parser_vars->m_lldb_sym = &symbol;
2901
2902 if (log)
2903 {
Greg Claytona23ca422011-10-20 00:47:21 +00002904 ASTDumper ast_dumper(var_decl);
Sean Callanan81974962011-05-08 02:21:26 +00002905
Sean Callanan9394b5a2011-10-29 19:50:43 +00002906 log->Printf(" CEDM::FEVD[%u] Found variable %s, returned %s", current_id, decl_name.c_str(), ast_dumper.GetCString());
Sean Callanan81974962011-05-08 02:21:26 +00002907 }
2908}
2909
Sean Callananfb3058e2011-05-12 23:54:16 +00002910bool
2911ClangExpressionDeclMap::ResolveUnknownTypes()
2912{
2913 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Greg Clayton567e7f32011-09-22 04:58:26 +00002914 Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
2915
2916 ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
Sean Callananfb3058e2011-05-12 23:54:16 +00002917
2918 for (size_t index = 0, num_entities = m_found_entities.GetSize();
2919 index < num_entities;
2920 ++index)
2921 {
2922 ClangExpressionVariableSP entity = m_found_entities.GetVariableAtIndex(index);
2923
2924 if (entity->m_flags & ClangExpressionVariable::EVUnknownType)
2925 {
2926 const NamedDecl *named_decl = entity->m_parser_vars->m_named_decl;
2927 const VarDecl *var_decl = dyn_cast<VarDecl>(named_decl);
2928
2929 if (!var_decl)
2930 {
2931 if (log)
2932 log->Printf("Entity of unknown type does not have a VarDecl");
2933 return false;
2934 }
2935
2936 if (log)
2937 {
Greg Claytona23ca422011-10-20 00:47:21 +00002938 ASTDumper ast_dumper(const_cast<VarDecl*>(var_decl));
2939 log->Printf("Variable of unknown type now has Decl %s", ast_dumper.GetCString());
Sean Callananfb3058e2011-05-12 23:54:16 +00002940 }
2941
2942 QualType var_type = var_decl->getType();
2943 TypeFromParser parser_type(var_type.getAsOpaquePtr(), &var_decl->getASTContext());
2944
Sean Callanan5a55c7a2011-11-18 03:28:09 +00002945 lldb::clang_type_t copied_type = m_ast_importer->CopyType(scratch_ast_context, &var_decl->getASTContext(), var_type.getAsOpaquePtr());
Sean Callananfb3058e2011-05-12 23:54:16 +00002946
Sean Callanandc5fce12011-12-01 21:04:37 +00002947 if (!copied_type)
2948 {
2949 if (log)
2950 log->Printf("ClangExpressionDeclMap::ResolveUnknownType - Couldn't import the type for a variable");
2951
2952 return lldb::ClangExpressionVariableSP();
2953 }
2954
Sean Callananfb3058e2011-05-12 23:54:16 +00002955 TypeFromUser user_type(copied_type, scratch_ast_context);
2956
2957 entity->m_parser_vars->m_lldb_value->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
2958 entity->m_parser_vars->m_parser_type = parser_type;
2959
2960 entity->SetClangAST(user_type.GetASTContext());
2961 entity->SetClangType(user_type.GetOpaqueQualType());
2962
2963 entity->m_flags &= ~(ClangExpressionVariable::EVUnknownType);
2964 }
2965 }
2966
2967 return true;
2968}
2969
Sean Callanan81974962011-05-08 02:21:26 +00002970void
Greg Clayton427f2902010-12-14 02:59:59 +00002971ClangExpressionDeclMap::AddOneRegister (NameSearchContext &context,
Sean Callanan67bbb112011-10-14 20:34:21 +00002972 const RegisterInfo *reg_info,
2973 unsigned int current_id)
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002974{
2975 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2976
Sean Callananf76afff2011-10-28 23:38:38 +00002977 void *ast_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize(m_ast_context,
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002978 reg_info->encoding,
2979 reg_info->byte_size * 8);
2980
2981 if (!ast_type)
2982 {
Johnny Chen122204d2011-08-09 22:52:27 +00002983 if (log)
Sean Callanan67bbb112011-10-14 20:34:21 +00002984 log->Printf(" Tried to add a type for %s, but couldn't get one", context.m_decl_name.getAsString().c_str());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002985 return;
2986 }
2987
Greg Clayton427f2902010-12-14 02:59:59 +00002988 TypeFromParser parser_type (ast_type,
Sean Callananf76afff2011-10-28 23:38:38 +00002989 m_ast_context);
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002990
2991 NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
2992
Jim Inghamfa3a16a2011-03-31 00:19:25 +00002993 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope(),
Sean Callanan47dc4572011-09-15 02:13:07 +00002994 m_parser_vars->m_target_info.byte_order,
2995 m_parser_vars->m_target_info.address_byte_size));
Greg Clayton427f2902010-12-14 02:59:59 +00002996 assert (entity.get());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002997 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton427f2902010-12-14 02:59:59 +00002998 entity->SetName (ConstString (decl_name.c_str()));
2999 entity->SetRegisterInfo (reg_info);
3000 entity->EnableParserVars();
3001 entity->m_parser_vars->m_parser_type = parser_type;
3002 entity->m_parser_vars->m_named_decl = var_decl;
3003 entity->m_parser_vars->m_llvm_value = NULL;
3004 entity->m_parser_vars->m_lldb_value = NULL;
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00003005
Sean Callanan67bbb112011-10-14 20:34:21 +00003006 if (log && log->GetVerbose())
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00003007 {
Greg Claytona23ca422011-10-20 00:47:21 +00003008 ASTDumper ast_dumper(var_decl);
Sean Callanan9394b5a2011-10-29 19:50:43 +00003009 log->Printf(" CEDM::FEVD[%d] Added register %s, returned %s", current_id, context.m_decl_name.getAsString().c_str(), ast_dumper.GetCString());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00003010 }
3011}
3012
Sean Callanana48fe162010-08-11 03:57:18 +00003013void
Greg Claytonda7af842011-05-18 22:01:49 +00003014ClangExpressionDeclMap::AddOneFunction (NameSearchContext &context,
3015 Function* fun,
Sean Callanan67bbb112011-10-14 20:34:21 +00003016 Symbol* symbol,
3017 unsigned int current_id)
Sean Callanan8f0dc342010-06-22 23:46:24 +00003018{
Sean Callananaa301c42010-12-03 01:38:59 +00003019 assert (m_parser_vars.get());
3020
Greg Claytone005f2c2010-11-06 01:53:30 +00003021 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan8f0dc342010-06-22 23:46:24 +00003022
Sean Callanan58baaad2011-07-08 00:39:14 +00003023 NamedDecl *fun_decl = NULL;
Sean Callanan8f0dc342010-06-22 23:46:24 +00003024 std::auto_ptr<Value> fun_location(new Value);
Sean Callanan58baaad2011-07-08 00:39:14 +00003025 const Address *fun_address = NULL;
Sean Callanan8f0dc342010-06-22 23:46:24 +00003026
Sean Callanan0fc73582010-07-27 00:55:47 +00003027 // only valid for Functions, not for Symbols
3028 void *fun_opaque_type = NULL;
Sean Callanan9b6898f2011-07-30 02:42:06 +00003029 ASTContext *fun_ast_context = NULL;
Sean Callanan0fc73582010-07-27 00:55:47 +00003030
3031 if (fun)
3032 {
3033 Type *fun_type = fun->GetType();
3034
3035 if (!fun_type)
3036 {
3037 if (log)
Sean Callanan67bbb112011-10-14 20:34:21 +00003038 log->PutCString(" Skipped a function because it has no type");
Sean Callanan0fc73582010-07-27 00:55:47 +00003039 return;
3040 }
3041
Greg Clayton04c9c7b2011-02-16 23:00:21 +00003042 fun_opaque_type = fun_type->GetClangFullType();
Sean Callanan0fc73582010-07-27 00:55:47 +00003043
3044 if (!fun_opaque_type)
3045 {
3046 if (log)
Sean Callanan67bbb112011-10-14 20:34:21 +00003047 log->PutCString(" Skipped a function because it has no Clang type");
Sean Callanan0fc73582010-07-27 00:55:47 +00003048 return;
3049 }
3050
3051 fun_address = &fun->GetAddressRange().GetBaseAddress();
3052
Greg Claytonb01000f2011-01-17 03:46:26 +00003053 fun_ast_context = fun_type->GetClangASTContext().getASTContext();
Sean Callananf76afff2011-10-28 23:38:38 +00003054 void *copied_type = GuardedCopyType(m_ast_context, fun_ast_context, fun_opaque_type);
Greg Claytona23ca422011-10-20 00:47:21 +00003055 if (copied_type)
3056 {
3057 fun_decl = context.AddFunDecl(copied_type);
3058 }
3059 else
3060 {
3061 // We failed to copy the type we found
3062 if (log)
3063 {
3064 log->Printf (" Failed to import the function type '%s' {0x%8.8llx} into the expression parser AST contenxt",
3065 fun_type->GetName().GetCString(),
3066 fun_type->GetID());
3067 }
Sean Callanan16089542011-11-16 00:40:13 +00003068
3069 return;
Greg Claytona23ca422011-10-20 00:47:21 +00003070 }
Sean Callanan0fc73582010-07-27 00:55:47 +00003071 }
3072 else if (symbol)
3073 {
3074 fun_address = &symbol->GetAddressRangeRef().GetBaseAddress();
3075
3076 fun_decl = context.AddGenericFunDecl();
3077 }
3078 else
3079 {
3080 if (log)
Sean Callanan67bbb112011-10-14 20:34:21 +00003081 log->PutCString(" AddOneFunction called with no function and no symbol");
Sean Callanan0fc73582010-07-27 00:55:47 +00003082 return;
3083 }
3084
Greg Clayton567e7f32011-09-22 04:58:26 +00003085 Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
3086
3087 lldb::addr_t load_addr = fun_address->GetCallableLoadAddress(target);
Sean Callanan8f0dc342010-06-22 23:46:24 +00003088 fun_location->SetValueType(Value::eValueTypeLoadAddress);
3089 fun_location->GetScalar() = load_addr;
3090
Jim Inghamfa3a16a2011-03-31 00:19:25 +00003091 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
Sean Callanan47dc4572011-09-15 02:13:07 +00003092 m_parser_vars->m_target_info.byte_order,
3093 m_parser_vars->m_target_info.address_byte_size));
Greg Clayton427f2902010-12-14 02:59:59 +00003094 assert (entity.get());
Greg Clayton8de27c72010-10-15 22:48:33 +00003095 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton427f2902010-12-14 02:59:59 +00003096 entity->SetName(ConstString(decl_name.c_str()));
3097 entity->SetClangType (fun_opaque_type);
3098 entity->SetClangAST (fun_ast_context);
Sean Callanan8f0dc342010-06-22 23:46:24 +00003099
Greg Clayton427f2902010-12-14 02:59:59 +00003100 entity->EnableParserVars();
3101 entity->m_parser_vars->m_named_decl = fun_decl;
3102 entity->m_parser_vars->m_llvm_value = NULL;
3103 entity->m_parser_vars->m_lldb_value = fun_location.release();
Sean Callanan8c127202010-08-23 23:09:38 +00003104
Sean Callanan810f22d2010-07-16 00:09:46 +00003105 if (log)
Greg Clayton8de27c72010-10-15 22:48:33 +00003106 {
Greg Claytona23ca422011-10-20 00:47:21 +00003107 ASTDumper ast_dumper(fun_decl);
Sean Callanana0744822010-11-01 23:22:47 +00003108
Sean Callanan9394b5a2011-10-29 19:50:43 +00003109 log->Printf(" CEDM::FEVD[%u] Found %s function %s, returned %s",
Sean Callanan67bbb112011-10-14 20:34:21 +00003110 current_id,
3111 (fun ? "specific" : "generic"),
3112 decl_name.c_str(),
Greg Claytona23ca422011-10-20 00:47:21 +00003113 ast_dumper.GetCString());
Greg Clayton8de27c72010-10-15 22:48:33 +00003114 }
Chris Lattner24943d22010-06-08 16:52:24 +00003115}
Sean Callanan93a4b1a2010-08-04 01:02:13 +00003116
3117void
3118ClangExpressionDeclMap::AddOneType(NameSearchContext &context,
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00003119 TypeFromUser &ut,
Sean Callanan67bbb112011-10-14 20:34:21 +00003120 unsigned int current_id,
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00003121 bool add_method)
Sean Callanan93a4b1a2010-08-04 01:02:13 +00003122{
Sean Callananf76afff2011-10-28 23:38:38 +00003123 ASTContext *parser_ast_context = m_ast_context;
Sean Callanan9b6898f2011-07-30 02:42:06 +00003124 ASTContext *user_ast_context = ut.GetASTContext();
Sean Callanan93a4b1a2010-08-04 01:02:13 +00003125
Sean Callananee8fc722010-11-19 20:20:02 +00003126 void *copied_type = GuardedCopyType(parser_ast_context, user_ast_context, ut.GetOpaqueQualType());
Sean Callanandc5fce12011-12-01 21:04:37 +00003127
3128 if (!copied_type)
3129 {
3130 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
3131
3132 if (log)
3133 log->Printf("ClangExpressionDeclMap::AddOneType - Couldn't import the type");
3134
3135 return;
3136 }
Sean Callanan9394b5a2011-10-29 19:50:43 +00003137
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00003138 if (add_method && ClangASTContext::IsAggregateType(copied_type))
3139 {
3140 void *args[1];
3141
3142 args[0] = ClangASTContext::GetVoidPtrType(parser_ast_context, false);
3143
Sean Callanan716e3f02011-11-01 18:07:13 +00003144 clang_type_t method_type = ClangASTContext::CreateFunctionType (parser_ast_context,
3145 ClangASTContext::GetBuiltInType_void(parser_ast_context),
3146 args,
3147 1,
3148 false,
3149 ClangASTContext::GetTypeQualifiers(copied_type));
3150
Greg Clayton1d8173f2010-09-24 05:15:53 +00003151 const bool is_virtual = false;
3152 const bool is_static = false;
3153 const bool is_inline = false;
Greg Clayton30449d52010-10-01 02:31:07 +00003154 const bool is_explicit = false;
Sean Callanan28ebe882011-11-02 18:09:01 +00003155 const bool is_attr_used = true;
Sean Callanan2581dbf2011-11-02 01:38:59 +00003156 const bool is_artificial = false;
Greg Clayton30449d52010-10-01 02:31:07 +00003157
Greg Clayton1d8173f2010-09-24 05:15:53 +00003158 ClangASTContext::AddMethodToCXXRecordType (parser_ast_context,
3159 copied_type,
Greg Clayton8de27c72010-10-15 22:48:33 +00003160 "$__lldb_expr",
Greg Clayton1d8173f2010-09-24 05:15:53 +00003161 method_type,
3162 lldb::eAccessPublic,
3163 is_virtual,
3164 is_static,
Greg Clayton30449d52010-10-01 02:31:07 +00003165 is_inline,
Sean Callanan716e3f02011-11-01 18:07:13 +00003166 is_explicit,
Sean Callanan2581dbf2011-11-02 01:38:59 +00003167 is_attr_used,
3168 is_artificial);
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00003169 }
Sean Callanan93a4b1a2010-08-04 01:02:13 +00003170
3171 context.AddTypeDecl(copied_type);
3172}