blob: 678c175b22b594bed23037a93ba9aeca8095dafb [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);
Jim Inghamef80aab2011-05-02 18:13:59 +000076 else if (exe_ctx.process)
77 m_parser_vars->m_sym_ctx = SymbolContext(exe_ctx.target->GetSP(), ModuleSP());
Greg Clayton427f2902010-12-14 02:59:59 +000078 if (exe_ctx.target)
79 m_parser_vars->m_persistent_vars = &exe_ctx.target->GetPersistentVariables();
Sean Callananaa301c42010-12-03 01:38:59 +000080}
81
Greg Clayton427f2902010-12-14 02:59:59 +000082void
83ClangExpressionDeclMap::DidParse()
Sean Callananaa301c42010-12-03 01:38:59 +000084{
85 if (m_parser_vars.get())
86 {
Greg Clayton427f2902010-12-14 02:59:59 +000087 for (size_t entity_index = 0, num_entities = m_found_entities.GetSize();
Sean Callananaa301c42010-12-03 01:38:59 +000088 entity_index < num_entities;
89 ++entity_index)
90 {
Greg Clayton427f2902010-12-14 02:59:59 +000091 ClangExpressionVariableSP var_sp(m_found_entities.GetVariableAtIndex(entity_index));
92 if (var_sp &&
93 var_sp->m_parser_vars.get() &&
94 var_sp->m_parser_vars->m_lldb_value)
95 delete var_sp->m_parser_vars->m_lldb_value;
Sean Callananaa301c42010-12-03 01:38:59 +000096
Greg Clayton427f2902010-12-14 02:59:59 +000097 var_sp->DisableParserVars();
Sean Callananaa301c42010-12-03 01:38:59 +000098 }
99
Greg Clayton427f2902010-12-14 02:59:59 +0000100 for (size_t pvar_index = 0, num_pvars = m_parser_vars->m_persistent_vars->GetSize();
Sean Callananaa301c42010-12-03 01:38:59 +0000101 pvar_index < num_pvars;
102 ++pvar_index)
103 {
Greg Clayton427f2902010-12-14 02:59:59 +0000104 ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariableAtIndex(pvar_index));
105 if (pvar_sp)
106 pvar_sp->DisableParserVars();
Sean Callananaa301c42010-12-03 01:38:59 +0000107 }
108
109 DisableParserVars();
Sean Callanan7a60b942010-10-08 01:58:41 +0000110 }
Chris Lattner24943d22010-06-08 16:52:24 +0000111}
112
Sean Callanan8bce6652010-07-13 21:41:46 +0000113// Interface for IRForTarget
114
Greg Clayton8de27c72010-10-15 22:48:33 +0000115const ConstString &
116ClangExpressionDeclMap::GetPersistentResultName ()
Sean Callanan82b74c82010-08-12 01:56:52 +0000117{
Sean Callananaa301c42010-12-03 01:38:59 +0000118 assert (m_struct_vars.get());
119 assert (m_parser_vars.get());
Sean Callananaa301c42010-12-03 01:38:59 +0000120 if (!m_struct_vars->m_result_name)
Greg Clayton427f2902010-12-14 02:59:59 +0000121 {
122 Target *target = m_parser_vars->GetTarget();
123 assert (target);
124 m_struct_vars->m_result_name = target->GetPersistentVariables().GetNextPersistentVariableName();
125 }
Sean Callananaa301c42010-12-03 01:38:59 +0000126 return m_struct_vars->m_result_name;
Sean Callanan82b74c82010-08-12 01:56:52 +0000127}
128
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000129lldb::ClangExpressionVariableSP
130ClangExpressionDeclMap::BuildIntegerVariable (const ConstString &name,
131 lldb_private::TypeFromParser type,
132 const llvm::APInt& value)
133{
134 assert (m_parser_vars.get());
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000135 ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
136 clang::ASTContext *context(exe_ctx->target->GetScratchClangASTContext()->getASTContext());
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000137
138 TypeFromUser user_type(ClangASTContext::CopyType(context,
139 type.GetASTContext(),
140 type.GetOpaqueQualType()),
141 context);
142
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000143 if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx->GetBestExecutionContextScope (),
144 name,
Sean Callanan0e0817d2011-01-04 02:41:41 +0000145 user_type,
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000146 exe_ctx->process->GetByteOrder(),
147 exe_ctx->process->GetAddressByteSize()))
Sean Callanan0e0817d2011-01-04 02:41:41 +0000148 return lldb::ClangExpressionVariableSP();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000149
Sean Callanan0e0817d2011-01-04 02:41:41 +0000150 ClangExpressionVariableSP pvar_sp (m_parser_vars->m_persistent_vars->GetVariable(name));
151
152 if (!pvar_sp)
153 return lldb::ClangExpressionVariableSP();
154
155 uint8_t *pvar_data = pvar_sp->GetValueBytes();
156 if (pvar_data == NULL)
157 return lldb::ClangExpressionVariableSP();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000158
159 uint64_t value64 = value.getLimitedValue();
160
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000161 ByteOrder byte_order = exe_ctx->process->GetByteOrder();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000162
163 size_t num_val_bytes = sizeof(value64);
Sean Callanan0e0817d2011-01-04 02:41:41 +0000164 size_t num_data_bytes = pvar_sp->GetByteSize();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000165
166 size_t num_bytes = num_val_bytes;
167 if (num_bytes > num_data_bytes)
168 num_bytes = num_data_bytes;
169
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000170 for (off_t byte_idx = 0;
171 byte_idx < num_bytes;
172 ++byte_idx)
173 {
174 uint64_t shift = byte_idx * 8;
175 uint64_t mask = 0xffll << shift;
176 uint8_t cur_byte = (uint8_t)((value64 & mask) >> shift);
177
178 switch (byte_order)
179 {
Sean Callanan0e0817d2011-01-04 02:41:41 +0000180 case eByteOrderBig:
181 // High Low
182 // Original: |AABBCCDDEEFFGGHH|
183 // Target: |EEFFGGHH|
184
185 pvar_data[num_data_bytes - (1 + byte_idx)] = cur_byte;
186 break;
187 case eByteOrderLittle:
188 // Target: |HHGGFFEE|
189 pvar_data[byte_idx] = cur_byte;
190 break;
191 default:
192 return lldb::ClangExpressionVariableSP();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000193 }
194 }
Sean Callanan6a925532011-01-13 08:53:35 +0000195
196 pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried;
Sean Callanan0e0817d2011-01-04 02:41:41 +0000197
198 return pvar_sp;
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000199}
200
Sean Callanan8bce6652010-07-13 21:41:46 +0000201bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000202ClangExpressionDeclMap::AddPersistentVariable
203(
204 const clang::NamedDecl *decl,
205 const ConstString &name,
Sean Callanan6a925532011-01-13 08:53:35 +0000206 TypeFromParser parser_type,
207 bool is_result,
208 bool is_lvalue
Greg Clayton8de27c72010-10-15 22:48:33 +0000209)
Sean Callanana48fe162010-08-11 03:57:18 +0000210{
Sean Callananaa301c42010-12-03 01:38:59 +0000211 assert (m_parser_vars.get());
212
Sean Callanan6a925532011-01-13 08:53:35 +0000213 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000214 ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
Sean Callanan6a925532011-01-13 08:53:35 +0000215
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000216 clang::ASTContext *context(exe_ctx->target->GetScratchClangASTContext()->getASTContext());
Sean Callanana48fe162010-08-11 03:57:18 +0000217
Sean Callanana48fe162010-08-11 03:57:18 +0000218 TypeFromUser user_type(ClangASTContext::CopyType(context,
Sean Callanan82b74c82010-08-12 01:56:52 +0000219 parser_type.GetASTContext(),
220 parser_type.GetOpaqueQualType()),
Sean Callanan97678d12011-01-13 21:23:32 +0000221 context);
Sean Callanana48fe162010-08-11 03:57:18 +0000222
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000223 if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx->GetBestExecutionContextScope (),
224 name,
Greg Clayton427f2902010-12-14 02:59:59 +0000225 user_type,
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000226 exe_ctx->process->GetByteOrder(),
227 exe_ctx->process->GetAddressByteSize()))
Sean Callanan8c127202010-08-23 23:09:38 +0000228 return false;
229
Greg Clayton427f2902010-12-14 02:59:59 +0000230 ClangExpressionVariableSP var_sp (m_parser_vars->m_persistent_vars->GetVariable(name));
Sean Callanan8c127202010-08-23 23:09:38 +0000231
Greg Clayton427f2902010-12-14 02:59:59 +0000232 if (!var_sp)
Sean Callanan8c127202010-08-23 23:09:38 +0000233 return false;
234
Sean Callanan6a925532011-01-13 08:53:35 +0000235 if (is_result)
236 var_sp->m_flags |= ClangExpressionVariable::EVNeedsFreezeDry;
237 else
238 var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget; // explicitly-declared persistent variables should persist
239
240 if (is_lvalue)
241 {
242 var_sp->m_flags |= ClangExpressionVariable::EVIsProgramReference;
243 }
244 else
245 {
246 var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
247 var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
248 }
249
250 if (log)
251 log->Printf("Created persistent variable with flags 0x%hx", var_sp->m_flags);
252
Greg Clayton427f2902010-12-14 02:59:59 +0000253 var_sp->EnableParserVars();
Sean Callanan8c127202010-08-23 23:09:38 +0000254
Greg Clayton427f2902010-12-14 02:59:59 +0000255 var_sp->m_parser_vars->m_named_decl = decl;
256 var_sp->m_parser_vars->m_parser_type = parser_type;
Sean Callanan8c127202010-08-23 23:09:38 +0000257
258 return true;
Sean Callanana48fe162010-08-11 03:57:18 +0000259}
260
261bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000262ClangExpressionDeclMap::AddValueToStruct
263(
264 const clang::NamedDecl *decl,
265 const ConstString &name,
266 llvm::Value *value,
267 size_t size,
268 off_t alignment
269)
Sean Callanan8bce6652010-07-13 21:41:46 +0000270{
Sean Callananaa301c42010-12-03 01:38:59 +0000271 assert (m_struct_vars.get());
272 assert (m_parser_vars.get());
273
Greg Claytone005f2c2010-11-06 01:53:30 +0000274 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan45690fe2010-08-30 22:17:16 +0000275
Sean Callananaa301c42010-12-03 01:38:59 +0000276 m_struct_vars->m_struct_laid_out = false;
Sean Callanan8bce6652010-07-13 21:41:46 +0000277
Sean Callanan8c127202010-08-23 23:09:38 +0000278 if (m_struct_members.GetVariable(decl))
279 return true;
Sean Callanan8bce6652010-07-13 21:41:46 +0000280
Greg Clayton427f2902010-12-14 02:59:59 +0000281 ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl));
Sean Callanan8bce6652010-07-13 21:41:46 +0000282
Greg Clayton427f2902010-12-14 02:59:59 +0000283 if (!var_sp)
284 var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl);
Sean Callanan8bce6652010-07-13 21:41:46 +0000285
Greg Clayton427f2902010-12-14 02:59:59 +0000286 if (!var_sp)
Sean Callanan8c127202010-08-23 23:09:38 +0000287 return false;
288
Sean Callanan45690fe2010-08-30 22:17:16 +0000289 if (log)
290 log->Printf("Adding value for decl %p [%s - %s] to the structure",
291 decl,
Greg Clayton8de27c72010-10-15 22:48:33 +0000292 name.GetCString(),
Greg Clayton427f2902010-12-14 02:59:59 +0000293 var_sp->GetName().GetCString());
Sean Callanan45690fe2010-08-30 22:17:16 +0000294
Sean Callanan8c127202010-08-23 23:09:38 +0000295 // We know entity->m_parser_vars is valid because we used a parser variable
296 // to find it
Greg Clayton427f2902010-12-14 02:59:59 +0000297 var_sp->m_parser_vars->m_llvm_value = value;
Sean Callanan8c127202010-08-23 23:09:38 +0000298
Greg Clayton427f2902010-12-14 02:59:59 +0000299 var_sp->EnableJITVars();
300 var_sp->m_jit_vars->m_alignment = alignment;
301 var_sp->m_jit_vars->m_size = size;
Sean Callanan8c127202010-08-23 23:09:38 +0000302
Greg Clayton427f2902010-12-14 02:59:59 +0000303 m_struct_members.AddVariable(var_sp);
Sean Callanan8bce6652010-07-13 21:41:46 +0000304
305 return true;
306}
307
308bool
309ClangExpressionDeclMap::DoStructLayout ()
310{
Sean Callananaa301c42010-12-03 01:38:59 +0000311 assert (m_struct_vars.get());
312
313 if (m_struct_vars->m_struct_laid_out)
Sean Callanan8bce6652010-07-13 21:41:46 +0000314 return true;
315
Sean Callanan8bce6652010-07-13 21:41:46 +0000316 off_t cursor = 0;
317
Sean Callananaa301c42010-12-03 01:38:59 +0000318 m_struct_vars->m_struct_alignment = 0;
319 m_struct_vars->m_struct_size = 0;
Sean Callanan8bce6652010-07-13 21:41:46 +0000320
Greg Clayton427f2902010-12-14 02:59:59 +0000321 for (size_t member_index = 0, num_members = m_struct_members.GetSize();
Sean Callanan8c127202010-08-23 23:09:38 +0000322 member_index < num_members;
323 ++member_index)
Sean Callanan8bce6652010-07-13 21:41:46 +0000324 {
Greg Clayton427f2902010-12-14 02:59:59 +0000325 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
326 if (!member_sp)
327 return false;
328
329 if (!member_sp->m_jit_vars.get())
Sean Callanan8c127202010-08-23 23:09:38 +0000330 return false;
Sean Callanan8bce6652010-07-13 21:41:46 +0000331
Sean Callanan8c127202010-08-23 23:09:38 +0000332 if (member_index == 0)
Greg Clayton427f2902010-12-14 02:59:59 +0000333 m_struct_vars->m_struct_alignment = member_sp->m_jit_vars->m_alignment;
Sean Callanan8c127202010-08-23 23:09:38 +0000334
Greg Clayton427f2902010-12-14 02:59:59 +0000335 if (cursor % member_sp->m_jit_vars->m_alignment)
336 cursor += (member_sp->m_jit_vars->m_alignment - (cursor % member_sp->m_jit_vars->m_alignment));
Sean Callanan8c127202010-08-23 23:09:38 +0000337
Greg Clayton427f2902010-12-14 02:59:59 +0000338 member_sp->m_jit_vars->m_offset = cursor;
339 cursor += member_sp->m_jit_vars->m_size;
Sean Callanan8bce6652010-07-13 21:41:46 +0000340 }
341
Sean Callananaa301c42010-12-03 01:38:59 +0000342 m_struct_vars->m_struct_size = cursor;
Sean Callanan8bce6652010-07-13 21:41:46 +0000343
Sean Callananaa301c42010-12-03 01:38:59 +0000344 m_struct_vars->m_struct_laid_out = true;
Sean Callanan8bce6652010-07-13 21:41:46 +0000345 return true;
346}
347
Greg Clayton8de27c72010-10-15 22:48:33 +0000348bool ClangExpressionDeclMap::GetStructInfo
349(
350 uint32_t &num_elements,
351 size_t &size,
352 off_t &alignment
353)
Sean Callanan8bce6652010-07-13 21:41:46 +0000354{
Sean Callananaa301c42010-12-03 01:38:59 +0000355 assert (m_struct_vars.get());
356
357 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan8bce6652010-07-13 21:41:46 +0000358 return false;
359
Greg Clayton427f2902010-12-14 02:59:59 +0000360 num_elements = m_struct_members.GetSize();
Sean Callananaa301c42010-12-03 01:38:59 +0000361 size = m_struct_vars->m_struct_size;
362 alignment = m_struct_vars->m_struct_alignment;
Sean Callanan8bce6652010-07-13 21:41:46 +0000363
364 return true;
365}
366
367bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000368ClangExpressionDeclMap::GetStructElement
369(
370 const clang::NamedDecl *&decl,
371 llvm::Value *&value,
372 off_t &offset,
373 ConstString &name,
374 uint32_t index
375)
Sean Callanan8bce6652010-07-13 21:41:46 +0000376{
Sean Callananaa301c42010-12-03 01:38:59 +0000377 assert (m_struct_vars.get());
378
379 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan8bce6652010-07-13 21:41:46 +0000380 return false;
381
Greg Clayton427f2902010-12-14 02:59:59 +0000382 if (index >= m_struct_members.GetSize())
Sean Callanan8bce6652010-07-13 21:41:46 +0000383 return false;
384
Greg Clayton427f2902010-12-14 02:59:59 +0000385 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(index));
Sean Callanan8bce6652010-07-13 21:41:46 +0000386
Greg Clayton427f2902010-12-14 02:59:59 +0000387 if (!member_sp ||
388 !member_sp->m_parser_vars.get() ||
389 !member_sp->m_jit_vars.get())
Sean Callanan8c127202010-08-23 23:09:38 +0000390 return false;
391
Greg Clayton427f2902010-12-14 02:59:59 +0000392 decl = member_sp->m_parser_vars->m_named_decl;
393 value = member_sp->m_parser_vars->m_llvm_value;
394 offset = member_sp->m_jit_vars->m_offset;
395 name = member_sp->GetName();
Sean Callanan8c127202010-08-23 23:09:38 +0000396
Sean Callanan8bce6652010-07-13 21:41:46 +0000397 return true;
398}
399
Sean Callanan02fbafa2010-07-27 21:39:39 +0000400bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000401ClangExpressionDeclMap::GetFunctionInfo
402(
403 const clang::NamedDecl *decl,
404 llvm::Value**& value,
405 uint64_t &ptr
406)
Sean Callananba992c52010-07-27 02:07:53 +0000407{
Greg Clayton427f2902010-12-14 02:59:59 +0000408 ClangExpressionVariableSP entity_sp(m_found_entities.GetVariable(decl));
Sean Callanan8c127202010-08-23 23:09:38 +0000409
Greg Clayton427f2902010-12-14 02:59:59 +0000410 if (!entity_sp)
Sean Callanan8c127202010-08-23 23:09:38 +0000411 return false;
Sean Callananba992c52010-07-27 02:07:53 +0000412
Sean Callanan8c127202010-08-23 23:09:38 +0000413 // We know m_parser_vars is valid since we searched for the variable by
414 // its NamedDecl
Sean Callananba992c52010-07-27 02:07:53 +0000415
Greg Clayton427f2902010-12-14 02:59:59 +0000416 value = &entity_sp->m_parser_vars->m_llvm_value;
417 ptr = entity_sp->m_parser_vars->m_lldb_value->GetScalar().ULongLong();
Sean Callanan8c127202010-08-23 23:09:38 +0000418
419 return true;
Sean Callananba992c52010-07-27 02:07:53 +0000420}
421
Sean Callananf5857a02010-07-31 01:32:05 +0000422bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000423ClangExpressionDeclMap::GetFunctionAddress
424(
425 const ConstString &name,
426 uint64_t &ptr
427)
Sean Callananf5857a02010-07-31 01:32:05 +0000428{
Sean Callananaa301c42010-12-03 01:38:59 +0000429 assert (m_parser_vars.get());
430
Sean Callananf5857a02010-07-31 01:32:05 +0000431 // Back out in all cases where we're not fully initialized
Jim Ingham78b9ee82010-12-07 01:56:02 +0000432 if (m_parser_vars->m_exe_ctx->target == NULL)
433 return false;
434 if (!m_parser_vars->m_sym_ctx.target_sp)
Sean Callananf5857a02010-07-31 01:32:05 +0000435 return false;
436
Greg Claytone5748d82010-11-09 23:46:37 +0000437 SymbolContextList sc_list;
Greg Clayton28d5fcc2011-01-27 06:44:37 +0000438 const bool include_symbols = true;
439 const bool append = false;
440 m_parser_vars->m_sym_ctx.FindFunctionsByName(name, include_symbols, append, sc_list);
Sean Callananf5857a02010-07-31 01:32:05 +0000441
Greg Claytone5748d82010-11-09 23:46:37 +0000442 if (!sc_list.GetSize())
Sean Callananf5857a02010-07-31 01:32:05 +0000443 return false;
444
445 SymbolContext sym_ctx;
Greg Claytone5748d82010-11-09 23:46:37 +0000446 sc_list.GetContextAtIndex(0, sym_ctx);
Sean Callananf5857a02010-07-31 01:32:05 +0000447
448 const Address *fun_address;
449
450 if (sym_ctx.function)
451 fun_address = &sym_ctx.function->GetAddressRange().GetBaseAddress();
452 else if (sym_ctx.symbol)
453 fun_address = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress();
454 else
455 return false;
456
Sean Callananaa301c42010-12-03 01:38:59 +0000457 ptr = fun_address->GetLoadAddress (m_parser_vars->m_exe_ctx->target);
Sean Callananf5857a02010-07-31 01:32:05 +0000458
459 return true;
460}
461
Sean Callananc7674af2011-01-17 23:42:46 +0000462bool
463ClangExpressionDeclMap::GetSymbolAddress
464(
465 const ConstString &name,
466 uint64_t &ptr
467)
468{
469 assert (m_parser_vars.get());
470
471 // Back out in all cases where we're not fully initialized
472 if (m_parser_vars->m_exe_ctx->target == NULL)
473 return false;
474
475 SymbolContextList sc_list;
476
Greg Claytonb3448432011-03-24 21:19:54 +0000477 m_parser_vars->m_exe_ctx->target->GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeAny, sc_list);
Sean Callananc7674af2011-01-17 23:42:46 +0000478
479 if (!sc_list.GetSize())
480 return false;
481
482 SymbolContext sym_ctx;
483 sc_list.GetContextAtIndex(0, sym_ctx);
484
485 const Address *sym_address = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress();
486
487 ptr = sym_address->GetLoadAddress (m_parser_vars->m_exe_ctx->target);
488
489 return true;
490}
491
Sean Callanan810f22d2010-07-16 00:09:46 +0000492// Interface for CommandObjectExpression
Sean Callananf328c9f2010-07-20 23:31:16 +0000493
494bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000495ClangExpressionDeclMap::Materialize
496(
Sean Callananaa301c42010-12-03 01:38:59 +0000497 ExecutionContext &exe_ctx,
Greg Clayton8de27c72010-10-15 22:48:33 +0000498 lldb::addr_t &struct_address,
499 Error &err
500)
Sean Callananf328c9f2010-07-20 23:31:16 +0000501{
Sean Callananaa301c42010-12-03 01:38:59 +0000502 EnableMaterialVars();
503
504 m_material_vars->m_process = exe_ctx.process;
505
Sean Callanan6a925532011-01-13 08:53:35 +0000506 bool result = DoMaterialize(false /* dematerialize */, exe_ctx, NULL, err);
Sean Callananf328c9f2010-07-20 23:31:16 +0000507
508 if (result)
Sean Callananaa301c42010-12-03 01:38:59 +0000509 struct_address = m_material_vars->m_materialized_location;
Sean Callananf328c9f2010-07-20 23:31:16 +0000510
511 return result;
512}
513
514bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000515ClangExpressionDeclMap::GetObjectPointer
516(
517 lldb::addr_t &object_ptr,
Sean Callanan3aa7da52010-12-13 22:46:15 +0000518 ConstString &object_name,
Sean Callananaa301c42010-12-03 01:38:59 +0000519 ExecutionContext &exe_ctx,
Sean Callanan047923c2010-12-14 00:42:36 +0000520 Error &err,
521 bool suppress_type_check
Greg Clayton8de27c72010-10-15 22:48:33 +0000522)
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000523{
Sean Callananaa301c42010-12-03 01:38:59 +0000524 assert (m_struct_vars.get());
525
526 if (!exe_ctx.frame || !exe_ctx.target || !exe_ctx.process)
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000527 {
528 err.SetErrorString("Couldn't load 'this' because the context is incomplete");
529 return false;
530 }
531
Sean Callananaa301c42010-12-03 01:38:59 +0000532 if (!m_struct_vars->m_object_pointer_type.GetOpaqueQualType())
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000533 {
534 err.SetErrorString("Couldn't load 'this' because its type is unknown");
535 return false;
536 }
537
Sean Callanan047923c2010-12-14 00:42:36 +0000538 Variable *object_ptr_var = FindVariableInScope (*exe_ctx.frame,
539 object_name,
540 (suppress_type_check ? NULL : &m_struct_vars->m_object_pointer_type));
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000541
542 if (!object_ptr_var)
543 {
Sean Callanan3aa7da52010-12-13 22:46:15 +0000544 err.SetErrorStringWithFormat("Couldn't find '%s' with appropriate type in scope", object_name.GetCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000545 return false;
546 }
547
Sean Callananaa301c42010-12-03 01:38:59 +0000548 std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(exe_ctx,
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000549 object_ptr_var,
Sean Callananaa301c42010-12-03 01:38:59 +0000550 NULL));
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000551
552 if (!location_value.get())
553 {
Sean Callanan3aa7da52010-12-13 22:46:15 +0000554 err.SetErrorStringWithFormat("Couldn't get the location for '%s'", object_name.GetCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000555 return false;
556 }
557
Sean Callanan50339fe2011-03-04 00:23:47 +0000558 switch (location_value->GetValueType())
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000559 {
Sean Callanan50339fe2011-03-04 00:23:47 +0000560 default:
Sean Callanan3aa7da52010-12-13 22:46:15 +0000561 err.SetErrorStringWithFormat("'%s' is not in memory; LLDB must be extended to handle registers", object_name.GetCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000562 return false;
Sean Callanan50339fe2011-03-04 00:23:47 +0000563 case Value::eValueTypeLoadAddress:
564 {
565 lldb::addr_t value_addr = location_value->GetScalar().ULongLong();
566 uint32_t address_byte_size = exe_ctx.target->GetArchitecture().GetAddressByteSize();
567 lldb::ByteOrder address_byte_order = exe_ctx.process->GetByteOrder();
568
569 if (ClangASTType::GetClangTypeBitWidth(m_struct_vars->m_object_pointer_type.GetASTContext(),
570 m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) != address_byte_size * 8)
571 {
572 err.SetErrorStringWithFormat("'%s' is not of an expected pointer size", object_name.GetCString());
573 return false;
574 }
575
576 DataBufferHeap data;
577 data.SetByteSize(address_byte_size);
578 Error read_error;
579
580 if (exe_ctx.process->ReadMemory (value_addr, data.GetBytes(), address_byte_size, read_error) != address_byte_size)
581 {
582 err.SetErrorStringWithFormat("Coldn't read '%s' from the target: %s", object_name.GetCString(), read_error.AsCString());
583 return false;
584 }
585
586 DataExtractor extractor(data.GetBytes(), data.GetByteSize(), address_byte_order, address_byte_size);
587
588 uint32_t offset = 0;
589
590 object_ptr = extractor.GetPointer(&offset);
591
592 return true;
593 }
594 case Value::eValueTypeScalar:
595 {
596 if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
597 {
598 StreamString ss;
599 location_value->Dump(&ss);
600
601 err.SetErrorStringWithFormat("%s is a scalar of unhandled type: %s", object_name.GetCString(), ss.GetString().c_str());
602 return false;
603 }
604
Greg Claytonb3448432011-03-24 21:19:54 +0000605 RegisterInfo *register_info = location_value->GetRegisterInfo();
Sean Callanan50339fe2011-03-04 00:23:47 +0000606
607 if (!register_info)
608 {
609 err.SetErrorStringWithFormat("Couldn't get the register information for %s", object_name.GetCString());
610 return false;
611 }
612
613 RegisterContext *register_context = exe_ctx.GetRegisterContext();
614
615 if (!register_context)
616 {
617 err.SetErrorStringWithFormat("Couldn't read register context to read %s from %s", object_name.GetCString(), register_info->name);
618 return false;
619 }
620
621 uint32_t register_number = register_info->kinds[lldb::eRegisterKindLLDB];
622
623 object_ptr = register_context->ReadRegisterAsUnsigned(register_number, 0x0);
624
625 return true;
626 }
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000627 }
628}
629
630bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000631ClangExpressionDeclMap::Dematerialize
632(
Sean Callananaa301c42010-12-03 01:38:59 +0000633 ExecutionContext &exe_ctx,
Greg Clayton427f2902010-12-14 02:59:59 +0000634 ClangExpressionVariableSP &result_sp,
Greg Clayton8de27c72010-10-15 22:48:33 +0000635 Error &err
636)
Sean Callananf328c9f2010-07-20 23:31:16 +0000637{
Greg Clayton427f2902010-12-14 02:59:59 +0000638 return DoMaterialize(true, exe_ctx, &result_sp, err);
Sean Callananaa301c42010-12-03 01:38:59 +0000639
640 DidDematerialize();
641}
642
643void
644ClangExpressionDeclMap::DidDematerialize()
645{
646 if (m_material_vars.get())
647 {
648 if (m_material_vars->m_materialized_location)
649 {
650 //#define SINGLE_STEP_EXPRESSIONS
651
652#ifndef SINGLE_STEP_EXPRESSIONS
653 m_material_vars->m_process->DeallocateMemory(m_material_vars->m_materialized_location);
654#endif
655 m_material_vars->m_materialized_location = 0;
656 }
657
658 DisableMaterialVars();
659 }
Sean Callananf328c9f2010-07-20 23:31:16 +0000660}
661
Sean Callanan32824aa2010-07-23 22:19:18 +0000662bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000663ClangExpressionDeclMap::DumpMaterializedStruct
664(
Sean Callananaa301c42010-12-03 01:38:59 +0000665 ExecutionContext &exe_ctx,
Greg Clayton8de27c72010-10-15 22:48:33 +0000666 Stream &s,
667 Error &err
668)
Sean Callanan32824aa2010-07-23 22:19:18 +0000669{
Sean Callananaa301c42010-12-03 01:38:59 +0000670 assert (m_struct_vars.get());
671 assert (m_material_vars.get());
672
673 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan32824aa2010-07-23 22:19:18 +0000674 {
675 err.SetErrorString("Structure hasn't been laid out yet");
676 return false;
677 }
678
Sean Callananaa301c42010-12-03 01:38:59 +0000679 if (!exe_ctx.process)
Sean Callanan32824aa2010-07-23 22:19:18 +0000680 {
681 err.SetErrorString("Couldn't find the process");
682 return false;
683 }
684
Sean Callananaa301c42010-12-03 01:38:59 +0000685 if (!exe_ctx.target)
Sean Callanan32824aa2010-07-23 22:19:18 +0000686 {
687 err.SetErrorString("Couldn't find the target");
688 return false;
689 }
690
Sean Callanan33711022010-12-07 10:00:20 +0000691 if (!m_material_vars->m_materialized_location)
692 {
693 err.SetErrorString("No materialized location");
694 return false;
695 }
696
Sean Callananaa301c42010-12-03 01:38:59 +0000697 lldb::DataBufferSP data(new DataBufferHeap(m_struct_vars->m_struct_size, 0));
Sean Callanan32824aa2010-07-23 22:19:18 +0000698
699 Error error;
Sean Callananaa301c42010-12-03 01:38:59 +0000700 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 +0000701 {
702 err.SetErrorStringWithFormat ("Couldn't read struct from the target: %s", error.AsCString());
703 return false;
704 }
705
Sean Callananaa301c42010-12-03 01:38:59 +0000706 DataExtractor extractor(data, exe_ctx.process->GetByteOrder(), exe_ctx.target->GetArchitecture().GetAddressByteSize());
Sean Callanan32824aa2010-07-23 22:19:18 +0000707
Greg Clayton427f2902010-12-14 02:59:59 +0000708 for (size_t member_idx = 0, num_members = m_struct_members.GetSize();
709 member_idx < num_members;
710 ++member_idx)
Sean Callanan32824aa2010-07-23 22:19:18 +0000711 {
Greg Clayton427f2902010-12-14 02:59:59 +0000712 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_idx));
Sean Callanan32824aa2010-07-23 22:19:18 +0000713
Greg Clayton427f2902010-12-14 02:59:59 +0000714 if (!member_sp)
715 return false;
716
717 s.Printf("[%s]\n", member_sp->GetName().GetCString());
Sean Callanan8c127202010-08-23 23:09:38 +0000718
Greg Clayton427f2902010-12-14 02:59:59 +0000719 if (!member_sp->m_jit_vars.get())
Sean Callanan8c127202010-08-23 23:09:38 +0000720 return false;
721
Greg Clayton427f2902010-12-14 02:59:59 +0000722 extractor.Dump (&s, // stream
723 member_sp->m_jit_vars->m_offset, // offset
724 lldb::eFormatBytesWithASCII, // format
725 1, // byte size of individual entries
726 member_sp->m_jit_vars->m_size, // number of entries
727 16, // entries per line
728 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, // address to print
729 0, // bit size (bitfields only; 0 means ignore)
730 0); // bit alignment (bitfields only; 0 means ignore)
Sean Callanan32824aa2010-07-23 22:19:18 +0000731
732 s.PutChar('\n');
733 }
734
735 return true;
736}
737
Sean Callananf328c9f2010-07-20 23:31:16 +0000738bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000739ClangExpressionDeclMap::DoMaterialize
740(
741 bool dematerialize,
Sean Callananaa301c42010-12-03 01:38:59 +0000742 ExecutionContext &exe_ctx,
Greg Clayton427f2902010-12-14 02:59:59 +0000743 lldb::ClangExpressionVariableSP *result_sp_ptr,
Greg Clayton8de27c72010-10-15 22:48:33 +0000744 Error &err
745)
Sean Callanan810f22d2010-07-16 00:09:46 +0000746{
Greg Clayton427f2902010-12-14 02:59:59 +0000747 if (result_sp_ptr)
748 result_sp_ptr->reset();
749
Sean Callananaa301c42010-12-03 01:38:59 +0000750 assert (m_struct_vars.get());
751
Greg Claytone005f2c2010-11-06 01:53:30 +0000752 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan82b74c82010-08-12 01:56:52 +0000753
Sean Callananaa301c42010-12-03 01:38:59 +0000754 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan810f22d2010-07-16 00:09:46 +0000755 {
756 err.SetErrorString("Structure hasn't been laid out yet");
757 return LLDB_INVALID_ADDRESS;
758 }
759
Sean Callananaa301c42010-12-03 01:38:59 +0000760 if (!exe_ctx.frame)
Sean Callanan45839272010-07-24 01:37:44 +0000761 {
762 err.SetErrorString("Received null execution frame");
763 return LLDB_INVALID_ADDRESS;
764 }
765
Greg Clayton427f2902010-12-14 02:59:59 +0000766 ClangPersistentVariables &persistent_vars = exe_ctx.target->GetPersistentVariables();
Sean Callananaa301c42010-12-03 01:38:59 +0000767
768 if (!m_struct_vars->m_struct_size)
Sean Callanane8a59a82010-09-13 21:34:21 +0000769 {
770 if (log)
771 log->PutCString("Not bothering to allocate a struct because no arguments are needed");
772
Sean Callananaa301c42010-12-03 01:38:59 +0000773 m_material_vars->m_allocated_area = NULL;
Sean Callanane8a59a82010-09-13 21:34:21 +0000774
775 return true;
776 }
777
Sean Callananaa301c42010-12-03 01:38:59 +0000778 const SymbolContext &sym_ctx(exe_ctx.frame->GetSymbolContext(lldb::eSymbolContextEverything));
Sean Callanan810f22d2010-07-16 00:09:46 +0000779
Sean Callananf328c9f2010-07-20 23:31:16 +0000780 if (!dematerialize)
Sean Callanan810f22d2010-07-16 00:09:46 +0000781 {
Sean Callananaa301c42010-12-03 01:38:59 +0000782 if (m_material_vars->m_materialized_location)
Sean Callananf328c9f2010-07-20 23:31:16 +0000783 {
Sean Callananaa301c42010-12-03 01:38:59 +0000784 exe_ctx.process->DeallocateMemory(m_material_vars->m_materialized_location);
785 m_material_vars->m_materialized_location = 0;
Sean Callananf328c9f2010-07-20 23:31:16 +0000786 }
787
Sean Callanan7a60b942010-10-08 01:58:41 +0000788 if (log)
789 log->PutCString("Allocating memory for materialized argument struct");
790
Sean Callananaa301c42010-12-03 01:38:59 +0000791 lldb::addr_t mem = exe_ctx.process->AllocateMemory(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size,
792 lldb::ePermissionsReadable | lldb::ePermissionsWritable,
793 err);
Sean Callananf328c9f2010-07-20 23:31:16 +0000794
795 if (mem == LLDB_INVALID_ADDRESS)
796 return false;
797
Sean Callananaa301c42010-12-03 01:38:59 +0000798 m_material_vars->m_allocated_area = mem;
Sean Callanan810f22d2010-07-16 00:09:46 +0000799 }
800
Sean Callananaa301c42010-12-03 01:38:59 +0000801 m_material_vars->m_materialized_location = m_material_vars->m_allocated_area;
Sean Callananf328c9f2010-07-20 23:31:16 +0000802
Sean Callananaa301c42010-12-03 01:38:59 +0000803 if (m_material_vars->m_materialized_location % m_struct_vars->m_struct_alignment)
804 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 +0000805
Greg Clayton427f2902010-12-14 02:59:59 +0000806 for (uint64_t member_index = 0, num_members = m_struct_members.GetSize();
Sean Callanan8c127202010-08-23 23:09:38 +0000807 member_index < num_members;
808 ++member_index)
Sean Callanan810f22d2010-07-16 00:09:46 +0000809 {
Greg Clayton427f2902010-12-14 02:59:59 +0000810 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
Sean Callanan810f22d2010-07-16 00:09:46 +0000811
Greg Claytona875b642011-01-09 21:07:35 +0000812 if (m_found_entities.ContainsVariable (member_sp))
Sean Callanan8c127202010-08-23 23:09:38 +0000813 {
Greg Claytona875b642011-01-09 21:07:35 +0000814 RegisterInfo *reg_info = member_sp->GetRegisterInfo ();
Greg Clayton427f2902010-12-14 02:59:59 +0000815 if (reg_info)
Sean Callanan1ddd9fe2010-11-30 00:27:43 +0000816 {
817 // This is a register variable
818
Sean Callananaa301c42010-12-03 01:38:59 +0000819 RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
Sean Callanan1ddd9fe2010-11-30 00:27:43 +0000820
821 if (!reg_ctx)
822 return false;
823
Greg Clayton427f2902010-12-14 02:59:59 +0000824 if (!DoMaterializeOneRegister (dematerialize,
825 exe_ctx,
826 *reg_ctx,
827 *reg_info,
828 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
829 err))
Sean Callanan1ddd9fe2010-11-30 00:27:43 +0000830 return false;
831 }
832 else
833 {
Greg Clayton427f2902010-12-14 02:59:59 +0000834 if (!member_sp->m_jit_vars.get())
Sean Callanan1ddd9fe2010-11-30 00:27:43 +0000835 return false;
836
Greg Clayton427f2902010-12-14 02:59:59 +0000837 if (!DoMaterializeOneVariable (dematerialize,
838 exe_ctx,
Sean Callanan6a925532011-01-13 08:53:35 +0000839 sym_ctx,
840 member_sp,
Greg Clayton427f2902010-12-14 02:59:59 +0000841 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
842 err))
Sean Callanan1ddd9fe2010-11-30 00:27:43 +0000843 return false;
844 }
Sean Callanan8c127202010-08-23 23:09:38 +0000845 }
Sean Callanan8c127202010-08-23 23:09:38 +0000846 else
847 {
Greg Claytona875b642011-01-09 21:07:35 +0000848 // No need to look for presistent variables if the name doesn't start
849 // with with a '$' character...
850 if (member_sp->GetName().AsCString ("!")[0] == '$' && persistent_vars.ContainsVariable(member_sp))
851 {
Sean Callanan6a925532011-01-13 08:53:35 +0000852
Greg Claytona875b642011-01-09 21:07:35 +0000853 if (member_sp->GetName() == m_struct_vars->m_result_name)
854 {
Greg Claytona875b642011-01-09 21:07:35 +0000855 if (log)
856 log->PutCString("Found result member in the struct");
Sean Callanan6a925532011-01-13 08:53:35 +0000857
Greg Claytona875b642011-01-09 21:07:35 +0000858 if (result_sp_ptr)
859 *result_sp_ptr = member_sp;
Sean Callanan6a925532011-01-13 08:53:35 +0000860
Greg Claytona875b642011-01-09 21:07:35 +0000861 }
862
863 if (!DoMaterializeOnePersistentVariable (dematerialize,
Sean Callanan6a925532011-01-13 08:53:35 +0000864 exe_ctx,
Greg Claytona875b642011-01-09 21:07:35 +0000865 member_sp,
866 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
867 err))
868 return false;
869 }
870 else
871 {
872 err.SetErrorStringWithFormat("Unexpected variable %s", member_sp->GetName().GetCString());
873 return false;
874 }
Sean Callanan8c127202010-08-23 23:09:38 +0000875 }
Sean Callanan810f22d2010-07-16 00:09:46 +0000876 }
877
Sean Callananf328c9f2010-07-20 23:31:16 +0000878 return true;
879}
880
Sean Callanan6a925532011-01-13 08:53:35 +0000881static bool WriteAddressInto
882(
883 ExecutionContext &exe_ctx,
884 lldb::addr_t target,
885 lldb::addr_t address,
886 Error &err
887)
888{
889 size_t pointer_byte_size = exe_ctx.process->GetAddressByteSize();
890
891 StreamString str (0 | Stream::eBinary,
892 pointer_byte_size,
893 exe_ctx.process->GetByteOrder());
894
895 switch (pointer_byte_size)
896 {
897 default:
898 assert(!"Unhandled byte size");
899 case 4:
900 {
901 uint32_t address32 = address & 0xffffffffll;
Greg Claytoncd548032011-02-01 01:31:41 +0000902 str.PutRawBytes(&address32, sizeof(address32), endian::InlHostByteOrder(), eByteOrderInvalid);
Sean Callanan6a925532011-01-13 08:53:35 +0000903 }
904 break;
905 case 8:
906 {
907 uint64_t address64 = address;
Greg Claytoncd548032011-02-01 01:31:41 +0000908 str.PutRawBytes(&address64, sizeof(address64), endian::InlHostByteOrder(), eByteOrderInvalid);
Sean Callanan6a925532011-01-13 08:53:35 +0000909 }
910 break;
911 }
912
913 return (exe_ctx.process->WriteMemory (target, str.GetData(), pointer_byte_size, err) == pointer_byte_size);
914}
915
916static lldb::addr_t ReadAddressFrom
917(
918 ExecutionContext &exe_ctx,
919 lldb::addr_t source,
920 Error &err
921)
922{
923 size_t pointer_byte_size = exe_ctx.process->GetAddressByteSize();
924
925 DataBufferHeap *buf = new DataBufferHeap(pointer_byte_size, 0);
926 DataBufferSP buf_sp(buf);
927
928 if (exe_ctx.process->ReadMemory (source, buf->GetBytes(), pointer_byte_size, err) != pointer_byte_size)
929 return LLDB_INVALID_ADDRESS;
930
931 DataExtractor extractor (buf_sp, exe_ctx.process->GetByteOrder(), exe_ctx.process->GetAddressByteSize());
932
933 uint32_t offset = 0;
934
935 return (lldb::addr_t)extractor.GetPointer(&offset);
936}
937
Sean Callanana48fe162010-08-11 03:57:18 +0000938bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000939ClangExpressionDeclMap::DoMaterializeOnePersistentVariable
940(
941 bool dematerialize,
942 ExecutionContext &exe_ctx,
Greg Clayton427f2902010-12-14 02:59:59 +0000943 ClangExpressionVariableSP &var_sp,
Greg Clayton8de27c72010-10-15 22:48:33 +0000944 lldb::addr_t addr,
945 Error &err
946)
Sean Callananaa301c42010-12-03 01:38:59 +0000947{
Sean Callanan6a925532011-01-13 08:53:35 +0000948 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
949
Greg Clayton427f2902010-12-14 02:59:59 +0000950 if (!var_sp)
Sean Callanana48fe162010-08-11 03:57:18 +0000951 {
Greg Clayton427f2902010-12-14 02:59:59 +0000952 err.SetErrorString("Invalid persistent variable");
Sean Callanana48fe162010-08-11 03:57:18 +0000953 return LLDB_INVALID_ADDRESS;
954 }
955
Greg Clayton427f2902010-12-14 02:59:59 +0000956 const size_t pvar_byte_size = var_sp->GetByteSize();
Sean Callanana6223432010-08-20 01:02:30 +0000957
Greg Clayton427f2902010-12-14 02:59:59 +0000958 uint8_t *pvar_data = var_sp->GetValueBytes();
959 if (pvar_data == NULL)
Sean Callanana6223432010-08-20 01:02:30 +0000960 return false;
961
Sean Callanana48fe162010-08-11 03:57:18 +0000962 Error error;
963
Sean Callanan6a925532011-01-13 08:53:35 +0000964 lldb::addr_t mem; // The address of a spare memory area used to hold the persistent variable.
965
Sean Callanana48fe162010-08-11 03:57:18 +0000966 if (dematerialize)
967 {
Sean Callanan6a925532011-01-13 08:53:35 +0000968 if (log)
969 log->Printf("Dematerializing persistent variable with flags 0x%hx", var_sp->m_flags);
970
971 if ((var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) ||
972 (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference))
Sean Callanana48fe162010-08-11 03:57:18 +0000973 {
Sean Callanan6a925532011-01-13 08:53:35 +0000974 // Get the location of the target out of the struct.
975
976 Error read_error;
977 mem = ReadAddressFrom(exe_ctx, addr, read_error);
978
979 if (mem == LLDB_INVALID_ADDRESS)
980 {
981 err.SetErrorStringWithFormat("Couldn't read address of %s from struct: %s", var_sp->GetName().GetCString(), error.AsCString());
982 return false;
983 }
984
985 if (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference &&
986 !var_sp->m_live_sp)
987 {
988 // If the reference comes from the program, then the ClangExpressionVariable's
989 // live variable data hasn't been set up yet. Do this now.
990
Jim Ingham47da8102011-04-22 23:53:53 +0000991 var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope (),
992 var_sp->GetTypeFromUser().GetASTContext(),
993 var_sp->GetTypeFromUser().GetOpaqueQualType(),
994 var_sp->GetName(),
995 mem,
996 eAddressTypeLoad,
997 pvar_byte_size);
Sean Callanan6a925532011-01-13 08:53:35 +0000998 }
999
1000 if (!var_sp->m_live_sp)
1001 {
1002 err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", var_sp->GetName().GetCString());
1003 return false;
1004 }
1005
Greg Claytonb3448432011-03-24 21:19:54 +00001006 if (var_sp->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
Sean Callanan6a925532011-01-13 08:53:35 +00001007 {
1008 err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", var_sp->GetName().GetCString());
1009 return false;
1010 }
1011
Sean Callanan97678d12011-01-13 21:23:32 +00001012 if (var_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry ||
1013 var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
Sean Callanan6a925532011-01-13 08:53:35 +00001014 {
1015 mem = var_sp->m_live_sp->GetValue().GetScalar().ULongLong();
1016
1017 if (log)
1018 log->Printf("Dematerializing %s from 0x%llx", var_sp->GetName().GetCString(), (uint64_t)mem);
1019
1020 // Read the contents of the spare memory area
1021
1022 if (log)
1023 log->Printf("Read");
1024
1025 var_sp->ValueUpdated ();
1026 if (exe_ctx.process->ReadMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
1027 {
1028 err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString());
1029 return false;
1030 }
1031
1032 var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsFreezeDry;
1033 }
1034
1035 if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation &&
1036 !(var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget))
1037 {
1038 if (m_keep_result_in_memory)
1039 {
1040 var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget;
1041 }
1042 else
1043 {
1044 Error deallocate_error = exe_ctx.process->DeallocateMemory(mem);
1045
1046 if (!err.Success())
1047 {
1048 err.SetErrorStringWithFormat ("Couldn't deallocate memory for %s: %s", var_sp->GetName().GetCString(), deallocate_error.AsCString());
1049 return false;
1050 }
1051 }
1052 }
1053 }
1054 else
1055 {
1056 err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
Sean Callanana48fe162010-08-11 03:57:18 +00001057 return false;
1058 }
1059 }
1060 else
1061 {
Sean Callanan6a925532011-01-13 08:53:35 +00001062 if (log)
1063 log->Printf("Materializing persistent variable with flags 0x%hx", var_sp->m_flags);
1064
1065 if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation)
Sean Callanana48fe162010-08-11 03:57:18 +00001066 {
Sean Callanan6a925532011-01-13 08:53:35 +00001067 // Allocate a spare memory area to store the persistent variable's contents.
1068
1069 Error allocate_error;
1070
1071 mem = exe_ctx.process->AllocateMemory(pvar_byte_size,
1072 lldb::ePermissionsReadable | lldb::ePermissionsWritable,
1073 allocate_error);
1074
1075 if (mem == LLDB_INVALID_ADDRESS)
1076 {
1077 err.SetErrorStringWithFormat("Couldn't allocate a memory area to store %s: %s", var_sp->GetName().GetCString(), allocate_error.AsCString());
1078 return false;
1079 }
1080
1081 if (log)
1082 log->Printf("Allocated %s (0x%llx) sucessfully", var_sp->GetName().GetCString(), mem);
1083
1084 // Put the location of the spare memory into the live data of the ValueObject.
1085
Jim Ingham47da8102011-04-22 23:53:53 +00001086 var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
1087 var_sp->GetTypeFromUser().GetASTContext(),
1088 var_sp->GetTypeFromUser().GetOpaqueQualType(),
1089 var_sp->GetName(),
1090 mem,
1091 eAddressTypeLoad,
1092 pvar_byte_size);
Sean Callanan6a925532011-01-13 08:53:35 +00001093
1094 // Clear the flag if the variable will never be deallocated.
1095
1096 if (var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
1097 var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsAllocation;
1098
1099 // Write the contents of the variable to the area.
1100
1101 if (exe_ctx.process->WriteMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
1102 {
1103 err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString());
1104 return false;
1105 }
1106 }
1107
1108 if ((var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && var_sp->m_live_sp) ||
1109 var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated)
1110 {
1111 mem = var_sp->m_live_sp->GetValue().GetScalar().ULongLong();
1112
1113 // Now write the location of the area into the struct.
1114
1115 Error write_error;
1116 if (!WriteAddressInto(exe_ctx, addr, mem, write_error))
1117 {
1118 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", var_sp->GetName().GetCString(), write_error.AsCString());
1119 return false;
1120 }
1121
1122 if (log)
1123 log->Printf("Materialized %s into 0x%llx", var_sp->GetName().GetCString(), (uint64_t)mem);
1124 }
1125 else if (!var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference)
1126 {
1127 err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
Sean Callanana48fe162010-08-11 03:57:18 +00001128 return false;
1129 }
1130 }
1131
1132 return true;
1133}
1134
Sean Callananf328c9f2010-07-20 23:31:16 +00001135bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001136ClangExpressionDeclMap::DoMaterializeOneVariable
1137(
1138 bool dematerialize,
1139 ExecutionContext &exe_ctx,
1140 const SymbolContext &sym_ctx,
Sean Callanan6a925532011-01-13 08:53:35 +00001141 ClangExpressionVariableSP &expr_var,
Greg Clayton8de27c72010-10-15 22:48:33 +00001142 lldb::addr_t addr,
1143 Error &err
1144)
Sean Callananf328c9f2010-07-20 23:31:16 +00001145{
Greg Claytone005f2c2010-11-06 01:53:30 +00001146 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callananf328c9f2010-07-20 23:31:16 +00001147
Sean Callanan17c6a052010-10-05 20:18:48 +00001148 if (!exe_ctx.frame || !exe_ctx.process)
Sean Callanancc074622010-09-14 21:59:34 +00001149 return false;
1150
Sean Callanan6a925532011-01-13 08:53:35 +00001151 // Vital information about the value
1152
1153 const ConstString &name(expr_var->GetName());
1154 TypeFromUser type(expr_var->GetTypeFromUser());
1155
Greg Clayton3bc52d02010-11-14 22:13:40 +00001156 Variable *var = FindVariableInScope (*exe_ctx.frame, name, &type);
Sean Callananf328c9f2010-07-20 23:31:16 +00001157
1158 if (!var)
1159 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001160 err.SetErrorStringWithFormat("Couldn't find %s with appropriate type", name.GetCString());
Sean Callananf328c9f2010-07-20 23:31:16 +00001161 return false;
1162 }
1163
Sean Callanan841026f2010-07-23 00:16:21 +00001164 if (log)
Greg Clayton8de27c72010-10-15 22:48:33 +00001165 log->Printf("%s %s with type %p", (dematerialize ? "Dematerializing" : "Materializing"), name.GetCString(), type.GetOpaqueQualType());
Sean Callananf328c9f2010-07-20 23:31:16 +00001166
1167 std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(exe_ctx,
1168 var,
Sean Callananaa301c42010-12-03 01:38:59 +00001169 NULL));
Sean Callananf328c9f2010-07-20 23:31:16 +00001170
1171 if (!location_value.get())
1172 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001173 err.SetErrorStringWithFormat("Couldn't get value for %s", name.GetCString());
Sean Callananf328c9f2010-07-20 23:31:16 +00001174 return false;
1175 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001176
1177 // The size of the type contained in addr
Sean Callananf328c9f2010-07-20 23:31:16 +00001178
Sean Callanan6a925532011-01-13 08:53:35 +00001179 size_t value_bit_size = ClangASTType::GetClangTypeBitWidth(type.GetASTContext(), type.GetOpaqueQualType());
1180 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 +00001181
1182 Value::ValueType value_type = location_value->GetValueType();
1183
1184 switch (value_type)
Sean Callananf328c9f2010-07-20 23:31:16 +00001185 {
Sean Callanan17c6a052010-10-05 20:18:48 +00001186 default:
Sean Callananf328c9f2010-07-20 23:31:16 +00001187 {
Sean Callanan17c6a052010-10-05 20:18:48 +00001188 StreamString ss;
1189
1190 location_value->Dump(&ss);
1191
Greg Clayton8de27c72010-10-15 22:48:33 +00001192 err.SetErrorStringWithFormat("%s has a value of unhandled type: %s", name.GetCString(), ss.GetString().c_str());
Sean Callananf328c9f2010-07-20 23:31:16 +00001193 return false;
1194 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001195 break;
1196 case Value::eValueTypeLoadAddress:
Sean Callananf328c9f2010-07-20 23:31:16 +00001197 {
Sean Callanan6a925532011-01-13 08:53:35 +00001198 if (!dematerialize)
Sean Callanan17c6a052010-10-05 20:18:48 +00001199 {
Sean Callanan6a925532011-01-13 08:53:35 +00001200 lldb::addr_t value_addr = location_value->GetScalar().ULongLong();
1201
1202 Error error;
1203
1204 if (!WriteAddressInto(exe_ctx,
1205 addr,
1206 value_addr,
1207 error))
1208 {
1209 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", name.GetCString(), error.AsCString());
1210 return false;
1211 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001212 }
Sean Callananf328c9f2010-07-20 23:31:16 +00001213 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001214 break;
1215 case Value::eValueTypeScalar:
1216 {
Greg Clayton6916e352010-11-13 03:52:47 +00001217 if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
Sean Callanan17c6a052010-10-05 20:18:48 +00001218 {
1219 StreamString ss;
Sean Callanan17c6a052010-10-05 20:18:48 +00001220 location_value->Dump(&ss);
1221
Greg Clayton8de27c72010-10-15 22:48:33 +00001222 err.SetErrorStringWithFormat("%s is a scalar of unhandled type: %s", name.GetCString(), ss.GetString().c_str());
Sean Callanan17c6a052010-10-05 20:18:48 +00001223 return false;
1224 }
1225
Sean Callanan6a925532011-01-13 08:53:35 +00001226 lldb::addr_t mem; // The address of a spare memory area aused to hold the variable.
1227
Greg Claytonb3448432011-03-24 21:19:54 +00001228 RegisterInfo *register_info = location_value->GetRegisterInfo();
Sean Callanan17c6a052010-10-05 20:18:48 +00001229
1230 if (!register_info)
1231 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001232 err.SetErrorStringWithFormat("Couldn't get the register information for %s", name.GetCString());
Sean Callanan17c6a052010-10-05 20:18:48 +00001233 return false;
1234 }
1235
1236 RegisterContext *register_context = exe_ctx.GetRegisterContext();
1237
1238 if (!register_context)
1239 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001240 err.SetErrorStringWithFormat("Couldn't read register context to read %s from %s", name.GetCString(), register_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001241 return false;
1242 }
1243
1244 uint32_t register_number = register_info->kinds[lldb::eRegisterKindLLDB];
1245 uint32_t register_byte_size = register_info->byte_size;
1246
1247 if (dematerialize)
1248 {
Sean Callanan6a925532011-01-13 08:53:35 +00001249 // Get the location of the spare memory area out of the variable's live data.
1250
1251 if (!expr_var->m_live_sp)
1252 {
1253 err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", name.GetCString());
1254 return false;
1255 }
1256
Greg Claytonb3448432011-03-24 21:19:54 +00001257 if (expr_var->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
Sean Callanan6a925532011-01-13 08:53:35 +00001258 {
1259 err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", name.GetCString());
1260 return false;
1261 }
1262
1263 mem = expr_var->m_live_sp->GetValue().GetScalar().ULongLong();
1264
Sean Callanan17c6a052010-10-05 20:18:48 +00001265 // Moving from addr into a register
1266 //
1267 // Case 1: addr_byte_size and register_byte_size are the same
1268 //
1269 // |AABBCCDD| Address contents
1270 // |AABBCCDD| Register contents
1271 //
1272 // Case 2: addr_byte_size is bigger than register_byte_size
1273 //
1274 // Error! (The register should always be big enough to hold the data)
1275 //
1276 // Case 3: register_byte_size is bigger than addr_byte_size
1277 //
1278 // |AABB| Address contents
1279 // |AABB0000| Register contents [on little-endian hardware]
1280 // |0000AABB| Register contents [on big-endian hardware]
1281
Sean Callanan6a925532011-01-13 08:53:35 +00001282 if (value_byte_size > register_byte_size)
Sean Callanan17c6a052010-10-05 20:18:48 +00001283 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001284 err.SetErrorStringWithFormat("%s is too big to store in %s", name.GetCString(), register_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001285 return false;
1286 }
1287
1288 uint32_t register_offset;
1289
1290 switch (exe_ctx.process->GetByteOrder())
1291 {
1292 default:
Greg Clayton8de27c72010-10-15 22:48:33 +00001293 err.SetErrorStringWithFormat("%s is stored with an unhandled byte order", name.GetCString());
Sean Callanan17c6a052010-10-05 20:18:48 +00001294 return false;
1295 case lldb::eByteOrderLittle:
1296 register_offset = 0;
1297 break;
1298 case lldb::eByteOrderBig:
Sean Callanan6a925532011-01-13 08:53:35 +00001299 register_offset = register_byte_size - value_byte_size;
Sean Callanan17c6a052010-10-05 20:18:48 +00001300 break;
1301 }
1302
1303 DataBufferHeap register_data (register_byte_size, 0);
1304
1305 Error error;
Sean Callanan6a925532011-01-13 08:53:35 +00001306 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 +00001307 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001308 err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", name.GetCString(), error.AsCString());
Sean Callanan17c6a052010-10-05 20:18:48 +00001309 return false;
1310 }
1311
1312 DataExtractor register_extractor (register_data.GetBytes(), register_byte_size, exe_ctx.process->GetByteOrder(), exe_ctx.process->GetAddressByteSize());
1313
1314 if (!register_context->WriteRegisterBytes(register_number, register_extractor, 0))
1315 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001316 err.SetErrorStringWithFormat("Couldn't read %s from %s", name.GetCString(), register_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001317 return false;
1318 }
Sean Callanan6a925532011-01-13 08:53:35 +00001319
1320 // Deallocate the spare area and clear the variable's live data.
1321
1322 Error deallocate_error = exe_ctx.process->DeallocateMemory(mem);
1323
1324 if (!deallocate_error.Success())
1325 {
1326 err.SetErrorStringWithFormat("Couldn't deallocate spare memory area for %s: %s", name.GetCString(), deallocate_error.AsCString());
1327 return false;
1328 }
1329
1330 expr_var->m_live_sp.reset();
Sean Callanan17c6a052010-10-05 20:18:48 +00001331 }
1332 else
1333 {
Sean Callanan6a925532011-01-13 08:53:35 +00001334 // Allocate a spare memory area to place the register's contents into. This memory area will be pointed to by the slot in the
1335 // struct.
1336
1337 Error allocate_error;
1338
1339 mem = exe_ctx.process->AllocateMemory(value_byte_size,
1340 lldb::ePermissionsReadable | lldb::ePermissionsWritable,
1341 allocate_error);
1342
1343 if (mem == LLDB_INVALID_ADDRESS)
1344 {
1345 err.SetErrorStringWithFormat("Couldn't allocate a memory area to store %s: %s", name.GetCString(), allocate_error.AsCString());
1346 return false;
1347 }
1348
1349 // Put the location of the spare memory into the live data of the ValueObject.
1350
Jim Ingham47da8102011-04-22 23:53:53 +00001351 expr_var->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
1352 type.GetASTContext(),
1353 type.GetOpaqueQualType(),
1354 name,
1355 mem,
1356 eAddressTypeLoad,
1357 value_byte_size);
Sean Callanan6a925532011-01-13 08:53:35 +00001358
1359 // Now write the location of the area into the struct.
1360
1361 Error write_error;
1362 if (!WriteAddressInto(exe_ctx, addr, mem, write_error))
1363 {
1364 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", name.GetCString(), write_error.AsCString());
1365 return false;
1366 }
1367
Sean Callanan17c6a052010-10-05 20:18:48 +00001368 // Moving from a register into addr
1369 //
1370 // Case 1: addr_byte_size and register_byte_size are the same
1371 //
1372 // |AABBCCDD| Register contents
1373 // |AABBCCDD| Address contents
1374 //
1375 // Case 2: addr_byte_size is bigger than register_byte_size
1376 //
1377 // Error! (The register should always be big enough to hold the data)
1378 //
1379 // Case 3: register_byte_size is bigger than addr_byte_size
1380 //
1381 // |AABBCCDD| Register contents
1382 // |AABB| Address contents on little-endian hardware
1383 // |CCDD| Address contents on big-endian hardware
1384
Sean Callanan6a925532011-01-13 08:53:35 +00001385 if (value_byte_size > register_byte_size)
Sean Callanan17c6a052010-10-05 20:18:48 +00001386 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001387 err.SetErrorStringWithFormat("%s is too big to store in %s", name.GetCString(), register_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001388 return false;
1389 }
1390
1391 uint32_t register_offset;
1392
1393 switch (exe_ctx.process->GetByteOrder())
1394 {
1395 default:
Greg Clayton8de27c72010-10-15 22:48:33 +00001396 err.SetErrorStringWithFormat("%s is stored with an unhandled byte order", name.GetCString());
Sean Callanan17c6a052010-10-05 20:18:48 +00001397 return false;
1398 case lldb::eByteOrderLittle:
1399 register_offset = 0;
1400 break;
1401 case lldb::eByteOrderBig:
Sean Callanan6a925532011-01-13 08:53:35 +00001402 register_offset = register_byte_size - value_byte_size;
Sean Callanan17c6a052010-10-05 20:18:48 +00001403 break;
1404 }
1405
1406 DataExtractor register_extractor;
1407
1408 if (!register_context->ReadRegisterBytes(register_number, register_extractor))
1409 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001410 err.SetErrorStringWithFormat("Couldn't read %s from %s", name.GetCString(), register_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001411 return false;
1412 }
1413
Sean Callanan6a925532011-01-13 08:53:35 +00001414 const void *register_data = register_extractor.GetData(&register_offset, value_byte_size);
Sean Callanan17c6a052010-10-05 20:18:48 +00001415
1416 if (!register_data)
1417 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001418 err.SetErrorStringWithFormat("Read but couldn't extract data for %s from %s", name.GetCString(), register_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001419 return false;
1420 }
1421
Sean Callanan6a925532011-01-13 08:53:35 +00001422 if (exe_ctx.process->WriteMemory (mem, register_data, value_byte_size, write_error) != value_byte_size)
Sean Callanan17c6a052010-10-05 20:18:48 +00001423 {
Sean Callanan6a925532011-01-13 08:53:35 +00001424 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", write_error.AsCString());
Sean Callanan17c6a052010-10-05 20:18:48 +00001425 return false;
1426 }
1427 }
1428 }
Sean Callananf328c9f2010-07-20 23:31:16 +00001429 }
1430
1431 return true;
Sean Callanan810f22d2010-07-16 00:09:46 +00001432}
1433
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001434bool
1435ClangExpressionDeclMap::DoMaterializeOneRegister
1436(
1437 bool dematerialize,
1438 ExecutionContext &exe_ctx,
1439 RegisterContext &reg_ctx,
Greg Claytonb3448432011-03-24 21:19:54 +00001440 const RegisterInfo &reg_info,
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001441 lldb::addr_t addr,
1442 Error &err
1443)
1444{
1445 uint32_t register_number = reg_info.kinds[lldb::eRegisterKindLLDB];
1446 uint32_t register_byte_size = reg_info.byte_size;
Greg Claytonbdcb6ab2011-01-25 23:55:37 +00001447
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001448 if (dematerialize)
1449 {
1450 DataBufferHeap register_data (register_byte_size, 0);
1451
Greg Claytonbdcb6ab2011-01-25 23:55:37 +00001452 Error read_error;
1453 if (exe_ctx.process->ReadMemory (addr, register_data.GetBytes(), register_byte_size, read_error) != register_byte_size)
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001454 {
Greg Claytonbdcb6ab2011-01-25 23:55:37 +00001455 err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", reg_info.name, read_error.AsCString());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001456 return false;
1457 }
1458
1459 DataExtractor register_extractor (register_data.GetBytes(), register_byte_size, exe_ctx.process->GetByteOrder(), exe_ctx.process->GetAddressByteSize());
1460
1461 if (!reg_ctx.WriteRegisterBytes(register_number, register_extractor, 0))
1462 {
1463 err.SetErrorStringWithFormat("Couldn't read %s", reg_info.name);
1464 return false;
1465 }
1466 }
1467 else
1468 {
1469 DataExtractor register_extractor;
1470
1471 if (!reg_ctx.ReadRegisterBytes(register_number, register_extractor))
1472 {
1473 err.SetErrorStringWithFormat("Couldn't read %s", reg_info.name);
1474 return false;
1475 }
1476
1477 uint32_t register_offset = 0;
1478
1479 const void *register_data = register_extractor.GetData(&register_offset, register_byte_size);
1480
1481 if (!register_data)
1482 {
1483 err.SetErrorStringWithFormat("Read but couldn't extract data for %s", reg_info.name);
1484 return false;
1485 }
1486
1487 Error error;
1488 if (exe_ctx.process->WriteMemory (addr, register_data, register_byte_size, error) != register_byte_size)
1489 {
1490 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", error.AsCString());
1491 return false;
1492 }
1493 }
1494
1495 return true;
1496}
1497
Sean Callanancc074622010-09-14 21:59:34 +00001498Variable *
Greg Clayton8de27c72010-10-15 22:48:33 +00001499ClangExpressionDeclMap::FindVariableInScope
1500(
1501 StackFrame &frame,
1502 const ConstString &name,
1503 TypeFromUser *type
1504)
Sean Callananaa301c42010-12-03 01:38:59 +00001505{
Greg Claytone005f2c2010-11-06 01:53:30 +00001506 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanancc074622010-09-14 21:59:34 +00001507
Sean Callanancc074622010-09-14 21:59:34 +00001508 VariableList *var_list = frame.GetVariableList(true);
1509
Greg Claytonbf8e42b2010-10-14 22:52:14 +00001510 if (!var_list)
1511 return NULL;
1512
Greg Clayton3bc52d02010-11-14 22:13:40 +00001513 lldb::VariableSP var_sp (var_list->FindVariable(name));
1514
1515 const bool append = true;
1516 const uint32_t max_matches = 1;
1517 if (!var_sp)
Sean Callanancc074622010-09-14 21:59:34 +00001518 {
Greg Clayton3bc52d02010-11-14 22:13:40 +00001519 // Look for globals elsewhere in the module for the frame
Sean Callananaa301c42010-12-03 01:38:59 +00001520 ModuleSP module_sp (frame.GetSymbolContext(eSymbolContextModule).module_sp);
Greg Clayton3bc52d02010-11-14 22:13:40 +00001521 if (module_sp)
1522 {
1523 VariableList module_globals;
1524 if (module_sp->FindGlobalVariables (name, append, max_matches, module_globals))
1525 var_sp = module_globals.GetVariableAtIndex (0);
1526 }
1527 }
1528
1529 if (!var_sp)
1530 {
1531 // Look for globals elsewhere in the program (all images)
Sean Callananaa301c42010-12-03 01:38:59 +00001532 TargetSP target_sp (frame.GetSymbolContext(eSymbolContextTarget).target_sp);
Greg Clayton3bc52d02010-11-14 22:13:40 +00001533 if (target_sp)
1534 {
1535 VariableList program_globals;
1536 if (target_sp->GetImages().FindGlobalVariables (name, append, max_matches, program_globals))
1537 var_sp = program_globals.GetVariableAtIndex (0);
1538 }
1539 }
1540
1541 if (var_sp && type)
1542 {
1543 if (type->GetASTContext() == var_sp->GetType()->GetClangAST())
1544 {
Greg Clayton04c9c7b2011-02-16 23:00:21 +00001545 if (!ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType()))
Greg Clayton3bc52d02010-11-14 22:13:40 +00001546 return NULL;
1547 }
1548 else
1549 {
1550 if (log)
1551 log->PutCString("Skipping a candidate variable because of different AST contexts");
Sean Callanancc074622010-09-14 21:59:34 +00001552 return NULL;
Greg Clayton3bc52d02010-11-14 22:13:40 +00001553 }
Sean Callanancc074622010-09-14 21:59:34 +00001554 }
Greg Clayton3bc52d02010-11-14 22:13:40 +00001555
1556 return var_sp.get();
Sean Callanancc074622010-09-14 21:59:34 +00001557}
Sean Callanan336a0002010-07-17 00:43:37 +00001558
Chris Lattner24943d22010-06-08 16:52:24 +00001559// Interface for ClangASTSource
1560void
Greg Claytone5748d82010-11-09 23:46:37 +00001561ClangExpressionDeclMap::GetDecls (NameSearchContext &context, const ConstString &name)
Chris Lattner24943d22010-06-08 16:52:24 +00001562{
Sean Callananaa301c42010-12-03 01:38:59 +00001563 assert (m_struct_vars.get());
1564 assert (m_parser_vars.get());
1565
Greg Claytone005f2c2010-11-06 01:53:30 +00001566 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001567
Sean Callanan810f22d2010-07-16 00:09:46 +00001568 if (log)
Greg Clayton8de27c72010-10-15 22:48:33 +00001569 log->Printf("Hunting for a definition for '%s'", name.GetCString());
Chris Lattner24943d22010-06-08 16:52:24 +00001570
1571 // Back out in all cases where we're not fully initialized
Sean Callananaa301c42010-12-03 01:38:59 +00001572 if (m_parser_vars->m_exe_ctx->frame == NULL)
Chris Lattner24943d22010-06-08 16:52:24 +00001573 return;
Sean Callananee8fc722010-11-19 20:20:02 +00001574
Sean Callananaa301c42010-12-03 01:38:59 +00001575 if (m_parser_vars->m_ignore_lookups)
Sean Callananee8fc722010-11-19 20:20:02 +00001576 {
1577 if (log)
1578 log->Printf("Ignoring a query during an import");
1579 return;
1580 }
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001581
Greg Claytone5748d82010-11-09 23:46:37 +00001582 SymbolContextList sc_list;
Chris Lattner24943d22010-06-08 16:52:24 +00001583
Greg Clayton3bc52d02010-11-14 22:13:40 +00001584 const char *name_unique_cstr = name.GetCString();
1585
1586 if (name_unique_cstr == NULL)
1587 return;
1588
Greg Clayton8de27c72010-10-15 22:48:33 +00001589 // Only look for functions by name out in our symbols if the function
1590 // doesn't start with our phony prefix of '$'
Greg Clayton3bc52d02010-11-14 22:13:40 +00001591 if (name_unique_cstr[0] != '$')
Sean Callanan0fc73582010-07-27 00:55:47 +00001592 {
Sean Callananaa301c42010-12-03 01:38:59 +00001593 Variable *var = FindVariableInScope(*m_parser_vars->m_exe_ctx->frame, name);
Greg Clayton8de27c72010-10-15 22:48:33 +00001594
1595 // If we found a variable in scope, no need to pull up function names
1596 if (var != NULL)
1597 {
1598 AddOneVariable(context, var);
1599 }
1600 else
1601 {
Greg Clayton28d5fcc2011-01-27 06:44:37 +00001602 const bool include_symbols = true;
1603 const bool append = false;
1604 m_parser_vars->m_sym_ctx.FindFunctionsByName (name,
1605 include_symbols,
1606 append,
1607 sc_list);
Greg Clayton8de27c72010-10-15 22:48:33 +00001608
1609 bool found_specific = false;
1610 Symbol *generic_symbol = NULL;
1611 Symbol *non_extern_symbol = NULL;
1612
Greg Claytone5748d82010-11-09 23:46:37 +00001613 for (uint32_t index = 0, num_indices = sc_list.GetSize();
Greg Clayton8de27c72010-10-15 22:48:33 +00001614 index < num_indices;
1615 ++index)
1616 {
1617 SymbolContext sym_ctx;
Greg Claytone5748d82010-11-09 23:46:37 +00001618 sc_list.GetContextAtIndex(index, sym_ctx);
Sean Callanan3cfbd332010-10-06 00:10:07 +00001619
Greg Clayton8de27c72010-10-15 22:48:33 +00001620 if (sym_ctx.function)
1621 {
1622 // TODO only do this if it's a C function; C++ functions may be
1623 // overloaded
1624 if (!found_specific)
1625 AddOneFunction(context, sym_ctx.function, NULL);
1626 found_specific = true;
1627 }
1628 else if (sym_ctx.symbol)
1629 {
1630 if (sym_ctx.symbol->IsExternal())
1631 generic_symbol = sym_ctx.symbol;
1632 else
1633 non_extern_symbol = sym_ctx.symbol;
1634 }
1635 }
1636
Sean Callanan92aa6662010-09-07 21:49:41 +00001637 if (!found_specific)
Greg Clayton8de27c72010-10-15 22:48:33 +00001638 {
1639 if (generic_symbol)
Greg Clayton28d5fcc2011-01-27 06:44:37 +00001640 AddOneFunction (context, NULL, generic_symbol);
Greg Clayton8de27c72010-10-15 22:48:33 +00001641 else if (non_extern_symbol)
Greg Clayton28d5fcc2011-01-27 06:44:37 +00001642 AddOneFunction (context, NULL, non_extern_symbol);
Greg Clayton8de27c72010-10-15 22:48:33 +00001643 }
Greg Clayton6916e352010-11-13 03:52:47 +00001644
Sean Callananaa301c42010-12-03 01:38:59 +00001645 ClangNamespaceDecl namespace_decl (m_parser_vars->m_sym_ctx.FindNamespace(name));
Greg Clayton6916e352010-11-13 03:52:47 +00001646 if (namespace_decl)
1647 {
Greg Clayton9ceed1e2010-11-13 04:18:24 +00001648 clang::NamespaceDecl *clang_namespace_decl = AddNamespace(context, namespace_decl);
1649 if (clang_namespace_decl)
Greg Clayton9ceed1e2010-11-13 04:18:24 +00001650 clang_namespace_decl->setHasExternalLexicalStorage();
Greg Clayton6916e352010-11-13 03:52:47 +00001651 }
Sean Callanan92aa6662010-09-07 21:49:41 +00001652 }
Sean Callanan0fc73582010-07-27 00:55:47 +00001653 }
Greg Clayton8de27c72010-10-15 22:48:33 +00001654 else
Sean Callanan3cfbd332010-10-06 00:10:07 +00001655 {
Greg Clayton57452832010-11-09 04:42:43 +00001656 static ConstString g_lldb_class_name ("$__lldb_class");
1657 if (name == g_lldb_class_name)
1658 {
1659 // Clang is looking for the type of "this"
1660
Sean Callananaa301c42010-12-03 01:38:59 +00001661 VariableList *vars = m_parser_vars->m_exe_ctx->frame->GetVariableList(false);
Greg Clayton57452832010-11-09 04:42:43 +00001662
1663 if (!vars)
1664 return;
1665
1666 lldb::VariableSP this_var = vars->FindVariable(ConstString("this"));
1667
1668 if (!this_var)
1669 return;
1670
1671 Type *this_type = this_var->GetType();
1672
1673 if (!this_type)
1674 return;
1675
Greg Clayton2403b5e2010-11-16 02:10:54 +00001676 if (log)
1677 {
1678 log->PutCString ("Type for \"this\" is: ");
1679 StreamString strm;
1680 this_type->Dump(&strm, true);
1681 log->PutCString (strm.GetData());
1682 }
1683
Greg Clayton04c9c7b2011-02-16 23:00:21 +00001684 TypeFromUser this_user_type(this_type->GetClangFullType(),
Greg Clayton57452832010-11-09 04:42:43 +00001685 this_type->GetClangAST());
1686
Sean Callananaa301c42010-12-03 01:38:59 +00001687 m_struct_vars->m_object_pointer_type = this_user_type;
Greg Clayton57452832010-11-09 04:42:43 +00001688
1689 void *pointer_target_type;
1690
1691 if (!ClangASTContext::IsPointerType(this_user_type.GetOpaqueQualType(),
1692 &pointer_target_type))
1693 return;
1694
1695 TypeFromUser class_user_type(pointer_target_type,
1696 this_type->GetClangAST());
1697
Sean Callanan3aa7da52010-12-13 22:46:15 +00001698 if (log)
1699 {
1700 StreamString type_stream;
1701 class_user_type.DumpTypeCode(&type_stream);
1702 type_stream.Flush();
1703 log->Printf("Adding type for $__lldb_class: %s", type_stream.GetString().c_str());
1704 }
1705
Greg Clayton57452832010-11-09 04:42:43 +00001706 AddOneType(context, class_user_type, true);
1707
1708 return;
1709 }
1710
Sean Callanan3aa7da52010-12-13 22:46:15 +00001711 static ConstString g_lldb_objc_class_name ("$__lldb_objc_class");
1712 if (name == g_lldb_objc_class_name)
1713 {
1714 // Clang is looking for the type of "*self"
1715
1716 VariableList *vars = m_parser_vars->m_exe_ctx->frame->GetVariableList(false);
1717
1718 if (!vars)
1719 return;
1720
1721 lldb::VariableSP self_var = vars->FindVariable(ConstString("self"));
1722
1723 if (!self_var)
1724 return;
1725
1726 Type *self_type = self_var->GetType();
1727
1728 if (!self_type)
1729 return;
1730
Greg Clayton04c9c7b2011-02-16 23:00:21 +00001731 TypeFromUser self_user_type(self_type->GetClangFullType(),
Sean Callanan3aa7da52010-12-13 22:46:15 +00001732 self_type->GetClangAST());
1733
1734 m_struct_vars->m_object_pointer_type = self_user_type;
1735
1736 void *pointer_target_type;
1737
1738 if (!ClangASTContext::IsPointerType(self_user_type.GetOpaqueQualType(),
1739 &pointer_target_type))
1740 return;
1741
1742 TypeFromUser class_user_type(pointer_target_type,
1743 self_type->GetClangAST());
1744
1745 if (log)
1746 {
1747 StreamString type_stream;
1748 class_user_type.DumpTypeCode(&type_stream);
1749 type_stream.Flush();
1750 log->Printf("Adding type for $__lldb_objc_class: %s", type_stream.GetString().c_str());
1751 }
1752
1753 AddOneType(context, class_user_type, false);
1754
1755 return;
1756 }
Greg Clayton427f2902010-12-14 02:59:59 +00001757
1758 ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name));
Greg Clayton8de27c72010-10-15 22:48:33 +00001759
Greg Clayton427f2902010-12-14 02:59:59 +00001760 if (pvar_sp)
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001761 {
Greg Clayton427f2902010-12-14 02:59:59 +00001762 AddOneVariable(context, pvar_sp);
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001763 return;
1764 }
1765
1766 const char *reg_name(&name.GetCString()[1]);
1767
Sean Callananaa301c42010-12-03 01:38:59 +00001768 if (m_parser_vars->m_exe_ctx->GetRegisterContext())
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001769 {
Greg Claytonb3448432011-03-24 21:19:54 +00001770 const RegisterInfo *reg_info(m_parser_vars->m_exe_ctx->GetRegisterContext()->GetRegisterInfoByName(reg_name));
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001771
1772 if (reg_info)
1773 AddOneRegister(context, reg_info);
1774 }
Sean Callanan3cfbd332010-10-06 00:10:07 +00001775 }
1776
Sean Callananaa301c42010-12-03 01:38:59 +00001777 lldb::TypeSP type_sp (m_parser_vars->m_sym_ctx.FindTypeByName (name));
Sean Callananee8fc722010-11-19 20:20:02 +00001778
1779 if (type_sp)
Sean Callanan6df08402010-09-27 23:54:58 +00001780 {
Sean Callananee8fc722010-11-19 20:20:02 +00001781 if (log)
Sean Callanan6df08402010-09-27 23:54:58 +00001782 {
Sean Callananee8fc722010-11-19 20:20:02 +00001783 log->Printf ("Matching type found for \"%s\": ", name.GetCString());
1784 StreamString strm;
1785 type_sp->Dump(&strm, true);
1786 log->PutCString (strm.GetData());
1787 }
Greg Clayton2403b5e2010-11-16 02:10:54 +00001788
Greg Clayton04c9c7b2011-02-16 23:00:21 +00001789 TypeFromUser user_type (type_sp->GetClangFullType(),
Greg Claytonb01000f2011-01-17 03:46:26 +00001790 type_sp->GetClangAST());
Sean Callanan6df08402010-09-27 23:54:58 +00001791
Sean Callananee8fc722010-11-19 20:20:02 +00001792 AddOneType(context, user_type, false);
Sean Callanan6df08402010-09-27 23:54:58 +00001793 }
Sean Callanan336a0002010-07-17 00:43:37 +00001794}
1795
1796Value *
Greg Clayton8de27c72010-10-15 22:48:33 +00001797ClangExpressionDeclMap::GetVariableValue
1798(
1799 ExecutionContext &exe_ctx,
1800 Variable *var,
1801 clang::ASTContext *parser_ast_context,
1802 TypeFromUser *user_type,
1803 TypeFromParser *parser_type
1804)
Chris Lattner24943d22010-06-08 16:52:24 +00001805{
Greg Claytone005f2c2010-11-06 01:53:30 +00001806 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan6184dfe2010-06-23 00:47:48 +00001807
Chris Lattner24943d22010-06-08 16:52:24 +00001808 Type *var_type = var->GetType();
1809
1810 if (!var_type)
1811 {
Sean Callanan810f22d2010-07-16 00:09:46 +00001812 if (log)
1813 log->PutCString("Skipped a definition because it has no type");
Sean Callanan336a0002010-07-17 00:43:37 +00001814 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00001815 }
1816
Greg Clayton04c9c7b2011-02-16 23:00:21 +00001817 clang_type_t var_opaque_type = var_type->GetClangFullType();
Chris Lattner24943d22010-06-08 16:52:24 +00001818
1819 if (!var_opaque_type)
1820 {
Sean Callanan810f22d2010-07-16 00:09:46 +00001821 if (log)
1822 log->PutCString("Skipped a definition because it has no Clang type");
Sean Callanan336a0002010-07-17 00:43:37 +00001823 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00001824 }
1825
Greg Claytonb01000f2011-01-17 03:46:26 +00001826 clang::ASTContext *ast = var_type->GetClangASTContext().getASTContext();
Chris Lattner24943d22010-06-08 16:52:24 +00001827
Greg Claytonb01000f2011-01-17 03:46:26 +00001828 if (!ast)
Chris Lattner24943d22010-06-08 16:52:24 +00001829 {
Sean Callanan810f22d2010-07-16 00:09:46 +00001830 if (log)
1831 log->PutCString("There is no AST context for the current execution context");
Sean Callanan336a0002010-07-17 00:43:37 +00001832 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00001833 }
1834
Sean Callanan336a0002010-07-17 00:43:37 +00001835 DWARFExpression &var_location_expr = var->LocationExpression();
1836
Chris Lattner24943d22010-06-08 16:52:24 +00001837 std::auto_ptr<Value> var_location(new Value);
1838
Greg Clayton178710c2010-09-14 02:20:48 +00001839 lldb::addr_t loclist_base_load_addr = LLDB_INVALID_ADDRESS;
1840
1841 if (var_location_expr.IsLocationList())
1842 {
1843 SymbolContext var_sc;
1844 var->CalculateSymbolContext (&var_sc);
Greg Claytoneea26402010-09-14 23:36:40 +00001845 loclist_base_load_addr = var_sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress (exe_ctx.target);
Greg Clayton178710c2010-09-14 02:20:48 +00001846 }
Chris Lattner24943d22010-06-08 16:52:24 +00001847 Error err;
1848
Greg Claytonbdcb6ab2011-01-25 23:55:37 +00001849 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 +00001850 {
Sean Callanan810f22d2010-07-16 00:09:46 +00001851 if (log)
1852 log->Printf("Error evaluating location: %s", err.AsCString());
Sean Callanan336a0002010-07-17 00:43:37 +00001853 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00001854 }
Greg Claytonb01000f2011-01-17 03:46:26 +00001855
Sean Callanan336a0002010-07-17 00:43:37 +00001856 void *type_to_use;
1857
Sean Callananf328c9f2010-07-20 23:31:16 +00001858 if (parser_ast_context)
1859 {
Greg Claytonb01000f2011-01-17 03:46:26 +00001860 type_to_use = GuardedCopyType(parser_ast_context, ast, var_opaque_type);
Sean Callananf328c9f2010-07-20 23:31:16 +00001861
Sean Callanan4b5eec62010-11-20 02:19:29 +00001862 if (!type_to_use)
1863 {
1864 if (log)
1865 log->Printf("Couldn't copy a variable's type into the parser's AST context");
1866
1867 return NULL;
1868 }
1869
Sean Callananf328c9f2010-07-20 23:31:16 +00001870 if (parser_type)
1871 *parser_type = TypeFromParser(type_to_use, parser_ast_context);
1872 }
Sean Callanan336a0002010-07-17 00:43:37 +00001873 else
1874 type_to_use = var_opaque_type;
Chris Lattner24943d22010-06-08 16:52:24 +00001875
1876 if (var_location.get()->GetContextType() == Value::eContextTypeInvalid)
Greg Clayton6916e352010-11-13 03:52:47 +00001877 var_location.get()->SetContext(Value::eContextTypeClangType, type_to_use);
Chris Lattner24943d22010-06-08 16:52:24 +00001878
1879 if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress)
1880 {
1881 SymbolContext var_sc;
1882 var->CalculateSymbolContext(&var_sc);
Sean Callanan336a0002010-07-17 00:43:37 +00001883
Chris Lattner24943d22010-06-08 16:52:24 +00001884 if (!var_sc.module_sp)
Sean Callanan336a0002010-07-17 00:43:37 +00001885 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00001886
1887 ObjectFile *object_file = var_sc.module_sp->GetObjectFile();
1888
1889 if (!object_file)
Sean Callanan336a0002010-07-17 00:43:37 +00001890 return NULL;
1891
Chris Lattner24943d22010-06-08 16:52:24 +00001892 Address so_addr(var_location->GetScalar().ULongLong(), object_file->GetSectionList());
1893
Sean Callananaa301c42010-12-03 01:38:59 +00001894 lldb::addr_t load_addr = so_addr.GetLoadAddress(exe_ctx.target);
Chris Lattner24943d22010-06-08 16:52:24 +00001895
1896 var_location->GetScalar() = load_addr;
1897 var_location->SetValueType(Value::eValueTypeLoadAddress);
1898 }
1899
Sean Callananf328c9f2010-07-20 23:31:16 +00001900 if (user_type)
Greg Claytonb01000f2011-01-17 03:46:26 +00001901 *user_type = TypeFromUser(var_opaque_type, ast);
Sean Callanan336a0002010-07-17 00:43:37 +00001902
1903 return var_location.release();
1904}
1905
1906void
Greg Claytonb01000f2011-01-17 03:46:26 +00001907ClangExpressionDeclMap::AddOneVariable (NameSearchContext &context, Variable* var)
Sean Callanan336a0002010-07-17 00:43:37 +00001908{
Sean Callananaa301c42010-12-03 01:38:59 +00001909 assert (m_parser_vars.get());
1910
Greg Claytone005f2c2010-11-06 01:53:30 +00001911 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan336a0002010-07-17 00:43:37 +00001912
Sean Callananf328c9f2010-07-20 23:31:16 +00001913 TypeFromUser ut;
1914 TypeFromParser pt;
Sean Callanan336a0002010-07-17 00:43:37 +00001915
Sean Callananaa301c42010-12-03 01:38:59 +00001916 Value *var_location = GetVariableValue (*m_parser_vars->m_exe_ctx,
Greg Clayton8de27c72010-10-15 22:48:33 +00001917 var,
1918 context.GetASTContext(),
1919 &ut,
1920 &pt);
Sean Callanan336a0002010-07-17 00:43:37 +00001921
Sean Callanan4b5eec62010-11-20 02:19:29 +00001922 if (!var_location)
1923 return;
1924
Sean Callanan6a925532011-01-13 08:53:35 +00001925 NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(pt.GetASTContext(), pt.GetOpaqueQualType()));
Greg Clayton8de27c72010-10-15 22:48:33 +00001926 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton427f2902010-12-14 02:59:59 +00001927 ConstString entity_name(decl_name.c_str());
Jim Inghamfa3a16a2011-03-31 00:19:25 +00001928 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
1929 entity_name,
Greg Clayton427f2902010-12-14 02:59:59 +00001930 ut,
1931 m_parser_vars->m_exe_ctx->process->GetByteOrder(),
1932 m_parser_vars->m_exe_ctx->process->GetAddressByteSize()));
1933 assert (entity.get());
1934 entity->EnableParserVars();
1935 entity->m_parser_vars->m_parser_type = pt;
1936 entity->m_parser_vars->m_named_decl = var_decl;
1937 entity->m_parser_vars->m_llvm_value = NULL;
1938 entity->m_parser_vars->m_lldb_value = var_location;
Chris Lattner24943d22010-06-08 16:52:24 +00001939
Sean Callanan810f22d2010-07-16 00:09:46 +00001940 if (log)
Greg Clayton8de27c72010-10-15 22:48:33 +00001941 {
Sean Callanana0744822010-11-01 23:22:47 +00001942 std::string var_decl_print_string;
1943 llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
1944 var_decl->print(var_decl_print_stream);
1945 var_decl_print_stream.flush();
1946
1947 log->Printf("Found variable %s, returned %s", decl_name.c_str(), var_decl_print_string.c_str());
Sean Callanan6e74dbb2011-02-01 23:43:26 +00001948
1949 if (log->GetVerbose())
1950 {
1951 StreamString var_decl_dump_string;
1952 ASTDumper::DumpDecl(var_decl_dump_string, var_decl);
1953 log->Printf("%s\n", var_decl_dump_string.GetData());
1954 }
Greg Clayton8de27c72010-10-15 22:48:33 +00001955 }
Sean Callanan8f0dc342010-06-22 23:46:24 +00001956}
1957
1958void
Sean Callanana48fe162010-08-11 03:57:18 +00001959ClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
Greg Clayton427f2902010-12-14 02:59:59 +00001960 ClangExpressionVariableSP &pvar_sp)
Sean Callanana48fe162010-08-11 03:57:18 +00001961{
Greg Claytone005f2c2010-11-06 01:53:30 +00001962 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan45690fe2010-08-30 22:17:16 +00001963
Greg Clayton427f2902010-12-14 02:59:59 +00001964 TypeFromUser user_type (pvar_sp->GetTypeFromUser());
Sean Callanana48fe162010-08-11 03:57:18 +00001965
Greg Clayton427f2902010-12-14 02:59:59 +00001966 TypeFromParser parser_type (GuardedCopyType(context.GetASTContext(),
1967 user_type.GetASTContext(),
1968 user_type.GetOpaqueQualType()),
1969 context.GetASTContext());
Sean Callanana48fe162010-08-11 03:57:18 +00001970
Sean Callanan6a925532011-01-13 08:53:35 +00001971 NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(parser_type.GetASTContext(), parser_type.GetOpaqueQualType()));
Sean Callanan8c127202010-08-23 23:09:38 +00001972
Greg Clayton427f2902010-12-14 02:59:59 +00001973 pvar_sp->EnableParserVars();
1974 pvar_sp->m_parser_vars->m_parser_type = parser_type;
1975 pvar_sp->m_parser_vars->m_named_decl = var_decl;
1976 pvar_sp->m_parser_vars->m_llvm_value = NULL;
1977 pvar_sp->m_parser_vars->m_lldb_value = NULL;
Sean Callanan45690fe2010-08-30 22:17:16 +00001978
1979 if (log)
Sean Callanana0744822010-11-01 23:22:47 +00001980 {
1981 std::string var_decl_print_string;
1982 llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
1983 var_decl->print(var_decl_print_stream);
1984 var_decl_print_stream.flush();
1985
Greg Clayton427f2902010-12-14 02:59:59 +00001986 log->Printf("Added pvar %s, returned %s", pvar_sp->GetName().GetCString(), var_decl_print_string.c_str());
Sean Callanana0744822010-11-01 23:22:47 +00001987 }
Sean Callanana48fe162010-08-11 03:57:18 +00001988}
1989
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001990void
Greg Clayton427f2902010-12-14 02:59:59 +00001991ClangExpressionDeclMap::AddOneRegister (NameSearchContext &context,
1992 const RegisterInfo *reg_info)
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001993{
1994 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1995
1996 void *ast_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize(context.GetASTContext(),
1997 reg_info->encoding,
1998 reg_info->byte_size * 8);
1999
2000 if (!ast_type)
2001 {
2002 log->Printf("Tried to add a type for %s, but couldn't get one", context.m_decl_name.getAsString().c_str());
2003 return;
2004 }
2005
Greg Clayton427f2902010-12-14 02:59:59 +00002006 TypeFromParser parser_type (ast_type,
2007 context.GetASTContext());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002008
2009 NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
2010
Jim Inghamfa3a16a2011-03-31 00:19:25 +00002011 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope(),
2012 m_parser_vars->m_exe_ctx->process->GetByteOrder(),
Greg Clayton427f2902010-12-14 02:59:59 +00002013 m_parser_vars->m_exe_ctx->process->GetAddressByteSize()));
2014 assert (entity.get());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002015 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton427f2902010-12-14 02:59:59 +00002016 entity->SetName (ConstString (decl_name.c_str()));
2017 entity->SetRegisterInfo (reg_info);
2018 entity->EnableParserVars();
2019 entity->m_parser_vars->m_parser_type = parser_type;
2020 entity->m_parser_vars->m_named_decl = var_decl;
2021 entity->m_parser_vars->m_llvm_value = NULL;
2022 entity->m_parser_vars->m_lldb_value = NULL;
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002023
2024 if (log)
2025 {
2026 std::string var_decl_print_string;
2027 llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
2028 var_decl->print(var_decl_print_stream);
2029 var_decl_print_stream.flush();
2030
2031 log->Printf("Added register %s, returned %s", context.m_decl_name.getAsString().c_str(), var_decl_print_string.c_str());
2032 }
2033}
2034
Greg Clayton6916e352010-11-13 03:52:47 +00002035clang::NamespaceDecl *
2036ClangExpressionDeclMap::AddNamespace (NameSearchContext &context, const ClangNamespaceDecl &namespace_decl)
2037{
2038 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2039
Greg Clayton6916e352010-11-13 03:52:47 +00002040 clang::Decl *copied_decl = ClangASTContext::CopyDecl (context.GetASTContext(),
2041 namespace_decl.GetASTContext(),
2042 namespace_decl.GetNamespaceDecl());
2043
2044 return dyn_cast<clang::NamespaceDecl>(copied_decl);
2045}
2046
Sean Callanana48fe162010-08-11 03:57:18 +00002047void
Sean Callanan8f0dc342010-06-22 23:46:24 +00002048ClangExpressionDeclMap::AddOneFunction(NameSearchContext &context,
Sean Callanan0fc73582010-07-27 00:55:47 +00002049 Function* fun,
2050 Symbol* symbol)
Sean Callanan8f0dc342010-06-22 23:46:24 +00002051{
Sean Callananaa301c42010-12-03 01:38:59 +00002052 assert (m_parser_vars.get());
2053
Greg Claytone005f2c2010-11-06 01:53:30 +00002054 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan8f0dc342010-06-22 23:46:24 +00002055
Sean Callanan0fc73582010-07-27 00:55:47 +00002056 NamedDecl *fun_decl;
Sean Callanan8f0dc342010-06-22 23:46:24 +00002057 std::auto_ptr<Value> fun_location(new Value);
Sean Callanan0fc73582010-07-27 00:55:47 +00002058 const Address *fun_address;
Sean Callanan8f0dc342010-06-22 23:46:24 +00002059
Sean Callanan0fc73582010-07-27 00:55:47 +00002060 // only valid for Functions, not for Symbols
2061 void *fun_opaque_type = NULL;
2062 clang::ASTContext *fun_ast_context = NULL;
2063
2064 if (fun)
2065 {
2066 Type *fun_type = fun->GetType();
2067
2068 if (!fun_type)
2069 {
2070 if (log)
2071 log->PutCString("Skipped a function because it has no type");
2072 return;
2073 }
2074
Greg Clayton04c9c7b2011-02-16 23:00:21 +00002075 fun_opaque_type = fun_type->GetClangFullType();
Sean Callanan0fc73582010-07-27 00:55:47 +00002076
2077 if (!fun_opaque_type)
2078 {
2079 if (log)
2080 log->PutCString("Skipped a function because it has no Clang type");
2081 return;
2082 }
2083
2084 fun_address = &fun->GetAddressRange().GetBaseAddress();
2085
Greg Claytonb01000f2011-01-17 03:46:26 +00002086 fun_ast_context = fun_type->GetClangASTContext().getASTContext();
Sean Callananee8fc722010-11-19 20:20:02 +00002087 void *copied_type = GuardedCopyType(context.GetASTContext(), fun_ast_context, fun_opaque_type);
Sean Callanan0fc73582010-07-27 00:55:47 +00002088
2089 fun_decl = context.AddFunDecl(copied_type);
2090 }
2091 else if (symbol)
2092 {
2093 fun_address = &symbol->GetAddressRangeRef().GetBaseAddress();
2094
2095 fun_decl = context.AddGenericFunDecl();
2096 }
2097 else
2098 {
2099 if (log)
2100 log->PutCString("AddOneFunction called with no function and no symbol");
2101 return;
2102 }
2103
Sean Callananaa301c42010-12-03 01:38:59 +00002104 lldb::addr_t load_addr = fun_address->GetLoadAddress(m_parser_vars->m_exe_ctx->target);
Sean Callanan8f0dc342010-06-22 23:46:24 +00002105 fun_location->SetValueType(Value::eValueTypeLoadAddress);
2106 fun_location->GetScalar() = load_addr;
2107
Jim Inghamfa3a16a2011-03-31 00:19:25 +00002108 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
2109 m_parser_vars->m_exe_ctx->process->GetByteOrder(),
Greg Clayton427f2902010-12-14 02:59:59 +00002110 m_parser_vars->m_exe_ctx->process->GetAddressByteSize()));
2111 assert (entity.get());
Greg Clayton8de27c72010-10-15 22:48:33 +00002112 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton427f2902010-12-14 02:59:59 +00002113 entity->SetName(ConstString(decl_name.c_str()));
2114 entity->SetClangType (fun_opaque_type);
2115 entity->SetClangAST (fun_ast_context);
Sean Callanan8f0dc342010-06-22 23:46:24 +00002116
Greg Clayton427f2902010-12-14 02:59:59 +00002117 entity->EnableParserVars();
2118 entity->m_parser_vars->m_named_decl = fun_decl;
2119 entity->m_parser_vars->m_llvm_value = NULL;
2120 entity->m_parser_vars->m_lldb_value = fun_location.release();
Sean Callanan8c127202010-08-23 23:09:38 +00002121
Sean Callanan810f22d2010-07-16 00:09:46 +00002122 if (log)
Greg Clayton8de27c72010-10-15 22:48:33 +00002123 {
Sean Callanana0744822010-11-01 23:22:47 +00002124 std::string fun_decl_print_string;
2125 llvm::raw_string_ostream fun_decl_print_stream(fun_decl_print_string);
2126 fun_decl->print(fun_decl_print_stream);
2127 fun_decl_print_stream.flush();
2128
2129 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 +00002130 }
Chris Lattner24943d22010-06-08 16:52:24 +00002131}
Sean Callanan93a4b1a2010-08-04 01:02:13 +00002132
2133void
2134ClangExpressionDeclMap::AddOneType(NameSearchContext &context,
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00002135 TypeFromUser &ut,
2136 bool add_method)
Sean Callanan93a4b1a2010-08-04 01:02:13 +00002137{
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00002138 clang::ASTContext *parser_ast_context = context.GetASTContext();
2139 clang::ASTContext *user_ast_context = ut.GetASTContext();
Sean Callanan93a4b1a2010-08-04 01:02:13 +00002140
Sean Callananee8fc722010-11-19 20:20:02 +00002141 void *copied_type = GuardedCopyType(parser_ast_context, user_ast_context, ut.GetOpaqueQualType());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00002142
2143 TypeFromParser parser_type(copied_type, parser_ast_context);
2144
2145 if (add_method && ClangASTContext::IsAggregateType(copied_type))
2146 {
2147 void *args[1];
2148
2149 args[0] = ClangASTContext::GetVoidPtrType(parser_ast_context, false);
2150
2151 void *method_type = ClangASTContext::CreateFunctionType (parser_ast_context,
2152 ClangASTContext::GetBuiltInType_void(parser_ast_context),
2153 args,
2154 1,
2155 false,
2156 ClangASTContext::GetTypeQualifiers(copied_type));
Greg Clayton30449d52010-10-01 02:31:07 +00002157
Greg Clayton1d8173f2010-09-24 05:15:53 +00002158 const bool is_virtual = false;
2159 const bool is_static = false;
2160 const bool is_inline = false;
Greg Clayton30449d52010-10-01 02:31:07 +00002161 const bool is_explicit = false;
2162
Greg Clayton1d8173f2010-09-24 05:15:53 +00002163 ClangASTContext::AddMethodToCXXRecordType (parser_ast_context,
2164 copied_type,
Greg Clayton8de27c72010-10-15 22:48:33 +00002165 "$__lldb_expr",
Greg Clayton1d8173f2010-09-24 05:15:53 +00002166 method_type,
2167 lldb::eAccessPublic,
2168 is_virtual,
2169 is_static,
Greg Clayton30449d52010-10-01 02:31:07 +00002170 is_inline,
2171 is_explicit);
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00002172 }
Sean Callanan93a4b1a2010-08-04 01:02:13 +00002173
2174 context.AddTypeDecl(copied_type);
2175}
Sean Callananee8fc722010-11-19 20:20:02 +00002176
2177void *
2178ClangExpressionDeclMap::GuardedCopyType (ASTContext *dest_context,
2179 ASTContext *source_context,
2180 void *clang_type)
2181{
Sean Callananaa301c42010-12-03 01:38:59 +00002182 assert (m_parser_vars.get());
2183
2184 m_parser_vars->m_ignore_lookups = true;
Sean Callananee8fc722010-11-19 20:20:02 +00002185
2186 void *ret = ClangASTContext::CopyType (dest_context,
2187 source_context,
2188 clang_type);
2189
Sean Callananaa301c42010-12-03 01:38:59 +00002190 m_parser_vars->m_ignore_lookups = false;
Sean Callananee8fc722010-11-19 20:20:02 +00002191
2192 return ret;
2193}