blob: d879f19985aa5b9ec8e9a4fdc2be22d6e536a092 [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 Callanan6e74dbb2011-02-01 23:43:26 +000025#include "lldb/Expression/ASTDumper.h"
Chris Lattner24943d22010-06-08 16:52:24 +000026#include "lldb/Expression/ClangASTSource.h"
Sean Callanana48fe162010-08-11 03:57:18 +000027#include "lldb/Expression/ClangPersistentVariables.h"
Greg Claytoncd548032011-02-01 01:31:41 +000028#include "lldb/Host/Endian.h"
Chris Lattner24943d22010-06-08 16:52:24 +000029#include "lldb/Symbol/ClangASTContext.h"
Greg Clayton6916e352010-11-13 03:52:47 +000030#include "lldb/Symbol/ClangNamespaceDecl.h"
Chris Lattner24943d22010-06-08 16:52:24 +000031#include "lldb/Symbol/CompileUnit.h"
32#include "lldb/Symbol/Function.h"
33#include "lldb/Symbol/ObjectFile.h"
34#include "lldb/Symbol/SymbolContext.h"
Sean Callanan16b53ab2011-10-12 00:12:34 +000035#include "lldb/Symbol/SymbolVendor.h"
Chris Lattner24943d22010-06-08 16:52:24 +000036#include "lldb/Symbol/Type.h"
37#include "lldb/Symbol/TypeList.h"
38#include "lldb/Symbol/Variable.h"
39#include "lldb/Symbol/VariableList.h"
Sean Callananf328c9f2010-07-20 23:31:16 +000040#include "lldb/Target/ExecutionContext.h"
Sean Callanan810f22d2010-07-16 00:09:46 +000041#include "lldb/Target/Process.h"
Sean Callanan17c6a052010-10-05 20:18:48 +000042#include "lldb/Target/RegisterContext.h"
Chris Lattner24943d22010-06-08 16:52:24 +000043#include "lldb/Target/StackFrame.h"
Sean Callananf328c9f2010-07-20 23:31:16 +000044#include "lldb/Target/Target.h"
Jim Ingham78b9ee82010-12-07 01:56:02 +000045#include "lldb/Target/Thread.h"
Chris Lattner24943d22010-06-08 16:52:24 +000046
Greg Clayton3bc52d02010-11-14 22:13:40 +000047using namespace lldb;
Chris Lattner24943d22010-06-08 16:52:24 +000048using namespace lldb_private;
49using namespace clang;
50
Sean Callanan73b520f2011-10-29 01:58:46 +000051ClangExpressionDeclMap::ClangExpressionDeclMap (bool keep_result_in_memory, ExecutionContext &exe_ctx) :
52 ClangASTSource (exe_ctx.GetTargetSP()),
Greg Clayton8de27c72010-10-15 22:48:33 +000053 m_found_entities (),
54 m_struct_members (),
Stephen Wilsondbeb3e12011-04-11 19:41:40 +000055 m_keep_result_in_memory (keep_result_in_memory),
Sean Callananaa301c42010-12-03 01:38:59 +000056 m_parser_vars (),
Stephen Wilsondbeb3e12011-04-11 19:41:40 +000057 m_struct_vars ()
Chris Lattner24943d22010-06-08 16:52:24 +000058{
Sean Callananaa301c42010-12-03 01:38:59 +000059 EnableStructVars();
Chris Lattner24943d22010-06-08 16:52:24 +000060}
61
62ClangExpressionDeclMap::~ClangExpressionDeclMap()
Sean Callananaa301c42010-12-03 01:38:59 +000063{
Sean Callanan6d284ef2011-10-12 22:20:02 +000064 // Note: The model is now that the parser's AST context and all associated
65 // data does not vanish until the expression has been executed. This means
66 // that valuable lookup data (like namespaces) doesn't vanish, but
67
68 DidParse();
Sean Callananaa301c42010-12-03 01:38:59 +000069 DidDematerialize();
70 DisableStructVars();
71}
Sean Callananc2c6f772010-10-26 00:31:56 +000072
Sean Callanan166ba102011-08-01 18:18:33 +000073bool
Greg Clayton427f2902010-12-14 02:59:59 +000074ClangExpressionDeclMap::WillParse(ExecutionContext &exe_ctx)
Sean Callananaa301c42010-12-03 01:38:59 +000075{
76 EnableParserVars();
77 m_parser_vars->m_exe_ctx = &exe_ctx;
Greg Clayton567e7f32011-09-22 04:58:26 +000078
79 Target *target = exe_ctx.GetTargetPtr();
80 if (exe_ctx.GetFramePtr())
81 m_parser_vars->m_sym_ctx = exe_ctx.GetFramePtr()->GetSymbolContext(lldb::eSymbolContextEverything);
82 else if (exe_ctx.GetThreadPtr())
83 m_parser_vars->m_sym_ctx = exe_ctx.GetThreadPtr()->GetStackFrameAtIndex(0)->GetSymbolContext(lldb::eSymbolContextEverything);
84 else if (exe_ctx.GetProcessPtr())
Greg Clayton987c7eb2011-09-17 08:33:22 +000085 {
86 m_parser_vars->m_sym_ctx.Clear();
Greg Clayton567e7f32011-09-22 04:58:26 +000087 m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP();
Greg Clayton987c7eb2011-09-17 08:33:22 +000088 }
Greg Clayton567e7f32011-09-22 04:58:26 +000089 else if (target)
Greg Clayton987c7eb2011-09-17 08:33:22 +000090 {
91 m_parser_vars->m_sym_ctx.Clear();
Greg Clayton567e7f32011-09-22 04:58:26 +000092 m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP();
Greg Clayton987c7eb2011-09-17 08:33:22 +000093 }
Sean Callanan97ad47f2011-09-15 18:41:04 +000094
Greg Clayton567e7f32011-09-22 04:58:26 +000095 if (target)
96 {
97 m_parser_vars->m_persistent_vars = &target->GetPersistentVariables();
Sean Callanan166ba102011-08-01 18:18:33 +000098
Greg Clayton567e7f32011-09-22 04:58:26 +000099 if (!target->GetScratchClangASTContext())
100 return false;
101 }
Sean Callanan166ba102011-08-01 18:18:33 +0000102
Sean Callanan47dc4572011-09-15 02:13:07 +0000103 m_parser_vars->m_target_info = GetTargetInfo();
104
Sean Callanan166ba102011-08-01 18:18:33 +0000105 return true;
Sean Callananaa301c42010-12-03 01:38:59 +0000106}
107
Greg Clayton427f2902010-12-14 02:59:59 +0000108void
109ClangExpressionDeclMap::DidParse()
Sean Callananaa301c42010-12-03 01:38:59 +0000110{
111 if (m_parser_vars.get())
112 {
Greg Clayton427f2902010-12-14 02:59:59 +0000113 for (size_t entity_index = 0, num_entities = m_found_entities.GetSize();
Sean Callananaa301c42010-12-03 01:38:59 +0000114 entity_index < num_entities;
115 ++entity_index)
116 {
Greg Clayton427f2902010-12-14 02:59:59 +0000117 ClangExpressionVariableSP var_sp(m_found_entities.GetVariableAtIndex(entity_index));
118 if (var_sp &&
119 var_sp->m_parser_vars.get() &&
120 var_sp->m_parser_vars->m_lldb_value)
121 delete var_sp->m_parser_vars->m_lldb_value;
Sean Callananaa301c42010-12-03 01:38:59 +0000122
Greg Clayton427f2902010-12-14 02:59:59 +0000123 var_sp->DisableParserVars();
Sean Callananaa301c42010-12-03 01:38:59 +0000124 }
125
Greg Clayton427f2902010-12-14 02:59:59 +0000126 for (size_t pvar_index = 0, num_pvars = m_parser_vars->m_persistent_vars->GetSize();
Sean Callananaa301c42010-12-03 01:38:59 +0000127 pvar_index < num_pvars;
128 ++pvar_index)
129 {
Greg Clayton427f2902010-12-14 02:59:59 +0000130 ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariableAtIndex(pvar_index));
131 if (pvar_sp)
132 pvar_sp->DisableParserVars();
Sean Callananaa301c42010-12-03 01:38:59 +0000133 }
134
135 DisableParserVars();
Sean Callanan7a60b942010-10-08 01:58:41 +0000136 }
Chris Lattner24943d22010-06-08 16:52:24 +0000137}
138
Sean Callanan8bce6652010-07-13 21:41:46 +0000139// Interface for IRForTarget
140
Sean Callanan47dc4572011-09-15 02:13:07 +0000141ClangExpressionDeclMap::TargetInfo
142ClangExpressionDeclMap::GetTargetInfo()
143{
144 assert (m_parser_vars.get());
145
146 TargetInfo ret;
147
148 ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
Greg Clayton567e7f32011-09-22 04:58:26 +0000149 if (exe_ctx)
Sean Callanan47dc4572011-09-15 02:13:07 +0000150 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000151 Process *process = exe_ctx->GetProcessPtr();
152 if (process)
153 {
154 ret.byte_order = process->GetByteOrder();
155 ret.address_byte_size = process->GetAddressByteSize();
156 }
157 else
158 {
159 Target *target = exe_ctx->GetTargetPtr();
160 if (target)
161 {
162 ret.byte_order = target->GetArchitecture().GetByteOrder();
163 ret.address_byte_size = target->GetArchitecture().GetAddressByteSize();
164 }
165 }
Sean Callanan47dc4572011-09-15 02:13:07 +0000166 }
167
168 return ret;
169}
170
Greg Clayton8de27c72010-10-15 22:48:33 +0000171const ConstString &
172ClangExpressionDeclMap::GetPersistentResultName ()
Sean Callanan82b74c82010-08-12 01:56:52 +0000173{
Sean Callananaa301c42010-12-03 01:38:59 +0000174 assert (m_struct_vars.get());
175 assert (m_parser_vars.get());
Sean Callananaa301c42010-12-03 01:38:59 +0000176 if (!m_struct_vars->m_result_name)
Greg Clayton427f2902010-12-14 02:59:59 +0000177 {
178 Target *target = m_parser_vars->GetTarget();
179 assert (target);
180 m_struct_vars->m_result_name = target->GetPersistentVariables().GetNextPersistentVariableName();
181 }
Sean Callananaa301c42010-12-03 01:38:59 +0000182 return m_struct_vars->m_result_name;
Sean Callanan82b74c82010-08-12 01:56:52 +0000183}
184
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000185lldb::ClangExpressionVariableSP
186ClangExpressionDeclMap::BuildIntegerVariable (const ConstString &name,
187 lldb_private::TypeFromParser type,
188 const llvm::APInt& value)
189{
190 assert (m_parser_vars.get());
Sean Callanan166ba102011-08-01 18:18:33 +0000191
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000192 ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
Greg Clayton567e7f32011-09-22 04:58:26 +0000193 if (exe_ctx == NULL)
194 return lldb::ClangExpressionVariableSP();
195 Target *target = exe_ctx->GetTargetPtr();
196
197 ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000198
Sean Callanan5a55c7a2011-11-18 03:28:09 +0000199 TypeFromUser user_type(m_ast_importer->CopyType(context,
200 type.GetASTContext(),
201 type.GetOpaqueQualType()),
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000202 context);
Sean Callanan47dc4572011-09-15 02:13:07 +0000203
Sean Callanandc5fce12011-12-01 21:04:37 +0000204 if (!user_type.GetOpaqueQualType())
205 {
206 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
207
208 if (log)
209 log->Printf("ClangExpressionDeclMap::BuildIntegerVariable - Couldn't export the type for a constant integer result");
210
211 return lldb::ClangExpressionVariableSP();
212 }
213
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000214 if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx->GetBestExecutionContextScope (),
215 name,
Sean Callanan0e0817d2011-01-04 02:41:41 +0000216 user_type,
Sean Callanan47dc4572011-09-15 02:13:07 +0000217 m_parser_vars->m_target_info.byte_order,
218 m_parser_vars->m_target_info.address_byte_size))
Sean Callanan0e0817d2011-01-04 02:41:41 +0000219 return lldb::ClangExpressionVariableSP();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000220
Sean Callanan0e0817d2011-01-04 02:41:41 +0000221 ClangExpressionVariableSP pvar_sp (m_parser_vars->m_persistent_vars->GetVariable(name));
222
223 if (!pvar_sp)
224 return lldb::ClangExpressionVariableSP();
225
226 uint8_t *pvar_data = pvar_sp->GetValueBytes();
227 if (pvar_data == NULL)
228 return lldb::ClangExpressionVariableSP();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000229
230 uint64_t value64 = value.getLimitedValue();
Sean Callanan47dc4572011-09-15 02:13:07 +0000231
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000232 size_t num_val_bytes = sizeof(value64);
Sean Callanan0e0817d2011-01-04 02:41:41 +0000233 size_t num_data_bytes = pvar_sp->GetByteSize();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000234
235 size_t num_bytes = num_val_bytes;
236 if (num_bytes > num_data_bytes)
237 num_bytes = num_data_bytes;
238
Johnny Chen2bc9eb32011-07-19 19:48:13 +0000239 for (size_t byte_idx = 0;
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000240 byte_idx < num_bytes;
241 ++byte_idx)
242 {
243 uint64_t shift = byte_idx * 8;
244 uint64_t mask = 0xffll << shift;
245 uint8_t cur_byte = (uint8_t)((value64 & mask) >> shift);
246
Sean Callanan47dc4572011-09-15 02:13:07 +0000247 switch (m_parser_vars->m_target_info.byte_order)
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000248 {
Sean Callanan0e0817d2011-01-04 02:41:41 +0000249 case eByteOrderBig:
250 // High Low
251 // Original: |AABBCCDDEEFFGGHH|
252 // Target: |EEFFGGHH|
253
254 pvar_data[num_data_bytes - (1 + byte_idx)] = cur_byte;
255 break;
256 case eByteOrderLittle:
257 // Target: |HHGGFFEE|
258 pvar_data[byte_idx] = cur_byte;
259 break;
260 default:
261 return lldb::ClangExpressionVariableSP();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000262 }
263 }
Sean Callanan6a925532011-01-13 08:53:35 +0000264
265 pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried;
Sean Callanan696cf5f2011-05-07 01:06:41 +0000266 pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
267 pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
Sean Callanan0e0817d2011-01-04 02:41:41 +0000268
269 return pvar_sp;
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000270}
271
Sean Callanan696cf5f2011-05-07 01:06:41 +0000272lldb::ClangExpressionVariableSP
273ClangExpressionDeclMap::BuildCastVariable (const ConstString &name,
Sean Callanan9b6898f2011-07-30 02:42:06 +0000274 VarDecl *decl,
Sean Callanan696cf5f2011-05-07 01:06:41 +0000275 lldb_private::TypeFromParser type)
276{
277 assert (m_parser_vars.get());
278
279 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
280
281 ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
Greg Clayton567e7f32011-09-22 04:58:26 +0000282 if (exe_ctx == NULL)
283 return lldb::ClangExpressionVariableSP();
284 Target *target = exe_ctx->GetTargetPtr();
285 if (target == NULL)
286 return lldb::ClangExpressionVariableSP();
287
288 ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
Sean Callanan696cf5f2011-05-07 01:06:41 +0000289
290 ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl));
291
292 if (!var_sp)
293 var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl);
294
295 if (!var_sp)
296 return ClangExpressionVariableSP();
297
Sean Callanan5a55c7a2011-11-18 03:28:09 +0000298 TypeFromUser user_type(m_ast_importer->CopyType(context,
299 type.GetASTContext(),
300 type.GetOpaqueQualType()),
Sean Callanan696cf5f2011-05-07 01:06:41 +0000301 context);
302
Sean Callanandc5fce12011-12-01 21:04:37 +0000303 if (!user_type.GetOpaqueQualType())
304 {
305 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
306
307 if (log)
308 log->Printf("ClangExpressionDeclMap::BuildCastVariable - Couldn't export the type for a constant cast result");
309
310 return lldb::ClangExpressionVariableSP();
311 }
312
Sean Callanan696cf5f2011-05-07 01:06:41 +0000313 TypeFromUser var_type = var_sp->GetTypeFromUser();
314
Greg Clayton567e7f32011-09-22 04:58:26 +0000315 StackFrame *frame = exe_ctx->GetFramePtr();
316 if (frame == NULL)
317 return lldb::ClangExpressionVariableSP();
318
319 VariableSP var = FindVariableInScope (*frame, var_sp->GetName(), &var_type);
Sean Callanan696cf5f2011-05-07 01:06:41 +0000320
321 if (!var)
322 return lldb::ClangExpressionVariableSP(); // but we should handle this; it may be a persistent variable
323
Greg Clayton567e7f32011-09-22 04:58:26 +0000324 ValueObjectSP var_valobj = frame->GetValueObjectForFrameVariable(var, lldb::eNoDynamicValues);
Sean Callanan696cf5f2011-05-07 01:06:41 +0000325
326 if (!var_valobj)
327 return lldb::ClangExpressionVariableSP();
328
329 ValueObjectSP var_casted_valobj = var_valobj->CastPointerType(name.GetCString(), user_type);
330
331 if (!var_casted_valobj)
332 return lldb::ClangExpressionVariableSP();
333
334 if (log)
335 {
336 StreamString my_stream_string;
337
338 ClangASTType::DumpTypeDescription (var_type.GetASTContext(),
339 var_type.GetOpaqueQualType(),
340 &my_stream_string);
341
342
343 log->Printf("Building cast variable to type: %s", my_stream_string.GetString().c_str());
344 }
345
346 ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->CreatePersistentVariable (var_casted_valobj);
347
348 if (!pvar_sp)
349 return lldb::ClangExpressionVariableSP();
350
351 if (pvar_sp != m_parser_vars->m_persistent_vars->GetVariable(name))
352 return lldb::ClangExpressionVariableSP();
353
354 pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried;
355 pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
356 pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
357
358 return pvar_sp;
359}
360
Sean Callanan47dc4572011-09-15 02:13:07 +0000361bool
362ClangExpressionDeclMap::ResultIsReference (const ConstString &name)
363{
364 ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name);
365
366 return (pvar_sp->m_flags & ClangExpressionVariable::EVIsProgramReference);
367}
368
369bool
370ClangExpressionDeclMap::CompleteResultVariable (lldb::ClangExpressionVariableSP &valobj,
371 lldb_private::Value &value,
372 const ConstString &name,
Sean Callanana8428a42011-09-22 00:41:11 +0000373 lldb_private::TypeFromParser type,
Sean Callanan557ccd62011-10-21 05:18:02 +0000374 bool transient,
375 bool maybe_make_load)
Sean Callanan47dc4572011-09-15 02:13:07 +0000376{
377 assert (m_parser_vars.get());
378
379 ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name);
380
381 if (!pvar_sp)
382 return false;
Sean Callanan557ccd62011-10-21 05:18:02 +0000383
384 if (maybe_make_load &&
385 value.GetValueType() == Value::eValueTypeFileAddress &&
386 m_parser_vars->m_exe_ctx &&
387 m_parser_vars->m_exe_ctx->GetProcessPtr())
388 {
389 value.SetValueType(Value::eValueTypeLoadAddress);
390 }
Sean Callanan47dc4572011-09-15 02:13:07 +0000391
392 if (pvar_sp->m_flags & ClangExpressionVariable::EVIsProgramReference &&
Sean Callanana8428a42011-09-22 00:41:11 +0000393 !pvar_sp->m_live_sp &&
394 !transient)
Sean Callanan47dc4572011-09-15 02:13:07 +0000395 {
396 // The reference comes from the program. We need to set up a live SP for it.
397
398 pvar_sp->m_live_sp = ValueObjectConstResult::Create(m_parser_vars->m_exe_ctx->GetBestExecutionContextScope(),
399 pvar_sp->GetTypeFromUser().GetASTContext(),
400 pvar_sp->GetTypeFromUser().GetOpaqueQualType(),
401 pvar_sp->GetName(),
402 value.GetScalar().ULongLong(),
403 value.GetValueAddressType(),
404 pvar_sp->GetByteSize());
405 }
406
407 if (pvar_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry)
408 {
409 pvar_sp->ValueUpdated();
410
411 const size_t pvar_byte_size = pvar_sp->GetByteSize();
412 uint8_t *pvar_data = pvar_sp->GetValueBytes();
413
414 if (!ReadTarget(pvar_data, value, pvar_byte_size))
415 return false;
416
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 &&
1034 m_parser_vars->m_exe_ctx->GetProcessSP() &&
1035 m_parser_vars->m_exe_ctx->GetProcessSP()->IsAlive())
Sean Callanana8428a42011-09-22 00:41:11 +00001036 {
Sean Callanan4b3cef02011-10-26 21:20:00 +00001037 return persistent_var_sp->m_live_sp->GetValue();
Sean Callanana8428a42011-09-22 00:41:11 +00001038 }
1039 else
1040 {
1041 lldb_private::Value ret;
1042 ret.SetValueType(Value::eValueTypeHostAddress);
1043 ret.SetContext(Value::eContextTypeInvalid, NULL);
1044 ret.GetScalar() = (lldb::addr_t)persistent_var_sp->GetValueBytes();
1045 return ret;
1046 }
Sean Callanan47dc4572011-09-15 02:13:07 +00001047 }
1048 else
1049 {
1050 return Value();
1051 }
1052}
1053
Sean Callanan4b3cef02011-10-26 21:20:00 +00001054Value
1055ClangExpressionDeclMap::GetSpecialValue (const ConstString &name)
1056{
1057 assert(m_parser_vars.get());
1058
1059 if (!m_parser_vars->m_exe_ctx)
1060 return Value();
1061
1062 StackFrame *frame = m_parser_vars->m_exe_ctx->GetFramePtr();
1063
1064 if (!frame)
1065 return Value();
1066
1067 VariableList *vars = frame->GetVariableList(false);
1068
1069 if (!vars)
1070 return Value();
1071
1072 lldb::VariableSP var = vars->FindVariable(name);
1073
1074 if (!var ||
1075 !var->IsInScope(frame) ||
1076 !var->LocationIsValidForFrame (frame))
1077 return Value();
1078
1079 std::auto_ptr<Value> value(GetVariableValue(*m_parser_vars->m_exe_ctx, var, NULL));
1080
Sean Callanan41a410d2011-11-03 22:48:37 +00001081 if (value.get() && value->GetValueType() == Value::eValueTypeLoadAddress)
1082 {
1083 Process *process = m_parser_vars->m_exe_ctx->GetProcessPtr();
1084
1085 if (!process)
1086 return Value();
1087
1088 lldb::addr_t value_addr = value->GetScalar().ULongLong();
1089 Error read_error;
1090 addr_t ptr_value = process->ReadPointerFromMemory (value_addr, read_error);
1091
1092 if (!read_error.Success())
1093 return Value();
1094
1095 value->GetScalar() = (unsigned long long)ptr_value;
1096 }
1097
Sean Callanan4b3cef02011-10-26 21:20:00 +00001098 if (value.get())
1099 return *value;
1100 else
1101 return Value();
1102}
1103
Sean Callanan810f22d2010-07-16 00:09:46 +00001104// Interface for CommandObjectExpression
Sean Callananf328c9f2010-07-20 23:31:16 +00001105
1106bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001107ClangExpressionDeclMap::Materialize
1108(
Sean Callananaa301c42010-12-03 01:38:59 +00001109 ExecutionContext &exe_ctx,
Greg Clayton8de27c72010-10-15 22:48:33 +00001110 lldb::addr_t &struct_address,
1111 Error &err
1112)
Sean Callananf328c9f2010-07-20 23:31:16 +00001113{
Sean Callananaa301c42010-12-03 01:38:59 +00001114 EnableMaterialVars();
1115
Greg Clayton567e7f32011-09-22 04:58:26 +00001116 m_material_vars->m_process = exe_ctx.GetProcessPtr();
Sean Callananaa301c42010-12-03 01:38:59 +00001117
Sean Callanan0ddf8062011-05-09 22:04:36 +00001118 bool result = DoMaterialize(false /* dematerialize */,
1119 exe_ctx,
1120 LLDB_INVALID_ADDRESS /* top of stack frame */,
1121 LLDB_INVALID_ADDRESS /* bottom of stack frame */,
1122 NULL, /* result SP */
1123 err);
Sean Callananf328c9f2010-07-20 23:31:16 +00001124
1125 if (result)
Sean Callananaa301c42010-12-03 01:38:59 +00001126 struct_address = m_material_vars->m_materialized_location;
Sean Callananf328c9f2010-07-20 23:31:16 +00001127
1128 return result;
1129}
1130
1131bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001132ClangExpressionDeclMap::GetObjectPointer
1133(
1134 lldb::addr_t &object_ptr,
Sean Callanan3aa7da52010-12-13 22:46:15 +00001135 ConstString &object_name,
Sean Callananaa301c42010-12-03 01:38:59 +00001136 ExecutionContext &exe_ctx,
Sean Callanan047923c2010-12-14 00:42:36 +00001137 Error &err,
1138 bool suppress_type_check
Greg Clayton8de27c72010-10-15 22:48:33 +00001139)
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001140{
Sean Callananaa301c42010-12-03 01:38:59 +00001141 assert (m_struct_vars.get());
1142
Greg Clayton567e7f32011-09-22 04:58:26 +00001143 Target *target = exe_ctx.GetTargetPtr();
1144 Process *process = exe_ctx.GetProcessPtr();
1145 StackFrame *frame = exe_ctx.GetFramePtr();
1146
1147 if (frame == NULL || process == NULL || target == NULL)
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001148 {
Sean Callanane6ea5fe2011-11-15 02:11:17 +00001149 err.SetErrorStringWithFormat("Couldn't load '%s' because the context is incomplete", object_name.AsCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001150 return false;
1151 }
1152
Sean Callananaa301c42010-12-03 01:38:59 +00001153 if (!m_struct_vars->m_object_pointer_type.GetOpaqueQualType())
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001154 {
Sean Callanane6ea5fe2011-11-15 02:11:17 +00001155 err.SetErrorStringWithFormat("Couldn't load '%s' because its type is unknown", object_name.AsCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001156 return false;
1157 }
1158
Greg Clayton567e7f32011-09-22 04:58:26 +00001159 VariableSP object_ptr_var = FindVariableInScope (*frame,
Sean Callanan696cf5f2011-05-07 01:06:41 +00001160 object_name,
1161 (suppress_type_check ? NULL : &m_struct_vars->m_object_pointer_type));
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001162
1163 if (!object_ptr_var)
1164 {
Sean Callanane6ea5fe2011-11-15 02:11:17 +00001165 err.SetErrorStringWithFormat("Couldn't find '%s' with appropriate type in scope", object_name.AsCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001166 return false;
1167 }
1168
Sean Callananaa301c42010-12-03 01:38:59 +00001169 std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(exe_ctx,
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001170 object_ptr_var,
Sean Callananaa301c42010-12-03 01:38:59 +00001171 NULL));
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001172
1173 if (!location_value.get())
1174 {
Sean Callanan3aa7da52010-12-13 22:46:15 +00001175 err.SetErrorStringWithFormat("Couldn't get the location for '%s'", object_name.GetCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001176 return false;
1177 }
1178
Sean Callanan50339fe2011-03-04 00:23:47 +00001179 switch (location_value->GetValueType())
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001180 {
Sean Callanan50339fe2011-03-04 00:23:47 +00001181 default:
Sean Callanan3aa7da52010-12-13 22:46:15 +00001182 err.SetErrorStringWithFormat("'%s' is not in memory; LLDB must be extended to handle registers", object_name.GetCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001183 return false;
Sean Callanan50339fe2011-03-04 00:23:47 +00001184 case Value::eValueTypeLoadAddress:
1185 {
1186 lldb::addr_t value_addr = location_value->GetScalar().ULongLong();
Greg Clayton567e7f32011-09-22 04:58:26 +00001187 uint32_t address_byte_size = target->GetArchitecture().GetAddressByteSize();
Sean Callanan50339fe2011-03-04 00:23:47 +00001188
1189 if (ClangASTType::GetClangTypeBitWidth(m_struct_vars->m_object_pointer_type.GetASTContext(),
1190 m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) != address_byte_size * 8)
1191 {
1192 err.SetErrorStringWithFormat("'%s' is not of an expected pointer size", object_name.GetCString());
1193 return false;
1194 }
1195
Sean Callanan50339fe2011-03-04 00:23:47 +00001196 Error read_error;
Greg Clayton567e7f32011-09-22 04:58:26 +00001197 object_ptr = process->ReadPointerFromMemory (value_addr, read_error);
Greg Claytonc0fa5332011-05-22 22:46:53 +00001198 if (read_error.Fail() || object_ptr == LLDB_INVALID_ADDRESS)
Sean Callanan50339fe2011-03-04 00:23:47 +00001199 {
1200 err.SetErrorStringWithFormat("Coldn't read '%s' from the target: %s", object_name.GetCString(), read_error.AsCString());
1201 return false;
Greg Claytonc0fa5332011-05-22 22:46:53 +00001202 }
Sean Callanan50339fe2011-03-04 00:23:47 +00001203 return true;
1204 }
1205 case Value::eValueTypeScalar:
1206 {
1207 if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
1208 {
1209 StreamString ss;
1210 location_value->Dump(&ss);
1211
1212 err.SetErrorStringWithFormat("%s is a scalar of unhandled type: %s", object_name.GetCString(), ss.GetString().c_str());
1213 return false;
1214 }
1215
Greg Clayton061b79d2011-05-09 20:18:18 +00001216 RegisterInfo *reg_info = location_value->GetRegisterInfo();
Sean Callanan50339fe2011-03-04 00:23:47 +00001217
Greg Clayton061b79d2011-05-09 20:18:18 +00001218 if (!reg_info)
Sean Callanan50339fe2011-03-04 00:23:47 +00001219 {
1220 err.SetErrorStringWithFormat("Couldn't get the register information for %s", object_name.GetCString());
1221 return false;
1222 }
1223
Greg Clayton061b79d2011-05-09 20:18:18 +00001224 RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
Sean Callanan50339fe2011-03-04 00:23:47 +00001225
Greg Clayton061b79d2011-05-09 20:18:18 +00001226 if (!reg_ctx)
Sean Callanan50339fe2011-03-04 00:23:47 +00001227 {
Greg Clayton061b79d2011-05-09 20:18:18 +00001228 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 +00001229 return false;
1230 }
1231
Greg Clayton061b79d2011-05-09 20:18:18 +00001232 uint32_t register_number = reg_info->kinds[lldb::eRegisterKindLLDB];
Sean Callanan50339fe2011-03-04 00:23:47 +00001233
Greg Clayton061b79d2011-05-09 20:18:18 +00001234 object_ptr = reg_ctx->ReadRegisterAsUnsigned(register_number, 0x0);
Sean Callanan50339fe2011-03-04 00:23:47 +00001235
1236 return true;
1237 }
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001238 }
1239}
1240
1241bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001242ClangExpressionDeclMap::Dematerialize
1243(
Sean Callananaa301c42010-12-03 01:38:59 +00001244 ExecutionContext &exe_ctx,
Greg Clayton427f2902010-12-14 02:59:59 +00001245 ClangExpressionVariableSP &result_sp,
Sean Callanan0ddf8062011-05-09 22:04:36 +00001246 lldb::addr_t stack_frame_top,
1247 lldb::addr_t stack_frame_bottom,
Greg Clayton8de27c72010-10-15 22:48:33 +00001248 Error &err
1249)
Sean Callananf328c9f2010-07-20 23:31:16 +00001250{
Sean Callanan0ddf8062011-05-09 22:04:36 +00001251 return DoMaterialize(true, exe_ctx, stack_frame_top, stack_frame_bottom, &result_sp, err);
Sean Callananaa301c42010-12-03 01:38:59 +00001252
1253 DidDematerialize();
1254}
1255
1256void
1257ClangExpressionDeclMap::DidDematerialize()
1258{
1259 if (m_material_vars.get())
1260 {
1261 if (m_material_vars->m_materialized_location)
1262 {
1263 //#define SINGLE_STEP_EXPRESSIONS
1264
1265#ifndef SINGLE_STEP_EXPRESSIONS
1266 m_material_vars->m_process->DeallocateMemory(m_material_vars->m_materialized_location);
1267#endif
1268 m_material_vars->m_materialized_location = 0;
1269 }
1270
1271 DisableMaterialVars();
1272 }
Sean Callananf328c9f2010-07-20 23:31:16 +00001273}
1274
Sean Callanan32824aa2010-07-23 22:19:18 +00001275bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001276ClangExpressionDeclMap::DumpMaterializedStruct
1277(
Sean Callananaa301c42010-12-03 01:38:59 +00001278 ExecutionContext &exe_ctx,
Greg Clayton8de27c72010-10-15 22:48:33 +00001279 Stream &s,
1280 Error &err
1281)
Sean Callanan32824aa2010-07-23 22:19:18 +00001282{
Sean Callananaa301c42010-12-03 01:38:59 +00001283 assert (m_struct_vars.get());
1284 assert (m_material_vars.get());
1285
1286 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan32824aa2010-07-23 22:19:18 +00001287 {
1288 err.SetErrorString("Structure hasn't been laid out yet");
1289 return false;
1290 }
Greg Clayton567e7f32011-09-22 04:58:26 +00001291 Process *process = exe_ctx.GetProcessPtr();
1292
1293 if (!process)
Sean Callanan32824aa2010-07-23 22:19:18 +00001294 {
1295 err.SetErrorString("Couldn't find the process");
1296 return false;
1297 }
1298
Greg Clayton567e7f32011-09-22 04:58:26 +00001299 Target *target = exe_ctx.GetTargetPtr();
1300 if (!target)
Sean Callanan32824aa2010-07-23 22:19:18 +00001301 {
1302 err.SetErrorString("Couldn't find the target");
1303 return false;
1304 }
1305
Sean Callanan33711022010-12-07 10:00:20 +00001306 if (!m_material_vars->m_materialized_location)
1307 {
1308 err.SetErrorString("No materialized location");
1309 return false;
1310 }
1311
Greg Claytonc0fa5332011-05-22 22:46:53 +00001312 lldb::DataBufferSP data_sp(new DataBufferHeap(m_struct_vars->m_struct_size, 0));
Sean Callanan32824aa2010-07-23 22:19:18 +00001313
1314 Error error;
Greg Clayton567e7f32011-09-22 04:58:26 +00001315 if (process->ReadMemory (m_material_vars->m_materialized_location,
Greg Claytonc0fa5332011-05-22 22:46:53 +00001316 data_sp->GetBytes(),
1317 data_sp->GetByteSize(), error) != data_sp->GetByteSize())
Sean Callanan32824aa2010-07-23 22:19:18 +00001318 {
1319 err.SetErrorStringWithFormat ("Couldn't read struct from the target: %s", error.AsCString());
1320 return false;
1321 }
1322
Greg Clayton567e7f32011-09-22 04:58:26 +00001323 DataExtractor extractor(data_sp, process->GetByteOrder(), target->GetArchitecture().GetAddressByteSize());
Sean Callanan32824aa2010-07-23 22:19:18 +00001324
Greg Clayton427f2902010-12-14 02:59:59 +00001325 for (size_t member_idx = 0, num_members = m_struct_members.GetSize();
1326 member_idx < num_members;
1327 ++member_idx)
Sean Callanan32824aa2010-07-23 22:19:18 +00001328 {
Greg Clayton427f2902010-12-14 02:59:59 +00001329 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_idx));
Sean Callanan32824aa2010-07-23 22:19:18 +00001330
Greg Clayton427f2902010-12-14 02:59:59 +00001331 if (!member_sp)
1332 return false;
1333
1334 s.Printf("[%s]\n", member_sp->GetName().GetCString());
Sean Callanan8c127202010-08-23 23:09:38 +00001335
Greg Clayton427f2902010-12-14 02:59:59 +00001336 if (!member_sp->m_jit_vars.get())
Sean Callanan8c127202010-08-23 23:09:38 +00001337 return false;
1338
Greg Clayton427f2902010-12-14 02:59:59 +00001339 extractor.Dump (&s, // stream
1340 member_sp->m_jit_vars->m_offset, // offset
1341 lldb::eFormatBytesWithASCII, // format
1342 1, // byte size of individual entries
1343 member_sp->m_jit_vars->m_size, // number of entries
1344 16, // entries per line
1345 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, // address to print
1346 0, // bit size (bitfields only; 0 means ignore)
1347 0); // bit alignment (bitfields only; 0 means ignore)
Sean Callanan32824aa2010-07-23 22:19:18 +00001348
1349 s.PutChar('\n');
1350 }
1351
1352 return true;
1353}
1354
Sean Callananf328c9f2010-07-20 23:31:16 +00001355bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001356ClangExpressionDeclMap::DoMaterialize
1357(
1358 bool dematerialize,
Sean Callananaa301c42010-12-03 01:38:59 +00001359 ExecutionContext &exe_ctx,
Sean Callanan0ddf8062011-05-09 22:04:36 +00001360 lldb::addr_t stack_frame_top,
1361 lldb::addr_t stack_frame_bottom,
Greg Clayton427f2902010-12-14 02:59:59 +00001362 lldb::ClangExpressionVariableSP *result_sp_ptr,
Greg Clayton8de27c72010-10-15 22:48:33 +00001363 Error &err
1364)
Sean Callanan810f22d2010-07-16 00:09:46 +00001365{
Greg Clayton427f2902010-12-14 02:59:59 +00001366 if (result_sp_ptr)
1367 result_sp_ptr->reset();
1368
Sean Callananaa301c42010-12-03 01:38:59 +00001369 assert (m_struct_vars.get());
1370
Greg Claytone005f2c2010-11-06 01:53:30 +00001371 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan82b74c82010-08-12 01:56:52 +00001372
Sean Callananaa301c42010-12-03 01:38:59 +00001373 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan810f22d2010-07-16 00:09:46 +00001374 {
1375 err.SetErrorString("Structure hasn't been laid out yet");
Greg Clayton57067a02011-09-13 04:03:52 +00001376 return false;
Sean Callanan810f22d2010-07-16 00:09:46 +00001377 }
1378
Greg Clayton567e7f32011-09-22 04:58:26 +00001379 StackFrame *frame = exe_ctx.GetFramePtr();
1380 if (!frame)
Sean Callanan45839272010-07-24 01:37:44 +00001381 {
1382 err.SetErrorString("Received null execution frame");
Greg Clayton57067a02011-09-13 04:03:52 +00001383 return false;
Sean Callanan45839272010-07-24 01:37:44 +00001384 }
Greg Clayton567e7f32011-09-22 04:58:26 +00001385 Target *target = exe_ctx.GetTargetPtr();
Sean Callanan45839272010-07-24 01:37:44 +00001386
Greg Clayton567e7f32011-09-22 04:58:26 +00001387 ClangPersistentVariables &persistent_vars = target->GetPersistentVariables();
Sean Callananaa301c42010-12-03 01:38:59 +00001388
1389 if (!m_struct_vars->m_struct_size)
Sean Callanane8a59a82010-09-13 21:34:21 +00001390 {
1391 if (log)
1392 log->PutCString("Not bothering to allocate a struct because no arguments are needed");
1393
Sean Callanan9b6898f2011-07-30 02:42:06 +00001394 m_material_vars->m_allocated_area = NULL;
Sean Callanane8a59a82010-09-13 21:34:21 +00001395
1396 return true;
1397 }
1398
Greg Clayton567e7f32011-09-22 04:58:26 +00001399 const SymbolContext &sym_ctx(frame->GetSymbolContext(lldb::eSymbolContextEverything));
Sean Callanan810f22d2010-07-16 00:09:46 +00001400
Sean Callananf328c9f2010-07-20 23:31:16 +00001401 if (!dematerialize)
Sean Callanan810f22d2010-07-16 00:09:46 +00001402 {
Greg Clayton567e7f32011-09-22 04:58:26 +00001403 Process *process = exe_ctx.GetProcessPtr();
Sean Callananaa301c42010-12-03 01:38:59 +00001404 if (m_material_vars->m_materialized_location)
Sean Callananf328c9f2010-07-20 23:31:16 +00001405 {
Greg Clayton567e7f32011-09-22 04:58:26 +00001406 process->DeallocateMemory(m_material_vars->m_materialized_location);
Sean Callananaa301c42010-12-03 01:38:59 +00001407 m_material_vars->m_materialized_location = 0;
Sean Callananf328c9f2010-07-20 23:31:16 +00001408 }
1409
Sean Callanan7a60b942010-10-08 01:58:41 +00001410 if (log)
1411 log->PutCString("Allocating memory for materialized argument struct");
1412
Greg Clayton567e7f32011-09-22 04:58:26 +00001413 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 +00001414 lldb::ePermissionsReadable | lldb::ePermissionsWritable,
1415 err);
Sean Callananf328c9f2010-07-20 23:31:16 +00001416
1417 if (mem == LLDB_INVALID_ADDRESS)
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001418 {
1419 err.SetErrorStringWithFormat("Couldn't allocate 0x%llx bytes for materialized argument struct",
1420 (unsigned long long)(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size));
Sean Callananf328c9f2010-07-20 23:31:16 +00001421 return false;
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001422 }
1423
Sean Callananaa301c42010-12-03 01:38:59 +00001424 m_material_vars->m_allocated_area = mem;
Sean Callanan810f22d2010-07-16 00:09:46 +00001425 }
1426
Sean Callananaa301c42010-12-03 01:38:59 +00001427 m_material_vars->m_materialized_location = m_material_vars->m_allocated_area;
Sean Callananf328c9f2010-07-20 23:31:16 +00001428
Sean Callananaa301c42010-12-03 01:38:59 +00001429 if (m_material_vars->m_materialized_location % m_struct_vars->m_struct_alignment)
1430 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 +00001431
Greg Clayton427f2902010-12-14 02:59:59 +00001432 for (uint64_t member_index = 0, num_members = m_struct_members.GetSize();
Sean Callanan8c127202010-08-23 23:09:38 +00001433 member_index < num_members;
1434 ++member_index)
Sean Callanan810f22d2010-07-16 00:09:46 +00001435 {
Greg Clayton427f2902010-12-14 02:59:59 +00001436 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
Sean Callanan810f22d2010-07-16 00:09:46 +00001437
Greg Claytona875b642011-01-09 21:07:35 +00001438 if (m_found_entities.ContainsVariable (member_sp))
Sean Callanan8c127202010-08-23 23:09:38 +00001439 {
Greg Claytona875b642011-01-09 21:07:35 +00001440 RegisterInfo *reg_info = member_sp->GetRegisterInfo ();
Greg Clayton427f2902010-12-14 02:59:59 +00001441 if (reg_info)
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001442 {
1443 // This is a register variable
1444
Sean Callananaa301c42010-12-03 01:38:59 +00001445 RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001446
1447 if (!reg_ctx)
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001448 {
1449 err.SetErrorString("Couldn't get register context");
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001450 return false;
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001451 }
1452
Greg Clayton427f2902010-12-14 02:59:59 +00001453 if (!DoMaterializeOneRegister (dematerialize,
1454 exe_ctx,
1455 *reg_ctx,
1456 *reg_info,
1457 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
1458 err))
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001459 return false;
1460 }
1461 else
1462 {
Greg Clayton427f2902010-12-14 02:59:59 +00001463 if (!member_sp->m_jit_vars.get())
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001464 {
1465 err.SetErrorString("Variable being materialized doesn't have necessary state");
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001466 return false;
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001467 }
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001468
Greg Clayton427f2902010-12-14 02:59:59 +00001469 if (!DoMaterializeOneVariable (dematerialize,
1470 exe_ctx,
Sean Callanan6a925532011-01-13 08:53:35 +00001471 sym_ctx,
1472 member_sp,
Greg Clayton427f2902010-12-14 02:59:59 +00001473 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
1474 err))
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001475 return false;
1476 }
Sean Callanan8c127202010-08-23 23:09:38 +00001477 }
Sean Callanan8c127202010-08-23 23:09:38 +00001478 else
1479 {
Greg Claytona875b642011-01-09 21:07:35 +00001480 // No need to look for presistent variables if the name doesn't start
1481 // with with a '$' character...
1482 if (member_sp->GetName().AsCString ("!")[0] == '$' && persistent_vars.ContainsVariable(member_sp))
1483 {
Sean Callanan6a925532011-01-13 08:53:35 +00001484
Greg Claytona875b642011-01-09 21:07:35 +00001485 if (member_sp->GetName() == m_struct_vars->m_result_name)
1486 {
Greg Claytona875b642011-01-09 21:07:35 +00001487 if (log)
1488 log->PutCString("Found result member in the struct");
Sean Callanan6a925532011-01-13 08:53:35 +00001489
Greg Claytona875b642011-01-09 21:07:35 +00001490 if (result_sp_ptr)
1491 *result_sp_ptr = member_sp;
Sean Callanan6a925532011-01-13 08:53:35 +00001492
Greg Claytona875b642011-01-09 21:07:35 +00001493 }
1494
1495 if (!DoMaterializeOnePersistentVariable (dematerialize,
Sean Callanan6a925532011-01-13 08:53:35 +00001496 exe_ctx,
Greg Claytona875b642011-01-09 21:07:35 +00001497 member_sp,
Sean Callanan0ddf8062011-05-09 22:04:36 +00001498 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
1499 stack_frame_top,
1500 stack_frame_bottom,
Greg Claytona875b642011-01-09 21:07:35 +00001501 err))
1502 return false;
1503 }
1504 else
1505 {
1506 err.SetErrorStringWithFormat("Unexpected variable %s", member_sp->GetName().GetCString());
1507 return false;
1508 }
Sean Callanan8c127202010-08-23 23:09:38 +00001509 }
Sean Callanan810f22d2010-07-16 00:09:46 +00001510 }
1511
Sean Callananf328c9f2010-07-20 23:31:16 +00001512 return true;
1513}
1514
Sean Callanana48fe162010-08-11 03:57:18 +00001515bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001516ClangExpressionDeclMap::DoMaterializeOnePersistentVariable
1517(
1518 bool dematerialize,
1519 ExecutionContext &exe_ctx,
Greg Clayton427f2902010-12-14 02:59:59 +00001520 ClangExpressionVariableSP &var_sp,
Greg Clayton8de27c72010-10-15 22:48:33 +00001521 lldb::addr_t addr,
Sean Callanan0ddf8062011-05-09 22:04:36 +00001522 lldb::addr_t stack_frame_top,
1523 lldb::addr_t stack_frame_bottom,
Greg Clayton8de27c72010-10-15 22:48:33 +00001524 Error &err
1525)
Sean Callananaa301c42010-12-03 01:38:59 +00001526{
Sean Callanan6a925532011-01-13 08:53:35 +00001527 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1528
Greg Clayton427f2902010-12-14 02:59:59 +00001529 if (!var_sp)
Sean Callanana48fe162010-08-11 03:57:18 +00001530 {
Greg Clayton427f2902010-12-14 02:59:59 +00001531 err.SetErrorString("Invalid persistent variable");
Sean Callanana48fe162010-08-11 03:57:18 +00001532 return LLDB_INVALID_ADDRESS;
1533 }
1534
Greg Clayton427f2902010-12-14 02:59:59 +00001535 const size_t pvar_byte_size = var_sp->GetByteSize();
Sean Callanana6223432010-08-20 01:02:30 +00001536
Greg Clayton427f2902010-12-14 02:59:59 +00001537 uint8_t *pvar_data = var_sp->GetValueBytes();
1538 if (pvar_data == NULL)
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001539 {
1540 err.SetErrorString("Persistent variable being materialized contains no data");
Sean Callanana6223432010-08-20 01:02:30 +00001541 return false;
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001542 }
Sean Callanana6223432010-08-20 01:02:30 +00001543
Sean Callanana48fe162010-08-11 03:57:18 +00001544 Error error;
Greg Clayton567e7f32011-09-22 04:58:26 +00001545 Process *process = exe_ctx.GetProcessPtr();
1546
Sean Callanan6a925532011-01-13 08:53:35 +00001547 lldb::addr_t mem; // The address of a spare memory area used to hold the persistent variable.
1548
Sean Callanana48fe162010-08-11 03:57:18 +00001549 if (dematerialize)
1550 {
Sean Callanan6a925532011-01-13 08:53:35 +00001551 if (log)
1552 log->Printf("Dematerializing persistent variable with flags 0x%hx", var_sp->m_flags);
1553
1554 if ((var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) ||
1555 (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference))
Sean Callanana48fe162010-08-11 03:57:18 +00001556 {
Sean Callanan6a925532011-01-13 08:53:35 +00001557 // Get the location of the target out of the struct.
1558
1559 Error read_error;
Greg Clayton567e7f32011-09-22 04:58:26 +00001560 mem = process->ReadPointerFromMemory (addr, read_error);
Sean Callanan6a925532011-01-13 08:53:35 +00001561
1562 if (mem == LLDB_INVALID_ADDRESS)
1563 {
1564 err.SetErrorStringWithFormat("Couldn't read address of %s from struct: %s", var_sp->GetName().GetCString(), error.AsCString());
1565 return false;
1566 }
1567
1568 if (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference &&
1569 !var_sp->m_live_sp)
1570 {
1571 // If the reference comes from the program, then the ClangExpressionVariable's
1572 // live variable data hasn't been set up yet. Do this now.
1573
Jim Ingham47da8102011-04-22 23:53:53 +00001574 var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope (),
1575 var_sp->GetTypeFromUser().GetASTContext(),
1576 var_sp->GetTypeFromUser().GetOpaqueQualType(),
1577 var_sp->GetName(),
1578 mem,
1579 eAddressTypeLoad,
1580 pvar_byte_size);
Sean Callanan6a925532011-01-13 08:53:35 +00001581 }
1582
1583 if (!var_sp->m_live_sp)
1584 {
1585 err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", var_sp->GetName().GetCString());
1586 return false;
1587 }
1588
Greg Claytonb3448432011-03-24 21:19:54 +00001589 if (var_sp->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
Sean Callanan6a925532011-01-13 08:53:35 +00001590 {
1591 err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", var_sp->GetName().GetCString());
1592 return false;
1593 }
1594
Sean Callanan97678d12011-01-13 21:23:32 +00001595 if (var_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry ||
1596 var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
Sean Callanan6a925532011-01-13 08:53:35 +00001597 {
1598 mem = var_sp->m_live_sp->GetValue().GetScalar().ULongLong();
1599
1600 if (log)
1601 log->Printf("Dematerializing %s from 0x%llx", var_sp->GetName().GetCString(), (uint64_t)mem);
1602
1603 // Read the contents of the spare memory area
Sean Callanan0ddf8062011-05-09 22:04:36 +00001604
Sean Callanan6a925532011-01-13 08:53:35 +00001605 var_sp->ValueUpdated ();
Greg Clayton567e7f32011-09-22 04:58:26 +00001606 if (process->ReadMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
Sean Callanan6a925532011-01-13 08:53:35 +00001607 {
1608 err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString());
1609 return false;
1610 }
1611
Sean Callanan0ddf8062011-05-09 22:04:36 +00001612 if (stack_frame_top != LLDB_INVALID_ADDRESS &&
1613 stack_frame_bottom != LLDB_INVALID_ADDRESS &&
1614 mem >= stack_frame_bottom &&
1615 mem <= stack_frame_top)
1616 {
1617 // If the variable is resident in the stack frame created by the expression,
1618 // then it cannot be relied upon to stay around. We treat it as needing
1619 // reallocation.
1620
1621 var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
1622 var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
1623 var_sp->m_flags &= ~ClangExpressionVariable::EVIsProgramReference;
1624 }
1625
Sean Callanan6a925532011-01-13 08:53:35 +00001626 var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsFreezeDry;
1627 }
1628
1629 if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation &&
1630 !(var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget))
1631 {
1632 if (m_keep_result_in_memory)
1633 {
1634 var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget;
1635 }
1636 else
1637 {
Greg Clayton567e7f32011-09-22 04:58:26 +00001638 Error deallocate_error = process->DeallocateMemory(mem);
Sean Callanan6a925532011-01-13 08:53:35 +00001639
1640 if (!err.Success())
1641 {
1642 err.SetErrorStringWithFormat ("Couldn't deallocate memory for %s: %s", var_sp->GetName().GetCString(), deallocate_error.AsCString());
1643 return false;
1644 }
1645 }
1646 }
1647 }
1648 else
1649 {
1650 err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
Sean Callanana48fe162010-08-11 03:57:18 +00001651 return false;
1652 }
1653 }
1654 else
1655 {
Sean Callanan6a925532011-01-13 08:53:35 +00001656 if (log)
1657 log->Printf("Materializing persistent variable with flags 0x%hx", var_sp->m_flags);
1658
1659 if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation)
Sean Callanana48fe162010-08-11 03:57:18 +00001660 {
Sean Callanan6a925532011-01-13 08:53:35 +00001661 // Allocate a spare memory area to store the persistent variable's contents.
1662
1663 Error allocate_error;
1664
Greg Clayton567e7f32011-09-22 04:58:26 +00001665 mem = process->AllocateMemory(pvar_byte_size,
Sean Callanan4b3cef02011-10-26 21:20:00 +00001666 lldb::ePermissionsReadable | lldb::ePermissionsWritable,
1667 allocate_error);
Sean Callanan6a925532011-01-13 08:53:35 +00001668
1669 if (mem == LLDB_INVALID_ADDRESS)
1670 {
1671 err.SetErrorStringWithFormat("Couldn't allocate a memory area to store %s: %s", var_sp->GetName().GetCString(), allocate_error.AsCString());
1672 return false;
1673 }
1674
1675 if (log)
1676 log->Printf("Allocated %s (0x%llx) sucessfully", var_sp->GetName().GetCString(), mem);
1677
1678 // Put the location of the spare memory into the live data of the ValueObject.
1679
Jim Ingham47da8102011-04-22 23:53:53 +00001680 var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
1681 var_sp->GetTypeFromUser().GetASTContext(),
1682 var_sp->GetTypeFromUser().GetOpaqueQualType(),
1683 var_sp->GetName(),
1684 mem,
1685 eAddressTypeLoad,
1686 pvar_byte_size);
Sean Callanan6a925532011-01-13 08:53:35 +00001687
1688 // Clear the flag if the variable will never be deallocated.
1689
1690 if (var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
1691 var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsAllocation;
1692
1693 // Write the contents of the variable to the area.
1694
Greg Clayton567e7f32011-09-22 04:58:26 +00001695 if (process->WriteMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
Sean Callanan6a925532011-01-13 08:53:35 +00001696 {
1697 err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString());
1698 return false;
1699 }
1700 }
1701
1702 if ((var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && var_sp->m_live_sp) ||
1703 var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated)
1704 {
Sean Callanan6a925532011-01-13 08:53:35 +00001705 // Now write the location of the area into the struct.
Sean Callanan6a925532011-01-13 08:53:35 +00001706 Error write_error;
Greg Clayton567e7f32011-09-22 04:58:26 +00001707 if (!process->WriteScalarToMemory (addr,
Sean Callanan4b3cef02011-10-26 21:20:00 +00001708 var_sp->m_live_sp->GetValue().GetScalar(),
1709 process->GetAddressByteSize(),
1710 write_error))
Sean Callanan6a925532011-01-13 08:53:35 +00001711 {
1712 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", var_sp->GetName().GetCString(), write_error.AsCString());
1713 return false;
1714 }
1715
1716 if (log)
Greg Claytonc0fa5332011-05-22 22:46:53 +00001717 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 +00001718 }
Sean Callanan696cf5f2011-05-07 01:06:41 +00001719 else if (!(var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference))
Sean Callanan6a925532011-01-13 08:53:35 +00001720 {
1721 err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
Sean Callanana48fe162010-08-11 03:57:18 +00001722 return false;
1723 }
1724 }
1725
1726 return true;
1727}
1728
Sean Callananf328c9f2010-07-20 23:31:16 +00001729bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001730ClangExpressionDeclMap::DoMaterializeOneVariable
1731(
1732 bool dematerialize,
1733 ExecutionContext &exe_ctx,
1734 const SymbolContext &sym_ctx,
Sean Callanan6a925532011-01-13 08:53:35 +00001735 ClangExpressionVariableSP &expr_var,
Greg Clayton8de27c72010-10-15 22:48:33 +00001736 lldb::addr_t addr,
1737 Error &err
1738)
Sean Callananf328c9f2010-07-20 23:31:16 +00001739{
Greg Claytone005f2c2010-11-06 01:53:30 +00001740 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Greg Clayton567e7f32011-09-22 04:58:26 +00001741 Target *target = exe_ctx.GetTargetPtr();
1742 Process *process = exe_ctx.GetProcessPtr();
1743 StackFrame *frame = exe_ctx.GetFramePtr();
1744
Sean Callanan6d284ef2011-10-12 22:20:02 +00001745 if (!frame || !process || !target || !m_parser_vars.get() || !expr_var->m_parser_vars.get())
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001746 {
1747 err.SetErrorString("Necessary state for variable materialization isn't present");
Sean Callanancc074622010-09-14 21:59:34 +00001748 return false;
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001749 }
Sean Callanancc074622010-09-14 21:59:34 +00001750
Sean Callanan6a925532011-01-13 08:53:35 +00001751 // Vital information about the value
1752
1753 const ConstString &name(expr_var->GetName());
1754 TypeFromUser type(expr_var->GetTypeFromUser());
1755
Sean Callanan4a078322011-10-13 00:09:20 +00001756 VariableSP &var(expr_var->m_parser_vars->m_lldb_var);
1757 lldb_private::Symbol *sym(expr_var->m_parser_vars->m_lldb_sym);
Sean Callananf328c9f2010-07-20 23:31:16 +00001758
Sean Callanan6f3bde72011-10-27 19:41:13 +00001759 bool is_reference(expr_var->m_flags & ClangExpressionVariable::EVTypeIsReference);
1760
Sean Callanan81974962011-05-08 02:21:26 +00001761 std::auto_ptr<lldb_private::Value> location_value;
Sean Callanan4a078322011-10-13 00:09:20 +00001762
Sean Callanan81974962011-05-08 02:21:26 +00001763 if (var)
1764 {
1765 location_value.reset(GetVariableValue(exe_ctx,
1766 var,
1767 NULL));
1768 }
1769 else if (sym)
Sean Callanan4a078322011-10-13 00:09:20 +00001770 {
Sean Callanan21ef5bb2011-12-01 02:04:16 +00001771 addr_t location_load_addr = GetSymbolAddress(*target, name, lldb::eSymbolTypeAny);
Sean Callanan81974962011-05-08 02:21:26 +00001772
Greg Claytoncbc07cf2011-06-23 04:25:29 +00001773 if (location_load_addr == LLDB_INVALID_ADDRESS)
Sean Callanan81974962011-05-08 02:21:26 +00001774 {
1775 if (log)
Greg Claytonc0fa5332011-05-22 22:46:53 +00001776 err.SetErrorStringWithFormat ("Couldn't find value for global symbol %s",
1777 name.GetCString());
Sean Callanan81974962011-05-08 02:21:26 +00001778 }
1779
Sean Callanan4a078322011-10-13 00:09:20 +00001780 location_value.reset(new Value);
1781
Sean Callanan81974962011-05-08 02:21:26 +00001782 location_value->SetValueType(Value::eValueTypeLoadAddress);
1783 location_value->GetScalar() = location_load_addr;
1784 }
1785 else
Sean Callananf328c9f2010-07-20 23:31:16 +00001786 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001787 err.SetErrorStringWithFormat ("Couldn't find %s with appropriate type",
1788 name.GetCString());
Sean Callananf328c9f2010-07-20 23:31:16 +00001789 return false;
1790 }
1791
Sean Callanan841026f2010-07-23 00:16:21 +00001792 if (log)
Sean Callananfb3058e2011-05-12 23:54:16 +00001793 {
1794 StreamString my_stream_string;
1795
1796 ClangASTType::DumpTypeDescription (type.GetASTContext(),
1797 type.GetOpaqueQualType(),
1798 &my_stream_string);
1799
Greg Claytonc0fa5332011-05-22 22:46:53 +00001800 log->Printf ("%s %s with type %s",
1801 dematerialize ? "Dematerializing" : "Materializing",
1802 name.GetCString(),
1803 my_stream_string.GetString().c_str());
Sean Callananfb3058e2011-05-12 23:54:16 +00001804 }
Sean Callananf328c9f2010-07-20 23:31:16 +00001805
1806 if (!location_value.get())
1807 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001808 err.SetErrorStringWithFormat("Couldn't get value for %s", name.GetCString());
Sean Callananf328c9f2010-07-20 23:31:16 +00001809 return false;
1810 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001811
1812 // The size of the type contained in addr
Sean Callananf328c9f2010-07-20 23:31:16 +00001813
Sean Callanan6a925532011-01-13 08:53:35 +00001814 size_t value_bit_size = ClangASTType::GetClangTypeBitWidth(type.GetASTContext(), type.GetOpaqueQualType());
1815 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 +00001816
1817 Value::ValueType value_type = location_value->GetValueType();
1818
1819 switch (value_type)
Sean Callananf328c9f2010-07-20 23:31:16 +00001820 {
Sean Callanan17c6a052010-10-05 20:18:48 +00001821 default:
Sean Callananf328c9f2010-07-20 23:31:16 +00001822 {
Sean Callanan17c6a052010-10-05 20:18:48 +00001823 StreamString ss;
1824
1825 location_value->Dump(&ss);
1826
Greg Claytonc0fa5332011-05-22 22:46:53 +00001827 err.SetErrorStringWithFormat ("%s has a value of unhandled type: %s",
1828 name.GetCString(),
1829 ss.GetString().c_str());
Sean Callananf328c9f2010-07-20 23:31:16 +00001830 return false;
1831 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001832 break;
1833 case Value::eValueTypeLoadAddress:
Sean Callananf328c9f2010-07-20 23:31:16 +00001834 {
Sean Callanan6a925532011-01-13 08:53:35 +00001835 if (!dematerialize)
Sean Callanan17c6a052010-10-05 20:18:48 +00001836 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001837 Error write_error;
Sean Callanan6a925532011-01-13 08:53:35 +00001838
Sean Callanan6f3bde72011-10-27 19:41:13 +00001839 if (is_reference)
Sean Callanan6a925532011-01-13 08:53:35 +00001840 {
Sean Callanan6f3bde72011-10-27 19:41:13 +00001841 Error read_error;
1842
1843 addr_t ref_value = process->ReadPointerFromMemory(location_value->GetScalar().ULongLong(), read_error);
1844
1845 if (!read_error.Success())
1846 {
1847 err.SetErrorStringWithFormat ("Couldn't read reference to %s from the target: %s",
1848 name.GetCString(),
1849 read_error.AsCString());
1850 return false;
1851 }
1852
1853 if (!process->WritePointerToMemory(addr,
1854 ref_value,
1855 write_error))
1856 {
1857 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
1858 name.GetCString(),
1859 write_error.AsCString());
1860 return false;
1861 }
1862 }
1863 else
1864 {
1865 if (!process->WriteScalarToMemory (addr,
1866 location_value->GetScalar(),
1867 process->GetAddressByteSize(),
1868 write_error))
1869 {
1870 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
1871 name.GetCString(),
1872 write_error.AsCString());
1873 return false;
1874 }
Sean Callanan6a925532011-01-13 08:53:35 +00001875 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001876 }
Sean Callananf328c9f2010-07-20 23:31:16 +00001877 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001878 break;
1879 case Value::eValueTypeScalar:
1880 {
Greg Clayton6916e352010-11-13 03:52:47 +00001881 if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
Sean Callanan17c6a052010-10-05 20:18:48 +00001882 {
1883 StreamString ss;
Sean Callanan17c6a052010-10-05 20:18:48 +00001884 location_value->Dump(&ss);
1885
Greg Claytonc0fa5332011-05-22 22:46:53 +00001886 err.SetErrorStringWithFormat ("%s is a scalar of unhandled type: %s",
1887 name.GetCString(),
1888 ss.GetString().c_str());
Sean Callanan17c6a052010-10-05 20:18:48 +00001889 return false;
1890 }
1891
Greg Clayton061b79d2011-05-09 20:18:18 +00001892 RegisterInfo *reg_info = location_value->GetRegisterInfo();
Sean Callanan17c6a052010-10-05 20:18:48 +00001893
Greg Clayton061b79d2011-05-09 20:18:18 +00001894 if (!reg_info)
Sean Callanan17c6a052010-10-05 20:18:48 +00001895 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001896 err.SetErrorStringWithFormat ("Couldn't get the register information for %s",
1897 name.GetCString());
Sean Callanan17c6a052010-10-05 20:18:48 +00001898 return false;
1899 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001900
Greg Clayton061b79d2011-05-09 20:18:18 +00001901 RegisterValue reg_value;
1902
1903 RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
1904
1905 if (!reg_ctx)
Sean Callanan17c6a052010-10-05 20:18:48 +00001906 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001907 err.SetErrorStringWithFormat ("Couldn't read register context to read %s from %s",
1908 name.GetCString(),
1909 reg_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001910 return false;
1911 }
1912
Greg Clayton061b79d2011-05-09 20:18:18 +00001913 uint32_t register_byte_size = reg_info->byte_size;
Sean Callanan17c6a052010-10-05 20:18:48 +00001914
1915 if (dematerialize)
1916 {
Sean Callanan6f3bde72011-10-27 19:41:13 +00001917 if (is_reference)
1918 return true; // reference types don't need demateralizing
1919
Sean Callanan6a925532011-01-13 08:53:35 +00001920 // Get the location of the spare memory area out of the variable's live data.
1921
1922 if (!expr_var->m_live_sp)
1923 {
1924 err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", name.GetCString());
1925 return false;
1926 }
1927
Greg Claytonb3448432011-03-24 21:19:54 +00001928 if (expr_var->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
Sean Callanan6a925532011-01-13 08:53:35 +00001929 {
1930 err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", name.GetCString());
1931 return false;
1932 }
1933
Greg Claytonc0fa5332011-05-22 22:46:53 +00001934 Scalar &reg_addr = expr_var->m_live_sp->GetValue().GetScalar();
Sean Callanan6a925532011-01-13 08:53:35 +00001935
Greg Claytonc0fa5332011-05-22 22:46:53 +00001936 err = reg_ctx->ReadRegisterValueFromMemory (reg_info,
1937 reg_addr.ULongLong(),
1938 value_byte_size,
1939 reg_value);
Greg Clayton061b79d2011-05-09 20:18:18 +00001940 if (err.Fail())
Sean Callanan17c6a052010-10-05 20:18:48 +00001941 return false;
Greg Clayton061b79d2011-05-09 20:18:18 +00001942
1943 if (!reg_ctx->WriteRegister (reg_info, reg_value))
Sean Callanan17c6a052010-10-05 20:18:48 +00001944 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001945 err.SetErrorStringWithFormat ("Couldn't write %s to register %s",
1946 name.GetCString(),
1947 reg_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001948 return false;
1949 }
Sean Callanan6a925532011-01-13 08:53:35 +00001950
1951 // Deallocate the spare area and clear the variable's live data.
1952
Greg Clayton567e7f32011-09-22 04:58:26 +00001953 Error deallocate_error = process->DeallocateMemory(reg_addr.ULongLong());
Sean Callanan6a925532011-01-13 08:53:35 +00001954
1955 if (!deallocate_error.Success())
1956 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001957 err.SetErrorStringWithFormat ("Couldn't deallocate spare memory area for %s: %s",
1958 name.GetCString(),
1959 deallocate_error.AsCString());
Sean Callanan6a925532011-01-13 08:53:35 +00001960 return false;
1961 }
1962
1963 expr_var->m_live_sp.reset();
Sean Callanan17c6a052010-10-05 20:18:48 +00001964 }
1965 else
1966 {
Sean Callanan6f3bde72011-10-27 19:41:13 +00001967 Error write_error;
1968
1969 RegisterValue reg_value;
1970
1971 if (!reg_ctx->ReadRegister (reg_info, reg_value))
1972 {
1973 err.SetErrorStringWithFormat ("Couldn't read %s from %s",
1974 name.GetCString(),
1975 reg_info->name);
1976 return false;
1977 }
1978
1979 if (is_reference)
1980 {
1981 write_error = reg_ctx->WriteRegisterValueToMemory(reg_info,
1982 addr,
1983 process->GetAddressByteSize(),
1984 reg_value);
1985
1986 if (!write_error.Success())
1987 {
1988 err.SetErrorStringWithFormat ("Couldn't write %s from register %s to the target: %s",
1989 name.GetCString(),
1990 reg_info->name,
1991 write_error.AsCString());
1992 return false;
1993 }
1994
1995 return true;
1996 }
1997
Sean Callanan6a925532011-01-13 08:53:35 +00001998 // Allocate a spare memory area to place the register's contents into. This memory area will be pointed to by the slot in the
1999 // struct.
2000
2001 Error allocate_error;
2002
Greg Clayton567e7f32011-09-22 04:58:26 +00002003 Scalar reg_addr (process->AllocateMemory (value_byte_size,
Sean Callanan6f3bde72011-10-27 19:41:13 +00002004 lldb::ePermissionsReadable | lldb::ePermissionsWritable,
2005 allocate_error));
Sean Callanan6a925532011-01-13 08:53:35 +00002006
Greg Claytonc0fa5332011-05-22 22:46:53 +00002007 if (reg_addr.ULongLong() == LLDB_INVALID_ADDRESS)
Sean Callanan6a925532011-01-13 08:53:35 +00002008 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00002009 err.SetErrorStringWithFormat ("Couldn't allocate a memory area to store %s: %s",
2010 name.GetCString(),
2011 allocate_error.AsCString());
Sean Callanan6a925532011-01-13 08:53:35 +00002012 return false;
2013 }
2014
2015 // Put the location of the spare memory into the live data of the ValueObject.
2016
Jim Ingham47da8102011-04-22 23:53:53 +00002017 expr_var->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
2018 type.GetASTContext(),
2019 type.GetOpaqueQualType(),
2020 name,
Greg Claytonc0fa5332011-05-22 22:46:53 +00002021 reg_addr.ULongLong(),
Jim Ingham47da8102011-04-22 23:53:53 +00002022 eAddressTypeLoad,
2023 value_byte_size);
Sean Callanan6a925532011-01-13 08:53:35 +00002024
2025 // Now write the location of the area into the struct.
Sean Callanan6f3bde72011-10-27 19:41:13 +00002026
Greg Clayton567e7f32011-09-22 04:58:26 +00002027 if (!process->WriteScalarToMemory (addr,
Sean Callanan6f3bde72011-10-27 19:41:13 +00002028 reg_addr,
2029 process->GetAddressByteSize(),
2030 write_error))
Sean Callanan6a925532011-01-13 08:53:35 +00002031 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00002032 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
2033 name.GetCString(),
2034 write_error.AsCString());
Sean Callanan6a925532011-01-13 08:53:35 +00002035 return false;
2036 }
2037
Sean Callanan6a925532011-01-13 08:53:35 +00002038 if (value_byte_size > register_byte_size)
Sean Callanan17c6a052010-10-05 20:18:48 +00002039 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00002040 err.SetErrorStringWithFormat ("%s is too big to store in %s",
2041 name.GetCString(),
2042 reg_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00002043 return false;
2044 }
Greg Clayton061b79d2011-05-09 20:18:18 +00002045
Greg Clayton061b79d2011-05-09 20:18:18 +00002046 if (!reg_ctx->ReadRegister (reg_info, reg_value))
Sean Callanan17c6a052010-10-05 20:18:48 +00002047 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00002048 err.SetErrorStringWithFormat ("Couldn't read %s from %s",
2049 name.GetCString(),
2050 reg_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00002051 return false;
2052 }
2053
Greg Claytonc0fa5332011-05-22 22:46:53 +00002054 err = reg_ctx->WriteRegisterValueToMemory (reg_info,
2055 reg_addr.ULongLong(),
2056 value_byte_size,
2057 reg_value);
Greg Clayton061b79d2011-05-09 20:18:18 +00002058 if (err.Fail())
Sean Callanan17c6a052010-10-05 20:18:48 +00002059 return false;
Sean Callanan17c6a052010-10-05 20:18:48 +00002060 }
2061 }
Sean Callananf328c9f2010-07-20 23:31:16 +00002062 }
2063
2064 return true;
Sean Callanan810f22d2010-07-16 00:09:46 +00002065}
2066
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002067bool
2068ClangExpressionDeclMap::DoMaterializeOneRegister
2069(
2070 bool dematerialize,
2071 ExecutionContext &exe_ctx,
2072 RegisterContext &reg_ctx,
Greg Claytonb3448432011-03-24 21:19:54 +00002073 const RegisterInfo &reg_info,
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002074 lldb::addr_t addr,
2075 Error &err
2076)
2077{
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002078 uint32_t register_byte_size = reg_info.byte_size;
Greg Clayton061b79d2011-05-09 20:18:18 +00002079 RegisterValue reg_value;
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002080 if (dematerialize)
2081 {
Greg Clayton061b79d2011-05-09 20:18:18 +00002082 Error read_error (reg_ctx.ReadRegisterValueFromMemory(&reg_info, addr, register_byte_size, reg_value));
2083 if (read_error.Fail())
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002084 {
Greg Claytonbdcb6ab2011-01-25 23:55:37 +00002085 err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", reg_info.name, read_error.AsCString());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002086 return false;
2087 }
2088
Greg Clayton061b79d2011-05-09 20:18:18 +00002089 if (!reg_ctx.WriteRegister (&reg_info, reg_value))
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002090 {
Greg Clayton061b79d2011-05-09 20:18:18 +00002091 err.SetErrorStringWithFormat("Couldn't write register %s (dematerialize)", reg_info.name);
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002092 return false;
2093 }
2094 }
2095 else
2096 {
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002097
Greg Clayton061b79d2011-05-09 20:18:18 +00002098 if (!reg_ctx.ReadRegister(&reg_info, reg_value))
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002099 {
Greg Clayton061b79d2011-05-09 20:18:18 +00002100 err.SetErrorStringWithFormat("Couldn't read %s (materialize)", reg_info.name);
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002101 return false;
2102 }
2103
Greg Clayton061b79d2011-05-09 20:18:18 +00002104 Error write_error (reg_ctx.WriteRegisterValueToMemory(&reg_info, addr, register_byte_size, reg_value));
2105 if (write_error.Fail())
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002106 {
Jason Molenda95b7b432011-09-20 00:26:08 +00002107 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", reg_info.name, write_error.AsCString());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002108 return false;
2109 }
2110 }
2111
2112 return true;
2113}
2114
Sean Callanan696cf5f2011-05-07 01:06:41 +00002115lldb::VariableSP
Greg Clayton8de27c72010-10-15 22:48:33 +00002116ClangExpressionDeclMap::FindVariableInScope
2117(
2118 StackFrame &frame,
2119 const ConstString &name,
2120 TypeFromUser *type
2121)
Sean Callananaa301c42010-12-03 01:38:59 +00002122{
Greg Claytone005f2c2010-11-06 01:53:30 +00002123 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanancc074622010-09-14 21:59:34 +00002124
Sean Callananf8b468e2011-08-06 00:28:14 +00002125 ValueObjectSP valobj;
2126 VariableSP var_sp;
2127 Error err;
Sean Callanancc074622010-09-14 21:59:34 +00002128
Sean Callananf8b468e2011-08-06 00:28:14 +00002129 valobj = frame.GetValueForVariableExpressionPath(name.GetCString(),
2130 eNoDynamicValues,
2131 StackFrame::eExpressionPathOptionCheckPtrVsMember,
2132 var_sp,
2133 err);
Greg Clayton3bc52d02010-11-14 22:13:40 +00002134
Sean Callananf8b468e2011-08-06 00:28:14 +00002135 if (!err.Success() ||
2136 !var_sp ||
Sean Callananae9f7482011-07-07 23:05:43 +00002137 !var_sp->IsInScope(&frame) ||
2138 !var_sp->LocationIsValidForFrame (&frame))
2139 return lldb::VariableSP();
Greg Clayton3bc52d02010-11-14 22:13:40 +00002140
2141 if (var_sp && type)
2142 {
2143 if (type->GetASTContext() == var_sp->GetType()->GetClangAST())
2144 {
Greg Clayton04c9c7b2011-02-16 23:00:21 +00002145 if (!ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType()))
Sean Callanan696cf5f2011-05-07 01:06:41 +00002146 return lldb::VariableSP();
Greg Clayton3bc52d02010-11-14 22:13:40 +00002147 }
2148 else
2149 {
2150 if (log)
2151 log->PutCString("Skipping a candidate variable because of different AST contexts");
Sean Callanan696cf5f2011-05-07 01:06:41 +00002152 return lldb::VariableSP();
Greg Clayton3bc52d02010-11-14 22:13:40 +00002153 }
Sean Callanancc074622010-09-14 21:59:34 +00002154 }
Greg Clayton3bc52d02010-11-14 22:13:40 +00002155
Sean Callanan696cf5f2011-05-07 01:06:41 +00002156 return var_sp;
Sean Callanancc074622010-09-14 21:59:34 +00002157}
Sean Callanan336a0002010-07-17 00:43:37 +00002158
Sean Callanan81974962011-05-08 02:21:26 +00002159Symbol *
2160ClangExpressionDeclMap::FindGlobalDataSymbol
2161(
2162 Target &target,
Sean Callananaa4a5532011-10-13 16:49:47 +00002163 const ConstString &name
Sean Callanan81974962011-05-08 02:21:26 +00002164)
2165{
2166 SymbolContextList sc_list;
2167
Sean Callananaa4a5532011-10-13 16:49:47 +00002168 target.GetImages().FindSymbolsWithNameAndType(name,
2169 eSymbolTypeData,
2170 sc_list);
Sean Callanan81974962011-05-08 02:21:26 +00002171
2172 if (sc_list.GetSize())
2173 {
2174 SymbolContext sym_ctx;
2175 sc_list.GetContextAtIndex(0, sym_ctx);
2176
2177 return sym_ctx.symbol;
2178 }
2179
2180 return NULL;
2181}
2182
Sean Callanan47dc4572011-09-15 02:13:07 +00002183lldb::VariableSP
2184ClangExpressionDeclMap::FindGlobalVariable
2185(
2186 Target &target,
Sean Callanan94cd0ca2011-10-12 16:59:31 +00002187 ModuleSP &module,
2188 const ConstString &name,
2189 ClangNamespaceDecl *namespace_decl,
Sean Callanan47dc4572011-09-15 02:13:07 +00002190 TypeFromUser *type
2191)
2192{
2193 VariableList vars;
Sean Callanan47dc4572011-09-15 02:13:07 +00002194
Sean Callanan94cd0ca2011-10-12 16:59:31 +00002195 if (module && namespace_decl)
2196 module->FindGlobalVariables (name, namespace_decl, true, -1, vars);
2197 else
2198 target.GetImages().FindGlobalVariables(name, true, -1, vars);
Sean Callanan47dc4572011-09-15 02:13:07 +00002199
2200 if (vars.GetSize())
2201 {
2202 if (type)
2203 {
2204 for (size_t i = 0; i < vars.GetSize(); ++i)
2205 {
2206 VariableSP var_sp = vars.GetVariableAtIndex(i);
2207
2208 if (type->GetASTContext() == var_sp->GetType()->GetClangAST())
2209 {
2210 if (ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType()))
2211 return var_sp;
2212 }
2213 }
2214 }
2215 else
2216 {
2217 return vars.GetVariableAtIndex(0);
2218 }
2219 }
2220
2221 return VariableSP();
2222}
2223
Chris Lattner24943d22010-06-08 16:52:24 +00002224// Interface for ClangASTSource
Sean Callanan47dc4572011-09-15 02:13:07 +00002225
Sean Callanan16b53ab2011-10-12 00:12:34 +00002226void
Sean Callananf76afff2011-10-28 23:38:38 +00002227ClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context)
Chris Lattner24943d22010-06-08 16:52:24 +00002228{
Sean Callananf76afff2011-10-28 23:38:38 +00002229 assert (m_ast_context);
2230
2231 const ConstString name(context.m_decl_name.getAsString().c_str());
2232
Greg Claytone005f2c2010-11-06 01:53:30 +00002233 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Chris Lattner24943d22010-06-08 16:52:24 +00002234
Sean Callanan9394b5a2011-10-29 19:50:43 +00002235 if (GetImportInProgress())
Sean Callananee8fc722010-11-19 20:20:02 +00002236 {
Sean Callanan67bbb112011-10-14 20:34:21 +00002237 if (log && log->GetVerbose())
Sean Callananee8fc722010-11-19 20:20:02 +00002238 log->Printf("Ignoring a query during an import");
2239 return;
2240 }
Greg Claytone6d72ca2011-06-25 00:44:06 +00002241
Sean Callanan67bbb112011-10-14 20:34:21 +00002242 static unsigned int invocation_id = 0;
2243 unsigned int current_id = invocation_id++;
2244
Sean Callanan16b53ab2011-10-12 00:12:34 +00002245 if (log)
2246 {
2247 if (!context.m_decl_context)
Sean Callanan9394b5a2011-10-29 19:50:43 +00002248 log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in a NULL DeclContext", current_id, name.GetCString());
Sean Callanan16b53ab2011-10-12 00:12:34 +00002249 else if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context.m_decl_context))
Sean Callanan9394b5a2011-10-29 19:50:43 +00002250 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 +00002251 else
Sean Callanan9394b5a2011-10-29 19:50:43 +00002252 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 +00002253 }
Sean Callanan9394b5a2011-10-29 19:50:43 +00002254
Sean Callanan16b53ab2011-10-12 00:12:34 +00002255 if (const NamespaceDecl *namespace_context = dyn_cast<NamespaceDecl>(context.m_decl_context))
2256 {
Sean Callanan73b520f2011-10-29 01:58:46 +00002257 ClangASTImporter::NamespaceMapSP namespace_map = m_ast_importer->GetNamespaceMap(namespace_context);
Sean Callanana7597062011-10-13 21:08:11 +00002258
Sean Callanan67bbb112011-10-14 20:34:21 +00002259 if (log && log->GetVerbose())
Sean Callanan5a55c7a2011-11-18 03:28:09 +00002260 log->Printf(" CEDM::FEVD[%u] Inspecting (NamespaceMap*)%p (%d entries)",
Sean Callanan67bbb112011-10-14 20:34:21 +00002261 current_id,
2262 namespace_map.get(),
2263 (int)namespace_map->size());
Sean Callanana7597062011-10-13 21:08:11 +00002264
Sean Callanana7cb1fa2011-10-21 22:18:07 +00002265 if (!namespace_map)
2266 return;
2267
Sean Callanan16b53ab2011-10-12 00:12:34 +00002268 for (ClangASTImporter::NamespaceMap::iterator i = namespace_map->begin(), e = namespace_map->end();
2269 i != e;
2270 ++i)
2271 {
2272 if (log)
Sean Callanan9394b5a2011-10-29 19:50:43 +00002273 log->Printf(" CEDM::FEVD[%u] Searching namespace %s in module %s",
Sean Callanan67bbb112011-10-14 20:34:21 +00002274 current_id,
Sean Callanan16b53ab2011-10-12 00:12:34 +00002275 i->second.GetNamespaceDecl()->getNameAsString().c_str(),
2276 i->first->GetFileSpec().GetFilename().GetCString());
2277
Sean Callananc839adc2011-10-13 21:50:33 +00002278 FindExternalVisibleDecls(context,
2279 i->first,
2280 i->second,
Sean Callanan67bbb112011-10-14 20:34:21 +00002281 current_id);
Sean Callanan16b53ab2011-10-12 00:12:34 +00002282 }
2283 }
Sean Callanane6ea5fe2011-11-15 02:11:17 +00002284 else if (isa<TranslationUnitDecl>(context.m_decl_context))
Sean Callanan16b53ab2011-10-12 00:12:34 +00002285 {
2286 ClangNamespaceDecl namespace_decl;
2287
2288 if (log)
Sean Callanan9394b5a2011-10-29 19:50:43 +00002289 log->Printf(" CEDM::FEVD[%u] Searching the root namespace", current_id);
Sean Callanan16b53ab2011-10-12 00:12:34 +00002290
2291 FindExternalVisibleDecls(context,
2292 lldb::ModuleSP(),
2293 namespace_decl,
Sean Callanan67bbb112011-10-14 20:34:21 +00002294 current_id);
Sean Callanan16b53ab2011-10-12 00:12:34 +00002295 }
Sean Callanana7597062011-10-13 21:08:11 +00002296
Sean Callanan9394b5a2011-10-29 19:50:43 +00002297 if (!context.m_found.variable)
2298 ClangASTSource::FindExternalVisibleDecls(context);
Sean Callanan16b53ab2011-10-12 00:12:34 +00002299}
2300
2301void
2302ClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context,
Sean Callanan38d084f2011-10-12 18:44:30 +00002303 lldb::ModuleSP module_sp,
Sean Callanan03f64ca2011-10-12 01:39:28 +00002304 ClangNamespaceDecl &namespace_decl,
Sean Callanan67bbb112011-10-14 20:34:21 +00002305 unsigned int current_id)
Sean Callanan16b53ab2011-10-12 00:12:34 +00002306{
Sean Callananf76afff2011-10-28 23:38:38 +00002307 assert (m_ast_context);
Sean Callanan16b53ab2011-10-12 00:12:34 +00002308
2309 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan9394b5a2011-10-29 19:50:43 +00002310
Greg Claytone5748d82010-11-09 23:46:37 +00002311 SymbolContextList sc_list;
Chris Lattner24943d22010-06-08 16:52:24 +00002312
Sean Callanan9394b5a2011-10-29 19:50:43 +00002313 const ConstString name(context.m_decl_name.getAsString().c_str());
2314
Greg Clayton3bc52d02010-11-14 22:13:40 +00002315 const char *name_unique_cstr = name.GetCString();
2316
2317 if (name_unique_cstr == NULL)
2318 return;
Sean Callanan9394b5a2011-10-29 19:50:43 +00002319
Greg Clayton8de27c72010-10-15 22:48:33 +00002320 // Only look for functions by name out in our symbols if the function
2321 // doesn't start with our phony prefix of '$'
Greg Clayton567e7f32011-09-22 04:58:26 +00002322 Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
2323 StackFrame *frame = m_parser_vars->m_exe_ctx->GetFramePtr();
Sean Callanan03f64ca2011-10-12 01:39:28 +00002324 if (name_unique_cstr[0] == '$' && !namespace_decl)
2325 {
2326 static ConstString g_lldb_class_name ("$__lldb_class");
2327
2328 if (name == g_lldb_class_name)
2329 {
2330 // Clang is looking for the type of "this"
2331
2332 if (!frame)
2333 return;
2334
2335 VariableList *vars = frame->GetVariableList(false);
2336
2337 if (!vars)
2338 return;
2339
2340 lldb::VariableSP this_var = vars->FindVariable(ConstString("this"));
2341
2342 if (!this_var ||
2343 !this_var->IsInScope(frame) ||
2344 !this_var->LocationIsValidForFrame (frame))
2345 return;
2346
2347 Type *this_type = this_var->GetType();
2348
2349 if (!this_type)
2350 return;
2351
Sean Callanan67bbb112011-10-14 20:34:21 +00002352 if (log && log->GetVerbose())
Sean Callanan03f64ca2011-10-12 01:39:28 +00002353 {
Sean Callanan9394b5a2011-10-29 19:50:43 +00002354 log->Printf (" CEDM::FEVD[%u] Type for \"this\" is: ", current_id);
Sean Callanan03f64ca2011-10-12 01:39:28 +00002355 StreamString strm;
2356 this_type->Dump(&strm, true);
2357 log->PutCString (strm.GetData());
2358 }
2359
2360 TypeFromUser this_user_type(this_type->GetClangFullType(),
2361 this_type->GetClangAST());
2362
2363 m_struct_vars->m_object_pointer_type = this_user_type;
2364
2365 void *pointer_target_type = NULL;
2366
2367 if (!ClangASTContext::IsPointerType(this_user_type.GetOpaqueQualType(),
2368 &pointer_target_type))
2369 return;
2370
2371 clang::QualType pointer_target_qual_type = QualType::getFromOpaquePtr(pointer_target_type);
2372
2373 if (pointer_target_qual_type.isConstQualified())
2374 pointer_target_qual_type.removeLocalConst();
2375
2376 TypeFromUser class_user_type(pointer_target_qual_type.getAsOpaquePtr(),
2377 this_type->GetClangAST());
2378
2379 if (log)
2380 {
Greg Claytona23ca422011-10-20 00:47:21 +00002381 ASTDumper ast_dumper(pointer_target_qual_type);
Sean Callanan9394b5a2011-10-29 19:50:43 +00002382 log->Printf(" CEDM::FEVD[%u] Adding type for $__lldb_class: %s", current_id, ast_dumper.GetCString());
Sean Callanan03f64ca2011-10-12 01:39:28 +00002383 }
2384
Sean Callanane3737fd2011-10-18 16:46:55 +00002385 AddOneType(context, class_user_type, current_id, true);
Sean Callanan03f64ca2011-10-12 01:39:28 +00002386
2387 return;
2388 }
2389
2390 static ConstString g_lldb_objc_class_name ("$__lldb_objc_class");
2391 if (name == g_lldb_objc_class_name)
2392 {
2393 // Clang is looking for the type of "*self"
2394
2395 if (!frame)
2396 return;
Sean Callanane6ea5fe2011-11-15 02:11:17 +00002397
2398 SymbolContext sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction);
2399
2400 if (!sym_ctx.function)
2401 return;
2402
2403 clang::DeclContext *decl_context;
2404
2405 if (sym_ctx.block && sym_ctx.block->GetInlinedFunctionInfo())
2406 decl_context = sym_ctx.block->GetClangDeclContextForInlinedFunction();
2407 else
2408 decl_context = sym_ctx.function->GetClangDeclContext();
2409
2410 if (!decl_context)
2411 return;
2412
2413 clang::ObjCMethodDecl *method_decl = llvm::dyn_cast<clang::ObjCMethodDecl>(decl_context);
2414
2415 if (!method_decl)
2416 return;
2417
2418 ObjCInterfaceDecl* self_interface = method_decl->getClassInterface();
2419
2420 if (!self_interface)
2421 return;
2422
2423 const clang::Type *interface_type = self_interface->getTypeForDecl();
2424
2425 TypeFromUser class_user_type(QualType(interface_type, 0).getAsOpaquePtr(),
2426 &method_decl->getASTContext());
2427
2428 if (log)
2429 {
2430 ASTDumper ast_dumper(interface_type);
2431 log->Printf(" FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, ast_dumper.GetCString());
2432 }
2433
2434 AddOneType(context, class_user_type, current_id, false);
Sean Callanan03f64ca2011-10-12 01:39:28 +00002435
2436 VariableList *vars = frame->GetVariableList(false);
2437
Sean Callanan03f64ca2011-10-12 01:39:28 +00002438 lldb::VariableSP self_var = vars->FindVariable(ConstString("self"));
2439
2440 if (!self_var ||
2441 !self_var->IsInScope(frame) ||
2442 !self_var->LocationIsValidForFrame (frame))
2443 return;
2444
2445 Type *self_type = self_var->GetType();
2446
2447 if (!self_type)
2448 return;
2449
2450 TypeFromUser self_user_type(self_type->GetClangFullType(),
2451 self_type->GetClangAST());
2452
2453 m_struct_vars->m_object_pointer_type = self_user_type;
Sean Callanan03f64ca2011-10-12 01:39:28 +00002454 return;
2455 }
2456
2457 // any other $__lldb names should be weeded out now
2458 if (!::strncmp(name_unique_cstr, "$__lldb", sizeof("$__lldb") - 1))
2459 return;
2460
2461 do
2462 {
2463 if (!target)
2464 break;
2465
2466 ClangASTContext *scratch_clang_ast_context = target->GetScratchClangASTContext();
2467
2468 if (!scratch_clang_ast_context)
2469 break;
2470
2471 ASTContext *scratch_ast_context = scratch_clang_ast_context->getASTContext();
2472
2473 if (!scratch_ast_context)
2474 break;
2475
2476 TypeDecl *ptype_type_decl = m_parser_vars->m_persistent_vars->GetPersistentType(name);
2477
2478 if (!ptype_type_decl)
2479 break;
2480
Sean Callanane1301a62011-12-06 03:41:14 +00002481 Decl *parser_ptype_decl = m_ast_importer->CopyDecl(m_ast_context, scratch_ast_context, ptype_type_decl);
Sean Callanan03f64ca2011-10-12 01:39:28 +00002482
2483 if (!parser_ptype_decl)
2484 break;
2485
2486 TypeDecl *parser_ptype_type_decl = dyn_cast<TypeDecl>(parser_ptype_decl);
2487
2488 if (!parser_ptype_type_decl)
2489 break;
2490
2491 if (log)
Sean Callanan9394b5a2011-10-29 19:50:43 +00002492 log->Printf(" CEDM::FEVD[%u] Found persistent type %s", current_id, name.GetCString());
Sean Callanan03f64ca2011-10-12 01:39:28 +00002493
2494 context.AddNamedDecl(parser_ptype_type_decl);
2495 } while (0);
2496
2497 ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name));
2498
2499 if (pvar_sp)
2500 {
Sean Callanan67bbb112011-10-14 20:34:21 +00002501 AddOneVariable(context, pvar_sp, current_id);
Sean Callanan03f64ca2011-10-12 01:39:28 +00002502 return;
2503 }
2504
2505 const char *reg_name(&name.GetCString()[1]);
2506
2507 if (m_parser_vars->m_exe_ctx->GetRegisterContext())
2508 {
2509 const RegisterInfo *reg_info(m_parser_vars->m_exe_ctx->GetRegisterContext()->GetRegisterInfoByName(reg_name));
Sean Callanan9394b5a2011-10-29 19:50:43 +00002510
Sean Callanan03f64ca2011-10-12 01:39:28 +00002511 if (reg_info)
Sean Callanane3737fd2011-10-18 16:46:55 +00002512 {
2513 if (log)
Sean Callanan9394b5a2011-10-29 19:50:43 +00002514 log->Printf(" CEDM::FEVD[%u] Found register %s", current_id, reg_info->name);
Sean Callanane3737fd2011-10-18 16:46:55 +00002515
Sean Callanan67bbb112011-10-14 20:34:21 +00002516 AddOneRegister(context, reg_info, current_id);
Sean Callanane3737fd2011-10-18 16:46:55 +00002517 }
Sean Callanan03f64ca2011-10-12 01:39:28 +00002518 }
2519 }
2520 else
Sean Callanan0fc73582010-07-27 00:55:47 +00002521 {
Sean Callananf8b468e2011-08-06 00:28:14 +00002522 ValueObjectSP valobj;
2523 VariableSP var;
2524 Error err;
2525
Sean Callanan03f64ca2011-10-12 01:39:28 +00002526 if (frame && !namespace_decl)
Greg Clayton8de27c72010-10-15 22:48:33 +00002527 {
Greg Clayton567e7f32011-09-22 04:58:26 +00002528 valobj = frame->GetValueForVariableExpressionPath(name_unique_cstr,
Sean Callanan16b53ab2011-10-12 00:12:34 +00002529 eNoDynamicValues,
2530 StackFrame::eExpressionPathOptionCheckPtrVsMember,
2531 var,
2532 err);
Sean Callanan47dc4572011-09-15 02:13:07 +00002533
2534 // If we found a variable in scope, no need to pull up function names
2535 if (err.Success() && var != NULL)
2536 {
Sean Callanan89e7df32011-11-29 22:03:21 +00002537 AddOneVariable(context, var, valobj, current_id);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002538 context.m_found.variable = true;
Sean Callanan3a546762011-10-25 20:36:57 +00002539 return;
Sean Callanan47dc4572011-09-15 02:13:07 +00002540 }
Greg Clayton8de27c72010-10-15 22:48:33 +00002541 }
Greg Clayton567e7f32011-09-22 04:58:26 +00002542 else if (target)
Sean Callanan47dc4572011-09-15 02:13:07 +00002543 {
Sean Callanan94cd0ca2011-10-12 16:59:31 +00002544 var = FindGlobalVariable (*target,
Sean Callanan38d084f2011-10-12 18:44:30 +00002545 module_sp,
Sean Callanan94cd0ca2011-10-12 16:59:31 +00002546 name,
2547 &namespace_decl,
Greg Clayton567e7f32011-09-22 04:58:26 +00002548 NULL);
Sean Callanan47dc4572011-09-15 02:13:07 +00002549
2550 if (var)
2551 {
Sean Callanan89e7df32011-11-29 22:03:21 +00002552 valobj = frame->TrackGlobalVariable(var, eNoDynamicValues);
2553 AddOneVariable(context, var, valobj, current_id);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002554 context.m_found.variable = true;
Sean Callanan47dc4572011-09-15 02:13:07 +00002555 }
2556 }
2557
Sean Callanan16c4ec32011-10-12 20:29:25 +00002558 if (!context.m_found.variable)
Greg Clayton8de27c72010-10-15 22:48:33 +00002559 {
Greg Clayton28d5fcc2011-01-27 06:44:37 +00002560 const bool include_symbols = true;
2561 const bool append = false;
Sean Callanana5ec5a32011-10-12 17:38:09 +00002562
Sean Callanan38d084f2011-10-12 18:44:30 +00002563 if (namespace_decl && module_sp)
Sean Callanana5ec5a32011-10-12 17:38:09 +00002564 {
Sean Callanan38d084f2011-10-12 18:44:30 +00002565 module_sp->FindFunctions(name,
2566 &namespace_decl,
2567 eFunctionNameTypeBase,
2568 include_symbols,
2569 append,
2570 sc_list);
Sean Callanana5ec5a32011-10-12 17:38:09 +00002571 }
2572 else
2573 {
2574 target->GetImages().FindFunctions(name,
2575 eFunctionNameTypeBase,
2576 include_symbols,
2577 append,
2578 sc_list);
2579 }
2580
Sean Callanan81974962011-05-08 02:21:26 +00002581 if (sc_list.GetSize())
Greg Clayton8de27c72010-10-15 22:48:33 +00002582 {
Sean Callanan81974962011-05-08 02:21:26 +00002583 Symbol *generic_symbol = NULL;
2584 Symbol *non_extern_symbol = NULL;
2585
2586 for (uint32_t index = 0, num_indices = sc_list.GetSize();
2587 index < num_indices;
2588 ++index)
Greg Clayton8de27c72010-10-15 22:48:33 +00002589 {
Sean Callanan81974962011-05-08 02:21:26 +00002590 SymbolContext sym_ctx;
2591 sc_list.GetContextAtIndex(index, sym_ctx);
2592
2593 if (sym_ctx.function)
2594 {
2595 // TODO only do this if it's a C function; C++ functions may be
2596 // overloaded
Sean Callanan16c4ec32011-10-12 20:29:25 +00002597 if (!context.m_found.function_with_type_info)
Sean Callanan67bbb112011-10-14 20:34:21 +00002598 AddOneFunction(context, sym_ctx.function, NULL, current_id);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002599 context.m_found.function_with_type_info = true;
2600 context.m_found.function = true;
Sean Callanan81974962011-05-08 02:21:26 +00002601 }
2602 else if (sym_ctx.symbol)
2603 {
2604 if (sym_ctx.symbol->IsExternal())
2605 generic_symbol = sym_ctx.symbol;
2606 else
2607 non_extern_symbol = sym_ctx.symbol;
2608 }
Greg Clayton8de27c72010-10-15 22:48:33 +00002609 }
Sean Callanan81974962011-05-08 02:21:26 +00002610
Sean Callanan16c4ec32011-10-12 20:29:25 +00002611 if (!context.m_found.function_with_type_info)
Greg Clayton8de27c72010-10-15 22:48:33 +00002612 {
Sean Callanan81974962011-05-08 02:21:26 +00002613 if (generic_symbol)
Sean Callanan47dc4572011-09-15 02:13:07 +00002614 {
Sean Callanan67bbb112011-10-14 20:34:21 +00002615 AddOneFunction (context, NULL, generic_symbol, current_id);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002616 context.m_found.function = true;
Sean Callanan47dc4572011-09-15 02:13:07 +00002617 }
Sean Callanan81974962011-05-08 02:21:26 +00002618 else if (non_extern_symbol)
Sean Callanan47dc4572011-09-15 02:13:07 +00002619 {
Sean Callanan67bbb112011-10-14 20:34:21 +00002620 AddOneFunction (context, NULL, non_extern_symbol, current_id);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002621 context.m_found.function = true;
Sean Callanan47dc4572011-09-15 02:13:07 +00002622 }
Sean Callanan81974962011-05-08 02:21:26 +00002623 }
Greg Clayton8de27c72010-10-15 22:48:33 +00002624 }
Sean Callanan47dc4572011-09-15 02:13:07 +00002625
Sean Callanan16c4ec32011-10-12 20:29:25 +00002626 if (!context.m_found.variable)
Greg Clayton8de27c72010-10-15 22:48:33 +00002627 {
Sean Callanan16c4ec32011-10-12 20:29:25 +00002628 // We couldn't find a non-symbol variable for this. Now we'll hunt for a generic
Sean Callanan81974962011-05-08 02:21:26 +00002629 // data symbol, and -- if it is found -- treat it as a variable.
2630
Sean Callananaa4a5532011-10-13 16:49:47 +00002631 Symbol *data_symbol = FindGlobalDataSymbol(*target, name);
Sean Callanan81974962011-05-08 02:21:26 +00002632
2633 if (data_symbol)
Sean Callanan47dc4572011-09-15 02:13:07 +00002634 {
Sean Callanan67bbb112011-10-14 20:34:21 +00002635 AddOneGenericVariable(context, *data_symbol, current_id);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002636 context.m_found.variable = true;
Sean Callanan47dc4572011-09-15 02:13:07 +00002637 }
Greg Clayton6916e352010-11-13 03:52:47 +00002638 }
Sean Callanan92aa6662010-09-07 21:49:41 +00002639 }
Sean Callananb549b0a2011-10-27 02:06:03 +00002640 }
Sean Callanan336a0002010-07-17 00:43:37 +00002641}
Greg Claytone6d72ca2011-06-25 00:44:06 +00002642
Sean Callanan336a0002010-07-17 00:43:37 +00002643Value *
Greg Clayton8de27c72010-10-15 22:48:33 +00002644ClangExpressionDeclMap::GetVariableValue
2645(
2646 ExecutionContext &exe_ctx,
Sean Callanan4a078322011-10-13 00:09:20 +00002647 VariableSP &var,
Sean Callanan9b6898f2011-07-30 02:42:06 +00002648 ASTContext *parser_ast_context,
Greg Clayton8de27c72010-10-15 22:48:33 +00002649 TypeFromUser *user_type,
2650 TypeFromParser *parser_type
2651)
Chris Lattner24943d22010-06-08 16:52:24 +00002652{
Greg Claytone005f2c2010-11-06 01:53:30 +00002653 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan6184dfe2010-06-23 00:47:48 +00002654
Chris Lattner24943d22010-06-08 16:52:24 +00002655 Type *var_type = var->GetType();
2656
2657 if (!var_type)
2658 {
Sean Callanan810f22d2010-07-16 00:09:46 +00002659 if (log)
2660 log->PutCString("Skipped a definition because it has no type");
Sean Callanan336a0002010-07-17 00:43:37 +00002661 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00002662 }
2663
Greg Clayton04c9c7b2011-02-16 23:00:21 +00002664 clang_type_t var_opaque_type = var_type->GetClangFullType();
Chris Lattner24943d22010-06-08 16:52:24 +00002665
2666 if (!var_opaque_type)
2667 {
Sean Callanan810f22d2010-07-16 00:09:46 +00002668 if (log)
2669 log->PutCString("Skipped a definition because it has no Clang type");
Sean Callanan336a0002010-07-17 00:43:37 +00002670 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00002671 }
2672
Sean Callanan9b6898f2011-07-30 02:42:06 +00002673 ASTContext *ast = var_type->GetClangASTContext().getASTContext();
Chris Lattner24943d22010-06-08 16:52:24 +00002674
Greg Claytonb01000f2011-01-17 03:46:26 +00002675 if (!ast)
Chris Lattner24943d22010-06-08 16:52:24 +00002676 {
Sean Callanan810f22d2010-07-16 00:09:46 +00002677 if (log)
2678 log->PutCString("There is no AST context for the current execution context");
Sean Callanan336a0002010-07-17 00:43:37 +00002679 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00002680 }
2681
Sean Callanan336a0002010-07-17 00:43:37 +00002682 DWARFExpression &var_location_expr = var->LocationExpression();
2683
Chris Lattner24943d22010-06-08 16:52:24 +00002684 std::auto_ptr<Value> var_location(new Value);
2685
Greg Clayton178710c2010-09-14 02:20:48 +00002686 lldb::addr_t loclist_base_load_addr = LLDB_INVALID_ADDRESS;
2687
Greg Clayton567e7f32011-09-22 04:58:26 +00002688 Target *target = exe_ctx.GetTargetPtr();
2689
Greg Clayton178710c2010-09-14 02:20:48 +00002690 if (var_location_expr.IsLocationList())
2691 {
2692 SymbolContext var_sc;
2693 var->CalculateSymbolContext (&var_sc);
Greg Clayton567e7f32011-09-22 04:58:26 +00002694 loclist_base_load_addr = var_sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress (target);
Greg Clayton178710c2010-09-14 02:20:48 +00002695 }
Chris Lattner24943d22010-06-08 16:52:24 +00002696 Error err;
2697
Greg Claytonbdcb6ab2011-01-25 23:55:37 +00002698 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 +00002699 {
Sean Callanan810f22d2010-07-16 00:09:46 +00002700 if (log)
2701 log->Printf("Error evaluating location: %s", err.AsCString());
Sean Callanan336a0002010-07-17 00:43:37 +00002702 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00002703 }
Greg Claytonb01000f2011-01-17 03:46:26 +00002704
Sean Callanan58baaad2011-07-08 00:39:14 +00002705 void *type_to_use = NULL;
Sean Callanan336a0002010-07-17 00:43:37 +00002706
Sean Callananf328c9f2010-07-20 23:31:16 +00002707 if (parser_ast_context)
2708 {
Greg Claytonb01000f2011-01-17 03:46:26 +00002709 type_to_use = GuardedCopyType(parser_ast_context, ast, var_opaque_type);
Sean Callananf328c9f2010-07-20 23:31:16 +00002710
Sean Callanan4b5eec62010-11-20 02:19:29 +00002711 if (!type_to_use)
2712 {
2713 if (log)
2714 log->Printf("Couldn't copy a variable's type into the parser's AST context");
2715
2716 return NULL;
2717 }
2718
Sean Callananf328c9f2010-07-20 23:31:16 +00002719 if (parser_type)
2720 *parser_type = TypeFromParser(type_to_use, parser_ast_context);
2721 }
Sean Callanan336a0002010-07-17 00:43:37 +00002722 else
2723 type_to_use = var_opaque_type;
Chris Lattner24943d22010-06-08 16:52:24 +00002724
2725 if (var_location.get()->GetContextType() == Value::eContextTypeInvalid)
Greg Clayton6916e352010-11-13 03:52:47 +00002726 var_location.get()->SetContext(Value::eContextTypeClangType, type_to_use);
Chris Lattner24943d22010-06-08 16:52:24 +00002727
2728 if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress)
2729 {
2730 SymbolContext var_sc;
2731 var->CalculateSymbolContext(&var_sc);
Sean Callanan336a0002010-07-17 00:43:37 +00002732
Chris Lattner24943d22010-06-08 16:52:24 +00002733 if (!var_sc.module_sp)
Sean Callanan336a0002010-07-17 00:43:37 +00002734 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00002735
2736 ObjectFile *object_file = var_sc.module_sp->GetObjectFile();
2737
2738 if (!object_file)
Sean Callanan336a0002010-07-17 00:43:37 +00002739 return NULL;
2740
Chris Lattner24943d22010-06-08 16:52:24 +00002741 Address so_addr(var_location->GetScalar().ULongLong(), object_file->GetSectionList());
2742
Greg Clayton567e7f32011-09-22 04:58:26 +00002743 lldb::addr_t load_addr = so_addr.GetLoadAddress(target);
Chris Lattner24943d22010-06-08 16:52:24 +00002744
Sean Callanan47dc4572011-09-15 02:13:07 +00002745 if (load_addr != LLDB_INVALID_ADDRESS)
2746 {
2747 var_location->GetScalar() = load_addr;
2748 var_location->SetValueType(Value::eValueTypeLoadAddress);
2749 }
Chris Lattner24943d22010-06-08 16:52:24 +00002750 }
2751
Sean Callananf328c9f2010-07-20 23:31:16 +00002752 if (user_type)
Greg Claytonb01000f2011-01-17 03:46:26 +00002753 *user_type = TypeFromUser(var_opaque_type, ast);
Sean Callanan336a0002010-07-17 00:43:37 +00002754
2755 return var_location.release();
2756}
2757
2758void
Sean Callanan89e7df32011-11-29 22:03:21 +00002759ClangExpressionDeclMap::AddOneVariable (NameSearchContext &context, VariableSP var, ValueObjectSP valobj, unsigned int current_id)
Sean Callanan336a0002010-07-17 00:43:37 +00002760{
Sean Callananaa301c42010-12-03 01:38:59 +00002761 assert (m_parser_vars.get());
2762
Greg Claytone005f2c2010-11-06 01:53:30 +00002763 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan47dc4572011-09-15 02:13:07 +00002764
Sean Callananf328c9f2010-07-20 23:31:16 +00002765 TypeFromUser ut;
2766 TypeFromParser pt;
Sean Callanan336a0002010-07-17 00:43:37 +00002767
Sean Callananaa301c42010-12-03 01:38:59 +00002768 Value *var_location = GetVariableValue (*m_parser_vars->m_exe_ctx,
Greg Clayton8de27c72010-10-15 22:48:33 +00002769 var,
Sean Callananf76afff2011-10-28 23:38:38 +00002770 m_ast_context,
Greg Clayton8de27c72010-10-15 22:48:33 +00002771 &ut,
2772 &pt);
Sean Callanan336a0002010-07-17 00:43:37 +00002773
Sean Callanan4b5eec62010-11-20 02:19:29 +00002774 if (!var_location)
2775 return;
2776
Sean Callanan6f3bde72011-10-27 19:41:13 +00002777 NamedDecl *var_decl;
2778
2779 bool is_reference = ClangASTContext::IsReferenceType(pt.GetOpaqueQualType());
2780
2781 if (is_reference)
2782 var_decl = context.AddVarDecl(pt.GetOpaqueQualType());
2783 else
2784 var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(pt.GetASTContext(), pt.GetOpaqueQualType()));
2785
Greg Clayton8de27c72010-10-15 22:48:33 +00002786 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton427f2902010-12-14 02:59:59 +00002787 ConstString entity_name(decl_name.c_str());
Sean Callanan89e7df32011-11-29 22:03:21 +00002788 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (valobj));
2789
Greg Clayton427f2902010-12-14 02:59:59 +00002790 assert (entity.get());
2791 entity->EnableParserVars();
2792 entity->m_parser_vars->m_parser_type = pt;
2793 entity->m_parser_vars->m_named_decl = var_decl;
2794 entity->m_parser_vars->m_llvm_value = NULL;
2795 entity->m_parser_vars->m_lldb_value = var_location;
Sean Callanan696cf5f2011-05-07 01:06:41 +00002796 entity->m_parser_vars->m_lldb_var = var;
Chris Lattner24943d22010-06-08 16:52:24 +00002797
Sean Callanan6f3bde72011-10-27 19:41:13 +00002798 if (is_reference)
2799 entity->m_flags |= ClangExpressionVariable::EVTypeIsReference;
2800
Sean Callanan810f22d2010-07-16 00:09:46 +00002801 if (log)
Greg Clayton8de27c72010-10-15 22:48:33 +00002802 {
Sean Callananaa561412011-11-07 23:32:52 +00002803 ASTDumper orig_dumper(ut.GetOpaqueQualType());
Greg Claytona23ca422011-10-20 00:47:21 +00002804 ASTDumper ast_dumper(var_decl);
Sean Callananaa561412011-11-07 23:32:52 +00002805 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 +00002806 }
Sean Callanan8f0dc342010-06-22 23:46:24 +00002807}
2808
2809void
Sean Callanana48fe162010-08-11 03:57:18 +00002810ClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
Sean Callanan67bbb112011-10-14 20:34:21 +00002811 ClangExpressionVariableSP &pvar_sp,
2812 unsigned int current_id)
Sean Callanana48fe162010-08-11 03:57:18 +00002813{
Greg Claytone005f2c2010-11-06 01:53:30 +00002814 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan45690fe2010-08-30 22:17:16 +00002815
Greg Clayton427f2902010-12-14 02:59:59 +00002816 TypeFromUser user_type (pvar_sp->GetTypeFromUser());
Sean Callanana48fe162010-08-11 03:57:18 +00002817
Sean Callananf76afff2011-10-28 23:38:38 +00002818 TypeFromParser parser_type (GuardedCopyType(m_ast_context,
Greg Clayton427f2902010-12-14 02:59:59 +00002819 user_type.GetASTContext(),
2820 user_type.GetOpaqueQualType()),
Sean Callananf76afff2011-10-28 23:38:38 +00002821 m_ast_context);
Sean Callanana48fe162010-08-11 03:57:18 +00002822
Sean Callanandc5fce12011-12-01 21:04:37 +00002823 if (!parser_type.GetOpaqueQualType())
2824 {
2825 if (log)
2826 log->Printf(" CEDM::FEVD[%u] Couldn't import type for pvar %s", current_id, pvar_sp->GetName().GetCString());
2827 return;
2828 }
2829
Sean Callanan6a925532011-01-13 08:53:35 +00002830 NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(parser_type.GetASTContext(), parser_type.GetOpaqueQualType()));
Sean Callanan8c127202010-08-23 23:09:38 +00002831
Greg Clayton427f2902010-12-14 02:59:59 +00002832 pvar_sp->EnableParserVars();
2833 pvar_sp->m_parser_vars->m_parser_type = parser_type;
2834 pvar_sp->m_parser_vars->m_named_decl = var_decl;
2835 pvar_sp->m_parser_vars->m_llvm_value = NULL;
2836 pvar_sp->m_parser_vars->m_lldb_value = NULL;
Sean Callanan45690fe2010-08-30 22:17:16 +00002837
2838 if (log)
Sean Callanana0744822010-11-01 23:22:47 +00002839 {
Greg Claytona23ca422011-10-20 00:47:21 +00002840 ASTDumper ast_dumper(var_decl);
Sean Callanan9394b5a2011-10-29 19:50:43 +00002841 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 +00002842 }
Sean Callanana48fe162010-08-11 03:57:18 +00002843}
2844
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002845void
Sean Callanan81974962011-05-08 02:21:26 +00002846ClangExpressionDeclMap::AddOneGenericVariable(NameSearchContext &context,
Sean Callanan67bbb112011-10-14 20:34:21 +00002847 Symbol &symbol,
2848 unsigned int current_id)
Sean Callanan81974962011-05-08 02:21:26 +00002849{
2850 assert(m_parser_vars.get());
2851
2852 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2853
Greg Clayton567e7f32011-09-22 04:58:26 +00002854 Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
2855
2856 if (target == NULL)
2857 return;
2858
2859 ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
Sean Callanan81974962011-05-08 02:21:26 +00002860
Sean Callananfb3058e2011-05-12 23:54:16 +00002861 TypeFromUser user_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(scratch_ast_context, true)),
Sean Callanan81974962011-05-08 02:21:26 +00002862 scratch_ast_context);
2863
Sean Callananf76afff2011-10-28 23:38:38 +00002864 TypeFromParser parser_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(m_ast_context, true)),
2865 m_ast_context);
Sean Callanan81974962011-05-08 02:21:26 +00002866
Sean Callananfb3058e2011-05-12 23:54:16 +00002867 NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
Sean Callanan81974962011-05-08 02:21:26 +00002868
2869 std::string decl_name(context.m_decl_name.getAsString());
2870 ConstString entity_name(decl_name.c_str());
2871 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
2872 entity_name,
2873 user_type,
Sean Callanan47dc4572011-09-15 02:13:07 +00002874 m_parser_vars->m_target_info.byte_order,
2875 m_parser_vars->m_target_info.address_byte_size));
Sean Callanan81974962011-05-08 02:21:26 +00002876 assert (entity.get());
Sean Callanan81974962011-05-08 02:21:26 +00002877
2878 std::auto_ptr<Value> symbol_location(new Value);
2879
2880 AddressRange &symbol_range = symbol.GetAddressRangeRef();
2881 Address &symbol_address = symbol_range.GetBaseAddress();
Greg Clayton567e7f32011-09-22 04:58:26 +00002882 lldb::addr_t symbol_load_addr = symbol_address.GetLoadAddress(target);
Sean Callanan81974962011-05-08 02:21:26 +00002883
2884 symbol_location->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
2885 symbol_location->GetScalar() = symbol_load_addr;
2886 symbol_location->SetValueType(Value::eValueTypeLoadAddress);
2887
Sean Callananfb3058e2011-05-12 23:54:16 +00002888 entity->EnableParserVars();
Sean Callanan81974962011-05-08 02:21:26 +00002889 entity->m_parser_vars->m_parser_type = parser_type;
2890 entity->m_parser_vars->m_named_decl = var_decl;
2891 entity->m_parser_vars->m_llvm_value = NULL;
2892 entity->m_parser_vars->m_lldb_value = symbol_location.release();
2893 entity->m_parser_vars->m_lldb_sym = &symbol;
2894
2895 if (log)
2896 {
Greg Claytona23ca422011-10-20 00:47:21 +00002897 ASTDumper ast_dumper(var_decl);
Sean Callanan81974962011-05-08 02:21:26 +00002898
Sean Callanan9394b5a2011-10-29 19:50:43 +00002899 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 +00002900 }
2901}
2902
Sean Callananfb3058e2011-05-12 23:54:16 +00002903bool
2904ClangExpressionDeclMap::ResolveUnknownTypes()
2905{
2906 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Greg Clayton567e7f32011-09-22 04:58:26 +00002907 Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
2908
2909 ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
Sean Callananfb3058e2011-05-12 23:54:16 +00002910
2911 for (size_t index = 0, num_entities = m_found_entities.GetSize();
2912 index < num_entities;
2913 ++index)
2914 {
2915 ClangExpressionVariableSP entity = m_found_entities.GetVariableAtIndex(index);
2916
2917 if (entity->m_flags & ClangExpressionVariable::EVUnknownType)
2918 {
2919 const NamedDecl *named_decl = entity->m_parser_vars->m_named_decl;
2920 const VarDecl *var_decl = dyn_cast<VarDecl>(named_decl);
2921
2922 if (!var_decl)
2923 {
2924 if (log)
2925 log->Printf("Entity of unknown type does not have a VarDecl");
2926 return false;
2927 }
2928
2929 if (log)
2930 {
Greg Claytona23ca422011-10-20 00:47:21 +00002931 ASTDumper ast_dumper(const_cast<VarDecl*>(var_decl));
2932 log->Printf("Variable of unknown type now has Decl %s", ast_dumper.GetCString());
Sean Callananfb3058e2011-05-12 23:54:16 +00002933 }
2934
2935 QualType var_type = var_decl->getType();
2936 TypeFromParser parser_type(var_type.getAsOpaquePtr(), &var_decl->getASTContext());
2937
Sean Callanan5a55c7a2011-11-18 03:28:09 +00002938 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 +00002939
Sean Callanandc5fce12011-12-01 21:04:37 +00002940 if (!copied_type)
2941 {
2942 if (log)
2943 log->Printf("ClangExpressionDeclMap::ResolveUnknownType - Couldn't import the type for a variable");
2944
2945 return lldb::ClangExpressionVariableSP();
2946 }
2947
Sean Callananfb3058e2011-05-12 23:54:16 +00002948 TypeFromUser user_type(copied_type, scratch_ast_context);
2949
2950 entity->m_parser_vars->m_lldb_value->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
2951 entity->m_parser_vars->m_parser_type = parser_type;
2952
2953 entity->SetClangAST(user_type.GetASTContext());
2954 entity->SetClangType(user_type.GetOpaqueQualType());
2955
2956 entity->m_flags &= ~(ClangExpressionVariable::EVUnknownType);
2957 }
2958 }
2959
2960 return true;
2961}
2962
Sean Callanan81974962011-05-08 02:21:26 +00002963void
Greg Clayton427f2902010-12-14 02:59:59 +00002964ClangExpressionDeclMap::AddOneRegister (NameSearchContext &context,
Sean Callanan67bbb112011-10-14 20:34:21 +00002965 const RegisterInfo *reg_info,
2966 unsigned int current_id)
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002967{
2968 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2969
Sean Callananf76afff2011-10-28 23:38:38 +00002970 void *ast_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize(m_ast_context,
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002971 reg_info->encoding,
2972 reg_info->byte_size * 8);
2973
2974 if (!ast_type)
2975 {
Johnny Chen122204d2011-08-09 22:52:27 +00002976 if (log)
Sean Callanan67bbb112011-10-14 20:34:21 +00002977 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 +00002978 return;
2979 }
2980
Greg Clayton427f2902010-12-14 02:59:59 +00002981 TypeFromParser parser_type (ast_type,
Sean Callananf76afff2011-10-28 23:38:38 +00002982 m_ast_context);
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002983
2984 NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
2985
Jim Inghamfa3a16a2011-03-31 00:19:25 +00002986 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope(),
Sean Callanan47dc4572011-09-15 02:13:07 +00002987 m_parser_vars->m_target_info.byte_order,
2988 m_parser_vars->m_target_info.address_byte_size));
Greg Clayton427f2902010-12-14 02:59:59 +00002989 assert (entity.get());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002990 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton427f2902010-12-14 02:59:59 +00002991 entity->SetName (ConstString (decl_name.c_str()));
2992 entity->SetRegisterInfo (reg_info);
2993 entity->EnableParserVars();
2994 entity->m_parser_vars->m_parser_type = parser_type;
2995 entity->m_parser_vars->m_named_decl = var_decl;
2996 entity->m_parser_vars->m_llvm_value = NULL;
2997 entity->m_parser_vars->m_lldb_value = NULL;
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002998
Sean Callanan67bbb112011-10-14 20:34:21 +00002999 if (log && log->GetVerbose())
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00003000 {
Greg Claytona23ca422011-10-20 00:47:21 +00003001 ASTDumper ast_dumper(var_decl);
Sean Callanan9394b5a2011-10-29 19:50:43 +00003002 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 +00003003 }
3004}
3005
Sean Callanana48fe162010-08-11 03:57:18 +00003006void
Greg Claytonda7af842011-05-18 22:01:49 +00003007ClangExpressionDeclMap::AddOneFunction (NameSearchContext &context,
3008 Function* fun,
Sean Callanan67bbb112011-10-14 20:34:21 +00003009 Symbol* symbol,
3010 unsigned int current_id)
Sean Callanan8f0dc342010-06-22 23:46:24 +00003011{
Sean Callananaa301c42010-12-03 01:38:59 +00003012 assert (m_parser_vars.get());
3013
Greg Claytone005f2c2010-11-06 01:53:30 +00003014 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan8f0dc342010-06-22 23:46:24 +00003015
Sean Callanan58baaad2011-07-08 00:39:14 +00003016 NamedDecl *fun_decl = NULL;
Sean Callanan8f0dc342010-06-22 23:46:24 +00003017 std::auto_ptr<Value> fun_location(new Value);
Sean Callanan58baaad2011-07-08 00:39:14 +00003018 const Address *fun_address = NULL;
Sean Callanan8f0dc342010-06-22 23:46:24 +00003019
Sean Callanan0fc73582010-07-27 00:55:47 +00003020 // only valid for Functions, not for Symbols
3021 void *fun_opaque_type = NULL;
Sean Callanan9b6898f2011-07-30 02:42:06 +00003022 ASTContext *fun_ast_context = NULL;
Sean Callanan0fc73582010-07-27 00:55:47 +00003023
3024 if (fun)
3025 {
3026 Type *fun_type = fun->GetType();
3027
3028 if (!fun_type)
3029 {
3030 if (log)
Sean Callanan67bbb112011-10-14 20:34:21 +00003031 log->PutCString(" Skipped a function because it has no type");
Sean Callanan0fc73582010-07-27 00:55:47 +00003032 return;
3033 }
3034
Greg Clayton04c9c7b2011-02-16 23:00:21 +00003035 fun_opaque_type = fun_type->GetClangFullType();
Sean Callanan0fc73582010-07-27 00:55:47 +00003036
3037 if (!fun_opaque_type)
3038 {
3039 if (log)
Sean Callanan67bbb112011-10-14 20:34:21 +00003040 log->PutCString(" Skipped a function because it has no Clang type");
Sean Callanan0fc73582010-07-27 00:55:47 +00003041 return;
3042 }
3043
3044 fun_address = &fun->GetAddressRange().GetBaseAddress();
3045
Greg Claytonb01000f2011-01-17 03:46:26 +00003046 fun_ast_context = fun_type->GetClangASTContext().getASTContext();
Sean Callananf76afff2011-10-28 23:38:38 +00003047 void *copied_type = GuardedCopyType(m_ast_context, fun_ast_context, fun_opaque_type);
Greg Claytona23ca422011-10-20 00:47:21 +00003048 if (copied_type)
3049 {
3050 fun_decl = context.AddFunDecl(copied_type);
3051 }
3052 else
3053 {
3054 // We failed to copy the type we found
3055 if (log)
3056 {
3057 log->Printf (" Failed to import the function type '%s' {0x%8.8llx} into the expression parser AST contenxt",
3058 fun_type->GetName().GetCString(),
3059 fun_type->GetID());
3060 }
Sean Callanan16089542011-11-16 00:40:13 +00003061
3062 return;
Greg Claytona23ca422011-10-20 00:47:21 +00003063 }
Sean Callanan0fc73582010-07-27 00:55:47 +00003064 }
3065 else if (symbol)
3066 {
3067 fun_address = &symbol->GetAddressRangeRef().GetBaseAddress();
3068
3069 fun_decl = context.AddGenericFunDecl();
3070 }
3071 else
3072 {
3073 if (log)
Sean Callanan67bbb112011-10-14 20:34:21 +00003074 log->PutCString(" AddOneFunction called with no function and no symbol");
Sean Callanan0fc73582010-07-27 00:55:47 +00003075 return;
3076 }
3077
Greg Clayton567e7f32011-09-22 04:58:26 +00003078 Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
3079
3080 lldb::addr_t load_addr = fun_address->GetCallableLoadAddress(target);
Sean Callanan8f0dc342010-06-22 23:46:24 +00003081 fun_location->SetValueType(Value::eValueTypeLoadAddress);
3082 fun_location->GetScalar() = load_addr;
3083
Jim Inghamfa3a16a2011-03-31 00:19:25 +00003084 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
Sean Callanan47dc4572011-09-15 02:13:07 +00003085 m_parser_vars->m_target_info.byte_order,
3086 m_parser_vars->m_target_info.address_byte_size));
Greg Clayton427f2902010-12-14 02:59:59 +00003087 assert (entity.get());
Greg Clayton8de27c72010-10-15 22:48:33 +00003088 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton427f2902010-12-14 02:59:59 +00003089 entity->SetName(ConstString(decl_name.c_str()));
3090 entity->SetClangType (fun_opaque_type);
3091 entity->SetClangAST (fun_ast_context);
Sean Callanan8f0dc342010-06-22 23:46:24 +00003092
Greg Clayton427f2902010-12-14 02:59:59 +00003093 entity->EnableParserVars();
3094 entity->m_parser_vars->m_named_decl = fun_decl;
3095 entity->m_parser_vars->m_llvm_value = NULL;
3096 entity->m_parser_vars->m_lldb_value = fun_location.release();
Sean Callanan8c127202010-08-23 23:09:38 +00003097
Sean Callanan810f22d2010-07-16 00:09:46 +00003098 if (log)
Greg Clayton8de27c72010-10-15 22:48:33 +00003099 {
Greg Claytona23ca422011-10-20 00:47:21 +00003100 ASTDumper ast_dumper(fun_decl);
Sean Callanana0744822010-11-01 23:22:47 +00003101
Sean Callanan9394b5a2011-10-29 19:50:43 +00003102 log->Printf(" CEDM::FEVD[%u] Found %s function %s, returned %s",
Sean Callanan67bbb112011-10-14 20:34:21 +00003103 current_id,
3104 (fun ? "specific" : "generic"),
3105 decl_name.c_str(),
Greg Claytona23ca422011-10-20 00:47:21 +00003106 ast_dumper.GetCString());
Greg Clayton8de27c72010-10-15 22:48:33 +00003107 }
Chris Lattner24943d22010-06-08 16:52:24 +00003108}
Sean Callanan93a4b1a2010-08-04 01:02:13 +00003109
3110void
3111ClangExpressionDeclMap::AddOneType(NameSearchContext &context,
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00003112 TypeFromUser &ut,
Sean Callanan67bbb112011-10-14 20:34:21 +00003113 unsigned int current_id,
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00003114 bool add_method)
Sean Callanan93a4b1a2010-08-04 01:02:13 +00003115{
Sean Callananf76afff2011-10-28 23:38:38 +00003116 ASTContext *parser_ast_context = m_ast_context;
Sean Callanan9b6898f2011-07-30 02:42:06 +00003117 ASTContext *user_ast_context = ut.GetASTContext();
Sean Callanan93a4b1a2010-08-04 01:02:13 +00003118
Sean Callananee8fc722010-11-19 20:20:02 +00003119 void *copied_type = GuardedCopyType(parser_ast_context, user_ast_context, ut.GetOpaqueQualType());
Sean Callanandc5fce12011-12-01 21:04:37 +00003120
3121 if (!copied_type)
3122 {
3123 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
3124
3125 if (log)
3126 log->Printf("ClangExpressionDeclMap::AddOneType - Couldn't import the type");
3127
3128 return;
3129 }
Sean Callanan9394b5a2011-10-29 19:50:43 +00003130
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00003131 if (add_method && ClangASTContext::IsAggregateType(copied_type))
3132 {
3133 void *args[1];
3134
3135 args[0] = ClangASTContext::GetVoidPtrType(parser_ast_context, false);
3136
Sean Callanan716e3f02011-11-01 18:07:13 +00003137 clang_type_t method_type = ClangASTContext::CreateFunctionType (parser_ast_context,
3138 ClangASTContext::GetBuiltInType_void(parser_ast_context),
3139 args,
3140 1,
3141 false,
3142 ClangASTContext::GetTypeQualifiers(copied_type));
3143
Greg Clayton1d8173f2010-09-24 05:15:53 +00003144 const bool is_virtual = false;
3145 const bool is_static = false;
3146 const bool is_inline = false;
Greg Clayton30449d52010-10-01 02:31:07 +00003147 const bool is_explicit = false;
Sean Callanan28ebe882011-11-02 18:09:01 +00003148 const bool is_attr_used = true;
Sean Callanan2581dbf2011-11-02 01:38:59 +00003149 const bool is_artificial = false;
Greg Clayton30449d52010-10-01 02:31:07 +00003150
Greg Clayton1d8173f2010-09-24 05:15:53 +00003151 ClangASTContext::AddMethodToCXXRecordType (parser_ast_context,
3152 copied_type,
Greg Clayton8de27c72010-10-15 22:48:33 +00003153 "$__lldb_expr",
Greg Clayton1d8173f2010-09-24 05:15:53 +00003154 method_type,
3155 lldb::eAccessPublic,
3156 is_virtual,
3157 is_static,
Greg Clayton30449d52010-10-01 02:31:07 +00003158 is_inline,
Sean Callanan716e3f02011-11-01 18:07:13 +00003159 is_explicit,
Sean Callanan2581dbf2011-11-02 01:38:59 +00003160 is_attr_used,
3161 is_artificial);
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00003162 }
Sean Callanan93a4b1a2010-08-04 01:02:13 +00003163
3164 context.AddTypeDecl(copied_type);
3165}