blob: 411651fa5da559168ac5bc43105848342041a3f0 [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"
Sean Callanan05a5a1b2010-12-16 03:17:46 +000023#include "lldb/Core/ValueObjectConstResult.h"
Sean Callanan6e74dbb2011-02-01 23:43:26 +000024#include "lldb/Expression/ASTDumper.h"
Chris Lattner24943d22010-06-08 16:52:24 +000025#include "lldb/Expression/ClangASTSource.h"
Sean Callanana48fe162010-08-11 03:57:18 +000026#include "lldb/Expression/ClangPersistentVariables.h"
Greg Claytoncd548032011-02-01 01:31:41 +000027#include "lldb/Host/Endian.h"
Chris Lattner24943d22010-06-08 16:52:24 +000028#include "lldb/Symbol/ClangASTContext.h"
Greg Clayton6916e352010-11-13 03:52:47 +000029#include "lldb/Symbol/ClangNamespaceDecl.h"
Chris Lattner24943d22010-06-08 16:52:24 +000030#include "lldb/Symbol/CompileUnit.h"
31#include "lldb/Symbol/Function.h"
32#include "lldb/Symbol/ObjectFile.h"
33#include "lldb/Symbol/SymbolContext.h"
34#include "lldb/Symbol/Type.h"
35#include "lldb/Symbol/TypeList.h"
36#include "lldb/Symbol/Variable.h"
37#include "lldb/Symbol/VariableList.h"
Sean Callananf328c9f2010-07-20 23:31:16 +000038#include "lldb/Target/ExecutionContext.h"
Sean Callanan810f22d2010-07-16 00:09:46 +000039#include "lldb/Target/Process.h"
Sean Callanan17c6a052010-10-05 20:18:48 +000040#include "lldb/Target/RegisterContext.h"
Chris Lattner24943d22010-06-08 16:52:24 +000041#include "lldb/Target/StackFrame.h"
Sean Callananf328c9f2010-07-20 23:31:16 +000042#include "lldb/Target/Target.h"
Jim Ingham78b9ee82010-12-07 01:56:02 +000043#include "lldb/Target/Thread.h"
Sean Callanana0744822010-11-01 23:22:47 +000044#include "llvm/Support/raw_ostream.h"
Chris Lattner24943d22010-06-08 16:52:24 +000045
Greg Clayton3bc52d02010-11-14 22:13:40 +000046using namespace lldb;
Chris Lattner24943d22010-06-08 16:52:24 +000047using namespace lldb_private;
48using namespace clang;
49
Sean Callanan6a925532011-01-13 08:53:35 +000050ClangExpressionDeclMap::ClangExpressionDeclMap (bool keep_result_in_memory) :
Greg Clayton8de27c72010-10-15 22:48:33 +000051 m_found_entities (),
52 m_struct_members (),
Sean Callananaa301c42010-12-03 01:38:59 +000053 m_parser_vars (),
Sean Callanan6a925532011-01-13 08:53:35 +000054 m_struct_vars (),
55 m_keep_result_in_memory (keep_result_in_memory)
Chris Lattner24943d22010-06-08 16:52:24 +000056{
Sean Callananaa301c42010-12-03 01:38:59 +000057 EnableStructVars();
Chris Lattner24943d22010-06-08 16:52:24 +000058}
59
60ClangExpressionDeclMap::~ClangExpressionDeclMap()
Sean Callananaa301c42010-12-03 01:38:59 +000061{
62 DidDematerialize();
63 DisableStructVars();
64}
Sean Callananc2c6f772010-10-26 00:31:56 +000065
Greg Clayton427f2902010-12-14 02:59:59 +000066void
67ClangExpressionDeclMap::WillParse(ExecutionContext &exe_ctx)
Sean Callananaa301c42010-12-03 01:38:59 +000068{
69 EnableParserVars();
70 m_parser_vars->m_exe_ctx = &exe_ctx;
71
72 if (exe_ctx.frame)
73 m_parser_vars->m_sym_ctx = exe_ctx.frame->GetSymbolContext(lldb::eSymbolContextEverything);
Jim Ingham78b9ee82010-12-07 01:56:02 +000074 else if (exe_ctx.thread)
75 m_parser_vars->m_sym_ctx = exe_ctx.thread->GetStackFrameAtIndex(0)->GetSymbolContext(lldb::eSymbolContextEverything);
76
Greg Clayton427f2902010-12-14 02:59:59 +000077 if (exe_ctx.target)
78 m_parser_vars->m_persistent_vars = &exe_ctx.target->GetPersistentVariables();
Sean Callananaa301c42010-12-03 01:38:59 +000079}
80
Greg Clayton427f2902010-12-14 02:59:59 +000081void
82ClangExpressionDeclMap::DidParse()
Sean Callananaa301c42010-12-03 01:38:59 +000083{
84 if (m_parser_vars.get())
85 {
Greg Clayton427f2902010-12-14 02:59:59 +000086 for (size_t entity_index = 0, num_entities = m_found_entities.GetSize();
Sean Callananaa301c42010-12-03 01:38:59 +000087 entity_index < num_entities;
88 ++entity_index)
89 {
Greg Clayton427f2902010-12-14 02:59:59 +000090 ClangExpressionVariableSP var_sp(m_found_entities.GetVariableAtIndex(entity_index));
91 if (var_sp &&
92 var_sp->m_parser_vars.get() &&
93 var_sp->m_parser_vars->m_lldb_value)
94 delete var_sp->m_parser_vars->m_lldb_value;
Sean Callananaa301c42010-12-03 01:38:59 +000095
Greg Clayton427f2902010-12-14 02:59:59 +000096 var_sp->DisableParserVars();
Sean Callananaa301c42010-12-03 01:38:59 +000097 }
98
Greg Clayton427f2902010-12-14 02:59:59 +000099 for (size_t pvar_index = 0, num_pvars = m_parser_vars->m_persistent_vars->GetSize();
Sean Callananaa301c42010-12-03 01:38:59 +0000100 pvar_index < num_pvars;
101 ++pvar_index)
102 {
Greg Clayton427f2902010-12-14 02:59:59 +0000103 ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariableAtIndex(pvar_index));
104 if (pvar_sp)
105 pvar_sp->DisableParserVars();
Sean Callananaa301c42010-12-03 01:38:59 +0000106 }
107
108 DisableParserVars();
Sean Callanan7a60b942010-10-08 01:58:41 +0000109 }
Chris Lattner24943d22010-06-08 16:52:24 +0000110}
111
Sean Callanan8bce6652010-07-13 21:41:46 +0000112// Interface for IRForTarget
113
Greg Clayton8de27c72010-10-15 22:48:33 +0000114const ConstString &
115ClangExpressionDeclMap::GetPersistentResultName ()
Sean Callanan82b74c82010-08-12 01:56:52 +0000116{
Sean Callananaa301c42010-12-03 01:38:59 +0000117 assert (m_struct_vars.get());
118 assert (m_parser_vars.get());
Sean Callananaa301c42010-12-03 01:38:59 +0000119 if (!m_struct_vars->m_result_name)
Greg Clayton427f2902010-12-14 02:59:59 +0000120 {
121 Target *target = m_parser_vars->GetTarget();
122 assert (target);
123 m_struct_vars->m_result_name = target->GetPersistentVariables().GetNextPersistentVariableName();
124 }
Sean Callananaa301c42010-12-03 01:38:59 +0000125 return m_struct_vars->m_result_name;
Sean Callanan82b74c82010-08-12 01:56:52 +0000126}
127
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000128lldb::ClangExpressionVariableSP
129ClangExpressionDeclMap::BuildIntegerVariable (const ConstString &name,
130 lldb_private::TypeFromParser type,
131 const llvm::APInt& value)
132{
133 assert (m_parser_vars.get());
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000134 ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
135 clang::ASTContext *context(exe_ctx->target->GetScratchClangASTContext()->getASTContext());
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000136
137 TypeFromUser user_type(ClangASTContext::CopyType(context,
138 type.GetASTContext(),
139 type.GetOpaqueQualType()),
140 context);
141
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000142 if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx->GetBestExecutionContextScope (),
143 name,
Sean Callanan0e0817d2011-01-04 02:41:41 +0000144 user_type,
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000145 exe_ctx->process->GetByteOrder(),
146 exe_ctx->process->GetAddressByteSize()))
Sean Callanan0e0817d2011-01-04 02:41:41 +0000147 return lldb::ClangExpressionVariableSP();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000148
Sean Callanan0e0817d2011-01-04 02:41:41 +0000149 ClangExpressionVariableSP pvar_sp (m_parser_vars->m_persistent_vars->GetVariable(name));
150
151 if (!pvar_sp)
152 return lldb::ClangExpressionVariableSP();
153
154 uint8_t *pvar_data = pvar_sp->GetValueBytes();
155 if (pvar_data == NULL)
156 return lldb::ClangExpressionVariableSP();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000157
158 uint64_t value64 = value.getLimitedValue();
159
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000160 ByteOrder byte_order = exe_ctx->process->GetByteOrder();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000161
162 size_t num_val_bytes = sizeof(value64);
Sean Callanan0e0817d2011-01-04 02:41:41 +0000163 size_t num_data_bytes = pvar_sp->GetByteSize();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000164
165 size_t num_bytes = num_val_bytes;
166 if (num_bytes > num_data_bytes)
167 num_bytes = num_data_bytes;
168
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000169 for (off_t byte_idx = 0;
170 byte_idx < num_bytes;
171 ++byte_idx)
172 {
173 uint64_t shift = byte_idx * 8;
174 uint64_t mask = 0xffll << shift;
175 uint8_t cur_byte = (uint8_t)((value64 & mask) >> shift);
176
177 switch (byte_order)
178 {
Sean Callanan0e0817d2011-01-04 02:41:41 +0000179 case eByteOrderBig:
180 // High Low
181 // Original: |AABBCCDDEEFFGGHH|
182 // Target: |EEFFGGHH|
183
184 pvar_data[num_data_bytes - (1 + byte_idx)] = cur_byte;
185 break;
186 case eByteOrderLittle:
187 // Target: |HHGGFFEE|
188 pvar_data[byte_idx] = cur_byte;
189 break;
190 default:
191 return lldb::ClangExpressionVariableSP();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000192 }
193 }
Sean Callanan6a925532011-01-13 08:53:35 +0000194
195 pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried;
Sean Callanan0e0817d2011-01-04 02:41:41 +0000196
197 return pvar_sp;
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000198}
199
Sean Callanan8bce6652010-07-13 21:41:46 +0000200bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000201ClangExpressionDeclMap::AddPersistentVariable
202(
203 const clang::NamedDecl *decl,
204 const ConstString &name,
Sean Callanan6a925532011-01-13 08:53:35 +0000205 TypeFromParser parser_type,
206 bool is_result,
207 bool is_lvalue
Greg Clayton8de27c72010-10-15 22:48:33 +0000208)
Sean Callanana48fe162010-08-11 03:57:18 +0000209{
Sean Callananaa301c42010-12-03 01:38:59 +0000210 assert (m_parser_vars.get());
211
Sean Callanan6a925532011-01-13 08:53:35 +0000212 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000213 ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
Sean Callanan6a925532011-01-13 08:53:35 +0000214
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000215 clang::ASTContext *context(exe_ctx->target->GetScratchClangASTContext()->getASTContext());
Sean Callanana48fe162010-08-11 03:57:18 +0000216
Sean Callanana48fe162010-08-11 03:57:18 +0000217 TypeFromUser user_type(ClangASTContext::CopyType(context,
Sean Callanan82b74c82010-08-12 01:56:52 +0000218 parser_type.GetASTContext(),
219 parser_type.GetOpaqueQualType()),
Sean Callanan97678d12011-01-13 21:23:32 +0000220 context);
Sean Callanana48fe162010-08-11 03:57:18 +0000221
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000222 if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx->GetBestExecutionContextScope (),
223 name,
Greg Clayton427f2902010-12-14 02:59:59 +0000224 user_type,
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000225 exe_ctx->process->GetByteOrder(),
226 exe_ctx->process->GetAddressByteSize()))
Sean Callanan8c127202010-08-23 23:09:38 +0000227 return false;
228
Greg Clayton427f2902010-12-14 02:59:59 +0000229 ClangExpressionVariableSP var_sp (m_parser_vars->m_persistent_vars->GetVariable(name));
Sean Callanan8c127202010-08-23 23:09:38 +0000230
Greg Clayton427f2902010-12-14 02:59:59 +0000231 if (!var_sp)
Sean Callanan8c127202010-08-23 23:09:38 +0000232 return false;
233
Sean Callanan6a925532011-01-13 08:53:35 +0000234 if (is_result)
235 var_sp->m_flags |= ClangExpressionVariable::EVNeedsFreezeDry;
236 else
237 var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget; // explicitly-declared persistent variables should persist
238
239 if (is_lvalue)
240 {
241 var_sp->m_flags |= ClangExpressionVariable::EVIsProgramReference;
242 }
243 else
244 {
245 var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
246 var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
247 }
248
249 if (log)
250 log->Printf("Created persistent variable with flags 0x%hx", var_sp->m_flags);
251
Greg Clayton427f2902010-12-14 02:59:59 +0000252 var_sp->EnableParserVars();
Sean Callanan8c127202010-08-23 23:09:38 +0000253
Greg Clayton427f2902010-12-14 02:59:59 +0000254 var_sp->m_parser_vars->m_named_decl = decl;
255 var_sp->m_parser_vars->m_parser_type = parser_type;
Sean Callanan8c127202010-08-23 23:09:38 +0000256
257 return true;
Sean Callanana48fe162010-08-11 03:57:18 +0000258}
259
260bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000261ClangExpressionDeclMap::AddValueToStruct
262(
263 const clang::NamedDecl *decl,
264 const ConstString &name,
265 llvm::Value *value,
266 size_t size,
267 off_t alignment
268)
Sean Callanan8bce6652010-07-13 21:41:46 +0000269{
Sean Callananaa301c42010-12-03 01:38:59 +0000270 assert (m_struct_vars.get());
271 assert (m_parser_vars.get());
272
Greg Claytone005f2c2010-11-06 01:53:30 +0000273 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan45690fe2010-08-30 22:17:16 +0000274
Sean Callananaa301c42010-12-03 01:38:59 +0000275 m_struct_vars->m_struct_laid_out = false;
Sean Callanan8bce6652010-07-13 21:41:46 +0000276
Sean Callanan8c127202010-08-23 23:09:38 +0000277 if (m_struct_members.GetVariable(decl))
278 return true;
Sean Callanan8bce6652010-07-13 21:41:46 +0000279
Greg Clayton427f2902010-12-14 02:59:59 +0000280 ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl));
Sean Callanan8bce6652010-07-13 21:41:46 +0000281
Greg Clayton427f2902010-12-14 02:59:59 +0000282 if (!var_sp)
283 var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl);
Sean Callanan8bce6652010-07-13 21:41:46 +0000284
Greg Clayton427f2902010-12-14 02:59:59 +0000285 if (!var_sp)
Sean Callanan8c127202010-08-23 23:09:38 +0000286 return false;
287
Sean Callanan45690fe2010-08-30 22:17:16 +0000288 if (log)
289 log->Printf("Adding value for decl %p [%s - %s] to the structure",
290 decl,
Greg Clayton8de27c72010-10-15 22:48:33 +0000291 name.GetCString(),
Greg Clayton427f2902010-12-14 02:59:59 +0000292 var_sp->GetName().GetCString());
Sean Callanan45690fe2010-08-30 22:17:16 +0000293
Sean Callanan8c127202010-08-23 23:09:38 +0000294 // We know entity->m_parser_vars is valid because we used a parser variable
295 // to find it
Greg Clayton427f2902010-12-14 02:59:59 +0000296 var_sp->m_parser_vars->m_llvm_value = value;
Sean Callanan8c127202010-08-23 23:09:38 +0000297
Greg Clayton427f2902010-12-14 02:59:59 +0000298 var_sp->EnableJITVars();
299 var_sp->m_jit_vars->m_alignment = alignment;
300 var_sp->m_jit_vars->m_size = size;
Sean Callanan8c127202010-08-23 23:09:38 +0000301
Greg Clayton427f2902010-12-14 02:59:59 +0000302 m_struct_members.AddVariable(var_sp);
Sean Callanan8bce6652010-07-13 21:41:46 +0000303
304 return true;
305}
306
307bool
308ClangExpressionDeclMap::DoStructLayout ()
309{
Sean Callananaa301c42010-12-03 01:38:59 +0000310 assert (m_struct_vars.get());
311
312 if (m_struct_vars->m_struct_laid_out)
Sean Callanan8bce6652010-07-13 21:41:46 +0000313 return true;
314
Sean Callanan8bce6652010-07-13 21:41:46 +0000315 off_t cursor = 0;
316
Sean Callananaa301c42010-12-03 01:38:59 +0000317 m_struct_vars->m_struct_alignment = 0;
318 m_struct_vars->m_struct_size = 0;
Sean Callanan8bce6652010-07-13 21:41:46 +0000319
Greg Clayton427f2902010-12-14 02:59:59 +0000320 for (size_t member_index = 0, num_members = m_struct_members.GetSize();
Sean Callanan8c127202010-08-23 23:09:38 +0000321 member_index < num_members;
322 ++member_index)
Sean Callanan8bce6652010-07-13 21:41:46 +0000323 {
Greg Clayton427f2902010-12-14 02:59:59 +0000324 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
325 if (!member_sp)
326 return false;
327
328 if (!member_sp->m_jit_vars.get())
Sean Callanan8c127202010-08-23 23:09:38 +0000329 return false;
Sean Callanan8bce6652010-07-13 21:41:46 +0000330
Sean Callanan8c127202010-08-23 23:09:38 +0000331 if (member_index == 0)
Greg Clayton427f2902010-12-14 02:59:59 +0000332 m_struct_vars->m_struct_alignment = member_sp->m_jit_vars->m_alignment;
Sean Callanan8c127202010-08-23 23:09:38 +0000333
Greg Clayton427f2902010-12-14 02:59:59 +0000334 if (cursor % member_sp->m_jit_vars->m_alignment)
335 cursor += (member_sp->m_jit_vars->m_alignment - (cursor % member_sp->m_jit_vars->m_alignment));
Sean Callanan8c127202010-08-23 23:09:38 +0000336
Greg Clayton427f2902010-12-14 02:59:59 +0000337 member_sp->m_jit_vars->m_offset = cursor;
338 cursor += member_sp->m_jit_vars->m_size;
Sean Callanan8bce6652010-07-13 21:41:46 +0000339 }
340
Sean Callananaa301c42010-12-03 01:38:59 +0000341 m_struct_vars->m_struct_size = cursor;
Sean Callanan8bce6652010-07-13 21:41:46 +0000342
Sean Callananaa301c42010-12-03 01:38:59 +0000343 m_struct_vars->m_struct_laid_out = true;
Sean Callanan8bce6652010-07-13 21:41:46 +0000344 return true;
345}
346
Greg Clayton8de27c72010-10-15 22:48:33 +0000347bool ClangExpressionDeclMap::GetStructInfo
348(
349 uint32_t &num_elements,
350 size_t &size,
351 off_t &alignment
352)
Sean Callanan8bce6652010-07-13 21:41:46 +0000353{
Sean Callananaa301c42010-12-03 01:38:59 +0000354 assert (m_struct_vars.get());
355
356 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan8bce6652010-07-13 21:41:46 +0000357 return false;
358
Greg Clayton427f2902010-12-14 02:59:59 +0000359 num_elements = m_struct_members.GetSize();
Sean Callananaa301c42010-12-03 01:38:59 +0000360 size = m_struct_vars->m_struct_size;
361 alignment = m_struct_vars->m_struct_alignment;
Sean Callanan8bce6652010-07-13 21:41:46 +0000362
363 return true;
364}
365
366bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000367ClangExpressionDeclMap::GetStructElement
368(
369 const clang::NamedDecl *&decl,
370 llvm::Value *&value,
371 off_t &offset,
372 ConstString &name,
373 uint32_t index
374)
Sean Callanan8bce6652010-07-13 21:41:46 +0000375{
Sean Callananaa301c42010-12-03 01:38:59 +0000376 assert (m_struct_vars.get());
377
378 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan8bce6652010-07-13 21:41:46 +0000379 return false;
380
Greg Clayton427f2902010-12-14 02:59:59 +0000381 if (index >= m_struct_members.GetSize())
Sean Callanan8bce6652010-07-13 21:41:46 +0000382 return false;
383
Greg Clayton427f2902010-12-14 02:59:59 +0000384 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(index));
Sean Callanan8bce6652010-07-13 21:41:46 +0000385
Greg Clayton427f2902010-12-14 02:59:59 +0000386 if (!member_sp ||
387 !member_sp->m_parser_vars.get() ||
388 !member_sp->m_jit_vars.get())
Sean Callanan8c127202010-08-23 23:09:38 +0000389 return false;
390
Greg Clayton427f2902010-12-14 02:59:59 +0000391 decl = member_sp->m_parser_vars->m_named_decl;
392 value = member_sp->m_parser_vars->m_llvm_value;
393 offset = member_sp->m_jit_vars->m_offset;
394 name = member_sp->GetName();
Sean Callanan8c127202010-08-23 23:09:38 +0000395
Sean Callanan8bce6652010-07-13 21:41:46 +0000396 return true;
397}
398
Sean Callanan02fbafa2010-07-27 21:39:39 +0000399bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000400ClangExpressionDeclMap::GetFunctionInfo
401(
402 const clang::NamedDecl *decl,
403 llvm::Value**& value,
404 uint64_t &ptr
405)
Sean Callananba992c52010-07-27 02:07:53 +0000406{
Greg Clayton427f2902010-12-14 02:59:59 +0000407 ClangExpressionVariableSP entity_sp(m_found_entities.GetVariable(decl));
Sean Callanan8c127202010-08-23 23:09:38 +0000408
Greg Clayton427f2902010-12-14 02:59:59 +0000409 if (!entity_sp)
Sean Callanan8c127202010-08-23 23:09:38 +0000410 return false;
Sean Callananba992c52010-07-27 02:07:53 +0000411
Sean Callanan8c127202010-08-23 23:09:38 +0000412 // We know m_parser_vars is valid since we searched for the variable by
413 // its NamedDecl
Sean Callananba992c52010-07-27 02:07:53 +0000414
Greg Clayton427f2902010-12-14 02:59:59 +0000415 value = &entity_sp->m_parser_vars->m_llvm_value;
416 ptr = entity_sp->m_parser_vars->m_lldb_value->GetScalar().ULongLong();
Sean Callanan8c127202010-08-23 23:09:38 +0000417
418 return true;
Sean Callananba992c52010-07-27 02:07:53 +0000419}
420
Sean Callananf5857a02010-07-31 01:32:05 +0000421bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000422ClangExpressionDeclMap::GetFunctionAddress
423(
424 const ConstString &name,
425 uint64_t &ptr
426)
Sean Callananf5857a02010-07-31 01:32:05 +0000427{
Sean Callananaa301c42010-12-03 01:38:59 +0000428 assert (m_parser_vars.get());
429
Sean Callananf5857a02010-07-31 01:32:05 +0000430 // Back out in all cases where we're not fully initialized
Jim Ingham78b9ee82010-12-07 01:56:02 +0000431 if (m_parser_vars->m_exe_ctx->target == NULL)
432 return false;
433 if (!m_parser_vars->m_sym_ctx.target_sp)
Sean Callananf5857a02010-07-31 01:32:05 +0000434 return false;
435
Greg Claytone5748d82010-11-09 23:46:37 +0000436 SymbolContextList sc_list;
Greg Clayton28d5fcc2011-01-27 06:44:37 +0000437 const bool include_symbols = true;
438 const bool append = false;
439 m_parser_vars->m_sym_ctx.FindFunctionsByName(name, include_symbols, append, sc_list);
Sean Callananf5857a02010-07-31 01:32:05 +0000440
Greg Claytone5748d82010-11-09 23:46:37 +0000441 if (!sc_list.GetSize())
Sean Callananf5857a02010-07-31 01:32:05 +0000442 return false;
443
444 SymbolContext sym_ctx;
Greg Claytone5748d82010-11-09 23:46:37 +0000445 sc_list.GetContextAtIndex(0, sym_ctx);
Sean Callananf5857a02010-07-31 01:32:05 +0000446
447 const Address *fun_address;
448
449 if (sym_ctx.function)
450 fun_address = &sym_ctx.function->GetAddressRange().GetBaseAddress();
451 else if (sym_ctx.symbol)
452 fun_address = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress();
453 else
454 return false;
455
Sean Callananaa301c42010-12-03 01:38:59 +0000456 ptr = fun_address->GetLoadAddress (m_parser_vars->m_exe_ctx->target);
Sean Callananf5857a02010-07-31 01:32:05 +0000457
458 return true;
459}
460
Sean Callananc7674af2011-01-17 23:42:46 +0000461bool
462ClangExpressionDeclMap::GetSymbolAddress
463(
464 const ConstString &name,
465 uint64_t &ptr
466)
467{
468 assert (m_parser_vars.get());
469
470 // Back out in all cases where we're not fully initialized
471 if (m_parser_vars->m_exe_ctx->target == NULL)
472 return false;
473
474 SymbolContextList sc_list;
475
Greg Claytonb3448432011-03-24 21:19:54 +0000476 m_parser_vars->m_exe_ctx->target->GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeAny, sc_list);
Sean Callananc7674af2011-01-17 23:42:46 +0000477
478 if (!sc_list.GetSize())
479 return false;
480
481 SymbolContext sym_ctx;
482 sc_list.GetContextAtIndex(0, sym_ctx);
483
484 const Address *sym_address = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress();
485
486 ptr = sym_address->GetLoadAddress (m_parser_vars->m_exe_ctx->target);
487
488 return true;
489}
490
Sean Callanan810f22d2010-07-16 00:09:46 +0000491// Interface for CommandObjectExpression
Sean Callananf328c9f2010-07-20 23:31:16 +0000492
493bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000494ClangExpressionDeclMap::Materialize
495(
Sean Callananaa301c42010-12-03 01:38:59 +0000496 ExecutionContext &exe_ctx,
Greg Clayton8de27c72010-10-15 22:48:33 +0000497 lldb::addr_t &struct_address,
498 Error &err
499)
Sean Callananf328c9f2010-07-20 23:31:16 +0000500{
Sean Callananaa301c42010-12-03 01:38:59 +0000501 EnableMaterialVars();
502
503 m_material_vars->m_process = exe_ctx.process;
504
Sean Callanan6a925532011-01-13 08:53:35 +0000505 bool result = DoMaterialize(false /* dematerialize */, exe_ctx, NULL, err);
Sean Callananf328c9f2010-07-20 23:31:16 +0000506
507 if (result)
Sean Callananaa301c42010-12-03 01:38:59 +0000508 struct_address = m_material_vars->m_materialized_location;
Sean Callananf328c9f2010-07-20 23:31:16 +0000509
510 return result;
511}
512
513bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000514ClangExpressionDeclMap::GetObjectPointer
515(
516 lldb::addr_t &object_ptr,
Sean Callanan3aa7da52010-12-13 22:46:15 +0000517 ConstString &object_name,
Sean Callananaa301c42010-12-03 01:38:59 +0000518 ExecutionContext &exe_ctx,
Sean Callanan047923c2010-12-14 00:42:36 +0000519 Error &err,
520 bool suppress_type_check
Greg Clayton8de27c72010-10-15 22:48:33 +0000521)
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000522{
Sean Callananaa301c42010-12-03 01:38:59 +0000523 assert (m_struct_vars.get());
524
525 if (!exe_ctx.frame || !exe_ctx.target || !exe_ctx.process)
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000526 {
527 err.SetErrorString("Couldn't load 'this' because the context is incomplete");
528 return false;
529 }
530
Sean Callananaa301c42010-12-03 01:38:59 +0000531 if (!m_struct_vars->m_object_pointer_type.GetOpaqueQualType())
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000532 {
533 err.SetErrorString("Couldn't load 'this' because its type is unknown");
534 return false;
535 }
536
Sean Callanan047923c2010-12-14 00:42:36 +0000537 Variable *object_ptr_var = FindVariableInScope (*exe_ctx.frame,
538 object_name,
539 (suppress_type_check ? NULL : &m_struct_vars->m_object_pointer_type));
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000540
541 if (!object_ptr_var)
542 {
Sean Callanan3aa7da52010-12-13 22:46:15 +0000543 err.SetErrorStringWithFormat("Couldn't find '%s' with appropriate type in scope", object_name.GetCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000544 return false;
545 }
546
Sean Callananaa301c42010-12-03 01:38:59 +0000547 std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(exe_ctx,
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000548 object_ptr_var,
Sean Callananaa301c42010-12-03 01:38:59 +0000549 NULL));
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000550
551 if (!location_value.get())
552 {
Sean Callanan3aa7da52010-12-13 22:46:15 +0000553 err.SetErrorStringWithFormat("Couldn't get the location for '%s'", object_name.GetCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000554 return false;
555 }
556
Sean Callanan50339fe2011-03-04 00:23:47 +0000557 switch (location_value->GetValueType())
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000558 {
Sean Callanan50339fe2011-03-04 00:23:47 +0000559 default:
Sean Callanan3aa7da52010-12-13 22:46:15 +0000560 err.SetErrorStringWithFormat("'%s' is not in memory; LLDB must be extended to handle registers", object_name.GetCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000561 return false;
Sean Callanan50339fe2011-03-04 00:23:47 +0000562 case Value::eValueTypeLoadAddress:
563 {
564 lldb::addr_t value_addr = location_value->GetScalar().ULongLong();
565 uint32_t address_byte_size = exe_ctx.target->GetArchitecture().GetAddressByteSize();
566 lldb::ByteOrder address_byte_order = exe_ctx.process->GetByteOrder();
567
568 if (ClangASTType::GetClangTypeBitWidth(m_struct_vars->m_object_pointer_type.GetASTContext(),
569 m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) != address_byte_size * 8)
570 {
571 err.SetErrorStringWithFormat("'%s' is not of an expected pointer size", object_name.GetCString());
572 return false;
573 }
574
575 DataBufferHeap data;
576 data.SetByteSize(address_byte_size);
577 Error read_error;
578
579 if (exe_ctx.process->ReadMemory (value_addr, data.GetBytes(), address_byte_size, read_error) != address_byte_size)
580 {
581 err.SetErrorStringWithFormat("Coldn't read '%s' from the target: %s", object_name.GetCString(), read_error.AsCString());
582 return false;
583 }
584
585 DataExtractor extractor(data.GetBytes(), data.GetByteSize(), address_byte_order, address_byte_size);
586
587 uint32_t offset = 0;
588
589 object_ptr = extractor.GetPointer(&offset);
590
591 return true;
592 }
593 case Value::eValueTypeScalar:
594 {
595 if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
596 {
597 StreamString ss;
598 location_value->Dump(&ss);
599
600 err.SetErrorStringWithFormat("%s is a scalar of unhandled type: %s", object_name.GetCString(), ss.GetString().c_str());
601 return false;
602 }
603
Greg Claytonb3448432011-03-24 21:19:54 +0000604 RegisterInfo *register_info = location_value->GetRegisterInfo();
Sean Callanan50339fe2011-03-04 00:23:47 +0000605
606 if (!register_info)
607 {
608 err.SetErrorStringWithFormat("Couldn't get the register information for %s", object_name.GetCString());
609 return false;
610 }
611
612 RegisterContext *register_context = exe_ctx.GetRegisterContext();
613
614 if (!register_context)
615 {
616 err.SetErrorStringWithFormat("Couldn't read register context to read %s from %s", object_name.GetCString(), register_info->name);
617 return false;
618 }
619
620 uint32_t register_number = register_info->kinds[lldb::eRegisterKindLLDB];
621
622 object_ptr = register_context->ReadRegisterAsUnsigned(register_number, 0x0);
623
624 return true;
625 }
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000626 }
627}
628
629bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000630ClangExpressionDeclMap::Dematerialize
631(
Sean Callananaa301c42010-12-03 01:38:59 +0000632 ExecutionContext &exe_ctx,
Greg Clayton427f2902010-12-14 02:59:59 +0000633 ClangExpressionVariableSP &result_sp,
Greg Clayton8de27c72010-10-15 22:48:33 +0000634 Error &err
635)
Sean Callananf328c9f2010-07-20 23:31:16 +0000636{
Greg Clayton427f2902010-12-14 02:59:59 +0000637 return DoMaterialize(true, exe_ctx, &result_sp, err);
Sean Callananaa301c42010-12-03 01:38:59 +0000638
639 DidDematerialize();
640}
641
642void
643ClangExpressionDeclMap::DidDematerialize()
644{
645 if (m_material_vars.get())
646 {
647 if (m_material_vars->m_materialized_location)
648 {
649 //#define SINGLE_STEP_EXPRESSIONS
650
651#ifndef SINGLE_STEP_EXPRESSIONS
652 m_material_vars->m_process->DeallocateMemory(m_material_vars->m_materialized_location);
653#endif
654 m_material_vars->m_materialized_location = 0;
655 }
656
657 DisableMaterialVars();
658 }
Sean Callananf328c9f2010-07-20 23:31:16 +0000659}
660
Sean Callanan32824aa2010-07-23 22:19:18 +0000661bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000662ClangExpressionDeclMap::DumpMaterializedStruct
663(
Sean Callananaa301c42010-12-03 01:38:59 +0000664 ExecutionContext &exe_ctx,
Greg Clayton8de27c72010-10-15 22:48:33 +0000665 Stream &s,
666 Error &err
667)
Sean Callanan32824aa2010-07-23 22:19:18 +0000668{
Sean Callananaa301c42010-12-03 01:38:59 +0000669 assert (m_struct_vars.get());
670 assert (m_material_vars.get());
671
672 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan32824aa2010-07-23 22:19:18 +0000673 {
674 err.SetErrorString("Structure hasn't been laid out yet");
675 return false;
676 }
677
Sean Callananaa301c42010-12-03 01:38:59 +0000678 if (!exe_ctx.process)
Sean Callanan32824aa2010-07-23 22:19:18 +0000679 {
680 err.SetErrorString("Couldn't find the process");
681 return false;
682 }
683
Sean Callananaa301c42010-12-03 01:38:59 +0000684 if (!exe_ctx.target)
Sean Callanan32824aa2010-07-23 22:19:18 +0000685 {
686 err.SetErrorString("Couldn't find the target");
687 return false;
688 }
689
Sean Callanan33711022010-12-07 10:00:20 +0000690 if (!m_material_vars->m_materialized_location)
691 {
692 err.SetErrorString("No materialized location");
693 return false;
694 }
695
Sean Callananaa301c42010-12-03 01:38:59 +0000696 lldb::DataBufferSP data(new DataBufferHeap(m_struct_vars->m_struct_size, 0));
Sean Callanan32824aa2010-07-23 22:19:18 +0000697
698 Error error;
Sean Callananaa301c42010-12-03 01:38:59 +0000699 if (exe_ctx.process->ReadMemory (m_material_vars->m_materialized_location, data->GetBytes(), data->GetByteSize(), error) != data->GetByteSize())
Sean Callanan32824aa2010-07-23 22:19:18 +0000700 {
701 err.SetErrorStringWithFormat ("Couldn't read struct from the target: %s", error.AsCString());
702 return false;
703 }
704
Sean Callananaa301c42010-12-03 01:38:59 +0000705 DataExtractor extractor(data, exe_ctx.process->GetByteOrder(), exe_ctx.target->GetArchitecture().GetAddressByteSize());
Sean Callanan32824aa2010-07-23 22:19:18 +0000706
Greg Clayton427f2902010-12-14 02:59:59 +0000707 for (size_t member_idx = 0, num_members = m_struct_members.GetSize();
708 member_idx < num_members;
709 ++member_idx)
Sean Callanan32824aa2010-07-23 22:19:18 +0000710 {
Greg Clayton427f2902010-12-14 02:59:59 +0000711 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_idx));
Sean Callanan32824aa2010-07-23 22:19:18 +0000712
Greg Clayton427f2902010-12-14 02:59:59 +0000713 if (!member_sp)
714 return false;
715
716 s.Printf("[%s]\n", member_sp->GetName().GetCString());
Sean Callanan8c127202010-08-23 23:09:38 +0000717
Greg Clayton427f2902010-12-14 02:59:59 +0000718 if (!member_sp->m_jit_vars.get())
Sean Callanan8c127202010-08-23 23:09:38 +0000719 return false;
720
Greg Clayton427f2902010-12-14 02:59:59 +0000721 extractor.Dump (&s, // stream
722 member_sp->m_jit_vars->m_offset, // offset
723 lldb::eFormatBytesWithASCII, // format
724 1, // byte size of individual entries
725 member_sp->m_jit_vars->m_size, // number of entries
726 16, // entries per line
727 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, // address to print
728 0, // bit size (bitfields only; 0 means ignore)
729 0); // bit alignment (bitfields only; 0 means ignore)
Sean Callanan32824aa2010-07-23 22:19:18 +0000730
731 s.PutChar('\n');
732 }
733
734 return true;
735}
736
Sean Callananf328c9f2010-07-20 23:31:16 +0000737bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000738ClangExpressionDeclMap::DoMaterialize
739(
740 bool dematerialize,
Sean Callananaa301c42010-12-03 01:38:59 +0000741 ExecutionContext &exe_ctx,
Greg Clayton427f2902010-12-14 02:59:59 +0000742 lldb::ClangExpressionVariableSP *result_sp_ptr,
Greg Clayton8de27c72010-10-15 22:48:33 +0000743 Error &err
744)
Sean Callanan810f22d2010-07-16 00:09:46 +0000745{
Greg Clayton427f2902010-12-14 02:59:59 +0000746 if (result_sp_ptr)
747 result_sp_ptr->reset();
748
Sean Callananaa301c42010-12-03 01:38:59 +0000749 assert (m_struct_vars.get());
750
Greg Claytone005f2c2010-11-06 01:53:30 +0000751 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan82b74c82010-08-12 01:56:52 +0000752
Sean Callananaa301c42010-12-03 01:38:59 +0000753 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan810f22d2010-07-16 00:09:46 +0000754 {
755 err.SetErrorString("Structure hasn't been laid out yet");
756 return LLDB_INVALID_ADDRESS;
757 }
758
Sean Callananaa301c42010-12-03 01:38:59 +0000759 if (!exe_ctx.frame)
Sean Callanan45839272010-07-24 01:37:44 +0000760 {
761 err.SetErrorString("Received null execution frame");
762 return LLDB_INVALID_ADDRESS;
763 }
764
Greg Clayton427f2902010-12-14 02:59:59 +0000765 ClangPersistentVariables &persistent_vars = exe_ctx.target->GetPersistentVariables();
Sean Callananaa301c42010-12-03 01:38:59 +0000766
767 if (!m_struct_vars->m_struct_size)
Sean Callanane8a59a82010-09-13 21:34:21 +0000768 {
769 if (log)
770 log->PutCString("Not bothering to allocate a struct because no arguments are needed");
771
Sean Callananaa301c42010-12-03 01:38:59 +0000772 m_material_vars->m_allocated_area = NULL;
Sean Callanane8a59a82010-09-13 21:34:21 +0000773
774 return true;
775 }
776
Sean Callananaa301c42010-12-03 01:38:59 +0000777 const SymbolContext &sym_ctx(exe_ctx.frame->GetSymbolContext(lldb::eSymbolContextEverything));
Sean Callanan810f22d2010-07-16 00:09:46 +0000778
Sean Callananf328c9f2010-07-20 23:31:16 +0000779 if (!dematerialize)
Sean Callanan810f22d2010-07-16 00:09:46 +0000780 {
Sean Callananaa301c42010-12-03 01:38:59 +0000781 if (m_material_vars->m_materialized_location)
Sean Callananf328c9f2010-07-20 23:31:16 +0000782 {
Sean Callananaa301c42010-12-03 01:38:59 +0000783 exe_ctx.process->DeallocateMemory(m_material_vars->m_materialized_location);
784 m_material_vars->m_materialized_location = 0;
Sean Callananf328c9f2010-07-20 23:31:16 +0000785 }
786
Sean Callanan7a60b942010-10-08 01:58:41 +0000787 if (log)
788 log->PutCString("Allocating memory for materialized argument struct");
789
Sean Callananaa301c42010-12-03 01:38:59 +0000790 lldb::addr_t mem = exe_ctx.process->AllocateMemory(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size,
791 lldb::ePermissionsReadable | lldb::ePermissionsWritable,
792 err);
Sean Callananf328c9f2010-07-20 23:31:16 +0000793
794 if (mem == LLDB_INVALID_ADDRESS)
795 return false;
796
Sean Callananaa301c42010-12-03 01:38:59 +0000797 m_material_vars->m_allocated_area = mem;
Sean Callanan810f22d2010-07-16 00:09:46 +0000798 }
799
Sean Callananaa301c42010-12-03 01:38:59 +0000800 m_material_vars->m_materialized_location = m_material_vars->m_allocated_area;
Sean Callananf328c9f2010-07-20 23:31:16 +0000801
Sean Callananaa301c42010-12-03 01:38:59 +0000802 if (m_material_vars->m_materialized_location % m_struct_vars->m_struct_alignment)
803 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 +0000804
Greg Clayton427f2902010-12-14 02:59:59 +0000805 for (uint64_t member_index = 0, num_members = m_struct_members.GetSize();
Sean Callanan8c127202010-08-23 23:09:38 +0000806 member_index < num_members;
807 ++member_index)
Sean Callanan810f22d2010-07-16 00:09:46 +0000808 {
Greg Clayton427f2902010-12-14 02:59:59 +0000809 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
Sean Callanan810f22d2010-07-16 00:09:46 +0000810
Greg Claytona875b642011-01-09 21:07:35 +0000811 if (m_found_entities.ContainsVariable (member_sp))
Sean Callanan8c127202010-08-23 23:09:38 +0000812 {
Greg Claytona875b642011-01-09 21:07:35 +0000813 RegisterInfo *reg_info = member_sp->GetRegisterInfo ();
Greg Clayton427f2902010-12-14 02:59:59 +0000814 if (reg_info)
Sean Callanan1ddd9fe2010-11-30 00:27:43 +0000815 {
816 // This is a register variable
817
Sean Callananaa301c42010-12-03 01:38:59 +0000818 RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
Sean Callanan1ddd9fe2010-11-30 00:27:43 +0000819
820 if (!reg_ctx)
821 return false;
822
Greg Clayton427f2902010-12-14 02:59:59 +0000823 if (!DoMaterializeOneRegister (dematerialize,
824 exe_ctx,
825 *reg_ctx,
826 *reg_info,
827 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
828 err))
Sean Callanan1ddd9fe2010-11-30 00:27:43 +0000829 return false;
830 }
831 else
832 {
Greg Clayton427f2902010-12-14 02:59:59 +0000833 if (!member_sp->m_jit_vars.get())
Sean Callanan1ddd9fe2010-11-30 00:27:43 +0000834 return false;
835
Greg Clayton427f2902010-12-14 02:59:59 +0000836 if (!DoMaterializeOneVariable (dematerialize,
837 exe_ctx,
Sean Callanan6a925532011-01-13 08:53:35 +0000838 sym_ctx,
839 member_sp,
Greg Clayton427f2902010-12-14 02:59:59 +0000840 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
841 err))
Sean Callanan1ddd9fe2010-11-30 00:27:43 +0000842 return false;
843 }
Sean Callanan8c127202010-08-23 23:09:38 +0000844 }
Sean Callanan8c127202010-08-23 23:09:38 +0000845 else
846 {
Greg Claytona875b642011-01-09 21:07:35 +0000847 // No need to look for presistent variables if the name doesn't start
848 // with with a '$' character...
849 if (member_sp->GetName().AsCString ("!")[0] == '$' && persistent_vars.ContainsVariable(member_sp))
850 {
Sean Callanan6a925532011-01-13 08:53:35 +0000851 bool keep_this_in_memory = false;
852
Greg Claytona875b642011-01-09 21:07:35 +0000853 if (member_sp->GetName() == m_struct_vars->m_result_name)
854 {
Greg Claytona875b642011-01-09 21:07:35 +0000855 if (log)
856 log->PutCString("Found result member in the struct");
Sean Callanan6a925532011-01-13 08:53:35 +0000857
Greg Claytona875b642011-01-09 21:07:35 +0000858 if (result_sp_ptr)
859 *result_sp_ptr = member_sp;
Sean Callanan6a925532011-01-13 08:53:35 +0000860
861 keep_this_in_memory = m_keep_result_in_memory;
Greg Claytona875b642011-01-09 21:07:35 +0000862 }
863
864 if (!DoMaterializeOnePersistentVariable (dematerialize,
Sean Callanan6a925532011-01-13 08:53:35 +0000865 exe_ctx,
Greg Claytona875b642011-01-09 21:07:35 +0000866 member_sp,
867 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
868 err))
869 return false;
870 }
871 else
872 {
873 err.SetErrorStringWithFormat("Unexpected variable %s", member_sp->GetName().GetCString());
874 return false;
875 }
Sean Callanan8c127202010-08-23 23:09:38 +0000876 }
Sean Callanan810f22d2010-07-16 00:09:46 +0000877 }
878
Sean Callananf328c9f2010-07-20 23:31:16 +0000879 return true;
880}
881
Sean Callanan6a925532011-01-13 08:53:35 +0000882static bool WriteAddressInto
883(
884 ExecutionContext &exe_ctx,
885 lldb::addr_t target,
886 lldb::addr_t address,
887 Error &err
888)
889{
890 size_t pointer_byte_size = exe_ctx.process->GetAddressByteSize();
891
892 StreamString str (0 | Stream::eBinary,
893 pointer_byte_size,
894 exe_ctx.process->GetByteOrder());
895
896 switch (pointer_byte_size)
897 {
898 default:
899 assert(!"Unhandled byte size");
900 case 4:
901 {
902 uint32_t address32 = address & 0xffffffffll;
Greg Claytoncd548032011-02-01 01:31:41 +0000903 str.PutRawBytes(&address32, sizeof(address32), endian::InlHostByteOrder(), eByteOrderInvalid);
Sean Callanan6a925532011-01-13 08:53:35 +0000904 }
905 break;
906 case 8:
907 {
908 uint64_t address64 = address;
Greg Claytoncd548032011-02-01 01:31:41 +0000909 str.PutRawBytes(&address64, sizeof(address64), endian::InlHostByteOrder(), eByteOrderInvalid);
Sean Callanan6a925532011-01-13 08:53:35 +0000910 }
911 break;
912 }
913
914 return (exe_ctx.process->WriteMemory (target, str.GetData(), pointer_byte_size, err) == pointer_byte_size);
915}
916
917static lldb::addr_t ReadAddressFrom
918(
919 ExecutionContext &exe_ctx,
920 lldb::addr_t source,
921 Error &err
922)
923{
924 size_t pointer_byte_size = exe_ctx.process->GetAddressByteSize();
925
926 DataBufferHeap *buf = new DataBufferHeap(pointer_byte_size, 0);
927 DataBufferSP buf_sp(buf);
928
929 if (exe_ctx.process->ReadMemory (source, buf->GetBytes(), pointer_byte_size, err) != pointer_byte_size)
930 return LLDB_INVALID_ADDRESS;
931
932 DataExtractor extractor (buf_sp, exe_ctx.process->GetByteOrder(), exe_ctx.process->GetAddressByteSize());
933
934 uint32_t offset = 0;
935
936 return (lldb::addr_t)extractor.GetPointer(&offset);
937}
938
Sean Callanana48fe162010-08-11 03:57:18 +0000939bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000940ClangExpressionDeclMap::DoMaterializeOnePersistentVariable
941(
942 bool dematerialize,
943 ExecutionContext &exe_ctx,
Greg Clayton427f2902010-12-14 02:59:59 +0000944 ClangExpressionVariableSP &var_sp,
Greg Clayton8de27c72010-10-15 22:48:33 +0000945 lldb::addr_t addr,
946 Error &err
947)
Sean Callananaa301c42010-12-03 01:38:59 +0000948{
Sean Callanan6a925532011-01-13 08:53:35 +0000949 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
950
Greg Clayton427f2902010-12-14 02:59:59 +0000951 if (!var_sp)
Sean Callanana48fe162010-08-11 03:57:18 +0000952 {
Greg Clayton427f2902010-12-14 02:59:59 +0000953 err.SetErrorString("Invalid persistent variable");
Sean Callanana48fe162010-08-11 03:57:18 +0000954 return LLDB_INVALID_ADDRESS;
955 }
956
Greg Clayton427f2902010-12-14 02:59:59 +0000957 const size_t pvar_byte_size = var_sp->GetByteSize();
Sean Callanana6223432010-08-20 01:02:30 +0000958
Greg Clayton427f2902010-12-14 02:59:59 +0000959 uint8_t *pvar_data = var_sp->GetValueBytes();
960 if (pvar_data == NULL)
Sean Callanana6223432010-08-20 01:02:30 +0000961 return false;
962
Sean Callanana48fe162010-08-11 03:57:18 +0000963 Error error;
964
Sean Callanan6a925532011-01-13 08:53:35 +0000965 lldb::addr_t mem; // The address of a spare memory area used to hold the persistent variable.
966
Sean Callanana48fe162010-08-11 03:57:18 +0000967 if (dematerialize)
968 {
Sean Callanan6a925532011-01-13 08:53:35 +0000969 if (log)
970 log->Printf("Dematerializing persistent variable with flags 0x%hx", var_sp->m_flags);
971
972 if ((var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) ||
973 (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference))
Sean Callanana48fe162010-08-11 03:57:18 +0000974 {
Sean Callanan6a925532011-01-13 08:53:35 +0000975 // Get the location of the target out of the struct.
976
977 Error read_error;
978 mem = ReadAddressFrom(exe_ctx, addr, read_error);
979
980 if (mem == LLDB_INVALID_ADDRESS)
981 {
982 err.SetErrorStringWithFormat("Couldn't read address of %s from struct: %s", var_sp->GetName().GetCString(), error.AsCString());
983 return false;
984 }
985
986 if (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference &&
987 !var_sp->m_live_sp)
988 {
989 // If the reference comes from the program, then the ClangExpressionVariable's
990 // live variable data hasn't been set up yet. Do this now.
991
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000992 var_sp->m_live_sp.reset(new lldb_private::ValueObjectConstResult(exe_ctx.GetBestExecutionContextScope (),
993 var_sp->GetTypeFromUser().GetASTContext(),
Sean Callanan6a925532011-01-13 08:53:35 +0000994 var_sp->GetTypeFromUser().GetOpaqueQualType(),
995 var_sp->GetName(),
996 mem,
Greg Claytonb3448432011-03-24 21:19:54 +0000997 eAddressTypeLoad,
Sean Callanan6a925532011-01-13 08:53:35 +0000998 pvar_byte_size));
999 }
1000
1001 if (!var_sp->m_live_sp)
1002 {
1003 err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", var_sp->GetName().GetCString());
1004 return false;
1005 }
1006
Greg Claytonb3448432011-03-24 21:19:54 +00001007 if (var_sp->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
Sean Callanan6a925532011-01-13 08:53:35 +00001008 {
1009 err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", var_sp->GetName().GetCString());
1010 return false;
1011 }
1012
Sean Callanan97678d12011-01-13 21:23:32 +00001013 if (var_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry ||
1014 var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
Sean Callanan6a925532011-01-13 08:53:35 +00001015 {
1016 mem = var_sp->m_live_sp->GetValue().GetScalar().ULongLong();
1017
1018 if (log)
1019 log->Printf("Dematerializing %s from 0x%llx", var_sp->GetName().GetCString(), (uint64_t)mem);
1020
1021 // Read the contents of the spare memory area
1022
1023 if (log)
1024 log->Printf("Read");
1025
1026 var_sp->ValueUpdated ();
1027 if (exe_ctx.process->ReadMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
1028 {
1029 err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString());
1030 return false;
1031 }
1032
1033 var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsFreezeDry;
1034 }
1035
1036 if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation &&
1037 !(var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget))
1038 {
1039 if (m_keep_result_in_memory)
1040 {
1041 var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget;
1042 }
1043 else
1044 {
1045 Error deallocate_error = exe_ctx.process->DeallocateMemory(mem);
1046
1047 if (!err.Success())
1048 {
1049 err.SetErrorStringWithFormat ("Couldn't deallocate memory for %s: %s", var_sp->GetName().GetCString(), deallocate_error.AsCString());
1050 return false;
1051 }
1052 }
1053 }
1054 }
1055 else
1056 {
1057 err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
Sean Callanana48fe162010-08-11 03:57:18 +00001058 return false;
1059 }
1060 }
1061 else
1062 {
Sean Callanan6a925532011-01-13 08:53:35 +00001063 if (log)
1064 log->Printf("Materializing persistent variable with flags 0x%hx", var_sp->m_flags);
1065
1066 if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation)
Sean Callanana48fe162010-08-11 03:57:18 +00001067 {
Sean Callanan6a925532011-01-13 08:53:35 +00001068 // Allocate a spare memory area to store the persistent variable's contents.
1069
1070 Error allocate_error;
1071
1072 mem = exe_ctx.process->AllocateMemory(pvar_byte_size,
1073 lldb::ePermissionsReadable | lldb::ePermissionsWritable,
1074 allocate_error);
1075
1076 if (mem == LLDB_INVALID_ADDRESS)
1077 {
1078 err.SetErrorStringWithFormat("Couldn't allocate a memory area to store %s: %s", var_sp->GetName().GetCString(), allocate_error.AsCString());
1079 return false;
1080 }
1081
1082 if (log)
1083 log->Printf("Allocated %s (0x%llx) sucessfully", var_sp->GetName().GetCString(), mem);
1084
1085 // Put the location of the spare memory into the live data of the ValueObject.
1086
Jim Inghamfa3a16a2011-03-31 00:19:25 +00001087 var_sp->m_live_sp.reset(new lldb_private::ValueObjectConstResult(exe_ctx.GetBestExecutionContextScope(),
1088 var_sp->GetTypeFromUser().GetASTContext(),
Sean Callanan6a925532011-01-13 08:53:35 +00001089 var_sp->GetTypeFromUser().GetOpaqueQualType(),
1090 var_sp->GetName(),
1091 mem,
Greg Claytonb3448432011-03-24 21:19:54 +00001092 eAddressTypeLoad,
Sean Callanan6a925532011-01-13 08:53:35 +00001093 pvar_byte_size));
1094
1095 // Clear the flag if the variable will never be deallocated.
1096
1097 if (var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
1098 var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsAllocation;
1099
1100 // Write the contents of the variable to the area.
1101
1102 if (exe_ctx.process->WriteMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
1103 {
1104 err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString());
1105 return false;
1106 }
1107 }
1108
1109 if ((var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && var_sp->m_live_sp) ||
1110 var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated)
1111 {
1112 mem = var_sp->m_live_sp->GetValue().GetScalar().ULongLong();
1113
1114 // Now write the location of the area into the struct.
1115
1116 Error write_error;
1117 if (!WriteAddressInto(exe_ctx, addr, mem, write_error))
1118 {
1119 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", var_sp->GetName().GetCString(), write_error.AsCString());
1120 return false;
1121 }
1122
1123 if (log)
1124 log->Printf("Materialized %s into 0x%llx", var_sp->GetName().GetCString(), (uint64_t)mem);
1125 }
1126 else if (!var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference)
1127 {
1128 err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
Sean Callanana48fe162010-08-11 03:57:18 +00001129 return false;
1130 }
1131 }
1132
1133 return true;
1134}
1135
Sean Callananf328c9f2010-07-20 23:31:16 +00001136bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001137ClangExpressionDeclMap::DoMaterializeOneVariable
1138(
1139 bool dematerialize,
1140 ExecutionContext &exe_ctx,
1141 const SymbolContext &sym_ctx,
Sean Callanan6a925532011-01-13 08:53:35 +00001142 ClangExpressionVariableSP &expr_var,
Greg Clayton8de27c72010-10-15 22:48:33 +00001143 lldb::addr_t addr,
1144 Error &err
1145)
Sean Callananf328c9f2010-07-20 23:31:16 +00001146{
Greg Claytone005f2c2010-11-06 01:53:30 +00001147 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callananf328c9f2010-07-20 23:31:16 +00001148
Sean Callanan17c6a052010-10-05 20:18:48 +00001149 if (!exe_ctx.frame || !exe_ctx.process)
Sean Callanancc074622010-09-14 21:59:34 +00001150 return false;
1151
Sean Callanan6a925532011-01-13 08:53:35 +00001152 // Vital information about the value
1153
1154 const ConstString &name(expr_var->GetName());
1155 TypeFromUser type(expr_var->GetTypeFromUser());
1156
Greg Clayton3bc52d02010-11-14 22:13:40 +00001157 Variable *var = FindVariableInScope (*exe_ctx.frame, name, &type);
Sean Callananf328c9f2010-07-20 23:31:16 +00001158
1159 if (!var)
1160 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001161 err.SetErrorStringWithFormat("Couldn't find %s with appropriate type", name.GetCString());
Sean Callananf328c9f2010-07-20 23:31:16 +00001162 return false;
1163 }
1164
Sean Callanan841026f2010-07-23 00:16:21 +00001165 if (log)
Greg Clayton8de27c72010-10-15 22:48:33 +00001166 log->Printf("%s %s with type %p", (dematerialize ? "Dematerializing" : "Materializing"), name.GetCString(), type.GetOpaqueQualType());
Sean Callananf328c9f2010-07-20 23:31:16 +00001167
1168 std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(exe_ctx,
1169 var,
Sean Callananaa301c42010-12-03 01:38:59 +00001170 NULL));
Sean Callananf328c9f2010-07-20 23:31:16 +00001171
1172 if (!location_value.get())
1173 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001174 err.SetErrorStringWithFormat("Couldn't get value for %s", name.GetCString());
Sean Callananf328c9f2010-07-20 23:31:16 +00001175 return false;
1176 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001177
1178 // The size of the type contained in addr
Sean Callananf328c9f2010-07-20 23:31:16 +00001179
Sean Callanan6a925532011-01-13 08:53:35 +00001180 size_t value_bit_size = ClangASTType::GetClangTypeBitWidth(type.GetASTContext(), type.GetOpaqueQualType());
1181 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 +00001182
1183 Value::ValueType value_type = location_value->GetValueType();
1184
1185 switch (value_type)
Sean Callananf328c9f2010-07-20 23:31:16 +00001186 {
Sean Callanan17c6a052010-10-05 20:18:48 +00001187 default:
Sean Callananf328c9f2010-07-20 23:31:16 +00001188 {
Sean Callanan17c6a052010-10-05 20:18:48 +00001189 StreamString ss;
1190
1191 location_value->Dump(&ss);
1192
Greg Clayton8de27c72010-10-15 22:48:33 +00001193 err.SetErrorStringWithFormat("%s has a value of unhandled type: %s", name.GetCString(), ss.GetString().c_str());
Sean Callananf328c9f2010-07-20 23:31:16 +00001194 return false;
1195 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001196 break;
1197 case Value::eValueTypeLoadAddress:
Sean Callananf328c9f2010-07-20 23:31:16 +00001198 {
Sean Callanan6a925532011-01-13 08:53:35 +00001199 if (!dematerialize)
Sean Callanan17c6a052010-10-05 20:18:48 +00001200 {
Sean Callanan6a925532011-01-13 08:53:35 +00001201 lldb::addr_t value_addr = location_value->GetScalar().ULongLong();
1202
1203 Error error;
1204
1205 if (!WriteAddressInto(exe_ctx,
1206 addr,
1207 value_addr,
1208 error))
1209 {
1210 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", name.GetCString(), error.AsCString());
1211 return false;
1212 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001213 }
Sean Callananf328c9f2010-07-20 23:31:16 +00001214 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001215 break;
1216 case Value::eValueTypeScalar:
1217 {
Greg Clayton6916e352010-11-13 03:52:47 +00001218 if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
Sean Callanan17c6a052010-10-05 20:18:48 +00001219 {
1220 StreamString ss;
Sean Callanan17c6a052010-10-05 20:18:48 +00001221 location_value->Dump(&ss);
1222
Greg Clayton8de27c72010-10-15 22:48:33 +00001223 err.SetErrorStringWithFormat("%s is a scalar of unhandled type: %s", name.GetCString(), ss.GetString().c_str());
Sean Callanan17c6a052010-10-05 20:18:48 +00001224 return false;
1225 }
1226
Sean Callanan6a925532011-01-13 08:53:35 +00001227 lldb::addr_t mem; // The address of a spare memory area aused to hold the variable.
1228
Greg Claytonb3448432011-03-24 21:19:54 +00001229 RegisterInfo *register_info = location_value->GetRegisterInfo();
Sean Callanan17c6a052010-10-05 20:18:48 +00001230
1231 if (!register_info)
1232 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001233 err.SetErrorStringWithFormat("Couldn't get the register information for %s", name.GetCString());
Sean Callanan17c6a052010-10-05 20:18:48 +00001234 return false;
1235 }
1236
1237 RegisterContext *register_context = exe_ctx.GetRegisterContext();
1238
1239 if (!register_context)
1240 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001241 err.SetErrorStringWithFormat("Couldn't read register context to read %s from %s", name.GetCString(), register_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001242 return false;
1243 }
1244
1245 uint32_t register_number = register_info->kinds[lldb::eRegisterKindLLDB];
1246 uint32_t register_byte_size = register_info->byte_size;
1247
1248 if (dematerialize)
1249 {
Sean Callanan6a925532011-01-13 08:53:35 +00001250 // Get the location of the spare memory area out of the variable's live data.
1251
1252 if (!expr_var->m_live_sp)
1253 {
1254 err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", name.GetCString());
1255 return false;
1256 }
1257
Greg Claytonb3448432011-03-24 21:19:54 +00001258 if (expr_var->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
Sean Callanan6a925532011-01-13 08:53:35 +00001259 {
1260 err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", name.GetCString());
1261 return false;
1262 }
1263
1264 mem = expr_var->m_live_sp->GetValue().GetScalar().ULongLong();
1265
Sean Callanan17c6a052010-10-05 20:18:48 +00001266 // Moving from addr into a register
1267 //
1268 // Case 1: addr_byte_size and register_byte_size are the same
1269 //
1270 // |AABBCCDD| Address contents
1271 // |AABBCCDD| Register contents
1272 //
1273 // Case 2: addr_byte_size is bigger than register_byte_size
1274 //
1275 // Error! (The register should always be big enough to hold the data)
1276 //
1277 // Case 3: register_byte_size is bigger than addr_byte_size
1278 //
1279 // |AABB| Address contents
1280 // |AABB0000| Register contents [on little-endian hardware]
1281 // |0000AABB| Register contents [on big-endian hardware]
1282
Sean Callanan6a925532011-01-13 08:53:35 +00001283 if (value_byte_size > register_byte_size)
Sean Callanan17c6a052010-10-05 20:18:48 +00001284 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001285 err.SetErrorStringWithFormat("%s is too big to store in %s", name.GetCString(), register_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001286 return false;
1287 }
1288
1289 uint32_t register_offset;
1290
1291 switch (exe_ctx.process->GetByteOrder())
1292 {
1293 default:
Greg Clayton8de27c72010-10-15 22:48:33 +00001294 err.SetErrorStringWithFormat("%s is stored with an unhandled byte order", name.GetCString());
Sean Callanan17c6a052010-10-05 20:18:48 +00001295 return false;
1296 case lldb::eByteOrderLittle:
1297 register_offset = 0;
1298 break;
1299 case lldb::eByteOrderBig:
Sean Callanan6a925532011-01-13 08:53:35 +00001300 register_offset = register_byte_size - value_byte_size;
Sean Callanan17c6a052010-10-05 20:18:48 +00001301 break;
1302 }
1303
1304 DataBufferHeap register_data (register_byte_size, 0);
1305
1306 Error error;
Sean Callanan6a925532011-01-13 08:53:35 +00001307 if (exe_ctx.process->ReadMemory (mem, register_data.GetBytes() + register_offset, value_byte_size, error) != value_byte_size)
Sean Callanan17c6a052010-10-05 20:18:48 +00001308 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001309 err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", name.GetCString(), error.AsCString());
Sean Callanan17c6a052010-10-05 20:18:48 +00001310 return false;
1311 }
1312
1313 DataExtractor register_extractor (register_data.GetBytes(), register_byte_size, exe_ctx.process->GetByteOrder(), exe_ctx.process->GetAddressByteSize());
1314
1315 if (!register_context->WriteRegisterBytes(register_number, register_extractor, 0))
1316 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001317 err.SetErrorStringWithFormat("Couldn't read %s from %s", name.GetCString(), register_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001318 return false;
1319 }
Sean Callanan6a925532011-01-13 08:53:35 +00001320
1321 // Deallocate the spare area and clear the variable's live data.
1322
1323 Error deallocate_error = exe_ctx.process->DeallocateMemory(mem);
1324
1325 if (!deallocate_error.Success())
1326 {
1327 err.SetErrorStringWithFormat("Couldn't deallocate spare memory area for %s: %s", name.GetCString(), deallocate_error.AsCString());
1328 return false;
1329 }
1330
1331 expr_var->m_live_sp.reset();
Sean Callanan17c6a052010-10-05 20:18:48 +00001332 }
1333 else
1334 {
Sean Callanan6a925532011-01-13 08:53:35 +00001335 // Allocate a spare memory area to place the register's contents into. This memory area will be pointed to by the slot in the
1336 // struct.
1337
1338 Error allocate_error;
1339
1340 mem = exe_ctx.process->AllocateMemory(value_byte_size,
1341 lldb::ePermissionsReadable | lldb::ePermissionsWritable,
1342 allocate_error);
1343
1344 if (mem == LLDB_INVALID_ADDRESS)
1345 {
1346 err.SetErrorStringWithFormat("Couldn't allocate a memory area to store %s: %s", name.GetCString(), allocate_error.AsCString());
1347 return false;
1348 }
1349
1350 // Put the location of the spare memory into the live data of the ValueObject.
1351
Jim Inghamfa3a16a2011-03-31 00:19:25 +00001352 expr_var->m_live_sp.reset(new lldb_private::ValueObjectConstResult(exe_ctx.GetBestExecutionContextScope(),
1353 type.GetASTContext(),
Sean Callanan6a925532011-01-13 08:53:35 +00001354 type.GetOpaqueQualType(),
1355 name,
1356 mem,
Greg Claytonb3448432011-03-24 21:19:54 +00001357 eAddressTypeLoad,
Sean Callanan6a925532011-01-13 08:53:35 +00001358 value_byte_size));
1359
1360 // Now write the location of the area into the struct.
1361
1362 Error write_error;
1363 if (!WriteAddressInto(exe_ctx, addr, mem, write_error))
1364 {
1365 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", name.GetCString(), write_error.AsCString());
1366 return false;
1367 }
1368
Sean Callanan17c6a052010-10-05 20:18:48 +00001369 // Moving from a register into addr
1370 //
1371 // Case 1: addr_byte_size and register_byte_size are the same
1372 //
1373 // |AABBCCDD| Register contents
1374 // |AABBCCDD| Address contents
1375 //
1376 // Case 2: addr_byte_size is bigger than register_byte_size
1377 //
1378 // Error! (The register should always be big enough to hold the data)
1379 //
1380 // Case 3: register_byte_size is bigger than addr_byte_size
1381 //
1382 // |AABBCCDD| Register contents
1383 // |AABB| Address contents on little-endian hardware
1384 // |CCDD| Address contents on big-endian hardware
1385
Sean Callanan6a925532011-01-13 08:53:35 +00001386 if (value_byte_size > register_byte_size)
Sean Callanan17c6a052010-10-05 20:18:48 +00001387 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001388 err.SetErrorStringWithFormat("%s is too big to store in %s", name.GetCString(), register_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001389 return false;
1390 }
1391
1392 uint32_t register_offset;
1393
1394 switch (exe_ctx.process->GetByteOrder())
1395 {
1396 default:
Greg Clayton8de27c72010-10-15 22:48:33 +00001397 err.SetErrorStringWithFormat("%s is stored with an unhandled byte order", name.GetCString());
Sean Callanan17c6a052010-10-05 20:18:48 +00001398 return false;
1399 case lldb::eByteOrderLittle:
1400 register_offset = 0;
1401 break;
1402 case lldb::eByteOrderBig:
Sean Callanan6a925532011-01-13 08:53:35 +00001403 register_offset = register_byte_size - value_byte_size;
Sean Callanan17c6a052010-10-05 20:18:48 +00001404 break;
1405 }
1406
1407 DataExtractor register_extractor;
1408
1409 if (!register_context->ReadRegisterBytes(register_number, register_extractor))
1410 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001411 err.SetErrorStringWithFormat("Couldn't read %s from %s", name.GetCString(), register_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001412 return false;
1413 }
1414
Sean Callanan6a925532011-01-13 08:53:35 +00001415 const void *register_data = register_extractor.GetData(&register_offset, value_byte_size);
Sean Callanan17c6a052010-10-05 20:18:48 +00001416
1417 if (!register_data)
1418 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001419 err.SetErrorStringWithFormat("Read but couldn't extract data for %s from %s", name.GetCString(), register_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001420 return false;
1421 }
1422
Sean Callanan6a925532011-01-13 08:53:35 +00001423 if (exe_ctx.process->WriteMemory (mem, register_data, value_byte_size, write_error) != value_byte_size)
Sean Callanan17c6a052010-10-05 20:18:48 +00001424 {
Sean Callanan6a925532011-01-13 08:53:35 +00001425 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", write_error.AsCString());
Sean Callanan17c6a052010-10-05 20:18:48 +00001426 return false;
1427 }
1428 }
1429 }
Sean Callananf328c9f2010-07-20 23:31:16 +00001430 }
1431
1432 return true;
Sean Callanan810f22d2010-07-16 00:09:46 +00001433}
1434
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001435bool
1436ClangExpressionDeclMap::DoMaterializeOneRegister
1437(
1438 bool dematerialize,
1439 ExecutionContext &exe_ctx,
1440 RegisterContext &reg_ctx,
Greg Claytonb3448432011-03-24 21:19:54 +00001441 const RegisterInfo &reg_info,
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001442 lldb::addr_t addr,
1443 Error &err
1444)
1445{
1446 uint32_t register_number = reg_info.kinds[lldb::eRegisterKindLLDB];
1447 uint32_t register_byte_size = reg_info.byte_size;
Greg Claytonbdcb6ab2011-01-25 23:55:37 +00001448
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001449 if (dematerialize)
1450 {
1451 DataBufferHeap register_data (register_byte_size, 0);
1452
Greg Claytonbdcb6ab2011-01-25 23:55:37 +00001453 Error read_error;
1454 if (exe_ctx.process->ReadMemory (addr, register_data.GetBytes(), register_byte_size, read_error) != register_byte_size)
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001455 {
Greg Claytonbdcb6ab2011-01-25 23:55:37 +00001456 err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", reg_info.name, read_error.AsCString());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001457 return false;
1458 }
1459
1460 DataExtractor register_extractor (register_data.GetBytes(), register_byte_size, exe_ctx.process->GetByteOrder(), exe_ctx.process->GetAddressByteSize());
1461
1462 if (!reg_ctx.WriteRegisterBytes(register_number, register_extractor, 0))
1463 {
1464 err.SetErrorStringWithFormat("Couldn't read %s", reg_info.name);
1465 return false;
1466 }
1467 }
1468 else
1469 {
1470 DataExtractor register_extractor;
1471
1472 if (!reg_ctx.ReadRegisterBytes(register_number, register_extractor))
1473 {
1474 err.SetErrorStringWithFormat("Couldn't read %s", reg_info.name);
1475 return false;
1476 }
1477
1478 uint32_t register_offset = 0;
1479
1480 const void *register_data = register_extractor.GetData(&register_offset, register_byte_size);
1481
1482 if (!register_data)
1483 {
1484 err.SetErrorStringWithFormat("Read but couldn't extract data for %s", reg_info.name);
1485 return false;
1486 }
1487
1488 Error error;
1489 if (exe_ctx.process->WriteMemory (addr, register_data, register_byte_size, error) != register_byte_size)
1490 {
1491 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", error.AsCString());
1492 return false;
1493 }
1494 }
1495
1496 return true;
1497}
1498
Sean Callanancc074622010-09-14 21:59:34 +00001499Variable *
Greg Clayton8de27c72010-10-15 22:48:33 +00001500ClangExpressionDeclMap::FindVariableInScope
1501(
1502 StackFrame &frame,
1503 const ConstString &name,
1504 TypeFromUser *type
1505)
Sean Callananaa301c42010-12-03 01:38:59 +00001506{
Greg Claytone005f2c2010-11-06 01:53:30 +00001507 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanancc074622010-09-14 21:59:34 +00001508
Sean Callanancc074622010-09-14 21:59:34 +00001509 VariableList *var_list = frame.GetVariableList(true);
1510
Greg Claytonbf8e42b2010-10-14 22:52:14 +00001511 if (!var_list)
1512 return NULL;
1513
Greg Clayton3bc52d02010-11-14 22:13:40 +00001514 lldb::VariableSP var_sp (var_list->FindVariable(name));
1515
1516 const bool append = true;
1517 const uint32_t max_matches = 1;
1518 if (!var_sp)
Sean Callanancc074622010-09-14 21:59:34 +00001519 {
Greg Clayton3bc52d02010-11-14 22:13:40 +00001520 // Look for globals elsewhere in the module for the frame
Sean Callananaa301c42010-12-03 01:38:59 +00001521 ModuleSP module_sp (frame.GetSymbolContext(eSymbolContextModule).module_sp);
Greg Clayton3bc52d02010-11-14 22:13:40 +00001522 if (module_sp)
1523 {
1524 VariableList module_globals;
1525 if (module_sp->FindGlobalVariables (name, append, max_matches, module_globals))
1526 var_sp = module_globals.GetVariableAtIndex (0);
1527 }
1528 }
1529
1530 if (!var_sp)
1531 {
1532 // Look for globals elsewhere in the program (all images)
Sean Callananaa301c42010-12-03 01:38:59 +00001533 TargetSP target_sp (frame.GetSymbolContext(eSymbolContextTarget).target_sp);
Greg Clayton3bc52d02010-11-14 22:13:40 +00001534 if (target_sp)
1535 {
1536 VariableList program_globals;
1537 if (target_sp->GetImages().FindGlobalVariables (name, append, max_matches, program_globals))
1538 var_sp = program_globals.GetVariableAtIndex (0);
1539 }
1540 }
1541
1542 if (var_sp && type)
1543 {
1544 if (type->GetASTContext() == var_sp->GetType()->GetClangAST())
1545 {
Greg Clayton04c9c7b2011-02-16 23:00:21 +00001546 if (!ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType()))
Greg Clayton3bc52d02010-11-14 22:13:40 +00001547 return NULL;
1548 }
1549 else
1550 {
1551 if (log)
1552 log->PutCString("Skipping a candidate variable because of different AST contexts");
Sean Callanancc074622010-09-14 21:59:34 +00001553 return NULL;
Greg Clayton3bc52d02010-11-14 22:13:40 +00001554 }
Sean Callanancc074622010-09-14 21:59:34 +00001555 }
Greg Clayton3bc52d02010-11-14 22:13:40 +00001556
1557 return var_sp.get();
Sean Callanancc074622010-09-14 21:59:34 +00001558}
Sean Callanan336a0002010-07-17 00:43:37 +00001559
Chris Lattner24943d22010-06-08 16:52:24 +00001560// Interface for ClangASTSource
1561void
Greg Claytone5748d82010-11-09 23:46:37 +00001562ClangExpressionDeclMap::GetDecls (NameSearchContext &context, const ConstString &name)
Chris Lattner24943d22010-06-08 16:52:24 +00001563{
Sean Callananaa301c42010-12-03 01:38:59 +00001564 assert (m_struct_vars.get());
1565 assert (m_parser_vars.get());
1566
Greg Claytone005f2c2010-11-06 01:53:30 +00001567 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001568
Sean Callanan810f22d2010-07-16 00:09:46 +00001569 if (log)
Greg Clayton8de27c72010-10-15 22:48:33 +00001570 log->Printf("Hunting for a definition for '%s'", name.GetCString());
Chris Lattner24943d22010-06-08 16:52:24 +00001571
1572 // Back out in all cases where we're not fully initialized
Sean Callananaa301c42010-12-03 01:38:59 +00001573 if (m_parser_vars->m_exe_ctx->frame == NULL)
Chris Lattner24943d22010-06-08 16:52:24 +00001574 return;
Sean Callananee8fc722010-11-19 20:20:02 +00001575
Sean Callananaa301c42010-12-03 01:38:59 +00001576 if (m_parser_vars->m_ignore_lookups)
Sean Callananee8fc722010-11-19 20:20:02 +00001577 {
1578 if (log)
1579 log->Printf("Ignoring a query during an import");
1580 return;
1581 }
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001582
Greg Claytone5748d82010-11-09 23:46:37 +00001583 SymbolContextList sc_list;
Chris Lattner24943d22010-06-08 16:52:24 +00001584
Greg Clayton3bc52d02010-11-14 22:13:40 +00001585 const char *name_unique_cstr = name.GetCString();
1586
1587 if (name_unique_cstr == NULL)
1588 return;
1589
Greg Clayton8de27c72010-10-15 22:48:33 +00001590 // Only look for functions by name out in our symbols if the function
1591 // doesn't start with our phony prefix of '$'
Greg Clayton3bc52d02010-11-14 22:13:40 +00001592 if (name_unique_cstr[0] != '$')
Sean Callanan0fc73582010-07-27 00:55:47 +00001593 {
Sean Callananaa301c42010-12-03 01:38:59 +00001594 Variable *var = FindVariableInScope(*m_parser_vars->m_exe_ctx->frame, name);
Greg Clayton8de27c72010-10-15 22:48:33 +00001595
1596 // If we found a variable in scope, no need to pull up function names
1597 if (var != NULL)
1598 {
1599 AddOneVariable(context, var);
1600 }
1601 else
1602 {
Greg Clayton28d5fcc2011-01-27 06:44:37 +00001603 const bool include_symbols = true;
1604 const bool append = false;
1605 m_parser_vars->m_sym_ctx.FindFunctionsByName (name,
1606 include_symbols,
1607 append,
1608 sc_list);
Greg Clayton8de27c72010-10-15 22:48:33 +00001609
1610 bool found_specific = false;
1611 Symbol *generic_symbol = NULL;
1612 Symbol *non_extern_symbol = NULL;
1613
Greg Claytone5748d82010-11-09 23:46:37 +00001614 for (uint32_t index = 0, num_indices = sc_list.GetSize();
Greg Clayton8de27c72010-10-15 22:48:33 +00001615 index < num_indices;
1616 ++index)
1617 {
1618 SymbolContext sym_ctx;
Greg Claytone5748d82010-11-09 23:46:37 +00001619 sc_list.GetContextAtIndex(index, sym_ctx);
Sean Callanan3cfbd332010-10-06 00:10:07 +00001620
Greg Clayton8de27c72010-10-15 22:48:33 +00001621 if (sym_ctx.function)
1622 {
1623 // TODO only do this if it's a C function; C++ functions may be
1624 // overloaded
1625 if (!found_specific)
1626 AddOneFunction(context, sym_ctx.function, NULL);
1627 found_specific = true;
1628 }
1629 else if (sym_ctx.symbol)
1630 {
1631 if (sym_ctx.symbol->IsExternal())
1632 generic_symbol = sym_ctx.symbol;
1633 else
1634 non_extern_symbol = sym_ctx.symbol;
1635 }
1636 }
1637
Sean Callanan92aa6662010-09-07 21:49:41 +00001638 if (!found_specific)
Greg Clayton8de27c72010-10-15 22:48:33 +00001639 {
1640 if (generic_symbol)
Greg Clayton28d5fcc2011-01-27 06:44:37 +00001641 AddOneFunction (context, NULL, generic_symbol);
Greg Clayton8de27c72010-10-15 22:48:33 +00001642 else if (non_extern_symbol)
Greg Clayton28d5fcc2011-01-27 06:44:37 +00001643 AddOneFunction (context, NULL, non_extern_symbol);
Greg Clayton8de27c72010-10-15 22:48:33 +00001644 }
Greg Clayton6916e352010-11-13 03:52:47 +00001645
Sean Callananaa301c42010-12-03 01:38:59 +00001646 ClangNamespaceDecl namespace_decl (m_parser_vars->m_sym_ctx.FindNamespace(name));
Greg Clayton6916e352010-11-13 03:52:47 +00001647 if (namespace_decl)
1648 {
Greg Clayton9ceed1e2010-11-13 04:18:24 +00001649 clang::NamespaceDecl *clang_namespace_decl = AddNamespace(context, namespace_decl);
1650 if (clang_namespace_decl)
Greg Clayton9ceed1e2010-11-13 04:18:24 +00001651 clang_namespace_decl->setHasExternalLexicalStorage();
Greg Clayton6916e352010-11-13 03:52:47 +00001652 }
Sean Callanan92aa6662010-09-07 21:49:41 +00001653 }
Sean Callanan0fc73582010-07-27 00:55:47 +00001654 }
Greg Clayton8de27c72010-10-15 22:48:33 +00001655 else
Sean Callanan3cfbd332010-10-06 00:10:07 +00001656 {
Greg Clayton57452832010-11-09 04:42:43 +00001657 static ConstString g_lldb_class_name ("$__lldb_class");
1658 if (name == g_lldb_class_name)
1659 {
1660 // Clang is looking for the type of "this"
1661
Sean Callananaa301c42010-12-03 01:38:59 +00001662 VariableList *vars = m_parser_vars->m_exe_ctx->frame->GetVariableList(false);
Greg Clayton57452832010-11-09 04:42:43 +00001663
1664 if (!vars)
1665 return;
1666
1667 lldb::VariableSP this_var = vars->FindVariable(ConstString("this"));
1668
1669 if (!this_var)
1670 return;
1671
1672 Type *this_type = this_var->GetType();
1673
1674 if (!this_type)
1675 return;
1676
Greg Clayton2403b5e2010-11-16 02:10:54 +00001677 if (log)
1678 {
1679 log->PutCString ("Type for \"this\" is: ");
1680 StreamString strm;
1681 this_type->Dump(&strm, true);
1682 log->PutCString (strm.GetData());
1683 }
1684
Greg Clayton04c9c7b2011-02-16 23:00:21 +00001685 TypeFromUser this_user_type(this_type->GetClangFullType(),
Greg Clayton57452832010-11-09 04:42:43 +00001686 this_type->GetClangAST());
1687
Sean Callananaa301c42010-12-03 01:38:59 +00001688 m_struct_vars->m_object_pointer_type = this_user_type;
Greg Clayton57452832010-11-09 04:42:43 +00001689
1690 void *pointer_target_type;
1691
1692 if (!ClangASTContext::IsPointerType(this_user_type.GetOpaqueQualType(),
1693 &pointer_target_type))
1694 return;
1695
1696 TypeFromUser class_user_type(pointer_target_type,
1697 this_type->GetClangAST());
1698
Sean Callanan3aa7da52010-12-13 22:46:15 +00001699 if (log)
1700 {
1701 StreamString type_stream;
1702 class_user_type.DumpTypeCode(&type_stream);
1703 type_stream.Flush();
1704 log->Printf("Adding type for $__lldb_class: %s", type_stream.GetString().c_str());
1705 }
1706
Greg Clayton57452832010-11-09 04:42:43 +00001707 AddOneType(context, class_user_type, true);
1708
1709 return;
1710 }
1711
Sean Callanan3aa7da52010-12-13 22:46:15 +00001712 static ConstString g_lldb_objc_class_name ("$__lldb_objc_class");
1713 if (name == g_lldb_objc_class_name)
1714 {
1715 // Clang is looking for the type of "*self"
1716
1717 VariableList *vars = m_parser_vars->m_exe_ctx->frame->GetVariableList(false);
1718
1719 if (!vars)
1720 return;
1721
1722 lldb::VariableSP self_var = vars->FindVariable(ConstString("self"));
1723
1724 if (!self_var)
1725 return;
1726
1727 Type *self_type = self_var->GetType();
1728
1729 if (!self_type)
1730 return;
1731
Greg Clayton04c9c7b2011-02-16 23:00:21 +00001732 TypeFromUser self_user_type(self_type->GetClangFullType(),
Sean Callanan3aa7da52010-12-13 22:46:15 +00001733 self_type->GetClangAST());
1734
1735 m_struct_vars->m_object_pointer_type = self_user_type;
1736
1737 void *pointer_target_type;
1738
1739 if (!ClangASTContext::IsPointerType(self_user_type.GetOpaqueQualType(),
1740 &pointer_target_type))
1741 return;
1742
1743 TypeFromUser class_user_type(pointer_target_type,
1744 self_type->GetClangAST());
1745
1746 if (log)
1747 {
1748 StreamString type_stream;
1749 class_user_type.DumpTypeCode(&type_stream);
1750 type_stream.Flush();
1751 log->Printf("Adding type for $__lldb_objc_class: %s", type_stream.GetString().c_str());
1752 }
1753
1754 AddOneType(context, class_user_type, false);
1755
1756 return;
1757 }
Greg Clayton427f2902010-12-14 02:59:59 +00001758
1759 ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name));
Greg Clayton8de27c72010-10-15 22:48:33 +00001760
Greg Clayton427f2902010-12-14 02:59:59 +00001761 if (pvar_sp)
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001762 {
Greg Clayton427f2902010-12-14 02:59:59 +00001763 AddOneVariable(context, pvar_sp);
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001764 return;
1765 }
1766
1767 const char *reg_name(&name.GetCString()[1]);
1768
Sean Callananaa301c42010-12-03 01:38:59 +00001769 if (m_parser_vars->m_exe_ctx->GetRegisterContext())
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001770 {
Greg Claytonb3448432011-03-24 21:19:54 +00001771 const RegisterInfo *reg_info(m_parser_vars->m_exe_ctx->GetRegisterContext()->GetRegisterInfoByName(reg_name));
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001772
1773 if (reg_info)
1774 AddOneRegister(context, reg_info);
1775 }
Sean Callanan3cfbd332010-10-06 00:10:07 +00001776 }
1777
Sean Callananaa301c42010-12-03 01:38:59 +00001778 lldb::TypeSP type_sp (m_parser_vars->m_sym_ctx.FindTypeByName (name));
Sean Callananee8fc722010-11-19 20:20:02 +00001779
1780 if (type_sp)
Sean Callanan6df08402010-09-27 23:54:58 +00001781 {
Sean Callananee8fc722010-11-19 20:20:02 +00001782 if (log)
Sean Callanan6df08402010-09-27 23:54:58 +00001783 {
Sean Callananee8fc722010-11-19 20:20:02 +00001784 log->Printf ("Matching type found for \"%s\": ", name.GetCString());
1785 StreamString strm;
1786 type_sp->Dump(&strm, true);
1787 log->PutCString (strm.GetData());
1788 }
Greg Clayton2403b5e2010-11-16 02:10:54 +00001789
Greg Clayton04c9c7b2011-02-16 23:00:21 +00001790 TypeFromUser user_type (type_sp->GetClangFullType(),
Greg Claytonb01000f2011-01-17 03:46:26 +00001791 type_sp->GetClangAST());
Sean Callanan6df08402010-09-27 23:54:58 +00001792
Sean Callananee8fc722010-11-19 20:20:02 +00001793 AddOneType(context, user_type, false);
Sean Callanan6df08402010-09-27 23:54:58 +00001794 }
Sean Callanan336a0002010-07-17 00:43:37 +00001795}
1796
1797Value *
Greg Clayton8de27c72010-10-15 22:48:33 +00001798ClangExpressionDeclMap::GetVariableValue
1799(
1800 ExecutionContext &exe_ctx,
1801 Variable *var,
1802 clang::ASTContext *parser_ast_context,
1803 TypeFromUser *user_type,
1804 TypeFromParser *parser_type
1805)
Chris Lattner24943d22010-06-08 16:52:24 +00001806{
Greg Claytone005f2c2010-11-06 01:53:30 +00001807 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan6184dfe2010-06-23 00:47:48 +00001808
Chris Lattner24943d22010-06-08 16:52:24 +00001809 Type *var_type = var->GetType();
1810
1811 if (!var_type)
1812 {
Sean Callanan810f22d2010-07-16 00:09:46 +00001813 if (log)
1814 log->PutCString("Skipped a definition because it has no type");
Sean Callanan336a0002010-07-17 00:43:37 +00001815 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00001816 }
1817
Greg Clayton04c9c7b2011-02-16 23:00:21 +00001818 clang_type_t var_opaque_type = var_type->GetClangFullType();
Chris Lattner24943d22010-06-08 16:52:24 +00001819
1820 if (!var_opaque_type)
1821 {
Sean Callanan810f22d2010-07-16 00:09:46 +00001822 if (log)
1823 log->PutCString("Skipped a definition because it has no Clang type");
Sean Callanan336a0002010-07-17 00:43:37 +00001824 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00001825 }
1826
Greg Claytonb01000f2011-01-17 03:46:26 +00001827 clang::ASTContext *ast = var_type->GetClangASTContext().getASTContext();
Chris Lattner24943d22010-06-08 16:52:24 +00001828
Greg Claytonb01000f2011-01-17 03:46:26 +00001829 if (!ast)
Chris Lattner24943d22010-06-08 16:52:24 +00001830 {
Sean Callanan810f22d2010-07-16 00:09:46 +00001831 if (log)
1832 log->PutCString("There is no AST context for the current execution context");
Sean Callanan336a0002010-07-17 00:43:37 +00001833 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00001834 }
1835
Sean Callanan336a0002010-07-17 00:43:37 +00001836 DWARFExpression &var_location_expr = var->LocationExpression();
1837
Chris Lattner24943d22010-06-08 16:52:24 +00001838 std::auto_ptr<Value> var_location(new Value);
1839
Greg Clayton178710c2010-09-14 02:20:48 +00001840 lldb::addr_t loclist_base_load_addr = LLDB_INVALID_ADDRESS;
1841
1842 if (var_location_expr.IsLocationList())
1843 {
1844 SymbolContext var_sc;
1845 var->CalculateSymbolContext (&var_sc);
Greg Claytoneea26402010-09-14 23:36:40 +00001846 loclist_base_load_addr = var_sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress (exe_ctx.target);
Greg Clayton178710c2010-09-14 02:20:48 +00001847 }
Chris Lattner24943d22010-06-08 16:52:24 +00001848 Error err;
1849
Greg Claytonbdcb6ab2011-01-25 23:55:37 +00001850 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 +00001851 {
Sean Callanan810f22d2010-07-16 00:09:46 +00001852 if (log)
1853 log->Printf("Error evaluating location: %s", err.AsCString());
Sean Callanan336a0002010-07-17 00:43:37 +00001854 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00001855 }
Greg Claytonb01000f2011-01-17 03:46:26 +00001856
Sean Callanan336a0002010-07-17 00:43:37 +00001857 void *type_to_use;
1858
Sean Callananf328c9f2010-07-20 23:31:16 +00001859 if (parser_ast_context)
1860 {
Greg Claytonb01000f2011-01-17 03:46:26 +00001861 type_to_use = GuardedCopyType(parser_ast_context, ast, var_opaque_type);
Sean Callananf328c9f2010-07-20 23:31:16 +00001862
Sean Callanan4b5eec62010-11-20 02:19:29 +00001863 if (!type_to_use)
1864 {
1865 if (log)
1866 log->Printf("Couldn't copy a variable's type into the parser's AST context");
1867
1868 return NULL;
1869 }
1870
Sean Callananf328c9f2010-07-20 23:31:16 +00001871 if (parser_type)
1872 *parser_type = TypeFromParser(type_to_use, parser_ast_context);
1873 }
Sean Callanan336a0002010-07-17 00:43:37 +00001874 else
1875 type_to_use = var_opaque_type;
Chris Lattner24943d22010-06-08 16:52:24 +00001876
1877 if (var_location.get()->GetContextType() == Value::eContextTypeInvalid)
Greg Clayton6916e352010-11-13 03:52:47 +00001878 var_location.get()->SetContext(Value::eContextTypeClangType, type_to_use);
Chris Lattner24943d22010-06-08 16:52:24 +00001879
1880 if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress)
1881 {
1882 SymbolContext var_sc;
1883 var->CalculateSymbolContext(&var_sc);
Sean Callanan336a0002010-07-17 00:43:37 +00001884
Chris Lattner24943d22010-06-08 16:52:24 +00001885 if (!var_sc.module_sp)
Sean Callanan336a0002010-07-17 00:43:37 +00001886 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00001887
1888 ObjectFile *object_file = var_sc.module_sp->GetObjectFile();
1889
1890 if (!object_file)
Sean Callanan336a0002010-07-17 00:43:37 +00001891 return NULL;
1892
Chris Lattner24943d22010-06-08 16:52:24 +00001893 Address so_addr(var_location->GetScalar().ULongLong(), object_file->GetSectionList());
1894
Sean Callananaa301c42010-12-03 01:38:59 +00001895 lldb::addr_t load_addr = so_addr.GetLoadAddress(exe_ctx.target);
Chris Lattner24943d22010-06-08 16:52:24 +00001896
1897 var_location->GetScalar() = load_addr;
1898 var_location->SetValueType(Value::eValueTypeLoadAddress);
1899 }
1900
Sean Callananf328c9f2010-07-20 23:31:16 +00001901 if (user_type)
Greg Claytonb01000f2011-01-17 03:46:26 +00001902 *user_type = TypeFromUser(var_opaque_type, ast);
Sean Callanan336a0002010-07-17 00:43:37 +00001903
1904 return var_location.release();
1905}
1906
1907void
Greg Claytonb01000f2011-01-17 03:46:26 +00001908ClangExpressionDeclMap::AddOneVariable (NameSearchContext &context, Variable* var)
Sean Callanan336a0002010-07-17 00:43:37 +00001909{
Sean Callananaa301c42010-12-03 01:38:59 +00001910 assert (m_parser_vars.get());
1911
Greg Claytone005f2c2010-11-06 01:53:30 +00001912 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan336a0002010-07-17 00:43:37 +00001913
Sean Callananf328c9f2010-07-20 23:31:16 +00001914 TypeFromUser ut;
1915 TypeFromParser pt;
Sean Callanan336a0002010-07-17 00:43:37 +00001916
Sean Callananaa301c42010-12-03 01:38:59 +00001917 Value *var_location = GetVariableValue (*m_parser_vars->m_exe_ctx,
Greg Clayton8de27c72010-10-15 22:48:33 +00001918 var,
1919 context.GetASTContext(),
1920 &ut,
1921 &pt);
Sean Callanan336a0002010-07-17 00:43:37 +00001922
Sean Callanan4b5eec62010-11-20 02:19:29 +00001923 if (!var_location)
1924 return;
1925
Sean Callanan6a925532011-01-13 08:53:35 +00001926 NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(pt.GetASTContext(), pt.GetOpaqueQualType()));
Greg Clayton8de27c72010-10-15 22:48:33 +00001927 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton427f2902010-12-14 02:59:59 +00001928 ConstString entity_name(decl_name.c_str());
Jim Inghamfa3a16a2011-03-31 00:19:25 +00001929 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
1930 entity_name,
Greg Clayton427f2902010-12-14 02:59:59 +00001931 ut,
1932 m_parser_vars->m_exe_ctx->process->GetByteOrder(),
1933 m_parser_vars->m_exe_ctx->process->GetAddressByteSize()));
1934 assert (entity.get());
1935 entity->EnableParserVars();
1936 entity->m_parser_vars->m_parser_type = pt;
1937 entity->m_parser_vars->m_named_decl = var_decl;
1938 entity->m_parser_vars->m_llvm_value = NULL;
1939 entity->m_parser_vars->m_lldb_value = var_location;
Chris Lattner24943d22010-06-08 16:52:24 +00001940
Sean Callanan810f22d2010-07-16 00:09:46 +00001941 if (log)
Greg Clayton8de27c72010-10-15 22:48:33 +00001942 {
Sean Callanana0744822010-11-01 23:22:47 +00001943 std::string var_decl_print_string;
1944 llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
1945 var_decl->print(var_decl_print_stream);
1946 var_decl_print_stream.flush();
1947
1948 log->Printf("Found variable %s, returned %s", decl_name.c_str(), var_decl_print_string.c_str());
Sean Callanan6e74dbb2011-02-01 23:43:26 +00001949
1950 if (log->GetVerbose())
1951 {
1952 StreamString var_decl_dump_string;
1953 ASTDumper::DumpDecl(var_decl_dump_string, var_decl);
1954 log->Printf("%s\n", var_decl_dump_string.GetData());
1955 }
Greg Clayton8de27c72010-10-15 22:48:33 +00001956 }
Sean Callanan8f0dc342010-06-22 23:46:24 +00001957}
1958
1959void
Sean Callanana48fe162010-08-11 03:57:18 +00001960ClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
Greg Clayton427f2902010-12-14 02:59:59 +00001961 ClangExpressionVariableSP &pvar_sp)
Sean Callanana48fe162010-08-11 03:57:18 +00001962{
Greg Claytone005f2c2010-11-06 01:53:30 +00001963 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan45690fe2010-08-30 22:17:16 +00001964
Greg Clayton427f2902010-12-14 02:59:59 +00001965 TypeFromUser user_type (pvar_sp->GetTypeFromUser());
Sean Callanana48fe162010-08-11 03:57:18 +00001966
Greg Clayton427f2902010-12-14 02:59:59 +00001967 TypeFromParser parser_type (GuardedCopyType(context.GetASTContext(),
1968 user_type.GetASTContext(),
1969 user_type.GetOpaqueQualType()),
1970 context.GetASTContext());
Sean Callanana48fe162010-08-11 03:57:18 +00001971
Sean Callanan6a925532011-01-13 08:53:35 +00001972 NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(parser_type.GetASTContext(), parser_type.GetOpaqueQualType()));
Sean Callanan8c127202010-08-23 23:09:38 +00001973
Greg Clayton427f2902010-12-14 02:59:59 +00001974 pvar_sp->EnableParserVars();
1975 pvar_sp->m_parser_vars->m_parser_type = parser_type;
1976 pvar_sp->m_parser_vars->m_named_decl = var_decl;
1977 pvar_sp->m_parser_vars->m_llvm_value = NULL;
1978 pvar_sp->m_parser_vars->m_lldb_value = NULL;
Sean Callanan45690fe2010-08-30 22:17:16 +00001979
1980 if (log)
Sean Callanana0744822010-11-01 23:22:47 +00001981 {
1982 std::string var_decl_print_string;
1983 llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
1984 var_decl->print(var_decl_print_stream);
1985 var_decl_print_stream.flush();
1986
Greg Clayton427f2902010-12-14 02:59:59 +00001987 log->Printf("Added pvar %s, returned %s", pvar_sp->GetName().GetCString(), var_decl_print_string.c_str());
Sean Callanana0744822010-11-01 23:22:47 +00001988 }
Sean Callanana48fe162010-08-11 03:57:18 +00001989}
1990
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001991void
Greg Clayton427f2902010-12-14 02:59:59 +00001992ClangExpressionDeclMap::AddOneRegister (NameSearchContext &context,
1993 const RegisterInfo *reg_info)
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001994{
1995 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1996
1997 void *ast_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize(context.GetASTContext(),
1998 reg_info->encoding,
1999 reg_info->byte_size * 8);
2000
2001 if (!ast_type)
2002 {
2003 log->Printf("Tried to add a type for %s, but couldn't get one", context.m_decl_name.getAsString().c_str());
2004 return;
2005 }
2006
Greg Clayton427f2902010-12-14 02:59:59 +00002007 TypeFromParser parser_type (ast_type,
2008 context.GetASTContext());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002009
2010 NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
2011
Jim Inghamfa3a16a2011-03-31 00:19:25 +00002012 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope(),
2013 m_parser_vars->m_exe_ctx->process->GetByteOrder(),
Greg Clayton427f2902010-12-14 02:59:59 +00002014 m_parser_vars->m_exe_ctx->process->GetAddressByteSize()));
2015 assert (entity.get());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002016 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton427f2902010-12-14 02:59:59 +00002017 entity->SetName (ConstString (decl_name.c_str()));
2018 entity->SetRegisterInfo (reg_info);
2019 entity->EnableParserVars();
2020 entity->m_parser_vars->m_parser_type = parser_type;
2021 entity->m_parser_vars->m_named_decl = var_decl;
2022 entity->m_parser_vars->m_llvm_value = NULL;
2023 entity->m_parser_vars->m_lldb_value = NULL;
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002024
2025 if (log)
2026 {
2027 std::string var_decl_print_string;
2028 llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
2029 var_decl->print(var_decl_print_stream);
2030 var_decl_print_stream.flush();
2031
2032 log->Printf("Added register %s, returned %s", context.m_decl_name.getAsString().c_str(), var_decl_print_string.c_str());
2033 }
2034}
2035
Greg Clayton6916e352010-11-13 03:52:47 +00002036clang::NamespaceDecl *
2037ClangExpressionDeclMap::AddNamespace (NameSearchContext &context, const ClangNamespaceDecl &namespace_decl)
2038{
2039 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2040
Greg Clayton6916e352010-11-13 03:52:47 +00002041 clang::Decl *copied_decl = ClangASTContext::CopyDecl (context.GetASTContext(),
2042 namespace_decl.GetASTContext(),
2043 namespace_decl.GetNamespaceDecl());
2044
2045 return dyn_cast<clang::NamespaceDecl>(copied_decl);
2046}
2047
Sean Callanana48fe162010-08-11 03:57:18 +00002048void
Sean Callanan8f0dc342010-06-22 23:46:24 +00002049ClangExpressionDeclMap::AddOneFunction(NameSearchContext &context,
Sean Callanan0fc73582010-07-27 00:55:47 +00002050 Function* fun,
2051 Symbol* symbol)
Sean Callanan8f0dc342010-06-22 23:46:24 +00002052{
Sean Callananaa301c42010-12-03 01:38:59 +00002053 assert (m_parser_vars.get());
2054
Greg Claytone005f2c2010-11-06 01:53:30 +00002055 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan8f0dc342010-06-22 23:46:24 +00002056
Sean Callanan0fc73582010-07-27 00:55:47 +00002057 NamedDecl *fun_decl;
Sean Callanan8f0dc342010-06-22 23:46:24 +00002058 std::auto_ptr<Value> fun_location(new Value);
Sean Callanan0fc73582010-07-27 00:55:47 +00002059 const Address *fun_address;
Sean Callanan8f0dc342010-06-22 23:46:24 +00002060
Sean Callanan0fc73582010-07-27 00:55:47 +00002061 // only valid for Functions, not for Symbols
2062 void *fun_opaque_type = NULL;
2063 clang::ASTContext *fun_ast_context = NULL;
2064
2065 if (fun)
2066 {
2067 Type *fun_type = fun->GetType();
2068
2069 if (!fun_type)
2070 {
2071 if (log)
2072 log->PutCString("Skipped a function because it has no type");
2073 return;
2074 }
2075
Greg Clayton04c9c7b2011-02-16 23:00:21 +00002076 fun_opaque_type = fun_type->GetClangFullType();
Sean Callanan0fc73582010-07-27 00:55:47 +00002077
2078 if (!fun_opaque_type)
2079 {
2080 if (log)
2081 log->PutCString("Skipped a function because it has no Clang type");
2082 return;
2083 }
2084
2085 fun_address = &fun->GetAddressRange().GetBaseAddress();
2086
Greg Claytonb01000f2011-01-17 03:46:26 +00002087 fun_ast_context = fun_type->GetClangASTContext().getASTContext();
Sean Callananee8fc722010-11-19 20:20:02 +00002088 void *copied_type = GuardedCopyType(context.GetASTContext(), fun_ast_context, fun_opaque_type);
Sean Callanan0fc73582010-07-27 00:55:47 +00002089
2090 fun_decl = context.AddFunDecl(copied_type);
2091 }
2092 else if (symbol)
2093 {
2094 fun_address = &symbol->GetAddressRangeRef().GetBaseAddress();
2095
2096 fun_decl = context.AddGenericFunDecl();
2097 }
2098 else
2099 {
2100 if (log)
2101 log->PutCString("AddOneFunction called with no function and no symbol");
2102 return;
2103 }
2104
Sean Callananaa301c42010-12-03 01:38:59 +00002105 lldb::addr_t load_addr = fun_address->GetLoadAddress(m_parser_vars->m_exe_ctx->target);
Sean Callanan8f0dc342010-06-22 23:46:24 +00002106 fun_location->SetValueType(Value::eValueTypeLoadAddress);
2107 fun_location->GetScalar() = load_addr;
2108
Jim Inghamfa3a16a2011-03-31 00:19:25 +00002109 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
2110 m_parser_vars->m_exe_ctx->process->GetByteOrder(),
Greg Clayton427f2902010-12-14 02:59:59 +00002111 m_parser_vars->m_exe_ctx->process->GetAddressByteSize()));
2112 assert (entity.get());
Greg Clayton8de27c72010-10-15 22:48:33 +00002113 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton427f2902010-12-14 02:59:59 +00002114 entity->SetName(ConstString(decl_name.c_str()));
2115 entity->SetClangType (fun_opaque_type);
2116 entity->SetClangAST (fun_ast_context);
Sean Callanan8f0dc342010-06-22 23:46:24 +00002117
Greg Clayton427f2902010-12-14 02:59:59 +00002118 entity->EnableParserVars();
2119 entity->m_parser_vars->m_named_decl = fun_decl;
2120 entity->m_parser_vars->m_llvm_value = NULL;
2121 entity->m_parser_vars->m_lldb_value = fun_location.release();
Sean Callanan8c127202010-08-23 23:09:38 +00002122
Sean Callanan810f22d2010-07-16 00:09:46 +00002123 if (log)
Greg Clayton8de27c72010-10-15 22:48:33 +00002124 {
Sean Callanana0744822010-11-01 23:22:47 +00002125 std::string fun_decl_print_string;
2126 llvm::raw_string_ostream fun_decl_print_stream(fun_decl_print_string);
2127 fun_decl->print(fun_decl_print_stream);
2128 fun_decl_print_stream.flush();
2129
2130 log->Printf("Found %s function %s, returned %s", (fun ? "specific" : "generic"), decl_name.c_str(), fun_decl_print_string.c_str());
Greg Clayton8de27c72010-10-15 22:48:33 +00002131 }
Chris Lattner24943d22010-06-08 16:52:24 +00002132}
Sean Callanan93a4b1a2010-08-04 01:02:13 +00002133
2134void
2135ClangExpressionDeclMap::AddOneType(NameSearchContext &context,
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00002136 TypeFromUser &ut,
2137 bool add_method)
Sean Callanan93a4b1a2010-08-04 01:02:13 +00002138{
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00002139 clang::ASTContext *parser_ast_context = context.GetASTContext();
2140 clang::ASTContext *user_ast_context = ut.GetASTContext();
Sean Callanan93a4b1a2010-08-04 01:02:13 +00002141
Sean Callananee8fc722010-11-19 20:20:02 +00002142 void *copied_type = GuardedCopyType(parser_ast_context, user_ast_context, ut.GetOpaqueQualType());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00002143
2144 TypeFromParser parser_type(copied_type, parser_ast_context);
2145
2146 if (add_method && ClangASTContext::IsAggregateType(copied_type))
2147 {
2148 void *args[1];
2149
2150 args[0] = ClangASTContext::GetVoidPtrType(parser_ast_context, false);
2151
2152 void *method_type = ClangASTContext::CreateFunctionType (parser_ast_context,
2153 ClangASTContext::GetBuiltInType_void(parser_ast_context),
2154 args,
2155 1,
2156 false,
2157 ClangASTContext::GetTypeQualifiers(copied_type));
Greg Clayton30449d52010-10-01 02:31:07 +00002158
Greg Clayton1d8173f2010-09-24 05:15:53 +00002159 const bool is_virtual = false;
2160 const bool is_static = false;
2161 const bool is_inline = false;
Greg Clayton30449d52010-10-01 02:31:07 +00002162 const bool is_explicit = false;
2163
Greg Clayton1d8173f2010-09-24 05:15:53 +00002164 ClangASTContext::AddMethodToCXXRecordType (parser_ast_context,
2165 copied_type,
Greg Clayton8de27c72010-10-15 22:48:33 +00002166 "$__lldb_expr",
Greg Clayton1d8173f2010-09-24 05:15:53 +00002167 method_type,
2168 lldb::eAccessPublic,
2169 is_virtual,
2170 is_static,
Greg Clayton30449d52010-10-01 02:31:07 +00002171 is_inline,
2172 is_explicit);
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00002173 }
Sean Callanan93a4b1a2010-08-04 01:02:13 +00002174
2175 context.AddTypeDecl(copied_type);
2176}
Sean Callananee8fc722010-11-19 20:20:02 +00002177
2178void *
2179ClangExpressionDeclMap::GuardedCopyType (ASTContext *dest_context,
2180 ASTContext *source_context,
2181 void *clang_type)
2182{
Sean Callananaa301c42010-12-03 01:38:59 +00002183 assert (m_parser_vars.get());
2184
2185 m_parser_vars->m_ignore_lookups = true;
Sean Callananee8fc722010-11-19 20:20:02 +00002186
2187 void *ret = ClangASTContext::CopyType (dest_context,
2188 source_context,
2189 clang_type);
2190
Sean Callananaa301c42010-12-03 01:38:59 +00002191 m_parser_vars->m_ignore_lookups = false;
Sean Callananee8fc722010-11-19 20:20:02 +00002192
2193 return ret;
2194}