blob: 5166300083d81b2df9885c7ab9fe755a7b781123 [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 Callanan06dc17f2012-09-24 22:25:51 +000016#include "clang/AST/ASTContext.h"
Sean Callanan47a5c4c2010-09-23 03:01:22 +000017#include "clang/AST/DeclarationName.h"
Sean Callanana0744822010-11-01 23:22:47 +000018#include "clang/AST/Decl.h"
Chris Lattner24943d22010-06-08 16:52:24 +000019#include "lldb/lldb-private.h"
20#include "lldb/Core/Address.h"
Sean Callanan810f22d2010-07-16 00:09:46 +000021#include "lldb/Core/Error.h"
Sean Callanan6184dfe2010-06-23 00:47:48 +000022#include "lldb/Core/Log.h"
Chris Lattner24943d22010-06-08 16:52:24 +000023#include "lldb/Core/Module.h"
Greg Clayton061b79d2011-05-09 20:18:18 +000024#include "lldb/Core/RegisterValue.h"
Sean Callanan05a5a1b2010-12-16 03:17:46 +000025#include "lldb/Core/ValueObjectConstResult.h"
Sean Callananf48de6d2011-12-10 03:12:34 +000026#include "lldb/Core/ValueObjectVariable.h"
Sean Callanan6e74dbb2011-02-01 23:43:26 +000027#include "lldb/Expression/ASTDumper.h"
Chris Lattner24943d22010-06-08 16:52:24 +000028#include "lldb/Expression/ClangASTSource.h"
Sean Callanana48fe162010-08-11 03:57:18 +000029#include "lldb/Expression/ClangPersistentVariables.h"
Greg Claytoncd548032011-02-01 01:31:41 +000030#include "lldb/Host/Endian.h"
Chris Lattner24943d22010-06-08 16:52:24 +000031#include "lldb/Symbol/ClangASTContext.h"
Greg Clayton6916e352010-11-13 03:52:47 +000032#include "lldb/Symbol/ClangNamespaceDecl.h"
Chris Lattner24943d22010-06-08 16:52:24 +000033#include "lldb/Symbol/CompileUnit.h"
34#include "lldb/Symbol/Function.h"
35#include "lldb/Symbol/ObjectFile.h"
36#include "lldb/Symbol/SymbolContext.h"
Sean Callanan16b53ab2011-10-12 00:12:34 +000037#include "lldb/Symbol/SymbolVendor.h"
Chris Lattner24943d22010-06-08 16:52:24 +000038#include "lldb/Symbol/Type.h"
39#include "lldb/Symbol/TypeList.h"
40#include "lldb/Symbol/Variable.h"
41#include "lldb/Symbol/VariableList.h"
Sean Callananf328c9f2010-07-20 23:31:16 +000042#include "lldb/Target/ExecutionContext.h"
Sean Callanan810f22d2010-07-16 00:09:46 +000043#include "lldb/Target/Process.h"
Sean Callanan17c6a052010-10-05 20:18:48 +000044#include "lldb/Target/RegisterContext.h"
Chris Lattner24943d22010-06-08 16:52:24 +000045#include "lldb/Target/StackFrame.h"
Sean Callananf328c9f2010-07-20 23:31:16 +000046#include "lldb/Target/Target.h"
Jim Ingham78b9ee82010-12-07 01:56:02 +000047#include "lldb/Target/Thread.h"
Chris Lattner24943d22010-06-08 16:52:24 +000048
Greg Clayton3bc52d02010-11-14 22:13:40 +000049using namespace lldb;
Chris Lattner24943d22010-06-08 16:52:24 +000050using namespace lldb_private;
51using namespace clang;
52
Sean Callanan73b520f2011-10-29 01:58:46 +000053ClangExpressionDeclMap::ClangExpressionDeclMap (bool keep_result_in_memory, ExecutionContext &exe_ctx) :
54 ClangASTSource (exe_ctx.GetTargetSP()),
Greg Clayton8de27c72010-10-15 22:48:33 +000055 m_found_entities (),
56 m_struct_members (),
Stephen Wilsondbeb3e12011-04-11 19:41:40 +000057 m_keep_result_in_memory (keep_result_in_memory),
Sean Callananaa301c42010-12-03 01:38:59 +000058 m_parser_vars (),
Stephen Wilsondbeb3e12011-04-11 19:41:40 +000059 m_struct_vars ()
Chris Lattner24943d22010-06-08 16:52:24 +000060{
Sean Callananaa301c42010-12-03 01:38:59 +000061 EnableStructVars();
Chris Lattner24943d22010-06-08 16:52:24 +000062}
63
64ClangExpressionDeclMap::~ClangExpressionDeclMap()
Sean Callananaa301c42010-12-03 01:38:59 +000065{
Sean Callanan6d284ef2011-10-12 22:20:02 +000066 // Note: The model is now that the parser's AST context and all associated
67 // data does not vanish until the expression has been executed. This means
68 // that valuable lookup data (like namespaces) doesn't vanish, but
69
70 DidParse();
Sean Callananaa301c42010-12-03 01:38:59 +000071 DidDematerialize();
72 DisableStructVars();
73}
Sean Callananc2c6f772010-10-26 00:31:56 +000074
Sean Callanan166ba102011-08-01 18:18:33 +000075bool
Greg Clayton427f2902010-12-14 02:59:59 +000076ClangExpressionDeclMap::WillParse(ExecutionContext &exe_ctx)
Sean Callananaa301c42010-12-03 01:38:59 +000077{
78 EnableParserVars();
Sean Callanandd1dcfd2012-02-10 01:22:05 +000079 m_parser_vars->m_exe_ctx = exe_ctx;
Greg Clayton567e7f32011-09-22 04:58:26 +000080
81 Target *target = exe_ctx.GetTargetPtr();
82 if (exe_ctx.GetFramePtr())
83 m_parser_vars->m_sym_ctx = exe_ctx.GetFramePtr()->GetSymbolContext(lldb::eSymbolContextEverything);
84 else if (exe_ctx.GetThreadPtr())
85 m_parser_vars->m_sym_ctx = exe_ctx.GetThreadPtr()->GetStackFrameAtIndex(0)->GetSymbolContext(lldb::eSymbolContextEverything);
86 else if (exe_ctx.GetProcessPtr())
Greg Clayton987c7eb2011-09-17 08:33:22 +000087 {
88 m_parser_vars->m_sym_ctx.Clear();
Greg Clayton567e7f32011-09-22 04:58:26 +000089 m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP();
Greg Clayton987c7eb2011-09-17 08:33:22 +000090 }
Greg Clayton567e7f32011-09-22 04:58:26 +000091 else if (target)
Greg Clayton987c7eb2011-09-17 08:33:22 +000092 {
93 m_parser_vars->m_sym_ctx.Clear();
Greg Clayton567e7f32011-09-22 04:58:26 +000094 m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP();
Greg Clayton987c7eb2011-09-17 08:33:22 +000095 }
Sean Callanan97ad47f2011-09-15 18:41:04 +000096
Greg Clayton567e7f32011-09-22 04:58:26 +000097 if (target)
98 {
99 m_parser_vars->m_persistent_vars = &target->GetPersistentVariables();
Sean Callanan166ba102011-08-01 18:18:33 +0000100
Greg Clayton567e7f32011-09-22 04:58:26 +0000101 if (!target->GetScratchClangASTContext())
102 return false;
103 }
Sean Callanan166ba102011-08-01 18:18:33 +0000104
Sean Callanan47dc4572011-09-15 02:13:07 +0000105 m_parser_vars->m_target_info = GetTargetInfo();
106
Sean Callanan166ba102011-08-01 18:18:33 +0000107 return true;
Sean Callananaa301c42010-12-03 01:38:59 +0000108}
109
Greg Clayton427f2902010-12-14 02:59:59 +0000110void
111ClangExpressionDeclMap::DidParse()
Sean Callananaa301c42010-12-03 01:38:59 +0000112{
113 if (m_parser_vars.get())
114 {
Greg Clayton427f2902010-12-14 02:59:59 +0000115 for (size_t entity_index = 0, num_entities = m_found_entities.GetSize();
Sean Callananaa301c42010-12-03 01:38:59 +0000116 entity_index < num_entities;
117 ++entity_index)
118 {
Greg Clayton427f2902010-12-14 02:59:59 +0000119 ClangExpressionVariableSP var_sp(m_found_entities.GetVariableAtIndex(entity_index));
120 if (var_sp &&
121 var_sp->m_parser_vars.get() &&
122 var_sp->m_parser_vars->m_lldb_value)
123 delete var_sp->m_parser_vars->m_lldb_value;
Sean Callananaa301c42010-12-03 01:38:59 +0000124
Greg Clayton427f2902010-12-14 02:59:59 +0000125 var_sp->DisableParserVars();
Sean Callananaa301c42010-12-03 01:38:59 +0000126 }
127
Greg Clayton427f2902010-12-14 02:59:59 +0000128 for (size_t pvar_index = 0, num_pvars = m_parser_vars->m_persistent_vars->GetSize();
Sean Callananaa301c42010-12-03 01:38:59 +0000129 pvar_index < num_pvars;
130 ++pvar_index)
131 {
Greg Clayton427f2902010-12-14 02:59:59 +0000132 ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariableAtIndex(pvar_index));
133 if (pvar_sp)
134 pvar_sp->DisableParserVars();
Sean Callananaa301c42010-12-03 01:38:59 +0000135 }
136
137 DisableParserVars();
Sean Callanan7a60b942010-10-08 01:58:41 +0000138 }
Chris Lattner24943d22010-06-08 16:52:24 +0000139}
140
Sean Callanan8bce6652010-07-13 21:41:46 +0000141// Interface for IRForTarget
142
Sean Callanan47dc4572011-09-15 02:13:07 +0000143ClangExpressionDeclMap::TargetInfo
144ClangExpressionDeclMap::GetTargetInfo()
145{
146 assert (m_parser_vars.get());
147
148 TargetInfo ret;
149
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000150 ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
151
152 Process *process = exe_ctx.GetProcessPtr();
153 if (process)
Sean Callanan47dc4572011-09-15 02:13:07 +0000154 {
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000155 ret.byte_order = process->GetByteOrder();
156 ret.address_byte_size = process->GetAddressByteSize();
157 }
158 else
159 {
160 Target *target = exe_ctx.GetTargetPtr();
161 if (target)
Greg Clayton567e7f32011-09-22 04:58:26 +0000162 {
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000163 ret.byte_order = target->GetArchitecture().GetByteOrder();
164 ret.address_byte_size = target->GetArchitecture().GetAddressByteSize();
Greg Clayton567e7f32011-09-22 04:58:26 +0000165 }
Sean Callanan47dc4572011-09-15 02:13:07 +0000166 }
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000167
Sean Callanan47dc4572011-09-15 02:13:07 +0000168 return ret;
169}
170
Greg Clayton8de27c72010-10-15 22:48:33 +0000171const ConstString &
172ClangExpressionDeclMap::GetPersistentResultName ()
Sean Callanan82b74c82010-08-12 01:56:52 +0000173{
Sean Callananaa301c42010-12-03 01:38:59 +0000174 assert (m_struct_vars.get());
175 assert (m_parser_vars.get());
Sean Callananaa301c42010-12-03 01:38:59 +0000176 if (!m_struct_vars->m_result_name)
Greg Clayton427f2902010-12-14 02:59:59 +0000177 {
178 Target *target = m_parser_vars->GetTarget();
179 assert (target);
180 m_struct_vars->m_result_name = target->GetPersistentVariables().GetNextPersistentVariableName();
181 }
Sean Callananaa301c42010-12-03 01:38:59 +0000182 return m_struct_vars->m_result_name;
Sean Callanan82b74c82010-08-12 01:56:52 +0000183}
184
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000185lldb::ClangExpressionVariableSP
186ClangExpressionDeclMap::BuildIntegerVariable (const ConstString &name,
187 lldb_private::TypeFromParser type,
188 const llvm::APInt& value)
189{
190 assert (m_parser_vars.get());
Sean Callanan166ba102011-08-01 18:18:33 +0000191
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000192 ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
193
194 Target *target = exe_ctx.GetTargetPtr();
195
196 if (!target)
197 return ClangExpressionVariableSP();
Greg Clayton567e7f32011-09-22 04:58:26 +0000198
199 ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000200
Sean Callanan5a55c7a2011-11-18 03:28:09 +0000201 TypeFromUser user_type(m_ast_importer->CopyType(context,
202 type.GetASTContext(),
203 type.GetOpaqueQualType()),
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000204 context);
Sean Callanan47dc4572011-09-15 02:13:07 +0000205
Sean Callanandc5fce12011-12-01 21:04:37 +0000206 if (!user_type.GetOpaqueQualType())
207 {
208 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
209
210 if (log)
211 log->Printf("ClangExpressionDeclMap::BuildIntegerVariable - Couldn't export the type for a constant integer result");
212
213 return lldb::ClangExpressionVariableSP();
214 }
215
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000216 if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx.GetBestExecutionContextScope (),
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000217 name,
Sean Callanan0e0817d2011-01-04 02:41:41 +0000218 user_type,
Sean Callanan47dc4572011-09-15 02:13:07 +0000219 m_parser_vars->m_target_info.byte_order,
220 m_parser_vars->m_target_info.address_byte_size))
Sean Callanan0e0817d2011-01-04 02:41:41 +0000221 return lldb::ClangExpressionVariableSP();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000222
Sean Callanan0e0817d2011-01-04 02:41:41 +0000223 ClangExpressionVariableSP pvar_sp (m_parser_vars->m_persistent_vars->GetVariable(name));
224
225 if (!pvar_sp)
226 return lldb::ClangExpressionVariableSP();
227
228 uint8_t *pvar_data = pvar_sp->GetValueBytes();
229 if (pvar_data == NULL)
230 return lldb::ClangExpressionVariableSP();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000231
232 uint64_t value64 = value.getLimitedValue();
Sean Callanan47dc4572011-09-15 02:13:07 +0000233
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000234 size_t num_val_bytes = sizeof(value64);
Sean Callanan0e0817d2011-01-04 02:41:41 +0000235 size_t num_data_bytes = pvar_sp->GetByteSize();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000236
237 size_t num_bytes = num_val_bytes;
238 if (num_bytes > num_data_bytes)
239 num_bytes = num_data_bytes;
240
Johnny Chen2bc9eb32011-07-19 19:48:13 +0000241 for (size_t byte_idx = 0;
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000242 byte_idx < num_bytes;
243 ++byte_idx)
244 {
245 uint64_t shift = byte_idx * 8;
246 uint64_t mask = 0xffll << shift;
247 uint8_t cur_byte = (uint8_t)((value64 & mask) >> shift);
248
Sean Callanan47dc4572011-09-15 02:13:07 +0000249 switch (m_parser_vars->m_target_info.byte_order)
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000250 {
Sean Callanan0e0817d2011-01-04 02:41:41 +0000251 case eByteOrderBig:
252 // High Low
253 // Original: |AABBCCDDEEFFGGHH|
254 // Target: |EEFFGGHH|
255
256 pvar_data[num_data_bytes - (1 + byte_idx)] = cur_byte;
257 break;
258 case eByteOrderLittle:
259 // Target: |HHGGFFEE|
260 pvar_data[byte_idx] = cur_byte;
261 break;
262 default:
263 return lldb::ClangExpressionVariableSP();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000264 }
265 }
Sean Callanan6a925532011-01-13 08:53:35 +0000266
267 pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried;
Sean Callanan696cf5f2011-05-07 01:06:41 +0000268 pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
269 pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
Sean Callanan0e0817d2011-01-04 02:41:41 +0000270
271 return pvar_sp;
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000272}
273
Sean Callanan696cf5f2011-05-07 01:06:41 +0000274lldb::ClangExpressionVariableSP
275ClangExpressionDeclMap::BuildCastVariable (const ConstString &name,
Sean Callanan9b6898f2011-07-30 02:42:06 +0000276 VarDecl *decl,
Sean Callanan696cf5f2011-05-07 01:06:41 +0000277 lldb_private::TypeFromParser type)
278{
279 assert (m_parser_vars.get());
280
281 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
282
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000283 ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
284 Target *target = exe_ctx.GetTargetPtr();
Greg Clayton567e7f32011-09-22 04:58:26 +0000285 if (target == NULL)
286 return lldb::ClangExpressionVariableSP();
287
288 ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
Sean Callanan696cf5f2011-05-07 01:06:41 +0000289
290 ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl));
291
292 if (!var_sp)
293 var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl);
294
295 if (!var_sp)
296 return ClangExpressionVariableSP();
297
Sean Callanan5a55c7a2011-11-18 03:28:09 +0000298 TypeFromUser user_type(m_ast_importer->CopyType(context,
299 type.GetASTContext(),
300 type.GetOpaqueQualType()),
Sean Callanan696cf5f2011-05-07 01:06:41 +0000301 context);
302
Sean Callanandc5fce12011-12-01 21:04:37 +0000303 if (!user_type.GetOpaqueQualType())
Jason Molendabf41e192012-10-04 22:47:07 +0000304 {
Sean Callanandc5fce12011-12-01 21:04:37 +0000305 if (log)
306 log->Printf("ClangExpressionDeclMap::BuildCastVariable - Couldn't export the type for a constant cast result");
307
308 return lldb::ClangExpressionVariableSP();
309 }
310
Sean Callanan696cf5f2011-05-07 01:06:41 +0000311 TypeFromUser var_type = var_sp->GetTypeFromUser();
312
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000313 StackFrame *frame = exe_ctx.GetFramePtr();
Greg Clayton567e7f32011-09-22 04:58:26 +0000314 if (frame == NULL)
315 return lldb::ClangExpressionVariableSP();
316
317 VariableSP var = FindVariableInScope (*frame, var_sp->GetName(), &var_type);
Sean Callanan696cf5f2011-05-07 01:06:41 +0000318
319 if (!var)
320 return lldb::ClangExpressionVariableSP(); // but we should handle this; it may be a persistent variable
321
Greg Clayton567e7f32011-09-22 04:58:26 +0000322 ValueObjectSP var_valobj = frame->GetValueObjectForFrameVariable(var, lldb::eNoDynamicValues);
Sean Callanan696cf5f2011-05-07 01:06:41 +0000323
324 if (!var_valobj)
325 return lldb::ClangExpressionVariableSP();
326
327 ValueObjectSP var_casted_valobj = var_valobj->CastPointerType(name.GetCString(), user_type);
328
329 if (!var_casted_valobj)
330 return lldb::ClangExpressionVariableSP();
331
332 if (log)
333 {
334 StreamString my_stream_string;
335
336 ClangASTType::DumpTypeDescription (var_type.GetASTContext(),
337 var_type.GetOpaqueQualType(),
338 &my_stream_string);
339
340
341 log->Printf("Building cast variable to type: %s", my_stream_string.GetString().c_str());
342 }
343
344 ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->CreatePersistentVariable (var_casted_valobj);
345
346 if (!pvar_sp)
347 return lldb::ClangExpressionVariableSP();
348
349 if (pvar_sp != m_parser_vars->m_persistent_vars->GetVariable(name))
350 return lldb::ClangExpressionVariableSP();
351
352 pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried;
353 pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
354 pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
355
356 return pvar_sp;
357}
358
Sean Callanan47dc4572011-09-15 02:13:07 +0000359bool
360ClangExpressionDeclMap::ResultIsReference (const ConstString &name)
361{
362 ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name);
363
364 return (pvar_sp->m_flags & ClangExpressionVariable::EVIsProgramReference);
365}
366
367bool
368ClangExpressionDeclMap::CompleteResultVariable (lldb::ClangExpressionVariableSP &valobj,
369 lldb_private::Value &value,
370 const ConstString &name,
Sean Callanana8428a42011-09-22 00:41:11 +0000371 lldb_private::TypeFromParser type,
Sean Callanan557ccd62011-10-21 05:18:02 +0000372 bool transient,
373 bool maybe_make_load)
Sean Callanan47dc4572011-09-15 02:13:07 +0000374{
375 assert (m_parser_vars.get());
376
377 ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name);
378
379 if (!pvar_sp)
380 return false;
Sean Callanan557ccd62011-10-21 05:18:02 +0000381
382 if (maybe_make_load &&
383 value.GetValueType() == Value::eValueTypeFileAddress &&
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000384 m_parser_vars->m_exe_ctx.GetProcessPtr())
Sean Callanan557ccd62011-10-21 05:18:02 +0000385 {
386 value.SetValueType(Value::eValueTypeLoadAddress);
387 }
Sean Callanan47dc4572011-09-15 02:13:07 +0000388
389 if (pvar_sp->m_flags & ClangExpressionVariable::EVIsProgramReference &&
Sean Callanana8428a42011-09-22 00:41:11 +0000390 !pvar_sp->m_live_sp &&
391 !transient)
Sean Callanan47dc4572011-09-15 02:13:07 +0000392 {
393 // The reference comes from the program. We need to set up a live SP for it.
394
Johnny Chendfafa142011-12-16 23:04:52 +0000395 unsigned long long address = value.GetScalar().ULongLong();
396 AddressType address_type = value.GetValueAddressType();
397
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000398 pvar_sp->m_live_sp = ValueObjectConstResult::Create(m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(),
Sean Callanan47dc4572011-09-15 02:13:07 +0000399 pvar_sp->GetTypeFromUser().GetASTContext(),
400 pvar_sp->GetTypeFromUser().GetOpaqueQualType(),
401 pvar_sp->GetName(),
Johnny Chendfafa142011-12-16 23:04:52 +0000402 address,
403 address_type,
Sean Callanan47dc4572011-09-15 02:13:07 +0000404 pvar_sp->GetByteSize());
405 }
406
407 if (pvar_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry)
408 {
409 pvar_sp->ValueUpdated();
410
411 const size_t pvar_byte_size = pvar_sp->GetByteSize();
412 uint8_t *pvar_data = pvar_sp->GetValueBytes();
413
Sean Callanan8f2e3922012-02-04 08:49:35 +0000414 if (!ReadTarget(pvar_data, value, pvar_byte_size))
415 return false;
Sean Callanan47dc4572011-09-15 02:13:07 +0000416
417 pvar_sp->m_flags &= ~(ClangExpressionVariable::EVNeedsFreezeDry);
418 }
419
420 valobj = pvar_sp;
421
422 return true;
423}
424
Sean Callanan8f2e3922012-02-04 08:49:35 +0000425void
426ClangExpressionDeclMap::RemoveResultVariable
427(
428 const ConstString &name
429)
430{
431 ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name);
432 m_parser_vars->m_persistent_vars->RemovePersistentVariable(pvar_sp);
433}
434
Sean Callanan8bce6652010-07-13 21:41:46 +0000435bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000436ClangExpressionDeclMap::AddPersistentVariable
437(
Sean Callanan9b6898f2011-07-30 02:42:06 +0000438 const NamedDecl *decl,
Greg Clayton8de27c72010-10-15 22:48:33 +0000439 const ConstString &name,
Sean Callanan6a925532011-01-13 08:53:35 +0000440 TypeFromParser parser_type,
441 bool is_result,
442 bool is_lvalue
Greg Clayton8de27c72010-10-15 22:48:33 +0000443)
Sean Callanana48fe162010-08-11 03:57:18 +0000444{
Sean Callananaa301c42010-12-03 01:38:59 +0000445 assert (m_parser_vars.get());
446
Sean Callanan6a925532011-01-13 08:53:35 +0000447 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000448 ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
449 Target *target = exe_ctx.GetTargetPtr();
Greg Clayton567e7f32011-09-22 04:58:26 +0000450 if (target == NULL)
451 return false;
452
453 ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
Sean Callanana48fe162010-08-11 03:57:18 +0000454
Sean Callanan0539a802011-12-16 21:06:35 +0000455 TypeFromUser user_type(m_ast_importer->DeportType(context,
456 parser_type.GetASTContext(),
457 parser_type.GetOpaqueQualType()),
Sean Callanan97678d12011-01-13 21:23:32 +0000458 context);
Sean Callanan5a55c7a2011-11-18 03:28:09 +0000459
460 if (!user_type.GetOpaqueQualType())
461 {
462 if (log)
463 log->Printf("Persistent variable's type wasn't copied successfully");
464 return false;
465 }
Sean Callanan47dc4572011-09-15 02:13:07 +0000466
467 if (!m_parser_vars->m_target_info.IsValid())
468 return false;
Sean Callanana48fe162010-08-11 03:57:18 +0000469
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000470 if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx.GetBestExecutionContextScope (),
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000471 name,
Greg Clayton427f2902010-12-14 02:59:59 +0000472 user_type,
Sean Callanan47dc4572011-09-15 02:13:07 +0000473 m_parser_vars->m_target_info.byte_order,
474 m_parser_vars->m_target_info.address_byte_size))
Sean Callanan8c127202010-08-23 23:09:38 +0000475 return false;
476
Greg Clayton427f2902010-12-14 02:59:59 +0000477 ClangExpressionVariableSP var_sp (m_parser_vars->m_persistent_vars->GetVariable(name));
Sean Callanan8c127202010-08-23 23:09:38 +0000478
Greg Clayton427f2902010-12-14 02:59:59 +0000479 if (!var_sp)
Sean Callanan8c127202010-08-23 23:09:38 +0000480 return false;
481
Sean Callananbf346eb2012-09-20 23:21:16 +0000482 var_sp->m_frozen_sp->SetHasCompleteType();
483
Sean Callanan6a925532011-01-13 08:53:35 +0000484 if (is_result)
485 var_sp->m_flags |= ClangExpressionVariable::EVNeedsFreezeDry;
486 else
487 var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget; // explicitly-declared persistent variables should persist
488
489 if (is_lvalue)
490 {
491 var_sp->m_flags |= ClangExpressionVariable::EVIsProgramReference;
492 }
493 else
494 {
495 var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
496 var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
497 }
498
499 if (log)
500 log->Printf("Created persistent variable with flags 0x%hx", var_sp->m_flags);
501
Greg Clayton427f2902010-12-14 02:59:59 +0000502 var_sp->EnableParserVars();
Sean Callanan8c127202010-08-23 23:09:38 +0000503
Greg Clayton427f2902010-12-14 02:59:59 +0000504 var_sp->m_parser_vars->m_named_decl = decl;
505 var_sp->m_parser_vars->m_parser_type = parser_type;
Sean Callanan8c127202010-08-23 23:09:38 +0000506
507 return true;
Sean Callanana48fe162010-08-11 03:57:18 +0000508}
509
510bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000511ClangExpressionDeclMap::AddValueToStruct
512(
Sean Callanan9b6898f2011-07-30 02:42:06 +0000513 const NamedDecl *decl,
Greg Clayton8de27c72010-10-15 22:48:33 +0000514 const ConstString &name,
515 llvm::Value *value,
516 size_t size,
517 off_t alignment
518)
Sean Callanan8bce6652010-07-13 21:41:46 +0000519{
Sean Callananaa301c42010-12-03 01:38:59 +0000520 assert (m_struct_vars.get());
521 assert (m_parser_vars.get());
522
Greg Claytone005f2c2010-11-06 01:53:30 +0000523 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan45690fe2010-08-30 22:17:16 +0000524
Sean Callananaa301c42010-12-03 01:38:59 +0000525 m_struct_vars->m_struct_laid_out = false;
Sean Callanan8bce6652010-07-13 21:41:46 +0000526
Sean Callanan8c127202010-08-23 23:09:38 +0000527 if (m_struct_members.GetVariable(decl))
528 return true;
Sean Callanan8bce6652010-07-13 21:41:46 +0000529
Greg Clayton427f2902010-12-14 02:59:59 +0000530 ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl));
Sean Callanan8bce6652010-07-13 21:41:46 +0000531
Greg Clayton427f2902010-12-14 02:59:59 +0000532 if (!var_sp)
533 var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl);
Sean Callanan8bce6652010-07-13 21:41:46 +0000534
Greg Clayton427f2902010-12-14 02:59:59 +0000535 if (!var_sp)
Sean Callanan8c127202010-08-23 23:09:38 +0000536 return false;
537
Sean Callanan45690fe2010-08-30 22:17:16 +0000538 if (log)
Sean Callanan5a55c7a2011-11-18 03:28:09 +0000539 log->Printf("Adding value for (NamedDecl*)%p [%s - %s] to the structure",
Sean Callanan45690fe2010-08-30 22:17:16 +0000540 decl,
Greg Clayton8de27c72010-10-15 22:48:33 +0000541 name.GetCString(),
Greg Clayton427f2902010-12-14 02:59:59 +0000542 var_sp->GetName().GetCString());
Sean Callanan45690fe2010-08-30 22:17:16 +0000543
Sean Callanan8c127202010-08-23 23:09:38 +0000544 // We know entity->m_parser_vars is valid because we used a parser variable
545 // to find it
Greg Clayton427f2902010-12-14 02:59:59 +0000546 var_sp->m_parser_vars->m_llvm_value = value;
Sean Callanan8c127202010-08-23 23:09:38 +0000547
Greg Clayton427f2902010-12-14 02:59:59 +0000548 var_sp->EnableJITVars();
549 var_sp->m_jit_vars->m_alignment = alignment;
550 var_sp->m_jit_vars->m_size = size;
Sean Callanan8c127202010-08-23 23:09:38 +0000551
Greg Clayton427f2902010-12-14 02:59:59 +0000552 m_struct_members.AddVariable(var_sp);
Sean Callanan8bce6652010-07-13 21:41:46 +0000553
554 return true;
555}
556
557bool
558ClangExpressionDeclMap::DoStructLayout ()
559{
Sean Callananaa301c42010-12-03 01:38:59 +0000560 assert (m_struct_vars.get());
561
562 if (m_struct_vars->m_struct_laid_out)
Sean Callanan8bce6652010-07-13 21:41:46 +0000563 return true;
564
Sean Callanan8bce6652010-07-13 21:41:46 +0000565 off_t cursor = 0;
566
Sean Callananaa301c42010-12-03 01:38:59 +0000567 m_struct_vars->m_struct_alignment = 0;
568 m_struct_vars->m_struct_size = 0;
Sean Callanan8bce6652010-07-13 21:41:46 +0000569
Greg Clayton427f2902010-12-14 02:59:59 +0000570 for (size_t member_index = 0, num_members = m_struct_members.GetSize();
Sean Callanan8c127202010-08-23 23:09:38 +0000571 member_index < num_members;
572 ++member_index)
Sean Callanan8bce6652010-07-13 21:41:46 +0000573 {
Greg Clayton427f2902010-12-14 02:59:59 +0000574 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
575 if (!member_sp)
576 return false;
577
578 if (!member_sp->m_jit_vars.get())
Sean Callanan8c127202010-08-23 23:09:38 +0000579 return false;
Sean Callanan8bce6652010-07-13 21:41:46 +0000580
Sean Callanan8c127202010-08-23 23:09:38 +0000581 if (member_index == 0)
Greg Clayton427f2902010-12-14 02:59:59 +0000582 m_struct_vars->m_struct_alignment = member_sp->m_jit_vars->m_alignment;
Sean Callanan8c127202010-08-23 23:09:38 +0000583
Greg Clayton427f2902010-12-14 02:59:59 +0000584 if (cursor % member_sp->m_jit_vars->m_alignment)
585 cursor += (member_sp->m_jit_vars->m_alignment - (cursor % member_sp->m_jit_vars->m_alignment));
Sean Callanan8c127202010-08-23 23:09:38 +0000586
Greg Clayton427f2902010-12-14 02:59:59 +0000587 member_sp->m_jit_vars->m_offset = cursor;
588 cursor += member_sp->m_jit_vars->m_size;
Sean Callanan8bce6652010-07-13 21:41:46 +0000589 }
590
Sean Callananaa301c42010-12-03 01:38:59 +0000591 m_struct_vars->m_struct_size = cursor;
Sean Callanan8bce6652010-07-13 21:41:46 +0000592
Sean Callananaa301c42010-12-03 01:38:59 +0000593 m_struct_vars->m_struct_laid_out = true;
Sean Callanan8bce6652010-07-13 21:41:46 +0000594 return true;
595}
596
Greg Clayton8de27c72010-10-15 22:48:33 +0000597bool ClangExpressionDeclMap::GetStructInfo
598(
599 uint32_t &num_elements,
600 size_t &size,
601 off_t &alignment
602)
Sean Callanan8bce6652010-07-13 21:41:46 +0000603{
Sean Callananaa301c42010-12-03 01:38:59 +0000604 assert (m_struct_vars.get());
605
606 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan8bce6652010-07-13 21:41:46 +0000607 return false;
608
Greg Clayton427f2902010-12-14 02:59:59 +0000609 num_elements = m_struct_members.GetSize();
Sean Callananaa301c42010-12-03 01:38:59 +0000610 size = m_struct_vars->m_struct_size;
611 alignment = m_struct_vars->m_struct_alignment;
Sean Callanan8bce6652010-07-13 21:41:46 +0000612
613 return true;
614}
615
616bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000617ClangExpressionDeclMap::GetStructElement
618(
Sean Callanan9b6898f2011-07-30 02:42:06 +0000619 const NamedDecl *&decl,
Greg Clayton8de27c72010-10-15 22:48:33 +0000620 llvm::Value *&value,
621 off_t &offset,
622 ConstString &name,
623 uint32_t index
624)
Sean Callanan8bce6652010-07-13 21:41:46 +0000625{
Sean Callananaa301c42010-12-03 01:38:59 +0000626 assert (m_struct_vars.get());
627
628 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan8bce6652010-07-13 21:41:46 +0000629 return false;
630
Greg Clayton427f2902010-12-14 02:59:59 +0000631 if (index >= m_struct_members.GetSize())
Sean Callanan8bce6652010-07-13 21:41:46 +0000632 return false;
633
Greg Clayton427f2902010-12-14 02:59:59 +0000634 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(index));
Sean Callanan8bce6652010-07-13 21:41:46 +0000635
Greg Clayton427f2902010-12-14 02:59:59 +0000636 if (!member_sp ||
637 !member_sp->m_parser_vars.get() ||
Sean Callanan53a5a992012-04-12 16:58:26 +0000638 !member_sp->m_jit_vars.get() ||
639 !member_sp->GetValueObject())
Sean Callanan8c127202010-08-23 23:09:38 +0000640 return false;
641
Greg Clayton427f2902010-12-14 02:59:59 +0000642 decl = member_sp->m_parser_vars->m_named_decl;
643 value = member_sp->m_parser_vars->m_llvm_value;
644 offset = member_sp->m_jit_vars->m_offset;
645 name = member_sp->GetName();
Sean Callanan8c127202010-08-23 23:09:38 +0000646
Sean Callanan8bce6652010-07-13 21:41:46 +0000647 return true;
648}
649
Sean Callanan02fbafa2010-07-27 21:39:39 +0000650bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000651ClangExpressionDeclMap::GetFunctionInfo
652(
Sean Callanan9b6898f2011-07-30 02:42:06 +0000653 const NamedDecl *decl,
Greg Clayton8de27c72010-10-15 22:48:33 +0000654 uint64_t &ptr
655)
Sean Callananba992c52010-07-27 02:07:53 +0000656{
Greg Clayton427f2902010-12-14 02:59:59 +0000657 ClangExpressionVariableSP entity_sp(m_found_entities.GetVariable(decl));
Sean Callanan8c127202010-08-23 23:09:38 +0000658
Greg Clayton427f2902010-12-14 02:59:59 +0000659 if (!entity_sp)
Sean Callanan8c127202010-08-23 23:09:38 +0000660 return false;
Sean Callananba992c52010-07-27 02:07:53 +0000661
Sean Callanan8c127202010-08-23 23:09:38 +0000662 // We know m_parser_vars is valid since we searched for the variable by
663 // its NamedDecl
Sean Callananba992c52010-07-27 02:07:53 +0000664
Greg Clayton427f2902010-12-14 02:59:59 +0000665 ptr = entity_sp->m_parser_vars->m_lldb_value->GetScalar().ULongLong();
Sean Callanan8c127202010-08-23 23:09:38 +0000666
667 return true;
Sean Callananba992c52010-07-27 02:07:53 +0000668}
669
Sean Callananca2516d2011-08-16 18:09:29 +0000670static void
671FindCodeSymbolInContext
672(
673 const ConstString &name,
674 SymbolContext &sym_ctx,
675 SymbolContextList &sc_list
676)
677{
678 if (sym_ctx.module_sp)
Sean Callananaa4a5532011-10-13 16:49:47 +0000679 sym_ctx.module_sp->FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list);
Sean Callananca2516d2011-08-16 18:09:29 +0000680
681 if (!sc_list.GetSize())
682 sym_ctx.target_sp->GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list);
683}
684
Sean Callananf5857a02010-07-31 01:32:05 +0000685bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000686ClangExpressionDeclMap::GetFunctionAddress
687(
688 const ConstString &name,
Greg Claytonda7af842011-05-18 22:01:49 +0000689 uint64_t &func_addr
Greg Clayton8de27c72010-10-15 22:48:33 +0000690)
Sean Callananf5857a02010-07-31 01:32:05 +0000691{
Sean Callananaa301c42010-12-03 01:38:59 +0000692 assert (m_parser_vars.get());
693
Sean Callananaba367e2011-05-13 18:27:02 +0000694 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000695 ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
696 Target *target = exe_ctx.GetTargetPtr();
Sean Callananf5857a02010-07-31 01:32:05 +0000697 // Back out in all cases where we're not fully initialized
Greg Clayton567e7f32011-09-22 04:58:26 +0000698 if (target == NULL)
Jim Ingham78b9ee82010-12-07 01:56:02 +0000699 return false;
700 if (!m_parser_vars->m_sym_ctx.target_sp)
Sean Callananf5857a02010-07-31 01:32:05 +0000701 return false;
702
Greg Claytone5748d82010-11-09 23:46:37 +0000703 SymbolContextList sc_list;
Sean Callananf5857a02010-07-31 01:32:05 +0000704
Sean Callananca2516d2011-08-16 18:09:29 +0000705 FindCodeSymbolInContext(name, m_parser_vars->m_sym_ctx, sc_list);
706
Greg Claytone5748d82010-11-09 23:46:37 +0000707 if (!sc_list.GetSize())
Sean Callananaba367e2011-05-13 18:27:02 +0000708 {
709 // We occasionally get debug information in which a const function is reported
710 // as non-const, so the mangled name is wrong. This is a hack to compensate.
711
Sean Callanan0eb21392011-10-25 18:02:05 +0000712 if (!strncmp(name.GetCString(), "_ZN", 3) &&
713 strncmp(name.GetCString(), "_ZNK", 4))
Sean Callananaba367e2011-05-13 18:27:02 +0000714 {
Sean Callanan0eb21392011-10-25 18:02:05 +0000715 std::string fixed_scratch("_ZNK");
716 fixed_scratch.append(name.GetCString() + 3);
717 ConstString fixed_name(fixed_scratch.c_str());
Sean Callananaba367e2011-05-13 18:27:02 +0000718
719 if (log)
Sean Callanan0eb21392011-10-25 18:02:05 +0000720 log->Printf("Failed to find symbols given non-const name %s; trying %s", name.GetCString(), fixed_name.GetCString());
721
722 FindCodeSymbolInContext(fixed_name, m_parser_vars->m_sym_ctx, sc_list);
Sean Callananaba367e2011-05-13 18:27:02 +0000723 }
724 }
725
726 if (!sc_list.GetSize())
Sean Callananf5857a02010-07-31 01:32:05 +0000727 return false;
728
729 SymbolContext sym_ctx;
Greg Claytone5748d82010-11-09 23:46:37 +0000730 sc_list.GetContextAtIndex(0, sym_ctx);
Sean Callananf5857a02010-07-31 01:32:05 +0000731
Greg Claytonda7af842011-05-18 22:01:49 +0000732 const Address *func_so_addr = NULL;
Sean Callananf5857a02010-07-31 01:32:05 +0000733
734 if (sym_ctx.function)
Greg Claytonda7af842011-05-18 22:01:49 +0000735 func_so_addr = &sym_ctx.function->GetAddressRange().GetBaseAddress();
Sean Callananf5857a02010-07-31 01:32:05 +0000736 else if (sym_ctx.symbol)
Greg Clayton0c31d3d2012-03-07 21:03:09 +0000737 func_so_addr = &sym_ctx.symbol->GetAddress();
Sean Callananf5857a02010-07-31 01:32:05 +0000738 else
739 return false;
740
Sean Callananae9f7482011-07-07 23:05:43 +0000741 if (!func_so_addr || !func_so_addr->IsValid())
742 return false;
743
Greg Clayton567e7f32011-09-22 04:58:26 +0000744 func_addr = func_so_addr->GetCallableLoadAddress (target);
Greg Claytonda7af842011-05-18 22:01:49 +0000745
Sean Callananf5857a02010-07-31 01:32:05 +0000746 return true;
747}
748
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000749addr_t
Sean Callanan21ef5bb2011-12-01 02:04:16 +0000750ClangExpressionDeclMap::GetSymbolAddress (Target &target, const ConstString &name, lldb::SymbolType symbol_type)
Sean Callananc7674af2011-01-17 23:42:46 +0000751{
Sean Callananc7674af2011-01-17 23:42:46 +0000752 SymbolContextList sc_list;
753
Sean Callanan21ef5bb2011-12-01 02:04:16 +0000754 target.GetImages().FindSymbolsWithNameAndType(name, symbol_type, sc_list);
Sean Callananc7674af2011-01-17 23:42:46 +0000755
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000756 const uint32_t num_matches = sc_list.GetSize();
757 addr_t symbol_load_addr = LLDB_INVALID_ADDRESS;
758
Sean Callanan21ef5bb2011-12-01 02:04:16 +0000759 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 +0000760 {
761 SymbolContext sym_ctx;
762 sc_list.GetContextAtIndex(i, sym_ctx);
Sean Callananc7674af2011-01-17 23:42:46 +0000763
Greg Clayton0c31d3d2012-03-07 21:03:09 +0000764 const Address *sym_address = &sym_ctx.symbol->GetAddress();
Sean Callananae9f7482011-07-07 23:05:43 +0000765
766 if (!sym_address || !sym_address->IsValid())
767 return LLDB_INVALID_ADDRESS;
768
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000769 if (sym_address)
770 {
771 switch (sym_ctx.symbol->GetType())
772 {
773 case eSymbolTypeCode:
774 case eSymbolTypeTrampoline:
775 symbol_load_addr = sym_address->GetCallableLoadAddress (&target);
776 break;
777
778 case eSymbolTypeData:
779 case eSymbolTypeRuntime:
780 case eSymbolTypeVariable:
781 case eSymbolTypeLocal:
782 case eSymbolTypeParam:
783 case eSymbolTypeInvalid:
784 case eSymbolTypeAbsolute:
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000785 case eSymbolTypeException:
786 case eSymbolTypeSourceFile:
787 case eSymbolTypeHeaderFile:
788 case eSymbolTypeObjectFile:
789 case eSymbolTypeCommonBlock:
790 case eSymbolTypeBlock:
791 case eSymbolTypeVariableType:
792 case eSymbolTypeLineEntry:
793 case eSymbolTypeLineHeader:
794 case eSymbolTypeScopeBegin:
795 case eSymbolTypeScopeEnd:
796 case eSymbolTypeAdditional:
797 case eSymbolTypeCompiler:
798 case eSymbolTypeInstrumentation:
799 case eSymbolTypeUndefined:
Greg Clayton3f69eac2011-12-03 02:30:59 +0000800 case eSymbolTypeObjCClass:
801 case eSymbolTypeObjCMetaClass:
802 case eSymbolTypeObjCIVar:
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000803 symbol_load_addr = sym_address->GetLoadAddress (&target);
804 break;
805 }
806 }
807 }
Sean Callananc7674af2011-01-17 23:42:46 +0000808
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000809 return symbol_load_addr;
Sean Callananc7674af2011-01-17 23:42:46 +0000810}
811
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000812addr_t
Sean Callanan21ef5bb2011-12-01 02:04:16 +0000813ClangExpressionDeclMap::GetSymbolAddress (const ConstString &name, lldb::SymbolType symbol_type)
Sean Callanan81974962011-05-08 02:21:26 +0000814{
815 assert (m_parser_vars.get());
816
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000817 if (!m_parser_vars->m_exe_ctx.GetTargetPtr())
Sean Callanan81974962011-05-08 02:21:26 +0000818 return false;
819
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000820 return GetSymbolAddress(m_parser_vars->m_exe_ctx.GetTargetRef(), name, symbol_type);
Sean Callanan81974962011-05-08 02:21:26 +0000821}
822
Sean Callanan47dc4572011-09-15 02:13:07 +0000823// Interface for IRInterpreter
824
Sean Callanan557ccd62011-10-21 05:18:02 +0000825Value
826ClangExpressionDeclMap::WrapBareAddress (lldb::addr_t addr)
827{
828 Value ret;
829
830 ret.SetContext(Value::eContextTypeInvalid, NULL);
831
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000832 if (m_parser_vars->m_exe_ctx.GetProcessPtr())
Sean Callanan557ccd62011-10-21 05:18:02 +0000833 ret.SetValueType(Value::eValueTypeLoadAddress);
834 else
835 ret.SetValueType(Value::eValueTypeFileAddress);
836
837 ret.GetScalar() = (unsigned long long)addr;
838
839 return ret;
840}
841
Sean Callanan47dc4572011-09-15 02:13:07 +0000842bool
843ClangExpressionDeclMap::WriteTarget (lldb_private::Value &value,
844 const uint8_t *data,
845 size_t length)
846{
847 assert (m_parser_vars.get());
848
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000849 ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
Sean Callanan47dc4572011-09-15 02:13:07 +0000850
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000851 Process *process = exe_ctx.GetProcessPtr();
Sean Callanan47dc4572011-09-15 02:13:07 +0000852 if (value.GetContextType() == Value::eContextTypeRegisterInfo)
853 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000854 if (!process)
Sean Callanan47dc4572011-09-15 02:13:07 +0000855 return false;
856
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000857 RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
Sean Callanan47dc4572011-09-15 02:13:07 +0000858 RegisterInfo *reg_info = value.GetRegisterInfo();
859
860 if (!reg_ctx)
861 return false;
862
863 lldb_private::RegisterValue reg_value;
864 Error err;
865
Greg Clayton567e7f32011-09-22 04:58:26 +0000866 if (!reg_value.SetFromMemoryData (reg_info, data, length, process->GetByteOrder(), err))
Sean Callanan47dc4572011-09-15 02:13:07 +0000867 return false;
868
869 return reg_ctx->WriteRegister(reg_info, reg_value);
870 }
871 else
872 {
873 switch (value.GetValueType())
874 {
875 default:
876 return false;
877 case Value::eValueTypeFileAddress:
878 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000879 if (!process)
Sean Callanan47dc4572011-09-15 02:13:07 +0000880 return false;
881
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000882 Target *target = exe_ctx.GetTargetPtr();
Sean Callanan47dc4572011-09-15 02:13:07 +0000883 Address file_addr;
884
Greg Clayton567e7f32011-09-22 04:58:26 +0000885 if (!target->GetImages().ResolveFileAddress((lldb::addr_t)value.GetScalar().ULongLong(), file_addr))
Sean Callanan47dc4572011-09-15 02:13:07 +0000886 return false;
887
Greg Clayton567e7f32011-09-22 04:58:26 +0000888 lldb::addr_t load_addr = file_addr.GetLoadAddress(target);
Sean Callanan47dc4572011-09-15 02:13:07 +0000889
890 Error err;
Greg Clayton567e7f32011-09-22 04:58:26 +0000891 process->WriteMemory(load_addr, data, length, err);
Sean Callanan47dc4572011-09-15 02:13:07 +0000892
893 return err.Success();
894 }
895 case Value::eValueTypeLoadAddress:
896 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000897 if (!process)
Sean Callanan47dc4572011-09-15 02:13:07 +0000898 return false;
899
900 Error err;
Greg Clayton567e7f32011-09-22 04:58:26 +0000901 process->WriteMemory((lldb::addr_t)value.GetScalar().ULongLong(), data, length, err);
Sean Callanan47dc4572011-09-15 02:13:07 +0000902
903 return err.Success();
904 }
905 case Value::eValueTypeHostAddress:
Sean Callanane1301a62011-12-06 03:41:14 +0000906 {
907 if (value.GetScalar().ULongLong() == 0 || data == NULL)
908 return false;
909 memcpy ((void *)value.GetScalar().ULongLong(), data, length);
910 return true;
911 }
Sean Callanan47dc4572011-09-15 02:13:07 +0000912 case Value::eValueTypeScalar:
913 return false;
914 }
915 }
916}
917
918bool
919ClangExpressionDeclMap::ReadTarget (uint8_t *data,
920 lldb_private::Value &value,
921 size_t length)
922{
923 assert (m_parser_vars.get());
924
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000925 ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
Greg Clayton567e7f32011-09-22 04:58:26 +0000926
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000927 Process *process = exe_ctx.GetProcessPtr();
Greg Clayton567e7f32011-09-22 04:58:26 +0000928
Sean Callanan47dc4572011-09-15 02:13:07 +0000929 if (value.GetContextType() == Value::eContextTypeRegisterInfo)
930 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000931 if (!process)
Sean Callanan47dc4572011-09-15 02:13:07 +0000932 return false;
933
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000934 RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
Sean Callanan47dc4572011-09-15 02:13:07 +0000935 RegisterInfo *reg_info = value.GetRegisterInfo();
936
937 if (!reg_ctx)
938 return false;
939
940 lldb_private::RegisterValue reg_value;
941 Error err;
942
943 if (!reg_ctx->ReadRegister(reg_info, reg_value))
944 return false;
945
Greg Clayton567e7f32011-09-22 04:58:26 +0000946 return reg_value.GetAsMemoryData(reg_info, data, length, process->GetByteOrder(), err);
Sean Callanan47dc4572011-09-15 02:13:07 +0000947 }
948 else
949 {
950 switch (value.GetValueType())
951 {
952 default:
953 return false;
954 case Value::eValueTypeFileAddress:
955 {
Sean Callanandd1dcfd2012-02-10 01:22:05 +0000956 Target *target = exe_ctx.GetTargetPtr();
Greg Clayton567e7f32011-09-22 04:58:26 +0000957 if (target == NULL)
Sean Callanan47dc4572011-09-15 02:13:07 +0000958 return false;
959
960 Address file_addr;
961
Greg Clayton567e7f32011-09-22 04:58:26 +0000962 if (!target->GetImages().ResolveFileAddress((lldb::addr_t)value.GetScalar().ULongLong(), file_addr))
Sean Callanan47dc4572011-09-15 02:13:07 +0000963 return false;
964
965 Error err;
Sean Callananb2e8d192012-02-08 21:55:14 +0000966 target->ReadMemory(file_addr, false, data, length, err);
Sean Callanan47dc4572011-09-15 02:13:07 +0000967
968 return err.Success();
969 }
970 case Value::eValueTypeLoadAddress:
971 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000972 if (!process)
Sean Callanan47dc4572011-09-15 02:13:07 +0000973 return false;
974
975 Error err;
Greg Clayton567e7f32011-09-22 04:58:26 +0000976 process->ReadMemory((lldb::addr_t)value.GetScalar().ULongLong(), data, length, err);
Sean Callanan47dc4572011-09-15 02:13:07 +0000977
978 return err.Success();
979 }
980 case Value::eValueTypeHostAddress:
Sean Callanan5a55c7a2011-11-18 03:28:09 +0000981 {
982 void *host_addr = (void*)value.GetScalar().ULongLong();
983
984 if (!host_addr)
985 return false;
986
987 memcpy (data, host_addr, length);
Sean Callanan47dc4572011-09-15 02:13:07 +0000988 return true;
Sean Callanan5a55c7a2011-11-18 03:28:09 +0000989 }
Sean Callanan47dc4572011-09-15 02:13:07 +0000990 case Value::eValueTypeScalar:
991 return false;
992 }
993 }
994}
995
996lldb_private::Value
Sean Callanan52d0d022012-02-15 01:40:39 +0000997ClangExpressionDeclMap::LookupDecl (clang::NamedDecl *decl, ClangExpressionVariable::FlagType &flags)
Sean Callanan47dc4572011-09-15 02:13:07 +0000998{
999 assert (m_parser_vars.get());
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001000
Sean Callanan47dc4572011-09-15 02:13:07 +00001001 ClangExpressionVariableSP expr_var_sp (m_found_entities.GetVariable(decl));
1002 ClangExpressionVariableSP persistent_var_sp (m_parser_vars->m_persistent_vars->GetVariable(decl));
Sean Callanan1c38d102011-11-02 23:24:30 +00001003
Sean Callanan47dc4572011-09-15 02:13:07 +00001004 if (expr_var_sp)
1005 {
Sean Callanan52d0d022012-02-15 01:40:39 +00001006 flags = expr_var_sp->m_flags;
1007
Sean Callananb2e8d192012-02-08 21:55:14 +00001008 if (!expr_var_sp->m_parser_vars.get())
Sean Callanan6d284ef2011-10-12 22:20:02 +00001009 return Value();
1010
Sean Callanan1c38d102011-11-02 23:24:30 +00001011 bool is_reference = expr_var_sp->m_flags & ClangExpressionVariable::EVTypeIsReference;
Sean Callananb2e8d192012-02-08 21:55:14 +00001012
1013 if (expr_var_sp->m_parser_vars->m_lldb_var)
Sean Callanan1c38d102011-11-02 23:24:30 +00001014 {
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001015 std::auto_ptr<Value> value(GetVariableValue(expr_var_sp->m_parser_vars->m_lldb_var, NULL));
Sean Callanan1c38d102011-11-02 23:24:30 +00001016
Sean Callananb2e8d192012-02-08 21:55:14 +00001017 if (is_reference && value.get() && value->GetValueType() == Value::eValueTypeLoadAddress)
1018 {
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001019 Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr();
Sean Callananb2e8d192012-02-08 21:55:14 +00001020
1021 if (!process)
1022 return Value();
1023
1024 lldb::addr_t value_addr = value->GetScalar().ULongLong();
1025 Error read_error;
1026 addr_t ref_value = process->ReadPointerFromMemory (value_addr, read_error);
1027
1028 if (!read_error.Success())
1029 return Value();
1030
1031 value->GetScalar() = (unsigned long long)ref_value;
1032 }
Sean Callanan1c38d102011-11-02 23:24:30 +00001033
Sean Callananb2e8d192012-02-08 21:55:14 +00001034 if (value.get())
1035 return *value;
1036 else
1037 return Value();
1038 }
1039 else if (expr_var_sp->m_parser_vars->m_lldb_sym)
1040 {
Greg Clayton0c31d3d2012-03-07 21:03:09 +00001041 const Address sym_address = expr_var_sp->m_parser_vars->m_lldb_sym->GetAddress();
Sean Callananb2e8d192012-02-08 21:55:14 +00001042
1043 if (!sym_address.IsValid())
1044 return Value();
1045
1046 Value ret;
1047
Sean Callanan6cdedde2012-02-28 17:55:31 +00001048 ProcessSP process_sp (m_parser_vars->m_exe_ctx.GetProcessSP());
1049
1050 if (process_sp)
1051 {
1052 uint64_t symbol_load_addr = sym_address.GetLoadAddress(&process_sp->GetTarget());
1053
1054 ret.GetScalar() = symbol_load_addr;
1055 ret.SetValueType(Value::eValueTypeLoadAddress);
1056 }
1057 else
1058 {
1059 uint64_t symbol_file_addr = sym_address.GetFileAddress();
1060
1061 ret.GetScalar() = symbol_file_addr;
1062 ret.SetValueType(Value::eValueTypeFileAddress);
1063 }
Sean Callananb2e8d192012-02-08 21:55:14 +00001064
1065 return ret;
1066 }
Sean Callanan52d0d022012-02-15 01:40:39 +00001067 else if (RegisterInfo *reg_info = expr_var_sp->GetRegisterInfo())
1068 {
1069 StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
1070
1071 if (!frame)
1072 return Value();
1073
1074 RegisterContextSP reg_context_sp(frame->GetRegisterContextSP());
1075
1076 RegisterValue reg_value;
1077
1078 if (!reg_context_sp->ReadRegister(reg_info, reg_value))
1079 return Value();
1080
1081 Value ret;
1082
1083 ret.SetContext(Value::eContextTypeRegisterInfo, reg_info);
1084 if (!reg_value.GetScalarValue(ret.GetScalar()))
1085 return Value();
1086
1087 return ret;
1088 }
Sean Callanan4b3cef02011-10-26 21:20:00 +00001089 else
Sean Callananb2e8d192012-02-08 21:55:14 +00001090 {
Sean Callanan4b3cef02011-10-26 21:20:00 +00001091 return Value();
Sean Callananb2e8d192012-02-08 21:55:14 +00001092 }
Sean Callanan47dc4572011-09-15 02:13:07 +00001093 }
1094 else if (persistent_var_sp)
1095 {
Sean Callanan52d0d022012-02-15 01:40:39 +00001096 flags = persistent_var_sp->m_flags;
1097
Sean Callanana8428a42011-09-22 00:41:11 +00001098 if ((persistent_var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference ||
1099 persistent_var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) &&
Sean Callanan86a07da2011-10-22 01:58:08 +00001100 persistent_var_sp->m_live_sp &&
Sean Callananf48de6d2011-12-10 03:12:34 +00001101 ((persistent_var_sp->m_live_sp->GetValue().GetValueType() == Value::eValueTypeLoadAddress &&
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001102 m_parser_vars->m_exe_ctx.GetProcessSP() &&
1103 m_parser_vars->m_exe_ctx.GetProcessSP()->IsAlive()) ||
Sean Callananf48de6d2011-12-10 03:12:34 +00001104 (persistent_var_sp->m_live_sp->GetValue().GetValueType() == Value::eValueTypeFileAddress)))
Sean Callanana8428a42011-09-22 00:41:11 +00001105 {
Sean Callanan4b3cef02011-10-26 21:20:00 +00001106 return persistent_var_sp->m_live_sp->GetValue();
Sean Callanana8428a42011-09-22 00:41:11 +00001107 }
1108 else
1109 {
1110 lldb_private::Value ret;
1111 ret.SetValueType(Value::eValueTypeHostAddress);
1112 ret.SetContext(Value::eContextTypeInvalid, NULL);
1113 ret.GetScalar() = (lldb::addr_t)persistent_var_sp->GetValueBytes();
1114 return ret;
1115 }
Sean Callanan47dc4572011-09-15 02:13:07 +00001116 }
1117 else
1118 {
1119 return Value();
1120 }
1121}
1122
Sean Callanan4b3cef02011-10-26 21:20:00 +00001123Value
1124ClangExpressionDeclMap::GetSpecialValue (const ConstString &name)
1125{
1126 assert(m_parser_vars.get());
1127
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001128 StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
Sean Callanan4b3cef02011-10-26 21:20:00 +00001129
1130 if (!frame)
1131 return Value();
1132
1133 VariableList *vars = frame->GetVariableList(false);
1134
1135 if (!vars)
1136 return Value();
1137
1138 lldb::VariableSP var = vars->FindVariable(name);
1139
1140 if (!var ||
1141 !var->IsInScope(frame) ||
1142 !var->LocationIsValidForFrame (frame))
1143 return Value();
1144
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001145 std::auto_ptr<Value> value(GetVariableValue(var, NULL));
Sean Callanan4b3cef02011-10-26 21:20:00 +00001146
Sean Callanan41a410d2011-11-03 22:48:37 +00001147 if (value.get() && value->GetValueType() == Value::eValueTypeLoadAddress)
1148 {
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001149 Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr();
Sean Callanan41a410d2011-11-03 22:48:37 +00001150
1151 if (!process)
1152 return Value();
1153
1154 lldb::addr_t value_addr = value->GetScalar().ULongLong();
1155 Error read_error;
1156 addr_t ptr_value = process->ReadPointerFromMemory (value_addr, read_error);
1157
1158 if (!read_error.Success())
1159 return Value();
1160
1161 value->GetScalar() = (unsigned long long)ptr_value;
1162 }
1163
Sean Callanan4b3cef02011-10-26 21:20:00 +00001164 if (value.get())
1165 return *value;
1166 else
1167 return Value();
1168}
1169
Sean Callanan810f22d2010-07-16 00:09:46 +00001170// Interface for CommandObjectExpression
Sean Callananf328c9f2010-07-20 23:31:16 +00001171
1172bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001173ClangExpressionDeclMap::Materialize
1174(
Greg Clayton8de27c72010-10-15 22:48:33 +00001175 lldb::addr_t &struct_address,
1176 Error &err
1177)
Sean Callananf328c9f2010-07-20 23:31:16 +00001178{
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001179 if (!m_parser_vars.get())
1180 return false;
1181
Sean Callananaa301c42010-12-03 01:38:59 +00001182 EnableMaterialVars();
1183
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001184 m_material_vars->m_process = m_parser_vars->m_exe_ctx.GetProcessPtr();
Sean Callananaa301c42010-12-03 01:38:59 +00001185
Sean Callanan0ddf8062011-05-09 22:04:36 +00001186 bool result = DoMaterialize(false /* dematerialize */,
Sean Callanan0ddf8062011-05-09 22:04:36 +00001187 LLDB_INVALID_ADDRESS /* top of stack frame */,
1188 LLDB_INVALID_ADDRESS /* bottom of stack frame */,
1189 NULL, /* result SP */
1190 err);
Sean Callananf328c9f2010-07-20 23:31:16 +00001191
1192 if (result)
Sean Callananaa301c42010-12-03 01:38:59 +00001193 struct_address = m_material_vars->m_materialized_location;
Sean Callananf328c9f2010-07-20 23:31:16 +00001194
1195 return result;
1196}
1197
1198bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001199ClangExpressionDeclMap::GetObjectPointer
1200(
1201 lldb::addr_t &object_ptr,
Sean Callanan3aa7da52010-12-13 22:46:15 +00001202 ConstString &object_name,
Sean Callanan047923c2010-12-14 00:42:36 +00001203 Error &err,
1204 bool suppress_type_check
Greg Clayton8de27c72010-10-15 22:48:33 +00001205)
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001206{
Sean Callananaa301c42010-12-03 01:38:59 +00001207 assert (m_struct_vars.get());
1208
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001209 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
1210 Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr();
1211 StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
Greg Clayton567e7f32011-09-22 04:58:26 +00001212
1213 if (frame == NULL || process == NULL || target == NULL)
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001214 {
Sean Callanane6ea5fe2011-11-15 02:11:17 +00001215 err.SetErrorStringWithFormat("Couldn't load '%s' because the context is incomplete", object_name.AsCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001216 return false;
1217 }
1218
Sean Callananaa301c42010-12-03 01:38:59 +00001219 if (!m_struct_vars->m_object_pointer_type.GetOpaqueQualType())
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001220 {
Sean Callanane6ea5fe2011-11-15 02:11:17 +00001221 err.SetErrorStringWithFormat("Couldn't load '%s' because its type is unknown", object_name.AsCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001222 return false;
1223 }
1224
Sean Callanan39d1af92012-05-21 21:29:52 +00001225 const bool object_pointer = true;
Sean Callanan70c6cf42012-02-18 02:01:03 +00001226
Greg Clayton567e7f32011-09-22 04:58:26 +00001227 VariableSP object_ptr_var = FindVariableInScope (*frame,
Sean Callanan696cf5f2011-05-07 01:06:41 +00001228 object_name,
Sean Callanan70c6cf42012-02-18 02:01:03 +00001229 (suppress_type_check ? NULL : &m_struct_vars->m_object_pointer_type),
Sean Callanan39d1af92012-05-21 21:29:52 +00001230 object_pointer);
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001231
1232 if (!object_ptr_var)
1233 {
Sean Callanane6ea5fe2011-11-15 02:11:17 +00001234 err.SetErrorStringWithFormat("Couldn't find '%s' with appropriate type in scope", object_name.AsCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001235 return false;
1236 }
1237
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001238 std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(object_ptr_var,
Sean Callananaa301c42010-12-03 01:38:59 +00001239 NULL));
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001240
1241 if (!location_value.get())
1242 {
Sean Callanan3aa7da52010-12-13 22:46:15 +00001243 err.SetErrorStringWithFormat("Couldn't get the location for '%s'", object_name.GetCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001244 return false;
1245 }
1246
Sean Callanan50339fe2011-03-04 00:23:47 +00001247 switch (location_value->GetValueType())
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001248 {
Sean Callanan50339fe2011-03-04 00:23:47 +00001249 default:
Sean Callanan3aa7da52010-12-13 22:46:15 +00001250 err.SetErrorStringWithFormat("'%s' is not in memory; LLDB must be extended to handle registers", object_name.GetCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001251 return false;
Sean Callanan50339fe2011-03-04 00:23:47 +00001252 case Value::eValueTypeLoadAddress:
1253 {
1254 lldb::addr_t value_addr = location_value->GetScalar().ULongLong();
Greg Clayton567e7f32011-09-22 04:58:26 +00001255 uint32_t address_byte_size = target->GetArchitecture().GetAddressByteSize();
Sean Callanan50339fe2011-03-04 00:23:47 +00001256
1257 if (ClangASTType::GetClangTypeBitWidth(m_struct_vars->m_object_pointer_type.GetASTContext(),
1258 m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) != address_byte_size * 8)
1259 {
1260 err.SetErrorStringWithFormat("'%s' is not of an expected pointer size", object_name.GetCString());
1261 return false;
1262 }
1263
Sean Callanan50339fe2011-03-04 00:23:47 +00001264 Error read_error;
Greg Clayton567e7f32011-09-22 04:58:26 +00001265 object_ptr = process->ReadPointerFromMemory (value_addr, read_error);
Greg Claytonc0fa5332011-05-22 22:46:53 +00001266 if (read_error.Fail() || object_ptr == LLDB_INVALID_ADDRESS)
Sean Callanan50339fe2011-03-04 00:23:47 +00001267 {
1268 err.SetErrorStringWithFormat("Coldn't read '%s' from the target: %s", object_name.GetCString(), read_error.AsCString());
1269 return false;
Greg Claytonc0fa5332011-05-22 22:46:53 +00001270 }
Sean Callanan50339fe2011-03-04 00:23:47 +00001271 return true;
1272 }
1273 case Value::eValueTypeScalar:
1274 {
1275 if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
1276 {
1277 StreamString ss;
1278 location_value->Dump(&ss);
1279
1280 err.SetErrorStringWithFormat("%s is a scalar of unhandled type: %s", object_name.GetCString(), ss.GetString().c_str());
1281 return false;
1282 }
1283
Greg Clayton061b79d2011-05-09 20:18:18 +00001284 RegisterInfo *reg_info = location_value->GetRegisterInfo();
Sean Callanan50339fe2011-03-04 00:23:47 +00001285
Greg Clayton061b79d2011-05-09 20:18:18 +00001286 if (!reg_info)
Sean Callanan50339fe2011-03-04 00:23:47 +00001287 {
1288 err.SetErrorStringWithFormat("Couldn't get the register information for %s", object_name.GetCString());
1289 return false;
1290 }
1291
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001292 RegisterContext *reg_ctx = m_parser_vars->m_exe_ctx.GetRegisterContext();
Sean Callanan50339fe2011-03-04 00:23:47 +00001293
Greg Clayton061b79d2011-05-09 20:18:18 +00001294 if (!reg_ctx)
Sean Callanan50339fe2011-03-04 00:23:47 +00001295 {
Greg Clayton061b79d2011-05-09 20:18:18 +00001296 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 +00001297 return false;
1298 }
1299
Greg Clayton061b79d2011-05-09 20:18:18 +00001300 uint32_t register_number = reg_info->kinds[lldb::eRegisterKindLLDB];
Sean Callanan50339fe2011-03-04 00:23:47 +00001301
Greg Clayton061b79d2011-05-09 20:18:18 +00001302 object_ptr = reg_ctx->ReadRegisterAsUnsigned(register_number, 0x0);
Sean Callanan50339fe2011-03-04 00:23:47 +00001303
1304 return true;
1305 }
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001306 }
1307}
1308
1309bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001310ClangExpressionDeclMap::Dematerialize
1311(
Greg Clayton427f2902010-12-14 02:59:59 +00001312 ClangExpressionVariableSP &result_sp,
Sean Callanan0ddf8062011-05-09 22:04:36 +00001313 lldb::addr_t stack_frame_top,
1314 lldb::addr_t stack_frame_bottom,
Greg Clayton8de27c72010-10-15 22:48:33 +00001315 Error &err
1316)
Sean Callananf328c9f2010-07-20 23:31:16 +00001317{
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001318 return DoMaterialize(true, stack_frame_top, stack_frame_bottom, &result_sp, err);
Sean Callananaa301c42010-12-03 01:38:59 +00001319
1320 DidDematerialize();
1321}
1322
1323void
1324ClangExpressionDeclMap::DidDematerialize()
1325{
1326 if (m_material_vars.get())
1327 {
1328 if (m_material_vars->m_materialized_location)
1329 {
1330 //#define SINGLE_STEP_EXPRESSIONS
1331
1332#ifndef SINGLE_STEP_EXPRESSIONS
1333 m_material_vars->m_process->DeallocateMemory(m_material_vars->m_materialized_location);
1334#endif
1335 m_material_vars->m_materialized_location = 0;
1336 }
1337
1338 DisableMaterialVars();
1339 }
Sean Callananf328c9f2010-07-20 23:31:16 +00001340}
1341
Sean Callanan32824aa2010-07-23 22:19:18 +00001342bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001343ClangExpressionDeclMap::DumpMaterializedStruct
1344(
Greg Clayton8de27c72010-10-15 22:48:33 +00001345 Stream &s,
1346 Error &err
1347)
Sean Callanan32824aa2010-07-23 22:19:18 +00001348{
Sean Callananaa301c42010-12-03 01:38:59 +00001349 assert (m_struct_vars.get());
1350 assert (m_material_vars.get());
1351
1352 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan32824aa2010-07-23 22:19:18 +00001353 {
1354 err.SetErrorString("Structure hasn't been laid out yet");
1355 return false;
1356 }
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001357 Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr();
Greg Clayton567e7f32011-09-22 04:58:26 +00001358
1359 if (!process)
Sean Callanan32824aa2010-07-23 22:19:18 +00001360 {
1361 err.SetErrorString("Couldn't find the process");
1362 return false;
1363 }
1364
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001365 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
Greg Clayton567e7f32011-09-22 04:58:26 +00001366 if (!target)
Sean Callanan32824aa2010-07-23 22:19:18 +00001367 {
1368 err.SetErrorString("Couldn't find the target");
1369 return false;
1370 }
1371
Sean Callanan33711022010-12-07 10:00:20 +00001372 if (!m_material_vars->m_materialized_location)
1373 {
1374 err.SetErrorString("No materialized location");
1375 return false;
1376 }
1377
Greg Claytonc0fa5332011-05-22 22:46:53 +00001378 lldb::DataBufferSP data_sp(new DataBufferHeap(m_struct_vars->m_struct_size, 0));
Sean Callanan32824aa2010-07-23 22:19:18 +00001379
1380 Error error;
Greg Clayton567e7f32011-09-22 04:58:26 +00001381 if (process->ReadMemory (m_material_vars->m_materialized_location,
Greg Claytonc0fa5332011-05-22 22:46:53 +00001382 data_sp->GetBytes(),
1383 data_sp->GetByteSize(), error) != data_sp->GetByteSize())
Sean Callanan32824aa2010-07-23 22:19:18 +00001384 {
1385 err.SetErrorStringWithFormat ("Couldn't read struct from the target: %s", error.AsCString());
1386 return false;
1387 }
1388
Greg Clayton567e7f32011-09-22 04:58:26 +00001389 DataExtractor extractor(data_sp, process->GetByteOrder(), target->GetArchitecture().GetAddressByteSize());
Sean Callanan32824aa2010-07-23 22:19:18 +00001390
Greg Clayton427f2902010-12-14 02:59:59 +00001391 for (size_t member_idx = 0, num_members = m_struct_members.GetSize();
1392 member_idx < num_members;
1393 ++member_idx)
Sean Callanan32824aa2010-07-23 22:19:18 +00001394 {
Greg Clayton427f2902010-12-14 02:59:59 +00001395 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_idx));
Sean Callanan32824aa2010-07-23 22:19:18 +00001396
Greg Clayton427f2902010-12-14 02:59:59 +00001397 if (!member_sp)
1398 return false;
1399
1400 s.Printf("[%s]\n", member_sp->GetName().GetCString());
Sean Callanan8c127202010-08-23 23:09:38 +00001401
Greg Clayton427f2902010-12-14 02:59:59 +00001402 if (!member_sp->m_jit_vars.get())
Sean Callanan8c127202010-08-23 23:09:38 +00001403 return false;
1404
Greg Clayton427f2902010-12-14 02:59:59 +00001405 extractor.Dump (&s, // stream
1406 member_sp->m_jit_vars->m_offset, // offset
1407 lldb::eFormatBytesWithASCII, // format
1408 1, // byte size of individual entries
1409 member_sp->m_jit_vars->m_size, // number of entries
1410 16, // entries per line
1411 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, // address to print
1412 0, // bit size (bitfields only; 0 means ignore)
1413 0); // bit alignment (bitfields only; 0 means ignore)
Sean Callanan32824aa2010-07-23 22:19:18 +00001414
1415 s.PutChar('\n');
1416 }
1417
1418 return true;
1419}
1420
Sean Callananf328c9f2010-07-20 23:31:16 +00001421bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001422ClangExpressionDeclMap::DoMaterialize
1423(
1424 bool dematerialize,
Sean Callanan0ddf8062011-05-09 22:04:36 +00001425 lldb::addr_t stack_frame_top,
1426 lldb::addr_t stack_frame_bottom,
Greg Clayton427f2902010-12-14 02:59:59 +00001427 lldb::ClangExpressionVariableSP *result_sp_ptr,
Greg Clayton8de27c72010-10-15 22:48:33 +00001428 Error &err
1429)
Sean Callanan810f22d2010-07-16 00:09:46 +00001430{
Greg Clayton427f2902010-12-14 02:59:59 +00001431 if (result_sp_ptr)
1432 result_sp_ptr->reset();
1433
Sean Callananaa301c42010-12-03 01:38:59 +00001434 assert (m_struct_vars.get());
1435
Greg Claytone005f2c2010-11-06 01:53:30 +00001436 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan82b74c82010-08-12 01:56:52 +00001437
Sean Callananaa301c42010-12-03 01:38:59 +00001438 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan810f22d2010-07-16 00:09:46 +00001439 {
1440 err.SetErrorString("Structure hasn't been laid out yet");
Greg Clayton57067a02011-09-13 04:03:52 +00001441 return false;
Sean Callanan810f22d2010-07-16 00:09:46 +00001442 }
1443
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001444 StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
Greg Clayton567e7f32011-09-22 04:58:26 +00001445 if (!frame)
Sean Callanan45839272010-07-24 01:37:44 +00001446 {
1447 err.SetErrorString("Received null execution frame");
Greg Clayton57067a02011-09-13 04:03:52 +00001448 return false;
Sean Callanan45839272010-07-24 01:37:44 +00001449 }
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001450 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
Sean Callanan45839272010-07-24 01:37:44 +00001451
Greg Clayton567e7f32011-09-22 04:58:26 +00001452 ClangPersistentVariables &persistent_vars = target->GetPersistentVariables();
Sean Callananaa301c42010-12-03 01:38:59 +00001453
1454 if (!m_struct_vars->m_struct_size)
Sean Callanane8a59a82010-09-13 21:34:21 +00001455 {
1456 if (log)
1457 log->PutCString("Not bothering to allocate a struct because no arguments are needed");
1458
Filipe Cabecinhasf9935582012-09-11 18:11:16 +00001459 m_material_vars->m_allocated_area = 0UL;
Sean Callanane8a59a82010-09-13 21:34:21 +00001460
1461 return true;
1462 }
1463
Greg Clayton567e7f32011-09-22 04:58:26 +00001464 const SymbolContext &sym_ctx(frame->GetSymbolContext(lldb::eSymbolContextEverything));
Sean Callanan810f22d2010-07-16 00:09:46 +00001465
Sean Callananf328c9f2010-07-20 23:31:16 +00001466 if (!dematerialize)
Sean Callanan810f22d2010-07-16 00:09:46 +00001467 {
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001468 Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr();
Sean Callananaa301c42010-12-03 01:38:59 +00001469 if (m_material_vars->m_materialized_location)
Sean Callananf328c9f2010-07-20 23:31:16 +00001470 {
Greg Clayton567e7f32011-09-22 04:58:26 +00001471 process->DeallocateMemory(m_material_vars->m_materialized_location);
Sean Callananaa301c42010-12-03 01:38:59 +00001472 m_material_vars->m_materialized_location = 0;
Sean Callananf328c9f2010-07-20 23:31:16 +00001473 }
1474
Sean Callanan7a60b942010-10-08 01:58:41 +00001475 if (log)
1476 log->PutCString("Allocating memory for materialized argument struct");
1477
Greg Clayton567e7f32011-09-22 04:58:26 +00001478 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 +00001479 lldb::ePermissionsReadable | lldb::ePermissionsWritable,
1480 err);
Sean Callananf328c9f2010-07-20 23:31:16 +00001481
1482 if (mem == LLDB_INVALID_ADDRESS)
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001483 {
1484 err.SetErrorStringWithFormat("Couldn't allocate 0x%llx bytes for materialized argument struct",
1485 (unsigned long long)(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size));
Sean Callananf328c9f2010-07-20 23:31:16 +00001486 return false;
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001487 }
1488
Sean Callananaa301c42010-12-03 01:38:59 +00001489 m_material_vars->m_allocated_area = mem;
Sean Callanan810f22d2010-07-16 00:09:46 +00001490 }
1491
Sean Callananaa301c42010-12-03 01:38:59 +00001492 m_material_vars->m_materialized_location = m_material_vars->m_allocated_area;
Sean Callananf328c9f2010-07-20 23:31:16 +00001493
Sean Callananaa301c42010-12-03 01:38:59 +00001494 if (m_material_vars->m_materialized_location % m_struct_vars->m_struct_alignment)
1495 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 +00001496
Greg Clayton427f2902010-12-14 02:59:59 +00001497 for (uint64_t member_index = 0, num_members = m_struct_members.GetSize();
Sean Callanan8c127202010-08-23 23:09:38 +00001498 member_index < num_members;
1499 ++member_index)
Sean Callanan810f22d2010-07-16 00:09:46 +00001500 {
Greg Clayton427f2902010-12-14 02:59:59 +00001501 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
Sean Callanan810f22d2010-07-16 00:09:46 +00001502
Greg Claytona875b642011-01-09 21:07:35 +00001503 if (m_found_entities.ContainsVariable (member_sp))
Sean Callanan8c127202010-08-23 23:09:38 +00001504 {
Sean Callanan25db51f2012-08-16 21:34:44 +00001505 if (!member_sp->GetValueObject())
1506 {
1507 err.SetErrorString("Variable being materialized doesn't have a frozen version");
1508 return false;
1509 }
1510
Greg Claytona875b642011-01-09 21:07:35 +00001511 RegisterInfo *reg_info = member_sp->GetRegisterInfo ();
Greg Clayton427f2902010-12-14 02:59:59 +00001512 if (reg_info)
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001513 {
1514 // This is a register variable
1515
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001516 RegisterContext *reg_ctx = m_parser_vars->m_exe_ctx.GetRegisterContext();
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001517
1518 if (!reg_ctx)
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001519 {
1520 err.SetErrorString("Couldn't get register context");
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001521 return false;
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001522 }
1523
Greg Clayton427f2902010-12-14 02:59:59 +00001524 if (!DoMaterializeOneRegister (dematerialize,
Greg Clayton427f2902010-12-14 02:59:59 +00001525 *reg_ctx,
1526 *reg_info,
1527 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
1528 err))
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001529 return false;
1530 }
1531 else
1532 {
Greg Clayton427f2902010-12-14 02:59:59 +00001533 if (!member_sp->m_jit_vars.get())
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001534 {
1535 err.SetErrorString("Variable being materialized doesn't have necessary state");
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001536 return false;
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001537 }
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001538
Greg Clayton427f2902010-12-14 02:59:59 +00001539 if (!DoMaterializeOneVariable (dematerialize,
Sean Callanan6a925532011-01-13 08:53:35 +00001540 sym_ctx,
1541 member_sp,
Greg Clayton427f2902010-12-14 02:59:59 +00001542 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
1543 err))
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001544 return false;
1545 }
Sean Callanan8c127202010-08-23 23:09:38 +00001546 }
Sean Callanan8c127202010-08-23 23:09:38 +00001547 else
1548 {
Greg Claytona875b642011-01-09 21:07:35 +00001549 // No need to look for presistent variables if the name doesn't start
1550 // with with a '$' character...
1551 if (member_sp->GetName().AsCString ("!")[0] == '$' && persistent_vars.ContainsVariable(member_sp))
1552 {
Sean Callanan6a925532011-01-13 08:53:35 +00001553
Greg Claytona875b642011-01-09 21:07:35 +00001554 if (member_sp->GetName() == m_struct_vars->m_result_name)
1555 {
Greg Claytona875b642011-01-09 21:07:35 +00001556 if (log)
1557 log->PutCString("Found result member in the struct");
Sean Callanan6a925532011-01-13 08:53:35 +00001558
Greg Claytona875b642011-01-09 21:07:35 +00001559 if (result_sp_ptr)
1560 *result_sp_ptr = member_sp;
Sean Callanan6a925532011-01-13 08:53:35 +00001561
Greg Claytona875b642011-01-09 21:07:35 +00001562 }
1563
1564 if (!DoMaterializeOnePersistentVariable (dematerialize,
Greg Claytona875b642011-01-09 21:07:35 +00001565 member_sp,
Sean Callanan0ddf8062011-05-09 22:04:36 +00001566 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
1567 stack_frame_top,
1568 stack_frame_bottom,
Greg Claytona875b642011-01-09 21:07:35 +00001569 err))
1570 return false;
1571 }
1572 else
1573 {
1574 err.SetErrorStringWithFormat("Unexpected variable %s", member_sp->GetName().GetCString());
1575 return false;
1576 }
Sean Callanan8c127202010-08-23 23:09:38 +00001577 }
Sean Callanan810f22d2010-07-16 00:09:46 +00001578 }
1579
Sean Callananf328c9f2010-07-20 23:31:16 +00001580 return true;
1581}
1582
Sean Callanana48fe162010-08-11 03:57:18 +00001583bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001584ClangExpressionDeclMap::DoMaterializeOnePersistentVariable
1585(
1586 bool dematerialize,
Greg Clayton427f2902010-12-14 02:59:59 +00001587 ClangExpressionVariableSP &var_sp,
Greg Clayton8de27c72010-10-15 22:48:33 +00001588 lldb::addr_t addr,
Sean Callanan0ddf8062011-05-09 22:04:36 +00001589 lldb::addr_t stack_frame_top,
1590 lldb::addr_t stack_frame_bottom,
Greg Clayton8de27c72010-10-15 22:48:33 +00001591 Error &err
1592)
Sean Callananaa301c42010-12-03 01:38:59 +00001593{
Sean Callanan6a925532011-01-13 08:53:35 +00001594 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1595
Greg Clayton427f2902010-12-14 02:59:59 +00001596 if (!var_sp)
Sean Callanana48fe162010-08-11 03:57:18 +00001597 {
Greg Clayton427f2902010-12-14 02:59:59 +00001598 err.SetErrorString("Invalid persistent variable");
Sean Callanana48fe162010-08-11 03:57:18 +00001599 return LLDB_INVALID_ADDRESS;
1600 }
1601
Greg Clayton427f2902010-12-14 02:59:59 +00001602 const size_t pvar_byte_size = var_sp->GetByteSize();
Sean Callanana6223432010-08-20 01:02:30 +00001603
Greg Clayton427f2902010-12-14 02:59:59 +00001604 uint8_t *pvar_data = var_sp->GetValueBytes();
1605 if (pvar_data == NULL)
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001606 {
1607 err.SetErrorString("Persistent variable being materialized contains no data");
Sean Callanana6223432010-08-20 01:02:30 +00001608 return false;
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001609 }
Sean Callanana6223432010-08-20 01:02:30 +00001610
Sean Callanana48fe162010-08-11 03:57:18 +00001611 Error error;
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001612 Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr();
Greg Clayton567e7f32011-09-22 04:58:26 +00001613
Sean Callanan6a925532011-01-13 08:53:35 +00001614 lldb::addr_t mem; // The address of a spare memory area used to hold the persistent variable.
1615
Sean Callanana48fe162010-08-11 03:57:18 +00001616 if (dematerialize)
1617 {
Sean Callanan6a925532011-01-13 08:53:35 +00001618 if (log)
1619 log->Printf("Dematerializing persistent variable with flags 0x%hx", var_sp->m_flags);
1620
1621 if ((var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) ||
1622 (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference))
Sean Callanana48fe162010-08-11 03:57:18 +00001623 {
Sean Callanan6a925532011-01-13 08:53:35 +00001624 // Get the location of the target out of the struct.
1625
1626 Error read_error;
Greg Clayton567e7f32011-09-22 04:58:26 +00001627 mem = process->ReadPointerFromMemory (addr, read_error);
Sean Callanan6a925532011-01-13 08:53:35 +00001628
1629 if (mem == LLDB_INVALID_ADDRESS)
1630 {
1631 err.SetErrorStringWithFormat("Couldn't read address of %s from struct: %s", var_sp->GetName().GetCString(), error.AsCString());
1632 return false;
1633 }
1634
1635 if (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference &&
1636 !var_sp->m_live_sp)
1637 {
1638 // If the reference comes from the program, then the ClangExpressionVariable's
1639 // live variable data hasn't been set up yet. Do this now.
1640
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001641 var_sp->m_live_sp = ValueObjectConstResult::Create (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope (),
Jim Ingham47da8102011-04-22 23:53:53 +00001642 var_sp->GetTypeFromUser().GetASTContext(),
1643 var_sp->GetTypeFromUser().GetOpaqueQualType(),
1644 var_sp->GetName(),
1645 mem,
1646 eAddressTypeLoad,
1647 pvar_byte_size);
Sean Callanan6a925532011-01-13 08:53:35 +00001648 }
1649
1650 if (!var_sp->m_live_sp)
1651 {
1652 err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", var_sp->GetName().GetCString());
1653 return false;
1654 }
1655
Greg Claytonb3448432011-03-24 21:19:54 +00001656 if (var_sp->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
Sean Callanan6a925532011-01-13 08:53:35 +00001657 {
1658 err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", var_sp->GetName().GetCString());
1659 return false;
1660 }
1661
Sean Callanan97678d12011-01-13 21:23:32 +00001662 if (var_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry ||
1663 var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
Sean Callanan6a925532011-01-13 08:53:35 +00001664 {
1665 mem = var_sp->m_live_sp->GetValue().GetScalar().ULongLong();
1666
1667 if (log)
Greg Claytonc4b6ab92012-09-20 23:07:44 +00001668 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 +00001669
1670 // Read the contents of the spare memory area
Sean Callanan0ddf8062011-05-09 22:04:36 +00001671
Sean Callanan6a925532011-01-13 08:53:35 +00001672 var_sp->ValueUpdated ();
Greg Clayton567e7f32011-09-22 04:58:26 +00001673 if (process->ReadMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
Sean Callanan6a925532011-01-13 08:53:35 +00001674 {
1675 err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString());
1676 return false;
1677 }
1678
Sean Callanan0ddf8062011-05-09 22:04:36 +00001679 if (stack_frame_top != LLDB_INVALID_ADDRESS &&
1680 stack_frame_bottom != LLDB_INVALID_ADDRESS &&
1681 mem >= stack_frame_bottom &&
1682 mem <= stack_frame_top)
1683 {
1684 // If the variable is resident in the stack frame created by the expression,
1685 // then it cannot be relied upon to stay around. We treat it as needing
1686 // reallocation.
1687
1688 var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
1689 var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
1690 var_sp->m_flags &= ~ClangExpressionVariable::EVIsProgramReference;
1691 }
1692
Sean Callanan6a925532011-01-13 08:53:35 +00001693 var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsFreezeDry;
1694 }
1695
1696 if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation &&
1697 !(var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget))
1698 {
1699 if (m_keep_result_in_memory)
1700 {
1701 var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget;
1702 }
1703 else
1704 {
Greg Clayton567e7f32011-09-22 04:58:26 +00001705 Error deallocate_error = process->DeallocateMemory(mem);
Sean Callanan6a925532011-01-13 08:53:35 +00001706
1707 if (!err.Success())
1708 {
1709 err.SetErrorStringWithFormat ("Couldn't deallocate memory for %s: %s", var_sp->GetName().GetCString(), deallocate_error.AsCString());
1710 return false;
1711 }
1712 }
1713 }
1714 }
1715 else
1716 {
1717 err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
Sean Callanana48fe162010-08-11 03:57:18 +00001718 return false;
1719 }
1720 }
1721 else
1722 {
Sean Callanan6a925532011-01-13 08:53:35 +00001723 if (log)
1724 log->Printf("Materializing persistent variable with flags 0x%hx", var_sp->m_flags);
1725
1726 if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation)
Sean Callanana48fe162010-08-11 03:57:18 +00001727 {
Sean Callanan6a925532011-01-13 08:53:35 +00001728 // Allocate a spare memory area to store the persistent variable's contents.
1729
1730 Error allocate_error;
1731
Greg Clayton567e7f32011-09-22 04:58:26 +00001732 mem = process->AllocateMemory(pvar_byte_size,
Sean Callanan4b3cef02011-10-26 21:20:00 +00001733 lldb::ePermissionsReadable | lldb::ePermissionsWritable,
1734 allocate_error);
Sean Callanan6a925532011-01-13 08:53:35 +00001735
1736 if (mem == LLDB_INVALID_ADDRESS)
1737 {
1738 err.SetErrorStringWithFormat("Couldn't allocate a memory area to store %s: %s", var_sp->GetName().GetCString(), allocate_error.AsCString());
1739 return false;
1740 }
1741
1742 if (log)
1743 log->Printf("Allocated %s (0x%llx) sucessfully", var_sp->GetName().GetCString(), mem);
1744
1745 // Put the location of the spare memory into the live data of the ValueObject.
1746
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001747 var_sp->m_live_sp = ValueObjectConstResult::Create (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(),
Jim Ingham47da8102011-04-22 23:53:53 +00001748 var_sp->GetTypeFromUser().GetASTContext(),
1749 var_sp->GetTypeFromUser().GetOpaqueQualType(),
1750 var_sp->GetName(),
1751 mem,
1752 eAddressTypeLoad,
1753 pvar_byte_size);
Sean Callanan6a925532011-01-13 08:53:35 +00001754
1755 // Clear the flag if the variable will never be deallocated.
1756
1757 if (var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
1758 var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsAllocation;
1759
1760 // Write the contents of the variable to the area.
1761
Greg Clayton567e7f32011-09-22 04:58:26 +00001762 if (process->WriteMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
Sean Callanan6a925532011-01-13 08:53:35 +00001763 {
1764 err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString());
1765 return false;
1766 }
1767 }
1768
1769 if ((var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && var_sp->m_live_sp) ||
1770 var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated)
1771 {
Sean Callanan6a925532011-01-13 08:53:35 +00001772 // Now write the location of the area into the struct.
Sean Callanan6a925532011-01-13 08:53:35 +00001773 Error write_error;
Greg Clayton567e7f32011-09-22 04:58:26 +00001774 if (!process->WriteScalarToMemory (addr,
Sean Callanan4b3cef02011-10-26 21:20:00 +00001775 var_sp->m_live_sp->GetValue().GetScalar(),
1776 process->GetAddressByteSize(),
1777 write_error))
Sean Callanan6a925532011-01-13 08:53:35 +00001778 {
1779 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", var_sp->GetName().GetCString(), write_error.AsCString());
1780 return false;
1781 }
1782
1783 if (log)
Greg Claytonc0fa5332011-05-22 22:46:53 +00001784 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 +00001785 }
Sean Callanan696cf5f2011-05-07 01:06:41 +00001786 else if (!(var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference))
Sean Callanan6a925532011-01-13 08:53:35 +00001787 {
1788 err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
Sean Callanana48fe162010-08-11 03:57:18 +00001789 return false;
1790 }
1791 }
1792
1793 return true;
1794}
1795
Sean Callananf328c9f2010-07-20 23:31:16 +00001796bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001797ClangExpressionDeclMap::DoMaterializeOneVariable
1798(
1799 bool dematerialize,
Greg Clayton8de27c72010-10-15 22:48:33 +00001800 const SymbolContext &sym_ctx,
Sean Callanan6a925532011-01-13 08:53:35 +00001801 ClangExpressionVariableSP &expr_var,
Greg Clayton8de27c72010-10-15 22:48:33 +00001802 lldb::addr_t addr,
1803 Error &err
1804)
Sean Callananf328c9f2010-07-20 23:31:16 +00001805{
Greg Claytone005f2c2010-11-06 01:53:30 +00001806 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001807 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
1808 Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr();
1809 StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
Greg Clayton567e7f32011-09-22 04:58:26 +00001810
Sean Callanan6d284ef2011-10-12 22:20:02 +00001811 if (!frame || !process || !target || !m_parser_vars.get() || !expr_var->m_parser_vars.get())
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001812 {
1813 err.SetErrorString("Necessary state for variable materialization isn't present");
Sean Callanancc074622010-09-14 21:59:34 +00001814 return false;
Sean Callanan5a55c7a2011-11-18 03:28:09 +00001815 }
Sean Callanancc074622010-09-14 21:59:34 +00001816
Sean Callanan6a925532011-01-13 08:53:35 +00001817 // Vital information about the value
1818
1819 const ConstString &name(expr_var->GetName());
1820 TypeFromUser type(expr_var->GetTypeFromUser());
1821
Sean Callanan4a078322011-10-13 00:09:20 +00001822 VariableSP &var(expr_var->m_parser_vars->m_lldb_var);
1823 lldb_private::Symbol *sym(expr_var->m_parser_vars->m_lldb_sym);
Sean Callananf328c9f2010-07-20 23:31:16 +00001824
Sean Callanan6f3bde72011-10-27 19:41:13 +00001825 bool is_reference(expr_var->m_flags & ClangExpressionVariable::EVTypeIsReference);
1826
Sean Callanan81974962011-05-08 02:21:26 +00001827 std::auto_ptr<lldb_private::Value> location_value;
Sean Callanan4a078322011-10-13 00:09:20 +00001828
Sean Callanan81974962011-05-08 02:21:26 +00001829 if (var)
1830 {
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001831 location_value.reset(GetVariableValue(var,
Sean Callanan81974962011-05-08 02:21:26 +00001832 NULL));
1833 }
1834 else if (sym)
Sean Callanan4a078322011-10-13 00:09:20 +00001835 {
Sean Callanan21ef5bb2011-12-01 02:04:16 +00001836 addr_t location_load_addr = GetSymbolAddress(*target, name, lldb::eSymbolTypeAny);
Sean Callanan81974962011-05-08 02:21:26 +00001837
Greg Claytoncbc07cf2011-06-23 04:25:29 +00001838 if (location_load_addr == LLDB_INVALID_ADDRESS)
Sean Callanan81974962011-05-08 02:21:26 +00001839 {
1840 if (log)
Greg Claytonc0fa5332011-05-22 22:46:53 +00001841 err.SetErrorStringWithFormat ("Couldn't find value for global symbol %s",
1842 name.GetCString());
Sean Callanan81974962011-05-08 02:21:26 +00001843 }
1844
Sean Callanan4a078322011-10-13 00:09:20 +00001845 location_value.reset(new Value);
1846
Sean Callanan81974962011-05-08 02:21:26 +00001847 location_value->SetValueType(Value::eValueTypeLoadAddress);
1848 location_value->GetScalar() = location_load_addr;
1849 }
1850 else
Sean Callananf328c9f2010-07-20 23:31:16 +00001851 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001852 err.SetErrorStringWithFormat ("Couldn't find %s with appropriate type",
1853 name.GetCString());
Sean Callananf328c9f2010-07-20 23:31:16 +00001854 return false;
1855 }
1856
Sean Callanan841026f2010-07-23 00:16:21 +00001857 if (log)
Sean Callananfb3058e2011-05-12 23:54:16 +00001858 {
1859 StreamString my_stream_string;
1860
1861 ClangASTType::DumpTypeDescription (type.GetASTContext(),
1862 type.GetOpaqueQualType(),
1863 &my_stream_string);
1864
Greg Claytonc0fa5332011-05-22 22:46:53 +00001865 log->Printf ("%s %s with type %s",
1866 dematerialize ? "Dematerializing" : "Materializing",
1867 name.GetCString(),
1868 my_stream_string.GetString().c_str());
Sean Callananfb3058e2011-05-12 23:54:16 +00001869 }
Sean Callananf328c9f2010-07-20 23:31:16 +00001870
1871 if (!location_value.get())
1872 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001873 err.SetErrorStringWithFormat("Couldn't get value for %s", name.GetCString());
Sean Callananf328c9f2010-07-20 23:31:16 +00001874 return false;
1875 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001876
1877 // The size of the type contained in addr
Sean Callananf328c9f2010-07-20 23:31:16 +00001878
Sean Callanan6a925532011-01-13 08:53:35 +00001879 size_t value_bit_size = ClangASTType::GetClangTypeBitWidth(type.GetASTContext(), type.GetOpaqueQualType());
1880 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 +00001881
1882 Value::ValueType value_type = location_value->GetValueType();
1883
1884 switch (value_type)
Sean Callananf328c9f2010-07-20 23:31:16 +00001885 {
Sean Callanan17c6a052010-10-05 20:18:48 +00001886 default:
Sean Callananf328c9f2010-07-20 23:31:16 +00001887 {
Sean Callanan17c6a052010-10-05 20:18:48 +00001888 StreamString ss;
1889
1890 location_value->Dump(&ss);
1891
Greg Claytonc0fa5332011-05-22 22:46:53 +00001892 err.SetErrorStringWithFormat ("%s has a value of unhandled type: %s",
1893 name.GetCString(),
1894 ss.GetString().c_str());
Sean Callananf328c9f2010-07-20 23:31:16 +00001895 return false;
1896 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001897 break;
1898 case Value::eValueTypeLoadAddress:
Sean Callananf328c9f2010-07-20 23:31:16 +00001899 {
Sean Callanan6a925532011-01-13 08:53:35 +00001900 if (!dematerialize)
Sean Callanan17c6a052010-10-05 20:18:48 +00001901 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001902 Error write_error;
Sean Callanan6a925532011-01-13 08:53:35 +00001903
Sean Callanan6f3bde72011-10-27 19:41:13 +00001904 if (is_reference)
Sean Callanan6a925532011-01-13 08:53:35 +00001905 {
Sean Callanan6f3bde72011-10-27 19:41:13 +00001906 Error read_error;
1907
1908 addr_t ref_value = process->ReadPointerFromMemory(location_value->GetScalar().ULongLong(), read_error);
1909
1910 if (!read_error.Success())
1911 {
1912 err.SetErrorStringWithFormat ("Couldn't read reference to %s from the target: %s",
1913 name.GetCString(),
1914 read_error.AsCString());
1915 return false;
1916 }
1917
1918 if (!process->WritePointerToMemory(addr,
1919 ref_value,
1920 write_error))
1921 {
1922 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
1923 name.GetCString(),
1924 write_error.AsCString());
1925 return false;
1926 }
1927 }
1928 else
1929 {
1930 if (!process->WriteScalarToMemory (addr,
1931 location_value->GetScalar(),
1932 process->GetAddressByteSize(),
1933 write_error))
1934 {
1935 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
1936 name.GetCString(),
1937 write_error.AsCString());
1938 return false;
1939 }
Sean Callanan6a925532011-01-13 08:53:35 +00001940 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001941 }
Sean Callananf328c9f2010-07-20 23:31:16 +00001942 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001943 break;
1944 case Value::eValueTypeScalar:
1945 {
Greg Clayton6916e352010-11-13 03:52:47 +00001946 if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
Sean Callanan17c6a052010-10-05 20:18:48 +00001947 {
1948 StreamString ss;
Sean Callanan17c6a052010-10-05 20:18:48 +00001949 location_value->Dump(&ss);
1950
Greg Claytonc0fa5332011-05-22 22:46:53 +00001951 err.SetErrorStringWithFormat ("%s is a scalar of unhandled type: %s",
1952 name.GetCString(),
1953 ss.GetString().c_str());
Sean Callanan17c6a052010-10-05 20:18:48 +00001954 return false;
1955 }
1956
Greg Clayton061b79d2011-05-09 20:18:18 +00001957 RegisterInfo *reg_info = location_value->GetRegisterInfo();
Sean Callanan17c6a052010-10-05 20:18:48 +00001958
Greg Clayton061b79d2011-05-09 20:18:18 +00001959 if (!reg_info)
Sean Callanan17c6a052010-10-05 20:18:48 +00001960 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001961 err.SetErrorStringWithFormat ("Couldn't get the register information for %s",
1962 name.GetCString());
Sean Callanan17c6a052010-10-05 20:18:48 +00001963 return false;
1964 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001965
Greg Clayton061b79d2011-05-09 20:18:18 +00001966 RegisterValue reg_value;
1967
Sean Callanandd1dcfd2012-02-10 01:22:05 +00001968 RegisterContext *reg_ctx = m_parser_vars->m_exe_ctx.GetRegisterContext();
Greg Clayton061b79d2011-05-09 20:18:18 +00001969
1970 if (!reg_ctx)
Sean Callanan17c6a052010-10-05 20:18:48 +00001971 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001972 err.SetErrorStringWithFormat ("Couldn't read register context to read %s from %s",
1973 name.GetCString(),
1974 reg_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001975 return false;
1976 }
1977
Greg Clayton061b79d2011-05-09 20:18:18 +00001978 uint32_t register_byte_size = reg_info->byte_size;
Sean Callanan17c6a052010-10-05 20:18:48 +00001979
1980 if (dematerialize)
1981 {
Sean Callanan6f3bde72011-10-27 19:41:13 +00001982 if (is_reference)
1983 return true; // reference types don't need demateralizing
1984
Sean Callanan6a925532011-01-13 08:53:35 +00001985 // Get the location of the spare memory area out of the variable's live data.
1986
1987 if (!expr_var->m_live_sp)
1988 {
1989 err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", name.GetCString());
1990 return false;
1991 }
1992
Greg Claytonb3448432011-03-24 21:19:54 +00001993 if (expr_var->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
Sean Callanan6a925532011-01-13 08:53:35 +00001994 {
1995 err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", name.GetCString());
1996 return false;
1997 }
1998
Greg Claytonc0fa5332011-05-22 22:46:53 +00001999 Scalar &reg_addr = expr_var->m_live_sp->GetValue().GetScalar();
Sean Callanan6a925532011-01-13 08:53:35 +00002000
Greg Claytonc0fa5332011-05-22 22:46:53 +00002001 err = reg_ctx->ReadRegisterValueFromMemory (reg_info,
2002 reg_addr.ULongLong(),
2003 value_byte_size,
2004 reg_value);
Greg Clayton061b79d2011-05-09 20:18:18 +00002005 if (err.Fail())
Sean Callanan17c6a052010-10-05 20:18:48 +00002006 return false;
Greg Clayton061b79d2011-05-09 20:18:18 +00002007
2008 if (!reg_ctx->WriteRegister (reg_info, reg_value))
Sean Callanan17c6a052010-10-05 20:18:48 +00002009 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00002010 err.SetErrorStringWithFormat ("Couldn't write %s to register %s",
2011 name.GetCString(),
2012 reg_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00002013 return false;
2014 }
Sean Callanan6a925532011-01-13 08:53:35 +00002015
2016 // Deallocate the spare area and clear the variable's live data.
2017
Greg Clayton567e7f32011-09-22 04:58:26 +00002018 Error deallocate_error = process->DeallocateMemory(reg_addr.ULongLong());
Sean Callanan6a925532011-01-13 08:53:35 +00002019
2020 if (!deallocate_error.Success())
2021 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00002022 err.SetErrorStringWithFormat ("Couldn't deallocate spare memory area for %s: %s",
2023 name.GetCString(),
2024 deallocate_error.AsCString());
Sean Callanan6a925532011-01-13 08:53:35 +00002025 return false;
2026 }
2027
2028 expr_var->m_live_sp.reset();
Sean Callanan17c6a052010-10-05 20:18:48 +00002029 }
2030 else
2031 {
Sean Callanan6f3bde72011-10-27 19:41:13 +00002032 Error write_error;
2033
2034 RegisterValue reg_value;
2035
2036 if (!reg_ctx->ReadRegister (reg_info, reg_value))
2037 {
2038 err.SetErrorStringWithFormat ("Couldn't read %s from %s",
2039 name.GetCString(),
2040 reg_info->name);
2041 return false;
2042 }
2043
2044 if (is_reference)
2045 {
2046 write_error = reg_ctx->WriteRegisterValueToMemory(reg_info,
2047 addr,
2048 process->GetAddressByteSize(),
2049 reg_value);
2050
2051 if (!write_error.Success())
2052 {
2053 err.SetErrorStringWithFormat ("Couldn't write %s from register %s to the target: %s",
2054 name.GetCString(),
2055 reg_info->name,
2056 write_error.AsCString());
2057 return false;
2058 }
2059
2060 return true;
2061 }
2062
Sean Callanan6a925532011-01-13 08:53:35 +00002063 // Allocate a spare memory area to place the register's contents into. This memory area will be pointed to by the slot in the
2064 // struct.
2065
2066 Error allocate_error;
2067
Greg Clayton567e7f32011-09-22 04:58:26 +00002068 Scalar reg_addr (process->AllocateMemory (value_byte_size,
Sean Callanan6f3bde72011-10-27 19:41:13 +00002069 lldb::ePermissionsReadable | lldb::ePermissionsWritable,
2070 allocate_error));
Sean Callanan6a925532011-01-13 08:53:35 +00002071
Greg Claytonc0fa5332011-05-22 22:46:53 +00002072 if (reg_addr.ULongLong() == LLDB_INVALID_ADDRESS)
Sean Callanan6a925532011-01-13 08:53:35 +00002073 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00002074 err.SetErrorStringWithFormat ("Couldn't allocate a memory area to store %s: %s",
2075 name.GetCString(),
2076 allocate_error.AsCString());
Sean Callanan6a925532011-01-13 08:53:35 +00002077 return false;
2078 }
2079
2080 // Put the location of the spare memory into the live data of the ValueObject.
2081
Sean Callanandd1dcfd2012-02-10 01:22:05 +00002082 expr_var->m_live_sp = ValueObjectConstResult::Create (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(),
Jim Ingham47da8102011-04-22 23:53:53 +00002083 type.GetASTContext(),
2084 type.GetOpaqueQualType(),
2085 name,
Greg Claytonc0fa5332011-05-22 22:46:53 +00002086 reg_addr.ULongLong(),
Jim Ingham47da8102011-04-22 23:53:53 +00002087 eAddressTypeLoad,
2088 value_byte_size);
Sean Callanan6a925532011-01-13 08:53:35 +00002089
2090 // Now write the location of the area into the struct.
Sean Callanan6f3bde72011-10-27 19:41:13 +00002091
Greg Clayton567e7f32011-09-22 04:58:26 +00002092 if (!process->WriteScalarToMemory (addr,
Sean Callanan6f3bde72011-10-27 19:41:13 +00002093 reg_addr,
2094 process->GetAddressByteSize(),
2095 write_error))
Sean Callanan6a925532011-01-13 08:53:35 +00002096 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00002097 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
2098 name.GetCString(),
2099 write_error.AsCString());
Sean Callanan6a925532011-01-13 08:53:35 +00002100 return false;
2101 }
2102
Sean Callanan6a925532011-01-13 08:53:35 +00002103 if (value_byte_size > register_byte_size)
Sean Callanan17c6a052010-10-05 20:18:48 +00002104 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00002105 err.SetErrorStringWithFormat ("%s is too big to store in %s",
2106 name.GetCString(),
2107 reg_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00002108 return false;
2109 }
Greg Clayton061b79d2011-05-09 20:18:18 +00002110
Greg Clayton061b79d2011-05-09 20:18:18 +00002111 if (!reg_ctx->ReadRegister (reg_info, reg_value))
Sean Callanan17c6a052010-10-05 20:18:48 +00002112 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00002113 err.SetErrorStringWithFormat ("Couldn't read %s from %s",
2114 name.GetCString(),
2115 reg_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00002116 return false;
2117 }
2118
Greg Claytonc0fa5332011-05-22 22:46:53 +00002119 err = reg_ctx->WriteRegisterValueToMemory (reg_info,
2120 reg_addr.ULongLong(),
2121 value_byte_size,
2122 reg_value);
Greg Clayton061b79d2011-05-09 20:18:18 +00002123 if (err.Fail())
Sean Callanan17c6a052010-10-05 20:18:48 +00002124 return false;
Sean Callanan17c6a052010-10-05 20:18:48 +00002125 }
2126 }
Sean Callananf328c9f2010-07-20 23:31:16 +00002127 }
2128
2129 return true;
Sean Callanan810f22d2010-07-16 00:09:46 +00002130}
2131
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002132bool
2133ClangExpressionDeclMap::DoMaterializeOneRegister
2134(
2135 bool dematerialize,
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002136 RegisterContext &reg_ctx,
Greg Claytonb3448432011-03-24 21:19:54 +00002137 const RegisterInfo &reg_info,
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002138 lldb::addr_t addr,
2139 Error &err
2140)
2141{
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002142 uint32_t register_byte_size = reg_info.byte_size;
Greg Clayton061b79d2011-05-09 20:18:18 +00002143 RegisterValue reg_value;
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002144 if (dematerialize)
2145 {
Greg Clayton061b79d2011-05-09 20:18:18 +00002146 Error read_error (reg_ctx.ReadRegisterValueFromMemory(&reg_info, addr, register_byte_size, reg_value));
2147 if (read_error.Fail())
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002148 {
Greg Claytonbdcb6ab2011-01-25 23:55:37 +00002149 err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", reg_info.name, read_error.AsCString());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002150 return false;
2151 }
2152
Greg Clayton061b79d2011-05-09 20:18:18 +00002153 if (!reg_ctx.WriteRegister (&reg_info, reg_value))
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002154 {
Greg Clayton061b79d2011-05-09 20:18:18 +00002155 err.SetErrorStringWithFormat("Couldn't write register %s (dematerialize)", reg_info.name);
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002156 return false;
2157 }
2158 }
2159 else
2160 {
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002161
Greg Clayton061b79d2011-05-09 20:18:18 +00002162 if (!reg_ctx.ReadRegister(&reg_info, reg_value))
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002163 {
Greg Clayton061b79d2011-05-09 20:18:18 +00002164 err.SetErrorStringWithFormat("Couldn't read %s (materialize)", reg_info.name);
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002165 return false;
2166 }
2167
Greg Clayton061b79d2011-05-09 20:18:18 +00002168 Error write_error (reg_ctx.WriteRegisterValueToMemory(&reg_info, addr, register_byte_size, reg_value));
2169 if (write_error.Fail())
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002170 {
Jason Molenda95b7b432011-09-20 00:26:08 +00002171 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", reg_info.name, write_error.AsCString());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002172 return false;
2173 }
2174 }
2175
2176 return true;
2177}
2178
Sean Callanan696cf5f2011-05-07 01:06:41 +00002179lldb::VariableSP
Greg Clayton8de27c72010-10-15 22:48:33 +00002180ClangExpressionDeclMap::FindVariableInScope
2181(
2182 StackFrame &frame,
2183 const ConstString &name,
Sean Callanan70c6cf42012-02-18 02:01:03 +00002184 TypeFromUser *type,
Sean Callanan39d1af92012-05-21 21:29:52 +00002185 bool object_pointer
Greg Clayton8de27c72010-10-15 22:48:33 +00002186)
Sean Callananaa301c42010-12-03 01:38:59 +00002187{
Greg Claytone005f2c2010-11-06 01:53:30 +00002188 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanancc074622010-09-14 21:59:34 +00002189
Sean Callananf8b468e2011-08-06 00:28:14 +00002190 ValueObjectSP valobj;
2191 VariableSP var_sp;
2192 Error err;
Sean Callanancc074622010-09-14 21:59:34 +00002193
Sean Callananf8b468e2011-08-06 00:28:14 +00002194 valobj = frame.GetValueForVariableExpressionPath(name.GetCString(),
2195 eNoDynamicValues,
2196 StackFrame::eExpressionPathOptionCheckPtrVsMember,
2197 var_sp,
2198 err);
Greg Clayton3bc52d02010-11-14 22:13:40 +00002199
Sean Callananf8b468e2011-08-06 00:28:14 +00002200 if (!err.Success() ||
2201 !var_sp ||
Sean Callananae9f7482011-07-07 23:05:43 +00002202 !var_sp->IsInScope(&frame) ||
2203 !var_sp->LocationIsValidForFrame (&frame))
2204 return lldb::VariableSP();
Greg Clayton3bc52d02010-11-14 22:13:40 +00002205
Sean Callanan42072962012-05-21 22:25:52 +00002206 if (var_sp)
Greg Clayton3bc52d02010-11-14 22:13:40 +00002207 {
Sean Callanan42072962012-05-21 22:25:52 +00002208 if (!type)
2209 return var_sp;
2210
Sean Callanan39d1af92012-05-21 21:29:52 +00002211 TypeFromUser candidate_type(var_sp->GetType()->GetClangFullType(),
2212 var_sp->GetType()->GetClangAST());
2213
2214 if (candidate_type.GetASTContext() != type->GetASTContext())
Greg Clayton3bc52d02010-11-14 22:13:40 +00002215 {
2216 if (log)
2217 log->PutCString("Skipping a candidate variable because of different AST contexts");
Sean Callanan696cf5f2011-05-07 01:06:41 +00002218 return lldb::VariableSP();
Greg Clayton3bc52d02010-11-14 22:13:40 +00002219 }
Sean Callanan39d1af92012-05-21 21:29:52 +00002220
2221 if (object_pointer)
2222 {
2223 clang::QualType desired_qual_type = clang::QualType::getFromOpaquePtr(type->GetOpaqueQualType());
2224 clang::QualType candidate_qual_type = clang::QualType::getFromOpaquePtr(candidate_type.GetOpaqueQualType());
2225
Sean Callanan42072962012-05-21 22:25:52 +00002226 const clang::ObjCObjectPointerType *desired_objc_ptr_type = desired_qual_type->getAs<clang::ObjCObjectPointerType>();
2227 const clang::ObjCObjectPointerType *candidate_objc_ptr_type = desired_qual_type->getAs<clang::ObjCObjectPointerType>();
2228
2229 if (desired_objc_ptr_type && candidate_objc_ptr_type) {
2230 clang::QualType desired_target_type = desired_objc_ptr_type->getPointeeType().getUnqualifiedType();
2231 clang::QualType candidate_target_type = candidate_objc_ptr_type->getPointeeType().getUnqualifiedType();
2232
2233 if (ClangASTContext::AreTypesSame(type->GetASTContext(),
2234 desired_target_type.getAsOpaquePtr(),
2235 candidate_target_type.getAsOpaquePtr()))
2236 return var_sp;
2237 }
2238
Sean Callanan39d1af92012-05-21 21:29:52 +00002239 const clang::PointerType *desired_ptr_type = desired_qual_type->getAs<clang::PointerType>();
2240 const clang::PointerType *candidate_ptr_type = candidate_qual_type->getAs<clang::PointerType>();
2241
Sean Callanan42072962012-05-21 22:25:52 +00002242 if (desired_ptr_type && candidate_ptr_type) {
2243 clang::QualType desired_target_type = desired_ptr_type->getPointeeType().getUnqualifiedType();
2244 clang::QualType candidate_target_type = candidate_ptr_type->getPointeeType().getUnqualifiedType();
2245
2246 if (ClangASTContext::AreTypesSame(type->GetASTContext(),
2247 desired_target_type.getAsOpaquePtr(),
2248 candidate_target_type.getAsOpaquePtr()))
2249 return var_sp;
2250 }
Sean Callanan39d1af92012-05-21 21:29:52 +00002251
Sean Callanan42072962012-05-21 22:25:52 +00002252 return lldb::VariableSP();
Sean Callanan39d1af92012-05-21 21:29:52 +00002253 }
2254 else
2255 {
Sean Callanan42072962012-05-21 22:25:52 +00002256 if (ClangASTContext::AreTypesSame(type->GetASTContext(),
Sean Callanan39d1af92012-05-21 21:29:52 +00002257 type->GetOpaqueQualType(),
2258 var_sp->GetType()->GetClangFullType()))
Sean Callanan42072962012-05-21 22:25:52 +00002259 return var_sp;
Sean Callanan39d1af92012-05-21 21:29:52 +00002260 }
Sean Callanancc074622010-09-14 21:59:34 +00002261 }
Greg Clayton3bc52d02010-11-14 22:13:40 +00002262
Sean Callanan42072962012-05-21 22:25:52 +00002263 return lldb::VariableSP();
Sean Callanancc074622010-09-14 21:59:34 +00002264}
Sean Callanan336a0002010-07-17 00:43:37 +00002265
Sean Callanan81974962011-05-08 02:21:26 +00002266Symbol *
2267ClangExpressionDeclMap::FindGlobalDataSymbol
2268(
2269 Target &target,
Sean Callananaa4a5532011-10-13 16:49:47 +00002270 const ConstString &name
Sean Callanan81974962011-05-08 02:21:26 +00002271)
2272{
2273 SymbolContextList sc_list;
2274
Sean Callananaa4a5532011-10-13 16:49:47 +00002275 target.GetImages().FindSymbolsWithNameAndType(name,
2276 eSymbolTypeData,
2277 sc_list);
Sean Callanan81974962011-05-08 02:21:26 +00002278
2279 if (sc_list.GetSize())
2280 {
2281 SymbolContext sym_ctx;
2282 sc_list.GetContextAtIndex(0, sym_ctx);
2283
2284 return sym_ctx.symbol;
2285 }
2286
2287 return NULL;
2288}
2289
Sean Callanan47dc4572011-09-15 02:13:07 +00002290lldb::VariableSP
2291ClangExpressionDeclMap::FindGlobalVariable
2292(
2293 Target &target,
Sean Callanan94cd0ca2011-10-12 16:59:31 +00002294 ModuleSP &module,
2295 const ConstString &name,
2296 ClangNamespaceDecl *namespace_decl,
Sean Callanan47dc4572011-09-15 02:13:07 +00002297 TypeFromUser *type
2298)
2299{
2300 VariableList vars;
Sean Callanan47dc4572011-09-15 02:13:07 +00002301
Sean Callanan94cd0ca2011-10-12 16:59:31 +00002302 if (module && namespace_decl)
2303 module->FindGlobalVariables (name, namespace_decl, true, -1, vars);
2304 else
2305 target.GetImages().FindGlobalVariables(name, true, -1, vars);
Sean Callanan47dc4572011-09-15 02:13:07 +00002306
2307 if (vars.GetSize())
2308 {
2309 if (type)
2310 {
2311 for (size_t i = 0; i < vars.GetSize(); ++i)
2312 {
2313 VariableSP var_sp = vars.GetVariableAtIndex(i);
2314
2315 if (type->GetASTContext() == var_sp->GetType()->GetClangAST())
2316 {
2317 if (ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType()))
2318 return var_sp;
2319 }
2320 }
2321 }
2322 else
2323 {
2324 return vars.GetVariableAtIndex(0);
2325 }
2326 }
2327
2328 return VariableSP();
2329}
2330
Chris Lattner24943d22010-06-08 16:52:24 +00002331// Interface for ClangASTSource
Sean Callanan47dc4572011-09-15 02:13:07 +00002332
Sean Callanan16b53ab2011-10-12 00:12:34 +00002333void
Sean Callananf76afff2011-10-28 23:38:38 +00002334ClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context)
Chris Lattner24943d22010-06-08 16:52:24 +00002335{
Sean Callananf76afff2011-10-28 23:38:38 +00002336 assert (m_ast_context);
2337
2338 const ConstString name(context.m_decl_name.getAsString().c_str());
2339
Greg Claytone005f2c2010-11-06 01:53:30 +00002340 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Chris Lattner24943d22010-06-08 16:52:24 +00002341
Sean Callanan9394b5a2011-10-29 19:50:43 +00002342 if (GetImportInProgress())
Sean Callananee8fc722010-11-19 20:20:02 +00002343 {
Sean Callanan67bbb112011-10-14 20:34:21 +00002344 if (log && log->GetVerbose())
Sean Callananee8fc722010-11-19 20:20:02 +00002345 log->Printf("Ignoring a query during an import");
2346 return;
2347 }
Greg Claytone6d72ca2011-06-25 00:44:06 +00002348
Sean Callanan67bbb112011-10-14 20:34:21 +00002349 static unsigned int invocation_id = 0;
2350 unsigned int current_id = invocation_id++;
2351
Sean Callanan16b53ab2011-10-12 00:12:34 +00002352 if (log)
2353 {
2354 if (!context.m_decl_context)
Sean Callanan9394b5a2011-10-29 19:50:43 +00002355 log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in a NULL DeclContext", current_id, name.GetCString());
Sean Callanan16b53ab2011-10-12 00:12:34 +00002356 else if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context.m_decl_context))
Sean Callanan9394b5a2011-10-29 19:50:43 +00002357 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 +00002358 else
Sean Callanan9394b5a2011-10-29 19:50:43 +00002359 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 +00002360 }
Sean Callanan9394b5a2011-10-29 19:50:43 +00002361
Sean Callanan16b53ab2011-10-12 00:12:34 +00002362 if (const NamespaceDecl *namespace_context = dyn_cast<NamespaceDecl>(context.m_decl_context))
2363 {
Sean Callanan73b520f2011-10-29 01:58:46 +00002364 ClangASTImporter::NamespaceMapSP namespace_map = m_ast_importer->GetNamespaceMap(namespace_context);
Sean Callanana7597062011-10-13 21:08:11 +00002365
Sean Callanan67bbb112011-10-14 20:34:21 +00002366 if (log && log->GetVerbose())
Sean Callanan5a55c7a2011-11-18 03:28:09 +00002367 log->Printf(" CEDM::FEVD[%u] Inspecting (NamespaceMap*)%p (%d entries)",
Sean Callanan67bbb112011-10-14 20:34:21 +00002368 current_id,
2369 namespace_map.get(),
2370 (int)namespace_map->size());
Sean Callanana7597062011-10-13 21:08:11 +00002371
Sean Callanana7cb1fa2011-10-21 22:18:07 +00002372 if (!namespace_map)
2373 return;
2374
Sean Callanan16b53ab2011-10-12 00:12:34 +00002375 for (ClangASTImporter::NamespaceMap::iterator i = namespace_map->begin(), e = namespace_map->end();
2376 i != e;
2377 ++i)
2378 {
2379 if (log)
Sean Callanan9394b5a2011-10-29 19:50:43 +00002380 log->Printf(" CEDM::FEVD[%u] Searching namespace %s in module %s",
Sean Callanan67bbb112011-10-14 20:34:21 +00002381 current_id,
Sean Callanan16b53ab2011-10-12 00:12:34 +00002382 i->second.GetNamespaceDecl()->getNameAsString().c_str(),
2383 i->first->GetFileSpec().GetFilename().GetCString());
2384
Sean Callananc839adc2011-10-13 21:50:33 +00002385 FindExternalVisibleDecls(context,
2386 i->first,
2387 i->second,
Sean Callanan67bbb112011-10-14 20:34:21 +00002388 current_id);
Sean Callanan16b53ab2011-10-12 00:12:34 +00002389 }
2390 }
Sean Callanane6ea5fe2011-11-15 02:11:17 +00002391 else if (isa<TranslationUnitDecl>(context.m_decl_context))
Sean Callanan16b53ab2011-10-12 00:12:34 +00002392 {
2393 ClangNamespaceDecl namespace_decl;
2394
2395 if (log)
Sean Callanan9394b5a2011-10-29 19:50:43 +00002396 log->Printf(" CEDM::FEVD[%u] Searching the root namespace", current_id);
Sean Callanan16b53ab2011-10-12 00:12:34 +00002397
2398 FindExternalVisibleDecls(context,
2399 lldb::ModuleSP(),
2400 namespace_decl,
Sean Callanan67bbb112011-10-14 20:34:21 +00002401 current_id);
Sean Callanan16b53ab2011-10-12 00:12:34 +00002402 }
Sean Callanana7597062011-10-13 21:08:11 +00002403
Sean Callanan9394b5a2011-10-29 19:50:43 +00002404 if (!context.m_found.variable)
2405 ClangASTSource::FindExternalVisibleDecls(context);
Sean Callanan16b53ab2011-10-12 00:12:34 +00002406}
2407
2408void
2409ClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context,
Sean Callanan38d084f2011-10-12 18:44:30 +00002410 lldb::ModuleSP module_sp,
Sean Callanan03f64ca2011-10-12 01:39:28 +00002411 ClangNamespaceDecl &namespace_decl,
Sean Callanan67bbb112011-10-14 20:34:21 +00002412 unsigned int current_id)
Sean Callanan16b53ab2011-10-12 00:12:34 +00002413{
Sean Callananf76afff2011-10-28 23:38:38 +00002414 assert (m_ast_context);
Sean Callanan16b53ab2011-10-12 00:12:34 +00002415
2416 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan9394b5a2011-10-29 19:50:43 +00002417
Greg Claytone5748d82010-11-09 23:46:37 +00002418 SymbolContextList sc_list;
Chris Lattner24943d22010-06-08 16:52:24 +00002419
Sean Callanan9394b5a2011-10-29 19:50:43 +00002420 const ConstString name(context.m_decl_name.getAsString().c_str());
2421
Greg Clayton3bc52d02010-11-14 22:13:40 +00002422 const char *name_unique_cstr = name.GetCString();
2423
2424 if (name_unique_cstr == NULL)
2425 return;
Sean Callanan9394b5a2011-10-29 19:50:43 +00002426
Sean Callanan8f2e3922012-02-04 08:49:35 +00002427 static ConstString id_name("id");
2428 static ConstString Class_name("Class");
2429
2430 if (name == id_name || name == Class_name)
2431 return;
2432
Greg Clayton8de27c72010-10-15 22:48:33 +00002433 // Only look for functions by name out in our symbols if the function
2434 // doesn't start with our phony prefix of '$'
Sean Callanandd1dcfd2012-02-10 01:22:05 +00002435 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
2436 StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
Sean Callanan03f64ca2011-10-12 01:39:28 +00002437 if (name_unique_cstr[0] == '$' && !namespace_decl)
2438 {
2439 static ConstString g_lldb_class_name ("$__lldb_class");
2440
2441 if (name == g_lldb_class_name)
2442 {
2443 // Clang is looking for the type of "this"
Sean Callanan75ed99e2012-02-08 03:45:08 +00002444
2445 if (frame == NULL)
Sean Callanan03f64ca2011-10-12 01:39:28 +00002446 return;
2447
Sean Callanan75ed99e2012-02-08 03:45:08 +00002448 SymbolContext sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction);
Sean Callanan03f64ca2011-10-12 01:39:28 +00002449
Sean Callanan75ed99e2012-02-08 03:45:08 +00002450 if (!sym_ctx.function)
Sean Callanan03f64ca2011-10-12 01:39:28 +00002451 return;
2452
Greg Claytonb3a1a2b2012-07-14 00:53:55 +00002453 // Get the block that defines the function
2454 Block *function_block = sym_ctx.GetFunctionBlock();
2455
2456 if (!function_block)
2457 return;
2458
2459 clang::DeclContext *decl_context = function_block->GetClangDeclContext();
Sean Callanan75ed99e2012-02-08 03:45:08 +00002460
2461 if (!decl_context)
Sean Callanan03f64ca2011-10-12 01:39:28 +00002462 return;
2463
Sean Callanan75ed99e2012-02-08 03:45:08 +00002464 clang::CXXMethodDecl *method_decl = llvm::dyn_cast<clang::CXXMethodDecl>(decl_context);
Sean Callanan03f64ca2011-10-12 01:39:28 +00002465
Sean Callanan75ed99e2012-02-08 03:45:08 +00002466 if (!method_decl)
Sean Callanan03f64ca2011-10-12 01:39:28 +00002467 return;
2468
Sean Callanan75ed99e2012-02-08 03:45:08 +00002469 clang::CXXRecordDecl *class_decl = method_decl->getParent();
Sean Callanan03f64ca2011-10-12 01:39:28 +00002470
Sean Callanan75ed99e2012-02-08 03:45:08 +00002471 QualType class_qual_type(class_decl->getTypeForDecl(), 0);
Sean Callanan03f64ca2011-10-12 01:39:28 +00002472
Sean Callanan75ed99e2012-02-08 03:45:08 +00002473 TypeFromUser class_user_type (class_qual_type.getAsOpaquePtr(),
2474 &class_decl->getASTContext());
Sean Callanan03f64ca2011-10-12 01:39:28 +00002475
2476 if (log)
2477 {
Sean Callanan75ed99e2012-02-08 03:45:08 +00002478 ASTDumper ast_dumper(class_qual_type);
Sean Callanan9394b5a2011-10-29 19:50:43 +00002479 log->Printf(" CEDM::FEVD[%u] Adding type for $__lldb_class: %s", current_id, ast_dumper.GetCString());
Sean Callanan03f64ca2011-10-12 01:39:28 +00002480 }
2481
Sean Callanane3737fd2011-10-18 16:46:55 +00002482 AddOneType(context, class_user_type, current_id, true);
Sean Callanan03f64ca2011-10-12 01:39:28 +00002483
Sean Callananbd618772012-03-05 22:08:20 +00002484 if (method_decl->isInstance())
2485 {
2486 // self is a pointer to the object
2487
2488 QualType class_pointer_type = method_decl->getASTContext().getPointerType(class_qual_type);
2489
2490 TypeFromUser self_user_type(class_pointer_type.getAsOpaquePtr(),
2491 &method_decl->getASTContext());
2492
2493 m_struct_vars->m_object_pointer_type = self_user_type;
2494 }
2495
Sean Callanan03f64ca2011-10-12 01:39:28 +00002496 return;
2497 }
2498
2499 static ConstString g_lldb_objc_class_name ("$__lldb_objc_class");
2500 if (name == g_lldb_objc_class_name)
2501 {
2502 // Clang is looking for the type of "*self"
2503
2504 if (!frame)
2505 return;
Sean Callanane6ea5fe2011-11-15 02:11:17 +00002506
2507 SymbolContext sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction);
2508
2509 if (!sym_ctx.function)
2510 return;
2511
Greg Claytonb3a1a2b2012-07-14 00:53:55 +00002512 // Get the block that defines the function
2513 Block *function_block = sym_ctx.GetFunctionBlock();
Sean Callanane6ea5fe2011-11-15 02:11:17 +00002514
Greg Claytonb3a1a2b2012-07-14 00:53:55 +00002515 if (!function_block)
2516 return;
2517
2518 clang::DeclContext *decl_context = function_block->GetClangDeclContext();
Sean Callanane6ea5fe2011-11-15 02:11:17 +00002519
2520 if (!decl_context)
2521 return;
2522
2523 clang::ObjCMethodDecl *method_decl = llvm::dyn_cast<clang::ObjCMethodDecl>(decl_context);
2524
2525 if (!method_decl)
2526 return;
2527
2528 ObjCInterfaceDecl* self_interface = method_decl->getClassInterface();
2529
2530 if (!self_interface)
2531 return;
2532
2533 const clang::Type *interface_type = self_interface->getTypeForDecl();
2534
2535 TypeFromUser class_user_type(QualType(interface_type, 0).getAsOpaquePtr(),
2536 &method_decl->getASTContext());
2537
2538 if (log)
2539 {
2540 ASTDumper ast_dumper(interface_type);
2541 log->Printf(" FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, ast_dumper.GetCString());
2542 }
2543
2544 AddOneType(context, class_user_type, current_id, false);
Sean Callanan03f64ca2011-10-12 01:39:28 +00002545
Sean Callanan75ed99e2012-02-08 03:45:08 +00002546#if 0
Sean Callanan03f64ca2011-10-12 01:39:28 +00002547 VariableList *vars = frame->GetVariableList(false);
2548
Sean Callanan03f64ca2011-10-12 01:39:28 +00002549 lldb::VariableSP self_var = vars->FindVariable(ConstString("self"));
2550
Sean Callanan75ed99e2012-02-08 03:45:08 +00002551 if (self_var &&
2552 self_var->IsInScope(frame) &&
2553 self_var->LocationIsValidForFrame (frame)) {
2554 Type *self_type = self_var->GetType();
2555
2556 if (!self_type)
2557 return;
2558
2559 TypeFromUser self_user_type(self_type->GetClangFullType(),
2560 self_type->GetClangAST());
2561 }
2562#endif
Sean Callanan03f64ca2011-10-12 01:39:28 +00002563
Sean Callanan75ed99e2012-02-08 03:45:08 +00002564 if (method_decl->isInstanceMethod())
2565 {
2566 // self is a pointer to the object
2567
2568 QualType class_pointer_type = method_decl->getASTContext().getObjCObjectPointerType(QualType(interface_type, 0));
Sean Callanan03f64ca2011-10-12 01:39:28 +00002569
Sean Callanan75ed99e2012-02-08 03:45:08 +00002570 TypeFromUser self_user_type(class_pointer_type.getAsOpaquePtr(),
2571 &method_decl->getASTContext());
Sean Callanan03f64ca2011-10-12 01:39:28 +00002572
Sean Callanan75ed99e2012-02-08 03:45:08 +00002573 m_struct_vars->m_object_pointer_type = self_user_type;
2574 }
2575 else
2576 {
2577 // self is a Class pointer
2578 QualType class_type = method_decl->getASTContext().getObjCClassType();
2579
2580 TypeFromUser self_user_type(class_type.getAsOpaquePtr(),
2581 &method_decl->getASTContext());
2582
2583 m_struct_vars->m_object_pointer_type = self_user_type;
2584 }
2585
Sean Callanan03f64ca2011-10-12 01:39:28 +00002586 return;
2587 }
2588
2589 // any other $__lldb names should be weeded out now
2590 if (!::strncmp(name_unique_cstr, "$__lldb", sizeof("$__lldb") - 1))
2591 return;
2592
2593 do
2594 {
2595 if (!target)
2596 break;
2597
2598 ClangASTContext *scratch_clang_ast_context = target->GetScratchClangASTContext();
2599
2600 if (!scratch_clang_ast_context)
2601 break;
2602
2603 ASTContext *scratch_ast_context = scratch_clang_ast_context->getASTContext();
2604
2605 if (!scratch_ast_context)
2606 break;
2607
2608 TypeDecl *ptype_type_decl = m_parser_vars->m_persistent_vars->GetPersistentType(name);
2609
2610 if (!ptype_type_decl)
2611 break;
2612
Sean Callanane1301a62011-12-06 03:41:14 +00002613 Decl *parser_ptype_decl = m_ast_importer->CopyDecl(m_ast_context, scratch_ast_context, ptype_type_decl);
Sean Callanan03f64ca2011-10-12 01:39:28 +00002614
2615 if (!parser_ptype_decl)
2616 break;
2617
2618 TypeDecl *parser_ptype_type_decl = dyn_cast<TypeDecl>(parser_ptype_decl);
2619
2620 if (!parser_ptype_type_decl)
2621 break;
2622
2623 if (log)
Sean Callanan9394b5a2011-10-29 19:50:43 +00002624 log->Printf(" CEDM::FEVD[%u] Found persistent type %s", current_id, name.GetCString());
Sean Callanan03f64ca2011-10-12 01:39:28 +00002625
2626 context.AddNamedDecl(parser_ptype_type_decl);
2627 } while (0);
2628
2629 ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name));
2630
2631 if (pvar_sp)
2632 {
Sean Callanan67bbb112011-10-14 20:34:21 +00002633 AddOneVariable(context, pvar_sp, current_id);
Sean Callanan03f64ca2011-10-12 01:39:28 +00002634 return;
2635 }
2636
2637 const char *reg_name(&name.GetCString()[1]);
2638
Sean Callanandd1dcfd2012-02-10 01:22:05 +00002639 if (m_parser_vars->m_exe_ctx.GetRegisterContext())
Sean Callanan03f64ca2011-10-12 01:39:28 +00002640 {
Sean Callanandd1dcfd2012-02-10 01:22:05 +00002641 const RegisterInfo *reg_info(m_parser_vars->m_exe_ctx.GetRegisterContext()->GetRegisterInfoByName(reg_name));
Sean Callanan9394b5a2011-10-29 19:50:43 +00002642
Sean Callanan03f64ca2011-10-12 01:39:28 +00002643 if (reg_info)
Sean Callanane3737fd2011-10-18 16:46:55 +00002644 {
2645 if (log)
Sean Callanan9394b5a2011-10-29 19:50:43 +00002646 log->Printf(" CEDM::FEVD[%u] Found register %s", current_id, reg_info->name);
Sean Callanane3737fd2011-10-18 16:46:55 +00002647
Sean Callanan67bbb112011-10-14 20:34:21 +00002648 AddOneRegister(context, reg_info, current_id);
Sean Callanane3737fd2011-10-18 16:46:55 +00002649 }
Sean Callanan03f64ca2011-10-12 01:39:28 +00002650 }
2651 }
2652 else
Sean Callanan0fc73582010-07-27 00:55:47 +00002653 {
Sean Callananf8b468e2011-08-06 00:28:14 +00002654 ValueObjectSP valobj;
2655 VariableSP var;
2656 Error err;
2657
Sean Callanan03f64ca2011-10-12 01:39:28 +00002658 if (frame && !namespace_decl)
Greg Clayton8de27c72010-10-15 22:48:33 +00002659 {
Greg Clayton567e7f32011-09-22 04:58:26 +00002660 valobj = frame->GetValueForVariableExpressionPath(name_unique_cstr,
Sean Callanan16b53ab2011-10-12 00:12:34 +00002661 eNoDynamicValues,
2662 StackFrame::eExpressionPathOptionCheckPtrVsMember,
2663 var,
2664 err);
Sean Callanan47dc4572011-09-15 02:13:07 +00002665
2666 // If we found a variable in scope, no need to pull up function names
Sean Callananb386d822012-08-09 00:50:26 +00002667 if (err.Success() && var)
Sean Callanan47dc4572011-09-15 02:13:07 +00002668 {
Sean Callanan89e7df32011-11-29 22:03:21 +00002669 AddOneVariable(context, var, valobj, current_id);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002670 context.m_found.variable = true;
Sean Callanan3a546762011-10-25 20:36:57 +00002671 return;
Sean Callanan47dc4572011-09-15 02:13:07 +00002672 }
Greg Clayton8de27c72010-10-15 22:48:33 +00002673 }
Sean Callanan1c226272011-12-10 04:03:38 +00002674
2675 if (target)
Sean Callanan47dc4572011-09-15 02:13:07 +00002676 {
Sean Callanan94cd0ca2011-10-12 16:59:31 +00002677 var = FindGlobalVariable (*target,
Sean Callanan38d084f2011-10-12 18:44:30 +00002678 module_sp,
Sean Callanan94cd0ca2011-10-12 16:59:31 +00002679 name,
2680 &namespace_decl,
Greg Clayton567e7f32011-09-22 04:58:26 +00002681 NULL);
Sean Callanan47dc4572011-09-15 02:13:07 +00002682
2683 if (var)
2684 {
Sean Callananf48de6d2011-12-10 03:12:34 +00002685 valobj = ValueObjectVariable::Create(target, var);
Sean Callanan89e7df32011-11-29 22:03:21 +00002686 AddOneVariable(context, var, valobj, current_id);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002687 context.m_found.variable = true;
Sean Callanan1c226272011-12-10 04:03:38 +00002688 return;
Sean Callanan47dc4572011-09-15 02:13:07 +00002689 }
2690 }
2691
Sean Callanan16c4ec32011-10-12 20:29:25 +00002692 if (!context.m_found.variable)
Greg Clayton8de27c72010-10-15 22:48:33 +00002693 {
Sean Callanan302d78c2012-02-10 22:52:19 +00002694 const bool include_inlines = false;
Greg Clayton28d5fcc2011-01-27 06:44:37 +00002695 const bool append = false;
Sean Callanana5ec5a32011-10-12 17:38:09 +00002696
Sean Callanan38d084f2011-10-12 18:44:30 +00002697 if (namespace_decl && module_sp)
Sean Callanana5ec5a32011-10-12 17:38:09 +00002698 {
Sean Callanan51cd6f62012-02-15 17:14:49 +00002699 const bool include_symbols = false;
2700
Sean Callanan38d084f2011-10-12 18:44:30 +00002701 module_sp->FindFunctions(name,
2702 &namespace_decl,
2703 eFunctionNameTypeBase,
2704 include_symbols,
Sean Callanan302d78c2012-02-10 22:52:19 +00002705 include_inlines,
Sean Callanan38d084f2011-10-12 18:44:30 +00002706 append,
2707 sc_list);
Sean Callanana5ec5a32011-10-12 17:38:09 +00002708 }
Sean Callanan647fefd2012-03-06 20:53:06 +00002709 else if (!namespace_decl)
Sean Callanana5ec5a32011-10-12 17:38:09 +00002710 {
Sean Callanan51cd6f62012-02-15 17:14:49 +00002711 const bool include_symbols = true;
2712
Sean Callanan2975ada2012-07-28 00:21:01 +00002713 // TODO Fix FindFunctions so that it doesn't return
2714 // instance methods for eFunctionNameTypeBase.
2715
Sean Callanana5ec5a32011-10-12 17:38:09 +00002716 target->GetImages().FindFunctions(name,
2717 eFunctionNameTypeBase,
2718 include_symbols,
Sean Callanan302d78c2012-02-10 22:52:19 +00002719 include_inlines,
Sean Callanana5ec5a32011-10-12 17:38:09 +00002720 append,
2721 sc_list);
2722 }
2723
Sean Callanan81974962011-05-08 02:21:26 +00002724 if (sc_list.GetSize())
Greg Clayton8de27c72010-10-15 22:48:33 +00002725 {
Sean Callanan81974962011-05-08 02:21:26 +00002726 Symbol *generic_symbol = NULL;
2727 Symbol *non_extern_symbol = NULL;
2728
2729 for (uint32_t index = 0, num_indices = sc_list.GetSize();
2730 index < num_indices;
2731 ++index)
Greg Clayton8de27c72010-10-15 22:48:33 +00002732 {
Sean Callanan81974962011-05-08 02:21:26 +00002733 SymbolContext sym_ctx;
2734 sc_list.GetContextAtIndex(index, sym_ctx);
2735
2736 if (sym_ctx.function)
2737 {
Sean Callanan2975ada2012-07-28 00:21:01 +00002738 clang::DeclContext *decl_ctx = sym_ctx.function->GetClangDeclContext();
2739
2740 // Filter out class/instance methods.
2741 if (dyn_cast<clang::ObjCMethodDecl>(decl_ctx))
2742 continue;
2743 if (dyn_cast<clang::CXXMethodDecl>(decl_ctx))
2744 continue;
2745
Sean Callanan81974962011-05-08 02:21:26 +00002746 // TODO only do this if it's a C function; C++ functions may be
2747 // overloaded
Sean Callanan16c4ec32011-10-12 20:29:25 +00002748 if (!context.m_found.function_with_type_info)
Sean Callanan67bbb112011-10-14 20:34:21 +00002749 AddOneFunction(context, sym_ctx.function, NULL, current_id);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002750 context.m_found.function_with_type_info = true;
2751 context.m_found.function = true;
Sean Callanan81974962011-05-08 02:21:26 +00002752 }
2753 else if (sym_ctx.symbol)
2754 {
2755 if (sym_ctx.symbol->IsExternal())
2756 generic_symbol = sym_ctx.symbol;
2757 else
2758 non_extern_symbol = sym_ctx.symbol;
2759 }
Greg Clayton8de27c72010-10-15 22:48:33 +00002760 }
Sean Callanan81974962011-05-08 02:21:26 +00002761
Sean Callanan16c4ec32011-10-12 20:29:25 +00002762 if (!context.m_found.function_with_type_info)
Greg Clayton8de27c72010-10-15 22:48:33 +00002763 {
Sean Callanan81974962011-05-08 02:21:26 +00002764 if (generic_symbol)
Sean Callanan47dc4572011-09-15 02:13:07 +00002765 {
Sean Callanan67bbb112011-10-14 20:34:21 +00002766 AddOneFunction (context, NULL, generic_symbol, current_id);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002767 context.m_found.function = true;
Sean Callanan47dc4572011-09-15 02:13:07 +00002768 }
Sean Callanan81974962011-05-08 02:21:26 +00002769 else if (non_extern_symbol)
Sean Callanan47dc4572011-09-15 02:13:07 +00002770 {
Sean Callanan67bbb112011-10-14 20:34:21 +00002771 AddOneFunction (context, NULL, non_extern_symbol, current_id);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002772 context.m_found.function = true;
Sean Callanan47dc4572011-09-15 02:13:07 +00002773 }
Sean Callanan81974962011-05-08 02:21:26 +00002774 }
Greg Clayton8de27c72010-10-15 22:48:33 +00002775 }
Sean Callanan47dc4572011-09-15 02:13:07 +00002776
Sean Callanan647fefd2012-03-06 20:53:06 +00002777 if (!context.m_found.variable && !namespace_decl)
Greg Clayton8de27c72010-10-15 22:48:33 +00002778 {
Sean Callanan16c4ec32011-10-12 20:29:25 +00002779 // We couldn't find a non-symbol variable for this. Now we'll hunt for a generic
Sean Callanan81974962011-05-08 02:21:26 +00002780 // data symbol, and -- if it is found -- treat it as a variable.
2781
Sean Callananaa4a5532011-10-13 16:49:47 +00002782 Symbol *data_symbol = FindGlobalDataSymbol(*target, name);
Sean Callanan81974962011-05-08 02:21:26 +00002783
2784 if (data_symbol)
Sean Callanan47dc4572011-09-15 02:13:07 +00002785 {
Sean Callanan67bbb112011-10-14 20:34:21 +00002786 AddOneGenericVariable(context, *data_symbol, current_id);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002787 context.m_found.variable = true;
Sean Callanan47dc4572011-09-15 02:13:07 +00002788 }
Greg Clayton6916e352010-11-13 03:52:47 +00002789 }
Sean Callanan92aa6662010-09-07 21:49:41 +00002790 }
Sean Callananb549b0a2011-10-27 02:06:03 +00002791 }
Sean Callanan336a0002010-07-17 00:43:37 +00002792}
Greg Claytone6d72ca2011-06-25 00:44:06 +00002793
Sean Callanan69716a22012-03-06 21:56:33 +00002794static clang_type_t
2795MaybePromoteToBlockPointerType
2796(
2797 ASTContext *ast_context,
2798 clang_type_t candidate_type
2799)
2800{
2801 if (!candidate_type)
2802 return candidate_type;
2803
2804 QualType candidate_qual_type = QualType::getFromOpaquePtr(candidate_type);
2805
2806 const PointerType *candidate_pointer_type = dyn_cast<PointerType>(candidate_qual_type);
2807
2808 if (!candidate_pointer_type)
2809 return candidate_type;
2810
2811 QualType pointee_qual_type = candidate_pointer_type->getPointeeType();
2812
2813 const RecordType *pointee_record_type = dyn_cast<RecordType>(pointee_qual_type);
2814
2815 if (!pointee_record_type)
2816 return candidate_type;
2817
2818 RecordDecl *pointee_record_decl = pointee_record_type->getDecl();
2819
2820 if (!pointee_record_decl->isRecord())
2821 return candidate_type;
2822
2823 if (!pointee_record_decl->getName().startswith(llvm::StringRef("__block_literal_")))
2824 return candidate_type;
2825
2826 QualType generic_function_type = ast_context->getFunctionNoProtoType(ast_context->UnknownAnyTy);
2827 QualType block_pointer_type = ast_context->getBlockPointerType(generic_function_type);
2828
2829 return block_pointer_type.getAsOpaquePtr();
2830}
2831
Sean Callanan336a0002010-07-17 00:43:37 +00002832Value *
Greg Clayton8de27c72010-10-15 22:48:33 +00002833ClangExpressionDeclMap::GetVariableValue
2834(
Sean Callanan4a078322011-10-13 00:09:20 +00002835 VariableSP &var,
Sean Callanan9b6898f2011-07-30 02:42:06 +00002836 ASTContext *parser_ast_context,
Greg Clayton8de27c72010-10-15 22:48:33 +00002837 TypeFromUser *user_type,
2838 TypeFromParser *parser_type
2839)
Chris Lattner24943d22010-06-08 16:52:24 +00002840{
Greg Claytone005f2c2010-11-06 01:53:30 +00002841 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan6184dfe2010-06-23 00:47:48 +00002842
Chris Lattner24943d22010-06-08 16:52:24 +00002843 Type *var_type = var->GetType();
2844
2845 if (!var_type)
2846 {
Sean Callanan810f22d2010-07-16 00:09:46 +00002847 if (log)
2848 log->PutCString("Skipped a definition because it has no type");
Sean Callanan336a0002010-07-17 00:43:37 +00002849 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00002850 }
2851
Greg Clayton04c9c7b2011-02-16 23:00:21 +00002852 clang_type_t var_opaque_type = var_type->GetClangFullType();
Chris Lattner24943d22010-06-08 16:52:24 +00002853
2854 if (!var_opaque_type)
2855 {
Sean Callanan810f22d2010-07-16 00:09:46 +00002856 if (log)
2857 log->PutCString("Skipped a definition because it has no Clang type");
Sean Callanan336a0002010-07-17 00:43:37 +00002858 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00002859 }
2860
Sean Callanan9b6898f2011-07-30 02:42:06 +00002861 ASTContext *ast = var_type->GetClangASTContext().getASTContext();
Chris Lattner24943d22010-06-08 16:52:24 +00002862
Greg Claytonb01000f2011-01-17 03:46:26 +00002863 if (!ast)
Chris Lattner24943d22010-06-08 16:52:24 +00002864 {
Sean Callanan810f22d2010-07-16 00:09:46 +00002865 if (log)
2866 log->PutCString("There is no AST context for the current execution context");
Sean Callanan336a0002010-07-17 00:43:37 +00002867 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00002868 }
Sean Callanan69716a22012-03-06 21:56:33 +00002869
Enrico Granata3418bfe2012-03-30 16:58:37 +00002870 // commented out because of <rdar://problem/11024417>
2871 //var_opaque_type = MaybePromoteToBlockPointerType (ast, var_opaque_type);
Chris Lattner24943d22010-06-08 16:52:24 +00002872
Sean Callanan336a0002010-07-17 00:43:37 +00002873 DWARFExpression &var_location_expr = var->LocationExpression();
2874
Chris Lattner24943d22010-06-08 16:52:24 +00002875 std::auto_ptr<Value> var_location(new Value);
2876
Greg Clayton178710c2010-09-14 02:20:48 +00002877 lldb::addr_t loclist_base_load_addr = LLDB_INVALID_ADDRESS;
2878
Sean Callanandd1dcfd2012-02-10 01:22:05 +00002879 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
Greg Clayton567e7f32011-09-22 04:58:26 +00002880
Greg Clayton178710c2010-09-14 02:20:48 +00002881 if (var_location_expr.IsLocationList())
2882 {
2883 SymbolContext var_sc;
2884 var->CalculateSymbolContext (&var_sc);
Greg Clayton567e7f32011-09-22 04:58:26 +00002885 loclist_base_load_addr = var_sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress (target);
Greg Clayton178710c2010-09-14 02:20:48 +00002886 }
Chris Lattner24943d22010-06-08 16:52:24 +00002887 Error err;
2888
Sean Callanandd1dcfd2012-02-10 01:22:05 +00002889 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 +00002890 {
Sean Callanan810f22d2010-07-16 00:09:46 +00002891 if (log)
2892 log->Printf("Error evaluating location: %s", err.AsCString());
Sean Callanan336a0002010-07-17 00:43:37 +00002893 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00002894 }
Greg Claytonb01000f2011-01-17 03:46:26 +00002895
Sean Callanan58baaad2011-07-08 00:39:14 +00002896 void *type_to_use = NULL;
Sean Callanan336a0002010-07-17 00:43:37 +00002897
Sean Callananf328c9f2010-07-20 23:31:16 +00002898 if (parser_ast_context)
2899 {
Greg Claytonb01000f2011-01-17 03:46:26 +00002900 type_to_use = GuardedCopyType(parser_ast_context, ast, var_opaque_type);
Sean Callananf328c9f2010-07-20 23:31:16 +00002901
Sean Callanan4b5eec62010-11-20 02:19:29 +00002902 if (!type_to_use)
2903 {
2904 if (log)
2905 log->Printf("Couldn't copy a variable's type into the parser's AST context");
2906
2907 return NULL;
2908 }
2909
Sean Callananf328c9f2010-07-20 23:31:16 +00002910 if (parser_type)
2911 *parser_type = TypeFromParser(type_to_use, parser_ast_context);
2912 }
Sean Callanan336a0002010-07-17 00:43:37 +00002913 else
2914 type_to_use = var_opaque_type;
Chris Lattner24943d22010-06-08 16:52:24 +00002915
2916 if (var_location.get()->GetContextType() == Value::eContextTypeInvalid)
Greg Clayton6916e352010-11-13 03:52:47 +00002917 var_location.get()->SetContext(Value::eContextTypeClangType, type_to_use);
Chris Lattner24943d22010-06-08 16:52:24 +00002918
2919 if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress)
2920 {
2921 SymbolContext var_sc;
2922 var->CalculateSymbolContext(&var_sc);
Sean Callanan336a0002010-07-17 00:43:37 +00002923
Chris Lattner24943d22010-06-08 16:52:24 +00002924 if (!var_sc.module_sp)
Sean Callanan336a0002010-07-17 00:43:37 +00002925 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00002926
2927 ObjectFile *object_file = var_sc.module_sp->GetObjectFile();
2928
2929 if (!object_file)
Sean Callanan336a0002010-07-17 00:43:37 +00002930 return NULL;
2931
Chris Lattner24943d22010-06-08 16:52:24 +00002932 Address so_addr(var_location->GetScalar().ULongLong(), object_file->GetSectionList());
2933
Greg Clayton567e7f32011-09-22 04:58:26 +00002934 lldb::addr_t load_addr = so_addr.GetLoadAddress(target);
Chris Lattner24943d22010-06-08 16:52:24 +00002935
Sean Callanan47dc4572011-09-15 02:13:07 +00002936 if (load_addr != LLDB_INVALID_ADDRESS)
2937 {
2938 var_location->GetScalar() = load_addr;
2939 var_location->SetValueType(Value::eValueTypeLoadAddress);
2940 }
Chris Lattner24943d22010-06-08 16:52:24 +00002941 }
2942
Sean Callananf328c9f2010-07-20 23:31:16 +00002943 if (user_type)
Greg Claytonb01000f2011-01-17 03:46:26 +00002944 *user_type = TypeFromUser(var_opaque_type, ast);
Sean Callanan336a0002010-07-17 00:43:37 +00002945
2946 return var_location.release();
2947}
2948
2949void
Sean Callanan89e7df32011-11-29 22:03:21 +00002950ClangExpressionDeclMap::AddOneVariable (NameSearchContext &context, VariableSP var, ValueObjectSP valobj, unsigned int current_id)
Sean Callanan336a0002010-07-17 00:43:37 +00002951{
Sean Callananaa301c42010-12-03 01:38:59 +00002952 assert (m_parser_vars.get());
2953
Greg Claytone005f2c2010-11-06 01:53:30 +00002954 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan47dc4572011-09-15 02:13:07 +00002955
Sean Callananf328c9f2010-07-20 23:31:16 +00002956 TypeFromUser ut;
2957 TypeFromParser pt;
Sean Callanan336a0002010-07-17 00:43:37 +00002958
Sean Callanandd1dcfd2012-02-10 01:22:05 +00002959 Value *var_location = GetVariableValue (var,
Sean Callananf76afff2011-10-28 23:38:38 +00002960 m_ast_context,
Greg Clayton8de27c72010-10-15 22:48:33 +00002961 &ut,
2962 &pt);
Sean Callanan336a0002010-07-17 00:43:37 +00002963
Sean Callanane9478392012-03-15 01:53:17 +00002964 clang::QualType parser_opaque_type = QualType::getFromOpaquePtr(pt.GetOpaqueQualType());
2965
Sean Callanan30a5dd52012-03-21 17:13:20 +00002966 if (parser_opaque_type.isNull())
2967 return;
2968
Sean Callanane9478392012-03-15 01:53:17 +00002969 if (const clang::Type *parser_type = parser_opaque_type.getTypePtr())
2970 {
2971 if (const TagType *tag_type = dyn_cast<TagType>(parser_type))
2972 CompleteType(tag_type->getDecl());
2973 }
2974
Sean Callanan4b5eec62010-11-20 02:19:29 +00002975 if (!var_location)
2976 return;
2977
Sean Callanan6f3bde72011-10-27 19:41:13 +00002978 NamedDecl *var_decl;
2979
2980 bool is_reference = ClangASTContext::IsReferenceType(pt.GetOpaqueQualType());
2981
2982 if (is_reference)
2983 var_decl = context.AddVarDecl(pt.GetOpaqueQualType());
2984 else
2985 var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(pt.GetASTContext(), pt.GetOpaqueQualType()));
2986
Greg Clayton8de27c72010-10-15 22:48:33 +00002987 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton427f2902010-12-14 02:59:59 +00002988 ConstString entity_name(decl_name.c_str());
Sean Callanan89e7df32011-11-29 22:03:21 +00002989 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (valobj));
2990
Greg Clayton427f2902010-12-14 02:59:59 +00002991 assert (entity.get());
2992 entity->EnableParserVars();
2993 entity->m_parser_vars->m_parser_type = pt;
2994 entity->m_parser_vars->m_named_decl = var_decl;
2995 entity->m_parser_vars->m_llvm_value = NULL;
2996 entity->m_parser_vars->m_lldb_value = var_location;
Sean Callanan696cf5f2011-05-07 01:06:41 +00002997 entity->m_parser_vars->m_lldb_var = var;
Chris Lattner24943d22010-06-08 16:52:24 +00002998
Sean Callanan6f3bde72011-10-27 19:41:13 +00002999 if (is_reference)
3000 entity->m_flags |= ClangExpressionVariable::EVTypeIsReference;
3001
Sean Callanan810f22d2010-07-16 00:09:46 +00003002 if (log)
Greg Clayton8de27c72010-10-15 22:48:33 +00003003 {
Sean Callananaa561412011-11-07 23:32:52 +00003004 ASTDumper orig_dumper(ut.GetOpaqueQualType());
Greg Claytona23ca422011-10-20 00:47:21 +00003005 ASTDumper ast_dumper(var_decl);
Sean Callananaa561412011-11-07 23:32:52 +00003006 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 +00003007 }
Sean Callanan8f0dc342010-06-22 23:46:24 +00003008}
3009
3010void
Sean Callanana48fe162010-08-11 03:57:18 +00003011ClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
Sean Callanan67bbb112011-10-14 20:34:21 +00003012 ClangExpressionVariableSP &pvar_sp,
3013 unsigned int current_id)
Sean Callanana48fe162010-08-11 03:57:18 +00003014{
Greg Claytone005f2c2010-11-06 01:53:30 +00003015 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan45690fe2010-08-30 22:17:16 +00003016
Greg Clayton427f2902010-12-14 02:59:59 +00003017 TypeFromUser user_type (pvar_sp->GetTypeFromUser());
Sean Callanana48fe162010-08-11 03:57:18 +00003018
Sean Callananf76afff2011-10-28 23:38:38 +00003019 TypeFromParser parser_type (GuardedCopyType(m_ast_context,
Greg Clayton427f2902010-12-14 02:59:59 +00003020 user_type.GetASTContext(),
3021 user_type.GetOpaqueQualType()),
Sean Callananf76afff2011-10-28 23:38:38 +00003022 m_ast_context);
Sean Callanana48fe162010-08-11 03:57:18 +00003023
Sean Callanandc5fce12011-12-01 21:04:37 +00003024 if (!parser_type.GetOpaqueQualType())
3025 {
3026 if (log)
3027 log->Printf(" CEDM::FEVD[%u] Couldn't import type for pvar %s", current_id, pvar_sp->GetName().GetCString());
3028 return;
3029 }
3030
Sean Callanan6a925532011-01-13 08:53:35 +00003031 NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(parser_type.GetASTContext(), parser_type.GetOpaqueQualType()));
Sean Callanan8c127202010-08-23 23:09:38 +00003032
Greg Clayton427f2902010-12-14 02:59:59 +00003033 pvar_sp->EnableParserVars();
3034 pvar_sp->m_parser_vars->m_parser_type = parser_type;
3035 pvar_sp->m_parser_vars->m_named_decl = var_decl;
3036 pvar_sp->m_parser_vars->m_llvm_value = NULL;
3037 pvar_sp->m_parser_vars->m_lldb_value = NULL;
Sean Callanan45690fe2010-08-30 22:17:16 +00003038
3039 if (log)
Sean Callanana0744822010-11-01 23:22:47 +00003040 {
Greg Claytona23ca422011-10-20 00:47:21 +00003041 ASTDumper ast_dumper(var_decl);
Sean Callanan9394b5a2011-10-29 19:50:43 +00003042 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 +00003043 }
Sean Callanana48fe162010-08-11 03:57:18 +00003044}
3045
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00003046void
Sean Callanan81974962011-05-08 02:21:26 +00003047ClangExpressionDeclMap::AddOneGenericVariable(NameSearchContext &context,
Sean Callanan67bbb112011-10-14 20:34:21 +00003048 Symbol &symbol,
3049 unsigned int current_id)
Sean Callanan81974962011-05-08 02:21:26 +00003050{
3051 assert(m_parser_vars.get());
3052
3053 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
3054
Sean Callanandd1dcfd2012-02-10 01:22:05 +00003055 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
Greg Clayton567e7f32011-09-22 04:58:26 +00003056
3057 if (target == NULL)
3058 return;
3059
3060 ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
Sean Callanan81974962011-05-08 02:21:26 +00003061
Sean Callananfb3058e2011-05-12 23:54:16 +00003062 TypeFromUser user_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(scratch_ast_context, true)),
Sean Callanan81974962011-05-08 02:21:26 +00003063 scratch_ast_context);
3064
Sean Callananf76afff2011-10-28 23:38:38 +00003065 TypeFromParser parser_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(m_ast_context, true)),
3066 m_ast_context);
Sean Callanan81974962011-05-08 02:21:26 +00003067
Sean Callananfb3058e2011-05-12 23:54:16 +00003068 NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
Sean Callanan81974962011-05-08 02:21:26 +00003069
3070 std::string decl_name(context.m_decl_name.getAsString());
3071 ConstString entity_name(decl_name.c_str());
Sean Callanandd1dcfd2012-02-10 01:22:05 +00003072 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope (),
Sean Callanan81974962011-05-08 02:21:26 +00003073 entity_name,
3074 user_type,
Sean Callanan47dc4572011-09-15 02:13:07 +00003075 m_parser_vars->m_target_info.byte_order,
3076 m_parser_vars->m_target_info.address_byte_size));
Sean Callanan81974962011-05-08 02:21:26 +00003077 assert (entity.get());
Sean Callanan81974962011-05-08 02:21:26 +00003078
3079 std::auto_ptr<Value> symbol_location(new Value);
3080
Greg Clayton0c31d3d2012-03-07 21:03:09 +00003081 Address &symbol_address = symbol.GetAddress();
Greg Clayton567e7f32011-09-22 04:58:26 +00003082 lldb::addr_t symbol_load_addr = symbol_address.GetLoadAddress(target);
Sean Callanan81974962011-05-08 02:21:26 +00003083
3084 symbol_location->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
3085 symbol_location->GetScalar() = symbol_load_addr;
3086 symbol_location->SetValueType(Value::eValueTypeLoadAddress);
3087
Sean Callananfb3058e2011-05-12 23:54:16 +00003088 entity->EnableParserVars();
Sean Callanan81974962011-05-08 02:21:26 +00003089 entity->m_parser_vars->m_parser_type = parser_type;
3090 entity->m_parser_vars->m_named_decl = var_decl;
3091 entity->m_parser_vars->m_llvm_value = NULL;
3092 entity->m_parser_vars->m_lldb_value = symbol_location.release();
3093 entity->m_parser_vars->m_lldb_sym = &symbol;
3094
3095 if (log)
3096 {
Greg Claytona23ca422011-10-20 00:47:21 +00003097 ASTDumper ast_dumper(var_decl);
Sean Callanan81974962011-05-08 02:21:26 +00003098
Sean Callanan9394b5a2011-10-29 19:50:43 +00003099 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 +00003100 }
3101}
3102
Sean Callananfb3058e2011-05-12 23:54:16 +00003103bool
3104ClangExpressionDeclMap::ResolveUnknownTypes()
3105{
3106 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanandd1dcfd2012-02-10 01:22:05 +00003107 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
Greg Clayton567e7f32011-09-22 04:58:26 +00003108
3109 ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
Sean Callananfb3058e2011-05-12 23:54:16 +00003110
3111 for (size_t index = 0, num_entities = m_found_entities.GetSize();
3112 index < num_entities;
3113 ++index)
3114 {
3115 ClangExpressionVariableSP entity = m_found_entities.GetVariableAtIndex(index);
3116
3117 if (entity->m_flags & ClangExpressionVariable::EVUnknownType)
3118 {
3119 const NamedDecl *named_decl = entity->m_parser_vars->m_named_decl;
3120 const VarDecl *var_decl = dyn_cast<VarDecl>(named_decl);
3121
3122 if (!var_decl)
3123 {
3124 if (log)
3125 log->Printf("Entity of unknown type does not have a VarDecl");
3126 return false;
3127 }
3128
3129 if (log)
3130 {
Greg Claytona23ca422011-10-20 00:47:21 +00003131 ASTDumper ast_dumper(const_cast<VarDecl*>(var_decl));
3132 log->Printf("Variable of unknown type now has Decl %s", ast_dumper.GetCString());
Sean Callananfb3058e2011-05-12 23:54:16 +00003133 }
3134
3135 QualType var_type = var_decl->getType();
3136 TypeFromParser parser_type(var_type.getAsOpaquePtr(), &var_decl->getASTContext());
3137
Sean Callanan5a55c7a2011-11-18 03:28:09 +00003138 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 +00003139
Sean Callanandc5fce12011-12-01 21:04:37 +00003140 if (!copied_type)
3141 {
3142 if (log)
3143 log->Printf("ClangExpressionDeclMap::ResolveUnknownType - Couldn't import the type for a variable");
3144
Jim Ingham9880efa2012-08-11 00:35:26 +00003145 return (bool) lldb::ClangExpressionVariableSP();
Sean Callanandc5fce12011-12-01 21:04:37 +00003146 }
3147
Sean Callananfb3058e2011-05-12 23:54:16 +00003148 TypeFromUser user_type(copied_type, scratch_ast_context);
3149
3150 entity->m_parser_vars->m_lldb_value->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
3151 entity->m_parser_vars->m_parser_type = parser_type;
3152
3153 entity->SetClangAST(user_type.GetASTContext());
3154 entity->SetClangType(user_type.GetOpaqueQualType());
3155
3156 entity->m_flags &= ~(ClangExpressionVariable::EVUnknownType);
3157 }
3158 }
3159
3160 return true;
3161}
3162
Sean Callanan81974962011-05-08 02:21:26 +00003163void
Greg Clayton427f2902010-12-14 02:59:59 +00003164ClangExpressionDeclMap::AddOneRegister (NameSearchContext &context,
Sean Callanan67bbb112011-10-14 20:34:21 +00003165 const RegisterInfo *reg_info,
3166 unsigned int current_id)
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00003167{
3168 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
3169
Sean Callananf76afff2011-10-28 23:38:38 +00003170 void *ast_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize(m_ast_context,
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00003171 reg_info->encoding,
3172 reg_info->byte_size * 8);
3173
3174 if (!ast_type)
3175 {
Johnny Chen122204d2011-08-09 22:52:27 +00003176 if (log)
Sean Callanan67bbb112011-10-14 20:34:21 +00003177 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 +00003178 return;
3179 }
3180
Greg Clayton427f2902010-12-14 02:59:59 +00003181 TypeFromParser parser_type (ast_type,
Sean Callananf76afff2011-10-28 23:38:38 +00003182 m_ast_context);
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00003183
3184 NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
3185
Sean Callanandd1dcfd2012-02-10 01:22:05 +00003186 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(),
Sean Callanan47dc4572011-09-15 02:13:07 +00003187 m_parser_vars->m_target_info.byte_order,
3188 m_parser_vars->m_target_info.address_byte_size));
Greg Clayton427f2902010-12-14 02:59:59 +00003189 assert (entity.get());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00003190 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton427f2902010-12-14 02:59:59 +00003191 entity->SetName (ConstString (decl_name.c_str()));
3192 entity->SetRegisterInfo (reg_info);
3193 entity->EnableParserVars();
3194 entity->m_parser_vars->m_parser_type = parser_type;
3195 entity->m_parser_vars->m_named_decl = var_decl;
3196 entity->m_parser_vars->m_llvm_value = NULL;
3197 entity->m_parser_vars->m_lldb_value = NULL;
Sean Callanan52d0d022012-02-15 01:40:39 +00003198 entity->m_flags |= ClangExpressionVariable::EVBareRegister;
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00003199
Sean Callanan52d0d022012-02-15 01:40:39 +00003200 if (log)
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00003201 {
Greg Claytona23ca422011-10-20 00:47:21 +00003202 ASTDumper ast_dumper(var_decl);
Sean Callanan9394b5a2011-10-29 19:50:43 +00003203 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 +00003204 }
3205}
3206
Sean Callanana48fe162010-08-11 03:57:18 +00003207void
Greg Claytonda7af842011-05-18 22:01:49 +00003208ClangExpressionDeclMap::AddOneFunction (NameSearchContext &context,
3209 Function* fun,
Sean Callanan67bbb112011-10-14 20:34:21 +00003210 Symbol* symbol,
3211 unsigned int current_id)
Sean Callanan8f0dc342010-06-22 23:46:24 +00003212{
Sean Callananaa301c42010-12-03 01:38:59 +00003213 assert (m_parser_vars.get());
3214
Greg Claytone005f2c2010-11-06 01:53:30 +00003215 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan8f0dc342010-06-22 23:46:24 +00003216
Sean Callanan58baaad2011-07-08 00:39:14 +00003217 NamedDecl *fun_decl = NULL;
Sean Callanan8f0dc342010-06-22 23:46:24 +00003218 std::auto_ptr<Value> fun_location(new Value);
Sean Callanan58baaad2011-07-08 00:39:14 +00003219 const Address *fun_address = NULL;
Sean Callanan8f0dc342010-06-22 23:46:24 +00003220
Sean Callanan0fc73582010-07-27 00:55:47 +00003221 // only valid for Functions, not for Symbols
3222 void *fun_opaque_type = NULL;
Sean Callanan9b6898f2011-07-30 02:42:06 +00003223 ASTContext *fun_ast_context = NULL;
Sean Callanan0fc73582010-07-27 00:55:47 +00003224
3225 if (fun)
3226 {
3227 Type *fun_type = fun->GetType();
3228
3229 if (!fun_type)
3230 {
3231 if (log)
Sean Callanan67bbb112011-10-14 20:34:21 +00003232 log->PutCString(" Skipped a function because it has no type");
Sean Callanan0fc73582010-07-27 00:55:47 +00003233 return;
3234 }
3235
Greg Clayton04c9c7b2011-02-16 23:00:21 +00003236 fun_opaque_type = fun_type->GetClangFullType();
Sean Callanan0fc73582010-07-27 00:55:47 +00003237
3238 if (!fun_opaque_type)
3239 {
3240 if (log)
Sean Callanan67bbb112011-10-14 20:34:21 +00003241 log->PutCString(" Skipped a function because it has no Clang type");
Sean Callanan0fc73582010-07-27 00:55:47 +00003242 return;
3243 }
3244
3245 fun_address = &fun->GetAddressRange().GetBaseAddress();
3246
Greg Claytonb01000f2011-01-17 03:46:26 +00003247 fun_ast_context = fun_type->GetClangASTContext().getASTContext();
Sean Callananf76afff2011-10-28 23:38:38 +00003248 void *copied_type = GuardedCopyType(m_ast_context, fun_ast_context, fun_opaque_type);
Greg Claytona23ca422011-10-20 00:47:21 +00003249 if (copied_type)
3250 {
3251 fun_decl = context.AddFunDecl(copied_type);
3252 }
3253 else
3254 {
3255 // We failed to copy the type we found
3256 if (log)
3257 {
3258 log->Printf (" Failed to import the function type '%s' {0x%8.8llx} into the expression parser AST contenxt",
3259 fun_type->GetName().GetCString(),
3260 fun_type->GetID());
3261 }
Sean Callanan16089542011-11-16 00:40:13 +00003262
3263 return;
Greg Claytona23ca422011-10-20 00:47:21 +00003264 }
Sean Callanan0fc73582010-07-27 00:55:47 +00003265 }
3266 else if (symbol)
3267 {
Greg Clayton0c31d3d2012-03-07 21:03:09 +00003268 fun_address = &symbol->GetAddress();
Sean Callanan0fc73582010-07-27 00:55:47 +00003269 fun_decl = context.AddGenericFunDecl();
3270 }
3271 else
3272 {
3273 if (log)
Sean Callanan67bbb112011-10-14 20:34:21 +00003274 log->PutCString(" AddOneFunction called with no function and no symbol");
Sean Callanan0fc73582010-07-27 00:55:47 +00003275 return;
3276 }
3277
Sean Callanandd1dcfd2012-02-10 01:22:05 +00003278 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
Greg Clayton567e7f32011-09-22 04:58:26 +00003279
3280 lldb::addr_t load_addr = fun_address->GetCallableLoadAddress(target);
Sean Callanan8f0dc342010-06-22 23:46:24 +00003281 fun_location->SetValueType(Value::eValueTypeLoadAddress);
3282 fun_location->GetScalar() = load_addr;
3283
Sean Callanandd1dcfd2012-02-10 01:22:05 +00003284 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope (),
Sean Callanan47dc4572011-09-15 02:13:07 +00003285 m_parser_vars->m_target_info.byte_order,
3286 m_parser_vars->m_target_info.address_byte_size));
Greg Clayton427f2902010-12-14 02:59:59 +00003287 assert (entity.get());
Greg Clayton8de27c72010-10-15 22:48:33 +00003288 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton427f2902010-12-14 02:59:59 +00003289 entity->SetName(ConstString(decl_name.c_str()));
3290 entity->SetClangType (fun_opaque_type);
3291 entity->SetClangAST (fun_ast_context);
Sean Callanan8f0dc342010-06-22 23:46:24 +00003292
Greg Clayton427f2902010-12-14 02:59:59 +00003293 entity->EnableParserVars();
3294 entity->m_parser_vars->m_named_decl = fun_decl;
3295 entity->m_parser_vars->m_llvm_value = NULL;
3296 entity->m_parser_vars->m_lldb_value = fun_location.release();
Sean Callanan8c127202010-08-23 23:09:38 +00003297
Sean Callanan810f22d2010-07-16 00:09:46 +00003298 if (log)
Greg Clayton8de27c72010-10-15 22:48:33 +00003299 {
Greg Claytona23ca422011-10-20 00:47:21 +00003300 ASTDumper ast_dumper(fun_decl);
Sean Callanana0744822010-11-01 23:22:47 +00003301
Sean Callanan2975ada2012-07-28 00:21:01 +00003302 StreamString ss;
3303
3304 fun_address->Dump(&ss, m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(), Address::DumpStyleResolvedDescription);
3305
3306 log->Printf(" CEDM::FEVD[%u] Found %s function %s (description %s), returned %s",
Sean Callanan67bbb112011-10-14 20:34:21 +00003307 current_id,
3308 (fun ? "specific" : "generic"),
Sean Callanan2975ada2012-07-28 00:21:01 +00003309 decl_name.c_str(),
3310 ss.GetData(),
Greg Claytona23ca422011-10-20 00:47:21 +00003311 ast_dumper.GetCString());
Greg Clayton8de27c72010-10-15 22:48:33 +00003312 }
Chris Lattner24943d22010-06-08 16:52:24 +00003313}
Sean Callanan93a4b1a2010-08-04 01:02:13 +00003314
3315void
3316ClangExpressionDeclMap::AddOneType(NameSearchContext &context,
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00003317 TypeFromUser &ut,
Sean Callanan67bbb112011-10-14 20:34:21 +00003318 unsigned int current_id,
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00003319 bool add_method)
Sean Callanan93a4b1a2010-08-04 01:02:13 +00003320{
Sean Callananf76afff2011-10-28 23:38:38 +00003321 ASTContext *parser_ast_context = m_ast_context;
Sean Callanan9b6898f2011-07-30 02:42:06 +00003322 ASTContext *user_ast_context = ut.GetASTContext();
Sean Callanan93a4b1a2010-08-04 01:02:13 +00003323
Sean Callananee8fc722010-11-19 20:20:02 +00003324 void *copied_type = GuardedCopyType(parser_ast_context, user_ast_context, ut.GetOpaqueQualType());
Sean Callanandc5fce12011-12-01 21:04:37 +00003325
3326 if (!copied_type)
3327 {
3328 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
3329
3330 if (log)
3331 log->Printf("ClangExpressionDeclMap::AddOneType - Couldn't import the type");
3332
3333 return;
3334 }
Sean Callanan9394b5a2011-10-29 19:50:43 +00003335
Greg Clayton3356d4f2012-03-30 00:51:13 +00003336 if (add_method && ClangASTContext::IsAggregateType(copied_type) && ClangASTContext::GetCompleteType (parser_ast_context, copied_type))
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00003337 {
3338 void *args[1];
3339
3340 args[0] = ClangASTContext::GetVoidPtrType(parser_ast_context, false);
3341
Sean Callanan716e3f02011-11-01 18:07:13 +00003342 clang_type_t method_type = ClangASTContext::CreateFunctionType (parser_ast_context,
3343 ClangASTContext::GetBuiltInType_void(parser_ast_context),
3344 args,
3345 1,
3346 false,
3347 ClangASTContext::GetTypeQualifiers(copied_type));
3348
Greg Clayton1d8173f2010-09-24 05:15:53 +00003349 const bool is_virtual = false;
3350 const bool is_static = false;
3351 const bool is_inline = false;
Greg Clayton30449d52010-10-01 02:31:07 +00003352 const bool is_explicit = false;
Sean Callanan28ebe882011-11-02 18:09:01 +00003353 const bool is_attr_used = true;
Sean Callanan2581dbf2011-11-02 01:38:59 +00003354 const bool is_artificial = false;
Greg Clayton30449d52010-10-01 02:31:07 +00003355
Greg Clayton1d8173f2010-09-24 05:15:53 +00003356 ClangASTContext::AddMethodToCXXRecordType (parser_ast_context,
3357 copied_type,
Greg Clayton8de27c72010-10-15 22:48:33 +00003358 "$__lldb_expr",
Greg Clayton1d8173f2010-09-24 05:15:53 +00003359 method_type,
3360 lldb::eAccessPublic,
3361 is_virtual,
3362 is_static,
Greg Clayton30449d52010-10-01 02:31:07 +00003363 is_inline,
Sean Callanan716e3f02011-11-01 18:07:13 +00003364 is_explicit,
Sean Callanan2581dbf2011-11-02 01:38:59 +00003365 is_attr_used,
3366 is_artificial);
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00003367 }
Sean Callanan93a4b1a2010-08-04 01:02:13 +00003368
3369 context.AddTypeDecl(copied_type);
3370}