blob: f82f5ae2e7ef13249289dc8aabf24640ffdaea5e [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- ClangExpressionDeclMap.cpp -----------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "lldb/Expression/ClangExpressionDeclMap.h"
11
12// C Includes
13// C++ Includes
14// Other libraries and framework includes
15// Project includes
Sean Callanan47a5c4c2010-09-23 03:01:22 +000016#include "clang/AST/DeclarationName.h"
Sean Callanana0744822010-11-01 23:22:47 +000017#include "clang/AST/Decl.h"
Chris Lattner24943d22010-06-08 16:52:24 +000018#include "lldb/lldb-private.h"
19#include "lldb/Core/Address.h"
Sean Callanan810f22d2010-07-16 00:09:46 +000020#include "lldb/Core/Error.h"
Sean Callanan6184dfe2010-06-23 00:47:48 +000021#include "lldb/Core/Log.h"
Chris Lattner24943d22010-06-08 16:52:24 +000022#include "lldb/Core/Module.h"
Greg Clayton061b79d2011-05-09 20:18:18 +000023#include "lldb/Core/RegisterValue.h"
Sean Callanan05a5a1b2010-12-16 03:17:46 +000024#include "lldb/Core/ValueObjectConstResult.h"
Sean Callanan6e74dbb2011-02-01 23:43:26 +000025#include "lldb/Expression/ASTDumper.h"
Chris Lattner24943d22010-06-08 16:52:24 +000026#include "lldb/Expression/ClangASTSource.h"
Sean Callanana48fe162010-08-11 03:57:18 +000027#include "lldb/Expression/ClangPersistentVariables.h"
Greg Claytoncd548032011-02-01 01:31:41 +000028#include "lldb/Host/Endian.h"
Chris Lattner24943d22010-06-08 16:52:24 +000029#include "lldb/Symbol/ClangASTContext.h"
Greg Clayton6916e352010-11-13 03:52:47 +000030#include "lldb/Symbol/ClangNamespaceDecl.h"
Chris Lattner24943d22010-06-08 16:52:24 +000031#include "lldb/Symbol/CompileUnit.h"
32#include "lldb/Symbol/Function.h"
33#include "lldb/Symbol/ObjectFile.h"
34#include "lldb/Symbol/SymbolContext.h"
Sean Callanan16b53ab2011-10-12 00:12:34 +000035#include "lldb/Symbol/SymbolVendor.h"
Chris Lattner24943d22010-06-08 16:52:24 +000036#include "lldb/Symbol/Type.h"
37#include "lldb/Symbol/TypeList.h"
38#include "lldb/Symbol/Variable.h"
39#include "lldb/Symbol/VariableList.h"
Sean Callananf328c9f2010-07-20 23:31:16 +000040#include "lldb/Target/ExecutionContext.h"
Sean Callanan810f22d2010-07-16 00:09:46 +000041#include "lldb/Target/Process.h"
Sean Callanan17c6a052010-10-05 20:18:48 +000042#include "lldb/Target/RegisterContext.h"
Chris Lattner24943d22010-06-08 16:52:24 +000043#include "lldb/Target/StackFrame.h"
Sean Callananf328c9f2010-07-20 23:31:16 +000044#include "lldb/Target/Target.h"
Jim Ingham78b9ee82010-12-07 01:56:02 +000045#include "lldb/Target/Thread.h"
Sean Callanana0744822010-11-01 23:22:47 +000046#include "llvm/Support/raw_ostream.h"
Chris Lattner24943d22010-06-08 16:52:24 +000047
Greg Clayton3bc52d02010-11-14 22:13:40 +000048using namespace lldb;
Chris Lattner24943d22010-06-08 16:52:24 +000049using namespace lldb_private;
50using namespace clang;
51
Sean Callanan6a925532011-01-13 08:53:35 +000052ClangExpressionDeclMap::ClangExpressionDeclMap (bool keep_result_in_memory) :
Greg Clayton8de27c72010-10-15 22:48:33 +000053 m_found_entities (),
54 m_struct_members (),
Stephen Wilsondbeb3e12011-04-11 19:41:40 +000055 m_keep_result_in_memory (keep_result_in_memory),
Sean Callananaa301c42010-12-03 01:38:59 +000056 m_parser_vars (),
Stephen Wilsondbeb3e12011-04-11 19:41:40 +000057 m_struct_vars ()
Chris Lattner24943d22010-06-08 16:52:24 +000058{
Sean Callananaa301c42010-12-03 01:38:59 +000059 EnableStructVars();
Chris Lattner24943d22010-06-08 16:52:24 +000060}
61
62ClangExpressionDeclMap::~ClangExpressionDeclMap()
Sean Callananaa301c42010-12-03 01:38:59 +000063{
Sean Callanan6d284ef2011-10-12 22:20:02 +000064 // Note: The model is now that the parser's AST context and all associated
65 // data does not vanish until the expression has been executed. This means
66 // that valuable lookup data (like namespaces) doesn't vanish, but
67
68 DidParse();
Sean Callananaa301c42010-12-03 01:38:59 +000069 DidDematerialize();
70 DisableStructVars();
71}
Sean Callananc2c6f772010-10-26 00:31:56 +000072
Sean Callanan166ba102011-08-01 18:18:33 +000073bool
Greg Clayton427f2902010-12-14 02:59:59 +000074ClangExpressionDeclMap::WillParse(ExecutionContext &exe_ctx)
Sean Callananaa301c42010-12-03 01:38:59 +000075{
76 EnableParserVars();
77 m_parser_vars->m_exe_ctx = &exe_ctx;
Greg Clayton567e7f32011-09-22 04:58:26 +000078
79 Target *target = exe_ctx.GetTargetPtr();
80 if (exe_ctx.GetFramePtr())
81 m_parser_vars->m_sym_ctx = exe_ctx.GetFramePtr()->GetSymbolContext(lldb::eSymbolContextEverything);
82 else if (exe_ctx.GetThreadPtr())
83 m_parser_vars->m_sym_ctx = exe_ctx.GetThreadPtr()->GetStackFrameAtIndex(0)->GetSymbolContext(lldb::eSymbolContextEverything);
84 else if (exe_ctx.GetProcessPtr())
Greg Clayton987c7eb2011-09-17 08:33:22 +000085 {
86 m_parser_vars->m_sym_ctx.Clear();
Greg Clayton567e7f32011-09-22 04:58:26 +000087 m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP();
Greg Clayton987c7eb2011-09-17 08:33:22 +000088 }
Greg Clayton567e7f32011-09-22 04:58:26 +000089 else if (target)
Greg Clayton987c7eb2011-09-17 08:33:22 +000090 {
91 m_parser_vars->m_sym_ctx.Clear();
Greg Clayton567e7f32011-09-22 04:58:26 +000092 m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP();
Greg Clayton987c7eb2011-09-17 08:33:22 +000093 }
Sean Callanan97ad47f2011-09-15 18:41:04 +000094
Greg Clayton567e7f32011-09-22 04:58:26 +000095 if (target)
96 {
97 m_parser_vars->m_persistent_vars = &target->GetPersistentVariables();
Sean Callanan166ba102011-08-01 18:18:33 +000098
Greg Clayton567e7f32011-09-22 04:58:26 +000099 if (!target->GetScratchClangASTContext())
100 return false;
101 }
Sean Callanan166ba102011-08-01 18:18:33 +0000102
Sean Callanan47dc4572011-09-15 02:13:07 +0000103 m_parser_vars->m_target_info = GetTargetInfo();
104
Sean Callanan166ba102011-08-01 18:18:33 +0000105 return true;
Sean Callananaa301c42010-12-03 01:38:59 +0000106}
107
Greg Clayton427f2902010-12-14 02:59:59 +0000108void
109ClangExpressionDeclMap::DidParse()
Sean Callananaa301c42010-12-03 01:38:59 +0000110{
111 if (m_parser_vars.get())
112 {
Greg Clayton427f2902010-12-14 02:59:59 +0000113 for (size_t entity_index = 0, num_entities = m_found_entities.GetSize();
Sean Callananaa301c42010-12-03 01:38:59 +0000114 entity_index < num_entities;
115 ++entity_index)
116 {
Greg Clayton427f2902010-12-14 02:59:59 +0000117 ClangExpressionVariableSP var_sp(m_found_entities.GetVariableAtIndex(entity_index));
118 if (var_sp &&
119 var_sp->m_parser_vars.get() &&
120 var_sp->m_parser_vars->m_lldb_value)
121 delete var_sp->m_parser_vars->m_lldb_value;
Sean Callananaa301c42010-12-03 01:38:59 +0000122
Greg Clayton427f2902010-12-14 02:59:59 +0000123 var_sp->DisableParserVars();
Sean Callananaa301c42010-12-03 01:38:59 +0000124 }
125
Greg Clayton427f2902010-12-14 02:59:59 +0000126 for (size_t pvar_index = 0, num_pvars = m_parser_vars->m_persistent_vars->GetSize();
Sean Callananaa301c42010-12-03 01:38:59 +0000127 pvar_index < num_pvars;
128 ++pvar_index)
129 {
Greg Clayton427f2902010-12-14 02:59:59 +0000130 ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariableAtIndex(pvar_index));
131 if (pvar_sp)
132 pvar_sp->DisableParserVars();
Sean Callananaa301c42010-12-03 01:38:59 +0000133 }
134
135 DisableParserVars();
Sean Callanan7a60b942010-10-08 01:58:41 +0000136 }
Chris Lattner24943d22010-06-08 16:52:24 +0000137}
138
Sean Callanan8bce6652010-07-13 21:41:46 +0000139// Interface for IRForTarget
140
Sean Callanan47dc4572011-09-15 02:13:07 +0000141ClangExpressionDeclMap::TargetInfo
142ClangExpressionDeclMap::GetTargetInfo()
143{
144 assert (m_parser_vars.get());
145
146 TargetInfo ret;
147
148 ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
Greg Clayton567e7f32011-09-22 04:58:26 +0000149 if (exe_ctx)
Sean Callanan47dc4572011-09-15 02:13:07 +0000150 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000151 Process *process = exe_ctx->GetProcessPtr();
152 if (process)
153 {
154 ret.byte_order = process->GetByteOrder();
155 ret.address_byte_size = process->GetAddressByteSize();
156 }
157 else
158 {
159 Target *target = exe_ctx->GetTargetPtr();
160 if (target)
161 {
162 ret.byte_order = target->GetArchitecture().GetByteOrder();
163 ret.address_byte_size = target->GetArchitecture().GetAddressByteSize();
164 }
165 }
Sean Callanan47dc4572011-09-15 02:13:07 +0000166 }
167
168 return ret;
169}
170
Greg Clayton8de27c72010-10-15 22:48:33 +0000171const ConstString &
172ClangExpressionDeclMap::GetPersistentResultName ()
Sean Callanan82b74c82010-08-12 01:56:52 +0000173{
Sean Callananaa301c42010-12-03 01:38:59 +0000174 assert (m_struct_vars.get());
175 assert (m_parser_vars.get());
Sean Callananaa301c42010-12-03 01:38:59 +0000176 if (!m_struct_vars->m_result_name)
Greg Clayton427f2902010-12-14 02:59:59 +0000177 {
178 Target *target = m_parser_vars->GetTarget();
179 assert (target);
180 m_struct_vars->m_result_name = target->GetPersistentVariables().GetNextPersistentVariableName();
181 }
Sean Callananaa301c42010-12-03 01:38:59 +0000182 return m_struct_vars->m_result_name;
Sean Callanan82b74c82010-08-12 01:56:52 +0000183}
184
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000185lldb::ClangExpressionVariableSP
186ClangExpressionDeclMap::BuildIntegerVariable (const ConstString &name,
187 lldb_private::TypeFromParser type,
188 const llvm::APInt& value)
189{
190 assert (m_parser_vars.get());
Sean Callanan166ba102011-08-01 18:18:33 +0000191
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000192 ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
Greg Clayton567e7f32011-09-22 04:58:26 +0000193 if (exe_ctx == NULL)
194 return lldb::ClangExpressionVariableSP();
195 Target *target = exe_ctx->GetTargetPtr();
196
197 ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000198
199 TypeFromUser user_type(ClangASTContext::CopyType(context,
200 type.GetASTContext(),
201 type.GetOpaqueQualType()),
202 context);
Sean Callanan47dc4572011-09-15 02:13:07 +0000203
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000204 if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx->GetBestExecutionContextScope (),
205 name,
Sean Callanan0e0817d2011-01-04 02:41:41 +0000206 user_type,
Sean Callanan47dc4572011-09-15 02:13:07 +0000207 m_parser_vars->m_target_info.byte_order,
208 m_parser_vars->m_target_info.address_byte_size))
Sean Callanan0e0817d2011-01-04 02:41:41 +0000209 return lldb::ClangExpressionVariableSP();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000210
Sean Callanan0e0817d2011-01-04 02:41:41 +0000211 ClangExpressionVariableSP pvar_sp (m_parser_vars->m_persistent_vars->GetVariable(name));
212
213 if (!pvar_sp)
214 return lldb::ClangExpressionVariableSP();
215
216 uint8_t *pvar_data = pvar_sp->GetValueBytes();
217 if (pvar_data == NULL)
218 return lldb::ClangExpressionVariableSP();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000219
220 uint64_t value64 = value.getLimitedValue();
Sean Callanan47dc4572011-09-15 02:13:07 +0000221
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000222 size_t num_val_bytes = sizeof(value64);
Sean Callanan0e0817d2011-01-04 02:41:41 +0000223 size_t num_data_bytes = pvar_sp->GetByteSize();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000224
225 size_t num_bytes = num_val_bytes;
226 if (num_bytes > num_data_bytes)
227 num_bytes = num_data_bytes;
228
Johnny Chen2bc9eb32011-07-19 19:48:13 +0000229 for (size_t byte_idx = 0;
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000230 byte_idx < num_bytes;
231 ++byte_idx)
232 {
233 uint64_t shift = byte_idx * 8;
234 uint64_t mask = 0xffll << shift;
235 uint8_t cur_byte = (uint8_t)((value64 & mask) >> shift);
236
Sean Callanan47dc4572011-09-15 02:13:07 +0000237 switch (m_parser_vars->m_target_info.byte_order)
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000238 {
Sean Callanan0e0817d2011-01-04 02:41:41 +0000239 case eByteOrderBig:
240 // High Low
241 // Original: |AABBCCDDEEFFGGHH|
242 // Target: |EEFFGGHH|
243
244 pvar_data[num_data_bytes - (1 + byte_idx)] = cur_byte;
245 break;
246 case eByteOrderLittle:
247 // Target: |HHGGFFEE|
248 pvar_data[byte_idx] = cur_byte;
249 break;
250 default:
251 return lldb::ClangExpressionVariableSP();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000252 }
253 }
Sean Callanan6a925532011-01-13 08:53:35 +0000254
255 pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried;
Sean Callanan696cf5f2011-05-07 01:06:41 +0000256 pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
257 pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
Sean Callanan0e0817d2011-01-04 02:41:41 +0000258
259 return pvar_sp;
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000260}
261
Sean Callanan696cf5f2011-05-07 01:06:41 +0000262lldb::ClangExpressionVariableSP
263ClangExpressionDeclMap::BuildCastVariable (const ConstString &name,
Sean Callanan9b6898f2011-07-30 02:42:06 +0000264 VarDecl *decl,
Sean Callanan696cf5f2011-05-07 01:06:41 +0000265 lldb_private::TypeFromParser type)
266{
267 assert (m_parser_vars.get());
268
269 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
270
271 ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
Greg Clayton567e7f32011-09-22 04:58:26 +0000272 if (exe_ctx == NULL)
273 return lldb::ClangExpressionVariableSP();
274 Target *target = exe_ctx->GetTargetPtr();
275 if (target == NULL)
276 return lldb::ClangExpressionVariableSP();
277
278 ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
Sean Callanan696cf5f2011-05-07 01:06:41 +0000279
280 ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl));
281
282 if (!var_sp)
283 var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl);
284
285 if (!var_sp)
286 return ClangExpressionVariableSP();
287
288 TypeFromUser user_type(ClangASTContext::CopyType(context,
289 type.GetASTContext(),
290 type.GetOpaqueQualType()),
291 context);
292
293 TypeFromUser var_type = var_sp->GetTypeFromUser();
294
Greg Clayton567e7f32011-09-22 04:58:26 +0000295 StackFrame *frame = exe_ctx->GetFramePtr();
296 if (frame == NULL)
297 return lldb::ClangExpressionVariableSP();
298
299 VariableSP var = FindVariableInScope (*frame, var_sp->GetName(), &var_type);
Sean Callanan696cf5f2011-05-07 01:06:41 +0000300
301 if (!var)
302 return lldb::ClangExpressionVariableSP(); // but we should handle this; it may be a persistent variable
303
Greg Clayton567e7f32011-09-22 04:58:26 +0000304 ValueObjectSP var_valobj = frame->GetValueObjectForFrameVariable(var, lldb::eNoDynamicValues);
Sean Callanan696cf5f2011-05-07 01:06:41 +0000305
306 if (!var_valobj)
307 return lldb::ClangExpressionVariableSP();
308
309 ValueObjectSP var_casted_valobj = var_valobj->CastPointerType(name.GetCString(), user_type);
310
311 if (!var_casted_valobj)
312 return lldb::ClangExpressionVariableSP();
313
314 if (log)
315 {
316 StreamString my_stream_string;
317
318 ClangASTType::DumpTypeDescription (var_type.GetASTContext(),
319 var_type.GetOpaqueQualType(),
320 &my_stream_string);
321
322
323 log->Printf("Building cast variable to type: %s", my_stream_string.GetString().c_str());
324 }
325
326 ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->CreatePersistentVariable (var_casted_valobj);
327
328 if (!pvar_sp)
329 return lldb::ClangExpressionVariableSP();
330
331 if (pvar_sp != m_parser_vars->m_persistent_vars->GetVariable(name))
332 return lldb::ClangExpressionVariableSP();
333
334 pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried;
335 pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
336 pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
337
338 return pvar_sp;
339}
340
Sean Callanan47dc4572011-09-15 02:13:07 +0000341bool
342ClangExpressionDeclMap::ResultIsReference (const ConstString &name)
343{
344 ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name);
345
346 return (pvar_sp->m_flags & ClangExpressionVariable::EVIsProgramReference);
347}
348
349bool
350ClangExpressionDeclMap::CompleteResultVariable (lldb::ClangExpressionVariableSP &valobj,
351 lldb_private::Value &value,
352 const ConstString &name,
Sean Callanana8428a42011-09-22 00:41:11 +0000353 lldb_private::TypeFromParser type,
354 bool transient)
Sean Callanan47dc4572011-09-15 02:13:07 +0000355{
356 assert (m_parser_vars.get());
357
358 ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name);
359
360 if (!pvar_sp)
361 return false;
362
363 if (pvar_sp->m_flags & ClangExpressionVariable::EVIsProgramReference &&
Sean Callanana8428a42011-09-22 00:41:11 +0000364 !pvar_sp->m_live_sp &&
365 !transient)
Sean Callanan47dc4572011-09-15 02:13:07 +0000366 {
367 // The reference comes from the program. We need to set up a live SP for it.
368
369 pvar_sp->m_live_sp = ValueObjectConstResult::Create(m_parser_vars->m_exe_ctx->GetBestExecutionContextScope(),
370 pvar_sp->GetTypeFromUser().GetASTContext(),
371 pvar_sp->GetTypeFromUser().GetOpaqueQualType(),
372 pvar_sp->GetName(),
373 value.GetScalar().ULongLong(),
374 value.GetValueAddressType(),
375 pvar_sp->GetByteSize());
376 }
377
378 if (pvar_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry)
379 {
380 pvar_sp->ValueUpdated();
381
382 const size_t pvar_byte_size = pvar_sp->GetByteSize();
383 uint8_t *pvar_data = pvar_sp->GetValueBytes();
384
385 if (!ReadTarget(pvar_data, value, pvar_byte_size))
386 return false;
387
388 pvar_sp->m_flags &= ~(ClangExpressionVariable::EVNeedsFreezeDry);
389 }
390
391 valobj = pvar_sp;
392
393 return true;
394}
395
Sean Callanan8bce6652010-07-13 21:41:46 +0000396bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000397ClangExpressionDeclMap::AddPersistentVariable
398(
Sean Callanan9b6898f2011-07-30 02:42:06 +0000399 const NamedDecl *decl,
Greg Clayton8de27c72010-10-15 22:48:33 +0000400 const ConstString &name,
Sean Callanan6a925532011-01-13 08:53:35 +0000401 TypeFromParser parser_type,
402 bool is_result,
403 bool is_lvalue
Greg Clayton8de27c72010-10-15 22:48:33 +0000404)
Sean Callanana48fe162010-08-11 03:57:18 +0000405{
Sean Callananaa301c42010-12-03 01:38:59 +0000406 assert (m_parser_vars.get());
407
Sean Callanan6a925532011-01-13 08:53:35 +0000408 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000409 ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
Greg Clayton567e7f32011-09-22 04:58:26 +0000410 if (exe_ctx == NULL)
411 return false;
412 Target *target = exe_ctx->GetTargetPtr();
413 if (target == NULL)
414 return false;
415
416 ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
Sean Callanana48fe162010-08-11 03:57:18 +0000417
Sean Callanana48fe162010-08-11 03:57:18 +0000418 TypeFromUser user_type(ClangASTContext::CopyType(context,
Sean Callanan82b74c82010-08-12 01:56:52 +0000419 parser_type.GetASTContext(),
420 parser_type.GetOpaqueQualType()),
Sean Callanan97678d12011-01-13 21:23:32 +0000421 context);
Sean Callanan47dc4572011-09-15 02:13:07 +0000422
423 if (!m_parser_vars->m_target_info.IsValid())
424 return false;
Sean Callanana48fe162010-08-11 03:57:18 +0000425
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000426 if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx->GetBestExecutionContextScope (),
427 name,
Greg Clayton427f2902010-12-14 02:59:59 +0000428 user_type,
Sean Callanan47dc4572011-09-15 02:13:07 +0000429 m_parser_vars->m_target_info.byte_order,
430 m_parser_vars->m_target_info.address_byte_size))
Sean Callanan8c127202010-08-23 23:09:38 +0000431 return false;
432
Greg Clayton427f2902010-12-14 02:59:59 +0000433 ClangExpressionVariableSP var_sp (m_parser_vars->m_persistent_vars->GetVariable(name));
Sean Callanan8c127202010-08-23 23:09:38 +0000434
Greg Clayton427f2902010-12-14 02:59:59 +0000435 if (!var_sp)
Sean Callanan8c127202010-08-23 23:09:38 +0000436 return false;
437
Sean Callanan6a925532011-01-13 08:53:35 +0000438 if (is_result)
439 var_sp->m_flags |= ClangExpressionVariable::EVNeedsFreezeDry;
440 else
441 var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget; // explicitly-declared persistent variables should persist
442
443 if (is_lvalue)
444 {
445 var_sp->m_flags |= ClangExpressionVariable::EVIsProgramReference;
446 }
447 else
448 {
449 var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
450 var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
451 }
452
453 if (log)
454 log->Printf("Created persistent variable with flags 0x%hx", var_sp->m_flags);
455
Greg Clayton427f2902010-12-14 02:59:59 +0000456 var_sp->EnableParserVars();
Sean Callanan8c127202010-08-23 23:09:38 +0000457
Greg Clayton427f2902010-12-14 02:59:59 +0000458 var_sp->m_parser_vars->m_named_decl = decl;
459 var_sp->m_parser_vars->m_parser_type = parser_type;
Sean Callanan8c127202010-08-23 23:09:38 +0000460
461 return true;
Sean Callanana48fe162010-08-11 03:57:18 +0000462}
463
464bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000465ClangExpressionDeclMap::AddValueToStruct
466(
Sean Callanan9b6898f2011-07-30 02:42:06 +0000467 const NamedDecl *decl,
Greg Clayton8de27c72010-10-15 22:48:33 +0000468 const ConstString &name,
469 llvm::Value *value,
470 size_t size,
471 off_t alignment
472)
Sean Callanan8bce6652010-07-13 21:41:46 +0000473{
Sean Callananaa301c42010-12-03 01:38:59 +0000474 assert (m_struct_vars.get());
475 assert (m_parser_vars.get());
476
Greg Claytone005f2c2010-11-06 01:53:30 +0000477 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan45690fe2010-08-30 22:17:16 +0000478
Sean Callananaa301c42010-12-03 01:38:59 +0000479 m_struct_vars->m_struct_laid_out = false;
Sean Callanan8bce6652010-07-13 21:41:46 +0000480
Sean Callanan8c127202010-08-23 23:09:38 +0000481 if (m_struct_members.GetVariable(decl))
482 return true;
Sean Callanan8bce6652010-07-13 21:41:46 +0000483
Greg Clayton427f2902010-12-14 02:59:59 +0000484 ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl));
Sean Callanan8bce6652010-07-13 21:41:46 +0000485
Greg Clayton427f2902010-12-14 02:59:59 +0000486 if (!var_sp)
487 var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl);
Sean Callanan8bce6652010-07-13 21:41:46 +0000488
Greg Clayton427f2902010-12-14 02:59:59 +0000489 if (!var_sp)
Sean Callanan8c127202010-08-23 23:09:38 +0000490 return false;
491
Sean Callanan45690fe2010-08-30 22:17:16 +0000492 if (log)
493 log->Printf("Adding value for decl %p [%s - %s] to the structure",
494 decl,
Greg Clayton8de27c72010-10-15 22:48:33 +0000495 name.GetCString(),
Greg Clayton427f2902010-12-14 02:59:59 +0000496 var_sp->GetName().GetCString());
Sean Callanan45690fe2010-08-30 22:17:16 +0000497
Sean Callanan8c127202010-08-23 23:09:38 +0000498 // We know entity->m_parser_vars is valid because we used a parser variable
499 // to find it
Greg Clayton427f2902010-12-14 02:59:59 +0000500 var_sp->m_parser_vars->m_llvm_value = value;
Sean Callanan8c127202010-08-23 23:09:38 +0000501
Greg Clayton427f2902010-12-14 02:59:59 +0000502 var_sp->EnableJITVars();
503 var_sp->m_jit_vars->m_alignment = alignment;
504 var_sp->m_jit_vars->m_size = size;
Sean Callanan8c127202010-08-23 23:09:38 +0000505
Greg Clayton427f2902010-12-14 02:59:59 +0000506 m_struct_members.AddVariable(var_sp);
Sean Callanan8bce6652010-07-13 21:41:46 +0000507
508 return true;
509}
510
511bool
512ClangExpressionDeclMap::DoStructLayout ()
513{
Sean Callananaa301c42010-12-03 01:38:59 +0000514 assert (m_struct_vars.get());
515
516 if (m_struct_vars->m_struct_laid_out)
Sean Callanan8bce6652010-07-13 21:41:46 +0000517 return true;
518
Sean Callanan8bce6652010-07-13 21:41:46 +0000519 off_t cursor = 0;
520
Sean Callananaa301c42010-12-03 01:38:59 +0000521 m_struct_vars->m_struct_alignment = 0;
522 m_struct_vars->m_struct_size = 0;
Sean Callanan8bce6652010-07-13 21:41:46 +0000523
Greg Clayton427f2902010-12-14 02:59:59 +0000524 for (size_t member_index = 0, num_members = m_struct_members.GetSize();
Sean Callanan8c127202010-08-23 23:09:38 +0000525 member_index < num_members;
526 ++member_index)
Sean Callanan8bce6652010-07-13 21:41:46 +0000527 {
Greg Clayton427f2902010-12-14 02:59:59 +0000528 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
529 if (!member_sp)
530 return false;
531
532 if (!member_sp->m_jit_vars.get())
Sean Callanan8c127202010-08-23 23:09:38 +0000533 return false;
Sean Callanan8bce6652010-07-13 21:41:46 +0000534
Sean Callanan8c127202010-08-23 23:09:38 +0000535 if (member_index == 0)
Greg Clayton427f2902010-12-14 02:59:59 +0000536 m_struct_vars->m_struct_alignment = member_sp->m_jit_vars->m_alignment;
Sean Callanan8c127202010-08-23 23:09:38 +0000537
Greg Clayton427f2902010-12-14 02:59:59 +0000538 if (cursor % member_sp->m_jit_vars->m_alignment)
539 cursor += (member_sp->m_jit_vars->m_alignment - (cursor % member_sp->m_jit_vars->m_alignment));
Sean Callanan8c127202010-08-23 23:09:38 +0000540
Greg Clayton427f2902010-12-14 02:59:59 +0000541 member_sp->m_jit_vars->m_offset = cursor;
542 cursor += member_sp->m_jit_vars->m_size;
Sean Callanan8bce6652010-07-13 21:41:46 +0000543 }
544
Sean Callananaa301c42010-12-03 01:38:59 +0000545 m_struct_vars->m_struct_size = cursor;
Sean Callanan8bce6652010-07-13 21:41:46 +0000546
Sean Callananaa301c42010-12-03 01:38:59 +0000547 m_struct_vars->m_struct_laid_out = true;
Sean Callanan8bce6652010-07-13 21:41:46 +0000548 return true;
549}
550
Greg Clayton8de27c72010-10-15 22:48:33 +0000551bool ClangExpressionDeclMap::GetStructInfo
552(
553 uint32_t &num_elements,
554 size_t &size,
555 off_t &alignment
556)
Sean Callanan8bce6652010-07-13 21:41:46 +0000557{
Sean Callananaa301c42010-12-03 01:38:59 +0000558 assert (m_struct_vars.get());
559
560 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan8bce6652010-07-13 21:41:46 +0000561 return false;
562
Greg Clayton427f2902010-12-14 02:59:59 +0000563 num_elements = m_struct_members.GetSize();
Sean Callananaa301c42010-12-03 01:38:59 +0000564 size = m_struct_vars->m_struct_size;
565 alignment = m_struct_vars->m_struct_alignment;
Sean Callanan8bce6652010-07-13 21:41:46 +0000566
567 return true;
568}
569
570bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000571ClangExpressionDeclMap::GetStructElement
572(
Sean Callanan9b6898f2011-07-30 02:42:06 +0000573 const NamedDecl *&decl,
Greg Clayton8de27c72010-10-15 22:48:33 +0000574 llvm::Value *&value,
575 off_t &offset,
576 ConstString &name,
577 uint32_t index
578)
Sean Callanan8bce6652010-07-13 21:41:46 +0000579{
Sean Callananaa301c42010-12-03 01:38:59 +0000580 assert (m_struct_vars.get());
581
582 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan8bce6652010-07-13 21:41:46 +0000583 return false;
584
Greg Clayton427f2902010-12-14 02:59:59 +0000585 if (index >= m_struct_members.GetSize())
Sean Callanan8bce6652010-07-13 21:41:46 +0000586 return false;
587
Greg Clayton427f2902010-12-14 02:59:59 +0000588 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(index));
Sean Callanan8bce6652010-07-13 21:41:46 +0000589
Greg Clayton427f2902010-12-14 02:59:59 +0000590 if (!member_sp ||
591 !member_sp->m_parser_vars.get() ||
592 !member_sp->m_jit_vars.get())
Sean Callanan8c127202010-08-23 23:09:38 +0000593 return false;
594
Greg Clayton427f2902010-12-14 02:59:59 +0000595 decl = member_sp->m_parser_vars->m_named_decl;
596 value = member_sp->m_parser_vars->m_llvm_value;
597 offset = member_sp->m_jit_vars->m_offset;
598 name = member_sp->GetName();
Sean Callanan8c127202010-08-23 23:09:38 +0000599
Sean Callanan8bce6652010-07-13 21:41:46 +0000600 return true;
601}
602
Sean Callanan02fbafa2010-07-27 21:39:39 +0000603bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000604ClangExpressionDeclMap::GetFunctionInfo
605(
Sean Callanan9b6898f2011-07-30 02:42:06 +0000606 const NamedDecl *decl,
Greg Clayton8de27c72010-10-15 22:48:33 +0000607 llvm::Value**& value,
608 uint64_t &ptr
609)
Sean Callananba992c52010-07-27 02:07:53 +0000610{
Greg Clayton427f2902010-12-14 02:59:59 +0000611 ClangExpressionVariableSP entity_sp(m_found_entities.GetVariable(decl));
Sean Callanan8c127202010-08-23 23:09:38 +0000612
Greg Clayton427f2902010-12-14 02:59:59 +0000613 if (!entity_sp)
Sean Callanan8c127202010-08-23 23:09:38 +0000614 return false;
Sean Callananba992c52010-07-27 02:07:53 +0000615
Sean Callanan8c127202010-08-23 23:09:38 +0000616 // We know m_parser_vars is valid since we searched for the variable by
617 // its NamedDecl
Sean Callananba992c52010-07-27 02:07:53 +0000618
Greg Clayton427f2902010-12-14 02:59:59 +0000619 value = &entity_sp->m_parser_vars->m_llvm_value;
620 ptr = entity_sp->m_parser_vars->m_lldb_value->GetScalar().ULongLong();
Sean Callanan8c127202010-08-23 23:09:38 +0000621
622 return true;
Sean Callananba992c52010-07-27 02:07:53 +0000623}
624
Sean Callananca2516d2011-08-16 18:09:29 +0000625static void
626FindCodeSymbolInContext
627(
628 const ConstString &name,
629 SymbolContext &sym_ctx,
630 SymbolContextList &sc_list
631)
632{
633 if (sym_ctx.module_sp)
Sean Callanan3e80cd92011-10-12 02:08:07 +0000634 sym_ctx.module_sp->FindSymbolsWithNameAndType(name, NULL, eSymbolTypeCode, sc_list);
Sean Callananca2516d2011-08-16 18:09:29 +0000635
636 if (!sc_list.GetSize())
637 sym_ctx.target_sp->GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list);
638}
639
Sean Callananf5857a02010-07-31 01:32:05 +0000640bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000641ClangExpressionDeclMap::GetFunctionAddress
642(
643 const ConstString &name,
Greg Claytonda7af842011-05-18 22:01:49 +0000644 uint64_t &func_addr
Greg Clayton8de27c72010-10-15 22:48:33 +0000645)
Sean Callananf5857a02010-07-31 01:32:05 +0000646{
Sean Callananaa301c42010-12-03 01:38:59 +0000647 assert (m_parser_vars.get());
648
Sean Callananaba367e2011-05-13 18:27:02 +0000649 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Greg Clayton567e7f32011-09-22 04:58:26 +0000650 ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
651 if (exe_ctx == NULL)
652 return false;
653 Target *target = exe_ctx->GetTargetPtr();
Sean Callananf5857a02010-07-31 01:32:05 +0000654 // Back out in all cases where we're not fully initialized
Greg Clayton567e7f32011-09-22 04:58:26 +0000655 if (target == NULL)
Jim Ingham78b9ee82010-12-07 01:56:02 +0000656 return false;
657 if (!m_parser_vars->m_sym_ctx.target_sp)
Sean Callananf5857a02010-07-31 01:32:05 +0000658 return false;
659
Greg Claytone5748d82010-11-09 23:46:37 +0000660 SymbolContextList sc_list;
Sean Callananf5857a02010-07-31 01:32:05 +0000661
Sean Callananca2516d2011-08-16 18:09:29 +0000662 FindCodeSymbolInContext(name, m_parser_vars->m_sym_ctx, sc_list);
663
Greg Claytone5748d82010-11-09 23:46:37 +0000664 if (!sc_list.GetSize())
Sean Callananaba367e2011-05-13 18:27:02 +0000665 {
666 // We occasionally get debug information in which a const function is reported
667 // as non-const, so the mangled name is wrong. This is a hack to compensate.
668
669 Mangled mangled(name.GetCString(), true);
670
671 ConstString demangled_name = mangled.GetDemangledName();
672
673 if (strlen(demangled_name.GetCString()))
674 {
675 std::string const_name_scratch(demangled_name.GetCString());
676
677 const_name_scratch.append(" const");
678
679 ConstString const_name(const_name_scratch.c_str());
680
Sean Callananca2516d2011-08-16 18:09:29 +0000681 FindCodeSymbolInContext(name, m_parser_vars->m_sym_ctx, sc_list);
Sean Callananaba367e2011-05-13 18:27:02 +0000682
683 if (log)
684 log->Printf("Found %d results with const name %s", sc_list.GetSize(), const_name.GetCString());
685 }
686 }
687
688 if (!sc_list.GetSize())
Sean Callananf5857a02010-07-31 01:32:05 +0000689 return false;
690
691 SymbolContext sym_ctx;
Greg Claytone5748d82010-11-09 23:46:37 +0000692 sc_list.GetContextAtIndex(0, sym_ctx);
Sean Callananf5857a02010-07-31 01:32:05 +0000693
Greg Claytonda7af842011-05-18 22:01:49 +0000694 const Address *func_so_addr = NULL;
Sean Callananf5857a02010-07-31 01:32:05 +0000695
696 if (sym_ctx.function)
Greg Claytonda7af842011-05-18 22:01:49 +0000697 func_so_addr = &sym_ctx.function->GetAddressRange().GetBaseAddress();
Sean Callananf5857a02010-07-31 01:32:05 +0000698 else if (sym_ctx.symbol)
Greg Claytonda7af842011-05-18 22:01:49 +0000699 func_so_addr = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress();
Sean Callananf5857a02010-07-31 01:32:05 +0000700 else
701 return false;
702
Sean Callananae9f7482011-07-07 23:05:43 +0000703 if (!func_so_addr || !func_so_addr->IsValid())
704 return false;
705
Greg Clayton567e7f32011-09-22 04:58:26 +0000706 func_addr = func_so_addr->GetCallableLoadAddress (target);
Greg Claytonda7af842011-05-18 22:01:49 +0000707
Sean Callananf5857a02010-07-31 01:32:05 +0000708 return true;
709}
710
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000711addr_t
712ClangExpressionDeclMap::GetSymbolAddress (Target &target, const ConstString &name)
Sean Callananc7674af2011-01-17 23:42:46 +0000713{
Sean Callananc7674af2011-01-17 23:42:46 +0000714 SymbolContextList sc_list;
715
Sean Callanan81974962011-05-08 02:21:26 +0000716 target.GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeAny, sc_list);
Sean Callananc7674af2011-01-17 23:42:46 +0000717
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000718 const uint32_t num_matches = sc_list.GetSize();
719 addr_t symbol_load_addr = LLDB_INVALID_ADDRESS;
720
721 for (uint32_t i=0; i<num_matches && symbol_load_addr == LLDB_INVALID_ADDRESS; i++)
722 {
723 SymbolContext sym_ctx;
724 sc_list.GetContextAtIndex(i, sym_ctx);
Sean Callananc7674af2011-01-17 23:42:46 +0000725
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000726 const Address *sym_address = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress();
Sean Callananae9f7482011-07-07 23:05:43 +0000727
728 if (!sym_address || !sym_address->IsValid())
729 return LLDB_INVALID_ADDRESS;
730
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000731 if (sym_address)
732 {
733 switch (sym_ctx.symbol->GetType())
734 {
735 case eSymbolTypeCode:
736 case eSymbolTypeTrampoline:
737 symbol_load_addr = sym_address->GetCallableLoadAddress (&target);
738 break;
739
740 case eSymbolTypeData:
741 case eSymbolTypeRuntime:
742 case eSymbolTypeVariable:
743 case eSymbolTypeLocal:
744 case eSymbolTypeParam:
745 case eSymbolTypeInvalid:
746 case eSymbolTypeAbsolute:
747 case eSymbolTypeExtern:
748 case eSymbolTypeException:
749 case eSymbolTypeSourceFile:
750 case eSymbolTypeHeaderFile:
751 case eSymbolTypeObjectFile:
752 case eSymbolTypeCommonBlock:
753 case eSymbolTypeBlock:
754 case eSymbolTypeVariableType:
755 case eSymbolTypeLineEntry:
756 case eSymbolTypeLineHeader:
757 case eSymbolTypeScopeBegin:
758 case eSymbolTypeScopeEnd:
759 case eSymbolTypeAdditional:
760 case eSymbolTypeCompiler:
761 case eSymbolTypeInstrumentation:
762 case eSymbolTypeUndefined:
763 symbol_load_addr = sym_address->GetLoadAddress (&target);
764 break;
765 }
766 }
767 }
Sean Callananc7674af2011-01-17 23:42:46 +0000768
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000769 return symbol_load_addr;
Sean Callananc7674af2011-01-17 23:42:46 +0000770}
771
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000772addr_t
773ClangExpressionDeclMap::GetSymbolAddress (const ConstString &name)
Sean Callanan81974962011-05-08 02:21:26 +0000774{
775 assert (m_parser_vars.get());
776
777 if (!m_parser_vars->m_exe_ctx ||
Greg Clayton567e7f32011-09-22 04:58:26 +0000778 !m_parser_vars->m_exe_ctx->GetTargetPtr())
Sean Callanan81974962011-05-08 02:21:26 +0000779 return false;
780
Greg Clayton567e7f32011-09-22 04:58:26 +0000781 return GetSymbolAddress(m_parser_vars->m_exe_ctx->GetTargetRef(), name);
Sean Callanan81974962011-05-08 02:21:26 +0000782}
783
Sean Callanan47dc4572011-09-15 02:13:07 +0000784// Interface for IRInterpreter
785
786bool
787ClangExpressionDeclMap::WriteTarget (lldb_private::Value &value,
788 const uint8_t *data,
789 size_t length)
790{
791 assert (m_parser_vars.get());
792
793 ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
794
Greg Clayton567e7f32011-09-22 04:58:26 +0000795 Process *process = exe_ctx->GetProcessPtr();
Sean Callanan47dc4572011-09-15 02:13:07 +0000796 if (value.GetContextType() == Value::eContextTypeRegisterInfo)
797 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000798 if (!process)
Sean Callanan47dc4572011-09-15 02:13:07 +0000799 return false;
800
801 RegisterContext *reg_ctx = exe_ctx->GetRegisterContext();
802 RegisterInfo *reg_info = value.GetRegisterInfo();
803
804 if (!reg_ctx)
805 return false;
806
807 lldb_private::RegisterValue reg_value;
808 Error err;
809
Greg Clayton567e7f32011-09-22 04:58:26 +0000810 if (!reg_value.SetFromMemoryData (reg_info, data, length, process->GetByteOrder(), err))
Sean Callanan47dc4572011-09-15 02:13:07 +0000811 return false;
812
813 return reg_ctx->WriteRegister(reg_info, reg_value);
814 }
815 else
816 {
817 switch (value.GetValueType())
818 {
819 default:
820 return false;
821 case Value::eValueTypeFileAddress:
822 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000823 if (!process)
Sean Callanan47dc4572011-09-15 02:13:07 +0000824 return false;
825
Greg Clayton567e7f32011-09-22 04:58:26 +0000826 Target *target = exe_ctx->GetTargetPtr();
Sean Callanan47dc4572011-09-15 02:13:07 +0000827 Address file_addr;
828
Greg Clayton567e7f32011-09-22 04:58:26 +0000829 if (!target->GetImages().ResolveFileAddress((lldb::addr_t)value.GetScalar().ULongLong(), file_addr))
Sean Callanan47dc4572011-09-15 02:13:07 +0000830 return false;
831
Greg Clayton567e7f32011-09-22 04:58:26 +0000832 lldb::addr_t load_addr = file_addr.GetLoadAddress(target);
Sean Callanan47dc4572011-09-15 02:13:07 +0000833
834 Error err;
Greg Clayton567e7f32011-09-22 04:58:26 +0000835 process->WriteMemory(load_addr, data, length, err);
Sean Callanan47dc4572011-09-15 02:13:07 +0000836
837 return err.Success();
838 }
839 case Value::eValueTypeLoadAddress:
840 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000841 if (!process)
Sean Callanan47dc4572011-09-15 02:13:07 +0000842 return false;
843
844 Error err;
Greg Clayton567e7f32011-09-22 04:58:26 +0000845 process->WriteMemory((lldb::addr_t)value.GetScalar().ULongLong(), data, length, err);
Sean Callanan47dc4572011-09-15 02:13:07 +0000846
847 return err.Success();
848 }
849 case Value::eValueTypeHostAddress:
850 memcpy ((void *)value.GetScalar().ULongLong(), data, length);
851 return true;
852 case Value::eValueTypeScalar:
853 return false;
854 }
855 }
856}
857
858bool
859ClangExpressionDeclMap::ReadTarget (uint8_t *data,
860 lldb_private::Value &value,
861 size_t length)
862{
863 assert (m_parser_vars.get());
864
865 ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
Greg Clayton567e7f32011-09-22 04:58:26 +0000866
867 Process *process = exe_ctx->GetProcessPtr();
868
Sean Callanan47dc4572011-09-15 02:13:07 +0000869 if (value.GetContextType() == Value::eContextTypeRegisterInfo)
870 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000871 if (!process)
Sean Callanan47dc4572011-09-15 02:13:07 +0000872 return false;
873
874 RegisterContext *reg_ctx = exe_ctx->GetRegisterContext();
875 RegisterInfo *reg_info = value.GetRegisterInfo();
876
877 if (!reg_ctx)
878 return false;
879
880 lldb_private::RegisterValue reg_value;
881 Error err;
882
883 if (!reg_ctx->ReadRegister(reg_info, reg_value))
884 return false;
885
Greg Clayton567e7f32011-09-22 04:58:26 +0000886 return reg_value.GetAsMemoryData(reg_info, data, length, process->GetByteOrder(), err);
Sean Callanan47dc4572011-09-15 02:13:07 +0000887 }
888 else
889 {
890 switch (value.GetValueType())
891 {
892 default:
893 return false;
894 case Value::eValueTypeFileAddress:
895 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000896 Target *target = exe_ctx->GetTargetPtr();
897 if (target == NULL)
Sean Callanan47dc4572011-09-15 02:13:07 +0000898 return false;
899
900 Address file_addr;
901
Greg Clayton567e7f32011-09-22 04:58:26 +0000902 if (!target->GetImages().ResolveFileAddress((lldb::addr_t)value.GetScalar().ULongLong(), file_addr))
Sean Callanan47dc4572011-09-15 02:13:07 +0000903 return false;
904
905 Error err;
Greg Clayton567e7f32011-09-22 04:58:26 +0000906 target->ReadMemory(file_addr, true, data, length, err);
Sean Callanan47dc4572011-09-15 02:13:07 +0000907
908 return err.Success();
909 }
910 case Value::eValueTypeLoadAddress:
911 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000912 if (!process)
Sean Callanan47dc4572011-09-15 02:13:07 +0000913 return false;
914
915 Error err;
Greg Clayton567e7f32011-09-22 04:58:26 +0000916 process->ReadMemory((lldb::addr_t)value.GetScalar().ULongLong(), data, length, err);
Sean Callanan47dc4572011-09-15 02:13:07 +0000917
918 return err.Success();
919 }
920 case Value::eValueTypeHostAddress:
921 memcpy (data, (const void *)value.GetScalar().ULongLong(), length);
922 return true;
923 case Value::eValueTypeScalar:
924 return false;
925 }
926 }
927}
928
929lldb_private::Value
930ClangExpressionDeclMap::LookupDecl (clang::NamedDecl *decl)
931{
932 assert (m_parser_vars.get());
933
934 ExecutionContext exe_ctx = *m_parser_vars->m_exe_ctx;
935
936 ClangExpressionVariableSP expr_var_sp (m_found_entities.GetVariable(decl));
937 ClangExpressionVariableSP persistent_var_sp (m_parser_vars->m_persistent_vars->GetVariable(decl));
938
939 if (expr_var_sp)
940 {
Sean Callanan6d284ef2011-10-12 22:20:02 +0000941 if (!expr_var_sp->m_parser_vars.get())
942 return Value();
943
Sean Callanan47dc4572011-09-15 02:13:07 +0000944 const ConstString &name(expr_var_sp->GetName());
945 TypeFromUser type(expr_var_sp->GetTypeFromUser());
946
Greg Clayton567e7f32011-09-22 04:58:26 +0000947 StackFrame *frame = m_parser_vars->m_exe_ctx->GetFramePtr();
948 if (frame)
Sean Callanan47dc4572011-09-15 02:13:07 +0000949 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000950 VariableSP var(FindVariableInScope (*frame, name, &type));
Sean Callanan47dc4572011-09-15 02:13:07 +0000951
952 if (var)
953 return *GetVariableValue(exe_ctx, var, NULL);
954 }
955
Greg Clayton567e7f32011-09-22 04:58:26 +0000956 Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
957
958 if (target)
Sean Callanan47dc4572011-09-15 02:13:07 +0000959 {
Sean Callanan94cd0ca2011-10-12 16:59:31 +0000960 lldb::ModuleSP module;
961
962 VariableSP global(FindGlobalVariable (*target, module, name, NULL, &type));
Sean Callanan47dc4572011-09-15 02:13:07 +0000963
964 if (global)
965 return *GetVariableValue(exe_ctx, global, NULL);
966
Greg Clayton567e7f32011-09-22 04:58:26 +0000967 lldb::addr_t location_load_addr = GetSymbolAddress(*target, name);
Sean Callanan47dc4572011-09-15 02:13:07 +0000968
969 if (location_load_addr != LLDB_INVALID_ADDRESS)
970 {
971 lldb_private::Value ret;
972 ret.SetValueType(Value::eValueTypeLoadAddress);
973 ret.SetContext(Value::eContextTypeInvalid, NULL);
974 ret.GetScalar() = location_load_addr;
975 return ret;
976 }
977 }
978
979 return Value();
980 }
981 else if (persistent_var_sp)
982 {
Sean Callanana8428a42011-09-22 00:41:11 +0000983 if ((persistent_var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference ||
984 persistent_var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) &&
985 persistent_var_sp->m_live_sp)
986 {
987 return persistent_var_sp->m_live_sp->GetValue();
988 }
989 else
990 {
991 lldb_private::Value ret;
992 ret.SetValueType(Value::eValueTypeHostAddress);
993 ret.SetContext(Value::eContextTypeInvalid, NULL);
994 ret.GetScalar() = (lldb::addr_t)persistent_var_sp->GetValueBytes();
995 return ret;
996 }
Sean Callanan47dc4572011-09-15 02:13:07 +0000997 }
998 else
999 {
1000 return Value();
1001 }
1002}
1003
Sean Callanan810f22d2010-07-16 00:09:46 +00001004// Interface for CommandObjectExpression
Sean Callananf328c9f2010-07-20 23:31:16 +00001005
1006bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001007ClangExpressionDeclMap::Materialize
1008(
Sean Callananaa301c42010-12-03 01:38:59 +00001009 ExecutionContext &exe_ctx,
Greg Clayton8de27c72010-10-15 22:48:33 +00001010 lldb::addr_t &struct_address,
1011 Error &err
1012)
Sean Callananf328c9f2010-07-20 23:31:16 +00001013{
Sean Callananaa301c42010-12-03 01:38:59 +00001014 EnableMaterialVars();
1015
Greg Clayton567e7f32011-09-22 04:58:26 +00001016 m_material_vars->m_process = exe_ctx.GetProcessPtr();
Sean Callananaa301c42010-12-03 01:38:59 +00001017
Sean Callanan0ddf8062011-05-09 22:04:36 +00001018 bool result = DoMaterialize(false /* dematerialize */,
1019 exe_ctx,
1020 LLDB_INVALID_ADDRESS /* top of stack frame */,
1021 LLDB_INVALID_ADDRESS /* bottom of stack frame */,
1022 NULL, /* result SP */
1023 err);
Sean Callananf328c9f2010-07-20 23:31:16 +00001024
1025 if (result)
Sean Callananaa301c42010-12-03 01:38:59 +00001026 struct_address = m_material_vars->m_materialized_location;
Sean Callananf328c9f2010-07-20 23:31:16 +00001027
1028 return result;
1029}
1030
1031bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001032ClangExpressionDeclMap::GetObjectPointer
1033(
1034 lldb::addr_t &object_ptr,
Sean Callanan3aa7da52010-12-13 22:46:15 +00001035 ConstString &object_name,
Sean Callananaa301c42010-12-03 01:38:59 +00001036 ExecutionContext &exe_ctx,
Sean Callanan047923c2010-12-14 00:42:36 +00001037 Error &err,
1038 bool suppress_type_check
Greg Clayton8de27c72010-10-15 22:48:33 +00001039)
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001040{
Sean Callananaa301c42010-12-03 01:38:59 +00001041 assert (m_struct_vars.get());
1042
Greg Clayton567e7f32011-09-22 04:58:26 +00001043 Target *target = exe_ctx.GetTargetPtr();
1044 Process *process = exe_ctx.GetProcessPtr();
1045 StackFrame *frame = exe_ctx.GetFramePtr();
1046
1047 if (frame == NULL || process == NULL || target == NULL)
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001048 {
1049 err.SetErrorString("Couldn't load 'this' because the context is incomplete");
1050 return false;
1051 }
1052
Sean Callananaa301c42010-12-03 01:38:59 +00001053 if (!m_struct_vars->m_object_pointer_type.GetOpaqueQualType())
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001054 {
1055 err.SetErrorString("Couldn't load 'this' because its type is unknown");
1056 return false;
1057 }
1058
Greg Clayton567e7f32011-09-22 04:58:26 +00001059 VariableSP object_ptr_var = FindVariableInScope (*frame,
Sean Callanan696cf5f2011-05-07 01:06:41 +00001060 object_name,
1061 (suppress_type_check ? NULL : &m_struct_vars->m_object_pointer_type));
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001062
1063 if (!object_ptr_var)
1064 {
Sean Callanan3aa7da52010-12-13 22:46:15 +00001065 err.SetErrorStringWithFormat("Couldn't find '%s' with appropriate type in scope", object_name.GetCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001066 return false;
1067 }
1068
Sean Callananaa301c42010-12-03 01:38:59 +00001069 std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(exe_ctx,
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001070 object_ptr_var,
Sean Callananaa301c42010-12-03 01:38:59 +00001071 NULL));
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001072
1073 if (!location_value.get())
1074 {
Sean Callanan3aa7da52010-12-13 22:46:15 +00001075 err.SetErrorStringWithFormat("Couldn't get the location for '%s'", object_name.GetCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001076 return false;
1077 }
1078
Sean Callanan50339fe2011-03-04 00:23:47 +00001079 switch (location_value->GetValueType())
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001080 {
Sean Callanan50339fe2011-03-04 00:23:47 +00001081 default:
Sean Callanan3aa7da52010-12-13 22:46:15 +00001082 err.SetErrorStringWithFormat("'%s' is not in memory; LLDB must be extended to handle registers", object_name.GetCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001083 return false;
Sean Callanan50339fe2011-03-04 00:23:47 +00001084 case Value::eValueTypeLoadAddress:
1085 {
1086 lldb::addr_t value_addr = location_value->GetScalar().ULongLong();
Greg Clayton567e7f32011-09-22 04:58:26 +00001087 uint32_t address_byte_size = target->GetArchitecture().GetAddressByteSize();
Sean Callanan50339fe2011-03-04 00:23:47 +00001088
1089 if (ClangASTType::GetClangTypeBitWidth(m_struct_vars->m_object_pointer_type.GetASTContext(),
1090 m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) != address_byte_size * 8)
1091 {
1092 err.SetErrorStringWithFormat("'%s' is not of an expected pointer size", object_name.GetCString());
1093 return false;
1094 }
1095
Sean Callanan50339fe2011-03-04 00:23:47 +00001096 Error read_error;
Greg Clayton567e7f32011-09-22 04:58:26 +00001097 object_ptr = process->ReadPointerFromMemory (value_addr, read_error);
Greg Claytonc0fa5332011-05-22 22:46:53 +00001098 if (read_error.Fail() || object_ptr == LLDB_INVALID_ADDRESS)
Sean Callanan50339fe2011-03-04 00:23:47 +00001099 {
1100 err.SetErrorStringWithFormat("Coldn't read '%s' from the target: %s", object_name.GetCString(), read_error.AsCString());
1101 return false;
Greg Claytonc0fa5332011-05-22 22:46:53 +00001102 }
Sean Callanan50339fe2011-03-04 00:23:47 +00001103 return true;
1104 }
1105 case Value::eValueTypeScalar:
1106 {
1107 if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
1108 {
1109 StreamString ss;
1110 location_value->Dump(&ss);
1111
1112 err.SetErrorStringWithFormat("%s is a scalar of unhandled type: %s", object_name.GetCString(), ss.GetString().c_str());
1113 return false;
1114 }
1115
Greg Clayton061b79d2011-05-09 20:18:18 +00001116 RegisterInfo *reg_info = location_value->GetRegisterInfo();
Sean Callanan50339fe2011-03-04 00:23:47 +00001117
Greg Clayton061b79d2011-05-09 20:18:18 +00001118 if (!reg_info)
Sean Callanan50339fe2011-03-04 00:23:47 +00001119 {
1120 err.SetErrorStringWithFormat("Couldn't get the register information for %s", object_name.GetCString());
1121 return false;
1122 }
1123
Greg Clayton061b79d2011-05-09 20:18:18 +00001124 RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
Sean Callanan50339fe2011-03-04 00:23:47 +00001125
Greg Clayton061b79d2011-05-09 20:18:18 +00001126 if (!reg_ctx)
Sean Callanan50339fe2011-03-04 00:23:47 +00001127 {
Greg Clayton061b79d2011-05-09 20:18:18 +00001128 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 +00001129 return false;
1130 }
1131
Greg Clayton061b79d2011-05-09 20:18:18 +00001132 uint32_t register_number = reg_info->kinds[lldb::eRegisterKindLLDB];
Sean Callanan50339fe2011-03-04 00:23:47 +00001133
Greg Clayton061b79d2011-05-09 20:18:18 +00001134 object_ptr = reg_ctx->ReadRegisterAsUnsigned(register_number, 0x0);
Sean Callanan50339fe2011-03-04 00:23:47 +00001135
1136 return true;
1137 }
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001138 }
1139}
1140
1141bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001142ClangExpressionDeclMap::Dematerialize
1143(
Sean Callananaa301c42010-12-03 01:38:59 +00001144 ExecutionContext &exe_ctx,
Greg Clayton427f2902010-12-14 02:59:59 +00001145 ClangExpressionVariableSP &result_sp,
Sean Callanan0ddf8062011-05-09 22:04:36 +00001146 lldb::addr_t stack_frame_top,
1147 lldb::addr_t stack_frame_bottom,
Greg Clayton8de27c72010-10-15 22:48:33 +00001148 Error &err
1149)
Sean Callananf328c9f2010-07-20 23:31:16 +00001150{
Sean Callanan0ddf8062011-05-09 22:04:36 +00001151 return DoMaterialize(true, exe_ctx, stack_frame_top, stack_frame_bottom, &result_sp, err);
Sean Callananaa301c42010-12-03 01:38:59 +00001152
1153 DidDematerialize();
1154}
1155
1156void
1157ClangExpressionDeclMap::DidDematerialize()
1158{
1159 if (m_material_vars.get())
1160 {
1161 if (m_material_vars->m_materialized_location)
1162 {
1163 //#define SINGLE_STEP_EXPRESSIONS
1164
1165#ifndef SINGLE_STEP_EXPRESSIONS
1166 m_material_vars->m_process->DeallocateMemory(m_material_vars->m_materialized_location);
1167#endif
1168 m_material_vars->m_materialized_location = 0;
1169 }
1170
1171 DisableMaterialVars();
1172 }
Sean Callananf328c9f2010-07-20 23:31:16 +00001173}
1174
Sean Callanan32824aa2010-07-23 22:19:18 +00001175bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001176ClangExpressionDeclMap::DumpMaterializedStruct
1177(
Sean Callananaa301c42010-12-03 01:38:59 +00001178 ExecutionContext &exe_ctx,
Greg Clayton8de27c72010-10-15 22:48:33 +00001179 Stream &s,
1180 Error &err
1181)
Sean Callanan32824aa2010-07-23 22:19:18 +00001182{
Sean Callananaa301c42010-12-03 01:38:59 +00001183 assert (m_struct_vars.get());
1184 assert (m_material_vars.get());
1185
1186 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan32824aa2010-07-23 22:19:18 +00001187 {
1188 err.SetErrorString("Structure hasn't been laid out yet");
1189 return false;
1190 }
Greg Clayton567e7f32011-09-22 04:58:26 +00001191 Process *process = exe_ctx.GetProcessPtr();
1192
1193 if (!process)
Sean Callanan32824aa2010-07-23 22:19:18 +00001194 {
1195 err.SetErrorString("Couldn't find the process");
1196 return false;
1197 }
1198
Greg Clayton567e7f32011-09-22 04:58:26 +00001199 Target *target = exe_ctx.GetTargetPtr();
1200 if (!target)
Sean Callanan32824aa2010-07-23 22:19:18 +00001201 {
1202 err.SetErrorString("Couldn't find the target");
1203 return false;
1204 }
1205
Sean Callanan33711022010-12-07 10:00:20 +00001206 if (!m_material_vars->m_materialized_location)
1207 {
1208 err.SetErrorString("No materialized location");
1209 return false;
1210 }
1211
Greg Claytonc0fa5332011-05-22 22:46:53 +00001212 lldb::DataBufferSP data_sp(new DataBufferHeap(m_struct_vars->m_struct_size, 0));
Sean Callanan32824aa2010-07-23 22:19:18 +00001213
1214 Error error;
Greg Clayton567e7f32011-09-22 04:58:26 +00001215 if (process->ReadMemory (m_material_vars->m_materialized_location,
Greg Claytonc0fa5332011-05-22 22:46:53 +00001216 data_sp->GetBytes(),
1217 data_sp->GetByteSize(), error) != data_sp->GetByteSize())
Sean Callanan32824aa2010-07-23 22:19:18 +00001218 {
1219 err.SetErrorStringWithFormat ("Couldn't read struct from the target: %s", error.AsCString());
1220 return false;
1221 }
1222
Greg Clayton567e7f32011-09-22 04:58:26 +00001223 DataExtractor extractor(data_sp, process->GetByteOrder(), target->GetArchitecture().GetAddressByteSize());
Sean Callanan32824aa2010-07-23 22:19:18 +00001224
Greg Clayton427f2902010-12-14 02:59:59 +00001225 for (size_t member_idx = 0, num_members = m_struct_members.GetSize();
1226 member_idx < num_members;
1227 ++member_idx)
Sean Callanan32824aa2010-07-23 22:19:18 +00001228 {
Greg Clayton427f2902010-12-14 02:59:59 +00001229 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_idx));
Sean Callanan32824aa2010-07-23 22:19:18 +00001230
Greg Clayton427f2902010-12-14 02:59:59 +00001231 if (!member_sp)
1232 return false;
1233
1234 s.Printf("[%s]\n", member_sp->GetName().GetCString());
Sean Callanan8c127202010-08-23 23:09:38 +00001235
Greg Clayton427f2902010-12-14 02:59:59 +00001236 if (!member_sp->m_jit_vars.get())
Sean Callanan8c127202010-08-23 23:09:38 +00001237 return false;
1238
Greg Clayton427f2902010-12-14 02:59:59 +00001239 extractor.Dump (&s, // stream
1240 member_sp->m_jit_vars->m_offset, // offset
1241 lldb::eFormatBytesWithASCII, // format
1242 1, // byte size of individual entries
1243 member_sp->m_jit_vars->m_size, // number of entries
1244 16, // entries per line
1245 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, // address to print
1246 0, // bit size (bitfields only; 0 means ignore)
1247 0); // bit alignment (bitfields only; 0 means ignore)
Sean Callanan32824aa2010-07-23 22:19:18 +00001248
1249 s.PutChar('\n');
1250 }
1251
1252 return true;
1253}
1254
Sean Callananf328c9f2010-07-20 23:31:16 +00001255bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001256ClangExpressionDeclMap::DoMaterialize
1257(
1258 bool dematerialize,
Sean Callananaa301c42010-12-03 01:38:59 +00001259 ExecutionContext &exe_ctx,
Sean Callanan0ddf8062011-05-09 22:04:36 +00001260 lldb::addr_t stack_frame_top,
1261 lldb::addr_t stack_frame_bottom,
Greg Clayton427f2902010-12-14 02:59:59 +00001262 lldb::ClangExpressionVariableSP *result_sp_ptr,
Greg Clayton8de27c72010-10-15 22:48:33 +00001263 Error &err
1264)
Sean Callanan810f22d2010-07-16 00:09:46 +00001265{
Greg Clayton427f2902010-12-14 02:59:59 +00001266 if (result_sp_ptr)
1267 result_sp_ptr->reset();
1268
Sean Callananaa301c42010-12-03 01:38:59 +00001269 assert (m_struct_vars.get());
1270
Greg Claytone005f2c2010-11-06 01:53:30 +00001271 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan82b74c82010-08-12 01:56:52 +00001272
Sean Callananaa301c42010-12-03 01:38:59 +00001273 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan810f22d2010-07-16 00:09:46 +00001274 {
1275 err.SetErrorString("Structure hasn't been laid out yet");
Greg Clayton57067a02011-09-13 04:03:52 +00001276 return false;
Sean Callanan810f22d2010-07-16 00:09:46 +00001277 }
1278
Greg Clayton567e7f32011-09-22 04:58:26 +00001279 StackFrame *frame = exe_ctx.GetFramePtr();
1280 if (!frame)
Sean Callanan45839272010-07-24 01:37:44 +00001281 {
1282 err.SetErrorString("Received null execution frame");
Greg Clayton57067a02011-09-13 04:03:52 +00001283 return false;
Sean Callanan45839272010-07-24 01:37:44 +00001284 }
Greg Clayton567e7f32011-09-22 04:58:26 +00001285 Target *target = exe_ctx.GetTargetPtr();
Sean Callanan45839272010-07-24 01:37:44 +00001286
Greg Clayton567e7f32011-09-22 04:58:26 +00001287 ClangPersistentVariables &persistent_vars = target->GetPersistentVariables();
Sean Callananaa301c42010-12-03 01:38:59 +00001288
1289 if (!m_struct_vars->m_struct_size)
Sean Callanane8a59a82010-09-13 21:34:21 +00001290 {
1291 if (log)
1292 log->PutCString("Not bothering to allocate a struct because no arguments are needed");
1293
Sean Callanan9b6898f2011-07-30 02:42:06 +00001294 m_material_vars->m_allocated_area = NULL;
Sean Callanane8a59a82010-09-13 21:34:21 +00001295
1296 return true;
1297 }
1298
Greg Clayton567e7f32011-09-22 04:58:26 +00001299 const SymbolContext &sym_ctx(frame->GetSymbolContext(lldb::eSymbolContextEverything));
Sean Callanan810f22d2010-07-16 00:09:46 +00001300
Sean Callananf328c9f2010-07-20 23:31:16 +00001301 if (!dematerialize)
Sean Callanan810f22d2010-07-16 00:09:46 +00001302 {
Greg Clayton567e7f32011-09-22 04:58:26 +00001303 Process *process = exe_ctx.GetProcessPtr();
Sean Callananaa301c42010-12-03 01:38:59 +00001304 if (m_material_vars->m_materialized_location)
Sean Callananf328c9f2010-07-20 23:31:16 +00001305 {
Greg Clayton567e7f32011-09-22 04:58:26 +00001306 process->DeallocateMemory(m_material_vars->m_materialized_location);
Sean Callananaa301c42010-12-03 01:38:59 +00001307 m_material_vars->m_materialized_location = 0;
Sean Callananf328c9f2010-07-20 23:31:16 +00001308 }
1309
Sean Callanan7a60b942010-10-08 01:58:41 +00001310 if (log)
1311 log->PutCString("Allocating memory for materialized argument struct");
1312
Greg Clayton567e7f32011-09-22 04:58:26 +00001313 lldb::addr_t mem = process->AllocateMemory(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size,
Sean Callananaa301c42010-12-03 01:38:59 +00001314 lldb::ePermissionsReadable | lldb::ePermissionsWritable,
1315 err);
Sean Callananf328c9f2010-07-20 23:31:16 +00001316
1317 if (mem == LLDB_INVALID_ADDRESS)
1318 return false;
1319
Sean Callananaa301c42010-12-03 01:38:59 +00001320 m_material_vars->m_allocated_area = mem;
Sean Callanan810f22d2010-07-16 00:09:46 +00001321 }
1322
Sean Callananaa301c42010-12-03 01:38:59 +00001323 m_material_vars->m_materialized_location = m_material_vars->m_allocated_area;
Sean Callananf328c9f2010-07-20 23:31:16 +00001324
Sean Callananaa301c42010-12-03 01:38:59 +00001325 if (m_material_vars->m_materialized_location % m_struct_vars->m_struct_alignment)
1326 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 +00001327
Greg Clayton427f2902010-12-14 02:59:59 +00001328 for (uint64_t member_index = 0, num_members = m_struct_members.GetSize();
Sean Callanan8c127202010-08-23 23:09:38 +00001329 member_index < num_members;
1330 ++member_index)
Sean Callanan810f22d2010-07-16 00:09:46 +00001331 {
Greg Clayton427f2902010-12-14 02:59:59 +00001332 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
Sean Callanan810f22d2010-07-16 00:09:46 +00001333
Greg Claytona875b642011-01-09 21:07:35 +00001334 if (m_found_entities.ContainsVariable (member_sp))
Sean Callanan8c127202010-08-23 23:09:38 +00001335 {
Greg Claytona875b642011-01-09 21:07:35 +00001336 RegisterInfo *reg_info = member_sp->GetRegisterInfo ();
Greg Clayton427f2902010-12-14 02:59:59 +00001337 if (reg_info)
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001338 {
1339 // This is a register variable
1340
Sean Callananaa301c42010-12-03 01:38:59 +00001341 RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001342
1343 if (!reg_ctx)
1344 return false;
1345
Greg Clayton427f2902010-12-14 02:59:59 +00001346 if (!DoMaterializeOneRegister (dematerialize,
1347 exe_ctx,
1348 *reg_ctx,
1349 *reg_info,
1350 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
1351 err))
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001352 return false;
1353 }
1354 else
1355 {
Greg Clayton427f2902010-12-14 02:59:59 +00001356 if (!member_sp->m_jit_vars.get())
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001357 return false;
1358
Greg Clayton427f2902010-12-14 02:59:59 +00001359 if (!DoMaterializeOneVariable (dematerialize,
1360 exe_ctx,
Sean Callanan6a925532011-01-13 08:53:35 +00001361 sym_ctx,
1362 member_sp,
Greg Clayton427f2902010-12-14 02:59:59 +00001363 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
1364 err))
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001365 return false;
1366 }
Sean Callanan8c127202010-08-23 23:09:38 +00001367 }
Sean Callanan8c127202010-08-23 23:09:38 +00001368 else
1369 {
Greg Claytona875b642011-01-09 21:07:35 +00001370 // No need to look for presistent variables if the name doesn't start
1371 // with with a '$' character...
1372 if (member_sp->GetName().AsCString ("!")[0] == '$' && persistent_vars.ContainsVariable(member_sp))
1373 {
Sean Callanan6a925532011-01-13 08:53:35 +00001374
Greg Claytona875b642011-01-09 21:07:35 +00001375 if (member_sp->GetName() == m_struct_vars->m_result_name)
1376 {
Greg Claytona875b642011-01-09 21:07:35 +00001377 if (log)
1378 log->PutCString("Found result member in the struct");
Sean Callanan6a925532011-01-13 08:53:35 +00001379
Greg Claytona875b642011-01-09 21:07:35 +00001380 if (result_sp_ptr)
1381 *result_sp_ptr = member_sp;
Sean Callanan6a925532011-01-13 08:53:35 +00001382
Greg Claytona875b642011-01-09 21:07:35 +00001383 }
1384
1385 if (!DoMaterializeOnePersistentVariable (dematerialize,
Sean Callanan6a925532011-01-13 08:53:35 +00001386 exe_ctx,
Greg Claytona875b642011-01-09 21:07:35 +00001387 member_sp,
Sean Callanan0ddf8062011-05-09 22:04:36 +00001388 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
1389 stack_frame_top,
1390 stack_frame_bottom,
Greg Claytona875b642011-01-09 21:07:35 +00001391 err))
1392 return false;
1393 }
1394 else
1395 {
1396 err.SetErrorStringWithFormat("Unexpected variable %s", member_sp->GetName().GetCString());
1397 return false;
1398 }
Sean Callanan8c127202010-08-23 23:09:38 +00001399 }
Sean Callanan810f22d2010-07-16 00:09:46 +00001400 }
1401
Sean Callananf328c9f2010-07-20 23:31:16 +00001402 return true;
1403}
1404
Sean Callanana48fe162010-08-11 03:57:18 +00001405bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001406ClangExpressionDeclMap::DoMaterializeOnePersistentVariable
1407(
1408 bool dematerialize,
1409 ExecutionContext &exe_ctx,
Greg Clayton427f2902010-12-14 02:59:59 +00001410 ClangExpressionVariableSP &var_sp,
Greg Clayton8de27c72010-10-15 22:48:33 +00001411 lldb::addr_t addr,
Sean Callanan0ddf8062011-05-09 22:04:36 +00001412 lldb::addr_t stack_frame_top,
1413 lldb::addr_t stack_frame_bottom,
Greg Clayton8de27c72010-10-15 22:48:33 +00001414 Error &err
1415)
Sean Callananaa301c42010-12-03 01:38:59 +00001416{
Sean Callanan6a925532011-01-13 08:53:35 +00001417 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1418
Greg Clayton427f2902010-12-14 02:59:59 +00001419 if (!var_sp)
Sean Callanana48fe162010-08-11 03:57:18 +00001420 {
Greg Clayton427f2902010-12-14 02:59:59 +00001421 err.SetErrorString("Invalid persistent variable");
Sean Callanana48fe162010-08-11 03:57:18 +00001422 return LLDB_INVALID_ADDRESS;
1423 }
1424
Greg Clayton427f2902010-12-14 02:59:59 +00001425 const size_t pvar_byte_size = var_sp->GetByteSize();
Sean Callanana6223432010-08-20 01:02:30 +00001426
Greg Clayton427f2902010-12-14 02:59:59 +00001427 uint8_t *pvar_data = var_sp->GetValueBytes();
1428 if (pvar_data == NULL)
Sean Callanana6223432010-08-20 01:02:30 +00001429 return false;
1430
Sean Callanana48fe162010-08-11 03:57:18 +00001431 Error error;
Greg Clayton567e7f32011-09-22 04:58:26 +00001432 Process *process = exe_ctx.GetProcessPtr();
1433
Sean Callanan6a925532011-01-13 08:53:35 +00001434 lldb::addr_t mem; // The address of a spare memory area used to hold the persistent variable.
1435
Sean Callanana48fe162010-08-11 03:57:18 +00001436 if (dematerialize)
1437 {
Sean Callanan6a925532011-01-13 08:53:35 +00001438 if (log)
1439 log->Printf("Dematerializing persistent variable with flags 0x%hx", var_sp->m_flags);
1440
1441 if ((var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) ||
1442 (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference))
Sean Callanana48fe162010-08-11 03:57:18 +00001443 {
Sean Callanan6a925532011-01-13 08:53:35 +00001444 // Get the location of the target out of the struct.
1445
1446 Error read_error;
Greg Clayton567e7f32011-09-22 04:58:26 +00001447 mem = process->ReadPointerFromMemory (addr, read_error);
Sean Callanan6a925532011-01-13 08:53:35 +00001448
1449 if (mem == LLDB_INVALID_ADDRESS)
1450 {
1451 err.SetErrorStringWithFormat("Couldn't read address of %s from struct: %s", var_sp->GetName().GetCString(), error.AsCString());
1452 return false;
1453 }
1454
1455 if (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference &&
1456 !var_sp->m_live_sp)
1457 {
1458 // If the reference comes from the program, then the ClangExpressionVariable's
1459 // live variable data hasn't been set up yet. Do this now.
1460
Jim Ingham47da8102011-04-22 23:53:53 +00001461 var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope (),
1462 var_sp->GetTypeFromUser().GetASTContext(),
1463 var_sp->GetTypeFromUser().GetOpaqueQualType(),
1464 var_sp->GetName(),
1465 mem,
1466 eAddressTypeLoad,
1467 pvar_byte_size);
Sean Callanan6a925532011-01-13 08:53:35 +00001468 }
1469
1470 if (!var_sp->m_live_sp)
1471 {
1472 err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", var_sp->GetName().GetCString());
1473 return false;
1474 }
1475
Greg Claytonb3448432011-03-24 21:19:54 +00001476 if (var_sp->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
Sean Callanan6a925532011-01-13 08:53:35 +00001477 {
1478 err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", var_sp->GetName().GetCString());
1479 return false;
1480 }
1481
Sean Callanan97678d12011-01-13 21:23:32 +00001482 if (var_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry ||
1483 var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
Sean Callanan6a925532011-01-13 08:53:35 +00001484 {
1485 mem = var_sp->m_live_sp->GetValue().GetScalar().ULongLong();
1486
1487 if (log)
1488 log->Printf("Dematerializing %s from 0x%llx", var_sp->GetName().GetCString(), (uint64_t)mem);
1489
1490 // Read the contents of the spare memory area
Sean Callanan0ddf8062011-05-09 22:04:36 +00001491
Sean Callanan6a925532011-01-13 08:53:35 +00001492 var_sp->ValueUpdated ();
Greg Clayton567e7f32011-09-22 04:58:26 +00001493 if (process->ReadMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
Sean Callanan6a925532011-01-13 08:53:35 +00001494 {
1495 err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString());
1496 return false;
1497 }
1498
Sean Callanan0ddf8062011-05-09 22:04:36 +00001499 if (stack_frame_top != LLDB_INVALID_ADDRESS &&
1500 stack_frame_bottom != LLDB_INVALID_ADDRESS &&
1501 mem >= stack_frame_bottom &&
1502 mem <= stack_frame_top)
1503 {
1504 // If the variable is resident in the stack frame created by the expression,
1505 // then it cannot be relied upon to stay around. We treat it as needing
1506 // reallocation.
1507
1508 var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
1509 var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
1510 var_sp->m_flags &= ~ClangExpressionVariable::EVIsProgramReference;
1511 }
1512
Sean Callanan6a925532011-01-13 08:53:35 +00001513 var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsFreezeDry;
1514 }
1515
1516 if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation &&
1517 !(var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget))
1518 {
1519 if (m_keep_result_in_memory)
1520 {
1521 var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget;
1522 }
1523 else
1524 {
Greg Clayton567e7f32011-09-22 04:58:26 +00001525 Error deallocate_error = process->DeallocateMemory(mem);
Sean Callanan6a925532011-01-13 08:53:35 +00001526
1527 if (!err.Success())
1528 {
1529 err.SetErrorStringWithFormat ("Couldn't deallocate memory for %s: %s", var_sp->GetName().GetCString(), deallocate_error.AsCString());
1530 return false;
1531 }
1532 }
1533 }
1534 }
1535 else
1536 {
1537 err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
Sean Callanana48fe162010-08-11 03:57:18 +00001538 return false;
1539 }
1540 }
1541 else
1542 {
Sean Callanan6a925532011-01-13 08:53:35 +00001543 if (log)
1544 log->Printf("Materializing persistent variable with flags 0x%hx", var_sp->m_flags);
1545
1546 if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation)
Sean Callanana48fe162010-08-11 03:57:18 +00001547 {
Sean Callanan6a925532011-01-13 08:53:35 +00001548 // Allocate a spare memory area to store the persistent variable's contents.
1549
1550 Error allocate_error;
1551
Greg Clayton567e7f32011-09-22 04:58:26 +00001552 mem = process->AllocateMemory(pvar_byte_size,
Sean Callanan6a925532011-01-13 08:53:35 +00001553 lldb::ePermissionsReadable | lldb::ePermissionsWritable,
1554 allocate_error);
1555
1556 if (mem == LLDB_INVALID_ADDRESS)
1557 {
1558 err.SetErrorStringWithFormat("Couldn't allocate a memory area to store %s: %s", var_sp->GetName().GetCString(), allocate_error.AsCString());
1559 return false;
1560 }
1561
1562 if (log)
1563 log->Printf("Allocated %s (0x%llx) sucessfully", var_sp->GetName().GetCString(), mem);
1564
1565 // Put the location of the spare memory into the live data of the ValueObject.
1566
Jim Ingham47da8102011-04-22 23:53:53 +00001567 var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
1568 var_sp->GetTypeFromUser().GetASTContext(),
1569 var_sp->GetTypeFromUser().GetOpaqueQualType(),
1570 var_sp->GetName(),
1571 mem,
1572 eAddressTypeLoad,
1573 pvar_byte_size);
Sean Callanan6a925532011-01-13 08:53:35 +00001574
1575 // Clear the flag if the variable will never be deallocated.
1576
1577 if (var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
1578 var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsAllocation;
1579
1580 // Write the contents of the variable to the area.
1581
Greg Clayton567e7f32011-09-22 04:58:26 +00001582 if (process->WriteMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
Sean Callanan6a925532011-01-13 08:53:35 +00001583 {
1584 err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString());
1585 return false;
1586 }
1587 }
1588
1589 if ((var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && var_sp->m_live_sp) ||
1590 var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated)
1591 {
Sean Callanan6a925532011-01-13 08:53:35 +00001592 // Now write the location of the area into the struct.
Sean Callanan6a925532011-01-13 08:53:35 +00001593 Error write_error;
Greg Clayton567e7f32011-09-22 04:58:26 +00001594 if (!process->WriteScalarToMemory (addr,
Greg Claytonc0fa5332011-05-22 22:46:53 +00001595 var_sp->m_live_sp->GetValue().GetScalar(),
Greg Clayton567e7f32011-09-22 04:58:26 +00001596 process->GetAddressByteSize(),
Greg Claytonc0fa5332011-05-22 22:46:53 +00001597 write_error))
Sean Callanan6a925532011-01-13 08:53:35 +00001598 {
1599 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", var_sp->GetName().GetCString(), write_error.AsCString());
1600 return false;
1601 }
1602
1603 if (log)
Greg Claytonc0fa5332011-05-22 22:46:53 +00001604 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 +00001605 }
Sean Callanan696cf5f2011-05-07 01:06:41 +00001606 else if (!(var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference))
Sean Callanan6a925532011-01-13 08:53:35 +00001607 {
1608 err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
Sean Callanana48fe162010-08-11 03:57:18 +00001609 return false;
1610 }
1611 }
1612
1613 return true;
1614}
1615
Sean Callananf328c9f2010-07-20 23:31:16 +00001616bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001617ClangExpressionDeclMap::DoMaterializeOneVariable
1618(
1619 bool dematerialize,
1620 ExecutionContext &exe_ctx,
1621 const SymbolContext &sym_ctx,
Sean Callanan6a925532011-01-13 08:53:35 +00001622 ClangExpressionVariableSP &expr_var,
Greg Clayton8de27c72010-10-15 22:48:33 +00001623 lldb::addr_t addr,
1624 Error &err
1625)
Sean Callananf328c9f2010-07-20 23:31:16 +00001626{
Greg Claytone005f2c2010-11-06 01:53:30 +00001627 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Greg Clayton567e7f32011-09-22 04:58:26 +00001628 Target *target = exe_ctx.GetTargetPtr();
1629 Process *process = exe_ctx.GetProcessPtr();
1630 StackFrame *frame = exe_ctx.GetFramePtr();
1631
Sean Callanan6d284ef2011-10-12 22:20:02 +00001632 if (!frame || !process || !target || !m_parser_vars.get() || !expr_var->m_parser_vars.get())
Sean Callanancc074622010-09-14 21:59:34 +00001633 return false;
1634
Sean Callanan6a925532011-01-13 08:53:35 +00001635 // Vital information about the value
1636
1637 const ConstString &name(expr_var->GetName());
1638 TypeFromUser type(expr_var->GetTypeFromUser());
1639
Greg Clayton567e7f32011-09-22 04:58:26 +00001640 VariableSP var = FindVariableInScope (*frame, name, &type);
Sean Callanan0eca1a72011-10-12 18:00:53 +00001641
1642 ModuleSP module;
1643
1644 Symbol *sym = FindGlobalDataSymbol(*target, module, name, NULL);
Sean Callananf328c9f2010-07-20 23:31:16 +00001645
Sean Callanan81974962011-05-08 02:21:26 +00001646 std::auto_ptr<lldb_private::Value> location_value;
1647
1648 if (var)
1649 {
1650 location_value.reset(GetVariableValue(exe_ctx,
1651 var,
1652 NULL));
1653 }
1654 else if (sym)
Sean Callananae9f7482011-07-07 23:05:43 +00001655 {
Sean Callanan81974962011-05-08 02:21:26 +00001656 location_value.reset(new Value);
1657
Greg Clayton567e7f32011-09-22 04:58:26 +00001658 addr_t location_load_addr = GetSymbolAddress(*target, name);
Sean Callanan81974962011-05-08 02:21:26 +00001659
Greg Claytoncbc07cf2011-06-23 04:25:29 +00001660 if (location_load_addr == LLDB_INVALID_ADDRESS)
Sean Callanan81974962011-05-08 02:21:26 +00001661 {
1662 if (log)
Greg Claytonc0fa5332011-05-22 22:46:53 +00001663 err.SetErrorStringWithFormat ("Couldn't find value for global symbol %s",
1664 name.GetCString());
Sean Callanan81974962011-05-08 02:21:26 +00001665 }
1666
1667 location_value->SetValueType(Value::eValueTypeLoadAddress);
1668 location_value->GetScalar() = location_load_addr;
1669 }
1670 else
Sean Callananf328c9f2010-07-20 23:31:16 +00001671 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001672 err.SetErrorStringWithFormat ("Couldn't find %s with appropriate type",
1673 name.GetCString());
Sean Callananf328c9f2010-07-20 23:31:16 +00001674 return false;
1675 }
1676
Sean Callanan841026f2010-07-23 00:16:21 +00001677 if (log)
Sean Callananfb3058e2011-05-12 23:54:16 +00001678 {
1679 StreamString my_stream_string;
1680
1681 ClangASTType::DumpTypeDescription (type.GetASTContext(),
1682 type.GetOpaqueQualType(),
1683 &my_stream_string);
1684
Greg Claytonc0fa5332011-05-22 22:46:53 +00001685 log->Printf ("%s %s with type %s",
1686 dematerialize ? "Dematerializing" : "Materializing",
1687 name.GetCString(),
1688 my_stream_string.GetString().c_str());
Sean Callananfb3058e2011-05-12 23:54:16 +00001689 }
Sean Callananf328c9f2010-07-20 23:31:16 +00001690
1691 if (!location_value.get())
1692 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001693 err.SetErrorStringWithFormat("Couldn't get value for %s", name.GetCString());
Sean Callananf328c9f2010-07-20 23:31:16 +00001694 return false;
1695 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001696
1697 // The size of the type contained in addr
Sean Callananf328c9f2010-07-20 23:31:16 +00001698
Sean Callanan6a925532011-01-13 08:53:35 +00001699 size_t value_bit_size = ClangASTType::GetClangTypeBitWidth(type.GetASTContext(), type.GetOpaqueQualType());
1700 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 +00001701
1702 Value::ValueType value_type = location_value->GetValueType();
1703
1704 switch (value_type)
Sean Callananf328c9f2010-07-20 23:31:16 +00001705 {
Sean Callanan17c6a052010-10-05 20:18:48 +00001706 default:
Sean Callananf328c9f2010-07-20 23:31:16 +00001707 {
Sean Callanan17c6a052010-10-05 20:18:48 +00001708 StreamString ss;
1709
1710 location_value->Dump(&ss);
1711
Greg Claytonc0fa5332011-05-22 22:46:53 +00001712 err.SetErrorStringWithFormat ("%s has a value of unhandled type: %s",
1713 name.GetCString(),
1714 ss.GetString().c_str());
Sean Callananf328c9f2010-07-20 23:31:16 +00001715 return false;
1716 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001717 break;
1718 case Value::eValueTypeLoadAddress:
Sean Callananf328c9f2010-07-20 23:31:16 +00001719 {
Sean Callanan6a925532011-01-13 08:53:35 +00001720 if (!dematerialize)
Sean Callanan17c6a052010-10-05 20:18:48 +00001721 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001722 Error write_error;
Sean Callanan6a925532011-01-13 08:53:35 +00001723
Greg Clayton567e7f32011-09-22 04:58:26 +00001724 if (!process->WriteScalarToMemory (addr,
Greg Claytonc0fa5332011-05-22 22:46:53 +00001725 location_value->GetScalar(),
Greg Clayton567e7f32011-09-22 04:58:26 +00001726 process->GetAddressByteSize(),
Greg Claytonc0fa5332011-05-22 22:46:53 +00001727 write_error))
Sean Callanan6a925532011-01-13 08:53:35 +00001728 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001729 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
1730 name.GetCString(),
1731 write_error.AsCString());
Sean Callanan6a925532011-01-13 08:53:35 +00001732 return false;
1733 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001734 }
Sean Callananf328c9f2010-07-20 23:31:16 +00001735 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001736 break;
1737 case Value::eValueTypeScalar:
1738 {
Greg Clayton6916e352010-11-13 03:52:47 +00001739 if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
Sean Callanan17c6a052010-10-05 20:18:48 +00001740 {
1741 StreamString ss;
Sean Callanan17c6a052010-10-05 20:18:48 +00001742 location_value->Dump(&ss);
1743
Greg Claytonc0fa5332011-05-22 22:46:53 +00001744 err.SetErrorStringWithFormat ("%s is a scalar of unhandled type: %s",
1745 name.GetCString(),
1746 ss.GetString().c_str());
Sean Callanan17c6a052010-10-05 20:18:48 +00001747 return false;
1748 }
1749
Greg Clayton061b79d2011-05-09 20:18:18 +00001750 RegisterInfo *reg_info = location_value->GetRegisterInfo();
Sean Callanan17c6a052010-10-05 20:18:48 +00001751
Greg Clayton061b79d2011-05-09 20:18:18 +00001752 if (!reg_info)
Sean Callanan17c6a052010-10-05 20:18:48 +00001753 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001754 err.SetErrorStringWithFormat ("Couldn't get the register information for %s",
1755 name.GetCString());
Sean Callanan17c6a052010-10-05 20:18:48 +00001756 return false;
1757 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001758
Greg Clayton061b79d2011-05-09 20:18:18 +00001759 RegisterValue reg_value;
1760
1761 RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
1762
1763 if (!reg_ctx)
Sean Callanan17c6a052010-10-05 20:18:48 +00001764 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001765 err.SetErrorStringWithFormat ("Couldn't read register context to read %s from %s",
1766 name.GetCString(),
1767 reg_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001768 return false;
1769 }
1770
Greg Clayton061b79d2011-05-09 20:18:18 +00001771 uint32_t register_byte_size = reg_info->byte_size;
Sean Callanan17c6a052010-10-05 20:18:48 +00001772
1773 if (dematerialize)
1774 {
Sean Callanan6a925532011-01-13 08:53:35 +00001775 // Get the location of the spare memory area out of the variable's live data.
1776
1777 if (!expr_var->m_live_sp)
1778 {
1779 err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", name.GetCString());
1780 return false;
1781 }
1782
Greg Claytonb3448432011-03-24 21:19:54 +00001783 if (expr_var->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
Sean Callanan6a925532011-01-13 08:53:35 +00001784 {
1785 err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", name.GetCString());
1786 return false;
1787 }
1788
Greg Claytonc0fa5332011-05-22 22:46:53 +00001789 Scalar &reg_addr = expr_var->m_live_sp->GetValue().GetScalar();
Sean Callanan6a925532011-01-13 08:53:35 +00001790
Greg Claytonc0fa5332011-05-22 22:46:53 +00001791 err = reg_ctx->ReadRegisterValueFromMemory (reg_info,
1792 reg_addr.ULongLong(),
1793 value_byte_size,
1794 reg_value);
Greg Clayton061b79d2011-05-09 20:18:18 +00001795 if (err.Fail())
Sean Callanan17c6a052010-10-05 20:18:48 +00001796 return false;
Greg Clayton061b79d2011-05-09 20:18:18 +00001797
1798 if (!reg_ctx->WriteRegister (reg_info, reg_value))
Sean Callanan17c6a052010-10-05 20:18:48 +00001799 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001800 err.SetErrorStringWithFormat ("Couldn't write %s to register %s",
1801 name.GetCString(),
1802 reg_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001803 return false;
1804 }
Sean Callanan6a925532011-01-13 08:53:35 +00001805
1806 // Deallocate the spare area and clear the variable's live data.
1807
Greg Clayton567e7f32011-09-22 04:58:26 +00001808 Error deallocate_error = process->DeallocateMemory(reg_addr.ULongLong());
Sean Callanan6a925532011-01-13 08:53:35 +00001809
1810 if (!deallocate_error.Success())
1811 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001812 err.SetErrorStringWithFormat ("Couldn't deallocate spare memory area for %s: %s",
1813 name.GetCString(),
1814 deallocate_error.AsCString());
Sean Callanan6a925532011-01-13 08:53:35 +00001815 return false;
1816 }
1817
1818 expr_var->m_live_sp.reset();
Sean Callanan17c6a052010-10-05 20:18:48 +00001819 }
1820 else
1821 {
Sean Callanan6a925532011-01-13 08:53:35 +00001822 // Allocate a spare memory area to place the register's contents into. This memory area will be pointed to by the slot in the
1823 // struct.
1824
1825 Error allocate_error;
1826
Greg Clayton567e7f32011-09-22 04:58:26 +00001827 Scalar reg_addr (process->AllocateMemory (value_byte_size,
Greg Claytonc0fa5332011-05-22 22:46:53 +00001828 lldb::ePermissionsReadable | lldb::ePermissionsWritable,
1829 allocate_error));
Sean Callanan6a925532011-01-13 08:53:35 +00001830
Greg Claytonc0fa5332011-05-22 22:46:53 +00001831 if (reg_addr.ULongLong() == LLDB_INVALID_ADDRESS)
Sean Callanan6a925532011-01-13 08:53:35 +00001832 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001833 err.SetErrorStringWithFormat ("Couldn't allocate a memory area to store %s: %s",
1834 name.GetCString(),
1835 allocate_error.AsCString());
Sean Callanan6a925532011-01-13 08:53:35 +00001836 return false;
1837 }
1838
1839 // Put the location of the spare memory into the live data of the ValueObject.
1840
Jim Ingham47da8102011-04-22 23:53:53 +00001841 expr_var->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
1842 type.GetASTContext(),
1843 type.GetOpaqueQualType(),
1844 name,
Greg Claytonc0fa5332011-05-22 22:46:53 +00001845 reg_addr.ULongLong(),
Jim Ingham47da8102011-04-22 23:53:53 +00001846 eAddressTypeLoad,
1847 value_byte_size);
Sean Callanan6a925532011-01-13 08:53:35 +00001848
1849 // Now write the location of the area into the struct.
1850
1851 Error write_error;
Greg Claytonc0fa5332011-05-22 22:46:53 +00001852
Greg Clayton567e7f32011-09-22 04:58:26 +00001853 if (!process->WriteScalarToMemory (addr,
Greg Claytonc0fa5332011-05-22 22:46:53 +00001854 reg_addr,
Greg Clayton567e7f32011-09-22 04:58:26 +00001855 process->GetAddressByteSize(),
Greg Claytonc0fa5332011-05-22 22:46:53 +00001856 write_error))
Sean Callanan6a925532011-01-13 08:53:35 +00001857 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001858 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
1859 name.GetCString(),
1860 write_error.AsCString());
Sean Callanan6a925532011-01-13 08:53:35 +00001861 return false;
1862 }
1863
Sean Callanan6a925532011-01-13 08:53:35 +00001864 if (value_byte_size > register_byte_size)
Sean Callanan17c6a052010-10-05 20:18:48 +00001865 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001866 err.SetErrorStringWithFormat ("%s is too big to store in %s",
1867 name.GetCString(),
1868 reg_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001869 return false;
1870 }
Greg Clayton061b79d2011-05-09 20:18:18 +00001871
1872 RegisterValue reg_value;
1873
1874 if (!reg_ctx->ReadRegister (reg_info, reg_value))
Sean Callanan17c6a052010-10-05 20:18:48 +00001875 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001876 err.SetErrorStringWithFormat ("Couldn't read %s from %s",
1877 name.GetCString(),
1878 reg_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001879 return false;
1880 }
1881
Greg Claytonc0fa5332011-05-22 22:46:53 +00001882 err = reg_ctx->WriteRegisterValueToMemory (reg_info,
1883 reg_addr.ULongLong(),
1884 value_byte_size,
1885 reg_value);
Greg Clayton061b79d2011-05-09 20:18:18 +00001886 if (err.Fail())
Sean Callanan17c6a052010-10-05 20:18:48 +00001887 return false;
Sean Callanan17c6a052010-10-05 20:18:48 +00001888 }
1889 }
Sean Callananf328c9f2010-07-20 23:31:16 +00001890 }
1891
1892 return true;
Sean Callanan810f22d2010-07-16 00:09:46 +00001893}
1894
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001895bool
1896ClangExpressionDeclMap::DoMaterializeOneRegister
1897(
1898 bool dematerialize,
1899 ExecutionContext &exe_ctx,
1900 RegisterContext &reg_ctx,
Greg Claytonb3448432011-03-24 21:19:54 +00001901 const RegisterInfo &reg_info,
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001902 lldb::addr_t addr,
1903 Error &err
1904)
1905{
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001906 uint32_t register_byte_size = reg_info.byte_size;
Greg Clayton061b79d2011-05-09 20:18:18 +00001907 RegisterValue reg_value;
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001908 if (dematerialize)
1909 {
Greg Clayton061b79d2011-05-09 20:18:18 +00001910 Error read_error (reg_ctx.ReadRegisterValueFromMemory(&reg_info, addr, register_byte_size, reg_value));
1911 if (read_error.Fail())
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001912 {
Greg Claytonbdcb6ab2011-01-25 23:55:37 +00001913 err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", reg_info.name, read_error.AsCString());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001914 return false;
1915 }
1916
Greg Clayton061b79d2011-05-09 20:18:18 +00001917 if (!reg_ctx.WriteRegister (&reg_info, reg_value))
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001918 {
Greg Clayton061b79d2011-05-09 20:18:18 +00001919 err.SetErrorStringWithFormat("Couldn't write register %s (dematerialize)", reg_info.name);
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001920 return false;
1921 }
1922 }
1923 else
1924 {
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001925
Greg Clayton061b79d2011-05-09 20:18:18 +00001926 if (!reg_ctx.ReadRegister(&reg_info, reg_value))
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001927 {
Greg Clayton061b79d2011-05-09 20:18:18 +00001928 err.SetErrorStringWithFormat("Couldn't read %s (materialize)", reg_info.name);
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001929 return false;
1930 }
1931
Greg Clayton061b79d2011-05-09 20:18:18 +00001932 Error write_error (reg_ctx.WriteRegisterValueToMemory(&reg_info, addr, register_byte_size, reg_value));
1933 if (write_error.Fail())
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001934 {
Jason Molenda95b7b432011-09-20 00:26:08 +00001935 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", reg_info.name, write_error.AsCString());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001936 return false;
1937 }
1938 }
1939
1940 return true;
1941}
1942
Sean Callanan696cf5f2011-05-07 01:06:41 +00001943lldb::VariableSP
Greg Clayton8de27c72010-10-15 22:48:33 +00001944ClangExpressionDeclMap::FindVariableInScope
1945(
1946 StackFrame &frame,
1947 const ConstString &name,
1948 TypeFromUser *type
1949)
Sean Callananaa301c42010-12-03 01:38:59 +00001950{
Greg Claytone005f2c2010-11-06 01:53:30 +00001951 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanancc074622010-09-14 21:59:34 +00001952
Sean Callananf8b468e2011-08-06 00:28:14 +00001953 ValueObjectSP valobj;
1954 VariableSP var_sp;
1955 Error err;
Sean Callanancc074622010-09-14 21:59:34 +00001956
Sean Callananf8b468e2011-08-06 00:28:14 +00001957 valobj = frame.GetValueForVariableExpressionPath(name.GetCString(),
1958 eNoDynamicValues,
1959 StackFrame::eExpressionPathOptionCheckPtrVsMember,
1960 var_sp,
1961 err);
Greg Clayton3bc52d02010-11-14 22:13:40 +00001962
Sean Callananf8b468e2011-08-06 00:28:14 +00001963 if (!err.Success() ||
1964 !var_sp ||
Sean Callananae9f7482011-07-07 23:05:43 +00001965 !var_sp->IsInScope(&frame) ||
1966 !var_sp->LocationIsValidForFrame (&frame))
1967 return lldb::VariableSP();
Greg Clayton3bc52d02010-11-14 22:13:40 +00001968
1969 if (var_sp && type)
1970 {
1971 if (type->GetASTContext() == var_sp->GetType()->GetClangAST())
1972 {
Greg Clayton04c9c7b2011-02-16 23:00:21 +00001973 if (!ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType()))
Sean Callanan696cf5f2011-05-07 01:06:41 +00001974 return lldb::VariableSP();
Greg Clayton3bc52d02010-11-14 22:13:40 +00001975 }
1976 else
1977 {
1978 if (log)
1979 log->PutCString("Skipping a candidate variable because of different AST contexts");
Sean Callanan696cf5f2011-05-07 01:06:41 +00001980 return lldb::VariableSP();
Greg Clayton3bc52d02010-11-14 22:13:40 +00001981 }
Sean Callanancc074622010-09-14 21:59:34 +00001982 }
Greg Clayton3bc52d02010-11-14 22:13:40 +00001983
Sean Callanan696cf5f2011-05-07 01:06:41 +00001984 return var_sp;
Sean Callanancc074622010-09-14 21:59:34 +00001985}
Sean Callanan336a0002010-07-17 00:43:37 +00001986
Sean Callanan81974962011-05-08 02:21:26 +00001987Symbol *
1988ClangExpressionDeclMap::FindGlobalDataSymbol
1989(
1990 Target &target,
Sean Callanan0eca1a72011-10-12 18:00:53 +00001991 ModuleSP &module,
1992 const ConstString &name,
1993 ClangNamespaceDecl *namespace_decl
Sean Callanan81974962011-05-08 02:21:26 +00001994)
1995{
1996 SymbolContextList sc_list;
1997
Sean Callanan0eca1a72011-10-12 18:00:53 +00001998 if (module && namespace_decl)
1999 module->FindSymbolsWithNameAndType(name,
2000 namespace_decl,
2001 eSymbolTypeData,
2002 sc_list);
2003 else
2004 target.GetImages().FindSymbolsWithNameAndType(name,
2005 eSymbolTypeData,
2006 sc_list);
Sean Callanan81974962011-05-08 02:21:26 +00002007
2008 if (sc_list.GetSize())
2009 {
2010 SymbolContext sym_ctx;
2011 sc_list.GetContextAtIndex(0, sym_ctx);
2012
2013 return sym_ctx.symbol;
2014 }
2015
2016 return NULL;
2017}
2018
Sean Callanan47dc4572011-09-15 02:13:07 +00002019// This is a callback used with Variable::GetValuesForVariableExpressionPath
2020
2021static uint32_t GetVariableCallback (void *baton,
2022 const char *name,
2023 VariableList &variable_list)
2024{
2025 Target *target = static_cast<Target *>(baton);
2026 if (target)
2027 {
2028 return target->GetImages().FindGlobalVariables (ConstString(name),
2029 true,
2030 UINT32_MAX,
2031 variable_list);
2032 }
2033 return 0;
2034}
2035
2036lldb::VariableSP
2037ClangExpressionDeclMap::FindGlobalVariable
2038(
2039 Target &target,
Sean Callanan94cd0ca2011-10-12 16:59:31 +00002040 ModuleSP &module,
2041 const ConstString &name,
2042 ClangNamespaceDecl *namespace_decl,
Sean Callanan47dc4572011-09-15 02:13:07 +00002043 TypeFromUser *type
2044)
2045{
2046 VariableList vars;
2047 ValueObjectList valobjs;
2048
Sean Callanan94cd0ca2011-10-12 16:59:31 +00002049 if (module && namespace_decl)
2050 module->FindGlobalVariables (name, namespace_decl, true, -1, vars);
2051 else
2052 target.GetImages().FindGlobalVariables(name, true, -1, vars);
Sean Callanan47dc4572011-09-15 02:13:07 +00002053
2054 if (vars.GetSize())
2055 {
2056 if (type)
2057 {
2058 for (size_t i = 0; i < vars.GetSize(); ++i)
2059 {
2060 VariableSP var_sp = vars.GetVariableAtIndex(i);
2061
2062 if (type->GetASTContext() == var_sp->GetType()->GetClangAST())
2063 {
2064 if (ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType()))
2065 return var_sp;
2066 }
2067 }
2068 }
2069 else
2070 {
2071 return vars.GetVariableAtIndex(0);
2072 }
2073 }
2074
2075 return VariableSP();
2076}
2077
Chris Lattner24943d22010-06-08 16:52:24 +00002078// Interface for ClangASTSource
Sean Callanan47dc4572011-09-15 02:13:07 +00002079
Sean Callanan16b53ab2011-10-12 00:12:34 +00002080void
2081ClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context, const ConstString &name)
Chris Lattner24943d22010-06-08 16:52:24 +00002082{
Greg Claytone005f2c2010-11-06 01:53:30 +00002083 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Chris Lattner24943d22010-06-08 16:52:24 +00002084
Sean Callananaa301c42010-12-03 01:38:59 +00002085 if (m_parser_vars->m_ignore_lookups)
Sean Callananee8fc722010-11-19 20:20:02 +00002086 {
2087 if (log)
2088 log->Printf("Ignoring a query during an import");
2089 return;
2090 }
Greg Claytone6d72ca2011-06-25 00:44:06 +00002091
Sean Callanan16b53ab2011-10-12 00:12:34 +00002092 if (log)
2093 {
2094 if (!context.m_decl_context)
2095 log->Printf("FindExternalVisibleDecls for '%s' in a NULL DeclContext", name.GetCString());
2096 else if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context.m_decl_context))
2097 log->Printf("FindExternalVisibleDecls for '%s' in '%s'", name.GetCString(), context_named_decl->getNameAsString().c_str());
2098 else
2099 log->Printf("FindExternalVisibleDecls for '%s' in a '%s'", name.GetCString(), context.m_decl_context->getDeclKindName());
2100 }
2101
2102 if (const NamespaceDecl *namespace_context = dyn_cast<NamespaceDecl>(context.m_decl_context))
2103 {
2104 ClangASTImporter::NamespaceMapSP namespace_map = m_parser_vars->m_ast_importer->GetNamespaceMap(namespace_context);
2105
2106 for (ClangASTImporter::NamespaceMap::iterator i = namespace_map->begin(), e = namespace_map->end();
2107 i != e;
2108 ++i)
2109 {
2110 if (log)
2111 log->Printf(" Searching namespace '%s' in file '%s'",
2112 i->second.GetNamespaceDecl()->getNameAsString().c_str(),
2113 i->first->GetFileSpec().GetFilename().GetCString());
2114
2115 //FindExternalVisibleDecls(context,
2116 // i->first,
2117 // i->second,
2118 // name);
2119 }
2120 }
2121 else if (!isa<TranslationUnitDecl>(context.m_decl_context))
2122 {
2123 // we shouldn't be getting FindExternalVisibleDecls calls for these
2124 return;
2125 }
2126 else
2127 {
2128 ClangNamespaceDecl namespace_decl;
2129
2130 if (log)
Sean Callanan94cd0ca2011-10-12 16:59:31 +00002131 log->Printf(" Searching the root namespace");
Sean Callanan16b53ab2011-10-12 00:12:34 +00002132
2133 FindExternalVisibleDecls(context,
2134 lldb::ModuleSP(),
2135 namespace_decl,
2136 name);
2137 }
2138}
2139
2140void
2141ClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context,
Sean Callanan38d084f2011-10-12 18:44:30 +00002142 lldb::ModuleSP module_sp,
Sean Callanan03f64ca2011-10-12 01:39:28 +00002143 ClangNamespaceDecl &namespace_decl,
Sean Callanan16b53ab2011-10-12 00:12:34 +00002144 const ConstString &name)
2145{
2146 assert (m_struct_vars.get());
2147 assert (m_parser_vars.get());
2148
2149 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Greg Claytone6d72ca2011-06-25 00:44:06 +00002150
Greg Claytone5748d82010-11-09 23:46:37 +00002151 SymbolContextList sc_list;
Chris Lattner24943d22010-06-08 16:52:24 +00002152
Greg Clayton3bc52d02010-11-14 22:13:40 +00002153 const char *name_unique_cstr = name.GetCString();
2154
2155 if (name_unique_cstr == NULL)
2156 return;
2157
Greg Clayton8de27c72010-10-15 22:48:33 +00002158 // Only look for functions by name out in our symbols if the function
2159 // doesn't start with our phony prefix of '$'
Greg Clayton567e7f32011-09-22 04:58:26 +00002160 Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
2161 StackFrame *frame = m_parser_vars->m_exe_ctx->GetFramePtr();
Sean Callanan03f64ca2011-10-12 01:39:28 +00002162 if (name_unique_cstr[0] == '$' && !namespace_decl)
2163 {
2164 static ConstString g_lldb_class_name ("$__lldb_class");
2165
2166 if (name == g_lldb_class_name)
2167 {
2168 // Clang is looking for the type of "this"
2169
2170 if (!frame)
2171 return;
2172
2173 VariableList *vars = frame->GetVariableList(false);
2174
2175 if (!vars)
2176 return;
2177
2178 lldb::VariableSP this_var = vars->FindVariable(ConstString("this"));
2179
2180 if (!this_var ||
2181 !this_var->IsInScope(frame) ||
2182 !this_var->LocationIsValidForFrame (frame))
2183 return;
2184
2185 Type *this_type = this_var->GetType();
2186
2187 if (!this_type)
2188 return;
2189
2190 if (log)
2191 {
2192 log->PutCString ("Type for \"this\" is: ");
2193 StreamString strm;
2194 this_type->Dump(&strm, true);
2195 log->PutCString (strm.GetData());
2196 }
2197
2198 TypeFromUser this_user_type(this_type->GetClangFullType(),
2199 this_type->GetClangAST());
2200
2201 m_struct_vars->m_object_pointer_type = this_user_type;
2202
2203 void *pointer_target_type = NULL;
2204
2205 if (!ClangASTContext::IsPointerType(this_user_type.GetOpaqueQualType(),
2206 &pointer_target_type))
2207 return;
2208
2209 clang::QualType pointer_target_qual_type = QualType::getFromOpaquePtr(pointer_target_type);
2210
2211 if (pointer_target_qual_type.isConstQualified())
2212 pointer_target_qual_type.removeLocalConst();
2213
2214 TypeFromUser class_user_type(pointer_target_qual_type.getAsOpaquePtr(),
2215 this_type->GetClangAST());
2216
2217 if (log)
2218 {
2219 StreamString type_stream;
2220 class_user_type.DumpTypeCode(&type_stream);
2221 type_stream.Flush();
2222 log->Printf("Adding type for $__lldb_class: %s", type_stream.GetString().c_str());
2223 }
2224
2225 AddOneType(context, class_user_type, true);
2226
2227 return;
2228 }
2229
2230 static ConstString g_lldb_objc_class_name ("$__lldb_objc_class");
2231 if (name == g_lldb_objc_class_name)
2232 {
2233 // Clang is looking for the type of "*self"
2234
2235 if (!frame)
2236 return;
2237
2238 VariableList *vars = frame->GetVariableList(false);
2239
2240 if (!vars)
2241 return;
2242
2243 lldb::VariableSP self_var = vars->FindVariable(ConstString("self"));
2244
2245 if (!self_var ||
2246 !self_var->IsInScope(frame) ||
2247 !self_var->LocationIsValidForFrame (frame))
2248 return;
2249
2250 Type *self_type = self_var->GetType();
2251
2252 if (!self_type)
2253 return;
2254
2255 TypeFromUser self_user_type(self_type->GetClangFullType(),
2256 self_type->GetClangAST());
2257
2258 m_struct_vars->m_object_pointer_type = self_user_type;
2259
2260 void *pointer_target_type = NULL;
2261
2262 if (!ClangASTContext::IsPointerType(self_user_type.GetOpaqueQualType(),
2263 &pointer_target_type)
2264 || pointer_target_type == NULL)
2265 return;
2266
2267 TypeFromUser class_user_type(pointer_target_type,
2268 self_type->GetClangAST());
2269
2270 if (log)
2271 {
2272 StreamString type_stream;
2273 class_user_type.DumpTypeCode(&type_stream);
2274 type_stream.Flush();
2275 log->Printf("Adding type for $__lldb_objc_class: %s", type_stream.GetString().c_str());
2276 }
2277
2278 AddOneType(context, class_user_type, false);
2279
2280 return;
2281 }
2282
2283 // any other $__lldb names should be weeded out now
2284 if (!::strncmp(name_unique_cstr, "$__lldb", sizeof("$__lldb") - 1))
2285 return;
2286
2287 do
2288 {
2289 if (!target)
2290 break;
2291
2292 ClangASTContext *scratch_clang_ast_context = target->GetScratchClangASTContext();
2293
2294 if (!scratch_clang_ast_context)
2295 break;
2296
2297 ASTContext *scratch_ast_context = scratch_clang_ast_context->getASTContext();
2298
2299 if (!scratch_ast_context)
2300 break;
2301
2302 TypeDecl *ptype_type_decl = m_parser_vars->m_persistent_vars->GetPersistentType(name);
2303
2304 if (!ptype_type_decl)
2305 break;
2306
2307 Decl *parser_ptype_decl = ClangASTContext::CopyDecl(context.GetASTContext(), scratch_ast_context, ptype_type_decl);
2308
2309 if (!parser_ptype_decl)
2310 break;
2311
2312 TypeDecl *parser_ptype_type_decl = dyn_cast<TypeDecl>(parser_ptype_decl);
2313
2314 if (!parser_ptype_type_decl)
2315 break;
2316
2317 if (log)
2318 log->Printf("Found persistent type %s", name.GetCString());
2319
2320 context.AddNamedDecl(parser_ptype_type_decl);
2321 } while (0);
2322
2323 ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name));
2324
2325 if (pvar_sp)
2326 {
2327 AddOneVariable(context, pvar_sp);
2328 return;
2329 }
2330
2331 const char *reg_name(&name.GetCString()[1]);
2332
2333 if (m_parser_vars->m_exe_ctx->GetRegisterContext())
2334 {
2335 const RegisterInfo *reg_info(m_parser_vars->m_exe_ctx->GetRegisterContext()->GetRegisterInfoByName(reg_name));
2336
2337 if (reg_info)
2338 AddOneRegister(context, reg_info);
2339 }
2340 }
2341 else
Sean Callanan0fc73582010-07-27 00:55:47 +00002342 {
Sean Callananf8b468e2011-08-06 00:28:14 +00002343 ValueObjectSP valobj;
2344 VariableSP var;
2345 Error err;
2346
Sean Callanan03f64ca2011-10-12 01:39:28 +00002347 if (frame && !namespace_decl)
Greg Clayton8de27c72010-10-15 22:48:33 +00002348 {
Greg Clayton567e7f32011-09-22 04:58:26 +00002349 valobj = frame->GetValueForVariableExpressionPath(name_unique_cstr,
Sean Callanan16b53ab2011-10-12 00:12:34 +00002350 eNoDynamicValues,
2351 StackFrame::eExpressionPathOptionCheckPtrVsMember,
2352 var,
2353 err);
Sean Callanan47dc4572011-09-15 02:13:07 +00002354
2355 // If we found a variable in scope, no need to pull up function names
2356 if (err.Success() && var != NULL)
2357 {
2358 AddOneVariable(context, var);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002359 context.m_found.variable = true;
Sean Callanan47dc4572011-09-15 02:13:07 +00002360 }
Greg Clayton8de27c72010-10-15 22:48:33 +00002361 }
Greg Clayton567e7f32011-09-22 04:58:26 +00002362 else if (target)
Sean Callanan47dc4572011-09-15 02:13:07 +00002363 {
Sean Callanan94cd0ca2011-10-12 16:59:31 +00002364 var = FindGlobalVariable (*target,
Sean Callanan38d084f2011-10-12 18:44:30 +00002365 module_sp,
Sean Callanan94cd0ca2011-10-12 16:59:31 +00002366 name,
2367 &namespace_decl,
Greg Clayton567e7f32011-09-22 04:58:26 +00002368 NULL);
Sean Callanan47dc4572011-09-15 02:13:07 +00002369
2370 if (var)
2371 {
2372 AddOneVariable(context, var);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002373 context.m_found.variable = true;
Sean Callanan47dc4572011-09-15 02:13:07 +00002374 }
2375 }
2376
Sean Callanan16c4ec32011-10-12 20:29:25 +00002377 if (!context.m_found.variable)
Greg Clayton8de27c72010-10-15 22:48:33 +00002378 {
Greg Clayton28d5fcc2011-01-27 06:44:37 +00002379 const bool include_symbols = true;
2380 const bool append = false;
Sean Callanana5ec5a32011-10-12 17:38:09 +00002381
Sean Callanan38d084f2011-10-12 18:44:30 +00002382 if (namespace_decl && module_sp)
Sean Callanana5ec5a32011-10-12 17:38:09 +00002383 {
Sean Callanan38d084f2011-10-12 18:44:30 +00002384 module_sp->FindFunctions(name,
2385 &namespace_decl,
2386 eFunctionNameTypeBase,
2387 include_symbols,
2388 append,
2389 sc_list);
Sean Callanana5ec5a32011-10-12 17:38:09 +00002390 }
2391 else
2392 {
2393 target->GetImages().FindFunctions(name,
2394 eFunctionNameTypeBase,
2395 include_symbols,
2396 append,
2397 sc_list);
2398 }
2399
Sean Callanan81974962011-05-08 02:21:26 +00002400 if (sc_list.GetSize())
Greg Clayton8de27c72010-10-15 22:48:33 +00002401 {
Sean Callanan81974962011-05-08 02:21:26 +00002402 Symbol *generic_symbol = NULL;
2403 Symbol *non_extern_symbol = NULL;
2404
2405 for (uint32_t index = 0, num_indices = sc_list.GetSize();
2406 index < num_indices;
2407 ++index)
Greg Clayton8de27c72010-10-15 22:48:33 +00002408 {
Sean Callanan81974962011-05-08 02:21:26 +00002409 SymbolContext sym_ctx;
2410 sc_list.GetContextAtIndex(index, sym_ctx);
2411
2412 if (sym_ctx.function)
2413 {
2414 // TODO only do this if it's a C function; C++ functions may be
2415 // overloaded
Sean Callanan16c4ec32011-10-12 20:29:25 +00002416 if (!context.m_found.function_with_type_info)
Sean Callanan81974962011-05-08 02:21:26 +00002417 AddOneFunction(context, sym_ctx.function, NULL);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002418 context.m_found.function_with_type_info = true;
2419 context.m_found.function = true;
Sean Callanan81974962011-05-08 02:21:26 +00002420 }
2421 else if (sym_ctx.symbol)
2422 {
2423 if (sym_ctx.symbol->IsExternal())
2424 generic_symbol = sym_ctx.symbol;
2425 else
2426 non_extern_symbol = sym_ctx.symbol;
2427 }
Greg Clayton8de27c72010-10-15 22:48:33 +00002428 }
Sean Callanan81974962011-05-08 02:21:26 +00002429
Sean Callanan16c4ec32011-10-12 20:29:25 +00002430 if (!context.m_found.function_with_type_info)
Greg Clayton8de27c72010-10-15 22:48:33 +00002431 {
Sean Callanan81974962011-05-08 02:21:26 +00002432 if (generic_symbol)
Sean Callanan47dc4572011-09-15 02:13:07 +00002433 {
Sean Callanan81974962011-05-08 02:21:26 +00002434 AddOneFunction (context, NULL, generic_symbol);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002435 context.m_found.function = true;
Sean Callanan47dc4572011-09-15 02:13:07 +00002436 }
Sean Callanan81974962011-05-08 02:21:26 +00002437 else if (non_extern_symbol)
Sean Callanan47dc4572011-09-15 02:13:07 +00002438 {
Sean Callanan81974962011-05-08 02:21:26 +00002439 AddOneFunction (context, NULL, non_extern_symbol);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002440 context.m_found.function = true;
Sean Callanan47dc4572011-09-15 02:13:07 +00002441 }
Sean Callanan81974962011-05-08 02:21:26 +00002442 }
Greg Clayton8de27c72010-10-15 22:48:33 +00002443 }
Sean Callanan47dc4572011-09-15 02:13:07 +00002444
Sean Callanan16c4ec32011-10-12 20:29:25 +00002445 if (!context.m_found.variable)
Greg Clayton8de27c72010-10-15 22:48:33 +00002446 {
Sean Callanan16c4ec32011-10-12 20:29:25 +00002447 // We couldn't find a non-symbol variable for this. Now we'll hunt for a generic
Sean Callanan81974962011-05-08 02:21:26 +00002448 // data symbol, and -- if it is found -- treat it as a variable.
2449
Sean Callanan38d084f2011-10-12 18:44:30 +00002450 Symbol *data_symbol = FindGlobalDataSymbol(*target, module_sp, name, &namespace_decl);
Sean Callanan81974962011-05-08 02:21:26 +00002451
2452 if (data_symbol)
Sean Callanan47dc4572011-09-15 02:13:07 +00002453 {
Sean Callanan81974962011-05-08 02:21:26 +00002454 AddOneGenericVariable(context, *data_symbol);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002455 context.m_found.variable = true;
Sean Callanan47dc4572011-09-15 02:13:07 +00002456 }
Greg Clayton6916e352010-11-13 03:52:47 +00002457 }
Sean Callanan92aa6662010-09-07 21:49:41 +00002458 }
Greg Claytone6d72ca2011-06-25 00:44:06 +00002459
Sean Callanan16b53ab2011-10-12 00:12:34 +00002460 ModuleList &images = m_parser_vars->m_sym_ctx.target_sp->GetImages();
Greg Claytone6d72ca2011-06-25 00:44:06 +00002461
Sean Callanan16b53ab2011-10-12 00:12:34 +00002462 ClangASTImporter::NamespaceMapSP namespace_decls(new ClangASTImporter::NamespaceMap);
2463
2464 for (uint32_t i = 0, e = images.GetSize();
2465 i != e;
2466 ++i)
Greg Claytone6d72ca2011-06-25 00:44:06 +00002467 {
Sean Callanan16b53ab2011-10-12 00:12:34 +00002468 ModuleSP image = images.GetModuleAtIndex(i);
Greg Claytone6d72ca2011-06-25 00:44:06 +00002469
Sean Callanan16b53ab2011-10-12 00:12:34 +00002470 if (!image)
2471 continue;
2472
2473 ClangNamespaceDecl namespace_decl;
2474
2475 SymbolVendor *symbol_vendor = image->GetSymbolVendor();
2476
2477 if (!symbol_vendor)
2478 continue;
2479
2480 SymbolContext null_sc;
2481
2482 namespace_decl = symbol_vendor->FindNamespace(null_sc, name);
2483
2484 if (namespace_decl)
2485 {
2486 (*namespace_decls)[image] = namespace_decl;
2487
2488 if (log)
2489 {
2490 std::string s;
2491 llvm::raw_string_ostream os(s);
2492 namespace_decl.GetNamespaceDecl()->print(os);
2493 os.flush();
2494
2495 log->Printf("Found namespace %s in file %s", s.c_str(), image->GetFileSpec().GetFilename().GetCString());
2496 }
2497 }
2498 }
2499
2500 if (!namespace_decls->empty())
2501 {
2502 NamespaceDecl *clang_namespace_decl = AddNamespace(context, namespace_decls);
2503
Greg Claytone6d72ca2011-06-25 00:44:06 +00002504 if (clang_namespace_decl)
Sean Callanan16b53ab2011-10-12 00:12:34 +00002505 clang_namespace_decl->setHasExternalVisibleStorage();
2506 }
Sean Callanan03f64ca2011-10-12 01:39:28 +00002507 }
Sean Callanan3cfbd332010-10-06 00:10:07 +00002508
Sean Callanan38d084f2011-10-12 18:44:30 +00002509 TypeList types;
2510 SymbolContext null_sc;
2511
2512 if (module_sp && namespace_decl)
2513 module_sp->FindTypes(null_sc, name, &namespace_decl, true, 1, types);
2514 else
2515 target->GetImages().FindTypes (null_sc, name, true, 1, types);
2516
2517 if (types.GetSize())
Sean Callanan6df08402010-09-27 23:54:58 +00002518 {
Sean Callanan38d084f2011-10-12 18:44:30 +00002519 TypeSP type_sp = types.GetTypeAtIndex(0);
2520
Sean Callananee8fc722010-11-19 20:20:02 +00002521 if (log)
Sean Callanan6df08402010-09-27 23:54:58 +00002522 {
Sean Callanan38d084f2011-10-12 18:44:30 +00002523 log->Printf("Matching type found for \"%s\": ", name.GetCString());
Sean Callananee8fc722010-11-19 20:20:02 +00002524 StreamString strm;
2525 type_sp->Dump(&strm, true);
2526 log->PutCString (strm.GetData());
2527 }
Greg Clayton2403b5e2010-11-16 02:10:54 +00002528
Sean Callanan38d084f2011-10-12 18:44:30 +00002529 TypeFromUser user_type(type_sp->GetClangFullType(),
2530 type_sp->GetClangAST());
Sean Callanan6df08402010-09-27 23:54:58 +00002531
Sean Callananee8fc722010-11-19 20:20:02 +00002532 AddOneType(context, user_type, false);
Sean Callanan6df08402010-09-27 23:54:58 +00002533 }
Sean Callanan336a0002010-07-17 00:43:37 +00002534}
Greg Claytone6d72ca2011-06-25 00:44:06 +00002535
Sean Callanan9b6898f2011-07-30 02:42:06 +00002536clang::ExternalLoadResult
2537ClangExpressionDeclMap::FindExternalLexicalDecls (const DeclContext *decl_context,
2538 bool (*predicate)(Decl::Kind),
2539 llvm::SmallVectorImpl<Decl*> &decls)
Greg Claytone6d72ca2011-06-25 00:44:06 +00002540{
Greg Claytone6d72ca2011-06-25 00:44:06 +00002541 assert (m_parser_vars.get());
2542
Sean Callanan9b6898f2011-07-30 02:42:06 +00002543 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2544
2545 const Decl *context_decl = dyn_cast<Decl>(decl_context);
2546
2547 if (!context_decl)
2548 return ELR_Failure;
2549
2550 ASTContext *ast_context = &context_decl->getASTContext();
2551
2552 if (log)
Sean Callanan16b53ab2011-10-12 00:12:34 +00002553 {
2554 if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context_decl))
2555 log->Printf("FindExternalLexicalDecls in '%s' (a %s) with %s predicate",
2556 context_named_decl->getNameAsString().c_str(),
2557 context_decl->getDeclKindName(),
2558 (predicate ? "non-null" : "null"));
2559 else if(context_decl)
2560 log->Printf("FindExternalLexicalDecls in a %s with %s predicate",
2561 context_decl->getDeclKindName(),
2562 (predicate ? "non-null" : "null"));
2563 else
2564 log->Printf("FindExternalLexicalDecls in a NULL context with %s predicate",
2565 (predicate ? "non-null" : "null"));
2566 }
Sean Callanan9b6898f2011-07-30 02:42:06 +00002567
2568 Decl *original_decl = NULL;
2569 ASTContext *original_ctx = NULL;
2570
2571 ClangASTImporter *ast_importer = m_parser_vars->GetASTImporter(ast_context);
2572
2573 if (!ast_importer)
2574 return ELR_Failure;
2575
2576 if (!ast_importer->ResolveDeclOrigin(context_decl, &original_decl, &original_ctx))
2577 return ELR_Failure;
Greg Claytone6d72ca2011-06-25 00:44:06 +00002578
2579 if (log)
2580 {
Sean Callanan9b6898f2011-07-30 02:42:06 +00002581 std::string decl_print_string;
2582 llvm::raw_string_ostream decl_print_stream(decl_print_string);
2583 original_decl->print(decl_print_stream);
2584 decl_print_stream.flush();
2585 log->Printf("Original decl:\n%s", decl_print_string.c_str());
2586 }
2587
2588 if (TagDecl *original_tag_decl = dyn_cast<TagDecl>(original_decl))
2589 {
2590 ExternalASTSource *external_source = original_ctx->getExternalSource();
Greg Claytone6d72ca2011-06-25 00:44:06 +00002591
Sean Callananc6139712011-08-11 23:56:13 +00002592 if (external_source)
2593 external_source->CompleteType (original_tag_decl);
Sean Callanan9b6898f2011-07-30 02:42:06 +00002594 }
2595
2596 DeclContext *original_decl_context = dyn_cast<DeclContext>(original_decl);
2597
2598 if (!original_decl_context)
2599 return ELR_Failure;
2600
2601 for (TagDecl::decl_iterator iter = original_decl_context->decls_begin();
2602 iter != original_decl_context->decls_end();
2603 ++iter)
2604 {
2605 Decl *decl = *iter;
2606
2607 if (!predicate || predicate(decl->getKind()))
Greg Claytone6d72ca2011-06-25 00:44:06 +00002608 {
Sean Callanan9b6898f2011-07-30 02:42:06 +00002609 if (log)
2610 {
2611 std::string decl_print_string;
2612 llvm::raw_string_ostream decl_print_stream(decl_print_string);
2613 decl->print(decl_print_stream);
2614 decl_print_stream.flush();
2615 log->Printf(" Adding lexical decl %s", decl_print_string.c_str());
2616 }
2617
2618 Decl *copied_decl = ast_importer->CopyDecl(original_ctx, decl);
Greg Claytone6d72ca2011-06-25 00:44:06 +00002619
Sean Callanan9b6898f2011-07-30 02:42:06 +00002620 decls.push_back(copied_decl);
Greg Claytone6d72ca2011-06-25 00:44:06 +00002621 }
2622 }
2623
Sean Callanan9b6898f2011-07-30 02:42:06 +00002624 return ELR_AlreadyLoaded;
2625}
2626
2627void
2628ClangExpressionDeclMap::CompleteTagDecl (TagDecl *tag_decl)
2629{
2630 assert (m_parser_vars.get());
2631
2632 m_parser_vars->GetASTImporter(&tag_decl->getASTContext())->CompleteTagDecl (tag_decl);
2633}
2634
2635void
2636ClangExpressionDeclMap::CompleteObjCInterfaceDecl (clang::ObjCInterfaceDecl *interface_decl)
2637{
2638 assert (m_parser_vars.get());
2639
2640 m_parser_vars->GetASTImporter(&interface_decl->getASTContext())->CompleteObjCInterfaceDecl (interface_decl);
Greg Claytone6d72ca2011-06-25 00:44:06 +00002641}
2642
Sean Callanan336a0002010-07-17 00:43:37 +00002643Value *
Greg Clayton8de27c72010-10-15 22:48:33 +00002644ClangExpressionDeclMap::GetVariableValue
2645(
2646 ExecutionContext &exe_ctx,
Sean Callanan696cf5f2011-05-07 01:06:41 +00002647 VariableSP var,
Sean Callanan9b6898f2011-07-30 02:42:06 +00002648 ASTContext *parser_ast_context,
Greg Clayton8de27c72010-10-15 22:48:33 +00002649 TypeFromUser *user_type,
2650 TypeFromParser *parser_type
2651)
Chris Lattner24943d22010-06-08 16:52:24 +00002652{
Greg Claytone005f2c2010-11-06 01:53:30 +00002653 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan6184dfe2010-06-23 00:47:48 +00002654
Chris Lattner24943d22010-06-08 16:52:24 +00002655 Type *var_type = var->GetType();
2656
2657 if (!var_type)
2658 {
Sean Callanan810f22d2010-07-16 00:09:46 +00002659 if (log)
2660 log->PutCString("Skipped a definition because it has no type");
Sean Callanan336a0002010-07-17 00:43:37 +00002661 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00002662 }
2663
Greg Clayton04c9c7b2011-02-16 23:00:21 +00002664 clang_type_t var_opaque_type = var_type->GetClangFullType();
Chris Lattner24943d22010-06-08 16:52:24 +00002665
2666 if (!var_opaque_type)
2667 {
Sean Callanan810f22d2010-07-16 00:09:46 +00002668 if (log)
2669 log->PutCString("Skipped a definition because it has no Clang type");
Sean Callanan336a0002010-07-17 00:43:37 +00002670 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00002671 }
2672
Sean Callanan9b6898f2011-07-30 02:42:06 +00002673 ASTContext *ast = var_type->GetClangASTContext().getASTContext();
Chris Lattner24943d22010-06-08 16:52:24 +00002674
Greg Claytonb01000f2011-01-17 03:46:26 +00002675 if (!ast)
Chris Lattner24943d22010-06-08 16:52:24 +00002676 {
Sean Callanan810f22d2010-07-16 00:09:46 +00002677 if (log)
2678 log->PutCString("There is no AST context for the current execution context");
Sean Callanan336a0002010-07-17 00:43:37 +00002679 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00002680 }
2681
Sean Callanan336a0002010-07-17 00:43:37 +00002682 DWARFExpression &var_location_expr = var->LocationExpression();
2683
Chris Lattner24943d22010-06-08 16:52:24 +00002684 std::auto_ptr<Value> var_location(new Value);
2685
Greg Clayton178710c2010-09-14 02:20:48 +00002686 lldb::addr_t loclist_base_load_addr = LLDB_INVALID_ADDRESS;
2687
Greg Clayton567e7f32011-09-22 04:58:26 +00002688 Target *target = exe_ctx.GetTargetPtr();
2689
Greg Clayton178710c2010-09-14 02:20:48 +00002690 if (var_location_expr.IsLocationList())
2691 {
2692 SymbolContext var_sc;
2693 var->CalculateSymbolContext (&var_sc);
Greg Clayton567e7f32011-09-22 04:58:26 +00002694 loclist_base_load_addr = var_sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress (target);
Greg Clayton178710c2010-09-14 02:20:48 +00002695 }
Chris Lattner24943d22010-06-08 16:52:24 +00002696 Error err;
2697
Greg Claytonbdcb6ab2011-01-25 23:55:37 +00002698 if (!var_location_expr.Evaluate(&exe_ctx, ast, NULL, NULL, NULL, loclist_base_load_addr, NULL, *var_location.get(), &err))
Chris Lattner24943d22010-06-08 16:52:24 +00002699 {
Sean Callanan810f22d2010-07-16 00:09:46 +00002700 if (log)
2701 log->Printf("Error evaluating location: %s", err.AsCString());
Sean Callanan336a0002010-07-17 00:43:37 +00002702 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00002703 }
Greg Claytonb01000f2011-01-17 03:46:26 +00002704
Sean Callanan58baaad2011-07-08 00:39:14 +00002705 void *type_to_use = NULL;
Sean Callanan336a0002010-07-17 00:43:37 +00002706
Sean Callananf328c9f2010-07-20 23:31:16 +00002707 if (parser_ast_context)
2708 {
Greg Claytonb01000f2011-01-17 03:46:26 +00002709 type_to_use = GuardedCopyType(parser_ast_context, ast, var_opaque_type);
Sean Callananf328c9f2010-07-20 23:31:16 +00002710
Sean Callanan4b5eec62010-11-20 02:19:29 +00002711 if (!type_to_use)
2712 {
2713 if (log)
2714 log->Printf("Couldn't copy a variable's type into the parser's AST context");
2715
2716 return NULL;
2717 }
2718
Sean Callananf328c9f2010-07-20 23:31:16 +00002719 if (parser_type)
2720 *parser_type = TypeFromParser(type_to_use, parser_ast_context);
2721 }
Sean Callanan336a0002010-07-17 00:43:37 +00002722 else
2723 type_to_use = var_opaque_type;
Chris Lattner24943d22010-06-08 16:52:24 +00002724
2725 if (var_location.get()->GetContextType() == Value::eContextTypeInvalid)
Greg Clayton6916e352010-11-13 03:52:47 +00002726 var_location.get()->SetContext(Value::eContextTypeClangType, type_to_use);
Chris Lattner24943d22010-06-08 16:52:24 +00002727
2728 if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress)
2729 {
2730 SymbolContext var_sc;
2731 var->CalculateSymbolContext(&var_sc);
Sean Callanan336a0002010-07-17 00:43:37 +00002732
Chris Lattner24943d22010-06-08 16:52:24 +00002733 if (!var_sc.module_sp)
Sean Callanan336a0002010-07-17 00:43:37 +00002734 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00002735
2736 ObjectFile *object_file = var_sc.module_sp->GetObjectFile();
2737
2738 if (!object_file)
Sean Callanan336a0002010-07-17 00:43:37 +00002739 return NULL;
2740
Chris Lattner24943d22010-06-08 16:52:24 +00002741 Address so_addr(var_location->GetScalar().ULongLong(), object_file->GetSectionList());
2742
Greg Clayton567e7f32011-09-22 04:58:26 +00002743 lldb::addr_t load_addr = so_addr.GetLoadAddress(target);
Chris Lattner24943d22010-06-08 16:52:24 +00002744
Sean Callanan47dc4572011-09-15 02:13:07 +00002745 if (load_addr != LLDB_INVALID_ADDRESS)
2746 {
2747 var_location->GetScalar() = load_addr;
2748 var_location->SetValueType(Value::eValueTypeLoadAddress);
2749 }
Chris Lattner24943d22010-06-08 16:52:24 +00002750 }
2751
Sean Callananf328c9f2010-07-20 23:31:16 +00002752 if (user_type)
Greg Claytonb01000f2011-01-17 03:46:26 +00002753 *user_type = TypeFromUser(var_opaque_type, ast);
Sean Callanan336a0002010-07-17 00:43:37 +00002754
2755 return var_location.release();
2756}
2757
2758void
Sean Callanan696cf5f2011-05-07 01:06:41 +00002759ClangExpressionDeclMap::AddOneVariable (NameSearchContext &context, VariableSP var)
Sean Callanan336a0002010-07-17 00:43:37 +00002760{
Sean Callananaa301c42010-12-03 01:38:59 +00002761 assert (m_parser_vars.get());
2762
Greg Claytone005f2c2010-11-06 01:53:30 +00002763 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan47dc4572011-09-15 02:13:07 +00002764
Sean Callananf328c9f2010-07-20 23:31:16 +00002765 TypeFromUser ut;
2766 TypeFromParser pt;
Sean Callanan336a0002010-07-17 00:43:37 +00002767
Sean Callananaa301c42010-12-03 01:38:59 +00002768 Value *var_location = GetVariableValue (*m_parser_vars->m_exe_ctx,
Greg Clayton8de27c72010-10-15 22:48:33 +00002769 var,
2770 context.GetASTContext(),
2771 &ut,
2772 &pt);
Sean Callanan336a0002010-07-17 00:43:37 +00002773
Sean Callanan4b5eec62010-11-20 02:19:29 +00002774 if (!var_location)
2775 return;
2776
Sean Callanan6a925532011-01-13 08:53:35 +00002777 NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(pt.GetASTContext(), pt.GetOpaqueQualType()));
Greg Clayton8de27c72010-10-15 22:48:33 +00002778 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton427f2902010-12-14 02:59:59 +00002779 ConstString entity_name(decl_name.c_str());
Jim Inghamfa3a16a2011-03-31 00:19:25 +00002780 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
2781 entity_name,
Greg Clayton427f2902010-12-14 02:59:59 +00002782 ut,
Sean Callanan47dc4572011-09-15 02:13:07 +00002783 m_parser_vars->m_target_info.byte_order,
2784 m_parser_vars->m_target_info.address_byte_size));
Greg Clayton427f2902010-12-14 02:59:59 +00002785 assert (entity.get());
2786 entity->EnableParserVars();
2787 entity->m_parser_vars->m_parser_type = pt;
2788 entity->m_parser_vars->m_named_decl = var_decl;
2789 entity->m_parser_vars->m_llvm_value = NULL;
2790 entity->m_parser_vars->m_lldb_value = var_location;
Sean Callanan696cf5f2011-05-07 01:06:41 +00002791 entity->m_parser_vars->m_lldb_var = var;
Chris Lattner24943d22010-06-08 16:52:24 +00002792
Sean Callanan810f22d2010-07-16 00:09:46 +00002793 if (log)
Greg Clayton8de27c72010-10-15 22:48:33 +00002794 {
Sean Callanana0744822010-11-01 23:22:47 +00002795 std::string var_decl_print_string;
2796 llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
2797 var_decl->print(var_decl_print_stream);
2798 var_decl_print_stream.flush();
2799
2800 log->Printf("Found variable %s, returned %s", decl_name.c_str(), var_decl_print_string.c_str());
Sean Callanan6e74dbb2011-02-01 23:43:26 +00002801
Sean Callanan9b6898f2011-07-30 02:42:06 +00002802 //if (log->GetVerbose())
2803 //{
2804 // StreamString var_decl_dump_string;
2805 // ASTDumper::DumpDecl(var_decl_dump_string, var_decl);
2806 // log->Printf("%s\n", var_decl_dump_string.GetData());
2807 //}
Greg Clayton8de27c72010-10-15 22:48:33 +00002808 }
Sean Callanan8f0dc342010-06-22 23:46:24 +00002809}
2810
2811void
Sean Callanana48fe162010-08-11 03:57:18 +00002812ClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
Greg Clayton427f2902010-12-14 02:59:59 +00002813 ClangExpressionVariableSP &pvar_sp)
Sean Callanana48fe162010-08-11 03:57:18 +00002814{
Greg Claytone005f2c2010-11-06 01:53:30 +00002815 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan45690fe2010-08-30 22:17:16 +00002816
Greg Clayton427f2902010-12-14 02:59:59 +00002817 TypeFromUser user_type (pvar_sp->GetTypeFromUser());
Sean Callanana48fe162010-08-11 03:57:18 +00002818
Greg Clayton427f2902010-12-14 02:59:59 +00002819 TypeFromParser parser_type (GuardedCopyType(context.GetASTContext(),
2820 user_type.GetASTContext(),
2821 user_type.GetOpaqueQualType()),
2822 context.GetASTContext());
Sean Callanana48fe162010-08-11 03:57:18 +00002823
Sean Callanan6a925532011-01-13 08:53:35 +00002824 NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(parser_type.GetASTContext(), parser_type.GetOpaqueQualType()));
Sean Callanan8c127202010-08-23 23:09:38 +00002825
Greg Clayton427f2902010-12-14 02:59:59 +00002826 pvar_sp->EnableParserVars();
2827 pvar_sp->m_parser_vars->m_parser_type = parser_type;
2828 pvar_sp->m_parser_vars->m_named_decl = var_decl;
2829 pvar_sp->m_parser_vars->m_llvm_value = NULL;
2830 pvar_sp->m_parser_vars->m_lldb_value = NULL;
Sean Callanan45690fe2010-08-30 22:17:16 +00002831
2832 if (log)
Sean Callanana0744822010-11-01 23:22:47 +00002833 {
2834 std::string var_decl_print_string;
2835 llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
2836 var_decl->print(var_decl_print_stream);
2837 var_decl_print_stream.flush();
2838
Greg Clayton427f2902010-12-14 02:59:59 +00002839 log->Printf("Added pvar %s, returned %s", pvar_sp->GetName().GetCString(), var_decl_print_string.c_str());
Sean Callanana0744822010-11-01 23:22:47 +00002840 }
Sean Callanana48fe162010-08-11 03:57:18 +00002841}
2842
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002843void
Sean Callanan81974962011-05-08 02:21:26 +00002844ClangExpressionDeclMap::AddOneGenericVariable(NameSearchContext &context,
2845 Symbol &symbol)
2846{
2847 assert(m_parser_vars.get());
2848
2849 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2850
Greg Clayton567e7f32011-09-22 04:58:26 +00002851 Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
2852
2853 if (target == NULL)
2854 return;
2855
2856 ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
Sean Callanan81974962011-05-08 02:21:26 +00002857
Sean Callananfb3058e2011-05-12 23:54:16 +00002858 TypeFromUser user_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(scratch_ast_context, true)),
Sean Callanan81974962011-05-08 02:21:26 +00002859 scratch_ast_context);
2860
Sean Callananfb3058e2011-05-12 23:54:16 +00002861 TypeFromParser parser_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(context.GetASTContext(), true)),
Sean Callanan81974962011-05-08 02:21:26 +00002862 context.GetASTContext());
2863
Sean Callananfb3058e2011-05-12 23:54:16 +00002864 NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
Sean Callanan81974962011-05-08 02:21:26 +00002865
2866 std::string decl_name(context.m_decl_name.getAsString());
2867 ConstString entity_name(decl_name.c_str());
2868 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
2869 entity_name,
2870 user_type,
Sean Callanan47dc4572011-09-15 02:13:07 +00002871 m_parser_vars->m_target_info.byte_order,
2872 m_parser_vars->m_target_info.address_byte_size));
Sean Callanan81974962011-05-08 02:21:26 +00002873 assert (entity.get());
Sean Callanan81974962011-05-08 02:21:26 +00002874
2875 std::auto_ptr<Value> symbol_location(new Value);
2876
2877 AddressRange &symbol_range = symbol.GetAddressRangeRef();
2878 Address &symbol_address = symbol_range.GetBaseAddress();
Greg Clayton567e7f32011-09-22 04:58:26 +00002879 lldb::addr_t symbol_load_addr = symbol_address.GetLoadAddress(target);
Sean Callanan81974962011-05-08 02:21:26 +00002880
2881 symbol_location->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
2882 symbol_location->GetScalar() = symbol_load_addr;
2883 symbol_location->SetValueType(Value::eValueTypeLoadAddress);
2884
Sean Callananfb3058e2011-05-12 23:54:16 +00002885 entity->EnableParserVars();
Sean Callanan81974962011-05-08 02:21:26 +00002886 entity->m_parser_vars->m_parser_type = parser_type;
2887 entity->m_parser_vars->m_named_decl = var_decl;
2888 entity->m_parser_vars->m_llvm_value = NULL;
2889 entity->m_parser_vars->m_lldb_value = symbol_location.release();
2890 entity->m_parser_vars->m_lldb_sym = &symbol;
Sean Callananfb3058e2011-05-12 23:54:16 +00002891 //entity->m_flags |= ClangExpressionVariable::EVUnknownType;
Sean Callanan81974962011-05-08 02:21:26 +00002892
2893 if (log)
2894 {
2895 std::string var_decl_print_string;
2896 llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
2897 var_decl->print(var_decl_print_stream);
2898 var_decl_print_stream.flush();
2899
2900 log->Printf("Found variable %s, returned %s", decl_name.c_str(), var_decl_print_string.c_str());
2901
Sean Callanan9b6898f2011-07-30 02:42:06 +00002902 //if (log->GetVerbose())
2903 //{
2904 // StreamString var_decl_dump_string;
2905 // ASTDumper::DumpDecl(var_decl_dump_string, var_decl);
2906 // log->Printf("%s\n", var_decl_dump_string.GetData());
2907 //}
Sean Callanan81974962011-05-08 02:21:26 +00002908 }
2909}
2910
Sean Callananfb3058e2011-05-12 23:54:16 +00002911bool
2912ClangExpressionDeclMap::ResolveUnknownTypes()
2913{
2914 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Greg Clayton567e7f32011-09-22 04:58:26 +00002915 Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
2916
2917 ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
Sean Callananfb3058e2011-05-12 23:54:16 +00002918
2919 for (size_t index = 0, num_entities = m_found_entities.GetSize();
2920 index < num_entities;
2921 ++index)
2922 {
2923 ClangExpressionVariableSP entity = m_found_entities.GetVariableAtIndex(index);
2924
2925 if (entity->m_flags & ClangExpressionVariable::EVUnknownType)
2926 {
2927 const NamedDecl *named_decl = entity->m_parser_vars->m_named_decl;
2928 const VarDecl *var_decl = dyn_cast<VarDecl>(named_decl);
2929
2930 if (!var_decl)
2931 {
2932 if (log)
2933 log->Printf("Entity of unknown type does not have a VarDecl");
2934 return false;
2935 }
2936
2937 if (log)
2938 {
2939 std::string var_decl_print_string;
2940 llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
2941 var_decl->print(var_decl_print_stream);
2942 var_decl_print_stream.flush();
2943
2944 log->Printf("Variable of unknown type now has Decl %s", var_decl_print_string.c_str());
2945 }
2946
2947 QualType var_type = var_decl->getType();
2948 TypeFromParser parser_type(var_type.getAsOpaquePtr(), &var_decl->getASTContext());
2949
2950 lldb::clang_type_t copied_type = ClangASTContext::CopyType(scratch_ast_context, &var_decl->getASTContext(), var_type.getAsOpaquePtr());
2951
2952 TypeFromUser user_type(copied_type, scratch_ast_context);
2953
2954 entity->m_parser_vars->m_lldb_value->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
2955 entity->m_parser_vars->m_parser_type = parser_type;
2956
2957 entity->SetClangAST(user_type.GetASTContext());
2958 entity->SetClangType(user_type.GetOpaqueQualType());
2959
2960 entity->m_flags &= ~(ClangExpressionVariable::EVUnknownType);
2961 }
2962 }
2963
2964 return true;
2965}
2966
Sean Callanan81974962011-05-08 02:21:26 +00002967void
Greg Clayton427f2902010-12-14 02:59:59 +00002968ClangExpressionDeclMap::AddOneRegister (NameSearchContext &context,
2969 const RegisterInfo *reg_info)
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002970{
2971 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2972
2973 void *ast_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize(context.GetASTContext(),
2974 reg_info->encoding,
2975 reg_info->byte_size * 8);
2976
2977 if (!ast_type)
2978 {
Johnny Chen122204d2011-08-09 22:52:27 +00002979 if (log)
2980 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 +00002981 return;
2982 }
2983
Greg Clayton427f2902010-12-14 02:59:59 +00002984 TypeFromParser parser_type (ast_type,
2985 context.GetASTContext());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002986
2987 NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
2988
Jim Inghamfa3a16a2011-03-31 00:19:25 +00002989 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope(),
Sean Callanan47dc4572011-09-15 02:13:07 +00002990 m_parser_vars->m_target_info.byte_order,
2991 m_parser_vars->m_target_info.address_byte_size));
Greg Clayton427f2902010-12-14 02:59:59 +00002992 assert (entity.get());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002993 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton427f2902010-12-14 02:59:59 +00002994 entity->SetName (ConstString (decl_name.c_str()));
2995 entity->SetRegisterInfo (reg_info);
2996 entity->EnableParserVars();
2997 entity->m_parser_vars->m_parser_type = parser_type;
2998 entity->m_parser_vars->m_named_decl = var_decl;
2999 entity->m_parser_vars->m_llvm_value = NULL;
3000 entity->m_parser_vars->m_lldb_value = NULL;
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00003001
3002 if (log)
3003 {
3004 std::string var_decl_print_string;
3005 llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
3006 var_decl->print(var_decl_print_stream);
3007 var_decl_print_stream.flush();
3008
3009 log->Printf("Added register %s, returned %s", context.m_decl_name.getAsString().c_str(), var_decl_print_string.c_str());
3010 }
3011}
3012
Sean Callanan9b6898f2011-07-30 02:42:06 +00003013NamespaceDecl *
Sean Callanan16b53ab2011-10-12 00:12:34 +00003014ClangExpressionDeclMap::AddNamespace (NameSearchContext &context, ClangASTImporter::NamespaceMapSP &namespace_decls)
Greg Clayton6916e352010-11-13 03:52:47 +00003015{
Sean Callanan16b53ab2011-10-12 00:12:34 +00003016 if (namespace_decls.empty())
3017 return NULL;
3018
Greg Clayton6916e352010-11-13 03:52:47 +00003019 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
3020
Greg Claytone6d72ca2011-06-25 00:44:06 +00003021 assert (m_parser_vars.get());
3022
Sean Callanan16b53ab2011-10-12 00:12:34 +00003023 const ClangNamespaceDecl &namespace_decl = namespace_decls->begin()->second;
3024
Sean Callanan9b6898f2011-07-30 02:42:06 +00003025 Decl *copied_decl = m_parser_vars->GetASTImporter(context.GetASTContext())->CopyDecl(namespace_decl.GetASTContext(),
Sean Callanan16b53ab2011-10-12 00:12:34 +00003026 namespace_decl.GetNamespaceDecl());
3027
3028 NamespaceDecl *copied_namespace_decl = dyn_cast<NamespaceDecl>(copied_decl);
3029
3030 m_parser_vars->GetASTImporter(context.GetASTContext())->RegisterNamespaceMap(copied_namespace_decl, namespace_decls);
3031
Sean Callanan9b6898f2011-07-30 02:42:06 +00003032 return dyn_cast<NamespaceDecl>(copied_decl);
Greg Clayton6916e352010-11-13 03:52:47 +00003033}
3034
Sean Callanana48fe162010-08-11 03:57:18 +00003035void
Greg Claytonda7af842011-05-18 22:01:49 +00003036ClangExpressionDeclMap::AddOneFunction (NameSearchContext &context,
3037 Function* fun,
3038 Symbol* symbol)
Sean Callanan8f0dc342010-06-22 23:46:24 +00003039{
Sean Callananaa301c42010-12-03 01:38:59 +00003040 assert (m_parser_vars.get());
3041
Greg Claytone005f2c2010-11-06 01:53:30 +00003042 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan8f0dc342010-06-22 23:46:24 +00003043
Sean Callanan58baaad2011-07-08 00:39:14 +00003044 NamedDecl *fun_decl = NULL;
Sean Callanan8f0dc342010-06-22 23:46:24 +00003045 std::auto_ptr<Value> fun_location(new Value);
Sean Callanan58baaad2011-07-08 00:39:14 +00003046 const Address *fun_address = NULL;
Sean Callanan8f0dc342010-06-22 23:46:24 +00003047
Sean Callanan0fc73582010-07-27 00:55:47 +00003048 // only valid for Functions, not for Symbols
3049 void *fun_opaque_type = NULL;
Sean Callanan9b6898f2011-07-30 02:42:06 +00003050 ASTContext *fun_ast_context = NULL;
Sean Callanan0fc73582010-07-27 00:55:47 +00003051
3052 if (fun)
3053 {
3054 Type *fun_type = fun->GetType();
3055
3056 if (!fun_type)
3057 {
3058 if (log)
3059 log->PutCString("Skipped a function because it has no type");
3060 return;
3061 }
3062
Greg Clayton04c9c7b2011-02-16 23:00:21 +00003063 fun_opaque_type = fun_type->GetClangFullType();
Sean Callanan0fc73582010-07-27 00:55:47 +00003064
3065 if (!fun_opaque_type)
3066 {
3067 if (log)
3068 log->PutCString("Skipped a function because it has no Clang type");
3069 return;
3070 }
3071
3072 fun_address = &fun->GetAddressRange().GetBaseAddress();
3073
Greg Claytonb01000f2011-01-17 03:46:26 +00003074 fun_ast_context = fun_type->GetClangASTContext().getASTContext();
Sean Callananee8fc722010-11-19 20:20:02 +00003075 void *copied_type = GuardedCopyType(context.GetASTContext(), fun_ast_context, fun_opaque_type);
Sean Callanan0fc73582010-07-27 00:55:47 +00003076
3077 fun_decl = context.AddFunDecl(copied_type);
3078 }
3079 else if (symbol)
3080 {
3081 fun_address = &symbol->GetAddressRangeRef().GetBaseAddress();
3082
3083 fun_decl = context.AddGenericFunDecl();
3084 }
3085 else
3086 {
3087 if (log)
3088 log->PutCString("AddOneFunction called with no function and no symbol");
3089 return;
3090 }
3091
Greg Clayton567e7f32011-09-22 04:58:26 +00003092 Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
3093
3094 lldb::addr_t load_addr = fun_address->GetCallableLoadAddress(target);
Sean Callanan8f0dc342010-06-22 23:46:24 +00003095 fun_location->SetValueType(Value::eValueTypeLoadAddress);
3096 fun_location->GetScalar() = load_addr;
3097
Jim Inghamfa3a16a2011-03-31 00:19:25 +00003098 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
Sean Callanan47dc4572011-09-15 02:13:07 +00003099 m_parser_vars->m_target_info.byte_order,
3100 m_parser_vars->m_target_info.address_byte_size));
Greg Clayton427f2902010-12-14 02:59:59 +00003101 assert (entity.get());
Greg Clayton8de27c72010-10-15 22:48:33 +00003102 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton427f2902010-12-14 02:59:59 +00003103 entity->SetName(ConstString(decl_name.c_str()));
3104 entity->SetClangType (fun_opaque_type);
3105 entity->SetClangAST (fun_ast_context);
Sean Callanan8f0dc342010-06-22 23:46:24 +00003106
Greg Clayton427f2902010-12-14 02:59:59 +00003107 entity->EnableParserVars();
3108 entity->m_parser_vars->m_named_decl = fun_decl;
3109 entity->m_parser_vars->m_llvm_value = NULL;
3110 entity->m_parser_vars->m_lldb_value = fun_location.release();
Sean Callanan8c127202010-08-23 23:09:38 +00003111
Sean Callanan810f22d2010-07-16 00:09:46 +00003112 if (log)
Greg Clayton8de27c72010-10-15 22:48:33 +00003113 {
Sean Callanana0744822010-11-01 23:22:47 +00003114 std::string fun_decl_print_string;
3115 llvm::raw_string_ostream fun_decl_print_stream(fun_decl_print_string);
3116 fun_decl->print(fun_decl_print_stream);
3117 fun_decl_print_stream.flush();
3118
3119 log->Printf("Found %s function %s, returned %s", (fun ? "specific" : "generic"), decl_name.c_str(), fun_decl_print_string.c_str());
Greg Clayton8de27c72010-10-15 22:48:33 +00003120 }
Chris Lattner24943d22010-06-08 16:52:24 +00003121}
Sean Callanan93a4b1a2010-08-04 01:02:13 +00003122
3123void
3124ClangExpressionDeclMap::AddOneType(NameSearchContext &context,
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00003125 TypeFromUser &ut,
3126 bool add_method)
Sean Callanan93a4b1a2010-08-04 01:02:13 +00003127{
Sean Callanan9b6898f2011-07-30 02:42:06 +00003128 ASTContext *parser_ast_context = context.GetASTContext();
3129 ASTContext *user_ast_context = ut.GetASTContext();
Sean Callanan93a4b1a2010-08-04 01:02:13 +00003130
Sean Callananee8fc722010-11-19 20:20:02 +00003131 void *copied_type = GuardedCopyType(parser_ast_context, user_ast_context, ut.GetOpaqueQualType());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00003132
3133 TypeFromParser parser_type(copied_type, parser_ast_context);
3134
3135 if (add_method && ClangASTContext::IsAggregateType(copied_type))
3136 {
3137 void *args[1];
3138
3139 args[0] = ClangASTContext::GetVoidPtrType(parser_ast_context, false);
3140
3141 void *method_type = ClangASTContext::CreateFunctionType (parser_ast_context,
3142 ClangASTContext::GetBuiltInType_void(parser_ast_context),
3143 args,
3144 1,
3145 false,
3146 ClangASTContext::GetTypeQualifiers(copied_type));
Greg Clayton30449d52010-10-01 02:31:07 +00003147
Greg Clayton1d8173f2010-09-24 05:15:53 +00003148 const bool is_virtual = false;
3149 const bool is_static = false;
3150 const bool is_inline = false;
Greg Clayton30449d52010-10-01 02:31:07 +00003151 const bool is_explicit = false;
3152
Greg Clayton1d8173f2010-09-24 05:15:53 +00003153 ClangASTContext::AddMethodToCXXRecordType (parser_ast_context,
3154 copied_type,
Greg Clayton8de27c72010-10-15 22:48:33 +00003155 "$__lldb_expr",
Greg Clayton1d8173f2010-09-24 05:15:53 +00003156 method_type,
3157 lldb::eAccessPublic,
3158 is_virtual,
3159 is_static,
Greg Clayton30449d52010-10-01 02:31:07 +00003160 is_inline,
3161 is_explicit);
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00003162 }
Sean Callanan93a4b1a2010-08-04 01:02:13 +00003163
3164 context.AddTypeDecl(copied_type);
3165}
Sean Callananee8fc722010-11-19 20:20:02 +00003166
3167void *
3168ClangExpressionDeclMap::GuardedCopyType (ASTContext *dest_context,
3169 ASTContext *source_context,
3170 void *clang_type)
3171{
Sean Callananaa301c42010-12-03 01:38:59 +00003172 assert (m_parser_vars.get());
3173
3174 m_parser_vars->m_ignore_lookups = true;
Sean Callananee8fc722010-11-19 20:20:02 +00003175
Greg Claytone6d72ca2011-06-25 00:44:06 +00003176 lldb_private::ClangASTImporter *importer = m_parser_vars->GetASTImporter(dest_context);
3177
3178 QualType ret_qual_type = importer->CopyType (source_context,
3179 QualType::getFromOpaquePtr(clang_type));
3180
3181 void *ret = ret_qual_type.getAsOpaquePtr();
Sean Callananee8fc722010-11-19 20:20:02 +00003182
Sean Callananaa301c42010-12-03 01:38:59 +00003183 m_parser_vars->m_ignore_lookups = false;
Sean Callananee8fc722010-11-19 20:20:02 +00003184
3185 return ret;
3186}