blob: 08e7724d0fc6ba244a220c370ea58ee275802061 [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- ClangExpressionDeclMap.cpp -----------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "lldb/Expression/ClangExpressionDeclMap.h"
11
12// C Includes
13// C++ Includes
14// Other libraries and framework includes
15// Project includes
Sean Callanan47a5c4c2010-09-23 03:01:22 +000016#include "clang/AST/DeclarationName.h"
Sean Callanana0744822010-11-01 23:22:47 +000017#include "clang/AST/Decl.h"
Chris Lattner24943d22010-06-08 16:52:24 +000018#include "lldb/lldb-private.h"
19#include "lldb/Core/Address.h"
Sean Callanan810f22d2010-07-16 00:09:46 +000020#include "lldb/Core/Error.h"
Sean Callanan6184dfe2010-06-23 00:47:48 +000021#include "lldb/Core/Log.h"
Chris Lattner24943d22010-06-08 16:52:24 +000022#include "lldb/Core/Module.h"
Greg Clayton061b79d2011-05-09 20:18:18 +000023#include "lldb/Core/RegisterValue.h"
Sean Callanan05a5a1b2010-12-16 03:17:46 +000024#include "lldb/Core/ValueObjectConstResult.h"
Sean Callanan6e74dbb2011-02-01 23:43:26 +000025#include "lldb/Expression/ASTDumper.h"
Chris Lattner24943d22010-06-08 16:52:24 +000026#include "lldb/Expression/ClangASTSource.h"
Sean Callanana48fe162010-08-11 03:57:18 +000027#include "lldb/Expression/ClangPersistentVariables.h"
Greg Claytoncd548032011-02-01 01:31:41 +000028#include "lldb/Host/Endian.h"
Chris Lattner24943d22010-06-08 16:52:24 +000029#include "lldb/Symbol/ClangASTContext.h"
Greg Clayton6916e352010-11-13 03:52:47 +000030#include "lldb/Symbol/ClangNamespaceDecl.h"
Chris Lattner24943d22010-06-08 16:52:24 +000031#include "lldb/Symbol/CompileUnit.h"
32#include "lldb/Symbol/Function.h"
33#include "lldb/Symbol/ObjectFile.h"
34#include "lldb/Symbol/SymbolContext.h"
35#include "lldb/Symbol/Type.h"
36#include "lldb/Symbol/TypeList.h"
37#include "lldb/Symbol/Variable.h"
38#include "lldb/Symbol/VariableList.h"
Sean Callananf328c9f2010-07-20 23:31:16 +000039#include "lldb/Target/ExecutionContext.h"
Sean Callanan810f22d2010-07-16 00:09:46 +000040#include "lldb/Target/Process.h"
Sean Callanan17c6a052010-10-05 20:18:48 +000041#include "lldb/Target/RegisterContext.h"
Chris Lattner24943d22010-06-08 16:52:24 +000042#include "lldb/Target/StackFrame.h"
Sean Callananf328c9f2010-07-20 23:31:16 +000043#include "lldb/Target/Target.h"
Jim Ingham78b9ee82010-12-07 01:56:02 +000044#include "lldb/Target/Thread.h"
Sean Callanana0744822010-11-01 23:22:47 +000045#include "llvm/Support/raw_ostream.h"
Chris Lattner24943d22010-06-08 16:52:24 +000046
Greg Clayton3bc52d02010-11-14 22:13:40 +000047using namespace lldb;
Chris Lattner24943d22010-06-08 16:52:24 +000048using namespace lldb_private;
49using namespace clang;
50
Sean Callanan6a925532011-01-13 08:53:35 +000051ClangExpressionDeclMap::ClangExpressionDeclMap (bool keep_result_in_memory) :
Greg Clayton8de27c72010-10-15 22:48:33 +000052 m_found_entities (),
53 m_struct_members (),
Stephen Wilsondbeb3e12011-04-11 19:41:40 +000054 m_keep_result_in_memory (keep_result_in_memory),
Sean Callananaa301c42010-12-03 01:38:59 +000055 m_parser_vars (),
Stephen Wilsondbeb3e12011-04-11 19:41:40 +000056 m_struct_vars ()
Chris Lattner24943d22010-06-08 16:52:24 +000057{
Sean Callananaa301c42010-12-03 01:38:59 +000058 EnableStructVars();
Chris Lattner24943d22010-06-08 16:52:24 +000059}
60
61ClangExpressionDeclMap::~ClangExpressionDeclMap()
Sean Callananaa301c42010-12-03 01:38:59 +000062{
63 DidDematerialize();
64 DisableStructVars();
65}
Sean Callananc2c6f772010-10-26 00:31:56 +000066
Sean Callanan166ba102011-08-01 18:18:33 +000067bool
Greg Clayton427f2902010-12-14 02:59:59 +000068ClangExpressionDeclMap::WillParse(ExecutionContext &exe_ctx)
Sean Callananaa301c42010-12-03 01:38:59 +000069{
70 EnableParserVars();
71 m_parser_vars->m_exe_ctx = &exe_ctx;
Sean Callanan166ba102011-08-01 18:18:33 +000072
Sean Callananaa301c42010-12-03 01:38:59 +000073 if (exe_ctx.frame)
74 m_parser_vars->m_sym_ctx = exe_ctx.frame->GetSymbolContext(lldb::eSymbolContextEverything);
Jim Ingham78b9ee82010-12-07 01:56:02 +000075 else if (exe_ctx.thread)
76 m_parser_vars->m_sym_ctx = exe_ctx.thread->GetStackFrameAtIndex(0)->GetSymbolContext(lldb::eSymbolContextEverything);
Jim Inghamef80aab2011-05-02 18:13:59 +000077 else if (exe_ctx.process)
78 m_parser_vars->m_sym_ctx = SymbolContext(exe_ctx.target->GetSP(), ModuleSP());
Greg Clayton427f2902010-12-14 02:59:59 +000079 if (exe_ctx.target)
80 m_parser_vars->m_persistent_vars = &exe_ctx.target->GetPersistentVariables();
Sean Callanan166ba102011-08-01 18:18:33 +000081
82 if (exe_ctx.target && !exe_ctx.target->GetScratchClangASTContext())
83 return false;
84
85 return true;
Sean Callananaa301c42010-12-03 01:38:59 +000086}
87
Greg Clayton427f2902010-12-14 02:59:59 +000088void
89ClangExpressionDeclMap::DidParse()
Sean Callananaa301c42010-12-03 01:38:59 +000090{
91 if (m_parser_vars.get())
92 {
Greg Clayton427f2902010-12-14 02:59:59 +000093 for (size_t entity_index = 0, num_entities = m_found_entities.GetSize();
Sean Callananaa301c42010-12-03 01:38:59 +000094 entity_index < num_entities;
95 ++entity_index)
96 {
Greg Clayton427f2902010-12-14 02:59:59 +000097 ClangExpressionVariableSP var_sp(m_found_entities.GetVariableAtIndex(entity_index));
98 if (var_sp &&
99 var_sp->m_parser_vars.get() &&
100 var_sp->m_parser_vars->m_lldb_value)
101 delete var_sp->m_parser_vars->m_lldb_value;
Sean Callananaa301c42010-12-03 01:38:59 +0000102
Greg Clayton427f2902010-12-14 02:59:59 +0000103 var_sp->DisableParserVars();
Sean Callananaa301c42010-12-03 01:38:59 +0000104 }
105
Greg Clayton427f2902010-12-14 02:59:59 +0000106 for (size_t pvar_index = 0, num_pvars = m_parser_vars->m_persistent_vars->GetSize();
Sean Callananaa301c42010-12-03 01:38:59 +0000107 pvar_index < num_pvars;
108 ++pvar_index)
109 {
Greg Clayton427f2902010-12-14 02:59:59 +0000110 ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariableAtIndex(pvar_index));
111 if (pvar_sp)
112 pvar_sp->DisableParserVars();
Sean Callananaa301c42010-12-03 01:38:59 +0000113 }
114
115 DisableParserVars();
Sean Callanan7a60b942010-10-08 01:58:41 +0000116 }
Chris Lattner24943d22010-06-08 16:52:24 +0000117}
118
Sean Callanan8bce6652010-07-13 21:41:46 +0000119// Interface for IRForTarget
120
Greg Clayton8de27c72010-10-15 22:48:33 +0000121const ConstString &
122ClangExpressionDeclMap::GetPersistentResultName ()
Sean Callanan82b74c82010-08-12 01:56:52 +0000123{
Sean Callananaa301c42010-12-03 01:38:59 +0000124 assert (m_struct_vars.get());
125 assert (m_parser_vars.get());
Sean Callananaa301c42010-12-03 01:38:59 +0000126 if (!m_struct_vars->m_result_name)
Greg Clayton427f2902010-12-14 02:59:59 +0000127 {
128 Target *target = m_parser_vars->GetTarget();
129 assert (target);
130 m_struct_vars->m_result_name = target->GetPersistentVariables().GetNextPersistentVariableName();
131 }
Sean Callananaa301c42010-12-03 01:38:59 +0000132 return m_struct_vars->m_result_name;
Sean Callanan82b74c82010-08-12 01:56:52 +0000133}
134
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000135lldb::ClangExpressionVariableSP
136ClangExpressionDeclMap::BuildIntegerVariable (const ConstString &name,
137 lldb_private::TypeFromParser type,
138 const llvm::APInt& value)
139{
140 assert (m_parser_vars.get());
Sean Callanan166ba102011-08-01 18:18:33 +0000141
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000142 ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
Sean Callanan9b6898f2011-07-30 02:42:06 +0000143 ASTContext *context(exe_ctx->target->GetScratchClangASTContext()->getASTContext());
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000144
145 TypeFromUser user_type(ClangASTContext::CopyType(context,
146 type.GetASTContext(),
147 type.GetOpaqueQualType()),
148 context);
Sean Callanan696cf5f2011-05-07 01:06:41 +0000149
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000150 if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx->GetBestExecutionContextScope (),
151 name,
Sean Callanan0e0817d2011-01-04 02:41:41 +0000152 user_type,
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000153 exe_ctx->process->GetByteOrder(),
154 exe_ctx->process->GetAddressByteSize()))
Sean Callanan0e0817d2011-01-04 02:41:41 +0000155 return lldb::ClangExpressionVariableSP();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000156
Sean Callanan0e0817d2011-01-04 02:41:41 +0000157 ClangExpressionVariableSP pvar_sp (m_parser_vars->m_persistent_vars->GetVariable(name));
158
159 if (!pvar_sp)
160 return lldb::ClangExpressionVariableSP();
161
162 uint8_t *pvar_data = pvar_sp->GetValueBytes();
163 if (pvar_data == NULL)
164 return lldb::ClangExpressionVariableSP();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000165
166 uint64_t value64 = value.getLimitedValue();
167
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000168 ByteOrder byte_order = exe_ctx->process->GetByteOrder();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000169
170 size_t num_val_bytes = sizeof(value64);
Sean Callanan0e0817d2011-01-04 02:41:41 +0000171 size_t num_data_bytes = pvar_sp->GetByteSize();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000172
173 size_t num_bytes = num_val_bytes;
174 if (num_bytes > num_data_bytes)
175 num_bytes = num_data_bytes;
176
Johnny Chen2bc9eb32011-07-19 19:48:13 +0000177 for (size_t byte_idx = 0;
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000178 byte_idx < num_bytes;
179 ++byte_idx)
180 {
181 uint64_t shift = byte_idx * 8;
182 uint64_t mask = 0xffll << shift;
183 uint8_t cur_byte = (uint8_t)((value64 & mask) >> shift);
184
185 switch (byte_order)
186 {
Sean Callanan0e0817d2011-01-04 02:41:41 +0000187 case eByteOrderBig:
188 // High Low
189 // Original: |AABBCCDDEEFFGGHH|
190 // Target: |EEFFGGHH|
191
192 pvar_data[num_data_bytes - (1 + byte_idx)] = cur_byte;
193 break;
194 case eByteOrderLittle:
195 // Target: |HHGGFFEE|
196 pvar_data[byte_idx] = cur_byte;
197 break;
198 default:
199 return lldb::ClangExpressionVariableSP();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000200 }
201 }
Sean Callanan6a925532011-01-13 08:53:35 +0000202
203 pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried;
Sean Callanan696cf5f2011-05-07 01:06:41 +0000204 pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
205 pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
Sean Callanan0e0817d2011-01-04 02:41:41 +0000206
207 return pvar_sp;
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000208}
209
Sean Callanan696cf5f2011-05-07 01:06:41 +0000210lldb::ClangExpressionVariableSP
211ClangExpressionDeclMap::BuildCastVariable (const ConstString &name,
Sean Callanan9b6898f2011-07-30 02:42:06 +0000212 VarDecl *decl,
Sean Callanan696cf5f2011-05-07 01:06:41 +0000213 lldb_private::TypeFromParser type)
214{
215 assert (m_parser_vars.get());
216
217 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
218
219 ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
Sean Callanan9b6898f2011-07-30 02:42:06 +0000220 ASTContext *context(exe_ctx->target->GetScratchClangASTContext()->getASTContext());
Sean Callanan696cf5f2011-05-07 01:06:41 +0000221
222 ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl));
223
224 if (!var_sp)
225 var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl);
226
227 if (!var_sp)
228 return ClangExpressionVariableSP();
229
230 TypeFromUser user_type(ClangASTContext::CopyType(context,
231 type.GetASTContext(),
232 type.GetOpaqueQualType()),
233 context);
234
235 TypeFromUser var_type = var_sp->GetTypeFromUser();
236
237 VariableSP var = FindVariableInScope (*exe_ctx->frame, var_sp->GetName(), &var_type);
238
239 if (!var)
240 return lldb::ClangExpressionVariableSP(); // but we should handle this; it may be a persistent variable
241
242 ValueObjectSP var_valobj = exe_ctx->frame->GetValueObjectForFrameVariable(var, lldb::eNoDynamicValues);
243
244 if (!var_valobj)
245 return lldb::ClangExpressionVariableSP();
246
247 ValueObjectSP var_casted_valobj = var_valobj->CastPointerType(name.GetCString(), user_type);
248
249 if (!var_casted_valobj)
250 return lldb::ClangExpressionVariableSP();
251
252 if (log)
253 {
254 StreamString my_stream_string;
255
256 ClangASTType::DumpTypeDescription (var_type.GetASTContext(),
257 var_type.GetOpaqueQualType(),
258 &my_stream_string);
259
260
261 log->Printf("Building cast variable to type: %s", my_stream_string.GetString().c_str());
262 }
263
264 ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->CreatePersistentVariable (var_casted_valobj);
265
266 if (!pvar_sp)
267 return lldb::ClangExpressionVariableSP();
268
269 if (pvar_sp != m_parser_vars->m_persistent_vars->GetVariable(name))
270 return lldb::ClangExpressionVariableSP();
271
272 pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried;
273 pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
274 pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
275
276 return pvar_sp;
277}
278
Sean Callanan8bce6652010-07-13 21:41:46 +0000279bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000280ClangExpressionDeclMap::AddPersistentVariable
281(
Sean Callanan9b6898f2011-07-30 02:42:06 +0000282 const NamedDecl *decl,
Greg Clayton8de27c72010-10-15 22:48:33 +0000283 const ConstString &name,
Sean Callanan6a925532011-01-13 08:53:35 +0000284 TypeFromParser parser_type,
285 bool is_result,
286 bool is_lvalue
Greg Clayton8de27c72010-10-15 22:48:33 +0000287)
Sean Callanana48fe162010-08-11 03:57:18 +0000288{
Sean Callananaa301c42010-12-03 01:38:59 +0000289 assert (m_parser_vars.get());
290
Sean Callanan6a925532011-01-13 08:53:35 +0000291 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000292 ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
Sean Callanan6a925532011-01-13 08:53:35 +0000293
Sean Callanan9b6898f2011-07-30 02:42:06 +0000294 ASTContext *context(exe_ctx->target->GetScratchClangASTContext()->getASTContext());
Sean Callanana48fe162010-08-11 03:57:18 +0000295
Sean Callanana48fe162010-08-11 03:57:18 +0000296 TypeFromUser user_type(ClangASTContext::CopyType(context,
Sean Callanan82b74c82010-08-12 01:56:52 +0000297 parser_type.GetASTContext(),
298 parser_type.GetOpaqueQualType()),
Sean Callanan97678d12011-01-13 21:23:32 +0000299 context);
Sean Callanana48fe162010-08-11 03:57:18 +0000300
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000301 if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx->GetBestExecutionContextScope (),
302 name,
Greg Clayton427f2902010-12-14 02:59:59 +0000303 user_type,
Jim Inghamfa3a16a2011-03-31 00:19:25 +0000304 exe_ctx->process->GetByteOrder(),
305 exe_ctx->process->GetAddressByteSize()))
Sean Callanan8c127202010-08-23 23:09:38 +0000306 return false;
307
Greg Clayton427f2902010-12-14 02:59:59 +0000308 ClangExpressionVariableSP var_sp (m_parser_vars->m_persistent_vars->GetVariable(name));
Sean Callanan8c127202010-08-23 23:09:38 +0000309
Greg Clayton427f2902010-12-14 02:59:59 +0000310 if (!var_sp)
Sean Callanan8c127202010-08-23 23:09:38 +0000311 return false;
312
Sean Callanan6a925532011-01-13 08:53:35 +0000313 if (is_result)
314 var_sp->m_flags |= ClangExpressionVariable::EVNeedsFreezeDry;
315 else
316 var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget; // explicitly-declared persistent variables should persist
317
318 if (is_lvalue)
319 {
320 var_sp->m_flags |= ClangExpressionVariable::EVIsProgramReference;
321 }
322 else
323 {
324 var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
325 var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
326 }
327
328 if (log)
329 log->Printf("Created persistent variable with flags 0x%hx", var_sp->m_flags);
330
Greg Clayton427f2902010-12-14 02:59:59 +0000331 var_sp->EnableParserVars();
Sean Callanan8c127202010-08-23 23:09:38 +0000332
Greg Clayton427f2902010-12-14 02:59:59 +0000333 var_sp->m_parser_vars->m_named_decl = decl;
334 var_sp->m_parser_vars->m_parser_type = parser_type;
Sean Callanan8c127202010-08-23 23:09:38 +0000335
336 return true;
Sean Callanana48fe162010-08-11 03:57:18 +0000337}
338
339bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000340ClangExpressionDeclMap::AddValueToStruct
341(
Sean Callanan9b6898f2011-07-30 02:42:06 +0000342 const NamedDecl *decl,
Greg Clayton8de27c72010-10-15 22:48:33 +0000343 const ConstString &name,
344 llvm::Value *value,
345 size_t size,
346 off_t alignment
347)
Sean Callanan8bce6652010-07-13 21:41:46 +0000348{
Sean Callananaa301c42010-12-03 01:38:59 +0000349 assert (m_struct_vars.get());
350 assert (m_parser_vars.get());
351
Greg Claytone005f2c2010-11-06 01:53:30 +0000352 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan45690fe2010-08-30 22:17:16 +0000353
Sean Callananaa301c42010-12-03 01:38:59 +0000354 m_struct_vars->m_struct_laid_out = false;
Sean Callanan8bce6652010-07-13 21:41:46 +0000355
Sean Callanan8c127202010-08-23 23:09:38 +0000356 if (m_struct_members.GetVariable(decl))
357 return true;
Sean Callanan8bce6652010-07-13 21:41:46 +0000358
Greg Clayton427f2902010-12-14 02:59:59 +0000359 ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl));
Sean Callanan8bce6652010-07-13 21:41:46 +0000360
Greg Clayton427f2902010-12-14 02:59:59 +0000361 if (!var_sp)
362 var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl);
Sean Callanan8bce6652010-07-13 21:41:46 +0000363
Greg Clayton427f2902010-12-14 02:59:59 +0000364 if (!var_sp)
Sean Callanan8c127202010-08-23 23:09:38 +0000365 return false;
366
Sean Callanan45690fe2010-08-30 22:17:16 +0000367 if (log)
368 log->Printf("Adding value for decl %p [%s - %s] to the structure",
369 decl,
Greg Clayton8de27c72010-10-15 22:48:33 +0000370 name.GetCString(),
Greg Clayton427f2902010-12-14 02:59:59 +0000371 var_sp->GetName().GetCString());
Sean Callanan45690fe2010-08-30 22:17:16 +0000372
Sean Callanan8c127202010-08-23 23:09:38 +0000373 // We know entity->m_parser_vars is valid because we used a parser variable
374 // to find it
Greg Clayton427f2902010-12-14 02:59:59 +0000375 var_sp->m_parser_vars->m_llvm_value = value;
Sean Callanan8c127202010-08-23 23:09:38 +0000376
Greg Clayton427f2902010-12-14 02:59:59 +0000377 var_sp->EnableJITVars();
378 var_sp->m_jit_vars->m_alignment = alignment;
379 var_sp->m_jit_vars->m_size = size;
Sean Callanan8c127202010-08-23 23:09:38 +0000380
Greg Clayton427f2902010-12-14 02:59:59 +0000381 m_struct_members.AddVariable(var_sp);
Sean Callanan8bce6652010-07-13 21:41:46 +0000382
383 return true;
384}
385
386bool
387ClangExpressionDeclMap::DoStructLayout ()
388{
Sean Callananaa301c42010-12-03 01:38:59 +0000389 assert (m_struct_vars.get());
390
391 if (m_struct_vars->m_struct_laid_out)
Sean Callanan8bce6652010-07-13 21:41:46 +0000392 return true;
393
Sean Callanan8bce6652010-07-13 21:41:46 +0000394 off_t cursor = 0;
395
Sean Callananaa301c42010-12-03 01:38:59 +0000396 m_struct_vars->m_struct_alignment = 0;
397 m_struct_vars->m_struct_size = 0;
Sean Callanan8bce6652010-07-13 21:41:46 +0000398
Greg Clayton427f2902010-12-14 02:59:59 +0000399 for (size_t member_index = 0, num_members = m_struct_members.GetSize();
Sean Callanan8c127202010-08-23 23:09:38 +0000400 member_index < num_members;
401 ++member_index)
Sean Callanan8bce6652010-07-13 21:41:46 +0000402 {
Greg Clayton427f2902010-12-14 02:59:59 +0000403 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
404 if (!member_sp)
405 return false;
406
407 if (!member_sp->m_jit_vars.get())
Sean Callanan8c127202010-08-23 23:09:38 +0000408 return false;
Sean Callanan8bce6652010-07-13 21:41:46 +0000409
Sean Callanan8c127202010-08-23 23:09:38 +0000410 if (member_index == 0)
Greg Clayton427f2902010-12-14 02:59:59 +0000411 m_struct_vars->m_struct_alignment = member_sp->m_jit_vars->m_alignment;
Sean Callanan8c127202010-08-23 23:09:38 +0000412
Greg Clayton427f2902010-12-14 02:59:59 +0000413 if (cursor % member_sp->m_jit_vars->m_alignment)
414 cursor += (member_sp->m_jit_vars->m_alignment - (cursor % member_sp->m_jit_vars->m_alignment));
Sean Callanan8c127202010-08-23 23:09:38 +0000415
Greg Clayton427f2902010-12-14 02:59:59 +0000416 member_sp->m_jit_vars->m_offset = cursor;
417 cursor += member_sp->m_jit_vars->m_size;
Sean Callanan8bce6652010-07-13 21:41:46 +0000418 }
419
Sean Callananaa301c42010-12-03 01:38:59 +0000420 m_struct_vars->m_struct_size = cursor;
Sean Callanan8bce6652010-07-13 21:41:46 +0000421
Sean Callananaa301c42010-12-03 01:38:59 +0000422 m_struct_vars->m_struct_laid_out = true;
Sean Callanan8bce6652010-07-13 21:41:46 +0000423 return true;
424}
425
Greg Clayton8de27c72010-10-15 22:48:33 +0000426bool ClangExpressionDeclMap::GetStructInfo
427(
428 uint32_t &num_elements,
429 size_t &size,
430 off_t &alignment
431)
Sean Callanan8bce6652010-07-13 21:41:46 +0000432{
Sean Callananaa301c42010-12-03 01:38:59 +0000433 assert (m_struct_vars.get());
434
435 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan8bce6652010-07-13 21:41:46 +0000436 return false;
437
Greg Clayton427f2902010-12-14 02:59:59 +0000438 num_elements = m_struct_members.GetSize();
Sean Callananaa301c42010-12-03 01:38:59 +0000439 size = m_struct_vars->m_struct_size;
440 alignment = m_struct_vars->m_struct_alignment;
Sean Callanan8bce6652010-07-13 21:41:46 +0000441
442 return true;
443}
444
445bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000446ClangExpressionDeclMap::GetStructElement
447(
Sean Callanan9b6898f2011-07-30 02:42:06 +0000448 const NamedDecl *&decl,
Greg Clayton8de27c72010-10-15 22:48:33 +0000449 llvm::Value *&value,
450 off_t &offset,
451 ConstString &name,
452 uint32_t index
453)
Sean Callanan8bce6652010-07-13 21:41:46 +0000454{
Sean Callananaa301c42010-12-03 01:38:59 +0000455 assert (m_struct_vars.get());
456
457 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan8bce6652010-07-13 21:41:46 +0000458 return false;
459
Greg Clayton427f2902010-12-14 02:59:59 +0000460 if (index >= m_struct_members.GetSize())
Sean Callanan8bce6652010-07-13 21:41:46 +0000461 return false;
462
Greg Clayton427f2902010-12-14 02:59:59 +0000463 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(index));
Sean Callanan8bce6652010-07-13 21:41:46 +0000464
Greg Clayton427f2902010-12-14 02:59:59 +0000465 if (!member_sp ||
466 !member_sp->m_parser_vars.get() ||
467 !member_sp->m_jit_vars.get())
Sean Callanan8c127202010-08-23 23:09:38 +0000468 return false;
469
Greg Clayton427f2902010-12-14 02:59:59 +0000470 decl = member_sp->m_parser_vars->m_named_decl;
471 value = member_sp->m_parser_vars->m_llvm_value;
472 offset = member_sp->m_jit_vars->m_offset;
473 name = member_sp->GetName();
Sean Callanan8c127202010-08-23 23:09:38 +0000474
Sean Callanan8bce6652010-07-13 21:41:46 +0000475 return true;
476}
477
Sean Callanan02fbafa2010-07-27 21:39:39 +0000478bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000479ClangExpressionDeclMap::GetFunctionInfo
480(
Sean Callanan9b6898f2011-07-30 02:42:06 +0000481 const NamedDecl *decl,
Greg Clayton8de27c72010-10-15 22:48:33 +0000482 llvm::Value**& value,
483 uint64_t &ptr
484)
Sean Callananba992c52010-07-27 02:07:53 +0000485{
Greg Clayton427f2902010-12-14 02:59:59 +0000486 ClangExpressionVariableSP entity_sp(m_found_entities.GetVariable(decl));
Sean Callanan8c127202010-08-23 23:09:38 +0000487
Greg Clayton427f2902010-12-14 02:59:59 +0000488 if (!entity_sp)
Sean Callanan8c127202010-08-23 23:09:38 +0000489 return false;
Sean Callananba992c52010-07-27 02:07:53 +0000490
Sean Callanan8c127202010-08-23 23:09:38 +0000491 // We know m_parser_vars is valid since we searched for the variable by
492 // its NamedDecl
Sean Callananba992c52010-07-27 02:07:53 +0000493
Greg Clayton427f2902010-12-14 02:59:59 +0000494 value = &entity_sp->m_parser_vars->m_llvm_value;
495 ptr = entity_sp->m_parser_vars->m_lldb_value->GetScalar().ULongLong();
Sean Callanan8c127202010-08-23 23:09:38 +0000496
497 return true;
Sean Callananba992c52010-07-27 02:07:53 +0000498}
499
Sean Callananca2516d2011-08-16 18:09:29 +0000500static void
501FindCodeSymbolInContext
502(
503 const ConstString &name,
504 SymbolContext &sym_ctx,
505 SymbolContextList &sc_list
506)
507{
508 if (sym_ctx.module_sp)
509 sym_ctx.module_sp->FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list);
510
511 if (!sc_list.GetSize())
512 sym_ctx.target_sp->GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list);
513}
514
Sean Callananf5857a02010-07-31 01:32:05 +0000515bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000516ClangExpressionDeclMap::GetFunctionAddress
517(
518 const ConstString &name,
Greg Claytonda7af842011-05-18 22:01:49 +0000519 uint64_t &func_addr
Greg Clayton8de27c72010-10-15 22:48:33 +0000520)
Sean Callananf5857a02010-07-31 01:32:05 +0000521{
Sean Callananaa301c42010-12-03 01:38:59 +0000522 assert (m_parser_vars.get());
523
Sean Callananaba367e2011-05-13 18:27:02 +0000524 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
525
Sean Callananf5857a02010-07-31 01:32:05 +0000526 // Back out in all cases where we're not fully initialized
Jim Ingham78b9ee82010-12-07 01:56:02 +0000527 if (m_parser_vars->m_exe_ctx->target == NULL)
528 return false;
529 if (!m_parser_vars->m_sym_ctx.target_sp)
Sean Callananf5857a02010-07-31 01:32:05 +0000530 return false;
531
Greg Claytone5748d82010-11-09 23:46:37 +0000532 SymbolContextList sc_list;
Sean Callananf5857a02010-07-31 01:32:05 +0000533
Sean Callananca2516d2011-08-16 18:09:29 +0000534 FindCodeSymbolInContext(name, m_parser_vars->m_sym_ctx, sc_list);
535
Greg Claytone5748d82010-11-09 23:46:37 +0000536 if (!sc_list.GetSize())
Sean Callananaba367e2011-05-13 18:27:02 +0000537 {
538 // We occasionally get debug information in which a const function is reported
539 // as non-const, so the mangled name is wrong. This is a hack to compensate.
540
541 Mangled mangled(name.GetCString(), true);
542
543 ConstString demangled_name = mangled.GetDemangledName();
544
545 if (strlen(demangled_name.GetCString()))
546 {
547 std::string const_name_scratch(demangled_name.GetCString());
548
549 const_name_scratch.append(" const");
550
551 ConstString const_name(const_name_scratch.c_str());
552
Sean Callananca2516d2011-08-16 18:09:29 +0000553 FindCodeSymbolInContext(name, m_parser_vars->m_sym_ctx, sc_list);
Sean Callananaba367e2011-05-13 18:27:02 +0000554
555 if (log)
556 log->Printf("Found %d results with const name %s", sc_list.GetSize(), const_name.GetCString());
557 }
558 }
559
560 if (!sc_list.GetSize())
Sean Callananf5857a02010-07-31 01:32:05 +0000561 return false;
562
563 SymbolContext sym_ctx;
Greg Claytone5748d82010-11-09 23:46:37 +0000564 sc_list.GetContextAtIndex(0, sym_ctx);
Sean Callananf5857a02010-07-31 01:32:05 +0000565
Greg Claytonda7af842011-05-18 22:01:49 +0000566 const Address *func_so_addr = NULL;
Sean Callananf5857a02010-07-31 01:32:05 +0000567
568 if (sym_ctx.function)
Greg Claytonda7af842011-05-18 22:01:49 +0000569 func_so_addr = &sym_ctx.function->GetAddressRange().GetBaseAddress();
Sean Callananf5857a02010-07-31 01:32:05 +0000570 else if (sym_ctx.symbol)
Greg Claytonda7af842011-05-18 22:01:49 +0000571 func_so_addr = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress();
Sean Callananf5857a02010-07-31 01:32:05 +0000572 else
573 return false;
574
Sean Callananae9f7482011-07-07 23:05:43 +0000575 if (!func_so_addr || !func_so_addr->IsValid())
576 return false;
577
Greg Claytonda7af842011-05-18 22:01:49 +0000578 func_addr = func_so_addr->GetCallableLoadAddress (m_parser_vars->m_exe_ctx->target);
579
Sean Callananf5857a02010-07-31 01:32:05 +0000580 return true;
581}
582
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000583addr_t
584ClangExpressionDeclMap::GetSymbolAddress (Target &target, const ConstString &name)
Sean Callananc7674af2011-01-17 23:42:46 +0000585{
Sean Callananc7674af2011-01-17 23:42:46 +0000586 SymbolContextList sc_list;
587
Sean Callanan81974962011-05-08 02:21:26 +0000588 target.GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeAny, sc_list);
Sean Callananc7674af2011-01-17 23:42:46 +0000589
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000590 const uint32_t num_matches = sc_list.GetSize();
591 addr_t symbol_load_addr = LLDB_INVALID_ADDRESS;
592
593 for (uint32_t i=0; i<num_matches && symbol_load_addr == LLDB_INVALID_ADDRESS; i++)
594 {
595 SymbolContext sym_ctx;
596 sc_list.GetContextAtIndex(i, sym_ctx);
Sean Callananc7674af2011-01-17 23:42:46 +0000597
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000598 const Address *sym_address = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress();
Sean Callananae9f7482011-07-07 23:05:43 +0000599
600 if (!sym_address || !sym_address->IsValid())
601 return LLDB_INVALID_ADDRESS;
602
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000603 if (sym_address)
604 {
605 switch (sym_ctx.symbol->GetType())
606 {
607 case eSymbolTypeCode:
608 case eSymbolTypeTrampoline:
609 symbol_load_addr = sym_address->GetCallableLoadAddress (&target);
610 break;
611
612 case eSymbolTypeData:
613 case eSymbolTypeRuntime:
614 case eSymbolTypeVariable:
615 case eSymbolTypeLocal:
616 case eSymbolTypeParam:
617 case eSymbolTypeInvalid:
618 case eSymbolTypeAbsolute:
619 case eSymbolTypeExtern:
620 case eSymbolTypeException:
621 case eSymbolTypeSourceFile:
622 case eSymbolTypeHeaderFile:
623 case eSymbolTypeObjectFile:
624 case eSymbolTypeCommonBlock:
625 case eSymbolTypeBlock:
626 case eSymbolTypeVariableType:
627 case eSymbolTypeLineEntry:
628 case eSymbolTypeLineHeader:
629 case eSymbolTypeScopeBegin:
630 case eSymbolTypeScopeEnd:
631 case eSymbolTypeAdditional:
632 case eSymbolTypeCompiler:
633 case eSymbolTypeInstrumentation:
634 case eSymbolTypeUndefined:
635 symbol_load_addr = sym_address->GetLoadAddress (&target);
636 break;
637 }
638 }
639 }
Sean Callananc7674af2011-01-17 23:42:46 +0000640
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000641 return symbol_load_addr;
Sean Callananc7674af2011-01-17 23:42:46 +0000642}
643
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000644addr_t
645ClangExpressionDeclMap::GetSymbolAddress (const ConstString &name)
Sean Callanan81974962011-05-08 02:21:26 +0000646{
647 assert (m_parser_vars.get());
648
649 if (!m_parser_vars->m_exe_ctx ||
650 !m_parser_vars->m_exe_ctx->target)
651 return false;
652
Greg Claytoncbc07cf2011-06-23 04:25:29 +0000653 return GetSymbolAddress(*m_parser_vars->m_exe_ctx->target, name);
Sean Callanan81974962011-05-08 02:21:26 +0000654}
655
Sean Callanan810f22d2010-07-16 00:09:46 +0000656// Interface for CommandObjectExpression
Sean Callananf328c9f2010-07-20 23:31:16 +0000657
658bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000659ClangExpressionDeclMap::Materialize
660(
Sean Callananaa301c42010-12-03 01:38:59 +0000661 ExecutionContext &exe_ctx,
Greg Clayton8de27c72010-10-15 22:48:33 +0000662 lldb::addr_t &struct_address,
663 Error &err
664)
Sean Callananf328c9f2010-07-20 23:31:16 +0000665{
Sean Callananaa301c42010-12-03 01:38:59 +0000666 EnableMaterialVars();
667
668 m_material_vars->m_process = exe_ctx.process;
669
Sean Callanan0ddf8062011-05-09 22:04:36 +0000670 bool result = DoMaterialize(false /* dematerialize */,
671 exe_ctx,
672 LLDB_INVALID_ADDRESS /* top of stack frame */,
673 LLDB_INVALID_ADDRESS /* bottom of stack frame */,
674 NULL, /* result SP */
675 err);
Sean Callananf328c9f2010-07-20 23:31:16 +0000676
677 if (result)
Sean Callananaa301c42010-12-03 01:38:59 +0000678 struct_address = m_material_vars->m_materialized_location;
Sean Callananf328c9f2010-07-20 23:31:16 +0000679
680 return result;
681}
682
683bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000684ClangExpressionDeclMap::GetObjectPointer
685(
686 lldb::addr_t &object_ptr,
Sean Callanan3aa7da52010-12-13 22:46:15 +0000687 ConstString &object_name,
Sean Callananaa301c42010-12-03 01:38:59 +0000688 ExecutionContext &exe_ctx,
Sean Callanan047923c2010-12-14 00:42:36 +0000689 Error &err,
690 bool suppress_type_check
Greg Clayton8de27c72010-10-15 22:48:33 +0000691)
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000692{
Sean Callananaa301c42010-12-03 01:38:59 +0000693 assert (m_struct_vars.get());
694
695 if (!exe_ctx.frame || !exe_ctx.target || !exe_ctx.process)
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000696 {
697 err.SetErrorString("Couldn't load 'this' because the context is incomplete");
698 return false;
699 }
700
Sean Callananaa301c42010-12-03 01:38:59 +0000701 if (!m_struct_vars->m_object_pointer_type.GetOpaqueQualType())
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000702 {
703 err.SetErrorString("Couldn't load 'this' because its type is unknown");
704 return false;
705 }
706
Sean Callanan696cf5f2011-05-07 01:06:41 +0000707 VariableSP object_ptr_var = FindVariableInScope (*exe_ctx.frame,
708 object_name,
709 (suppress_type_check ? NULL : &m_struct_vars->m_object_pointer_type));
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000710
711 if (!object_ptr_var)
712 {
Sean Callanan3aa7da52010-12-13 22:46:15 +0000713 err.SetErrorStringWithFormat("Couldn't find '%s' with appropriate type in scope", object_name.GetCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000714 return false;
715 }
716
Sean Callananaa301c42010-12-03 01:38:59 +0000717 std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(exe_ctx,
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000718 object_ptr_var,
Sean Callananaa301c42010-12-03 01:38:59 +0000719 NULL));
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000720
721 if (!location_value.get())
722 {
Sean Callanan3aa7da52010-12-13 22:46:15 +0000723 err.SetErrorStringWithFormat("Couldn't get the location for '%s'", object_name.GetCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000724 return false;
725 }
726
Sean Callanan50339fe2011-03-04 00:23:47 +0000727 switch (location_value->GetValueType())
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000728 {
Sean Callanan50339fe2011-03-04 00:23:47 +0000729 default:
Sean Callanan3aa7da52010-12-13 22:46:15 +0000730 err.SetErrorStringWithFormat("'%s' is not in memory; LLDB must be extended to handle registers", object_name.GetCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000731 return false;
Sean Callanan50339fe2011-03-04 00:23:47 +0000732 case Value::eValueTypeLoadAddress:
733 {
734 lldb::addr_t value_addr = location_value->GetScalar().ULongLong();
735 uint32_t address_byte_size = exe_ctx.target->GetArchitecture().GetAddressByteSize();
Sean Callanan50339fe2011-03-04 00:23:47 +0000736
737 if (ClangASTType::GetClangTypeBitWidth(m_struct_vars->m_object_pointer_type.GetASTContext(),
738 m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) != address_byte_size * 8)
739 {
740 err.SetErrorStringWithFormat("'%s' is not of an expected pointer size", object_name.GetCString());
741 return false;
742 }
743
Sean Callanan50339fe2011-03-04 00:23:47 +0000744 Error read_error;
Greg Claytonc0fa5332011-05-22 22:46:53 +0000745 object_ptr = exe_ctx.process->ReadPointerFromMemory (value_addr, read_error);
746 if (read_error.Fail() || object_ptr == LLDB_INVALID_ADDRESS)
Sean Callanan50339fe2011-03-04 00:23:47 +0000747 {
748 err.SetErrorStringWithFormat("Coldn't read '%s' from the target: %s", object_name.GetCString(), read_error.AsCString());
749 return false;
Greg Claytonc0fa5332011-05-22 22:46:53 +0000750 }
Sean Callanan50339fe2011-03-04 00:23:47 +0000751 return true;
752 }
753 case Value::eValueTypeScalar:
754 {
755 if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
756 {
757 StreamString ss;
758 location_value->Dump(&ss);
759
760 err.SetErrorStringWithFormat("%s is a scalar of unhandled type: %s", object_name.GetCString(), ss.GetString().c_str());
761 return false;
762 }
763
Greg Clayton061b79d2011-05-09 20:18:18 +0000764 RegisterInfo *reg_info = location_value->GetRegisterInfo();
Sean Callanan50339fe2011-03-04 00:23:47 +0000765
Greg Clayton061b79d2011-05-09 20:18:18 +0000766 if (!reg_info)
Sean Callanan50339fe2011-03-04 00:23:47 +0000767 {
768 err.SetErrorStringWithFormat("Couldn't get the register information for %s", object_name.GetCString());
769 return false;
770 }
771
Greg Clayton061b79d2011-05-09 20:18:18 +0000772 RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
Sean Callanan50339fe2011-03-04 00:23:47 +0000773
Greg Clayton061b79d2011-05-09 20:18:18 +0000774 if (!reg_ctx)
Sean Callanan50339fe2011-03-04 00:23:47 +0000775 {
Greg Clayton061b79d2011-05-09 20:18:18 +0000776 err.SetErrorStringWithFormat("Couldn't read register context to read %s from %s", object_name.GetCString(), reg_info->name);
Sean Callanan50339fe2011-03-04 00:23:47 +0000777 return false;
778 }
779
Greg Clayton061b79d2011-05-09 20:18:18 +0000780 uint32_t register_number = reg_info->kinds[lldb::eRegisterKindLLDB];
Sean Callanan50339fe2011-03-04 00:23:47 +0000781
Greg Clayton061b79d2011-05-09 20:18:18 +0000782 object_ptr = reg_ctx->ReadRegisterAsUnsigned(register_number, 0x0);
Sean Callanan50339fe2011-03-04 00:23:47 +0000783
784 return true;
785 }
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000786 }
787}
788
789bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000790ClangExpressionDeclMap::Dematerialize
791(
Sean Callananaa301c42010-12-03 01:38:59 +0000792 ExecutionContext &exe_ctx,
Greg Clayton427f2902010-12-14 02:59:59 +0000793 ClangExpressionVariableSP &result_sp,
Sean Callanan0ddf8062011-05-09 22:04:36 +0000794 lldb::addr_t stack_frame_top,
795 lldb::addr_t stack_frame_bottom,
Greg Clayton8de27c72010-10-15 22:48:33 +0000796 Error &err
797)
Sean Callananf328c9f2010-07-20 23:31:16 +0000798{
Sean Callanan0ddf8062011-05-09 22:04:36 +0000799 return DoMaterialize(true, exe_ctx, stack_frame_top, stack_frame_bottom, &result_sp, err);
Sean Callananaa301c42010-12-03 01:38:59 +0000800
801 DidDematerialize();
802}
803
804void
805ClangExpressionDeclMap::DidDematerialize()
806{
807 if (m_material_vars.get())
808 {
809 if (m_material_vars->m_materialized_location)
810 {
811 //#define SINGLE_STEP_EXPRESSIONS
812
813#ifndef SINGLE_STEP_EXPRESSIONS
814 m_material_vars->m_process->DeallocateMemory(m_material_vars->m_materialized_location);
815#endif
816 m_material_vars->m_materialized_location = 0;
817 }
818
819 DisableMaterialVars();
820 }
Sean Callananf328c9f2010-07-20 23:31:16 +0000821}
822
Sean Callanan32824aa2010-07-23 22:19:18 +0000823bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000824ClangExpressionDeclMap::DumpMaterializedStruct
825(
Sean Callananaa301c42010-12-03 01:38:59 +0000826 ExecutionContext &exe_ctx,
Greg Clayton8de27c72010-10-15 22:48:33 +0000827 Stream &s,
828 Error &err
829)
Sean Callanan32824aa2010-07-23 22:19:18 +0000830{
Sean Callananaa301c42010-12-03 01:38:59 +0000831 assert (m_struct_vars.get());
832 assert (m_material_vars.get());
833
834 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan32824aa2010-07-23 22:19:18 +0000835 {
836 err.SetErrorString("Structure hasn't been laid out yet");
837 return false;
838 }
839
Sean Callananaa301c42010-12-03 01:38:59 +0000840 if (!exe_ctx.process)
Sean Callanan32824aa2010-07-23 22:19:18 +0000841 {
842 err.SetErrorString("Couldn't find the process");
843 return false;
844 }
845
Sean Callananaa301c42010-12-03 01:38:59 +0000846 if (!exe_ctx.target)
Sean Callanan32824aa2010-07-23 22:19:18 +0000847 {
848 err.SetErrorString("Couldn't find the target");
849 return false;
850 }
851
Sean Callanan33711022010-12-07 10:00:20 +0000852 if (!m_material_vars->m_materialized_location)
853 {
854 err.SetErrorString("No materialized location");
855 return false;
856 }
857
Greg Claytonc0fa5332011-05-22 22:46:53 +0000858 lldb::DataBufferSP data_sp(new DataBufferHeap(m_struct_vars->m_struct_size, 0));
Sean Callanan32824aa2010-07-23 22:19:18 +0000859
860 Error error;
Greg Claytonc0fa5332011-05-22 22:46:53 +0000861 if (exe_ctx.process->ReadMemory (m_material_vars->m_materialized_location,
862 data_sp->GetBytes(),
863 data_sp->GetByteSize(), error) != data_sp->GetByteSize())
Sean Callanan32824aa2010-07-23 22:19:18 +0000864 {
865 err.SetErrorStringWithFormat ("Couldn't read struct from the target: %s", error.AsCString());
866 return false;
867 }
868
Greg Claytonc0fa5332011-05-22 22:46:53 +0000869 DataExtractor extractor(data_sp, exe_ctx.process->GetByteOrder(), exe_ctx.target->GetArchitecture().GetAddressByteSize());
Sean Callanan32824aa2010-07-23 22:19:18 +0000870
Greg Clayton427f2902010-12-14 02:59:59 +0000871 for (size_t member_idx = 0, num_members = m_struct_members.GetSize();
872 member_idx < num_members;
873 ++member_idx)
Sean Callanan32824aa2010-07-23 22:19:18 +0000874 {
Greg Clayton427f2902010-12-14 02:59:59 +0000875 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_idx));
Sean Callanan32824aa2010-07-23 22:19:18 +0000876
Greg Clayton427f2902010-12-14 02:59:59 +0000877 if (!member_sp)
878 return false;
879
880 s.Printf("[%s]\n", member_sp->GetName().GetCString());
Sean Callanan8c127202010-08-23 23:09:38 +0000881
Greg Clayton427f2902010-12-14 02:59:59 +0000882 if (!member_sp->m_jit_vars.get())
Sean Callanan8c127202010-08-23 23:09:38 +0000883 return false;
884
Greg Clayton427f2902010-12-14 02:59:59 +0000885 extractor.Dump (&s, // stream
886 member_sp->m_jit_vars->m_offset, // offset
887 lldb::eFormatBytesWithASCII, // format
888 1, // byte size of individual entries
889 member_sp->m_jit_vars->m_size, // number of entries
890 16, // entries per line
891 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, // address to print
892 0, // bit size (bitfields only; 0 means ignore)
893 0); // bit alignment (bitfields only; 0 means ignore)
Sean Callanan32824aa2010-07-23 22:19:18 +0000894
895 s.PutChar('\n');
896 }
897
898 return true;
899}
900
Sean Callananf328c9f2010-07-20 23:31:16 +0000901bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000902ClangExpressionDeclMap::DoMaterialize
903(
904 bool dematerialize,
Sean Callananaa301c42010-12-03 01:38:59 +0000905 ExecutionContext &exe_ctx,
Sean Callanan0ddf8062011-05-09 22:04:36 +0000906 lldb::addr_t stack_frame_top,
907 lldb::addr_t stack_frame_bottom,
Greg Clayton427f2902010-12-14 02:59:59 +0000908 lldb::ClangExpressionVariableSP *result_sp_ptr,
Greg Clayton8de27c72010-10-15 22:48:33 +0000909 Error &err
910)
Sean Callanan810f22d2010-07-16 00:09:46 +0000911{
Greg Clayton427f2902010-12-14 02:59:59 +0000912 if (result_sp_ptr)
913 result_sp_ptr->reset();
914
Sean Callananaa301c42010-12-03 01:38:59 +0000915 assert (m_struct_vars.get());
916
Greg Claytone005f2c2010-11-06 01:53:30 +0000917 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan82b74c82010-08-12 01:56:52 +0000918
Sean Callananaa301c42010-12-03 01:38:59 +0000919 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan810f22d2010-07-16 00:09:46 +0000920 {
921 err.SetErrorString("Structure hasn't been laid out yet");
922 return LLDB_INVALID_ADDRESS;
923 }
924
Sean Callananaa301c42010-12-03 01:38:59 +0000925 if (!exe_ctx.frame)
Sean Callanan45839272010-07-24 01:37:44 +0000926 {
927 err.SetErrorString("Received null execution frame");
928 return LLDB_INVALID_ADDRESS;
929 }
930
Greg Clayton427f2902010-12-14 02:59:59 +0000931 ClangPersistentVariables &persistent_vars = exe_ctx.target->GetPersistentVariables();
Sean Callananaa301c42010-12-03 01:38:59 +0000932
933 if (!m_struct_vars->m_struct_size)
Sean Callanane8a59a82010-09-13 21:34:21 +0000934 {
935 if (log)
936 log->PutCString("Not bothering to allocate a struct because no arguments are needed");
937
Sean Callanan9b6898f2011-07-30 02:42:06 +0000938 m_material_vars->m_allocated_area = NULL;
Sean Callanane8a59a82010-09-13 21:34:21 +0000939
940 return true;
941 }
942
Sean Callananaa301c42010-12-03 01:38:59 +0000943 const SymbolContext &sym_ctx(exe_ctx.frame->GetSymbolContext(lldb::eSymbolContextEverything));
Sean Callanan810f22d2010-07-16 00:09:46 +0000944
Sean Callananf328c9f2010-07-20 23:31:16 +0000945 if (!dematerialize)
Sean Callanan810f22d2010-07-16 00:09:46 +0000946 {
Sean Callananaa301c42010-12-03 01:38:59 +0000947 if (m_material_vars->m_materialized_location)
Sean Callananf328c9f2010-07-20 23:31:16 +0000948 {
Sean Callananaa301c42010-12-03 01:38:59 +0000949 exe_ctx.process->DeallocateMemory(m_material_vars->m_materialized_location);
950 m_material_vars->m_materialized_location = 0;
Sean Callananf328c9f2010-07-20 23:31:16 +0000951 }
952
Sean Callanan7a60b942010-10-08 01:58:41 +0000953 if (log)
954 log->PutCString("Allocating memory for materialized argument struct");
955
Sean Callananaa301c42010-12-03 01:38:59 +0000956 lldb::addr_t mem = exe_ctx.process->AllocateMemory(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size,
957 lldb::ePermissionsReadable | lldb::ePermissionsWritable,
958 err);
Sean Callananf328c9f2010-07-20 23:31:16 +0000959
960 if (mem == LLDB_INVALID_ADDRESS)
961 return false;
962
Sean Callananaa301c42010-12-03 01:38:59 +0000963 m_material_vars->m_allocated_area = mem;
Sean Callanan810f22d2010-07-16 00:09:46 +0000964 }
965
Sean Callananaa301c42010-12-03 01:38:59 +0000966 m_material_vars->m_materialized_location = m_material_vars->m_allocated_area;
Sean Callananf328c9f2010-07-20 23:31:16 +0000967
Sean Callananaa301c42010-12-03 01:38:59 +0000968 if (m_material_vars->m_materialized_location % m_struct_vars->m_struct_alignment)
969 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 +0000970
Greg Clayton427f2902010-12-14 02:59:59 +0000971 for (uint64_t member_index = 0, num_members = m_struct_members.GetSize();
Sean Callanan8c127202010-08-23 23:09:38 +0000972 member_index < num_members;
973 ++member_index)
Sean Callanan810f22d2010-07-16 00:09:46 +0000974 {
Greg Clayton427f2902010-12-14 02:59:59 +0000975 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
Sean Callanan810f22d2010-07-16 00:09:46 +0000976
Greg Claytona875b642011-01-09 21:07:35 +0000977 if (m_found_entities.ContainsVariable (member_sp))
Sean Callanan8c127202010-08-23 23:09:38 +0000978 {
Greg Claytona875b642011-01-09 21:07:35 +0000979 RegisterInfo *reg_info = member_sp->GetRegisterInfo ();
Greg Clayton427f2902010-12-14 02:59:59 +0000980 if (reg_info)
Sean Callanan1ddd9fe2010-11-30 00:27:43 +0000981 {
982 // This is a register variable
983
Sean Callananaa301c42010-12-03 01:38:59 +0000984 RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
Sean Callanan1ddd9fe2010-11-30 00:27:43 +0000985
986 if (!reg_ctx)
987 return false;
988
Greg Clayton427f2902010-12-14 02:59:59 +0000989 if (!DoMaterializeOneRegister (dematerialize,
990 exe_ctx,
991 *reg_ctx,
992 *reg_info,
993 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
994 err))
Sean Callanan1ddd9fe2010-11-30 00:27:43 +0000995 return false;
996 }
997 else
998 {
Greg Clayton427f2902010-12-14 02:59:59 +0000999 if (!member_sp->m_jit_vars.get())
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001000 return false;
1001
Greg Clayton427f2902010-12-14 02:59:59 +00001002 if (!DoMaterializeOneVariable (dematerialize,
1003 exe_ctx,
Sean Callanan6a925532011-01-13 08:53:35 +00001004 sym_ctx,
1005 member_sp,
Greg Clayton427f2902010-12-14 02:59:59 +00001006 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
1007 err))
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001008 return false;
1009 }
Sean Callanan8c127202010-08-23 23:09:38 +00001010 }
Sean Callanan8c127202010-08-23 23:09:38 +00001011 else
1012 {
Greg Claytona875b642011-01-09 21:07:35 +00001013 // No need to look for presistent variables if the name doesn't start
1014 // with with a '$' character...
1015 if (member_sp->GetName().AsCString ("!")[0] == '$' && persistent_vars.ContainsVariable(member_sp))
1016 {
Sean Callanan6a925532011-01-13 08:53:35 +00001017
Greg Claytona875b642011-01-09 21:07:35 +00001018 if (member_sp->GetName() == m_struct_vars->m_result_name)
1019 {
Greg Claytona875b642011-01-09 21:07:35 +00001020 if (log)
1021 log->PutCString("Found result member in the struct");
Sean Callanan6a925532011-01-13 08:53:35 +00001022
Greg Claytona875b642011-01-09 21:07:35 +00001023 if (result_sp_ptr)
1024 *result_sp_ptr = member_sp;
Sean Callanan6a925532011-01-13 08:53:35 +00001025
Greg Claytona875b642011-01-09 21:07:35 +00001026 }
1027
1028 if (!DoMaterializeOnePersistentVariable (dematerialize,
Sean Callanan6a925532011-01-13 08:53:35 +00001029 exe_ctx,
Greg Claytona875b642011-01-09 21:07:35 +00001030 member_sp,
Sean Callanan0ddf8062011-05-09 22:04:36 +00001031 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
1032 stack_frame_top,
1033 stack_frame_bottom,
Greg Claytona875b642011-01-09 21:07:35 +00001034 err))
1035 return false;
1036 }
1037 else
1038 {
1039 err.SetErrorStringWithFormat("Unexpected variable %s", member_sp->GetName().GetCString());
1040 return false;
1041 }
Sean Callanan8c127202010-08-23 23:09:38 +00001042 }
Sean Callanan810f22d2010-07-16 00:09:46 +00001043 }
1044
Sean Callananf328c9f2010-07-20 23:31:16 +00001045 return true;
1046}
1047
Sean Callanana48fe162010-08-11 03:57:18 +00001048bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001049ClangExpressionDeclMap::DoMaterializeOnePersistentVariable
1050(
1051 bool dematerialize,
1052 ExecutionContext &exe_ctx,
Greg Clayton427f2902010-12-14 02:59:59 +00001053 ClangExpressionVariableSP &var_sp,
Greg Clayton8de27c72010-10-15 22:48:33 +00001054 lldb::addr_t addr,
Sean Callanan0ddf8062011-05-09 22:04:36 +00001055 lldb::addr_t stack_frame_top,
1056 lldb::addr_t stack_frame_bottom,
Greg Clayton8de27c72010-10-15 22:48:33 +00001057 Error &err
1058)
Sean Callananaa301c42010-12-03 01:38:59 +00001059{
Sean Callanan6a925532011-01-13 08:53:35 +00001060 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1061
Greg Clayton427f2902010-12-14 02:59:59 +00001062 if (!var_sp)
Sean Callanana48fe162010-08-11 03:57:18 +00001063 {
Greg Clayton427f2902010-12-14 02:59:59 +00001064 err.SetErrorString("Invalid persistent variable");
Sean Callanana48fe162010-08-11 03:57:18 +00001065 return LLDB_INVALID_ADDRESS;
1066 }
1067
Greg Clayton427f2902010-12-14 02:59:59 +00001068 const size_t pvar_byte_size = var_sp->GetByteSize();
Sean Callanana6223432010-08-20 01:02:30 +00001069
Greg Clayton427f2902010-12-14 02:59:59 +00001070 uint8_t *pvar_data = var_sp->GetValueBytes();
1071 if (pvar_data == NULL)
Sean Callanana6223432010-08-20 01:02:30 +00001072 return false;
1073
Sean Callanana48fe162010-08-11 03:57:18 +00001074 Error error;
1075
Sean Callanan6a925532011-01-13 08:53:35 +00001076 lldb::addr_t mem; // The address of a spare memory area used to hold the persistent variable.
1077
Sean Callanana48fe162010-08-11 03:57:18 +00001078 if (dematerialize)
1079 {
Sean Callanan6a925532011-01-13 08:53:35 +00001080 if (log)
1081 log->Printf("Dematerializing persistent variable with flags 0x%hx", var_sp->m_flags);
1082
1083 if ((var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) ||
1084 (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference))
Sean Callanana48fe162010-08-11 03:57:18 +00001085 {
Sean Callanan6a925532011-01-13 08:53:35 +00001086 // Get the location of the target out of the struct.
1087
1088 Error read_error;
Greg Claytonc0fa5332011-05-22 22:46:53 +00001089 mem = exe_ctx.process->ReadPointerFromMemory (addr, read_error);
Sean Callanan6a925532011-01-13 08:53:35 +00001090
1091 if (mem == LLDB_INVALID_ADDRESS)
1092 {
1093 err.SetErrorStringWithFormat("Couldn't read address of %s from struct: %s", var_sp->GetName().GetCString(), error.AsCString());
1094 return false;
1095 }
1096
1097 if (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference &&
1098 !var_sp->m_live_sp)
1099 {
1100 // If the reference comes from the program, then the ClangExpressionVariable's
1101 // live variable data hasn't been set up yet. Do this now.
1102
Jim Ingham47da8102011-04-22 23:53:53 +00001103 var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope (),
1104 var_sp->GetTypeFromUser().GetASTContext(),
1105 var_sp->GetTypeFromUser().GetOpaqueQualType(),
1106 var_sp->GetName(),
1107 mem,
1108 eAddressTypeLoad,
1109 pvar_byte_size);
Sean Callanan6a925532011-01-13 08:53:35 +00001110 }
1111
1112 if (!var_sp->m_live_sp)
1113 {
1114 err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", var_sp->GetName().GetCString());
1115 return false;
1116 }
1117
Greg Claytonb3448432011-03-24 21:19:54 +00001118 if (var_sp->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
Sean Callanan6a925532011-01-13 08:53:35 +00001119 {
1120 err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", var_sp->GetName().GetCString());
1121 return false;
1122 }
1123
Sean Callanan97678d12011-01-13 21:23:32 +00001124 if (var_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry ||
1125 var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
Sean Callanan6a925532011-01-13 08:53:35 +00001126 {
1127 mem = var_sp->m_live_sp->GetValue().GetScalar().ULongLong();
1128
1129 if (log)
1130 log->Printf("Dematerializing %s from 0x%llx", var_sp->GetName().GetCString(), (uint64_t)mem);
1131
1132 // Read the contents of the spare memory area
Sean Callanan0ddf8062011-05-09 22:04:36 +00001133
Sean Callanan6a925532011-01-13 08:53:35 +00001134 var_sp->ValueUpdated ();
1135 if (exe_ctx.process->ReadMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
1136 {
1137 err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString());
1138 return false;
1139 }
1140
Sean Callanan0ddf8062011-05-09 22:04:36 +00001141 if (stack_frame_top != LLDB_INVALID_ADDRESS &&
1142 stack_frame_bottom != LLDB_INVALID_ADDRESS &&
1143 mem >= stack_frame_bottom &&
1144 mem <= stack_frame_top)
1145 {
1146 // If the variable is resident in the stack frame created by the expression,
1147 // then it cannot be relied upon to stay around. We treat it as needing
1148 // reallocation.
1149
1150 var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
1151 var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
1152 var_sp->m_flags &= ~ClangExpressionVariable::EVIsProgramReference;
1153 }
1154
Sean Callanan6a925532011-01-13 08:53:35 +00001155 var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsFreezeDry;
1156 }
1157
1158 if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation &&
1159 !(var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget))
1160 {
1161 if (m_keep_result_in_memory)
1162 {
1163 var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget;
1164 }
1165 else
1166 {
1167 Error deallocate_error = exe_ctx.process->DeallocateMemory(mem);
1168
1169 if (!err.Success())
1170 {
1171 err.SetErrorStringWithFormat ("Couldn't deallocate memory for %s: %s", var_sp->GetName().GetCString(), deallocate_error.AsCString());
1172 return false;
1173 }
1174 }
1175 }
1176 }
1177 else
1178 {
1179 err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
Sean Callanana48fe162010-08-11 03:57:18 +00001180 return false;
1181 }
1182 }
1183 else
1184 {
Sean Callanan6a925532011-01-13 08:53:35 +00001185 if (log)
1186 log->Printf("Materializing persistent variable with flags 0x%hx", var_sp->m_flags);
1187
1188 if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation)
Sean Callanana48fe162010-08-11 03:57:18 +00001189 {
Sean Callanan6a925532011-01-13 08:53:35 +00001190 // Allocate a spare memory area to store the persistent variable's contents.
1191
1192 Error allocate_error;
1193
1194 mem = exe_ctx.process->AllocateMemory(pvar_byte_size,
1195 lldb::ePermissionsReadable | lldb::ePermissionsWritable,
1196 allocate_error);
1197
1198 if (mem == LLDB_INVALID_ADDRESS)
1199 {
1200 err.SetErrorStringWithFormat("Couldn't allocate a memory area to store %s: %s", var_sp->GetName().GetCString(), allocate_error.AsCString());
1201 return false;
1202 }
1203
1204 if (log)
1205 log->Printf("Allocated %s (0x%llx) sucessfully", var_sp->GetName().GetCString(), mem);
1206
1207 // Put the location of the spare memory into the live data of the ValueObject.
1208
Jim Ingham47da8102011-04-22 23:53:53 +00001209 var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
1210 var_sp->GetTypeFromUser().GetASTContext(),
1211 var_sp->GetTypeFromUser().GetOpaqueQualType(),
1212 var_sp->GetName(),
1213 mem,
1214 eAddressTypeLoad,
1215 pvar_byte_size);
Sean Callanan6a925532011-01-13 08:53:35 +00001216
1217 // Clear the flag if the variable will never be deallocated.
1218
1219 if (var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
1220 var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsAllocation;
1221
1222 // Write the contents of the variable to the area.
1223
1224 if (exe_ctx.process->WriteMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
1225 {
1226 err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString());
1227 return false;
1228 }
1229 }
1230
1231 if ((var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && var_sp->m_live_sp) ||
1232 var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated)
1233 {
Sean Callanan6a925532011-01-13 08:53:35 +00001234 // Now write the location of the area into the struct.
Sean Callanan6a925532011-01-13 08:53:35 +00001235 Error write_error;
Greg Claytonc0fa5332011-05-22 22:46:53 +00001236 if (!exe_ctx.process->WriteScalarToMemory (addr,
1237 var_sp->m_live_sp->GetValue().GetScalar(),
1238 exe_ctx.process->GetAddressByteSize(),
1239 write_error))
Sean Callanan6a925532011-01-13 08:53:35 +00001240 {
1241 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", var_sp->GetName().GetCString(), write_error.AsCString());
1242 return false;
1243 }
1244
1245 if (log)
Greg Claytonc0fa5332011-05-22 22:46:53 +00001246 log->Printf("Materialized %s into 0x%llx", var_sp->GetName().GetCString(), var_sp->m_live_sp->GetValue().GetScalar().ULongLong());
Sean Callanan6a925532011-01-13 08:53:35 +00001247 }
Sean Callanan696cf5f2011-05-07 01:06:41 +00001248 else if (!(var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference))
Sean Callanan6a925532011-01-13 08:53:35 +00001249 {
1250 err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
Sean Callanana48fe162010-08-11 03:57:18 +00001251 return false;
1252 }
1253 }
1254
1255 return true;
1256}
1257
Sean Callananf328c9f2010-07-20 23:31:16 +00001258bool
Greg Clayton8de27c72010-10-15 22:48:33 +00001259ClangExpressionDeclMap::DoMaterializeOneVariable
1260(
1261 bool dematerialize,
1262 ExecutionContext &exe_ctx,
1263 const SymbolContext &sym_ctx,
Sean Callanan6a925532011-01-13 08:53:35 +00001264 ClangExpressionVariableSP &expr_var,
Greg Clayton8de27c72010-10-15 22:48:33 +00001265 lldb::addr_t addr,
1266 Error &err
1267)
Sean Callananf328c9f2010-07-20 23:31:16 +00001268{
Greg Claytone005f2c2010-11-06 01:53:30 +00001269 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callananf328c9f2010-07-20 23:31:16 +00001270
Sean Callanan17c6a052010-10-05 20:18:48 +00001271 if (!exe_ctx.frame || !exe_ctx.process)
Sean Callanancc074622010-09-14 21:59:34 +00001272 return false;
1273
Sean Callanan6a925532011-01-13 08:53:35 +00001274 // Vital information about the value
1275
1276 const ConstString &name(expr_var->GetName());
1277 TypeFromUser type(expr_var->GetTypeFromUser());
1278
Sean Callanan696cf5f2011-05-07 01:06:41 +00001279 VariableSP var = FindVariableInScope (*exe_ctx.frame, name, &type);
Sean Callanan81974962011-05-08 02:21:26 +00001280 Symbol *sym = FindGlobalDataSymbol(*exe_ctx.target, name);
Sean Callananf328c9f2010-07-20 23:31:16 +00001281
Sean Callanan81974962011-05-08 02:21:26 +00001282 std::auto_ptr<lldb_private::Value> location_value;
1283
1284 if (var)
1285 {
1286 location_value.reset(GetVariableValue(exe_ctx,
1287 var,
1288 NULL));
1289 }
1290 else if (sym)
Sean Callananae9f7482011-07-07 23:05:43 +00001291 {
Sean Callanan81974962011-05-08 02:21:26 +00001292 location_value.reset(new Value);
1293
Greg Claytoncbc07cf2011-06-23 04:25:29 +00001294 addr_t location_load_addr = GetSymbolAddress(*exe_ctx.target, name);
Sean Callanan81974962011-05-08 02:21:26 +00001295
Greg Claytoncbc07cf2011-06-23 04:25:29 +00001296 if (location_load_addr == LLDB_INVALID_ADDRESS)
Sean Callanan81974962011-05-08 02:21:26 +00001297 {
1298 if (log)
Greg Claytonc0fa5332011-05-22 22:46:53 +00001299 err.SetErrorStringWithFormat ("Couldn't find value for global symbol %s",
1300 name.GetCString());
Sean Callanan81974962011-05-08 02:21:26 +00001301 }
1302
1303 location_value->SetValueType(Value::eValueTypeLoadAddress);
1304 location_value->GetScalar() = location_load_addr;
1305 }
1306 else
Sean Callananf328c9f2010-07-20 23:31:16 +00001307 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001308 err.SetErrorStringWithFormat ("Couldn't find %s with appropriate type",
1309 name.GetCString());
Sean Callananf328c9f2010-07-20 23:31:16 +00001310 return false;
1311 }
1312
Sean Callanan841026f2010-07-23 00:16:21 +00001313 if (log)
Sean Callananfb3058e2011-05-12 23:54:16 +00001314 {
1315 StreamString my_stream_string;
1316
1317 ClangASTType::DumpTypeDescription (type.GetASTContext(),
1318 type.GetOpaqueQualType(),
1319 &my_stream_string);
1320
Greg Claytonc0fa5332011-05-22 22:46:53 +00001321 log->Printf ("%s %s with type %s",
1322 dematerialize ? "Dematerializing" : "Materializing",
1323 name.GetCString(),
1324 my_stream_string.GetString().c_str());
Sean Callananfb3058e2011-05-12 23:54:16 +00001325 }
Sean Callananf328c9f2010-07-20 23:31:16 +00001326
1327 if (!location_value.get())
1328 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001329 err.SetErrorStringWithFormat("Couldn't get value for %s", name.GetCString());
Sean Callananf328c9f2010-07-20 23:31:16 +00001330 return false;
1331 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001332
1333 // The size of the type contained in addr
Sean Callananf328c9f2010-07-20 23:31:16 +00001334
Sean Callanan6a925532011-01-13 08:53:35 +00001335 size_t value_bit_size = ClangASTType::GetClangTypeBitWidth(type.GetASTContext(), type.GetOpaqueQualType());
1336 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 +00001337
1338 Value::ValueType value_type = location_value->GetValueType();
1339
1340 switch (value_type)
Sean Callananf328c9f2010-07-20 23:31:16 +00001341 {
Sean Callanan17c6a052010-10-05 20:18:48 +00001342 default:
Sean Callananf328c9f2010-07-20 23:31:16 +00001343 {
Sean Callanan17c6a052010-10-05 20:18:48 +00001344 StreamString ss;
1345
1346 location_value->Dump(&ss);
1347
Greg Claytonc0fa5332011-05-22 22:46:53 +00001348 err.SetErrorStringWithFormat ("%s has a value of unhandled type: %s",
1349 name.GetCString(),
1350 ss.GetString().c_str());
Sean Callananf328c9f2010-07-20 23:31:16 +00001351 return false;
1352 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001353 break;
1354 case Value::eValueTypeLoadAddress:
Sean Callananf328c9f2010-07-20 23:31:16 +00001355 {
Sean Callanan6a925532011-01-13 08:53:35 +00001356 if (!dematerialize)
Sean Callanan17c6a052010-10-05 20:18:48 +00001357 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001358 Error write_error;
Sean Callanan6a925532011-01-13 08:53:35 +00001359
Greg Claytonc0fa5332011-05-22 22:46:53 +00001360 if (!exe_ctx.process->WriteScalarToMemory (addr,
1361 location_value->GetScalar(),
1362 exe_ctx.process->GetAddressByteSize(),
1363 write_error))
Sean Callanan6a925532011-01-13 08:53:35 +00001364 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001365 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
1366 name.GetCString(),
1367 write_error.AsCString());
Sean Callanan6a925532011-01-13 08:53:35 +00001368 return false;
1369 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001370 }
Sean Callananf328c9f2010-07-20 23:31:16 +00001371 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001372 break;
1373 case Value::eValueTypeScalar:
1374 {
Greg Clayton6916e352010-11-13 03:52:47 +00001375 if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
Sean Callanan17c6a052010-10-05 20:18:48 +00001376 {
1377 StreamString ss;
Sean Callanan17c6a052010-10-05 20:18:48 +00001378 location_value->Dump(&ss);
1379
Greg Claytonc0fa5332011-05-22 22:46:53 +00001380 err.SetErrorStringWithFormat ("%s is a scalar of unhandled type: %s",
1381 name.GetCString(),
1382 ss.GetString().c_str());
Sean Callanan17c6a052010-10-05 20:18:48 +00001383 return false;
1384 }
1385
Greg Clayton061b79d2011-05-09 20:18:18 +00001386 RegisterInfo *reg_info = location_value->GetRegisterInfo();
Sean Callanan17c6a052010-10-05 20:18:48 +00001387
Greg Clayton061b79d2011-05-09 20:18:18 +00001388 if (!reg_info)
Sean Callanan17c6a052010-10-05 20:18:48 +00001389 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001390 err.SetErrorStringWithFormat ("Couldn't get the register information for %s",
1391 name.GetCString());
Sean Callanan17c6a052010-10-05 20:18:48 +00001392 return false;
1393 }
Sean Callanan17c6a052010-10-05 20:18:48 +00001394
Greg Clayton061b79d2011-05-09 20:18:18 +00001395 RegisterValue reg_value;
1396
1397 RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
1398
1399 if (!reg_ctx)
Sean Callanan17c6a052010-10-05 20:18:48 +00001400 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001401 err.SetErrorStringWithFormat ("Couldn't read register context to read %s from %s",
1402 name.GetCString(),
1403 reg_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001404 return false;
1405 }
1406
Greg Clayton061b79d2011-05-09 20:18:18 +00001407 uint32_t register_byte_size = reg_info->byte_size;
Sean Callanan17c6a052010-10-05 20:18:48 +00001408
1409 if (dematerialize)
1410 {
Sean Callanan6a925532011-01-13 08:53:35 +00001411 // Get the location of the spare memory area out of the variable's live data.
1412
1413 if (!expr_var->m_live_sp)
1414 {
1415 err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", name.GetCString());
1416 return false;
1417 }
1418
Greg Claytonb3448432011-03-24 21:19:54 +00001419 if (expr_var->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
Sean Callanan6a925532011-01-13 08:53:35 +00001420 {
1421 err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", name.GetCString());
1422 return false;
1423 }
1424
Greg Claytonc0fa5332011-05-22 22:46:53 +00001425 Scalar &reg_addr = expr_var->m_live_sp->GetValue().GetScalar();
Sean Callanan6a925532011-01-13 08:53:35 +00001426
Greg Claytonc0fa5332011-05-22 22:46:53 +00001427 err = reg_ctx->ReadRegisterValueFromMemory (reg_info,
1428 reg_addr.ULongLong(),
1429 value_byte_size,
1430 reg_value);
Greg Clayton061b79d2011-05-09 20:18:18 +00001431 if (err.Fail())
Sean Callanan17c6a052010-10-05 20:18:48 +00001432 return false;
Greg Clayton061b79d2011-05-09 20:18:18 +00001433
1434 if (!reg_ctx->WriteRegister (reg_info, reg_value))
Sean Callanan17c6a052010-10-05 20:18:48 +00001435 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001436 err.SetErrorStringWithFormat ("Couldn't write %s to register %s",
1437 name.GetCString(),
1438 reg_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001439 return false;
1440 }
Sean Callanan6a925532011-01-13 08:53:35 +00001441
1442 // Deallocate the spare area and clear the variable's live data.
1443
Greg Claytonc0fa5332011-05-22 22:46:53 +00001444 Error deallocate_error = exe_ctx.process->DeallocateMemory(reg_addr.ULongLong());
Sean Callanan6a925532011-01-13 08:53:35 +00001445
1446 if (!deallocate_error.Success())
1447 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001448 err.SetErrorStringWithFormat ("Couldn't deallocate spare memory area for %s: %s",
1449 name.GetCString(),
1450 deallocate_error.AsCString());
Sean Callanan6a925532011-01-13 08:53:35 +00001451 return false;
1452 }
1453
1454 expr_var->m_live_sp.reset();
Sean Callanan17c6a052010-10-05 20:18:48 +00001455 }
1456 else
1457 {
Sean Callanan6a925532011-01-13 08:53:35 +00001458 // Allocate a spare memory area to place the register's contents into. This memory area will be pointed to by the slot in the
1459 // struct.
1460
1461 Error allocate_error;
1462
Greg Claytonc0fa5332011-05-22 22:46:53 +00001463 Scalar reg_addr (exe_ctx.process->AllocateMemory (value_byte_size,
1464 lldb::ePermissionsReadable | lldb::ePermissionsWritable,
1465 allocate_error));
Sean Callanan6a925532011-01-13 08:53:35 +00001466
Greg Claytonc0fa5332011-05-22 22:46:53 +00001467 if (reg_addr.ULongLong() == LLDB_INVALID_ADDRESS)
Sean Callanan6a925532011-01-13 08:53:35 +00001468 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001469 err.SetErrorStringWithFormat ("Couldn't allocate a memory area to store %s: %s",
1470 name.GetCString(),
1471 allocate_error.AsCString());
Sean Callanan6a925532011-01-13 08:53:35 +00001472 return false;
1473 }
1474
1475 // Put the location of the spare memory into the live data of the ValueObject.
1476
Jim Ingham47da8102011-04-22 23:53:53 +00001477 expr_var->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
1478 type.GetASTContext(),
1479 type.GetOpaqueQualType(),
1480 name,
Greg Claytonc0fa5332011-05-22 22:46:53 +00001481 reg_addr.ULongLong(),
Jim Ingham47da8102011-04-22 23:53:53 +00001482 eAddressTypeLoad,
1483 value_byte_size);
Sean Callanan6a925532011-01-13 08:53:35 +00001484
1485 // Now write the location of the area into the struct.
1486
1487 Error write_error;
Greg Claytonc0fa5332011-05-22 22:46:53 +00001488
1489 if (!exe_ctx.process->WriteScalarToMemory (addr,
1490 reg_addr,
1491 exe_ctx.process->GetAddressByteSize(),
1492 write_error))
Sean Callanan6a925532011-01-13 08:53:35 +00001493 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001494 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
1495 name.GetCString(),
1496 write_error.AsCString());
Sean Callanan6a925532011-01-13 08:53:35 +00001497 return false;
1498 }
1499
Sean Callanan6a925532011-01-13 08:53:35 +00001500 if (value_byte_size > register_byte_size)
Sean Callanan17c6a052010-10-05 20:18:48 +00001501 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001502 err.SetErrorStringWithFormat ("%s is too big to store in %s",
1503 name.GetCString(),
1504 reg_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001505 return false;
1506 }
Greg Clayton061b79d2011-05-09 20:18:18 +00001507
1508 RegisterValue reg_value;
1509
1510 if (!reg_ctx->ReadRegister (reg_info, reg_value))
Sean Callanan17c6a052010-10-05 20:18:48 +00001511 {
Greg Claytonc0fa5332011-05-22 22:46:53 +00001512 err.SetErrorStringWithFormat ("Couldn't read %s from %s",
1513 name.GetCString(),
1514 reg_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001515 return false;
1516 }
1517
Greg Claytonc0fa5332011-05-22 22:46:53 +00001518 err = reg_ctx->WriteRegisterValueToMemory (reg_info,
1519 reg_addr.ULongLong(),
1520 value_byte_size,
1521 reg_value);
Greg Clayton061b79d2011-05-09 20:18:18 +00001522 if (err.Fail())
Sean Callanan17c6a052010-10-05 20:18:48 +00001523 return false;
Sean Callanan17c6a052010-10-05 20:18:48 +00001524 }
1525 }
Sean Callananf328c9f2010-07-20 23:31:16 +00001526 }
1527
1528 return true;
Sean Callanan810f22d2010-07-16 00:09:46 +00001529}
1530
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001531bool
1532ClangExpressionDeclMap::DoMaterializeOneRegister
1533(
1534 bool dematerialize,
1535 ExecutionContext &exe_ctx,
1536 RegisterContext &reg_ctx,
Greg Claytonb3448432011-03-24 21:19:54 +00001537 const RegisterInfo &reg_info,
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001538 lldb::addr_t addr,
1539 Error &err
1540)
1541{
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001542 uint32_t register_byte_size = reg_info.byte_size;
Greg Clayton061b79d2011-05-09 20:18:18 +00001543 RegisterValue reg_value;
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001544 if (dematerialize)
1545 {
Greg Clayton061b79d2011-05-09 20:18:18 +00001546 Error read_error (reg_ctx.ReadRegisterValueFromMemory(&reg_info, addr, register_byte_size, reg_value));
1547 if (read_error.Fail())
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001548 {
Greg Claytonbdcb6ab2011-01-25 23:55:37 +00001549 err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", reg_info.name, read_error.AsCString());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001550 return false;
1551 }
1552
Greg Clayton061b79d2011-05-09 20:18:18 +00001553 if (!reg_ctx.WriteRegister (&reg_info, reg_value))
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001554 {
Greg Clayton061b79d2011-05-09 20:18:18 +00001555 err.SetErrorStringWithFormat("Couldn't write register %s (dematerialize)", reg_info.name);
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001556 return false;
1557 }
1558 }
1559 else
1560 {
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001561
Greg Clayton061b79d2011-05-09 20:18:18 +00001562 if (!reg_ctx.ReadRegister(&reg_info, reg_value))
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001563 {
Greg Clayton061b79d2011-05-09 20:18:18 +00001564 err.SetErrorStringWithFormat("Couldn't read %s (materialize)", reg_info.name);
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001565 return false;
1566 }
1567
Greg Clayton061b79d2011-05-09 20:18:18 +00001568 Error write_error (reg_ctx.WriteRegisterValueToMemory(&reg_info, addr, register_byte_size, reg_value));
1569 if (write_error.Fail())
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001570 {
Greg Clayton061b79d2011-05-09 20:18:18 +00001571 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", write_error.AsCString());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001572 return false;
1573 }
1574 }
1575
1576 return true;
1577}
1578
Sean Callanan696cf5f2011-05-07 01:06:41 +00001579lldb::VariableSP
Greg Clayton8de27c72010-10-15 22:48:33 +00001580ClangExpressionDeclMap::FindVariableInScope
1581(
1582 StackFrame &frame,
1583 const ConstString &name,
1584 TypeFromUser *type
1585)
Sean Callananaa301c42010-12-03 01:38:59 +00001586{
Greg Claytone005f2c2010-11-06 01:53:30 +00001587 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanancc074622010-09-14 21:59:34 +00001588
Sean Callananf8b468e2011-08-06 00:28:14 +00001589 ValueObjectSP valobj;
1590 VariableSP var_sp;
1591 Error err;
Sean Callanancc074622010-09-14 21:59:34 +00001592
Sean Callananf8b468e2011-08-06 00:28:14 +00001593 valobj = frame.GetValueForVariableExpressionPath(name.GetCString(),
1594 eNoDynamicValues,
1595 StackFrame::eExpressionPathOptionCheckPtrVsMember,
1596 var_sp,
1597 err);
Greg Clayton3bc52d02010-11-14 22:13:40 +00001598
Sean Callananf8b468e2011-08-06 00:28:14 +00001599 if (!err.Success() ||
1600 !var_sp ||
Sean Callananae9f7482011-07-07 23:05:43 +00001601 !var_sp->IsInScope(&frame) ||
1602 !var_sp->LocationIsValidForFrame (&frame))
1603 return lldb::VariableSP();
Greg Clayton3bc52d02010-11-14 22:13:40 +00001604
1605 if (var_sp && type)
1606 {
1607 if (type->GetASTContext() == var_sp->GetType()->GetClangAST())
1608 {
Greg Clayton04c9c7b2011-02-16 23:00:21 +00001609 if (!ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType()))
Sean Callanan696cf5f2011-05-07 01:06:41 +00001610 return lldb::VariableSP();
Greg Clayton3bc52d02010-11-14 22:13:40 +00001611 }
1612 else
1613 {
1614 if (log)
1615 log->PutCString("Skipping a candidate variable because of different AST contexts");
Sean Callanan696cf5f2011-05-07 01:06:41 +00001616 return lldb::VariableSP();
Greg Clayton3bc52d02010-11-14 22:13:40 +00001617 }
Sean Callanancc074622010-09-14 21:59:34 +00001618 }
Greg Clayton3bc52d02010-11-14 22:13:40 +00001619
Sean Callanan696cf5f2011-05-07 01:06:41 +00001620 return var_sp;
Sean Callanancc074622010-09-14 21:59:34 +00001621}
Sean Callanan336a0002010-07-17 00:43:37 +00001622
Sean Callanan81974962011-05-08 02:21:26 +00001623Symbol *
1624ClangExpressionDeclMap::FindGlobalDataSymbol
1625(
1626 Target &target,
1627 const ConstString &name
1628)
1629{
1630 SymbolContextList sc_list;
1631
1632 target.GetImages().FindSymbolsWithNameAndType(name,
1633 eSymbolTypeData,
1634 sc_list);
1635
1636 if (sc_list.GetSize())
1637 {
1638 SymbolContext sym_ctx;
1639 sc_list.GetContextAtIndex(0, sym_ctx);
1640
1641 return sym_ctx.symbol;
1642 }
1643
1644 return NULL;
1645}
1646
Chris Lattner24943d22010-06-08 16:52:24 +00001647// Interface for ClangASTSource
1648void
Greg Claytone5748d82010-11-09 23:46:37 +00001649ClangExpressionDeclMap::GetDecls (NameSearchContext &context, const ConstString &name)
Chris Lattner24943d22010-06-08 16:52:24 +00001650{
Sean Callananaa301c42010-12-03 01:38:59 +00001651 assert (m_struct_vars.get());
1652 assert (m_parser_vars.get());
1653
Greg Claytone005f2c2010-11-06 01:53:30 +00001654 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001655
Sean Callanan810f22d2010-07-16 00:09:46 +00001656 if (log)
Greg Clayton8de27c72010-10-15 22:48:33 +00001657 log->Printf("Hunting for a definition for '%s'", name.GetCString());
Chris Lattner24943d22010-06-08 16:52:24 +00001658
1659 // Back out in all cases where we're not fully initialized
Sean Callananaa301c42010-12-03 01:38:59 +00001660 if (m_parser_vars->m_exe_ctx->frame == NULL)
Chris Lattner24943d22010-06-08 16:52:24 +00001661 return;
Sean Callananee8fc722010-11-19 20:20:02 +00001662
Sean Callananaa301c42010-12-03 01:38:59 +00001663 if (m_parser_vars->m_ignore_lookups)
Sean Callananee8fc722010-11-19 20:20:02 +00001664 {
1665 if (log)
1666 log->Printf("Ignoring a query during an import");
1667 return;
1668 }
Greg Claytone6d72ca2011-06-25 00:44:06 +00001669
1670 do
1671 {
1672 if (isa<TranslationUnitDecl>(context.m_decl_context))
1673 break;
1674
Sean Callanan9b6898f2011-07-30 02:42:06 +00001675 if (!isa<NamespaceDecl>(context.m_decl_context))
Greg Claytone6d72ca2011-06-25 00:44:06 +00001676 return;
1677
Sean Callanan9b6898f2011-07-30 02:42:06 +00001678 const Decl *context_decl = dyn_cast<Decl>(context.m_decl_context);
1679
1680 if (log)
1681 log->Printf("Searching for '%s' in a '%s'", name.GetCString(), context_decl->getDeclKindName());
1682
1683 Decl *original_decl = NULL;
1684 ASTContext *original_ctx = NULL;
1685
1686 if (!m_parser_vars->GetASTImporter(context.GetASTContext())->ResolveDeclOrigin(context_decl, &original_decl, &original_ctx))
1687 break;
1688
1689 if (TagDecl *original_tag_decl = dyn_cast<TagDecl>(original_decl))
Greg Claytone6d72ca2011-06-25 00:44:06 +00001690 {
Sean Callanan9b6898f2011-07-30 02:42:06 +00001691 ExternalASTSource *external_source = original_ctx->getExternalSource();
Greg Claytone6d72ca2011-06-25 00:44:06 +00001692
Sean Callanan9b6898f2011-07-30 02:42:06 +00001693 if (!external_source)
Greg Claytone6d72ca2011-06-25 00:44:06 +00001694 break;
Greg Claytone6d72ca2011-06-25 00:44:06 +00001695
Sean Callanan9b6898f2011-07-30 02:42:06 +00001696 if (!original_tag_decl)
1697 break;
Greg Claytone6d72ca2011-06-25 00:44:06 +00001698
Sean Callanan9b6898f2011-07-30 02:42:06 +00001699 external_source->CompleteType (original_tag_decl);
1700 }
1701
1702 DeclContext *original_decl_context = dyn_cast<DeclContext>(original_decl);
1703
1704 if (!original_decl_context)
1705 break;
Greg Claytone6d72ca2011-06-25 00:44:06 +00001706
Sean Callanan9b6898f2011-07-30 02:42:06 +00001707 for (TagDecl::decl_iterator iter = original_decl_context->decls_begin();
1708 iter != original_decl_context->decls_end();
1709 ++iter)
1710 {
1711 NamedDecl *named_decl = dyn_cast<NamedDecl>(*iter);
1712
1713 if (named_decl && named_decl->getName().equals(name.GetCString()))
1714 {
1715 Decl *copied_decl = m_parser_vars->GetASTImporter(context.GetASTContext())->CopyDecl(original_ctx, named_decl);
1716 NamedDecl *copied_named_decl = dyn_cast<NamedDecl>(copied_decl);
1717
1718 if (!copied_named_decl)
1719 continue;
1720
1721 context.AddNamedDecl (copied_named_decl);
Greg Claytone6d72ca2011-06-25 00:44:06 +00001722 }
1723 }
Sean Callanan9b6898f2011-07-30 02:42:06 +00001724
1725 return;
Greg Claytone6d72ca2011-06-25 00:44:06 +00001726 }
1727 while (0);
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001728
Greg Claytone5748d82010-11-09 23:46:37 +00001729 SymbolContextList sc_list;
Chris Lattner24943d22010-06-08 16:52:24 +00001730
Greg Clayton3bc52d02010-11-14 22:13:40 +00001731 const char *name_unique_cstr = name.GetCString();
1732
1733 if (name_unique_cstr == NULL)
1734 return;
1735
Greg Clayton8de27c72010-10-15 22:48:33 +00001736 // Only look for functions by name out in our symbols if the function
1737 // doesn't start with our phony prefix of '$'
Greg Clayton3bc52d02010-11-14 22:13:40 +00001738 if (name_unique_cstr[0] != '$')
Sean Callanan0fc73582010-07-27 00:55:47 +00001739 {
Sean Callananf8b468e2011-08-06 00:28:14 +00001740 ValueObjectSP valobj;
1741 VariableSP var;
1742 Error err;
1743
1744 valobj = m_parser_vars->m_exe_ctx->frame->GetValueForVariableExpressionPath(name_unique_cstr,
1745 eNoDynamicValues,
1746 StackFrame::eExpressionPathOptionCheckPtrVsMember,
1747 var,
1748 err);
Greg Clayton8de27c72010-10-15 22:48:33 +00001749
1750 // If we found a variable in scope, no need to pull up function names
Sean Callananf8b468e2011-08-06 00:28:14 +00001751 if (err.Success() && var != NULL)
Greg Clayton8de27c72010-10-15 22:48:33 +00001752 {
1753 AddOneVariable(context, var);
1754 }
1755 else
1756 {
Greg Clayton28d5fcc2011-01-27 06:44:37 +00001757 const bool include_symbols = true;
1758 const bool append = false;
1759 m_parser_vars->m_sym_ctx.FindFunctionsByName (name,
1760 include_symbols,
1761 append,
1762 sc_list);
Greg Clayton8de27c72010-10-15 22:48:33 +00001763
Sean Callanan81974962011-05-08 02:21:26 +00001764 if (sc_list.GetSize())
Greg Clayton8de27c72010-10-15 22:48:33 +00001765 {
Sean Callanan81974962011-05-08 02:21:26 +00001766 bool found_specific = false;
1767 Symbol *generic_symbol = NULL;
1768 Symbol *non_extern_symbol = NULL;
1769
1770 for (uint32_t index = 0, num_indices = sc_list.GetSize();
1771 index < num_indices;
1772 ++index)
Greg Clayton8de27c72010-10-15 22:48:33 +00001773 {
Sean Callanan81974962011-05-08 02:21:26 +00001774 SymbolContext sym_ctx;
1775 sc_list.GetContextAtIndex(index, sym_ctx);
1776
1777 if (sym_ctx.function)
1778 {
1779 // TODO only do this if it's a C function; C++ functions may be
1780 // overloaded
1781 if (!found_specific)
1782 AddOneFunction(context, sym_ctx.function, NULL);
1783 found_specific = true;
1784 }
1785 else if (sym_ctx.symbol)
1786 {
1787 if (sym_ctx.symbol->IsExternal())
1788 generic_symbol = sym_ctx.symbol;
1789 else
1790 non_extern_symbol = sym_ctx.symbol;
1791 }
Greg Clayton8de27c72010-10-15 22:48:33 +00001792 }
Sean Callanan81974962011-05-08 02:21:26 +00001793
1794 if (!found_specific)
Greg Clayton8de27c72010-10-15 22:48:33 +00001795 {
Sean Callanan81974962011-05-08 02:21:26 +00001796 if (generic_symbol)
1797 AddOneFunction (context, NULL, generic_symbol);
1798 else if (non_extern_symbol)
1799 AddOneFunction (context, NULL, non_extern_symbol);
1800 }
Greg Clayton8de27c72010-10-15 22:48:33 +00001801 }
Sean Callanan81974962011-05-08 02:21:26 +00001802 else
Greg Clayton8de27c72010-10-15 22:48:33 +00001803 {
Sean Callanan81974962011-05-08 02:21:26 +00001804 // We couldn't find a variable or function for this. Now we'll hunt for a generic
1805 // data symbol, and -- if it is found -- treat it as a variable.
1806
1807 Symbol *data_symbol = FindGlobalDataSymbol(*m_parser_vars->m_exe_ctx->target, name);
1808
1809 if (data_symbol)
1810 AddOneGenericVariable(context, *data_symbol);
Greg Clayton6916e352010-11-13 03:52:47 +00001811 }
Sean Callanan92aa6662010-09-07 21:49:41 +00001812 }
Greg Claytone6d72ca2011-06-25 00:44:06 +00001813
1814 ClangNamespaceDecl namespace_decl (m_parser_vars->m_sym_ctx.FindNamespace(name));
1815
1816 if (namespace_decl)
1817 {
1818 if (log)
1819 {
1820 std::string s;
1821 llvm::raw_string_ostream os(s);
1822 namespace_decl.GetNamespaceDecl()->print(os);
1823 os.flush();
1824
1825 log->Printf("Added namespace decl:");
1826 log->Printf("%s", s.c_str());
1827 }
1828
Sean Callanan9b6898f2011-07-30 02:42:06 +00001829 NamespaceDecl *clang_namespace_decl = AddNamespace(context, namespace_decl);
Greg Claytone6d72ca2011-06-25 00:44:06 +00001830 if (clang_namespace_decl)
1831 clang_namespace_decl->setHasExternalLexicalStorage();
1832 }
Sean Callanan0fc73582010-07-27 00:55:47 +00001833 }
Greg Clayton8de27c72010-10-15 22:48:33 +00001834 else
Sean Callanan3cfbd332010-10-06 00:10:07 +00001835 {
Greg Clayton57452832010-11-09 04:42:43 +00001836 static ConstString g_lldb_class_name ("$__lldb_class");
1837 if (name == g_lldb_class_name)
1838 {
1839 // Clang is looking for the type of "this"
1840
Sean Callananaa301c42010-12-03 01:38:59 +00001841 VariableList *vars = m_parser_vars->m_exe_ctx->frame->GetVariableList(false);
Greg Clayton57452832010-11-09 04:42:43 +00001842
1843 if (!vars)
1844 return;
1845
1846 lldb::VariableSP this_var = vars->FindVariable(ConstString("this"));
1847
Greg Clayton75a40122011-07-06 18:55:08 +00001848 if (!this_var ||
1849 !this_var->IsInScope(m_parser_vars->m_exe_ctx->frame) ||
1850 !this_var->LocationIsValidForFrame (m_parser_vars->m_exe_ctx->frame))
Greg Clayton57452832010-11-09 04:42:43 +00001851 return;
1852
1853 Type *this_type = this_var->GetType();
1854
1855 if (!this_type)
1856 return;
1857
Greg Clayton2403b5e2010-11-16 02:10:54 +00001858 if (log)
1859 {
1860 log->PutCString ("Type for \"this\" is: ");
1861 StreamString strm;
1862 this_type->Dump(&strm, true);
1863 log->PutCString (strm.GetData());
1864 }
1865
Greg Clayton04c9c7b2011-02-16 23:00:21 +00001866 TypeFromUser this_user_type(this_type->GetClangFullType(),
Greg Clayton57452832010-11-09 04:42:43 +00001867 this_type->GetClangAST());
1868
Sean Callananaa301c42010-12-03 01:38:59 +00001869 m_struct_vars->m_object_pointer_type = this_user_type;
Greg Clayton57452832010-11-09 04:42:43 +00001870
Sean Callanan58baaad2011-07-08 00:39:14 +00001871 void *pointer_target_type = NULL;
Greg Clayton57452832010-11-09 04:42:43 +00001872
1873 if (!ClangASTContext::IsPointerType(this_user_type.GetOpaqueQualType(),
1874 &pointer_target_type))
1875 return;
1876
Sean Callananc617a4c2011-08-05 23:43:37 +00001877 clang::QualType pointer_target_qual_type = QualType::getFromOpaquePtr(pointer_target_type);
1878
1879 if (pointer_target_qual_type.isConstQualified())
1880 pointer_target_qual_type.removeLocalConst();
1881
1882 TypeFromUser class_user_type(pointer_target_qual_type.getAsOpaquePtr(),
Greg Clayton57452832010-11-09 04:42:43 +00001883 this_type->GetClangAST());
1884
Sean Callanan3aa7da52010-12-13 22:46:15 +00001885 if (log)
1886 {
1887 StreamString type_stream;
1888 class_user_type.DumpTypeCode(&type_stream);
1889 type_stream.Flush();
1890 log->Printf("Adding type for $__lldb_class: %s", type_stream.GetString().c_str());
1891 }
1892
Greg Clayton57452832010-11-09 04:42:43 +00001893 AddOneType(context, class_user_type, true);
1894
1895 return;
1896 }
1897
Sean Callanan3aa7da52010-12-13 22:46:15 +00001898 static ConstString g_lldb_objc_class_name ("$__lldb_objc_class");
1899 if (name == g_lldb_objc_class_name)
1900 {
1901 // Clang is looking for the type of "*self"
1902
1903 VariableList *vars = m_parser_vars->m_exe_ctx->frame->GetVariableList(false);
1904
1905 if (!vars)
1906 return;
1907
1908 lldb::VariableSP self_var = vars->FindVariable(ConstString("self"));
1909
Greg Clayton75a40122011-07-06 18:55:08 +00001910 if (!self_var ||
1911 !self_var->IsInScope(m_parser_vars->m_exe_ctx->frame) ||
1912 !self_var->LocationIsValidForFrame (m_parser_vars->m_exe_ctx->frame))
Sean Callanan3aa7da52010-12-13 22:46:15 +00001913 return;
1914
1915 Type *self_type = self_var->GetType();
1916
1917 if (!self_type)
1918 return;
1919
Greg Clayton04c9c7b2011-02-16 23:00:21 +00001920 TypeFromUser self_user_type(self_type->GetClangFullType(),
Sean Callanan3aa7da52010-12-13 22:46:15 +00001921 self_type->GetClangAST());
1922
1923 m_struct_vars->m_object_pointer_type = self_user_type;
1924
Sean Callanan58baaad2011-07-08 00:39:14 +00001925 void *pointer_target_type = NULL;
Sean Callanan3aa7da52010-12-13 22:46:15 +00001926
1927 if (!ClangASTContext::IsPointerType(self_user_type.GetOpaqueQualType(),
Jim Ingham27a3ad12011-07-08 18:34:32 +00001928 &pointer_target_type)
Greg Clayton19c0d582011-07-08 18:27:39 +00001929 || pointer_target_type == NULL)
Sean Callanan3aa7da52010-12-13 22:46:15 +00001930 return;
1931
1932 TypeFromUser class_user_type(pointer_target_type,
1933 self_type->GetClangAST());
1934
1935 if (log)
1936 {
1937 StreamString type_stream;
1938 class_user_type.DumpTypeCode(&type_stream);
1939 type_stream.Flush();
1940 log->Printf("Adding type for $__lldb_objc_class: %s", type_stream.GetString().c_str());
1941 }
1942
1943 AddOneType(context, class_user_type, false);
1944
1945 return;
1946 }
Greg Clayton427f2902010-12-14 02:59:59 +00001947
1948 ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name));
Greg Clayton8de27c72010-10-15 22:48:33 +00001949
Greg Clayton427f2902010-12-14 02:59:59 +00001950 if (pvar_sp)
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001951 {
Greg Clayton427f2902010-12-14 02:59:59 +00001952 AddOneVariable(context, pvar_sp);
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001953 return;
1954 }
1955
1956 const char *reg_name(&name.GetCString()[1]);
1957
Sean Callananaa301c42010-12-03 01:38:59 +00001958 if (m_parser_vars->m_exe_ctx->GetRegisterContext())
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001959 {
Greg Claytonb3448432011-03-24 21:19:54 +00001960 const RegisterInfo *reg_info(m_parser_vars->m_exe_ctx->GetRegisterContext()->GetRegisterInfoByName(reg_name));
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001961
1962 if (reg_info)
1963 AddOneRegister(context, reg_info);
1964 }
Sean Callanan3cfbd332010-10-06 00:10:07 +00001965 }
1966
Sean Callananaa301c42010-12-03 01:38:59 +00001967 lldb::TypeSP type_sp (m_parser_vars->m_sym_ctx.FindTypeByName (name));
Sean Callananee8fc722010-11-19 20:20:02 +00001968
1969 if (type_sp)
Sean Callanan6df08402010-09-27 23:54:58 +00001970 {
Sean Callananee8fc722010-11-19 20:20:02 +00001971 if (log)
Sean Callanan6df08402010-09-27 23:54:58 +00001972 {
Sean Callananee8fc722010-11-19 20:20:02 +00001973 log->Printf ("Matching type found for \"%s\": ", name.GetCString());
1974 StreamString strm;
1975 type_sp->Dump(&strm, true);
1976 log->PutCString (strm.GetData());
1977 }
Greg Clayton2403b5e2010-11-16 02:10:54 +00001978
Greg Clayton04c9c7b2011-02-16 23:00:21 +00001979 TypeFromUser user_type (type_sp->GetClangFullType(),
Greg Claytonb01000f2011-01-17 03:46:26 +00001980 type_sp->GetClangAST());
Sean Callanan6df08402010-09-27 23:54:58 +00001981
Sean Callananee8fc722010-11-19 20:20:02 +00001982 AddOneType(context, user_type, false);
Sean Callanan6df08402010-09-27 23:54:58 +00001983 }
Sean Callanan336a0002010-07-17 00:43:37 +00001984}
Greg Claytone6d72ca2011-06-25 00:44:06 +00001985
Sean Callanan9b6898f2011-07-30 02:42:06 +00001986clang::ExternalLoadResult
1987ClangExpressionDeclMap::FindExternalLexicalDecls (const DeclContext *decl_context,
1988 bool (*predicate)(Decl::Kind),
1989 llvm::SmallVectorImpl<Decl*> &decls)
Greg Claytone6d72ca2011-06-25 00:44:06 +00001990{
Greg Claytone6d72ca2011-06-25 00:44:06 +00001991 assert (m_parser_vars.get());
1992
Sean Callanan9b6898f2011-07-30 02:42:06 +00001993 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1994
1995 const Decl *context_decl = dyn_cast<Decl>(decl_context);
1996
1997 if (!context_decl)
1998 return ELR_Failure;
1999
2000 ASTContext *ast_context = &context_decl->getASTContext();
2001
2002 if (log)
2003 log->Printf("Finding lexical decls in a '%s' with %s predicate", context_decl->getDeclKindName(), (predicate ? "non-null" : "null"));
2004
2005 Decl *original_decl = NULL;
2006 ASTContext *original_ctx = NULL;
2007
2008 ClangASTImporter *ast_importer = m_parser_vars->GetASTImporter(ast_context);
2009
2010 if (!ast_importer)
2011 return ELR_Failure;
2012
2013 if (!ast_importer->ResolveDeclOrigin(context_decl, &original_decl, &original_ctx))
2014 return ELR_Failure;
Greg Claytone6d72ca2011-06-25 00:44:06 +00002015
2016 if (log)
2017 {
Sean Callanan9b6898f2011-07-30 02:42:06 +00002018 std::string decl_print_string;
2019 llvm::raw_string_ostream decl_print_stream(decl_print_string);
2020 original_decl->print(decl_print_stream);
2021 decl_print_stream.flush();
2022 log->Printf("Original decl:\n%s", decl_print_string.c_str());
2023 }
2024
2025 if (TagDecl *original_tag_decl = dyn_cast<TagDecl>(original_decl))
2026 {
2027 ExternalASTSource *external_source = original_ctx->getExternalSource();
Greg Claytone6d72ca2011-06-25 00:44:06 +00002028
Sean Callananc6139712011-08-11 23:56:13 +00002029 if (external_source)
2030 external_source->CompleteType (original_tag_decl);
Sean Callanan9b6898f2011-07-30 02:42:06 +00002031 }
2032
2033 DeclContext *original_decl_context = dyn_cast<DeclContext>(original_decl);
2034
2035 if (!original_decl_context)
2036 return ELR_Failure;
2037
2038 for (TagDecl::decl_iterator iter = original_decl_context->decls_begin();
2039 iter != original_decl_context->decls_end();
2040 ++iter)
2041 {
2042 Decl *decl = *iter;
2043
2044 if (!predicate || predicate(decl->getKind()))
Greg Claytone6d72ca2011-06-25 00:44:06 +00002045 {
Sean Callanan9b6898f2011-07-30 02:42:06 +00002046 if (log)
2047 {
2048 std::string decl_print_string;
2049 llvm::raw_string_ostream decl_print_stream(decl_print_string);
2050 decl->print(decl_print_stream);
2051 decl_print_stream.flush();
2052 log->Printf(" Adding lexical decl %s", decl_print_string.c_str());
2053 }
2054
2055 Decl *copied_decl = ast_importer->CopyDecl(original_ctx, decl);
Greg Claytone6d72ca2011-06-25 00:44:06 +00002056
Sean Callanan9b6898f2011-07-30 02:42:06 +00002057 decls.push_back(copied_decl);
Greg Claytone6d72ca2011-06-25 00:44:06 +00002058 }
2059 }
2060
Sean Callanan9b6898f2011-07-30 02:42:06 +00002061 return ELR_AlreadyLoaded;
2062}
2063
2064void
2065ClangExpressionDeclMap::CompleteTagDecl (TagDecl *tag_decl)
2066{
2067 assert (m_parser_vars.get());
2068
2069 m_parser_vars->GetASTImporter(&tag_decl->getASTContext())->CompleteTagDecl (tag_decl);
2070}
2071
2072void
2073ClangExpressionDeclMap::CompleteObjCInterfaceDecl (clang::ObjCInterfaceDecl *interface_decl)
2074{
2075 assert (m_parser_vars.get());
2076
2077 m_parser_vars->GetASTImporter(&interface_decl->getASTContext())->CompleteObjCInterfaceDecl (interface_decl);
Greg Claytone6d72ca2011-06-25 00:44:06 +00002078}
2079
Sean Callanan336a0002010-07-17 00:43:37 +00002080Value *
Greg Clayton8de27c72010-10-15 22:48:33 +00002081ClangExpressionDeclMap::GetVariableValue
2082(
2083 ExecutionContext &exe_ctx,
Sean Callanan696cf5f2011-05-07 01:06:41 +00002084 VariableSP var,
Sean Callanan9b6898f2011-07-30 02:42:06 +00002085 ASTContext *parser_ast_context,
Greg Clayton8de27c72010-10-15 22:48:33 +00002086 TypeFromUser *user_type,
2087 TypeFromParser *parser_type
2088)
Chris Lattner24943d22010-06-08 16:52:24 +00002089{
Greg Claytone005f2c2010-11-06 01:53:30 +00002090 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan6184dfe2010-06-23 00:47:48 +00002091
Chris Lattner24943d22010-06-08 16:52:24 +00002092 Type *var_type = var->GetType();
2093
2094 if (!var_type)
2095 {
Sean Callanan810f22d2010-07-16 00:09:46 +00002096 if (log)
2097 log->PutCString("Skipped a definition because it has no type");
Sean Callanan336a0002010-07-17 00:43:37 +00002098 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00002099 }
2100
Greg Clayton04c9c7b2011-02-16 23:00:21 +00002101 clang_type_t var_opaque_type = var_type->GetClangFullType();
Chris Lattner24943d22010-06-08 16:52:24 +00002102
2103 if (!var_opaque_type)
2104 {
Sean Callanan810f22d2010-07-16 00:09:46 +00002105 if (log)
2106 log->PutCString("Skipped a definition because it has no Clang type");
Sean Callanan336a0002010-07-17 00:43:37 +00002107 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00002108 }
2109
Sean Callanan9b6898f2011-07-30 02:42:06 +00002110 ASTContext *ast = var_type->GetClangASTContext().getASTContext();
Chris Lattner24943d22010-06-08 16:52:24 +00002111
Greg Claytonb01000f2011-01-17 03:46:26 +00002112 if (!ast)
Chris Lattner24943d22010-06-08 16:52:24 +00002113 {
Sean Callanan810f22d2010-07-16 00:09:46 +00002114 if (log)
2115 log->PutCString("There is no AST context for the current execution context");
Sean Callanan336a0002010-07-17 00:43:37 +00002116 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00002117 }
2118
Sean Callanan336a0002010-07-17 00:43:37 +00002119 DWARFExpression &var_location_expr = var->LocationExpression();
2120
Chris Lattner24943d22010-06-08 16:52:24 +00002121 std::auto_ptr<Value> var_location(new Value);
2122
Greg Clayton178710c2010-09-14 02:20:48 +00002123 lldb::addr_t loclist_base_load_addr = LLDB_INVALID_ADDRESS;
2124
2125 if (var_location_expr.IsLocationList())
2126 {
2127 SymbolContext var_sc;
2128 var->CalculateSymbolContext (&var_sc);
Greg Claytoneea26402010-09-14 23:36:40 +00002129 loclist_base_load_addr = var_sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress (exe_ctx.target);
Greg Clayton178710c2010-09-14 02:20:48 +00002130 }
Chris Lattner24943d22010-06-08 16:52:24 +00002131 Error err;
2132
Greg Claytonbdcb6ab2011-01-25 23:55:37 +00002133 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 +00002134 {
Sean Callanan810f22d2010-07-16 00:09:46 +00002135 if (log)
2136 log->Printf("Error evaluating location: %s", err.AsCString());
Sean Callanan336a0002010-07-17 00:43:37 +00002137 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00002138 }
Greg Claytonb01000f2011-01-17 03:46:26 +00002139
Sean Callanan58baaad2011-07-08 00:39:14 +00002140 void *type_to_use = NULL;
Sean Callanan336a0002010-07-17 00:43:37 +00002141
Sean Callananf328c9f2010-07-20 23:31:16 +00002142 if (parser_ast_context)
2143 {
Greg Claytonb01000f2011-01-17 03:46:26 +00002144 type_to_use = GuardedCopyType(parser_ast_context, ast, var_opaque_type);
Sean Callananf328c9f2010-07-20 23:31:16 +00002145
Sean Callanan4b5eec62010-11-20 02:19:29 +00002146 if (!type_to_use)
2147 {
2148 if (log)
2149 log->Printf("Couldn't copy a variable's type into the parser's AST context");
2150
2151 return NULL;
2152 }
2153
Sean Callananf328c9f2010-07-20 23:31:16 +00002154 if (parser_type)
2155 *parser_type = TypeFromParser(type_to_use, parser_ast_context);
2156 }
Sean Callanan336a0002010-07-17 00:43:37 +00002157 else
2158 type_to_use = var_opaque_type;
Chris Lattner24943d22010-06-08 16:52:24 +00002159
2160 if (var_location.get()->GetContextType() == Value::eContextTypeInvalid)
Greg Clayton6916e352010-11-13 03:52:47 +00002161 var_location.get()->SetContext(Value::eContextTypeClangType, type_to_use);
Chris Lattner24943d22010-06-08 16:52:24 +00002162
2163 if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress)
2164 {
2165 SymbolContext var_sc;
2166 var->CalculateSymbolContext(&var_sc);
Sean Callanan336a0002010-07-17 00:43:37 +00002167
Chris Lattner24943d22010-06-08 16:52:24 +00002168 if (!var_sc.module_sp)
Sean Callanan336a0002010-07-17 00:43:37 +00002169 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00002170
2171 ObjectFile *object_file = var_sc.module_sp->GetObjectFile();
2172
2173 if (!object_file)
Sean Callanan336a0002010-07-17 00:43:37 +00002174 return NULL;
2175
Chris Lattner24943d22010-06-08 16:52:24 +00002176 Address so_addr(var_location->GetScalar().ULongLong(), object_file->GetSectionList());
2177
Sean Callananaa301c42010-12-03 01:38:59 +00002178 lldb::addr_t load_addr = so_addr.GetLoadAddress(exe_ctx.target);
Chris Lattner24943d22010-06-08 16:52:24 +00002179
2180 var_location->GetScalar() = load_addr;
2181 var_location->SetValueType(Value::eValueTypeLoadAddress);
2182 }
2183
Sean Callananf328c9f2010-07-20 23:31:16 +00002184 if (user_type)
Greg Claytonb01000f2011-01-17 03:46:26 +00002185 *user_type = TypeFromUser(var_opaque_type, ast);
Sean Callanan336a0002010-07-17 00:43:37 +00002186
2187 return var_location.release();
2188}
2189
2190void
Sean Callanan696cf5f2011-05-07 01:06:41 +00002191ClangExpressionDeclMap::AddOneVariable (NameSearchContext &context, VariableSP var)
Sean Callanan336a0002010-07-17 00:43:37 +00002192{
Sean Callananaa301c42010-12-03 01:38:59 +00002193 assert (m_parser_vars.get());
2194
Greg Claytone005f2c2010-11-06 01:53:30 +00002195 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan336a0002010-07-17 00:43:37 +00002196
Sean Callananf328c9f2010-07-20 23:31:16 +00002197 TypeFromUser ut;
2198 TypeFromParser pt;
Sean Callanan336a0002010-07-17 00:43:37 +00002199
Sean Callananaa301c42010-12-03 01:38:59 +00002200 Value *var_location = GetVariableValue (*m_parser_vars->m_exe_ctx,
Greg Clayton8de27c72010-10-15 22:48:33 +00002201 var,
2202 context.GetASTContext(),
2203 &ut,
2204 &pt);
Sean Callanan336a0002010-07-17 00:43:37 +00002205
Sean Callanan4b5eec62010-11-20 02:19:29 +00002206 if (!var_location)
2207 return;
2208
Sean Callanan6a925532011-01-13 08:53:35 +00002209 NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(pt.GetASTContext(), pt.GetOpaqueQualType()));
Greg Clayton8de27c72010-10-15 22:48:33 +00002210 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton427f2902010-12-14 02:59:59 +00002211 ConstString entity_name(decl_name.c_str());
Jim Inghamfa3a16a2011-03-31 00:19:25 +00002212 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
2213 entity_name,
Greg Clayton427f2902010-12-14 02:59:59 +00002214 ut,
2215 m_parser_vars->m_exe_ctx->process->GetByteOrder(),
2216 m_parser_vars->m_exe_ctx->process->GetAddressByteSize()));
2217 assert (entity.get());
2218 entity->EnableParserVars();
2219 entity->m_parser_vars->m_parser_type = pt;
2220 entity->m_parser_vars->m_named_decl = var_decl;
2221 entity->m_parser_vars->m_llvm_value = NULL;
2222 entity->m_parser_vars->m_lldb_value = var_location;
Sean Callanan696cf5f2011-05-07 01:06:41 +00002223 entity->m_parser_vars->m_lldb_var = var;
Chris Lattner24943d22010-06-08 16:52:24 +00002224
Sean Callanan810f22d2010-07-16 00:09:46 +00002225 if (log)
Greg Clayton8de27c72010-10-15 22:48:33 +00002226 {
Sean Callanana0744822010-11-01 23:22:47 +00002227 std::string var_decl_print_string;
2228 llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
2229 var_decl->print(var_decl_print_stream);
2230 var_decl_print_stream.flush();
2231
2232 log->Printf("Found variable %s, returned %s", decl_name.c_str(), var_decl_print_string.c_str());
Sean Callanan6e74dbb2011-02-01 23:43:26 +00002233
Sean Callanan9b6898f2011-07-30 02:42:06 +00002234 //if (log->GetVerbose())
2235 //{
2236 // StreamString var_decl_dump_string;
2237 // ASTDumper::DumpDecl(var_decl_dump_string, var_decl);
2238 // log->Printf("%s\n", var_decl_dump_string.GetData());
2239 //}
Greg Clayton8de27c72010-10-15 22:48:33 +00002240 }
Sean Callanan8f0dc342010-06-22 23:46:24 +00002241}
2242
2243void
Sean Callanana48fe162010-08-11 03:57:18 +00002244ClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
Greg Clayton427f2902010-12-14 02:59:59 +00002245 ClangExpressionVariableSP &pvar_sp)
Sean Callanana48fe162010-08-11 03:57:18 +00002246{
Greg Claytone005f2c2010-11-06 01:53:30 +00002247 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan45690fe2010-08-30 22:17:16 +00002248
Greg Clayton427f2902010-12-14 02:59:59 +00002249 TypeFromUser user_type (pvar_sp->GetTypeFromUser());
Sean Callanana48fe162010-08-11 03:57:18 +00002250
Greg Clayton427f2902010-12-14 02:59:59 +00002251 TypeFromParser parser_type (GuardedCopyType(context.GetASTContext(),
2252 user_type.GetASTContext(),
2253 user_type.GetOpaqueQualType()),
2254 context.GetASTContext());
Sean Callanana48fe162010-08-11 03:57:18 +00002255
Sean Callanan6a925532011-01-13 08:53:35 +00002256 NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(parser_type.GetASTContext(), parser_type.GetOpaqueQualType()));
Sean Callanan8c127202010-08-23 23:09:38 +00002257
Greg Clayton427f2902010-12-14 02:59:59 +00002258 pvar_sp->EnableParserVars();
2259 pvar_sp->m_parser_vars->m_parser_type = parser_type;
2260 pvar_sp->m_parser_vars->m_named_decl = var_decl;
2261 pvar_sp->m_parser_vars->m_llvm_value = NULL;
2262 pvar_sp->m_parser_vars->m_lldb_value = NULL;
Sean Callanan45690fe2010-08-30 22:17:16 +00002263
2264 if (log)
Sean Callanana0744822010-11-01 23:22:47 +00002265 {
2266 std::string var_decl_print_string;
2267 llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
2268 var_decl->print(var_decl_print_stream);
2269 var_decl_print_stream.flush();
2270
Greg Clayton427f2902010-12-14 02:59:59 +00002271 log->Printf("Added pvar %s, returned %s", pvar_sp->GetName().GetCString(), var_decl_print_string.c_str());
Sean Callanana0744822010-11-01 23:22:47 +00002272 }
Sean Callanana48fe162010-08-11 03:57:18 +00002273}
2274
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002275void
Sean Callanan81974962011-05-08 02:21:26 +00002276ClangExpressionDeclMap::AddOneGenericVariable(NameSearchContext &context,
2277 Symbol &symbol)
2278{
2279 assert(m_parser_vars.get());
2280
2281 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2282
Sean Callanan9b6898f2011-07-30 02:42:06 +00002283 ASTContext *scratch_ast_context = m_parser_vars->m_exe_ctx->target->GetScratchClangASTContext()->getASTContext();
Sean Callanan81974962011-05-08 02:21:26 +00002284
Sean Callananfb3058e2011-05-12 23:54:16 +00002285 TypeFromUser user_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(scratch_ast_context, true)),
Sean Callanan81974962011-05-08 02:21:26 +00002286 scratch_ast_context);
2287
Sean Callananfb3058e2011-05-12 23:54:16 +00002288 TypeFromParser parser_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(context.GetASTContext(), true)),
Sean Callanan81974962011-05-08 02:21:26 +00002289 context.GetASTContext());
2290
Sean Callananfb3058e2011-05-12 23:54:16 +00002291 NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
Sean Callanan81974962011-05-08 02:21:26 +00002292
2293 std::string decl_name(context.m_decl_name.getAsString());
2294 ConstString entity_name(decl_name.c_str());
2295 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
2296 entity_name,
2297 user_type,
2298 m_parser_vars->m_exe_ctx->process->GetByteOrder(),
2299 m_parser_vars->m_exe_ctx->process->GetAddressByteSize()));
2300 assert (entity.get());
Sean Callanan81974962011-05-08 02:21:26 +00002301
2302 std::auto_ptr<Value> symbol_location(new Value);
2303
2304 AddressRange &symbol_range = symbol.GetAddressRangeRef();
2305 Address &symbol_address = symbol_range.GetBaseAddress();
2306 lldb::addr_t symbol_load_addr = symbol_address.GetLoadAddress(m_parser_vars->m_exe_ctx->target);
2307
2308 symbol_location->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
2309 symbol_location->GetScalar() = symbol_load_addr;
2310 symbol_location->SetValueType(Value::eValueTypeLoadAddress);
2311
Sean Callananfb3058e2011-05-12 23:54:16 +00002312 entity->EnableParserVars();
Sean Callanan81974962011-05-08 02:21:26 +00002313 entity->m_parser_vars->m_parser_type = parser_type;
2314 entity->m_parser_vars->m_named_decl = var_decl;
2315 entity->m_parser_vars->m_llvm_value = NULL;
2316 entity->m_parser_vars->m_lldb_value = symbol_location.release();
2317 entity->m_parser_vars->m_lldb_sym = &symbol;
Sean Callananfb3058e2011-05-12 23:54:16 +00002318 //entity->m_flags |= ClangExpressionVariable::EVUnknownType;
Sean Callanan81974962011-05-08 02:21:26 +00002319
2320 if (log)
2321 {
2322 std::string var_decl_print_string;
2323 llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
2324 var_decl->print(var_decl_print_stream);
2325 var_decl_print_stream.flush();
2326
2327 log->Printf("Found variable %s, returned %s", decl_name.c_str(), var_decl_print_string.c_str());
2328
Sean Callanan9b6898f2011-07-30 02:42:06 +00002329 //if (log->GetVerbose())
2330 //{
2331 // StreamString var_decl_dump_string;
2332 // ASTDumper::DumpDecl(var_decl_dump_string, var_decl);
2333 // log->Printf("%s\n", var_decl_dump_string.GetData());
2334 //}
Sean Callanan81974962011-05-08 02:21:26 +00002335 }
2336}
2337
Sean Callananfb3058e2011-05-12 23:54:16 +00002338bool
2339ClangExpressionDeclMap::ResolveUnknownTypes()
2340{
2341 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2342
Sean Callanan9b6898f2011-07-30 02:42:06 +00002343 ASTContext *scratch_ast_context = m_parser_vars->m_exe_ctx->target->GetScratchClangASTContext()->getASTContext();
Sean Callananfb3058e2011-05-12 23:54:16 +00002344
2345 for (size_t index = 0, num_entities = m_found_entities.GetSize();
2346 index < num_entities;
2347 ++index)
2348 {
2349 ClangExpressionVariableSP entity = m_found_entities.GetVariableAtIndex(index);
2350
2351 if (entity->m_flags & ClangExpressionVariable::EVUnknownType)
2352 {
2353 const NamedDecl *named_decl = entity->m_parser_vars->m_named_decl;
2354 const VarDecl *var_decl = dyn_cast<VarDecl>(named_decl);
2355
2356 if (!var_decl)
2357 {
2358 if (log)
2359 log->Printf("Entity of unknown type does not have a VarDecl");
2360 return false;
2361 }
2362
2363 if (log)
2364 {
2365 std::string var_decl_print_string;
2366 llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
2367 var_decl->print(var_decl_print_stream);
2368 var_decl_print_stream.flush();
2369
2370 log->Printf("Variable of unknown type now has Decl %s", var_decl_print_string.c_str());
2371 }
2372
2373 QualType var_type = var_decl->getType();
2374 TypeFromParser parser_type(var_type.getAsOpaquePtr(), &var_decl->getASTContext());
2375
2376 lldb::clang_type_t copied_type = ClangASTContext::CopyType(scratch_ast_context, &var_decl->getASTContext(), var_type.getAsOpaquePtr());
2377
2378 TypeFromUser user_type(copied_type, scratch_ast_context);
2379
2380 entity->m_parser_vars->m_lldb_value->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
2381 entity->m_parser_vars->m_parser_type = parser_type;
2382
2383 entity->SetClangAST(user_type.GetASTContext());
2384 entity->SetClangType(user_type.GetOpaqueQualType());
2385
2386 entity->m_flags &= ~(ClangExpressionVariable::EVUnknownType);
2387 }
2388 }
2389
2390 return true;
2391}
2392
Sean Callanan81974962011-05-08 02:21:26 +00002393void
Greg Clayton427f2902010-12-14 02:59:59 +00002394ClangExpressionDeclMap::AddOneRegister (NameSearchContext &context,
2395 const RegisterInfo *reg_info)
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002396{
2397 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2398
2399 void *ast_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize(context.GetASTContext(),
2400 reg_info->encoding,
2401 reg_info->byte_size * 8);
2402
2403 if (!ast_type)
2404 {
Johnny Chen122204d2011-08-09 22:52:27 +00002405 if (log)
2406 log->Printf("Tried to add a type for %s, but couldn't get one", context.m_decl_name.getAsString().c_str());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002407 return;
2408 }
2409
Greg Clayton427f2902010-12-14 02:59:59 +00002410 TypeFromParser parser_type (ast_type,
2411 context.GetASTContext());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002412
2413 NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
2414
Jim Inghamfa3a16a2011-03-31 00:19:25 +00002415 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope(),
2416 m_parser_vars->m_exe_ctx->process->GetByteOrder(),
Greg Clayton427f2902010-12-14 02:59:59 +00002417 m_parser_vars->m_exe_ctx->process->GetAddressByteSize()));
2418 assert (entity.get());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002419 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton427f2902010-12-14 02:59:59 +00002420 entity->SetName (ConstString (decl_name.c_str()));
2421 entity->SetRegisterInfo (reg_info);
2422 entity->EnableParserVars();
2423 entity->m_parser_vars->m_parser_type = parser_type;
2424 entity->m_parser_vars->m_named_decl = var_decl;
2425 entity->m_parser_vars->m_llvm_value = NULL;
2426 entity->m_parser_vars->m_lldb_value = NULL;
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00002427
2428 if (log)
2429 {
2430 std::string var_decl_print_string;
2431 llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
2432 var_decl->print(var_decl_print_stream);
2433 var_decl_print_stream.flush();
2434
2435 log->Printf("Added register %s, returned %s", context.m_decl_name.getAsString().c_str(), var_decl_print_string.c_str());
2436 }
2437}
2438
Sean Callanan9b6898f2011-07-30 02:42:06 +00002439NamespaceDecl *
Greg Clayton6916e352010-11-13 03:52:47 +00002440ClangExpressionDeclMap::AddNamespace (NameSearchContext &context, const ClangNamespaceDecl &namespace_decl)
2441{
2442 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2443
Greg Claytone6d72ca2011-06-25 00:44:06 +00002444 assert (m_parser_vars.get());
2445
Sean Callanan9b6898f2011-07-30 02:42:06 +00002446 Decl *copied_decl = m_parser_vars->GetASTImporter(context.GetASTContext())->CopyDecl(namespace_decl.GetASTContext(),
Greg Claytone6d72ca2011-06-25 00:44:06 +00002447 namespace_decl.GetNamespaceDecl());
Greg Clayton6916e352010-11-13 03:52:47 +00002448
Sean Callanan9b6898f2011-07-30 02:42:06 +00002449 return dyn_cast<NamespaceDecl>(copied_decl);
Greg Clayton6916e352010-11-13 03:52:47 +00002450}
2451
Sean Callanana48fe162010-08-11 03:57:18 +00002452void
Greg Claytonda7af842011-05-18 22:01:49 +00002453ClangExpressionDeclMap::AddOneFunction (NameSearchContext &context,
2454 Function* fun,
2455 Symbol* symbol)
Sean Callanan8f0dc342010-06-22 23:46:24 +00002456{
Sean Callananaa301c42010-12-03 01:38:59 +00002457 assert (m_parser_vars.get());
2458
Greg Claytone005f2c2010-11-06 01:53:30 +00002459 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan8f0dc342010-06-22 23:46:24 +00002460
Sean Callanan58baaad2011-07-08 00:39:14 +00002461 NamedDecl *fun_decl = NULL;
Sean Callanan8f0dc342010-06-22 23:46:24 +00002462 std::auto_ptr<Value> fun_location(new Value);
Sean Callanan58baaad2011-07-08 00:39:14 +00002463 const Address *fun_address = NULL;
Sean Callanan8f0dc342010-06-22 23:46:24 +00002464
Sean Callanan0fc73582010-07-27 00:55:47 +00002465 // only valid for Functions, not for Symbols
2466 void *fun_opaque_type = NULL;
Sean Callanan9b6898f2011-07-30 02:42:06 +00002467 ASTContext *fun_ast_context = NULL;
Sean Callanan0fc73582010-07-27 00:55:47 +00002468
2469 if (fun)
2470 {
2471 Type *fun_type = fun->GetType();
2472
2473 if (!fun_type)
2474 {
2475 if (log)
2476 log->PutCString("Skipped a function because it has no type");
2477 return;
2478 }
2479
Greg Clayton04c9c7b2011-02-16 23:00:21 +00002480 fun_opaque_type = fun_type->GetClangFullType();
Sean Callanan0fc73582010-07-27 00:55:47 +00002481
2482 if (!fun_opaque_type)
2483 {
2484 if (log)
2485 log->PutCString("Skipped a function because it has no Clang type");
2486 return;
2487 }
2488
2489 fun_address = &fun->GetAddressRange().GetBaseAddress();
2490
Greg Claytonb01000f2011-01-17 03:46:26 +00002491 fun_ast_context = fun_type->GetClangASTContext().getASTContext();
Sean Callananee8fc722010-11-19 20:20:02 +00002492 void *copied_type = GuardedCopyType(context.GetASTContext(), fun_ast_context, fun_opaque_type);
Sean Callanan0fc73582010-07-27 00:55:47 +00002493
2494 fun_decl = context.AddFunDecl(copied_type);
2495 }
2496 else if (symbol)
2497 {
2498 fun_address = &symbol->GetAddressRangeRef().GetBaseAddress();
2499
2500 fun_decl = context.AddGenericFunDecl();
2501 }
2502 else
2503 {
2504 if (log)
2505 log->PutCString("AddOneFunction called with no function and no symbol");
2506 return;
2507 }
2508
Greg Claytonda7af842011-05-18 22:01:49 +00002509 lldb::addr_t load_addr = fun_address->GetCallableLoadAddress(m_parser_vars->m_exe_ctx->target);
Sean Callanan8f0dc342010-06-22 23:46:24 +00002510 fun_location->SetValueType(Value::eValueTypeLoadAddress);
2511 fun_location->GetScalar() = load_addr;
2512
Jim Inghamfa3a16a2011-03-31 00:19:25 +00002513 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
2514 m_parser_vars->m_exe_ctx->process->GetByteOrder(),
Greg Clayton427f2902010-12-14 02:59:59 +00002515 m_parser_vars->m_exe_ctx->process->GetAddressByteSize()));
2516 assert (entity.get());
Greg Clayton8de27c72010-10-15 22:48:33 +00002517 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton427f2902010-12-14 02:59:59 +00002518 entity->SetName(ConstString(decl_name.c_str()));
2519 entity->SetClangType (fun_opaque_type);
2520 entity->SetClangAST (fun_ast_context);
Sean Callanan8f0dc342010-06-22 23:46:24 +00002521
Greg Clayton427f2902010-12-14 02:59:59 +00002522 entity->EnableParserVars();
2523 entity->m_parser_vars->m_named_decl = fun_decl;
2524 entity->m_parser_vars->m_llvm_value = NULL;
2525 entity->m_parser_vars->m_lldb_value = fun_location.release();
Sean Callanan8c127202010-08-23 23:09:38 +00002526
Sean Callanan810f22d2010-07-16 00:09:46 +00002527 if (log)
Greg Clayton8de27c72010-10-15 22:48:33 +00002528 {
Sean Callanana0744822010-11-01 23:22:47 +00002529 std::string fun_decl_print_string;
2530 llvm::raw_string_ostream fun_decl_print_stream(fun_decl_print_string);
2531 fun_decl->print(fun_decl_print_stream);
2532 fun_decl_print_stream.flush();
2533
2534 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 +00002535 }
Chris Lattner24943d22010-06-08 16:52:24 +00002536}
Sean Callanan93a4b1a2010-08-04 01:02:13 +00002537
2538void
2539ClangExpressionDeclMap::AddOneType(NameSearchContext &context,
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00002540 TypeFromUser &ut,
2541 bool add_method)
Sean Callanan93a4b1a2010-08-04 01:02:13 +00002542{
Sean Callanan9b6898f2011-07-30 02:42:06 +00002543 ASTContext *parser_ast_context = context.GetASTContext();
2544 ASTContext *user_ast_context = ut.GetASTContext();
Sean Callanan93a4b1a2010-08-04 01:02:13 +00002545
Sean Callananee8fc722010-11-19 20:20:02 +00002546 void *copied_type = GuardedCopyType(parser_ast_context, user_ast_context, ut.GetOpaqueQualType());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00002547
2548 TypeFromParser parser_type(copied_type, parser_ast_context);
2549
2550 if (add_method && ClangASTContext::IsAggregateType(copied_type))
2551 {
2552 void *args[1];
2553
2554 args[0] = ClangASTContext::GetVoidPtrType(parser_ast_context, false);
2555
2556 void *method_type = ClangASTContext::CreateFunctionType (parser_ast_context,
2557 ClangASTContext::GetBuiltInType_void(parser_ast_context),
2558 args,
2559 1,
2560 false,
2561 ClangASTContext::GetTypeQualifiers(copied_type));
Greg Clayton30449d52010-10-01 02:31:07 +00002562
Greg Clayton1d8173f2010-09-24 05:15:53 +00002563 const bool is_virtual = false;
2564 const bool is_static = false;
2565 const bool is_inline = false;
Greg Clayton30449d52010-10-01 02:31:07 +00002566 const bool is_explicit = false;
2567
Greg Clayton1d8173f2010-09-24 05:15:53 +00002568 ClangASTContext::AddMethodToCXXRecordType (parser_ast_context,
2569 copied_type,
Greg Clayton8de27c72010-10-15 22:48:33 +00002570 "$__lldb_expr",
Greg Clayton1d8173f2010-09-24 05:15:53 +00002571 method_type,
2572 lldb::eAccessPublic,
2573 is_virtual,
2574 is_static,
Greg Clayton30449d52010-10-01 02:31:07 +00002575 is_inline,
2576 is_explicit);
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00002577 }
Sean Callanan93a4b1a2010-08-04 01:02:13 +00002578
2579 context.AddTypeDecl(copied_type);
2580}
Sean Callananee8fc722010-11-19 20:20:02 +00002581
2582void *
2583ClangExpressionDeclMap::GuardedCopyType (ASTContext *dest_context,
2584 ASTContext *source_context,
2585 void *clang_type)
2586{
Sean Callananaa301c42010-12-03 01:38:59 +00002587 assert (m_parser_vars.get());
2588
2589 m_parser_vars->m_ignore_lookups = true;
Sean Callananee8fc722010-11-19 20:20:02 +00002590
Greg Claytone6d72ca2011-06-25 00:44:06 +00002591 lldb_private::ClangASTImporter *importer = m_parser_vars->GetASTImporter(dest_context);
2592
2593 QualType ret_qual_type = importer->CopyType (source_context,
2594 QualType::getFromOpaquePtr(clang_type));
2595
2596 void *ret = ret_qual_type.getAsOpaquePtr();
Sean Callananee8fc722010-11-19 20:20:02 +00002597
Sean Callananaa301c42010-12-03 01:38:59 +00002598 m_parser_vars->m_ignore_lookups = false;
Sean Callananee8fc722010-11-19 20:20:02 +00002599
2600 return ret;
2601}