blob: 33910279bc768121f97f9c55956cb46e06890ee6 [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- ClangExpressionDeclMap.cpp -----------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "lldb/Expression/ClangExpressionDeclMap.h"
11
12// C Includes
13// C++ Includes
14// Other libraries and framework includes
15// Project includes
Sean Callanan47a5c4c2010-09-23 03:01:22 +000016#include "clang/AST/DeclarationName.h"
Sean Callanana0744822010-11-01 23:22:47 +000017#include "clang/AST/Decl.h"
Chris Lattner24943d22010-06-08 16:52:24 +000018#include "lldb/lldb-private.h"
19#include "lldb/Core/Address.h"
Sean Callanan810f22d2010-07-16 00:09:46 +000020#include "lldb/Core/Error.h"
Sean Callanan6184dfe2010-06-23 00:47:48 +000021#include "lldb/Core/Log.h"
Chris Lattner24943d22010-06-08 16:52:24 +000022#include "lldb/Core/Module.h"
Greg Clayton061b79d2011-05-09 20:18:18 +000023#include "lldb/Core/RegisterValue.h"
Sean Callanan05a5a1b2010-12-16 03:17:46 +000024#include "lldb/Core/ValueObjectConstResult.h"
Sean Callananf48de6d2011-12-10 03:12:34 +000025#include "lldb/Core/ValueObjectVariable.h"
Sean Callanan6e74dbb2011-02-01 23:43:26 +000026#include "lldb/Expression/ASTDumper.h"
Chris Lattner24943d22010-06-08 16:52:24 +000027#include "lldb/Expression/ClangASTSource.h"
Sean Callanana48fe162010-08-11 03:57:18 +000028#include "lldb/Expression/ClangPersistentVariables.h"
Greg Claytoncd548032011-02-01 01:31:41 +000029#include "lldb/Host/Endian.h"
Chris Lattner24943d22010-06-08 16:52:24 +000030#include "lldb/Symbol/ClangASTContext.h"
Greg Clayton6916e352010-11-13 03:52:47 +000031#include "lldb/Symbol/ClangNamespaceDecl.h"
Chris Lattner24943d22010-06-08 16:52:24 +000032#include "lldb/Symbol/CompileUnit.h"
33#include "lldb/Symbol/Function.h"
34#include "lldb/Symbol/ObjectFile.h"
35#include "lldb/Symbol/SymbolContext.h"
Sean Callanan16b53ab2011-10-12 00:12:34 +000036#include "lldb/Symbol/SymbolVendor.h"
Chris Lattner24943d22010-06-08 16:52:24 +000037#include "lldb/Symbol/Type.h"
38#include "lldb/Symbol/TypeList.h"
39#include "lldb/Symbol/Variable.h"
40#include "lldb/Symbol/VariableList.h"
Sean Callananf328c9f2010-07-20 23:31:16 +000041#include "lldb/Target/ExecutionContext.h"
Sean Callanan810f22d2010-07-16 00:09:46 +000042#include "lldb/Target/Process.h"
Sean Callanan17c6a052010-10-05 20:18:48 +000043#include "lldb/Target/RegisterContext.h"
Chris Lattner24943d22010-06-08 16:52:24 +000044#include "lldb/Target/StackFrame.h"
Sean Callananf328c9f2010-07-20 23:31:16 +000045#include "lldb/Target/Target.h"
Jim Ingham78b9ee82010-12-07 01:56:02 +000046#include "lldb/Target/Thread.h"
Chris Lattner24943d22010-06-08 16:52:24 +000047
Greg Clayton3bc52d02010-11-14 22:13:40 +000048using namespace lldb;
Chris Lattner24943d22010-06-08 16:52:24 +000049using namespace lldb_private;
50using namespace clang;
51
Sean Callanan73b520f2011-10-29 01:58:46 +000052ClangExpressionDeclMap::ClangExpressionDeclMap (bool keep_result_in_memory, ExecutionContext &exe_ctx) :
53 ClangASTSource (exe_ctx.GetTargetSP()),
Greg Clayton8de27c72010-10-15 22:48:33 +000054 m_found_entities (),
55 m_struct_members (),
Stephen Wilsondbeb3e12011-04-11 19:41:40 +000056 m_keep_result_in_memory (keep_result_in_memory),
Sean Callananaa301c42010-12-03 01:38:59 +000057 m_parser_vars (),
Stephen Wilsondbeb3e12011-04-11 19:41:40 +000058 m_struct_vars ()
Chris Lattner24943d22010-06-08 16:52:24 +000059{
Sean Callananaa301c42010-12-03 01:38:59 +000060 EnableStructVars();
Chris Lattner24943d22010-06-08 16:52:24 +000061}
62
63ClangExpressionDeclMap::~ClangExpressionDeclMap()
Sean Callananaa301c42010-12-03 01:38:59 +000064{
Sean Callanan6d284ef2011-10-12 22:20:02 +000065 // Note: The model is now that the parser's AST context and all associated
66 // data does not vanish until the expression has been executed. This means
67 // that valuable lookup data (like namespaces) doesn't vanish, but
68
69 DidParse();
Sean Callananaa301c42010-12-03 01:38:59 +000070 DidDematerialize();
71 DisableStructVars();
72}
Sean Callananc2c6f772010-10-26 00:31:56 +000073
Sean Callanan166ba102011-08-01 18:18:33 +000074bool
Greg Clayton427f2902010-12-14 02:59:59 +000075ClangExpressionDeclMap::WillParse(ExecutionContext &exe_ctx)
Sean Callananaa301c42010-12-03 01:38:59 +000076{
77 EnableParserVars();
Sean Callanandd1dcfd2012-02-10 01:22:05 +000078 m_parser_vars->m_exe_ctx = exe_ctx;
Greg Clayton567e7f32011-09-22 04:58:26 +000079
80 Target *target = exe_ctx.GetTargetPtr();
81 if (exe_ctx.GetFramePtr())
82 m_parser_vars->m_sym_ctx = exe_ctx.GetFramePtr()->GetSymbolContext(lldb::eSymbolContextEverything);
83 else if (exe_ctx.GetThreadPtr())
84 m_parser_vars->m_sym_ctx = exe_ctx.GetThreadPtr()->GetStackFrameAtIndex(0)->GetSymbolContext(lldb::eSymbolContextEverything);
85 else if (exe_ctx.GetProcessPtr())
Greg Clayton987c7eb2011-09-17 08:33:22 +000086 {
87 m_parser_vars->m_sym_ctx.Clear();
Greg Clayton567e7f32011-09-22 04:58:26 +000088 m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP();
Greg Clayton987c7eb2011-09-17 08:33:22 +000089 }
Greg Clayton567e7f32011-09-22 04:58:26 +000090 else if (target)
Greg Clayton987c7eb2011-09-17 08:33:22 +000091 {
92 m_parser_vars->m_sym_ctx.Clear();
Greg Clayton567e7f32011-09-22 04:58:26 +000093 m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP();
Greg Clayton987c7eb2011-09-17 08:33:22 +000094 }
Sean Callanan97ad47f2011-09-15 18:41:04 +000095
Greg Clayton567e7f32011-09-22 04:58:26 +000096 if (target)
97 {
98 m_parser_vars->m_persistent_vars = &target->GetPersistentVariables();
Sean Callanan166ba102011-08-01 18:18:33 +000099
Greg Clayton567e7f32011-09-22 04:58:26 +0000100 if (!target->GetScratchClangASTContext())
101 return false;
102 }
Sean Callanan166ba102011-08-01 18:18:33 +0000103
Sean Callanan47dc4572011-09-15 02:13:07 +0000104 m_parser_vars->m_target_info = GetTargetInfo();
105
Sean Callanan166ba102011-08-01 18:18:33 +0000106 return true;
Sean Callananaa301c42010-12-03 01:38:59 +0000107}
108
Greg Clayton427f2902010-12-14 02:59:59 +0000109void
110ClangExpressionDeclMap::DidParse()
Sean Callananaa301c42010-12-03 01:38:59 +0000111{
112 if (m_parser_vars.get())
113 {
Greg Clayton427f2902010-12-14 02:59:59 +0000114 for (size_t entity_index = 0, num_entities = m_found_entities.GetSize();
Sean Callananaa301c42010-12-03 01:38:59 +0000115 entity_index < num_entities;
116 ++entity_index)
117 {
Greg Clayton427f2902010-12-14 02:59:59 +0000118 ClangExpressionVariableSP var_sp(m_found_entities.GetVariableAtIndex(entity_index));
119 if (var_sp &&
120 var_sp->m_parser_vars.get() &&
121 var_sp->m_parser_vars->m_lldb_value)
122 delete var_sp->m_parser_vars->m_lldb_value;
Sean Callananaa301c42010-12-03 01:38:59 +0000123
Greg Clayton427f2902010-12-14 02:59:59 +0000124 var_sp->DisableParserVars();
Sean Callananaa301c42010-12-03 01:38:59 +0000125 }
126
Greg Clayton427f2902010-12-14 02:59:59 +0000127 for (size_t pvar_index = 0, num_pvars = m_parser_vars->m_persistent_vars->GetSize();
Sean Callananaa301c42010-12-03 01:38:59 +0000128 pvar_index < num_pvars;
129 ++pvar_index)
130 {
Greg Clayton427f2902010-12-14 02:59:59 +0000131 ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariableAtIndex(pvar_index));
132 if (pvar_sp)
133 pvar_sp->DisableParserVars();
Sean Callananaa301c42010-12-03 01:38:59 +0000134 }
135
136 DisableParserVars();
Sean Callanan7a60b942010-10-08 01:58:41 +0000137 }
Chris Lattner24943d22010-06-08 16:52:24 +0000138}
139
Sean Callanan8bce6652010-07-13 21:41:46 +0000140// Interface for IRForTarget
141
Sean Callanan47dc4572011-09-15 02:13:07 +0000142ClangExpressionDeclMap::TargetInfo
143ClangExpressionDeclMap::GetTargetInfo()
144{
145 assert (m_parser_vars.get());
146
147 TargetInfo ret;
148
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000149 ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
150
151 Process *process = exe_ctx.GetProcessPtr();
152 if (process)
Sean Callanan47dc4572011-09-15 02:13:07 +0000153 {
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000154 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)
Greg Clayton567e7f32011-09-22 04:58:26 +0000161 {
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000162 ret.byte_order = target->GetArchitecture().GetByteOrder();
163 ret.address_byte_size = target->GetArchitecture().GetAddressByteSize();
Greg Clayton567e7f32011-09-22 04:58:26 +0000164 }
Sean Callanan47dc4572011-09-15 02:13:07 +0000165 }
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000166
Sean Callanan47dc4572011-09-15 02:13:07 +0000167 return ret;
168}
169
Greg Clayton8de27c72010-10-15 22:48:33 +0000170const ConstString &
171ClangExpressionDeclMap::GetPersistentResultName ()
Sean Callanan82b74c82010-08-12 01:56:52 +0000172{
Sean Callananaa301c42010-12-03 01:38:59 +0000173 assert (m_struct_vars.get());
174 assert (m_parser_vars.get());
Sean Callananaa301c42010-12-03 01:38:59 +0000175 if (!m_struct_vars->m_result_name)
Greg Clayton427f2902010-12-14 02:59:59 +0000176 {
177 Target *target = m_parser_vars->GetTarget();
178 assert (target);
179 m_struct_vars->m_result_name = target->GetPersistentVariables().GetNextPersistentVariableName();
180 }
Sean Callananaa301c42010-12-03 01:38:59 +0000181 return m_struct_vars->m_result_name;
Sean Callanan82b74c82010-08-12 01:56:52 +0000182}
183
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000184lldb::ClangExpressionVariableSP
185ClangExpressionDeclMap::BuildIntegerVariable (const ConstString &name,
186 lldb_private::TypeFromParser type,
187 const llvm::APInt& value)
188{
189 assert (m_parser_vars.get());
Sean Callanan166ba102011-08-01 18:18:33 +0000190
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000191 ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
192
193 Target *target = exe_ctx.GetTargetPtr();
194
195 if (!target)
196 return ClangExpressionVariableSP();
Greg Clayton567e7f32011-09-22 04:58:26 +0000197
198 ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000199
Sean Callanan5a55c7a2011-11-18 03:28:09 +0000200 TypeFromUser user_type(m_ast_importer->CopyType(context,
201 type.GetASTContext(),
202 type.GetOpaqueQualType()),
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000203 context);
Sean Callanan47dc4572011-09-15 02:13:07 +0000204
Sean Callanandc5fce12011-12-01 21:04:37 +0000205 if (!user_type.GetOpaqueQualType())
206 {
207 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
208
209 if (log)
210 log->Printf("ClangExpressionDeclMap::BuildIntegerVariable - Couldn't export the type for a constant integer result");
211
212 return lldb::ClangExpressionVariableSP();
213 }
214
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000215 if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx.GetBestExecutionContextScope (),
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000216 name,
Sean Callanan0e0817d2011-01-04 02:41:41 +0000217 user_type,
Sean Callanan47dc4572011-09-15 02:13:07 +0000218 m_parser_vars->m_target_info.byte_order,
219 m_parser_vars->m_target_info.address_byte_size))
Sean Callanan0e0817d2011-01-04 02:41:41 +0000220 return lldb::ClangExpressionVariableSP();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000221
Sean Callanan0e0817d2011-01-04 02:41:41 +0000222 ClangExpressionVariableSP pvar_sp (m_parser_vars->m_persistent_vars->GetVariable(name));
223
224 if (!pvar_sp)
225 return lldb::ClangExpressionVariableSP();
226
227 uint8_t *pvar_data = pvar_sp->GetValueBytes();
228 if (pvar_data == NULL)
229 return lldb::ClangExpressionVariableSP();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000230
231 uint64_t value64 = value.getLimitedValue();
Sean Callanan47dc4572011-09-15 02:13:07 +0000232
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000233 size_t num_val_bytes = sizeof(value64);
Sean Callanan0e0817d2011-01-04 02:41:41 +0000234 size_t num_data_bytes = pvar_sp->GetByteSize();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000235
236 size_t num_bytes = num_val_bytes;
237 if (num_bytes > num_data_bytes)
238 num_bytes = num_data_bytes;
239
Johnny Chen2bc9eb32011-07-19 19:48:13 +0000240 for (size_t byte_idx = 0;
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000241 byte_idx < num_bytes;
242 ++byte_idx)
243 {
244 uint64_t shift = byte_idx * 8;
245 uint64_t mask = 0xffll << shift;
246 uint8_t cur_byte = (uint8_t)((value64 & mask) >> shift);
247
Sean Callanan47dc4572011-09-15 02:13:07 +0000248 switch (m_parser_vars->m_target_info.byte_order)
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000249 {
Sean Callanan0e0817d2011-01-04 02:41:41 +0000250 case eByteOrderBig:
251 // High Low
252 // Original: |AABBCCDDEEFFGGHH|
253 // Target: |EEFFGGHH|
254
255 pvar_data[num_data_bytes - (1 + byte_idx)] = cur_byte;
256 break;
257 case eByteOrderLittle:
258 // Target: |HHGGFFEE|
259 pvar_data[byte_idx] = cur_byte;
260 break;
261 default:
262 return lldb::ClangExpressionVariableSP();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000263 }
264 }
Sean Callanan6a925532011-01-13 08:53:35 +0000265
266 pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried;
Sean Callanan696cf5f2011-05-07 01:06:41 +0000267 pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
268 pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
Sean Callanan0e0817d2011-01-04 02:41:41 +0000269
270 return pvar_sp;
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000271}
272
Sean Callanan696cf5f2011-05-07 01:06:41 +0000273lldb::ClangExpressionVariableSP
274ClangExpressionDeclMap::BuildCastVariable (const ConstString &name,
Sean Callanan9b6898f2011-07-30 02:42:06 +0000275 VarDecl *decl,
Sean Callanan696cf5f2011-05-07 01:06:41 +0000276 lldb_private::TypeFromParser type)
277{
278 assert (m_parser_vars.get());
279
280 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
281
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000282 ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
283 Target *target = exe_ctx.GetTargetPtr();
Greg Clayton567e7f32011-09-22 04:58:26 +0000284 if (target == NULL)
285 return lldb::ClangExpressionVariableSP();
286
287 ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
Sean Callanan696cf5f2011-05-07 01:06:41 +0000288
289 ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl));
290
291 if (!var_sp)
292 var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl);
293
294 if (!var_sp)
295 return ClangExpressionVariableSP();
296
Sean Callanan5a55c7a2011-11-18 03:28:09 +0000297 TypeFromUser user_type(m_ast_importer->CopyType(context,
298 type.GetASTContext(),
299 type.GetOpaqueQualType()),
Sean Callanan696cf5f2011-05-07 01:06:41 +0000300 context);
301
Sean Callanandc5fce12011-12-01 21:04:37 +0000302 if (!user_type.GetOpaqueQualType())
303 {
304 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
305
306 if (log)
307 log->Printf("ClangExpressionDeclMap::BuildCastVariable - Couldn't export the type for a constant cast result");
308
309 return lldb::ClangExpressionVariableSP();
310 }
311
Sean Callanan696cf5f2011-05-07 01:06:41 +0000312 TypeFromUser var_type = var_sp->GetTypeFromUser();
313
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000314 StackFrame *frame = exe_ctx.GetFramePtr();
Greg Clayton567e7f32011-09-22 04:58:26 +0000315 if (frame == NULL)
316 return lldb::ClangExpressionVariableSP();
317
318 VariableSP var = FindVariableInScope (*frame, var_sp->GetName(), &var_type);
Sean Callanan696cf5f2011-05-07 01:06:41 +0000319
320 if (!var)
321 return lldb::ClangExpressionVariableSP(); // but we should handle this; it may be a persistent variable
322
Greg Clayton567e7f32011-09-22 04:58:26 +0000323 ValueObjectSP var_valobj = frame->GetValueObjectForFrameVariable(var, lldb::eNoDynamicValues);
Sean Callanan696cf5f2011-05-07 01:06:41 +0000324
325 if (!var_valobj)
326 return lldb::ClangExpressionVariableSP();
327
328 ValueObjectSP var_casted_valobj = var_valobj->CastPointerType(name.GetCString(), user_type);
329
330 if (!var_casted_valobj)
331 return lldb::ClangExpressionVariableSP();
332
333 if (log)
334 {
335 StreamString my_stream_string;
336
337 ClangASTType::DumpTypeDescription (var_type.GetASTContext(),
338 var_type.GetOpaqueQualType(),
339 &my_stream_string);
340
341
342 log->Printf("Building cast variable to type: %s", my_stream_string.GetString().c_str());
343 }
344
345 ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->CreatePersistentVariable (var_casted_valobj);
346
347 if (!pvar_sp)
348 return lldb::ClangExpressionVariableSP();
349
350 if (pvar_sp != m_parser_vars->m_persistent_vars->GetVariable(name))
351 return lldb::ClangExpressionVariableSP();
352
353 pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried;
354 pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
355 pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
356
357 return pvar_sp;
358}
359
Sean Callanan47dc4572011-09-15 02:13:07 +0000360bool
361ClangExpressionDeclMap::ResultIsReference (const ConstString &name)
362{
363 ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name);
364
365 return (pvar_sp->m_flags & ClangExpressionVariable::EVIsProgramReference);
366}
367
368bool
369ClangExpressionDeclMap::CompleteResultVariable (lldb::ClangExpressionVariableSP &valobj,
370 lldb_private::Value &value,
371 const ConstString &name,
Sean Callanana8428a42011-09-22 00:41:11 +0000372 lldb_private::TypeFromParser type,
Sean Callanan557ccd62011-10-21 05:18:02 +0000373 bool transient,
374 bool maybe_make_load)
Sean Callanan47dc4572011-09-15 02:13:07 +0000375{
376 assert (m_parser_vars.get());
377
378 ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name);
379
380 if (!pvar_sp)
381 return false;
Sean Callanan557ccd62011-10-21 05:18:02 +0000382
383 if (maybe_make_load &&
384 value.GetValueType() == Value::eValueTypeFileAddress &&
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000385 m_parser_vars->m_exe_ctx.GetProcessPtr())
Sean Callanan557ccd62011-10-21 05:18:02 +0000386 {
387 value.SetValueType(Value::eValueTypeLoadAddress);
388 }
Sean Callanan47dc4572011-09-15 02:13:07 +0000389
390 if (pvar_sp->m_flags & ClangExpressionVariable::EVIsProgramReference &&
Sean Callanana8428a42011-09-22 00:41:11 +0000391 !pvar_sp->m_live_sp &&
392 !transient)
Sean Callanan47dc4572011-09-15 02:13:07 +0000393 {
394 // The reference comes from the program. We need to set up a live SP for it.
395
Johnny Chendfafa142011-12-16 23:04:52 +0000396 unsigned long long address = value.GetScalar().ULongLong();
397 AddressType address_type = value.GetValueAddressType();
398
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000399 pvar_sp->m_live_sp = ValueObjectConstResult::Create(m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(),
Sean Callanan47dc4572011-09-15 02:13:07 +0000400 pvar_sp->GetTypeFromUser().GetASTContext(),
401 pvar_sp->GetTypeFromUser().GetOpaqueQualType(),
402 pvar_sp->GetName(),
Johnny Chendfafa142011-12-16 23:04:52 +0000403 address,
404 address_type,
Sean Callanan47dc4572011-09-15 02:13:07 +0000405 pvar_sp->GetByteSize());
406 }
407
408 if (pvar_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry)
409 {
410 pvar_sp->ValueUpdated();
411
412 const size_t pvar_byte_size = pvar_sp->GetByteSize();
413 uint8_t *pvar_data = pvar_sp->GetValueBytes();
414
Sean Callanan8f2e3922012-02-04 08:49:35 +0000415 if (!ReadTarget(pvar_data, value, pvar_byte_size))
416 return false;
Sean Callanan47dc4572011-09-15 02:13:07 +0000417
418 pvar_sp->m_flags &= ~(ClangExpressionVariable::EVNeedsFreezeDry);
419 }
420
421 valobj = pvar_sp;
422
423 return true;
424}
425
Sean Callanan8f2e3922012-02-04 08:49:35 +0000426void
427ClangExpressionDeclMap::RemoveResultVariable
428(
429 const ConstString &name
430)
431{
432 ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name);
433 m_parser_vars->m_persistent_vars->RemovePersistentVariable(pvar_sp);
434}
435
Sean Callanan8bce6652010-07-13 21:41:46 +0000436bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000437ClangExpressionDeclMap::AddPersistentVariable
438(
Sean Callanan9b6898f2011-07-30 02:42:06 +0000439 const NamedDecl *decl,
Greg Clayton8de27c72010-10-15 22:48:33 +0000440 const ConstString &name,
Sean Callanan6a925532011-01-13 08:53:35 +0000441 TypeFromParser parser_type,
442 bool is_result,
443 bool is_lvalue
Greg Clayton8de27c72010-10-15 22:48:33 +0000444)
Sean Callanana48fe162010-08-11 03:57:18 +0000445{
Sean Callananaa301c42010-12-03 01:38:59 +0000446 assert (m_parser_vars.get());
447
Sean Callanan6a925532011-01-13 08:53:35 +0000448 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000449 ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
450 Target *target = exe_ctx.GetTargetPtr();
Greg Clayton567e7f32011-09-22 04:58:26 +0000451 if (target == NULL)
452 return false;
453
454 ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
Sean Callanana48fe162010-08-11 03:57:18 +0000455
Sean Callanan0539a802011-12-16 21:06:35 +0000456 TypeFromUser user_type(m_ast_importer->DeportType(context,
457 parser_type.GetASTContext(),
458 parser_type.GetOpaqueQualType()),
Sean Callanan97678d12011-01-13 21:23:32 +0000459 context);
Sean Callanan5a55c7a2011-11-18 03:28:09 +0000460
461 if (!user_type.GetOpaqueQualType())
462 {
463 if (log)
464 log->Printf("Persistent variable's type wasn't copied successfully");
465 return false;
466 }
Sean Callanan47dc4572011-09-15 02:13:07 +0000467
468 if (!m_parser_vars->m_target_info.IsValid())
469 return false;
Sean Callanana48fe162010-08-11 03:57:18 +0000470
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000471 if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx.GetBestExecutionContextScope (),
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000472 name,
Greg Clayton427f2902010-12-14 02:59:59 +0000473 user_type,
Sean Callanan47dc4572011-09-15 02:13:07 +0000474 m_parser_vars->m_target_info.byte_order,
475 m_parser_vars->m_target_info.address_byte_size))
Sean Callanan8c127202010-08-23 23:09:38 +0000476 return false;
477
Greg Clayton427f2902010-12-14 02:59:59 +0000478 ClangExpressionVariableSP var_sp (m_parser_vars->m_persistent_vars->GetVariable(name));
Sean Callanan8c127202010-08-23 23:09:38 +0000479
Greg Clayton427f2902010-12-14 02:59:59 +0000480 if (!var_sp)
Sean Callanan8c127202010-08-23 23:09:38 +0000481 return false;
482
Sean Callananbf346eb2012-09-20 23:21:16 +0000483 var_sp->m_frozen_sp->SetHasCompleteType();
484
Sean Callanan6a925532011-01-13 08:53:35 +0000485 if (is_result)
486 var_sp->m_flags |= ClangExpressionVariable::EVNeedsFreezeDry;
487 else
488 var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget; // explicitly-declared persistent variables should persist
489
490 if (is_lvalue)
491 {
492 var_sp->m_flags |= ClangExpressionVariable::EVIsProgramReference;
493 }
494 else
495 {
496 var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
497 var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
498 }
499
500 if (log)
501 log->Printf("Created persistent variable with flags 0x%hx", var_sp->m_flags);
502
Greg Clayton427f2902010-12-14 02:59:59 +0000503 var_sp->EnableParserVars();
Sean Callanan8c127202010-08-23 23:09:38 +0000504
Greg Clayton427f2902010-12-14 02:59:59 +0000505 var_sp->m_parser_vars->m_named_decl = decl;
506 var_sp->m_parser_vars->m_parser_type = parser_type;
Sean Callanan8c127202010-08-23 23:09:38 +0000507
508 return true;
Sean Callanana48fe162010-08-11 03:57:18 +0000509}
510
511bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000512ClangExpressionDeclMap::AddValueToStruct
513(
Sean Callanan9b6898f2011-07-30 02:42:06 +0000514 const NamedDecl *decl,
Greg Clayton8de27c72010-10-15 22:48:33 +0000515 const ConstString &name,
516 llvm::Value *value,
517 size_t size,
518 off_t alignment
519)
Sean Callanan8bce6652010-07-13 21:41:46 +0000520{
Sean Callananaa301c42010-12-03 01:38:59 +0000521 assert (m_struct_vars.get());
522 assert (m_parser_vars.get());
523
Greg Claytone005f2c2010-11-06 01:53:30 +0000524 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan45690fe2010-08-30 22:17:16 +0000525
Sean Callananaa301c42010-12-03 01:38:59 +0000526 m_struct_vars->m_struct_laid_out = false;
Sean Callanan8bce6652010-07-13 21:41:46 +0000527
Sean Callanan8c127202010-08-23 23:09:38 +0000528 if (m_struct_members.GetVariable(decl))
529 return true;
Sean Callanan8bce6652010-07-13 21:41:46 +0000530
Greg Clayton427f2902010-12-14 02:59:59 +0000531 ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl));
Sean Callanan8bce6652010-07-13 21:41:46 +0000532
Greg Clayton427f2902010-12-14 02:59:59 +0000533 if (!var_sp)
534 var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl);
Sean Callanan8bce6652010-07-13 21:41:46 +0000535
Greg Clayton427f2902010-12-14 02:59:59 +0000536 if (!var_sp)
Sean Callanan8c127202010-08-23 23:09:38 +0000537 return false;
538
Sean Callanan45690fe2010-08-30 22:17:16 +0000539 if (log)
Sean Callanan5a55c7a2011-11-18 03:28:09 +0000540 log->Printf("Adding value for (NamedDecl*)%p [%s - %s] to the structure",
Sean Callanan45690fe2010-08-30 22:17:16 +0000541 decl,
Greg Clayton8de27c72010-10-15 22:48:33 +0000542 name.GetCString(),
Greg Clayton427f2902010-12-14 02:59:59 +0000543 var_sp->GetName().GetCString());
Sean Callanan45690fe2010-08-30 22:17:16 +0000544
Sean Callanan8c127202010-08-23 23:09:38 +0000545 // We know entity->m_parser_vars is valid because we used a parser variable
546 // to find it
Greg Clayton427f2902010-12-14 02:59:59 +0000547 var_sp->m_parser_vars->m_llvm_value = value;
Sean Callanan8c127202010-08-23 23:09:38 +0000548
Greg Clayton427f2902010-12-14 02:59:59 +0000549 var_sp->EnableJITVars();
550 var_sp->m_jit_vars->m_alignment = alignment;
551 var_sp->m_jit_vars->m_size = size;
Sean Callanan8c127202010-08-23 23:09:38 +0000552
Greg Clayton427f2902010-12-14 02:59:59 +0000553 m_struct_members.AddVariable(var_sp);
Sean Callanan8bce6652010-07-13 21:41:46 +0000554
555 return true;
556}
557
558bool
559ClangExpressionDeclMap::DoStructLayout ()
560{
Sean Callananaa301c42010-12-03 01:38:59 +0000561 assert (m_struct_vars.get());
562
563 if (m_struct_vars->m_struct_laid_out)
Sean Callanan8bce6652010-07-13 21:41:46 +0000564 return true;
565
Sean Callanan8bce6652010-07-13 21:41:46 +0000566 off_t cursor = 0;
567
Sean Callananaa301c42010-12-03 01:38:59 +0000568 m_struct_vars->m_struct_alignment = 0;
569 m_struct_vars->m_struct_size = 0;
Sean Callanan8bce6652010-07-13 21:41:46 +0000570
Greg Clayton427f2902010-12-14 02:59:59 +0000571 for (size_t member_index = 0, num_members = m_struct_members.GetSize();
Sean Callanan8c127202010-08-23 23:09:38 +0000572 member_index < num_members;
573 ++member_index)
Sean Callanan8bce6652010-07-13 21:41:46 +0000574 {
Greg Clayton427f2902010-12-14 02:59:59 +0000575 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
576 if (!member_sp)
577 return false;
578
579 if (!member_sp->m_jit_vars.get())
Sean Callanan8c127202010-08-23 23:09:38 +0000580 return false;
Sean Callanan8bce6652010-07-13 21:41:46 +0000581
Sean Callanan8c127202010-08-23 23:09:38 +0000582 if (member_index == 0)
Greg Clayton427f2902010-12-14 02:59:59 +0000583 m_struct_vars->m_struct_alignment = member_sp->m_jit_vars->m_alignment;
Sean Callanan8c127202010-08-23 23:09:38 +0000584
Greg Clayton427f2902010-12-14 02:59:59 +0000585 if (cursor % member_sp->m_jit_vars->m_alignment)
586 cursor += (member_sp->m_jit_vars->m_alignment - (cursor % member_sp->m_jit_vars->m_alignment));
Sean Callanan8c127202010-08-23 23:09:38 +0000587
Greg Clayton427f2902010-12-14 02:59:59 +0000588 member_sp->m_jit_vars->m_offset = cursor;
589 cursor += member_sp->m_jit_vars->m_size;
Sean Callanan8bce6652010-07-13 21:41:46 +0000590 }
591
Sean Callananaa301c42010-12-03 01:38:59 +0000592 m_struct_vars->m_struct_size = cursor;
Sean Callanan8bce6652010-07-13 21:41:46 +0000593
Sean Callananaa301c42010-12-03 01:38:59 +0000594 m_struct_vars->m_struct_laid_out = true;
Sean Callanan8bce6652010-07-13 21:41:46 +0000595 return true;
596}
597
Greg Clayton8de27c72010-10-15 22:48:33 +0000598bool ClangExpressionDeclMap::GetStructInfo
599(
600 uint32_t &num_elements,
601 size_t &size,
602 off_t &alignment
603)
Sean Callanan8bce6652010-07-13 21:41:46 +0000604{
Sean Callananaa301c42010-12-03 01:38:59 +0000605 assert (m_struct_vars.get());
606
607 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan8bce6652010-07-13 21:41:46 +0000608 return false;
609
Greg Clayton427f2902010-12-14 02:59:59 +0000610 num_elements = m_struct_members.GetSize();
Sean Callananaa301c42010-12-03 01:38:59 +0000611 size = m_struct_vars->m_struct_size;
612 alignment = m_struct_vars->m_struct_alignment;
Sean Callanan8bce6652010-07-13 21:41:46 +0000613
614 return true;
615}
616
617bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000618ClangExpressionDeclMap::GetStructElement
619(
Sean Callanan9b6898f2011-07-30 02:42:06 +0000620 const NamedDecl *&decl,
Greg Clayton8de27c72010-10-15 22:48:33 +0000621 llvm::Value *&value,
622 off_t &offset,
623 ConstString &name,
624 uint32_t index
625)
Sean Callanan8bce6652010-07-13 21:41:46 +0000626{
Sean Callananaa301c42010-12-03 01:38:59 +0000627 assert (m_struct_vars.get());
628
629 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan8bce6652010-07-13 21:41:46 +0000630 return false;
631
Greg Clayton427f2902010-12-14 02:59:59 +0000632 if (index >= m_struct_members.GetSize())
Sean Callanan8bce6652010-07-13 21:41:46 +0000633 return false;
634
Greg Clayton427f2902010-12-14 02:59:59 +0000635 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(index));
Sean Callanan8bce6652010-07-13 21:41:46 +0000636
Greg Clayton427f2902010-12-14 02:59:59 +0000637 if (!member_sp ||
638 !member_sp->m_parser_vars.get() ||
Sean Callanan53a5a992012-04-12 16:58:26 +0000639 !member_sp->m_jit_vars.get() ||
640 !member_sp->GetValueObject())
Sean Callanan8c127202010-08-23 23:09:38 +0000641 return false;
642
Greg Clayton427f2902010-12-14 02:59:59 +0000643 decl = member_sp->m_parser_vars->m_named_decl;
644 value = member_sp->m_parser_vars->m_llvm_value;
645 offset = member_sp->m_jit_vars->m_offset;
646 name = member_sp->GetName();
Sean Callanan8c127202010-08-23 23:09:38 +0000647
Sean Callanan8bce6652010-07-13 21:41:46 +0000648 return true;
649}
650
Sean Callanan02fbafa2010-07-27 21:39:39 +0000651bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000652ClangExpressionDeclMap::GetFunctionInfo
653(
Sean Callanan9b6898f2011-07-30 02:42:06 +0000654 const NamedDecl *decl,
Greg Clayton8de27c72010-10-15 22:48:33 +0000655 uint64_t &ptr
656)
Sean Callananba992c52010-07-27 02:07:53 +0000657{
Greg Clayton427f2902010-12-14 02:59:59 +0000658 ClangExpressionVariableSP entity_sp(m_found_entities.GetVariable(decl));
Sean Callanan8c127202010-08-23 23:09:38 +0000659
Greg Clayton427f2902010-12-14 02:59:59 +0000660 if (!entity_sp)
Sean Callanan8c127202010-08-23 23:09:38 +0000661 return false;
Sean Callananba992c52010-07-27 02:07:53 +0000662
Sean Callanan8c127202010-08-23 23:09:38 +0000663 // We know m_parser_vars is valid since we searched for the variable by
664 // its NamedDecl
Sean Callananba992c52010-07-27 02:07:53 +0000665
Greg Clayton427f2902010-12-14 02:59:59 +0000666 ptr = entity_sp->m_parser_vars->m_lldb_value->GetScalar().ULongLong();
Sean Callanan8c127202010-08-23 23:09:38 +0000667
668 return true;
Sean Callananba992c52010-07-27 02:07:53 +0000669}
670
Sean Callananca2516d2011-08-16 18:09:29 +0000671static void
672FindCodeSymbolInContext
673(
674 const ConstString &name,
675 SymbolContext &sym_ctx,
676 SymbolContextList &sc_list
677)
678{
679 if (sym_ctx.module_sp)
Sean Callananaa4a5532011-10-13 16:49:47 +0000680 sym_ctx.module_sp->FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list);
Sean Callananca2516d2011-08-16 18:09:29 +0000681
682 if (!sc_list.GetSize())
683 sym_ctx.target_sp->GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list);
684}
685
Sean Callananf5857a02010-07-31 01:32:05 +0000686bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000687ClangExpressionDeclMap::GetFunctionAddress
688(
689 const ConstString &name,
Greg Claytonda7af842011-05-18 22:01:49 +0000690 uint64_t &func_addr
Greg Clayton8de27c72010-10-15 22:48:33 +0000691)
Sean Callananf5857a02010-07-31 01:32:05 +0000692{
Sean Callananaa301c42010-12-03 01:38:59 +0000693 assert (m_parser_vars.get());
694
Sean Callananaba367e2011-05-13 18:27:02 +0000695 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000696 ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
697 Target *target = exe_ctx.GetTargetPtr();
Sean Callananf5857a02010-07-31 01:32:05 +0000698 // Back out in all cases where we're not fully initialized
Greg Clayton567e7f32011-09-22 04:58:26 +0000699 if (target == NULL)
Jim Ingham78b9ee82010-12-07 01:56:02 +0000700 return false;
701 if (!m_parser_vars->m_sym_ctx.target_sp)
Sean Callananf5857a02010-07-31 01:32:05 +0000702 return false;
703
Greg Claytone5748d82010-11-09 23:46:37 +0000704 SymbolContextList sc_list;
Sean Callananf5857a02010-07-31 01:32:05 +0000705
Sean Callananca2516d2011-08-16 18:09:29 +0000706 FindCodeSymbolInContext(name, m_parser_vars->m_sym_ctx, sc_list);
707
Greg Claytone5748d82010-11-09 23:46:37 +0000708 if (!sc_list.GetSize())
Sean Callananaba367e2011-05-13 18:27:02 +0000709 {
710 // We occasionally get debug information in which a const function is reported
711 // as non-const, so the mangled name is wrong. This is a hack to compensate.
712
Sean Callanan0eb21392011-10-25 18:02:05 +0000713 if (!strncmp(name.GetCString(), "_ZN", 3) &&
714 strncmp(name.GetCString(), "_ZNK", 4))
Sean Callananaba367e2011-05-13 18:27:02 +0000715 {
Sean Callanan0eb21392011-10-25 18:02:05 +0000716 std::string fixed_scratch("_ZNK");
717 fixed_scratch.append(name.GetCString() + 3);
718 ConstString fixed_name(fixed_scratch.c_str());
Sean Callananaba367e2011-05-13 18:27:02 +0000719
720 if (log)
Sean Callanan0eb21392011-10-25 18:02:05 +0000721 log->Printf("Failed to find symbols given non-const name %s; trying %s", name.GetCString(), fixed_name.GetCString());
722
723 FindCodeSymbolInContext(fixed_name, m_parser_vars->m_sym_ctx, sc_list);
Sean Callananaba367e2011-05-13 18:27:02 +0000724 }
725 }
726
727 if (!sc_list.GetSize())
Sean Callananf5857a02010-07-31 01:32:05 +0000728 return false;
729
730 SymbolContext sym_ctx;
Greg Claytone5748d82010-11-09 23:46:37 +0000731 sc_list.GetContextAtIndex(0, sym_ctx);
Sean Callananf5857a02010-07-31 01:32:05 +0000732
Greg Claytonda7af842011-05-18 22:01:49 +0000733 const Address *func_so_addr = NULL;
Sean Callananf5857a02010-07-31 01:32:05 +0000734
735 if (sym_ctx.function)
Greg Claytonda7af842011-05-18 22:01:49 +0000736 func_so_addr = &sym_ctx.function->GetAddressRange().GetBaseAddress();
Sean Callananf5857a02010-07-31 01:32:05 +0000737 else if (sym_ctx.symbol)
Greg Clayton0c31d3d2012-03-07 21:03:09 +0000738 func_so_addr = &sym_ctx.symbol->GetAddress();
Sean Callananf5857a02010-07-31 01:32:05 +0000739 else
740 return false;
741
Sean Callananae9f7482011-07-07 23:05:43 +0000742 if (!func_so_addr || !func_so_addr->IsValid())
743 return false;
744
Greg Clayton567e7f32011-09-22 04:58:26 +0000745 func_addr = func_so_addr->GetCallableLoadAddress (target);
Greg Claytonda7af842011-05-18 22:01:49 +0000746
Sean Callananf5857a02010-07-31 01:32:05 +0000747 return true;
748}
749
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000750addr_t
Sean Callanan21ef5bb2011-12-01 02:04:16 +0000751ClangExpressionDeclMap::GetSymbolAddress (Target &target, const ConstString &name, lldb::SymbolType symbol_type)
Sean Callananc7674af2011-01-17 23:42:46 +0000752{
Sean Callananc7674af2011-01-17 23:42:46 +0000753 SymbolContextList sc_list;
754
Sean Callanan21ef5bb2011-12-01 02:04:16 +0000755 target.GetImages().FindSymbolsWithNameAndType(name, symbol_type, sc_list);
Sean Callananc7674af2011-01-17 23:42:46 +0000756
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000757 const uint32_t num_matches = sc_list.GetSize();
758 addr_t symbol_load_addr = LLDB_INVALID_ADDRESS;
759
Sean Callanan21ef5bb2011-12-01 02:04:16 +0000760 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 +0000761 {
762 SymbolContext sym_ctx;
763 sc_list.GetContextAtIndex(i, sym_ctx);
Sean Callananc7674af2011-01-17 23:42:46 +0000764
Greg Clayton0c31d3d2012-03-07 21:03:09 +0000765 const Address *sym_address = &sym_ctx.symbol->GetAddress();
Sean Callananae9f7482011-07-07 23:05:43 +0000766
767 if (!sym_address || !sym_address->IsValid())
768 return LLDB_INVALID_ADDRESS;
769
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000770 if (sym_address)
771 {
772 switch (sym_ctx.symbol->GetType())
773 {
774 case eSymbolTypeCode:
775 case eSymbolTypeTrampoline:
776 symbol_load_addr = sym_address->GetCallableLoadAddress (&target);
777 break;
778
779 case eSymbolTypeData:
780 case eSymbolTypeRuntime:
781 case eSymbolTypeVariable:
782 case eSymbolTypeLocal:
783 case eSymbolTypeParam:
784 case eSymbolTypeInvalid:
785 case eSymbolTypeAbsolute:
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000786 case eSymbolTypeException:
787 case eSymbolTypeSourceFile:
788 case eSymbolTypeHeaderFile:
789 case eSymbolTypeObjectFile:
790 case eSymbolTypeCommonBlock:
791 case eSymbolTypeBlock:
792 case eSymbolTypeVariableType:
793 case eSymbolTypeLineEntry:
794 case eSymbolTypeLineHeader:
795 case eSymbolTypeScopeBegin:
796 case eSymbolTypeScopeEnd:
797 case eSymbolTypeAdditional:
798 case eSymbolTypeCompiler:
799 case eSymbolTypeInstrumentation:
800 case eSymbolTypeUndefined:
Greg Clayton3f69eac2011-12-03 02:30:59 +0000801 case eSymbolTypeObjCClass:
802 case eSymbolTypeObjCMetaClass:
803 case eSymbolTypeObjCIVar:
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000804 symbol_load_addr = sym_address->GetLoadAddress (&target);
805 break;
806 }
807 }
808 }
Sean Callananc7674af2011-01-17 23:42:46 +0000809
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000810 return symbol_load_addr;
Sean Callananc7674af2011-01-17 23:42:46 +0000811}
812
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000813addr_t
Sean Callanan21ef5bb2011-12-01 02:04:16 +0000814ClangExpressionDeclMap::GetSymbolAddress (const ConstString &name, lldb::SymbolType symbol_type)
Sean Callanan81974962011-05-08 02:21:26 +0000815{
816 assert (m_parser_vars.get());
817
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000818 if (!m_parser_vars->m_exe_ctx.GetTargetPtr())
Sean Callanan81974962011-05-08 02:21:26 +0000819 return false;
820
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000821 return GetSymbolAddress(m_parser_vars->m_exe_ctx.GetTargetRef(), name, symbol_type);
Sean Callanan81974962011-05-08 02:21:26 +0000822}
823
Sean Callanan47dc4572011-09-15 02:13:07 +0000824// Interface for IRInterpreter
825
Sean Callanan557ccd62011-10-21 05:18:02 +0000826Value
827ClangExpressionDeclMap::WrapBareAddress (lldb::addr_t addr)
828{
829 Value ret;
830
831 ret.SetContext(Value::eContextTypeInvalid, NULL);
832
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000833 if (m_parser_vars->m_exe_ctx.GetProcessPtr())
Sean Callanan557ccd62011-10-21 05:18:02 +0000834 ret.SetValueType(Value::eValueTypeLoadAddress);
835 else
836 ret.SetValueType(Value::eValueTypeFileAddress);
837
838 ret.GetScalar() = (unsigned long long)addr;
839
840 return ret;
841}
842
Sean Callanan47dc4572011-09-15 02:13:07 +0000843bool
844ClangExpressionDeclMap::WriteTarget (lldb_private::Value &value,
845 const uint8_t *data,
846 size_t length)
847{
848 assert (m_parser_vars.get());
849
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000850 ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
Sean Callanan47dc4572011-09-15 02:13:07 +0000851
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000852 Process *process = exe_ctx.GetProcessPtr();
Sean Callanan47dc4572011-09-15 02:13:07 +0000853 if (value.GetContextType() == Value::eContextTypeRegisterInfo)
854 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000855 if (!process)
Sean Callanan47dc4572011-09-15 02:13:07 +0000856 return false;
857
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000858 RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
Sean Callanan47dc4572011-09-15 02:13:07 +0000859 RegisterInfo *reg_info = value.GetRegisterInfo();
860
861 if (!reg_ctx)
862 return false;
863
864 lldb_private::RegisterValue reg_value;
865 Error err;
866
Greg Clayton567e7f32011-09-22 04:58:26 +0000867 if (!reg_value.SetFromMemoryData (reg_info, data, length, process->GetByteOrder(), err))
Sean Callanan47dc4572011-09-15 02:13:07 +0000868 return false;
869
870 return reg_ctx->WriteRegister(reg_info, reg_value);
871 }
872 else
873 {
874 switch (value.GetValueType())
875 {
876 default:
877 return false;
878 case Value::eValueTypeFileAddress:
879 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000880 if (!process)
Sean Callanan47dc4572011-09-15 02:13:07 +0000881 return false;
882
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000883 Target *target = exe_ctx.GetTargetPtr();
Sean Callanan47dc4572011-09-15 02:13:07 +0000884 Address file_addr;
885
Greg Clayton567e7f32011-09-22 04:58:26 +0000886 if (!target->GetImages().ResolveFileAddress((lldb::addr_t)value.GetScalar().ULongLong(), file_addr))
Sean Callanan47dc4572011-09-15 02:13:07 +0000887 return false;
888
Greg Clayton567e7f32011-09-22 04:58:26 +0000889 lldb::addr_t load_addr = file_addr.GetLoadAddress(target);
Sean Callanan47dc4572011-09-15 02:13:07 +0000890
891 Error err;
Greg Clayton567e7f32011-09-22 04:58:26 +0000892 process->WriteMemory(load_addr, data, length, err);
Sean Callanan47dc4572011-09-15 02:13:07 +0000893
894 return err.Success();
895 }
896 case Value::eValueTypeLoadAddress:
897 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000898 if (!process)
Sean Callanan47dc4572011-09-15 02:13:07 +0000899 return false;
900
901 Error err;
Greg Clayton567e7f32011-09-22 04:58:26 +0000902 process->WriteMemory((lldb::addr_t)value.GetScalar().ULongLong(), data, length, err);
Sean Callanan47dc4572011-09-15 02:13:07 +0000903
904 return err.Success();
905 }
906 case Value::eValueTypeHostAddress:
Sean Callanane1301a62011-12-06 03:41:14 +0000907 {
908 if (value.GetScalar().ULongLong() == 0 || data == NULL)
909 return false;
910 memcpy ((void *)value.GetScalar().ULongLong(), data, length);
911 return true;
912 }
Sean Callanan47dc4572011-09-15 02:13:07 +0000913 case Value::eValueTypeScalar:
914 return false;
915 }
916 }
917}
918
919bool
920ClangExpressionDeclMap::ReadTarget (uint8_t *data,
921 lldb_private::Value &value,
922 size_t length)
923{
924 assert (m_parser_vars.get());
925
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000926 ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
Greg Clayton567e7f32011-09-22 04:58:26 +0000927
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000928 Process *process = exe_ctx.GetProcessPtr();
Greg Clayton567e7f32011-09-22 04:58:26 +0000929
Sean Callanan47dc4572011-09-15 02:13:07 +0000930 if (value.GetContextType() == Value::eContextTypeRegisterInfo)
931 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000932 if (!process)
Sean Callanan47dc4572011-09-15 02:13:07 +0000933 return false;
934
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000935 RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
Sean Callanan47dc4572011-09-15 02:13:07 +0000936 RegisterInfo *reg_info = value.GetRegisterInfo();
937
938 if (!reg_ctx)
939 return false;
940
941 lldb_private::RegisterValue reg_value;
942 Error err;
943
944 if (!reg_ctx->ReadRegister(reg_info, reg_value))
945 return false;
946
Greg Clayton567e7f32011-09-22 04:58:26 +0000947 return reg_value.GetAsMemoryData(reg_info, data, length, process->GetByteOrder(), err);
Sean Callanan47dc4572011-09-15 02:13:07 +0000948 }
949 else
950 {
951 switch (value.GetValueType())
952 {
953 default:
954 return false;
955 case Value::eValueTypeFileAddress:
956 {
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000957 Target *target = exe_ctx.GetTargetPtr();
Greg Clayton567e7f32011-09-22 04:58:26 +0000958 if (target == NULL)
Sean Callanan47dc4572011-09-15 02:13:07 +0000959 return false;
960
961 Address file_addr;
962
Greg Clayton567e7f32011-09-22 04:58:26 +0000963 if (!target->GetImages().ResolveFileAddress((lldb::addr_t)value.GetScalar().ULongLong(), file_addr))
Sean Callanan47dc4572011-09-15 02:13:07 +0000964 return false;
965
966 Error err;
Sean Callananb2e8d192012-02-08 21:55:14 +0000967 target->ReadMemory(file_addr, false, data, length, err);
Sean Callanan47dc4572011-09-15 02:13:07 +0000968
969 return err.Success();
970 }
971 case Value::eValueTypeLoadAddress:
972 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000973 if (!process)
Sean Callanan47dc4572011-09-15 02:13:07 +0000974 return false;
975
976 Error err;
Greg Clayton567e7f32011-09-22 04:58:26 +0000977 process->ReadMemory((lldb::addr_t)value.GetScalar().ULongLong(), data, length, err);
Sean Callanan47dc4572011-09-15 02:13:07 +0000978
979 return err.Success();
980 }
981 case Value::eValueTypeHostAddress:
Sean Callanan5a55c7a2011-11-18 03:28:09 +0000982 {
983 void *host_addr = (void*)value.GetScalar().ULongLong();
984
985 if (!host_addr)
986 return false;
987
988 memcpy (data, host_addr, length);
Sean Callanan47dc4572011-09-15 02:13:07 +0000989 return true;
Sean Callanan5a55c7a2011-11-18 03:28:09 +0000990 }
Sean Callanan47dc4572011-09-15 02:13:07 +0000991 case Value::eValueTypeScalar:
992 return false;
993 }
994 }
995}
996
997lldb_private::Value
Sean Callanan52d0d022012-02-15 01:40:39 +0000998ClangExpressionDeclMap::LookupDecl (clang::NamedDecl *decl, ClangExpressionVariable::FlagType &flags)
Sean Callanan47dc4572011-09-15 02:13:07 +0000999{
1000 assert (m_parser_vars.get());
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001001
Sean Callanan47dc4572011-09-15 02:13:07 +00001002 ClangExpressionVariableSP expr_var_sp (m_found_entities.GetVariable(decl));
1003 ClangExpressionVariableSP persistent_var_sp (m_parser_vars->m_persistent_vars->GetVariable(decl));
Sean Callanan1c38d102011-11-02 23:24:30 +00001004
Sean Callanan47dc4572011-09-15 02:13:07 +00001005 if (expr_var_sp)
1006 {
Sean Callanan52d0d022012-02-15 01:40:39 +00001007 flags = expr_var_sp->m_flags;
1008
Sean Callananb2e8d192012-02-08 21:55:14 +00001009 if (!expr_var_sp->m_parser_vars.get())
Sean Callanan6d284ef2011-10-12 22:20:02 +00001010 return Value();
1011
Sean Callanan1c38d102011-11-02 23:24:30 +00001012 bool is_reference = expr_var_sp->m_flags & ClangExpressionVariable::EVTypeIsReference;
Sean Callananb2e8d192012-02-08 21:55:14 +00001013
1014 if (expr_var_sp->m_parser_vars->m_lldb_var)
Sean Callanan1c38d102011-11-02 23:24:30 +00001015 {
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001016 std::auto_ptr<Value> value(GetVariableValue(expr_var_sp->m_parser_vars->m_lldb_var, NULL));
Sean Callanan1c38d102011-11-02 23:24:30 +00001017
Sean Callananb2e8d192012-02-08 21:55:14 +00001018 if (is_reference && value.get() && value->GetValueType() == Value::eValueTypeLoadAddress)
1019 {
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001020 Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr();
Sean Callananb2e8d192012-02-08 21:55:14 +00001021
1022 if (!process)
1023 return Value();
1024
1025 lldb::addr_t value_addr = value->GetScalar().ULongLong();
1026 Error read_error;
1027 addr_t ref_value = process->ReadPointerFromMemory (value_addr, read_error);
1028
1029 if (!read_error.Success())
1030 return Value();
1031
1032 value->GetScalar() = (unsigned long long)ref_value;
1033 }
Sean Callanan1c38d102011-11-02 23:24:30 +00001034
Sean Callananb2e8d192012-02-08 21:55:14 +00001035 if (value.get())
1036 return *value;
1037 else
1038 return Value();
1039 }
1040 else if (expr_var_sp->m_parser_vars->m_lldb_sym)
1041 {
Greg Clayton0c31d3d2012-03-07 21:03:09 +00001042 const Address sym_address = expr_var_sp->m_parser_vars->m_lldb_sym->GetAddress();
Sean Callananb2e8d192012-02-08 21:55:14 +00001043
1044 if (!sym_address.IsValid())
1045 return Value();
1046
1047 Value ret;
1048
Sean Callanan6cdedde2012-02-28 17:55:31 +00001049 ProcessSP process_sp (m_parser_vars->m_exe_ctx.GetProcessSP());
1050
1051 if (process_sp)
1052 {
1053 uint64_t symbol_load_addr = sym_address.GetLoadAddress(&process_sp->GetTarget());
1054
1055 ret.GetScalar() = symbol_load_addr;
1056 ret.SetValueType(Value::eValueTypeLoadAddress);
1057 }
1058 else
1059 {
1060 uint64_t symbol_file_addr = sym_address.GetFileAddress();
1061
1062 ret.GetScalar() = symbol_file_addr;
1063 ret.SetValueType(Value::eValueTypeFileAddress);
1064 }
Sean Callananb2e8d192012-02-08 21:55:14 +00001065
1066 return ret;
1067 }
Sean Callanan52d0d022012-02-15 01:40:39 +00001068 else if (RegisterInfo *reg_info = expr_var_sp->GetRegisterInfo())
1069 {
1070 StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
1071
1072 if (!frame)
1073 return Value();
1074
1075 RegisterContextSP reg_context_sp(frame->GetRegisterContextSP());
1076
1077 RegisterValue reg_value;
1078
1079 if (!reg_context_sp->ReadRegister(reg_info, reg_value))
1080 return Value();
1081
1082 Value ret;
1083
1084 ret.SetContext(Value::eContextTypeRegisterInfo, reg_info);
1085 if (!reg_value.GetScalarValue(ret.GetScalar()))
1086 return Value();
1087
1088 return ret;
1089 }
Sean Callanan4b3cef02011-10-26 21:20:00 +00001090 else
Sean Callananb2e8d192012-02-08 21:55:14 +00001091 {
Sean Callanan4b3cef02011-10-26 21:20:00 +00001092 return Value();
Sean Callananb2e8d192012-02-08 21:55:14 +00001093 }
Sean Callanan47dc4572011-09-15 02:13:07 +00001094 }
1095 else if (persistent_var_sp)
1096 {
Sean Callanan52d0d022012-02-15 01:40:39 +00001097 flags = persistent_var_sp->m_flags;
1098
Sean Callanana8428a42011-09-22 00:41:11 +00001099 if ((persistent_var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference ||
1100 persistent_var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) &&
Sean Callanan86a07da2011-10-22 01:58:08 +00001101 persistent_var_sp->m_live_sp &&
Sean Callananf48de6d2011-12-10 03:12:34 +00001102 ((persistent_var_sp->m_live_sp->GetValue().GetValueType() == Value::eValueTypeLoadAddress &&
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001103 m_parser_vars->m_exe_ctx.GetProcessSP() &&
1104 m_parser_vars->m_exe_ctx.GetProcessSP()->IsAlive()) ||
Sean Callananf48de6d2011-12-10 03:12:34 +00001105 (persistent_var_sp->m_live_sp->GetValue().GetValueType() == Value::eValueTypeFileAddress)))
Sean Callanana8428a42011-09-22 00:41:11 +00001106 {
Sean Callanan4b3cef02011-10-26 21:20:00 +00001107 return persistent_var_sp->m_live_sp->GetValue();
Sean Callanana8428a42011-09-22 00:41:11 +00001108 }
1109 else
1110 {
1111 lldb_private::Value ret;
1112 ret.SetValueType(Value::eValueTypeHostAddress);
1113 ret.SetContext(Value::eContextTypeInvalid, NULL);
1114 ret.GetScalar() = (lldb::addr_t)persistent_var_sp->GetValueBytes();
1115 return ret;
1116 }
Sean Callanan47dc4572011-09-15 02:13:07 +00001117 }
1118 else
1119 {
1120 return Value();
1121 }
1122}
1123
Sean Callanan4b3cef02011-10-26 21:20:00 +00001124Value
1125ClangExpressionDeclMap::GetSpecialValue (const ConstString &name)
1126{
1127 assert(m_parser_vars.get());
1128
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001129 StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
Sean Callanan4b3cef02011-10-26 21:20:00 +00001130
1131 if (!frame)
1132 return Value();
1133
1134 VariableList *vars = frame->GetVariableList(false);
1135
1136 if (!vars)
1137 return Value();
1138
1139 lldb::VariableSP var = vars->FindVariable(name);
1140
1141 if (!var ||
1142 !var->IsInScope(frame) ||
1143 !var->LocationIsValidForFrame (frame))
1144 return Value();
1145
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001146 std::auto_ptr<Value> value(GetVariableValue(var, NULL));
Sean Callanan4b3cef02011-10-26 21:20:00 +00001147
Sean Callanan41a410d2011-11-03 22:48:37 +00001148 if (value.get() && value->GetValueType() == Value::eValueTypeLoadAddress)
1149 {
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001150 Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr();
Sean Callanan41a410d2011-11-03 22:48:37 +00001151
1152 if (!process)
1153 return Value();
1154
1155 lldb::addr_t value_addr = value->GetScalar().ULongLong();
1156 Error read_error;
1157 addr_t ptr_value = process->ReadPointerFromMemory (value_addr, read_error);
1158
1159 if (!read_error.Success())
1160 return Value();
1161
1162 value->GetScalar() = (unsigned long long)ptr_value;
1163 }
1164
Sean Callanan4b3cef02011-10-26 21:20:00 +00001165 if (value.get())
1166 return *value;
1167 else
1168 return Value();
1169}
1170
Sean Callanan810f22d2010-07-16 00:09:46 +00001171// Interface for CommandObjectExpression
Sean Callananf328c9f2010-07-20 23:31:16 +00001172
1173bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001174ClangExpressionDeclMap::Materialize
1175(
Greg Clayton8de27c72010-10-15 22:48:33 +00001176 lldb::addr_t &struct_address,
1177 Error &err
1178)
Sean Callananf328c9f2010-07-20 23:31:16 +00001179{
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001180 if (!m_parser_vars.get())
1181 return false;
1182
Sean Callananaa301c42010-12-03 01:38:59 +00001183 EnableMaterialVars();
1184
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001185 m_material_vars->m_process = m_parser_vars->m_exe_ctx.GetProcessPtr();
Sean Callananaa301c42010-12-03 01:38:59 +00001186
Sean Callanan0ddf8062011-05-09 22:04:36 +00001187 bool result = DoMaterialize(false /* dematerialize */,
Sean Callanan0ddf8062011-05-09 22:04:36 +00001188 LLDB_INVALID_ADDRESS /* top of stack frame */,
1189 LLDB_INVALID_ADDRESS /* bottom of stack frame */,
1190 NULL, /* result SP */
1191 err);
Sean Callananf328c9f2010-07-20 23:31:16 +00001192
1193 if (result)
Sean Callananaa301c42010-12-03 01:38:59 +00001194 struct_address = m_material_vars->m_materialized_location;
Sean Callananf328c9f2010-07-20 23:31:16 +00001195
1196 return result;
1197}
1198
1199bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001200ClangExpressionDeclMap::GetObjectPointer
1201(
1202 lldb::addr_t &object_ptr,
Sean Callanan3aa7da52010-12-13 22:46:15 +00001203 ConstString &object_name,
Sean Callanan047923c2010-12-14 00:42:36 +00001204 Error &err,
1205 bool suppress_type_check
Greg Clayton8de27c72010-10-15 22:48:33 +00001206)
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001207{
Sean Callananaa301c42010-12-03 01:38:59 +00001208 assert (m_struct_vars.get());
1209
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001210 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
1211 Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr();
1212 StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
Greg Clayton567e7f32011-09-22 04:58:26 +00001213
1214 if (frame == NULL || process == NULL || target == NULL)
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001215 {
Sean Callanane6ea5fe2011-11-15 02:11:17 +00001216 err.SetErrorStringWithFormat("Couldn't load '%s' because the context is incomplete", object_name.AsCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001217 return false;
1218 }
1219
Sean Callananaa301c42010-12-03 01:38:59 +00001220 if (!m_struct_vars->m_object_pointer_type.GetOpaqueQualType())
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001221 {
Sean Callanane6ea5fe2011-11-15 02:11:17 +00001222 err.SetErrorStringWithFormat("Couldn't load '%s' because its type is unknown", object_name.AsCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001223 return false;
1224 }
1225
Sean Callanan39d1af92012-05-21 21:29:52 +00001226 const bool object_pointer = true;
Sean Callanan70c6cf42012-02-18 02:01:03 +00001227
Greg Clayton567e7f32011-09-22 04:58:26 +00001228 VariableSP object_ptr_var = FindVariableInScope (*frame,
Sean Callanan696cf5f2011-05-07 01:06:41 +00001229 object_name,
Sean Callanan70c6cf42012-02-18 02:01:03 +00001230 (suppress_type_check ? NULL : &m_struct_vars->m_object_pointer_type),
Sean Callanan39d1af92012-05-21 21:29:52 +00001231 object_pointer);
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001232
1233 if (!object_ptr_var)
1234 {
Sean Callanane6ea5fe2011-11-15 02:11:17 +00001235 err.SetErrorStringWithFormat("Couldn't find '%s' with appropriate type in scope", object_name.AsCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001236 return false;
1237 }
1238
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001239 std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(object_ptr_var,
Sean Callananaa301c42010-12-03 01:38:59 +00001240 NULL));
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001241
1242 if (!location_value.get())
1243 {
Sean Callanan3aa7da52010-12-13 22:46:15 +00001244 err.SetErrorStringWithFormat("Couldn't get the location for '%s'", object_name.GetCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001245 return false;
1246 }
1247
Sean Callanan50339fe2011-03-04 00:23:47 +00001248 switch (location_value->GetValueType())
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001249 {
Sean Callanan50339fe2011-03-04 00:23:47 +00001250 default:
Sean Callanan3aa7da52010-12-13 22:46:15 +00001251 err.SetErrorStringWithFormat("'%s' is not in memory; LLDB must be extended to handle registers", object_name.GetCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001252 return false;
Sean Callanan50339fe2011-03-04 00:23:47 +00001253 case Value::eValueTypeLoadAddress:
1254 {
1255 lldb::addr_t value_addr = location_value->GetScalar().ULongLong();
Greg Clayton567e7f32011-09-22 04:58:26 +00001256 uint32_t address_byte_size = target->GetArchitecture().GetAddressByteSize();
Sean Callanan50339fe2011-03-04 00:23:47 +00001257
1258 if (ClangASTType::GetClangTypeBitWidth(m_struct_vars->m_object_pointer_type.GetASTContext(),
1259 m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) != address_byte_size * 8)
1260 {
1261 err.SetErrorStringWithFormat("'%s' is not of an expected pointer size", object_name.GetCString());
1262 return false;
1263 }
1264
Sean Callanan50339fe2011-03-04 00:23:47 +00001265 Error read_error;
Greg Clayton567e7f32011-09-22 04:58:26 +00001266 object_ptr = process->ReadPointerFromMemory (value_addr, read_error);
Greg Claytonc0fa5332011-05-22 22:46:53 +00001267 if (read_error.Fail() || object_ptr == LLDB_INVALID_ADDRESS)
Sean Callanan50339fe2011-03-04 00:23:47 +00001268 {
1269 err.SetErrorStringWithFormat("Coldn't read '%s' from the target: %s", object_name.GetCString(), read_error.AsCString());
1270 return false;
Greg Claytonc0fa5332011-05-22 22:46:53 +00001271 }
Sean Callanan50339fe2011-03-04 00:23:47 +00001272 return true;
1273 }
1274 case Value::eValueTypeScalar:
1275 {
1276 if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
1277 {
1278 StreamString ss;
1279 location_value->Dump(&ss);
1280
1281 err.SetErrorStringWithFormat("%s is a scalar of unhandled type: %s", object_name.GetCString(), ss.GetString().c_str());
1282 return false;
1283 }
1284
Greg Clayton061b79d2011-05-09 20:18:18 +00001285 RegisterInfo *reg_info = location_value->GetRegisterInfo();
Sean Callanan50339fe2011-03-04 00:23:47 +00001286
Greg Clayton061b79d2011-05-09 20:18:18 +00001287 if (!reg_info)
Sean Callanan50339fe2011-03-04 00:23:47 +00001288 {
1289 err.SetErrorStringWithFormat("Couldn't get the register information for %s", object_name.GetCString());
1290 return false;
1291 }
1292
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001293 RegisterContext *reg_ctx = m_parser_vars->m_exe_ctx.GetRegisterContext();
Sean Callanan50339fe2011-03-04 00:23:47 +00001294
Greg Clayton061b79d2011-05-09 20:18:18 +00001295 if (!reg_ctx)
Sean Callanan50339fe2011-03-04 00:23:47 +00001296 {
Greg Clayton061b79d2011-05-09 20:18:18 +00001297 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 +00001298 return false;
1299 }
1300
Greg Clayton061b79d2011-05-09 20:18:18 +00001301 uint32_t register_number = reg_info->kinds[lldb::eRegisterKindLLDB];
Sean Callanan50339fe2011-03-04 00:23:47 +00001302
Greg Clayton061b79d2011-05-09 20:18:18 +00001303 object_ptr = reg_ctx->ReadRegisterAsUnsigned(register_number, 0x0);
Sean Callanan50339fe2011-03-04 00:23:47 +00001304
1305 return true;
1306 }
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001307 }
1308}
1309
1310bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001311ClangExpressionDeclMap::Dematerialize
1312(
Greg Clayton427f2902010-12-14 02:59:59 +00001313 ClangExpressionVariableSP &result_sp,
Sean Callanan0ddf8062011-05-09 22:04:36 +00001314 lldb::addr_t stack_frame_top,
1315 lldb::addr_t stack_frame_bottom,
Greg Clayton8de27c72010-10-15 22:48:33 +00001316 Error &err
1317)
Sean Callananf328c9f2010-07-20 23:31:16 +00001318{
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001319 return DoMaterialize(true, stack_frame_top, stack_frame_bottom, &result_sp, err);
Sean Callananaa301c42010-12-03 01:38:59 +00001320
1321 DidDematerialize();
1322}
1323
1324void
1325ClangExpressionDeclMap::DidDematerialize()
1326{
1327 if (m_material_vars.get())
1328 {
1329 if (m_material_vars->m_materialized_location)
1330 {
1331 //#define SINGLE_STEP_EXPRESSIONS
1332
1333#ifndef SINGLE_STEP_EXPRESSIONS
1334 m_material_vars->m_process->DeallocateMemory(m_material_vars->m_materialized_location);
1335#endif
1336 m_material_vars->m_materialized_location = 0;
1337 }
1338
1339 DisableMaterialVars();
1340 }
Sean Callananf328c9f2010-07-20 23:31:16 +00001341}
1342
Sean Callanan32824aa2010-07-23 22:19:18 +00001343bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001344ClangExpressionDeclMap::DumpMaterializedStruct
1345(
Greg Clayton8de27c72010-10-15 22:48:33 +00001346 Stream &s,
1347 Error &err
1348)
Sean Callanan32824aa2010-07-23 22:19:18 +00001349{
Sean Callananaa301c42010-12-03 01:38:59 +00001350 assert (m_struct_vars.get());
1351 assert (m_material_vars.get());
1352
1353 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan32824aa2010-07-23 22:19:18 +00001354 {
1355 err.SetErrorString("Structure hasn't been laid out yet");
1356 return false;
1357 }
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001358 Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr();
Greg Clayton567e7f32011-09-22 04:58:26 +00001359
1360 if (!process)
Sean Callanan32824aa2010-07-23 22:19:18 +00001361 {
1362 err.SetErrorString("Couldn't find the process");
1363 return false;
1364 }
1365
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001366 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
Greg Clayton567e7f32011-09-22 04:58:26 +00001367 if (!target)
Sean Callanan32824aa2010-07-23 22:19:18 +00001368 {
1369 err.SetErrorString("Couldn't find the target");
1370 return false;
1371 }
1372
Sean Callanan33711022010-12-07 10:00:20 +00001373 if (!m_material_vars->m_materialized_location)
1374 {
1375 err.SetErrorString("No materialized location");
1376 return false;
1377 }
1378
Greg Claytonc0fa5332011-05-22 22:46:53 +00001379 lldb::DataBufferSP data_sp(new DataBufferHeap(m_struct_vars->m_struct_size, 0));
Sean Callanan32824aa2010-07-23 22:19:18 +00001380
1381 Error error;
Greg Clayton567e7f32011-09-22 04:58:26 +00001382 if (process->ReadMemory (m_material_vars->m_materialized_location,
Greg Claytonc0fa5332011-05-22 22:46:53 +00001383 data_sp->GetBytes(),
1384 data_sp->GetByteSize(), error) != data_sp->GetByteSize())
Sean Callanan32824aa2010-07-23 22:19:18 +00001385 {
1386 err.SetErrorStringWithFormat ("Couldn't read struct from the target: %s", error.AsCString());
1387 return false;
1388 }
1389
Greg Clayton567e7f32011-09-22 04:58:26 +00001390 DataExtractor extractor(data_sp, process->GetByteOrder(), target->GetArchitecture().GetAddressByteSize());
Sean Callanan32824aa2010-07-23 22:19:18 +00001391
Greg Clayton427f2902010-12-14 02:59:59 +00001392 for (size_t member_idx = 0, num_members = m_struct_members.GetSize();
1393 member_idx < num_members;
1394 ++member_idx)
Sean Callanan32824aa2010-07-23 22:19:18 +00001395 {
Greg Clayton427f2902010-12-14 02:59:59 +00001396 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_idx));
Sean Callanan32824aa2010-07-23 22:19:18 +00001397
Greg Clayton427f2902010-12-14 02:59:59 +00001398 if (!member_sp)
1399 return false;
1400
1401 s.Printf("[%s]\n", member_sp->GetName().GetCString());
Sean Callanan8c127202010-08-23 23:09:38 +00001402
Greg Clayton427f2902010-12-14 02:59:59 +00001403 if (!member_sp->m_jit_vars.get())
Sean Callanan8c127202010-08-23 23:09:38 +00001404 return false;
1405
Greg Clayton427f2902010-12-14 02:59:59 +00001406 extractor.Dump (&s, // stream
1407 member_sp->m_jit_vars->m_offset, // offset
1408 lldb::eFormatBytesWithASCII, // format
1409 1, // byte size of individual entries
1410 member_sp->m_jit_vars->m_size, // number of entries
1411 16, // entries per line
1412 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, // address to print
1413 0, // bit size (bitfields only; 0 means ignore)
1414 0); // bit alignment (bitfields only; 0 means ignore)
Sean Callanan32824aa2010-07-23 22:19:18 +00001415
1416 s.PutChar('\n');
1417 }
1418
1419 return true;
1420}
1421
Sean Callananf328c9f2010-07-20 23:31:16 +00001422bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001423ClangExpressionDeclMap::DoMaterialize
1424(
1425 bool dematerialize,
Sean Callanan0ddf8062011-05-09 22:04:36 +00001426 lldb::addr_t stack_frame_top,
1427 lldb::addr_t stack_frame_bottom,
Greg Clayton427f2902010-12-14 02:59:59 +00001428 lldb::ClangExpressionVariableSP *result_sp_ptr,
Greg Clayton8de27c72010-10-15 22:48:33 +00001429 Error &err
1430)
Sean Callanan810f22d2010-07-16 00:09:46 +00001431{
Greg Clayton427f2902010-12-14 02:59:59 +00001432 if (result_sp_ptr)
1433 result_sp_ptr->reset();
1434
Sean Callananaa301c42010-12-03 01:38:59 +00001435 assert (m_struct_vars.get());
1436
Greg Claytone005f2c2010-11-06 01:53:30 +00001437 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan82b74c82010-08-12 01:56:52 +00001438
Sean Callananaa301c42010-12-03 01:38:59 +00001439 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan810f22d2010-07-16 00:09:46 +00001440 {
1441 err.SetErrorString("Structure hasn't been laid out yet");
Greg Clayton57067a02011-09-13 04:03:52 +00001442 return false;
Sean Callanan810f22d2010-07-16 00:09:46 +00001443 }
1444
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001445 StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
Greg Clayton567e7f32011-09-22 04:58:26 +00001446 if (!frame)
Sean Callanan45839272010-07-24 01:37:44 +00001447 {
1448 err.SetErrorString("Received null execution frame");
Greg Clayton57067a02011-09-13 04:03:52 +00001449 return false;
Sean Callanan45839272010-07-24 01:37:44 +00001450 }
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001451 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
Sean Callanan45839272010-07-24 01:37:44 +00001452
Greg Clayton567e7f32011-09-22 04:58:26 +00001453 ClangPersistentVariables &persistent_vars = target->GetPersistentVariables();
Sean Callananaa301c42010-12-03 01:38:59 +00001454
1455 if (!m_struct_vars->m_struct_size)
Sean Callanane8a59a82010-09-13 21:34:21 +00001456 {
1457 if (log)
1458 log->PutCString("Not bothering to allocate a struct because no arguments are needed");
1459
Filipe Cabecinhasf9935582012-09-11 18:11:16 +00001460 m_material_vars->m_allocated_area = 0UL;
Sean Callanane8a59a82010-09-13 21:34:21 +00001461
1462 return true;
1463 }
1464
Greg Clayton567e7f32011-09-22 04:58:26 +00001465 const SymbolContext &sym_ctx(frame->GetSymbolContext(lldb::eSymbolContextEverything));
Sean Callanan810f22d2010-07-16 00:09:46 +00001466
Sean Callananf328c9f2010-07-20 23:31:16 +00001467 if (!dematerialize)
Sean Callanan810f22d2010-07-16 00:09:46 +00001468 {
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001469 Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr();
Sean Callananaa301c42010-12-03 01:38:59 +00001470 if (m_material_vars->m_materialized_location)
Sean Callananf328c9f2010-07-20 23:31:16 +00001471 {
Greg Clayton567e7f32011-09-22 04:58:26 +00001472 process->DeallocateMemory(m_material_vars->m_materialized_location);
Sean Callananaa301c42010-12-03 01:38:59 +00001473 m_material_vars->m_materialized_location = 0;
Sean Callananf328c9f2010-07-20 23:31:16 +00001474 }
1475
Sean Callanan7a60b942010-10-08 01:58:41 +00001476 if (log)
1477 log->PutCString("Allocating memory for materialized argument struct");
1478
Greg Clayton567e7f32011-09-22 04:58:26 +00001479 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 +00001480 lldb::ePermissionsReadable | lldb::ePermissionsWritable,
1481 err);
Sean Callananf328c9f2010-07-20 23:31:16 +00001482
1483 if (mem == LLDB_INVALID_ADDRESS)
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001484 {
1485 err.SetErrorStringWithFormat("Couldn't allocate 0x%llx bytes for materialized argument struct",
1486 (unsigned long long)(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size));
Sean Callananf328c9f2010-07-20 23:31:16 +00001487 return false;
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001488 }
1489
Sean Callananaa301c42010-12-03 01:38:59 +00001490 m_material_vars->m_allocated_area = mem;
Sean Callanan810f22d2010-07-16 00:09:46 +00001491 }
1492
Sean Callananaa301c42010-12-03 01:38:59 +00001493 m_material_vars->m_materialized_location = m_material_vars->m_allocated_area;
Sean Callananf328c9f2010-07-20 23:31:16 +00001494
Sean Callananaa301c42010-12-03 01:38:59 +00001495 if (m_material_vars->m_materialized_location % m_struct_vars->m_struct_alignment)
1496 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 +00001497
Greg Clayton427f2902010-12-14 02:59:59 +00001498 for (uint64_t member_index = 0, num_members = m_struct_members.GetSize();
Sean Callanan8c127202010-08-23 23:09:38 +00001499 member_index < num_members;
1500 ++member_index)
Sean Callanan810f22d2010-07-16 00:09:46 +00001501 {
Greg Clayton427f2902010-12-14 02:59:59 +00001502 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
Sean Callanan810f22d2010-07-16 00:09:46 +00001503
Greg Claytona875b642011-01-09 21:07:35 +00001504 if (m_found_entities.ContainsVariable (member_sp))
Sean Callanan8c127202010-08-23 23:09:38 +00001505 {
Sean Callanan25db51f2012-08-16 21:34:44 +00001506 if (!member_sp->GetValueObject())
1507 {
1508 err.SetErrorString("Variable being materialized doesn't have a frozen version");
1509 return false;
1510 }
1511
Greg Claytona875b642011-01-09 21:07:35 +00001512 RegisterInfo *reg_info = member_sp->GetRegisterInfo ();
Greg Clayton427f2902010-12-14 02:59:59 +00001513 if (reg_info)
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001514 {
1515 // This is a register variable
1516
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001517 RegisterContext *reg_ctx = m_parser_vars->m_exe_ctx.GetRegisterContext();
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001518
1519 if (!reg_ctx)
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001520 {
1521 err.SetErrorString("Couldn't get register context");
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001522 return false;
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001523 }
1524
Greg Clayton427f2902010-12-14 02:59:59 +00001525 if (!DoMaterializeOneRegister (dematerialize,
Greg Clayton427f2902010-12-14 02:59:59 +00001526 *reg_ctx,
1527 *reg_info,
1528 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
1529 err))
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001530 return false;
1531 }
1532 else
1533 {
Greg Clayton427f2902010-12-14 02:59:59 +00001534 if (!member_sp->m_jit_vars.get())
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001535 {
1536 err.SetErrorString("Variable being materialized doesn't have necessary state");
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001537 return false;
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001538 }
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001539
Greg Clayton427f2902010-12-14 02:59:59 +00001540 if (!DoMaterializeOneVariable (dematerialize,
Sean Callanan6a925532011-01-13 08:53:35 +00001541 sym_ctx,
1542 member_sp,
Greg Clayton427f2902010-12-14 02:59:59 +00001543 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
1544 err))
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001545 return false;
1546 }
Sean Callanan8c127202010-08-23 23:09:38 +00001547 }
Sean Callanan8c127202010-08-23 23:09:38 +00001548 else
1549 {
Greg Claytona875b642011-01-09 21:07:35 +00001550 // No need to look for presistent variables if the name doesn't start
1551 // with with a '$' character...
1552 if (member_sp->GetName().AsCString ("!")[0] == '$' && persistent_vars.ContainsVariable(member_sp))
1553 {
Sean Callanan6a925532011-01-13 08:53:35 +00001554
Greg Claytona875b642011-01-09 21:07:35 +00001555 if (member_sp->GetName() == m_struct_vars->m_result_name)
1556 {
Greg Claytona875b642011-01-09 21:07:35 +00001557 if (log)
1558 log->PutCString("Found result member in the struct");
Sean Callanan6a925532011-01-13 08:53:35 +00001559
Greg Claytona875b642011-01-09 21:07:35 +00001560 if (result_sp_ptr)
1561 *result_sp_ptr = member_sp;
Sean Callanan6a925532011-01-13 08:53:35 +00001562
Greg Claytona875b642011-01-09 21:07:35 +00001563 }
1564
1565 if (!DoMaterializeOnePersistentVariable (dematerialize,
Greg Claytona875b642011-01-09 21:07:35 +00001566 member_sp,
Sean Callanan0ddf8062011-05-09 22:04:36 +00001567 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
1568 stack_frame_top,
1569 stack_frame_bottom,
Greg Claytona875b642011-01-09 21:07:35 +00001570 err))
1571 return false;
1572 }
1573 else
1574 {
1575 err.SetErrorStringWithFormat("Unexpected variable %s", member_sp->GetName().GetCString());
1576 return false;
1577 }
Sean Callanan8c127202010-08-23 23:09:38 +00001578 }
Sean Callanan810f22d2010-07-16 00:09:46 +00001579 }
1580
Sean Callananf328c9f2010-07-20 23:31:16 +00001581 return true;
1582}
1583
Sean Callanana48fe162010-08-11 03:57:18 +00001584bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001585ClangExpressionDeclMap::DoMaterializeOnePersistentVariable
1586(
1587 bool dematerialize,
Greg Clayton427f2902010-12-14 02:59:59 +00001588 ClangExpressionVariableSP &var_sp,
Greg Clayton8de27c72010-10-15 22:48:33 +00001589 lldb::addr_t addr,
Sean Callanan0ddf8062011-05-09 22:04:36 +00001590 lldb::addr_t stack_frame_top,
1591 lldb::addr_t stack_frame_bottom,
Greg Clayton8de27c72010-10-15 22:48:33 +00001592 Error &err
1593)
Sean Callananaa301c42010-12-03 01:38:59 +00001594{
Sean Callanan6a925532011-01-13 08:53:35 +00001595 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1596
Greg Clayton427f2902010-12-14 02:59:59 +00001597 if (!var_sp)
Sean Callanana48fe162010-08-11 03:57:18 +00001598 {
Greg Clayton427f2902010-12-14 02:59:59 +00001599 err.SetErrorString("Invalid persistent variable");
Sean Callanana48fe162010-08-11 03:57:18 +00001600 return LLDB_INVALID_ADDRESS;
1601 }
1602
Greg Clayton427f2902010-12-14 02:59:59 +00001603 const size_t pvar_byte_size = var_sp->GetByteSize();
Sean Callanana6223432010-08-20 01:02:30 +00001604
Greg Clayton427f2902010-12-14 02:59:59 +00001605 uint8_t *pvar_data = var_sp->GetValueBytes();
1606 if (pvar_data == NULL)
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001607 {
1608 err.SetErrorString("Persistent variable being materialized contains no data");
Sean Callanana6223432010-08-20 01:02:30 +00001609 return false;
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001610 }
Sean Callanana6223432010-08-20 01:02:30 +00001611
Sean Callanana48fe162010-08-11 03:57:18 +00001612 Error error;
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001613 Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr();
Greg Clayton567e7f32011-09-22 04:58:26 +00001614
Sean Callanan6a925532011-01-13 08:53:35 +00001615 lldb::addr_t mem; // The address of a spare memory area used to hold the persistent variable.
1616
Sean Callanana48fe162010-08-11 03:57:18 +00001617 if (dematerialize)
1618 {
Sean Callanan6a925532011-01-13 08:53:35 +00001619 if (log)
1620 log->Printf("Dematerializing persistent variable with flags 0x%hx", var_sp->m_flags);
1621
1622 if ((var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) ||
1623 (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference))
Sean Callanana48fe162010-08-11 03:57:18 +00001624 {
Sean Callanan6a925532011-01-13 08:53:35 +00001625 // Get the location of the target out of the struct.
1626
1627 Error read_error;
Greg Clayton567e7f32011-09-22 04:58:26 +00001628 mem = process->ReadPointerFromMemory (addr, read_error);
Sean Callanan6a925532011-01-13 08:53:35 +00001629
1630 if (mem == LLDB_INVALID_ADDRESS)
1631 {
1632 err.SetErrorStringWithFormat("Couldn't read address of %s from struct: %s", var_sp->GetName().GetCString(), error.AsCString());
1633 return false;
1634 }
1635
1636 if (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference &&
1637 !var_sp->m_live_sp)
1638 {
1639 // If the reference comes from the program, then the ClangExpressionVariable's
1640 // live variable data hasn't been set up yet. Do this now.
1641
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001642 var_sp->m_live_sp = ValueObjectConstResult::Create (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope (),
Jim Ingham47da8102011-04-22 23:53:53 +00001643 var_sp->GetTypeFromUser().GetASTContext(),
1644 var_sp->GetTypeFromUser().GetOpaqueQualType(),
1645 var_sp->GetName(),
1646 mem,
1647 eAddressTypeLoad,
1648 pvar_byte_size);
Sean Callanan6a925532011-01-13 08:53:35 +00001649 }
1650
1651 if (!var_sp->m_live_sp)
1652 {
1653 err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", var_sp->GetName().GetCString());
1654 return false;
1655 }
1656
Greg Claytonb3448432011-03-24 21:19:54 +00001657 if (var_sp->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
Sean Callanan6a925532011-01-13 08:53:35 +00001658 {
1659 err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", var_sp->GetName().GetCString());
1660 return false;
1661 }
1662
Sean Callanan97678d12011-01-13 21:23:32 +00001663 if (var_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry ||
1664 var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
Sean Callanan6a925532011-01-13 08:53:35 +00001665 {
1666 mem = var_sp->m_live_sp->GetValue().GetScalar().ULongLong();
1667
1668 if (log)
Greg Claytonc4b6ab92012-09-20 23:07:44 +00001669 log->Printf("Dematerializing %s from 0x%llx (size = %u)", var_sp->GetName().GetCString(), (uint64_t)mem, (unsigned)pvar_byte_size);
Sean Callanan6a925532011-01-13 08:53:35 +00001670
1671 // Read the contents of the spare memory area
Sean Callanan0ddf8062011-05-09 22:04:36 +00001672
Sean Callanan6a925532011-01-13 08:53:35 +00001673 var_sp->ValueUpdated ();
Greg Clayton567e7f32011-09-22 04:58:26 +00001674 if (process->ReadMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
Sean Callanan6a925532011-01-13 08:53:35 +00001675 {
1676 err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString());
1677 return false;
1678 }
1679
Sean Callanan0ddf8062011-05-09 22:04:36 +00001680 if (stack_frame_top != LLDB_INVALID_ADDRESS &&
1681 stack_frame_bottom != LLDB_INVALID_ADDRESS &&
1682 mem >= stack_frame_bottom &&
1683 mem <= stack_frame_top)
1684 {
1685 // If the variable is resident in the stack frame created by the expression,
1686 // then it cannot be relied upon to stay around. We treat it as needing
1687 // reallocation.
1688
1689 var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
1690 var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
1691 var_sp->m_flags &= ~ClangExpressionVariable::EVIsProgramReference;
1692 }
1693
Sean Callanan6a925532011-01-13 08:53:35 +00001694 var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsFreezeDry;
1695 }
1696
1697 if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation &&
1698 !(var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget))
1699 {
1700 if (m_keep_result_in_memory)
1701 {
1702 var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget;
1703 }
1704 else
1705 {
Greg Clayton567e7f32011-09-22 04:58:26 +00001706 Error deallocate_error = process->DeallocateMemory(mem);
Sean Callanan6a925532011-01-13 08:53:35 +00001707
1708 if (!err.Success())
1709 {
1710 err.SetErrorStringWithFormat ("Couldn't deallocate memory for %s: %s", var_sp->GetName().GetCString(), deallocate_error.AsCString());
1711 return false;
1712 }
1713 }
1714 }
1715 }
1716 else
1717 {
1718 err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
Sean Callanana48fe162010-08-11 03:57:18 +00001719 return false;
1720 }
1721 }
1722 else
1723 {
Sean Callanan6a925532011-01-13 08:53:35 +00001724 if (log)
1725 log->Printf("Materializing persistent variable with flags 0x%hx", var_sp->m_flags);
1726
1727 if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation)
Sean Callanana48fe162010-08-11 03:57:18 +00001728 {
Sean Callanan6a925532011-01-13 08:53:35 +00001729 // Allocate a spare memory area to store the persistent variable's contents.
1730
1731 Error allocate_error;
1732
Greg Clayton567e7f32011-09-22 04:58:26 +00001733 mem = process->AllocateMemory(pvar_byte_size,
Sean Callanan4b3cef02011-10-26 21:20:00 +00001734 lldb::ePermissionsReadable | lldb::ePermissionsWritable,
1735 allocate_error);
Sean Callanan6a925532011-01-13 08:53:35 +00001736
1737 if (mem == LLDB_INVALID_ADDRESS)
1738 {
1739 err.SetErrorStringWithFormat("Couldn't allocate a memory area to store %s: %s", var_sp->GetName().GetCString(), allocate_error.AsCString());
1740 return false;
1741 }
1742
1743 if (log)
1744 log->Printf("Allocated %s (0x%llx) sucessfully", var_sp->GetName().GetCString(), mem);
1745
1746 // Put the location of the spare memory into the live data of the ValueObject.
1747
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001748 var_sp->m_live_sp = ValueObjectConstResult::Create (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(),
Jim Ingham47da8102011-04-22 23:53:53 +00001749 var_sp->GetTypeFromUser().GetASTContext(),
1750 var_sp->GetTypeFromUser().GetOpaqueQualType(),
1751 var_sp->GetName(),
1752 mem,
1753 eAddressTypeLoad,
1754 pvar_byte_size);
Sean Callanan6a925532011-01-13 08:53:35 +00001755
1756 // Clear the flag if the variable will never be deallocated.
1757
1758 if (var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
1759 var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsAllocation;
1760
1761 // Write the contents of the variable to the area.
1762
Greg Clayton567e7f32011-09-22 04:58:26 +00001763 if (process->WriteMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
Sean Callanan6a925532011-01-13 08:53:35 +00001764 {
1765 err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString());
1766 return false;
1767 }
1768 }
1769
1770 if ((var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && var_sp->m_live_sp) ||
1771 var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated)
1772 {
Sean Callanan6a925532011-01-13 08:53:35 +00001773 // Now write the location of the area into the struct.
Sean Callanan6a925532011-01-13 08:53:35 +00001774 Error write_error;
Greg Clayton567e7f32011-09-22 04:58:26 +00001775 if (!process->WriteScalarToMemory (addr,
Sean Callanan4b3cef02011-10-26 21:20:00 +00001776 var_sp->m_live_sp->GetValue().GetScalar(),
1777 process->GetAddressByteSize(),
1778 write_error))
Sean Callanan6a925532011-01-13 08:53:35 +00001779 {
1780 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", var_sp->GetName().GetCString(), write_error.AsCString());
1781 return false;
1782 }
1783
1784 if (log)
Greg Claytonc0fa5332011-05-22 22:46:53 +00001785 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 +00001786 }
Sean Callanan696cf5f2011-05-07 01:06:41 +00001787 else if (!(var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference))
Sean Callanan6a925532011-01-13 08:53:35 +00001788 {
1789 err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
Sean Callanana48fe162010-08-11 03:57:18 +00001790 return false;
1791 }
1792 }
1793
1794 return true;
1795}
1796
Sean Callananf328c9f2010-07-20 23:31:16 +00001797bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001798ClangExpressionDeclMap::DoMaterializeOneVariable
1799(
1800 bool dematerialize,
Greg Clayton8de27c72010-10-15 22:48:33 +00001801 const SymbolContext &sym_ctx,
Sean Callanan6a925532011-01-13 08:53:35 +00001802 ClangExpressionVariableSP &expr_var,
Greg Clayton8de27c72010-10-15 22:48:33 +00001803 lldb::addr_t addr,
1804 Error &err
1805)
Sean Callananf328c9f2010-07-20 23:31:16 +00001806{
Greg Claytone005f2c2010-11-06 01:53:30 +00001807 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001808 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
1809 Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr();
1810 StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
Greg Clayton567e7f32011-09-22 04:58:26 +00001811
Sean Callanan6d284ef2011-10-12 22:20:02 +00001812 if (!frame || !process || !target || !m_parser_vars.get() || !expr_var->m_parser_vars.get())
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001813 {
1814 err.SetErrorString("Necessary state for variable materialization isn't present");
Sean Callanancc074622010-09-14 21:59:34 +00001815 return false;
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001816 }
Sean Callanancc074622010-09-14 21:59:34 +00001817
Sean Callanan6a925532011-01-13 08:53:35 +00001818 // Vital information about the value
1819
1820 const ConstString &name(expr_var->GetName());
1821 TypeFromUser type(expr_var->GetTypeFromUser());
1822
Sean Callanan4a078322011-10-13 00:09:20 +00001823 VariableSP &var(expr_var->m_parser_vars->m_lldb_var);
1824 lldb_private::Symbol *sym(expr_var->m_parser_vars->m_lldb_sym);
Sean Callananf328c9f2010-07-20 23:31:16 +00001825
Sean Callanan6f3bde72011-10-27 19:41:13 +00001826 bool is_reference(expr_var->m_flags & ClangExpressionVariable::EVTypeIsReference);
1827
Sean Callanan81974962011-05-08 02:21:26 +00001828 std::auto_ptr<lldb_private::Value> location_value;
Sean Callanan4a078322011-10-13 00:09:20 +00001829
Sean Callanan81974962011-05-08 02:21:26 +00001830 if (var)
1831 {
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001832 location_value.reset(GetVariableValue(var,
Sean Callanan81974962011-05-08 02:21:26 +00001833 NULL));
1834 }
1835 else if (sym)
Sean Callanan4a078322011-10-13 00:09:20 +00001836 {
Sean Callanan21ef5bb2011-12-01 02:04:16 +00001837 addr_t location_load_addr = GetSymbolAddress(*target, name, lldb::eSymbolTypeAny);
Sean Callanan81974962011-05-08 02:21:26 +00001838
Greg Claytoncbc07cf2011-06-23 04:25:29 +00001839 if (location_load_addr == LLDB_INVALID_ADDRESS)
Sean Callanan81974962011-05-08 02:21:26 +00001840 {
1841 if (log)
Greg Claytonc0fa5332011-05-22 22:46:53 +00001842 err.SetErrorStringWithFormat ("Couldn't find value for global symbol %s",
1843 name.GetCString());
Sean Callanan81974962011-05-08 02:21:26 +00001844 }
1845
Sean Callanan4a078322011-10-13 00:09:20 +00001846 location_value.reset(new Value);
1847
Sean Callanan81974962011-05-08 02:21:26 +00001848 location_value->SetValueType(Value::eValueTypeLoadAddress);
1849 location_value->GetScalar() = location_load_addr;
1850 }
1851 else
Sean Callananf328c9f2010-07-20 23:31:16 +00001852 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001853 err.SetErrorStringWithFormat ("Couldn't find %s with appropriate type",
1854 name.GetCString());
Sean Callananf328c9f2010-07-20 23:31:16 +00001855 return false;
1856 }
1857
Sean Callanan841026f2010-07-23 00:16:21 +00001858 if (log)
Sean Callananfb3058e2011-05-12 23:54:16 +00001859 {
1860 StreamString my_stream_string;
1861
1862 ClangASTType::DumpTypeDescription (type.GetASTContext(),
1863 type.GetOpaqueQualType(),
1864 &my_stream_string);
1865
Greg Claytonc0fa5332011-05-22 22:46:53 +00001866 log->Printf ("%s %s with type %s",
1867 dematerialize ? "Dematerializing" : "Materializing",
1868 name.GetCString(),
1869 my_stream_string.GetString().c_str());
Sean Callananfb3058e2011-05-12 23:54:16 +00001870 }
Sean Callananf328c9f2010-07-20 23:31:16 +00001871
1872 if (!location_value.get())
1873 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001874 err.SetErrorStringWithFormat("Couldn't get value for %s", name.GetCString());
Sean Callananf328c9f2010-07-20 23:31:16 +00001875 return false;
1876 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001877
1878 // The size of the type contained in addr
Sean Callananf328c9f2010-07-20 23:31:16 +00001879
Sean Callanan6a925532011-01-13 08:53:35 +00001880 size_t value_bit_size = ClangASTType::GetClangTypeBitWidth(type.GetASTContext(), type.GetOpaqueQualType());
1881 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 +00001882
1883 Value::ValueType value_type = location_value->GetValueType();
1884
1885 switch (value_type)
Sean Callananf328c9f2010-07-20 23:31:16 +00001886 {
Sean Callanan17c6a052010-10-05 20:18:48 +00001887 default:
Sean Callananf328c9f2010-07-20 23:31:16 +00001888 {
Sean Callanan17c6a052010-10-05 20:18:48 +00001889 StreamString ss;
1890
1891 location_value->Dump(&ss);
1892
Greg Claytonc0fa5332011-05-22 22:46:53 +00001893 err.SetErrorStringWithFormat ("%s has a value of unhandled type: %s",
1894 name.GetCString(),
1895 ss.GetString().c_str());
Sean Callananf328c9f2010-07-20 23:31:16 +00001896 return false;
1897 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001898 break;
1899 case Value::eValueTypeLoadAddress:
Sean Callananf328c9f2010-07-20 23:31:16 +00001900 {
Sean Callanan6a925532011-01-13 08:53:35 +00001901 if (!dematerialize)
Sean Callanan17c6a052010-10-05 20:18:48 +00001902 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001903 Error write_error;
Sean Callanan6a925532011-01-13 08:53:35 +00001904
Sean Callanan6f3bde72011-10-27 19:41:13 +00001905 if (is_reference)
Sean Callanan6a925532011-01-13 08:53:35 +00001906 {
Sean Callanan6f3bde72011-10-27 19:41:13 +00001907 Error read_error;
1908
1909 addr_t ref_value = process->ReadPointerFromMemory(location_value->GetScalar().ULongLong(), read_error);
1910
1911 if (!read_error.Success())
1912 {
1913 err.SetErrorStringWithFormat ("Couldn't read reference to %s from the target: %s",
1914 name.GetCString(),
1915 read_error.AsCString());
1916 return false;
1917 }
1918
1919 if (!process->WritePointerToMemory(addr,
1920 ref_value,
1921 write_error))
1922 {
1923 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
1924 name.GetCString(),
1925 write_error.AsCString());
1926 return false;
1927 }
1928 }
1929 else
1930 {
1931 if (!process->WriteScalarToMemory (addr,
1932 location_value->GetScalar(),
1933 process->GetAddressByteSize(),
1934 write_error))
1935 {
1936 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
1937 name.GetCString(),
1938 write_error.AsCString());
1939 return false;
1940 }
Sean Callanan6a925532011-01-13 08:53:35 +00001941 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001942 }
Sean Callananf328c9f2010-07-20 23:31:16 +00001943 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001944 break;
1945 case Value::eValueTypeScalar:
1946 {
Greg Clayton6916e352010-11-13 03:52:47 +00001947 if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
Sean Callanan17c6a052010-10-05 20:18:48 +00001948 {
1949 StreamString ss;
Sean Callanan17c6a052010-10-05 20:18:48 +00001950 location_value->Dump(&ss);
1951
Greg Claytonc0fa5332011-05-22 22:46:53 +00001952 err.SetErrorStringWithFormat ("%s is a scalar of unhandled type: %s",
1953 name.GetCString(),
1954 ss.GetString().c_str());
Sean Callanan17c6a052010-10-05 20:18:48 +00001955 return false;
1956 }
1957
Greg Clayton061b79d2011-05-09 20:18:18 +00001958 RegisterInfo *reg_info = location_value->GetRegisterInfo();
Sean Callanan17c6a052010-10-05 20:18:48 +00001959
Greg Clayton061b79d2011-05-09 20:18:18 +00001960 if (!reg_info)
Sean Callanan17c6a052010-10-05 20:18:48 +00001961 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001962 err.SetErrorStringWithFormat ("Couldn't get the register information for %s",
1963 name.GetCString());
Sean Callanan17c6a052010-10-05 20:18:48 +00001964 return false;
1965 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001966
Greg Clayton061b79d2011-05-09 20:18:18 +00001967 RegisterValue reg_value;
1968
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001969 RegisterContext *reg_ctx = m_parser_vars->m_exe_ctx.GetRegisterContext();
Greg Clayton061b79d2011-05-09 20:18:18 +00001970
1971 if (!reg_ctx)
Sean Callanan17c6a052010-10-05 20:18:48 +00001972 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001973 err.SetErrorStringWithFormat ("Couldn't read register context to read %s from %s",
1974 name.GetCString(),
1975 reg_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001976 return false;
1977 }
1978
Greg Clayton061b79d2011-05-09 20:18:18 +00001979 uint32_t register_byte_size = reg_info->byte_size;
Sean Callanan17c6a052010-10-05 20:18:48 +00001980
1981 if (dematerialize)
1982 {
Sean Callanan6f3bde72011-10-27 19:41:13 +00001983 if (is_reference)
1984 return true; // reference types don't need demateralizing
1985
Sean Callanan6a925532011-01-13 08:53:35 +00001986 // Get the location of the spare memory area out of the variable's live data.
1987
1988 if (!expr_var->m_live_sp)
1989 {
1990 err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", name.GetCString());
1991 return false;
1992 }
1993
Greg Claytonb3448432011-03-24 21:19:54 +00001994 if (expr_var->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
Sean Callanan6a925532011-01-13 08:53:35 +00001995 {
1996 err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", name.GetCString());
1997 return false;
1998 }
1999
Greg Claytonc0fa5332011-05-22 22:46:53 +00002000 Scalar &reg_addr = expr_var->m_live_sp->GetValue().GetScalar();
Sean Callanan6a925532011-01-13 08:53:35 +00002001
Greg Claytonc0fa5332011-05-22 22:46:53 +00002002 err = reg_ctx->ReadRegisterValueFromMemory (reg_info,
2003 reg_addr.ULongLong(),
2004 value_byte_size,
2005 reg_value);
Greg Clayton061b79d2011-05-09 20:18:18 +00002006 if (err.Fail())
Sean Callanan17c6a052010-10-05 20:18:48 +00002007 return false;
Greg Clayton061b79d2011-05-09 20:18:18 +00002008
2009 if (!reg_ctx->WriteRegister (reg_info, reg_value))
Sean Callanan17c6a052010-10-05 20:18:48 +00002010 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00002011 err.SetErrorStringWithFormat ("Couldn't write %s to register %s",
2012 name.GetCString(),
2013 reg_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00002014 return false;
2015 }
Sean Callanan6a925532011-01-13 08:53:35 +00002016
2017 // Deallocate the spare area and clear the variable's live data.
2018
Greg Clayton567e7f32011-09-22 04:58:26 +00002019 Error deallocate_error = process->DeallocateMemory(reg_addr.ULongLong());
Sean Callanan6a925532011-01-13 08:53:35 +00002020
2021 if (!deallocate_error.Success())
2022 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00002023 err.SetErrorStringWithFormat ("Couldn't deallocate spare memory area for %s: %s",
2024 name.GetCString(),
2025 deallocate_error.AsCString());
Sean Callanan6a925532011-01-13 08:53:35 +00002026 return false;
2027 }
2028
2029 expr_var->m_live_sp.reset();
Sean Callanan17c6a052010-10-05 20:18:48 +00002030 }
2031 else
2032 {
Sean Callanan6f3bde72011-10-27 19:41:13 +00002033 Error write_error;
2034
2035 RegisterValue reg_value;
2036
2037 if (!reg_ctx->ReadRegister (reg_info, reg_value))
2038 {
2039 err.SetErrorStringWithFormat ("Couldn't read %s from %s",
2040 name.GetCString(),
2041 reg_info->name);
2042 return false;
2043 }
2044
2045 if (is_reference)
2046 {
2047 write_error = reg_ctx->WriteRegisterValueToMemory(reg_info,
2048 addr,
2049 process->GetAddressByteSize(),
2050 reg_value);
2051
2052 if (!write_error.Success())
2053 {
2054 err.SetErrorStringWithFormat ("Couldn't write %s from register %s to the target: %s",
2055 name.GetCString(),
2056 reg_info->name,
2057 write_error.AsCString());
2058 return false;
2059 }
2060
2061 return true;
2062 }
2063
Sean Callanan6a925532011-01-13 08:53:35 +00002064 // Allocate a spare memory area to place the register's contents into. This memory area will be pointed to by the slot in the
2065 // struct.
2066
2067 Error allocate_error;
2068
Greg Clayton567e7f32011-09-22 04:58:26 +00002069 Scalar reg_addr (process->AllocateMemory (value_byte_size,
Sean Callanan6f3bde72011-10-27 19:41:13 +00002070 lldb::ePermissionsReadable | lldb::ePermissionsWritable,
2071 allocate_error));
Sean Callanan6a925532011-01-13 08:53:35 +00002072
Greg Claytonc0fa5332011-05-22 22:46:53 +00002073 if (reg_addr.ULongLong() == LLDB_INVALID_ADDRESS)
Sean Callanan6a925532011-01-13 08:53:35 +00002074 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00002075 err.SetErrorStringWithFormat ("Couldn't allocate a memory area to store %s: %s",
2076 name.GetCString(),
2077 allocate_error.AsCString());
Sean Callanan6a925532011-01-13 08:53:35 +00002078 return false;
2079 }
2080
2081 // Put the location of the spare memory into the live data of the ValueObject.
2082
Sean Callanandd1dcfd2012-02-10 01:22:05 +00002083 expr_var->m_live_sp = ValueObjectConstResult::Create (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(),
Jim Ingham47da8102011-04-22 23:53:53 +00002084 type.GetASTContext(),
2085 type.GetOpaqueQualType(),
2086 name,
Greg Claytonc0fa5332011-05-22 22:46:53 +00002087 reg_addr.ULongLong(),
Jim Ingham47da8102011-04-22 23:53:53 +00002088 eAddressTypeLoad,
2089 value_byte_size);
Sean Callanan6a925532011-01-13 08:53:35 +00002090
2091 // Now write the location of the area into the struct.
Sean Callanan6f3bde72011-10-27 19:41:13 +00002092
Greg Clayton567e7f32011-09-22 04:58:26 +00002093 if (!process->WriteScalarToMemory (addr,
Sean Callanan6f3bde72011-10-27 19:41:13 +00002094 reg_addr,
2095 process->GetAddressByteSize(),
2096 write_error))
Sean Callanan6a925532011-01-13 08:53:35 +00002097 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00002098 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
2099 name.GetCString(),
2100 write_error.AsCString());
Sean Callanan6a925532011-01-13 08:53:35 +00002101 return false;
2102 }
2103
Sean Callanan6a925532011-01-13 08:53:35 +00002104 if (value_byte_size > register_byte_size)
Sean Callanan17c6a052010-10-05 20:18:48 +00002105 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00002106 err.SetErrorStringWithFormat ("%s is too big to store in %s",
2107 name.GetCString(),
2108 reg_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00002109 return false;
2110 }
Greg Clayton061b79d2011-05-09 20:18:18 +00002111
Greg Clayton061b79d2011-05-09 20:18:18 +00002112 if (!reg_ctx->ReadRegister (reg_info, reg_value))
Sean Callanan17c6a052010-10-05 20:18:48 +00002113 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00002114 err.SetErrorStringWithFormat ("Couldn't read %s from %s",
2115 name.GetCString(),
2116 reg_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00002117 return false;
2118 }
2119
Greg Claytonc0fa5332011-05-22 22:46:53 +00002120 err = reg_ctx->WriteRegisterValueToMemory (reg_info,
2121 reg_addr.ULongLong(),
2122 value_byte_size,
2123 reg_value);
Greg Clayton061b79d2011-05-09 20:18:18 +00002124 if (err.Fail())
Sean Callanan17c6a052010-10-05 20:18:48 +00002125 return false;
Sean Callanan17c6a052010-10-05 20:18:48 +00002126 }
2127 }
Sean Callananf328c9f2010-07-20 23:31:16 +00002128 }
2129
2130 return true;
Sean Callanan810f22d2010-07-16 00:09:46 +00002131}
2132
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002133bool
2134ClangExpressionDeclMap::DoMaterializeOneRegister
2135(
2136 bool dematerialize,
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002137 RegisterContext &reg_ctx,
Greg Claytonb3448432011-03-24 21:19:54 +00002138 const RegisterInfo &reg_info,
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002139 lldb::addr_t addr,
2140 Error &err
2141)
2142{
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002143 uint32_t register_byte_size = reg_info.byte_size;
Greg Clayton061b79d2011-05-09 20:18:18 +00002144 RegisterValue reg_value;
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002145 if (dematerialize)
2146 {
Greg Clayton061b79d2011-05-09 20:18:18 +00002147 Error read_error (reg_ctx.ReadRegisterValueFromMemory(&reg_info, addr, register_byte_size, reg_value));
2148 if (read_error.Fail())
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002149 {
Greg Claytonbdcb6ab2011-01-25 23:55:37 +00002150 err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", reg_info.name, read_error.AsCString());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002151 return false;
2152 }
2153
Greg Clayton061b79d2011-05-09 20:18:18 +00002154 if (!reg_ctx.WriteRegister (&reg_info, reg_value))
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002155 {
Greg Clayton061b79d2011-05-09 20:18:18 +00002156 err.SetErrorStringWithFormat("Couldn't write register %s (dematerialize)", reg_info.name);
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002157 return false;
2158 }
2159 }
2160 else
2161 {
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002162
Greg Clayton061b79d2011-05-09 20:18:18 +00002163 if (!reg_ctx.ReadRegister(&reg_info, reg_value))
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002164 {
Greg Clayton061b79d2011-05-09 20:18:18 +00002165 err.SetErrorStringWithFormat("Couldn't read %s (materialize)", reg_info.name);
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002166 return false;
2167 }
2168
Greg Clayton061b79d2011-05-09 20:18:18 +00002169 Error write_error (reg_ctx.WriteRegisterValueToMemory(&reg_info, addr, register_byte_size, reg_value));
2170 if (write_error.Fail())
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002171 {
Jason Molenda95b7b432011-09-20 00:26:08 +00002172 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", reg_info.name, write_error.AsCString());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002173 return false;
2174 }
2175 }
2176
2177 return true;
2178}
2179
Sean Callanan696cf5f2011-05-07 01:06:41 +00002180lldb::VariableSP
Greg Clayton8de27c72010-10-15 22:48:33 +00002181ClangExpressionDeclMap::FindVariableInScope
2182(
2183 StackFrame &frame,
2184 const ConstString &name,
Sean Callanan70c6cf42012-02-18 02:01:03 +00002185 TypeFromUser *type,
Sean Callanan39d1af92012-05-21 21:29:52 +00002186 bool object_pointer
Greg Clayton8de27c72010-10-15 22:48:33 +00002187)
Sean Callananaa301c42010-12-03 01:38:59 +00002188{
Greg Claytone005f2c2010-11-06 01:53:30 +00002189 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanancc074622010-09-14 21:59:34 +00002190
Sean Callananf8b468e2011-08-06 00:28:14 +00002191 ValueObjectSP valobj;
2192 VariableSP var_sp;
2193 Error err;
Sean Callanancc074622010-09-14 21:59:34 +00002194
Sean Callananf8b468e2011-08-06 00:28:14 +00002195 valobj = frame.GetValueForVariableExpressionPath(name.GetCString(),
2196 eNoDynamicValues,
2197 StackFrame::eExpressionPathOptionCheckPtrVsMember,
2198 var_sp,
2199 err);
Greg Clayton3bc52d02010-11-14 22:13:40 +00002200
Sean Callananf8b468e2011-08-06 00:28:14 +00002201 if (!err.Success() ||
2202 !var_sp ||
Sean Callananae9f7482011-07-07 23:05:43 +00002203 !var_sp->IsInScope(&frame) ||
2204 !var_sp->LocationIsValidForFrame (&frame))
2205 return lldb::VariableSP();
Greg Clayton3bc52d02010-11-14 22:13:40 +00002206
Sean Callanan42072962012-05-21 22:25:52 +00002207 if (var_sp)
Greg Clayton3bc52d02010-11-14 22:13:40 +00002208 {
Sean Callanan42072962012-05-21 22:25:52 +00002209 if (!type)
2210 return var_sp;
2211
Sean Callanan39d1af92012-05-21 21:29:52 +00002212 TypeFromUser candidate_type(var_sp->GetType()->GetClangFullType(),
2213 var_sp->GetType()->GetClangAST());
2214
2215 if (candidate_type.GetASTContext() != type->GetASTContext())
Greg Clayton3bc52d02010-11-14 22:13:40 +00002216 {
2217 if (log)
2218 log->PutCString("Skipping a candidate variable because of different AST contexts");
Sean Callanan696cf5f2011-05-07 01:06:41 +00002219 return lldb::VariableSP();
Greg Clayton3bc52d02010-11-14 22:13:40 +00002220 }
Sean Callanan39d1af92012-05-21 21:29:52 +00002221
2222 if (object_pointer)
2223 {
2224 clang::QualType desired_qual_type = clang::QualType::getFromOpaquePtr(type->GetOpaqueQualType());
2225 clang::QualType candidate_qual_type = clang::QualType::getFromOpaquePtr(candidate_type.GetOpaqueQualType());
2226
Sean Callanan42072962012-05-21 22:25:52 +00002227 const clang::ObjCObjectPointerType *desired_objc_ptr_type = desired_qual_type->getAs<clang::ObjCObjectPointerType>();
2228 const clang::ObjCObjectPointerType *candidate_objc_ptr_type = desired_qual_type->getAs<clang::ObjCObjectPointerType>();
2229
2230 if (desired_objc_ptr_type && candidate_objc_ptr_type) {
2231 clang::QualType desired_target_type = desired_objc_ptr_type->getPointeeType().getUnqualifiedType();
2232 clang::QualType candidate_target_type = candidate_objc_ptr_type->getPointeeType().getUnqualifiedType();
2233
2234 if (ClangASTContext::AreTypesSame(type->GetASTContext(),
2235 desired_target_type.getAsOpaquePtr(),
2236 candidate_target_type.getAsOpaquePtr()))
2237 return var_sp;
2238 }
2239
Sean Callanan39d1af92012-05-21 21:29:52 +00002240 const clang::PointerType *desired_ptr_type = desired_qual_type->getAs<clang::PointerType>();
2241 const clang::PointerType *candidate_ptr_type = candidate_qual_type->getAs<clang::PointerType>();
2242
Sean Callanan42072962012-05-21 22:25:52 +00002243 if (desired_ptr_type && candidate_ptr_type) {
2244 clang::QualType desired_target_type = desired_ptr_type->getPointeeType().getUnqualifiedType();
2245 clang::QualType candidate_target_type = candidate_ptr_type->getPointeeType().getUnqualifiedType();
2246
2247 if (ClangASTContext::AreTypesSame(type->GetASTContext(),
2248 desired_target_type.getAsOpaquePtr(),
2249 candidate_target_type.getAsOpaquePtr()))
2250 return var_sp;
2251 }
Sean Callanan39d1af92012-05-21 21:29:52 +00002252
Sean Callanan42072962012-05-21 22:25:52 +00002253 return lldb::VariableSP();
Sean Callanan39d1af92012-05-21 21:29:52 +00002254 }
2255 else
2256 {
Sean Callanan42072962012-05-21 22:25:52 +00002257 if (ClangASTContext::AreTypesSame(type->GetASTContext(),
Sean Callanan39d1af92012-05-21 21:29:52 +00002258 type->GetOpaqueQualType(),
2259 var_sp->GetType()->GetClangFullType()))
Sean Callanan42072962012-05-21 22:25:52 +00002260 return var_sp;
Sean Callanan39d1af92012-05-21 21:29:52 +00002261 }
Sean Callanancc074622010-09-14 21:59:34 +00002262 }
Greg Clayton3bc52d02010-11-14 22:13:40 +00002263
Sean Callanan42072962012-05-21 22:25:52 +00002264 return lldb::VariableSP();
Sean Callanancc074622010-09-14 21:59:34 +00002265}
Sean Callanan336a0002010-07-17 00:43:37 +00002266
Sean Callanan81974962011-05-08 02:21:26 +00002267Symbol *
2268ClangExpressionDeclMap::FindGlobalDataSymbol
2269(
2270 Target &target,
Sean Callananaa4a5532011-10-13 16:49:47 +00002271 const ConstString &name
Sean Callanan81974962011-05-08 02:21:26 +00002272)
2273{
2274 SymbolContextList sc_list;
2275
Sean Callananaa4a5532011-10-13 16:49:47 +00002276 target.GetImages().FindSymbolsWithNameAndType(name,
2277 eSymbolTypeData,
2278 sc_list);
Sean Callanan81974962011-05-08 02:21:26 +00002279
2280 if (sc_list.GetSize())
2281 {
2282 SymbolContext sym_ctx;
2283 sc_list.GetContextAtIndex(0, sym_ctx);
2284
2285 return sym_ctx.symbol;
2286 }
2287
2288 return NULL;
2289}
2290
Sean Callanan47dc4572011-09-15 02:13:07 +00002291lldb::VariableSP
2292ClangExpressionDeclMap::FindGlobalVariable
2293(
2294 Target &target,
Sean Callanan94cd0ca2011-10-12 16:59:31 +00002295 ModuleSP &module,
2296 const ConstString &name,
2297 ClangNamespaceDecl *namespace_decl,
Sean Callanan47dc4572011-09-15 02:13:07 +00002298 TypeFromUser *type
2299)
2300{
2301 VariableList vars;
Sean Callanan47dc4572011-09-15 02:13:07 +00002302
Sean Callanan94cd0ca2011-10-12 16:59:31 +00002303 if (module && namespace_decl)
2304 module->FindGlobalVariables (name, namespace_decl, true, -1, vars);
2305 else
2306 target.GetImages().FindGlobalVariables(name, true, -1, vars);
Sean Callanan47dc4572011-09-15 02:13:07 +00002307
2308 if (vars.GetSize())
2309 {
2310 if (type)
2311 {
2312 for (size_t i = 0; i < vars.GetSize(); ++i)
2313 {
2314 VariableSP var_sp = vars.GetVariableAtIndex(i);
2315
2316 if (type->GetASTContext() == var_sp->GetType()->GetClangAST())
2317 {
2318 if (ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType()))
2319 return var_sp;
2320 }
2321 }
2322 }
2323 else
2324 {
2325 return vars.GetVariableAtIndex(0);
2326 }
2327 }
2328
2329 return VariableSP();
2330}
2331
Chris Lattner24943d22010-06-08 16:52:24 +00002332// Interface for ClangASTSource
Sean Callanan47dc4572011-09-15 02:13:07 +00002333
Sean Callanan16b53ab2011-10-12 00:12:34 +00002334void
Sean Callananf76afff2011-10-28 23:38:38 +00002335ClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context)
Chris Lattner24943d22010-06-08 16:52:24 +00002336{
Sean Callananf76afff2011-10-28 23:38:38 +00002337 assert (m_ast_context);
2338
2339 const ConstString name(context.m_decl_name.getAsString().c_str());
2340
Greg Claytone005f2c2010-11-06 01:53:30 +00002341 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Chris Lattner24943d22010-06-08 16:52:24 +00002342
Sean Callanan9394b5a2011-10-29 19:50:43 +00002343 if (GetImportInProgress())
Sean Callananee8fc722010-11-19 20:20:02 +00002344 {
Sean Callanan67bbb112011-10-14 20:34:21 +00002345 if (log && log->GetVerbose())
Sean Callananee8fc722010-11-19 20:20:02 +00002346 log->Printf("Ignoring a query during an import");
2347 return;
2348 }
Greg Claytone6d72ca2011-06-25 00:44:06 +00002349
Sean Callanan67bbb112011-10-14 20:34:21 +00002350 static unsigned int invocation_id = 0;
2351 unsigned int current_id = invocation_id++;
2352
Sean Callanan16b53ab2011-10-12 00:12:34 +00002353 if (log)
2354 {
2355 if (!context.m_decl_context)
Sean Callanan9394b5a2011-10-29 19:50:43 +00002356 log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in a NULL DeclContext", current_id, name.GetCString());
Sean Callanan16b53ab2011-10-12 00:12:34 +00002357 else if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context.m_decl_context))
Sean Callanan9394b5a2011-10-29 19:50:43 +00002358 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 +00002359 else
Sean Callanan9394b5a2011-10-29 19:50:43 +00002360 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 +00002361 }
Sean Callanan9394b5a2011-10-29 19:50:43 +00002362
Sean Callanan16b53ab2011-10-12 00:12:34 +00002363 if (const NamespaceDecl *namespace_context = dyn_cast<NamespaceDecl>(context.m_decl_context))
2364 {
Sean Callanan73b520f2011-10-29 01:58:46 +00002365 ClangASTImporter::NamespaceMapSP namespace_map = m_ast_importer->GetNamespaceMap(namespace_context);
Sean Callanana7597062011-10-13 21:08:11 +00002366
Sean Callanan67bbb112011-10-14 20:34:21 +00002367 if (log && log->GetVerbose())
Sean Callanan5a55c7a2011-11-18 03:28:09 +00002368 log->Printf(" CEDM::FEVD[%u] Inspecting (NamespaceMap*)%p (%d entries)",
Sean Callanan67bbb112011-10-14 20:34:21 +00002369 current_id,
2370 namespace_map.get(),
2371 (int)namespace_map->size());
Sean Callanana7597062011-10-13 21:08:11 +00002372
Sean Callanana7cb1fa2011-10-21 22:18:07 +00002373 if (!namespace_map)
2374 return;
2375
Sean Callanan16b53ab2011-10-12 00:12:34 +00002376 for (ClangASTImporter::NamespaceMap::iterator i = namespace_map->begin(), e = namespace_map->end();
2377 i != e;
2378 ++i)
2379 {
2380 if (log)
Sean Callanan9394b5a2011-10-29 19:50:43 +00002381 log->Printf(" CEDM::FEVD[%u] Searching namespace %s in module %s",
Sean Callanan67bbb112011-10-14 20:34:21 +00002382 current_id,
Sean Callanan16b53ab2011-10-12 00:12:34 +00002383 i->second.GetNamespaceDecl()->getNameAsString().c_str(),
2384 i->first->GetFileSpec().GetFilename().GetCString());
2385
Sean Callananc839adc2011-10-13 21:50:33 +00002386 FindExternalVisibleDecls(context,
2387 i->first,
2388 i->second,
Sean Callanan67bbb112011-10-14 20:34:21 +00002389 current_id);
Sean Callanan16b53ab2011-10-12 00:12:34 +00002390 }
2391 }
Sean Callanane6ea5fe2011-11-15 02:11:17 +00002392 else if (isa<TranslationUnitDecl>(context.m_decl_context))
Sean Callanan16b53ab2011-10-12 00:12:34 +00002393 {
2394 ClangNamespaceDecl namespace_decl;
2395
2396 if (log)
Sean Callanan9394b5a2011-10-29 19:50:43 +00002397 log->Printf(" CEDM::FEVD[%u] Searching the root namespace", current_id);
Sean Callanan16b53ab2011-10-12 00:12:34 +00002398
2399 FindExternalVisibleDecls(context,
2400 lldb::ModuleSP(),
2401 namespace_decl,
Sean Callanan67bbb112011-10-14 20:34:21 +00002402 current_id);
Sean Callanan16b53ab2011-10-12 00:12:34 +00002403 }
Sean Callanana7597062011-10-13 21:08:11 +00002404
Sean Callanan9394b5a2011-10-29 19:50:43 +00002405 if (!context.m_found.variable)
2406 ClangASTSource::FindExternalVisibleDecls(context);
Sean Callanan16b53ab2011-10-12 00:12:34 +00002407}
2408
2409void
2410ClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context,
Sean Callanan38d084f2011-10-12 18:44:30 +00002411 lldb::ModuleSP module_sp,
Sean Callanan03f64ca2011-10-12 01:39:28 +00002412 ClangNamespaceDecl &namespace_decl,
Sean Callanan67bbb112011-10-14 20:34:21 +00002413 unsigned int current_id)
Sean Callanan16b53ab2011-10-12 00:12:34 +00002414{
Sean Callananf76afff2011-10-28 23:38:38 +00002415 assert (m_ast_context);
Sean Callanan16b53ab2011-10-12 00:12:34 +00002416
2417 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan9394b5a2011-10-29 19:50:43 +00002418
Greg Claytone5748d82010-11-09 23:46:37 +00002419 SymbolContextList sc_list;
Chris Lattner24943d22010-06-08 16:52:24 +00002420
Sean Callanan9394b5a2011-10-29 19:50:43 +00002421 const ConstString name(context.m_decl_name.getAsString().c_str());
2422
Greg Clayton3bc52d02010-11-14 22:13:40 +00002423 const char *name_unique_cstr = name.GetCString();
2424
2425 if (name_unique_cstr == NULL)
2426 return;
Sean Callanan9394b5a2011-10-29 19:50:43 +00002427
Sean Callanan8f2e3922012-02-04 08:49:35 +00002428 static ConstString id_name("id");
2429 static ConstString Class_name("Class");
2430
2431 if (name == id_name || name == Class_name)
2432 return;
2433
Greg Clayton8de27c72010-10-15 22:48:33 +00002434 // Only look for functions by name out in our symbols if the function
2435 // doesn't start with our phony prefix of '$'
Sean Callanandd1dcfd2012-02-10 01:22:05 +00002436 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
2437 StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
Sean Callanan03f64ca2011-10-12 01:39:28 +00002438 if (name_unique_cstr[0] == '$' && !namespace_decl)
2439 {
2440 static ConstString g_lldb_class_name ("$__lldb_class");
2441
2442 if (name == g_lldb_class_name)
2443 {
2444 // Clang is looking for the type of "this"
Sean Callanan75ed99e2012-02-08 03:45:08 +00002445
2446 if (frame == NULL)
Sean Callanan03f64ca2011-10-12 01:39:28 +00002447 return;
2448
Sean Callanan75ed99e2012-02-08 03:45:08 +00002449 SymbolContext sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction);
Sean Callanan03f64ca2011-10-12 01:39:28 +00002450
Sean Callanan75ed99e2012-02-08 03:45:08 +00002451 if (!sym_ctx.function)
Sean Callanan03f64ca2011-10-12 01:39:28 +00002452 return;
2453
Greg Claytonb3a1a2b2012-07-14 00:53:55 +00002454 // Get the block that defines the function
2455 Block *function_block = sym_ctx.GetFunctionBlock();
2456
2457 if (!function_block)
2458 return;
2459
2460 clang::DeclContext *decl_context = function_block->GetClangDeclContext();
Sean Callanan75ed99e2012-02-08 03:45:08 +00002461
2462 if (!decl_context)
Sean Callanan03f64ca2011-10-12 01:39:28 +00002463 return;
2464
Sean Callanan75ed99e2012-02-08 03:45:08 +00002465 clang::CXXMethodDecl *method_decl = llvm::dyn_cast<clang::CXXMethodDecl>(decl_context);
Sean Callanan03f64ca2011-10-12 01:39:28 +00002466
Sean Callanan75ed99e2012-02-08 03:45:08 +00002467 if (!method_decl)
Sean Callanan03f64ca2011-10-12 01:39:28 +00002468 return;
2469
Sean Callanan75ed99e2012-02-08 03:45:08 +00002470 clang::CXXRecordDecl *class_decl = method_decl->getParent();
Sean Callanan03f64ca2011-10-12 01:39:28 +00002471
Sean Callanan75ed99e2012-02-08 03:45:08 +00002472 QualType class_qual_type(class_decl->getTypeForDecl(), 0);
Sean Callanan03f64ca2011-10-12 01:39:28 +00002473
Sean Callanan75ed99e2012-02-08 03:45:08 +00002474 TypeFromUser class_user_type (class_qual_type.getAsOpaquePtr(),
2475 &class_decl->getASTContext());
Sean Callanan03f64ca2011-10-12 01:39:28 +00002476
2477 if (log)
2478 {
Sean Callanan75ed99e2012-02-08 03:45:08 +00002479 ASTDumper ast_dumper(class_qual_type);
Sean Callanan9394b5a2011-10-29 19:50:43 +00002480 log->Printf(" CEDM::FEVD[%u] Adding type for $__lldb_class: %s", current_id, ast_dumper.GetCString());
Sean Callanan03f64ca2011-10-12 01:39:28 +00002481 }
2482
Sean Callanane3737fd2011-10-18 16:46:55 +00002483 AddOneType(context, class_user_type, current_id, true);
Sean Callanan03f64ca2011-10-12 01:39:28 +00002484
Sean Callananbd618772012-03-05 22:08:20 +00002485 if (method_decl->isInstance())
2486 {
2487 // self is a pointer to the object
2488
2489 QualType class_pointer_type = method_decl->getASTContext().getPointerType(class_qual_type);
2490
2491 TypeFromUser self_user_type(class_pointer_type.getAsOpaquePtr(),
2492 &method_decl->getASTContext());
2493
2494 m_struct_vars->m_object_pointer_type = self_user_type;
2495 }
2496
Sean Callanan03f64ca2011-10-12 01:39:28 +00002497 return;
2498 }
2499
2500 static ConstString g_lldb_objc_class_name ("$__lldb_objc_class");
2501 if (name == g_lldb_objc_class_name)
2502 {
2503 // Clang is looking for the type of "*self"
2504
2505 if (!frame)
2506 return;
Sean Callanane6ea5fe2011-11-15 02:11:17 +00002507
2508 SymbolContext sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction);
2509
2510 if (!sym_ctx.function)
2511 return;
2512
Greg Claytonb3a1a2b2012-07-14 00:53:55 +00002513 // Get the block that defines the function
2514 Block *function_block = sym_ctx.GetFunctionBlock();
Sean Callanane6ea5fe2011-11-15 02:11:17 +00002515
Greg Claytonb3a1a2b2012-07-14 00:53:55 +00002516 if (!function_block)
2517 return;
2518
2519 clang::DeclContext *decl_context = function_block->GetClangDeclContext();
Sean Callanane6ea5fe2011-11-15 02:11:17 +00002520
2521 if (!decl_context)
2522 return;
2523
2524 clang::ObjCMethodDecl *method_decl = llvm::dyn_cast<clang::ObjCMethodDecl>(decl_context);
2525
2526 if (!method_decl)
2527 return;
2528
2529 ObjCInterfaceDecl* self_interface = method_decl->getClassInterface();
2530
2531 if (!self_interface)
2532 return;
2533
2534 const clang::Type *interface_type = self_interface->getTypeForDecl();
2535
2536 TypeFromUser class_user_type(QualType(interface_type, 0).getAsOpaquePtr(),
2537 &method_decl->getASTContext());
2538
2539 if (log)
2540 {
2541 ASTDumper ast_dumper(interface_type);
2542 log->Printf(" FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, ast_dumper.GetCString());
2543 }
2544
2545 AddOneType(context, class_user_type, current_id, false);
Sean Callanan03f64ca2011-10-12 01:39:28 +00002546
Sean Callanan75ed99e2012-02-08 03:45:08 +00002547#if 0
Sean Callanan03f64ca2011-10-12 01:39:28 +00002548 VariableList *vars = frame->GetVariableList(false);
2549
Sean Callanan03f64ca2011-10-12 01:39:28 +00002550 lldb::VariableSP self_var = vars->FindVariable(ConstString("self"));
2551
Sean Callanan75ed99e2012-02-08 03:45:08 +00002552 if (self_var &&
2553 self_var->IsInScope(frame) &&
2554 self_var->LocationIsValidForFrame (frame)) {
2555 Type *self_type = self_var->GetType();
2556
2557 if (!self_type)
2558 return;
2559
2560 TypeFromUser self_user_type(self_type->GetClangFullType(),
2561 self_type->GetClangAST());
2562 }
2563#endif
Sean Callanan03f64ca2011-10-12 01:39:28 +00002564
Sean Callanan75ed99e2012-02-08 03:45:08 +00002565 if (method_decl->isInstanceMethod())
2566 {
2567 // self is a pointer to the object
2568
2569 QualType class_pointer_type = method_decl->getASTContext().getObjCObjectPointerType(QualType(interface_type, 0));
Sean Callanan03f64ca2011-10-12 01:39:28 +00002570
Sean Callanan75ed99e2012-02-08 03:45:08 +00002571 TypeFromUser self_user_type(class_pointer_type.getAsOpaquePtr(),
2572 &method_decl->getASTContext());
Sean Callanan03f64ca2011-10-12 01:39:28 +00002573
Sean Callanan75ed99e2012-02-08 03:45:08 +00002574 m_struct_vars->m_object_pointer_type = self_user_type;
2575 }
2576 else
2577 {
2578 // self is a Class pointer
2579 QualType class_type = method_decl->getASTContext().getObjCClassType();
2580
2581 TypeFromUser self_user_type(class_type.getAsOpaquePtr(),
2582 &method_decl->getASTContext());
2583
2584 m_struct_vars->m_object_pointer_type = self_user_type;
2585 }
2586
Sean Callanan03f64ca2011-10-12 01:39:28 +00002587 return;
2588 }
2589
2590 // any other $__lldb names should be weeded out now
2591 if (!::strncmp(name_unique_cstr, "$__lldb", sizeof("$__lldb") - 1))
2592 return;
2593
2594 do
2595 {
2596 if (!target)
2597 break;
2598
2599 ClangASTContext *scratch_clang_ast_context = target->GetScratchClangASTContext();
2600
2601 if (!scratch_clang_ast_context)
2602 break;
2603
2604 ASTContext *scratch_ast_context = scratch_clang_ast_context->getASTContext();
2605
2606 if (!scratch_ast_context)
2607 break;
2608
2609 TypeDecl *ptype_type_decl = m_parser_vars->m_persistent_vars->GetPersistentType(name);
2610
2611 if (!ptype_type_decl)
2612 break;
2613
Sean Callanane1301a62011-12-06 03:41:14 +00002614 Decl *parser_ptype_decl = m_ast_importer->CopyDecl(m_ast_context, scratch_ast_context, ptype_type_decl);
Sean Callanan03f64ca2011-10-12 01:39:28 +00002615
2616 if (!parser_ptype_decl)
2617 break;
2618
2619 TypeDecl *parser_ptype_type_decl = dyn_cast<TypeDecl>(parser_ptype_decl);
2620
2621 if (!parser_ptype_type_decl)
2622 break;
2623
2624 if (log)
Sean Callanan9394b5a2011-10-29 19:50:43 +00002625 log->Printf(" CEDM::FEVD[%u] Found persistent type %s", current_id, name.GetCString());
Sean Callanan03f64ca2011-10-12 01:39:28 +00002626
2627 context.AddNamedDecl(parser_ptype_type_decl);
2628 } while (0);
2629
2630 ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name));
2631
2632 if (pvar_sp)
2633 {
Sean Callanan67bbb112011-10-14 20:34:21 +00002634 AddOneVariable(context, pvar_sp, current_id);
Sean Callanan03f64ca2011-10-12 01:39:28 +00002635 return;
2636 }
2637
2638 const char *reg_name(&name.GetCString()[1]);
2639
Sean Callanandd1dcfd2012-02-10 01:22:05 +00002640 if (m_parser_vars->m_exe_ctx.GetRegisterContext())
Sean Callanan03f64ca2011-10-12 01:39:28 +00002641 {
Sean Callanandd1dcfd2012-02-10 01:22:05 +00002642 const RegisterInfo *reg_info(m_parser_vars->m_exe_ctx.GetRegisterContext()->GetRegisterInfoByName(reg_name));
Sean Callanan9394b5a2011-10-29 19:50:43 +00002643
Sean Callanan03f64ca2011-10-12 01:39:28 +00002644 if (reg_info)
Sean Callanane3737fd2011-10-18 16:46:55 +00002645 {
2646 if (log)
Sean Callanan9394b5a2011-10-29 19:50:43 +00002647 log->Printf(" CEDM::FEVD[%u] Found register %s", current_id, reg_info->name);
Sean Callanane3737fd2011-10-18 16:46:55 +00002648
Sean Callanan67bbb112011-10-14 20:34:21 +00002649 AddOneRegister(context, reg_info, current_id);
Sean Callanane3737fd2011-10-18 16:46:55 +00002650 }
Sean Callanan03f64ca2011-10-12 01:39:28 +00002651 }
2652 }
2653 else
Sean Callanan0fc73582010-07-27 00:55:47 +00002654 {
Sean Callananf8b468e2011-08-06 00:28:14 +00002655 ValueObjectSP valobj;
2656 VariableSP var;
2657 Error err;
2658
Sean Callanan03f64ca2011-10-12 01:39:28 +00002659 if (frame && !namespace_decl)
Greg Clayton8de27c72010-10-15 22:48:33 +00002660 {
Greg Clayton567e7f32011-09-22 04:58:26 +00002661 valobj = frame->GetValueForVariableExpressionPath(name_unique_cstr,
Sean Callanan16b53ab2011-10-12 00:12:34 +00002662 eNoDynamicValues,
2663 StackFrame::eExpressionPathOptionCheckPtrVsMember,
2664 var,
2665 err);
Sean Callanan47dc4572011-09-15 02:13:07 +00002666
2667 // If we found a variable in scope, no need to pull up function names
Sean Callananb386d822012-08-09 00:50:26 +00002668 if (err.Success() && var)
Sean Callanan47dc4572011-09-15 02:13:07 +00002669 {
Sean Callanan89e7df32011-11-29 22:03:21 +00002670 AddOneVariable(context, var, valobj, current_id);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002671 context.m_found.variable = true;
Sean Callanan3a546762011-10-25 20:36:57 +00002672 return;
Sean Callanan47dc4572011-09-15 02:13:07 +00002673 }
Greg Clayton8de27c72010-10-15 22:48:33 +00002674 }
Sean Callanan1c226272011-12-10 04:03:38 +00002675
2676 if (target)
Sean Callanan47dc4572011-09-15 02:13:07 +00002677 {
Sean Callanan94cd0ca2011-10-12 16:59:31 +00002678 var = FindGlobalVariable (*target,
Sean Callanan38d084f2011-10-12 18:44:30 +00002679 module_sp,
Sean Callanan94cd0ca2011-10-12 16:59:31 +00002680 name,
2681 &namespace_decl,
Greg Clayton567e7f32011-09-22 04:58:26 +00002682 NULL);
Sean Callanan47dc4572011-09-15 02:13:07 +00002683
2684 if (var)
2685 {
Sean Callananf48de6d2011-12-10 03:12:34 +00002686 valobj = ValueObjectVariable::Create(target, var);
Sean Callanan89e7df32011-11-29 22:03:21 +00002687 AddOneVariable(context, var, valobj, current_id);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002688 context.m_found.variable = true;
Sean Callanan1c226272011-12-10 04:03:38 +00002689 return;
Sean Callanan47dc4572011-09-15 02:13:07 +00002690 }
2691 }
2692
Sean Callanan16c4ec32011-10-12 20:29:25 +00002693 if (!context.m_found.variable)
Greg Clayton8de27c72010-10-15 22:48:33 +00002694 {
Sean Callanan302d78c2012-02-10 22:52:19 +00002695 const bool include_inlines = false;
Greg Clayton28d5fcc2011-01-27 06:44:37 +00002696 const bool append = false;
Sean Callanana5ec5a32011-10-12 17:38:09 +00002697
Sean Callanan38d084f2011-10-12 18:44:30 +00002698 if (namespace_decl && module_sp)
Sean Callanana5ec5a32011-10-12 17:38:09 +00002699 {
Sean Callanan51cd6f62012-02-15 17:14:49 +00002700 const bool include_symbols = false;
2701
Sean Callanan38d084f2011-10-12 18:44:30 +00002702 module_sp->FindFunctions(name,
2703 &namespace_decl,
2704 eFunctionNameTypeBase,
2705 include_symbols,
Sean Callanan302d78c2012-02-10 22:52:19 +00002706 include_inlines,
Sean Callanan38d084f2011-10-12 18:44:30 +00002707 append,
2708 sc_list);
Sean Callanana5ec5a32011-10-12 17:38:09 +00002709 }
Sean Callanan647fefd2012-03-06 20:53:06 +00002710 else if (!namespace_decl)
Sean Callanana5ec5a32011-10-12 17:38:09 +00002711 {
Sean Callanan51cd6f62012-02-15 17:14:49 +00002712 const bool include_symbols = true;
2713
Sean Callanan2975ada2012-07-28 00:21:01 +00002714 // TODO Fix FindFunctions so that it doesn't return
2715 // instance methods for eFunctionNameTypeBase.
2716
Sean Callanana5ec5a32011-10-12 17:38:09 +00002717 target->GetImages().FindFunctions(name,
2718 eFunctionNameTypeBase,
2719 include_symbols,
Sean Callanan302d78c2012-02-10 22:52:19 +00002720 include_inlines,
Sean Callanana5ec5a32011-10-12 17:38:09 +00002721 append,
2722 sc_list);
2723 }
2724
Sean Callanan81974962011-05-08 02:21:26 +00002725 if (sc_list.GetSize())
Greg Clayton8de27c72010-10-15 22:48:33 +00002726 {
Sean Callanan81974962011-05-08 02:21:26 +00002727 Symbol *generic_symbol = NULL;
2728 Symbol *non_extern_symbol = NULL;
2729
2730 for (uint32_t index = 0, num_indices = sc_list.GetSize();
2731 index < num_indices;
2732 ++index)
Greg Clayton8de27c72010-10-15 22:48:33 +00002733 {
Sean Callanan81974962011-05-08 02:21:26 +00002734 SymbolContext sym_ctx;
2735 sc_list.GetContextAtIndex(index, sym_ctx);
2736
2737 if (sym_ctx.function)
2738 {
Sean Callanan2975ada2012-07-28 00:21:01 +00002739 clang::DeclContext *decl_ctx = sym_ctx.function->GetClangDeclContext();
2740
2741 // Filter out class/instance methods.
2742 if (dyn_cast<clang::ObjCMethodDecl>(decl_ctx))
2743 continue;
2744 if (dyn_cast<clang::CXXMethodDecl>(decl_ctx))
2745 continue;
2746
Sean Callanan81974962011-05-08 02:21:26 +00002747 // TODO only do this if it's a C function; C++ functions may be
2748 // overloaded
Sean Callanan16c4ec32011-10-12 20:29:25 +00002749 if (!context.m_found.function_with_type_info)
Sean Callanan67bbb112011-10-14 20:34:21 +00002750 AddOneFunction(context, sym_ctx.function, NULL, current_id);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002751 context.m_found.function_with_type_info = true;
2752 context.m_found.function = true;
Sean Callanan81974962011-05-08 02:21:26 +00002753 }
2754 else if (sym_ctx.symbol)
2755 {
2756 if (sym_ctx.symbol->IsExternal())
2757 generic_symbol = sym_ctx.symbol;
2758 else
2759 non_extern_symbol = sym_ctx.symbol;
2760 }
Greg Clayton8de27c72010-10-15 22:48:33 +00002761 }
Sean Callanan81974962011-05-08 02:21:26 +00002762
Sean Callanan16c4ec32011-10-12 20:29:25 +00002763 if (!context.m_found.function_with_type_info)
Greg Clayton8de27c72010-10-15 22:48:33 +00002764 {
Sean Callanan81974962011-05-08 02:21:26 +00002765 if (generic_symbol)
Sean Callanan47dc4572011-09-15 02:13:07 +00002766 {
Sean Callanan67bbb112011-10-14 20:34:21 +00002767 AddOneFunction (context, NULL, generic_symbol, current_id);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002768 context.m_found.function = true;
Sean Callanan47dc4572011-09-15 02:13:07 +00002769 }
Sean Callanan81974962011-05-08 02:21:26 +00002770 else if (non_extern_symbol)
Sean Callanan47dc4572011-09-15 02:13:07 +00002771 {
Sean Callanan67bbb112011-10-14 20:34:21 +00002772 AddOneFunction (context, NULL, non_extern_symbol, current_id);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002773 context.m_found.function = true;
Sean Callanan47dc4572011-09-15 02:13:07 +00002774 }
Sean Callanan81974962011-05-08 02:21:26 +00002775 }
Greg Clayton8de27c72010-10-15 22:48:33 +00002776 }
Sean Callanan47dc4572011-09-15 02:13:07 +00002777
Sean Callanan647fefd2012-03-06 20:53:06 +00002778 if (!context.m_found.variable && !namespace_decl)
Greg Clayton8de27c72010-10-15 22:48:33 +00002779 {
Sean Callanan16c4ec32011-10-12 20:29:25 +00002780 // We couldn't find a non-symbol variable for this. Now we'll hunt for a generic
Sean Callanan81974962011-05-08 02:21:26 +00002781 // data symbol, and -- if it is found -- treat it as a variable.
2782
Sean Callananaa4a5532011-10-13 16:49:47 +00002783 Symbol *data_symbol = FindGlobalDataSymbol(*target, name);
Sean Callanan81974962011-05-08 02:21:26 +00002784
2785 if (data_symbol)
Sean Callanan47dc4572011-09-15 02:13:07 +00002786 {
Sean Callanan67bbb112011-10-14 20:34:21 +00002787 AddOneGenericVariable(context, *data_symbol, current_id);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002788 context.m_found.variable = true;
Sean Callanan47dc4572011-09-15 02:13:07 +00002789 }
Greg Clayton6916e352010-11-13 03:52:47 +00002790 }
Sean Callanan92aa6662010-09-07 21:49:41 +00002791 }
Sean Callananb549b0a2011-10-27 02:06:03 +00002792 }
Sean Callanan336a0002010-07-17 00:43:37 +00002793}
Greg Claytone6d72ca2011-06-25 00:44:06 +00002794
Sean Callanan69716a22012-03-06 21:56:33 +00002795static clang_type_t
2796MaybePromoteToBlockPointerType
2797(
2798 ASTContext *ast_context,
2799 clang_type_t candidate_type
2800)
2801{
2802 if (!candidate_type)
2803 return candidate_type;
2804
2805 QualType candidate_qual_type = QualType::getFromOpaquePtr(candidate_type);
2806
2807 const PointerType *candidate_pointer_type = dyn_cast<PointerType>(candidate_qual_type);
2808
2809 if (!candidate_pointer_type)
2810 return candidate_type;
2811
2812 QualType pointee_qual_type = candidate_pointer_type->getPointeeType();
2813
2814 const RecordType *pointee_record_type = dyn_cast<RecordType>(pointee_qual_type);
2815
2816 if (!pointee_record_type)
2817 return candidate_type;
2818
2819 RecordDecl *pointee_record_decl = pointee_record_type->getDecl();
2820
2821 if (!pointee_record_decl->isRecord())
2822 return candidate_type;
2823
2824 if (!pointee_record_decl->getName().startswith(llvm::StringRef("__block_literal_")))
2825 return candidate_type;
2826
2827 QualType generic_function_type = ast_context->getFunctionNoProtoType(ast_context->UnknownAnyTy);
2828 QualType block_pointer_type = ast_context->getBlockPointerType(generic_function_type);
2829
2830 return block_pointer_type.getAsOpaquePtr();
2831}
2832
Sean Callanan336a0002010-07-17 00:43:37 +00002833Value *
Greg Clayton8de27c72010-10-15 22:48:33 +00002834ClangExpressionDeclMap::GetVariableValue
2835(
Sean Callanan4a078322011-10-13 00:09:20 +00002836 VariableSP &var,
Sean Callanan9b6898f2011-07-30 02:42:06 +00002837 ASTContext *parser_ast_context,
Greg Clayton8de27c72010-10-15 22:48:33 +00002838 TypeFromUser *user_type,
2839 TypeFromParser *parser_type
2840)
Chris Lattner24943d22010-06-08 16:52:24 +00002841{
Greg Claytone005f2c2010-11-06 01:53:30 +00002842 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan6184dfe2010-06-23 00:47:48 +00002843
Chris Lattner24943d22010-06-08 16:52:24 +00002844 Type *var_type = var->GetType();
2845
2846 if (!var_type)
2847 {
Sean Callanan810f22d2010-07-16 00:09:46 +00002848 if (log)
2849 log->PutCString("Skipped a definition because it has no type");
Sean Callanan336a0002010-07-17 00:43:37 +00002850 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00002851 }
2852
Greg Clayton04c9c7b2011-02-16 23:00:21 +00002853 clang_type_t var_opaque_type = var_type->GetClangFullType();
Chris Lattner24943d22010-06-08 16:52:24 +00002854
2855 if (!var_opaque_type)
2856 {
Sean Callanan810f22d2010-07-16 00:09:46 +00002857 if (log)
2858 log->PutCString("Skipped a definition because it has no Clang type");
Sean Callanan336a0002010-07-17 00:43:37 +00002859 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00002860 }
2861
Sean Callanan9b6898f2011-07-30 02:42:06 +00002862 ASTContext *ast = var_type->GetClangASTContext().getASTContext();
Chris Lattner24943d22010-06-08 16:52:24 +00002863
Greg Claytonb01000f2011-01-17 03:46:26 +00002864 if (!ast)
Chris Lattner24943d22010-06-08 16:52:24 +00002865 {
Sean Callanan810f22d2010-07-16 00:09:46 +00002866 if (log)
2867 log->PutCString("There is no AST context for the current execution context");
Sean Callanan336a0002010-07-17 00:43:37 +00002868 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00002869 }
Sean Callanan69716a22012-03-06 21:56:33 +00002870
Enrico Granata3418bfe2012-03-30 16:58:37 +00002871 // commented out because of <rdar://problem/11024417>
2872 //var_opaque_type = MaybePromoteToBlockPointerType (ast, var_opaque_type);
Chris Lattner24943d22010-06-08 16:52:24 +00002873
Sean Callanan336a0002010-07-17 00:43:37 +00002874 DWARFExpression &var_location_expr = var->LocationExpression();
2875
Chris Lattner24943d22010-06-08 16:52:24 +00002876 std::auto_ptr<Value> var_location(new Value);
2877
Greg Clayton178710c2010-09-14 02:20:48 +00002878 lldb::addr_t loclist_base_load_addr = LLDB_INVALID_ADDRESS;
2879
Sean Callanandd1dcfd2012-02-10 01:22:05 +00002880 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
Greg Clayton567e7f32011-09-22 04:58:26 +00002881
Greg Clayton178710c2010-09-14 02:20:48 +00002882 if (var_location_expr.IsLocationList())
2883 {
2884 SymbolContext var_sc;
2885 var->CalculateSymbolContext (&var_sc);
Greg Clayton567e7f32011-09-22 04:58:26 +00002886 loclist_base_load_addr = var_sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress (target);
Greg Clayton178710c2010-09-14 02:20:48 +00002887 }
Chris Lattner24943d22010-06-08 16:52:24 +00002888 Error err;
2889
Sean Callanandd1dcfd2012-02-10 01:22:05 +00002890 if (!var_location_expr.Evaluate(&m_parser_vars->m_exe_ctx, ast, NULL, NULL, NULL, loclist_base_load_addr, NULL, *var_location.get(), &err))
Chris Lattner24943d22010-06-08 16:52:24 +00002891 {
Sean Callanan810f22d2010-07-16 00:09:46 +00002892 if (log)
2893 log->Printf("Error evaluating location: %s", err.AsCString());
Sean Callanan336a0002010-07-17 00:43:37 +00002894 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00002895 }
Greg Claytonb01000f2011-01-17 03:46:26 +00002896
Sean Callanan58baaad2011-07-08 00:39:14 +00002897 void *type_to_use = NULL;
Sean Callanan336a0002010-07-17 00:43:37 +00002898
Sean Callananf328c9f2010-07-20 23:31:16 +00002899 if (parser_ast_context)
2900 {
Greg Claytonb01000f2011-01-17 03:46:26 +00002901 type_to_use = GuardedCopyType(parser_ast_context, ast, var_opaque_type);
Sean Callananf328c9f2010-07-20 23:31:16 +00002902
Sean Callanan4b5eec62010-11-20 02:19:29 +00002903 if (!type_to_use)
2904 {
2905 if (log)
2906 log->Printf("Couldn't copy a variable's type into the parser's AST context");
2907
2908 return NULL;
2909 }
2910
Sean Callananf328c9f2010-07-20 23:31:16 +00002911 if (parser_type)
2912 *parser_type = TypeFromParser(type_to_use, parser_ast_context);
2913 }
Sean Callanan336a0002010-07-17 00:43:37 +00002914 else
2915 type_to_use = var_opaque_type;
Chris Lattner24943d22010-06-08 16:52:24 +00002916
2917 if (var_location.get()->GetContextType() == Value::eContextTypeInvalid)
Greg Clayton6916e352010-11-13 03:52:47 +00002918 var_location.get()->SetContext(Value::eContextTypeClangType, type_to_use);
Chris Lattner24943d22010-06-08 16:52:24 +00002919
2920 if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress)
2921 {
2922 SymbolContext var_sc;
2923 var->CalculateSymbolContext(&var_sc);
Sean Callanan336a0002010-07-17 00:43:37 +00002924
Chris Lattner24943d22010-06-08 16:52:24 +00002925 if (!var_sc.module_sp)
Sean Callanan336a0002010-07-17 00:43:37 +00002926 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00002927
2928 ObjectFile *object_file = var_sc.module_sp->GetObjectFile();
2929
2930 if (!object_file)
Sean Callanan336a0002010-07-17 00:43:37 +00002931 return NULL;
2932
Chris Lattner24943d22010-06-08 16:52:24 +00002933 Address so_addr(var_location->GetScalar().ULongLong(), object_file->GetSectionList());
2934
Greg Clayton567e7f32011-09-22 04:58:26 +00002935 lldb::addr_t load_addr = so_addr.GetLoadAddress(target);
Chris Lattner24943d22010-06-08 16:52:24 +00002936
Sean Callanan47dc4572011-09-15 02:13:07 +00002937 if (load_addr != LLDB_INVALID_ADDRESS)
2938 {
2939 var_location->GetScalar() = load_addr;
2940 var_location->SetValueType(Value::eValueTypeLoadAddress);
2941 }
Chris Lattner24943d22010-06-08 16:52:24 +00002942 }
2943
Sean Callananf328c9f2010-07-20 23:31:16 +00002944 if (user_type)
Greg Claytonb01000f2011-01-17 03:46:26 +00002945 *user_type = TypeFromUser(var_opaque_type, ast);
Sean Callanan336a0002010-07-17 00:43:37 +00002946
2947 return var_location.release();
2948}
2949
2950void
Sean Callanan89e7df32011-11-29 22:03:21 +00002951ClangExpressionDeclMap::AddOneVariable (NameSearchContext &context, VariableSP var, ValueObjectSP valobj, unsigned int current_id)
Sean Callanan336a0002010-07-17 00:43:37 +00002952{
Sean Callananaa301c42010-12-03 01:38:59 +00002953 assert (m_parser_vars.get());
2954
Greg Claytone005f2c2010-11-06 01:53:30 +00002955 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan47dc4572011-09-15 02:13:07 +00002956
Sean Callananf328c9f2010-07-20 23:31:16 +00002957 TypeFromUser ut;
2958 TypeFromParser pt;
Sean Callanan336a0002010-07-17 00:43:37 +00002959
Sean Callanandd1dcfd2012-02-10 01:22:05 +00002960 Value *var_location = GetVariableValue (var,
Sean Callananf76afff2011-10-28 23:38:38 +00002961 m_ast_context,
Greg Clayton8de27c72010-10-15 22:48:33 +00002962 &ut,
2963 &pt);
Sean Callanan336a0002010-07-17 00:43:37 +00002964
Sean Callanane9478392012-03-15 01:53:17 +00002965 clang::QualType parser_opaque_type = QualType::getFromOpaquePtr(pt.GetOpaqueQualType());
2966
Sean Callanan30a5dd52012-03-21 17:13:20 +00002967 if (parser_opaque_type.isNull())
2968 return;
2969
Sean Callanane9478392012-03-15 01:53:17 +00002970 if (const clang::Type *parser_type = parser_opaque_type.getTypePtr())
2971 {
2972 if (const TagType *tag_type = dyn_cast<TagType>(parser_type))
2973 CompleteType(tag_type->getDecl());
2974 }
2975
Sean Callanan4b5eec62010-11-20 02:19:29 +00002976 if (!var_location)
2977 return;
2978
Sean Callanan6f3bde72011-10-27 19:41:13 +00002979 NamedDecl *var_decl;
2980
2981 bool is_reference = ClangASTContext::IsReferenceType(pt.GetOpaqueQualType());
2982
2983 if (is_reference)
2984 var_decl = context.AddVarDecl(pt.GetOpaqueQualType());
2985 else
2986 var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(pt.GetASTContext(), pt.GetOpaqueQualType()));
2987
Greg Clayton8de27c72010-10-15 22:48:33 +00002988 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton427f2902010-12-14 02:59:59 +00002989 ConstString entity_name(decl_name.c_str());
Sean Callanan89e7df32011-11-29 22:03:21 +00002990 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (valobj));
2991
Greg Clayton427f2902010-12-14 02:59:59 +00002992 assert (entity.get());
2993 entity->EnableParserVars();
2994 entity->m_parser_vars->m_parser_type = pt;
2995 entity->m_parser_vars->m_named_decl = var_decl;
2996 entity->m_parser_vars->m_llvm_value = NULL;
2997 entity->m_parser_vars->m_lldb_value = var_location;
Sean Callanan696cf5f2011-05-07 01:06:41 +00002998 entity->m_parser_vars->m_lldb_var = var;
Chris Lattner24943d22010-06-08 16:52:24 +00002999
Sean Callanan6f3bde72011-10-27 19:41:13 +00003000 if (is_reference)
3001 entity->m_flags |= ClangExpressionVariable::EVTypeIsReference;
3002
Sean Callanan810f22d2010-07-16 00:09:46 +00003003 if (log)
Greg Clayton8de27c72010-10-15 22:48:33 +00003004 {
Sean Callananaa561412011-11-07 23:32:52 +00003005 ASTDumper orig_dumper(ut.GetOpaqueQualType());
Greg Claytona23ca422011-10-20 00:47:21 +00003006 ASTDumper ast_dumper(var_decl);
Sean Callananaa561412011-11-07 23:32:52 +00003007 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 +00003008 }
Sean Callanan8f0dc342010-06-22 23:46:24 +00003009}
3010
3011void
Sean Callanana48fe162010-08-11 03:57:18 +00003012ClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
Sean Callanan67bbb112011-10-14 20:34:21 +00003013 ClangExpressionVariableSP &pvar_sp,
3014 unsigned int current_id)
Sean Callanana48fe162010-08-11 03:57:18 +00003015{
Greg Claytone005f2c2010-11-06 01:53:30 +00003016 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan45690fe2010-08-30 22:17:16 +00003017
Greg Clayton427f2902010-12-14 02:59:59 +00003018 TypeFromUser user_type (pvar_sp->GetTypeFromUser());
Sean Callanana48fe162010-08-11 03:57:18 +00003019
Sean Callananf76afff2011-10-28 23:38:38 +00003020 TypeFromParser parser_type (GuardedCopyType(m_ast_context,
Greg Clayton427f2902010-12-14 02:59:59 +00003021 user_type.GetASTContext(),
3022 user_type.GetOpaqueQualType()),
Sean Callananf76afff2011-10-28 23:38:38 +00003023 m_ast_context);
Sean Callanana48fe162010-08-11 03:57:18 +00003024
Sean Callanandc5fce12011-12-01 21:04:37 +00003025 if (!parser_type.GetOpaqueQualType())
3026 {
3027 if (log)
3028 log->Printf(" CEDM::FEVD[%u] Couldn't import type for pvar %s", current_id, pvar_sp->GetName().GetCString());
3029 return;
3030 }
3031
Sean Callanan6a925532011-01-13 08:53:35 +00003032 NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(parser_type.GetASTContext(), parser_type.GetOpaqueQualType()));
Sean Callanan8c127202010-08-23 23:09:38 +00003033
Greg Clayton427f2902010-12-14 02:59:59 +00003034 pvar_sp->EnableParserVars();
3035 pvar_sp->m_parser_vars->m_parser_type = parser_type;
3036 pvar_sp->m_parser_vars->m_named_decl = var_decl;
3037 pvar_sp->m_parser_vars->m_llvm_value = NULL;
3038 pvar_sp->m_parser_vars->m_lldb_value = NULL;
Sean Callanan45690fe2010-08-30 22:17:16 +00003039
3040 if (log)
Sean Callanana0744822010-11-01 23:22:47 +00003041 {
Greg Claytona23ca422011-10-20 00:47:21 +00003042 ASTDumper ast_dumper(var_decl);
Sean Callanan9394b5a2011-10-29 19:50:43 +00003043 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 +00003044 }
Sean Callanana48fe162010-08-11 03:57:18 +00003045}
3046
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00003047void
Sean Callanan81974962011-05-08 02:21:26 +00003048ClangExpressionDeclMap::AddOneGenericVariable(NameSearchContext &context,
Sean Callanan67bbb112011-10-14 20:34:21 +00003049 Symbol &symbol,
3050 unsigned int current_id)
Sean Callanan81974962011-05-08 02:21:26 +00003051{
3052 assert(m_parser_vars.get());
3053
3054 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
3055
Sean Callanandd1dcfd2012-02-10 01:22:05 +00003056 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
Greg Clayton567e7f32011-09-22 04:58:26 +00003057
3058 if (target == NULL)
3059 return;
3060
3061 ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
Sean Callanan81974962011-05-08 02:21:26 +00003062
Sean Callananfb3058e2011-05-12 23:54:16 +00003063 TypeFromUser user_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(scratch_ast_context, true)),
Sean Callanan81974962011-05-08 02:21:26 +00003064 scratch_ast_context);
3065
Sean Callananf76afff2011-10-28 23:38:38 +00003066 TypeFromParser parser_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(m_ast_context, true)),
3067 m_ast_context);
Sean Callanan81974962011-05-08 02:21:26 +00003068
Sean Callananfb3058e2011-05-12 23:54:16 +00003069 NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
Sean Callanan81974962011-05-08 02:21:26 +00003070
3071 std::string decl_name(context.m_decl_name.getAsString());
3072 ConstString entity_name(decl_name.c_str());
Sean Callanandd1dcfd2012-02-10 01:22:05 +00003073 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope (),
Sean Callanan81974962011-05-08 02:21:26 +00003074 entity_name,
3075 user_type,
Sean Callanan47dc4572011-09-15 02:13:07 +00003076 m_parser_vars->m_target_info.byte_order,
3077 m_parser_vars->m_target_info.address_byte_size));
Sean Callanan81974962011-05-08 02:21:26 +00003078 assert (entity.get());
Sean Callanan81974962011-05-08 02:21:26 +00003079
3080 std::auto_ptr<Value> symbol_location(new Value);
3081
Greg Clayton0c31d3d2012-03-07 21:03:09 +00003082 Address &symbol_address = symbol.GetAddress();
Greg Clayton567e7f32011-09-22 04:58:26 +00003083 lldb::addr_t symbol_load_addr = symbol_address.GetLoadAddress(target);
Sean Callanan81974962011-05-08 02:21:26 +00003084
3085 symbol_location->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
3086 symbol_location->GetScalar() = symbol_load_addr;
3087 symbol_location->SetValueType(Value::eValueTypeLoadAddress);
3088
Sean Callananfb3058e2011-05-12 23:54:16 +00003089 entity->EnableParserVars();
Sean Callanan81974962011-05-08 02:21:26 +00003090 entity->m_parser_vars->m_parser_type = parser_type;
3091 entity->m_parser_vars->m_named_decl = var_decl;
3092 entity->m_parser_vars->m_llvm_value = NULL;
3093 entity->m_parser_vars->m_lldb_value = symbol_location.release();
3094 entity->m_parser_vars->m_lldb_sym = &symbol;
3095
3096 if (log)
3097 {
Greg Claytona23ca422011-10-20 00:47:21 +00003098 ASTDumper ast_dumper(var_decl);
Sean Callanan81974962011-05-08 02:21:26 +00003099
Sean Callanan9394b5a2011-10-29 19:50:43 +00003100 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 +00003101 }
3102}
3103
Sean Callananfb3058e2011-05-12 23:54:16 +00003104bool
3105ClangExpressionDeclMap::ResolveUnknownTypes()
3106{
3107 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanandd1dcfd2012-02-10 01:22:05 +00003108 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
Greg Clayton567e7f32011-09-22 04:58:26 +00003109
3110 ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
Sean Callananfb3058e2011-05-12 23:54:16 +00003111
3112 for (size_t index = 0, num_entities = m_found_entities.GetSize();
3113 index < num_entities;
3114 ++index)
3115 {
3116 ClangExpressionVariableSP entity = m_found_entities.GetVariableAtIndex(index);
3117
3118 if (entity->m_flags & ClangExpressionVariable::EVUnknownType)
3119 {
3120 const NamedDecl *named_decl = entity->m_parser_vars->m_named_decl;
3121 const VarDecl *var_decl = dyn_cast<VarDecl>(named_decl);
3122
3123 if (!var_decl)
3124 {
3125 if (log)
3126 log->Printf("Entity of unknown type does not have a VarDecl");
3127 return false;
3128 }
3129
3130 if (log)
3131 {
Greg Claytona23ca422011-10-20 00:47:21 +00003132 ASTDumper ast_dumper(const_cast<VarDecl*>(var_decl));
3133 log->Printf("Variable of unknown type now has Decl %s", ast_dumper.GetCString());
Sean Callananfb3058e2011-05-12 23:54:16 +00003134 }
3135
3136 QualType var_type = var_decl->getType();
3137 TypeFromParser parser_type(var_type.getAsOpaquePtr(), &var_decl->getASTContext());
3138
Sean Callanan5a55c7a2011-11-18 03:28:09 +00003139 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 +00003140
Sean Callanandc5fce12011-12-01 21:04:37 +00003141 if (!copied_type)
3142 {
3143 if (log)
3144 log->Printf("ClangExpressionDeclMap::ResolveUnknownType - Couldn't import the type for a variable");
3145
Jim Ingham9880efa2012-08-11 00:35:26 +00003146 return (bool) lldb::ClangExpressionVariableSP();
Sean Callanandc5fce12011-12-01 21:04:37 +00003147 }
3148
Sean Callananfb3058e2011-05-12 23:54:16 +00003149 TypeFromUser user_type(copied_type, scratch_ast_context);
3150
3151 entity->m_parser_vars->m_lldb_value->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
3152 entity->m_parser_vars->m_parser_type = parser_type;
3153
3154 entity->SetClangAST(user_type.GetASTContext());
3155 entity->SetClangType(user_type.GetOpaqueQualType());
3156
3157 entity->m_flags &= ~(ClangExpressionVariable::EVUnknownType);
3158 }
3159 }
3160
3161 return true;
3162}
3163
Sean Callanan81974962011-05-08 02:21:26 +00003164void
Greg Clayton427f2902010-12-14 02:59:59 +00003165ClangExpressionDeclMap::AddOneRegister (NameSearchContext &context,
Sean Callanan67bbb112011-10-14 20:34:21 +00003166 const RegisterInfo *reg_info,
3167 unsigned int current_id)
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00003168{
3169 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
3170
Sean Callananf76afff2011-10-28 23:38:38 +00003171 void *ast_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize(m_ast_context,
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00003172 reg_info->encoding,
3173 reg_info->byte_size * 8);
3174
3175 if (!ast_type)
3176 {
Johnny Chen122204d2011-08-09 22:52:27 +00003177 if (log)
Sean Callanan67bbb112011-10-14 20:34:21 +00003178 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 +00003179 return;
3180 }
3181
Greg Clayton427f2902010-12-14 02:59:59 +00003182 TypeFromParser parser_type (ast_type,
Sean Callananf76afff2011-10-28 23:38:38 +00003183 m_ast_context);
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00003184
3185 NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
3186
Sean Callanandd1dcfd2012-02-10 01:22:05 +00003187 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(),
Sean Callanan47dc4572011-09-15 02:13:07 +00003188 m_parser_vars->m_target_info.byte_order,
3189 m_parser_vars->m_target_info.address_byte_size));
Greg Clayton427f2902010-12-14 02:59:59 +00003190 assert (entity.get());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00003191 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton427f2902010-12-14 02:59:59 +00003192 entity->SetName (ConstString (decl_name.c_str()));
3193 entity->SetRegisterInfo (reg_info);
3194 entity->EnableParserVars();
3195 entity->m_parser_vars->m_parser_type = parser_type;
3196 entity->m_parser_vars->m_named_decl = var_decl;
3197 entity->m_parser_vars->m_llvm_value = NULL;
3198 entity->m_parser_vars->m_lldb_value = NULL;
Sean Callanan52d0d022012-02-15 01:40:39 +00003199 entity->m_flags |= ClangExpressionVariable::EVBareRegister;
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00003200
Sean Callanan52d0d022012-02-15 01:40:39 +00003201 if (log)
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00003202 {
Greg Claytona23ca422011-10-20 00:47:21 +00003203 ASTDumper ast_dumper(var_decl);
Sean Callanan9394b5a2011-10-29 19:50:43 +00003204 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 +00003205 }
3206}
3207
Sean Callanana48fe162010-08-11 03:57:18 +00003208void
Greg Claytonda7af842011-05-18 22:01:49 +00003209ClangExpressionDeclMap::AddOneFunction (NameSearchContext &context,
3210 Function* fun,
Sean Callanan67bbb112011-10-14 20:34:21 +00003211 Symbol* symbol,
3212 unsigned int current_id)
Sean Callanan8f0dc342010-06-22 23:46:24 +00003213{
Sean Callananaa301c42010-12-03 01:38:59 +00003214 assert (m_parser_vars.get());
3215
Greg Claytone005f2c2010-11-06 01:53:30 +00003216 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan8f0dc342010-06-22 23:46:24 +00003217
Sean Callanan58baaad2011-07-08 00:39:14 +00003218 NamedDecl *fun_decl = NULL;
Sean Callanan8f0dc342010-06-22 23:46:24 +00003219 std::auto_ptr<Value> fun_location(new Value);
Sean Callanan58baaad2011-07-08 00:39:14 +00003220 const Address *fun_address = NULL;
Sean Callanan8f0dc342010-06-22 23:46:24 +00003221
Sean Callanan0fc73582010-07-27 00:55:47 +00003222 // only valid for Functions, not for Symbols
3223 void *fun_opaque_type = NULL;
Sean Callanan9b6898f2011-07-30 02:42:06 +00003224 ASTContext *fun_ast_context = NULL;
Sean Callanan0fc73582010-07-27 00:55:47 +00003225
3226 if (fun)
3227 {
3228 Type *fun_type = fun->GetType();
3229
3230 if (!fun_type)
3231 {
3232 if (log)
Sean Callanan67bbb112011-10-14 20:34:21 +00003233 log->PutCString(" Skipped a function because it has no type");
Sean Callanan0fc73582010-07-27 00:55:47 +00003234 return;
3235 }
3236
Greg Clayton04c9c7b2011-02-16 23:00:21 +00003237 fun_opaque_type = fun_type->GetClangFullType();
Sean Callanan0fc73582010-07-27 00:55:47 +00003238
3239 if (!fun_opaque_type)
3240 {
3241 if (log)
Sean Callanan67bbb112011-10-14 20:34:21 +00003242 log->PutCString(" Skipped a function because it has no Clang type");
Sean Callanan0fc73582010-07-27 00:55:47 +00003243 return;
3244 }
3245
3246 fun_address = &fun->GetAddressRange().GetBaseAddress();
3247
Greg Claytonb01000f2011-01-17 03:46:26 +00003248 fun_ast_context = fun_type->GetClangASTContext().getASTContext();
Sean Callananf76afff2011-10-28 23:38:38 +00003249 void *copied_type = GuardedCopyType(m_ast_context, fun_ast_context, fun_opaque_type);
Greg Claytona23ca422011-10-20 00:47:21 +00003250 if (copied_type)
3251 {
3252 fun_decl = context.AddFunDecl(copied_type);
3253 }
3254 else
3255 {
3256 // We failed to copy the type we found
3257 if (log)
3258 {
3259 log->Printf (" Failed to import the function type '%s' {0x%8.8llx} into the expression parser AST contenxt",
3260 fun_type->GetName().GetCString(),
3261 fun_type->GetID());
3262 }
Sean Callanan16089542011-11-16 00:40:13 +00003263
3264 return;
Greg Claytona23ca422011-10-20 00:47:21 +00003265 }
Sean Callanan0fc73582010-07-27 00:55:47 +00003266 }
3267 else if (symbol)
3268 {
Greg Clayton0c31d3d2012-03-07 21:03:09 +00003269 fun_address = &symbol->GetAddress();
Sean Callanan0fc73582010-07-27 00:55:47 +00003270 fun_decl = context.AddGenericFunDecl();
3271 }
3272 else
3273 {
3274 if (log)
Sean Callanan67bbb112011-10-14 20:34:21 +00003275 log->PutCString(" AddOneFunction called with no function and no symbol");
Sean Callanan0fc73582010-07-27 00:55:47 +00003276 return;
3277 }
3278
Sean Callanandd1dcfd2012-02-10 01:22:05 +00003279 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
Greg Clayton567e7f32011-09-22 04:58:26 +00003280
3281 lldb::addr_t load_addr = fun_address->GetCallableLoadAddress(target);
Sean Callanan8f0dc342010-06-22 23:46:24 +00003282 fun_location->SetValueType(Value::eValueTypeLoadAddress);
3283 fun_location->GetScalar() = load_addr;
3284
Sean Callanandd1dcfd2012-02-10 01:22:05 +00003285 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope (),
Sean Callanan47dc4572011-09-15 02:13:07 +00003286 m_parser_vars->m_target_info.byte_order,
3287 m_parser_vars->m_target_info.address_byte_size));
Greg Clayton427f2902010-12-14 02:59:59 +00003288 assert (entity.get());
Greg Clayton8de27c72010-10-15 22:48:33 +00003289 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton427f2902010-12-14 02:59:59 +00003290 entity->SetName(ConstString(decl_name.c_str()));
3291 entity->SetClangType (fun_opaque_type);
3292 entity->SetClangAST (fun_ast_context);
Sean Callanan8f0dc342010-06-22 23:46:24 +00003293
Greg Clayton427f2902010-12-14 02:59:59 +00003294 entity->EnableParserVars();
3295 entity->m_parser_vars->m_named_decl = fun_decl;
3296 entity->m_parser_vars->m_llvm_value = NULL;
3297 entity->m_parser_vars->m_lldb_value = fun_location.release();
Sean Callanan8c127202010-08-23 23:09:38 +00003298
Sean Callanan810f22d2010-07-16 00:09:46 +00003299 if (log)
Greg Clayton8de27c72010-10-15 22:48:33 +00003300 {
Greg Claytona23ca422011-10-20 00:47:21 +00003301 ASTDumper ast_dumper(fun_decl);
Sean Callanana0744822010-11-01 23:22:47 +00003302
Sean Callanan2975ada2012-07-28 00:21:01 +00003303 StreamString ss;
3304
3305 fun_address->Dump(&ss, m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(), Address::DumpStyleResolvedDescription);
3306
3307 log->Printf(" CEDM::FEVD[%u] Found %s function %s (description %s), returned %s",
Sean Callanan67bbb112011-10-14 20:34:21 +00003308 current_id,
3309 (fun ? "specific" : "generic"),
Sean Callanan2975ada2012-07-28 00:21:01 +00003310 decl_name.c_str(),
3311 ss.GetData(),
Greg Claytona23ca422011-10-20 00:47:21 +00003312 ast_dumper.GetCString());
Greg Clayton8de27c72010-10-15 22:48:33 +00003313 }
Chris Lattner24943d22010-06-08 16:52:24 +00003314}
Sean Callanan93a4b1a2010-08-04 01:02:13 +00003315
3316void
3317ClangExpressionDeclMap::AddOneType(NameSearchContext &context,
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00003318 TypeFromUser &ut,
Sean Callanan67bbb112011-10-14 20:34:21 +00003319 unsigned int current_id,
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00003320 bool add_method)
Sean Callanan93a4b1a2010-08-04 01:02:13 +00003321{
Sean Callananf76afff2011-10-28 23:38:38 +00003322 ASTContext *parser_ast_context = m_ast_context;
Sean Callanan9b6898f2011-07-30 02:42:06 +00003323 ASTContext *user_ast_context = ut.GetASTContext();
Sean Callanan93a4b1a2010-08-04 01:02:13 +00003324
Sean Callananee8fc722010-11-19 20:20:02 +00003325 void *copied_type = GuardedCopyType(parser_ast_context, user_ast_context, ut.GetOpaqueQualType());
Sean Callanandc5fce12011-12-01 21:04:37 +00003326
3327 if (!copied_type)
3328 {
3329 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
3330
3331 if (log)
3332 log->Printf("ClangExpressionDeclMap::AddOneType - Couldn't import the type");
3333
3334 return;
3335 }
Sean Callanan9394b5a2011-10-29 19:50:43 +00003336
Greg Clayton3356d4f2012-03-30 00:51:13 +00003337 if (add_method && ClangASTContext::IsAggregateType(copied_type) && ClangASTContext::GetCompleteType (parser_ast_context, copied_type))
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00003338 {
3339 void *args[1];
3340
3341 args[0] = ClangASTContext::GetVoidPtrType(parser_ast_context, false);
3342
Sean Callanan716e3f02011-11-01 18:07:13 +00003343 clang_type_t method_type = ClangASTContext::CreateFunctionType (parser_ast_context,
3344 ClangASTContext::GetBuiltInType_void(parser_ast_context),
3345 args,
3346 1,
3347 false,
3348 ClangASTContext::GetTypeQualifiers(copied_type));
3349
Greg Clayton1d8173f2010-09-24 05:15:53 +00003350 const bool is_virtual = false;
3351 const bool is_static = false;
3352 const bool is_inline = false;
Greg Clayton30449d52010-10-01 02:31:07 +00003353 const bool is_explicit = false;
Sean Callanan28ebe882011-11-02 18:09:01 +00003354 const bool is_attr_used = true;
Sean Callanan2581dbf2011-11-02 01:38:59 +00003355 const bool is_artificial = false;
Greg Clayton30449d52010-10-01 02:31:07 +00003356
Greg Clayton1d8173f2010-09-24 05:15:53 +00003357 ClangASTContext::AddMethodToCXXRecordType (parser_ast_context,
3358 copied_type,
Greg Clayton8de27c72010-10-15 22:48:33 +00003359 "$__lldb_expr",
Greg Clayton1d8173f2010-09-24 05:15:53 +00003360 method_type,
3361 lldb::eAccessPublic,
3362 is_virtual,
3363 is_static,
Greg Clayton30449d52010-10-01 02:31:07 +00003364 is_inline,
Sean Callanan716e3f02011-11-01 18:07:13 +00003365 is_explicit,
Sean Callanan2581dbf2011-11-02 01:38:59 +00003366 is_attr_used,
3367 is_artificial);
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00003368 }
Sean Callanan93a4b1a2010-08-04 01:02:13 +00003369
3370 context.AddTypeDecl(copied_type);
3371}