blob: 6fbec8f80a317e70d13888c3ae586d7df8f6304e [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:
898 memcpy ((void *)value.GetScalar().ULongLong(), data, length);
899 return true;
900 case Value::eValueTypeScalar:
901 return false;
902 }
903 }
904}
905
906bool
907ClangExpressionDeclMap::ReadTarget (uint8_t *data,
908 lldb_private::Value &value,
909 size_t length)
910{
911 assert (m_parser_vars.get());
912
913 ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
Greg Clayton567e7f32011-09-22 04:58:26 +0000914
915 Process *process = exe_ctx->GetProcessPtr();
916
Sean Callanan47dc4572011-09-15 02:13:07 +0000917 if (value.GetContextType() == Value::eContextTypeRegisterInfo)
918 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000919 if (!process)
Sean Callanan47dc4572011-09-15 02:13:07 +0000920 return false;
921
922 RegisterContext *reg_ctx = exe_ctx->GetRegisterContext();
923 RegisterInfo *reg_info = value.GetRegisterInfo();
924
925 if (!reg_ctx)
926 return false;
927
928 lldb_private::RegisterValue reg_value;
929 Error err;
930
931 if (!reg_ctx->ReadRegister(reg_info, reg_value))
932 return false;
933
Greg Clayton567e7f32011-09-22 04:58:26 +0000934 return reg_value.GetAsMemoryData(reg_info, data, length, process->GetByteOrder(), err);
Sean Callanan47dc4572011-09-15 02:13:07 +0000935 }
936 else
937 {
938 switch (value.GetValueType())
939 {
940 default:
941 return false;
942 case Value::eValueTypeFileAddress:
943 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000944 Target *target = exe_ctx->GetTargetPtr();
945 if (target == NULL)
Sean Callanan47dc4572011-09-15 02:13:07 +0000946 return false;
947
948 Address file_addr;
949
Greg Clayton567e7f32011-09-22 04:58:26 +0000950 if (!target->GetImages().ResolveFileAddress((lldb::addr_t)value.GetScalar().ULongLong(), file_addr))
Sean Callanan47dc4572011-09-15 02:13:07 +0000951 return false;
952
953 Error err;
Greg Clayton567e7f32011-09-22 04:58:26 +0000954 target->ReadMemory(file_addr, true, data, length, err);
Sean Callanan47dc4572011-09-15 02:13:07 +0000955
956 return err.Success();
957 }
958 case Value::eValueTypeLoadAddress:
959 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000960 if (!process)
Sean Callanan47dc4572011-09-15 02:13:07 +0000961 return false;
962
963 Error err;
Greg Clayton567e7f32011-09-22 04:58:26 +0000964 process->ReadMemory((lldb::addr_t)value.GetScalar().ULongLong(), data, length, err);
Sean Callanan47dc4572011-09-15 02:13:07 +0000965
966 return err.Success();
967 }
968 case Value::eValueTypeHostAddress:
Sean Callanan5a55c7a2011-11-18 03:28:09 +0000969 {
970 void *host_addr = (void*)value.GetScalar().ULongLong();
971
972 if (!host_addr)
973 return false;
974
975 memcpy (data, host_addr, length);
Sean Callanan47dc4572011-09-15 02:13:07 +0000976 return true;
Sean Callanan5a55c7a2011-11-18 03:28:09 +0000977 }
Sean Callanan47dc4572011-09-15 02:13:07 +0000978 case Value::eValueTypeScalar:
979 return false;
980 }
981 }
982}
983
984lldb_private::Value
985ClangExpressionDeclMap::LookupDecl (clang::NamedDecl *decl)
986{
987 assert (m_parser_vars.get());
988
989 ExecutionContext exe_ctx = *m_parser_vars->m_exe_ctx;
990
991 ClangExpressionVariableSP expr_var_sp (m_found_entities.GetVariable(decl));
992 ClangExpressionVariableSP persistent_var_sp (m_parser_vars->m_persistent_vars->GetVariable(decl));
Sean Callanan1c38d102011-11-02 23:24:30 +0000993
Sean Callanan47dc4572011-09-15 02:13:07 +0000994 if (expr_var_sp)
995 {
Sean Callanan4a078322011-10-13 00:09:20 +0000996 if (!expr_var_sp->m_parser_vars.get() || !expr_var_sp->m_parser_vars->m_lldb_var)
Sean Callanan6d284ef2011-10-12 22:20:02 +0000997 return Value();
998
Sean Callanan1c38d102011-11-02 23:24:30 +0000999 bool is_reference = expr_var_sp->m_flags & ClangExpressionVariable::EVTypeIsReference;
1000
Sean Callanan4b3cef02011-10-26 21:20:00 +00001001 std::auto_ptr<Value> value(GetVariableValue(exe_ctx, expr_var_sp->m_parser_vars->m_lldb_var, NULL));
1002
Sean Callanan1c38d102011-11-02 23:24:30 +00001003 if (is_reference && value.get() && value->GetValueType() == Value::eValueTypeLoadAddress)
1004 {
1005 Process *process = m_parser_vars->m_exe_ctx->GetProcessPtr();
1006
1007 if (!process)
1008 return Value();
1009
1010 lldb::addr_t value_addr = value->GetScalar().ULongLong();
1011 Error read_error;
1012 addr_t ref_value = process->ReadPointerFromMemory (value_addr, read_error);
1013
1014 if (!read_error.Success())
1015 return Value();
1016
1017 value->GetScalar() = (unsigned long long)ref_value;
1018 }
1019
Sean Callanan4b3cef02011-10-26 21:20:00 +00001020 if (value.get())
1021 return *value;
1022 else
1023 return Value();
Sean Callanan47dc4572011-09-15 02:13:07 +00001024 }
1025 else if (persistent_var_sp)
1026 {
Sean Callanana8428a42011-09-22 00:41:11 +00001027 if ((persistent_var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference ||
1028 persistent_var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) &&
Sean Callanan86a07da2011-10-22 01:58:08 +00001029 persistent_var_sp->m_live_sp &&
1030 m_parser_vars->m_exe_ctx->GetProcessSP() &&
1031 m_parser_vars->m_exe_ctx->GetProcessSP()->IsAlive())
Sean Callanana8428a42011-09-22 00:41:11 +00001032 {
Sean Callanan4b3cef02011-10-26 21:20:00 +00001033 return persistent_var_sp->m_live_sp->GetValue();
Sean Callanana8428a42011-09-22 00:41:11 +00001034 }
1035 else
1036 {
1037 lldb_private::Value ret;
1038 ret.SetValueType(Value::eValueTypeHostAddress);
1039 ret.SetContext(Value::eContextTypeInvalid, NULL);
1040 ret.GetScalar() = (lldb::addr_t)persistent_var_sp->GetValueBytes();
1041 return ret;
1042 }
Sean Callanan47dc4572011-09-15 02:13:07 +00001043 }
1044 else
1045 {
1046 return Value();
1047 }
1048}
1049
Sean Callanan4b3cef02011-10-26 21:20:00 +00001050Value
1051ClangExpressionDeclMap::GetSpecialValue (const ConstString &name)
1052{
1053 assert(m_parser_vars.get());
1054
1055 if (!m_parser_vars->m_exe_ctx)
1056 return Value();
1057
1058 StackFrame *frame = m_parser_vars->m_exe_ctx->GetFramePtr();
1059
1060 if (!frame)
1061 return Value();
1062
1063 VariableList *vars = frame->GetVariableList(false);
1064
1065 if (!vars)
1066 return Value();
1067
1068 lldb::VariableSP var = vars->FindVariable(name);
1069
1070 if (!var ||
1071 !var->IsInScope(frame) ||
1072 !var->LocationIsValidForFrame (frame))
1073 return Value();
1074
1075 std::auto_ptr<Value> value(GetVariableValue(*m_parser_vars->m_exe_ctx, var, NULL));
1076
Sean Callanan41a410d2011-11-03 22:48:37 +00001077 if (value.get() && value->GetValueType() == Value::eValueTypeLoadAddress)
1078 {
1079 Process *process = m_parser_vars->m_exe_ctx->GetProcessPtr();
1080
1081 if (!process)
1082 return Value();
1083
1084 lldb::addr_t value_addr = value->GetScalar().ULongLong();
1085 Error read_error;
1086 addr_t ptr_value = process->ReadPointerFromMemory (value_addr, read_error);
1087
1088 if (!read_error.Success())
1089 return Value();
1090
1091 value->GetScalar() = (unsigned long long)ptr_value;
1092 }
1093
Sean Callanan4b3cef02011-10-26 21:20:00 +00001094 if (value.get())
1095 return *value;
1096 else
1097 return Value();
1098}
1099
Sean Callanan810f22d2010-07-16 00:09:46 +00001100// Interface for CommandObjectExpression
Sean Callananf328c9f2010-07-20 23:31:16 +00001101
1102bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001103ClangExpressionDeclMap::Materialize
1104(
Sean Callananaa301c42010-12-03 01:38:59 +00001105 ExecutionContext &exe_ctx,
Greg Clayton8de27c72010-10-15 22:48:33 +00001106 lldb::addr_t &struct_address,
1107 Error &err
1108)
Sean Callananf328c9f2010-07-20 23:31:16 +00001109{
Sean Callananaa301c42010-12-03 01:38:59 +00001110 EnableMaterialVars();
1111
Greg Clayton567e7f32011-09-22 04:58:26 +00001112 m_material_vars->m_process = exe_ctx.GetProcessPtr();
Sean Callananaa301c42010-12-03 01:38:59 +00001113
Sean Callanan0ddf8062011-05-09 22:04:36 +00001114 bool result = DoMaterialize(false /* dematerialize */,
1115 exe_ctx,
1116 LLDB_INVALID_ADDRESS /* top of stack frame */,
1117 LLDB_INVALID_ADDRESS /* bottom of stack frame */,
1118 NULL, /* result SP */
1119 err);
Sean Callananf328c9f2010-07-20 23:31:16 +00001120
1121 if (result)
Sean Callananaa301c42010-12-03 01:38:59 +00001122 struct_address = m_material_vars->m_materialized_location;
Sean Callananf328c9f2010-07-20 23:31:16 +00001123
1124 return result;
1125}
1126
1127bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001128ClangExpressionDeclMap::GetObjectPointer
1129(
1130 lldb::addr_t &object_ptr,
Sean Callanan3aa7da52010-12-13 22:46:15 +00001131 ConstString &object_name,
Sean Callananaa301c42010-12-03 01:38:59 +00001132 ExecutionContext &exe_ctx,
Sean Callanan047923c2010-12-14 00:42:36 +00001133 Error &err,
1134 bool suppress_type_check
Greg Clayton8de27c72010-10-15 22:48:33 +00001135)
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001136{
Sean Callananaa301c42010-12-03 01:38:59 +00001137 assert (m_struct_vars.get());
1138
Greg Clayton567e7f32011-09-22 04:58:26 +00001139 Target *target = exe_ctx.GetTargetPtr();
1140 Process *process = exe_ctx.GetProcessPtr();
1141 StackFrame *frame = exe_ctx.GetFramePtr();
1142
1143 if (frame == NULL || process == NULL || target == NULL)
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001144 {
Sean Callanane6ea5fe2011-11-15 02:11:17 +00001145 err.SetErrorStringWithFormat("Couldn't load '%s' because the context is incomplete", object_name.AsCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001146 return false;
1147 }
1148
Sean Callananaa301c42010-12-03 01:38:59 +00001149 if (!m_struct_vars->m_object_pointer_type.GetOpaqueQualType())
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001150 {
Sean Callanane6ea5fe2011-11-15 02:11:17 +00001151 err.SetErrorStringWithFormat("Couldn't load '%s' because its type is unknown", object_name.AsCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001152 return false;
1153 }
1154
Greg Clayton567e7f32011-09-22 04:58:26 +00001155 VariableSP object_ptr_var = FindVariableInScope (*frame,
Sean Callanan696cf5f2011-05-07 01:06:41 +00001156 object_name,
1157 (suppress_type_check ? NULL : &m_struct_vars->m_object_pointer_type));
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001158
1159 if (!object_ptr_var)
1160 {
Sean Callanane6ea5fe2011-11-15 02:11:17 +00001161 err.SetErrorStringWithFormat("Couldn't find '%s' with appropriate type in scope", object_name.AsCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001162 return false;
1163 }
1164
Sean Callananaa301c42010-12-03 01:38:59 +00001165 std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(exe_ctx,
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001166 object_ptr_var,
Sean Callananaa301c42010-12-03 01:38:59 +00001167 NULL));
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001168
1169 if (!location_value.get())
1170 {
Sean Callanan3aa7da52010-12-13 22:46:15 +00001171 err.SetErrorStringWithFormat("Couldn't get the location for '%s'", object_name.GetCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001172 return false;
1173 }
1174
Sean Callanan50339fe2011-03-04 00:23:47 +00001175 switch (location_value->GetValueType())
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001176 {
Sean Callanan50339fe2011-03-04 00:23:47 +00001177 default:
Sean Callanan3aa7da52010-12-13 22:46:15 +00001178 err.SetErrorStringWithFormat("'%s' is not in memory; LLDB must be extended to handle registers", object_name.GetCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001179 return false;
Sean Callanan50339fe2011-03-04 00:23:47 +00001180 case Value::eValueTypeLoadAddress:
1181 {
1182 lldb::addr_t value_addr = location_value->GetScalar().ULongLong();
Greg Clayton567e7f32011-09-22 04:58:26 +00001183 uint32_t address_byte_size = target->GetArchitecture().GetAddressByteSize();
Sean Callanan50339fe2011-03-04 00:23:47 +00001184
1185 if (ClangASTType::GetClangTypeBitWidth(m_struct_vars->m_object_pointer_type.GetASTContext(),
1186 m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) != address_byte_size * 8)
1187 {
1188 err.SetErrorStringWithFormat("'%s' is not of an expected pointer size", object_name.GetCString());
1189 return false;
1190 }
1191
Sean Callanan50339fe2011-03-04 00:23:47 +00001192 Error read_error;
Greg Clayton567e7f32011-09-22 04:58:26 +00001193 object_ptr = process->ReadPointerFromMemory (value_addr, read_error);
Greg Claytonc0fa5332011-05-22 22:46:53 +00001194 if (read_error.Fail() || object_ptr == LLDB_INVALID_ADDRESS)
Sean Callanan50339fe2011-03-04 00:23:47 +00001195 {
1196 err.SetErrorStringWithFormat("Coldn't read '%s' from the target: %s", object_name.GetCString(), read_error.AsCString());
1197 return false;
Greg Claytonc0fa5332011-05-22 22:46:53 +00001198 }
Sean Callanan50339fe2011-03-04 00:23:47 +00001199 return true;
1200 }
1201 case Value::eValueTypeScalar:
1202 {
1203 if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
1204 {
1205 StreamString ss;
1206 location_value->Dump(&ss);
1207
1208 err.SetErrorStringWithFormat("%s is a scalar of unhandled type: %s", object_name.GetCString(), ss.GetString().c_str());
1209 return false;
1210 }
1211
Greg Clayton061b79d2011-05-09 20:18:18 +00001212 RegisterInfo *reg_info = location_value->GetRegisterInfo();
Sean Callanan50339fe2011-03-04 00:23:47 +00001213
Greg Clayton061b79d2011-05-09 20:18:18 +00001214 if (!reg_info)
Sean Callanan50339fe2011-03-04 00:23:47 +00001215 {
1216 err.SetErrorStringWithFormat("Couldn't get the register information for %s", object_name.GetCString());
1217 return false;
1218 }
1219
Greg Clayton061b79d2011-05-09 20:18:18 +00001220 RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
Sean Callanan50339fe2011-03-04 00:23:47 +00001221
Greg Clayton061b79d2011-05-09 20:18:18 +00001222 if (!reg_ctx)
Sean Callanan50339fe2011-03-04 00:23:47 +00001223 {
Greg Clayton061b79d2011-05-09 20:18:18 +00001224 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 +00001225 return false;
1226 }
1227
Greg Clayton061b79d2011-05-09 20:18:18 +00001228 uint32_t register_number = reg_info->kinds[lldb::eRegisterKindLLDB];
Sean Callanan50339fe2011-03-04 00:23:47 +00001229
Greg Clayton061b79d2011-05-09 20:18:18 +00001230 object_ptr = reg_ctx->ReadRegisterAsUnsigned(register_number, 0x0);
Sean Callanan50339fe2011-03-04 00:23:47 +00001231
1232 return true;
1233 }
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001234 }
1235}
1236
1237bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001238ClangExpressionDeclMap::Dematerialize
1239(
Sean Callananaa301c42010-12-03 01:38:59 +00001240 ExecutionContext &exe_ctx,
Greg Clayton427f2902010-12-14 02:59:59 +00001241 ClangExpressionVariableSP &result_sp,
Sean Callanan0ddf8062011-05-09 22:04:36 +00001242 lldb::addr_t stack_frame_top,
1243 lldb::addr_t stack_frame_bottom,
Greg Clayton8de27c72010-10-15 22:48:33 +00001244 Error &err
1245)
Sean Callananf328c9f2010-07-20 23:31:16 +00001246{
Sean Callanan0ddf8062011-05-09 22:04:36 +00001247 return DoMaterialize(true, exe_ctx, stack_frame_top, stack_frame_bottom, &result_sp, err);
Sean Callananaa301c42010-12-03 01:38:59 +00001248
1249 DidDematerialize();
1250}
1251
1252void
1253ClangExpressionDeclMap::DidDematerialize()
1254{
1255 if (m_material_vars.get())
1256 {
1257 if (m_material_vars->m_materialized_location)
1258 {
1259 //#define SINGLE_STEP_EXPRESSIONS
1260
1261#ifndef SINGLE_STEP_EXPRESSIONS
1262 m_material_vars->m_process->DeallocateMemory(m_material_vars->m_materialized_location);
1263#endif
1264 m_material_vars->m_materialized_location = 0;
1265 }
1266
1267 DisableMaterialVars();
1268 }
Sean Callananf328c9f2010-07-20 23:31:16 +00001269}
1270
Sean Callanan32824aa2010-07-23 22:19:18 +00001271bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001272ClangExpressionDeclMap::DumpMaterializedStruct
1273(
Sean Callananaa301c42010-12-03 01:38:59 +00001274 ExecutionContext &exe_ctx,
Greg Clayton8de27c72010-10-15 22:48:33 +00001275 Stream &s,
1276 Error &err
1277)
Sean Callanan32824aa2010-07-23 22:19:18 +00001278{
Sean Callananaa301c42010-12-03 01:38:59 +00001279 assert (m_struct_vars.get());
1280 assert (m_material_vars.get());
1281
1282 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan32824aa2010-07-23 22:19:18 +00001283 {
1284 err.SetErrorString("Structure hasn't been laid out yet");
1285 return false;
1286 }
Greg Clayton567e7f32011-09-22 04:58:26 +00001287 Process *process = exe_ctx.GetProcessPtr();
1288
1289 if (!process)
Sean Callanan32824aa2010-07-23 22:19:18 +00001290 {
1291 err.SetErrorString("Couldn't find the process");
1292 return false;
1293 }
1294
Greg Clayton567e7f32011-09-22 04:58:26 +00001295 Target *target = exe_ctx.GetTargetPtr();
1296 if (!target)
Sean Callanan32824aa2010-07-23 22:19:18 +00001297 {
1298 err.SetErrorString("Couldn't find the target");
1299 return false;
1300 }
1301
Sean Callanan33711022010-12-07 10:00:20 +00001302 if (!m_material_vars->m_materialized_location)
1303 {
1304 err.SetErrorString("No materialized location");
1305 return false;
1306 }
1307
Greg Claytonc0fa5332011-05-22 22:46:53 +00001308 lldb::DataBufferSP data_sp(new DataBufferHeap(m_struct_vars->m_struct_size, 0));
Sean Callanan32824aa2010-07-23 22:19:18 +00001309
1310 Error error;
Greg Clayton567e7f32011-09-22 04:58:26 +00001311 if (process->ReadMemory (m_material_vars->m_materialized_location,
Greg Claytonc0fa5332011-05-22 22:46:53 +00001312 data_sp->GetBytes(),
1313 data_sp->GetByteSize(), error) != data_sp->GetByteSize())
Sean Callanan32824aa2010-07-23 22:19:18 +00001314 {
1315 err.SetErrorStringWithFormat ("Couldn't read struct from the target: %s", error.AsCString());
1316 return false;
1317 }
1318
Greg Clayton567e7f32011-09-22 04:58:26 +00001319 DataExtractor extractor(data_sp, process->GetByteOrder(), target->GetArchitecture().GetAddressByteSize());
Sean Callanan32824aa2010-07-23 22:19:18 +00001320
Greg Clayton427f2902010-12-14 02:59:59 +00001321 for (size_t member_idx = 0, num_members = m_struct_members.GetSize();
1322 member_idx < num_members;
1323 ++member_idx)
Sean Callanan32824aa2010-07-23 22:19:18 +00001324 {
Greg Clayton427f2902010-12-14 02:59:59 +00001325 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_idx));
Sean Callanan32824aa2010-07-23 22:19:18 +00001326
Greg Clayton427f2902010-12-14 02:59:59 +00001327 if (!member_sp)
1328 return false;
1329
1330 s.Printf("[%s]\n", member_sp->GetName().GetCString());
Sean Callanan8c127202010-08-23 23:09:38 +00001331
Greg Clayton427f2902010-12-14 02:59:59 +00001332 if (!member_sp->m_jit_vars.get())
Sean Callanan8c127202010-08-23 23:09:38 +00001333 return false;
1334
Greg Clayton427f2902010-12-14 02:59:59 +00001335 extractor.Dump (&s, // stream
1336 member_sp->m_jit_vars->m_offset, // offset
1337 lldb::eFormatBytesWithASCII, // format
1338 1, // byte size of individual entries
1339 member_sp->m_jit_vars->m_size, // number of entries
1340 16, // entries per line
1341 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, // address to print
1342 0, // bit size (bitfields only; 0 means ignore)
1343 0); // bit alignment (bitfields only; 0 means ignore)
Sean Callanan32824aa2010-07-23 22:19:18 +00001344
1345 s.PutChar('\n');
1346 }
1347
1348 return true;
1349}
1350
Sean Callananf328c9f2010-07-20 23:31:16 +00001351bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001352ClangExpressionDeclMap::DoMaterialize
1353(
1354 bool dematerialize,
Sean Callananaa301c42010-12-03 01:38:59 +00001355 ExecutionContext &exe_ctx,
Sean Callanan0ddf8062011-05-09 22:04:36 +00001356 lldb::addr_t stack_frame_top,
1357 lldb::addr_t stack_frame_bottom,
Greg Clayton427f2902010-12-14 02:59:59 +00001358 lldb::ClangExpressionVariableSP *result_sp_ptr,
Greg Clayton8de27c72010-10-15 22:48:33 +00001359 Error &err
1360)
Sean Callanan810f22d2010-07-16 00:09:46 +00001361{
Greg Clayton427f2902010-12-14 02:59:59 +00001362 if (result_sp_ptr)
1363 result_sp_ptr->reset();
1364
Sean Callananaa301c42010-12-03 01:38:59 +00001365 assert (m_struct_vars.get());
1366
Greg Claytone005f2c2010-11-06 01:53:30 +00001367 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan82b74c82010-08-12 01:56:52 +00001368
Sean Callananaa301c42010-12-03 01:38:59 +00001369 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan810f22d2010-07-16 00:09:46 +00001370 {
1371 err.SetErrorString("Structure hasn't been laid out yet");
Greg Clayton57067a02011-09-13 04:03:52 +00001372 return false;
Sean Callanan810f22d2010-07-16 00:09:46 +00001373 }
1374
Greg Clayton567e7f32011-09-22 04:58:26 +00001375 StackFrame *frame = exe_ctx.GetFramePtr();
1376 if (!frame)
Sean Callanan45839272010-07-24 01:37:44 +00001377 {
1378 err.SetErrorString("Received null execution frame");
Greg Clayton57067a02011-09-13 04:03:52 +00001379 return false;
Sean Callanan45839272010-07-24 01:37:44 +00001380 }
Greg Clayton567e7f32011-09-22 04:58:26 +00001381 Target *target = exe_ctx.GetTargetPtr();
Sean Callanan45839272010-07-24 01:37:44 +00001382
Greg Clayton567e7f32011-09-22 04:58:26 +00001383 ClangPersistentVariables &persistent_vars = target->GetPersistentVariables();
Sean Callananaa301c42010-12-03 01:38:59 +00001384
1385 if (!m_struct_vars->m_struct_size)
Sean Callanane8a59a82010-09-13 21:34:21 +00001386 {
1387 if (log)
1388 log->PutCString("Not bothering to allocate a struct because no arguments are needed");
1389
Sean Callanan9b6898f2011-07-30 02:42:06 +00001390 m_material_vars->m_allocated_area = NULL;
Sean Callanane8a59a82010-09-13 21:34:21 +00001391
1392 return true;
1393 }
1394
Greg Clayton567e7f32011-09-22 04:58:26 +00001395 const SymbolContext &sym_ctx(frame->GetSymbolContext(lldb::eSymbolContextEverything));
Sean Callanan810f22d2010-07-16 00:09:46 +00001396
Sean Callananf328c9f2010-07-20 23:31:16 +00001397 if (!dematerialize)
Sean Callanan810f22d2010-07-16 00:09:46 +00001398 {
Greg Clayton567e7f32011-09-22 04:58:26 +00001399 Process *process = exe_ctx.GetProcessPtr();
Sean Callananaa301c42010-12-03 01:38:59 +00001400 if (m_material_vars->m_materialized_location)
Sean Callananf328c9f2010-07-20 23:31:16 +00001401 {
Greg Clayton567e7f32011-09-22 04:58:26 +00001402 process->DeallocateMemory(m_material_vars->m_materialized_location);
Sean Callananaa301c42010-12-03 01:38:59 +00001403 m_material_vars->m_materialized_location = 0;
Sean Callananf328c9f2010-07-20 23:31:16 +00001404 }
1405
Sean Callanan7a60b942010-10-08 01:58:41 +00001406 if (log)
1407 log->PutCString("Allocating memory for materialized argument struct");
1408
Greg Clayton567e7f32011-09-22 04:58:26 +00001409 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 +00001410 lldb::ePermissionsReadable | lldb::ePermissionsWritable,
1411 err);
Sean Callananf328c9f2010-07-20 23:31:16 +00001412
1413 if (mem == LLDB_INVALID_ADDRESS)
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001414 {
1415 err.SetErrorStringWithFormat("Couldn't allocate 0x%llx bytes for materialized argument struct",
1416 (unsigned long long)(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size));
Sean Callananf328c9f2010-07-20 23:31:16 +00001417 return false;
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001418 }
1419
Sean Callananaa301c42010-12-03 01:38:59 +00001420 m_material_vars->m_allocated_area = mem;
Sean Callanan810f22d2010-07-16 00:09:46 +00001421 }
1422
Sean Callananaa301c42010-12-03 01:38:59 +00001423 m_material_vars->m_materialized_location = m_material_vars->m_allocated_area;
Sean Callananf328c9f2010-07-20 23:31:16 +00001424
Sean Callananaa301c42010-12-03 01:38:59 +00001425 if (m_material_vars->m_materialized_location % m_struct_vars->m_struct_alignment)
1426 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 +00001427
Greg Clayton427f2902010-12-14 02:59:59 +00001428 for (uint64_t member_index = 0, num_members = m_struct_members.GetSize();
Sean Callanan8c127202010-08-23 23:09:38 +00001429 member_index < num_members;
1430 ++member_index)
Sean Callanan810f22d2010-07-16 00:09:46 +00001431 {
Greg Clayton427f2902010-12-14 02:59:59 +00001432 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
Sean Callanan810f22d2010-07-16 00:09:46 +00001433
Greg Claytona875b642011-01-09 21:07:35 +00001434 if (m_found_entities.ContainsVariable (member_sp))
Sean Callanan8c127202010-08-23 23:09:38 +00001435 {
Greg Claytona875b642011-01-09 21:07:35 +00001436 RegisterInfo *reg_info = member_sp->GetRegisterInfo ();
Greg Clayton427f2902010-12-14 02:59:59 +00001437 if (reg_info)
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001438 {
1439 // This is a register variable
1440
Sean Callananaa301c42010-12-03 01:38:59 +00001441 RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001442
1443 if (!reg_ctx)
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001444 {
1445 err.SetErrorString("Couldn't get register context");
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001446 return false;
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001447 }
1448
Greg Clayton427f2902010-12-14 02:59:59 +00001449 if (!DoMaterializeOneRegister (dematerialize,
1450 exe_ctx,
1451 *reg_ctx,
1452 *reg_info,
1453 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
1454 err))
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001455 return false;
1456 }
1457 else
1458 {
Greg Clayton427f2902010-12-14 02:59:59 +00001459 if (!member_sp->m_jit_vars.get())
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001460 {
1461 err.SetErrorString("Variable being materialized doesn't have necessary state");
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001462 return false;
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001463 }
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001464
Greg Clayton427f2902010-12-14 02:59:59 +00001465 if (!DoMaterializeOneVariable (dematerialize,
1466 exe_ctx,
Sean Callanan6a925532011-01-13 08:53:35 +00001467 sym_ctx,
1468 member_sp,
Greg Clayton427f2902010-12-14 02:59:59 +00001469 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
1470 err))
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001471 return false;
1472 }
Sean Callanan8c127202010-08-23 23:09:38 +00001473 }
Sean Callanan8c127202010-08-23 23:09:38 +00001474 else
1475 {
Greg Claytona875b642011-01-09 21:07:35 +00001476 // No need to look for presistent variables if the name doesn't start
1477 // with with a '$' character...
1478 if (member_sp->GetName().AsCString ("!")[0] == '$' && persistent_vars.ContainsVariable(member_sp))
1479 {
Sean Callanan6a925532011-01-13 08:53:35 +00001480
Greg Claytona875b642011-01-09 21:07:35 +00001481 if (member_sp->GetName() == m_struct_vars->m_result_name)
1482 {
Greg Claytona875b642011-01-09 21:07:35 +00001483 if (log)
1484 log->PutCString("Found result member in the struct");
Sean Callanan6a925532011-01-13 08:53:35 +00001485
Greg Claytona875b642011-01-09 21:07:35 +00001486 if (result_sp_ptr)
1487 *result_sp_ptr = member_sp;
Sean Callanan6a925532011-01-13 08:53:35 +00001488
Greg Claytona875b642011-01-09 21:07:35 +00001489 }
1490
1491 if (!DoMaterializeOnePersistentVariable (dematerialize,
Sean Callanan6a925532011-01-13 08:53:35 +00001492 exe_ctx,
Greg Claytona875b642011-01-09 21:07:35 +00001493 member_sp,
Sean Callanan0ddf8062011-05-09 22:04:36 +00001494 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
1495 stack_frame_top,
1496 stack_frame_bottom,
Greg Claytona875b642011-01-09 21:07:35 +00001497 err))
1498 return false;
1499 }
1500 else
1501 {
1502 err.SetErrorStringWithFormat("Unexpected variable %s", member_sp->GetName().GetCString());
1503 return false;
1504 }
Sean Callanan8c127202010-08-23 23:09:38 +00001505 }
Sean Callanan810f22d2010-07-16 00:09:46 +00001506 }
1507
Sean Callananf328c9f2010-07-20 23:31:16 +00001508 return true;
1509}
1510
Sean Callanana48fe162010-08-11 03:57:18 +00001511bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001512ClangExpressionDeclMap::DoMaterializeOnePersistentVariable
1513(
1514 bool dematerialize,
1515 ExecutionContext &exe_ctx,
Greg Clayton427f2902010-12-14 02:59:59 +00001516 ClangExpressionVariableSP &var_sp,
Greg Clayton8de27c72010-10-15 22:48:33 +00001517 lldb::addr_t addr,
Sean Callanan0ddf8062011-05-09 22:04:36 +00001518 lldb::addr_t stack_frame_top,
1519 lldb::addr_t stack_frame_bottom,
Greg Clayton8de27c72010-10-15 22:48:33 +00001520 Error &err
1521)
Sean Callananaa301c42010-12-03 01:38:59 +00001522{
Sean Callanan6a925532011-01-13 08:53:35 +00001523 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1524
Greg Clayton427f2902010-12-14 02:59:59 +00001525 if (!var_sp)
Sean Callanana48fe162010-08-11 03:57:18 +00001526 {
Greg Clayton427f2902010-12-14 02:59:59 +00001527 err.SetErrorString("Invalid persistent variable");
Sean Callanana48fe162010-08-11 03:57:18 +00001528 return LLDB_INVALID_ADDRESS;
1529 }
1530
Greg Clayton427f2902010-12-14 02:59:59 +00001531 const size_t pvar_byte_size = var_sp->GetByteSize();
Sean Callanana6223432010-08-20 01:02:30 +00001532
Greg Clayton427f2902010-12-14 02:59:59 +00001533 uint8_t *pvar_data = var_sp->GetValueBytes();
1534 if (pvar_data == NULL)
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001535 {
1536 err.SetErrorString("Persistent variable being materialized contains no data");
Sean Callanana6223432010-08-20 01:02:30 +00001537 return false;
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001538 }
Sean Callanana6223432010-08-20 01:02:30 +00001539
Sean Callanana48fe162010-08-11 03:57:18 +00001540 Error error;
Greg Clayton567e7f32011-09-22 04:58:26 +00001541 Process *process = exe_ctx.GetProcessPtr();
1542
Sean Callanan6a925532011-01-13 08:53:35 +00001543 lldb::addr_t mem; // The address of a spare memory area used to hold the persistent variable.
1544
Sean Callanana48fe162010-08-11 03:57:18 +00001545 if (dematerialize)
1546 {
Sean Callanan6a925532011-01-13 08:53:35 +00001547 if (log)
1548 log->Printf("Dematerializing persistent variable with flags 0x%hx", var_sp->m_flags);
1549
1550 if ((var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) ||
1551 (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference))
Sean Callanana48fe162010-08-11 03:57:18 +00001552 {
Sean Callanan6a925532011-01-13 08:53:35 +00001553 // Get the location of the target out of the struct.
1554
1555 Error read_error;
Greg Clayton567e7f32011-09-22 04:58:26 +00001556 mem = process->ReadPointerFromMemory (addr, read_error);
Sean Callanan6a925532011-01-13 08:53:35 +00001557
1558 if (mem == LLDB_INVALID_ADDRESS)
1559 {
1560 err.SetErrorStringWithFormat("Couldn't read address of %s from struct: %s", var_sp->GetName().GetCString(), error.AsCString());
1561 return false;
1562 }
1563
1564 if (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference &&
1565 !var_sp->m_live_sp)
1566 {
1567 // If the reference comes from the program, then the ClangExpressionVariable's
1568 // live variable data hasn't been set up yet. Do this now.
1569
Jim Ingham47da8102011-04-22 23:53:53 +00001570 var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope (),
1571 var_sp->GetTypeFromUser().GetASTContext(),
1572 var_sp->GetTypeFromUser().GetOpaqueQualType(),
1573 var_sp->GetName(),
1574 mem,
1575 eAddressTypeLoad,
1576 pvar_byte_size);
Sean Callanan6a925532011-01-13 08:53:35 +00001577 }
1578
1579 if (!var_sp->m_live_sp)
1580 {
1581 err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", var_sp->GetName().GetCString());
1582 return false;
1583 }
1584
Greg Claytonb3448432011-03-24 21:19:54 +00001585 if (var_sp->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
Sean Callanan6a925532011-01-13 08:53:35 +00001586 {
1587 err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", var_sp->GetName().GetCString());
1588 return false;
1589 }
1590
Sean Callanan97678d12011-01-13 21:23:32 +00001591 if (var_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry ||
1592 var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
Sean Callanan6a925532011-01-13 08:53:35 +00001593 {
1594 mem = var_sp->m_live_sp->GetValue().GetScalar().ULongLong();
1595
1596 if (log)
1597 log->Printf("Dematerializing %s from 0x%llx", var_sp->GetName().GetCString(), (uint64_t)mem);
1598
1599 // Read the contents of the spare memory area
Sean Callanan0ddf8062011-05-09 22:04:36 +00001600
Sean Callanan6a925532011-01-13 08:53:35 +00001601 var_sp->ValueUpdated ();
Greg Clayton567e7f32011-09-22 04:58:26 +00001602 if (process->ReadMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
Sean Callanan6a925532011-01-13 08:53:35 +00001603 {
1604 err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString());
1605 return false;
1606 }
1607
Sean Callanan0ddf8062011-05-09 22:04:36 +00001608 if (stack_frame_top != LLDB_INVALID_ADDRESS &&
1609 stack_frame_bottom != LLDB_INVALID_ADDRESS &&
1610 mem >= stack_frame_bottom &&
1611 mem <= stack_frame_top)
1612 {
1613 // If the variable is resident in the stack frame created by the expression,
1614 // then it cannot be relied upon to stay around. We treat it as needing
1615 // reallocation.
1616
1617 var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
1618 var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
1619 var_sp->m_flags &= ~ClangExpressionVariable::EVIsProgramReference;
1620 }
1621
Sean Callanan6a925532011-01-13 08:53:35 +00001622 var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsFreezeDry;
1623 }
1624
1625 if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation &&
1626 !(var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget))
1627 {
1628 if (m_keep_result_in_memory)
1629 {
1630 var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget;
1631 }
1632 else
1633 {
Greg Clayton567e7f32011-09-22 04:58:26 +00001634 Error deallocate_error = process->DeallocateMemory(mem);
Sean Callanan6a925532011-01-13 08:53:35 +00001635
1636 if (!err.Success())
1637 {
1638 err.SetErrorStringWithFormat ("Couldn't deallocate memory for %s: %s", var_sp->GetName().GetCString(), deallocate_error.AsCString());
1639 return false;
1640 }
1641 }
1642 }
1643 }
1644 else
1645 {
1646 err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
Sean Callanana48fe162010-08-11 03:57:18 +00001647 return false;
1648 }
1649 }
1650 else
1651 {
Sean Callanan6a925532011-01-13 08:53:35 +00001652 if (log)
1653 log->Printf("Materializing persistent variable with flags 0x%hx", var_sp->m_flags);
1654
1655 if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation)
Sean Callanana48fe162010-08-11 03:57:18 +00001656 {
Sean Callanan6a925532011-01-13 08:53:35 +00001657 // Allocate a spare memory area to store the persistent variable's contents.
1658
1659 Error allocate_error;
1660
Greg Clayton567e7f32011-09-22 04:58:26 +00001661 mem = process->AllocateMemory(pvar_byte_size,
Sean Callanan4b3cef02011-10-26 21:20:00 +00001662 lldb::ePermissionsReadable | lldb::ePermissionsWritable,
1663 allocate_error);
Sean Callanan6a925532011-01-13 08:53:35 +00001664
1665 if (mem == LLDB_INVALID_ADDRESS)
1666 {
1667 err.SetErrorStringWithFormat("Couldn't allocate a memory area to store %s: %s", var_sp->GetName().GetCString(), allocate_error.AsCString());
1668 return false;
1669 }
1670
1671 if (log)
1672 log->Printf("Allocated %s (0x%llx) sucessfully", var_sp->GetName().GetCString(), mem);
1673
1674 // Put the location of the spare memory into the live data of the ValueObject.
1675
Jim Ingham47da8102011-04-22 23:53:53 +00001676 var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
1677 var_sp->GetTypeFromUser().GetASTContext(),
1678 var_sp->GetTypeFromUser().GetOpaqueQualType(),
1679 var_sp->GetName(),
1680 mem,
1681 eAddressTypeLoad,
1682 pvar_byte_size);
Sean Callanan6a925532011-01-13 08:53:35 +00001683
1684 // Clear the flag if the variable will never be deallocated.
1685
1686 if (var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
1687 var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsAllocation;
1688
1689 // Write the contents of the variable to the area.
1690
Greg Clayton567e7f32011-09-22 04:58:26 +00001691 if (process->WriteMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
Sean Callanan6a925532011-01-13 08:53:35 +00001692 {
1693 err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString());
1694 return false;
1695 }
1696 }
1697
1698 if ((var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && var_sp->m_live_sp) ||
1699 var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated)
1700 {
Sean Callanan6a925532011-01-13 08:53:35 +00001701 // Now write the location of the area into the struct.
Sean Callanan6a925532011-01-13 08:53:35 +00001702 Error write_error;
Greg Clayton567e7f32011-09-22 04:58:26 +00001703 if (!process->WriteScalarToMemory (addr,
Sean Callanan4b3cef02011-10-26 21:20:00 +00001704 var_sp->m_live_sp->GetValue().GetScalar(),
1705 process->GetAddressByteSize(),
1706 write_error))
Sean Callanan6a925532011-01-13 08:53:35 +00001707 {
1708 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", var_sp->GetName().GetCString(), write_error.AsCString());
1709 return false;
1710 }
1711
1712 if (log)
Greg Claytonc0fa5332011-05-22 22:46:53 +00001713 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 +00001714 }
Sean Callanan696cf5f2011-05-07 01:06:41 +00001715 else if (!(var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference))
Sean Callanan6a925532011-01-13 08:53:35 +00001716 {
1717 err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
Sean Callanana48fe162010-08-11 03:57:18 +00001718 return false;
1719 }
1720 }
1721
1722 return true;
1723}
1724
Sean Callananf328c9f2010-07-20 23:31:16 +00001725bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001726ClangExpressionDeclMap::DoMaterializeOneVariable
1727(
1728 bool dematerialize,
1729 ExecutionContext &exe_ctx,
1730 const SymbolContext &sym_ctx,
Sean Callanan6a925532011-01-13 08:53:35 +00001731 ClangExpressionVariableSP &expr_var,
Greg Clayton8de27c72010-10-15 22:48:33 +00001732 lldb::addr_t addr,
1733 Error &err
1734)
Sean Callananf328c9f2010-07-20 23:31:16 +00001735{
Greg Claytone005f2c2010-11-06 01:53:30 +00001736 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Greg Clayton567e7f32011-09-22 04:58:26 +00001737 Target *target = exe_ctx.GetTargetPtr();
1738 Process *process = exe_ctx.GetProcessPtr();
1739 StackFrame *frame = exe_ctx.GetFramePtr();
1740
Sean Callanan6d284ef2011-10-12 22:20:02 +00001741 if (!frame || !process || !target || !m_parser_vars.get() || !expr_var->m_parser_vars.get())
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001742 {
1743 err.SetErrorString("Necessary state for variable materialization isn't present");
Sean Callanancc074622010-09-14 21:59:34 +00001744 return false;
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001745 }
Sean Callanancc074622010-09-14 21:59:34 +00001746
Sean Callanan6a925532011-01-13 08:53:35 +00001747 // Vital information about the value
1748
1749 const ConstString &name(expr_var->GetName());
1750 TypeFromUser type(expr_var->GetTypeFromUser());
1751
Sean Callanan4a078322011-10-13 00:09:20 +00001752 VariableSP &var(expr_var->m_parser_vars->m_lldb_var);
1753 lldb_private::Symbol *sym(expr_var->m_parser_vars->m_lldb_sym);
Sean Callananf328c9f2010-07-20 23:31:16 +00001754
Sean Callanan6f3bde72011-10-27 19:41:13 +00001755 bool is_reference(expr_var->m_flags & ClangExpressionVariable::EVTypeIsReference);
1756
Sean Callanan81974962011-05-08 02:21:26 +00001757 std::auto_ptr<lldb_private::Value> location_value;
Sean Callanan4a078322011-10-13 00:09:20 +00001758
Sean Callanan81974962011-05-08 02:21:26 +00001759 if (var)
1760 {
1761 location_value.reset(GetVariableValue(exe_ctx,
1762 var,
1763 NULL));
1764 }
1765 else if (sym)
Sean Callanan4a078322011-10-13 00:09:20 +00001766 {
Sean Callanan21ef5bb2011-12-01 02:04:16 +00001767 addr_t location_load_addr = GetSymbolAddress(*target, name, lldb::eSymbolTypeAny);
Sean Callanan81974962011-05-08 02:21:26 +00001768
Greg Claytoncbc07cf2011-06-23 04:25:29 +00001769 if (location_load_addr == LLDB_INVALID_ADDRESS)
Sean Callanan81974962011-05-08 02:21:26 +00001770 {
1771 if (log)
Greg Claytonc0fa5332011-05-22 22:46:53 +00001772 err.SetErrorStringWithFormat ("Couldn't find value for global symbol %s",
1773 name.GetCString());
Sean Callanan81974962011-05-08 02:21:26 +00001774 }
1775
Sean Callanan4a078322011-10-13 00:09:20 +00001776 location_value.reset(new Value);
1777
Sean Callanan81974962011-05-08 02:21:26 +00001778 location_value->SetValueType(Value::eValueTypeLoadAddress);
1779 location_value->GetScalar() = location_load_addr;
1780 }
1781 else
Sean Callananf328c9f2010-07-20 23:31:16 +00001782 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001783 err.SetErrorStringWithFormat ("Couldn't find %s with appropriate type",
1784 name.GetCString());
Sean Callananf328c9f2010-07-20 23:31:16 +00001785 return false;
1786 }
1787
Sean Callanan841026f2010-07-23 00:16:21 +00001788 if (log)
Sean Callananfb3058e2011-05-12 23:54:16 +00001789 {
1790 StreamString my_stream_string;
1791
1792 ClangASTType::DumpTypeDescription (type.GetASTContext(),
1793 type.GetOpaqueQualType(),
1794 &my_stream_string);
1795
Greg Claytonc0fa5332011-05-22 22:46:53 +00001796 log->Printf ("%s %s with type %s",
1797 dematerialize ? "Dematerializing" : "Materializing",
1798 name.GetCString(),
1799 my_stream_string.GetString().c_str());
Sean Callananfb3058e2011-05-12 23:54:16 +00001800 }
Sean Callananf328c9f2010-07-20 23:31:16 +00001801
1802 if (!location_value.get())
1803 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001804 err.SetErrorStringWithFormat("Couldn't get value for %s", name.GetCString());
Sean Callananf328c9f2010-07-20 23:31:16 +00001805 return false;
1806 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001807
1808 // The size of the type contained in addr
Sean Callananf328c9f2010-07-20 23:31:16 +00001809
Sean Callanan6a925532011-01-13 08:53:35 +00001810 size_t value_bit_size = ClangASTType::GetClangTypeBitWidth(type.GetASTContext(), type.GetOpaqueQualType());
1811 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 +00001812
1813 Value::ValueType value_type = location_value->GetValueType();
1814
1815 switch (value_type)
Sean Callananf328c9f2010-07-20 23:31:16 +00001816 {
Sean Callanan17c6a052010-10-05 20:18:48 +00001817 default:
Sean Callananf328c9f2010-07-20 23:31:16 +00001818 {
Sean Callanan17c6a052010-10-05 20:18:48 +00001819 StreamString ss;
1820
1821 location_value->Dump(&ss);
1822
Greg Claytonc0fa5332011-05-22 22:46:53 +00001823 err.SetErrorStringWithFormat ("%s has a value of unhandled type: %s",
1824 name.GetCString(),
1825 ss.GetString().c_str());
Sean Callananf328c9f2010-07-20 23:31:16 +00001826 return false;
1827 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001828 break;
1829 case Value::eValueTypeLoadAddress:
Sean Callananf328c9f2010-07-20 23:31:16 +00001830 {
Sean Callanan6a925532011-01-13 08:53:35 +00001831 if (!dematerialize)
Sean Callanan17c6a052010-10-05 20:18:48 +00001832 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001833 Error write_error;
Sean Callanan6a925532011-01-13 08:53:35 +00001834
Sean Callanan6f3bde72011-10-27 19:41:13 +00001835 if (is_reference)
Sean Callanan6a925532011-01-13 08:53:35 +00001836 {
Sean Callanan6f3bde72011-10-27 19:41:13 +00001837 Error read_error;
1838
1839 addr_t ref_value = process->ReadPointerFromMemory(location_value->GetScalar().ULongLong(), read_error);
1840
1841 if (!read_error.Success())
1842 {
1843 err.SetErrorStringWithFormat ("Couldn't read reference to %s from the target: %s",
1844 name.GetCString(),
1845 read_error.AsCString());
1846 return false;
1847 }
1848
1849 if (!process->WritePointerToMemory(addr,
1850 ref_value,
1851 write_error))
1852 {
1853 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
1854 name.GetCString(),
1855 write_error.AsCString());
1856 return false;
1857 }
1858 }
1859 else
1860 {
1861 if (!process->WriteScalarToMemory (addr,
1862 location_value->GetScalar(),
1863 process->GetAddressByteSize(),
1864 write_error))
1865 {
1866 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
1867 name.GetCString(),
1868 write_error.AsCString());
1869 return false;
1870 }
Sean Callanan6a925532011-01-13 08:53:35 +00001871 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001872 }
Sean Callananf328c9f2010-07-20 23:31:16 +00001873 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001874 break;
1875 case Value::eValueTypeScalar:
1876 {
Greg Clayton6916e352010-11-13 03:52:47 +00001877 if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
Sean Callanan17c6a052010-10-05 20:18:48 +00001878 {
1879 StreamString ss;
Sean Callanan17c6a052010-10-05 20:18:48 +00001880 location_value->Dump(&ss);
1881
Greg Claytonc0fa5332011-05-22 22:46:53 +00001882 err.SetErrorStringWithFormat ("%s is a scalar of unhandled type: %s",
1883 name.GetCString(),
1884 ss.GetString().c_str());
Sean Callanan17c6a052010-10-05 20:18:48 +00001885 return false;
1886 }
1887
Greg Clayton061b79d2011-05-09 20:18:18 +00001888 RegisterInfo *reg_info = location_value->GetRegisterInfo();
Sean Callanan17c6a052010-10-05 20:18:48 +00001889
Greg Clayton061b79d2011-05-09 20:18:18 +00001890 if (!reg_info)
Sean Callanan17c6a052010-10-05 20:18:48 +00001891 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001892 err.SetErrorStringWithFormat ("Couldn't get the register information for %s",
1893 name.GetCString());
Sean Callanan17c6a052010-10-05 20:18:48 +00001894 return false;
1895 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001896
Greg Clayton061b79d2011-05-09 20:18:18 +00001897 RegisterValue reg_value;
1898
1899 RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
1900
1901 if (!reg_ctx)
Sean Callanan17c6a052010-10-05 20:18:48 +00001902 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001903 err.SetErrorStringWithFormat ("Couldn't read register context to read %s from %s",
1904 name.GetCString(),
1905 reg_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001906 return false;
1907 }
1908
Greg Clayton061b79d2011-05-09 20:18:18 +00001909 uint32_t register_byte_size = reg_info->byte_size;
Sean Callanan17c6a052010-10-05 20:18:48 +00001910
1911 if (dematerialize)
1912 {
Sean Callanan6f3bde72011-10-27 19:41:13 +00001913 if (is_reference)
1914 return true; // reference types don't need demateralizing
1915
Sean Callanan6a925532011-01-13 08:53:35 +00001916 // Get the location of the spare memory area out of the variable's live data.
1917
1918 if (!expr_var->m_live_sp)
1919 {
1920 err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", name.GetCString());
1921 return false;
1922 }
1923
Greg Claytonb3448432011-03-24 21:19:54 +00001924 if (expr_var->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
Sean Callanan6a925532011-01-13 08:53:35 +00001925 {
1926 err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", name.GetCString());
1927 return false;
1928 }
1929
Greg Claytonc0fa5332011-05-22 22:46:53 +00001930 Scalar &reg_addr = expr_var->m_live_sp->GetValue().GetScalar();
Sean Callanan6a925532011-01-13 08:53:35 +00001931
Greg Claytonc0fa5332011-05-22 22:46:53 +00001932 err = reg_ctx->ReadRegisterValueFromMemory (reg_info,
1933 reg_addr.ULongLong(),
1934 value_byte_size,
1935 reg_value);
Greg Clayton061b79d2011-05-09 20:18:18 +00001936 if (err.Fail())
Sean Callanan17c6a052010-10-05 20:18:48 +00001937 return false;
Greg Clayton061b79d2011-05-09 20:18:18 +00001938
1939 if (!reg_ctx->WriteRegister (reg_info, reg_value))
Sean Callanan17c6a052010-10-05 20:18:48 +00001940 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001941 err.SetErrorStringWithFormat ("Couldn't write %s to register %s",
1942 name.GetCString(),
1943 reg_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001944 return false;
1945 }
Sean Callanan6a925532011-01-13 08:53:35 +00001946
1947 // Deallocate the spare area and clear the variable's live data.
1948
Greg Clayton567e7f32011-09-22 04:58:26 +00001949 Error deallocate_error = process->DeallocateMemory(reg_addr.ULongLong());
Sean Callanan6a925532011-01-13 08:53:35 +00001950
1951 if (!deallocate_error.Success())
1952 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001953 err.SetErrorStringWithFormat ("Couldn't deallocate spare memory area for %s: %s",
1954 name.GetCString(),
1955 deallocate_error.AsCString());
Sean Callanan6a925532011-01-13 08:53:35 +00001956 return false;
1957 }
1958
1959 expr_var->m_live_sp.reset();
Sean Callanan17c6a052010-10-05 20:18:48 +00001960 }
1961 else
1962 {
Sean Callanan6f3bde72011-10-27 19:41:13 +00001963 Error write_error;
1964
1965 RegisterValue reg_value;
1966
1967 if (!reg_ctx->ReadRegister (reg_info, reg_value))
1968 {
1969 err.SetErrorStringWithFormat ("Couldn't read %s from %s",
1970 name.GetCString(),
1971 reg_info->name);
1972 return false;
1973 }
1974
1975 if (is_reference)
1976 {
1977 write_error = reg_ctx->WriteRegisterValueToMemory(reg_info,
1978 addr,
1979 process->GetAddressByteSize(),
1980 reg_value);
1981
1982 if (!write_error.Success())
1983 {
1984 err.SetErrorStringWithFormat ("Couldn't write %s from register %s to the target: %s",
1985 name.GetCString(),
1986 reg_info->name,
1987 write_error.AsCString());
1988 return false;
1989 }
1990
1991 return true;
1992 }
1993
Sean Callanan6a925532011-01-13 08:53:35 +00001994 // Allocate a spare memory area to place the register's contents into. This memory area will be pointed to by the slot in the
1995 // struct.
1996
1997 Error allocate_error;
1998
Greg Clayton567e7f32011-09-22 04:58:26 +00001999 Scalar reg_addr (process->AllocateMemory (value_byte_size,
Sean Callanan6f3bde72011-10-27 19:41:13 +00002000 lldb::ePermissionsReadable | lldb::ePermissionsWritable,
2001 allocate_error));
Sean Callanan6a925532011-01-13 08:53:35 +00002002
Greg Claytonc0fa5332011-05-22 22:46:53 +00002003 if (reg_addr.ULongLong() == LLDB_INVALID_ADDRESS)
Sean Callanan6a925532011-01-13 08:53:35 +00002004 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00002005 err.SetErrorStringWithFormat ("Couldn't allocate a memory area to store %s: %s",
2006 name.GetCString(),
2007 allocate_error.AsCString());
Sean Callanan6a925532011-01-13 08:53:35 +00002008 return false;
2009 }
2010
2011 // Put the location of the spare memory into the live data of the ValueObject.
2012
Jim Ingham47da8102011-04-22 23:53:53 +00002013 expr_var->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
2014 type.GetASTContext(),
2015 type.GetOpaqueQualType(),
2016 name,
Greg Claytonc0fa5332011-05-22 22:46:53 +00002017 reg_addr.ULongLong(),
Jim Ingham47da8102011-04-22 23:53:53 +00002018 eAddressTypeLoad,
2019 value_byte_size);
Sean Callanan6a925532011-01-13 08:53:35 +00002020
2021 // Now write the location of the area into the struct.
Sean Callanan6f3bde72011-10-27 19:41:13 +00002022
Greg Clayton567e7f32011-09-22 04:58:26 +00002023 if (!process->WriteScalarToMemory (addr,
Sean Callanan6f3bde72011-10-27 19:41:13 +00002024 reg_addr,
2025 process->GetAddressByteSize(),
2026 write_error))
Sean Callanan6a925532011-01-13 08:53:35 +00002027 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00002028 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
2029 name.GetCString(),
2030 write_error.AsCString());
Sean Callanan6a925532011-01-13 08:53:35 +00002031 return false;
2032 }
2033
Sean Callanan6a925532011-01-13 08:53:35 +00002034 if (value_byte_size > register_byte_size)
Sean Callanan17c6a052010-10-05 20:18:48 +00002035 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00002036 err.SetErrorStringWithFormat ("%s is too big to store in %s",
2037 name.GetCString(),
2038 reg_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00002039 return false;
2040 }
Greg Clayton061b79d2011-05-09 20:18:18 +00002041
Greg Clayton061b79d2011-05-09 20:18:18 +00002042 if (!reg_ctx->ReadRegister (reg_info, reg_value))
Sean Callanan17c6a052010-10-05 20:18:48 +00002043 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00002044 err.SetErrorStringWithFormat ("Couldn't read %s from %s",
2045 name.GetCString(),
2046 reg_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00002047 return false;
2048 }
2049
Greg Claytonc0fa5332011-05-22 22:46:53 +00002050 err = reg_ctx->WriteRegisterValueToMemory (reg_info,
2051 reg_addr.ULongLong(),
2052 value_byte_size,
2053 reg_value);
Greg Clayton061b79d2011-05-09 20:18:18 +00002054 if (err.Fail())
Sean Callanan17c6a052010-10-05 20:18:48 +00002055 return false;
Sean Callanan17c6a052010-10-05 20:18:48 +00002056 }
2057 }
Sean Callananf328c9f2010-07-20 23:31:16 +00002058 }
2059
2060 return true;
Sean Callanan810f22d2010-07-16 00:09:46 +00002061}
2062
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002063bool
2064ClangExpressionDeclMap::DoMaterializeOneRegister
2065(
2066 bool dematerialize,
2067 ExecutionContext &exe_ctx,
2068 RegisterContext &reg_ctx,
Greg Claytonb3448432011-03-24 21:19:54 +00002069 const RegisterInfo &reg_info,
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002070 lldb::addr_t addr,
2071 Error &err
2072)
2073{
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002074 uint32_t register_byte_size = reg_info.byte_size;
Greg Clayton061b79d2011-05-09 20:18:18 +00002075 RegisterValue reg_value;
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002076 if (dematerialize)
2077 {
Greg Clayton061b79d2011-05-09 20:18:18 +00002078 Error read_error (reg_ctx.ReadRegisterValueFromMemory(&reg_info, addr, register_byte_size, reg_value));
2079 if (read_error.Fail())
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002080 {
Greg Claytonbdcb6ab2011-01-25 23:55:37 +00002081 err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", reg_info.name, read_error.AsCString());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002082 return false;
2083 }
2084
Greg Clayton061b79d2011-05-09 20:18:18 +00002085 if (!reg_ctx.WriteRegister (&reg_info, reg_value))
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002086 {
Greg Clayton061b79d2011-05-09 20:18:18 +00002087 err.SetErrorStringWithFormat("Couldn't write register %s (dematerialize)", reg_info.name);
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002088 return false;
2089 }
2090 }
2091 else
2092 {
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002093
Greg Clayton061b79d2011-05-09 20:18:18 +00002094 if (!reg_ctx.ReadRegister(&reg_info, reg_value))
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002095 {
Greg Clayton061b79d2011-05-09 20:18:18 +00002096 err.SetErrorStringWithFormat("Couldn't read %s (materialize)", reg_info.name);
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002097 return false;
2098 }
2099
Greg Clayton061b79d2011-05-09 20:18:18 +00002100 Error write_error (reg_ctx.WriteRegisterValueToMemory(&reg_info, addr, register_byte_size, reg_value));
2101 if (write_error.Fail())
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002102 {
Jason Molenda95b7b432011-09-20 00:26:08 +00002103 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", reg_info.name, write_error.AsCString());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002104 return false;
2105 }
2106 }
2107
2108 return true;
2109}
2110
Sean Callanan696cf5f2011-05-07 01:06:41 +00002111lldb::VariableSP
Greg Clayton8de27c72010-10-15 22:48:33 +00002112ClangExpressionDeclMap::FindVariableInScope
2113(
2114 StackFrame &frame,
2115 const ConstString &name,
2116 TypeFromUser *type
2117)
Sean Callananaa301c42010-12-03 01:38:59 +00002118{
Greg Claytone005f2c2010-11-06 01:53:30 +00002119 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanancc074622010-09-14 21:59:34 +00002120
Sean Callananf8b468e2011-08-06 00:28:14 +00002121 ValueObjectSP valobj;
2122 VariableSP var_sp;
2123 Error err;
Sean Callanancc074622010-09-14 21:59:34 +00002124
Sean Callananf8b468e2011-08-06 00:28:14 +00002125 valobj = frame.GetValueForVariableExpressionPath(name.GetCString(),
2126 eNoDynamicValues,
2127 StackFrame::eExpressionPathOptionCheckPtrVsMember,
2128 var_sp,
2129 err);
Greg Clayton3bc52d02010-11-14 22:13:40 +00002130
Sean Callananf8b468e2011-08-06 00:28:14 +00002131 if (!err.Success() ||
2132 !var_sp ||
Sean Callananae9f7482011-07-07 23:05:43 +00002133 !var_sp->IsInScope(&frame) ||
2134 !var_sp->LocationIsValidForFrame (&frame))
2135 return lldb::VariableSP();
Greg Clayton3bc52d02010-11-14 22:13:40 +00002136
2137 if (var_sp && type)
2138 {
2139 if (type->GetASTContext() == var_sp->GetType()->GetClangAST())
2140 {
Greg Clayton04c9c7b2011-02-16 23:00:21 +00002141 if (!ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType()))
Sean Callanan696cf5f2011-05-07 01:06:41 +00002142 return lldb::VariableSP();
Greg Clayton3bc52d02010-11-14 22:13:40 +00002143 }
2144 else
2145 {
2146 if (log)
2147 log->PutCString("Skipping a candidate variable because of different AST contexts");
Sean Callanan696cf5f2011-05-07 01:06:41 +00002148 return lldb::VariableSP();
Greg Clayton3bc52d02010-11-14 22:13:40 +00002149 }
Sean Callanancc074622010-09-14 21:59:34 +00002150 }
Greg Clayton3bc52d02010-11-14 22:13:40 +00002151
Sean Callanan696cf5f2011-05-07 01:06:41 +00002152 return var_sp;
Sean Callanancc074622010-09-14 21:59:34 +00002153}
Sean Callanan336a0002010-07-17 00:43:37 +00002154
Sean Callanan81974962011-05-08 02:21:26 +00002155Symbol *
2156ClangExpressionDeclMap::FindGlobalDataSymbol
2157(
2158 Target &target,
Sean Callananaa4a5532011-10-13 16:49:47 +00002159 const ConstString &name
Sean Callanan81974962011-05-08 02:21:26 +00002160)
2161{
2162 SymbolContextList sc_list;
2163
Sean Callananaa4a5532011-10-13 16:49:47 +00002164 target.GetImages().FindSymbolsWithNameAndType(name,
2165 eSymbolTypeData,
2166 sc_list);
Sean Callanan81974962011-05-08 02:21:26 +00002167
2168 if (sc_list.GetSize())
2169 {
2170 SymbolContext sym_ctx;
2171 sc_list.GetContextAtIndex(0, sym_ctx);
2172
2173 return sym_ctx.symbol;
2174 }
2175
2176 return NULL;
2177}
2178
Sean Callanan47dc4572011-09-15 02:13:07 +00002179lldb::VariableSP
2180ClangExpressionDeclMap::FindGlobalVariable
2181(
2182 Target &target,
Sean Callanan94cd0ca2011-10-12 16:59:31 +00002183 ModuleSP &module,
2184 const ConstString &name,
2185 ClangNamespaceDecl *namespace_decl,
Sean Callanan47dc4572011-09-15 02:13:07 +00002186 TypeFromUser *type
2187)
2188{
2189 VariableList vars;
Sean Callanan47dc4572011-09-15 02:13:07 +00002190
Sean Callanan94cd0ca2011-10-12 16:59:31 +00002191 if (module && namespace_decl)
2192 module->FindGlobalVariables (name, namespace_decl, true, -1, vars);
2193 else
2194 target.GetImages().FindGlobalVariables(name, true, -1, vars);
Sean Callanan47dc4572011-09-15 02:13:07 +00002195
2196 if (vars.GetSize())
2197 {
2198 if (type)
2199 {
2200 for (size_t i = 0; i < vars.GetSize(); ++i)
2201 {
2202 VariableSP var_sp = vars.GetVariableAtIndex(i);
2203
2204 if (type->GetASTContext() == var_sp->GetType()->GetClangAST())
2205 {
2206 if (ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType()))
2207 return var_sp;
2208 }
2209 }
2210 }
2211 else
2212 {
2213 return vars.GetVariableAtIndex(0);
2214 }
2215 }
2216
2217 return VariableSP();
2218}
2219
Chris Lattner24943d22010-06-08 16:52:24 +00002220// Interface for ClangASTSource
Sean Callanan47dc4572011-09-15 02:13:07 +00002221
Sean Callanan16b53ab2011-10-12 00:12:34 +00002222void
Sean Callananf76afff2011-10-28 23:38:38 +00002223ClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context)
Chris Lattner24943d22010-06-08 16:52:24 +00002224{
Sean Callananf76afff2011-10-28 23:38:38 +00002225 assert (m_ast_context);
2226
2227 const ConstString name(context.m_decl_name.getAsString().c_str());
2228
Greg Claytone005f2c2010-11-06 01:53:30 +00002229 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Chris Lattner24943d22010-06-08 16:52:24 +00002230
Sean Callanan9394b5a2011-10-29 19:50:43 +00002231 if (GetImportInProgress())
Sean Callananee8fc722010-11-19 20:20:02 +00002232 {
Sean Callanan67bbb112011-10-14 20:34:21 +00002233 if (log && log->GetVerbose())
Sean Callananee8fc722010-11-19 20:20:02 +00002234 log->Printf("Ignoring a query during an import");
2235 return;
2236 }
Greg Claytone6d72ca2011-06-25 00:44:06 +00002237
Sean Callanan67bbb112011-10-14 20:34:21 +00002238 static unsigned int invocation_id = 0;
2239 unsigned int current_id = invocation_id++;
2240
Sean Callanan16b53ab2011-10-12 00:12:34 +00002241 if (log)
2242 {
2243 if (!context.m_decl_context)
Sean Callanan9394b5a2011-10-29 19:50:43 +00002244 log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in a NULL DeclContext", current_id, name.GetCString());
Sean Callanan16b53ab2011-10-12 00:12:34 +00002245 else if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context.m_decl_context))
Sean Callanan9394b5a2011-10-29 19:50:43 +00002246 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 +00002247 else
Sean Callanan9394b5a2011-10-29 19:50:43 +00002248 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 +00002249 }
Sean Callanan9394b5a2011-10-29 19:50:43 +00002250
Sean Callanan16b53ab2011-10-12 00:12:34 +00002251 if (const NamespaceDecl *namespace_context = dyn_cast<NamespaceDecl>(context.m_decl_context))
2252 {
Sean Callanan73b520f2011-10-29 01:58:46 +00002253 ClangASTImporter::NamespaceMapSP namespace_map = m_ast_importer->GetNamespaceMap(namespace_context);
Sean Callanana7597062011-10-13 21:08:11 +00002254
Sean Callanan67bbb112011-10-14 20:34:21 +00002255 if (log && log->GetVerbose())
Sean Callanan5a55c7a2011-11-18 03:28:09 +00002256 log->Printf(" CEDM::FEVD[%u] Inspecting (NamespaceMap*)%p (%d entries)",
Sean Callanan67bbb112011-10-14 20:34:21 +00002257 current_id,
2258 namespace_map.get(),
2259 (int)namespace_map->size());
Sean Callanana7597062011-10-13 21:08:11 +00002260
Sean Callanana7cb1fa2011-10-21 22:18:07 +00002261 if (!namespace_map)
2262 return;
2263
Sean Callanan16b53ab2011-10-12 00:12:34 +00002264 for (ClangASTImporter::NamespaceMap::iterator i = namespace_map->begin(), e = namespace_map->end();
2265 i != e;
2266 ++i)
2267 {
2268 if (log)
Sean Callanan9394b5a2011-10-29 19:50:43 +00002269 log->Printf(" CEDM::FEVD[%u] Searching namespace %s in module %s",
Sean Callanan67bbb112011-10-14 20:34:21 +00002270 current_id,
Sean Callanan16b53ab2011-10-12 00:12:34 +00002271 i->second.GetNamespaceDecl()->getNameAsString().c_str(),
2272 i->first->GetFileSpec().GetFilename().GetCString());
2273
Sean Callananc839adc2011-10-13 21:50:33 +00002274 FindExternalVisibleDecls(context,
2275 i->first,
2276 i->second,
Sean Callanan67bbb112011-10-14 20:34:21 +00002277 current_id);
Sean Callanan16b53ab2011-10-12 00:12:34 +00002278 }
2279 }
Sean Callanane6ea5fe2011-11-15 02:11:17 +00002280 else if (isa<TranslationUnitDecl>(context.m_decl_context))
Sean Callanan16b53ab2011-10-12 00:12:34 +00002281 {
2282 ClangNamespaceDecl namespace_decl;
2283
2284 if (log)
Sean Callanan9394b5a2011-10-29 19:50:43 +00002285 log->Printf(" CEDM::FEVD[%u] Searching the root namespace", current_id);
Sean Callanan16b53ab2011-10-12 00:12:34 +00002286
2287 FindExternalVisibleDecls(context,
2288 lldb::ModuleSP(),
2289 namespace_decl,
Sean Callanan67bbb112011-10-14 20:34:21 +00002290 current_id);
Sean Callanan16b53ab2011-10-12 00:12:34 +00002291 }
Sean Callanana7597062011-10-13 21:08:11 +00002292
Sean Callanan9394b5a2011-10-29 19:50:43 +00002293 if (!context.m_found.variable)
2294 ClangASTSource::FindExternalVisibleDecls(context);
Sean Callanan16b53ab2011-10-12 00:12:34 +00002295}
2296
2297void
2298ClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context,
Sean Callanan38d084f2011-10-12 18:44:30 +00002299 lldb::ModuleSP module_sp,
Sean Callanan03f64ca2011-10-12 01:39:28 +00002300 ClangNamespaceDecl &namespace_decl,
Sean Callanan67bbb112011-10-14 20:34:21 +00002301 unsigned int current_id)
Sean Callanan16b53ab2011-10-12 00:12:34 +00002302{
Sean Callananf76afff2011-10-28 23:38:38 +00002303 assert (m_ast_context);
Sean Callanan16b53ab2011-10-12 00:12:34 +00002304
2305 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan9394b5a2011-10-29 19:50:43 +00002306
Greg Claytone5748d82010-11-09 23:46:37 +00002307 SymbolContextList sc_list;
Chris Lattner24943d22010-06-08 16:52:24 +00002308
Sean Callanan9394b5a2011-10-29 19:50:43 +00002309 const ConstString name(context.m_decl_name.getAsString().c_str());
2310
Greg Clayton3bc52d02010-11-14 22:13:40 +00002311 const char *name_unique_cstr = name.GetCString();
2312
2313 if (name_unique_cstr == NULL)
2314 return;
Sean Callanan9394b5a2011-10-29 19:50:43 +00002315
Greg Clayton8de27c72010-10-15 22:48:33 +00002316 // Only look for functions by name out in our symbols if the function
2317 // doesn't start with our phony prefix of '$'
Greg Clayton567e7f32011-09-22 04:58:26 +00002318 Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
2319 StackFrame *frame = m_parser_vars->m_exe_ctx->GetFramePtr();
Sean Callanan03f64ca2011-10-12 01:39:28 +00002320 if (name_unique_cstr[0] == '$' && !namespace_decl)
2321 {
2322 static ConstString g_lldb_class_name ("$__lldb_class");
2323
2324 if (name == g_lldb_class_name)
2325 {
2326 // Clang is looking for the type of "this"
2327
2328 if (!frame)
2329 return;
2330
2331 VariableList *vars = frame->GetVariableList(false);
2332
2333 if (!vars)
2334 return;
2335
2336 lldb::VariableSP this_var = vars->FindVariable(ConstString("this"));
2337
2338 if (!this_var ||
2339 !this_var->IsInScope(frame) ||
2340 !this_var->LocationIsValidForFrame (frame))
2341 return;
2342
2343 Type *this_type = this_var->GetType();
2344
2345 if (!this_type)
2346 return;
2347
Sean Callanan67bbb112011-10-14 20:34:21 +00002348 if (log && log->GetVerbose())
Sean Callanan03f64ca2011-10-12 01:39:28 +00002349 {
Sean Callanan9394b5a2011-10-29 19:50:43 +00002350 log->Printf (" CEDM::FEVD[%u] Type for \"this\" is: ", current_id);
Sean Callanan03f64ca2011-10-12 01:39:28 +00002351 StreamString strm;
2352 this_type->Dump(&strm, true);
2353 log->PutCString (strm.GetData());
2354 }
2355
2356 TypeFromUser this_user_type(this_type->GetClangFullType(),
2357 this_type->GetClangAST());
2358
2359 m_struct_vars->m_object_pointer_type = this_user_type;
2360
2361 void *pointer_target_type = NULL;
2362
2363 if (!ClangASTContext::IsPointerType(this_user_type.GetOpaqueQualType(),
2364 &pointer_target_type))
2365 return;
2366
2367 clang::QualType pointer_target_qual_type = QualType::getFromOpaquePtr(pointer_target_type);
2368
2369 if (pointer_target_qual_type.isConstQualified())
2370 pointer_target_qual_type.removeLocalConst();
2371
2372 TypeFromUser class_user_type(pointer_target_qual_type.getAsOpaquePtr(),
2373 this_type->GetClangAST());
2374
2375 if (log)
2376 {
Greg Claytona23ca422011-10-20 00:47:21 +00002377 ASTDumper ast_dumper(pointer_target_qual_type);
Sean Callanan9394b5a2011-10-29 19:50:43 +00002378 log->Printf(" CEDM::FEVD[%u] Adding type for $__lldb_class: %s", current_id, ast_dumper.GetCString());
Sean Callanan03f64ca2011-10-12 01:39:28 +00002379 }
2380
Sean Callanane3737fd2011-10-18 16:46:55 +00002381 AddOneType(context, class_user_type, current_id, true);
Sean Callanan03f64ca2011-10-12 01:39:28 +00002382
2383 return;
2384 }
2385
2386 static ConstString g_lldb_objc_class_name ("$__lldb_objc_class");
2387 if (name == g_lldb_objc_class_name)
2388 {
2389 // Clang is looking for the type of "*self"
2390
2391 if (!frame)
2392 return;
Sean Callanane6ea5fe2011-11-15 02:11:17 +00002393
2394 SymbolContext sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction);
2395
2396 if (!sym_ctx.function)
2397 return;
2398
2399 clang::DeclContext *decl_context;
2400
2401 if (sym_ctx.block && sym_ctx.block->GetInlinedFunctionInfo())
2402 decl_context = sym_ctx.block->GetClangDeclContextForInlinedFunction();
2403 else
2404 decl_context = sym_ctx.function->GetClangDeclContext();
2405
2406 if (!decl_context)
2407 return;
2408
2409 clang::ObjCMethodDecl *method_decl = llvm::dyn_cast<clang::ObjCMethodDecl>(decl_context);
2410
2411 if (!method_decl)
2412 return;
2413
2414 ObjCInterfaceDecl* self_interface = method_decl->getClassInterface();
2415
2416 if (!self_interface)
2417 return;
2418
2419 const clang::Type *interface_type = self_interface->getTypeForDecl();
2420
2421 TypeFromUser class_user_type(QualType(interface_type, 0).getAsOpaquePtr(),
2422 &method_decl->getASTContext());
2423
2424 if (log)
2425 {
2426 ASTDumper ast_dumper(interface_type);
2427 log->Printf(" FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, ast_dumper.GetCString());
2428 }
2429
2430 AddOneType(context, class_user_type, current_id, false);
Sean Callanan03f64ca2011-10-12 01:39:28 +00002431
2432 VariableList *vars = frame->GetVariableList(false);
2433
Sean Callanan03f64ca2011-10-12 01:39:28 +00002434 lldb::VariableSP self_var = vars->FindVariable(ConstString("self"));
2435
2436 if (!self_var ||
2437 !self_var->IsInScope(frame) ||
2438 !self_var->LocationIsValidForFrame (frame))
2439 return;
2440
2441 Type *self_type = self_var->GetType();
2442
2443 if (!self_type)
2444 return;
2445
2446 TypeFromUser self_user_type(self_type->GetClangFullType(),
2447 self_type->GetClangAST());
2448
2449 m_struct_vars->m_object_pointer_type = self_user_type;
Sean Callanan03f64ca2011-10-12 01:39:28 +00002450 return;
2451 }
2452
2453 // any other $__lldb names should be weeded out now
2454 if (!::strncmp(name_unique_cstr, "$__lldb", sizeof("$__lldb") - 1))
2455 return;
2456
2457 do
2458 {
2459 if (!target)
2460 break;
2461
2462 ClangASTContext *scratch_clang_ast_context = target->GetScratchClangASTContext();
2463
2464 if (!scratch_clang_ast_context)
2465 break;
2466
2467 ASTContext *scratch_ast_context = scratch_clang_ast_context->getASTContext();
2468
2469 if (!scratch_ast_context)
2470 break;
2471
2472 TypeDecl *ptype_type_decl = m_parser_vars->m_persistent_vars->GetPersistentType(name);
2473
2474 if (!ptype_type_decl)
2475 break;
2476
Sean Callananf76afff2011-10-28 23:38:38 +00002477 Decl *parser_ptype_decl = ClangASTContext::CopyDecl(m_ast_context, scratch_ast_context, ptype_type_decl);
Sean Callanan03f64ca2011-10-12 01:39:28 +00002478
2479 if (!parser_ptype_decl)
2480 break;
2481
2482 TypeDecl *parser_ptype_type_decl = dyn_cast<TypeDecl>(parser_ptype_decl);
2483
2484 if (!parser_ptype_type_decl)
2485 break;
2486
2487 if (log)
Sean Callanan9394b5a2011-10-29 19:50:43 +00002488 log->Printf(" CEDM::FEVD[%u] Found persistent type %s", current_id, name.GetCString());
Sean Callanan03f64ca2011-10-12 01:39:28 +00002489
2490 context.AddNamedDecl(parser_ptype_type_decl);
2491 } while (0);
2492
2493 ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name));
2494
2495 if (pvar_sp)
2496 {
Sean Callanan67bbb112011-10-14 20:34:21 +00002497 AddOneVariable(context, pvar_sp, current_id);
Sean Callanan03f64ca2011-10-12 01:39:28 +00002498 return;
2499 }
2500
2501 const char *reg_name(&name.GetCString()[1]);
2502
2503 if (m_parser_vars->m_exe_ctx->GetRegisterContext())
2504 {
2505 const RegisterInfo *reg_info(m_parser_vars->m_exe_ctx->GetRegisterContext()->GetRegisterInfoByName(reg_name));
Sean Callanan9394b5a2011-10-29 19:50:43 +00002506
Sean Callanan03f64ca2011-10-12 01:39:28 +00002507 if (reg_info)
Sean Callanane3737fd2011-10-18 16:46:55 +00002508 {
2509 if (log)
Sean Callanan9394b5a2011-10-29 19:50:43 +00002510 log->Printf(" CEDM::FEVD[%u] Found register %s", current_id, reg_info->name);
Sean Callanane3737fd2011-10-18 16:46:55 +00002511
Sean Callanan67bbb112011-10-14 20:34:21 +00002512 AddOneRegister(context, reg_info, current_id);
Sean Callanane3737fd2011-10-18 16:46:55 +00002513 }
Sean Callanan03f64ca2011-10-12 01:39:28 +00002514 }
2515 }
2516 else
Sean Callanan0fc73582010-07-27 00:55:47 +00002517 {
Sean Callananf8b468e2011-08-06 00:28:14 +00002518 ValueObjectSP valobj;
2519 VariableSP var;
2520 Error err;
2521
Sean Callanan03f64ca2011-10-12 01:39:28 +00002522 if (frame && !namespace_decl)
Greg Clayton8de27c72010-10-15 22:48:33 +00002523 {
Greg Clayton567e7f32011-09-22 04:58:26 +00002524 valobj = frame->GetValueForVariableExpressionPath(name_unique_cstr,
Sean Callanan16b53ab2011-10-12 00:12:34 +00002525 eNoDynamicValues,
2526 StackFrame::eExpressionPathOptionCheckPtrVsMember,
2527 var,
2528 err);
Sean Callanan47dc4572011-09-15 02:13:07 +00002529
2530 // If we found a variable in scope, no need to pull up function names
2531 if (err.Success() && var != NULL)
2532 {
Sean Callanan89e7df32011-11-29 22:03:21 +00002533 AddOneVariable(context, var, valobj, current_id);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002534 context.m_found.variable = true;
Sean Callanan3a546762011-10-25 20:36:57 +00002535 return;
Sean Callanan47dc4572011-09-15 02:13:07 +00002536 }
Greg Clayton8de27c72010-10-15 22:48:33 +00002537 }
Greg Clayton567e7f32011-09-22 04:58:26 +00002538 else if (target)
Sean Callanan47dc4572011-09-15 02:13:07 +00002539 {
Sean Callanan94cd0ca2011-10-12 16:59:31 +00002540 var = FindGlobalVariable (*target,
Sean Callanan38d084f2011-10-12 18:44:30 +00002541 module_sp,
Sean Callanan94cd0ca2011-10-12 16:59:31 +00002542 name,
2543 &namespace_decl,
Greg Clayton567e7f32011-09-22 04:58:26 +00002544 NULL);
Sean Callanan47dc4572011-09-15 02:13:07 +00002545
2546 if (var)
2547 {
Sean Callanan89e7df32011-11-29 22:03:21 +00002548 valobj = frame->TrackGlobalVariable(var, eNoDynamicValues);
2549 AddOneVariable(context, var, valobj, current_id);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002550 context.m_found.variable = true;
Sean Callanan47dc4572011-09-15 02:13:07 +00002551 }
2552 }
2553
Sean Callanan16c4ec32011-10-12 20:29:25 +00002554 if (!context.m_found.variable)
Greg Clayton8de27c72010-10-15 22:48:33 +00002555 {
Greg Clayton28d5fcc2011-01-27 06:44:37 +00002556 const bool include_symbols = true;
2557 const bool append = false;
Sean Callanana5ec5a32011-10-12 17:38:09 +00002558
Sean Callanan38d084f2011-10-12 18:44:30 +00002559 if (namespace_decl && module_sp)
Sean Callanana5ec5a32011-10-12 17:38:09 +00002560 {
Sean Callanan38d084f2011-10-12 18:44:30 +00002561 module_sp->FindFunctions(name,
2562 &namespace_decl,
2563 eFunctionNameTypeBase,
2564 include_symbols,
2565 append,
2566 sc_list);
Sean Callanana5ec5a32011-10-12 17:38:09 +00002567 }
2568 else
2569 {
2570 target->GetImages().FindFunctions(name,
2571 eFunctionNameTypeBase,
2572 include_symbols,
2573 append,
2574 sc_list);
2575 }
2576
Sean Callanan81974962011-05-08 02:21:26 +00002577 if (sc_list.GetSize())
Greg Clayton8de27c72010-10-15 22:48:33 +00002578 {
Sean Callanan81974962011-05-08 02:21:26 +00002579 Symbol *generic_symbol = NULL;
2580 Symbol *non_extern_symbol = NULL;
2581
2582 for (uint32_t index = 0, num_indices = sc_list.GetSize();
2583 index < num_indices;
2584 ++index)
Greg Clayton8de27c72010-10-15 22:48:33 +00002585 {
Sean Callanan81974962011-05-08 02:21:26 +00002586 SymbolContext sym_ctx;
2587 sc_list.GetContextAtIndex(index, sym_ctx);
2588
2589 if (sym_ctx.function)
2590 {
2591 // TODO only do this if it's a C function; C++ functions may be
2592 // overloaded
Sean Callanan16c4ec32011-10-12 20:29:25 +00002593 if (!context.m_found.function_with_type_info)
Sean Callanan67bbb112011-10-14 20:34:21 +00002594 AddOneFunction(context, sym_ctx.function, NULL, current_id);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002595 context.m_found.function_with_type_info = true;
2596 context.m_found.function = true;
Sean Callanan81974962011-05-08 02:21:26 +00002597 }
2598 else if (sym_ctx.symbol)
2599 {
2600 if (sym_ctx.symbol->IsExternal())
2601 generic_symbol = sym_ctx.symbol;
2602 else
2603 non_extern_symbol = sym_ctx.symbol;
2604 }
Greg Clayton8de27c72010-10-15 22:48:33 +00002605 }
Sean Callanan81974962011-05-08 02:21:26 +00002606
Sean Callanan16c4ec32011-10-12 20:29:25 +00002607 if (!context.m_found.function_with_type_info)
Greg Clayton8de27c72010-10-15 22:48:33 +00002608 {
Sean Callanan81974962011-05-08 02:21:26 +00002609 if (generic_symbol)
Sean Callanan47dc4572011-09-15 02:13:07 +00002610 {
Sean Callanan67bbb112011-10-14 20:34:21 +00002611 AddOneFunction (context, NULL, generic_symbol, current_id);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002612 context.m_found.function = true;
Sean Callanan47dc4572011-09-15 02:13:07 +00002613 }
Sean Callanan81974962011-05-08 02:21:26 +00002614 else if (non_extern_symbol)
Sean Callanan47dc4572011-09-15 02:13:07 +00002615 {
Sean Callanan67bbb112011-10-14 20:34:21 +00002616 AddOneFunction (context, NULL, non_extern_symbol, current_id);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002617 context.m_found.function = true;
Sean Callanan47dc4572011-09-15 02:13:07 +00002618 }
Sean Callanan81974962011-05-08 02:21:26 +00002619 }
Greg Clayton8de27c72010-10-15 22:48:33 +00002620 }
Sean Callanan47dc4572011-09-15 02:13:07 +00002621
Sean Callanan16c4ec32011-10-12 20:29:25 +00002622 if (!context.m_found.variable)
Greg Clayton8de27c72010-10-15 22:48:33 +00002623 {
Sean Callanan16c4ec32011-10-12 20:29:25 +00002624 // We couldn't find a non-symbol variable for this. Now we'll hunt for a generic
Sean Callanan81974962011-05-08 02:21:26 +00002625 // data symbol, and -- if it is found -- treat it as a variable.
2626
Sean Callananaa4a5532011-10-13 16:49:47 +00002627 Symbol *data_symbol = FindGlobalDataSymbol(*target, name);
Sean Callanan81974962011-05-08 02:21:26 +00002628
2629 if (data_symbol)
Sean Callanan47dc4572011-09-15 02:13:07 +00002630 {
Sean Callanan67bbb112011-10-14 20:34:21 +00002631 AddOneGenericVariable(context, *data_symbol, current_id);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002632 context.m_found.variable = true;
Sean Callanan47dc4572011-09-15 02:13:07 +00002633 }
Greg Clayton6916e352010-11-13 03:52:47 +00002634 }
Sean Callanan92aa6662010-09-07 21:49:41 +00002635 }
Sean Callananb549b0a2011-10-27 02:06:03 +00002636 }
Sean Callanan336a0002010-07-17 00:43:37 +00002637}
Greg Claytone6d72ca2011-06-25 00:44:06 +00002638
Sean Callanan336a0002010-07-17 00:43:37 +00002639Value *
Greg Clayton8de27c72010-10-15 22:48:33 +00002640ClangExpressionDeclMap::GetVariableValue
2641(
2642 ExecutionContext &exe_ctx,
Sean Callanan4a078322011-10-13 00:09:20 +00002643 VariableSP &var,
Sean Callanan9b6898f2011-07-30 02:42:06 +00002644 ASTContext *parser_ast_context,
Greg Clayton8de27c72010-10-15 22:48:33 +00002645 TypeFromUser *user_type,
2646 TypeFromParser *parser_type
2647)
Chris Lattner24943d22010-06-08 16:52:24 +00002648{
Greg Claytone005f2c2010-11-06 01:53:30 +00002649 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan6184dfe2010-06-23 00:47:48 +00002650
Chris Lattner24943d22010-06-08 16:52:24 +00002651 Type *var_type = var->GetType();
2652
2653 if (!var_type)
2654 {
Sean Callanan810f22d2010-07-16 00:09:46 +00002655 if (log)
2656 log->PutCString("Skipped a definition because it has no type");
Sean Callanan336a0002010-07-17 00:43:37 +00002657 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00002658 }
2659
Greg Clayton04c9c7b2011-02-16 23:00:21 +00002660 clang_type_t var_opaque_type = var_type->GetClangFullType();
Chris Lattner24943d22010-06-08 16:52:24 +00002661
2662 if (!var_opaque_type)
2663 {
Sean Callanan810f22d2010-07-16 00:09:46 +00002664 if (log)
2665 log->PutCString("Skipped a definition because it has no Clang type");
Sean Callanan336a0002010-07-17 00:43:37 +00002666 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00002667 }
2668
Sean Callanan9b6898f2011-07-30 02:42:06 +00002669 ASTContext *ast = var_type->GetClangASTContext().getASTContext();
Chris Lattner24943d22010-06-08 16:52:24 +00002670
Greg Claytonb01000f2011-01-17 03:46:26 +00002671 if (!ast)
Chris Lattner24943d22010-06-08 16:52:24 +00002672 {
Sean Callanan810f22d2010-07-16 00:09:46 +00002673 if (log)
2674 log->PutCString("There is no AST context for the current execution context");
Sean Callanan336a0002010-07-17 00:43:37 +00002675 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00002676 }
2677
Sean Callanan336a0002010-07-17 00:43:37 +00002678 DWARFExpression &var_location_expr = var->LocationExpression();
2679
Chris Lattner24943d22010-06-08 16:52:24 +00002680 std::auto_ptr<Value> var_location(new Value);
2681
Greg Clayton178710c2010-09-14 02:20:48 +00002682 lldb::addr_t loclist_base_load_addr = LLDB_INVALID_ADDRESS;
2683
Greg Clayton567e7f32011-09-22 04:58:26 +00002684 Target *target = exe_ctx.GetTargetPtr();
2685
Greg Clayton178710c2010-09-14 02:20:48 +00002686 if (var_location_expr.IsLocationList())
2687 {
2688 SymbolContext var_sc;
2689 var->CalculateSymbolContext (&var_sc);
Greg Clayton567e7f32011-09-22 04:58:26 +00002690 loclist_base_load_addr = var_sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress (target);
Greg Clayton178710c2010-09-14 02:20:48 +00002691 }
Chris Lattner24943d22010-06-08 16:52:24 +00002692 Error err;
2693
Greg Claytonbdcb6ab2011-01-25 23:55:37 +00002694 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 +00002695 {
Sean Callanan810f22d2010-07-16 00:09:46 +00002696 if (log)
2697 log->Printf("Error evaluating location: %s", err.AsCString());
Sean Callanan336a0002010-07-17 00:43:37 +00002698 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00002699 }
Greg Claytonb01000f2011-01-17 03:46:26 +00002700
Sean Callanan58baaad2011-07-08 00:39:14 +00002701 void *type_to_use = NULL;
Sean Callanan336a0002010-07-17 00:43:37 +00002702
Sean Callananf328c9f2010-07-20 23:31:16 +00002703 if (parser_ast_context)
2704 {
Greg Claytonb01000f2011-01-17 03:46:26 +00002705 type_to_use = GuardedCopyType(parser_ast_context, ast, var_opaque_type);
Sean Callananf328c9f2010-07-20 23:31:16 +00002706
Sean Callanan4b5eec62010-11-20 02:19:29 +00002707 if (!type_to_use)
2708 {
2709 if (log)
2710 log->Printf("Couldn't copy a variable's type into the parser's AST context");
2711
2712 return NULL;
2713 }
2714
Sean Callananf328c9f2010-07-20 23:31:16 +00002715 if (parser_type)
2716 *parser_type = TypeFromParser(type_to_use, parser_ast_context);
2717 }
Sean Callanan336a0002010-07-17 00:43:37 +00002718 else
2719 type_to_use = var_opaque_type;
Chris Lattner24943d22010-06-08 16:52:24 +00002720
2721 if (var_location.get()->GetContextType() == Value::eContextTypeInvalid)
Greg Clayton6916e352010-11-13 03:52:47 +00002722 var_location.get()->SetContext(Value::eContextTypeClangType, type_to_use);
Chris Lattner24943d22010-06-08 16:52:24 +00002723
2724 if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress)
2725 {
2726 SymbolContext var_sc;
2727 var->CalculateSymbolContext(&var_sc);
Sean Callanan336a0002010-07-17 00:43:37 +00002728
Chris Lattner24943d22010-06-08 16:52:24 +00002729 if (!var_sc.module_sp)
Sean Callanan336a0002010-07-17 00:43:37 +00002730 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00002731
2732 ObjectFile *object_file = var_sc.module_sp->GetObjectFile();
2733
2734 if (!object_file)
Sean Callanan336a0002010-07-17 00:43:37 +00002735 return NULL;
2736
Chris Lattner24943d22010-06-08 16:52:24 +00002737 Address so_addr(var_location->GetScalar().ULongLong(), object_file->GetSectionList());
2738
Greg Clayton567e7f32011-09-22 04:58:26 +00002739 lldb::addr_t load_addr = so_addr.GetLoadAddress(target);
Chris Lattner24943d22010-06-08 16:52:24 +00002740
Sean Callanan47dc4572011-09-15 02:13:07 +00002741 if (load_addr != LLDB_INVALID_ADDRESS)
2742 {
2743 var_location->GetScalar() = load_addr;
2744 var_location->SetValueType(Value::eValueTypeLoadAddress);
2745 }
Chris Lattner24943d22010-06-08 16:52:24 +00002746 }
2747
Sean Callananf328c9f2010-07-20 23:31:16 +00002748 if (user_type)
Greg Claytonb01000f2011-01-17 03:46:26 +00002749 *user_type = TypeFromUser(var_opaque_type, ast);
Sean Callanan336a0002010-07-17 00:43:37 +00002750
2751 return var_location.release();
2752}
2753
2754void
Sean Callanan89e7df32011-11-29 22:03:21 +00002755ClangExpressionDeclMap::AddOneVariable (NameSearchContext &context, VariableSP var, ValueObjectSP valobj, unsigned int current_id)
Sean Callanan336a0002010-07-17 00:43:37 +00002756{
Sean Callananaa301c42010-12-03 01:38:59 +00002757 assert (m_parser_vars.get());
2758
Greg Claytone005f2c2010-11-06 01:53:30 +00002759 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan47dc4572011-09-15 02:13:07 +00002760
Sean Callananf328c9f2010-07-20 23:31:16 +00002761 TypeFromUser ut;
2762 TypeFromParser pt;
Sean Callanan336a0002010-07-17 00:43:37 +00002763
Sean Callananaa301c42010-12-03 01:38:59 +00002764 Value *var_location = GetVariableValue (*m_parser_vars->m_exe_ctx,
Greg Clayton8de27c72010-10-15 22:48:33 +00002765 var,
Sean Callananf76afff2011-10-28 23:38:38 +00002766 m_ast_context,
Greg Clayton8de27c72010-10-15 22:48:33 +00002767 &ut,
2768 &pt);
Sean Callanan336a0002010-07-17 00:43:37 +00002769
Sean Callanan4b5eec62010-11-20 02:19:29 +00002770 if (!var_location)
2771 return;
2772
Sean Callanan6f3bde72011-10-27 19:41:13 +00002773 NamedDecl *var_decl;
2774
2775 bool is_reference = ClangASTContext::IsReferenceType(pt.GetOpaqueQualType());
2776
2777 if (is_reference)
2778 var_decl = context.AddVarDecl(pt.GetOpaqueQualType());
2779 else
2780 var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(pt.GetASTContext(), pt.GetOpaqueQualType()));
2781
Greg Clayton8de27c72010-10-15 22:48:33 +00002782 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton427f2902010-12-14 02:59:59 +00002783 ConstString entity_name(decl_name.c_str());
Sean Callanan89e7df32011-11-29 22:03:21 +00002784 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (valobj));
2785
Greg Clayton427f2902010-12-14 02:59:59 +00002786 assert (entity.get());
2787 entity->EnableParserVars();
2788 entity->m_parser_vars->m_parser_type = pt;
2789 entity->m_parser_vars->m_named_decl = var_decl;
2790 entity->m_parser_vars->m_llvm_value = NULL;
2791 entity->m_parser_vars->m_lldb_value = var_location;
Sean Callanan696cf5f2011-05-07 01:06:41 +00002792 entity->m_parser_vars->m_lldb_var = var;
Chris Lattner24943d22010-06-08 16:52:24 +00002793
Sean Callanan6f3bde72011-10-27 19:41:13 +00002794 if (is_reference)
2795 entity->m_flags |= ClangExpressionVariable::EVTypeIsReference;
2796
Sean Callanan810f22d2010-07-16 00:09:46 +00002797 if (log)
Greg Clayton8de27c72010-10-15 22:48:33 +00002798 {
Sean Callananaa561412011-11-07 23:32:52 +00002799 ASTDumper orig_dumper(ut.GetOpaqueQualType());
Greg Claytona23ca422011-10-20 00:47:21 +00002800 ASTDumper ast_dumper(var_decl);
Sean Callananaa561412011-11-07 23:32:52 +00002801 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 +00002802 }
Sean Callanan8f0dc342010-06-22 23:46:24 +00002803}
2804
2805void
Sean Callanana48fe162010-08-11 03:57:18 +00002806ClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
Sean Callanan67bbb112011-10-14 20:34:21 +00002807 ClangExpressionVariableSP &pvar_sp,
2808 unsigned int current_id)
Sean Callanana48fe162010-08-11 03:57:18 +00002809{
Greg Claytone005f2c2010-11-06 01:53:30 +00002810 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan45690fe2010-08-30 22:17:16 +00002811
Greg Clayton427f2902010-12-14 02:59:59 +00002812 TypeFromUser user_type (pvar_sp->GetTypeFromUser());
Sean Callanana48fe162010-08-11 03:57:18 +00002813
Sean Callananf76afff2011-10-28 23:38:38 +00002814 TypeFromParser parser_type (GuardedCopyType(m_ast_context,
Greg Clayton427f2902010-12-14 02:59:59 +00002815 user_type.GetASTContext(),
2816 user_type.GetOpaqueQualType()),
Sean Callananf76afff2011-10-28 23:38:38 +00002817 m_ast_context);
Sean Callanana48fe162010-08-11 03:57:18 +00002818
Sean Callanandc5fce12011-12-01 21:04:37 +00002819 if (!parser_type.GetOpaqueQualType())
2820 {
2821 if (log)
2822 log->Printf(" CEDM::FEVD[%u] Couldn't import type for pvar %s", current_id, pvar_sp->GetName().GetCString());
2823 return;
2824 }
2825
Sean Callanan6a925532011-01-13 08:53:35 +00002826 NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(parser_type.GetASTContext(), parser_type.GetOpaqueQualType()));
Sean Callanan8c127202010-08-23 23:09:38 +00002827
Greg Clayton427f2902010-12-14 02:59:59 +00002828 pvar_sp->EnableParserVars();
2829 pvar_sp->m_parser_vars->m_parser_type = parser_type;
2830 pvar_sp->m_parser_vars->m_named_decl = var_decl;
2831 pvar_sp->m_parser_vars->m_llvm_value = NULL;
2832 pvar_sp->m_parser_vars->m_lldb_value = NULL;
Sean Callanan45690fe2010-08-30 22:17:16 +00002833
2834 if (log)
Sean Callanana0744822010-11-01 23:22:47 +00002835 {
Greg Claytona23ca422011-10-20 00:47:21 +00002836 ASTDumper ast_dumper(var_decl);
Sean Callanan9394b5a2011-10-29 19:50:43 +00002837 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 +00002838 }
Sean Callanana48fe162010-08-11 03:57:18 +00002839}
2840
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002841void
Sean Callanan81974962011-05-08 02:21:26 +00002842ClangExpressionDeclMap::AddOneGenericVariable(NameSearchContext &context,
Sean Callanan67bbb112011-10-14 20:34:21 +00002843 Symbol &symbol,
2844 unsigned int current_id)
Sean Callanan81974962011-05-08 02:21:26 +00002845{
2846 assert(m_parser_vars.get());
2847
2848 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2849
Greg Clayton567e7f32011-09-22 04:58:26 +00002850 Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
2851
2852 if (target == NULL)
2853 return;
2854
2855 ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
Sean Callanan81974962011-05-08 02:21:26 +00002856
Sean Callananfb3058e2011-05-12 23:54:16 +00002857 TypeFromUser user_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(scratch_ast_context, true)),
Sean Callanan81974962011-05-08 02:21:26 +00002858 scratch_ast_context);
2859
Sean Callananf76afff2011-10-28 23:38:38 +00002860 TypeFromParser parser_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(m_ast_context, true)),
2861 m_ast_context);
Sean Callanan81974962011-05-08 02:21:26 +00002862
Sean Callananfb3058e2011-05-12 23:54:16 +00002863 NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
Sean Callanan81974962011-05-08 02:21:26 +00002864
2865 std::string decl_name(context.m_decl_name.getAsString());
2866 ConstString entity_name(decl_name.c_str());
2867 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
2868 entity_name,
2869 user_type,
Sean Callanan47dc4572011-09-15 02:13:07 +00002870 m_parser_vars->m_target_info.byte_order,
2871 m_parser_vars->m_target_info.address_byte_size));
Sean Callanan81974962011-05-08 02:21:26 +00002872 assert (entity.get());
Sean Callanan81974962011-05-08 02:21:26 +00002873
2874 std::auto_ptr<Value> symbol_location(new Value);
2875
2876 AddressRange &symbol_range = symbol.GetAddressRangeRef();
2877 Address &symbol_address = symbol_range.GetBaseAddress();
Greg Clayton567e7f32011-09-22 04:58:26 +00002878 lldb::addr_t symbol_load_addr = symbol_address.GetLoadAddress(target);
Sean Callanan81974962011-05-08 02:21:26 +00002879
2880 symbol_location->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
2881 symbol_location->GetScalar() = symbol_load_addr;
2882 symbol_location->SetValueType(Value::eValueTypeLoadAddress);
2883
Sean Callananfb3058e2011-05-12 23:54:16 +00002884 entity->EnableParserVars();
Sean Callanan81974962011-05-08 02:21:26 +00002885 entity->m_parser_vars->m_parser_type = parser_type;
2886 entity->m_parser_vars->m_named_decl = var_decl;
2887 entity->m_parser_vars->m_llvm_value = NULL;
2888 entity->m_parser_vars->m_lldb_value = symbol_location.release();
2889 entity->m_parser_vars->m_lldb_sym = &symbol;
2890
2891 if (log)
2892 {
Greg Claytona23ca422011-10-20 00:47:21 +00002893 ASTDumper ast_dumper(var_decl);
Sean Callanan81974962011-05-08 02:21:26 +00002894
Sean Callanan9394b5a2011-10-29 19:50:43 +00002895 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 +00002896 }
2897}
2898
Sean Callananfb3058e2011-05-12 23:54:16 +00002899bool
2900ClangExpressionDeclMap::ResolveUnknownTypes()
2901{
2902 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Greg Clayton567e7f32011-09-22 04:58:26 +00002903 Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
2904
2905 ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
Sean Callananfb3058e2011-05-12 23:54:16 +00002906
2907 for (size_t index = 0, num_entities = m_found_entities.GetSize();
2908 index < num_entities;
2909 ++index)
2910 {
2911 ClangExpressionVariableSP entity = m_found_entities.GetVariableAtIndex(index);
2912
2913 if (entity->m_flags & ClangExpressionVariable::EVUnknownType)
2914 {
2915 const NamedDecl *named_decl = entity->m_parser_vars->m_named_decl;
2916 const VarDecl *var_decl = dyn_cast<VarDecl>(named_decl);
2917
2918 if (!var_decl)
2919 {
2920 if (log)
2921 log->Printf("Entity of unknown type does not have a VarDecl");
2922 return false;
2923 }
2924
2925 if (log)
2926 {
Greg Claytona23ca422011-10-20 00:47:21 +00002927 ASTDumper ast_dumper(const_cast<VarDecl*>(var_decl));
2928 log->Printf("Variable of unknown type now has Decl %s", ast_dumper.GetCString());
Sean Callananfb3058e2011-05-12 23:54:16 +00002929 }
2930
2931 QualType var_type = var_decl->getType();
2932 TypeFromParser parser_type(var_type.getAsOpaquePtr(), &var_decl->getASTContext());
2933
Sean Callanan5a55c7a2011-11-18 03:28:09 +00002934 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 +00002935
Sean Callanandc5fce12011-12-01 21:04:37 +00002936 if (!copied_type)
2937 {
2938 if (log)
2939 log->Printf("ClangExpressionDeclMap::ResolveUnknownType - Couldn't import the type for a variable");
2940
2941 return lldb::ClangExpressionVariableSP();
2942 }
2943
Sean Callananfb3058e2011-05-12 23:54:16 +00002944 TypeFromUser user_type(copied_type, scratch_ast_context);
2945
2946 entity->m_parser_vars->m_lldb_value->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
2947 entity->m_parser_vars->m_parser_type = parser_type;
2948
2949 entity->SetClangAST(user_type.GetASTContext());
2950 entity->SetClangType(user_type.GetOpaqueQualType());
2951
2952 entity->m_flags &= ~(ClangExpressionVariable::EVUnknownType);
2953 }
2954 }
2955
2956 return true;
2957}
2958
Sean Callanan81974962011-05-08 02:21:26 +00002959void
Greg Clayton427f2902010-12-14 02:59:59 +00002960ClangExpressionDeclMap::AddOneRegister (NameSearchContext &context,
Sean Callanan67bbb112011-10-14 20:34:21 +00002961 const RegisterInfo *reg_info,
2962 unsigned int current_id)
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002963{
2964 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2965
Sean Callananf76afff2011-10-28 23:38:38 +00002966 void *ast_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize(m_ast_context,
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002967 reg_info->encoding,
2968 reg_info->byte_size * 8);
2969
2970 if (!ast_type)
2971 {
Johnny Chen122204d2011-08-09 22:52:27 +00002972 if (log)
Sean Callanan67bbb112011-10-14 20:34:21 +00002973 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 +00002974 return;
2975 }
2976
Greg Clayton427f2902010-12-14 02:59:59 +00002977 TypeFromParser parser_type (ast_type,
Sean Callananf76afff2011-10-28 23:38:38 +00002978 m_ast_context);
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002979
2980 NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
2981
Jim Inghamfa3a16a2011-03-31 00:19:25 +00002982 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope(),
Sean Callanan47dc4572011-09-15 02:13:07 +00002983 m_parser_vars->m_target_info.byte_order,
2984 m_parser_vars->m_target_info.address_byte_size));
Greg Clayton427f2902010-12-14 02:59:59 +00002985 assert (entity.get());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002986 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton427f2902010-12-14 02:59:59 +00002987 entity->SetName (ConstString (decl_name.c_str()));
2988 entity->SetRegisterInfo (reg_info);
2989 entity->EnableParserVars();
2990 entity->m_parser_vars->m_parser_type = parser_type;
2991 entity->m_parser_vars->m_named_decl = var_decl;
2992 entity->m_parser_vars->m_llvm_value = NULL;
2993 entity->m_parser_vars->m_lldb_value = NULL;
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002994
Sean Callanan67bbb112011-10-14 20:34:21 +00002995 if (log && log->GetVerbose())
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002996 {
Greg Claytona23ca422011-10-20 00:47:21 +00002997 ASTDumper ast_dumper(var_decl);
Sean Callanan9394b5a2011-10-29 19:50:43 +00002998 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 +00002999 }
3000}
3001
Sean Callanana48fe162010-08-11 03:57:18 +00003002void
Greg Claytonda7af842011-05-18 22:01:49 +00003003ClangExpressionDeclMap::AddOneFunction (NameSearchContext &context,
3004 Function* fun,
Sean Callanan67bbb112011-10-14 20:34:21 +00003005 Symbol* symbol,
3006 unsigned int current_id)
Sean Callanan8f0dc342010-06-22 23:46:24 +00003007{
Sean Callananaa301c42010-12-03 01:38:59 +00003008 assert (m_parser_vars.get());
3009
Greg Claytone005f2c2010-11-06 01:53:30 +00003010 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan8f0dc342010-06-22 23:46:24 +00003011
Sean Callanan58baaad2011-07-08 00:39:14 +00003012 NamedDecl *fun_decl = NULL;
Sean Callanan8f0dc342010-06-22 23:46:24 +00003013 std::auto_ptr<Value> fun_location(new Value);
Sean Callanan58baaad2011-07-08 00:39:14 +00003014 const Address *fun_address = NULL;
Sean Callanan8f0dc342010-06-22 23:46:24 +00003015
Sean Callanan0fc73582010-07-27 00:55:47 +00003016 // only valid for Functions, not for Symbols
3017 void *fun_opaque_type = NULL;
Sean Callanan9b6898f2011-07-30 02:42:06 +00003018 ASTContext *fun_ast_context = NULL;
Sean Callanan0fc73582010-07-27 00:55:47 +00003019
3020 if (fun)
3021 {
3022 Type *fun_type = fun->GetType();
3023
3024 if (!fun_type)
3025 {
3026 if (log)
Sean Callanan67bbb112011-10-14 20:34:21 +00003027 log->PutCString(" Skipped a function because it has no type");
Sean Callanan0fc73582010-07-27 00:55:47 +00003028 return;
3029 }
3030
Greg Clayton04c9c7b2011-02-16 23:00:21 +00003031 fun_opaque_type = fun_type->GetClangFullType();
Sean Callanan0fc73582010-07-27 00:55:47 +00003032
3033 if (!fun_opaque_type)
3034 {
3035 if (log)
Sean Callanan67bbb112011-10-14 20:34:21 +00003036 log->PutCString(" Skipped a function because it has no Clang type");
Sean Callanan0fc73582010-07-27 00:55:47 +00003037 return;
3038 }
3039
3040 fun_address = &fun->GetAddressRange().GetBaseAddress();
3041
Greg Claytonb01000f2011-01-17 03:46:26 +00003042 fun_ast_context = fun_type->GetClangASTContext().getASTContext();
Sean Callananf76afff2011-10-28 23:38:38 +00003043 void *copied_type = GuardedCopyType(m_ast_context, fun_ast_context, fun_opaque_type);
Greg Claytona23ca422011-10-20 00:47:21 +00003044 if (copied_type)
3045 {
3046 fun_decl = context.AddFunDecl(copied_type);
3047 }
3048 else
3049 {
3050 // We failed to copy the type we found
3051 if (log)
3052 {
3053 log->Printf (" Failed to import the function type '%s' {0x%8.8llx} into the expression parser AST contenxt",
3054 fun_type->GetName().GetCString(),
3055 fun_type->GetID());
3056 }
Sean Callanan16089542011-11-16 00:40:13 +00003057
3058 return;
Greg Claytona23ca422011-10-20 00:47:21 +00003059 }
Sean Callanan0fc73582010-07-27 00:55:47 +00003060 }
3061 else if (symbol)
3062 {
3063 fun_address = &symbol->GetAddressRangeRef().GetBaseAddress();
3064
3065 fun_decl = context.AddGenericFunDecl();
3066 }
3067 else
3068 {
3069 if (log)
Sean Callanan67bbb112011-10-14 20:34:21 +00003070 log->PutCString(" AddOneFunction called with no function and no symbol");
Sean Callanan0fc73582010-07-27 00:55:47 +00003071 return;
3072 }
3073
Greg Clayton567e7f32011-09-22 04:58:26 +00003074 Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
3075
3076 lldb::addr_t load_addr = fun_address->GetCallableLoadAddress(target);
Sean Callanan8f0dc342010-06-22 23:46:24 +00003077 fun_location->SetValueType(Value::eValueTypeLoadAddress);
3078 fun_location->GetScalar() = load_addr;
3079
Jim Inghamfa3a16a2011-03-31 00:19:25 +00003080 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
Sean Callanan47dc4572011-09-15 02:13:07 +00003081 m_parser_vars->m_target_info.byte_order,
3082 m_parser_vars->m_target_info.address_byte_size));
Greg Clayton427f2902010-12-14 02:59:59 +00003083 assert (entity.get());
Greg Clayton8de27c72010-10-15 22:48:33 +00003084 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton427f2902010-12-14 02:59:59 +00003085 entity->SetName(ConstString(decl_name.c_str()));
3086 entity->SetClangType (fun_opaque_type);
3087 entity->SetClangAST (fun_ast_context);
Sean Callanan8f0dc342010-06-22 23:46:24 +00003088
Greg Clayton427f2902010-12-14 02:59:59 +00003089 entity->EnableParserVars();
3090 entity->m_parser_vars->m_named_decl = fun_decl;
3091 entity->m_parser_vars->m_llvm_value = NULL;
3092 entity->m_parser_vars->m_lldb_value = fun_location.release();
Sean Callanan8c127202010-08-23 23:09:38 +00003093
Sean Callanan810f22d2010-07-16 00:09:46 +00003094 if (log)
Greg Clayton8de27c72010-10-15 22:48:33 +00003095 {
Greg Claytona23ca422011-10-20 00:47:21 +00003096 ASTDumper ast_dumper(fun_decl);
Sean Callanana0744822010-11-01 23:22:47 +00003097
Sean Callanan9394b5a2011-10-29 19:50:43 +00003098 log->Printf(" CEDM::FEVD[%u] Found %s function %s, returned %s",
Sean Callanan67bbb112011-10-14 20:34:21 +00003099 current_id,
3100 (fun ? "specific" : "generic"),
3101 decl_name.c_str(),
Greg Claytona23ca422011-10-20 00:47:21 +00003102 ast_dumper.GetCString());
Greg Clayton8de27c72010-10-15 22:48:33 +00003103 }
Chris Lattner24943d22010-06-08 16:52:24 +00003104}
Sean Callanan93a4b1a2010-08-04 01:02:13 +00003105
3106void
3107ClangExpressionDeclMap::AddOneType(NameSearchContext &context,
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00003108 TypeFromUser &ut,
Sean Callanan67bbb112011-10-14 20:34:21 +00003109 unsigned int current_id,
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00003110 bool add_method)
Sean Callanan93a4b1a2010-08-04 01:02:13 +00003111{
Sean Callananf76afff2011-10-28 23:38:38 +00003112 ASTContext *parser_ast_context = m_ast_context;
Sean Callanan9b6898f2011-07-30 02:42:06 +00003113 ASTContext *user_ast_context = ut.GetASTContext();
Sean Callanan93a4b1a2010-08-04 01:02:13 +00003114
Sean Callananee8fc722010-11-19 20:20:02 +00003115 void *copied_type = GuardedCopyType(parser_ast_context, user_ast_context, ut.GetOpaqueQualType());
Sean Callanandc5fce12011-12-01 21:04:37 +00003116
3117 if (!copied_type)
3118 {
3119 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
3120
3121 if (log)
3122 log->Printf("ClangExpressionDeclMap::AddOneType - Couldn't import the type");
3123
3124 return;
3125 }
Sean Callanan9394b5a2011-10-29 19:50:43 +00003126
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00003127 if (add_method && ClangASTContext::IsAggregateType(copied_type))
3128 {
3129 void *args[1];
3130
3131 args[0] = ClangASTContext::GetVoidPtrType(parser_ast_context, false);
3132
Sean Callanan716e3f02011-11-01 18:07:13 +00003133 clang_type_t method_type = ClangASTContext::CreateFunctionType (parser_ast_context,
3134 ClangASTContext::GetBuiltInType_void(parser_ast_context),
3135 args,
3136 1,
3137 false,
3138 ClangASTContext::GetTypeQualifiers(copied_type));
3139
Greg Clayton1d8173f2010-09-24 05:15:53 +00003140 const bool is_virtual = false;
3141 const bool is_static = false;
3142 const bool is_inline = false;
Greg Clayton30449d52010-10-01 02:31:07 +00003143 const bool is_explicit = false;
Sean Callanan28ebe882011-11-02 18:09:01 +00003144 const bool is_attr_used = true;
Sean Callanan2581dbf2011-11-02 01:38:59 +00003145 const bool is_artificial = false;
Greg Clayton30449d52010-10-01 02:31:07 +00003146
Greg Clayton1d8173f2010-09-24 05:15:53 +00003147 ClangASTContext::AddMethodToCXXRecordType (parser_ast_context,
3148 copied_type,
Greg Clayton8de27c72010-10-15 22:48:33 +00003149 "$__lldb_expr",
Greg Clayton1d8173f2010-09-24 05:15:53 +00003150 method_type,
3151 lldb::eAccessPublic,
3152 is_virtual,
3153 is_static,
Greg Clayton30449d52010-10-01 02:31:07 +00003154 is_inline,
Sean Callanan716e3f02011-11-01 18:07:13 +00003155 is_explicit,
Sean Callanan2581dbf2011-11-02 01:38:59 +00003156 is_attr_used,
3157 is_artificial);
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00003158 }
Sean Callanan93a4b1a2010-08-04 01:02:13 +00003159
3160 context.AddTypeDecl(copied_type);
3161}