blob: 10939324897a691c045d9475b51eb607097712db [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- ClangExpressionDeclMap.cpp -----------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "lldb/Expression/ClangExpressionDeclMap.h"
11
12// C Includes
13// C++ Includes
14// Other libraries and framework includes
15// Project includes
Sean Callanan47a5c4c2010-09-23 03:01:22 +000016#include "clang/AST/DeclarationName.h"
Sean Callanana0744822010-11-01 23:22:47 +000017#include "clang/AST/Decl.h"
Chris Lattner24943d22010-06-08 16:52:24 +000018#include "lldb/lldb-private.h"
19#include "lldb/Core/Address.h"
Sean Callanan810f22d2010-07-16 00:09:46 +000020#include "lldb/Core/Error.h"
Sean Callanan6184dfe2010-06-23 00:47:48 +000021#include "lldb/Core/Log.h"
Chris Lattner24943d22010-06-08 16:52:24 +000022#include "lldb/Core/Module.h"
Greg Clayton061b79d2011-05-09 20:18:18 +000023#include "lldb/Core/RegisterValue.h"
Sean Callanan05a5a1b2010-12-16 03:17:46 +000024#include "lldb/Core/ValueObjectConstResult.h"
Sean Callanan6e74dbb2011-02-01 23:43:26 +000025#include "lldb/Expression/ASTDumper.h"
Chris Lattner24943d22010-06-08 16:52:24 +000026#include "lldb/Expression/ClangASTSource.h"
Sean Callanana48fe162010-08-11 03:57:18 +000027#include "lldb/Expression/ClangPersistentVariables.h"
Greg Claytoncd548032011-02-01 01:31:41 +000028#include "lldb/Host/Endian.h"
Chris Lattner24943d22010-06-08 16:52:24 +000029#include "lldb/Symbol/ClangASTContext.h"
Greg Clayton6916e352010-11-13 03:52:47 +000030#include "lldb/Symbol/ClangNamespaceDecl.h"
Chris Lattner24943d22010-06-08 16:52:24 +000031#include "lldb/Symbol/CompileUnit.h"
32#include "lldb/Symbol/Function.h"
33#include "lldb/Symbol/ObjectFile.h"
34#include "lldb/Symbol/SymbolContext.h"
Sean Callanan16b53ab2011-10-12 00:12:34 +000035#include "lldb/Symbol/SymbolVendor.h"
Chris Lattner24943d22010-06-08 16:52:24 +000036#include "lldb/Symbol/Type.h"
37#include "lldb/Symbol/TypeList.h"
38#include "lldb/Symbol/Variable.h"
39#include "lldb/Symbol/VariableList.h"
Sean Callananf328c9f2010-07-20 23:31:16 +000040#include "lldb/Target/ExecutionContext.h"
Sean Callanan810f22d2010-07-16 00:09:46 +000041#include "lldb/Target/Process.h"
Sean Callanan17c6a052010-10-05 20:18:48 +000042#include "lldb/Target/RegisterContext.h"
Chris Lattner24943d22010-06-08 16:52:24 +000043#include "lldb/Target/StackFrame.h"
Sean Callananf328c9f2010-07-20 23:31:16 +000044#include "lldb/Target/Target.h"
Jim Ingham78b9ee82010-12-07 01:56:02 +000045#include "lldb/Target/Thread.h"
Chris Lattner24943d22010-06-08 16:52:24 +000046
Greg Clayton3bc52d02010-11-14 22:13:40 +000047using namespace lldb;
Chris Lattner24943d22010-06-08 16:52:24 +000048using namespace lldb_private;
49using namespace clang;
50
Sean Callanan6a925532011-01-13 08:53:35 +000051ClangExpressionDeclMap::ClangExpressionDeclMap (bool keep_result_in_memory) :
Greg Clayton8de27c72010-10-15 22:48:33 +000052 m_found_entities (),
53 m_struct_members (),
Stephen Wilsondbeb3e12011-04-11 19:41:40 +000054 m_keep_result_in_memory (keep_result_in_memory),
Sean Callananaa301c42010-12-03 01:38:59 +000055 m_parser_vars (),
Stephen Wilsondbeb3e12011-04-11 19:41:40 +000056 m_struct_vars ()
Chris Lattner24943d22010-06-08 16:52:24 +000057{
Sean Callananaa301c42010-12-03 01:38:59 +000058 EnableStructVars();
Chris Lattner24943d22010-06-08 16:52:24 +000059}
60
61ClangExpressionDeclMap::~ClangExpressionDeclMap()
Sean Callananaa301c42010-12-03 01:38:59 +000062{
Sean Callanan6d284ef2011-10-12 22:20:02 +000063 // Note: The model is now that the parser's AST context and all associated
64 // data does not vanish until the expression has been executed. This means
65 // that valuable lookup data (like namespaces) doesn't vanish, but
66
67 DidParse();
Sean Callananaa301c42010-12-03 01:38:59 +000068 DidDematerialize();
69 DisableStructVars();
70}
Sean Callananc2c6f772010-10-26 00:31:56 +000071
Sean Callanan166ba102011-08-01 18:18:33 +000072bool
Greg Clayton427f2902010-12-14 02:59:59 +000073ClangExpressionDeclMap::WillParse(ExecutionContext &exe_ctx)
Sean Callananaa301c42010-12-03 01:38:59 +000074{
75 EnableParserVars();
76 m_parser_vars->m_exe_ctx = &exe_ctx;
Greg Clayton567e7f32011-09-22 04:58:26 +000077
78 Target *target = exe_ctx.GetTargetPtr();
79 if (exe_ctx.GetFramePtr())
80 m_parser_vars->m_sym_ctx = exe_ctx.GetFramePtr()->GetSymbolContext(lldb::eSymbolContextEverything);
81 else if (exe_ctx.GetThreadPtr())
82 m_parser_vars->m_sym_ctx = exe_ctx.GetThreadPtr()->GetStackFrameAtIndex(0)->GetSymbolContext(lldb::eSymbolContextEverything);
83 else if (exe_ctx.GetProcessPtr())
Greg Clayton987c7eb2011-09-17 08:33:22 +000084 {
85 m_parser_vars->m_sym_ctx.Clear();
Greg Clayton567e7f32011-09-22 04:58:26 +000086 m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP();
Greg Clayton987c7eb2011-09-17 08:33:22 +000087 }
Greg Clayton567e7f32011-09-22 04:58:26 +000088 else if (target)
Greg Clayton987c7eb2011-09-17 08:33:22 +000089 {
90 m_parser_vars->m_sym_ctx.Clear();
Greg Clayton567e7f32011-09-22 04:58:26 +000091 m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP();
Greg Clayton987c7eb2011-09-17 08:33:22 +000092 }
Sean Callanan97ad47f2011-09-15 18:41:04 +000093
Greg Clayton567e7f32011-09-22 04:58:26 +000094 if (target)
95 {
96 m_parser_vars->m_persistent_vars = &target->GetPersistentVariables();
Sean Callanan166ba102011-08-01 18:18:33 +000097
Greg Clayton567e7f32011-09-22 04:58:26 +000098 if (!target->GetScratchClangASTContext())
99 return false;
100 }
Sean Callanan166ba102011-08-01 18:18:33 +0000101
Sean Callanan47dc4572011-09-15 02:13:07 +0000102 m_parser_vars->m_target_info = GetTargetInfo();
103
Sean Callanan166ba102011-08-01 18:18:33 +0000104 return true;
Sean Callananaa301c42010-12-03 01:38:59 +0000105}
106
Greg Clayton427f2902010-12-14 02:59:59 +0000107void
108ClangExpressionDeclMap::DidParse()
Sean Callananaa301c42010-12-03 01:38:59 +0000109{
110 if (m_parser_vars.get())
111 {
Greg Clayton427f2902010-12-14 02:59:59 +0000112 for (size_t entity_index = 0, num_entities = m_found_entities.GetSize();
Sean Callananaa301c42010-12-03 01:38:59 +0000113 entity_index < num_entities;
114 ++entity_index)
115 {
Greg Clayton427f2902010-12-14 02:59:59 +0000116 ClangExpressionVariableSP var_sp(m_found_entities.GetVariableAtIndex(entity_index));
117 if (var_sp &&
118 var_sp->m_parser_vars.get() &&
119 var_sp->m_parser_vars->m_lldb_value)
120 delete var_sp->m_parser_vars->m_lldb_value;
Sean Callananaa301c42010-12-03 01:38:59 +0000121
Greg Clayton427f2902010-12-14 02:59:59 +0000122 var_sp->DisableParserVars();
Sean Callananaa301c42010-12-03 01:38:59 +0000123 }
124
Greg Clayton427f2902010-12-14 02:59:59 +0000125 for (size_t pvar_index = 0, num_pvars = m_parser_vars->m_persistent_vars->GetSize();
Sean Callananaa301c42010-12-03 01:38:59 +0000126 pvar_index < num_pvars;
127 ++pvar_index)
128 {
Greg Clayton427f2902010-12-14 02:59:59 +0000129 ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariableAtIndex(pvar_index));
130 if (pvar_sp)
131 pvar_sp->DisableParserVars();
Sean Callananaa301c42010-12-03 01:38:59 +0000132 }
133
134 DisableParserVars();
Sean Callanan7a60b942010-10-08 01:58:41 +0000135 }
Chris Lattner24943d22010-06-08 16:52:24 +0000136}
137
Sean Callanan8bce6652010-07-13 21:41:46 +0000138// Interface for IRForTarget
139
Sean Callanan47dc4572011-09-15 02:13:07 +0000140ClangExpressionDeclMap::TargetInfo
141ClangExpressionDeclMap::GetTargetInfo()
142{
143 assert (m_parser_vars.get());
144
145 TargetInfo ret;
146
147 ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
Greg Clayton567e7f32011-09-22 04:58:26 +0000148 if (exe_ctx)
Sean Callanan47dc4572011-09-15 02:13:07 +0000149 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000150 Process *process = exe_ctx->GetProcessPtr();
151 if (process)
152 {
153 ret.byte_order = process->GetByteOrder();
154 ret.address_byte_size = process->GetAddressByteSize();
155 }
156 else
157 {
158 Target *target = exe_ctx->GetTargetPtr();
159 if (target)
160 {
161 ret.byte_order = target->GetArchitecture().GetByteOrder();
162 ret.address_byte_size = target->GetArchitecture().GetAddressByteSize();
163 }
164 }
Sean Callanan47dc4572011-09-15 02:13:07 +0000165 }
166
167 return ret;
168}
169
Greg Clayton8de27c72010-10-15 22:48:33 +0000170const ConstString &
171ClangExpressionDeclMap::GetPersistentResultName ()
Sean Callanan82b74c82010-08-12 01:56:52 +0000172{
Sean Callananaa301c42010-12-03 01:38:59 +0000173 assert (m_struct_vars.get());
174 assert (m_parser_vars.get());
Sean Callananaa301c42010-12-03 01:38:59 +0000175 if (!m_struct_vars->m_result_name)
Greg Clayton427f2902010-12-14 02:59:59 +0000176 {
177 Target *target = m_parser_vars->GetTarget();
178 assert (target);
179 m_struct_vars->m_result_name = target->GetPersistentVariables().GetNextPersistentVariableName();
180 }
Sean Callananaa301c42010-12-03 01:38:59 +0000181 return m_struct_vars->m_result_name;
Sean Callanan82b74c82010-08-12 01:56:52 +0000182}
183
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000184lldb::ClangExpressionVariableSP
185ClangExpressionDeclMap::BuildIntegerVariable (const ConstString &name,
186 lldb_private::TypeFromParser type,
187 const llvm::APInt& value)
188{
189 assert (m_parser_vars.get());
Sean Callanan166ba102011-08-01 18:18:33 +0000190
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000191 ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
Greg Clayton567e7f32011-09-22 04:58:26 +0000192 if (exe_ctx == NULL)
193 return lldb::ClangExpressionVariableSP();
194 Target *target = exe_ctx->GetTargetPtr();
195
196 ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000197
198 TypeFromUser user_type(ClangASTContext::CopyType(context,
199 type.GetASTContext(),
200 type.GetOpaqueQualType()),
201 context);
Sean Callanan47dc4572011-09-15 02:13:07 +0000202
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000203 if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx->GetBestExecutionContextScope (),
204 name,
Sean Callanan0e0817d2011-01-04 02:41:41 +0000205 user_type,
Sean Callanan47dc4572011-09-15 02:13:07 +0000206 m_parser_vars->m_target_info.byte_order,
207 m_parser_vars->m_target_info.address_byte_size))
Sean Callanan0e0817d2011-01-04 02:41:41 +0000208 return lldb::ClangExpressionVariableSP();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000209
Sean Callanan0e0817d2011-01-04 02:41:41 +0000210 ClangExpressionVariableSP pvar_sp (m_parser_vars->m_persistent_vars->GetVariable(name));
211
212 if (!pvar_sp)
213 return lldb::ClangExpressionVariableSP();
214
215 uint8_t *pvar_data = pvar_sp->GetValueBytes();
216 if (pvar_data == NULL)
217 return lldb::ClangExpressionVariableSP();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000218
219 uint64_t value64 = value.getLimitedValue();
Sean Callanan47dc4572011-09-15 02:13:07 +0000220
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000221 size_t num_val_bytes = sizeof(value64);
Sean Callanan0e0817d2011-01-04 02:41:41 +0000222 size_t num_data_bytes = pvar_sp->GetByteSize();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000223
224 size_t num_bytes = num_val_bytes;
225 if (num_bytes > num_data_bytes)
226 num_bytes = num_data_bytes;
227
Johnny Chen2bc9eb32011-07-19 19:48:13 +0000228 for (size_t byte_idx = 0;
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000229 byte_idx < num_bytes;
230 ++byte_idx)
231 {
232 uint64_t shift = byte_idx * 8;
233 uint64_t mask = 0xffll << shift;
234 uint8_t cur_byte = (uint8_t)((value64 & mask) >> shift);
235
Sean Callanan47dc4572011-09-15 02:13:07 +0000236 switch (m_parser_vars->m_target_info.byte_order)
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000237 {
Sean Callanan0e0817d2011-01-04 02:41:41 +0000238 case eByteOrderBig:
239 // High Low
240 // Original: |AABBCCDDEEFFGGHH|
241 // Target: |EEFFGGHH|
242
243 pvar_data[num_data_bytes - (1 + byte_idx)] = cur_byte;
244 break;
245 case eByteOrderLittle:
246 // Target: |HHGGFFEE|
247 pvar_data[byte_idx] = cur_byte;
248 break;
249 default:
250 return lldb::ClangExpressionVariableSP();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000251 }
252 }
Sean Callanan6a925532011-01-13 08:53:35 +0000253
254 pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried;
Sean Callanan696cf5f2011-05-07 01:06:41 +0000255 pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
256 pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
Sean Callanan0e0817d2011-01-04 02:41:41 +0000257
258 return pvar_sp;
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000259}
260
Sean Callanan696cf5f2011-05-07 01:06:41 +0000261lldb::ClangExpressionVariableSP
262ClangExpressionDeclMap::BuildCastVariable (const ConstString &name,
Sean Callanan9b6898f2011-07-30 02:42:06 +0000263 VarDecl *decl,
Sean Callanan696cf5f2011-05-07 01:06:41 +0000264 lldb_private::TypeFromParser type)
265{
266 assert (m_parser_vars.get());
267
268 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
269
270 ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
Greg Clayton567e7f32011-09-22 04:58:26 +0000271 if (exe_ctx == NULL)
272 return lldb::ClangExpressionVariableSP();
273 Target *target = exe_ctx->GetTargetPtr();
274 if (target == NULL)
275 return lldb::ClangExpressionVariableSP();
276
277 ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
Sean Callanan696cf5f2011-05-07 01:06:41 +0000278
279 ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl));
280
281 if (!var_sp)
282 var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl);
283
284 if (!var_sp)
285 return ClangExpressionVariableSP();
286
287 TypeFromUser user_type(ClangASTContext::CopyType(context,
288 type.GetASTContext(),
289 type.GetOpaqueQualType()),
290 context);
291
292 TypeFromUser var_type = var_sp->GetTypeFromUser();
293
Greg Clayton567e7f32011-09-22 04:58:26 +0000294 StackFrame *frame = exe_ctx->GetFramePtr();
295 if (frame == NULL)
296 return lldb::ClangExpressionVariableSP();
297
298 VariableSP var = FindVariableInScope (*frame, var_sp->GetName(), &var_type);
Sean Callanan696cf5f2011-05-07 01:06:41 +0000299
300 if (!var)
301 return lldb::ClangExpressionVariableSP(); // but we should handle this; it may be a persistent variable
302
Greg Clayton567e7f32011-09-22 04:58:26 +0000303 ValueObjectSP var_valobj = frame->GetValueObjectForFrameVariable(var, lldb::eNoDynamicValues);
Sean Callanan696cf5f2011-05-07 01:06:41 +0000304
305 if (!var_valobj)
306 return lldb::ClangExpressionVariableSP();
307
308 ValueObjectSP var_casted_valobj = var_valobj->CastPointerType(name.GetCString(), user_type);
309
310 if (!var_casted_valobj)
311 return lldb::ClangExpressionVariableSP();
312
313 if (log)
314 {
315 StreamString my_stream_string;
316
317 ClangASTType::DumpTypeDescription (var_type.GetASTContext(),
318 var_type.GetOpaqueQualType(),
319 &my_stream_string);
320
321
322 log->Printf("Building cast variable to type: %s", my_stream_string.GetString().c_str());
323 }
324
325 ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->CreatePersistentVariable (var_casted_valobj);
326
327 if (!pvar_sp)
328 return lldb::ClangExpressionVariableSP();
329
330 if (pvar_sp != m_parser_vars->m_persistent_vars->GetVariable(name))
331 return lldb::ClangExpressionVariableSP();
332
333 pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried;
334 pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
335 pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
336
337 return pvar_sp;
338}
339
Sean Callanan47dc4572011-09-15 02:13:07 +0000340bool
341ClangExpressionDeclMap::ResultIsReference (const ConstString &name)
342{
343 ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name);
344
345 return (pvar_sp->m_flags & ClangExpressionVariable::EVIsProgramReference);
346}
347
348bool
349ClangExpressionDeclMap::CompleteResultVariable (lldb::ClangExpressionVariableSP &valobj,
350 lldb_private::Value &value,
351 const ConstString &name,
Sean Callanana8428a42011-09-22 00:41:11 +0000352 lldb_private::TypeFromParser type,
Sean Callanan557ccd62011-10-21 05:18:02 +0000353 bool transient,
354 bool maybe_make_load)
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;
Sean Callanan557ccd62011-10-21 05:18:02 +0000362
363 if (maybe_make_load &&
364 value.GetValueType() == Value::eValueTypeFileAddress &&
365 m_parser_vars->m_exe_ctx &&
366 m_parser_vars->m_exe_ctx->GetProcessPtr())
367 {
368 value.SetValueType(Value::eValueTypeLoadAddress);
369 }
Sean Callanan47dc4572011-09-15 02:13:07 +0000370
371 if (pvar_sp->m_flags & ClangExpressionVariable::EVIsProgramReference &&
Sean Callanana8428a42011-09-22 00:41:11 +0000372 !pvar_sp->m_live_sp &&
373 !transient)
Sean Callanan47dc4572011-09-15 02:13:07 +0000374 {
375 // The reference comes from the program. We need to set up a live SP for it.
376
377 pvar_sp->m_live_sp = ValueObjectConstResult::Create(m_parser_vars->m_exe_ctx->GetBestExecutionContextScope(),
378 pvar_sp->GetTypeFromUser().GetASTContext(),
379 pvar_sp->GetTypeFromUser().GetOpaqueQualType(),
380 pvar_sp->GetName(),
381 value.GetScalar().ULongLong(),
382 value.GetValueAddressType(),
383 pvar_sp->GetByteSize());
384 }
385
386 if (pvar_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry)
387 {
388 pvar_sp->ValueUpdated();
389
390 const size_t pvar_byte_size = pvar_sp->GetByteSize();
391 uint8_t *pvar_data = pvar_sp->GetValueBytes();
392
393 if (!ReadTarget(pvar_data, value, pvar_byte_size))
394 return false;
395
396 pvar_sp->m_flags &= ~(ClangExpressionVariable::EVNeedsFreezeDry);
397 }
398
399 valobj = pvar_sp;
400
401 return true;
402}
403
Sean Callanan8bce6652010-07-13 21:41:46 +0000404bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000405ClangExpressionDeclMap::AddPersistentVariable
406(
Sean Callanan9b6898f2011-07-30 02:42:06 +0000407 const NamedDecl *decl,
Greg Clayton8de27c72010-10-15 22:48:33 +0000408 const ConstString &name,
Sean Callanan6a925532011-01-13 08:53:35 +0000409 TypeFromParser parser_type,
410 bool is_result,
411 bool is_lvalue
Greg Clayton8de27c72010-10-15 22:48:33 +0000412)
Sean Callanana48fe162010-08-11 03:57:18 +0000413{
Sean Callananaa301c42010-12-03 01:38:59 +0000414 assert (m_parser_vars.get());
415
Sean Callanan6a925532011-01-13 08:53:35 +0000416 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000417 ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
Greg Clayton567e7f32011-09-22 04:58:26 +0000418 if (exe_ctx == NULL)
419 return false;
420 Target *target = exe_ctx->GetTargetPtr();
421 if (target == NULL)
422 return false;
423
424 ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
Sean Callanana48fe162010-08-11 03:57:18 +0000425
Sean Callanana48fe162010-08-11 03:57:18 +0000426 TypeFromUser user_type(ClangASTContext::CopyType(context,
Sean Callanan82b74c82010-08-12 01:56:52 +0000427 parser_type.GetASTContext(),
428 parser_type.GetOpaqueQualType()),
Sean Callanan97678d12011-01-13 21:23:32 +0000429 context);
Sean Callanan47dc4572011-09-15 02:13:07 +0000430
431 if (!m_parser_vars->m_target_info.IsValid())
432 return false;
Sean Callanana48fe162010-08-11 03:57:18 +0000433
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000434 if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx->GetBestExecutionContextScope (),
435 name,
Greg Clayton427f2902010-12-14 02:59:59 +0000436 user_type,
Sean Callanan47dc4572011-09-15 02:13:07 +0000437 m_parser_vars->m_target_info.byte_order,
438 m_parser_vars->m_target_info.address_byte_size))
Sean Callanan8c127202010-08-23 23:09:38 +0000439 return false;
440
Greg Clayton427f2902010-12-14 02:59:59 +0000441 ClangExpressionVariableSP var_sp (m_parser_vars->m_persistent_vars->GetVariable(name));
Sean Callanan8c127202010-08-23 23:09:38 +0000442
Greg Clayton427f2902010-12-14 02:59:59 +0000443 if (!var_sp)
Sean Callanan8c127202010-08-23 23:09:38 +0000444 return false;
445
Sean Callanan6a925532011-01-13 08:53:35 +0000446 if (is_result)
447 var_sp->m_flags |= ClangExpressionVariable::EVNeedsFreezeDry;
448 else
449 var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget; // explicitly-declared persistent variables should persist
450
451 if (is_lvalue)
452 {
453 var_sp->m_flags |= ClangExpressionVariable::EVIsProgramReference;
454 }
455 else
456 {
457 var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
458 var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
459 }
460
461 if (log)
462 log->Printf("Created persistent variable with flags 0x%hx", var_sp->m_flags);
463
Greg Clayton427f2902010-12-14 02:59:59 +0000464 var_sp->EnableParserVars();
Sean Callanan8c127202010-08-23 23:09:38 +0000465
Greg Clayton427f2902010-12-14 02:59:59 +0000466 var_sp->m_parser_vars->m_named_decl = decl;
467 var_sp->m_parser_vars->m_parser_type = parser_type;
Sean Callanan8c127202010-08-23 23:09:38 +0000468
469 return true;
Sean Callanana48fe162010-08-11 03:57:18 +0000470}
471
472bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000473ClangExpressionDeclMap::AddValueToStruct
474(
Sean Callanan9b6898f2011-07-30 02:42:06 +0000475 const NamedDecl *decl,
Greg Clayton8de27c72010-10-15 22:48:33 +0000476 const ConstString &name,
477 llvm::Value *value,
478 size_t size,
479 off_t alignment
480)
Sean Callanan8bce6652010-07-13 21:41:46 +0000481{
Sean Callananaa301c42010-12-03 01:38:59 +0000482 assert (m_struct_vars.get());
483 assert (m_parser_vars.get());
484
Greg Claytone005f2c2010-11-06 01:53:30 +0000485 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan45690fe2010-08-30 22:17:16 +0000486
Sean Callananaa301c42010-12-03 01:38:59 +0000487 m_struct_vars->m_struct_laid_out = false;
Sean Callanan8bce6652010-07-13 21:41:46 +0000488
Sean Callanan8c127202010-08-23 23:09:38 +0000489 if (m_struct_members.GetVariable(decl))
490 return true;
Sean Callanan8bce6652010-07-13 21:41:46 +0000491
Greg Clayton427f2902010-12-14 02:59:59 +0000492 ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl));
Sean Callanan8bce6652010-07-13 21:41:46 +0000493
Greg Clayton427f2902010-12-14 02:59:59 +0000494 if (!var_sp)
495 var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl);
Sean Callanan8bce6652010-07-13 21:41:46 +0000496
Greg Clayton427f2902010-12-14 02:59:59 +0000497 if (!var_sp)
Sean Callanan8c127202010-08-23 23:09:38 +0000498 return false;
499
Sean Callanan45690fe2010-08-30 22:17:16 +0000500 if (log)
501 log->Printf("Adding value for decl %p [%s - %s] to the structure",
502 decl,
Greg Clayton8de27c72010-10-15 22:48:33 +0000503 name.GetCString(),
Greg Clayton427f2902010-12-14 02:59:59 +0000504 var_sp->GetName().GetCString());
Sean Callanan45690fe2010-08-30 22:17:16 +0000505
Sean Callanan8c127202010-08-23 23:09:38 +0000506 // We know entity->m_parser_vars is valid because we used a parser variable
507 // to find it
Greg Clayton427f2902010-12-14 02:59:59 +0000508 var_sp->m_parser_vars->m_llvm_value = value;
Sean Callanan8c127202010-08-23 23:09:38 +0000509
Greg Clayton427f2902010-12-14 02:59:59 +0000510 var_sp->EnableJITVars();
511 var_sp->m_jit_vars->m_alignment = alignment;
512 var_sp->m_jit_vars->m_size = size;
Sean Callanan8c127202010-08-23 23:09:38 +0000513
Greg Clayton427f2902010-12-14 02:59:59 +0000514 m_struct_members.AddVariable(var_sp);
Sean Callanan8bce6652010-07-13 21:41:46 +0000515
516 return true;
517}
518
519bool
520ClangExpressionDeclMap::DoStructLayout ()
521{
Sean Callananaa301c42010-12-03 01:38:59 +0000522 assert (m_struct_vars.get());
523
524 if (m_struct_vars->m_struct_laid_out)
Sean Callanan8bce6652010-07-13 21:41:46 +0000525 return true;
526
Sean Callanan8bce6652010-07-13 21:41:46 +0000527 off_t cursor = 0;
528
Sean Callananaa301c42010-12-03 01:38:59 +0000529 m_struct_vars->m_struct_alignment = 0;
530 m_struct_vars->m_struct_size = 0;
Sean Callanan8bce6652010-07-13 21:41:46 +0000531
Greg Clayton427f2902010-12-14 02:59:59 +0000532 for (size_t member_index = 0, num_members = m_struct_members.GetSize();
Sean Callanan8c127202010-08-23 23:09:38 +0000533 member_index < num_members;
534 ++member_index)
Sean Callanan8bce6652010-07-13 21:41:46 +0000535 {
Greg Clayton427f2902010-12-14 02:59:59 +0000536 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
537 if (!member_sp)
538 return false;
539
540 if (!member_sp->m_jit_vars.get())
Sean Callanan8c127202010-08-23 23:09:38 +0000541 return false;
Sean Callanan8bce6652010-07-13 21:41:46 +0000542
Sean Callanan8c127202010-08-23 23:09:38 +0000543 if (member_index == 0)
Greg Clayton427f2902010-12-14 02:59:59 +0000544 m_struct_vars->m_struct_alignment = member_sp->m_jit_vars->m_alignment;
Sean Callanan8c127202010-08-23 23:09:38 +0000545
Greg Clayton427f2902010-12-14 02:59:59 +0000546 if (cursor % member_sp->m_jit_vars->m_alignment)
547 cursor += (member_sp->m_jit_vars->m_alignment - (cursor % member_sp->m_jit_vars->m_alignment));
Sean Callanan8c127202010-08-23 23:09:38 +0000548
Greg Clayton427f2902010-12-14 02:59:59 +0000549 member_sp->m_jit_vars->m_offset = cursor;
550 cursor += member_sp->m_jit_vars->m_size;
Sean Callanan8bce6652010-07-13 21:41:46 +0000551 }
552
Sean Callananaa301c42010-12-03 01:38:59 +0000553 m_struct_vars->m_struct_size = cursor;
Sean Callanan8bce6652010-07-13 21:41:46 +0000554
Sean Callananaa301c42010-12-03 01:38:59 +0000555 m_struct_vars->m_struct_laid_out = true;
Sean Callanan8bce6652010-07-13 21:41:46 +0000556 return true;
557}
558
Greg Clayton8de27c72010-10-15 22:48:33 +0000559bool ClangExpressionDeclMap::GetStructInfo
560(
561 uint32_t &num_elements,
562 size_t &size,
563 off_t &alignment
564)
Sean Callanan8bce6652010-07-13 21:41:46 +0000565{
Sean Callananaa301c42010-12-03 01:38:59 +0000566 assert (m_struct_vars.get());
567
568 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan8bce6652010-07-13 21:41:46 +0000569 return false;
570
Greg Clayton427f2902010-12-14 02:59:59 +0000571 num_elements = m_struct_members.GetSize();
Sean Callananaa301c42010-12-03 01:38:59 +0000572 size = m_struct_vars->m_struct_size;
573 alignment = m_struct_vars->m_struct_alignment;
Sean Callanan8bce6652010-07-13 21:41:46 +0000574
575 return true;
576}
577
578bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000579ClangExpressionDeclMap::GetStructElement
580(
Sean Callanan9b6898f2011-07-30 02:42:06 +0000581 const NamedDecl *&decl,
Greg Clayton8de27c72010-10-15 22:48:33 +0000582 llvm::Value *&value,
583 off_t &offset,
584 ConstString &name,
585 uint32_t index
586)
Sean Callanan8bce6652010-07-13 21:41:46 +0000587{
Sean Callananaa301c42010-12-03 01:38:59 +0000588 assert (m_struct_vars.get());
589
590 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan8bce6652010-07-13 21:41:46 +0000591 return false;
592
Greg Clayton427f2902010-12-14 02:59:59 +0000593 if (index >= m_struct_members.GetSize())
Sean Callanan8bce6652010-07-13 21:41:46 +0000594 return false;
595
Greg Clayton427f2902010-12-14 02:59:59 +0000596 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(index));
Sean Callanan8bce6652010-07-13 21:41:46 +0000597
Greg Clayton427f2902010-12-14 02:59:59 +0000598 if (!member_sp ||
599 !member_sp->m_parser_vars.get() ||
600 !member_sp->m_jit_vars.get())
Sean Callanan8c127202010-08-23 23:09:38 +0000601 return false;
602
Greg Clayton427f2902010-12-14 02:59:59 +0000603 decl = member_sp->m_parser_vars->m_named_decl;
604 value = member_sp->m_parser_vars->m_llvm_value;
605 offset = member_sp->m_jit_vars->m_offset;
606 name = member_sp->GetName();
Sean Callanan8c127202010-08-23 23:09:38 +0000607
Sean Callanan8bce6652010-07-13 21:41:46 +0000608 return true;
609}
610
Sean Callanan02fbafa2010-07-27 21:39:39 +0000611bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000612ClangExpressionDeclMap::GetFunctionInfo
613(
Sean Callanan9b6898f2011-07-30 02:42:06 +0000614 const NamedDecl *decl,
Greg Clayton8de27c72010-10-15 22:48:33 +0000615 uint64_t &ptr
616)
Sean Callananba992c52010-07-27 02:07:53 +0000617{
Greg Clayton427f2902010-12-14 02:59:59 +0000618 ClangExpressionVariableSP entity_sp(m_found_entities.GetVariable(decl));
Sean Callanan8c127202010-08-23 23:09:38 +0000619
Greg Clayton427f2902010-12-14 02:59:59 +0000620 if (!entity_sp)
Sean Callanan8c127202010-08-23 23:09:38 +0000621 return false;
Sean Callananba992c52010-07-27 02:07:53 +0000622
Sean Callanan8c127202010-08-23 23:09:38 +0000623 // We know m_parser_vars is valid since we searched for the variable by
624 // its NamedDecl
Sean Callananba992c52010-07-27 02:07:53 +0000625
Greg Clayton427f2902010-12-14 02:59:59 +0000626 ptr = entity_sp->m_parser_vars->m_lldb_value->GetScalar().ULongLong();
Sean Callanan8c127202010-08-23 23:09:38 +0000627
628 return true;
Sean Callananba992c52010-07-27 02:07:53 +0000629}
630
Sean Callananca2516d2011-08-16 18:09:29 +0000631static void
632FindCodeSymbolInContext
633(
634 const ConstString &name,
635 SymbolContext &sym_ctx,
636 SymbolContextList &sc_list
637)
638{
639 if (sym_ctx.module_sp)
Sean Callananaa4a5532011-10-13 16:49:47 +0000640 sym_ctx.module_sp->FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list);
Sean Callananca2516d2011-08-16 18:09:29 +0000641
642 if (!sc_list.GetSize())
643 sym_ctx.target_sp->GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list);
644}
645
Sean Callananf5857a02010-07-31 01:32:05 +0000646bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000647ClangExpressionDeclMap::GetFunctionAddress
648(
649 const ConstString &name,
Greg Claytonda7af842011-05-18 22:01:49 +0000650 uint64_t &func_addr
Greg Clayton8de27c72010-10-15 22:48:33 +0000651)
Sean Callananf5857a02010-07-31 01:32:05 +0000652{
Sean Callananaa301c42010-12-03 01:38:59 +0000653 assert (m_parser_vars.get());
654
Sean Callananaba367e2011-05-13 18:27:02 +0000655 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Greg Clayton567e7f32011-09-22 04:58:26 +0000656 ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
657 if (exe_ctx == NULL)
658 return false;
659 Target *target = exe_ctx->GetTargetPtr();
Sean Callananf5857a02010-07-31 01:32:05 +0000660 // Back out in all cases where we're not fully initialized
Greg Clayton567e7f32011-09-22 04:58:26 +0000661 if (target == NULL)
Jim Ingham78b9ee82010-12-07 01:56:02 +0000662 return false;
663 if (!m_parser_vars->m_sym_ctx.target_sp)
Sean Callananf5857a02010-07-31 01:32:05 +0000664 return false;
665
Greg Claytone5748d82010-11-09 23:46:37 +0000666 SymbolContextList sc_list;
Sean Callananf5857a02010-07-31 01:32:05 +0000667
Sean Callananca2516d2011-08-16 18:09:29 +0000668 FindCodeSymbolInContext(name, m_parser_vars->m_sym_ctx, sc_list);
669
Greg Claytone5748d82010-11-09 23:46:37 +0000670 if (!sc_list.GetSize())
Sean Callananaba367e2011-05-13 18:27:02 +0000671 {
672 // We occasionally get debug information in which a const function is reported
673 // as non-const, so the mangled name is wrong. This is a hack to compensate.
674
Sean Callanan0eb21392011-10-25 18:02:05 +0000675 if (!strncmp(name.GetCString(), "_ZN", 3) &&
676 strncmp(name.GetCString(), "_ZNK", 4))
Sean Callananaba367e2011-05-13 18:27:02 +0000677 {
Sean Callanan0eb21392011-10-25 18:02:05 +0000678 std::string fixed_scratch("_ZNK");
679 fixed_scratch.append(name.GetCString() + 3);
680 ConstString fixed_name(fixed_scratch.c_str());
Sean Callananaba367e2011-05-13 18:27:02 +0000681
682 if (log)
Sean Callanan0eb21392011-10-25 18:02:05 +0000683 log->Printf("Failed to find symbols given non-const name %s; trying %s", name.GetCString(), fixed_name.GetCString());
684
685 FindCodeSymbolInContext(fixed_name, m_parser_vars->m_sym_ctx, sc_list);
Sean Callananaba367e2011-05-13 18:27:02 +0000686 }
687 }
688
689 if (!sc_list.GetSize())
Sean Callananf5857a02010-07-31 01:32:05 +0000690 return false;
691
692 SymbolContext sym_ctx;
Greg Claytone5748d82010-11-09 23:46:37 +0000693 sc_list.GetContextAtIndex(0, sym_ctx);
Sean Callananf5857a02010-07-31 01:32:05 +0000694
Greg Claytonda7af842011-05-18 22:01:49 +0000695 const Address *func_so_addr = NULL;
Sean Callananf5857a02010-07-31 01:32:05 +0000696
697 if (sym_ctx.function)
Greg Claytonda7af842011-05-18 22:01:49 +0000698 func_so_addr = &sym_ctx.function->GetAddressRange().GetBaseAddress();
Sean Callananf5857a02010-07-31 01:32:05 +0000699 else if (sym_ctx.symbol)
Greg Claytonda7af842011-05-18 22:01:49 +0000700 func_so_addr = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress();
Sean Callananf5857a02010-07-31 01:32:05 +0000701 else
702 return false;
703
Sean Callananae9f7482011-07-07 23:05:43 +0000704 if (!func_so_addr || !func_so_addr->IsValid())
705 return false;
706
Greg Clayton567e7f32011-09-22 04:58:26 +0000707 func_addr = func_so_addr->GetCallableLoadAddress (target);
Greg Claytonda7af842011-05-18 22:01:49 +0000708
Sean Callananf5857a02010-07-31 01:32:05 +0000709 return true;
710}
711
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000712addr_t
713ClangExpressionDeclMap::GetSymbolAddress (Target &target, const ConstString &name)
Sean Callananc7674af2011-01-17 23:42:46 +0000714{
Sean Callananc7674af2011-01-17 23:42:46 +0000715 SymbolContextList sc_list;
716
Sean Callanan81974962011-05-08 02:21:26 +0000717 target.GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeAny, sc_list);
Sean Callananc7674af2011-01-17 23:42:46 +0000718
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000719 const uint32_t num_matches = sc_list.GetSize();
720 addr_t symbol_load_addr = LLDB_INVALID_ADDRESS;
721
722 for (uint32_t i=0; i<num_matches && symbol_load_addr == LLDB_INVALID_ADDRESS; i++)
723 {
724 SymbolContext sym_ctx;
725 sc_list.GetContextAtIndex(i, sym_ctx);
Sean Callananc7674af2011-01-17 23:42:46 +0000726
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000727 const Address *sym_address = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress();
Sean Callananae9f7482011-07-07 23:05:43 +0000728
729 if (!sym_address || !sym_address->IsValid())
730 return LLDB_INVALID_ADDRESS;
731
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000732 if (sym_address)
733 {
734 switch (sym_ctx.symbol->GetType())
735 {
736 case eSymbolTypeCode:
737 case eSymbolTypeTrampoline:
738 symbol_load_addr = sym_address->GetCallableLoadAddress (&target);
739 break;
740
741 case eSymbolTypeData:
742 case eSymbolTypeRuntime:
743 case eSymbolTypeVariable:
744 case eSymbolTypeLocal:
745 case eSymbolTypeParam:
746 case eSymbolTypeInvalid:
747 case eSymbolTypeAbsolute:
748 case eSymbolTypeExtern:
749 case eSymbolTypeException:
750 case eSymbolTypeSourceFile:
751 case eSymbolTypeHeaderFile:
752 case eSymbolTypeObjectFile:
753 case eSymbolTypeCommonBlock:
754 case eSymbolTypeBlock:
755 case eSymbolTypeVariableType:
756 case eSymbolTypeLineEntry:
757 case eSymbolTypeLineHeader:
758 case eSymbolTypeScopeBegin:
759 case eSymbolTypeScopeEnd:
760 case eSymbolTypeAdditional:
761 case eSymbolTypeCompiler:
762 case eSymbolTypeInstrumentation:
763 case eSymbolTypeUndefined:
764 symbol_load_addr = sym_address->GetLoadAddress (&target);
765 break;
766 }
767 }
768 }
Sean Callananc7674af2011-01-17 23:42:46 +0000769
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000770 return symbol_load_addr;
Sean Callananc7674af2011-01-17 23:42:46 +0000771}
772
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000773addr_t
774ClangExpressionDeclMap::GetSymbolAddress (const ConstString &name)
Sean Callanan81974962011-05-08 02:21:26 +0000775{
776 assert (m_parser_vars.get());
777
778 if (!m_parser_vars->m_exe_ctx ||
Greg Clayton567e7f32011-09-22 04:58:26 +0000779 !m_parser_vars->m_exe_ctx->GetTargetPtr())
Sean Callanan81974962011-05-08 02:21:26 +0000780 return false;
781
Greg Clayton567e7f32011-09-22 04:58:26 +0000782 return GetSymbolAddress(m_parser_vars->m_exe_ctx->GetTargetRef(), name);
Sean Callanan81974962011-05-08 02:21:26 +0000783}
784
Sean Callanan47dc4572011-09-15 02:13:07 +0000785// Interface for IRInterpreter
786
Sean Callanan557ccd62011-10-21 05:18:02 +0000787Value
788ClangExpressionDeclMap::WrapBareAddress (lldb::addr_t addr)
789{
790 Value ret;
791
792 ret.SetContext(Value::eContextTypeInvalid, NULL);
793
794 if (m_parser_vars->m_exe_ctx && m_parser_vars->m_exe_ctx->GetProcessPtr())
795 ret.SetValueType(Value::eValueTypeLoadAddress);
796 else
797 ret.SetValueType(Value::eValueTypeFileAddress);
798
799 ret.GetScalar() = (unsigned long long)addr;
800
801 return ret;
802}
803
Sean Callanan47dc4572011-09-15 02:13:07 +0000804bool
805ClangExpressionDeclMap::WriteTarget (lldb_private::Value &value,
806 const uint8_t *data,
807 size_t length)
808{
809 assert (m_parser_vars.get());
810
811 ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
812
Greg Clayton567e7f32011-09-22 04:58:26 +0000813 Process *process = exe_ctx->GetProcessPtr();
Sean Callanan47dc4572011-09-15 02:13:07 +0000814 if (value.GetContextType() == Value::eContextTypeRegisterInfo)
815 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000816 if (!process)
Sean Callanan47dc4572011-09-15 02:13:07 +0000817 return false;
818
819 RegisterContext *reg_ctx = exe_ctx->GetRegisterContext();
820 RegisterInfo *reg_info = value.GetRegisterInfo();
821
822 if (!reg_ctx)
823 return false;
824
825 lldb_private::RegisterValue reg_value;
826 Error err;
827
Greg Clayton567e7f32011-09-22 04:58:26 +0000828 if (!reg_value.SetFromMemoryData (reg_info, data, length, process->GetByteOrder(), err))
Sean Callanan47dc4572011-09-15 02:13:07 +0000829 return false;
830
831 return reg_ctx->WriteRegister(reg_info, reg_value);
832 }
833 else
834 {
835 switch (value.GetValueType())
836 {
837 default:
838 return false;
839 case Value::eValueTypeFileAddress:
840 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000841 if (!process)
Sean Callanan47dc4572011-09-15 02:13:07 +0000842 return false;
843
Greg Clayton567e7f32011-09-22 04:58:26 +0000844 Target *target = exe_ctx->GetTargetPtr();
Sean Callanan47dc4572011-09-15 02:13:07 +0000845 Address file_addr;
846
Greg Clayton567e7f32011-09-22 04:58:26 +0000847 if (!target->GetImages().ResolveFileAddress((lldb::addr_t)value.GetScalar().ULongLong(), file_addr))
Sean Callanan47dc4572011-09-15 02:13:07 +0000848 return false;
849
Greg Clayton567e7f32011-09-22 04:58:26 +0000850 lldb::addr_t load_addr = file_addr.GetLoadAddress(target);
Sean Callanan47dc4572011-09-15 02:13:07 +0000851
852 Error err;
Greg Clayton567e7f32011-09-22 04:58:26 +0000853 process->WriteMemory(load_addr, data, length, err);
Sean Callanan47dc4572011-09-15 02:13:07 +0000854
855 return err.Success();
856 }
857 case Value::eValueTypeLoadAddress:
858 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000859 if (!process)
Sean Callanan47dc4572011-09-15 02:13:07 +0000860 return false;
861
862 Error err;
Greg Clayton567e7f32011-09-22 04:58:26 +0000863 process->WriteMemory((lldb::addr_t)value.GetScalar().ULongLong(), data, length, err);
Sean Callanan47dc4572011-09-15 02:13:07 +0000864
865 return err.Success();
866 }
867 case Value::eValueTypeHostAddress:
868 memcpy ((void *)value.GetScalar().ULongLong(), data, length);
869 return true;
870 case Value::eValueTypeScalar:
871 return false;
872 }
873 }
874}
875
876bool
877ClangExpressionDeclMap::ReadTarget (uint8_t *data,
878 lldb_private::Value &value,
879 size_t length)
880{
881 assert (m_parser_vars.get());
882
883 ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
Greg Clayton567e7f32011-09-22 04:58:26 +0000884
885 Process *process = exe_ctx->GetProcessPtr();
886
Sean Callanan47dc4572011-09-15 02:13:07 +0000887 if (value.GetContextType() == Value::eContextTypeRegisterInfo)
888 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000889 if (!process)
Sean Callanan47dc4572011-09-15 02:13:07 +0000890 return false;
891
892 RegisterContext *reg_ctx = exe_ctx->GetRegisterContext();
893 RegisterInfo *reg_info = value.GetRegisterInfo();
894
895 if (!reg_ctx)
896 return false;
897
898 lldb_private::RegisterValue reg_value;
899 Error err;
900
901 if (!reg_ctx->ReadRegister(reg_info, reg_value))
902 return false;
903
Greg Clayton567e7f32011-09-22 04:58:26 +0000904 return reg_value.GetAsMemoryData(reg_info, data, length, process->GetByteOrder(), err);
Sean Callanan47dc4572011-09-15 02:13:07 +0000905 }
906 else
907 {
908 switch (value.GetValueType())
909 {
910 default:
911 return false;
912 case Value::eValueTypeFileAddress:
913 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000914 Target *target = exe_ctx->GetTargetPtr();
915 if (target == NULL)
Sean Callanan47dc4572011-09-15 02:13:07 +0000916 return false;
917
918 Address file_addr;
919
Greg Clayton567e7f32011-09-22 04:58:26 +0000920 if (!target->GetImages().ResolveFileAddress((lldb::addr_t)value.GetScalar().ULongLong(), file_addr))
Sean Callanan47dc4572011-09-15 02:13:07 +0000921 return false;
922
923 Error err;
Greg Clayton567e7f32011-09-22 04:58:26 +0000924 target->ReadMemory(file_addr, true, data, length, err);
Sean Callanan47dc4572011-09-15 02:13:07 +0000925
926 return err.Success();
927 }
928 case Value::eValueTypeLoadAddress:
929 {
Greg Clayton567e7f32011-09-22 04:58:26 +0000930 if (!process)
Sean Callanan47dc4572011-09-15 02:13:07 +0000931 return false;
932
933 Error err;
Greg Clayton567e7f32011-09-22 04:58:26 +0000934 process->ReadMemory((lldb::addr_t)value.GetScalar().ULongLong(), data, length, err);
Sean Callanan47dc4572011-09-15 02:13:07 +0000935
936 return err.Success();
937 }
938 case Value::eValueTypeHostAddress:
939 memcpy (data, (const void *)value.GetScalar().ULongLong(), length);
940 return true;
941 case Value::eValueTypeScalar:
942 return false;
943 }
944 }
945}
946
947lldb_private::Value
948ClangExpressionDeclMap::LookupDecl (clang::NamedDecl *decl)
949{
950 assert (m_parser_vars.get());
951
952 ExecutionContext exe_ctx = *m_parser_vars->m_exe_ctx;
953
954 ClangExpressionVariableSP expr_var_sp (m_found_entities.GetVariable(decl));
955 ClangExpressionVariableSP persistent_var_sp (m_parser_vars->m_persistent_vars->GetVariable(decl));
956
957 if (expr_var_sp)
958 {
Sean Callanan4a078322011-10-13 00:09:20 +0000959 if (!expr_var_sp->m_parser_vars.get() || !expr_var_sp->m_parser_vars->m_lldb_var)
Sean Callanan6d284ef2011-10-12 22:20:02 +0000960 return Value();
961
Sean Callanan4a078322011-10-13 00:09:20 +0000962 return *GetVariableValue(exe_ctx, expr_var_sp->m_parser_vars->m_lldb_var, NULL);
Sean Callanan47dc4572011-09-15 02:13:07 +0000963 }
964 else if (persistent_var_sp)
965 {
Sean Callanana8428a42011-09-22 00:41:11 +0000966 if ((persistent_var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference ||
967 persistent_var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) &&
Sean Callanan86a07da2011-10-22 01:58:08 +0000968 persistent_var_sp->m_live_sp &&
969 m_parser_vars->m_exe_ctx->GetProcessSP() &&
970 m_parser_vars->m_exe_ctx->GetProcessSP()->IsAlive())
Sean Callanana8428a42011-09-22 00:41:11 +0000971 {
Sean Callanan86a07da2011-10-22 01:58:08 +0000972 return persistent_var_sp->m_live_sp->GetValue();
Sean Callanana8428a42011-09-22 00:41:11 +0000973 }
974 else
975 {
976 lldb_private::Value ret;
977 ret.SetValueType(Value::eValueTypeHostAddress);
978 ret.SetContext(Value::eContextTypeInvalid, NULL);
979 ret.GetScalar() = (lldb::addr_t)persistent_var_sp->GetValueBytes();
980 return ret;
981 }
Sean Callanan47dc4572011-09-15 02:13:07 +0000982 }
983 else
984 {
985 return Value();
986 }
987}
988
Sean Callanan810f22d2010-07-16 00:09:46 +0000989// Interface for CommandObjectExpression
Sean Callananf328c9f2010-07-20 23:31:16 +0000990
991bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000992ClangExpressionDeclMap::Materialize
993(
Sean Callananaa301c42010-12-03 01:38:59 +0000994 ExecutionContext &exe_ctx,
Greg Clayton8de27c72010-10-15 22:48:33 +0000995 lldb::addr_t &struct_address,
996 Error &err
997)
Sean Callananf328c9f2010-07-20 23:31:16 +0000998{
Sean Callananaa301c42010-12-03 01:38:59 +0000999 EnableMaterialVars();
1000
Greg Clayton567e7f32011-09-22 04:58:26 +00001001 m_material_vars->m_process = exe_ctx.GetProcessPtr();
Sean Callananaa301c42010-12-03 01:38:59 +00001002
Sean Callanan0ddf8062011-05-09 22:04:36 +00001003 bool result = DoMaterialize(false /* dematerialize */,
1004 exe_ctx,
1005 LLDB_INVALID_ADDRESS /* top of stack frame */,
1006 LLDB_INVALID_ADDRESS /* bottom of stack frame */,
1007 NULL, /* result SP */
1008 err);
Sean Callananf328c9f2010-07-20 23:31:16 +00001009
1010 if (result)
Sean Callananaa301c42010-12-03 01:38:59 +00001011 struct_address = m_material_vars->m_materialized_location;
Sean Callananf328c9f2010-07-20 23:31:16 +00001012
1013 return result;
1014}
1015
1016bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001017ClangExpressionDeclMap::GetObjectPointer
1018(
1019 lldb::addr_t &object_ptr,
Sean Callanan3aa7da52010-12-13 22:46:15 +00001020 ConstString &object_name,
Sean Callananaa301c42010-12-03 01:38:59 +00001021 ExecutionContext &exe_ctx,
Sean Callanan047923c2010-12-14 00:42:36 +00001022 Error &err,
1023 bool suppress_type_check
Greg Clayton8de27c72010-10-15 22:48:33 +00001024)
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001025{
Sean Callananaa301c42010-12-03 01:38:59 +00001026 assert (m_struct_vars.get());
1027
Greg Clayton567e7f32011-09-22 04:58:26 +00001028 Target *target = exe_ctx.GetTargetPtr();
1029 Process *process = exe_ctx.GetProcessPtr();
1030 StackFrame *frame = exe_ctx.GetFramePtr();
1031
1032 if (frame == NULL || process == NULL || target == NULL)
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001033 {
1034 err.SetErrorString("Couldn't load 'this' because the context is incomplete");
1035 return false;
1036 }
1037
Sean Callananaa301c42010-12-03 01:38:59 +00001038 if (!m_struct_vars->m_object_pointer_type.GetOpaqueQualType())
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001039 {
1040 err.SetErrorString("Couldn't load 'this' because its type is unknown");
1041 return false;
1042 }
1043
Greg Clayton567e7f32011-09-22 04:58:26 +00001044 VariableSP object_ptr_var = FindVariableInScope (*frame,
Sean Callanan696cf5f2011-05-07 01:06:41 +00001045 object_name,
1046 (suppress_type_check ? NULL : &m_struct_vars->m_object_pointer_type));
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001047
1048 if (!object_ptr_var)
1049 {
Sean Callanan3aa7da52010-12-13 22:46:15 +00001050 err.SetErrorStringWithFormat("Couldn't find '%s' with appropriate type in scope", object_name.GetCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001051 return false;
1052 }
1053
Sean Callananaa301c42010-12-03 01:38:59 +00001054 std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(exe_ctx,
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001055 object_ptr_var,
Sean Callananaa301c42010-12-03 01:38:59 +00001056 NULL));
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001057
1058 if (!location_value.get())
1059 {
Sean Callanan3aa7da52010-12-13 22:46:15 +00001060 err.SetErrorStringWithFormat("Couldn't get the location for '%s'", object_name.GetCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001061 return false;
1062 }
1063
Sean Callanan50339fe2011-03-04 00:23:47 +00001064 switch (location_value->GetValueType())
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001065 {
Sean Callanan50339fe2011-03-04 00:23:47 +00001066 default:
Sean Callanan3aa7da52010-12-13 22:46:15 +00001067 err.SetErrorStringWithFormat("'%s' is not in memory; LLDB must be extended to handle registers", object_name.GetCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001068 return false;
Sean Callanan50339fe2011-03-04 00:23:47 +00001069 case Value::eValueTypeLoadAddress:
1070 {
1071 lldb::addr_t value_addr = location_value->GetScalar().ULongLong();
Greg Clayton567e7f32011-09-22 04:58:26 +00001072 uint32_t address_byte_size = target->GetArchitecture().GetAddressByteSize();
Sean Callanan50339fe2011-03-04 00:23:47 +00001073
1074 if (ClangASTType::GetClangTypeBitWidth(m_struct_vars->m_object_pointer_type.GetASTContext(),
1075 m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) != address_byte_size * 8)
1076 {
1077 err.SetErrorStringWithFormat("'%s' is not of an expected pointer size", object_name.GetCString());
1078 return false;
1079 }
1080
Sean Callanan50339fe2011-03-04 00:23:47 +00001081 Error read_error;
Greg Clayton567e7f32011-09-22 04:58:26 +00001082 object_ptr = process->ReadPointerFromMemory (value_addr, read_error);
Greg Claytonc0fa5332011-05-22 22:46:53 +00001083 if (read_error.Fail() || object_ptr == LLDB_INVALID_ADDRESS)
Sean Callanan50339fe2011-03-04 00:23:47 +00001084 {
1085 err.SetErrorStringWithFormat("Coldn't read '%s' from the target: %s", object_name.GetCString(), read_error.AsCString());
1086 return false;
Greg Claytonc0fa5332011-05-22 22:46:53 +00001087 }
Sean Callanan50339fe2011-03-04 00:23:47 +00001088 return true;
1089 }
1090 case Value::eValueTypeScalar:
1091 {
1092 if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
1093 {
1094 StreamString ss;
1095 location_value->Dump(&ss);
1096
1097 err.SetErrorStringWithFormat("%s is a scalar of unhandled type: %s", object_name.GetCString(), ss.GetString().c_str());
1098 return false;
1099 }
1100
Greg Clayton061b79d2011-05-09 20:18:18 +00001101 RegisterInfo *reg_info = location_value->GetRegisterInfo();
Sean Callanan50339fe2011-03-04 00:23:47 +00001102
Greg Clayton061b79d2011-05-09 20:18:18 +00001103 if (!reg_info)
Sean Callanan50339fe2011-03-04 00:23:47 +00001104 {
1105 err.SetErrorStringWithFormat("Couldn't get the register information for %s", object_name.GetCString());
1106 return false;
1107 }
1108
Greg Clayton061b79d2011-05-09 20:18:18 +00001109 RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
Sean Callanan50339fe2011-03-04 00:23:47 +00001110
Greg Clayton061b79d2011-05-09 20:18:18 +00001111 if (!reg_ctx)
Sean Callanan50339fe2011-03-04 00:23:47 +00001112 {
Greg Clayton061b79d2011-05-09 20:18:18 +00001113 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 +00001114 return false;
1115 }
1116
Greg Clayton061b79d2011-05-09 20:18:18 +00001117 uint32_t register_number = reg_info->kinds[lldb::eRegisterKindLLDB];
Sean Callanan50339fe2011-03-04 00:23:47 +00001118
Greg Clayton061b79d2011-05-09 20:18:18 +00001119 object_ptr = reg_ctx->ReadRegisterAsUnsigned(register_number, 0x0);
Sean Callanan50339fe2011-03-04 00:23:47 +00001120
1121 return true;
1122 }
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001123 }
1124}
1125
1126bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001127ClangExpressionDeclMap::Dematerialize
1128(
Sean Callananaa301c42010-12-03 01:38:59 +00001129 ExecutionContext &exe_ctx,
Greg Clayton427f2902010-12-14 02:59:59 +00001130 ClangExpressionVariableSP &result_sp,
Sean Callanan0ddf8062011-05-09 22:04:36 +00001131 lldb::addr_t stack_frame_top,
1132 lldb::addr_t stack_frame_bottom,
Greg Clayton8de27c72010-10-15 22:48:33 +00001133 Error &err
1134)
Sean Callananf328c9f2010-07-20 23:31:16 +00001135{
Sean Callanan0ddf8062011-05-09 22:04:36 +00001136 return DoMaterialize(true, exe_ctx, stack_frame_top, stack_frame_bottom, &result_sp, err);
Sean Callananaa301c42010-12-03 01:38:59 +00001137
1138 DidDematerialize();
1139}
1140
1141void
1142ClangExpressionDeclMap::DidDematerialize()
1143{
1144 if (m_material_vars.get())
1145 {
1146 if (m_material_vars->m_materialized_location)
1147 {
1148 //#define SINGLE_STEP_EXPRESSIONS
1149
1150#ifndef SINGLE_STEP_EXPRESSIONS
1151 m_material_vars->m_process->DeallocateMemory(m_material_vars->m_materialized_location);
1152#endif
1153 m_material_vars->m_materialized_location = 0;
1154 }
1155
1156 DisableMaterialVars();
1157 }
Sean Callananf328c9f2010-07-20 23:31:16 +00001158}
1159
Sean Callanan32824aa2010-07-23 22:19:18 +00001160bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001161ClangExpressionDeclMap::DumpMaterializedStruct
1162(
Sean Callananaa301c42010-12-03 01:38:59 +00001163 ExecutionContext &exe_ctx,
Greg Clayton8de27c72010-10-15 22:48:33 +00001164 Stream &s,
1165 Error &err
1166)
Sean Callanan32824aa2010-07-23 22:19:18 +00001167{
Sean Callananaa301c42010-12-03 01:38:59 +00001168 assert (m_struct_vars.get());
1169 assert (m_material_vars.get());
1170
1171 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan32824aa2010-07-23 22:19:18 +00001172 {
1173 err.SetErrorString("Structure hasn't been laid out yet");
1174 return false;
1175 }
Greg Clayton567e7f32011-09-22 04:58:26 +00001176 Process *process = exe_ctx.GetProcessPtr();
1177
1178 if (!process)
Sean Callanan32824aa2010-07-23 22:19:18 +00001179 {
1180 err.SetErrorString("Couldn't find the process");
1181 return false;
1182 }
1183
Greg Clayton567e7f32011-09-22 04:58:26 +00001184 Target *target = exe_ctx.GetTargetPtr();
1185 if (!target)
Sean Callanan32824aa2010-07-23 22:19:18 +00001186 {
1187 err.SetErrorString("Couldn't find the target");
1188 return false;
1189 }
1190
Sean Callanan33711022010-12-07 10:00:20 +00001191 if (!m_material_vars->m_materialized_location)
1192 {
1193 err.SetErrorString("No materialized location");
1194 return false;
1195 }
1196
Greg Claytonc0fa5332011-05-22 22:46:53 +00001197 lldb::DataBufferSP data_sp(new DataBufferHeap(m_struct_vars->m_struct_size, 0));
Sean Callanan32824aa2010-07-23 22:19:18 +00001198
1199 Error error;
Greg Clayton567e7f32011-09-22 04:58:26 +00001200 if (process->ReadMemory (m_material_vars->m_materialized_location,
Greg Claytonc0fa5332011-05-22 22:46:53 +00001201 data_sp->GetBytes(),
1202 data_sp->GetByteSize(), error) != data_sp->GetByteSize())
Sean Callanan32824aa2010-07-23 22:19:18 +00001203 {
1204 err.SetErrorStringWithFormat ("Couldn't read struct from the target: %s", error.AsCString());
1205 return false;
1206 }
1207
Greg Clayton567e7f32011-09-22 04:58:26 +00001208 DataExtractor extractor(data_sp, process->GetByteOrder(), target->GetArchitecture().GetAddressByteSize());
Sean Callanan32824aa2010-07-23 22:19:18 +00001209
Greg Clayton427f2902010-12-14 02:59:59 +00001210 for (size_t member_idx = 0, num_members = m_struct_members.GetSize();
1211 member_idx < num_members;
1212 ++member_idx)
Sean Callanan32824aa2010-07-23 22:19:18 +00001213 {
Greg Clayton427f2902010-12-14 02:59:59 +00001214 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_idx));
Sean Callanan32824aa2010-07-23 22:19:18 +00001215
Greg Clayton427f2902010-12-14 02:59:59 +00001216 if (!member_sp)
1217 return false;
1218
1219 s.Printf("[%s]\n", member_sp->GetName().GetCString());
Sean Callanan8c127202010-08-23 23:09:38 +00001220
Greg Clayton427f2902010-12-14 02:59:59 +00001221 if (!member_sp->m_jit_vars.get())
Sean Callanan8c127202010-08-23 23:09:38 +00001222 return false;
1223
Greg Clayton427f2902010-12-14 02:59:59 +00001224 extractor.Dump (&s, // stream
1225 member_sp->m_jit_vars->m_offset, // offset
1226 lldb::eFormatBytesWithASCII, // format
1227 1, // byte size of individual entries
1228 member_sp->m_jit_vars->m_size, // number of entries
1229 16, // entries per line
1230 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, // address to print
1231 0, // bit size (bitfields only; 0 means ignore)
1232 0); // bit alignment (bitfields only; 0 means ignore)
Sean Callanan32824aa2010-07-23 22:19:18 +00001233
1234 s.PutChar('\n');
1235 }
1236
1237 return true;
1238}
1239
Sean Callananf328c9f2010-07-20 23:31:16 +00001240bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001241ClangExpressionDeclMap::DoMaterialize
1242(
1243 bool dematerialize,
Sean Callananaa301c42010-12-03 01:38:59 +00001244 ExecutionContext &exe_ctx,
Sean Callanan0ddf8062011-05-09 22:04:36 +00001245 lldb::addr_t stack_frame_top,
1246 lldb::addr_t stack_frame_bottom,
Greg Clayton427f2902010-12-14 02:59:59 +00001247 lldb::ClangExpressionVariableSP *result_sp_ptr,
Greg Clayton8de27c72010-10-15 22:48:33 +00001248 Error &err
1249)
Sean Callanan810f22d2010-07-16 00:09:46 +00001250{
Greg Clayton427f2902010-12-14 02:59:59 +00001251 if (result_sp_ptr)
1252 result_sp_ptr->reset();
1253
Sean Callananaa301c42010-12-03 01:38:59 +00001254 assert (m_struct_vars.get());
1255
Greg Claytone005f2c2010-11-06 01:53:30 +00001256 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan82b74c82010-08-12 01:56:52 +00001257
Sean Callananaa301c42010-12-03 01:38:59 +00001258 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan810f22d2010-07-16 00:09:46 +00001259 {
1260 err.SetErrorString("Structure hasn't been laid out yet");
Greg Clayton57067a02011-09-13 04:03:52 +00001261 return false;
Sean Callanan810f22d2010-07-16 00:09:46 +00001262 }
1263
Greg Clayton567e7f32011-09-22 04:58:26 +00001264 StackFrame *frame = exe_ctx.GetFramePtr();
1265 if (!frame)
Sean Callanan45839272010-07-24 01:37:44 +00001266 {
1267 err.SetErrorString("Received null execution frame");
Greg Clayton57067a02011-09-13 04:03:52 +00001268 return false;
Sean Callanan45839272010-07-24 01:37:44 +00001269 }
Greg Clayton567e7f32011-09-22 04:58:26 +00001270 Target *target = exe_ctx.GetTargetPtr();
Sean Callanan45839272010-07-24 01:37:44 +00001271
Greg Clayton567e7f32011-09-22 04:58:26 +00001272 ClangPersistentVariables &persistent_vars = target->GetPersistentVariables();
Sean Callananaa301c42010-12-03 01:38:59 +00001273
1274 if (!m_struct_vars->m_struct_size)
Sean Callanane8a59a82010-09-13 21:34:21 +00001275 {
1276 if (log)
1277 log->PutCString("Not bothering to allocate a struct because no arguments are needed");
1278
Sean Callanan9b6898f2011-07-30 02:42:06 +00001279 m_material_vars->m_allocated_area = NULL;
Sean Callanane8a59a82010-09-13 21:34:21 +00001280
1281 return true;
1282 }
1283
Greg Clayton567e7f32011-09-22 04:58:26 +00001284 const SymbolContext &sym_ctx(frame->GetSymbolContext(lldb::eSymbolContextEverything));
Sean Callanan810f22d2010-07-16 00:09:46 +00001285
Sean Callananf328c9f2010-07-20 23:31:16 +00001286 if (!dematerialize)
Sean Callanan810f22d2010-07-16 00:09:46 +00001287 {
Greg Clayton567e7f32011-09-22 04:58:26 +00001288 Process *process = exe_ctx.GetProcessPtr();
Sean Callananaa301c42010-12-03 01:38:59 +00001289 if (m_material_vars->m_materialized_location)
Sean Callananf328c9f2010-07-20 23:31:16 +00001290 {
Greg Clayton567e7f32011-09-22 04:58:26 +00001291 process->DeallocateMemory(m_material_vars->m_materialized_location);
Sean Callananaa301c42010-12-03 01:38:59 +00001292 m_material_vars->m_materialized_location = 0;
Sean Callananf328c9f2010-07-20 23:31:16 +00001293 }
1294
Sean Callanan7a60b942010-10-08 01:58:41 +00001295 if (log)
1296 log->PutCString("Allocating memory for materialized argument struct");
1297
Greg Clayton567e7f32011-09-22 04:58:26 +00001298 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 +00001299 lldb::ePermissionsReadable | lldb::ePermissionsWritable,
1300 err);
Sean Callananf328c9f2010-07-20 23:31:16 +00001301
1302 if (mem == LLDB_INVALID_ADDRESS)
1303 return false;
1304
Sean Callananaa301c42010-12-03 01:38:59 +00001305 m_material_vars->m_allocated_area = mem;
Sean Callanan810f22d2010-07-16 00:09:46 +00001306 }
1307
Sean Callananaa301c42010-12-03 01:38:59 +00001308 m_material_vars->m_materialized_location = m_material_vars->m_allocated_area;
Sean Callananf328c9f2010-07-20 23:31:16 +00001309
Sean Callananaa301c42010-12-03 01:38:59 +00001310 if (m_material_vars->m_materialized_location % m_struct_vars->m_struct_alignment)
1311 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 +00001312
Greg Clayton427f2902010-12-14 02:59:59 +00001313 for (uint64_t member_index = 0, num_members = m_struct_members.GetSize();
Sean Callanan8c127202010-08-23 23:09:38 +00001314 member_index < num_members;
1315 ++member_index)
Sean Callanan810f22d2010-07-16 00:09:46 +00001316 {
Greg Clayton427f2902010-12-14 02:59:59 +00001317 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
Sean Callanan810f22d2010-07-16 00:09:46 +00001318
Greg Claytona875b642011-01-09 21:07:35 +00001319 if (m_found_entities.ContainsVariable (member_sp))
Sean Callanan8c127202010-08-23 23:09:38 +00001320 {
Greg Claytona875b642011-01-09 21:07:35 +00001321 RegisterInfo *reg_info = member_sp->GetRegisterInfo ();
Greg Clayton427f2902010-12-14 02:59:59 +00001322 if (reg_info)
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001323 {
1324 // This is a register variable
1325
Sean Callananaa301c42010-12-03 01:38:59 +00001326 RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001327
1328 if (!reg_ctx)
1329 return false;
1330
Greg Clayton427f2902010-12-14 02:59:59 +00001331 if (!DoMaterializeOneRegister (dematerialize,
1332 exe_ctx,
1333 *reg_ctx,
1334 *reg_info,
1335 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
1336 err))
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001337 return false;
1338 }
1339 else
1340 {
Greg Clayton427f2902010-12-14 02:59:59 +00001341 if (!member_sp->m_jit_vars.get())
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001342 return false;
1343
Greg Clayton427f2902010-12-14 02:59:59 +00001344 if (!DoMaterializeOneVariable (dematerialize,
1345 exe_ctx,
Sean Callanan6a925532011-01-13 08:53:35 +00001346 sym_ctx,
1347 member_sp,
Greg Clayton427f2902010-12-14 02:59:59 +00001348 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
1349 err))
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001350 return false;
1351 }
Sean Callanan8c127202010-08-23 23:09:38 +00001352 }
Sean Callanan8c127202010-08-23 23:09:38 +00001353 else
1354 {
Greg Claytona875b642011-01-09 21:07:35 +00001355 // No need to look for presistent variables if the name doesn't start
1356 // with with a '$' character...
1357 if (member_sp->GetName().AsCString ("!")[0] == '$' && persistent_vars.ContainsVariable(member_sp))
1358 {
Sean Callanan6a925532011-01-13 08:53:35 +00001359
Greg Claytona875b642011-01-09 21:07:35 +00001360 if (member_sp->GetName() == m_struct_vars->m_result_name)
1361 {
Greg Claytona875b642011-01-09 21:07:35 +00001362 if (log)
1363 log->PutCString("Found result member in the struct");
Sean Callanan6a925532011-01-13 08:53:35 +00001364
Greg Claytona875b642011-01-09 21:07:35 +00001365 if (result_sp_ptr)
1366 *result_sp_ptr = member_sp;
Sean Callanan6a925532011-01-13 08:53:35 +00001367
Greg Claytona875b642011-01-09 21:07:35 +00001368 }
1369
1370 if (!DoMaterializeOnePersistentVariable (dematerialize,
Sean Callanan6a925532011-01-13 08:53:35 +00001371 exe_ctx,
Greg Claytona875b642011-01-09 21:07:35 +00001372 member_sp,
Sean Callanan0ddf8062011-05-09 22:04:36 +00001373 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
1374 stack_frame_top,
1375 stack_frame_bottom,
Greg Claytona875b642011-01-09 21:07:35 +00001376 err))
1377 return false;
1378 }
1379 else
1380 {
1381 err.SetErrorStringWithFormat("Unexpected variable %s", member_sp->GetName().GetCString());
1382 return false;
1383 }
Sean Callanan8c127202010-08-23 23:09:38 +00001384 }
Sean Callanan810f22d2010-07-16 00:09:46 +00001385 }
1386
Sean Callananf328c9f2010-07-20 23:31:16 +00001387 return true;
1388}
1389
Sean Callanana48fe162010-08-11 03:57:18 +00001390bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001391ClangExpressionDeclMap::DoMaterializeOnePersistentVariable
1392(
1393 bool dematerialize,
1394 ExecutionContext &exe_ctx,
Greg Clayton427f2902010-12-14 02:59:59 +00001395 ClangExpressionVariableSP &var_sp,
Greg Clayton8de27c72010-10-15 22:48:33 +00001396 lldb::addr_t addr,
Sean Callanan0ddf8062011-05-09 22:04:36 +00001397 lldb::addr_t stack_frame_top,
1398 lldb::addr_t stack_frame_bottom,
Greg Clayton8de27c72010-10-15 22:48:33 +00001399 Error &err
1400)
Sean Callananaa301c42010-12-03 01:38:59 +00001401{
Sean Callanan6a925532011-01-13 08:53:35 +00001402 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1403
Greg Clayton427f2902010-12-14 02:59:59 +00001404 if (!var_sp)
Sean Callanana48fe162010-08-11 03:57:18 +00001405 {
Greg Clayton427f2902010-12-14 02:59:59 +00001406 err.SetErrorString("Invalid persistent variable");
Sean Callanana48fe162010-08-11 03:57:18 +00001407 return LLDB_INVALID_ADDRESS;
1408 }
1409
Greg Clayton427f2902010-12-14 02:59:59 +00001410 const size_t pvar_byte_size = var_sp->GetByteSize();
Sean Callanana6223432010-08-20 01:02:30 +00001411
Greg Clayton427f2902010-12-14 02:59:59 +00001412 uint8_t *pvar_data = var_sp->GetValueBytes();
1413 if (pvar_data == NULL)
Sean Callanana6223432010-08-20 01:02:30 +00001414 return false;
1415
Sean Callanana48fe162010-08-11 03:57:18 +00001416 Error error;
Greg Clayton567e7f32011-09-22 04:58:26 +00001417 Process *process = exe_ctx.GetProcessPtr();
1418
Sean Callanan6a925532011-01-13 08:53:35 +00001419 lldb::addr_t mem; // The address of a spare memory area used to hold the persistent variable.
1420
Sean Callanana48fe162010-08-11 03:57:18 +00001421 if (dematerialize)
1422 {
Sean Callanan6a925532011-01-13 08:53:35 +00001423 if (log)
1424 log->Printf("Dematerializing persistent variable with flags 0x%hx", var_sp->m_flags);
1425
1426 if ((var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) ||
1427 (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference))
Sean Callanana48fe162010-08-11 03:57:18 +00001428 {
Sean Callanan6a925532011-01-13 08:53:35 +00001429 // Get the location of the target out of the struct.
1430
1431 Error read_error;
Greg Clayton567e7f32011-09-22 04:58:26 +00001432 mem = process->ReadPointerFromMemory (addr, read_error);
Sean Callanan6a925532011-01-13 08:53:35 +00001433
1434 if (mem == LLDB_INVALID_ADDRESS)
1435 {
1436 err.SetErrorStringWithFormat("Couldn't read address of %s from struct: %s", var_sp->GetName().GetCString(), error.AsCString());
1437 return false;
1438 }
1439
1440 if (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference &&
1441 !var_sp->m_live_sp)
1442 {
1443 // If the reference comes from the program, then the ClangExpressionVariable's
1444 // live variable data hasn't been set up yet. Do this now.
1445
Jim Ingham47da8102011-04-22 23:53:53 +00001446 var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope (),
1447 var_sp->GetTypeFromUser().GetASTContext(),
1448 var_sp->GetTypeFromUser().GetOpaqueQualType(),
1449 var_sp->GetName(),
1450 mem,
1451 eAddressTypeLoad,
1452 pvar_byte_size);
Sean Callanan6a925532011-01-13 08:53:35 +00001453 }
1454
1455 if (!var_sp->m_live_sp)
1456 {
1457 err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", var_sp->GetName().GetCString());
1458 return false;
1459 }
1460
Greg Claytonb3448432011-03-24 21:19:54 +00001461 if (var_sp->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
Sean Callanan6a925532011-01-13 08:53:35 +00001462 {
1463 err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", var_sp->GetName().GetCString());
1464 return false;
1465 }
1466
Sean Callanan97678d12011-01-13 21:23:32 +00001467 if (var_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry ||
1468 var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
Sean Callanan6a925532011-01-13 08:53:35 +00001469 {
1470 mem = var_sp->m_live_sp->GetValue().GetScalar().ULongLong();
1471
1472 if (log)
1473 log->Printf("Dematerializing %s from 0x%llx", var_sp->GetName().GetCString(), (uint64_t)mem);
1474
1475 // Read the contents of the spare memory area
Sean Callanan0ddf8062011-05-09 22:04:36 +00001476
Sean Callanan6a925532011-01-13 08:53:35 +00001477 var_sp->ValueUpdated ();
Greg Clayton567e7f32011-09-22 04:58:26 +00001478 if (process->ReadMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
Sean Callanan6a925532011-01-13 08:53:35 +00001479 {
1480 err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString());
1481 return false;
1482 }
1483
Sean Callanan0ddf8062011-05-09 22:04:36 +00001484 if (stack_frame_top != LLDB_INVALID_ADDRESS &&
1485 stack_frame_bottom != LLDB_INVALID_ADDRESS &&
1486 mem >= stack_frame_bottom &&
1487 mem <= stack_frame_top)
1488 {
1489 // If the variable is resident in the stack frame created by the expression,
1490 // then it cannot be relied upon to stay around. We treat it as needing
1491 // reallocation.
1492
1493 var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
1494 var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
1495 var_sp->m_flags &= ~ClangExpressionVariable::EVIsProgramReference;
1496 }
1497
Sean Callanan6a925532011-01-13 08:53:35 +00001498 var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsFreezeDry;
1499 }
1500
1501 if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation &&
1502 !(var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget))
1503 {
1504 if (m_keep_result_in_memory)
1505 {
1506 var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget;
1507 }
1508 else
1509 {
Greg Clayton567e7f32011-09-22 04:58:26 +00001510 Error deallocate_error = process->DeallocateMemory(mem);
Sean Callanan6a925532011-01-13 08:53:35 +00001511
1512 if (!err.Success())
1513 {
1514 err.SetErrorStringWithFormat ("Couldn't deallocate memory for %s: %s", var_sp->GetName().GetCString(), deallocate_error.AsCString());
1515 return false;
1516 }
1517 }
1518 }
1519 }
1520 else
1521 {
1522 err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
Sean Callanana48fe162010-08-11 03:57:18 +00001523 return false;
1524 }
1525 }
1526 else
1527 {
Sean Callanan6a925532011-01-13 08:53:35 +00001528 if (log)
1529 log->Printf("Materializing persistent variable with flags 0x%hx", var_sp->m_flags);
1530
1531 if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation)
Sean Callanana48fe162010-08-11 03:57:18 +00001532 {
Sean Callanan6a925532011-01-13 08:53:35 +00001533 // Allocate a spare memory area to store the persistent variable's contents.
1534
1535 Error allocate_error;
1536
Greg Clayton567e7f32011-09-22 04:58:26 +00001537 mem = process->AllocateMemory(pvar_byte_size,
Sean Callanan6a925532011-01-13 08:53:35 +00001538 lldb::ePermissionsReadable | lldb::ePermissionsWritable,
1539 allocate_error);
1540
1541 if (mem == LLDB_INVALID_ADDRESS)
1542 {
1543 err.SetErrorStringWithFormat("Couldn't allocate a memory area to store %s: %s", var_sp->GetName().GetCString(), allocate_error.AsCString());
1544 return false;
1545 }
1546
1547 if (log)
1548 log->Printf("Allocated %s (0x%llx) sucessfully", var_sp->GetName().GetCString(), mem);
1549
1550 // Put the location of the spare memory into the live data of the ValueObject.
1551
Jim Ingham47da8102011-04-22 23:53:53 +00001552 var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
1553 var_sp->GetTypeFromUser().GetASTContext(),
1554 var_sp->GetTypeFromUser().GetOpaqueQualType(),
1555 var_sp->GetName(),
1556 mem,
1557 eAddressTypeLoad,
1558 pvar_byte_size);
Sean Callanan6a925532011-01-13 08:53:35 +00001559
1560 // Clear the flag if the variable will never be deallocated.
1561
1562 if (var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
1563 var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsAllocation;
1564
1565 // Write the contents of the variable to the area.
1566
Greg Clayton567e7f32011-09-22 04:58:26 +00001567 if (process->WriteMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
Sean Callanan6a925532011-01-13 08:53:35 +00001568 {
1569 err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString());
1570 return false;
1571 }
1572 }
1573
1574 if ((var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && var_sp->m_live_sp) ||
1575 var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated)
1576 {
Sean Callanan6a925532011-01-13 08:53:35 +00001577 // Now write the location of the area into the struct.
Sean Callanan6a925532011-01-13 08:53:35 +00001578 Error write_error;
Greg Clayton567e7f32011-09-22 04:58:26 +00001579 if (!process->WriteScalarToMemory (addr,
Greg Claytonc0fa5332011-05-22 22:46:53 +00001580 var_sp->m_live_sp->GetValue().GetScalar(),
Greg Clayton567e7f32011-09-22 04:58:26 +00001581 process->GetAddressByteSize(),
Greg Claytonc0fa5332011-05-22 22:46:53 +00001582 write_error))
Sean Callanan6a925532011-01-13 08:53:35 +00001583 {
1584 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", var_sp->GetName().GetCString(), write_error.AsCString());
1585 return false;
1586 }
1587
1588 if (log)
Greg Claytonc0fa5332011-05-22 22:46:53 +00001589 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 +00001590 }
Sean Callanan696cf5f2011-05-07 01:06:41 +00001591 else if (!(var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference))
Sean Callanan6a925532011-01-13 08:53:35 +00001592 {
1593 err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
Sean Callanana48fe162010-08-11 03:57:18 +00001594 return false;
1595 }
1596 }
1597
1598 return true;
1599}
1600
Sean Callananf328c9f2010-07-20 23:31:16 +00001601bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001602ClangExpressionDeclMap::DoMaterializeOneVariable
1603(
1604 bool dematerialize,
1605 ExecutionContext &exe_ctx,
1606 const SymbolContext &sym_ctx,
Sean Callanan6a925532011-01-13 08:53:35 +00001607 ClangExpressionVariableSP &expr_var,
Greg Clayton8de27c72010-10-15 22:48:33 +00001608 lldb::addr_t addr,
1609 Error &err
1610)
Sean Callananf328c9f2010-07-20 23:31:16 +00001611{
Greg Claytone005f2c2010-11-06 01:53:30 +00001612 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Greg Clayton567e7f32011-09-22 04:58:26 +00001613 Target *target = exe_ctx.GetTargetPtr();
1614 Process *process = exe_ctx.GetProcessPtr();
1615 StackFrame *frame = exe_ctx.GetFramePtr();
1616
Sean Callanan6d284ef2011-10-12 22:20:02 +00001617 if (!frame || !process || !target || !m_parser_vars.get() || !expr_var->m_parser_vars.get())
Sean Callanancc074622010-09-14 21:59:34 +00001618 return false;
1619
Sean Callanan6a925532011-01-13 08:53:35 +00001620 // Vital information about the value
1621
1622 const ConstString &name(expr_var->GetName());
1623 TypeFromUser type(expr_var->GetTypeFromUser());
1624
Sean Callanan4a078322011-10-13 00:09:20 +00001625 VariableSP &var(expr_var->m_parser_vars->m_lldb_var);
1626 lldb_private::Symbol *sym(expr_var->m_parser_vars->m_lldb_sym);
Sean Callananf328c9f2010-07-20 23:31:16 +00001627
Sean Callanan81974962011-05-08 02:21:26 +00001628 std::auto_ptr<lldb_private::Value> location_value;
Sean Callanan4a078322011-10-13 00:09:20 +00001629
Sean Callanan81974962011-05-08 02:21:26 +00001630 if (var)
1631 {
1632 location_value.reset(GetVariableValue(exe_ctx,
1633 var,
1634 NULL));
1635 }
1636 else if (sym)
Sean Callanan4a078322011-10-13 00:09:20 +00001637 {
Greg Clayton567e7f32011-09-22 04:58:26 +00001638 addr_t location_load_addr = GetSymbolAddress(*target, name);
Sean Callanan81974962011-05-08 02:21:26 +00001639
Greg Claytoncbc07cf2011-06-23 04:25:29 +00001640 if (location_load_addr == LLDB_INVALID_ADDRESS)
Sean Callanan81974962011-05-08 02:21:26 +00001641 {
1642 if (log)
Greg Claytonc0fa5332011-05-22 22:46:53 +00001643 err.SetErrorStringWithFormat ("Couldn't find value for global symbol %s",
1644 name.GetCString());
Sean Callanan81974962011-05-08 02:21:26 +00001645 }
1646
Sean Callanan4a078322011-10-13 00:09:20 +00001647 location_value.reset(new Value);
1648
Sean Callanan81974962011-05-08 02:21:26 +00001649 location_value->SetValueType(Value::eValueTypeLoadAddress);
1650 location_value->GetScalar() = location_load_addr;
1651 }
1652 else
Sean Callananf328c9f2010-07-20 23:31:16 +00001653 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001654 err.SetErrorStringWithFormat ("Couldn't find %s with appropriate type",
1655 name.GetCString());
Sean Callananf328c9f2010-07-20 23:31:16 +00001656 return false;
1657 }
1658
Sean Callanan841026f2010-07-23 00:16:21 +00001659 if (log)
Sean Callananfb3058e2011-05-12 23:54:16 +00001660 {
1661 StreamString my_stream_string;
1662
1663 ClangASTType::DumpTypeDescription (type.GetASTContext(),
1664 type.GetOpaqueQualType(),
1665 &my_stream_string);
1666
Greg Claytonc0fa5332011-05-22 22:46:53 +00001667 log->Printf ("%s %s with type %s",
1668 dematerialize ? "Dematerializing" : "Materializing",
1669 name.GetCString(),
1670 my_stream_string.GetString().c_str());
Sean Callananfb3058e2011-05-12 23:54:16 +00001671 }
Sean Callananf328c9f2010-07-20 23:31:16 +00001672
1673 if (!location_value.get())
1674 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001675 err.SetErrorStringWithFormat("Couldn't get value for %s", name.GetCString());
Sean Callananf328c9f2010-07-20 23:31:16 +00001676 return false;
1677 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001678
1679 // The size of the type contained in addr
Sean Callananf328c9f2010-07-20 23:31:16 +00001680
Sean Callanan6a925532011-01-13 08:53:35 +00001681 size_t value_bit_size = ClangASTType::GetClangTypeBitWidth(type.GetASTContext(), type.GetOpaqueQualType());
1682 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 +00001683
1684 Value::ValueType value_type = location_value->GetValueType();
1685
1686 switch (value_type)
Sean Callananf328c9f2010-07-20 23:31:16 +00001687 {
Sean Callanan17c6a052010-10-05 20:18:48 +00001688 default:
Sean Callananf328c9f2010-07-20 23:31:16 +00001689 {
Sean Callanan17c6a052010-10-05 20:18:48 +00001690 StreamString ss;
1691
1692 location_value->Dump(&ss);
1693
Greg Claytonc0fa5332011-05-22 22:46:53 +00001694 err.SetErrorStringWithFormat ("%s has a value of unhandled type: %s",
1695 name.GetCString(),
1696 ss.GetString().c_str());
Sean Callananf328c9f2010-07-20 23:31:16 +00001697 return false;
1698 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001699 break;
1700 case Value::eValueTypeLoadAddress:
Sean Callananf328c9f2010-07-20 23:31:16 +00001701 {
Sean Callanan6a925532011-01-13 08:53:35 +00001702 if (!dematerialize)
Sean Callanan17c6a052010-10-05 20:18:48 +00001703 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001704 Error write_error;
Sean Callanan6a925532011-01-13 08:53:35 +00001705
Greg Clayton567e7f32011-09-22 04:58:26 +00001706 if (!process->WriteScalarToMemory (addr,
Greg Claytonc0fa5332011-05-22 22:46:53 +00001707 location_value->GetScalar(),
Greg Clayton567e7f32011-09-22 04:58:26 +00001708 process->GetAddressByteSize(),
Greg Claytonc0fa5332011-05-22 22:46:53 +00001709 write_error))
Sean Callanan6a925532011-01-13 08:53:35 +00001710 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001711 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
1712 name.GetCString(),
1713 write_error.AsCString());
Sean Callanan6a925532011-01-13 08:53:35 +00001714 return false;
1715 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001716 }
Sean Callananf328c9f2010-07-20 23:31:16 +00001717 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001718 break;
1719 case Value::eValueTypeScalar:
1720 {
Greg Clayton6916e352010-11-13 03:52:47 +00001721 if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
Sean Callanan17c6a052010-10-05 20:18:48 +00001722 {
1723 StreamString ss;
Sean Callanan17c6a052010-10-05 20:18:48 +00001724 location_value->Dump(&ss);
1725
Greg Claytonc0fa5332011-05-22 22:46:53 +00001726 err.SetErrorStringWithFormat ("%s is a scalar of unhandled type: %s",
1727 name.GetCString(),
1728 ss.GetString().c_str());
Sean Callanan17c6a052010-10-05 20:18:48 +00001729 return false;
1730 }
1731
Greg Clayton061b79d2011-05-09 20:18:18 +00001732 RegisterInfo *reg_info = location_value->GetRegisterInfo();
Sean Callanan17c6a052010-10-05 20:18:48 +00001733
Greg Clayton061b79d2011-05-09 20:18:18 +00001734 if (!reg_info)
Sean Callanan17c6a052010-10-05 20:18:48 +00001735 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001736 err.SetErrorStringWithFormat ("Couldn't get the register information for %s",
1737 name.GetCString());
Sean Callanan17c6a052010-10-05 20:18:48 +00001738 return false;
1739 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001740
Greg Clayton061b79d2011-05-09 20:18:18 +00001741 RegisterValue reg_value;
1742
1743 RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
1744
1745 if (!reg_ctx)
Sean Callanan17c6a052010-10-05 20:18:48 +00001746 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001747 err.SetErrorStringWithFormat ("Couldn't read register context to read %s from %s",
1748 name.GetCString(),
1749 reg_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001750 return false;
1751 }
1752
Greg Clayton061b79d2011-05-09 20:18:18 +00001753 uint32_t register_byte_size = reg_info->byte_size;
Sean Callanan17c6a052010-10-05 20:18:48 +00001754
1755 if (dematerialize)
1756 {
Sean Callanan6a925532011-01-13 08:53:35 +00001757 // Get the location of the spare memory area out of the variable's live data.
1758
1759 if (!expr_var->m_live_sp)
1760 {
1761 err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", name.GetCString());
1762 return false;
1763 }
1764
Greg Claytonb3448432011-03-24 21:19:54 +00001765 if (expr_var->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
Sean Callanan6a925532011-01-13 08:53:35 +00001766 {
1767 err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", name.GetCString());
1768 return false;
1769 }
1770
Greg Claytonc0fa5332011-05-22 22:46:53 +00001771 Scalar &reg_addr = expr_var->m_live_sp->GetValue().GetScalar();
Sean Callanan6a925532011-01-13 08:53:35 +00001772
Greg Claytonc0fa5332011-05-22 22:46:53 +00001773 err = reg_ctx->ReadRegisterValueFromMemory (reg_info,
1774 reg_addr.ULongLong(),
1775 value_byte_size,
1776 reg_value);
Greg Clayton061b79d2011-05-09 20:18:18 +00001777 if (err.Fail())
Sean Callanan17c6a052010-10-05 20:18:48 +00001778 return false;
Greg Clayton061b79d2011-05-09 20:18:18 +00001779
1780 if (!reg_ctx->WriteRegister (reg_info, reg_value))
Sean Callanan17c6a052010-10-05 20:18:48 +00001781 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001782 err.SetErrorStringWithFormat ("Couldn't write %s to register %s",
1783 name.GetCString(),
1784 reg_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001785 return false;
1786 }
Sean Callanan6a925532011-01-13 08:53:35 +00001787
1788 // Deallocate the spare area and clear the variable's live data.
1789
Greg Clayton567e7f32011-09-22 04:58:26 +00001790 Error deallocate_error = process->DeallocateMemory(reg_addr.ULongLong());
Sean Callanan6a925532011-01-13 08:53:35 +00001791
1792 if (!deallocate_error.Success())
1793 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001794 err.SetErrorStringWithFormat ("Couldn't deallocate spare memory area for %s: %s",
1795 name.GetCString(),
1796 deallocate_error.AsCString());
Sean Callanan6a925532011-01-13 08:53:35 +00001797 return false;
1798 }
1799
1800 expr_var->m_live_sp.reset();
Sean Callanan17c6a052010-10-05 20:18:48 +00001801 }
1802 else
1803 {
Sean Callanan6a925532011-01-13 08:53:35 +00001804 // Allocate a spare memory area to place the register's contents into. This memory area will be pointed to by the slot in the
1805 // struct.
1806
1807 Error allocate_error;
1808
Greg Clayton567e7f32011-09-22 04:58:26 +00001809 Scalar reg_addr (process->AllocateMemory (value_byte_size,
Greg Claytonc0fa5332011-05-22 22:46:53 +00001810 lldb::ePermissionsReadable | lldb::ePermissionsWritable,
1811 allocate_error));
Sean Callanan6a925532011-01-13 08:53:35 +00001812
Greg Claytonc0fa5332011-05-22 22:46:53 +00001813 if (reg_addr.ULongLong() == LLDB_INVALID_ADDRESS)
Sean Callanan6a925532011-01-13 08:53:35 +00001814 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001815 err.SetErrorStringWithFormat ("Couldn't allocate a memory area to store %s: %s",
1816 name.GetCString(),
1817 allocate_error.AsCString());
Sean Callanan6a925532011-01-13 08:53:35 +00001818 return false;
1819 }
1820
1821 // Put the location of the spare memory into the live data of the ValueObject.
1822
Jim Ingham47da8102011-04-22 23:53:53 +00001823 expr_var->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
1824 type.GetASTContext(),
1825 type.GetOpaqueQualType(),
1826 name,
Greg Claytonc0fa5332011-05-22 22:46:53 +00001827 reg_addr.ULongLong(),
Jim Ingham47da8102011-04-22 23:53:53 +00001828 eAddressTypeLoad,
1829 value_byte_size);
Sean Callanan6a925532011-01-13 08:53:35 +00001830
1831 // Now write the location of the area into the struct.
1832
1833 Error write_error;
Greg Claytonc0fa5332011-05-22 22:46:53 +00001834
Greg Clayton567e7f32011-09-22 04:58:26 +00001835 if (!process->WriteScalarToMemory (addr,
Greg Claytonc0fa5332011-05-22 22:46:53 +00001836 reg_addr,
Greg Clayton567e7f32011-09-22 04:58:26 +00001837 process->GetAddressByteSize(),
Greg Claytonc0fa5332011-05-22 22:46:53 +00001838 write_error))
Sean Callanan6a925532011-01-13 08:53:35 +00001839 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001840 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
1841 name.GetCString(),
1842 write_error.AsCString());
Sean Callanan6a925532011-01-13 08:53:35 +00001843 return false;
1844 }
1845
Sean Callanan6a925532011-01-13 08:53:35 +00001846 if (value_byte_size > register_byte_size)
Sean Callanan17c6a052010-10-05 20:18:48 +00001847 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001848 err.SetErrorStringWithFormat ("%s is too big to store in %s",
1849 name.GetCString(),
1850 reg_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001851 return false;
1852 }
Greg Clayton061b79d2011-05-09 20:18:18 +00001853
1854 RegisterValue reg_value;
1855
1856 if (!reg_ctx->ReadRegister (reg_info, reg_value))
Sean Callanan17c6a052010-10-05 20:18:48 +00001857 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001858 err.SetErrorStringWithFormat ("Couldn't read %s from %s",
1859 name.GetCString(),
1860 reg_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001861 return false;
1862 }
1863
Greg Claytonc0fa5332011-05-22 22:46:53 +00001864 err = reg_ctx->WriteRegisterValueToMemory (reg_info,
1865 reg_addr.ULongLong(),
1866 value_byte_size,
1867 reg_value);
Greg Clayton061b79d2011-05-09 20:18:18 +00001868 if (err.Fail())
Sean Callanan17c6a052010-10-05 20:18:48 +00001869 return false;
Sean Callanan17c6a052010-10-05 20:18:48 +00001870 }
1871 }
Sean Callananf328c9f2010-07-20 23:31:16 +00001872 }
1873
1874 return true;
Sean Callanan810f22d2010-07-16 00:09:46 +00001875}
1876
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001877bool
1878ClangExpressionDeclMap::DoMaterializeOneRegister
1879(
1880 bool dematerialize,
1881 ExecutionContext &exe_ctx,
1882 RegisterContext &reg_ctx,
Greg Claytonb3448432011-03-24 21:19:54 +00001883 const RegisterInfo &reg_info,
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001884 lldb::addr_t addr,
1885 Error &err
1886)
1887{
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001888 uint32_t register_byte_size = reg_info.byte_size;
Greg Clayton061b79d2011-05-09 20:18:18 +00001889 RegisterValue reg_value;
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001890 if (dematerialize)
1891 {
Greg Clayton061b79d2011-05-09 20:18:18 +00001892 Error read_error (reg_ctx.ReadRegisterValueFromMemory(&reg_info, addr, register_byte_size, reg_value));
1893 if (read_error.Fail())
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001894 {
Greg Claytonbdcb6ab2011-01-25 23:55:37 +00001895 err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", reg_info.name, read_error.AsCString());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001896 return false;
1897 }
1898
Greg Clayton061b79d2011-05-09 20:18:18 +00001899 if (!reg_ctx.WriteRegister (&reg_info, reg_value))
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001900 {
Greg Clayton061b79d2011-05-09 20:18:18 +00001901 err.SetErrorStringWithFormat("Couldn't write register %s (dematerialize)", reg_info.name);
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001902 return false;
1903 }
1904 }
1905 else
1906 {
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001907
Greg Clayton061b79d2011-05-09 20:18:18 +00001908 if (!reg_ctx.ReadRegister(&reg_info, reg_value))
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001909 {
Greg Clayton061b79d2011-05-09 20:18:18 +00001910 err.SetErrorStringWithFormat("Couldn't read %s (materialize)", reg_info.name);
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001911 return false;
1912 }
1913
Greg Clayton061b79d2011-05-09 20:18:18 +00001914 Error write_error (reg_ctx.WriteRegisterValueToMemory(&reg_info, addr, register_byte_size, reg_value));
1915 if (write_error.Fail())
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001916 {
Jason Molenda95b7b432011-09-20 00:26:08 +00001917 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", reg_info.name, write_error.AsCString());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001918 return false;
1919 }
1920 }
1921
1922 return true;
1923}
1924
Sean Callanan696cf5f2011-05-07 01:06:41 +00001925lldb::VariableSP
Greg Clayton8de27c72010-10-15 22:48:33 +00001926ClangExpressionDeclMap::FindVariableInScope
1927(
1928 StackFrame &frame,
1929 const ConstString &name,
1930 TypeFromUser *type
1931)
Sean Callananaa301c42010-12-03 01:38:59 +00001932{
Greg Claytone005f2c2010-11-06 01:53:30 +00001933 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanancc074622010-09-14 21:59:34 +00001934
Sean Callananf8b468e2011-08-06 00:28:14 +00001935 ValueObjectSP valobj;
1936 VariableSP var_sp;
1937 Error err;
Sean Callanancc074622010-09-14 21:59:34 +00001938
Sean Callananf8b468e2011-08-06 00:28:14 +00001939 valobj = frame.GetValueForVariableExpressionPath(name.GetCString(),
1940 eNoDynamicValues,
1941 StackFrame::eExpressionPathOptionCheckPtrVsMember,
1942 var_sp,
1943 err);
Greg Clayton3bc52d02010-11-14 22:13:40 +00001944
Sean Callananf8b468e2011-08-06 00:28:14 +00001945 if (!err.Success() ||
1946 !var_sp ||
Sean Callananae9f7482011-07-07 23:05:43 +00001947 !var_sp->IsInScope(&frame) ||
1948 !var_sp->LocationIsValidForFrame (&frame))
1949 return lldb::VariableSP();
Greg Clayton3bc52d02010-11-14 22:13:40 +00001950
1951 if (var_sp && type)
1952 {
1953 if (type->GetASTContext() == var_sp->GetType()->GetClangAST())
1954 {
Greg Clayton04c9c7b2011-02-16 23:00:21 +00001955 if (!ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType()))
Sean Callanan696cf5f2011-05-07 01:06:41 +00001956 return lldb::VariableSP();
Greg Clayton3bc52d02010-11-14 22:13:40 +00001957 }
1958 else
1959 {
1960 if (log)
1961 log->PutCString("Skipping a candidate variable because of different AST contexts");
Sean Callanan696cf5f2011-05-07 01:06:41 +00001962 return lldb::VariableSP();
Greg Clayton3bc52d02010-11-14 22:13:40 +00001963 }
Sean Callanancc074622010-09-14 21:59:34 +00001964 }
Greg Clayton3bc52d02010-11-14 22:13:40 +00001965
Sean Callanan696cf5f2011-05-07 01:06:41 +00001966 return var_sp;
Sean Callanancc074622010-09-14 21:59:34 +00001967}
Sean Callanan336a0002010-07-17 00:43:37 +00001968
Sean Callanan81974962011-05-08 02:21:26 +00001969Symbol *
1970ClangExpressionDeclMap::FindGlobalDataSymbol
1971(
1972 Target &target,
Sean Callananaa4a5532011-10-13 16:49:47 +00001973 const ConstString &name
Sean Callanan81974962011-05-08 02:21:26 +00001974)
1975{
1976 SymbolContextList sc_list;
1977
Sean Callananaa4a5532011-10-13 16:49:47 +00001978 target.GetImages().FindSymbolsWithNameAndType(name,
1979 eSymbolTypeData,
1980 sc_list);
Sean Callanan81974962011-05-08 02:21:26 +00001981
1982 if (sc_list.GetSize())
1983 {
1984 SymbolContext sym_ctx;
1985 sc_list.GetContextAtIndex(0, sym_ctx);
1986
1987 return sym_ctx.symbol;
1988 }
1989
1990 return NULL;
1991}
1992
Sean Callanan47dc4572011-09-15 02:13:07 +00001993lldb::VariableSP
1994ClangExpressionDeclMap::FindGlobalVariable
1995(
1996 Target &target,
Sean Callanan94cd0ca2011-10-12 16:59:31 +00001997 ModuleSP &module,
1998 const ConstString &name,
1999 ClangNamespaceDecl *namespace_decl,
Sean Callanan47dc4572011-09-15 02:13:07 +00002000 TypeFromUser *type
2001)
2002{
2003 VariableList vars;
Sean Callanan47dc4572011-09-15 02:13:07 +00002004
Sean Callanan94cd0ca2011-10-12 16:59:31 +00002005 if (module && namespace_decl)
2006 module->FindGlobalVariables (name, namespace_decl, true, -1, vars);
2007 else
2008 target.GetImages().FindGlobalVariables(name, true, -1, vars);
Sean Callanan47dc4572011-09-15 02:13:07 +00002009
2010 if (vars.GetSize())
2011 {
2012 if (type)
2013 {
2014 for (size_t i = 0; i < vars.GetSize(); ++i)
2015 {
2016 VariableSP var_sp = vars.GetVariableAtIndex(i);
2017
2018 if (type->GetASTContext() == var_sp->GetType()->GetClangAST())
2019 {
2020 if (ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType()))
2021 return var_sp;
2022 }
2023 }
2024 }
2025 else
2026 {
2027 return vars.GetVariableAtIndex(0);
2028 }
2029 }
2030
2031 return VariableSP();
2032}
2033
Sean Callanana7cb1fa2011-10-21 22:18:07 +00002034// Interface for ClangASTImporter
2035
2036void
2037ClangExpressionDeclMap::CompleteNamespaceMap (ClangASTImporter::NamespaceMapSP &namespace_map,
2038 const ConstString &name,
2039 ClangASTImporter::NamespaceMapSP &parent_map) const
2040{
2041 static unsigned int invocation_id = 0;
2042 unsigned int current_id = invocation_id++;
2043
2044 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2045
2046 if (log)
2047 {
2048 if (parent_map && parent_map->size())
2049 log->Printf("CompleteNamespaceMap[%u] Searching for namespace %s in namespace %s",
2050 current_id,
2051 name.GetCString(),
2052 parent_map->begin()->second.GetNamespaceDecl()->getDeclName().getAsString().c_str());
2053 else
2054 log->Printf("CompleteNamespaceMap[%u] Searching for namespace %s",
2055 current_id,
2056 name.GetCString());
2057 }
2058
2059
2060 if (parent_map)
2061 {
2062 for (ClangASTImporter::NamespaceMap::iterator i = parent_map->begin(), e = parent_map->end();
2063 i != e;
2064 ++i)
2065 {
2066 ClangNamespaceDecl found_namespace_decl;
2067
2068 ModuleSP module_sp = i->first;
2069 ClangNamespaceDecl module_parent_namespace_decl = i->second;
2070
2071 SymbolVendor *symbol_vendor = module_sp->GetSymbolVendor();
2072
2073 if (!symbol_vendor)
2074 continue;
2075
2076 SymbolContext null_sc;
2077
2078 found_namespace_decl = symbol_vendor->FindNamespace(null_sc, name, &module_parent_namespace_decl);
2079
2080 if (!found_namespace_decl)
2081 continue;
2082
2083 namespace_map->push_back(std::pair<ModuleSP, ClangNamespaceDecl>(module_sp, found_namespace_decl));
2084
2085 if (log)
2086 log->Printf(" CMN[%u] Found namespace %s in module %s",
2087 current_id,
2088 name.GetCString(),
2089 module_sp->GetFileSpec().GetFilename().GetCString());
2090 }
2091 }
2092 else
2093 {
2094 ModuleList &images = m_parser_vars->m_sym_ctx.target_sp->GetImages();
2095 ClangNamespaceDecl null_namespace_decl;
2096
2097 for (uint32_t i = 0, e = images.GetSize();
2098 i != e;
2099 ++i)
2100 {
2101 ModuleSP image = images.GetModuleAtIndex(i);
2102
2103 if (!image)
2104 continue;
2105
2106 ClangNamespaceDecl found_namespace_decl;
2107
2108 SymbolVendor *symbol_vendor = image->GetSymbolVendor();
2109
2110 if (!symbol_vendor)
2111 continue;
2112
2113 SymbolContext null_sc;
2114
2115 found_namespace_decl = symbol_vendor->FindNamespace(null_sc, name, &null_namespace_decl);
2116
2117 if (!found_namespace_decl)
2118 continue;
2119
2120 namespace_map->push_back(std::pair<ModuleSP, ClangNamespaceDecl>(image, found_namespace_decl));
2121
2122 if (log)
2123 log->Printf(" CMN[%u] Found namespace %s in module %s",
2124 current_id,
2125 name.GetCString(),
2126 image->GetFileSpec().GetFilename().GetCString());
2127 }
2128 }
2129}
2130
Chris Lattner24943d22010-06-08 16:52:24 +00002131// Interface for ClangASTSource
Sean Callanan47dc4572011-09-15 02:13:07 +00002132
Sean Callanan16b53ab2011-10-12 00:12:34 +00002133void
2134ClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context, const ConstString &name)
Chris Lattner24943d22010-06-08 16:52:24 +00002135{
Greg Claytone005f2c2010-11-06 01:53:30 +00002136 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Chris Lattner24943d22010-06-08 16:52:24 +00002137
Sean Callananaa301c42010-12-03 01:38:59 +00002138 if (m_parser_vars->m_ignore_lookups)
Sean Callananee8fc722010-11-19 20:20:02 +00002139 {
Sean Callanan67bbb112011-10-14 20:34:21 +00002140 if (log && log->GetVerbose())
Sean Callananee8fc722010-11-19 20:20:02 +00002141 log->Printf("Ignoring a query during an import");
2142 return;
2143 }
Greg Claytone6d72ca2011-06-25 00:44:06 +00002144
Sean Callanan67bbb112011-10-14 20:34:21 +00002145 static unsigned int invocation_id = 0;
2146 unsigned int current_id = invocation_id++;
2147
Sean Callanan16b53ab2011-10-12 00:12:34 +00002148 if (log)
2149 {
2150 if (!context.m_decl_context)
Sean Callanan67bbb112011-10-14 20:34:21 +00002151 log->Printf("FindExternalVisibleDecls[%u] for '%s' in a NULL DeclContext", current_id, name.GetCString());
Sean Callanan16b53ab2011-10-12 00:12:34 +00002152 else if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context.m_decl_context))
Sean Callanan67bbb112011-10-14 20:34:21 +00002153 log->Printf("FindExternalVisibleDecls[%u] for '%s' in '%s'", current_id, name.GetCString(), context_named_decl->getNameAsString().c_str());
Sean Callanan16b53ab2011-10-12 00:12:34 +00002154 else
Sean Callanan67bbb112011-10-14 20:34:21 +00002155 log->Printf("FindExternalVisibleDecls[%u] for '%s' in a '%s'", current_id, name.GetCString(), context.m_decl_context->getDeclKindName());
Sean Callanan16b53ab2011-10-12 00:12:34 +00002156 }
Sean Callanana7597062011-10-13 21:08:11 +00002157
2158 context.m_namespace_map.reset(new ClangASTImporter::NamespaceMap);
Sean Callanan16b53ab2011-10-12 00:12:34 +00002159
2160 if (const NamespaceDecl *namespace_context = dyn_cast<NamespaceDecl>(context.m_decl_context))
2161 {
Sean Callanana7cb1fa2011-10-21 22:18:07 +00002162 ClangASTImporter::NamespaceMapSP namespace_map = m_parser_vars->GetASTImporter(context.GetASTContext())->GetNamespaceMap(namespace_context);
Sean Callanana7597062011-10-13 21:08:11 +00002163
Sean Callanan67bbb112011-10-14 20:34:21 +00002164 if (log && log->GetVerbose())
2165 log->Printf(" FEVD[%u] Inspecting namespace map %p (%d entries)",
2166 current_id,
2167 namespace_map.get(),
2168 (int)namespace_map->size());
Sean Callanana7597062011-10-13 21:08:11 +00002169
Sean Callanana7cb1fa2011-10-21 22:18:07 +00002170 if (!namespace_map)
2171 return;
2172
Sean Callanan16b53ab2011-10-12 00:12:34 +00002173 for (ClangASTImporter::NamespaceMap::iterator i = namespace_map->begin(), e = namespace_map->end();
2174 i != e;
2175 ++i)
2176 {
2177 if (log)
Sean Callanan67bbb112011-10-14 20:34:21 +00002178 log->Printf(" FEVD[%u] Searching namespace %s in module %s",
2179 current_id,
Sean Callanan16b53ab2011-10-12 00:12:34 +00002180 i->second.GetNamespaceDecl()->getNameAsString().c_str(),
2181 i->first->GetFileSpec().GetFilename().GetCString());
2182
Sean Callananc839adc2011-10-13 21:50:33 +00002183 FindExternalVisibleDecls(context,
2184 i->first,
2185 i->second,
Sean Callanan67bbb112011-10-14 20:34:21 +00002186 name,
2187 current_id);
Sean Callanan16b53ab2011-10-12 00:12:34 +00002188 }
2189 }
2190 else if (!isa<TranslationUnitDecl>(context.m_decl_context))
2191 {
2192 // we shouldn't be getting FindExternalVisibleDecls calls for these
2193 return;
2194 }
2195 else
2196 {
2197 ClangNamespaceDecl namespace_decl;
2198
2199 if (log)
Sean Callanan67bbb112011-10-14 20:34:21 +00002200 log->Printf(" FEVD[%u] Searching the root namespace", current_id);
Sean Callanan16b53ab2011-10-12 00:12:34 +00002201
2202 FindExternalVisibleDecls(context,
2203 lldb::ModuleSP(),
2204 namespace_decl,
Sean Callanan67bbb112011-10-14 20:34:21 +00002205 name,
2206 current_id);
Sean Callanan16b53ab2011-10-12 00:12:34 +00002207 }
Sean Callanana7597062011-10-13 21:08:11 +00002208
2209 if (!context.m_namespace_map->empty())
2210 {
Sean Callanan67bbb112011-10-14 20:34:21 +00002211 if (log && log->GetVerbose())
2212 log->Printf(" FEVD[%u] Registering namespace map %p (%d entries)",
2213 current_id,
2214 context.m_namespace_map.get(),
2215 (int)context.m_namespace_map->size());
Sean Callanana7597062011-10-13 21:08:11 +00002216
2217 NamespaceDecl *clang_namespace_decl = AddNamespace(context, context.m_namespace_map);
2218
2219 if (clang_namespace_decl)
2220 clang_namespace_decl->setHasExternalVisibleStorage();
2221 }
Sean Callanan16b53ab2011-10-12 00:12:34 +00002222}
2223
2224void
2225ClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context,
Sean Callanan38d084f2011-10-12 18:44:30 +00002226 lldb::ModuleSP module_sp,
Sean Callanan03f64ca2011-10-12 01:39:28 +00002227 ClangNamespaceDecl &namespace_decl,
Sean Callanan67bbb112011-10-14 20:34:21 +00002228 const ConstString &name,
2229 unsigned int current_id)
Sean Callanan16b53ab2011-10-12 00:12:34 +00002230{
2231 assert (m_struct_vars.get());
2232 assert (m_parser_vars.get());
2233
2234 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Greg Claytone6d72ca2011-06-25 00:44:06 +00002235
Greg Claytone5748d82010-11-09 23:46:37 +00002236 SymbolContextList sc_list;
Chris Lattner24943d22010-06-08 16:52:24 +00002237
Greg Clayton3bc52d02010-11-14 22:13:40 +00002238 const char *name_unique_cstr = name.GetCString();
2239
2240 if (name_unique_cstr == NULL)
2241 return;
2242
Greg Clayton8de27c72010-10-15 22:48:33 +00002243 // Only look for functions by name out in our symbols if the function
2244 // doesn't start with our phony prefix of '$'
Greg Clayton567e7f32011-09-22 04:58:26 +00002245 Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
2246 StackFrame *frame = m_parser_vars->m_exe_ctx->GetFramePtr();
Sean Callanan03f64ca2011-10-12 01:39:28 +00002247 if (name_unique_cstr[0] == '$' && !namespace_decl)
2248 {
2249 static ConstString g_lldb_class_name ("$__lldb_class");
2250
2251 if (name == g_lldb_class_name)
2252 {
2253 // Clang is looking for the type of "this"
2254
2255 if (!frame)
2256 return;
2257
2258 VariableList *vars = frame->GetVariableList(false);
2259
2260 if (!vars)
2261 return;
2262
2263 lldb::VariableSP this_var = vars->FindVariable(ConstString("this"));
2264
2265 if (!this_var ||
2266 !this_var->IsInScope(frame) ||
2267 !this_var->LocationIsValidForFrame (frame))
2268 return;
2269
2270 Type *this_type = this_var->GetType();
2271
2272 if (!this_type)
2273 return;
2274
Sean Callanan67bbb112011-10-14 20:34:21 +00002275 if (log && log->GetVerbose())
Sean Callanan03f64ca2011-10-12 01:39:28 +00002276 {
Sean Callanan67bbb112011-10-14 20:34:21 +00002277 log->Printf (" FEVD[%u] Type for \"this\" is: ", current_id);
Sean Callanan03f64ca2011-10-12 01:39:28 +00002278 StreamString strm;
2279 this_type->Dump(&strm, true);
2280 log->PutCString (strm.GetData());
2281 }
2282
2283 TypeFromUser this_user_type(this_type->GetClangFullType(),
2284 this_type->GetClangAST());
2285
2286 m_struct_vars->m_object_pointer_type = this_user_type;
2287
2288 void *pointer_target_type = NULL;
2289
2290 if (!ClangASTContext::IsPointerType(this_user_type.GetOpaqueQualType(),
2291 &pointer_target_type))
2292 return;
2293
2294 clang::QualType pointer_target_qual_type = QualType::getFromOpaquePtr(pointer_target_type);
2295
2296 if (pointer_target_qual_type.isConstQualified())
2297 pointer_target_qual_type.removeLocalConst();
2298
2299 TypeFromUser class_user_type(pointer_target_qual_type.getAsOpaquePtr(),
2300 this_type->GetClangAST());
2301
2302 if (log)
2303 {
Greg Claytona23ca422011-10-20 00:47:21 +00002304 ASTDumper ast_dumper(pointer_target_qual_type);
2305 log->Printf(" FEVD[%u] Adding type for $__lldb_class: %s", current_id, ast_dumper.GetCString());
Sean Callanan03f64ca2011-10-12 01:39:28 +00002306 }
2307
Sean Callanane3737fd2011-10-18 16:46:55 +00002308 AddOneType(context, class_user_type, current_id, true);
Sean Callanan03f64ca2011-10-12 01:39:28 +00002309
2310 return;
2311 }
2312
2313 static ConstString g_lldb_objc_class_name ("$__lldb_objc_class");
2314 if (name == g_lldb_objc_class_name)
2315 {
2316 // Clang is looking for the type of "*self"
2317
2318 if (!frame)
2319 return;
2320
2321 VariableList *vars = frame->GetVariableList(false);
2322
2323 if (!vars)
2324 return;
2325
2326 lldb::VariableSP self_var = vars->FindVariable(ConstString("self"));
2327
2328 if (!self_var ||
2329 !self_var->IsInScope(frame) ||
2330 !self_var->LocationIsValidForFrame (frame))
2331 return;
2332
2333 Type *self_type = self_var->GetType();
2334
2335 if (!self_type)
2336 return;
2337
2338 TypeFromUser self_user_type(self_type->GetClangFullType(),
2339 self_type->GetClangAST());
2340
2341 m_struct_vars->m_object_pointer_type = self_user_type;
2342
2343 void *pointer_target_type = NULL;
2344
2345 if (!ClangASTContext::IsPointerType(self_user_type.GetOpaqueQualType(),
2346 &pointer_target_type)
2347 || pointer_target_type == NULL)
2348 return;
2349
2350 TypeFromUser class_user_type(pointer_target_type,
2351 self_type->GetClangAST());
2352
2353 if (log)
2354 {
Greg Claytona23ca422011-10-20 00:47:21 +00002355 ASTDumper ast_dumper(pointer_target_type);
2356 log->Printf(" FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, ast_dumper.GetCString());
Sean Callanan03f64ca2011-10-12 01:39:28 +00002357 }
2358
Sean Callanane3737fd2011-10-18 16:46:55 +00002359 AddOneType(context, class_user_type, current_id, false);
Sean Callanan03f64ca2011-10-12 01:39:28 +00002360
2361 return;
2362 }
2363
2364 // any other $__lldb names should be weeded out now
2365 if (!::strncmp(name_unique_cstr, "$__lldb", sizeof("$__lldb") - 1))
2366 return;
2367
2368 do
2369 {
2370 if (!target)
2371 break;
2372
2373 ClangASTContext *scratch_clang_ast_context = target->GetScratchClangASTContext();
2374
2375 if (!scratch_clang_ast_context)
2376 break;
2377
2378 ASTContext *scratch_ast_context = scratch_clang_ast_context->getASTContext();
2379
2380 if (!scratch_ast_context)
2381 break;
2382
2383 TypeDecl *ptype_type_decl = m_parser_vars->m_persistent_vars->GetPersistentType(name);
2384
2385 if (!ptype_type_decl)
2386 break;
2387
2388 Decl *parser_ptype_decl = ClangASTContext::CopyDecl(context.GetASTContext(), scratch_ast_context, ptype_type_decl);
2389
2390 if (!parser_ptype_decl)
2391 break;
2392
2393 TypeDecl *parser_ptype_type_decl = dyn_cast<TypeDecl>(parser_ptype_decl);
2394
2395 if (!parser_ptype_type_decl)
2396 break;
2397
2398 if (log)
Sean Callanan67bbb112011-10-14 20:34:21 +00002399 log->Printf(" FEVD[%u] Found persistent type %s", current_id, name.GetCString());
Sean Callanan03f64ca2011-10-12 01:39:28 +00002400
2401 context.AddNamedDecl(parser_ptype_type_decl);
2402 } while (0);
2403
2404 ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name));
2405
2406 if (pvar_sp)
2407 {
Sean Callanan67bbb112011-10-14 20:34:21 +00002408 AddOneVariable(context, pvar_sp, current_id);
Sean Callanan03f64ca2011-10-12 01:39:28 +00002409 return;
2410 }
2411
2412 const char *reg_name(&name.GetCString()[1]);
2413
2414 if (m_parser_vars->m_exe_ctx->GetRegisterContext())
2415 {
2416 const RegisterInfo *reg_info(m_parser_vars->m_exe_ctx->GetRegisterContext()->GetRegisterInfoByName(reg_name));
Sean Callanane3737fd2011-10-18 16:46:55 +00002417
Sean Callanan03f64ca2011-10-12 01:39:28 +00002418 if (reg_info)
Sean Callanane3737fd2011-10-18 16:46:55 +00002419 {
2420 if (log)
2421 log->Printf(" FEVD[%u] Found register %s", current_id, reg_info->name);
2422
Sean Callanan67bbb112011-10-14 20:34:21 +00002423 AddOneRegister(context, reg_info, current_id);
Sean Callanane3737fd2011-10-18 16:46:55 +00002424 }
Sean Callanan03f64ca2011-10-12 01:39:28 +00002425 }
2426 }
2427 else
Sean Callanan0fc73582010-07-27 00:55:47 +00002428 {
Sean Callananf8b468e2011-08-06 00:28:14 +00002429 ValueObjectSP valobj;
2430 VariableSP var;
2431 Error err;
2432
Sean Callanan03f64ca2011-10-12 01:39:28 +00002433 if (frame && !namespace_decl)
Greg Clayton8de27c72010-10-15 22:48:33 +00002434 {
Greg Clayton567e7f32011-09-22 04:58:26 +00002435 valobj = frame->GetValueForVariableExpressionPath(name_unique_cstr,
Sean Callanan16b53ab2011-10-12 00:12:34 +00002436 eNoDynamicValues,
2437 StackFrame::eExpressionPathOptionCheckPtrVsMember,
2438 var,
2439 err);
Sean Callanan47dc4572011-09-15 02:13:07 +00002440
2441 // If we found a variable in scope, no need to pull up function names
2442 if (err.Success() && var != NULL)
2443 {
Sean Callanan67bbb112011-10-14 20:34:21 +00002444 AddOneVariable(context, var, current_id);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002445 context.m_found.variable = true;
Sean Callanan3a546762011-10-25 20:36:57 +00002446 return;
Sean Callanan47dc4572011-09-15 02:13:07 +00002447 }
Greg Clayton8de27c72010-10-15 22:48:33 +00002448 }
Greg Clayton567e7f32011-09-22 04:58:26 +00002449 else if (target)
Sean Callanan47dc4572011-09-15 02:13:07 +00002450 {
Sean Callanan94cd0ca2011-10-12 16:59:31 +00002451 var = FindGlobalVariable (*target,
Sean Callanan38d084f2011-10-12 18:44:30 +00002452 module_sp,
Sean Callanan94cd0ca2011-10-12 16:59:31 +00002453 name,
2454 &namespace_decl,
Greg Clayton567e7f32011-09-22 04:58:26 +00002455 NULL);
Sean Callanan47dc4572011-09-15 02:13:07 +00002456
2457 if (var)
2458 {
Sean Callanan67bbb112011-10-14 20:34:21 +00002459 AddOneVariable(context, var, current_id);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002460 context.m_found.variable = true;
Sean Callanan47dc4572011-09-15 02:13:07 +00002461 }
2462 }
2463
Sean Callanan16c4ec32011-10-12 20:29:25 +00002464 if (!context.m_found.variable)
Greg Clayton8de27c72010-10-15 22:48:33 +00002465 {
Greg Clayton28d5fcc2011-01-27 06:44:37 +00002466 const bool include_symbols = true;
2467 const bool append = false;
Sean Callanana5ec5a32011-10-12 17:38:09 +00002468
Sean Callanan38d084f2011-10-12 18:44:30 +00002469 if (namespace_decl && module_sp)
Sean Callanana5ec5a32011-10-12 17:38:09 +00002470 {
Sean Callanan38d084f2011-10-12 18:44:30 +00002471 module_sp->FindFunctions(name,
2472 &namespace_decl,
2473 eFunctionNameTypeBase,
2474 include_symbols,
2475 append,
2476 sc_list);
Sean Callanana5ec5a32011-10-12 17:38:09 +00002477 }
2478 else
2479 {
2480 target->GetImages().FindFunctions(name,
2481 eFunctionNameTypeBase,
2482 include_symbols,
2483 append,
2484 sc_list);
2485 }
2486
Sean Callanan81974962011-05-08 02:21:26 +00002487 if (sc_list.GetSize())
Greg Clayton8de27c72010-10-15 22:48:33 +00002488 {
Sean Callanan81974962011-05-08 02:21:26 +00002489 Symbol *generic_symbol = NULL;
2490 Symbol *non_extern_symbol = NULL;
2491
2492 for (uint32_t index = 0, num_indices = sc_list.GetSize();
2493 index < num_indices;
2494 ++index)
Greg Clayton8de27c72010-10-15 22:48:33 +00002495 {
Sean Callanan81974962011-05-08 02:21:26 +00002496 SymbolContext sym_ctx;
2497 sc_list.GetContextAtIndex(index, sym_ctx);
2498
2499 if (sym_ctx.function)
2500 {
2501 // TODO only do this if it's a C function; C++ functions may be
2502 // overloaded
Sean Callanan16c4ec32011-10-12 20:29:25 +00002503 if (!context.m_found.function_with_type_info)
Sean Callanan67bbb112011-10-14 20:34:21 +00002504 AddOneFunction(context, sym_ctx.function, NULL, current_id);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002505 context.m_found.function_with_type_info = true;
2506 context.m_found.function = true;
Sean Callanan81974962011-05-08 02:21:26 +00002507 }
2508 else if (sym_ctx.symbol)
2509 {
2510 if (sym_ctx.symbol->IsExternal())
2511 generic_symbol = sym_ctx.symbol;
2512 else
2513 non_extern_symbol = sym_ctx.symbol;
2514 }
Greg Clayton8de27c72010-10-15 22:48:33 +00002515 }
Sean Callanan81974962011-05-08 02:21:26 +00002516
Sean Callanan16c4ec32011-10-12 20:29:25 +00002517 if (!context.m_found.function_with_type_info)
Greg Clayton8de27c72010-10-15 22:48:33 +00002518 {
Sean Callanan81974962011-05-08 02:21:26 +00002519 if (generic_symbol)
Sean Callanan47dc4572011-09-15 02:13:07 +00002520 {
Sean Callanan67bbb112011-10-14 20:34:21 +00002521 AddOneFunction (context, NULL, generic_symbol, current_id);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002522 context.m_found.function = true;
Sean Callanan47dc4572011-09-15 02:13:07 +00002523 }
Sean Callanan81974962011-05-08 02:21:26 +00002524 else if (non_extern_symbol)
Sean Callanan47dc4572011-09-15 02:13:07 +00002525 {
Sean Callanan67bbb112011-10-14 20:34:21 +00002526 AddOneFunction (context, NULL, non_extern_symbol, current_id);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002527 context.m_found.function = true;
Sean Callanan47dc4572011-09-15 02:13:07 +00002528 }
Sean Callanan81974962011-05-08 02:21:26 +00002529 }
Greg Clayton8de27c72010-10-15 22:48:33 +00002530 }
Sean Callanan47dc4572011-09-15 02:13:07 +00002531
Sean Callanan16c4ec32011-10-12 20:29:25 +00002532 if (!context.m_found.variable)
Greg Clayton8de27c72010-10-15 22:48:33 +00002533 {
Sean Callanan16c4ec32011-10-12 20:29:25 +00002534 // We couldn't find a non-symbol variable for this. Now we'll hunt for a generic
Sean Callanan81974962011-05-08 02:21:26 +00002535 // data symbol, and -- if it is found -- treat it as a variable.
2536
Sean Callananaa4a5532011-10-13 16:49:47 +00002537 Symbol *data_symbol = FindGlobalDataSymbol(*target, name);
Sean Callanan81974962011-05-08 02:21:26 +00002538
2539 if (data_symbol)
Sean Callanan47dc4572011-09-15 02:13:07 +00002540 {
Sean Callanan67bbb112011-10-14 20:34:21 +00002541 AddOneGenericVariable(context, *data_symbol, current_id);
Sean Callanan16c4ec32011-10-12 20:29:25 +00002542 context.m_found.variable = true;
Sean Callanan47dc4572011-09-15 02:13:07 +00002543 }
Greg Clayton6916e352010-11-13 03:52:47 +00002544 }
Sean Callanan92aa6662010-09-07 21:49:41 +00002545 }
Greg Claytone6d72ca2011-06-25 00:44:06 +00002546
Sean Callanana7597062011-10-13 21:08:11 +00002547 if (module_sp && namespace_decl)
Greg Claytone6d72ca2011-06-25 00:44:06 +00002548 {
Sean Callanana7597062011-10-13 21:08:11 +00002549 ClangNamespaceDecl found_namespace_decl;
Greg Claytone6d72ca2011-06-25 00:44:06 +00002550
Sean Callanana7597062011-10-13 21:08:11 +00002551 SymbolVendor *symbol_vendor = module_sp->GetSymbolVendor();
Sean Callanan16b53ab2011-10-12 00:12:34 +00002552
Sean Callanana7597062011-10-13 21:08:11 +00002553 if (symbol_vendor)
Sean Callanan16b53ab2011-10-12 00:12:34 +00002554 {
Sean Callanana7597062011-10-13 21:08:11 +00002555 SymbolContext null_sc;
Sean Callanan16b53ab2011-10-12 00:12:34 +00002556
Sean Callanana7597062011-10-13 21:08:11 +00002557 found_namespace_decl = symbol_vendor->FindNamespace(null_sc, name, &namespace_decl);
2558
2559 if (found_namespace_decl)
2560 {
2561 context.m_namespace_map->push_back(std::pair<ModuleSP, ClangNamespaceDecl>(module_sp, found_namespace_decl));
Sean Callanan16b53ab2011-10-12 00:12:34 +00002562
Sean Callanana7597062011-10-13 21:08:11 +00002563 if (log)
Sean Callanan67bbb112011-10-14 20:34:21 +00002564 log->Printf(" FEVD[%u] Found namespace %s in module %s",
2565 current_id,
Sean Callanana7597062011-10-13 21:08:11 +00002566 name.GetCString(),
2567 module_sp->GetFileSpec().GetFilename().GetCString());
Sean Callanan16b53ab2011-10-12 00:12:34 +00002568 }
2569 }
2570 }
Sean Callanana7597062011-10-13 21:08:11 +00002571 else
Sean Callanan16b53ab2011-10-12 00:12:34 +00002572 {
Sean Callanana7597062011-10-13 21:08:11 +00002573 ModuleList &images = m_parser_vars->m_sym_ctx.target_sp->GetImages();
2574
2575 for (uint32_t i = 0, e = images.GetSize();
2576 i != e;
2577 ++i)
2578 {
2579 ModuleSP image = images.GetModuleAtIndex(i);
2580
2581 if (!image)
2582 continue;
2583
2584 ClangNamespaceDecl found_namespace_decl;
2585
2586 SymbolVendor *symbol_vendor = image->GetSymbolVendor();
2587
2588 if (!symbol_vendor)
2589 continue;
2590
2591 SymbolContext null_sc;
2592
2593 found_namespace_decl = symbol_vendor->FindNamespace(null_sc, name, &namespace_decl);
2594
2595 if (found_namespace_decl)
2596 {
2597 context.m_namespace_map->push_back(std::pair<ModuleSP, ClangNamespaceDecl>(image, found_namespace_decl));
2598
2599 if (log)
Sean Callanan67bbb112011-10-14 20:34:21 +00002600 log->Printf(" FEVD[%u] Found namespace %s in module %s",
2601 current_id,
Sean Callanana7597062011-10-13 21:08:11 +00002602 name.GetCString(),
2603 image->GetFileSpec().GetFilename().GetCString());
2604 }
2605 }
Sean Callanan16b53ab2011-10-12 00:12:34 +00002606 }
Sean Callanan03f64ca2011-10-12 01:39:28 +00002607 }
Sean Callanan3cfbd332010-10-06 00:10:07 +00002608
Sean Callanan38d084f2011-10-12 18:44:30 +00002609 TypeList types;
2610 SymbolContext null_sc;
2611
2612 if (module_sp && namespace_decl)
2613 module_sp->FindTypes(null_sc, name, &namespace_decl, true, 1, types);
2614 else
2615 target->GetImages().FindTypes (null_sc, name, true, 1, types);
2616
2617 if (types.GetSize())
Sean Callanan6df08402010-09-27 23:54:58 +00002618 {
Sean Callanan38d084f2011-10-12 18:44:30 +00002619 TypeSP type_sp = types.GetTypeAtIndex(0);
2620
Sean Callananee8fc722010-11-19 20:20:02 +00002621 if (log)
Sean Callanan6df08402010-09-27 23:54:58 +00002622 {
Sean Callanan67bbb112011-10-14 20:34:21 +00002623 const char *name_string = type_sp->GetName().GetCString();
2624
2625 log->Printf(" FEVD[%u] Matching type found for \"%s\": %s",
2626 current_id,
2627 name.GetCString(),
2628 (name_string ? name_string : "<anonymous>"));
Sean Callananee8fc722010-11-19 20:20:02 +00002629 }
Greg Clayton2403b5e2010-11-16 02:10:54 +00002630
Sean Callanan38d084f2011-10-12 18:44:30 +00002631 TypeFromUser user_type(type_sp->GetClangFullType(),
2632 type_sp->GetClangAST());
Sean Callanan6df08402010-09-27 23:54:58 +00002633
Sean Callanane3737fd2011-10-18 16:46:55 +00002634 AddOneType(context, user_type, current_id, false);
Sean Callanan6df08402010-09-27 23:54:58 +00002635 }
Sean Callanan336a0002010-07-17 00:43:37 +00002636}
Greg Claytone6d72ca2011-06-25 00:44:06 +00002637
Sean Callanan9b6898f2011-07-30 02:42:06 +00002638clang::ExternalLoadResult
2639ClangExpressionDeclMap::FindExternalLexicalDecls (const DeclContext *decl_context,
2640 bool (*predicate)(Decl::Kind),
2641 llvm::SmallVectorImpl<Decl*> &decls)
Greg Claytone6d72ca2011-06-25 00:44:06 +00002642{
Greg Claytone6d72ca2011-06-25 00:44:06 +00002643 assert (m_parser_vars.get());
2644
Sean Callanan9b6898f2011-07-30 02:42:06 +00002645 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2646
2647 const Decl *context_decl = dyn_cast<Decl>(decl_context);
2648
2649 if (!context_decl)
2650 return ELR_Failure;
2651
2652 ASTContext *ast_context = &context_decl->getASTContext();
2653
Sean Callananc22cde82011-10-14 01:15:27 +00002654 static unsigned int invocation_id = 0;
2655 unsigned int current_id = invocation_id++;
2656
Sean Callanan9b6898f2011-07-30 02:42:06 +00002657 if (log)
Sean Callanan16b53ab2011-10-12 00:12:34 +00002658 {
2659 if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context_decl))
Sean Callananc22cde82011-10-14 01:15:27 +00002660 log->Printf("FindExternalLexicalDecls[%u] in '%s' (a %s) with %s predicate",
2661 current_id,
Sean Callanan16b53ab2011-10-12 00:12:34 +00002662 context_named_decl->getNameAsString().c_str(),
2663 context_decl->getDeclKindName(),
2664 (predicate ? "non-null" : "null"));
2665 else if(context_decl)
Sean Callananc22cde82011-10-14 01:15:27 +00002666 log->Printf("FindExternalLexicalDecls[%u] in a %s with %s predicate",
2667 current_id,
Sean Callanan16b53ab2011-10-12 00:12:34 +00002668 context_decl->getDeclKindName(),
2669 (predicate ? "non-null" : "null"));
2670 else
Sean Callananc22cde82011-10-14 01:15:27 +00002671 log->Printf("FindExternalLexicalDecls[%u] in a NULL context with %s predicate",
2672 current_id,
Sean Callanan16b53ab2011-10-12 00:12:34 +00002673 (predicate ? "non-null" : "null"));
2674 }
Sean Callanan9b6898f2011-07-30 02:42:06 +00002675
2676 Decl *original_decl = NULL;
2677 ASTContext *original_ctx = NULL;
2678
2679 ClangASTImporter *ast_importer = m_parser_vars->GetASTImporter(ast_context);
2680
2681 if (!ast_importer)
2682 return ELR_Failure;
2683
2684 if (!ast_importer->ResolveDeclOrigin(context_decl, &original_decl, &original_ctx))
2685 return ELR_Failure;
Greg Claytone6d72ca2011-06-25 00:44:06 +00002686
2687 if (log)
Sean Callanane3737fd2011-10-18 16:46:55 +00002688 {
2689 log->Printf(" FELD[%u] Original decl:", current_id);
2690 ASTDumper(original_decl).ToLog(log, " ");
Sean Callanan9b6898f2011-07-30 02:42:06 +00002691 }
2692
2693 if (TagDecl *original_tag_decl = dyn_cast<TagDecl>(original_decl))
2694 {
2695 ExternalASTSource *external_source = original_ctx->getExternalSource();
Greg Claytone6d72ca2011-06-25 00:44:06 +00002696
Sean Callananc6139712011-08-11 23:56:13 +00002697 if (external_source)
2698 external_source->CompleteType (original_tag_decl);
Sean Callanan9b6898f2011-07-30 02:42:06 +00002699 }
2700
2701 DeclContext *original_decl_context = dyn_cast<DeclContext>(original_decl);
2702
2703 if (!original_decl_context)
2704 return ELR_Failure;
2705
2706 for (TagDecl::decl_iterator iter = original_decl_context->decls_begin();
2707 iter != original_decl_context->decls_end();
2708 ++iter)
2709 {
2710 Decl *decl = *iter;
2711
2712 if (!predicate || predicate(decl->getKind()))
Greg Claytone6d72ca2011-06-25 00:44:06 +00002713 {
Sean Callanan9b6898f2011-07-30 02:42:06 +00002714 if (log)
2715 {
Greg Claytona23ca422011-10-20 00:47:21 +00002716 ASTDumper ast_dumper(decl);
Sean Callananc22cde82011-10-14 01:15:27 +00002717 if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context_decl))
Greg Claytona23ca422011-10-20 00:47:21 +00002718 log->Printf(" FELD[%d] Adding [to %s] lexical decl %s", current_id, context_named_decl->getNameAsString().c_str(), ast_dumper.GetCString());
Sean Callananc22cde82011-10-14 01:15:27 +00002719 else
Greg Claytona23ca422011-10-20 00:47:21 +00002720 log->Printf(" FELD[%d] Adding lexical decl %s", current_id, ast_dumper.GetCString());
Sean Callanan9b6898f2011-07-30 02:42:06 +00002721 }
2722
2723 Decl *copied_decl = ast_importer->CopyDecl(original_ctx, decl);
Greg Claytone6d72ca2011-06-25 00:44:06 +00002724
Sean Callanan9b6898f2011-07-30 02:42:06 +00002725 decls.push_back(copied_decl);
Greg Claytone6d72ca2011-06-25 00:44:06 +00002726 }
2727 }
2728
Sean Callanan9b6898f2011-07-30 02:42:06 +00002729 return ELR_AlreadyLoaded;
2730}
2731
2732void
2733ClangExpressionDeclMap::CompleteTagDecl (TagDecl *tag_decl)
2734{
2735 assert (m_parser_vars.get());
2736
2737 m_parser_vars->GetASTImporter(&tag_decl->getASTContext())->CompleteTagDecl (tag_decl);
2738}
2739
2740void
2741ClangExpressionDeclMap::CompleteObjCInterfaceDecl (clang::ObjCInterfaceDecl *interface_decl)
2742{
2743 assert (m_parser_vars.get());
2744
2745 m_parser_vars->GetASTImporter(&interface_decl->getASTContext())->CompleteObjCInterfaceDecl (interface_decl);
Greg Claytone6d72ca2011-06-25 00:44:06 +00002746}
2747
Sean Callanan336a0002010-07-17 00:43:37 +00002748Value *
Greg Clayton8de27c72010-10-15 22:48:33 +00002749ClangExpressionDeclMap::GetVariableValue
2750(
2751 ExecutionContext &exe_ctx,
Sean Callanan4a078322011-10-13 00:09:20 +00002752 VariableSP &var,
Sean Callanan9b6898f2011-07-30 02:42:06 +00002753 ASTContext *parser_ast_context,
Greg Clayton8de27c72010-10-15 22:48:33 +00002754 TypeFromUser *user_type,
2755 TypeFromParser *parser_type
2756)
Chris Lattner24943d22010-06-08 16:52:24 +00002757{
Greg Claytone005f2c2010-11-06 01:53:30 +00002758 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan6184dfe2010-06-23 00:47:48 +00002759
Chris Lattner24943d22010-06-08 16:52:24 +00002760 Type *var_type = var->GetType();
2761
2762 if (!var_type)
2763 {
Sean Callanan810f22d2010-07-16 00:09:46 +00002764 if (log)
2765 log->PutCString("Skipped a definition because it has no type");
Sean Callanan336a0002010-07-17 00:43:37 +00002766 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00002767 }
2768
Greg Clayton04c9c7b2011-02-16 23:00:21 +00002769 clang_type_t var_opaque_type = var_type->GetClangFullType();
Chris Lattner24943d22010-06-08 16:52:24 +00002770
2771 if (!var_opaque_type)
2772 {
Sean Callanan810f22d2010-07-16 00:09:46 +00002773 if (log)
2774 log->PutCString("Skipped a definition because it has no Clang type");
Sean Callanan336a0002010-07-17 00:43:37 +00002775 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00002776 }
2777
Sean Callanan9b6898f2011-07-30 02:42:06 +00002778 ASTContext *ast = var_type->GetClangASTContext().getASTContext();
Chris Lattner24943d22010-06-08 16:52:24 +00002779
Greg Claytonb01000f2011-01-17 03:46:26 +00002780 if (!ast)
Chris Lattner24943d22010-06-08 16:52:24 +00002781 {
Sean Callanan810f22d2010-07-16 00:09:46 +00002782 if (log)
2783 log->PutCString("There is no AST context for the current execution context");
Sean Callanan336a0002010-07-17 00:43:37 +00002784 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00002785 }
2786
Sean Callanan336a0002010-07-17 00:43:37 +00002787 DWARFExpression &var_location_expr = var->LocationExpression();
2788
Chris Lattner24943d22010-06-08 16:52:24 +00002789 std::auto_ptr<Value> var_location(new Value);
2790
Greg Clayton178710c2010-09-14 02:20:48 +00002791 lldb::addr_t loclist_base_load_addr = LLDB_INVALID_ADDRESS;
2792
Greg Clayton567e7f32011-09-22 04:58:26 +00002793 Target *target = exe_ctx.GetTargetPtr();
2794
Greg Clayton178710c2010-09-14 02:20:48 +00002795 if (var_location_expr.IsLocationList())
2796 {
2797 SymbolContext var_sc;
2798 var->CalculateSymbolContext (&var_sc);
Greg Clayton567e7f32011-09-22 04:58:26 +00002799 loclist_base_load_addr = var_sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress (target);
Greg Clayton178710c2010-09-14 02:20:48 +00002800 }
Chris Lattner24943d22010-06-08 16:52:24 +00002801 Error err;
2802
Greg Claytonbdcb6ab2011-01-25 23:55:37 +00002803 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 +00002804 {
Sean Callanan810f22d2010-07-16 00:09:46 +00002805 if (log)
2806 log->Printf("Error evaluating location: %s", err.AsCString());
Sean Callanan336a0002010-07-17 00:43:37 +00002807 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00002808 }
Greg Claytonb01000f2011-01-17 03:46:26 +00002809
Sean Callanan58baaad2011-07-08 00:39:14 +00002810 void *type_to_use = NULL;
Sean Callanan336a0002010-07-17 00:43:37 +00002811
Sean Callananf328c9f2010-07-20 23:31:16 +00002812 if (parser_ast_context)
2813 {
Greg Claytonb01000f2011-01-17 03:46:26 +00002814 type_to_use = GuardedCopyType(parser_ast_context, ast, var_opaque_type);
Sean Callananf328c9f2010-07-20 23:31:16 +00002815
Sean Callanan4b5eec62010-11-20 02:19:29 +00002816 if (!type_to_use)
2817 {
2818 if (log)
2819 log->Printf("Couldn't copy a variable's type into the parser's AST context");
2820
2821 return NULL;
2822 }
2823
Sean Callananf328c9f2010-07-20 23:31:16 +00002824 if (parser_type)
2825 *parser_type = TypeFromParser(type_to_use, parser_ast_context);
2826 }
Sean Callanan336a0002010-07-17 00:43:37 +00002827 else
2828 type_to_use = var_opaque_type;
Chris Lattner24943d22010-06-08 16:52:24 +00002829
2830 if (var_location.get()->GetContextType() == Value::eContextTypeInvalid)
Greg Clayton6916e352010-11-13 03:52:47 +00002831 var_location.get()->SetContext(Value::eContextTypeClangType, type_to_use);
Chris Lattner24943d22010-06-08 16:52:24 +00002832
2833 if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress)
2834 {
2835 SymbolContext var_sc;
2836 var->CalculateSymbolContext(&var_sc);
Sean Callanan336a0002010-07-17 00:43:37 +00002837
Chris Lattner24943d22010-06-08 16:52:24 +00002838 if (!var_sc.module_sp)
Sean Callanan336a0002010-07-17 00:43:37 +00002839 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00002840
2841 ObjectFile *object_file = var_sc.module_sp->GetObjectFile();
2842
2843 if (!object_file)
Sean Callanan336a0002010-07-17 00:43:37 +00002844 return NULL;
2845
Chris Lattner24943d22010-06-08 16:52:24 +00002846 Address so_addr(var_location->GetScalar().ULongLong(), object_file->GetSectionList());
2847
Greg Clayton567e7f32011-09-22 04:58:26 +00002848 lldb::addr_t load_addr = so_addr.GetLoadAddress(target);
Chris Lattner24943d22010-06-08 16:52:24 +00002849
Sean Callanan47dc4572011-09-15 02:13:07 +00002850 if (load_addr != LLDB_INVALID_ADDRESS)
2851 {
2852 var_location->GetScalar() = load_addr;
2853 var_location->SetValueType(Value::eValueTypeLoadAddress);
2854 }
Chris Lattner24943d22010-06-08 16:52:24 +00002855 }
2856
Sean Callananf328c9f2010-07-20 23:31:16 +00002857 if (user_type)
Greg Claytonb01000f2011-01-17 03:46:26 +00002858 *user_type = TypeFromUser(var_opaque_type, ast);
Sean Callanan336a0002010-07-17 00:43:37 +00002859
2860 return var_location.release();
2861}
2862
2863void
Sean Callanan67bbb112011-10-14 20:34:21 +00002864ClangExpressionDeclMap::AddOneVariable (NameSearchContext &context, VariableSP var, unsigned int current_id)
Sean Callanan336a0002010-07-17 00:43:37 +00002865{
Sean Callananaa301c42010-12-03 01:38:59 +00002866 assert (m_parser_vars.get());
2867
Greg Claytone005f2c2010-11-06 01:53:30 +00002868 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan47dc4572011-09-15 02:13:07 +00002869
Sean Callananf328c9f2010-07-20 23:31:16 +00002870 TypeFromUser ut;
2871 TypeFromParser pt;
Sean Callanan336a0002010-07-17 00:43:37 +00002872
Sean Callananaa301c42010-12-03 01:38:59 +00002873 Value *var_location = GetVariableValue (*m_parser_vars->m_exe_ctx,
Greg Clayton8de27c72010-10-15 22:48:33 +00002874 var,
2875 context.GetASTContext(),
2876 &ut,
2877 &pt);
Sean Callanan336a0002010-07-17 00:43:37 +00002878
Sean Callanan4b5eec62010-11-20 02:19:29 +00002879 if (!var_location)
2880 return;
2881
Sean Callanan6a925532011-01-13 08:53:35 +00002882 NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(pt.GetASTContext(), pt.GetOpaqueQualType()));
Greg Clayton8de27c72010-10-15 22:48:33 +00002883 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton427f2902010-12-14 02:59:59 +00002884 ConstString entity_name(decl_name.c_str());
Jim Inghamfa3a16a2011-03-31 00:19:25 +00002885 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
2886 entity_name,
Greg Clayton427f2902010-12-14 02:59:59 +00002887 ut,
Sean Callanan47dc4572011-09-15 02:13:07 +00002888 m_parser_vars->m_target_info.byte_order,
2889 m_parser_vars->m_target_info.address_byte_size));
Greg Clayton427f2902010-12-14 02:59:59 +00002890 assert (entity.get());
2891 entity->EnableParserVars();
2892 entity->m_parser_vars->m_parser_type = pt;
2893 entity->m_parser_vars->m_named_decl = var_decl;
2894 entity->m_parser_vars->m_llvm_value = NULL;
2895 entity->m_parser_vars->m_lldb_value = var_location;
Sean Callanan696cf5f2011-05-07 01:06:41 +00002896 entity->m_parser_vars->m_lldb_var = var;
Chris Lattner24943d22010-06-08 16:52:24 +00002897
Sean Callanan810f22d2010-07-16 00:09:46 +00002898 if (log)
Greg Clayton8de27c72010-10-15 22:48:33 +00002899 {
Greg Claytona23ca422011-10-20 00:47:21 +00002900 ASTDumper ast_dumper(var_decl);
2901 log->Printf(" FEVD[%u] Found variable %s, returned %s", current_id, decl_name.c_str(), ast_dumper.GetCString());
Greg Clayton8de27c72010-10-15 22:48:33 +00002902 }
Sean Callanan8f0dc342010-06-22 23:46:24 +00002903}
2904
2905void
Sean Callanana48fe162010-08-11 03:57:18 +00002906ClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
Sean Callanan67bbb112011-10-14 20:34:21 +00002907 ClangExpressionVariableSP &pvar_sp,
2908 unsigned int current_id)
Sean Callanana48fe162010-08-11 03:57:18 +00002909{
Greg Claytone005f2c2010-11-06 01:53:30 +00002910 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan45690fe2010-08-30 22:17:16 +00002911
Greg Clayton427f2902010-12-14 02:59:59 +00002912 TypeFromUser user_type (pvar_sp->GetTypeFromUser());
Sean Callanana48fe162010-08-11 03:57:18 +00002913
Greg Clayton427f2902010-12-14 02:59:59 +00002914 TypeFromParser parser_type (GuardedCopyType(context.GetASTContext(),
2915 user_type.GetASTContext(),
2916 user_type.GetOpaqueQualType()),
2917 context.GetASTContext());
Sean Callanana48fe162010-08-11 03:57:18 +00002918
Sean Callanan6a925532011-01-13 08:53:35 +00002919 NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(parser_type.GetASTContext(), parser_type.GetOpaqueQualType()));
Sean Callanan8c127202010-08-23 23:09:38 +00002920
Greg Clayton427f2902010-12-14 02:59:59 +00002921 pvar_sp->EnableParserVars();
2922 pvar_sp->m_parser_vars->m_parser_type = parser_type;
2923 pvar_sp->m_parser_vars->m_named_decl = var_decl;
2924 pvar_sp->m_parser_vars->m_llvm_value = NULL;
2925 pvar_sp->m_parser_vars->m_lldb_value = NULL;
Sean Callanan45690fe2010-08-30 22:17:16 +00002926
2927 if (log)
Sean Callanana0744822010-11-01 23:22:47 +00002928 {
Greg Claytona23ca422011-10-20 00:47:21 +00002929 ASTDumper ast_dumper(var_decl);
2930 log->Printf(" FEVD[%u] Added pvar %s, returned %s", current_id, pvar_sp->GetName().GetCString(), ast_dumper.GetCString());
Sean Callanana0744822010-11-01 23:22:47 +00002931 }
Sean Callanana48fe162010-08-11 03:57:18 +00002932}
2933
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002934void
Sean Callanan81974962011-05-08 02:21:26 +00002935ClangExpressionDeclMap::AddOneGenericVariable(NameSearchContext &context,
Sean Callanan67bbb112011-10-14 20:34:21 +00002936 Symbol &symbol,
2937 unsigned int current_id)
Sean Callanan81974962011-05-08 02:21:26 +00002938{
2939 assert(m_parser_vars.get());
2940
2941 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2942
Greg Clayton567e7f32011-09-22 04:58:26 +00002943 Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
2944
2945 if (target == NULL)
2946 return;
2947
2948 ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
Sean Callanan81974962011-05-08 02:21:26 +00002949
Sean Callananfb3058e2011-05-12 23:54:16 +00002950 TypeFromUser user_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(scratch_ast_context, true)),
Sean Callanan81974962011-05-08 02:21:26 +00002951 scratch_ast_context);
2952
Sean Callananfb3058e2011-05-12 23:54:16 +00002953 TypeFromParser parser_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(context.GetASTContext(), true)),
Sean Callanan81974962011-05-08 02:21:26 +00002954 context.GetASTContext());
2955
Sean Callananfb3058e2011-05-12 23:54:16 +00002956 NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
Sean Callanan81974962011-05-08 02:21:26 +00002957
2958 std::string decl_name(context.m_decl_name.getAsString());
2959 ConstString entity_name(decl_name.c_str());
2960 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
2961 entity_name,
2962 user_type,
Sean Callanan47dc4572011-09-15 02:13:07 +00002963 m_parser_vars->m_target_info.byte_order,
2964 m_parser_vars->m_target_info.address_byte_size));
Sean Callanan81974962011-05-08 02:21:26 +00002965 assert (entity.get());
Sean Callanan81974962011-05-08 02:21:26 +00002966
2967 std::auto_ptr<Value> symbol_location(new Value);
2968
2969 AddressRange &symbol_range = symbol.GetAddressRangeRef();
2970 Address &symbol_address = symbol_range.GetBaseAddress();
Greg Clayton567e7f32011-09-22 04:58:26 +00002971 lldb::addr_t symbol_load_addr = symbol_address.GetLoadAddress(target);
Sean Callanan81974962011-05-08 02:21:26 +00002972
2973 symbol_location->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
2974 symbol_location->GetScalar() = symbol_load_addr;
2975 symbol_location->SetValueType(Value::eValueTypeLoadAddress);
2976
Sean Callananfb3058e2011-05-12 23:54:16 +00002977 entity->EnableParserVars();
Sean Callanan81974962011-05-08 02:21:26 +00002978 entity->m_parser_vars->m_parser_type = parser_type;
2979 entity->m_parser_vars->m_named_decl = var_decl;
2980 entity->m_parser_vars->m_llvm_value = NULL;
2981 entity->m_parser_vars->m_lldb_value = symbol_location.release();
2982 entity->m_parser_vars->m_lldb_sym = &symbol;
Sean Callananfb3058e2011-05-12 23:54:16 +00002983 //entity->m_flags |= ClangExpressionVariable::EVUnknownType;
Sean Callanan81974962011-05-08 02:21:26 +00002984
2985 if (log)
2986 {
Greg Claytona23ca422011-10-20 00:47:21 +00002987 ASTDumper ast_dumper(var_decl);
Sean Callanan81974962011-05-08 02:21:26 +00002988
Greg Claytona23ca422011-10-20 00:47:21 +00002989 log->Printf(" FEVD[%u] Found variable %s, returned %s", current_id, decl_name.c_str(), ast_dumper.GetCString());
Sean Callanan81974962011-05-08 02:21:26 +00002990 }
2991}
2992
Sean Callananfb3058e2011-05-12 23:54:16 +00002993bool
2994ClangExpressionDeclMap::ResolveUnknownTypes()
2995{
2996 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Greg Clayton567e7f32011-09-22 04:58:26 +00002997 Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
2998
2999 ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
Sean Callananfb3058e2011-05-12 23:54:16 +00003000
3001 for (size_t index = 0, num_entities = m_found_entities.GetSize();
3002 index < num_entities;
3003 ++index)
3004 {
3005 ClangExpressionVariableSP entity = m_found_entities.GetVariableAtIndex(index);
3006
3007 if (entity->m_flags & ClangExpressionVariable::EVUnknownType)
3008 {
3009 const NamedDecl *named_decl = entity->m_parser_vars->m_named_decl;
3010 const VarDecl *var_decl = dyn_cast<VarDecl>(named_decl);
3011
3012 if (!var_decl)
3013 {
3014 if (log)
3015 log->Printf("Entity of unknown type does not have a VarDecl");
3016 return false;
3017 }
3018
3019 if (log)
3020 {
Greg Claytona23ca422011-10-20 00:47:21 +00003021 ASTDumper ast_dumper(const_cast<VarDecl*>(var_decl));
3022 log->Printf("Variable of unknown type now has Decl %s", ast_dumper.GetCString());
Sean Callananfb3058e2011-05-12 23:54:16 +00003023 }
3024
3025 QualType var_type = var_decl->getType();
3026 TypeFromParser parser_type(var_type.getAsOpaquePtr(), &var_decl->getASTContext());
3027
3028 lldb::clang_type_t copied_type = ClangASTContext::CopyType(scratch_ast_context, &var_decl->getASTContext(), var_type.getAsOpaquePtr());
3029
3030 TypeFromUser user_type(copied_type, scratch_ast_context);
3031
3032 entity->m_parser_vars->m_lldb_value->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
3033 entity->m_parser_vars->m_parser_type = parser_type;
3034
3035 entity->SetClangAST(user_type.GetASTContext());
3036 entity->SetClangType(user_type.GetOpaqueQualType());
3037
3038 entity->m_flags &= ~(ClangExpressionVariable::EVUnknownType);
3039 }
3040 }
3041
3042 return true;
3043}
3044
Sean Callanan81974962011-05-08 02:21:26 +00003045void
Greg Clayton427f2902010-12-14 02:59:59 +00003046ClangExpressionDeclMap::AddOneRegister (NameSearchContext &context,
Sean Callanan67bbb112011-10-14 20:34:21 +00003047 const RegisterInfo *reg_info,
3048 unsigned int current_id)
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00003049{
3050 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
3051
3052 void *ast_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize(context.GetASTContext(),
3053 reg_info->encoding,
3054 reg_info->byte_size * 8);
3055
3056 if (!ast_type)
3057 {
Johnny Chen122204d2011-08-09 22:52:27 +00003058 if (log)
Sean Callanan67bbb112011-10-14 20:34:21 +00003059 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 +00003060 return;
3061 }
3062
Greg Clayton427f2902010-12-14 02:59:59 +00003063 TypeFromParser parser_type (ast_type,
3064 context.GetASTContext());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00003065
3066 NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
3067
Jim Inghamfa3a16a2011-03-31 00:19:25 +00003068 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope(),
Sean Callanan47dc4572011-09-15 02:13:07 +00003069 m_parser_vars->m_target_info.byte_order,
3070 m_parser_vars->m_target_info.address_byte_size));
Greg Clayton427f2902010-12-14 02:59:59 +00003071 assert (entity.get());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00003072 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton427f2902010-12-14 02:59:59 +00003073 entity->SetName (ConstString (decl_name.c_str()));
3074 entity->SetRegisterInfo (reg_info);
3075 entity->EnableParserVars();
3076 entity->m_parser_vars->m_parser_type = parser_type;
3077 entity->m_parser_vars->m_named_decl = var_decl;
3078 entity->m_parser_vars->m_llvm_value = NULL;
3079 entity->m_parser_vars->m_lldb_value = NULL;
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00003080
Sean Callanan67bbb112011-10-14 20:34:21 +00003081 if (log && log->GetVerbose())
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00003082 {
Greg Claytona23ca422011-10-20 00:47:21 +00003083 ASTDumper ast_dumper(var_decl);
3084 log->Printf(" FEVD[%d] Added register %s, returned %s", current_id, context.m_decl_name.getAsString().c_str(), ast_dumper.GetCString());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00003085 }
3086}
3087
Sean Callanan9b6898f2011-07-30 02:42:06 +00003088NamespaceDecl *
Sean Callanan16b53ab2011-10-12 00:12:34 +00003089ClangExpressionDeclMap::AddNamespace (NameSearchContext &context, ClangASTImporter::NamespaceMapSP &namespace_decls)
Greg Clayton6916e352010-11-13 03:52:47 +00003090{
Sean Callanan16b53ab2011-10-12 00:12:34 +00003091 if (namespace_decls.empty())
3092 return NULL;
3093
Greg Clayton6916e352010-11-13 03:52:47 +00003094 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
3095
Greg Claytone6d72ca2011-06-25 00:44:06 +00003096 assert (m_parser_vars.get());
3097
Sean Callanan16b53ab2011-10-12 00:12:34 +00003098 const ClangNamespaceDecl &namespace_decl = namespace_decls->begin()->second;
3099
Sean Callanan9b6898f2011-07-30 02:42:06 +00003100 Decl *copied_decl = m_parser_vars->GetASTImporter(context.GetASTContext())->CopyDecl(namespace_decl.GetASTContext(),
Sean Callanan16b53ab2011-10-12 00:12:34 +00003101 namespace_decl.GetNamespaceDecl());
3102
3103 NamespaceDecl *copied_namespace_decl = dyn_cast<NamespaceDecl>(copied_decl);
3104
3105 m_parser_vars->GetASTImporter(context.GetASTContext())->RegisterNamespaceMap(copied_namespace_decl, namespace_decls);
3106
Sean Callanan9b6898f2011-07-30 02:42:06 +00003107 return dyn_cast<NamespaceDecl>(copied_decl);
Greg Clayton6916e352010-11-13 03:52:47 +00003108}
3109
Sean Callanana48fe162010-08-11 03:57:18 +00003110void
Greg Claytonda7af842011-05-18 22:01:49 +00003111ClangExpressionDeclMap::AddOneFunction (NameSearchContext &context,
3112 Function* fun,
Sean Callanan67bbb112011-10-14 20:34:21 +00003113 Symbol* symbol,
3114 unsigned int current_id)
Sean Callanan8f0dc342010-06-22 23:46:24 +00003115{
Sean Callananaa301c42010-12-03 01:38:59 +00003116 assert (m_parser_vars.get());
3117
Greg Claytone005f2c2010-11-06 01:53:30 +00003118 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan8f0dc342010-06-22 23:46:24 +00003119
Sean Callanan58baaad2011-07-08 00:39:14 +00003120 NamedDecl *fun_decl = NULL;
Sean Callanan8f0dc342010-06-22 23:46:24 +00003121 std::auto_ptr<Value> fun_location(new Value);
Sean Callanan58baaad2011-07-08 00:39:14 +00003122 const Address *fun_address = NULL;
Sean Callanan8f0dc342010-06-22 23:46:24 +00003123
Sean Callanan0fc73582010-07-27 00:55:47 +00003124 // only valid for Functions, not for Symbols
3125 void *fun_opaque_type = NULL;
Sean Callanan9b6898f2011-07-30 02:42:06 +00003126 ASTContext *fun_ast_context = NULL;
Sean Callanan0fc73582010-07-27 00:55:47 +00003127
3128 if (fun)
3129 {
3130 Type *fun_type = fun->GetType();
3131
3132 if (!fun_type)
3133 {
3134 if (log)
Sean Callanan67bbb112011-10-14 20:34:21 +00003135 log->PutCString(" Skipped a function because it has no type");
Sean Callanan0fc73582010-07-27 00:55:47 +00003136 return;
3137 }
3138
Greg Clayton04c9c7b2011-02-16 23:00:21 +00003139 fun_opaque_type = fun_type->GetClangFullType();
Sean Callanan0fc73582010-07-27 00:55:47 +00003140
3141 if (!fun_opaque_type)
3142 {
3143 if (log)
Sean Callanan67bbb112011-10-14 20:34:21 +00003144 log->PutCString(" Skipped a function because it has no Clang type");
Sean Callanan0fc73582010-07-27 00:55:47 +00003145 return;
3146 }
3147
3148 fun_address = &fun->GetAddressRange().GetBaseAddress();
3149
Greg Claytonb01000f2011-01-17 03:46:26 +00003150 fun_ast_context = fun_type->GetClangASTContext().getASTContext();
Sean Callananee8fc722010-11-19 20:20:02 +00003151 void *copied_type = GuardedCopyType(context.GetASTContext(), fun_ast_context, fun_opaque_type);
Greg Claytona23ca422011-10-20 00:47:21 +00003152 if (copied_type)
3153 {
3154 fun_decl = context.AddFunDecl(copied_type);
3155 }
3156 else
3157 {
3158 // We failed to copy the type we found
3159 if (log)
3160 {
3161 log->Printf (" Failed to import the function type '%s' {0x%8.8llx} into the expression parser AST contenxt",
3162 fun_type->GetName().GetCString(),
3163 fun_type->GetID());
3164 }
3165 }
Sean Callanan0fc73582010-07-27 00:55:47 +00003166 }
3167 else if (symbol)
3168 {
3169 fun_address = &symbol->GetAddressRangeRef().GetBaseAddress();
3170
3171 fun_decl = context.AddGenericFunDecl();
3172 }
3173 else
3174 {
3175 if (log)
Sean Callanan67bbb112011-10-14 20:34:21 +00003176 log->PutCString(" AddOneFunction called with no function and no symbol");
Sean Callanan0fc73582010-07-27 00:55:47 +00003177 return;
3178 }
3179
Greg Clayton567e7f32011-09-22 04:58:26 +00003180 Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
3181
3182 lldb::addr_t load_addr = fun_address->GetCallableLoadAddress(target);
Sean Callanan8f0dc342010-06-22 23:46:24 +00003183 fun_location->SetValueType(Value::eValueTypeLoadAddress);
3184 fun_location->GetScalar() = load_addr;
3185
Jim Inghamfa3a16a2011-03-31 00:19:25 +00003186 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
Sean Callanan47dc4572011-09-15 02:13:07 +00003187 m_parser_vars->m_target_info.byte_order,
3188 m_parser_vars->m_target_info.address_byte_size));
Greg Clayton427f2902010-12-14 02:59:59 +00003189 assert (entity.get());
Greg Clayton8de27c72010-10-15 22:48:33 +00003190 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton427f2902010-12-14 02:59:59 +00003191 entity->SetName(ConstString(decl_name.c_str()));
3192 entity->SetClangType (fun_opaque_type);
3193 entity->SetClangAST (fun_ast_context);
Sean Callanan8f0dc342010-06-22 23:46:24 +00003194
Greg Clayton427f2902010-12-14 02:59:59 +00003195 entity->EnableParserVars();
3196 entity->m_parser_vars->m_named_decl = fun_decl;
3197 entity->m_parser_vars->m_llvm_value = NULL;
3198 entity->m_parser_vars->m_lldb_value = fun_location.release();
Sean Callanan8c127202010-08-23 23:09:38 +00003199
Sean Callanan810f22d2010-07-16 00:09:46 +00003200 if (log)
Greg Clayton8de27c72010-10-15 22:48:33 +00003201 {
Greg Claytona23ca422011-10-20 00:47:21 +00003202 ASTDumper ast_dumper(fun_decl);
Sean Callanana0744822010-11-01 23:22:47 +00003203
Sean Callanan67bbb112011-10-14 20:34:21 +00003204 log->Printf(" FEVD[%u] Found %s function %s, returned %s",
3205 current_id,
3206 (fun ? "specific" : "generic"),
3207 decl_name.c_str(),
Greg Claytona23ca422011-10-20 00:47:21 +00003208 ast_dumper.GetCString());
Greg Clayton8de27c72010-10-15 22:48:33 +00003209 }
Chris Lattner24943d22010-06-08 16:52:24 +00003210}
Sean Callanan93a4b1a2010-08-04 01:02:13 +00003211
3212void
3213ClangExpressionDeclMap::AddOneType(NameSearchContext &context,
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00003214 TypeFromUser &ut,
Sean Callanan67bbb112011-10-14 20:34:21 +00003215 unsigned int current_id,
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00003216 bool add_method)
Sean Callanan93a4b1a2010-08-04 01:02:13 +00003217{
Sean Callanan9b6898f2011-07-30 02:42:06 +00003218 ASTContext *parser_ast_context = context.GetASTContext();
3219 ASTContext *user_ast_context = ut.GetASTContext();
Sean Callanan93a4b1a2010-08-04 01:02:13 +00003220
Sean Callananee8fc722010-11-19 20:20:02 +00003221 void *copied_type = GuardedCopyType(parser_ast_context, user_ast_context, ut.GetOpaqueQualType());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00003222
3223 TypeFromParser parser_type(copied_type, parser_ast_context);
3224
3225 if (add_method && ClangASTContext::IsAggregateType(copied_type))
3226 {
3227 void *args[1];
3228
3229 args[0] = ClangASTContext::GetVoidPtrType(parser_ast_context, false);
3230
3231 void *method_type = ClangASTContext::CreateFunctionType (parser_ast_context,
3232 ClangASTContext::GetBuiltInType_void(parser_ast_context),
3233 args,
3234 1,
3235 false,
3236 ClangASTContext::GetTypeQualifiers(copied_type));
Greg Clayton30449d52010-10-01 02:31:07 +00003237
Greg Clayton1d8173f2010-09-24 05:15:53 +00003238 const bool is_virtual = false;
3239 const bool is_static = false;
3240 const bool is_inline = false;
Greg Clayton30449d52010-10-01 02:31:07 +00003241 const bool is_explicit = false;
3242
Greg Clayton1d8173f2010-09-24 05:15:53 +00003243 ClangASTContext::AddMethodToCXXRecordType (parser_ast_context,
3244 copied_type,
Greg Clayton8de27c72010-10-15 22:48:33 +00003245 "$__lldb_expr",
Greg Clayton1d8173f2010-09-24 05:15:53 +00003246 method_type,
3247 lldb::eAccessPublic,
3248 is_virtual,
3249 is_static,
Greg Clayton30449d52010-10-01 02:31:07 +00003250 is_inline,
3251 is_explicit);
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00003252 }
Sean Callanan93a4b1a2010-08-04 01:02:13 +00003253
3254 context.AddTypeDecl(copied_type);
3255}
Sean Callananee8fc722010-11-19 20:20:02 +00003256
3257void *
3258ClangExpressionDeclMap::GuardedCopyType (ASTContext *dest_context,
3259 ASTContext *source_context,
3260 void *clang_type)
3261{
Sean Callananaa301c42010-12-03 01:38:59 +00003262 assert (m_parser_vars.get());
3263
3264 m_parser_vars->m_ignore_lookups = true;
Sean Callananee8fc722010-11-19 20:20:02 +00003265
Greg Claytone6d72ca2011-06-25 00:44:06 +00003266 lldb_private::ClangASTImporter *importer = m_parser_vars->GetASTImporter(dest_context);
3267
3268 QualType ret_qual_type = importer->CopyType (source_context,
3269 QualType::getFromOpaquePtr(clang_type));
3270
3271 void *ret = ret_qual_type.getAsOpaquePtr();
Sean Callananee8fc722010-11-19 20:20:02 +00003272
Sean Callananaa301c42010-12-03 01:38:59 +00003273 m_parser_vars->m_ignore_lookups = false;
Sean Callananee8fc722010-11-19 20:20:02 +00003274
3275 return ret;
3276}