blob: 12833caf8c12be817a56346f8a2c2bf4286851d3 [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
399 pvar_sp->m_live_sp = ValueObjectConstResult::Create(m_parser_vars->m_exe_ctx->GetBestExecutionContextScope(),
400 pvar_sp->GetTypeFromUser().GetASTContext(),
401 pvar_sp->GetTypeFromUser().GetOpaqueQualType(),
402 pvar_sp->GetName(),
403 value.GetScalar().ULongLong(),
404 value.GetValueAddressType(),
405 pvar_sp->GetByteSize());
406 }
407
408 if (pvar_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry)
409 {
410 pvar_sp->ValueUpdated();
411
412 const size_t pvar_byte_size = pvar_sp->GetByteSize();
413 uint8_t *pvar_data = pvar_sp->GetValueBytes();
414
Sean Callananf48de6d2011-12-10 03:12:34 +0000415 ReadTarget(pvar_data, value, pvar_byte_size);
Sean Callanan47dc4572011-09-15 02:13:07 +0000416
417 pvar_sp->m_flags &= ~(ClangExpressionVariable::EVNeedsFreezeDry);
418 }
419
420 valobj = pvar_sp;
421
422 return true;
423}
424
Sean Callanan8bce6652010-07-13 21:41:46 +0000425bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000426ClangExpressionDeclMap::AddPersistentVariable
427(
Sean Callanan9b6898f2011-07-30 02:42:06 +0000428 const NamedDecl *decl,
Greg Clayton8de27c72010-10-15 22:48:33 +0000429 const ConstString &name,
Sean Callanan6a925532011-01-13 08:53:35 +0000430 TypeFromParser parser_type,
431 bool is_result,
432 bool is_lvalue
Greg Clayton8de27c72010-10-15 22:48:33 +0000433)
Sean Callanana48fe162010-08-11 03:57:18 +0000434{
Sean Callananaa301c42010-12-03 01:38:59 +0000435 assert (m_parser_vars.get());
436
Sean Callanan6a925532011-01-13 08:53:35 +0000437 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000438 ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
Greg Clayton567e7f32011-09-22 04:58:26 +0000439 if (exe_ctx == NULL)
440 return false;
441 Target *target = exe_ctx->GetTargetPtr();
442 if (target == NULL)
443 return false;
444
445 ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
Sean Callanana48fe162010-08-11 03:57:18 +0000446
Sean Callanan5a55c7a2011-11-18 03:28:09 +0000447 TypeFromUser user_type(m_ast_importer->CopyType(context,
448 parser_type.GetASTContext(),
449 parser_type.GetOpaqueQualType()),
Sean Callanan97678d12011-01-13 21:23:32 +0000450 context);
Sean Callanan5a55c7a2011-11-18 03:28:09 +0000451
452 if (!user_type.GetOpaqueQualType())
453 {
454 if (log)
455 log->Printf("Persistent variable's type wasn't copied successfully");
456 return false;
457 }
Sean Callanan47dc4572011-09-15 02:13:07 +0000458
459 if (!m_parser_vars->m_target_info.IsValid())
460 return false;
Sean Callanana48fe162010-08-11 03:57:18 +0000461
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000462 if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx->GetBestExecutionContextScope (),
463 name,
Greg Clayton427f2902010-12-14 02:59:59 +0000464 user_type,
Sean Callanan47dc4572011-09-15 02:13:07 +0000465 m_parser_vars->m_target_info.byte_order,
466 m_parser_vars->m_target_info.address_byte_size))
Sean Callanan8c127202010-08-23 23:09:38 +0000467 return false;
468
Greg Clayton427f2902010-12-14 02:59:59 +0000469 ClangExpressionVariableSP var_sp (m_parser_vars->m_persistent_vars->GetVariable(name));
Sean Callanan8c127202010-08-23 23:09:38 +0000470
Greg Clayton427f2902010-12-14 02:59:59 +0000471 if (!var_sp)
Sean Callanan8c127202010-08-23 23:09:38 +0000472 return false;
473
Sean Callanan6a925532011-01-13 08:53:35 +0000474 if (is_result)
475 var_sp->m_flags |= ClangExpressionVariable::EVNeedsFreezeDry;
476 else
477 var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget; // explicitly-declared persistent variables should persist
478
479 if (is_lvalue)
480 {
481 var_sp->m_flags |= ClangExpressionVariable::EVIsProgramReference;
482 }
483 else
484 {
485 var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
486 var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
487 }
488
489 if (log)
490 log->Printf("Created persistent variable with flags 0x%hx", var_sp->m_flags);
491
Greg Clayton427f2902010-12-14 02:59:59 +0000492 var_sp->EnableParserVars();
Sean Callanan8c127202010-08-23 23:09:38 +0000493
Greg Clayton427f2902010-12-14 02:59:59 +0000494 var_sp->m_parser_vars->m_named_decl = decl;
495 var_sp->m_parser_vars->m_parser_type = parser_type;
Sean Callanan8c127202010-08-23 23:09:38 +0000496
497 return true;
Sean Callanana48fe162010-08-11 03:57:18 +0000498}
499
500bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000501ClangExpressionDeclMap::AddValueToStruct
502(
Sean Callanan9b6898f2011-07-30 02:42:06 +0000503 const NamedDecl *decl,
Greg Clayton8de27c72010-10-15 22:48:33 +0000504 const ConstString &name,
505 llvm::Value *value,
506 size_t size,
507 off_t alignment
508)
Sean Callanan8bce6652010-07-13 21:41:46 +0000509{
Sean Callananaa301c42010-12-03 01:38:59 +0000510 assert (m_struct_vars.get());
511 assert (m_parser_vars.get());
512
Greg Claytone005f2c2010-11-06 01:53:30 +0000513 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan45690fe2010-08-30 22:17:16 +0000514
Sean Callananaa301c42010-12-03 01:38:59 +0000515 m_struct_vars->m_struct_laid_out = false;
Sean Callanan8bce6652010-07-13 21:41:46 +0000516
Sean Callanan8c127202010-08-23 23:09:38 +0000517 if (m_struct_members.GetVariable(decl))
518 return true;
Sean Callanan8bce6652010-07-13 21:41:46 +0000519
Greg Clayton427f2902010-12-14 02:59:59 +0000520 ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl));
Sean Callanan8bce6652010-07-13 21:41:46 +0000521
Greg Clayton427f2902010-12-14 02:59:59 +0000522 if (!var_sp)
523 var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl);
Sean Callanan8bce6652010-07-13 21:41:46 +0000524
Greg Clayton427f2902010-12-14 02:59:59 +0000525 if (!var_sp)
Sean Callanan8c127202010-08-23 23:09:38 +0000526 return false;
527
Sean Callanan45690fe2010-08-30 22:17:16 +0000528 if (log)
Sean Callanan5a55c7a2011-11-18 03:28:09 +0000529 log->Printf("Adding value for (NamedDecl*)%p [%s - %s] to the structure",
Sean Callanan45690fe2010-08-30 22:17:16 +0000530 decl,
Greg Clayton8de27c72010-10-15 22:48:33 +0000531 name.GetCString(),
Greg Clayton427f2902010-12-14 02:59:59 +0000532 var_sp->GetName().GetCString());
Sean Callanan45690fe2010-08-30 22:17:16 +0000533
Sean Callanan8c127202010-08-23 23:09:38 +0000534 // We know entity->m_parser_vars is valid because we used a parser variable
535 // to find it
Greg Clayton427f2902010-12-14 02:59:59 +0000536 var_sp->m_parser_vars->m_llvm_value = value;
Sean Callanan8c127202010-08-23 23:09:38 +0000537
Greg Clayton427f2902010-12-14 02:59:59 +0000538 var_sp->EnableJITVars();
539 var_sp->m_jit_vars->m_alignment = alignment;
540 var_sp->m_jit_vars->m_size = size;
Sean Callanan8c127202010-08-23 23:09:38 +0000541
Greg Clayton427f2902010-12-14 02:59:59 +0000542 m_struct_members.AddVariable(var_sp);
Sean Callanan8bce6652010-07-13 21:41:46 +0000543
544 return true;
545}
546
547bool
548ClangExpressionDeclMap::DoStructLayout ()
549{
Sean Callananaa301c42010-12-03 01:38:59 +0000550 assert (m_struct_vars.get());
551
552 if (m_struct_vars->m_struct_laid_out)
Sean Callanan8bce6652010-07-13 21:41:46 +0000553 return true;
554
Sean Callanan8bce6652010-07-13 21:41:46 +0000555 off_t cursor = 0;
556
Sean Callananaa301c42010-12-03 01:38:59 +0000557 m_struct_vars->m_struct_alignment = 0;
558 m_struct_vars->m_struct_size = 0;
Sean Callanan8bce6652010-07-13 21:41:46 +0000559
Greg Clayton427f2902010-12-14 02:59:59 +0000560 for (size_t member_index = 0, num_members = m_struct_members.GetSize();
Sean Callanan8c127202010-08-23 23:09:38 +0000561 member_index < num_members;
562 ++member_index)
Sean Callanan8bce6652010-07-13 21:41:46 +0000563 {
Greg Clayton427f2902010-12-14 02:59:59 +0000564 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
565 if (!member_sp)
566 return false;
567
568 if (!member_sp->m_jit_vars.get())
Sean Callanan8c127202010-08-23 23:09:38 +0000569 return false;
Sean Callanan8bce6652010-07-13 21:41:46 +0000570
Sean Callanan8c127202010-08-23 23:09:38 +0000571 if (member_index == 0)
Greg Clayton427f2902010-12-14 02:59:59 +0000572 m_struct_vars->m_struct_alignment = member_sp->m_jit_vars->m_alignment;
Sean Callanan8c127202010-08-23 23:09:38 +0000573
Greg Clayton427f2902010-12-14 02:59:59 +0000574 if (cursor % member_sp->m_jit_vars->m_alignment)
575 cursor += (member_sp->m_jit_vars->m_alignment - (cursor % member_sp->m_jit_vars->m_alignment));
Sean Callanan8c127202010-08-23 23:09:38 +0000576
Greg Clayton427f2902010-12-14 02:59:59 +0000577 member_sp->m_jit_vars->m_offset = cursor;
578 cursor += member_sp->m_jit_vars->m_size;
Sean Callanan8bce6652010-07-13 21:41:46 +0000579 }
580
Sean Callananaa301c42010-12-03 01:38:59 +0000581 m_struct_vars->m_struct_size = cursor;
Sean Callanan8bce6652010-07-13 21:41:46 +0000582
Sean Callananaa301c42010-12-03 01:38:59 +0000583 m_struct_vars->m_struct_laid_out = true;
Sean Callanan8bce6652010-07-13 21:41:46 +0000584 return true;
585}
586
Greg Clayton8de27c72010-10-15 22:48:33 +0000587bool ClangExpressionDeclMap::GetStructInfo
588(
589 uint32_t &num_elements,
590 size_t &size,
591 off_t &alignment
592)
Sean Callanan8bce6652010-07-13 21:41:46 +0000593{
Sean Callananaa301c42010-12-03 01:38:59 +0000594 assert (m_struct_vars.get());
595
596 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan8bce6652010-07-13 21:41:46 +0000597 return false;
598
Greg Clayton427f2902010-12-14 02:59:59 +0000599 num_elements = m_struct_members.GetSize();
Sean Callananaa301c42010-12-03 01:38:59 +0000600 size = m_struct_vars->m_struct_size;
601 alignment = m_struct_vars->m_struct_alignment;
Sean Callanan8bce6652010-07-13 21:41:46 +0000602
603 return true;
604}
605
606bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000607ClangExpressionDeclMap::GetStructElement
608(
Sean Callanan9b6898f2011-07-30 02:42:06 +0000609 const NamedDecl *&decl,
Greg Clayton8de27c72010-10-15 22:48:33 +0000610 llvm::Value *&value,
611 off_t &offset,
612 ConstString &name,
613 uint32_t index
614)
Sean Callanan8bce6652010-07-13 21:41:46 +0000615{
Sean Callananaa301c42010-12-03 01:38:59 +0000616 assert (m_struct_vars.get());
617
618 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan8bce6652010-07-13 21:41:46 +0000619 return false;
620
Greg Clayton427f2902010-12-14 02:59:59 +0000621 if (index >= m_struct_members.GetSize())
Sean Callanan8bce6652010-07-13 21:41:46 +0000622 return false;
623
Greg Clayton427f2902010-12-14 02:59:59 +0000624 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(index));
Sean Callanan8bce6652010-07-13 21:41:46 +0000625
Greg Clayton427f2902010-12-14 02:59:59 +0000626 if (!member_sp ||
627 !member_sp->m_parser_vars.get() ||
628 !member_sp->m_jit_vars.get())
Sean Callanan8c127202010-08-23 23:09:38 +0000629 return false;
630
Greg Clayton427f2902010-12-14 02:59:59 +0000631 decl = member_sp->m_parser_vars->m_named_decl;
632 value = member_sp->m_parser_vars->m_llvm_value;
633 offset = member_sp->m_jit_vars->m_offset;
634 name = member_sp->GetName();
Sean Callanan8c127202010-08-23 23:09:38 +0000635
Sean Callanan8bce6652010-07-13 21:41:46 +0000636 return true;
637}
638
Sean Callanan02fbafa2010-07-27 21:39:39 +0000639bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000640ClangExpressionDeclMap::GetFunctionInfo
641(
Sean Callanan9b6898f2011-07-30 02:42:06 +0000642 const NamedDecl *decl,
Greg Clayton8de27c72010-10-15 22:48:33 +0000643 uint64_t &ptr
644)
Sean Callananba992c52010-07-27 02:07:53 +0000645{
Greg Clayton427f2902010-12-14 02:59:59 +0000646 ClangExpressionVariableSP entity_sp(m_found_entities.GetVariable(decl));
Sean Callanan8c127202010-08-23 23:09:38 +0000647
Greg Clayton427f2902010-12-14 02:59:59 +0000648 if (!entity_sp)
Sean Callanan8c127202010-08-23 23:09:38 +0000649 return false;
Sean Callananba992c52010-07-27 02:07:53 +0000650
Sean Callanan8c127202010-08-23 23:09:38 +0000651 // We know m_parser_vars is valid since we searched for the variable by
652 // its NamedDecl
Sean Callananba992c52010-07-27 02:07:53 +0000653
Greg Clayton427f2902010-12-14 02:59:59 +0000654 ptr = entity_sp->m_parser_vars->m_lldb_value->GetScalar().ULongLong();
Sean Callanan8c127202010-08-23 23:09:38 +0000655
656 return true;
Sean Callananba992c52010-07-27 02:07:53 +0000657}
658
Sean Callananca2516d2011-08-16 18:09:29 +0000659static void
660FindCodeSymbolInContext
661(
662 const ConstString &name,
663 SymbolContext &sym_ctx,
664 SymbolContextList &sc_list
665)
666{
667 if (sym_ctx.module_sp)
Sean Callananaa4a5532011-10-13 16:49:47 +0000668 sym_ctx.module_sp->FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list);
Sean Callananca2516d2011-08-16 18:09:29 +0000669
670 if (!sc_list.GetSize())
671 sym_ctx.target_sp->GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list);
672}
673
Sean Callananf5857a02010-07-31 01:32:05 +0000674bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000675ClangExpressionDeclMap::GetFunctionAddress
676(
677 const ConstString &name,
Greg Claytonda7af842011-05-18 22:01:49 +0000678 uint64_t &func_addr
Greg Clayton8de27c72010-10-15 22:48:33 +0000679)
Sean Callananf5857a02010-07-31 01:32:05 +0000680{
Sean Callananaa301c42010-12-03 01:38:59 +0000681 assert (m_parser_vars.get());
682
Sean Callananaba367e2011-05-13 18:27:02 +0000683 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Greg Clayton567e7f32011-09-22 04:58:26 +0000684 ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
685 if (exe_ctx == NULL)
686 return false;
687 Target *target = exe_ctx->GetTargetPtr();
Sean Callananf5857a02010-07-31 01:32:05 +0000688 // Back out in all cases where we're not fully initialized
Greg Clayton567e7f32011-09-22 04:58:26 +0000689 if (target == NULL)
Jim Ingham78b9ee82010-12-07 01:56:02 +0000690 return false;
691 if (!m_parser_vars->m_sym_ctx.target_sp)
Sean Callananf5857a02010-07-31 01:32:05 +0000692 return false;
693
Greg Claytone5748d82010-11-09 23:46:37 +0000694 SymbolContextList sc_list;
Sean Callananf5857a02010-07-31 01:32:05 +0000695
Sean Callananca2516d2011-08-16 18:09:29 +0000696 FindCodeSymbolInContext(name, m_parser_vars->m_sym_ctx, sc_list);
697
Greg Claytone5748d82010-11-09 23:46:37 +0000698 if (!sc_list.GetSize())
Sean Callananaba367e2011-05-13 18:27:02 +0000699 {
700 // We occasionally get debug information in which a const function is reported
701 // as non-const, so the mangled name is wrong. This is a hack to compensate.
702
Sean Callanan0eb21392011-10-25 18:02:05 +0000703 if (!strncmp(name.GetCString(), "_ZN", 3) &&
704 strncmp(name.GetCString(), "_ZNK", 4))
Sean Callananaba367e2011-05-13 18:27:02 +0000705 {
Sean Callanan0eb21392011-10-25 18:02:05 +0000706 std::string fixed_scratch("_ZNK");
707 fixed_scratch.append(name.GetCString() + 3);
708 ConstString fixed_name(fixed_scratch.c_str());
Sean Callananaba367e2011-05-13 18:27:02 +0000709
710 if (log)
Sean Callanan0eb21392011-10-25 18:02:05 +0000711 log->Printf("Failed to find symbols given non-const name %s; trying %s", name.GetCString(), fixed_name.GetCString());
712
713 FindCodeSymbolInContext(fixed_name, m_parser_vars->m_sym_ctx, sc_list);
Sean Callananaba367e2011-05-13 18:27:02 +0000714 }
715 }
716
717 if (!sc_list.GetSize())
Sean Callananf5857a02010-07-31 01:32:05 +0000718 return false;
719
720 SymbolContext sym_ctx;
Greg Claytone5748d82010-11-09 23:46:37 +0000721 sc_list.GetContextAtIndex(0, sym_ctx);
Sean Callananf5857a02010-07-31 01:32:05 +0000722
Greg Claytonda7af842011-05-18 22:01:49 +0000723 const Address *func_so_addr = NULL;
Sean Callananf5857a02010-07-31 01:32:05 +0000724
725 if (sym_ctx.function)
Greg Claytonda7af842011-05-18 22:01:49 +0000726 func_so_addr = &sym_ctx.function->GetAddressRange().GetBaseAddress();
Sean Callananf5857a02010-07-31 01:32:05 +0000727 else if (sym_ctx.symbol)
Greg Claytonda7af842011-05-18 22:01:49 +0000728 func_so_addr = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress();
Sean Callananf5857a02010-07-31 01:32:05 +0000729 else
730 return false;
731
Sean Callananae9f7482011-07-07 23:05:43 +0000732 if (!func_so_addr || !func_so_addr->IsValid())
733 return false;
734
Greg Clayton567e7f32011-09-22 04:58:26 +0000735 func_addr = func_so_addr->GetCallableLoadAddress (target);
Greg Claytonda7af842011-05-18 22:01:49 +0000736
Sean Callananf5857a02010-07-31 01:32:05 +0000737 return true;
738}
739
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000740addr_t
Sean Callanan21ef5bb2011-12-01 02:04:16 +0000741ClangExpressionDeclMap::GetSymbolAddress (Target &target, const ConstString &name, lldb::SymbolType symbol_type)
Sean Callananc7674af2011-01-17 23:42:46 +0000742{
Sean Callananc7674af2011-01-17 23:42:46 +0000743 SymbolContextList sc_list;
744
Sean Callanan21ef5bb2011-12-01 02:04:16 +0000745 target.GetImages().FindSymbolsWithNameAndType(name, symbol_type, sc_list);
Sean Callananc7674af2011-01-17 23:42:46 +0000746
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000747 const uint32_t num_matches = sc_list.GetSize();
748 addr_t symbol_load_addr = LLDB_INVALID_ADDRESS;
749
Sean Callanan21ef5bb2011-12-01 02:04:16 +0000750 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 +0000751 {
752 SymbolContext sym_ctx;
753 sc_list.GetContextAtIndex(i, sym_ctx);
Sean Callananc7674af2011-01-17 23:42:46 +0000754
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000755 const Address *sym_address = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress();
Sean Callananae9f7482011-07-07 23:05:43 +0000756
757 if (!sym_address || !sym_address->IsValid())
758 return LLDB_INVALID_ADDRESS;
759
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000760 if (sym_address)
761 {
762 switch (sym_ctx.symbol->GetType())
763 {
764 case eSymbolTypeCode:
765 case eSymbolTypeTrampoline:
766 symbol_load_addr = sym_address->GetCallableLoadAddress (&target);
767 break;
768
769 case eSymbolTypeData:
770 case eSymbolTypeRuntime:
771 case eSymbolTypeVariable:
772 case eSymbolTypeLocal:
773 case eSymbolTypeParam:
774 case eSymbolTypeInvalid:
775 case eSymbolTypeAbsolute:
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000776 case eSymbolTypeException:
777 case eSymbolTypeSourceFile:
778 case eSymbolTypeHeaderFile:
779 case eSymbolTypeObjectFile:
780 case eSymbolTypeCommonBlock:
781 case eSymbolTypeBlock:
782 case eSymbolTypeVariableType:
783 case eSymbolTypeLineEntry:
784 case eSymbolTypeLineHeader:
785 case eSymbolTypeScopeBegin:
786 case eSymbolTypeScopeEnd:
787 case eSymbolTypeAdditional:
788 case eSymbolTypeCompiler:
789 case eSymbolTypeInstrumentation:
790 case eSymbolTypeUndefined:
Greg Clayton3f69eac2011-12-03 02:30:59 +0000791 case eSymbolTypeObjCClass:
792 case eSymbolTypeObjCMetaClass:
793 case eSymbolTypeObjCIVar:
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000794 symbol_load_addr = sym_address->GetLoadAddress (&target);
795 break;
796 }
797 }
798 }
Sean Callananc7674af2011-01-17 23:42:46 +0000799
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000800 return symbol_load_addr;
Sean Callananc7674af2011-01-17 23:42:46 +0000801}
802
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000803addr_t
Sean Callanan21ef5bb2011-12-01 02:04:16 +0000804ClangExpressionDeclMap::GetSymbolAddress (const ConstString &name, lldb::SymbolType symbol_type)
Sean Callanan81974962011-05-08 02:21:26 +0000805{
806 assert (m_parser_vars.get());
807
808 if (!m_parser_vars->m_exe_ctx ||
Greg Clayton567e7f32011-09-22 04:58:26 +0000809 !m_parser_vars->m_exe_ctx->GetTargetPtr())
Sean Callanan81974962011-05-08 02:21:26 +0000810 return false;
811
Sean Callanan21ef5bb2011-12-01 02:04:16 +0000812 return GetSymbolAddress(m_parser_vars->m_exe_ctx->GetTargetRef(), name, symbol_type);
Sean Callanan81974962011-05-08 02:21:26 +0000813}
814
Sean Callanan47dc4572011-09-15 02:13:07 +0000815// Interface for IRInterpreter
816
Sean Callanan557ccd62011-10-21 05:18:02 +0000817Value
818ClangExpressionDeclMap::WrapBareAddress (lldb::addr_t addr)
819{
820 Value ret;
821
822 ret.SetContext(Value::eContextTypeInvalid, NULL);
823
824 if (m_parser_vars->m_exe_ctx && m_parser_vars->m_exe_ctx->GetProcessPtr())
825 ret.SetValueType(Value::eValueTypeLoadAddress);
826 else
827 ret.SetValueType(Value::eValueTypeFileAddress);
828
829 ret.GetScalar() = (unsigned long long)addr;
830
831 return ret;
832}
833
Sean Callanan47dc4572011-09-15 02:13:07 +0000834bool
835ClangExpressionDeclMap::WriteTarget (lldb_private::Value &value,
836 const uint8_t *data,
837 size_t length)
838{
839 assert (m_parser_vars.get());
840
841 ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
842
Greg Clayton567e7f32011-09-22 04:58:26 +0000843 Process *process = exe_ctx->GetProcessPtr();
Sean Callanan47dc4572011-09-15 02:13:07 +0000844 if (value.GetContextType() == Value::eContextTypeRegisterInfo)
845 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000846 if (!process)
Sean Callanan47dc4572011-09-15 02:13:07 +0000847 return false;
848
849 RegisterContext *reg_ctx = exe_ctx->GetRegisterContext();
850 RegisterInfo *reg_info = value.GetRegisterInfo();
851
852 if (!reg_ctx)
853 return false;
854
855 lldb_private::RegisterValue reg_value;
856 Error err;
857
Greg Clayton567e7f32011-09-22 04:58:26 +0000858 if (!reg_value.SetFromMemoryData (reg_info, data, length, process->GetByteOrder(), err))
Sean Callanan47dc4572011-09-15 02:13:07 +0000859 return false;
860
861 return reg_ctx->WriteRegister(reg_info, reg_value);
862 }
863 else
864 {
865 switch (value.GetValueType())
866 {
867 default:
868 return false;
869 case Value::eValueTypeFileAddress:
870 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000871 if (!process)
Sean Callanan47dc4572011-09-15 02:13:07 +0000872 return false;
873
Greg Clayton567e7f32011-09-22 04:58:26 +0000874 Target *target = exe_ctx->GetTargetPtr();
Sean Callanan47dc4572011-09-15 02:13:07 +0000875 Address file_addr;
876
Greg Clayton567e7f32011-09-22 04:58:26 +0000877 if (!target->GetImages().ResolveFileAddress((lldb::addr_t)value.GetScalar().ULongLong(), file_addr))
Sean Callanan47dc4572011-09-15 02:13:07 +0000878 return false;
879
Greg Clayton567e7f32011-09-22 04:58:26 +0000880 lldb::addr_t load_addr = file_addr.GetLoadAddress(target);
Sean Callanan47dc4572011-09-15 02:13:07 +0000881
882 Error err;
Greg Clayton567e7f32011-09-22 04:58:26 +0000883 process->WriteMemory(load_addr, data, length, err);
Sean Callanan47dc4572011-09-15 02:13:07 +0000884
885 return err.Success();
886 }
887 case Value::eValueTypeLoadAddress:
888 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000889 if (!process)
Sean Callanan47dc4572011-09-15 02:13:07 +0000890 return false;
891
892 Error err;
Greg Clayton567e7f32011-09-22 04:58:26 +0000893 process->WriteMemory((lldb::addr_t)value.GetScalar().ULongLong(), data, length, err);
Sean Callanan47dc4572011-09-15 02:13:07 +0000894
895 return err.Success();
896 }
897 case Value::eValueTypeHostAddress:
Sean Callanane1301a62011-12-06 03:41:14 +0000898 {
899 if (value.GetScalar().ULongLong() == 0 || data == NULL)
900 return false;
901 memcpy ((void *)value.GetScalar().ULongLong(), data, length);
902 return true;
903 }
Sean Callanan47dc4572011-09-15 02:13:07 +0000904 case Value::eValueTypeScalar:
905 return false;
906 }
907 }
908}
909
910bool
911ClangExpressionDeclMap::ReadTarget (uint8_t *data,
912 lldb_private::Value &value,
913 size_t length)
914{
915 assert (m_parser_vars.get());
916
917 ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
Greg Clayton567e7f32011-09-22 04:58:26 +0000918
919 Process *process = exe_ctx->GetProcessPtr();
920
Sean Callanan47dc4572011-09-15 02:13:07 +0000921 if (value.GetContextType() == Value::eContextTypeRegisterInfo)
922 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000923 if (!process)
Sean Callanan47dc4572011-09-15 02:13:07 +0000924 return false;
925
926 RegisterContext *reg_ctx = exe_ctx->GetRegisterContext();
927 RegisterInfo *reg_info = value.GetRegisterInfo();
928
929 if (!reg_ctx)
930 return false;
931
932 lldb_private::RegisterValue reg_value;
933 Error err;
934
935 if (!reg_ctx->ReadRegister(reg_info, reg_value))
936 return false;
937
Greg Clayton567e7f32011-09-22 04:58:26 +0000938 return reg_value.GetAsMemoryData(reg_info, data, length, process->GetByteOrder(), err);
Sean Callanan47dc4572011-09-15 02:13:07 +0000939 }
940 else
941 {
942 switch (value.GetValueType())
943 {
944 default:
945 return false;
946 case Value::eValueTypeFileAddress:
947 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000948 Target *target = exe_ctx->GetTargetPtr();
949 if (target == NULL)
Sean Callanan47dc4572011-09-15 02:13:07 +0000950 return false;
951
952 Address file_addr;
953
Greg Clayton567e7f32011-09-22 04:58:26 +0000954 if (!target->GetImages().ResolveFileAddress((lldb::addr_t)value.GetScalar().ULongLong(), file_addr))
Sean Callanan47dc4572011-09-15 02:13:07 +0000955 return false;
956
957 Error err;
Greg Clayton567e7f32011-09-22 04:58:26 +0000958 target->ReadMemory(file_addr, true, data, length, err);
Sean Callanan47dc4572011-09-15 02:13:07 +0000959
960 return err.Success();
961 }
962 case Value::eValueTypeLoadAddress:
963 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000964 if (!process)
Sean Callanan47dc4572011-09-15 02:13:07 +0000965 return false;
966
967 Error err;
Greg Clayton567e7f32011-09-22 04:58:26 +0000968 process->ReadMemory((lldb::addr_t)value.GetScalar().ULongLong(), data, length, err);
Sean Callanan47dc4572011-09-15 02:13:07 +0000969
970 return err.Success();
971 }
972 case Value::eValueTypeHostAddress:
Sean Callanan5a55c7a2011-11-18 03:28:09 +0000973 {
974 void *host_addr = (void*)value.GetScalar().ULongLong();
975
976 if (!host_addr)
977 return false;
978
979 memcpy (data, host_addr, length);
Sean Callanan47dc4572011-09-15 02:13:07 +0000980 return true;
Sean Callanan5a55c7a2011-11-18 03:28:09 +0000981 }
Sean Callanan47dc4572011-09-15 02:13:07 +0000982 case Value::eValueTypeScalar:
983 return false;
984 }
985 }
986}
987
988lldb_private::Value
989ClangExpressionDeclMap::LookupDecl (clang::NamedDecl *decl)
990{
991 assert (m_parser_vars.get());
992
993 ExecutionContext exe_ctx = *m_parser_vars->m_exe_ctx;
994
995 ClangExpressionVariableSP expr_var_sp (m_found_entities.GetVariable(decl));
996 ClangExpressionVariableSP persistent_var_sp (m_parser_vars->m_persistent_vars->GetVariable(decl));
Sean Callanan1c38d102011-11-02 23:24:30 +0000997
Sean Callanan47dc4572011-09-15 02:13:07 +0000998 if (expr_var_sp)
999 {
Sean Callanan4a078322011-10-13 00:09:20 +00001000 if (!expr_var_sp->m_parser_vars.get() || !expr_var_sp->m_parser_vars->m_lldb_var)
Sean Callanan6d284ef2011-10-12 22:20:02 +00001001 return Value();
1002
Sean Callanan1c38d102011-11-02 23:24:30 +00001003 bool is_reference = expr_var_sp->m_flags & ClangExpressionVariable::EVTypeIsReference;
1004
Sean Callanan4b3cef02011-10-26 21:20:00 +00001005 std::auto_ptr<Value> value(GetVariableValue(exe_ctx, expr_var_sp->m_parser_vars->m_lldb_var, NULL));
1006
Sean Callanan1c38d102011-11-02 23:24:30 +00001007 if (is_reference && value.get() && value->GetValueType() == Value::eValueTypeLoadAddress)
1008 {
1009 Process *process = m_parser_vars->m_exe_ctx->GetProcessPtr();
1010
1011 if (!process)
1012 return Value();
1013
1014 lldb::addr_t value_addr = value->GetScalar().ULongLong();
1015 Error read_error;
1016 addr_t ref_value = process->ReadPointerFromMemory (value_addr, read_error);
1017
1018 if (!read_error.Success())
1019 return Value();
1020
1021 value->GetScalar() = (unsigned long long)ref_value;
1022 }
1023
Sean Callanan4b3cef02011-10-26 21:20:00 +00001024 if (value.get())
1025 return *value;
1026 else
1027 return Value();
Sean Callanan47dc4572011-09-15 02:13:07 +00001028 }
1029 else if (persistent_var_sp)
1030 {
Sean Callanana8428a42011-09-22 00:41:11 +00001031 if ((persistent_var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference ||
1032 persistent_var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) &&
Sean Callanan86a07da2011-10-22 01:58:08 +00001033 persistent_var_sp->m_live_sp &&
Sean Callananf48de6d2011-12-10 03:12:34 +00001034 ((persistent_var_sp->m_live_sp->GetValue().GetValueType() == Value::eValueTypeLoadAddress &&
1035 m_parser_vars->m_exe_ctx->GetProcessSP() &&
1036 m_parser_vars->m_exe_ctx->GetProcessSP()->IsAlive()) ||
1037 (persistent_var_sp->m_live_sp->GetValue().GetValueType() == Value::eValueTypeFileAddress)))
Sean Callanana8428a42011-09-22 00:41:11 +00001038 {
Sean Callanan4b3cef02011-10-26 21:20:00 +00001039 return persistent_var_sp->m_live_sp->GetValue();
Sean Callanana8428a42011-09-22 00:41:11 +00001040 }
1041 else
1042 {
1043 lldb_private::Value ret;
1044 ret.SetValueType(Value::eValueTypeHostAddress);
1045 ret.SetContext(Value::eContextTypeInvalid, NULL);
1046 ret.GetScalar() = (lldb::addr_t)persistent_var_sp->GetValueBytes();
1047 return ret;
1048 }
Sean Callanan47dc4572011-09-15 02:13:07 +00001049 }
1050 else
1051 {
1052 return Value();
1053 }
1054}
1055
Sean Callanan4b3cef02011-10-26 21:20:00 +00001056Value
1057ClangExpressionDeclMap::GetSpecialValue (const ConstString &name)
1058{
1059 assert(m_parser_vars.get());
1060
1061 if (!m_parser_vars->m_exe_ctx)
1062 return Value();
1063
1064 StackFrame *frame = m_parser_vars->m_exe_ctx->GetFramePtr();
1065
1066 if (!frame)
1067 return Value();
1068
1069 VariableList *vars = frame->GetVariableList(false);
1070
1071 if (!vars)
1072 return Value();
1073
1074 lldb::VariableSP var = vars->FindVariable(name);
1075
1076 if (!var ||
1077 !var->IsInScope(frame) ||
1078 !var->LocationIsValidForFrame (frame))
1079 return Value();
1080
1081 std::auto_ptr<Value> value(GetVariableValue(*m_parser_vars->m_exe_ctx, var, NULL));
1082
Sean Callanan41a410d2011-11-03 22:48:37 +00001083 if (value.get() && value->GetValueType() == Value::eValueTypeLoadAddress)
1084 {
1085 Process *process = m_parser_vars->m_exe_ctx->GetProcessPtr();
1086
1087 if (!process)
1088 return Value();
1089
1090 lldb::addr_t value_addr = value->GetScalar().ULongLong();
1091 Error read_error;
1092 addr_t ptr_value = process->ReadPointerFromMemory (value_addr, read_error);
1093
1094 if (!read_error.Success())
1095 return Value();
1096
1097 value->GetScalar() = (unsigned long long)ptr_value;
1098 }
1099
Sean Callanan4b3cef02011-10-26 21:20:00 +00001100 if (value.get())
1101 return *value;
1102 else
1103 return Value();
1104}
1105
Sean Callanan810f22d2010-07-16 00:09:46 +00001106// Interface for CommandObjectExpression
Sean Callananf328c9f2010-07-20 23:31:16 +00001107
1108bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001109ClangExpressionDeclMap::Materialize
1110(
Sean Callananaa301c42010-12-03 01:38:59 +00001111 ExecutionContext &exe_ctx,
Greg Clayton8de27c72010-10-15 22:48:33 +00001112 lldb::addr_t &struct_address,
1113 Error &err
1114)
Sean Callananf328c9f2010-07-20 23:31:16 +00001115{
Sean Callananaa301c42010-12-03 01:38:59 +00001116 EnableMaterialVars();
1117
Greg Clayton567e7f32011-09-22 04:58:26 +00001118 m_material_vars->m_process = exe_ctx.GetProcessPtr();
Sean Callananaa301c42010-12-03 01:38:59 +00001119
Sean Callanan0ddf8062011-05-09 22:04:36 +00001120 bool result = DoMaterialize(false /* dematerialize */,
1121 exe_ctx,
1122 LLDB_INVALID_ADDRESS /* top of stack frame */,
1123 LLDB_INVALID_ADDRESS /* bottom of stack frame */,
1124 NULL, /* result SP */
1125 err);
Sean Callananf328c9f2010-07-20 23:31:16 +00001126
1127 if (result)
Sean Callananaa301c42010-12-03 01:38:59 +00001128 struct_address = m_material_vars->m_materialized_location;
Sean Callananf328c9f2010-07-20 23:31:16 +00001129
1130 return result;
1131}
1132
1133bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001134ClangExpressionDeclMap::GetObjectPointer
1135(
1136 lldb::addr_t &object_ptr,
Sean Callanan3aa7da52010-12-13 22:46:15 +00001137 ConstString &object_name,
Sean Callananaa301c42010-12-03 01:38:59 +00001138 ExecutionContext &exe_ctx,
Sean Callanan047923c2010-12-14 00:42:36 +00001139 Error &err,
1140 bool suppress_type_check
Greg Clayton8de27c72010-10-15 22:48:33 +00001141)
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001142{
Sean Callananaa301c42010-12-03 01:38:59 +00001143 assert (m_struct_vars.get());
1144
Greg Clayton567e7f32011-09-22 04:58:26 +00001145 Target *target = exe_ctx.GetTargetPtr();
1146 Process *process = exe_ctx.GetProcessPtr();
1147 StackFrame *frame = exe_ctx.GetFramePtr();
1148
1149 if (frame == NULL || process == NULL || target == NULL)
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001150 {
Sean Callanane6ea5fe2011-11-15 02:11:17 +00001151 err.SetErrorStringWithFormat("Couldn't load '%s' because the context is incomplete", object_name.AsCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001152 return false;
1153 }
1154
Sean Callananaa301c42010-12-03 01:38:59 +00001155 if (!m_struct_vars->m_object_pointer_type.GetOpaqueQualType())
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001156 {
Sean Callanane6ea5fe2011-11-15 02:11:17 +00001157 err.SetErrorStringWithFormat("Couldn't load '%s' because its type is unknown", object_name.AsCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001158 return false;
1159 }
1160
Greg Clayton567e7f32011-09-22 04:58:26 +00001161 VariableSP object_ptr_var = FindVariableInScope (*frame,
Sean Callanan696cf5f2011-05-07 01:06:41 +00001162 object_name,
1163 (suppress_type_check ? NULL : &m_struct_vars->m_object_pointer_type));
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001164
1165 if (!object_ptr_var)
1166 {
Sean Callanane6ea5fe2011-11-15 02:11:17 +00001167 err.SetErrorStringWithFormat("Couldn't find '%s' with appropriate type in scope", object_name.AsCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001168 return false;
1169 }
1170
Sean Callananaa301c42010-12-03 01:38:59 +00001171 std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(exe_ctx,
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001172 object_ptr_var,
Sean Callananaa301c42010-12-03 01:38:59 +00001173 NULL));
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001174
1175 if (!location_value.get())
1176 {
Sean Callanan3aa7da52010-12-13 22:46:15 +00001177 err.SetErrorStringWithFormat("Couldn't get the location for '%s'", object_name.GetCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001178 return false;
1179 }
1180
Sean Callanan50339fe2011-03-04 00:23:47 +00001181 switch (location_value->GetValueType())
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001182 {
Sean Callanan50339fe2011-03-04 00:23:47 +00001183 default:
Sean Callanan3aa7da52010-12-13 22:46:15 +00001184 err.SetErrorStringWithFormat("'%s' is not in memory; LLDB must be extended to handle registers", object_name.GetCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001185 return false;
Sean Callanan50339fe2011-03-04 00:23:47 +00001186 case Value::eValueTypeLoadAddress:
1187 {
1188 lldb::addr_t value_addr = location_value->GetScalar().ULongLong();
Greg Clayton567e7f32011-09-22 04:58:26 +00001189 uint32_t address_byte_size = target->GetArchitecture().GetAddressByteSize();
Sean Callanan50339fe2011-03-04 00:23:47 +00001190
1191 if (ClangASTType::GetClangTypeBitWidth(m_struct_vars->m_object_pointer_type.GetASTContext(),
1192 m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) != address_byte_size * 8)
1193 {
1194 err.SetErrorStringWithFormat("'%s' is not of an expected pointer size", object_name.GetCString());
1195 return false;
1196 }
1197
Sean Callanan50339fe2011-03-04 00:23:47 +00001198 Error read_error;
Greg Clayton567e7f32011-09-22 04:58:26 +00001199 object_ptr = process->ReadPointerFromMemory (value_addr, read_error);
Greg Claytonc0fa5332011-05-22 22:46:53 +00001200 if (read_error.Fail() || object_ptr == LLDB_INVALID_ADDRESS)
Sean Callanan50339fe2011-03-04 00:23:47 +00001201 {
1202 err.SetErrorStringWithFormat("Coldn't read '%s' from the target: %s", object_name.GetCString(), read_error.AsCString());
1203 return false;
Greg Claytonc0fa5332011-05-22 22:46:53 +00001204 }
Sean Callanan50339fe2011-03-04 00:23:47 +00001205 return true;
1206 }
1207 case Value::eValueTypeScalar:
1208 {
1209 if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
1210 {
1211 StreamString ss;
1212 location_value->Dump(&ss);
1213
1214 err.SetErrorStringWithFormat("%s is a scalar of unhandled type: %s", object_name.GetCString(), ss.GetString().c_str());
1215 return false;
1216 }
1217
Greg Clayton061b79d2011-05-09 20:18:18 +00001218 RegisterInfo *reg_info = location_value->GetRegisterInfo();
Sean Callanan50339fe2011-03-04 00:23:47 +00001219
Greg Clayton061b79d2011-05-09 20:18:18 +00001220 if (!reg_info)
Sean Callanan50339fe2011-03-04 00:23:47 +00001221 {
1222 err.SetErrorStringWithFormat("Couldn't get the register information for %s", object_name.GetCString());
1223 return false;
1224 }
1225
Greg Clayton061b79d2011-05-09 20:18:18 +00001226 RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
Sean Callanan50339fe2011-03-04 00:23:47 +00001227
Greg Clayton061b79d2011-05-09 20:18:18 +00001228 if (!reg_ctx)
Sean Callanan50339fe2011-03-04 00:23:47 +00001229 {
Greg Clayton061b79d2011-05-09 20:18:18 +00001230 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 +00001231 return false;
1232 }
1233
Greg Clayton061b79d2011-05-09 20:18:18 +00001234 uint32_t register_number = reg_info->kinds[lldb::eRegisterKindLLDB];
Sean Callanan50339fe2011-03-04 00:23:47 +00001235
Greg Clayton061b79d2011-05-09 20:18:18 +00001236 object_ptr = reg_ctx->ReadRegisterAsUnsigned(register_number, 0x0);
Sean Callanan50339fe2011-03-04 00:23:47 +00001237
1238 return true;
1239 }
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001240 }
1241}
1242
1243bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001244ClangExpressionDeclMap::Dematerialize
1245(
Sean Callananaa301c42010-12-03 01:38:59 +00001246 ExecutionContext &exe_ctx,
Greg Clayton427f2902010-12-14 02:59:59 +00001247 ClangExpressionVariableSP &result_sp,
Sean Callanan0ddf8062011-05-09 22:04:36 +00001248 lldb::addr_t stack_frame_top,
1249 lldb::addr_t stack_frame_bottom,
Greg Clayton8de27c72010-10-15 22:48:33 +00001250 Error &err
1251)
Sean Callananf328c9f2010-07-20 23:31:16 +00001252{
Sean Callanan0ddf8062011-05-09 22:04:36 +00001253 return DoMaterialize(true, exe_ctx, stack_frame_top, stack_frame_bottom, &result_sp, err);
Sean Callananaa301c42010-12-03 01:38:59 +00001254
1255 DidDematerialize();
1256}
1257
1258void
1259ClangExpressionDeclMap::DidDematerialize()
1260{
1261 if (m_material_vars.get())
1262 {
1263 if (m_material_vars->m_materialized_location)
1264 {
1265 //#define SINGLE_STEP_EXPRESSIONS
1266
1267#ifndef SINGLE_STEP_EXPRESSIONS
1268 m_material_vars->m_process->DeallocateMemory(m_material_vars->m_materialized_location);
1269#endif
1270 m_material_vars->m_materialized_location = 0;
1271 }
1272
1273 DisableMaterialVars();
1274 }
Sean Callananf328c9f2010-07-20 23:31:16 +00001275}
1276
Sean Callanan32824aa2010-07-23 22:19:18 +00001277bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001278ClangExpressionDeclMap::DumpMaterializedStruct
1279(
Sean Callananaa301c42010-12-03 01:38:59 +00001280 ExecutionContext &exe_ctx,
Greg Clayton8de27c72010-10-15 22:48:33 +00001281 Stream &s,
1282 Error &err
1283)
Sean Callanan32824aa2010-07-23 22:19:18 +00001284{
Sean Callananaa301c42010-12-03 01:38:59 +00001285 assert (m_struct_vars.get());
1286 assert (m_material_vars.get());
1287
1288 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan32824aa2010-07-23 22:19:18 +00001289 {
1290 err.SetErrorString("Structure hasn't been laid out yet");
1291 return false;
1292 }
Greg Clayton567e7f32011-09-22 04:58:26 +00001293 Process *process = exe_ctx.GetProcessPtr();
1294
1295 if (!process)
Sean Callanan32824aa2010-07-23 22:19:18 +00001296 {
1297 err.SetErrorString("Couldn't find the process");
1298 return false;
1299 }
1300
Greg Clayton567e7f32011-09-22 04:58:26 +00001301 Target *target = exe_ctx.GetTargetPtr();
1302 if (!target)
Sean Callanan32824aa2010-07-23 22:19:18 +00001303 {
1304 err.SetErrorString("Couldn't find the target");
1305 return false;
1306 }
1307
Sean Callanan33711022010-12-07 10:00:20 +00001308 if (!m_material_vars->m_materialized_location)
1309 {
1310 err.SetErrorString("No materialized location");
1311 return false;
1312 }
1313
Greg Claytonc0fa5332011-05-22 22:46:53 +00001314 lldb::DataBufferSP data_sp(new DataBufferHeap(m_struct_vars->m_struct_size, 0));
Sean Callanan32824aa2010-07-23 22:19:18 +00001315
1316 Error error;
Greg Clayton567e7f32011-09-22 04:58:26 +00001317 if (process->ReadMemory (m_material_vars->m_materialized_location,
Greg Claytonc0fa5332011-05-22 22:46:53 +00001318 data_sp->GetBytes(),
1319 data_sp->GetByteSize(), error) != data_sp->GetByteSize())
Sean Callanan32824aa2010-07-23 22:19:18 +00001320 {
1321 err.SetErrorStringWithFormat ("Couldn't read struct from the target: %s", error.AsCString());
1322 return false;
1323 }
1324
Greg Clayton567e7f32011-09-22 04:58:26 +00001325 DataExtractor extractor(data_sp, process->GetByteOrder(), target->GetArchitecture().GetAddressByteSize());
Sean Callanan32824aa2010-07-23 22:19:18 +00001326
Greg Clayton427f2902010-12-14 02:59:59 +00001327 for (size_t member_idx = 0, num_members = m_struct_members.GetSize();
1328 member_idx < num_members;
1329 ++member_idx)
Sean Callanan32824aa2010-07-23 22:19:18 +00001330 {
Greg Clayton427f2902010-12-14 02:59:59 +00001331 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_idx));
Sean Callanan32824aa2010-07-23 22:19:18 +00001332
Greg Clayton427f2902010-12-14 02:59:59 +00001333 if (!member_sp)
1334 return false;
1335
1336 s.Printf("[%s]\n", member_sp->GetName().GetCString());
Sean Callanan8c127202010-08-23 23:09:38 +00001337
Greg Clayton427f2902010-12-14 02:59:59 +00001338 if (!member_sp->m_jit_vars.get())
Sean Callanan8c127202010-08-23 23:09:38 +00001339 return false;
1340
Greg Clayton427f2902010-12-14 02:59:59 +00001341 extractor.Dump (&s, // stream
1342 member_sp->m_jit_vars->m_offset, // offset
1343 lldb::eFormatBytesWithASCII, // format
1344 1, // byte size of individual entries
1345 member_sp->m_jit_vars->m_size, // number of entries
1346 16, // entries per line
1347 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, // address to print
1348 0, // bit size (bitfields only; 0 means ignore)
1349 0); // bit alignment (bitfields only; 0 means ignore)
Sean Callanan32824aa2010-07-23 22:19:18 +00001350
1351 s.PutChar('\n');
1352 }
1353
1354 return true;
1355}
1356
Sean Callananf328c9f2010-07-20 23:31:16 +00001357bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001358ClangExpressionDeclMap::DoMaterialize
1359(
1360 bool dematerialize,
Sean Callananaa301c42010-12-03 01:38:59 +00001361 ExecutionContext &exe_ctx,
Sean Callanan0ddf8062011-05-09 22:04:36 +00001362 lldb::addr_t stack_frame_top,
1363 lldb::addr_t stack_frame_bottom,
Greg Clayton427f2902010-12-14 02:59:59 +00001364 lldb::ClangExpressionVariableSP *result_sp_ptr,
Greg Clayton8de27c72010-10-15 22:48:33 +00001365 Error &err
1366)
Sean Callanan810f22d2010-07-16 00:09:46 +00001367{
Greg Clayton427f2902010-12-14 02:59:59 +00001368 if (result_sp_ptr)
1369 result_sp_ptr->reset();
1370
Sean Callananaa301c42010-12-03 01:38:59 +00001371 assert (m_struct_vars.get());
1372
Greg Claytone005f2c2010-11-06 01:53:30 +00001373 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan82b74c82010-08-12 01:56:52 +00001374
Sean Callananaa301c42010-12-03 01:38:59 +00001375 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan810f22d2010-07-16 00:09:46 +00001376 {
1377 err.SetErrorString("Structure hasn't been laid out yet");
Greg Clayton57067a02011-09-13 04:03:52 +00001378 return false;
Sean Callanan810f22d2010-07-16 00:09:46 +00001379 }
1380
Greg Clayton567e7f32011-09-22 04:58:26 +00001381 StackFrame *frame = exe_ctx.GetFramePtr();
1382 if (!frame)
Sean Callanan45839272010-07-24 01:37:44 +00001383 {
1384 err.SetErrorString("Received null execution frame");
Greg Clayton57067a02011-09-13 04:03:52 +00001385 return false;
Sean Callanan45839272010-07-24 01:37:44 +00001386 }
Greg Clayton567e7f32011-09-22 04:58:26 +00001387 Target *target = exe_ctx.GetTargetPtr();
Sean Callanan45839272010-07-24 01:37:44 +00001388
Greg Clayton567e7f32011-09-22 04:58:26 +00001389 ClangPersistentVariables &persistent_vars = target->GetPersistentVariables();
Sean Callananaa301c42010-12-03 01:38:59 +00001390
1391 if (!m_struct_vars->m_struct_size)
Sean Callanane8a59a82010-09-13 21:34:21 +00001392 {
1393 if (log)
1394 log->PutCString("Not bothering to allocate a struct because no arguments are needed");
1395
Sean Callanan9b6898f2011-07-30 02:42:06 +00001396 m_material_vars->m_allocated_area = NULL;
Sean Callanane8a59a82010-09-13 21:34:21 +00001397
1398 return true;
1399 }
1400
Greg Clayton567e7f32011-09-22 04:58:26 +00001401 const SymbolContext &sym_ctx(frame->GetSymbolContext(lldb::eSymbolContextEverything));
Sean Callanan810f22d2010-07-16 00:09:46 +00001402
Sean Callananf328c9f2010-07-20 23:31:16 +00001403 if (!dematerialize)
Sean Callanan810f22d2010-07-16 00:09:46 +00001404 {
Greg Clayton567e7f32011-09-22 04:58:26 +00001405 Process *process = exe_ctx.GetProcessPtr();
Sean Callananaa301c42010-12-03 01:38:59 +00001406 if (m_material_vars->m_materialized_location)
Sean Callananf328c9f2010-07-20 23:31:16 +00001407 {
Greg Clayton567e7f32011-09-22 04:58:26 +00001408 process->DeallocateMemory(m_material_vars->m_materialized_location);
Sean Callananaa301c42010-12-03 01:38:59 +00001409 m_material_vars->m_materialized_location = 0;
Sean Callananf328c9f2010-07-20 23:31:16 +00001410 }
1411
Sean Callanan7a60b942010-10-08 01:58:41 +00001412 if (log)
1413 log->PutCString("Allocating memory for materialized argument struct");
1414
Greg Clayton567e7f32011-09-22 04:58:26 +00001415 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 +00001416 lldb::ePermissionsReadable | lldb::ePermissionsWritable,
1417 err);
Sean Callananf328c9f2010-07-20 23:31:16 +00001418
1419 if (mem == LLDB_INVALID_ADDRESS)
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001420 {
1421 err.SetErrorStringWithFormat("Couldn't allocate 0x%llx bytes for materialized argument struct",
1422 (unsigned long long)(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size));
Sean Callananf328c9f2010-07-20 23:31:16 +00001423 return false;
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001424 }
1425
Sean Callananaa301c42010-12-03 01:38:59 +00001426 m_material_vars->m_allocated_area = mem;
Sean Callanan810f22d2010-07-16 00:09:46 +00001427 }
1428
Sean Callananaa301c42010-12-03 01:38:59 +00001429 m_material_vars->m_materialized_location = m_material_vars->m_allocated_area;
Sean Callananf328c9f2010-07-20 23:31:16 +00001430
Sean Callananaa301c42010-12-03 01:38:59 +00001431 if (m_material_vars->m_materialized_location % m_struct_vars->m_struct_alignment)
1432 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 +00001433
Greg Clayton427f2902010-12-14 02:59:59 +00001434 for (uint64_t member_index = 0, num_members = m_struct_members.GetSize();
Sean Callanan8c127202010-08-23 23:09:38 +00001435 member_index < num_members;
1436 ++member_index)
Sean Callanan810f22d2010-07-16 00:09:46 +00001437 {
Greg Clayton427f2902010-12-14 02:59:59 +00001438 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
Sean Callanan810f22d2010-07-16 00:09:46 +00001439
Greg Claytona875b642011-01-09 21:07:35 +00001440 if (m_found_entities.ContainsVariable (member_sp))
Sean Callanan8c127202010-08-23 23:09:38 +00001441 {
Greg Claytona875b642011-01-09 21:07:35 +00001442 RegisterInfo *reg_info = member_sp->GetRegisterInfo ();
Greg Clayton427f2902010-12-14 02:59:59 +00001443 if (reg_info)
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001444 {
1445 // This is a register variable
1446
Sean Callananaa301c42010-12-03 01:38:59 +00001447 RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001448
1449 if (!reg_ctx)
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001450 {
1451 err.SetErrorString("Couldn't get register context");
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001452 return false;
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001453 }
1454
Greg Clayton427f2902010-12-14 02:59:59 +00001455 if (!DoMaterializeOneRegister (dematerialize,
1456 exe_ctx,
1457 *reg_ctx,
1458 *reg_info,
1459 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
1460 err))
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001461 return false;
1462 }
1463 else
1464 {
Greg Clayton427f2902010-12-14 02:59:59 +00001465 if (!member_sp->m_jit_vars.get())
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001466 {
1467 err.SetErrorString("Variable being materialized doesn't have necessary state");
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001468 return false;
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001469 }
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001470
Greg Clayton427f2902010-12-14 02:59:59 +00001471 if (!DoMaterializeOneVariable (dematerialize,
1472 exe_ctx,
Sean Callanan6a925532011-01-13 08:53:35 +00001473 sym_ctx,
1474 member_sp,
Greg Clayton427f2902010-12-14 02:59:59 +00001475 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
1476 err))
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001477 return false;
1478 }
Sean Callanan8c127202010-08-23 23:09:38 +00001479 }
Sean Callanan8c127202010-08-23 23:09:38 +00001480 else
1481 {
Greg Claytona875b642011-01-09 21:07:35 +00001482 // No need to look for presistent variables if the name doesn't start
1483 // with with a '$' character...
1484 if (member_sp->GetName().AsCString ("!")[0] == '$' && persistent_vars.ContainsVariable(member_sp))
1485 {
Sean Callanan6a925532011-01-13 08:53:35 +00001486
Greg Claytona875b642011-01-09 21:07:35 +00001487 if (member_sp->GetName() == m_struct_vars->m_result_name)
1488 {
Greg Claytona875b642011-01-09 21:07:35 +00001489 if (log)
1490 log->PutCString("Found result member in the struct");
Sean Callanan6a925532011-01-13 08:53:35 +00001491
Greg Claytona875b642011-01-09 21:07:35 +00001492 if (result_sp_ptr)
1493 *result_sp_ptr = member_sp;
Sean Callanan6a925532011-01-13 08:53:35 +00001494
Greg Claytona875b642011-01-09 21:07:35 +00001495 }
1496
1497 if (!DoMaterializeOnePersistentVariable (dematerialize,
Sean Callanan6a925532011-01-13 08:53:35 +00001498 exe_ctx,
Greg Claytona875b642011-01-09 21:07:35 +00001499 member_sp,
Sean Callanan0ddf8062011-05-09 22:04:36 +00001500 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
1501 stack_frame_top,
1502 stack_frame_bottom,
Greg Claytona875b642011-01-09 21:07:35 +00001503 err))
1504 return false;
1505 }
1506 else
1507 {
1508 err.SetErrorStringWithFormat("Unexpected variable %s", member_sp->GetName().GetCString());
1509 return false;
1510 }
Sean Callanan8c127202010-08-23 23:09:38 +00001511 }
Sean Callanan810f22d2010-07-16 00:09:46 +00001512 }
1513
Sean Callananf328c9f2010-07-20 23:31:16 +00001514 return true;
1515}
1516
Sean Callanana48fe162010-08-11 03:57:18 +00001517bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001518ClangExpressionDeclMap::DoMaterializeOnePersistentVariable
1519(
1520 bool dematerialize,
1521 ExecutionContext &exe_ctx,
Greg Clayton427f2902010-12-14 02:59:59 +00001522 ClangExpressionVariableSP &var_sp,
Greg Clayton8de27c72010-10-15 22:48:33 +00001523 lldb::addr_t addr,
Sean Callanan0ddf8062011-05-09 22:04:36 +00001524 lldb::addr_t stack_frame_top,
1525 lldb::addr_t stack_frame_bottom,
Greg Clayton8de27c72010-10-15 22:48:33 +00001526 Error &err
1527)
Sean Callananaa301c42010-12-03 01:38:59 +00001528{
Sean Callanan6a925532011-01-13 08:53:35 +00001529 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1530
Greg Clayton427f2902010-12-14 02:59:59 +00001531 if (!var_sp)
Sean Callanana48fe162010-08-11 03:57:18 +00001532 {
Greg Clayton427f2902010-12-14 02:59:59 +00001533 err.SetErrorString("Invalid persistent variable");
Sean Callanana48fe162010-08-11 03:57:18 +00001534 return LLDB_INVALID_ADDRESS;
1535 }
1536
Greg Clayton427f2902010-12-14 02:59:59 +00001537 const size_t pvar_byte_size = var_sp->GetByteSize();
Sean Callanana6223432010-08-20 01:02:30 +00001538
Greg Clayton427f2902010-12-14 02:59:59 +00001539 uint8_t *pvar_data = var_sp->GetValueBytes();
1540 if (pvar_data == NULL)
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001541 {
1542 err.SetErrorString("Persistent variable being materialized contains no data");
Sean Callanana6223432010-08-20 01:02:30 +00001543 return false;
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001544 }
Sean Callanana6223432010-08-20 01:02:30 +00001545
Sean Callanana48fe162010-08-11 03:57:18 +00001546 Error error;
Greg Clayton567e7f32011-09-22 04:58:26 +00001547 Process *process = exe_ctx.GetProcessPtr();
1548
Sean Callanan6a925532011-01-13 08:53:35 +00001549 lldb::addr_t mem; // The address of a spare memory area used to hold the persistent variable.
1550
Sean Callanana48fe162010-08-11 03:57:18 +00001551 if (dematerialize)
1552 {
Sean Callanan6a925532011-01-13 08:53:35 +00001553 if (log)
1554 log->Printf("Dematerializing persistent variable with flags 0x%hx", var_sp->m_flags);
1555
1556 if ((var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) ||
1557 (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference))
Sean Callanana48fe162010-08-11 03:57:18 +00001558 {
Sean Callanan6a925532011-01-13 08:53:35 +00001559 // Get the location of the target out of the struct.
1560
1561 Error read_error;
Greg Clayton567e7f32011-09-22 04:58:26 +00001562 mem = process->ReadPointerFromMemory (addr, read_error);
Sean Callanan6a925532011-01-13 08:53:35 +00001563
1564 if (mem == LLDB_INVALID_ADDRESS)
1565 {
1566 err.SetErrorStringWithFormat("Couldn't read address of %s from struct: %s", var_sp->GetName().GetCString(), error.AsCString());
1567 return false;
1568 }
1569
1570 if (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference &&
1571 !var_sp->m_live_sp)
1572 {
1573 // If the reference comes from the program, then the ClangExpressionVariable's
1574 // live variable data hasn't been set up yet. Do this now.
1575
Jim Ingham47da8102011-04-22 23:53:53 +00001576 var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope (),
1577 var_sp->GetTypeFromUser().GetASTContext(),
1578 var_sp->GetTypeFromUser().GetOpaqueQualType(),
1579 var_sp->GetName(),
1580 mem,
1581 eAddressTypeLoad,
1582 pvar_byte_size);
Sean Callanan6a925532011-01-13 08:53:35 +00001583 }
1584
1585 if (!var_sp->m_live_sp)
1586 {
1587 err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", var_sp->GetName().GetCString());
1588 return false;
1589 }
1590
Greg Claytonb3448432011-03-24 21:19:54 +00001591 if (var_sp->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
Sean Callanan6a925532011-01-13 08:53:35 +00001592 {
1593 err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", var_sp->GetName().GetCString());
1594 return false;
1595 }
1596
Sean Callanan97678d12011-01-13 21:23:32 +00001597 if (var_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry ||
1598 var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
Sean Callanan6a925532011-01-13 08:53:35 +00001599 {
1600 mem = var_sp->m_live_sp->GetValue().GetScalar().ULongLong();
1601
1602 if (log)
1603 log->Printf("Dematerializing %s from 0x%llx", var_sp->GetName().GetCString(), (uint64_t)mem);
1604
1605 // Read the contents of the spare memory area
Sean Callanan0ddf8062011-05-09 22:04:36 +00001606
Sean Callanan6a925532011-01-13 08:53:35 +00001607 var_sp->ValueUpdated ();
Greg Clayton567e7f32011-09-22 04:58:26 +00001608 if (process->ReadMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
Sean Callanan6a925532011-01-13 08:53:35 +00001609 {
1610 err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString());
1611 return false;
1612 }
1613
Sean Callanan0ddf8062011-05-09 22:04:36 +00001614 if (stack_frame_top != LLDB_INVALID_ADDRESS &&
1615 stack_frame_bottom != LLDB_INVALID_ADDRESS &&
1616 mem >= stack_frame_bottom &&
1617 mem <= stack_frame_top)
1618 {
1619 // If the variable is resident in the stack frame created by the expression,
1620 // then it cannot be relied upon to stay around. We treat it as needing
1621 // reallocation.
1622
1623 var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
1624 var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
1625 var_sp->m_flags &= ~ClangExpressionVariable::EVIsProgramReference;
1626 }
1627
Sean Callanan6a925532011-01-13 08:53:35 +00001628 var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsFreezeDry;
1629 }
1630
1631 if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation &&
1632 !(var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget))
1633 {
1634 if (m_keep_result_in_memory)
1635 {
1636 var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget;
1637 }
1638 else
1639 {
Greg Clayton567e7f32011-09-22 04:58:26 +00001640 Error deallocate_error = process->DeallocateMemory(mem);
Sean Callanan6a925532011-01-13 08:53:35 +00001641
1642 if (!err.Success())
1643 {
1644 err.SetErrorStringWithFormat ("Couldn't deallocate memory for %s: %s", var_sp->GetName().GetCString(), deallocate_error.AsCString());
1645 return false;
1646 }
1647 }
1648 }
1649 }
1650 else
1651 {
1652 err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
Sean Callanana48fe162010-08-11 03:57:18 +00001653 return false;
1654 }
1655 }
1656 else
1657 {
Sean Callanan6a925532011-01-13 08:53:35 +00001658 if (log)
1659 log->Printf("Materializing persistent variable with flags 0x%hx", var_sp->m_flags);
1660
1661 if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation)
Sean Callanana48fe162010-08-11 03:57:18 +00001662 {
Sean Callanan6a925532011-01-13 08:53:35 +00001663 // Allocate a spare memory area to store the persistent variable's contents.
1664
1665 Error allocate_error;
1666
Greg Clayton567e7f32011-09-22 04:58:26 +00001667 mem = process->AllocateMemory(pvar_byte_size,
Sean Callanan4b3cef02011-10-26 21:20:00 +00001668 lldb::ePermissionsReadable | lldb::ePermissionsWritable,
1669 allocate_error);
Sean Callanan6a925532011-01-13 08:53:35 +00001670
1671 if (mem == LLDB_INVALID_ADDRESS)
1672 {
1673 err.SetErrorStringWithFormat("Couldn't allocate a memory area to store %s: %s", var_sp->GetName().GetCString(), allocate_error.AsCString());
1674 return false;
1675 }
1676
1677 if (log)
1678 log->Printf("Allocated %s (0x%llx) sucessfully", var_sp->GetName().GetCString(), mem);
1679
1680 // Put the location of the spare memory into the live data of the ValueObject.
1681
Jim Ingham47da8102011-04-22 23:53:53 +00001682 var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
1683 var_sp->GetTypeFromUser().GetASTContext(),
1684 var_sp->GetTypeFromUser().GetOpaqueQualType(),
1685 var_sp->GetName(),
1686 mem,
1687 eAddressTypeLoad,
1688 pvar_byte_size);
Sean Callanan6a925532011-01-13 08:53:35 +00001689
1690 // Clear the flag if the variable will never be deallocated.
1691
1692 if (var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
1693 var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsAllocation;
1694
1695 // Write the contents of the variable to the area.
1696
Greg Clayton567e7f32011-09-22 04:58:26 +00001697 if (process->WriteMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
Sean Callanan6a925532011-01-13 08:53:35 +00001698 {
1699 err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString());
1700 return false;
1701 }
1702 }
1703
1704 if ((var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && var_sp->m_live_sp) ||
1705 var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated)
1706 {
Sean Callanan6a925532011-01-13 08:53:35 +00001707 // Now write the location of the area into the struct.
Sean Callanan6a925532011-01-13 08:53:35 +00001708 Error write_error;
Greg Clayton567e7f32011-09-22 04:58:26 +00001709 if (!process->WriteScalarToMemory (addr,
Sean Callanan4b3cef02011-10-26 21:20:00 +00001710 var_sp->m_live_sp->GetValue().GetScalar(),
1711 process->GetAddressByteSize(),
1712 write_error))
Sean Callanan6a925532011-01-13 08:53:35 +00001713 {
1714 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", var_sp->GetName().GetCString(), write_error.AsCString());
1715 return false;
1716 }
1717
1718 if (log)
Greg Claytonc0fa5332011-05-22 22:46:53 +00001719 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 +00001720 }
Sean Callanan696cf5f2011-05-07 01:06:41 +00001721 else if (!(var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference))
Sean Callanan6a925532011-01-13 08:53:35 +00001722 {
1723 err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
Sean Callanana48fe162010-08-11 03:57:18 +00001724 return false;
1725 }
1726 }
1727
1728 return true;
1729}
1730
Sean Callananf328c9f2010-07-20 23:31:16 +00001731bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001732ClangExpressionDeclMap::DoMaterializeOneVariable
1733(
1734 bool dematerialize,
1735 ExecutionContext &exe_ctx,
1736 const SymbolContext &sym_ctx,
Sean Callanan6a925532011-01-13 08:53:35 +00001737 ClangExpressionVariableSP &expr_var,
Greg Clayton8de27c72010-10-15 22:48:33 +00001738 lldb::addr_t addr,
1739 Error &err
1740)
Sean Callananf328c9f2010-07-20 23:31:16 +00001741{
Greg Claytone005f2c2010-11-06 01:53:30 +00001742 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Greg Clayton567e7f32011-09-22 04:58:26 +00001743 Target *target = exe_ctx.GetTargetPtr();
1744 Process *process = exe_ctx.GetProcessPtr();
1745 StackFrame *frame = exe_ctx.GetFramePtr();
1746
Sean Callanan6d284ef2011-10-12 22:20:02 +00001747 if (!frame || !process || !target || !m_parser_vars.get() || !expr_var->m_parser_vars.get())
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001748 {
1749 err.SetErrorString("Necessary state for variable materialization isn't present");
Sean Callanancc074622010-09-14 21:59:34 +00001750 return false;
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001751 }
Sean Callanancc074622010-09-14 21:59:34 +00001752
Sean Callanan6a925532011-01-13 08:53:35 +00001753 // Vital information about the value
1754
1755 const ConstString &name(expr_var->GetName());
1756 TypeFromUser type(expr_var->GetTypeFromUser());
1757
Sean Callanan4a078322011-10-13 00:09:20 +00001758 VariableSP &var(expr_var->m_parser_vars->m_lldb_var);
1759 lldb_private::Symbol *sym(expr_var->m_parser_vars->m_lldb_sym);
Sean Callananf328c9f2010-07-20 23:31:16 +00001760
Sean Callanan6f3bde72011-10-27 19:41:13 +00001761 bool is_reference(expr_var->m_flags & ClangExpressionVariable::EVTypeIsReference);
1762
Sean Callanan81974962011-05-08 02:21:26 +00001763 std::auto_ptr<lldb_private::Value> location_value;
Sean Callanan4a078322011-10-13 00:09:20 +00001764
Sean Callanan81974962011-05-08 02:21:26 +00001765 if (var)
1766 {
1767 location_value.reset(GetVariableValue(exe_ctx,
1768 var,
1769 NULL));
1770 }
1771 else if (sym)
Sean Callanan4a078322011-10-13 00:09:20 +00001772 {
Sean Callanan21ef5bb2011-12-01 02:04:16 +00001773 addr_t location_load_addr = GetSymbolAddress(*target, name, lldb::eSymbolTypeAny);
Sean Callanan81974962011-05-08 02:21:26 +00001774
Greg Claytoncbc07cf2011-06-23 04:25:29 +00001775 if (location_load_addr == LLDB_INVALID_ADDRESS)
Sean Callanan81974962011-05-08 02:21:26 +00001776 {
1777 if (log)
Greg Claytonc0fa5332011-05-22 22:46:53 +00001778 err.SetErrorStringWithFormat ("Couldn't find value for global symbol %s",
1779 name.GetCString());
Sean Callanan81974962011-05-08 02:21:26 +00001780 }
1781
Sean Callanan4a078322011-10-13 00:09:20 +00001782 location_value.reset(new Value);
1783
Sean Callanan81974962011-05-08 02:21:26 +00001784 location_value->SetValueType(Value::eValueTypeLoadAddress);
1785 location_value->GetScalar() = location_load_addr;
1786 }
1787 else
Sean Callananf328c9f2010-07-20 23:31:16 +00001788 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001789 err.SetErrorStringWithFormat ("Couldn't find %s with appropriate type",
1790 name.GetCString());
Sean Callananf328c9f2010-07-20 23:31:16 +00001791 return false;
1792 }
1793
Sean Callanan841026f2010-07-23 00:16:21 +00001794 if (log)
Sean Callananfb3058e2011-05-12 23:54:16 +00001795 {
1796 StreamString my_stream_string;
1797
1798 ClangASTType::DumpTypeDescription (type.GetASTContext(),
1799 type.GetOpaqueQualType(),
1800 &my_stream_string);
1801
Greg Claytonc0fa5332011-05-22 22:46:53 +00001802 log->Printf ("%s %s with type %s",
1803 dematerialize ? "Dematerializing" : "Materializing",
1804 name.GetCString(),
1805 my_stream_string.GetString().c_str());
Sean Callananfb3058e2011-05-12 23:54:16 +00001806 }
Sean Callananf328c9f2010-07-20 23:31:16 +00001807
1808 if (!location_value.get())
1809 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001810 err.SetErrorStringWithFormat("Couldn't get value for %s", name.GetCString());
Sean Callananf328c9f2010-07-20 23:31:16 +00001811 return false;
1812 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001813
1814 // The size of the type contained in addr
Sean Callananf328c9f2010-07-20 23:31:16 +00001815
Sean Callanan6a925532011-01-13 08:53:35 +00001816 size_t value_bit_size = ClangASTType::GetClangTypeBitWidth(type.GetASTContext(), type.GetOpaqueQualType());
1817 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 +00001818
1819 Value::ValueType value_type = location_value->GetValueType();
1820
1821 switch (value_type)
Sean Callananf328c9f2010-07-20 23:31:16 +00001822 {
Sean Callanan17c6a052010-10-05 20:18:48 +00001823 default:
Sean Callananf328c9f2010-07-20 23:31:16 +00001824 {
Sean Callanan17c6a052010-10-05 20:18:48 +00001825 StreamString ss;
1826
1827 location_value->Dump(&ss);
1828
Greg Claytonc0fa5332011-05-22 22:46:53 +00001829 err.SetErrorStringWithFormat ("%s has a value of unhandled type: %s",
1830 name.GetCString(),
1831 ss.GetString().c_str());
Sean Callananf328c9f2010-07-20 23:31:16 +00001832 return false;
1833 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001834 break;
1835 case Value::eValueTypeLoadAddress:
Sean Callananf328c9f2010-07-20 23:31:16 +00001836 {
Sean Callanan6a925532011-01-13 08:53:35 +00001837 if (!dematerialize)
Sean Callanan17c6a052010-10-05 20:18:48 +00001838 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001839 Error write_error;
Sean Callanan6a925532011-01-13 08:53:35 +00001840
Sean Callanan6f3bde72011-10-27 19:41:13 +00001841 if (is_reference)
Sean Callanan6a925532011-01-13 08:53:35 +00001842 {
Sean Callanan6f3bde72011-10-27 19:41:13 +00001843 Error read_error;
1844
1845 addr_t ref_value = process->ReadPointerFromMemory(location_value->GetScalar().ULongLong(), read_error);
1846
1847 if (!read_error.Success())
1848 {
1849 err.SetErrorStringWithFormat ("Couldn't read reference to %s from the target: %s",
1850 name.GetCString(),
1851 read_error.AsCString());
1852 return false;
1853 }
1854
1855 if (!process->WritePointerToMemory(addr,
1856 ref_value,
1857 write_error))
1858 {
1859 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
1860 name.GetCString(),
1861 write_error.AsCString());
1862 return false;
1863 }
1864 }
1865 else
1866 {
1867 if (!process->WriteScalarToMemory (addr,
1868 location_value->GetScalar(),
1869 process->GetAddressByteSize(),
1870 write_error))
1871 {
1872 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
1873 name.GetCString(),
1874 write_error.AsCString());
1875 return false;
1876 }
Sean Callanan6a925532011-01-13 08:53:35 +00001877 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001878 }
Sean Callananf328c9f2010-07-20 23:31:16 +00001879 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001880 break;
1881 case Value::eValueTypeScalar:
1882 {
Greg Clayton6916e352010-11-13 03:52:47 +00001883 if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
Sean Callanan17c6a052010-10-05 20:18:48 +00001884 {
1885 StreamString ss;
Sean Callanan17c6a052010-10-05 20:18:48 +00001886 location_value->Dump(&ss);
1887
Greg Claytonc0fa5332011-05-22 22:46:53 +00001888 err.SetErrorStringWithFormat ("%s is a scalar of unhandled type: %s",
1889 name.GetCString(),
1890 ss.GetString().c_str());
Sean Callanan17c6a052010-10-05 20:18:48 +00001891 return false;
1892 }
1893
Greg Clayton061b79d2011-05-09 20:18:18 +00001894 RegisterInfo *reg_info = location_value->GetRegisterInfo();
Sean Callanan17c6a052010-10-05 20:18:48 +00001895
Greg Clayton061b79d2011-05-09 20:18:18 +00001896 if (!reg_info)
Sean Callanan17c6a052010-10-05 20:18:48 +00001897 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001898 err.SetErrorStringWithFormat ("Couldn't get the register information for %s",
1899 name.GetCString());
Sean Callanan17c6a052010-10-05 20:18:48 +00001900 return false;
1901 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001902
Greg Clayton061b79d2011-05-09 20:18:18 +00001903 RegisterValue reg_value;
1904
1905 RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
1906
1907 if (!reg_ctx)
Sean Callanan17c6a052010-10-05 20:18:48 +00001908 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001909 err.SetErrorStringWithFormat ("Couldn't read register context to read %s from %s",
1910 name.GetCString(),
1911 reg_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001912 return false;
1913 }
1914
Greg Clayton061b79d2011-05-09 20:18:18 +00001915 uint32_t register_byte_size = reg_info->byte_size;
Sean Callanan17c6a052010-10-05 20:18:48 +00001916
1917 if (dematerialize)
1918 {
Sean Callanan6f3bde72011-10-27 19:41:13 +00001919 if (is_reference)
1920 return true; // reference types don't need demateralizing
1921
Sean Callanan6a925532011-01-13 08:53:35 +00001922 // Get the location of the spare memory area out of the variable's live data.
1923
1924 if (!expr_var->m_live_sp)
1925 {
1926 err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", name.GetCString());
1927 return false;
1928 }
1929
Greg Claytonb3448432011-03-24 21:19:54 +00001930 if (expr_var->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
Sean Callanan6a925532011-01-13 08:53:35 +00001931 {
1932 err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", name.GetCString());
1933 return false;
1934 }
1935
Greg Claytonc0fa5332011-05-22 22:46:53 +00001936 Scalar &reg_addr = expr_var->m_live_sp->GetValue().GetScalar();
Sean Callanan6a925532011-01-13 08:53:35 +00001937
Greg Claytonc0fa5332011-05-22 22:46:53 +00001938 err = reg_ctx->ReadRegisterValueFromMemory (reg_info,
1939 reg_addr.ULongLong(),
1940 value_byte_size,
1941 reg_value);
Greg Clayton061b79d2011-05-09 20:18:18 +00001942 if (err.Fail())
Sean Callanan17c6a052010-10-05 20:18:48 +00001943 return false;
Greg Clayton061b79d2011-05-09 20:18:18 +00001944
1945 if (!reg_ctx->WriteRegister (reg_info, reg_value))
Sean Callanan17c6a052010-10-05 20:18:48 +00001946 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001947 err.SetErrorStringWithFormat ("Couldn't write %s to register %s",
1948 name.GetCString(),
1949 reg_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001950 return false;
1951 }
Sean Callanan6a925532011-01-13 08:53:35 +00001952
1953 // Deallocate the spare area and clear the variable's live data.
1954
Greg Clayton567e7f32011-09-22 04:58:26 +00001955 Error deallocate_error = process->DeallocateMemory(reg_addr.ULongLong());
Sean Callanan6a925532011-01-13 08:53:35 +00001956
1957 if (!deallocate_error.Success())
1958 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001959 err.SetErrorStringWithFormat ("Couldn't deallocate spare memory area for %s: %s",
1960 name.GetCString(),
1961 deallocate_error.AsCString());
Sean Callanan6a925532011-01-13 08:53:35 +00001962 return false;
1963 }
1964
1965 expr_var->m_live_sp.reset();
Sean Callanan17c6a052010-10-05 20:18:48 +00001966 }
1967 else
1968 {
Sean Callanan6f3bde72011-10-27 19:41:13 +00001969 Error write_error;
1970
1971 RegisterValue reg_value;
1972
1973 if (!reg_ctx->ReadRegister (reg_info, reg_value))
1974 {
1975 err.SetErrorStringWithFormat ("Couldn't read %s from %s",
1976 name.GetCString(),
1977 reg_info->name);
1978 return false;
1979 }
1980
1981 if (is_reference)
1982 {
1983 write_error = reg_ctx->WriteRegisterValueToMemory(reg_info,
1984 addr,
1985 process->GetAddressByteSize(),
1986 reg_value);
1987
1988 if (!write_error.Success())
1989 {
1990 err.SetErrorStringWithFormat ("Couldn't write %s from register %s to the target: %s",
1991 name.GetCString(),
1992 reg_info->name,
1993 write_error.AsCString());
1994 return false;
1995 }
1996
1997 return true;
1998 }
1999
Sean Callanan6a925532011-01-13 08:53:35 +00002000 // Allocate a spare memory area to place the register's contents into. This memory area will be pointed to by the slot in the
2001 // struct.
2002
2003 Error allocate_error;
2004
Greg Clayton567e7f32011-09-22 04:58:26 +00002005 Scalar reg_addr (process->AllocateMemory (value_byte_size,
Sean Callanan6f3bde72011-10-27 19:41:13 +00002006 lldb::ePermissionsReadable | lldb::ePermissionsWritable,
2007 allocate_error));
Sean Callanan6a925532011-01-13 08:53:35 +00002008
Greg Claytonc0fa5332011-05-22 22:46:53 +00002009 if (reg_addr.ULongLong() == LLDB_INVALID_ADDRESS)
Sean Callanan6a925532011-01-13 08:53:35 +00002010 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00002011 err.SetErrorStringWithFormat ("Couldn't allocate a memory area to store %s: %s",
2012 name.GetCString(),
2013 allocate_error.AsCString());
Sean Callanan6a925532011-01-13 08:53:35 +00002014 return false;
2015 }
2016
2017 // Put the location of the spare memory into the live data of the ValueObject.
2018
Jim Ingham47da8102011-04-22 23:53:53 +00002019 expr_var->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
2020 type.GetASTContext(),
2021 type.GetOpaqueQualType(),
2022 name,
Greg Claytonc0fa5332011-05-22 22:46:53 +00002023 reg_addr.ULongLong(),
Jim Ingham47da8102011-04-22 23:53:53 +00002024 eAddressTypeLoad,
2025 value_byte_size);
Sean Callanan6a925532011-01-13 08:53:35 +00002026
2027 // Now write the location of the area into the struct.
Sean Callanan6f3bde72011-10-27 19:41:13 +00002028
Greg Clayton567e7f32011-09-22 04:58:26 +00002029 if (!process->WriteScalarToMemory (addr,
Sean Callanan6f3bde72011-10-27 19:41:13 +00002030 reg_addr,
2031 process->GetAddressByteSize(),
2032 write_error))
Sean Callanan6a925532011-01-13 08:53:35 +00002033 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00002034 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
2035 name.GetCString(),
2036 write_error.AsCString());
Sean Callanan6a925532011-01-13 08:53:35 +00002037 return false;
2038 }
2039
Sean Callanan6a925532011-01-13 08:53:35 +00002040 if (value_byte_size > register_byte_size)
Sean Callanan17c6a052010-10-05 20:18:48 +00002041 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00002042 err.SetErrorStringWithFormat ("%s is too big to store in %s",
2043 name.GetCString(),
2044 reg_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00002045 return false;
2046 }
Greg Clayton061b79d2011-05-09 20:18:18 +00002047
Greg Clayton061b79d2011-05-09 20:18:18 +00002048 if (!reg_ctx->ReadRegister (reg_info, reg_value))
Sean Callanan17c6a052010-10-05 20:18:48 +00002049 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00002050 err.SetErrorStringWithFormat ("Couldn't read %s from %s",
2051 name.GetCString(),
2052 reg_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00002053 return false;
2054 }
2055
Greg Claytonc0fa5332011-05-22 22:46:53 +00002056 err = reg_ctx->WriteRegisterValueToMemory (reg_info,
2057 reg_addr.ULongLong(),
2058 value_byte_size,
2059 reg_value);
Greg Clayton061b79d2011-05-09 20:18:18 +00002060 if (err.Fail())
Sean Callanan17c6a052010-10-05 20:18:48 +00002061 return false;
Sean Callanan17c6a052010-10-05 20:18:48 +00002062 }
2063 }
Sean Callananf328c9f2010-07-20 23:31:16 +00002064 }
2065
2066 return true;
Sean Callanan810f22d2010-07-16 00:09:46 +00002067}
2068
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002069bool
2070ClangExpressionDeclMap::DoMaterializeOneRegister
2071(
2072 bool dematerialize,
2073 ExecutionContext &exe_ctx,
2074 RegisterContext &reg_ctx,
Greg Claytonb3448432011-03-24 21:19:54 +00002075 const RegisterInfo &reg_info,
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002076 lldb::addr_t addr,
2077 Error &err
2078)
2079{
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002080 uint32_t register_byte_size = reg_info.byte_size;
Greg Clayton061b79d2011-05-09 20:18:18 +00002081 RegisterValue reg_value;
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002082 if (dematerialize)
2083 {
Greg Clayton061b79d2011-05-09 20:18:18 +00002084 Error read_error (reg_ctx.ReadRegisterValueFromMemory(&reg_info, addr, register_byte_size, reg_value));
2085 if (read_error.Fail())
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002086 {
Greg Claytonbdcb6ab2011-01-25 23:55:37 +00002087 err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", reg_info.name, read_error.AsCString());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002088 return false;
2089 }
2090
Greg Clayton061b79d2011-05-09 20:18:18 +00002091 if (!reg_ctx.WriteRegister (&reg_info, reg_value))
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002092 {
Greg Clayton061b79d2011-05-09 20:18:18 +00002093 err.SetErrorStringWithFormat("Couldn't write register %s (dematerialize)", reg_info.name);
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002094 return false;
2095 }
2096 }
2097 else
2098 {
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002099
Greg Clayton061b79d2011-05-09 20:18:18 +00002100 if (!reg_ctx.ReadRegister(&reg_info, reg_value))
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002101 {
Greg Clayton061b79d2011-05-09 20:18:18 +00002102 err.SetErrorStringWithFormat("Couldn't read %s (materialize)", reg_info.name);
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002103 return false;
2104 }
2105
Greg Clayton061b79d2011-05-09 20:18:18 +00002106 Error write_error (reg_ctx.WriteRegisterValueToMemory(&reg_info, addr, register_byte_size, reg_value));
2107 if (write_error.Fail())
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002108 {
Jason Molenda95b7b432011-09-20 00:26:08 +00002109 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", reg_info.name, write_error.AsCString());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002110 return false;
2111 }
2112 }
2113
2114 return true;
2115}
2116
Sean Callanan696cf5f2011-05-07 01:06:41 +00002117lldb::VariableSP
Greg Clayton8de27c72010-10-15 22:48:33 +00002118ClangExpressionDeclMap::FindVariableInScope
2119(
2120 StackFrame &frame,
2121 const ConstString &name,
2122 TypeFromUser *type
2123)
Sean Callananaa301c42010-12-03 01:38:59 +00002124{
Greg Claytone005f2c2010-11-06 01:53:30 +00002125 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanancc074622010-09-14 21:59:34 +00002126
Sean Callananf8b468e2011-08-06 00:28:14 +00002127 ValueObjectSP valobj;
2128 VariableSP var_sp;
2129 Error err;
Sean Callanancc074622010-09-14 21:59:34 +00002130
Sean Callananf8b468e2011-08-06 00:28:14 +00002131 valobj = frame.GetValueForVariableExpressionPath(name.GetCString(),
2132 eNoDynamicValues,
2133 StackFrame::eExpressionPathOptionCheckPtrVsMember,
2134 var_sp,
2135 err);
Greg Clayton3bc52d02010-11-14 22:13:40 +00002136
Sean Callananf8b468e2011-08-06 00:28:14 +00002137 if (!err.Success() ||
2138 !var_sp ||
Sean Callananae9f7482011-07-07 23:05:43 +00002139 !var_sp->IsInScope(&frame) ||
2140 !var_sp->LocationIsValidForFrame (&frame))
2141 return lldb::VariableSP();
Greg Clayton3bc52d02010-11-14 22:13:40 +00002142
2143 if (var_sp && type)
2144 {
2145 if (type->GetASTContext() == var_sp->GetType()->GetClangAST())
2146 {
Greg Clayton04c9c7b2011-02-16 23:00:21 +00002147 if (!ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType()))
Sean Callanan696cf5f2011-05-07 01:06:41 +00002148 return lldb::VariableSP();
Greg Clayton3bc52d02010-11-14 22:13:40 +00002149 }
2150 else
2151 {
2152 if (log)
2153 log->PutCString("Skipping a candidate variable because of different AST contexts");
Sean Callanan696cf5f2011-05-07 01:06:41 +00002154 return lldb::VariableSP();
Greg Clayton3bc52d02010-11-14 22:13:40 +00002155 }
Sean Callanancc074622010-09-14 21:59:34 +00002156 }
Greg Clayton3bc52d02010-11-14 22:13:40 +00002157
Sean Callanan696cf5f2011-05-07 01:06:41 +00002158 return var_sp;
Sean Callanancc074622010-09-14 21:59:34 +00002159}
Sean Callanan336a0002010-07-17 00:43:37 +00002160
Sean Callanan81974962011-05-08 02:21:26 +00002161Symbol *
2162ClangExpressionDeclMap::FindGlobalDataSymbol
2163(
2164 Target &target,
Sean Callananaa4a5532011-10-13 16:49:47 +00002165 const ConstString &name
Sean Callanan81974962011-05-08 02:21:26 +00002166)
2167{
2168 SymbolContextList sc_list;
2169
Sean Callananaa4a5532011-10-13 16:49:47 +00002170 target.GetImages().FindSymbolsWithNameAndType(name,
2171 eSymbolTypeData,
2172 sc_list);
Sean Callanan81974962011-05-08 02:21:26 +00002173
2174 if (sc_list.GetSize())
2175 {
2176 SymbolContext sym_ctx;
2177 sc_list.GetContextAtIndex(0, sym_ctx);
2178
2179 return sym_ctx.symbol;
2180 }
2181
2182 return NULL;
2183}
2184
Sean Callanan47dc4572011-09-15 02:13:07 +00002185lldb::VariableSP
2186ClangExpressionDeclMap::FindGlobalVariable
2187(
2188 Target &target,
Sean Callanan94cd0ca2011-10-12 16:59:31 +00002189 ModuleSP &module,
2190 const ConstString &name,
2191 ClangNamespaceDecl *namespace_decl,
Sean Callanan47dc4572011-09-15 02:13:07 +00002192 TypeFromUser *type
2193)
2194{
2195 VariableList vars;
Sean Callanan47dc4572011-09-15 02:13:07 +00002196
Sean Callanan94cd0ca2011-10-12 16:59:31 +00002197 if (module && namespace_decl)
2198 module->FindGlobalVariables (name, namespace_decl, true, -1, vars);
2199 else
2200 target.GetImages().FindGlobalVariables(name, true, -1, vars);
Sean Callanan47dc4572011-09-15 02:13:07 +00002201
2202 if (vars.GetSize())
2203 {
2204 if (type)
2205 {
2206 for (size_t i = 0; i < vars.GetSize(); ++i)
2207 {
2208 VariableSP var_sp = vars.GetVariableAtIndex(i);
2209
2210 if (type->GetASTContext() == var_sp->GetType()->GetClangAST())
2211 {
2212 if (ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType()))
2213 return var_sp;
2214 }
2215 }
2216 }
2217 else
2218 {
2219 return vars.GetVariableAtIndex(0);
2220 }
2221 }
2222
2223 return VariableSP();
2224}
2225
Chris Lattner24943d22010-06-08 16:52:24 +00002226// Interface for ClangASTSource
Sean Callanan47dc4572011-09-15 02:13:07 +00002227
Sean Callanan16b53ab2011-10-12 00:12:34 +00002228void
Sean Callananf76afff2011-10-28 23:38:38 +00002229ClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context)
Chris Lattner24943d22010-06-08 16:52:24 +00002230{
Sean Callananf76afff2011-10-28 23:38:38 +00002231 assert (m_ast_context);
2232
2233 const ConstString name(context.m_decl_name.getAsString().c_str());
2234
Greg Claytone005f2c2010-11-06 01:53:30 +00002235 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Chris Lattner24943d22010-06-08 16:52:24 +00002236
Sean Callanan9394b5a2011-10-29 19:50:43 +00002237 if (GetImportInProgress())
Sean Callananee8fc722010-11-19 20:20:02 +00002238 {
Sean Callanan67bbb112011-10-14 20:34:21 +00002239 if (log && log->GetVerbose())
Sean Callananee8fc722010-11-19 20:20:02 +00002240 log->Printf("Ignoring a query during an import");
2241 return;
2242 }
Greg Claytone6d72ca2011-06-25 00:44:06 +00002243
Sean Callanan67bbb112011-10-14 20:34:21 +00002244 static unsigned int invocation_id = 0;
2245 unsigned int current_id = invocation_id++;
2246
Sean Callanan16b53ab2011-10-12 00:12:34 +00002247 if (log)
2248 {
2249 if (!context.m_decl_context)
Sean Callanan9394b5a2011-10-29 19:50:43 +00002250 log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in a NULL DeclContext", current_id, name.GetCString());
Sean Callanan16b53ab2011-10-12 00:12:34 +00002251 else if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context.m_decl_context))
Sean Callanan9394b5a2011-10-29 19:50:43 +00002252 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 +00002253 else
Sean Callanan9394b5a2011-10-29 19:50:43 +00002254 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 +00002255 }
Sean Callanan9394b5a2011-10-29 19:50:43 +00002256
Sean Callanan16b53ab2011-10-12 00:12:34 +00002257 if (const NamespaceDecl *namespace_context = dyn_cast<NamespaceDecl>(context.m_decl_context))
2258 {
Sean Callanan73b520f2011-10-29 01:58:46 +00002259 ClangASTImporter::NamespaceMapSP namespace_map = m_ast_importer->GetNamespaceMap(namespace_context);
Sean Callanana7597062011-10-13 21:08:11 +00002260
Sean Callanan67bbb112011-10-14 20:34:21 +00002261 if (log && log->GetVerbose())
Sean Callanan5a55c7a2011-11-18 03:28:09 +00002262 log->Printf(" CEDM::FEVD[%u] Inspecting (NamespaceMap*)%p (%d entries)",
Sean Callanan67bbb112011-10-14 20:34:21 +00002263 current_id,
2264 namespace_map.get(),
2265 (int)namespace_map->size());
Sean Callanana7597062011-10-13 21:08:11 +00002266
Sean Callanana7cb1fa2011-10-21 22:18:07 +00002267 if (!namespace_map)
2268 return;
2269
Sean Callanan16b53ab2011-10-12 00:12:34 +00002270 for (ClangASTImporter::NamespaceMap::iterator i = namespace_map->begin(), e = namespace_map->end();
2271 i != e;
2272 ++i)
2273 {
2274 if (log)
Sean Callanan9394b5a2011-10-29 19:50:43 +00002275 log->Printf(" CEDM::FEVD[%u] Searching namespace %s in module %s",
Sean Callanan67bbb112011-10-14 20:34:21 +00002276 current_id,
Sean Callanan16b53ab2011-10-12 00:12:34 +00002277 i->second.GetNamespaceDecl()->getNameAsString().c_str(),
2278 i->first->GetFileSpec().GetFilename().GetCString());
2279
Sean Callananc839adc2011-10-13 21:50:33 +00002280 FindExternalVisibleDecls(context,
2281 i->first,
2282 i->second,
Sean Callanan67bbb112011-10-14 20:34:21 +00002283 current_id);
Sean Callanan16b53ab2011-10-12 00:12:34 +00002284 }
2285 }
Sean Callanane6ea5fe2011-11-15 02:11:17 +00002286 else if (isa<TranslationUnitDecl>(context.m_decl_context))
Sean Callanan16b53ab2011-10-12 00:12:34 +00002287 {
2288 ClangNamespaceDecl namespace_decl;
2289
2290 if (log)
Sean Callanan9394b5a2011-10-29 19:50:43 +00002291 log->Printf(" CEDM::FEVD[%u] Searching the root namespace", current_id);
Sean Callanan16b53ab2011-10-12 00:12:34 +00002292
2293 FindExternalVisibleDecls(context,
2294 lldb::ModuleSP(),
2295 namespace_decl,
Sean Callanan67bbb112011-10-14 20:34:21 +00002296 current_id);
Sean Callanan16b53ab2011-10-12 00:12:34 +00002297 }
Sean Callanana7597062011-10-13 21:08:11 +00002298
Sean Callanan9394b5a2011-10-29 19:50:43 +00002299 if (!context.m_found.variable)
2300 ClangASTSource::FindExternalVisibleDecls(context);
Sean Callanan16b53ab2011-10-12 00:12:34 +00002301}
2302
2303void
2304ClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context,
Sean Callanan38d084f2011-10-12 18:44:30 +00002305 lldb::ModuleSP module_sp,
Sean Callanan03f64ca2011-10-12 01:39:28 +00002306 ClangNamespaceDecl &namespace_decl,
Sean Callanan67bbb112011-10-14 20:34:21 +00002307 unsigned int current_id)
Sean Callanan16b53ab2011-10-12 00:12:34 +00002308{
Sean Callananf76afff2011-10-28 23:38:38 +00002309 assert (m_ast_context);
Sean Callanan16b53ab2011-10-12 00:12:34 +00002310
2311 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan9394b5a2011-10-29 19:50:43 +00002312
Greg Claytone5748d82010-11-09 23:46:37 +00002313 SymbolContextList sc_list;
Chris Lattner24943d22010-06-08 16:52:24 +00002314
Sean Callanan9394b5a2011-10-29 19:50:43 +00002315 const ConstString name(context.m_decl_name.getAsString().c_str());
2316
Greg Clayton3bc52d02010-11-14 22:13:40 +00002317 const char *name_unique_cstr = name.GetCString();
2318
2319 if (name_unique_cstr == NULL)
2320 return;
Sean Callanan9394b5a2011-10-29 19:50:43 +00002321
Greg Clayton8de27c72010-10-15 22:48:33 +00002322 // Only look for functions by name out in our symbols if the function
2323 // doesn't start with our phony prefix of '$'
Greg Clayton567e7f32011-09-22 04:58:26 +00002324 Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
2325 StackFrame *frame = m_parser_vars->m_exe_ctx->GetFramePtr();
Sean Callanan03f64ca2011-10-12 01:39:28 +00002326 if (name_unique_cstr[0] == '$' && !namespace_decl)
2327 {
2328 static ConstString g_lldb_class_name ("$__lldb_class");
2329
2330 if (name == g_lldb_class_name)
2331 {
2332 // Clang is looking for the type of "this"
2333
2334 if (!frame)
2335 return;
2336
2337 VariableList *vars = frame->GetVariableList(false);
2338
2339 if (!vars)
2340 return;
2341
2342 lldb::VariableSP this_var = vars->FindVariable(ConstString("this"));
2343
2344 if (!this_var ||
2345 !this_var->IsInScope(frame) ||
2346 !this_var->LocationIsValidForFrame (frame))
2347 return;
2348
2349 Type *this_type = this_var->GetType();
2350
2351 if (!this_type)
2352 return;
2353
Sean Callanan67bbb112011-10-14 20:34:21 +00002354 if (log && log->GetVerbose())
Sean Callanan03f64ca2011-10-12 01:39:28 +00002355 {
Sean Callanan9394b5a2011-10-29 19:50:43 +00002356 log->Printf (" CEDM::FEVD[%u] Type for \"this\" is: ", current_id);
Sean Callanan03f64ca2011-10-12 01:39:28 +00002357 StreamString strm;
2358 this_type->Dump(&strm, true);
2359 log->PutCString (strm.GetData());
2360 }
2361
2362 TypeFromUser this_user_type(this_type->GetClangFullType(),
2363 this_type->GetClangAST());
2364
2365 m_struct_vars->m_object_pointer_type = this_user_type;
2366
2367 void *pointer_target_type = NULL;
2368
2369 if (!ClangASTContext::IsPointerType(this_user_type.GetOpaqueQualType(),
2370 &pointer_target_type))
2371 return;
2372
2373 clang::QualType pointer_target_qual_type = QualType::getFromOpaquePtr(pointer_target_type);
2374
2375 if (pointer_target_qual_type.isConstQualified())
2376 pointer_target_qual_type.removeLocalConst();
2377
2378 TypeFromUser class_user_type(pointer_target_qual_type.getAsOpaquePtr(),
2379 this_type->GetClangAST());
2380
2381 if (log)
2382 {
Greg Claytona23ca422011-10-20 00:47:21 +00002383 ASTDumper ast_dumper(pointer_target_qual_type);
Sean Callanan9394b5a2011-10-29 19:50:43 +00002384 log->Printf(" CEDM::FEVD[%u] Adding type for $__lldb_class: %s", current_id, ast_dumper.GetCString());
Sean Callanan03f64ca2011-10-12 01:39:28 +00002385 }
2386
Sean Callanane3737fd2011-10-18 16:46:55 +00002387 AddOneType(context, class_user_type, current_id, true);
Sean Callanan03f64ca2011-10-12 01:39:28 +00002388
2389 return;
2390 }
2391
2392 static ConstString g_lldb_objc_class_name ("$__lldb_objc_class");
2393 if (name == g_lldb_objc_class_name)
2394 {
2395 // Clang is looking for the type of "*self"
2396
2397 if (!frame)
2398 return;
Sean Callanane6ea5fe2011-11-15 02:11:17 +00002399
2400 SymbolContext sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction);
2401
2402 if (!sym_ctx.function)
2403 return;
2404
2405 clang::DeclContext *decl_context;
2406
2407 if (sym_ctx.block && sym_ctx.block->GetInlinedFunctionInfo())
2408 decl_context = sym_ctx.block->GetClangDeclContextForInlinedFunction();
2409 else
2410 decl_context = sym_ctx.function->GetClangDeclContext();
2411
2412 if (!decl_context)
2413 return;
2414
2415 clang::ObjCMethodDecl *method_decl = llvm::dyn_cast<clang::ObjCMethodDecl>(decl_context);
2416
2417 if (!method_decl)
2418 return;
2419
2420 ObjCInterfaceDecl* self_interface = method_decl->getClassInterface();
2421
2422 if (!self_interface)
2423 return;
2424
2425 const clang::Type *interface_type = self_interface->getTypeForDecl();
2426
2427 TypeFromUser class_user_type(QualType(interface_type, 0).getAsOpaquePtr(),
2428 &method_decl->getASTContext());
2429
2430 if (log)
2431 {
2432 ASTDumper ast_dumper(interface_type);
2433 log->Printf(" FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, ast_dumper.GetCString());
2434 }
2435
2436 AddOneType(context, class_user_type, current_id, false);
Sean Callanan03f64ca2011-10-12 01:39:28 +00002437
2438 VariableList *vars = frame->GetVariableList(false);
2439
Sean Callanan03f64ca2011-10-12 01:39:28 +00002440 lldb::VariableSP self_var = vars->FindVariable(ConstString("self"));
2441
2442 if (!self_var ||
2443 !self_var->IsInScope(frame) ||
2444 !self_var->LocationIsValidForFrame (frame))
2445 return;
2446
2447 Type *self_type = self_var->GetType();
2448
2449 if (!self_type)
2450 return;
2451
2452 TypeFromUser self_user_type(self_type->GetClangFullType(),
2453 self_type->GetClangAST());
2454
2455 m_struct_vars->m_object_pointer_type = self_user_type;
Sean Callanan03f64ca2011-10-12 01:39:28 +00002456 return;
2457 }
2458
2459 // any other $__lldb names should be weeded out now
2460 if (!::strncmp(name_unique_cstr, "$__lldb", sizeof("$__lldb") - 1))
2461 return;
2462
2463 do
2464 {
2465 if (!target)
2466 break;
2467
2468 ClangASTContext *scratch_clang_ast_context = target->GetScratchClangASTContext();
2469
2470 if (!scratch_clang_ast_context)
2471 break;
2472
2473 ASTContext *scratch_ast_context = scratch_clang_ast_context->getASTContext();
2474
2475 if (!scratch_ast_context)
2476 break;
2477
2478 TypeDecl *ptype_type_decl = m_parser_vars->m_persistent_vars->GetPersistentType(name);
2479
2480 if (!ptype_type_decl)
2481 break;
2482
Sean Callanane1301a62011-12-06 03:41:14 +00002483 Decl *parser_ptype_decl = m_ast_importer->CopyDecl(m_ast_context, scratch_ast_context, ptype_type_decl);
Sean Callanan03f64ca2011-10-12 01:39:28 +00002484
2485 if (!parser_ptype_decl)
2486 break;
2487
2488 TypeDecl *parser_ptype_type_decl = dyn_cast<TypeDecl>(parser_ptype_decl);
2489
2490 if (!parser_ptype_type_decl)
2491 break;
2492
2493 if (log)
Sean Callanan9394b5a2011-10-29 19:50:43 +00002494 log->Printf(" CEDM::FEVD[%u] Found persistent type %s", current_id, name.GetCString());
Sean Callanan03f64ca2011-10-12 01:39:28 +00002495
2496 context.AddNamedDecl(parser_ptype_type_decl);
2497 } while (0);
2498
2499 ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name));
2500
2501 if (pvar_sp)
2502 {
Sean Callanan67bbb112011-10-14 20:34:21 +00002503 AddOneVariable(context, pvar_sp, current_id);
Sean Callanan03f64ca2011-10-12 01:39:28 +00002504 return;
2505 }
2506
2507 const char *reg_name(&name.GetCString()[1]);
2508
2509 if (m_parser_vars->m_exe_ctx->GetRegisterContext())
2510 {
2511 const RegisterInfo *reg_info(m_parser_vars->m_exe_ctx->GetRegisterContext()->GetRegisterInfoByName(reg_name));
Sean Callanan9394b5a2011-10-29 19:50:43 +00002512
Sean Callanan03f64ca2011-10-12 01:39:28 +00002513 if (reg_info)
Sean Callanane3737fd2011-10-18 16:46:55 +00002514 {
2515 if (log)
Sean Callanan9394b5a2011-10-29 19:50:43 +00002516 log->Printf(" CEDM::FEVD[%u] Found register %s", current_id, reg_info->name);
Sean Callanane3737fd2011-10-18 16:46:55 +00002517
Sean Callanan67bbb112011-10-14 20:34:21 +00002518 AddOneRegister(context, reg_info, current_id);
Sean Callanane3737fd2011-10-18 16:46:55 +00002519 }
Sean Callanan03f64ca2011-10-12 01:39:28 +00002520 }
2521 }
2522 else
Sean Callanan0fc73582010-07-27 00:55:47 +00002523 {
Sean Callananf8b468e2011-08-06 00:28:14 +00002524 ValueObjectSP valobj;
2525 VariableSP var;
2526 Error err;
2527
Sean Callanan03f64ca2011-10-12 01:39:28 +00002528 if (frame && !namespace_decl)
Greg Clayton8de27c72010-10-15 22:48:33 +00002529 {
Greg Clayton567e7f32011-09-22 04:58:26 +00002530 valobj = frame->GetValueForVariableExpressionPath(name_unique_cstr,
Sean Callanan16b53ab2011-10-12 00:12:34 +00002531 eNoDynamicValues,
2532 StackFrame::eExpressionPathOptionCheckPtrVsMember,
2533 var,
2534 err);
Sean Callanan47dc4572011-09-15 02:13:07 +00002535
2536 // If we found a variable in scope, no need to pull up function names
2537 if (err.Success() && var != NULL)
2538 {
Sean Callanan89e7df32011-11-29 22:03:21 +00002539 AddOneVariable(context, var, valobj, current_id);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002540 context.m_found.variable = true;
Sean Callanan3a546762011-10-25 20:36:57 +00002541 return;
Sean Callanan47dc4572011-09-15 02:13:07 +00002542 }
Greg Clayton8de27c72010-10-15 22:48:33 +00002543 }
Sean Callanan1c226272011-12-10 04:03:38 +00002544
2545 if (target)
Sean Callanan47dc4572011-09-15 02:13:07 +00002546 {
Sean Callanan94cd0ca2011-10-12 16:59:31 +00002547 var = FindGlobalVariable (*target,
Sean Callanan38d084f2011-10-12 18:44:30 +00002548 module_sp,
Sean Callanan94cd0ca2011-10-12 16:59:31 +00002549 name,
2550 &namespace_decl,
Greg Clayton567e7f32011-09-22 04:58:26 +00002551 NULL);
Sean Callanan47dc4572011-09-15 02:13:07 +00002552
2553 if (var)
2554 {
Sean Callananf48de6d2011-12-10 03:12:34 +00002555 valobj = ValueObjectVariable::Create(target, var);
Sean Callanan89e7df32011-11-29 22:03:21 +00002556 AddOneVariable(context, var, valobj, current_id);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002557 context.m_found.variable = true;
Sean Callanan1c226272011-12-10 04:03:38 +00002558 return;
Sean Callanan47dc4572011-09-15 02:13:07 +00002559 }
2560 }
2561
Sean Callanan16c4ec32011-10-12 20:29:25 +00002562 if (!context.m_found.variable)
Greg Clayton8de27c72010-10-15 22:48:33 +00002563 {
Greg Clayton28d5fcc2011-01-27 06:44:37 +00002564 const bool include_symbols = true;
2565 const bool append = false;
Sean Callanana5ec5a32011-10-12 17:38:09 +00002566
Sean Callanan38d084f2011-10-12 18:44:30 +00002567 if (namespace_decl && module_sp)
Sean Callanana5ec5a32011-10-12 17:38:09 +00002568 {
Sean Callanan38d084f2011-10-12 18:44:30 +00002569 module_sp->FindFunctions(name,
2570 &namespace_decl,
2571 eFunctionNameTypeBase,
2572 include_symbols,
2573 append,
2574 sc_list);
Sean Callanana5ec5a32011-10-12 17:38:09 +00002575 }
2576 else
2577 {
2578 target->GetImages().FindFunctions(name,
2579 eFunctionNameTypeBase,
2580 include_symbols,
2581 append,
2582 sc_list);
2583 }
2584
Sean Callanan81974962011-05-08 02:21:26 +00002585 if (sc_list.GetSize())
Greg Clayton8de27c72010-10-15 22:48:33 +00002586 {
Sean Callanan81974962011-05-08 02:21:26 +00002587 Symbol *generic_symbol = NULL;
2588 Symbol *non_extern_symbol = NULL;
2589
2590 for (uint32_t index = 0, num_indices = sc_list.GetSize();
2591 index < num_indices;
2592 ++index)
Greg Clayton8de27c72010-10-15 22:48:33 +00002593 {
Sean Callanan81974962011-05-08 02:21:26 +00002594 SymbolContext sym_ctx;
2595 sc_list.GetContextAtIndex(index, sym_ctx);
2596
2597 if (sym_ctx.function)
2598 {
2599 // TODO only do this if it's a C function; C++ functions may be
2600 // overloaded
Sean Callanan16c4ec32011-10-12 20:29:25 +00002601 if (!context.m_found.function_with_type_info)
Sean Callanan67bbb112011-10-14 20:34:21 +00002602 AddOneFunction(context, sym_ctx.function, NULL, current_id);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002603 context.m_found.function_with_type_info = true;
2604 context.m_found.function = true;
Sean Callanan81974962011-05-08 02:21:26 +00002605 }
2606 else if (sym_ctx.symbol)
2607 {
2608 if (sym_ctx.symbol->IsExternal())
2609 generic_symbol = sym_ctx.symbol;
2610 else
2611 non_extern_symbol = sym_ctx.symbol;
2612 }
Greg Clayton8de27c72010-10-15 22:48:33 +00002613 }
Sean Callanan81974962011-05-08 02:21:26 +00002614
Sean Callanan16c4ec32011-10-12 20:29:25 +00002615 if (!context.m_found.function_with_type_info)
Greg Clayton8de27c72010-10-15 22:48:33 +00002616 {
Sean Callanan81974962011-05-08 02:21:26 +00002617 if (generic_symbol)
Sean Callanan47dc4572011-09-15 02:13:07 +00002618 {
Sean Callanan67bbb112011-10-14 20:34:21 +00002619 AddOneFunction (context, NULL, generic_symbol, current_id);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002620 context.m_found.function = true;
Sean Callanan47dc4572011-09-15 02:13:07 +00002621 }
Sean Callanan81974962011-05-08 02:21:26 +00002622 else if (non_extern_symbol)
Sean Callanan47dc4572011-09-15 02:13:07 +00002623 {
Sean Callanan67bbb112011-10-14 20:34:21 +00002624 AddOneFunction (context, NULL, non_extern_symbol, current_id);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002625 context.m_found.function = true;
Sean Callanan47dc4572011-09-15 02:13:07 +00002626 }
Sean Callanan81974962011-05-08 02:21:26 +00002627 }
Greg Clayton8de27c72010-10-15 22:48:33 +00002628 }
Sean Callanan47dc4572011-09-15 02:13:07 +00002629
Sean Callanan16c4ec32011-10-12 20:29:25 +00002630 if (!context.m_found.variable)
Greg Clayton8de27c72010-10-15 22:48:33 +00002631 {
Sean Callanan16c4ec32011-10-12 20:29:25 +00002632 // We couldn't find a non-symbol variable for this. Now we'll hunt for a generic
Sean Callanan81974962011-05-08 02:21:26 +00002633 // data symbol, and -- if it is found -- treat it as a variable.
2634
Sean Callananaa4a5532011-10-13 16:49:47 +00002635 Symbol *data_symbol = FindGlobalDataSymbol(*target, name);
Sean Callanan81974962011-05-08 02:21:26 +00002636
2637 if (data_symbol)
Sean Callanan47dc4572011-09-15 02:13:07 +00002638 {
Sean Callanan67bbb112011-10-14 20:34:21 +00002639 AddOneGenericVariable(context, *data_symbol, current_id);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002640 context.m_found.variable = true;
Sean Callanan47dc4572011-09-15 02:13:07 +00002641 }
Greg Clayton6916e352010-11-13 03:52:47 +00002642 }
Sean Callanan92aa6662010-09-07 21:49:41 +00002643 }
Sean Callananb549b0a2011-10-27 02:06:03 +00002644 }
Sean Callanan336a0002010-07-17 00:43:37 +00002645}
Greg Claytone6d72ca2011-06-25 00:44:06 +00002646
Sean Callanan336a0002010-07-17 00:43:37 +00002647Value *
Greg Clayton8de27c72010-10-15 22:48:33 +00002648ClangExpressionDeclMap::GetVariableValue
2649(
2650 ExecutionContext &exe_ctx,
Sean Callanan4a078322011-10-13 00:09:20 +00002651 VariableSP &var,
Sean Callanan9b6898f2011-07-30 02:42:06 +00002652 ASTContext *parser_ast_context,
Greg Clayton8de27c72010-10-15 22:48:33 +00002653 TypeFromUser *user_type,
2654 TypeFromParser *parser_type
2655)
Chris Lattner24943d22010-06-08 16:52:24 +00002656{
Greg Claytone005f2c2010-11-06 01:53:30 +00002657 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan6184dfe2010-06-23 00:47:48 +00002658
Chris Lattner24943d22010-06-08 16:52:24 +00002659 Type *var_type = var->GetType();
2660
2661 if (!var_type)
2662 {
Sean Callanan810f22d2010-07-16 00:09:46 +00002663 if (log)
2664 log->PutCString("Skipped a definition because it has no type");
Sean Callanan336a0002010-07-17 00:43:37 +00002665 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00002666 }
2667
Greg Clayton04c9c7b2011-02-16 23:00:21 +00002668 clang_type_t var_opaque_type = var_type->GetClangFullType();
Chris Lattner24943d22010-06-08 16:52:24 +00002669
2670 if (!var_opaque_type)
2671 {
Sean Callanan810f22d2010-07-16 00:09:46 +00002672 if (log)
2673 log->PutCString("Skipped a definition because it has no Clang type");
Sean Callanan336a0002010-07-17 00:43:37 +00002674 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00002675 }
2676
Sean Callanan9b6898f2011-07-30 02:42:06 +00002677 ASTContext *ast = var_type->GetClangASTContext().getASTContext();
Chris Lattner24943d22010-06-08 16:52:24 +00002678
Greg Claytonb01000f2011-01-17 03:46:26 +00002679 if (!ast)
Chris Lattner24943d22010-06-08 16:52:24 +00002680 {
Sean Callanan810f22d2010-07-16 00:09:46 +00002681 if (log)
2682 log->PutCString("There is no AST context for the current execution context");
Sean Callanan336a0002010-07-17 00:43:37 +00002683 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00002684 }
2685
Sean Callanan336a0002010-07-17 00:43:37 +00002686 DWARFExpression &var_location_expr = var->LocationExpression();
2687
Chris Lattner24943d22010-06-08 16:52:24 +00002688 std::auto_ptr<Value> var_location(new Value);
2689
Greg Clayton178710c2010-09-14 02:20:48 +00002690 lldb::addr_t loclist_base_load_addr = LLDB_INVALID_ADDRESS;
2691
Greg Clayton567e7f32011-09-22 04:58:26 +00002692 Target *target = exe_ctx.GetTargetPtr();
2693
Greg Clayton178710c2010-09-14 02:20:48 +00002694 if (var_location_expr.IsLocationList())
2695 {
2696 SymbolContext var_sc;
2697 var->CalculateSymbolContext (&var_sc);
Greg Clayton567e7f32011-09-22 04:58:26 +00002698 loclist_base_load_addr = var_sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress (target);
Greg Clayton178710c2010-09-14 02:20:48 +00002699 }
Chris Lattner24943d22010-06-08 16:52:24 +00002700 Error err;
2701
Greg Claytonbdcb6ab2011-01-25 23:55:37 +00002702 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 +00002703 {
Sean Callanan810f22d2010-07-16 00:09:46 +00002704 if (log)
2705 log->Printf("Error evaluating location: %s", err.AsCString());
Sean Callanan336a0002010-07-17 00:43:37 +00002706 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00002707 }
Greg Claytonb01000f2011-01-17 03:46:26 +00002708
Sean Callanan58baaad2011-07-08 00:39:14 +00002709 void *type_to_use = NULL;
Sean Callanan336a0002010-07-17 00:43:37 +00002710
Sean Callananf328c9f2010-07-20 23:31:16 +00002711 if (parser_ast_context)
2712 {
Greg Claytonb01000f2011-01-17 03:46:26 +00002713 type_to_use = GuardedCopyType(parser_ast_context, ast, var_opaque_type);
Sean Callananf328c9f2010-07-20 23:31:16 +00002714
Sean Callanan4b5eec62010-11-20 02:19:29 +00002715 if (!type_to_use)
2716 {
2717 if (log)
2718 log->Printf("Couldn't copy a variable's type into the parser's AST context");
2719
2720 return NULL;
2721 }
2722
Sean Callananf328c9f2010-07-20 23:31:16 +00002723 if (parser_type)
2724 *parser_type = TypeFromParser(type_to_use, parser_ast_context);
2725 }
Sean Callanan336a0002010-07-17 00:43:37 +00002726 else
2727 type_to_use = var_opaque_type;
Chris Lattner24943d22010-06-08 16:52:24 +00002728
2729 if (var_location.get()->GetContextType() == Value::eContextTypeInvalid)
Greg Clayton6916e352010-11-13 03:52:47 +00002730 var_location.get()->SetContext(Value::eContextTypeClangType, type_to_use);
Chris Lattner24943d22010-06-08 16:52:24 +00002731
2732 if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress)
2733 {
2734 SymbolContext var_sc;
2735 var->CalculateSymbolContext(&var_sc);
Sean Callanan336a0002010-07-17 00:43:37 +00002736
Chris Lattner24943d22010-06-08 16:52:24 +00002737 if (!var_sc.module_sp)
Sean Callanan336a0002010-07-17 00:43:37 +00002738 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00002739
2740 ObjectFile *object_file = var_sc.module_sp->GetObjectFile();
2741
2742 if (!object_file)
Sean Callanan336a0002010-07-17 00:43:37 +00002743 return NULL;
2744
Chris Lattner24943d22010-06-08 16:52:24 +00002745 Address so_addr(var_location->GetScalar().ULongLong(), object_file->GetSectionList());
2746
Greg Clayton567e7f32011-09-22 04:58:26 +00002747 lldb::addr_t load_addr = so_addr.GetLoadAddress(target);
Chris Lattner24943d22010-06-08 16:52:24 +00002748
Sean Callanan47dc4572011-09-15 02:13:07 +00002749 if (load_addr != LLDB_INVALID_ADDRESS)
2750 {
2751 var_location->GetScalar() = load_addr;
2752 var_location->SetValueType(Value::eValueTypeLoadAddress);
2753 }
Chris Lattner24943d22010-06-08 16:52:24 +00002754 }
2755
Sean Callananf328c9f2010-07-20 23:31:16 +00002756 if (user_type)
Greg Claytonb01000f2011-01-17 03:46:26 +00002757 *user_type = TypeFromUser(var_opaque_type, ast);
Sean Callanan336a0002010-07-17 00:43:37 +00002758
2759 return var_location.release();
2760}
2761
2762void
Sean Callanan89e7df32011-11-29 22:03:21 +00002763ClangExpressionDeclMap::AddOneVariable (NameSearchContext &context, VariableSP var, ValueObjectSP valobj, unsigned int current_id)
Sean Callanan336a0002010-07-17 00:43:37 +00002764{
Sean Callananaa301c42010-12-03 01:38:59 +00002765 assert (m_parser_vars.get());
2766
Greg Claytone005f2c2010-11-06 01:53:30 +00002767 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan47dc4572011-09-15 02:13:07 +00002768
Sean Callananf328c9f2010-07-20 23:31:16 +00002769 TypeFromUser ut;
2770 TypeFromParser pt;
Sean Callanan336a0002010-07-17 00:43:37 +00002771
Sean Callananaa301c42010-12-03 01:38:59 +00002772 Value *var_location = GetVariableValue (*m_parser_vars->m_exe_ctx,
Greg Clayton8de27c72010-10-15 22:48:33 +00002773 var,
Sean Callananf76afff2011-10-28 23:38:38 +00002774 m_ast_context,
Greg Clayton8de27c72010-10-15 22:48:33 +00002775 &ut,
2776 &pt);
Sean Callanan336a0002010-07-17 00:43:37 +00002777
Sean Callanan4b5eec62010-11-20 02:19:29 +00002778 if (!var_location)
2779 return;
2780
Sean Callanan6f3bde72011-10-27 19:41:13 +00002781 NamedDecl *var_decl;
2782
2783 bool is_reference = ClangASTContext::IsReferenceType(pt.GetOpaqueQualType());
2784
2785 if (is_reference)
2786 var_decl = context.AddVarDecl(pt.GetOpaqueQualType());
2787 else
2788 var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(pt.GetASTContext(), pt.GetOpaqueQualType()));
2789
Greg Clayton8de27c72010-10-15 22:48:33 +00002790 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton427f2902010-12-14 02:59:59 +00002791 ConstString entity_name(decl_name.c_str());
Sean Callanan89e7df32011-11-29 22:03:21 +00002792 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (valobj));
2793
Greg Clayton427f2902010-12-14 02:59:59 +00002794 assert (entity.get());
2795 entity->EnableParserVars();
2796 entity->m_parser_vars->m_parser_type = pt;
2797 entity->m_parser_vars->m_named_decl = var_decl;
2798 entity->m_parser_vars->m_llvm_value = NULL;
2799 entity->m_parser_vars->m_lldb_value = var_location;
Sean Callanan696cf5f2011-05-07 01:06:41 +00002800 entity->m_parser_vars->m_lldb_var = var;
Chris Lattner24943d22010-06-08 16:52:24 +00002801
Sean Callanan6f3bde72011-10-27 19:41:13 +00002802 if (is_reference)
2803 entity->m_flags |= ClangExpressionVariable::EVTypeIsReference;
2804
Sean Callanan810f22d2010-07-16 00:09:46 +00002805 if (log)
Greg Clayton8de27c72010-10-15 22:48:33 +00002806 {
Sean Callananaa561412011-11-07 23:32:52 +00002807 ASTDumper orig_dumper(ut.GetOpaqueQualType());
Greg Claytona23ca422011-10-20 00:47:21 +00002808 ASTDumper ast_dumper(var_decl);
Sean Callananaa561412011-11-07 23:32:52 +00002809 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 +00002810 }
Sean Callanan8f0dc342010-06-22 23:46:24 +00002811}
2812
2813void
Sean Callanana48fe162010-08-11 03:57:18 +00002814ClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
Sean Callanan67bbb112011-10-14 20:34:21 +00002815 ClangExpressionVariableSP &pvar_sp,
2816 unsigned int current_id)
Sean Callanana48fe162010-08-11 03:57:18 +00002817{
Greg Claytone005f2c2010-11-06 01:53:30 +00002818 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan45690fe2010-08-30 22:17:16 +00002819
Greg Clayton427f2902010-12-14 02:59:59 +00002820 TypeFromUser user_type (pvar_sp->GetTypeFromUser());
Sean Callanana48fe162010-08-11 03:57:18 +00002821
Sean Callananf76afff2011-10-28 23:38:38 +00002822 TypeFromParser parser_type (GuardedCopyType(m_ast_context,
Greg Clayton427f2902010-12-14 02:59:59 +00002823 user_type.GetASTContext(),
2824 user_type.GetOpaqueQualType()),
Sean Callananf76afff2011-10-28 23:38:38 +00002825 m_ast_context);
Sean Callanana48fe162010-08-11 03:57:18 +00002826
Sean Callanandc5fce12011-12-01 21:04:37 +00002827 if (!parser_type.GetOpaqueQualType())
2828 {
2829 if (log)
2830 log->Printf(" CEDM::FEVD[%u] Couldn't import type for pvar %s", current_id, pvar_sp->GetName().GetCString());
2831 return;
2832 }
2833
Sean Callanan6a925532011-01-13 08:53:35 +00002834 NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(parser_type.GetASTContext(), parser_type.GetOpaqueQualType()));
Sean Callanan8c127202010-08-23 23:09:38 +00002835
Greg Clayton427f2902010-12-14 02:59:59 +00002836 pvar_sp->EnableParserVars();
2837 pvar_sp->m_parser_vars->m_parser_type = parser_type;
2838 pvar_sp->m_parser_vars->m_named_decl = var_decl;
2839 pvar_sp->m_parser_vars->m_llvm_value = NULL;
2840 pvar_sp->m_parser_vars->m_lldb_value = NULL;
Sean Callanan45690fe2010-08-30 22:17:16 +00002841
2842 if (log)
Sean Callanana0744822010-11-01 23:22:47 +00002843 {
Greg Claytona23ca422011-10-20 00:47:21 +00002844 ASTDumper ast_dumper(var_decl);
Sean Callanan9394b5a2011-10-29 19:50:43 +00002845 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 +00002846 }
Sean Callanana48fe162010-08-11 03:57:18 +00002847}
2848
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002849void
Sean Callanan81974962011-05-08 02:21:26 +00002850ClangExpressionDeclMap::AddOneGenericVariable(NameSearchContext &context,
Sean Callanan67bbb112011-10-14 20:34:21 +00002851 Symbol &symbol,
2852 unsigned int current_id)
Sean Callanan81974962011-05-08 02:21:26 +00002853{
2854 assert(m_parser_vars.get());
2855
2856 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2857
Greg Clayton567e7f32011-09-22 04:58:26 +00002858 Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
2859
2860 if (target == NULL)
2861 return;
2862
2863 ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
Sean Callanan81974962011-05-08 02:21:26 +00002864
Sean Callananfb3058e2011-05-12 23:54:16 +00002865 TypeFromUser user_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(scratch_ast_context, true)),
Sean Callanan81974962011-05-08 02:21:26 +00002866 scratch_ast_context);
2867
Sean Callananf76afff2011-10-28 23:38:38 +00002868 TypeFromParser parser_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(m_ast_context, true)),
2869 m_ast_context);
Sean Callanan81974962011-05-08 02:21:26 +00002870
Sean Callananfb3058e2011-05-12 23:54:16 +00002871 NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
Sean Callanan81974962011-05-08 02:21:26 +00002872
2873 std::string decl_name(context.m_decl_name.getAsString());
2874 ConstString entity_name(decl_name.c_str());
2875 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
2876 entity_name,
2877 user_type,
Sean Callanan47dc4572011-09-15 02:13:07 +00002878 m_parser_vars->m_target_info.byte_order,
2879 m_parser_vars->m_target_info.address_byte_size));
Sean Callanan81974962011-05-08 02:21:26 +00002880 assert (entity.get());
Sean Callanan81974962011-05-08 02:21:26 +00002881
2882 std::auto_ptr<Value> symbol_location(new Value);
2883
2884 AddressRange &symbol_range = symbol.GetAddressRangeRef();
2885 Address &symbol_address = symbol_range.GetBaseAddress();
Greg Clayton567e7f32011-09-22 04:58:26 +00002886 lldb::addr_t symbol_load_addr = symbol_address.GetLoadAddress(target);
Sean Callanan81974962011-05-08 02:21:26 +00002887
2888 symbol_location->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
2889 symbol_location->GetScalar() = symbol_load_addr;
2890 symbol_location->SetValueType(Value::eValueTypeLoadAddress);
2891
Sean Callananfb3058e2011-05-12 23:54:16 +00002892 entity->EnableParserVars();
Sean Callanan81974962011-05-08 02:21:26 +00002893 entity->m_parser_vars->m_parser_type = parser_type;
2894 entity->m_parser_vars->m_named_decl = var_decl;
2895 entity->m_parser_vars->m_llvm_value = NULL;
2896 entity->m_parser_vars->m_lldb_value = symbol_location.release();
2897 entity->m_parser_vars->m_lldb_sym = &symbol;
2898
2899 if (log)
2900 {
Greg Claytona23ca422011-10-20 00:47:21 +00002901 ASTDumper ast_dumper(var_decl);
Sean Callanan81974962011-05-08 02:21:26 +00002902
Sean Callanan9394b5a2011-10-29 19:50:43 +00002903 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 +00002904 }
2905}
2906
Sean Callananfb3058e2011-05-12 23:54:16 +00002907bool
2908ClangExpressionDeclMap::ResolveUnknownTypes()
2909{
2910 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Greg Clayton567e7f32011-09-22 04:58:26 +00002911 Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
2912
2913 ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
Sean Callananfb3058e2011-05-12 23:54:16 +00002914
2915 for (size_t index = 0, num_entities = m_found_entities.GetSize();
2916 index < num_entities;
2917 ++index)
2918 {
2919 ClangExpressionVariableSP entity = m_found_entities.GetVariableAtIndex(index);
2920
2921 if (entity->m_flags & ClangExpressionVariable::EVUnknownType)
2922 {
2923 const NamedDecl *named_decl = entity->m_parser_vars->m_named_decl;
2924 const VarDecl *var_decl = dyn_cast<VarDecl>(named_decl);
2925
2926 if (!var_decl)
2927 {
2928 if (log)
2929 log->Printf("Entity of unknown type does not have a VarDecl");
2930 return false;
2931 }
2932
2933 if (log)
2934 {
Greg Claytona23ca422011-10-20 00:47:21 +00002935 ASTDumper ast_dumper(const_cast<VarDecl*>(var_decl));
2936 log->Printf("Variable of unknown type now has Decl %s", ast_dumper.GetCString());
Sean Callananfb3058e2011-05-12 23:54:16 +00002937 }
2938
2939 QualType var_type = var_decl->getType();
2940 TypeFromParser parser_type(var_type.getAsOpaquePtr(), &var_decl->getASTContext());
2941
Sean Callanan5a55c7a2011-11-18 03:28:09 +00002942 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 +00002943
Sean Callanandc5fce12011-12-01 21:04:37 +00002944 if (!copied_type)
2945 {
2946 if (log)
2947 log->Printf("ClangExpressionDeclMap::ResolveUnknownType - Couldn't import the type for a variable");
2948
2949 return lldb::ClangExpressionVariableSP();
2950 }
2951
Sean Callananfb3058e2011-05-12 23:54:16 +00002952 TypeFromUser user_type(copied_type, scratch_ast_context);
2953
2954 entity->m_parser_vars->m_lldb_value->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
2955 entity->m_parser_vars->m_parser_type = parser_type;
2956
2957 entity->SetClangAST(user_type.GetASTContext());
2958 entity->SetClangType(user_type.GetOpaqueQualType());
2959
2960 entity->m_flags &= ~(ClangExpressionVariable::EVUnknownType);
2961 }
2962 }
2963
2964 return true;
2965}
2966
Sean Callanan81974962011-05-08 02:21:26 +00002967void
Greg Clayton427f2902010-12-14 02:59:59 +00002968ClangExpressionDeclMap::AddOneRegister (NameSearchContext &context,
Sean Callanan67bbb112011-10-14 20:34:21 +00002969 const RegisterInfo *reg_info,
2970 unsigned int current_id)
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002971{
2972 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2973
Sean Callananf76afff2011-10-28 23:38:38 +00002974 void *ast_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize(m_ast_context,
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002975 reg_info->encoding,
2976 reg_info->byte_size * 8);
2977
2978 if (!ast_type)
2979 {
Johnny Chen122204d2011-08-09 22:52:27 +00002980 if (log)
Sean Callanan67bbb112011-10-14 20:34:21 +00002981 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 +00002982 return;
2983 }
2984
Greg Clayton427f2902010-12-14 02:59:59 +00002985 TypeFromParser parser_type (ast_type,
Sean Callananf76afff2011-10-28 23:38:38 +00002986 m_ast_context);
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002987
2988 NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
2989
Jim Inghamfa3a16a2011-03-31 00:19:25 +00002990 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope(),
Sean Callanan47dc4572011-09-15 02:13:07 +00002991 m_parser_vars->m_target_info.byte_order,
2992 m_parser_vars->m_target_info.address_byte_size));
Greg Clayton427f2902010-12-14 02:59:59 +00002993 assert (entity.get());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002994 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton427f2902010-12-14 02:59:59 +00002995 entity->SetName (ConstString (decl_name.c_str()));
2996 entity->SetRegisterInfo (reg_info);
2997 entity->EnableParserVars();
2998 entity->m_parser_vars->m_parser_type = parser_type;
2999 entity->m_parser_vars->m_named_decl = var_decl;
3000 entity->m_parser_vars->m_llvm_value = NULL;
3001 entity->m_parser_vars->m_lldb_value = NULL;
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00003002
Sean Callanan67bbb112011-10-14 20:34:21 +00003003 if (log && log->GetVerbose())
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00003004 {
Greg Claytona23ca422011-10-20 00:47:21 +00003005 ASTDumper ast_dumper(var_decl);
Sean Callanan9394b5a2011-10-29 19:50:43 +00003006 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 +00003007 }
3008}
3009
Sean Callanana48fe162010-08-11 03:57:18 +00003010void
Greg Claytonda7af842011-05-18 22:01:49 +00003011ClangExpressionDeclMap::AddOneFunction (NameSearchContext &context,
3012 Function* fun,
Sean Callanan67bbb112011-10-14 20:34:21 +00003013 Symbol* symbol,
3014 unsigned int current_id)
Sean Callanan8f0dc342010-06-22 23:46:24 +00003015{
Sean Callananaa301c42010-12-03 01:38:59 +00003016 assert (m_parser_vars.get());
3017
Greg Claytone005f2c2010-11-06 01:53:30 +00003018 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan8f0dc342010-06-22 23:46:24 +00003019
Sean Callanan58baaad2011-07-08 00:39:14 +00003020 NamedDecl *fun_decl = NULL;
Sean Callanan8f0dc342010-06-22 23:46:24 +00003021 std::auto_ptr<Value> fun_location(new Value);
Sean Callanan58baaad2011-07-08 00:39:14 +00003022 const Address *fun_address = NULL;
Sean Callanan8f0dc342010-06-22 23:46:24 +00003023
Sean Callanan0fc73582010-07-27 00:55:47 +00003024 // only valid for Functions, not for Symbols
3025 void *fun_opaque_type = NULL;
Sean Callanan9b6898f2011-07-30 02:42:06 +00003026 ASTContext *fun_ast_context = NULL;
Sean Callanan0fc73582010-07-27 00:55:47 +00003027
3028 if (fun)
3029 {
3030 Type *fun_type = fun->GetType();
3031
3032 if (!fun_type)
3033 {
3034 if (log)
Sean Callanan67bbb112011-10-14 20:34:21 +00003035 log->PutCString(" Skipped a function because it has no type");
Sean Callanan0fc73582010-07-27 00:55:47 +00003036 return;
3037 }
3038
Greg Clayton04c9c7b2011-02-16 23:00:21 +00003039 fun_opaque_type = fun_type->GetClangFullType();
Sean Callanan0fc73582010-07-27 00:55:47 +00003040
3041 if (!fun_opaque_type)
3042 {
3043 if (log)
Sean Callanan67bbb112011-10-14 20:34:21 +00003044 log->PutCString(" Skipped a function because it has no Clang type");
Sean Callanan0fc73582010-07-27 00:55:47 +00003045 return;
3046 }
3047
3048 fun_address = &fun->GetAddressRange().GetBaseAddress();
3049
Greg Claytonb01000f2011-01-17 03:46:26 +00003050 fun_ast_context = fun_type->GetClangASTContext().getASTContext();
Sean Callananf76afff2011-10-28 23:38:38 +00003051 void *copied_type = GuardedCopyType(m_ast_context, fun_ast_context, fun_opaque_type);
Greg Claytona23ca422011-10-20 00:47:21 +00003052 if (copied_type)
3053 {
3054 fun_decl = context.AddFunDecl(copied_type);
3055 }
3056 else
3057 {
3058 // We failed to copy the type we found
3059 if (log)
3060 {
3061 log->Printf (" Failed to import the function type '%s' {0x%8.8llx} into the expression parser AST contenxt",
3062 fun_type->GetName().GetCString(),
3063 fun_type->GetID());
3064 }
Sean Callanan16089542011-11-16 00:40:13 +00003065
3066 return;
Greg Claytona23ca422011-10-20 00:47:21 +00003067 }
Sean Callanan0fc73582010-07-27 00:55:47 +00003068 }
3069 else if (symbol)
3070 {
3071 fun_address = &symbol->GetAddressRangeRef().GetBaseAddress();
3072
3073 fun_decl = context.AddGenericFunDecl();
3074 }
3075 else
3076 {
3077 if (log)
Sean Callanan67bbb112011-10-14 20:34:21 +00003078 log->PutCString(" AddOneFunction called with no function and no symbol");
Sean Callanan0fc73582010-07-27 00:55:47 +00003079 return;
3080 }
3081
Greg Clayton567e7f32011-09-22 04:58:26 +00003082 Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
3083
3084 lldb::addr_t load_addr = fun_address->GetCallableLoadAddress(target);
Sean Callanan8f0dc342010-06-22 23:46:24 +00003085 fun_location->SetValueType(Value::eValueTypeLoadAddress);
3086 fun_location->GetScalar() = load_addr;
3087
Jim Inghamfa3a16a2011-03-31 00:19:25 +00003088 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
Sean Callanan47dc4572011-09-15 02:13:07 +00003089 m_parser_vars->m_target_info.byte_order,
3090 m_parser_vars->m_target_info.address_byte_size));
Greg Clayton427f2902010-12-14 02:59:59 +00003091 assert (entity.get());
Greg Clayton8de27c72010-10-15 22:48:33 +00003092 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton427f2902010-12-14 02:59:59 +00003093 entity->SetName(ConstString(decl_name.c_str()));
3094 entity->SetClangType (fun_opaque_type);
3095 entity->SetClangAST (fun_ast_context);
Sean Callanan8f0dc342010-06-22 23:46:24 +00003096
Greg Clayton427f2902010-12-14 02:59:59 +00003097 entity->EnableParserVars();
3098 entity->m_parser_vars->m_named_decl = fun_decl;
3099 entity->m_parser_vars->m_llvm_value = NULL;
3100 entity->m_parser_vars->m_lldb_value = fun_location.release();
Sean Callanan8c127202010-08-23 23:09:38 +00003101
Sean Callanan810f22d2010-07-16 00:09:46 +00003102 if (log)
Greg Clayton8de27c72010-10-15 22:48:33 +00003103 {
Greg Claytona23ca422011-10-20 00:47:21 +00003104 ASTDumper ast_dumper(fun_decl);
Sean Callanana0744822010-11-01 23:22:47 +00003105
Sean Callanan9394b5a2011-10-29 19:50:43 +00003106 log->Printf(" CEDM::FEVD[%u] Found %s function %s, returned %s",
Sean Callanan67bbb112011-10-14 20:34:21 +00003107 current_id,
3108 (fun ? "specific" : "generic"),
3109 decl_name.c_str(),
Greg Claytona23ca422011-10-20 00:47:21 +00003110 ast_dumper.GetCString());
Greg Clayton8de27c72010-10-15 22:48:33 +00003111 }
Chris Lattner24943d22010-06-08 16:52:24 +00003112}
Sean Callanan93a4b1a2010-08-04 01:02:13 +00003113
3114void
3115ClangExpressionDeclMap::AddOneType(NameSearchContext &context,
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00003116 TypeFromUser &ut,
Sean Callanan67bbb112011-10-14 20:34:21 +00003117 unsigned int current_id,
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00003118 bool add_method)
Sean Callanan93a4b1a2010-08-04 01:02:13 +00003119{
Sean Callananf76afff2011-10-28 23:38:38 +00003120 ASTContext *parser_ast_context = m_ast_context;
Sean Callanan9b6898f2011-07-30 02:42:06 +00003121 ASTContext *user_ast_context = ut.GetASTContext();
Sean Callanan93a4b1a2010-08-04 01:02:13 +00003122
Sean Callananee8fc722010-11-19 20:20:02 +00003123 void *copied_type = GuardedCopyType(parser_ast_context, user_ast_context, ut.GetOpaqueQualType());
Sean Callanandc5fce12011-12-01 21:04:37 +00003124
3125 if (!copied_type)
3126 {
3127 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
3128
3129 if (log)
3130 log->Printf("ClangExpressionDeclMap::AddOneType - Couldn't import the type");
3131
3132 return;
3133 }
Sean Callanan9394b5a2011-10-29 19:50:43 +00003134
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00003135 if (add_method && ClangASTContext::IsAggregateType(copied_type))
3136 {
3137 void *args[1];
3138
3139 args[0] = ClangASTContext::GetVoidPtrType(parser_ast_context, false);
3140
Sean Callanan716e3f02011-11-01 18:07:13 +00003141 clang_type_t method_type = ClangASTContext::CreateFunctionType (parser_ast_context,
3142 ClangASTContext::GetBuiltInType_void(parser_ast_context),
3143 args,
3144 1,
3145 false,
3146 ClangASTContext::GetTypeQualifiers(copied_type));
3147
Greg Clayton1d8173f2010-09-24 05:15:53 +00003148 const bool is_virtual = false;
3149 const bool is_static = false;
3150 const bool is_inline = false;
Greg Clayton30449d52010-10-01 02:31:07 +00003151 const bool is_explicit = false;
Sean Callanan28ebe882011-11-02 18:09:01 +00003152 const bool is_attr_used = true;
Sean Callanan2581dbf2011-11-02 01:38:59 +00003153 const bool is_artificial = false;
Greg Clayton30449d52010-10-01 02:31:07 +00003154
Greg Clayton1d8173f2010-09-24 05:15:53 +00003155 ClangASTContext::AddMethodToCXXRecordType (parser_ast_context,
3156 copied_type,
Greg Clayton8de27c72010-10-15 22:48:33 +00003157 "$__lldb_expr",
Greg Clayton1d8173f2010-09-24 05:15:53 +00003158 method_type,
3159 lldb::eAccessPublic,
3160 is_virtual,
3161 is_static,
Greg Clayton30449d52010-10-01 02:31:07 +00003162 is_inline,
Sean Callanan716e3f02011-11-01 18:07:13 +00003163 is_explicit,
Sean Callanan2581dbf2011-11-02 01:38:59 +00003164 is_attr_used,
3165 is_artificial);
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00003166 }
Sean Callanan93a4b1a2010-08-04 01:02:13 +00003167
3168 context.AddTypeDecl(copied_type);
3169}