blob: 60a37bc59490e8933041e9f5bbc9411d5bfd8e98 [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 (),
Stephen Wilsondbeb3e12011-04-11 19:41:40 +000053 m_keep_result_in_memory (keep_result_in_memory),
Sean Callananaa301c42010-12-03 01:38:59 +000054 m_parser_vars (),
Stephen Wilsondbeb3e12011-04-11 19:41:40 +000055 m_struct_vars ()
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
Greg Claytona875b642011-01-09 21:07:35 +0000852 if (member_sp->GetName() == m_struct_vars->m_result_name)
853 {
Greg Claytona875b642011-01-09 21:07:35 +0000854 if (log)
855 log->PutCString("Found result member in the struct");
Sean Callanan6a925532011-01-13 08:53:35 +0000856
Greg Claytona875b642011-01-09 21:07:35 +0000857 if (result_sp_ptr)
858 *result_sp_ptr = member_sp;
Sean Callanan6a925532011-01-13 08:53:35 +0000859
Greg Claytona875b642011-01-09 21:07:35 +0000860 }
861
862 if (!DoMaterializeOnePersistentVariable (dematerialize,
Sean Callanan6a925532011-01-13 08:53:35 +0000863 exe_ctx,
Greg Claytona875b642011-01-09 21:07:35 +0000864 member_sp,
865 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
866 err))
867 return false;
868 }
869 else
870 {
871 err.SetErrorStringWithFormat("Unexpected variable %s", member_sp->GetName().GetCString());
872 return false;
873 }
Sean Callanan8c127202010-08-23 23:09:38 +0000874 }
Sean Callanan810f22d2010-07-16 00:09:46 +0000875 }
876
Sean Callananf328c9f2010-07-20 23:31:16 +0000877 return true;
878}
879
Sean Callanan6a925532011-01-13 08:53:35 +0000880static bool WriteAddressInto
881(
882 ExecutionContext &exe_ctx,
883 lldb::addr_t target,
884 lldb::addr_t address,
885 Error &err
886)
887{
888 size_t pointer_byte_size = exe_ctx.process->GetAddressByteSize();
889
890 StreamString str (0 | Stream::eBinary,
891 pointer_byte_size,
892 exe_ctx.process->GetByteOrder());
893
894 switch (pointer_byte_size)
895 {
896 default:
897 assert(!"Unhandled byte size");
898 case 4:
899 {
900 uint32_t address32 = address & 0xffffffffll;
Greg Claytoncd548032011-02-01 01:31:41 +0000901 str.PutRawBytes(&address32, sizeof(address32), endian::InlHostByteOrder(), eByteOrderInvalid);
Sean Callanan6a925532011-01-13 08:53:35 +0000902 }
903 break;
904 case 8:
905 {
906 uint64_t address64 = address;
Greg Claytoncd548032011-02-01 01:31:41 +0000907 str.PutRawBytes(&address64, sizeof(address64), endian::InlHostByteOrder(), eByteOrderInvalid);
Sean Callanan6a925532011-01-13 08:53:35 +0000908 }
909 break;
910 }
911
912 return (exe_ctx.process->WriteMemory (target, str.GetData(), pointer_byte_size, err) == pointer_byte_size);
913}
914
915static lldb::addr_t ReadAddressFrom
916(
917 ExecutionContext &exe_ctx,
918 lldb::addr_t source,
919 Error &err
920)
921{
922 size_t pointer_byte_size = exe_ctx.process->GetAddressByteSize();
923
924 DataBufferHeap *buf = new DataBufferHeap(pointer_byte_size, 0);
925 DataBufferSP buf_sp(buf);
926
927 if (exe_ctx.process->ReadMemory (source, buf->GetBytes(), pointer_byte_size, err) != pointer_byte_size)
928 return LLDB_INVALID_ADDRESS;
929
930 DataExtractor extractor (buf_sp, exe_ctx.process->GetByteOrder(), exe_ctx.process->GetAddressByteSize());
931
932 uint32_t offset = 0;
933
934 return (lldb::addr_t)extractor.GetPointer(&offset);
935}
936
Sean Callanana48fe162010-08-11 03:57:18 +0000937bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000938ClangExpressionDeclMap::DoMaterializeOnePersistentVariable
939(
940 bool dematerialize,
941 ExecutionContext &exe_ctx,
Greg Clayton427f2902010-12-14 02:59:59 +0000942 ClangExpressionVariableSP &var_sp,
Greg Clayton8de27c72010-10-15 22:48:33 +0000943 lldb::addr_t addr,
944 Error &err
945)
Sean Callananaa301c42010-12-03 01:38:59 +0000946{
Sean Callanan6a925532011-01-13 08:53:35 +0000947 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
948
Greg Clayton427f2902010-12-14 02:59:59 +0000949 if (!var_sp)
Sean Callanana48fe162010-08-11 03:57:18 +0000950 {
Greg Clayton427f2902010-12-14 02:59:59 +0000951 err.SetErrorString("Invalid persistent variable");
Sean Callanana48fe162010-08-11 03:57:18 +0000952 return LLDB_INVALID_ADDRESS;
953 }
954
Greg Clayton427f2902010-12-14 02:59:59 +0000955 const size_t pvar_byte_size = var_sp->GetByteSize();
Sean Callanana6223432010-08-20 01:02:30 +0000956
Greg Clayton427f2902010-12-14 02:59:59 +0000957 uint8_t *pvar_data = var_sp->GetValueBytes();
958 if (pvar_data == NULL)
Sean Callanana6223432010-08-20 01:02:30 +0000959 return false;
960
Sean Callanana48fe162010-08-11 03:57:18 +0000961 Error error;
962
Sean Callanan6a925532011-01-13 08:53:35 +0000963 lldb::addr_t mem; // The address of a spare memory area used to hold the persistent variable.
964
Sean Callanana48fe162010-08-11 03:57:18 +0000965 if (dematerialize)
966 {
Sean Callanan6a925532011-01-13 08:53:35 +0000967 if (log)
968 log->Printf("Dematerializing persistent variable with flags 0x%hx", var_sp->m_flags);
969
970 if ((var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) ||
971 (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference))
Sean Callanana48fe162010-08-11 03:57:18 +0000972 {
Sean Callanan6a925532011-01-13 08:53:35 +0000973 // Get the location of the target out of the struct.
974
975 Error read_error;
976 mem = ReadAddressFrom(exe_ctx, addr, read_error);
977
978 if (mem == LLDB_INVALID_ADDRESS)
979 {
980 err.SetErrorStringWithFormat("Couldn't read address of %s from struct: %s", var_sp->GetName().GetCString(), error.AsCString());
981 return false;
982 }
983
984 if (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference &&
985 !var_sp->m_live_sp)
986 {
987 // If the reference comes from the program, then the ClangExpressionVariable's
988 // live variable data hasn't been set up yet. Do this now.
989
Jim Ingham47da8102011-04-22 23:53:53 +0000990 var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope (),
991 var_sp->GetTypeFromUser().GetASTContext(),
992 var_sp->GetTypeFromUser().GetOpaqueQualType(),
993 var_sp->GetName(),
994 mem,
995 eAddressTypeLoad,
996 pvar_byte_size);
Sean Callanan6a925532011-01-13 08:53:35 +0000997 }
998
999 if (!var_sp->m_live_sp)
1000 {
1001 err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", var_sp->GetName().GetCString());
1002 return false;
1003 }
1004
Greg Claytonb3448432011-03-24 21:19:54 +00001005 if (var_sp->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
Sean Callanan6a925532011-01-13 08:53:35 +00001006 {
1007 err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", var_sp->GetName().GetCString());
1008 return false;
1009 }
1010
Sean Callanan97678d12011-01-13 21:23:32 +00001011 if (var_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry ||
1012 var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
Sean Callanan6a925532011-01-13 08:53:35 +00001013 {
1014 mem = var_sp->m_live_sp->GetValue().GetScalar().ULongLong();
1015
1016 if (log)
1017 log->Printf("Dematerializing %s from 0x%llx", var_sp->GetName().GetCString(), (uint64_t)mem);
1018
1019 // Read the contents of the spare memory area
1020
1021 if (log)
1022 log->Printf("Read");
1023
1024 var_sp->ValueUpdated ();
1025 if (exe_ctx.process->ReadMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
1026 {
1027 err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString());
1028 return false;
1029 }
1030
1031 var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsFreezeDry;
1032 }
1033
1034 if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation &&
1035 !(var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget))
1036 {
1037 if (m_keep_result_in_memory)
1038 {
1039 var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget;
1040 }
1041 else
1042 {
1043 Error deallocate_error = exe_ctx.process->DeallocateMemory(mem);
1044
1045 if (!err.Success())
1046 {
1047 err.SetErrorStringWithFormat ("Couldn't deallocate memory for %s: %s", var_sp->GetName().GetCString(), deallocate_error.AsCString());
1048 return false;
1049 }
1050 }
1051 }
1052 }
1053 else
1054 {
1055 err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
Sean Callanana48fe162010-08-11 03:57:18 +00001056 return false;
1057 }
1058 }
1059 else
1060 {
Sean Callanan6a925532011-01-13 08:53:35 +00001061 if (log)
1062 log->Printf("Materializing persistent variable with flags 0x%hx", var_sp->m_flags);
1063
1064 if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation)
Sean Callanana48fe162010-08-11 03:57:18 +00001065 {
Sean Callanan6a925532011-01-13 08:53:35 +00001066 // Allocate a spare memory area to store the persistent variable's contents.
1067
1068 Error allocate_error;
1069
1070 mem = exe_ctx.process->AllocateMemory(pvar_byte_size,
1071 lldb::ePermissionsReadable | lldb::ePermissionsWritable,
1072 allocate_error);
1073
1074 if (mem == LLDB_INVALID_ADDRESS)
1075 {
1076 err.SetErrorStringWithFormat("Couldn't allocate a memory area to store %s: %s", var_sp->GetName().GetCString(), allocate_error.AsCString());
1077 return false;
1078 }
1079
1080 if (log)
1081 log->Printf("Allocated %s (0x%llx) sucessfully", var_sp->GetName().GetCString(), mem);
1082
1083 // Put the location of the spare memory into the live data of the ValueObject.
1084
Jim Ingham47da8102011-04-22 23:53:53 +00001085 var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
1086 var_sp->GetTypeFromUser().GetASTContext(),
1087 var_sp->GetTypeFromUser().GetOpaqueQualType(),
1088 var_sp->GetName(),
1089 mem,
1090 eAddressTypeLoad,
1091 pvar_byte_size);
Sean Callanan6a925532011-01-13 08:53:35 +00001092
1093 // Clear the flag if the variable will never be deallocated.
1094
1095 if (var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
1096 var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsAllocation;
1097
1098 // Write the contents of the variable to the area.
1099
1100 if (exe_ctx.process->WriteMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
1101 {
1102 err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString());
1103 return false;
1104 }
1105 }
1106
1107 if ((var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && var_sp->m_live_sp) ||
1108 var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated)
1109 {
1110 mem = var_sp->m_live_sp->GetValue().GetScalar().ULongLong();
1111
1112 // Now write the location of the area into the struct.
1113
1114 Error write_error;
1115 if (!WriteAddressInto(exe_ctx, addr, mem, write_error))
1116 {
1117 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", var_sp->GetName().GetCString(), write_error.AsCString());
1118 return false;
1119 }
1120
1121 if (log)
1122 log->Printf("Materialized %s into 0x%llx", var_sp->GetName().GetCString(), (uint64_t)mem);
1123 }
1124 else if (!var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference)
1125 {
1126 err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
Sean Callanana48fe162010-08-11 03:57:18 +00001127 return false;
1128 }
1129 }
1130
1131 return true;
1132}
1133
Sean Callananf328c9f2010-07-20 23:31:16 +00001134bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001135ClangExpressionDeclMap::DoMaterializeOneVariable
1136(
1137 bool dematerialize,
1138 ExecutionContext &exe_ctx,
1139 const SymbolContext &sym_ctx,
Sean Callanan6a925532011-01-13 08:53:35 +00001140 ClangExpressionVariableSP &expr_var,
Greg Clayton8de27c72010-10-15 22:48:33 +00001141 lldb::addr_t addr,
1142 Error &err
1143)
Sean Callananf328c9f2010-07-20 23:31:16 +00001144{
Greg Claytone005f2c2010-11-06 01:53:30 +00001145 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callananf328c9f2010-07-20 23:31:16 +00001146
Sean Callanan17c6a052010-10-05 20:18:48 +00001147 if (!exe_ctx.frame || !exe_ctx.process)
Sean Callanancc074622010-09-14 21:59:34 +00001148 return false;
1149
Sean Callanan6a925532011-01-13 08:53:35 +00001150 // Vital information about the value
1151
1152 const ConstString &name(expr_var->GetName());
1153 TypeFromUser type(expr_var->GetTypeFromUser());
1154
Greg Clayton3bc52d02010-11-14 22:13:40 +00001155 Variable *var = FindVariableInScope (*exe_ctx.frame, name, &type);
Sean Callananf328c9f2010-07-20 23:31:16 +00001156
1157 if (!var)
1158 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001159 err.SetErrorStringWithFormat("Couldn't find %s with appropriate type", name.GetCString());
Sean Callananf328c9f2010-07-20 23:31:16 +00001160 return false;
1161 }
1162
Sean Callanan841026f2010-07-23 00:16:21 +00001163 if (log)
Greg Clayton8de27c72010-10-15 22:48:33 +00001164 log->Printf("%s %s with type %p", (dematerialize ? "Dematerializing" : "Materializing"), name.GetCString(), type.GetOpaqueQualType());
Sean Callananf328c9f2010-07-20 23:31:16 +00001165
1166 std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(exe_ctx,
1167 var,
Sean Callananaa301c42010-12-03 01:38:59 +00001168 NULL));
Sean Callananf328c9f2010-07-20 23:31:16 +00001169
1170 if (!location_value.get())
1171 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001172 err.SetErrorStringWithFormat("Couldn't get value for %s", name.GetCString());
Sean Callananf328c9f2010-07-20 23:31:16 +00001173 return false;
1174 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001175
1176 // The size of the type contained in addr
Sean Callananf328c9f2010-07-20 23:31:16 +00001177
Sean Callanan6a925532011-01-13 08:53:35 +00001178 size_t value_bit_size = ClangASTType::GetClangTypeBitWidth(type.GetASTContext(), type.GetOpaqueQualType());
1179 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 +00001180
1181 Value::ValueType value_type = location_value->GetValueType();
1182
1183 switch (value_type)
Sean Callananf328c9f2010-07-20 23:31:16 +00001184 {
Sean Callanan17c6a052010-10-05 20:18:48 +00001185 default:
Sean Callananf328c9f2010-07-20 23:31:16 +00001186 {
Sean Callanan17c6a052010-10-05 20:18:48 +00001187 StreamString ss;
1188
1189 location_value->Dump(&ss);
1190
Greg Clayton8de27c72010-10-15 22:48:33 +00001191 err.SetErrorStringWithFormat("%s has a value of unhandled type: %s", name.GetCString(), ss.GetString().c_str());
Sean Callananf328c9f2010-07-20 23:31:16 +00001192 return false;
1193 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001194 break;
1195 case Value::eValueTypeLoadAddress:
Sean Callananf328c9f2010-07-20 23:31:16 +00001196 {
Sean Callanan6a925532011-01-13 08:53:35 +00001197 if (!dematerialize)
Sean Callanan17c6a052010-10-05 20:18:48 +00001198 {
Sean Callanan6a925532011-01-13 08:53:35 +00001199 lldb::addr_t value_addr = location_value->GetScalar().ULongLong();
1200
1201 Error error;
1202
1203 if (!WriteAddressInto(exe_ctx,
1204 addr,
1205 value_addr,
1206 error))
1207 {
1208 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", name.GetCString(), error.AsCString());
1209 return false;
1210 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001211 }
Sean Callananf328c9f2010-07-20 23:31:16 +00001212 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001213 break;
1214 case Value::eValueTypeScalar:
1215 {
Greg Clayton6916e352010-11-13 03:52:47 +00001216 if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
Sean Callanan17c6a052010-10-05 20:18:48 +00001217 {
1218 StreamString ss;
Sean Callanan17c6a052010-10-05 20:18:48 +00001219 location_value->Dump(&ss);
1220
Greg Clayton8de27c72010-10-15 22:48:33 +00001221 err.SetErrorStringWithFormat("%s is a scalar of unhandled type: %s", name.GetCString(), ss.GetString().c_str());
Sean Callanan17c6a052010-10-05 20:18:48 +00001222 return false;
1223 }
1224
Sean Callanan6a925532011-01-13 08:53:35 +00001225 lldb::addr_t mem; // The address of a spare memory area aused to hold the variable.
1226
Greg Claytonb3448432011-03-24 21:19:54 +00001227 RegisterInfo *register_info = location_value->GetRegisterInfo();
Sean Callanan17c6a052010-10-05 20:18:48 +00001228
1229 if (!register_info)
1230 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001231 err.SetErrorStringWithFormat("Couldn't get the register information for %s", name.GetCString());
Sean Callanan17c6a052010-10-05 20:18:48 +00001232 return false;
1233 }
1234
1235 RegisterContext *register_context = exe_ctx.GetRegisterContext();
1236
1237 if (!register_context)
1238 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001239 err.SetErrorStringWithFormat("Couldn't read register context to read %s from %s", name.GetCString(), register_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001240 return false;
1241 }
1242
1243 uint32_t register_number = register_info->kinds[lldb::eRegisterKindLLDB];
1244 uint32_t register_byte_size = register_info->byte_size;
1245
1246 if (dematerialize)
1247 {
Sean Callanan6a925532011-01-13 08:53:35 +00001248 // Get the location of the spare memory area out of the variable's live data.
1249
1250 if (!expr_var->m_live_sp)
1251 {
1252 err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", name.GetCString());
1253 return false;
1254 }
1255
Greg Claytonb3448432011-03-24 21:19:54 +00001256 if (expr_var->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
Sean Callanan6a925532011-01-13 08:53:35 +00001257 {
1258 err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", name.GetCString());
1259 return false;
1260 }
1261
1262 mem = expr_var->m_live_sp->GetValue().GetScalar().ULongLong();
1263
Sean Callanan17c6a052010-10-05 20:18:48 +00001264 // Moving from addr into a register
1265 //
1266 // Case 1: addr_byte_size and register_byte_size are the same
1267 //
1268 // |AABBCCDD| Address contents
1269 // |AABBCCDD| Register contents
1270 //
1271 // Case 2: addr_byte_size is bigger than register_byte_size
1272 //
1273 // Error! (The register should always be big enough to hold the data)
1274 //
1275 // Case 3: register_byte_size is bigger than addr_byte_size
1276 //
1277 // |AABB| Address contents
1278 // |AABB0000| Register contents [on little-endian hardware]
1279 // |0000AABB| Register contents [on big-endian hardware]
1280
Sean Callanan6a925532011-01-13 08:53:35 +00001281 if (value_byte_size > register_byte_size)
Sean Callanan17c6a052010-10-05 20:18:48 +00001282 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001283 err.SetErrorStringWithFormat("%s is too big to store in %s", name.GetCString(), register_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001284 return false;
1285 }
1286
1287 uint32_t register_offset;
1288
1289 switch (exe_ctx.process->GetByteOrder())
1290 {
1291 default:
Greg Clayton8de27c72010-10-15 22:48:33 +00001292 err.SetErrorStringWithFormat("%s is stored with an unhandled byte order", name.GetCString());
Sean Callanan17c6a052010-10-05 20:18:48 +00001293 return false;
1294 case lldb::eByteOrderLittle:
1295 register_offset = 0;
1296 break;
1297 case lldb::eByteOrderBig:
Sean Callanan6a925532011-01-13 08:53:35 +00001298 register_offset = register_byte_size - value_byte_size;
Sean Callanan17c6a052010-10-05 20:18:48 +00001299 break;
1300 }
1301
1302 DataBufferHeap register_data (register_byte_size, 0);
1303
1304 Error error;
Sean Callanan6a925532011-01-13 08:53:35 +00001305 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 +00001306 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001307 err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", name.GetCString(), error.AsCString());
Sean Callanan17c6a052010-10-05 20:18:48 +00001308 return false;
1309 }
1310
1311 DataExtractor register_extractor (register_data.GetBytes(), register_byte_size, exe_ctx.process->GetByteOrder(), exe_ctx.process->GetAddressByteSize());
1312
1313 if (!register_context->WriteRegisterBytes(register_number, register_extractor, 0))
1314 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001315 err.SetErrorStringWithFormat("Couldn't read %s from %s", name.GetCString(), register_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001316 return false;
1317 }
Sean Callanan6a925532011-01-13 08:53:35 +00001318
1319 // Deallocate the spare area and clear the variable's live data.
1320
1321 Error deallocate_error = exe_ctx.process->DeallocateMemory(mem);
1322
1323 if (!deallocate_error.Success())
1324 {
1325 err.SetErrorStringWithFormat("Couldn't deallocate spare memory area for %s: %s", name.GetCString(), deallocate_error.AsCString());
1326 return false;
1327 }
1328
1329 expr_var->m_live_sp.reset();
Sean Callanan17c6a052010-10-05 20:18:48 +00001330 }
1331 else
1332 {
Sean Callanan6a925532011-01-13 08:53:35 +00001333 // Allocate a spare memory area to place the register's contents into. This memory area will be pointed to by the slot in the
1334 // struct.
1335
1336 Error allocate_error;
1337
1338 mem = exe_ctx.process->AllocateMemory(value_byte_size,
1339 lldb::ePermissionsReadable | lldb::ePermissionsWritable,
1340 allocate_error);
1341
1342 if (mem == LLDB_INVALID_ADDRESS)
1343 {
1344 err.SetErrorStringWithFormat("Couldn't allocate a memory area to store %s: %s", name.GetCString(), allocate_error.AsCString());
1345 return false;
1346 }
1347
1348 // Put the location of the spare memory into the live data of the ValueObject.
1349
Jim Ingham47da8102011-04-22 23:53:53 +00001350 expr_var->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
1351 type.GetASTContext(),
1352 type.GetOpaqueQualType(),
1353 name,
1354 mem,
1355 eAddressTypeLoad,
1356 value_byte_size);
Sean Callanan6a925532011-01-13 08:53:35 +00001357
1358 // Now write the location of the area into the struct.
1359
1360 Error write_error;
1361 if (!WriteAddressInto(exe_ctx, addr, mem, write_error))
1362 {
1363 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", name.GetCString(), write_error.AsCString());
1364 return false;
1365 }
1366
Sean Callanan17c6a052010-10-05 20:18:48 +00001367 // Moving from a register into addr
1368 //
1369 // Case 1: addr_byte_size and register_byte_size are the same
1370 //
1371 // |AABBCCDD| Register contents
1372 // |AABBCCDD| Address contents
1373 //
1374 // Case 2: addr_byte_size is bigger than register_byte_size
1375 //
1376 // Error! (The register should always be big enough to hold the data)
1377 //
1378 // Case 3: register_byte_size is bigger than addr_byte_size
1379 //
1380 // |AABBCCDD| Register contents
1381 // |AABB| Address contents on little-endian hardware
1382 // |CCDD| Address contents on big-endian hardware
1383
Sean Callanan6a925532011-01-13 08:53:35 +00001384 if (value_byte_size > register_byte_size)
Sean Callanan17c6a052010-10-05 20:18:48 +00001385 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001386 err.SetErrorStringWithFormat("%s is too big to store in %s", name.GetCString(), register_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001387 return false;
1388 }
1389
1390 uint32_t register_offset;
1391
1392 switch (exe_ctx.process->GetByteOrder())
1393 {
1394 default:
Greg Clayton8de27c72010-10-15 22:48:33 +00001395 err.SetErrorStringWithFormat("%s is stored with an unhandled byte order", name.GetCString());
Sean Callanan17c6a052010-10-05 20:18:48 +00001396 return false;
1397 case lldb::eByteOrderLittle:
1398 register_offset = 0;
1399 break;
1400 case lldb::eByteOrderBig:
Sean Callanan6a925532011-01-13 08:53:35 +00001401 register_offset = register_byte_size - value_byte_size;
Sean Callanan17c6a052010-10-05 20:18:48 +00001402 break;
1403 }
1404
1405 DataExtractor register_extractor;
1406
1407 if (!register_context->ReadRegisterBytes(register_number, register_extractor))
1408 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001409 err.SetErrorStringWithFormat("Couldn't read %s from %s", name.GetCString(), register_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001410 return false;
1411 }
1412
Sean Callanan6a925532011-01-13 08:53:35 +00001413 const void *register_data = register_extractor.GetData(&register_offset, value_byte_size);
Sean Callanan17c6a052010-10-05 20:18:48 +00001414
1415 if (!register_data)
1416 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001417 err.SetErrorStringWithFormat("Read but couldn't extract data for %s from %s", name.GetCString(), register_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001418 return false;
1419 }
1420
Sean Callanan6a925532011-01-13 08:53:35 +00001421 if (exe_ctx.process->WriteMemory (mem, register_data, value_byte_size, write_error) != value_byte_size)
Sean Callanan17c6a052010-10-05 20:18:48 +00001422 {
Sean Callanan6a925532011-01-13 08:53:35 +00001423 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", write_error.AsCString());
Sean Callanan17c6a052010-10-05 20:18:48 +00001424 return false;
1425 }
1426 }
1427 }
Sean Callananf328c9f2010-07-20 23:31:16 +00001428 }
1429
1430 return true;
Sean Callanan810f22d2010-07-16 00:09:46 +00001431}
1432
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001433bool
1434ClangExpressionDeclMap::DoMaterializeOneRegister
1435(
1436 bool dematerialize,
1437 ExecutionContext &exe_ctx,
1438 RegisterContext &reg_ctx,
Greg Claytonb3448432011-03-24 21:19:54 +00001439 const RegisterInfo &reg_info,
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001440 lldb::addr_t addr,
1441 Error &err
1442)
1443{
1444 uint32_t register_number = reg_info.kinds[lldb::eRegisterKindLLDB];
1445 uint32_t register_byte_size = reg_info.byte_size;
Greg Claytonbdcb6ab2011-01-25 23:55:37 +00001446
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001447 if (dematerialize)
1448 {
1449 DataBufferHeap register_data (register_byte_size, 0);
1450
Greg Claytonbdcb6ab2011-01-25 23:55:37 +00001451 Error read_error;
1452 if (exe_ctx.process->ReadMemory (addr, register_data.GetBytes(), register_byte_size, read_error) != register_byte_size)
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001453 {
Greg Claytonbdcb6ab2011-01-25 23:55:37 +00001454 err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", reg_info.name, read_error.AsCString());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001455 return false;
1456 }
1457
1458 DataExtractor register_extractor (register_data.GetBytes(), register_byte_size, exe_ctx.process->GetByteOrder(), exe_ctx.process->GetAddressByteSize());
1459
1460 if (!reg_ctx.WriteRegisterBytes(register_number, register_extractor, 0))
1461 {
1462 err.SetErrorStringWithFormat("Couldn't read %s", reg_info.name);
1463 return false;
1464 }
1465 }
1466 else
1467 {
1468 DataExtractor register_extractor;
1469
1470 if (!reg_ctx.ReadRegisterBytes(register_number, register_extractor))
1471 {
1472 err.SetErrorStringWithFormat("Couldn't read %s", reg_info.name);
1473 return false;
1474 }
1475
1476 uint32_t register_offset = 0;
1477
1478 const void *register_data = register_extractor.GetData(&register_offset, register_byte_size);
1479
1480 if (!register_data)
1481 {
1482 err.SetErrorStringWithFormat("Read but couldn't extract data for %s", reg_info.name);
1483 return false;
1484 }
1485
1486 Error error;
1487 if (exe_ctx.process->WriteMemory (addr, register_data, register_byte_size, error) != register_byte_size)
1488 {
1489 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", error.AsCString());
1490 return false;
1491 }
1492 }
1493
1494 return true;
1495}
1496
Sean Callanancc074622010-09-14 21:59:34 +00001497Variable *
Greg Clayton8de27c72010-10-15 22:48:33 +00001498ClangExpressionDeclMap::FindVariableInScope
1499(
1500 StackFrame &frame,
1501 const ConstString &name,
1502 TypeFromUser *type
1503)
Sean Callananaa301c42010-12-03 01:38:59 +00001504{
Greg Claytone005f2c2010-11-06 01:53:30 +00001505 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanancc074622010-09-14 21:59:34 +00001506
Sean Callanancc074622010-09-14 21:59:34 +00001507 VariableList *var_list = frame.GetVariableList(true);
1508
Greg Claytonbf8e42b2010-10-14 22:52:14 +00001509 if (!var_list)
1510 return NULL;
1511
Greg Clayton3bc52d02010-11-14 22:13:40 +00001512 lldb::VariableSP var_sp (var_list->FindVariable(name));
1513
1514 const bool append = true;
1515 const uint32_t max_matches = 1;
1516 if (!var_sp)
Sean Callanancc074622010-09-14 21:59:34 +00001517 {
Greg Clayton3bc52d02010-11-14 22:13:40 +00001518 // Look for globals elsewhere in the module for the frame
Sean Callananaa301c42010-12-03 01:38:59 +00001519 ModuleSP module_sp (frame.GetSymbolContext(eSymbolContextModule).module_sp);
Greg Clayton3bc52d02010-11-14 22:13:40 +00001520 if (module_sp)
1521 {
1522 VariableList module_globals;
1523 if (module_sp->FindGlobalVariables (name, append, max_matches, module_globals))
1524 var_sp = module_globals.GetVariableAtIndex (0);
1525 }
1526 }
1527
1528 if (!var_sp)
1529 {
1530 // Look for globals elsewhere in the program (all images)
Sean Callananaa301c42010-12-03 01:38:59 +00001531 TargetSP target_sp (frame.GetSymbolContext(eSymbolContextTarget).target_sp);
Greg Clayton3bc52d02010-11-14 22:13:40 +00001532 if (target_sp)
1533 {
1534 VariableList program_globals;
1535 if (target_sp->GetImages().FindGlobalVariables (name, append, max_matches, program_globals))
1536 var_sp = program_globals.GetVariableAtIndex (0);
1537 }
1538 }
1539
1540 if (var_sp && type)
1541 {
1542 if (type->GetASTContext() == var_sp->GetType()->GetClangAST())
1543 {
Greg Clayton04c9c7b2011-02-16 23:00:21 +00001544 if (!ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType()))
Greg Clayton3bc52d02010-11-14 22:13:40 +00001545 return NULL;
1546 }
1547 else
1548 {
1549 if (log)
1550 log->PutCString("Skipping a candidate variable because of different AST contexts");
Sean Callanancc074622010-09-14 21:59:34 +00001551 return NULL;
Greg Clayton3bc52d02010-11-14 22:13:40 +00001552 }
Sean Callanancc074622010-09-14 21:59:34 +00001553 }
Greg Clayton3bc52d02010-11-14 22:13:40 +00001554
1555 return var_sp.get();
Sean Callanancc074622010-09-14 21:59:34 +00001556}
Sean Callanan336a0002010-07-17 00:43:37 +00001557
Chris Lattner24943d22010-06-08 16:52:24 +00001558// Interface for ClangASTSource
1559void
Greg Claytone5748d82010-11-09 23:46:37 +00001560ClangExpressionDeclMap::GetDecls (NameSearchContext &context, const ConstString &name)
Chris Lattner24943d22010-06-08 16:52:24 +00001561{
Sean Callananaa301c42010-12-03 01:38:59 +00001562 assert (m_struct_vars.get());
1563 assert (m_parser_vars.get());
1564
Greg Claytone005f2c2010-11-06 01:53:30 +00001565 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001566
Sean Callanan810f22d2010-07-16 00:09:46 +00001567 if (log)
Greg Clayton8de27c72010-10-15 22:48:33 +00001568 log->Printf("Hunting for a definition for '%s'", name.GetCString());
Chris Lattner24943d22010-06-08 16:52:24 +00001569
1570 // Back out in all cases where we're not fully initialized
Sean Callananaa301c42010-12-03 01:38:59 +00001571 if (m_parser_vars->m_exe_ctx->frame == NULL)
Chris Lattner24943d22010-06-08 16:52:24 +00001572 return;
Sean Callananee8fc722010-11-19 20:20:02 +00001573
Sean Callananaa301c42010-12-03 01:38:59 +00001574 if (m_parser_vars->m_ignore_lookups)
Sean Callananee8fc722010-11-19 20:20:02 +00001575 {
1576 if (log)
1577 log->Printf("Ignoring a query during an import");
1578 return;
1579 }
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001580
Greg Claytone5748d82010-11-09 23:46:37 +00001581 SymbolContextList sc_list;
Chris Lattner24943d22010-06-08 16:52:24 +00001582
Greg Clayton3bc52d02010-11-14 22:13:40 +00001583 const char *name_unique_cstr = name.GetCString();
1584
1585 if (name_unique_cstr == NULL)
1586 return;
1587
Greg Clayton8de27c72010-10-15 22:48:33 +00001588 // Only look for functions by name out in our symbols if the function
1589 // doesn't start with our phony prefix of '$'
Greg Clayton3bc52d02010-11-14 22:13:40 +00001590 if (name_unique_cstr[0] != '$')
Sean Callanan0fc73582010-07-27 00:55:47 +00001591 {
Sean Callananaa301c42010-12-03 01:38:59 +00001592 Variable *var = FindVariableInScope(*m_parser_vars->m_exe_ctx->frame, name);
Greg Clayton8de27c72010-10-15 22:48:33 +00001593
1594 // If we found a variable in scope, no need to pull up function names
1595 if (var != NULL)
1596 {
1597 AddOneVariable(context, var);
1598 }
1599 else
1600 {
Greg Clayton28d5fcc2011-01-27 06:44:37 +00001601 const bool include_symbols = true;
1602 const bool append = false;
1603 m_parser_vars->m_sym_ctx.FindFunctionsByName (name,
1604 include_symbols,
1605 append,
1606 sc_list);
Greg Clayton8de27c72010-10-15 22:48:33 +00001607
1608 bool found_specific = false;
1609 Symbol *generic_symbol = NULL;
1610 Symbol *non_extern_symbol = NULL;
1611
Greg Claytone5748d82010-11-09 23:46:37 +00001612 for (uint32_t index = 0, num_indices = sc_list.GetSize();
Greg Clayton8de27c72010-10-15 22:48:33 +00001613 index < num_indices;
1614 ++index)
1615 {
1616 SymbolContext sym_ctx;
Greg Claytone5748d82010-11-09 23:46:37 +00001617 sc_list.GetContextAtIndex(index, sym_ctx);
Sean Callanan3cfbd332010-10-06 00:10:07 +00001618
Greg Clayton8de27c72010-10-15 22:48:33 +00001619 if (sym_ctx.function)
1620 {
1621 // TODO only do this if it's a C function; C++ functions may be
1622 // overloaded
1623 if (!found_specific)
1624 AddOneFunction(context, sym_ctx.function, NULL);
1625 found_specific = true;
1626 }
1627 else if (sym_ctx.symbol)
1628 {
1629 if (sym_ctx.symbol->IsExternal())
1630 generic_symbol = sym_ctx.symbol;
1631 else
1632 non_extern_symbol = sym_ctx.symbol;
1633 }
1634 }
1635
Sean Callanan92aa6662010-09-07 21:49:41 +00001636 if (!found_specific)
Greg Clayton8de27c72010-10-15 22:48:33 +00001637 {
1638 if (generic_symbol)
Greg Clayton28d5fcc2011-01-27 06:44:37 +00001639 AddOneFunction (context, NULL, generic_symbol);
Greg Clayton8de27c72010-10-15 22:48:33 +00001640 else if (non_extern_symbol)
Greg Clayton28d5fcc2011-01-27 06:44:37 +00001641 AddOneFunction (context, NULL, non_extern_symbol);
Greg Clayton8de27c72010-10-15 22:48:33 +00001642 }
Greg Clayton6916e352010-11-13 03:52:47 +00001643
Sean Callananaa301c42010-12-03 01:38:59 +00001644 ClangNamespaceDecl namespace_decl (m_parser_vars->m_sym_ctx.FindNamespace(name));
Greg Clayton6916e352010-11-13 03:52:47 +00001645 if (namespace_decl)
1646 {
Greg Clayton9ceed1e2010-11-13 04:18:24 +00001647 clang::NamespaceDecl *clang_namespace_decl = AddNamespace(context, namespace_decl);
1648 if (clang_namespace_decl)
Greg Clayton9ceed1e2010-11-13 04:18:24 +00001649 clang_namespace_decl->setHasExternalLexicalStorage();
Greg Clayton6916e352010-11-13 03:52:47 +00001650 }
Sean Callanan92aa6662010-09-07 21:49:41 +00001651 }
Sean Callanan0fc73582010-07-27 00:55:47 +00001652 }
Greg Clayton8de27c72010-10-15 22:48:33 +00001653 else
Sean Callanan3cfbd332010-10-06 00:10:07 +00001654 {
Greg Clayton57452832010-11-09 04:42:43 +00001655 static ConstString g_lldb_class_name ("$__lldb_class");
1656 if (name == g_lldb_class_name)
1657 {
1658 // Clang is looking for the type of "this"
1659
Sean Callananaa301c42010-12-03 01:38:59 +00001660 VariableList *vars = m_parser_vars->m_exe_ctx->frame->GetVariableList(false);
Greg Clayton57452832010-11-09 04:42:43 +00001661
1662 if (!vars)
1663 return;
1664
1665 lldb::VariableSP this_var = vars->FindVariable(ConstString("this"));
1666
1667 if (!this_var)
1668 return;
1669
1670 Type *this_type = this_var->GetType();
1671
1672 if (!this_type)
1673 return;
1674
Greg Clayton2403b5e2010-11-16 02:10:54 +00001675 if (log)
1676 {
1677 log->PutCString ("Type for \"this\" is: ");
1678 StreamString strm;
1679 this_type->Dump(&strm, true);
1680 log->PutCString (strm.GetData());
1681 }
1682
Greg Clayton04c9c7b2011-02-16 23:00:21 +00001683 TypeFromUser this_user_type(this_type->GetClangFullType(),
Greg Clayton57452832010-11-09 04:42:43 +00001684 this_type->GetClangAST());
1685
Sean Callananaa301c42010-12-03 01:38:59 +00001686 m_struct_vars->m_object_pointer_type = this_user_type;
Greg Clayton57452832010-11-09 04:42:43 +00001687
1688 void *pointer_target_type;
1689
1690 if (!ClangASTContext::IsPointerType(this_user_type.GetOpaqueQualType(),
1691 &pointer_target_type))
1692 return;
1693
1694 TypeFromUser class_user_type(pointer_target_type,
1695 this_type->GetClangAST());
1696
Sean Callanan3aa7da52010-12-13 22:46:15 +00001697 if (log)
1698 {
1699 StreamString type_stream;
1700 class_user_type.DumpTypeCode(&type_stream);
1701 type_stream.Flush();
1702 log->Printf("Adding type for $__lldb_class: %s", type_stream.GetString().c_str());
1703 }
1704
Greg Clayton57452832010-11-09 04:42:43 +00001705 AddOneType(context, class_user_type, true);
1706
1707 return;
1708 }
1709
Sean Callanan3aa7da52010-12-13 22:46:15 +00001710 static ConstString g_lldb_objc_class_name ("$__lldb_objc_class");
1711 if (name == g_lldb_objc_class_name)
1712 {
1713 // Clang is looking for the type of "*self"
1714
1715 VariableList *vars = m_parser_vars->m_exe_ctx->frame->GetVariableList(false);
1716
1717 if (!vars)
1718 return;
1719
1720 lldb::VariableSP self_var = vars->FindVariable(ConstString("self"));
1721
1722 if (!self_var)
1723 return;
1724
1725 Type *self_type = self_var->GetType();
1726
1727 if (!self_type)
1728 return;
1729
Greg Clayton04c9c7b2011-02-16 23:00:21 +00001730 TypeFromUser self_user_type(self_type->GetClangFullType(),
Sean Callanan3aa7da52010-12-13 22:46:15 +00001731 self_type->GetClangAST());
1732
1733 m_struct_vars->m_object_pointer_type = self_user_type;
1734
1735 void *pointer_target_type;
1736
1737 if (!ClangASTContext::IsPointerType(self_user_type.GetOpaqueQualType(),
1738 &pointer_target_type))
1739 return;
1740
1741 TypeFromUser class_user_type(pointer_target_type,
1742 self_type->GetClangAST());
1743
1744 if (log)
1745 {
1746 StreamString type_stream;
1747 class_user_type.DumpTypeCode(&type_stream);
1748 type_stream.Flush();
1749 log->Printf("Adding type for $__lldb_objc_class: %s", type_stream.GetString().c_str());
1750 }
1751
1752 AddOneType(context, class_user_type, false);
1753
1754 return;
1755 }
Greg Clayton427f2902010-12-14 02:59:59 +00001756
1757 ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name));
Greg Clayton8de27c72010-10-15 22:48:33 +00001758
Greg Clayton427f2902010-12-14 02:59:59 +00001759 if (pvar_sp)
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001760 {
Greg Clayton427f2902010-12-14 02:59:59 +00001761 AddOneVariable(context, pvar_sp);
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001762 return;
1763 }
1764
1765 const char *reg_name(&name.GetCString()[1]);
1766
Sean Callananaa301c42010-12-03 01:38:59 +00001767 if (m_parser_vars->m_exe_ctx->GetRegisterContext())
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001768 {
Greg Claytonb3448432011-03-24 21:19:54 +00001769 const RegisterInfo *reg_info(m_parser_vars->m_exe_ctx->GetRegisterContext()->GetRegisterInfoByName(reg_name));
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001770
1771 if (reg_info)
1772 AddOneRegister(context, reg_info);
1773 }
Sean Callanan3cfbd332010-10-06 00:10:07 +00001774 }
1775
Sean Callananaa301c42010-12-03 01:38:59 +00001776 lldb::TypeSP type_sp (m_parser_vars->m_sym_ctx.FindTypeByName (name));
Sean Callananee8fc722010-11-19 20:20:02 +00001777
1778 if (type_sp)
Sean Callanan6df08402010-09-27 23:54:58 +00001779 {
Sean Callananee8fc722010-11-19 20:20:02 +00001780 if (log)
Sean Callanan6df08402010-09-27 23:54:58 +00001781 {
Sean Callananee8fc722010-11-19 20:20:02 +00001782 log->Printf ("Matching type found for \"%s\": ", name.GetCString());
1783 StreamString strm;
1784 type_sp->Dump(&strm, true);
1785 log->PutCString (strm.GetData());
1786 }
Greg Clayton2403b5e2010-11-16 02:10:54 +00001787
Greg Clayton04c9c7b2011-02-16 23:00:21 +00001788 TypeFromUser user_type (type_sp->GetClangFullType(),
Greg Claytonb01000f2011-01-17 03:46:26 +00001789 type_sp->GetClangAST());
Sean Callanan6df08402010-09-27 23:54:58 +00001790
Sean Callananee8fc722010-11-19 20:20:02 +00001791 AddOneType(context, user_type, false);
Sean Callanan6df08402010-09-27 23:54:58 +00001792 }
Sean Callanan336a0002010-07-17 00:43:37 +00001793}
1794
1795Value *
Greg Clayton8de27c72010-10-15 22:48:33 +00001796ClangExpressionDeclMap::GetVariableValue
1797(
1798 ExecutionContext &exe_ctx,
1799 Variable *var,
1800 clang::ASTContext *parser_ast_context,
1801 TypeFromUser *user_type,
1802 TypeFromParser *parser_type
1803)
Chris Lattner24943d22010-06-08 16:52:24 +00001804{
Greg Claytone005f2c2010-11-06 01:53:30 +00001805 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan6184dfe2010-06-23 00:47:48 +00001806
Chris Lattner24943d22010-06-08 16:52:24 +00001807 Type *var_type = var->GetType();
1808
1809 if (!var_type)
1810 {
Sean Callanan810f22d2010-07-16 00:09:46 +00001811 if (log)
1812 log->PutCString("Skipped a definition because it has no type");
Sean Callanan336a0002010-07-17 00:43:37 +00001813 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00001814 }
1815
Greg Clayton04c9c7b2011-02-16 23:00:21 +00001816 clang_type_t var_opaque_type = var_type->GetClangFullType();
Chris Lattner24943d22010-06-08 16:52:24 +00001817
1818 if (!var_opaque_type)
1819 {
Sean Callanan810f22d2010-07-16 00:09:46 +00001820 if (log)
1821 log->PutCString("Skipped a definition because it has no Clang type");
Sean Callanan336a0002010-07-17 00:43:37 +00001822 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00001823 }
1824
Greg Claytonb01000f2011-01-17 03:46:26 +00001825 clang::ASTContext *ast = var_type->GetClangASTContext().getASTContext();
Chris Lattner24943d22010-06-08 16:52:24 +00001826
Greg Claytonb01000f2011-01-17 03:46:26 +00001827 if (!ast)
Chris Lattner24943d22010-06-08 16:52:24 +00001828 {
Sean Callanan810f22d2010-07-16 00:09:46 +00001829 if (log)
1830 log->PutCString("There is no AST context for the current execution context");
Sean Callanan336a0002010-07-17 00:43:37 +00001831 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00001832 }
1833
Sean Callanan336a0002010-07-17 00:43:37 +00001834 DWARFExpression &var_location_expr = var->LocationExpression();
1835
Chris Lattner24943d22010-06-08 16:52:24 +00001836 std::auto_ptr<Value> var_location(new Value);
1837
Greg Clayton178710c2010-09-14 02:20:48 +00001838 lldb::addr_t loclist_base_load_addr = LLDB_INVALID_ADDRESS;
1839
1840 if (var_location_expr.IsLocationList())
1841 {
1842 SymbolContext var_sc;
1843 var->CalculateSymbolContext (&var_sc);
Greg Claytoneea26402010-09-14 23:36:40 +00001844 loclist_base_load_addr = var_sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress (exe_ctx.target);
Greg Clayton178710c2010-09-14 02:20:48 +00001845 }
Chris Lattner24943d22010-06-08 16:52:24 +00001846 Error err;
1847
Greg Claytonbdcb6ab2011-01-25 23:55:37 +00001848 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 +00001849 {
Sean Callanan810f22d2010-07-16 00:09:46 +00001850 if (log)
1851 log->Printf("Error evaluating location: %s", err.AsCString());
Sean Callanan336a0002010-07-17 00:43:37 +00001852 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00001853 }
Greg Claytonb01000f2011-01-17 03:46:26 +00001854
Sean Callanan336a0002010-07-17 00:43:37 +00001855 void *type_to_use;
1856
Sean Callananf328c9f2010-07-20 23:31:16 +00001857 if (parser_ast_context)
1858 {
Greg Claytonb01000f2011-01-17 03:46:26 +00001859 type_to_use = GuardedCopyType(parser_ast_context, ast, var_opaque_type);
Sean Callananf328c9f2010-07-20 23:31:16 +00001860
Sean Callanan4b5eec62010-11-20 02:19:29 +00001861 if (!type_to_use)
1862 {
1863 if (log)
1864 log->Printf("Couldn't copy a variable's type into the parser's AST context");
1865
1866 return NULL;
1867 }
1868
Sean Callananf328c9f2010-07-20 23:31:16 +00001869 if (parser_type)
1870 *parser_type = TypeFromParser(type_to_use, parser_ast_context);
1871 }
Sean Callanan336a0002010-07-17 00:43:37 +00001872 else
1873 type_to_use = var_opaque_type;
Chris Lattner24943d22010-06-08 16:52:24 +00001874
1875 if (var_location.get()->GetContextType() == Value::eContextTypeInvalid)
Greg Clayton6916e352010-11-13 03:52:47 +00001876 var_location.get()->SetContext(Value::eContextTypeClangType, type_to_use);
Chris Lattner24943d22010-06-08 16:52:24 +00001877
1878 if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress)
1879 {
1880 SymbolContext var_sc;
1881 var->CalculateSymbolContext(&var_sc);
Sean Callanan336a0002010-07-17 00:43:37 +00001882
Chris Lattner24943d22010-06-08 16:52:24 +00001883 if (!var_sc.module_sp)
Sean Callanan336a0002010-07-17 00:43:37 +00001884 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00001885
1886 ObjectFile *object_file = var_sc.module_sp->GetObjectFile();
1887
1888 if (!object_file)
Sean Callanan336a0002010-07-17 00:43:37 +00001889 return NULL;
1890
Chris Lattner24943d22010-06-08 16:52:24 +00001891 Address so_addr(var_location->GetScalar().ULongLong(), object_file->GetSectionList());
1892
Sean Callananaa301c42010-12-03 01:38:59 +00001893 lldb::addr_t load_addr = so_addr.GetLoadAddress(exe_ctx.target);
Chris Lattner24943d22010-06-08 16:52:24 +00001894
1895 var_location->GetScalar() = load_addr;
1896 var_location->SetValueType(Value::eValueTypeLoadAddress);
1897 }
1898
Sean Callananf328c9f2010-07-20 23:31:16 +00001899 if (user_type)
Greg Claytonb01000f2011-01-17 03:46:26 +00001900 *user_type = TypeFromUser(var_opaque_type, ast);
Sean Callanan336a0002010-07-17 00:43:37 +00001901
1902 return var_location.release();
1903}
1904
1905void
Greg Claytonb01000f2011-01-17 03:46:26 +00001906ClangExpressionDeclMap::AddOneVariable (NameSearchContext &context, Variable* var)
Sean Callanan336a0002010-07-17 00:43:37 +00001907{
Sean Callananaa301c42010-12-03 01:38:59 +00001908 assert (m_parser_vars.get());
1909
Greg Claytone005f2c2010-11-06 01:53:30 +00001910 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan336a0002010-07-17 00:43:37 +00001911
Sean Callananf328c9f2010-07-20 23:31:16 +00001912 TypeFromUser ut;
1913 TypeFromParser pt;
Sean Callanan336a0002010-07-17 00:43:37 +00001914
Sean Callananaa301c42010-12-03 01:38:59 +00001915 Value *var_location = GetVariableValue (*m_parser_vars->m_exe_ctx,
Greg Clayton8de27c72010-10-15 22:48:33 +00001916 var,
1917 context.GetASTContext(),
1918 &ut,
1919 &pt);
Sean Callanan336a0002010-07-17 00:43:37 +00001920
Sean Callanan4b5eec62010-11-20 02:19:29 +00001921 if (!var_location)
1922 return;
1923
Sean Callanan6a925532011-01-13 08:53:35 +00001924 NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(pt.GetASTContext(), pt.GetOpaqueQualType()));
Greg Clayton8de27c72010-10-15 22:48:33 +00001925 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton427f2902010-12-14 02:59:59 +00001926 ConstString entity_name(decl_name.c_str());
Jim Inghamfa3a16a2011-03-31 00:19:25 +00001927 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
1928 entity_name,
Greg Clayton427f2902010-12-14 02:59:59 +00001929 ut,
1930 m_parser_vars->m_exe_ctx->process->GetByteOrder(),
1931 m_parser_vars->m_exe_ctx->process->GetAddressByteSize()));
1932 assert (entity.get());
1933 entity->EnableParserVars();
1934 entity->m_parser_vars->m_parser_type = pt;
1935 entity->m_parser_vars->m_named_decl = var_decl;
1936 entity->m_parser_vars->m_llvm_value = NULL;
1937 entity->m_parser_vars->m_lldb_value = var_location;
Chris Lattner24943d22010-06-08 16:52:24 +00001938
Sean Callanan810f22d2010-07-16 00:09:46 +00001939 if (log)
Greg Clayton8de27c72010-10-15 22:48:33 +00001940 {
Sean Callanana0744822010-11-01 23:22:47 +00001941 std::string var_decl_print_string;
1942 llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
1943 var_decl->print(var_decl_print_stream);
1944 var_decl_print_stream.flush();
1945
1946 log->Printf("Found variable %s, returned %s", decl_name.c_str(), var_decl_print_string.c_str());
Sean Callanan6e74dbb2011-02-01 23:43:26 +00001947
1948 if (log->GetVerbose())
1949 {
1950 StreamString var_decl_dump_string;
1951 ASTDumper::DumpDecl(var_decl_dump_string, var_decl);
1952 log->Printf("%s\n", var_decl_dump_string.GetData());
1953 }
Greg Clayton8de27c72010-10-15 22:48:33 +00001954 }
Sean Callanan8f0dc342010-06-22 23:46:24 +00001955}
1956
1957void
Sean Callanana48fe162010-08-11 03:57:18 +00001958ClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
Greg Clayton427f2902010-12-14 02:59:59 +00001959 ClangExpressionVariableSP &pvar_sp)
Sean Callanana48fe162010-08-11 03:57:18 +00001960{
Greg Claytone005f2c2010-11-06 01:53:30 +00001961 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan45690fe2010-08-30 22:17:16 +00001962
Greg Clayton427f2902010-12-14 02:59:59 +00001963 TypeFromUser user_type (pvar_sp->GetTypeFromUser());
Sean Callanana48fe162010-08-11 03:57:18 +00001964
Greg Clayton427f2902010-12-14 02:59:59 +00001965 TypeFromParser parser_type (GuardedCopyType(context.GetASTContext(),
1966 user_type.GetASTContext(),
1967 user_type.GetOpaqueQualType()),
1968 context.GetASTContext());
Sean Callanana48fe162010-08-11 03:57:18 +00001969
Sean Callanan6a925532011-01-13 08:53:35 +00001970 NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(parser_type.GetASTContext(), parser_type.GetOpaqueQualType()));
Sean Callanan8c127202010-08-23 23:09:38 +00001971
Greg Clayton427f2902010-12-14 02:59:59 +00001972 pvar_sp->EnableParserVars();
1973 pvar_sp->m_parser_vars->m_parser_type = parser_type;
1974 pvar_sp->m_parser_vars->m_named_decl = var_decl;
1975 pvar_sp->m_parser_vars->m_llvm_value = NULL;
1976 pvar_sp->m_parser_vars->m_lldb_value = NULL;
Sean Callanan45690fe2010-08-30 22:17:16 +00001977
1978 if (log)
Sean Callanana0744822010-11-01 23:22:47 +00001979 {
1980 std::string var_decl_print_string;
1981 llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
1982 var_decl->print(var_decl_print_stream);
1983 var_decl_print_stream.flush();
1984
Greg Clayton427f2902010-12-14 02:59:59 +00001985 log->Printf("Added pvar %s, returned %s", pvar_sp->GetName().GetCString(), var_decl_print_string.c_str());
Sean Callanana0744822010-11-01 23:22:47 +00001986 }
Sean Callanana48fe162010-08-11 03:57:18 +00001987}
1988
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001989void
Greg Clayton427f2902010-12-14 02:59:59 +00001990ClangExpressionDeclMap::AddOneRegister (NameSearchContext &context,
1991 const RegisterInfo *reg_info)
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001992{
1993 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1994
1995 void *ast_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize(context.GetASTContext(),
1996 reg_info->encoding,
1997 reg_info->byte_size * 8);
1998
1999 if (!ast_type)
2000 {
2001 log->Printf("Tried to add a type for %s, but couldn't get one", context.m_decl_name.getAsString().c_str());
2002 return;
2003 }
2004
Greg Clayton427f2902010-12-14 02:59:59 +00002005 TypeFromParser parser_type (ast_type,
2006 context.GetASTContext());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002007
2008 NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
2009
Jim Inghamfa3a16a2011-03-31 00:19:25 +00002010 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope(),
2011 m_parser_vars->m_exe_ctx->process->GetByteOrder(),
Greg Clayton427f2902010-12-14 02:59:59 +00002012 m_parser_vars->m_exe_ctx->process->GetAddressByteSize()));
2013 assert (entity.get());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002014 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton427f2902010-12-14 02:59:59 +00002015 entity->SetName (ConstString (decl_name.c_str()));
2016 entity->SetRegisterInfo (reg_info);
2017 entity->EnableParserVars();
2018 entity->m_parser_vars->m_parser_type = parser_type;
2019 entity->m_parser_vars->m_named_decl = var_decl;
2020 entity->m_parser_vars->m_llvm_value = NULL;
2021 entity->m_parser_vars->m_lldb_value = NULL;
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002022
2023 if (log)
2024 {
2025 std::string var_decl_print_string;
2026 llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
2027 var_decl->print(var_decl_print_stream);
2028 var_decl_print_stream.flush();
2029
2030 log->Printf("Added register %s, returned %s", context.m_decl_name.getAsString().c_str(), var_decl_print_string.c_str());
2031 }
2032}
2033
Greg Clayton6916e352010-11-13 03:52:47 +00002034clang::NamespaceDecl *
2035ClangExpressionDeclMap::AddNamespace (NameSearchContext &context, const ClangNamespaceDecl &namespace_decl)
2036{
2037 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2038
Greg Clayton6916e352010-11-13 03:52:47 +00002039 clang::Decl *copied_decl = ClangASTContext::CopyDecl (context.GetASTContext(),
2040 namespace_decl.GetASTContext(),
2041 namespace_decl.GetNamespaceDecl());
2042
2043 return dyn_cast<clang::NamespaceDecl>(copied_decl);
2044}
2045
Sean Callanana48fe162010-08-11 03:57:18 +00002046void
Sean Callanan8f0dc342010-06-22 23:46:24 +00002047ClangExpressionDeclMap::AddOneFunction(NameSearchContext &context,
Sean Callanan0fc73582010-07-27 00:55:47 +00002048 Function* fun,
2049 Symbol* symbol)
Sean Callanan8f0dc342010-06-22 23:46:24 +00002050{
Sean Callananaa301c42010-12-03 01:38:59 +00002051 assert (m_parser_vars.get());
2052
Greg Claytone005f2c2010-11-06 01:53:30 +00002053 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan8f0dc342010-06-22 23:46:24 +00002054
Sean Callanan0fc73582010-07-27 00:55:47 +00002055 NamedDecl *fun_decl;
Sean Callanan8f0dc342010-06-22 23:46:24 +00002056 std::auto_ptr<Value> fun_location(new Value);
Sean Callanan0fc73582010-07-27 00:55:47 +00002057 const Address *fun_address;
Sean Callanan8f0dc342010-06-22 23:46:24 +00002058
Sean Callanan0fc73582010-07-27 00:55:47 +00002059 // only valid for Functions, not for Symbols
2060 void *fun_opaque_type = NULL;
2061 clang::ASTContext *fun_ast_context = NULL;
2062
2063 if (fun)
2064 {
2065 Type *fun_type = fun->GetType();
2066
2067 if (!fun_type)
2068 {
2069 if (log)
2070 log->PutCString("Skipped a function because it has no type");
2071 return;
2072 }
2073
Greg Clayton04c9c7b2011-02-16 23:00:21 +00002074 fun_opaque_type = fun_type->GetClangFullType();
Sean Callanan0fc73582010-07-27 00:55:47 +00002075
2076 if (!fun_opaque_type)
2077 {
2078 if (log)
2079 log->PutCString("Skipped a function because it has no Clang type");
2080 return;
2081 }
2082
2083 fun_address = &fun->GetAddressRange().GetBaseAddress();
2084
Greg Claytonb01000f2011-01-17 03:46:26 +00002085 fun_ast_context = fun_type->GetClangASTContext().getASTContext();
Sean Callananee8fc722010-11-19 20:20:02 +00002086 void *copied_type = GuardedCopyType(context.GetASTContext(), fun_ast_context, fun_opaque_type);
Sean Callanan0fc73582010-07-27 00:55:47 +00002087
2088 fun_decl = context.AddFunDecl(copied_type);
2089 }
2090 else if (symbol)
2091 {
2092 fun_address = &symbol->GetAddressRangeRef().GetBaseAddress();
2093
2094 fun_decl = context.AddGenericFunDecl();
2095 }
2096 else
2097 {
2098 if (log)
2099 log->PutCString("AddOneFunction called with no function and no symbol");
2100 return;
2101 }
2102
Sean Callananaa301c42010-12-03 01:38:59 +00002103 lldb::addr_t load_addr = fun_address->GetLoadAddress(m_parser_vars->m_exe_ctx->target);
Sean Callanan8f0dc342010-06-22 23:46:24 +00002104 fun_location->SetValueType(Value::eValueTypeLoadAddress);
2105 fun_location->GetScalar() = load_addr;
2106
Jim Inghamfa3a16a2011-03-31 00:19:25 +00002107 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
2108 m_parser_vars->m_exe_ctx->process->GetByteOrder(),
Greg Clayton427f2902010-12-14 02:59:59 +00002109 m_parser_vars->m_exe_ctx->process->GetAddressByteSize()));
2110 assert (entity.get());
Greg Clayton8de27c72010-10-15 22:48:33 +00002111 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton427f2902010-12-14 02:59:59 +00002112 entity->SetName(ConstString(decl_name.c_str()));
2113 entity->SetClangType (fun_opaque_type);
2114 entity->SetClangAST (fun_ast_context);
Sean Callanan8f0dc342010-06-22 23:46:24 +00002115
Greg Clayton427f2902010-12-14 02:59:59 +00002116 entity->EnableParserVars();
2117 entity->m_parser_vars->m_named_decl = fun_decl;
2118 entity->m_parser_vars->m_llvm_value = NULL;
2119 entity->m_parser_vars->m_lldb_value = fun_location.release();
Sean Callanan8c127202010-08-23 23:09:38 +00002120
Sean Callanan810f22d2010-07-16 00:09:46 +00002121 if (log)
Greg Clayton8de27c72010-10-15 22:48:33 +00002122 {
Sean Callanana0744822010-11-01 23:22:47 +00002123 std::string fun_decl_print_string;
2124 llvm::raw_string_ostream fun_decl_print_stream(fun_decl_print_string);
2125 fun_decl->print(fun_decl_print_stream);
2126 fun_decl_print_stream.flush();
2127
2128 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 +00002129 }
Chris Lattner24943d22010-06-08 16:52:24 +00002130}
Sean Callanan93a4b1a2010-08-04 01:02:13 +00002131
2132void
2133ClangExpressionDeclMap::AddOneType(NameSearchContext &context,
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00002134 TypeFromUser &ut,
2135 bool add_method)
Sean Callanan93a4b1a2010-08-04 01:02:13 +00002136{
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00002137 clang::ASTContext *parser_ast_context = context.GetASTContext();
2138 clang::ASTContext *user_ast_context = ut.GetASTContext();
Sean Callanan93a4b1a2010-08-04 01:02:13 +00002139
Sean Callananee8fc722010-11-19 20:20:02 +00002140 void *copied_type = GuardedCopyType(parser_ast_context, user_ast_context, ut.GetOpaqueQualType());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00002141
2142 TypeFromParser parser_type(copied_type, parser_ast_context);
2143
2144 if (add_method && ClangASTContext::IsAggregateType(copied_type))
2145 {
2146 void *args[1];
2147
2148 args[0] = ClangASTContext::GetVoidPtrType(parser_ast_context, false);
2149
2150 void *method_type = ClangASTContext::CreateFunctionType (parser_ast_context,
2151 ClangASTContext::GetBuiltInType_void(parser_ast_context),
2152 args,
2153 1,
2154 false,
2155 ClangASTContext::GetTypeQualifiers(copied_type));
Greg Clayton30449d52010-10-01 02:31:07 +00002156
Greg Clayton1d8173f2010-09-24 05:15:53 +00002157 const bool is_virtual = false;
2158 const bool is_static = false;
2159 const bool is_inline = false;
Greg Clayton30449d52010-10-01 02:31:07 +00002160 const bool is_explicit = false;
2161
Greg Clayton1d8173f2010-09-24 05:15:53 +00002162 ClangASTContext::AddMethodToCXXRecordType (parser_ast_context,
2163 copied_type,
Greg Clayton8de27c72010-10-15 22:48:33 +00002164 "$__lldb_expr",
Greg Clayton1d8173f2010-09-24 05:15:53 +00002165 method_type,
2166 lldb::eAccessPublic,
2167 is_virtual,
2168 is_static,
Greg Clayton30449d52010-10-01 02:31:07 +00002169 is_inline,
2170 is_explicit);
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00002171 }
Sean Callanan93a4b1a2010-08-04 01:02:13 +00002172
2173 context.AddTypeDecl(copied_type);
2174}
Sean Callananee8fc722010-11-19 20:20:02 +00002175
2176void *
2177ClangExpressionDeclMap::GuardedCopyType (ASTContext *dest_context,
2178 ASTContext *source_context,
2179 void *clang_type)
2180{
Sean Callananaa301c42010-12-03 01:38:59 +00002181 assert (m_parser_vars.get());
2182
2183 m_parser_vars->m_ignore_lookups = true;
Sean Callananee8fc722010-11-19 20:20:02 +00002184
2185 void *ret = ClangASTContext::CopyType (dest_context,
2186 source_context,
2187 clang_type);
2188
Sean Callananaa301c42010-12-03 01:38:59 +00002189 m_parser_vars->m_ignore_lookups = false;
Sean Callananee8fc722010-11-19 20:20:02 +00002190
2191 return ret;
2192}