blob: 6bcab76114394b57fa7e207023209177536be45f [file] [log] [blame]
Chris Lattner30fdc8d2010-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 Callanan3d654b32012-09-24 22:25:51 +000016#include "clang/AST/ASTContext.h"
Sean Callanane2ef6e32010-09-23 03:01:22 +000017#include "clang/AST/DeclarationName.h"
Sean Callanan530782942010-11-01 23:22:47 +000018#include "clang/AST/Decl.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000019#include "lldb/lldb-private.h"
20#include "lldb/Core/Address.h"
Sean Callananea22d422010-07-16 00:09:46 +000021#include "lldb/Core/Error.h"
Sean Callananf06ba8d2010-06-23 00:47:48 +000022#include "lldb/Core/Log.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000023#include "lldb/Core/Module.h"
Greg Clayton7349bd92011-05-09 20:18:18 +000024#include "lldb/Core/RegisterValue.h"
Sean Callanane4ec90e2010-12-16 03:17:46 +000025#include "lldb/Core/ValueObjectConstResult.h"
Sean Callanan9b3569b2011-12-10 03:12:34 +000026#include "lldb/Core/ValueObjectVariable.h"
Sean Callanan0917d6e2011-02-01 23:43:26 +000027#include "lldb/Expression/ASTDumper.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000028#include "lldb/Expression/ClangASTSource.h"
Sean Callanan2235f322010-08-11 03:57:18 +000029#include "lldb/Expression/ClangPersistentVariables.h"
Greg Clayton7fb56d02011-02-01 01:31:41 +000030#include "lldb/Host/Endian.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000031#include "lldb/Symbol/ClangASTContext.h"
Greg Clayton526e5af2010-11-13 03:52:47 +000032#include "lldb/Symbol/ClangNamespaceDecl.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000033#include "lldb/Symbol/CompileUnit.h"
34#include "lldb/Symbol/Function.h"
35#include "lldb/Symbol/ObjectFile.h"
36#include "lldb/Symbol/SymbolContext.h"
Sean Callanan503aa522011-10-12 00:12:34 +000037#include "lldb/Symbol/SymbolVendor.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000038#include "lldb/Symbol/Type.h"
39#include "lldb/Symbol/TypeList.h"
40#include "lldb/Symbol/Variable.h"
41#include "lldb/Symbol/VariableList.h"
Sean Callanan1d180662010-07-20 23:31:16 +000042#include "lldb/Target/ExecutionContext.h"
Sean Callanane0b23b52012-11-15 02:02:04 +000043#include "lldb/Target/ObjCLanguageRuntime.h"
Sean Callananea22d422010-07-16 00:09:46 +000044#include "lldb/Target/Process.h"
Sean Callananf4b9bd32010-10-05 20:18:48 +000045#include "lldb/Target/RegisterContext.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000046#include "lldb/Target/StackFrame.h"
Sean Callanan1d180662010-07-20 23:31:16 +000047#include "lldb/Target/Target.h"
Jim Ingham895c9822010-12-07 01:56:02 +000048#include "lldb/Target/Thread.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000049
Greg Clayton83c5cd92010-11-14 22:13:40 +000050using namespace lldb;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000051using namespace lldb_private;
52using namespace clang;
53
Sean Callanan1ee44b72011-10-29 01:58:46 +000054ClangExpressionDeclMap::ClangExpressionDeclMap (bool keep_result_in_memory, ExecutionContext &exe_ctx) :
55 ClangASTSource (exe_ctx.GetTargetSP()),
Greg Clayton7b462cc2010-10-15 22:48:33 +000056 m_found_entities (),
57 m_struct_members (),
Stephen Wilson71c21d12011-04-11 19:41:40 +000058 m_keep_result_in_memory (keep_result_in_memory),
Sean Callanan979f74d2010-12-03 01:38:59 +000059 m_parser_vars (),
Stephen Wilson71c21d12011-04-11 19:41:40 +000060 m_struct_vars ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +000061{
Sean Callanan979f74d2010-12-03 01:38:59 +000062 EnableStructVars();
Chris Lattner30fdc8d2010-06-08 16:52:24 +000063}
64
65ClangExpressionDeclMap::~ClangExpressionDeclMap()
Sean Callanan979f74d2010-12-03 01:38:59 +000066{
Sean Callanane3aef1d2011-10-12 22:20:02 +000067 // Note: The model is now that the parser's AST context and all associated
68 // data does not vanish until the expression has been executed. This means
69 // that valuable lookup data (like namespaces) doesn't vanish, but
70
71 DidParse();
Sean Callanan979f74d2010-12-03 01:38:59 +000072 DidDematerialize();
73 DisableStructVars();
74}
Sean Callananbe3a1b12010-10-26 00:31:56 +000075
Sean Callananb9951192011-08-01 18:18:33 +000076bool
Greg Clayton8b2fe6d2010-12-14 02:59:59 +000077ClangExpressionDeclMap::WillParse(ExecutionContext &exe_ctx)
Sean Callanan979f74d2010-12-03 01:38:59 +000078{
79 EnableParserVars();
Sean Callanan933693b2012-02-10 01:22:05 +000080 m_parser_vars->m_exe_ctx = exe_ctx;
Greg Claytonc14ee322011-09-22 04:58:26 +000081
82 Target *target = exe_ctx.GetTargetPtr();
83 if (exe_ctx.GetFramePtr())
84 m_parser_vars->m_sym_ctx = exe_ctx.GetFramePtr()->GetSymbolContext(lldb::eSymbolContextEverything);
Sean Callanand4fac252013-02-21 22:01:43 +000085 else if (exe_ctx.GetThreadPtr() && exe_ctx.GetThreadPtr()->GetStackFrameAtIndex(0))
Greg Claytonc14ee322011-09-22 04:58:26 +000086 m_parser_vars->m_sym_ctx = exe_ctx.GetThreadPtr()->GetStackFrameAtIndex(0)->GetSymbolContext(lldb::eSymbolContextEverything);
87 else if (exe_ctx.GetProcessPtr())
Greg Clayton4d122c42011-09-17 08:33:22 +000088 {
Greg Clayton72310352013-02-23 04:12:47 +000089 m_parser_vars->m_sym_ctx.Clear(true);
Greg Claytonc14ee322011-09-22 04:58:26 +000090 m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP();
Greg Clayton4d122c42011-09-17 08:33:22 +000091 }
Greg Claytonc14ee322011-09-22 04:58:26 +000092 else if (target)
Greg Clayton4d122c42011-09-17 08:33:22 +000093 {
Greg Clayton72310352013-02-23 04:12:47 +000094 m_parser_vars->m_sym_ctx.Clear(true);
Greg Claytonc14ee322011-09-22 04:58:26 +000095 m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP();
Greg Clayton4d122c42011-09-17 08:33:22 +000096 }
Sean Callananc2ff2742011-09-15 18:41:04 +000097
Greg Claytonc14ee322011-09-22 04:58:26 +000098 if (target)
99 {
100 m_parser_vars->m_persistent_vars = &target->GetPersistentVariables();
Sean Callananb9951192011-08-01 18:18:33 +0000101
Greg Claytonc14ee322011-09-22 04:58:26 +0000102 if (!target->GetScratchClangASTContext())
103 return false;
104 }
Sean Callananb9951192011-08-01 18:18:33 +0000105
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000106 m_parser_vars->m_target_info = GetTargetInfo();
107
Sean Callananb9951192011-08-01 18:18:33 +0000108 return true;
Sean Callanan979f74d2010-12-03 01:38:59 +0000109}
110
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000111void
112ClangExpressionDeclMap::DidParse()
Sean Callanan979f74d2010-12-03 01:38:59 +0000113{
114 if (m_parser_vars.get())
115 {
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000116 for (size_t entity_index = 0, num_entities = m_found_entities.GetSize();
Sean Callanan979f74d2010-12-03 01:38:59 +0000117 entity_index < num_entities;
118 ++entity_index)
119 {
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000120 ClangExpressionVariableSP var_sp(m_found_entities.GetVariableAtIndex(entity_index));
Jim Ingham28eb5712012-10-12 17:34:26 +0000121 if (var_sp)
122 {
Sean Callanan3c495c12013-01-15 23:29:36 +0000123 ClangExpressionVariable::ParserVars *parser_vars = var_sp->GetParserVars(GetParserID());
124
125 if (parser_vars && parser_vars->m_lldb_value)
126 delete parser_vars->m_lldb_value;
Sean Callanan979f74d2010-12-03 01:38:59 +0000127
Sean Callanan3c495c12013-01-15 23:29:36 +0000128 var_sp->DisableParserVars(GetParserID());
Jim Ingham28eb5712012-10-12 17:34:26 +0000129 }
Sean Callanan979f74d2010-12-03 01:38:59 +0000130 }
131
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000132 for (size_t pvar_index = 0, num_pvars = m_parser_vars->m_persistent_vars->GetSize();
Sean Callanan979f74d2010-12-03 01:38:59 +0000133 pvar_index < num_pvars;
134 ++pvar_index)
135 {
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000136 ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariableAtIndex(pvar_index));
137 if (pvar_sp)
Sean Callanan3c495c12013-01-15 23:29:36 +0000138 pvar_sp->DisableParserVars(GetParserID());
Sean Callanan979f74d2010-12-03 01:38:59 +0000139 }
140
141 DisableParserVars();
Sean Callanan6b1b9532010-10-08 01:58:41 +0000142 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000143}
144
Sean Callanan549c9f72010-07-13 21:41:46 +0000145// Interface for IRForTarget
146
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000147ClangExpressionDeclMap::TargetInfo
148ClangExpressionDeclMap::GetTargetInfo()
149{
150 assert (m_parser_vars.get());
151
152 TargetInfo ret;
153
Sean Callanan933693b2012-02-10 01:22:05 +0000154 ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
155
156 Process *process = exe_ctx.GetProcessPtr();
157 if (process)
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000158 {
Sean Callanan933693b2012-02-10 01:22:05 +0000159 ret.byte_order = process->GetByteOrder();
160 ret.address_byte_size = process->GetAddressByteSize();
161 }
162 else
163 {
164 Target *target = exe_ctx.GetTargetPtr();
165 if (target)
Greg Claytonc14ee322011-09-22 04:58:26 +0000166 {
Sean Callanan933693b2012-02-10 01:22:05 +0000167 ret.byte_order = target->GetArchitecture().GetByteOrder();
168 ret.address_byte_size = target->GetArchitecture().GetAddressByteSize();
Greg Claytonc14ee322011-09-22 04:58:26 +0000169 }
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000170 }
Sean Callanan933693b2012-02-10 01:22:05 +0000171
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000172 return ret;
173}
174
Greg Clayton7b462cc2010-10-15 22:48:33 +0000175const ConstString &
176ClangExpressionDeclMap::GetPersistentResultName ()
Sean Callanand1e5b432010-08-12 01:56:52 +0000177{
Sean Callanan979f74d2010-12-03 01:38:59 +0000178 assert (m_struct_vars.get());
179 assert (m_parser_vars.get());
Sean Callanan979f74d2010-12-03 01:38:59 +0000180 if (!m_struct_vars->m_result_name)
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000181 {
182 Target *target = m_parser_vars->GetTarget();
183 assert (target);
184 m_struct_vars->m_result_name = target->GetPersistentVariables().GetNextPersistentVariableName();
185 }
Sean Callanan979f74d2010-12-03 01:38:59 +0000186 return m_struct_vars->m_result_name;
Sean Callanand1e5b432010-08-12 01:56:52 +0000187}
188
Sean Callanane4ec90e2010-12-16 03:17:46 +0000189lldb::ClangExpressionVariableSP
190ClangExpressionDeclMap::BuildIntegerVariable (const ConstString &name,
191 lldb_private::TypeFromParser type,
192 const llvm::APInt& value)
193{
194 assert (m_parser_vars.get());
Sean Callananb9951192011-08-01 18:18:33 +0000195
Sean Callanan933693b2012-02-10 01:22:05 +0000196 ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
197
198 Target *target = exe_ctx.GetTargetPtr();
199
200 if (!target)
201 return ClangExpressionVariableSP();
Greg Claytonc14ee322011-09-22 04:58:26 +0000202
203 ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
Sean Callanane4ec90e2010-12-16 03:17:46 +0000204
Sean Callanan00f43622011-11-18 03:28:09 +0000205 TypeFromUser user_type(m_ast_importer->CopyType(context,
206 type.GetASTContext(),
207 type.GetOpaqueQualType()),
Sean Callanane4ec90e2010-12-16 03:17:46 +0000208 context);
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000209
Sean Callanane0a64f72011-12-01 21:04:37 +0000210 if (!user_type.GetOpaqueQualType())
211 {
212 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
213
214 if (log)
215 log->Printf("ClangExpressionDeclMap::BuildIntegerVariable - Couldn't export the type for a constant integer result");
216
217 return lldb::ClangExpressionVariableSP();
218 }
219
Sean Callanan933693b2012-02-10 01:22:05 +0000220 if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx.GetBestExecutionContextScope (),
Jim Ingham6035b672011-03-31 00:19:25 +0000221 name,
Sean Callanane4f987222011-01-04 02:41:41 +0000222 user_type,
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000223 m_parser_vars->m_target_info.byte_order,
224 m_parser_vars->m_target_info.address_byte_size))
Sean Callanane4f987222011-01-04 02:41:41 +0000225 return lldb::ClangExpressionVariableSP();
Sean Callanane4ec90e2010-12-16 03:17:46 +0000226
Sean Callanane4f987222011-01-04 02:41:41 +0000227 ClangExpressionVariableSP pvar_sp (m_parser_vars->m_persistent_vars->GetVariable(name));
228
229 if (!pvar_sp)
230 return lldb::ClangExpressionVariableSP();
231
232 uint8_t *pvar_data = pvar_sp->GetValueBytes();
233 if (pvar_data == NULL)
234 return lldb::ClangExpressionVariableSP();
Sean Callanane4ec90e2010-12-16 03:17:46 +0000235
236 uint64_t value64 = value.getLimitedValue();
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000237
Sean Callanane4ec90e2010-12-16 03:17:46 +0000238 size_t num_val_bytes = sizeof(value64);
Sean Callanane4f987222011-01-04 02:41:41 +0000239 size_t num_data_bytes = pvar_sp->GetByteSize();
Sean Callanane4ec90e2010-12-16 03:17:46 +0000240
241 size_t num_bytes = num_val_bytes;
242 if (num_bytes > num_data_bytes)
243 num_bytes = num_data_bytes;
244
Johnny Chen44805302011-07-19 19:48:13 +0000245 for (size_t byte_idx = 0;
Sean Callanane4ec90e2010-12-16 03:17:46 +0000246 byte_idx < num_bytes;
247 ++byte_idx)
248 {
249 uint64_t shift = byte_idx * 8;
250 uint64_t mask = 0xffll << shift;
251 uint8_t cur_byte = (uint8_t)((value64 & mask) >> shift);
252
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000253 switch (m_parser_vars->m_target_info.byte_order)
Sean Callanane4ec90e2010-12-16 03:17:46 +0000254 {
Sean Callanane4f987222011-01-04 02:41:41 +0000255 case eByteOrderBig:
256 // High Low
257 // Original: |AABBCCDDEEFFGGHH|
258 // Target: |EEFFGGHH|
259
260 pvar_data[num_data_bytes - (1 + byte_idx)] = cur_byte;
261 break;
262 case eByteOrderLittle:
263 // Target: |HHGGFFEE|
264 pvar_data[byte_idx] = cur_byte;
265 break;
266 default:
267 return lldb::ClangExpressionVariableSP();
Sean Callanane4ec90e2010-12-16 03:17:46 +0000268 }
269 }
Sean Callanan92adcac2011-01-13 08:53:35 +0000270
271 pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried;
Sean Callanan63697e52011-05-07 01:06:41 +0000272 pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
273 pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
Sean Callanane4f987222011-01-04 02:41:41 +0000274
275 return pvar_sp;
Sean Callanane4ec90e2010-12-16 03:17:46 +0000276}
277
Sean Callanan63697e52011-05-07 01:06:41 +0000278lldb::ClangExpressionVariableSP
279ClangExpressionDeclMap::BuildCastVariable (const ConstString &name,
Sean Callanancc427fa2011-07-30 02:42:06 +0000280 VarDecl *decl,
Sean Callanan63697e52011-05-07 01:06:41 +0000281 lldb_private::TypeFromParser type)
282{
283 assert (m_parser_vars.get());
284
285 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
286
Sean Callanan933693b2012-02-10 01:22:05 +0000287 ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
288 Target *target = exe_ctx.GetTargetPtr();
Greg Claytonc14ee322011-09-22 04:58:26 +0000289 if (target == NULL)
290 return lldb::ClangExpressionVariableSP();
291
292 ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
Sean Callanan63697e52011-05-07 01:06:41 +0000293
Sean Callanan3c495c12013-01-15 23:29:36 +0000294 ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl, GetParserID()));
Sean Callanan63697e52011-05-07 01:06:41 +0000295
296 if (!var_sp)
Sean Callanan3c495c12013-01-15 23:29:36 +0000297 var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl, GetParserID());
Sean Callanan63697e52011-05-07 01:06:41 +0000298
299 if (!var_sp)
300 return ClangExpressionVariableSP();
301
Sean Callanan00f43622011-11-18 03:28:09 +0000302 TypeFromUser user_type(m_ast_importer->CopyType(context,
303 type.GetASTContext(),
304 type.GetOpaqueQualType()),
Sean Callanan63697e52011-05-07 01:06:41 +0000305 context);
306
Sean Callanane0a64f72011-12-01 21:04:37 +0000307 if (!user_type.GetOpaqueQualType())
Jason Molendaccd41e52012-10-04 22:47:07 +0000308 {
Sean Callanane0a64f72011-12-01 21:04:37 +0000309 if (log)
310 log->Printf("ClangExpressionDeclMap::BuildCastVariable - Couldn't export the type for a constant cast result");
311
312 return lldb::ClangExpressionVariableSP();
313 }
314
Sean Callanan63697e52011-05-07 01:06:41 +0000315 TypeFromUser var_type = var_sp->GetTypeFromUser();
316
Sean Callanan933693b2012-02-10 01:22:05 +0000317 StackFrame *frame = exe_ctx.GetFramePtr();
Greg Claytonc14ee322011-09-22 04:58:26 +0000318 if (frame == NULL)
319 return lldb::ClangExpressionVariableSP();
320
321 VariableSP var = FindVariableInScope (*frame, var_sp->GetName(), &var_type);
Sean Callanan63697e52011-05-07 01:06:41 +0000322
323 if (!var)
324 return lldb::ClangExpressionVariableSP(); // but we should handle this; it may be a persistent variable
325
Greg Claytonc14ee322011-09-22 04:58:26 +0000326 ValueObjectSP var_valobj = frame->GetValueObjectForFrameVariable(var, lldb::eNoDynamicValues);
Sean Callanan63697e52011-05-07 01:06:41 +0000327
328 if (!var_valobj)
329 return lldb::ClangExpressionVariableSP();
330
331 ValueObjectSP var_casted_valobj = var_valobj->CastPointerType(name.GetCString(), user_type);
332
333 if (!var_casted_valobj)
334 return lldb::ClangExpressionVariableSP();
335
336 if (log)
337 {
338 StreamString my_stream_string;
339
340 ClangASTType::DumpTypeDescription (var_type.GetASTContext(),
341 var_type.GetOpaqueQualType(),
342 &my_stream_string);
343
344
345 log->Printf("Building cast variable to type: %s", my_stream_string.GetString().c_str());
346 }
347
348 ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->CreatePersistentVariable (var_casted_valobj);
349
350 if (!pvar_sp)
351 return lldb::ClangExpressionVariableSP();
352
353 if (pvar_sp != m_parser_vars->m_persistent_vars->GetVariable(name))
354 return lldb::ClangExpressionVariableSP();
355
356 pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried;
357 pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
358 pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
359
360 return pvar_sp;
361}
362
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000363bool
364ClangExpressionDeclMap::ResultIsReference (const ConstString &name)
365{
366 ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name);
367
368 return (pvar_sp->m_flags & ClangExpressionVariable::EVIsProgramReference);
369}
370
371bool
372ClangExpressionDeclMap::CompleteResultVariable (lldb::ClangExpressionVariableSP &valobj,
373 lldb_private::Value &value,
374 const ConstString &name,
Sean Callanan0886e562011-09-22 00:41:11 +0000375 lldb_private::TypeFromParser type,
Sean Callanan80c48c12011-10-21 05:18:02 +0000376 bool transient,
377 bool maybe_make_load)
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000378{
379 assert (m_parser_vars.get());
380
381 ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name);
382
383 if (!pvar_sp)
384 return false;
Sean Callanan80c48c12011-10-21 05:18:02 +0000385
386 if (maybe_make_load &&
387 value.GetValueType() == Value::eValueTypeFileAddress &&
Sean Callanan933693b2012-02-10 01:22:05 +0000388 m_parser_vars->m_exe_ctx.GetProcessPtr())
Sean Callanan80c48c12011-10-21 05:18:02 +0000389 {
390 value.SetValueType(Value::eValueTypeLoadAddress);
391 }
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000392
393 if (pvar_sp->m_flags & ClangExpressionVariable::EVIsProgramReference &&
Sean Callanan0886e562011-09-22 00:41:11 +0000394 !pvar_sp->m_live_sp &&
395 !transient)
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000396 {
397 // The reference comes from the program. We need to set up a live SP for it.
398
Johnny Chenb456b792011-12-16 23:04:52 +0000399 unsigned long long address = value.GetScalar().ULongLong();
400 AddressType address_type = value.GetValueAddressType();
401
Sean Callanan933693b2012-02-10 01:22:05 +0000402 pvar_sp->m_live_sp = ValueObjectConstResult::Create(m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(),
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000403 pvar_sp->GetTypeFromUser().GetASTContext(),
404 pvar_sp->GetTypeFromUser().GetOpaqueQualType(),
405 pvar_sp->GetName(),
Johnny Chenb456b792011-12-16 23:04:52 +0000406 address,
407 address_type,
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000408 pvar_sp->GetByteSize());
409 }
410
411 if (pvar_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry)
412 {
413 pvar_sp->ValueUpdated();
414
415 const size_t pvar_byte_size = pvar_sp->GetByteSize();
416 uint8_t *pvar_data = pvar_sp->GetValueBytes();
417
Sean Callanan5b26f272012-02-04 08:49:35 +0000418 if (!ReadTarget(pvar_data, value, pvar_byte_size))
419 return false;
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000420
421 pvar_sp->m_flags &= ~(ClangExpressionVariable::EVNeedsFreezeDry);
422 }
423
424 valobj = pvar_sp;
425
426 return true;
427}
428
Sean Callanan5b26f272012-02-04 08:49:35 +0000429void
430ClangExpressionDeclMap::RemoveResultVariable
431(
432 const ConstString &name
433)
434{
435 ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name);
436 m_parser_vars->m_persistent_vars->RemovePersistentVariable(pvar_sp);
437}
438
Sean Callanan549c9f72010-07-13 21:41:46 +0000439bool
Greg Clayton7b462cc2010-10-15 22:48:33 +0000440ClangExpressionDeclMap::AddPersistentVariable
441(
Sean Callanancc427fa2011-07-30 02:42:06 +0000442 const NamedDecl *decl,
Greg Clayton7b462cc2010-10-15 22:48:33 +0000443 const ConstString &name,
Sean Callanan92adcac2011-01-13 08:53:35 +0000444 TypeFromParser parser_type,
445 bool is_result,
446 bool is_lvalue
Greg Clayton7b462cc2010-10-15 22:48:33 +0000447)
Sean Callanan2235f322010-08-11 03:57:18 +0000448{
Sean Callanan979f74d2010-12-03 01:38:59 +0000449 assert (m_parser_vars.get());
450
Sean Callanan92adcac2011-01-13 08:53:35 +0000451 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan933693b2012-02-10 01:22:05 +0000452 ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
453 Target *target = exe_ctx.GetTargetPtr();
Greg Claytonc14ee322011-09-22 04:58:26 +0000454 if (target == NULL)
455 return false;
456
457 ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
Sean Callanan2235f322010-08-11 03:57:18 +0000458
Sean Callananbb120042011-12-16 21:06:35 +0000459 TypeFromUser user_type(m_ast_importer->DeportType(context,
460 parser_type.GetASTContext(),
461 parser_type.GetOpaqueQualType()),
Sean Callanane1175b72011-01-13 21:23:32 +0000462 context);
Sean Callanan00f43622011-11-18 03:28:09 +0000463
464 if (!user_type.GetOpaqueQualType())
465 {
466 if (log)
467 log->Printf("Persistent variable's type wasn't copied successfully");
468 return false;
469 }
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000470
471 if (!m_parser_vars->m_target_info.IsValid())
472 return false;
Sean Callanan2235f322010-08-11 03:57:18 +0000473
Sean Callanan933693b2012-02-10 01:22:05 +0000474 if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx.GetBestExecutionContextScope (),
Jim Ingham6035b672011-03-31 00:19:25 +0000475 name,
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000476 user_type,
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000477 m_parser_vars->m_target_info.byte_order,
478 m_parser_vars->m_target_info.address_byte_size))
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000479 return false;
480
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000481 ClangExpressionVariableSP var_sp (m_parser_vars->m_persistent_vars->GetVariable(name));
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000482
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000483 if (!var_sp)
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000484 return false;
485
Sean Callanan2cb5e522012-09-20 23:21:16 +0000486 var_sp->m_frozen_sp->SetHasCompleteType();
487
Sean Callanan92adcac2011-01-13 08:53:35 +0000488 if (is_result)
489 var_sp->m_flags |= ClangExpressionVariable::EVNeedsFreezeDry;
490 else
491 var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget; // explicitly-declared persistent variables should persist
492
493 if (is_lvalue)
494 {
495 var_sp->m_flags |= ClangExpressionVariable::EVIsProgramReference;
496 }
497 else
498 {
499 var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
500 var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
501 }
502
503 if (log)
504 log->Printf("Created persistent variable with flags 0x%hx", var_sp->m_flags);
505
Sean Callanan3c495c12013-01-15 23:29:36 +0000506 var_sp->EnableParserVars(GetParserID());
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000507
Sean Callanan3c495c12013-01-15 23:29:36 +0000508 ClangExpressionVariable::ParserVars *parser_vars = var_sp->GetParserVars(GetParserID());
509
510 parser_vars->m_named_decl = decl;
511 parser_vars->m_parser_type = parser_type;
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000512
513 return true;
Sean Callanan2235f322010-08-11 03:57:18 +0000514}
515
516bool
Greg Clayton7b462cc2010-10-15 22:48:33 +0000517ClangExpressionDeclMap::AddValueToStruct
518(
Sean Callanancc427fa2011-07-30 02:42:06 +0000519 const NamedDecl *decl,
Greg Clayton7b462cc2010-10-15 22:48:33 +0000520 const ConstString &name,
521 llvm::Value *value,
522 size_t size,
523 off_t alignment
524)
Sean Callanan549c9f72010-07-13 21:41:46 +0000525{
Sean Callanan979f74d2010-12-03 01:38:59 +0000526 assert (m_struct_vars.get());
527 assert (m_parser_vars.get());
528
Greg Clayton2d4edfb2010-11-06 01:53:30 +0000529 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan823bb4c2010-08-30 22:17:16 +0000530
Sean Callanan979f74d2010-12-03 01:38:59 +0000531 m_struct_vars->m_struct_laid_out = false;
Sean Callanan549c9f72010-07-13 21:41:46 +0000532
Sean Callanan3c495c12013-01-15 23:29:36 +0000533 if (m_struct_members.GetVariable(decl, GetParserID()))
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000534 return true;
Sean Callanan549c9f72010-07-13 21:41:46 +0000535
Sean Callanan3c495c12013-01-15 23:29:36 +0000536 ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl, GetParserID()));
Sean Callanan549c9f72010-07-13 21:41:46 +0000537
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000538 if (!var_sp)
Sean Callanan3c495c12013-01-15 23:29:36 +0000539 var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl, GetParserID());
Sean Callanan549c9f72010-07-13 21:41:46 +0000540
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000541 if (!var_sp)
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000542 return false;
543
Sean Callanan823bb4c2010-08-30 22:17:16 +0000544 if (log)
Sean Callanan00f43622011-11-18 03:28:09 +0000545 log->Printf("Adding value for (NamedDecl*)%p [%s - %s] to the structure",
Sean Callanan823bb4c2010-08-30 22:17:16 +0000546 decl,
Greg Clayton7b462cc2010-10-15 22:48:33 +0000547 name.GetCString(),
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000548 var_sp->GetName().GetCString());
Sean Callanan823bb4c2010-08-30 22:17:16 +0000549
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000550 // We know entity->m_parser_vars is valid because we used a parser variable
551 // to find it
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000552
Sean Callanan3c495c12013-01-15 23:29:36 +0000553 ClangExpressionVariable::ParserVars *parser_vars = var_sp->GetParserVars(GetParserID());
554
555 parser_vars->m_llvm_value = value;
556
557 var_sp->EnableJITVars(GetParserID());
558
559 ClangExpressionVariable::JITVars *jit_vars = var_sp->GetJITVars(GetParserID());
560
561 jit_vars->m_alignment = alignment;
562 jit_vars->m_size = size;
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000563
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000564 m_struct_members.AddVariable(var_sp);
Sean Callanan549c9f72010-07-13 21:41:46 +0000565
566 return true;
567}
568
569bool
570ClangExpressionDeclMap::DoStructLayout ()
571{
Sean Callanan979f74d2010-12-03 01:38:59 +0000572 assert (m_struct_vars.get());
573
574 if (m_struct_vars->m_struct_laid_out)
Sean Callanan549c9f72010-07-13 21:41:46 +0000575 return true;
576
Sean Callanan549c9f72010-07-13 21:41:46 +0000577 off_t cursor = 0;
578
Sean Callanan979f74d2010-12-03 01:38:59 +0000579 m_struct_vars->m_struct_alignment = 0;
580 m_struct_vars->m_struct_size = 0;
Sean Callanan549c9f72010-07-13 21:41:46 +0000581
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000582 for (size_t member_index = 0, num_members = m_struct_members.GetSize();
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000583 member_index < num_members;
584 ++member_index)
Sean Callanan549c9f72010-07-13 21:41:46 +0000585 {
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000586 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
587 if (!member_sp)
588 return false;
Sean Callanan3c495c12013-01-15 23:29:36 +0000589
590 ClangExpressionVariable::JITVars *jit_vars = member_sp->GetJITVars(GetParserID());
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000591
Sean Callanan3c495c12013-01-15 23:29:36 +0000592 if (!jit_vars)
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000593 return false;
Sean Callanan549c9f72010-07-13 21:41:46 +0000594
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000595 if (member_index == 0)
Sean Callanan3c495c12013-01-15 23:29:36 +0000596 m_struct_vars->m_struct_alignment = jit_vars->m_alignment;
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000597
Sean Callanan3c495c12013-01-15 23:29:36 +0000598 if (cursor % jit_vars->m_alignment)
599 cursor += (jit_vars->m_alignment - (cursor % jit_vars->m_alignment));
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000600
Sean Callanan3c495c12013-01-15 23:29:36 +0000601 jit_vars->m_offset = cursor;
602 cursor += jit_vars->m_size;
Sean Callanan549c9f72010-07-13 21:41:46 +0000603 }
604
Sean Callanan979f74d2010-12-03 01:38:59 +0000605 m_struct_vars->m_struct_size = cursor;
Sean Callanan549c9f72010-07-13 21:41:46 +0000606
Sean Callanan979f74d2010-12-03 01:38:59 +0000607 m_struct_vars->m_struct_laid_out = true;
Sean Callanan549c9f72010-07-13 21:41:46 +0000608 return true;
609}
610
Greg Clayton7b462cc2010-10-15 22:48:33 +0000611bool ClangExpressionDeclMap::GetStructInfo
612(
613 uint32_t &num_elements,
614 size_t &size,
615 off_t &alignment
616)
Sean Callanan549c9f72010-07-13 21:41:46 +0000617{
Sean Callanan979f74d2010-12-03 01:38:59 +0000618 assert (m_struct_vars.get());
619
620 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan549c9f72010-07-13 21:41:46 +0000621 return false;
622
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000623 num_elements = m_struct_members.GetSize();
Sean Callanan979f74d2010-12-03 01:38:59 +0000624 size = m_struct_vars->m_struct_size;
625 alignment = m_struct_vars->m_struct_alignment;
Sean Callanan549c9f72010-07-13 21:41:46 +0000626
627 return true;
628}
629
630bool
Greg Clayton7b462cc2010-10-15 22:48:33 +0000631ClangExpressionDeclMap::GetStructElement
632(
Sean Callanancc427fa2011-07-30 02:42:06 +0000633 const NamedDecl *&decl,
Greg Clayton7b462cc2010-10-15 22:48:33 +0000634 llvm::Value *&value,
635 off_t &offset,
636 ConstString &name,
637 uint32_t index
638)
Sean Callanan549c9f72010-07-13 21:41:46 +0000639{
Sean Callanan979f74d2010-12-03 01:38:59 +0000640 assert (m_struct_vars.get());
641
642 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan549c9f72010-07-13 21:41:46 +0000643 return false;
644
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000645 if (index >= m_struct_members.GetSize())
Sean Callanan549c9f72010-07-13 21:41:46 +0000646 return false;
647
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000648 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(index));
Sean Callanan549c9f72010-07-13 21:41:46 +0000649
Sean Callanan3c495c12013-01-15 23:29:36 +0000650 if (!member_sp)
651 return false;
652
653 ClangExpressionVariable::ParserVars *parser_vars = member_sp->GetParserVars(GetParserID());
654 ClangExpressionVariable::JITVars *jit_vars = member_sp->GetJITVars(GetParserID());
655
656 if (!parser_vars ||
657 !jit_vars ||
Sean Callanan6f3e5ad2012-04-12 16:58:26 +0000658 !member_sp->GetValueObject())
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000659 return false;
660
Sean Callanan3c495c12013-01-15 23:29:36 +0000661 decl = parser_vars->m_named_decl;
662 value = parser_vars->m_llvm_value;
663 offset = jit_vars->m_offset;
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000664 name = member_sp->GetName();
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000665
Sean Callanan549c9f72010-07-13 21:41:46 +0000666 return true;
667}
668
Sean Callanan7ea35012010-07-27 21:39:39 +0000669bool
Greg Clayton7b462cc2010-10-15 22:48:33 +0000670ClangExpressionDeclMap::GetFunctionInfo
671(
Sean Callanancc427fa2011-07-30 02:42:06 +0000672 const NamedDecl *decl,
Greg Clayton7b462cc2010-10-15 22:48:33 +0000673 uint64_t &ptr
674)
Sean Callanan4edba2d2010-07-27 02:07:53 +0000675{
Sean Callanan3c495c12013-01-15 23:29:36 +0000676 ClangExpressionVariableSP entity_sp(m_found_entities.GetVariable(decl, GetParserID()));
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000677
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000678 if (!entity_sp)
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000679 return false;
Sean Callanan4edba2d2010-07-27 02:07:53 +0000680
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000681 // We know m_parser_vars is valid since we searched for the variable by
682 // its NamedDecl
Sean Callanan4edba2d2010-07-27 02:07:53 +0000683
Sean Callanan3c495c12013-01-15 23:29:36 +0000684 ClangExpressionVariable::ParserVars *parser_vars = entity_sp->GetParserVars(GetParserID());
685
686 ptr = parser_vars->m_lldb_value->GetScalar().ULongLong();
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000687
688 return true;
Sean Callanan4edba2d2010-07-27 02:07:53 +0000689}
690
Sean Callananefe9a422011-08-16 18:09:29 +0000691static void
692FindCodeSymbolInContext
693(
694 const ConstString &name,
695 SymbolContext &sym_ctx,
696 SymbolContextList &sc_list
697)
698{
Matt Kopec00049b82013-02-27 20:13:38 +0000699 SymbolContextList temp_sc_list;
Sean Callananefe9a422011-08-16 18:09:29 +0000700 if (sym_ctx.module_sp)
Matt Kopec00049b82013-02-27 20:13:38 +0000701 sym_ctx.module_sp->FindSymbolsWithNameAndType(name, eSymbolTypeAny, temp_sc_list);
Sean Callananefe9a422011-08-16 18:09:29 +0000702
Matt Kopec00049b82013-02-27 20:13:38 +0000703 if (!sc_list.GetSize() && sym_ctx.target_sp)
704 sym_ctx.target_sp->GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeAny, temp_sc_list);
705
706 unsigned temp_sc_list_size = temp_sc_list.GetSize();
707 for (unsigned i = 0; i < temp_sc_list_size; i++)
708 {
709 SymbolContext sym_ctx;
710 temp_sc_list.GetContextAtIndex(i, sym_ctx);
711 if (sym_ctx.symbol)
712 {
713 switch (sym_ctx.symbol->GetType())
714 {
715 case eSymbolTypeCode:
716 case eSymbolTypeResolver:
717 sc_list.Append(sym_ctx);
718 break;
719
720 default:
721 break;
722 }
723 }
724 }
Sean Callananefe9a422011-08-16 18:09:29 +0000725}
726
Sean Callanan5300d372010-07-31 01:32:05 +0000727bool
Greg Clayton7b462cc2010-10-15 22:48:33 +0000728ClangExpressionDeclMap::GetFunctionAddress
729(
730 const ConstString &name,
Greg Clayton3f5c08f2011-05-18 22:01:49 +0000731 uint64_t &func_addr
Greg Clayton7b462cc2010-10-15 22:48:33 +0000732)
Sean Callanan5300d372010-07-31 01:32:05 +0000733{
Sean Callanan979f74d2010-12-03 01:38:59 +0000734 assert (m_parser_vars.get());
735
Sean Callanan19b6afe2011-05-13 18:27:02 +0000736 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan933693b2012-02-10 01:22:05 +0000737 ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
738 Target *target = exe_ctx.GetTargetPtr();
Sean Callanan5300d372010-07-31 01:32:05 +0000739 // Back out in all cases where we're not fully initialized
Greg Claytonc14ee322011-09-22 04:58:26 +0000740 if (target == NULL)
Jim Ingham895c9822010-12-07 01:56:02 +0000741 return false;
742 if (!m_parser_vars->m_sym_ctx.target_sp)
Sean Callanan5300d372010-07-31 01:32:05 +0000743 return false;
744
Greg Clayton7a345282010-11-09 23:46:37 +0000745 SymbolContextList sc_list;
Sean Callanan5300d372010-07-31 01:32:05 +0000746
Sean Callananefe9a422011-08-16 18:09:29 +0000747 FindCodeSymbolInContext(name, m_parser_vars->m_sym_ctx, sc_list);
Matt Kopec00049b82013-02-27 20:13:38 +0000748
Greg Clayton7a345282010-11-09 23:46:37 +0000749 if (!sc_list.GetSize())
Sean Callanan19b6afe2011-05-13 18:27:02 +0000750 {
751 // We occasionally get debug information in which a const function is reported
752 // as non-const, so the mangled name is wrong. This is a hack to compensate.
753
Sean Callananf4638562011-10-25 18:02:05 +0000754 if (!strncmp(name.GetCString(), "_ZN", 3) &&
755 strncmp(name.GetCString(), "_ZNK", 4))
Sean Callanan19b6afe2011-05-13 18:27:02 +0000756 {
Sean Callananf4638562011-10-25 18:02:05 +0000757 std::string fixed_scratch("_ZNK");
758 fixed_scratch.append(name.GetCString() + 3);
759 ConstString fixed_name(fixed_scratch.c_str());
Sean Callanan19b6afe2011-05-13 18:27:02 +0000760
761 if (log)
Sean Callananf4638562011-10-25 18:02:05 +0000762 log->Printf("Failed to find symbols given non-const name %s; trying %s", name.GetCString(), fixed_name.GetCString());
763
764 FindCodeSymbolInContext(fixed_name, m_parser_vars->m_sym_ctx, sc_list);
Sean Callanan19b6afe2011-05-13 18:27:02 +0000765 }
766 }
767
768 if (!sc_list.GetSize())
Sean Callanan5300d372010-07-31 01:32:05 +0000769 return false;
Matt Kopec00049b82013-02-27 20:13:38 +0000770
Sean Callanan5300d372010-07-31 01:32:05 +0000771 SymbolContext sym_ctx;
Greg Clayton7a345282010-11-09 23:46:37 +0000772 sc_list.GetContextAtIndex(0, sym_ctx);
Matt Kopec00049b82013-02-27 20:13:38 +0000773
Greg Clayton3f5c08f2011-05-18 22:01:49 +0000774 const Address *func_so_addr = NULL;
Matt Kopec00049b82013-02-27 20:13:38 +0000775 bool is_indirect_function = false;
776
Sean Callanan5300d372010-07-31 01:32:05 +0000777 if (sym_ctx.function)
Greg Clayton3f5c08f2011-05-18 22:01:49 +0000778 func_so_addr = &sym_ctx.function->GetAddressRange().GetBaseAddress();
Matt Kopec00049b82013-02-27 20:13:38 +0000779 else if (sym_ctx.symbol) {
Greg Claytone7612132012-03-07 21:03:09 +0000780 func_so_addr = &sym_ctx.symbol->GetAddress();
Matt Kopec00049b82013-02-27 20:13:38 +0000781 is_indirect_function = sym_ctx.symbol->IsIndirect();
782 } else
Sean Callanan5300d372010-07-31 01:32:05 +0000783 return false;
Matt Kopec00049b82013-02-27 20:13:38 +0000784
Sean Callananc6466fc2011-07-07 23:05:43 +0000785 if (!func_so_addr || !func_so_addr->IsValid())
786 return false;
Matt Kopec00049b82013-02-27 20:13:38 +0000787
788 func_addr = func_so_addr->GetCallableLoadAddress (target, is_indirect_function);
Greg Clayton3f5c08f2011-05-18 22:01:49 +0000789
Sean Callanan5300d372010-07-31 01:32:05 +0000790 return true;
791}
792
Greg Clayton084db102011-06-23 04:25:29 +0000793addr_t
Sean Callanane0b23b52012-11-15 02:02:04 +0000794ClangExpressionDeclMap::GetSymbolAddress (Target &target, Process *process, const ConstString &name, lldb::SymbolType symbol_type)
Sean Callananc3a16002011-01-17 23:42:46 +0000795{
Sean Callananc3a16002011-01-17 23:42:46 +0000796 SymbolContextList sc_list;
797
Sean Callanan947ccc72011-12-01 02:04:16 +0000798 target.GetImages().FindSymbolsWithNameAndType(name, symbol_type, sc_list);
Sean Callananc3a16002011-01-17 23:42:46 +0000799
Greg Clayton084db102011-06-23 04:25:29 +0000800 const uint32_t num_matches = sc_list.GetSize();
801 addr_t symbol_load_addr = LLDB_INVALID_ADDRESS;
802
Sean Callanan947ccc72011-12-01 02:04:16 +0000803 for (uint32_t i=0; i<num_matches && (symbol_load_addr == 0 || symbol_load_addr == LLDB_INVALID_ADDRESS); i++)
Greg Clayton084db102011-06-23 04:25:29 +0000804 {
805 SymbolContext sym_ctx;
806 sc_list.GetContextAtIndex(i, sym_ctx);
Sean Callananc3a16002011-01-17 23:42:46 +0000807
Greg Claytone7612132012-03-07 21:03:09 +0000808 const Address *sym_address = &sym_ctx.symbol->GetAddress();
Sean Callananc6466fc2011-07-07 23:05:43 +0000809
810 if (!sym_address || !sym_address->IsValid())
811 return LLDB_INVALID_ADDRESS;
812
Greg Clayton084db102011-06-23 04:25:29 +0000813 if (sym_address)
814 {
815 switch (sym_ctx.symbol->GetType())
816 {
817 case eSymbolTypeCode:
818 case eSymbolTypeTrampoline:
819 symbol_load_addr = sym_address->GetCallableLoadAddress (&target);
820 break;
Matt Kopec00049b82013-02-27 20:13:38 +0000821
822 case eSymbolTypeResolver:
823 symbol_load_addr = sym_address->GetCallableLoadAddress (&target, true);
824 break;
825
Greg Clayton084db102011-06-23 04:25:29 +0000826 case eSymbolTypeData:
827 case eSymbolTypeRuntime:
828 case eSymbolTypeVariable:
829 case eSymbolTypeLocal:
830 case eSymbolTypeParam:
831 case eSymbolTypeInvalid:
832 case eSymbolTypeAbsolute:
Greg Clayton084db102011-06-23 04:25:29 +0000833 case eSymbolTypeException:
834 case eSymbolTypeSourceFile:
835 case eSymbolTypeHeaderFile:
836 case eSymbolTypeObjectFile:
837 case eSymbolTypeCommonBlock:
838 case eSymbolTypeBlock:
839 case eSymbolTypeVariableType:
840 case eSymbolTypeLineEntry:
841 case eSymbolTypeLineHeader:
842 case eSymbolTypeScopeBegin:
843 case eSymbolTypeScopeEnd:
844 case eSymbolTypeAdditional:
845 case eSymbolTypeCompiler:
846 case eSymbolTypeInstrumentation:
847 case eSymbolTypeUndefined:
Greg Clayton456809c2011-12-03 02:30:59 +0000848 case eSymbolTypeObjCClass:
849 case eSymbolTypeObjCMetaClass:
850 case eSymbolTypeObjCIVar:
Greg Clayton084db102011-06-23 04:25:29 +0000851 symbol_load_addr = sym_address->GetLoadAddress (&target);
852 break;
853 }
854 }
855 }
Sean Callananc3a16002011-01-17 23:42:46 +0000856
Sean Callanane0b23b52012-11-15 02:02:04 +0000857 if (symbol_load_addr == LLDB_INVALID_ADDRESS && process)
858 {
859 ObjCLanguageRuntime *runtime = process->GetObjCLanguageRuntime();
860
861 if (runtime)
862 {
863 symbol_load_addr = runtime->LookupRuntimeSymbol(name);
864 }
865 }
866
Greg Clayton084db102011-06-23 04:25:29 +0000867 return symbol_load_addr;
Sean Callananc3a16002011-01-17 23:42:46 +0000868}
869
Greg Clayton084db102011-06-23 04:25:29 +0000870addr_t
Sean Callanan947ccc72011-12-01 02:04:16 +0000871ClangExpressionDeclMap::GetSymbolAddress (const ConstString &name, lldb::SymbolType symbol_type)
Sean Callanand9ca42a2011-05-08 02:21:26 +0000872{
873 assert (m_parser_vars.get());
874
Sean Callanan933693b2012-02-10 01:22:05 +0000875 if (!m_parser_vars->m_exe_ctx.GetTargetPtr())
Sean Callanand9ca42a2011-05-08 02:21:26 +0000876 return false;
877
Sean Callanane0b23b52012-11-15 02:02:04 +0000878 return GetSymbolAddress(m_parser_vars->m_exe_ctx.GetTargetRef(), m_parser_vars->m_exe_ctx.GetProcessPtr(), name, symbol_type);
Sean Callanand9ca42a2011-05-08 02:21:26 +0000879}
880
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000881// Interface for IRInterpreter
882
Sean Callanan80c48c12011-10-21 05:18:02 +0000883Value
884ClangExpressionDeclMap::WrapBareAddress (lldb::addr_t addr)
885{
886 Value ret;
887
888 ret.SetContext(Value::eContextTypeInvalid, NULL);
889
Sean Callanan933693b2012-02-10 01:22:05 +0000890 if (m_parser_vars->m_exe_ctx.GetProcessPtr())
Sean Callanan80c48c12011-10-21 05:18:02 +0000891 ret.SetValueType(Value::eValueTypeLoadAddress);
892 else
893 ret.SetValueType(Value::eValueTypeFileAddress);
894
895 ret.GetScalar() = (unsigned long long)addr;
896
897 return ret;
898}
899
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000900bool
901ClangExpressionDeclMap::WriteTarget (lldb_private::Value &value,
902 const uint8_t *data,
903 size_t length)
904{
905 assert (m_parser_vars.get());
906
Sean Callanan933693b2012-02-10 01:22:05 +0000907 ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000908
Sean Callanan933693b2012-02-10 01:22:05 +0000909 Process *process = exe_ctx.GetProcessPtr();
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000910 if (value.GetContextType() == Value::eContextTypeRegisterInfo)
911 {
Greg Claytonc14ee322011-09-22 04:58:26 +0000912 if (!process)
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000913 return false;
914
Sean Callanan933693b2012-02-10 01:22:05 +0000915 RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000916 RegisterInfo *reg_info = value.GetRegisterInfo();
917
918 if (!reg_ctx)
919 return false;
920
921 lldb_private::RegisterValue reg_value;
922 Error err;
923
Greg Claytonc14ee322011-09-22 04:58:26 +0000924 if (!reg_value.SetFromMemoryData (reg_info, data, length, process->GetByteOrder(), err))
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000925 return false;
926
927 return reg_ctx->WriteRegister(reg_info, reg_value);
928 }
929 else
930 {
931 switch (value.GetValueType())
932 {
933 default:
934 return false;
935 case Value::eValueTypeFileAddress:
936 {
Greg Claytonc14ee322011-09-22 04:58:26 +0000937 if (!process)
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000938 return false;
939
Sean Callanan933693b2012-02-10 01:22:05 +0000940 Target *target = exe_ctx.GetTargetPtr();
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000941 Address file_addr;
942
Greg Claytonc14ee322011-09-22 04:58:26 +0000943 if (!target->GetImages().ResolveFileAddress((lldb::addr_t)value.GetScalar().ULongLong(), file_addr))
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000944 return false;
945
Greg Claytonc14ee322011-09-22 04:58:26 +0000946 lldb::addr_t load_addr = file_addr.GetLoadAddress(target);
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000947
948 Error err;
Greg Claytonc14ee322011-09-22 04:58:26 +0000949 process->WriteMemory(load_addr, data, length, err);
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000950
951 return err.Success();
952 }
953 case Value::eValueTypeLoadAddress:
954 {
Greg Claytonc14ee322011-09-22 04:58:26 +0000955 if (!process)
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000956 return false;
957
958 Error err;
Greg Claytonc14ee322011-09-22 04:58:26 +0000959 process->WriteMemory((lldb::addr_t)value.GetScalar().ULongLong(), data, length, err);
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000960
961 return err.Success();
962 }
963 case Value::eValueTypeHostAddress:
Sean Callanan0eed0d42011-12-06 03:41:14 +0000964 {
965 if (value.GetScalar().ULongLong() == 0 || data == NULL)
966 return false;
967 memcpy ((void *)value.GetScalar().ULongLong(), data, length);
968 return true;
969 }
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000970 case Value::eValueTypeScalar:
971 return false;
972 }
973 }
974}
975
976bool
977ClangExpressionDeclMap::ReadTarget (uint8_t *data,
978 lldb_private::Value &value,
979 size_t length)
980{
981 assert (m_parser_vars.get());
982
Sean Callanan933693b2012-02-10 01:22:05 +0000983 ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
Greg Claytonc14ee322011-09-22 04:58:26 +0000984
Sean Callanan933693b2012-02-10 01:22:05 +0000985 Process *process = exe_ctx.GetProcessPtr();
Greg Claytonc14ee322011-09-22 04:58:26 +0000986
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000987 if (value.GetContextType() == Value::eContextTypeRegisterInfo)
988 {
Greg Claytonc14ee322011-09-22 04:58:26 +0000989 if (!process)
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000990 return false;
991
Sean Callanan933693b2012-02-10 01:22:05 +0000992 RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000993 RegisterInfo *reg_info = value.GetRegisterInfo();
994
995 if (!reg_ctx)
996 return false;
997
998 lldb_private::RegisterValue reg_value;
999 Error err;
1000
1001 if (!reg_ctx->ReadRegister(reg_info, reg_value))
1002 return false;
1003
Greg Claytonc14ee322011-09-22 04:58:26 +00001004 return reg_value.GetAsMemoryData(reg_info, data, length, process->GetByteOrder(), err);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001005 }
1006 else
1007 {
1008 switch (value.GetValueType())
1009 {
1010 default:
1011 return false;
1012 case Value::eValueTypeFileAddress:
1013 {
Sean Callanan933693b2012-02-10 01:22:05 +00001014 Target *target = exe_ctx.GetTargetPtr();
Greg Claytonc14ee322011-09-22 04:58:26 +00001015 if (target == NULL)
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001016 return false;
1017
1018 Address file_addr;
1019
Greg Claytonc14ee322011-09-22 04:58:26 +00001020 if (!target->GetImages().ResolveFileAddress((lldb::addr_t)value.GetScalar().ULongLong(), file_addr))
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001021 return false;
1022
1023 Error err;
Sean Callanan80ef1242012-02-08 21:55:14 +00001024 target->ReadMemory(file_addr, false, data, length, err);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001025
1026 return err.Success();
1027 }
1028 case Value::eValueTypeLoadAddress:
1029 {
Greg Claytonc14ee322011-09-22 04:58:26 +00001030 if (!process)
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001031 return false;
1032
1033 Error err;
Greg Claytonc14ee322011-09-22 04:58:26 +00001034 process->ReadMemory((lldb::addr_t)value.GetScalar().ULongLong(), data, length, err);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001035
1036 return err.Success();
1037 }
1038 case Value::eValueTypeHostAddress:
Sean Callanan00f43622011-11-18 03:28:09 +00001039 {
1040 void *host_addr = (void*)value.GetScalar().ULongLong();
1041
1042 if (!host_addr)
1043 return false;
1044
1045 memcpy (data, host_addr, length);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001046 return true;
Sean Callanan00f43622011-11-18 03:28:09 +00001047 }
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001048 case Value::eValueTypeScalar:
1049 return false;
1050 }
1051 }
1052}
1053
1054lldb_private::Value
Sean Callananf673e762012-02-15 01:40:39 +00001055ClangExpressionDeclMap::LookupDecl (clang::NamedDecl *decl, ClangExpressionVariable::FlagType &flags)
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001056{
1057 assert (m_parser_vars.get());
Sean Callanan933693b2012-02-10 01:22:05 +00001058
Sean Callanan3c495c12013-01-15 23:29:36 +00001059 ClangExpressionVariableSP expr_var_sp (m_found_entities.GetVariable(decl, GetParserID()));
1060 ClangExpressionVariableSP persistent_var_sp (m_parser_vars->m_persistent_vars->GetVariable(decl, GetParserID()));
Sean Callanan9c95fd22011-11-02 23:24:30 +00001061
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001062 if (expr_var_sp)
1063 {
Sean Callananf673e762012-02-15 01:40:39 +00001064 flags = expr_var_sp->m_flags;
1065
Sean Callanan3c495c12013-01-15 23:29:36 +00001066 ClangExpressionVariable::ParserVars *parser_vars = expr_var_sp->GetParserVars(GetParserID());
1067
1068 if (!parser_vars)
Sean Callanane3aef1d2011-10-12 22:20:02 +00001069 return Value();
1070
Sean Callanan9c95fd22011-11-02 23:24:30 +00001071 bool is_reference = expr_var_sp->m_flags & ClangExpressionVariable::EVTypeIsReference;
Sean Callanan80ef1242012-02-08 21:55:14 +00001072
Sean Callanan3c495c12013-01-15 23:29:36 +00001073 if (parser_vars->m_lldb_var)
Sean Callanan9c95fd22011-11-02 23:24:30 +00001074 {
Sean Callanan3c495c12013-01-15 23:29:36 +00001075 std::auto_ptr<Value> value(GetVariableValue(parser_vars->m_lldb_var, NULL));
Sean Callanan9c95fd22011-11-02 23:24:30 +00001076
Sean Callanan80ef1242012-02-08 21:55:14 +00001077 if (is_reference && value.get() && value->GetValueType() == Value::eValueTypeLoadAddress)
1078 {
Sean Callanan933693b2012-02-10 01:22:05 +00001079 Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr();
Sean Callanan80ef1242012-02-08 21:55:14 +00001080
1081 if (!process)
1082 return Value();
1083
1084 lldb::addr_t value_addr = value->GetScalar().ULongLong();
1085 Error read_error;
1086 addr_t ref_value = process->ReadPointerFromMemory (value_addr, read_error);
1087
1088 if (!read_error.Success())
1089 return Value();
1090
1091 value->GetScalar() = (unsigned long long)ref_value;
1092 }
Sean Callanan9c95fd22011-11-02 23:24:30 +00001093
Sean Callanan80ef1242012-02-08 21:55:14 +00001094 if (value.get())
1095 return *value;
1096 else
1097 return Value();
1098 }
Sean Callanan3c495c12013-01-15 23:29:36 +00001099 else if (parser_vars->m_lldb_sym)
Sean Callanan80ef1242012-02-08 21:55:14 +00001100 {
Sean Callanan3c495c12013-01-15 23:29:36 +00001101 const Address sym_address = parser_vars->m_lldb_sym->GetAddress();
Sean Callanan80ef1242012-02-08 21:55:14 +00001102
1103 if (!sym_address.IsValid())
1104 return Value();
1105
1106 Value ret;
1107
Sean Callanan378ecbe2012-02-28 17:55:31 +00001108 ProcessSP process_sp (m_parser_vars->m_exe_ctx.GetProcessSP());
1109
1110 if (process_sp)
1111 {
1112 uint64_t symbol_load_addr = sym_address.GetLoadAddress(&process_sp->GetTarget());
1113
1114 ret.GetScalar() = symbol_load_addr;
1115 ret.SetValueType(Value::eValueTypeLoadAddress);
1116 }
1117 else
1118 {
1119 uint64_t symbol_file_addr = sym_address.GetFileAddress();
1120
1121 ret.GetScalar() = symbol_file_addr;
1122 ret.SetValueType(Value::eValueTypeFileAddress);
1123 }
Sean Callanan80ef1242012-02-08 21:55:14 +00001124
1125 return ret;
1126 }
Sean Callananf673e762012-02-15 01:40:39 +00001127 else if (RegisterInfo *reg_info = expr_var_sp->GetRegisterInfo())
1128 {
1129 StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
1130
1131 if (!frame)
1132 return Value();
1133
1134 RegisterContextSP reg_context_sp(frame->GetRegisterContextSP());
1135
1136 RegisterValue reg_value;
1137
1138 if (!reg_context_sp->ReadRegister(reg_info, reg_value))
1139 return Value();
1140
1141 Value ret;
1142
1143 ret.SetContext(Value::eContextTypeRegisterInfo, reg_info);
Greg Clayton0665a0f2012-10-30 18:18:43 +00001144 if (reg_info->encoding == eEncodingVector)
1145 {
1146 if (ret.SetVectorBytes((uint8_t *)reg_value.GetBytes(), reg_value.GetByteSize(), reg_value.GetByteOrder()))
1147 ret.SetScalarFromVector();
1148 }
1149 else if (!reg_value.GetScalarValue(ret.GetScalar()))
1150 return Value();
Sean Callananf673e762012-02-15 01:40:39 +00001151
1152 return ret;
1153 }
Sean Callanand2cb6262011-10-26 21:20:00 +00001154 else
Sean Callanan80ef1242012-02-08 21:55:14 +00001155 {
Sean Callanand2cb6262011-10-26 21:20:00 +00001156 return Value();
Sean Callanan80ef1242012-02-08 21:55:14 +00001157 }
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001158 }
1159 else if (persistent_var_sp)
1160 {
Sean Callananf673e762012-02-15 01:40:39 +00001161 flags = persistent_var_sp->m_flags;
1162
Sean Callanan0886e562011-09-22 00:41:11 +00001163 if ((persistent_var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference ||
1164 persistent_var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) &&
Sean Callanana76eadd2011-10-22 01:58:08 +00001165 persistent_var_sp->m_live_sp &&
Sean Callanan9b3569b2011-12-10 03:12:34 +00001166 ((persistent_var_sp->m_live_sp->GetValue().GetValueType() == Value::eValueTypeLoadAddress &&
Sean Callanan933693b2012-02-10 01:22:05 +00001167 m_parser_vars->m_exe_ctx.GetProcessSP() &&
1168 m_parser_vars->m_exe_ctx.GetProcessSP()->IsAlive()) ||
Sean Callanan9b3569b2011-12-10 03:12:34 +00001169 (persistent_var_sp->m_live_sp->GetValue().GetValueType() == Value::eValueTypeFileAddress)))
Sean Callanan0886e562011-09-22 00:41:11 +00001170 {
Sean Callanand2cb6262011-10-26 21:20:00 +00001171 return persistent_var_sp->m_live_sp->GetValue();
Sean Callanan0886e562011-09-22 00:41:11 +00001172 }
1173 else
1174 {
1175 lldb_private::Value ret;
1176 ret.SetValueType(Value::eValueTypeHostAddress);
1177 ret.SetContext(Value::eContextTypeInvalid, NULL);
1178 ret.GetScalar() = (lldb::addr_t)persistent_var_sp->GetValueBytes();
1179 return ret;
1180 }
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001181 }
1182 else
1183 {
1184 return Value();
1185 }
1186}
1187
Sean Callanand2cb6262011-10-26 21:20:00 +00001188Value
1189ClangExpressionDeclMap::GetSpecialValue (const ConstString &name)
1190{
1191 assert(m_parser_vars.get());
1192
Sean Callanan933693b2012-02-10 01:22:05 +00001193 StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
Sean Callanand2cb6262011-10-26 21:20:00 +00001194
1195 if (!frame)
1196 return Value();
1197
1198 VariableList *vars = frame->GetVariableList(false);
1199
1200 if (!vars)
1201 return Value();
1202
1203 lldb::VariableSP var = vars->FindVariable(name);
1204
1205 if (!var ||
1206 !var->IsInScope(frame) ||
1207 !var->LocationIsValidForFrame (frame))
1208 return Value();
1209
Sean Callanan933693b2012-02-10 01:22:05 +00001210 std::auto_ptr<Value> value(GetVariableValue(var, NULL));
Sean Callanand2cb6262011-10-26 21:20:00 +00001211
Sean Callanan3dea5c72011-11-03 22:48:37 +00001212 if (value.get() && value->GetValueType() == Value::eValueTypeLoadAddress)
1213 {
Sean Callanan933693b2012-02-10 01:22:05 +00001214 Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr();
Sean Callanan3dea5c72011-11-03 22:48:37 +00001215
1216 if (!process)
1217 return Value();
1218
1219 lldb::addr_t value_addr = value->GetScalar().ULongLong();
1220 Error read_error;
1221 addr_t ptr_value = process->ReadPointerFromMemory (value_addr, read_error);
1222
1223 if (!read_error.Success())
1224 return Value();
1225
1226 value->GetScalar() = (unsigned long long)ptr_value;
1227 }
1228
Sean Callanand2cb6262011-10-26 21:20:00 +00001229 if (value.get())
1230 return *value;
1231 else
1232 return Value();
1233}
1234
Sean Callananea22d422010-07-16 00:09:46 +00001235// Interface for CommandObjectExpression
Sean Callanan1d180662010-07-20 23:31:16 +00001236
1237bool
Greg Clayton7b462cc2010-10-15 22:48:33 +00001238ClangExpressionDeclMap::Materialize
1239(
Greg Clayton7b462cc2010-10-15 22:48:33 +00001240 lldb::addr_t &struct_address,
1241 Error &err
1242)
Sean Callanan1d180662010-07-20 23:31:16 +00001243{
Sean Callanan933693b2012-02-10 01:22:05 +00001244 if (!m_parser_vars.get())
1245 return false;
1246
Sean Callanan979f74d2010-12-03 01:38:59 +00001247 EnableMaterialVars();
1248
Sean Callanan933693b2012-02-10 01:22:05 +00001249 m_material_vars->m_process = m_parser_vars->m_exe_ctx.GetProcessPtr();
Sean Callanan979f74d2010-12-03 01:38:59 +00001250
Sean Callanane359d9b2011-05-09 22:04:36 +00001251 bool result = DoMaterialize(false /* dematerialize */,
Sean Callanane359d9b2011-05-09 22:04:36 +00001252 LLDB_INVALID_ADDRESS /* top of stack frame */,
1253 LLDB_INVALID_ADDRESS /* bottom of stack frame */,
1254 NULL, /* result SP */
1255 err);
Sean Callanan1d180662010-07-20 23:31:16 +00001256
1257 if (result)
Sean Callanan979f74d2010-12-03 01:38:59 +00001258 struct_address = m_material_vars->m_materialized_location;
Sean Callanan1d180662010-07-20 23:31:16 +00001259
1260 return result;
1261}
1262
1263bool
Greg Clayton7b462cc2010-10-15 22:48:33 +00001264ClangExpressionDeclMap::GetObjectPointer
1265(
1266 lldb::addr_t &object_ptr,
Sean Callanan17827832010-12-13 22:46:15 +00001267 ConstString &object_name,
Sean Callanan9d48e802010-12-14 00:42:36 +00001268 Error &err,
1269 bool suppress_type_check
Greg Clayton7b462cc2010-10-15 22:48:33 +00001270)
Sean Callananfc55f5d2010-09-21 00:44:12 +00001271{
Sean Callanan979f74d2010-12-03 01:38:59 +00001272 assert (m_struct_vars.get());
1273
Sean Callanan933693b2012-02-10 01:22:05 +00001274 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
1275 Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr();
1276 StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
Greg Claytonc14ee322011-09-22 04:58:26 +00001277
1278 if (frame == NULL || process == NULL || target == NULL)
Sean Callananfc55f5d2010-09-21 00:44:12 +00001279 {
Sean Callanand5c17ed2011-11-15 02:11:17 +00001280 err.SetErrorStringWithFormat("Couldn't load '%s' because the context is incomplete", object_name.AsCString());
Sean Callananfc55f5d2010-09-21 00:44:12 +00001281 return false;
1282 }
1283
Sean Callanan979f74d2010-12-03 01:38:59 +00001284 if (!m_struct_vars->m_object_pointer_type.GetOpaqueQualType())
Sean Callananfc55f5d2010-09-21 00:44:12 +00001285 {
Sean Callanand5c17ed2011-11-15 02:11:17 +00001286 err.SetErrorStringWithFormat("Couldn't load '%s' because its type is unknown", object_name.AsCString());
Sean Callananfc55f5d2010-09-21 00:44:12 +00001287 return false;
1288 }
1289
Sean Callanan0259e512012-05-21 21:29:52 +00001290 const bool object_pointer = true;
Sean Callanan5056ab02012-02-18 02:01:03 +00001291
Greg Claytonc14ee322011-09-22 04:58:26 +00001292 VariableSP object_ptr_var = FindVariableInScope (*frame,
Sean Callanan63697e52011-05-07 01:06:41 +00001293 object_name,
Sean Callanan5056ab02012-02-18 02:01:03 +00001294 (suppress_type_check ? NULL : &m_struct_vars->m_object_pointer_type),
Sean Callanan0259e512012-05-21 21:29:52 +00001295 object_pointer);
Sean Callananfc55f5d2010-09-21 00:44:12 +00001296
1297 if (!object_ptr_var)
1298 {
Sean Callanand5c17ed2011-11-15 02:11:17 +00001299 err.SetErrorStringWithFormat("Couldn't find '%s' with appropriate type in scope", object_name.AsCString());
Sean Callananfc55f5d2010-09-21 00:44:12 +00001300 return false;
1301 }
1302
Sean Callanan933693b2012-02-10 01:22:05 +00001303 std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(object_ptr_var,
Sean Callanan979f74d2010-12-03 01:38:59 +00001304 NULL));
Sean Callananfc55f5d2010-09-21 00:44:12 +00001305
1306 if (!location_value.get())
1307 {
Sean Callanan17827832010-12-13 22:46:15 +00001308 err.SetErrorStringWithFormat("Couldn't get the location for '%s'", object_name.GetCString());
Sean Callananfc55f5d2010-09-21 00:44:12 +00001309 return false;
1310 }
1311
Sean Callanan54366f12011-03-04 00:23:47 +00001312 switch (location_value->GetValueType())
Sean Callananfc55f5d2010-09-21 00:44:12 +00001313 {
Sean Callanan54366f12011-03-04 00:23:47 +00001314 default:
Sean Callanan17827832010-12-13 22:46:15 +00001315 err.SetErrorStringWithFormat("'%s' is not in memory; LLDB must be extended to handle registers", object_name.GetCString());
Sean Callananfc55f5d2010-09-21 00:44:12 +00001316 return false;
Sean Callanan54366f12011-03-04 00:23:47 +00001317 case Value::eValueTypeLoadAddress:
1318 {
1319 lldb::addr_t value_addr = location_value->GetScalar().ULongLong();
Greg Claytonc14ee322011-09-22 04:58:26 +00001320 uint32_t address_byte_size = target->GetArchitecture().GetAddressByteSize();
Sean Callanan54366f12011-03-04 00:23:47 +00001321
1322 if (ClangASTType::GetClangTypeBitWidth(m_struct_vars->m_object_pointer_type.GetASTContext(),
1323 m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) != address_byte_size * 8)
1324 {
1325 err.SetErrorStringWithFormat("'%s' is not of an expected pointer size", object_name.GetCString());
1326 return false;
1327 }
1328
Sean Callanan54366f12011-03-04 00:23:47 +00001329 Error read_error;
Greg Claytonc14ee322011-09-22 04:58:26 +00001330 object_ptr = process->ReadPointerFromMemory (value_addr, read_error);
Greg Claytonf3ef3d22011-05-22 22:46:53 +00001331 if (read_error.Fail() || object_ptr == LLDB_INVALID_ADDRESS)
Sean Callanan54366f12011-03-04 00:23:47 +00001332 {
1333 err.SetErrorStringWithFormat("Coldn't read '%s' from the target: %s", object_name.GetCString(), read_error.AsCString());
1334 return false;
Greg Claytonf3ef3d22011-05-22 22:46:53 +00001335 }
Sean Callanan54366f12011-03-04 00:23:47 +00001336 return true;
1337 }
1338 case Value::eValueTypeScalar:
1339 {
1340 if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
1341 {
1342 StreamString ss;
1343 location_value->Dump(&ss);
1344
1345 err.SetErrorStringWithFormat("%s is a scalar of unhandled type: %s", object_name.GetCString(), ss.GetString().c_str());
1346 return false;
1347 }
1348
Greg Clayton7349bd92011-05-09 20:18:18 +00001349 RegisterInfo *reg_info = location_value->GetRegisterInfo();
Sean Callanan54366f12011-03-04 00:23:47 +00001350
Greg Clayton7349bd92011-05-09 20:18:18 +00001351 if (!reg_info)
Sean Callanan54366f12011-03-04 00:23:47 +00001352 {
1353 err.SetErrorStringWithFormat("Couldn't get the register information for %s", object_name.GetCString());
1354 return false;
1355 }
1356
Sean Callanan933693b2012-02-10 01:22:05 +00001357 RegisterContext *reg_ctx = m_parser_vars->m_exe_ctx.GetRegisterContext();
Sean Callanan54366f12011-03-04 00:23:47 +00001358
Greg Clayton7349bd92011-05-09 20:18:18 +00001359 if (!reg_ctx)
Sean Callanan54366f12011-03-04 00:23:47 +00001360 {
Greg Clayton7349bd92011-05-09 20:18:18 +00001361 err.SetErrorStringWithFormat("Couldn't read register context to read %s from %s", object_name.GetCString(), reg_info->name);
Sean Callanan54366f12011-03-04 00:23:47 +00001362 return false;
1363 }
1364
Greg Clayton7349bd92011-05-09 20:18:18 +00001365 uint32_t register_number = reg_info->kinds[lldb::eRegisterKindLLDB];
Sean Callanan54366f12011-03-04 00:23:47 +00001366
Greg Clayton7349bd92011-05-09 20:18:18 +00001367 object_ptr = reg_ctx->ReadRegisterAsUnsigned(register_number, 0x0);
Sean Callanan54366f12011-03-04 00:23:47 +00001368
1369 return true;
1370 }
Sean Callananfc55f5d2010-09-21 00:44:12 +00001371 }
1372}
1373
1374bool
Greg Clayton7b462cc2010-10-15 22:48:33 +00001375ClangExpressionDeclMap::Dematerialize
1376(
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001377 ClangExpressionVariableSP &result_sp,
Sean Callanane359d9b2011-05-09 22:04:36 +00001378 lldb::addr_t stack_frame_top,
1379 lldb::addr_t stack_frame_bottom,
Greg Clayton7b462cc2010-10-15 22:48:33 +00001380 Error &err
1381)
Sean Callanan1d180662010-07-20 23:31:16 +00001382{
Sean Callanan933693b2012-02-10 01:22:05 +00001383 return DoMaterialize(true, stack_frame_top, stack_frame_bottom, &result_sp, err);
Sean Callanan979f74d2010-12-03 01:38:59 +00001384
1385 DidDematerialize();
1386}
1387
1388void
1389ClangExpressionDeclMap::DidDematerialize()
1390{
1391 if (m_material_vars.get())
1392 {
1393 if (m_material_vars->m_materialized_location)
1394 {
1395 //#define SINGLE_STEP_EXPRESSIONS
1396
1397#ifndef SINGLE_STEP_EXPRESSIONS
1398 m_material_vars->m_process->DeallocateMemory(m_material_vars->m_materialized_location);
1399#endif
1400 m_material_vars->m_materialized_location = 0;
1401 }
1402
1403 DisableMaterialVars();
1404 }
Sean Callanan1d180662010-07-20 23:31:16 +00001405}
1406
Sean Callanan289e07b2010-07-23 22:19:18 +00001407bool
Greg Clayton7b462cc2010-10-15 22:48:33 +00001408ClangExpressionDeclMap::DumpMaterializedStruct
1409(
Greg Clayton7b462cc2010-10-15 22:48:33 +00001410 Stream &s,
1411 Error &err
1412)
Sean Callanan289e07b2010-07-23 22:19:18 +00001413{
Sean Callanan979f74d2010-12-03 01:38:59 +00001414 assert (m_struct_vars.get());
1415 assert (m_material_vars.get());
1416
1417 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan289e07b2010-07-23 22:19:18 +00001418 {
1419 err.SetErrorString("Structure hasn't been laid out yet");
1420 return false;
1421 }
Sean Callanan933693b2012-02-10 01:22:05 +00001422 Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr();
Greg Claytonc14ee322011-09-22 04:58:26 +00001423
1424 if (!process)
Sean Callanan289e07b2010-07-23 22:19:18 +00001425 {
1426 err.SetErrorString("Couldn't find the process");
1427 return false;
1428 }
1429
Sean Callanan933693b2012-02-10 01:22:05 +00001430 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
Greg Claytonc14ee322011-09-22 04:58:26 +00001431 if (!target)
Sean Callanan289e07b2010-07-23 22:19:18 +00001432 {
1433 err.SetErrorString("Couldn't find the target");
1434 return false;
1435 }
1436
Sean Callananc673a6e2010-12-07 10:00:20 +00001437 if (!m_material_vars->m_materialized_location)
1438 {
1439 err.SetErrorString("No materialized location");
1440 return false;
1441 }
1442
Greg Claytonf3ef3d22011-05-22 22:46:53 +00001443 lldb::DataBufferSP data_sp(new DataBufferHeap(m_struct_vars->m_struct_size, 0));
Sean Callanan289e07b2010-07-23 22:19:18 +00001444
1445 Error error;
Greg Claytonc14ee322011-09-22 04:58:26 +00001446 if (process->ReadMemory (m_material_vars->m_materialized_location,
Greg Claytonf3ef3d22011-05-22 22:46:53 +00001447 data_sp->GetBytes(),
1448 data_sp->GetByteSize(), error) != data_sp->GetByteSize())
Sean Callanan289e07b2010-07-23 22:19:18 +00001449 {
1450 err.SetErrorStringWithFormat ("Couldn't read struct from the target: %s", error.AsCString());
1451 return false;
1452 }
1453
Greg Claytonc14ee322011-09-22 04:58:26 +00001454 DataExtractor extractor(data_sp, process->GetByteOrder(), target->GetArchitecture().GetAddressByteSize());
Sean Callanan289e07b2010-07-23 22:19:18 +00001455
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001456 for (size_t member_idx = 0, num_members = m_struct_members.GetSize();
1457 member_idx < num_members;
1458 ++member_idx)
Sean Callanan289e07b2010-07-23 22:19:18 +00001459 {
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001460 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_idx));
Sean Callanan289e07b2010-07-23 22:19:18 +00001461
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001462 if (!member_sp)
1463 return false;
1464
1465 s.Printf("[%s]\n", member_sp->GetName().GetCString());
Sean Callanan64dfc9a2010-08-23 23:09:38 +00001466
Sean Callanan3c495c12013-01-15 23:29:36 +00001467 ClangExpressionVariable::JITVars *jit_vars = member_sp->GetJITVars(GetParserID());
1468
1469 if (!jit_vars)
Sean Callanan64dfc9a2010-08-23 23:09:38 +00001470 return false;
1471
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001472 extractor.Dump (&s, // stream
Sean Callanan3c495c12013-01-15 23:29:36 +00001473 jit_vars->m_offset, // offset
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001474 lldb::eFormatBytesWithASCII, // format
1475 1, // byte size of individual entries
Sean Callanan3c495c12013-01-15 23:29:36 +00001476 jit_vars->m_size, // number of entries
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001477 16, // entries per line
Sean Callanan3c495c12013-01-15 23:29:36 +00001478 m_material_vars->m_materialized_location + jit_vars->m_offset, // address to print
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001479 0, // bit size (bitfields only; 0 means ignore)
1480 0); // bit alignment (bitfields only; 0 means ignore)
Sean Callanan289e07b2010-07-23 22:19:18 +00001481
1482 s.PutChar('\n');
1483 }
1484
1485 return true;
1486}
1487
Sean Callanan1d180662010-07-20 23:31:16 +00001488bool
Greg Clayton7b462cc2010-10-15 22:48:33 +00001489ClangExpressionDeclMap::DoMaterialize
1490(
1491 bool dematerialize,
Sean Callanane359d9b2011-05-09 22:04:36 +00001492 lldb::addr_t stack_frame_top,
1493 lldb::addr_t stack_frame_bottom,
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001494 lldb::ClangExpressionVariableSP *result_sp_ptr,
Greg Clayton7b462cc2010-10-15 22:48:33 +00001495 Error &err
1496)
Sean Callananea22d422010-07-16 00:09:46 +00001497{
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001498 if (result_sp_ptr)
1499 result_sp_ptr->reset();
1500
Sean Callanan979f74d2010-12-03 01:38:59 +00001501 assert (m_struct_vars.get());
1502
Greg Clayton2d4edfb2010-11-06 01:53:30 +00001503 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanand1e5b432010-08-12 01:56:52 +00001504
Sean Callanan979f74d2010-12-03 01:38:59 +00001505 if (!m_struct_vars->m_struct_laid_out)
Sean Callananea22d422010-07-16 00:09:46 +00001506 {
1507 err.SetErrorString("Structure hasn't been laid out yet");
Greg Claytoncce86712011-09-13 04:03:52 +00001508 return false;
Sean Callananea22d422010-07-16 00:09:46 +00001509 }
1510
Sean Callanan933693b2012-02-10 01:22:05 +00001511 StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
Greg Claytonc14ee322011-09-22 04:58:26 +00001512 if (!frame)
Sean Callananddb46ef2010-07-24 01:37:44 +00001513 {
1514 err.SetErrorString("Received null execution frame");
Greg Claytoncce86712011-09-13 04:03:52 +00001515 return false;
Sean Callananddb46ef2010-07-24 01:37:44 +00001516 }
Sean Callanan933693b2012-02-10 01:22:05 +00001517 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
Sean Callananddb46ef2010-07-24 01:37:44 +00001518
Greg Claytonc14ee322011-09-22 04:58:26 +00001519 ClangPersistentVariables &persistent_vars = target->GetPersistentVariables();
Sean Callanan979f74d2010-12-03 01:38:59 +00001520
1521 if (!m_struct_vars->m_struct_size)
Sean Callanan9e6ed532010-09-13 21:34:21 +00001522 {
1523 if (log)
1524 log->PutCString("Not bothering to allocate a struct because no arguments are needed");
1525
Filipe Cabecinhasd0b87d82012-09-11 18:11:16 +00001526 m_material_vars->m_allocated_area = 0UL;
Sean Callanan9e6ed532010-09-13 21:34:21 +00001527
1528 return true;
1529 }
1530
Greg Claytonc14ee322011-09-22 04:58:26 +00001531 const SymbolContext &sym_ctx(frame->GetSymbolContext(lldb::eSymbolContextEverything));
Sean Callananea22d422010-07-16 00:09:46 +00001532
Sean Callanan1d180662010-07-20 23:31:16 +00001533 if (!dematerialize)
Sean Callananea22d422010-07-16 00:09:46 +00001534 {
Sean Callanan933693b2012-02-10 01:22:05 +00001535 Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr();
Sean Callanan979f74d2010-12-03 01:38:59 +00001536 if (m_material_vars->m_materialized_location)
Sean Callanan1d180662010-07-20 23:31:16 +00001537 {
Greg Claytonc14ee322011-09-22 04:58:26 +00001538 process->DeallocateMemory(m_material_vars->m_materialized_location);
Sean Callanan979f74d2010-12-03 01:38:59 +00001539 m_material_vars->m_materialized_location = 0;
Sean Callanan1d180662010-07-20 23:31:16 +00001540 }
1541
Sean Callanan6b1b9532010-10-08 01:58:41 +00001542 if (log)
1543 log->PutCString("Allocating memory for materialized argument struct");
1544
Greg Claytonc14ee322011-09-22 04:58:26 +00001545 lldb::addr_t mem = process->AllocateMemory(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size,
Sean Callanan00f43622011-11-18 03:28:09 +00001546 lldb::ePermissionsReadable | lldb::ePermissionsWritable,
1547 err);
Sean Callanan1d180662010-07-20 23:31:16 +00001548
1549 if (mem == LLDB_INVALID_ADDRESS)
Sean Callanan00f43622011-11-18 03:28:09 +00001550 {
Daniel Malead01b2952012-11-29 21:49:15 +00001551 err.SetErrorStringWithFormat("Couldn't allocate 0x%llx bytes for materialized argument struct",
Sean Callanan00f43622011-11-18 03:28:09 +00001552 (unsigned long long)(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size));
Sean Callanan1d180662010-07-20 23:31:16 +00001553 return false;
Sean Callanan00f43622011-11-18 03:28:09 +00001554 }
1555
Sean Callanan979f74d2010-12-03 01:38:59 +00001556 m_material_vars->m_allocated_area = mem;
Sean Callananea22d422010-07-16 00:09:46 +00001557 }
1558
Sean Callanan979f74d2010-12-03 01:38:59 +00001559 m_material_vars->m_materialized_location = m_material_vars->m_allocated_area;
Sean Callanan1d180662010-07-20 23:31:16 +00001560
Sean Callanan979f74d2010-12-03 01:38:59 +00001561 if (m_material_vars->m_materialized_location % m_struct_vars->m_struct_alignment)
1562 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 Callanan1d180662010-07-20 23:31:16 +00001563
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001564 for (uint64_t member_index = 0, num_members = m_struct_members.GetSize();
Sean Callanan64dfc9a2010-08-23 23:09:38 +00001565 member_index < num_members;
1566 ++member_index)
Sean Callananea22d422010-07-16 00:09:46 +00001567 {
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001568 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
Sean Callananea22d422010-07-16 00:09:46 +00001569
Sean Callanan3c495c12013-01-15 23:29:36 +00001570 ClangExpressionVariable::JITVars *jit_vars = member_sp->GetJITVars(GetParserID());
1571
1572 if (!jit_vars)
1573 {
1574 err.SetErrorString("Variable being materialized doesn't have JIT state");
1575 return false;
1576 }
1577
Greg Clayton3e06bd92011-01-09 21:07:35 +00001578 if (m_found_entities.ContainsVariable (member_sp))
Sean Callanan64dfc9a2010-08-23 23:09:38 +00001579 {
Sean Callananaa01b832012-08-16 21:34:44 +00001580 if (!member_sp->GetValueObject())
1581 {
1582 err.SetErrorString("Variable being materialized doesn't have a frozen version");
1583 return false;
1584 }
1585
Greg Clayton3e06bd92011-01-09 21:07:35 +00001586 RegisterInfo *reg_info = member_sp->GetRegisterInfo ();
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001587 if (reg_info)
Sean Callanan348b5892010-11-30 00:27:43 +00001588 {
1589 // This is a register variable
1590
Sean Callanan933693b2012-02-10 01:22:05 +00001591 RegisterContext *reg_ctx = m_parser_vars->m_exe_ctx.GetRegisterContext();
Sean Callanan348b5892010-11-30 00:27:43 +00001592
1593 if (!reg_ctx)
Sean Callanan00f43622011-11-18 03:28:09 +00001594 {
1595 err.SetErrorString("Couldn't get register context");
Sean Callanan348b5892010-11-30 00:27:43 +00001596 return false;
Sean Callanan00f43622011-11-18 03:28:09 +00001597 }
1598
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001599 if (!DoMaterializeOneRegister (dematerialize,
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001600 *reg_ctx,
1601 *reg_info,
Sean Callanan3c495c12013-01-15 23:29:36 +00001602 m_material_vars->m_materialized_location + jit_vars->m_offset,
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001603 err))
Sean Callanan348b5892010-11-30 00:27:43 +00001604 return false;
1605 }
1606 else
Sean Callanan3c495c12013-01-15 23:29:36 +00001607 {
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001608 if (!DoMaterializeOneVariable (dematerialize,
Sean Callanan92adcac2011-01-13 08:53:35 +00001609 sym_ctx,
1610 member_sp,
Sean Callanan3c495c12013-01-15 23:29:36 +00001611 m_material_vars->m_materialized_location + jit_vars->m_offset,
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001612 err))
Sean Callanan348b5892010-11-30 00:27:43 +00001613 return false;
1614 }
Sean Callanan64dfc9a2010-08-23 23:09:38 +00001615 }
Sean Callanan64dfc9a2010-08-23 23:09:38 +00001616 else
1617 {
Greg Clayton3e06bd92011-01-09 21:07:35 +00001618 // No need to look for presistent variables if the name doesn't start
1619 // with with a '$' character...
1620 if (member_sp->GetName().AsCString ("!")[0] == '$' && persistent_vars.ContainsVariable(member_sp))
1621 {
Sean Callanan92adcac2011-01-13 08:53:35 +00001622
Greg Clayton3e06bd92011-01-09 21:07:35 +00001623 if (member_sp->GetName() == m_struct_vars->m_result_name)
1624 {
Greg Clayton3e06bd92011-01-09 21:07:35 +00001625 if (log)
1626 log->PutCString("Found result member in the struct");
Sean Callanan92adcac2011-01-13 08:53:35 +00001627
Greg Clayton3e06bd92011-01-09 21:07:35 +00001628 if (result_sp_ptr)
1629 *result_sp_ptr = member_sp;
Sean Callanan92adcac2011-01-13 08:53:35 +00001630
Greg Clayton3e06bd92011-01-09 21:07:35 +00001631 }
1632
1633 if (!DoMaterializeOnePersistentVariable (dematerialize,
Greg Clayton3e06bd92011-01-09 21:07:35 +00001634 member_sp,
Sean Callanan3c495c12013-01-15 23:29:36 +00001635 m_material_vars->m_materialized_location + jit_vars->m_offset,
Sean Callanane359d9b2011-05-09 22:04:36 +00001636 stack_frame_top,
1637 stack_frame_bottom,
Greg Clayton3e06bd92011-01-09 21:07:35 +00001638 err))
1639 return false;
1640 }
1641 else
1642 {
1643 err.SetErrorStringWithFormat("Unexpected variable %s", member_sp->GetName().GetCString());
1644 return false;
1645 }
Sean Callanan64dfc9a2010-08-23 23:09:38 +00001646 }
Sean Callananea22d422010-07-16 00:09:46 +00001647 }
1648
Sean Callanan1d180662010-07-20 23:31:16 +00001649 return true;
1650}
1651
Sean Callanan2235f322010-08-11 03:57:18 +00001652bool
Greg Clayton7b462cc2010-10-15 22:48:33 +00001653ClangExpressionDeclMap::DoMaterializeOnePersistentVariable
1654(
1655 bool dematerialize,
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001656 ClangExpressionVariableSP &var_sp,
Greg Clayton7b462cc2010-10-15 22:48:33 +00001657 lldb::addr_t addr,
Sean Callanane359d9b2011-05-09 22:04:36 +00001658 lldb::addr_t stack_frame_top,
1659 lldb::addr_t stack_frame_bottom,
Greg Clayton7b462cc2010-10-15 22:48:33 +00001660 Error &err
1661)
Sean Callanan979f74d2010-12-03 01:38:59 +00001662{
Sean Callanan92adcac2011-01-13 08:53:35 +00001663 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1664
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001665 if (!var_sp)
Sean Callanan2235f322010-08-11 03:57:18 +00001666 {
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001667 err.SetErrorString("Invalid persistent variable");
Sean Callanan2235f322010-08-11 03:57:18 +00001668 return LLDB_INVALID_ADDRESS;
1669 }
1670
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001671 const size_t pvar_byte_size = var_sp->GetByteSize();
Sean Callanand0ef0ef2010-08-20 01:02:30 +00001672
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001673 uint8_t *pvar_data = var_sp->GetValueBytes();
1674 if (pvar_data == NULL)
Sean Callanan00f43622011-11-18 03:28:09 +00001675 {
1676 err.SetErrorString("Persistent variable being materialized contains no data");
Sean Callanand0ef0ef2010-08-20 01:02:30 +00001677 return false;
Sean Callanan00f43622011-11-18 03:28:09 +00001678 }
Sean Callanand0ef0ef2010-08-20 01:02:30 +00001679
Sean Callanan2235f322010-08-11 03:57:18 +00001680 Error error;
Sean Callanan933693b2012-02-10 01:22:05 +00001681 Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr();
Greg Claytonc14ee322011-09-22 04:58:26 +00001682
Sean Callanan92adcac2011-01-13 08:53:35 +00001683 lldb::addr_t mem; // The address of a spare memory area used to hold the persistent variable.
1684
Sean Callanan2235f322010-08-11 03:57:18 +00001685 if (dematerialize)
1686 {
Sean Callanan92adcac2011-01-13 08:53:35 +00001687 if (log)
1688 log->Printf("Dematerializing persistent variable with flags 0x%hx", var_sp->m_flags);
1689
1690 if ((var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) ||
1691 (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference))
Sean Callanan2235f322010-08-11 03:57:18 +00001692 {
Sean Callanan92adcac2011-01-13 08:53:35 +00001693 // Get the location of the target out of the struct.
1694
1695 Error read_error;
Greg Claytonc14ee322011-09-22 04:58:26 +00001696 mem = process->ReadPointerFromMemory (addr, read_error);
Sean Callanan92adcac2011-01-13 08:53:35 +00001697
1698 if (mem == LLDB_INVALID_ADDRESS)
1699 {
1700 err.SetErrorStringWithFormat("Couldn't read address of %s from struct: %s", var_sp->GetName().GetCString(), error.AsCString());
1701 return false;
1702 }
1703
1704 if (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference &&
1705 !var_sp->m_live_sp)
1706 {
1707 // If the reference comes from the program, then the ClangExpressionVariable's
1708 // live variable data hasn't been set up yet. Do this now.
1709
Sean Callanan933693b2012-02-10 01:22:05 +00001710 var_sp->m_live_sp = ValueObjectConstResult::Create (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope (),
Jim Ingham58b59f92011-04-22 23:53:53 +00001711 var_sp->GetTypeFromUser().GetASTContext(),
1712 var_sp->GetTypeFromUser().GetOpaqueQualType(),
1713 var_sp->GetName(),
1714 mem,
1715 eAddressTypeLoad,
1716 pvar_byte_size);
Sean Callanan92adcac2011-01-13 08:53:35 +00001717 }
1718
1719 if (!var_sp->m_live_sp)
1720 {
1721 err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", var_sp->GetName().GetCString());
1722 return false;
1723 }
1724
Greg Claytone0d378b2011-03-24 21:19:54 +00001725 if (var_sp->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
Sean Callanan92adcac2011-01-13 08:53:35 +00001726 {
1727 err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", var_sp->GetName().GetCString());
1728 return false;
1729 }
1730
Sean Callanane1175b72011-01-13 21:23:32 +00001731 if (var_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry ||
1732 var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
Sean Callanan92adcac2011-01-13 08:53:35 +00001733 {
1734 mem = var_sp->m_live_sp->GetValue().GetScalar().ULongLong();
1735
1736 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +00001737 log->Printf("Dematerializing %s from 0x%" PRIx64 " (size = %u)", var_sp->GetName().GetCString(), (uint64_t)mem, (unsigned)pvar_byte_size);
Sean Callanan92adcac2011-01-13 08:53:35 +00001738
1739 // Read the contents of the spare memory area
Sean Callanane359d9b2011-05-09 22:04:36 +00001740
Sean Callanan92adcac2011-01-13 08:53:35 +00001741 var_sp->ValueUpdated ();
Greg Claytonc14ee322011-09-22 04:58:26 +00001742 if (process->ReadMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
Sean Callanan92adcac2011-01-13 08:53:35 +00001743 {
1744 err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString());
1745 return false;
1746 }
1747
Sean Callanane359d9b2011-05-09 22:04:36 +00001748 if (stack_frame_top != LLDB_INVALID_ADDRESS &&
1749 stack_frame_bottom != LLDB_INVALID_ADDRESS &&
1750 mem >= stack_frame_bottom &&
1751 mem <= stack_frame_top)
1752 {
1753 // If the variable is resident in the stack frame created by the expression,
1754 // then it cannot be relied upon to stay around. We treat it as needing
1755 // reallocation.
1756
1757 var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
1758 var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
1759 var_sp->m_flags &= ~ClangExpressionVariable::EVIsProgramReference;
1760 }
1761
Sean Callanan92adcac2011-01-13 08:53:35 +00001762 var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsFreezeDry;
1763 }
1764
1765 if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation &&
1766 !(var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget))
1767 {
1768 if (m_keep_result_in_memory)
1769 {
1770 var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget;
1771 }
1772 else
1773 {
Greg Claytonc14ee322011-09-22 04:58:26 +00001774 Error deallocate_error = process->DeallocateMemory(mem);
Sean Callanan92adcac2011-01-13 08:53:35 +00001775
1776 if (!err.Success())
1777 {
1778 err.SetErrorStringWithFormat ("Couldn't deallocate memory for %s: %s", var_sp->GetName().GetCString(), deallocate_error.AsCString());
1779 return false;
1780 }
1781 }
1782 }
1783 }
1784 else
1785 {
1786 err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
Sean Callanan2235f322010-08-11 03:57:18 +00001787 return false;
1788 }
1789 }
1790 else
1791 {
Sean Callanan92adcac2011-01-13 08:53:35 +00001792 if (log)
1793 log->Printf("Materializing persistent variable with flags 0x%hx", var_sp->m_flags);
1794
1795 if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation)
Sean Callanan2235f322010-08-11 03:57:18 +00001796 {
Sean Callanan92adcac2011-01-13 08:53:35 +00001797 // Allocate a spare memory area to store the persistent variable's contents.
1798
1799 Error allocate_error;
1800
Greg Claytonc14ee322011-09-22 04:58:26 +00001801 mem = process->AllocateMemory(pvar_byte_size,
Sean Callanand2cb6262011-10-26 21:20:00 +00001802 lldb::ePermissionsReadable | lldb::ePermissionsWritable,
1803 allocate_error);
Sean Callanan92adcac2011-01-13 08:53:35 +00001804
1805 if (mem == LLDB_INVALID_ADDRESS)
1806 {
1807 err.SetErrorStringWithFormat("Couldn't allocate a memory area to store %s: %s", var_sp->GetName().GetCString(), allocate_error.AsCString());
1808 return false;
1809 }
1810
1811 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +00001812 log->Printf("Allocated %s (0x%" PRIx64 ") sucessfully", var_sp->GetName().GetCString(), mem);
Sean Callanan92adcac2011-01-13 08:53:35 +00001813
1814 // Put the location of the spare memory into the live data of the ValueObject.
1815
Sean Callanan933693b2012-02-10 01:22:05 +00001816 var_sp->m_live_sp = ValueObjectConstResult::Create (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(),
Jim Ingham58b59f92011-04-22 23:53:53 +00001817 var_sp->GetTypeFromUser().GetASTContext(),
1818 var_sp->GetTypeFromUser().GetOpaqueQualType(),
1819 var_sp->GetName(),
1820 mem,
1821 eAddressTypeLoad,
1822 pvar_byte_size);
Sean Callanan92adcac2011-01-13 08:53:35 +00001823
1824 // Clear the flag if the variable will never be deallocated.
1825
1826 if (var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
1827 var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsAllocation;
1828
1829 // Write the contents of the variable to the area.
1830
Greg Claytonc14ee322011-09-22 04:58:26 +00001831 if (process->WriteMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
Sean Callanan92adcac2011-01-13 08:53:35 +00001832 {
1833 err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString());
1834 return false;
1835 }
1836 }
1837
1838 if ((var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && var_sp->m_live_sp) ||
1839 var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated)
1840 {
Sean Callanan92adcac2011-01-13 08:53:35 +00001841 // Now write the location of the area into the struct.
Sean Callanan92adcac2011-01-13 08:53:35 +00001842 Error write_error;
Greg Claytonc14ee322011-09-22 04:58:26 +00001843 if (!process->WriteScalarToMemory (addr,
Sean Callanand2cb6262011-10-26 21:20:00 +00001844 var_sp->m_live_sp->GetValue().GetScalar(),
1845 process->GetAddressByteSize(),
1846 write_error))
Sean Callanan92adcac2011-01-13 08:53:35 +00001847 {
1848 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", var_sp->GetName().GetCString(), write_error.AsCString());
1849 return false;
1850 }
1851
1852 if (log)
Greg Claytonf3ef3d22011-05-22 22:46:53 +00001853 log->Printf("Materialized %s into 0x%llx", var_sp->GetName().GetCString(), var_sp->m_live_sp->GetValue().GetScalar().ULongLong());
Sean Callanan92adcac2011-01-13 08:53:35 +00001854 }
Sean Callanan63697e52011-05-07 01:06:41 +00001855 else if (!(var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference))
Sean Callanan92adcac2011-01-13 08:53:35 +00001856 {
1857 err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
Sean Callanan2235f322010-08-11 03:57:18 +00001858 return false;
1859 }
1860 }
1861
1862 return true;
1863}
1864
Sean Callanan7b5805d2013-01-18 21:20:51 +00001865bool
1866ClangExpressionDeclMap::CreateLiveMemoryForExpressionVariable
1867(
1868 Process &process,
1869 ClangExpressionVariableSP &expr_var,
1870 Error &err
1871)
1872{
1873 Error allocate_error;
1874 TypeFromUser type(expr_var->GetTypeFromUser());
1875 const ConstString &name(expr_var->GetName());
1876
1877 size_t value_bit_size = ClangASTType::GetClangTypeBitWidth(type.GetASTContext(), type.GetOpaqueQualType());
1878 size_t value_byte_size = value_bit_size % 8 ? ((value_bit_size + 8) / 8) : (value_bit_size / 8);
1879
1880 Scalar val_addr (process.AllocateMemory (value_byte_size,
1881 lldb::ePermissionsReadable | lldb::ePermissionsWritable,
1882 allocate_error));
1883
1884 if (val_addr.ULongLong() == LLDB_INVALID_ADDRESS)
1885 {
1886 err.SetErrorStringWithFormat ("Couldn't allocate a memory area to store %s: %s",
1887 name.GetCString(),
1888 allocate_error.AsCString());
1889 return false;
1890 }
1891
1892 // Put the location of the spare memory into the live data of the ValueObject.
1893
1894 expr_var->m_live_sp = ValueObjectConstResult::Create (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(),
1895 type.GetASTContext(),
1896 type.GetOpaqueQualType(),
1897 name,
1898 val_addr.ULongLong(),
1899 eAddressTypeLoad,
1900 value_byte_size);
1901
1902 return true;
1903}
1904
1905bool
1906ClangExpressionDeclMap::DeleteLiveMemoryForExpressionVariable
1907(
1908 Process &process,
1909 ClangExpressionVariableSP &expr_var,
1910 Error &err
1911)
1912{
1913 const ConstString &name(expr_var->GetName());
1914
1915 Scalar &val_addr = expr_var->m_live_sp->GetValue().GetScalar();
1916
1917 Error deallocate_error = process.DeallocateMemory(val_addr.ULongLong());
1918
1919 if (!deallocate_error.Success())
1920 {
1921 err.SetErrorStringWithFormat ("Couldn't deallocate spare memory area for %s: %s",
1922 name.GetCString(),
1923 deallocate_error.AsCString());
1924 return false;
1925 }
1926
1927 expr_var->m_live_sp.reset();
1928
1929 return true;
1930}
1931
1932bool
Greg Clayton7b462cc2010-10-15 22:48:33 +00001933ClangExpressionDeclMap::DoMaterializeOneVariable
1934(
1935 bool dematerialize,
Greg Clayton7b462cc2010-10-15 22:48:33 +00001936 const SymbolContext &sym_ctx,
Sean Callanan92adcac2011-01-13 08:53:35 +00001937 ClangExpressionVariableSP &expr_var,
Sean Callanan7b5805d2013-01-18 21:20:51 +00001938 lldb::addr_t addr,
Greg Clayton7b462cc2010-10-15 22:48:33 +00001939 Error &err
1940)
Sean Callanan1d180662010-07-20 23:31:16 +00001941{
Greg Clayton2d4edfb2010-11-06 01:53:30 +00001942 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan933693b2012-02-10 01:22:05 +00001943 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
1944 Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr();
1945 StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
Sean Callanan3c495c12013-01-15 23:29:36 +00001946
1947 ClangExpressionVariable::ParserVars *var_parser_vars = expr_var->GetParserVars(GetParserID());
Greg Claytonc14ee322011-09-22 04:58:26 +00001948
Sean Callanan3c495c12013-01-15 23:29:36 +00001949 if (!frame || !process || !target || !m_parser_vars.get() || !var_parser_vars)
Sean Callanan00f43622011-11-18 03:28:09 +00001950 {
1951 err.SetErrorString("Necessary state for variable materialization isn't present");
Sean Callanan44096b12010-09-14 21:59:34 +00001952 return false;
Sean Callanan00f43622011-11-18 03:28:09 +00001953 }
Sean Callanan44096b12010-09-14 21:59:34 +00001954
Sean Callanan92adcac2011-01-13 08:53:35 +00001955 // Vital information about the value
1956
1957 const ConstString &name(expr_var->GetName());
1958 TypeFromUser type(expr_var->GetTypeFromUser());
1959
Sean Callanan3c495c12013-01-15 23:29:36 +00001960 VariableSP &var(var_parser_vars->m_lldb_var);
1961 const lldb_private::Symbol *symbol = var_parser_vars->m_lldb_sym;
Sean Callanan1d180662010-07-20 23:31:16 +00001962
Sean Callanan98298012011-10-27 19:41:13 +00001963 bool is_reference(expr_var->m_flags & ClangExpressionVariable::EVTypeIsReference);
1964
Sean Callanand9ca42a2011-05-08 02:21:26 +00001965 std::auto_ptr<lldb_private::Value> location_value;
Sean Callanan8e5b8b92011-10-13 00:09:20 +00001966
Sean Callanand9ca42a2011-05-08 02:21:26 +00001967 if (var)
1968 {
Sean Callanan933693b2012-02-10 01:22:05 +00001969 location_value.reset(GetVariableValue(var,
Sean Callanand9ca42a2011-05-08 02:21:26 +00001970 NULL));
1971 }
Greg Clayton3d51b9f2012-11-27 01:52:16 +00001972 else if (symbol)
Sean Callanan8e5b8b92011-10-13 00:09:20 +00001973 {
Sean Callanane0b23b52012-11-15 02:02:04 +00001974 addr_t location_load_addr = GetSymbolAddress(*target, process, name, lldb::eSymbolTypeAny);
Sean Callanand9ca42a2011-05-08 02:21:26 +00001975
Greg Clayton084db102011-06-23 04:25:29 +00001976 if (location_load_addr == LLDB_INVALID_ADDRESS)
Sean Callanand9ca42a2011-05-08 02:21:26 +00001977 {
1978 if (log)
Greg Claytonf3ef3d22011-05-22 22:46:53 +00001979 err.SetErrorStringWithFormat ("Couldn't find value for global symbol %s",
1980 name.GetCString());
Sean Callanand9ca42a2011-05-08 02:21:26 +00001981 }
1982
Sean Callanan8e5b8b92011-10-13 00:09:20 +00001983 location_value.reset(new Value);
1984
Sean Callanand9ca42a2011-05-08 02:21:26 +00001985 location_value->SetValueType(Value::eValueTypeLoadAddress);
1986 location_value->GetScalar() = location_load_addr;
1987 }
1988 else
Sean Callanan1d180662010-07-20 23:31:16 +00001989 {
Greg Claytonf3ef3d22011-05-22 22:46:53 +00001990 err.SetErrorStringWithFormat ("Couldn't find %s with appropriate type",
1991 name.GetCString());
Sean Callanan1d180662010-07-20 23:31:16 +00001992 return false;
1993 }
1994
Sean Callananebf77072010-07-23 00:16:21 +00001995 if (log)
Sean Callanan77502262011-05-12 23:54:16 +00001996 {
1997 StreamString my_stream_string;
1998
1999 ClangASTType::DumpTypeDescription (type.GetASTContext(),
2000 type.GetOpaqueQualType(),
2001 &my_stream_string);
2002
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002003 log->Printf ("%s %s with type %s",
2004 dematerialize ? "Dematerializing" : "Materializing",
2005 name.GetCString(),
2006 my_stream_string.GetString().c_str());
Sean Callanan77502262011-05-12 23:54:16 +00002007 }
Sean Callanan1d180662010-07-20 23:31:16 +00002008
2009 if (!location_value.get())
2010 {
Greg Clayton7b462cc2010-10-15 22:48:33 +00002011 err.SetErrorStringWithFormat("Couldn't get value for %s", name.GetCString());
Sean Callanan1d180662010-07-20 23:31:16 +00002012 return false;
2013 }
Sean Callananf4b9bd32010-10-05 20:18:48 +00002014
2015 // The size of the type contained in addr
Sean Callanan1d180662010-07-20 23:31:16 +00002016
Sean Callanan92adcac2011-01-13 08:53:35 +00002017 size_t value_bit_size = ClangASTType::GetClangTypeBitWidth(type.GetASTContext(), type.GetOpaqueQualType());
2018 size_t value_byte_size = value_bit_size % 8 ? ((value_bit_size + 8) / 8) : (value_bit_size / 8);
Sean Callananf4b9bd32010-10-05 20:18:48 +00002019
2020 Value::ValueType value_type = location_value->GetValueType();
2021
2022 switch (value_type)
Sean Callanan1d180662010-07-20 23:31:16 +00002023 {
Sean Callananf4b9bd32010-10-05 20:18:48 +00002024 default:
Sean Callanan1d180662010-07-20 23:31:16 +00002025 {
Sean Callananf4b9bd32010-10-05 20:18:48 +00002026 StreamString ss;
2027
2028 location_value->Dump(&ss);
2029
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002030 err.SetErrorStringWithFormat ("%s has a value of unhandled type: %s",
2031 name.GetCString(),
2032 ss.GetString().c_str());
Sean Callanan1d180662010-07-20 23:31:16 +00002033 return false;
2034 }
Sean Callananf4b9bd32010-10-05 20:18:48 +00002035 break;
Sean Callanan7b5805d2013-01-18 21:20:51 +00002036 case Value::eValueTypeHostAddress:
2037 {
2038 if (dematerialize)
2039 {
2040 if (!DeleteLiveMemoryForExpressionVariable(*process, expr_var, err))
2041 return false;
2042 }
2043 else
2044 {
2045 DataExtractor value_data_extractor;
2046
2047 if (location_value->GetData(value_data_extractor))
2048 {
2049 if (value_byte_size != value_data_extractor.GetByteSize())
2050 {
Matt Kopec676a4872013-02-21 23:55:31 +00002051 err.SetErrorStringWithFormat ("Size mismatch for %s: %" PRIu64 " versus %" PRIu64,
Sean Callanan7b5805d2013-01-18 21:20:51 +00002052 name.GetCString(),
2053 (uint64_t)value_data_extractor.GetByteSize(),
2054 (uint64_t)value_byte_size);
2055 return false;
2056 }
2057
2058 if (!CreateLiveMemoryForExpressionVariable(*process, expr_var, err))
2059 return false;
2060
2061 Scalar &buf_addr = expr_var->m_live_sp->GetValue().GetScalar();
2062
2063 Error write_error;
2064
2065 if (!process->WriteMemory(buf_addr.ULongLong(),
2066 value_data_extractor.GetDataStart(),
2067 value_data_extractor.GetByteSize(),
2068 write_error))
2069 {
2070 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
2071 name.GetCString(),
2072 write_error.AsCString());
2073 return false;
2074 }
2075
2076 if (!process->WriteScalarToMemory(addr,
2077 buf_addr,
2078 process->GetAddressByteSize(),
2079 write_error))
2080 {
2081 err.SetErrorStringWithFormat ("Couldn't write the address of %s to the target: %s",
2082 name.GetCString(),
2083 write_error.AsCString());
2084 return false;
2085 }
2086 }
2087 else
2088 {
2089 err.SetErrorStringWithFormat ("%s is marked as a host address but doesn't contain any data",
2090 name.GetCString());
2091 return false;
2092 }
2093 }
2094 }
2095 break;
Sean Callananf4b9bd32010-10-05 20:18:48 +00002096 case Value::eValueTypeLoadAddress:
Sean Callanan1d180662010-07-20 23:31:16 +00002097 {
Sean Callanan92adcac2011-01-13 08:53:35 +00002098 if (!dematerialize)
Sean Callananf4b9bd32010-10-05 20:18:48 +00002099 {
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002100 Error write_error;
Sean Callanan92adcac2011-01-13 08:53:35 +00002101
Sean Callanan98298012011-10-27 19:41:13 +00002102 if (is_reference)
Sean Callanan92adcac2011-01-13 08:53:35 +00002103 {
Sean Callanan98298012011-10-27 19:41:13 +00002104 Error read_error;
2105
2106 addr_t ref_value = process->ReadPointerFromMemory(location_value->GetScalar().ULongLong(), read_error);
2107
2108 if (!read_error.Success())
2109 {
2110 err.SetErrorStringWithFormat ("Couldn't read reference to %s from the target: %s",
2111 name.GetCString(),
2112 read_error.AsCString());
2113 return false;
2114 }
2115
2116 if (!process->WritePointerToMemory(addr,
2117 ref_value,
2118 write_error))
2119 {
2120 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
2121 name.GetCString(),
2122 write_error.AsCString());
2123 return false;
2124 }
2125 }
2126 else
2127 {
2128 if (!process->WriteScalarToMemory (addr,
2129 location_value->GetScalar(),
2130 process->GetAddressByteSize(),
2131 write_error))
2132 {
2133 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
2134 name.GetCString(),
2135 write_error.AsCString());
2136 return false;
2137 }
Sean Callanan92adcac2011-01-13 08:53:35 +00002138 }
Sean Callananf4b9bd32010-10-05 20:18:48 +00002139 }
Sean Callanan1d180662010-07-20 23:31:16 +00002140 }
Sean Callananf4b9bd32010-10-05 20:18:48 +00002141 break;
2142 case Value::eValueTypeScalar:
2143 {
Greg Clayton526e5af2010-11-13 03:52:47 +00002144 if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
Sean Callananf4b9bd32010-10-05 20:18:48 +00002145 {
2146 StreamString ss;
Sean Callananf4b9bd32010-10-05 20:18:48 +00002147 location_value->Dump(&ss);
2148
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002149 err.SetErrorStringWithFormat ("%s is a scalar of unhandled type: %s",
2150 name.GetCString(),
2151 ss.GetString().c_str());
Sean Callananf4b9bd32010-10-05 20:18:48 +00002152 return false;
2153 }
2154
Greg Clayton7349bd92011-05-09 20:18:18 +00002155 RegisterInfo *reg_info = location_value->GetRegisterInfo();
Sean Callananf4b9bd32010-10-05 20:18:48 +00002156
Greg Clayton7349bd92011-05-09 20:18:18 +00002157 if (!reg_info)
Sean Callananf4b9bd32010-10-05 20:18:48 +00002158 {
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002159 err.SetErrorStringWithFormat ("Couldn't get the register information for %s",
2160 name.GetCString());
Sean Callananf4b9bd32010-10-05 20:18:48 +00002161 return false;
2162 }
Sean Callananf4b9bd32010-10-05 20:18:48 +00002163
Greg Clayton7349bd92011-05-09 20:18:18 +00002164 RegisterValue reg_value;
2165
Sean Callanan933693b2012-02-10 01:22:05 +00002166 RegisterContext *reg_ctx = m_parser_vars->m_exe_ctx.GetRegisterContext();
Greg Clayton7349bd92011-05-09 20:18:18 +00002167
2168 if (!reg_ctx)
Sean Callananf4b9bd32010-10-05 20:18:48 +00002169 {
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002170 err.SetErrorStringWithFormat ("Couldn't read register context to read %s from %s",
2171 name.GetCString(),
2172 reg_info->name);
Sean Callananf4b9bd32010-10-05 20:18:48 +00002173 return false;
2174 }
2175
Greg Clayton7349bd92011-05-09 20:18:18 +00002176 uint32_t register_byte_size = reg_info->byte_size;
Sean Callananf4b9bd32010-10-05 20:18:48 +00002177
2178 if (dematerialize)
2179 {
Sean Callanan98298012011-10-27 19:41:13 +00002180 if (is_reference)
2181 return true; // reference types don't need demateralizing
2182
Sean Callanan92adcac2011-01-13 08:53:35 +00002183 // Get the location of the spare memory area out of the variable's live data.
2184
2185 if (!expr_var->m_live_sp)
2186 {
2187 err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", name.GetCString());
2188 return false;
2189 }
2190
Greg Claytone0d378b2011-03-24 21:19:54 +00002191 if (expr_var->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
Sean Callanan92adcac2011-01-13 08:53:35 +00002192 {
2193 err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", name.GetCString());
2194 return false;
2195 }
2196
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002197 Scalar &reg_addr = expr_var->m_live_sp->GetValue().GetScalar();
Sean Callanan92adcac2011-01-13 08:53:35 +00002198
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002199 err = reg_ctx->ReadRegisterValueFromMemory (reg_info,
2200 reg_addr.ULongLong(),
2201 value_byte_size,
2202 reg_value);
Greg Clayton7349bd92011-05-09 20:18:18 +00002203 if (err.Fail())
Sean Callananf4b9bd32010-10-05 20:18:48 +00002204 return false;
Greg Clayton7349bd92011-05-09 20:18:18 +00002205
2206 if (!reg_ctx->WriteRegister (reg_info, reg_value))
Sean Callananf4b9bd32010-10-05 20:18:48 +00002207 {
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002208 err.SetErrorStringWithFormat ("Couldn't write %s to register %s",
2209 name.GetCString(),
2210 reg_info->name);
Sean Callananf4b9bd32010-10-05 20:18:48 +00002211 return false;
2212 }
Sean Callanan92adcac2011-01-13 08:53:35 +00002213
Sean Callanan7b5805d2013-01-18 21:20:51 +00002214 if (!DeleteLiveMemoryForExpressionVariable(*process, expr_var, err))
Sean Callanan92adcac2011-01-13 08:53:35 +00002215 return false;
Sean Callananf4b9bd32010-10-05 20:18:48 +00002216 }
2217 else
2218 {
Sean Callanan98298012011-10-27 19:41:13 +00002219 Error write_error;
2220
2221 RegisterValue reg_value;
2222
2223 if (!reg_ctx->ReadRegister (reg_info, reg_value))
2224 {
2225 err.SetErrorStringWithFormat ("Couldn't read %s from %s",
2226 name.GetCString(),
2227 reg_info->name);
2228 return false;
2229 }
2230
2231 if (is_reference)
2232 {
2233 write_error = reg_ctx->WriteRegisterValueToMemory(reg_info,
2234 addr,
2235 process->GetAddressByteSize(),
2236 reg_value);
2237
2238 if (!write_error.Success())
2239 {
2240 err.SetErrorStringWithFormat ("Couldn't write %s from register %s to the target: %s",
2241 name.GetCString(),
2242 reg_info->name,
2243 write_error.AsCString());
2244 return false;
2245 }
2246
2247 return true;
2248 }
Sean Callanan7b5805d2013-01-18 21:20:51 +00002249
Sean Callanan92adcac2011-01-13 08:53:35 +00002250 // Allocate a spare memory area to place the register's contents into. This memory area will be pointed to by the slot in the
2251 // struct.
2252
Sean Callanan7b5805d2013-01-18 21:20:51 +00002253 if (!CreateLiveMemoryForExpressionVariable (*process, expr_var, err))
Sean Callanan92adcac2011-01-13 08:53:35 +00002254 return false;
Sean Callanan92adcac2011-01-13 08:53:35 +00002255
2256 // Now write the location of the area into the struct.
Sean Callanan7b5805d2013-01-18 21:20:51 +00002257
2258 Scalar &reg_addr = expr_var->m_live_sp->GetValue().GetScalar();
2259
Greg Claytonc14ee322011-09-22 04:58:26 +00002260 if (!process->WriteScalarToMemory (addr,
Sean Callanan98298012011-10-27 19:41:13 +00002261 reg_addr,
2262 process->GetAddressByteSize(),
2263 write_error))
Sean Callanan92adcac2011-01-13 08:53:35 +00002264 {
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002265 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
2266 name.GetCString(),
2267 write_error.AsCString());
Sean Callanan92adcac2011-01-13 08:53:35 +00002268 return false;
2269 }
2270
Sean Callanan92adcac2011-01-13 08:53:35 +00002271 if (value_byte_size > register_byte_size)
Sean Callananf4b9bd32010-10-05 20:18:48 +00002272 {
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002273 err.SetErrorStringWithFormat ("%s is too big to store in %s",
2274 name.GetCString(),
2275 reg_info->name);
Sean Callananf4b9bd32010-10-05 20:18:48 +00002276 return false;
2277 }
Greg Clayton7349bd92011-05-09 20:18:18 +00002278
Greg Clayton7349bd92011-05-09 20:18:18 +00002279 if (!reg_ctx->ReadRegister (reg_info, reg_value))
Sean Callananf4b9bd32010-10-05 20:18:48 +00002280 {
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002281 err.SetErrorStringWithFormat ("Couldn't read %s from %s",
2282 name.GetCString(),
2283 reg_info->name);
Sean Callananf4b9bd32010-10-05 20:18:48 +00002284 return false;
2285 }
2286
Greg Claytonf3ef3d22011-05-22 22:46:53 +00002287 err = reg_ctx->WriteRegisterValueToMemory (reg_info,
2288 reg_addr.ULongLong(),
2289 value_byte_size,
2290 reg_value);
Greg Clayton7349bd92011-05-09 20:18:18 +00002291 if (err.Fail())
Sean Callananf4b9bd32010-10-05 20:18:48 +00002292 return false;
Sean Callananf4b9bd32010-10-05 20:18:48 +00002293 }
2294 }
Sean Callanan1d180662010-07-20 23:31:16 +00002295 }
2296
2297 return true;
Sean Callananea22d422010-07-16 00:09:46 +00002298}
2299
Sean Callanan348b5892010-11-30 00:27:43 +00002300bool
2301ClangExpressionDeclMap::DoMaterializeOneRegister
2302(
2303 bool dematerialize,
Sean Callanan348b5892010-11-30 00:27:43 +00002304 RegisterContext &reg_ctx,
Greg Claytone0d378b2011-03-24 21:19:54 +00002305 const RegisterInfo &reg_info,
Sean Callanan348b5892010-11-30 00:27:43 +00002306 lldb::addr_t addr,
2307 Error &err
2308)
2309{
Sean Callanan348b5892010-11-30 00:27:43 +00002310 uint32_t register_byte_size = reg_info.byte_size;
Greg Clayton7349bd92011-05-09 20:18:18 +00002311 RegisterValue reg_value;
Sean Callanan348b5892010-11-30 00:27:43 +00002312 if (dematerialize)
2313 {
Greg Clayton7349bd92011-05-09 20:18:18 +00002314 Error read_error (reg_ctx.ReadRegisterValueFromMemory(&reg_info, addr, register_byte_size, reg_value));
2315 if (read_error.Fail())
Sean Callanan348b5892010-11-30 00:27:43 +00002316 {
Greg Clayton1a65ae12011-01-25 23:55:37 +00002317 err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", reg_info.name, read_error.AsCString());
Sean Callanan348b5892010-11-30 00:27:43 +00002318 return false;
2319 }
2320
Greg Clayton7349bd92011-05-09 20:18:18 +00002321 if (!reg_ctx.WriteRegister (&reg_info, reg_value))
Sean Callanan348b5892010-11-30 00:27:43 +00002322 {
Greg Clayton7349bd92011-05-09 20:18:18 +00002323 err.SetErrorStringWithFormat("Couldn't write register %s (dematerialize)", reg_info.name);
Sean Callanan348b5892010-11-30 00:27:43 +00002324 return false;
2325 }
2326 }
2327 else
2328 {
Sean Callanan348b5892010-11-30 00:27:43 +00002329
Greg Clayton7349bd92011-05-09 20:18:18 +00002330 if (!reg_ctx.ReadRegister(&reg_info, reg_value))
Sean Callanan348b5892010-11-30 00:27:43 +00002331 {
Greg Clayton7349bd92011-05-09 20:18:18 +00002332 err.SetErrorStringWithFormat("Couldn't read %s (materialize)", reg_info.name);
Sean Callanan348b5892010-11-30 00:27:43 +00002333 return false;
2334 }
2335
Greg Clayton7349bd92011-05-09 20:18:18 +00002336 Error write_error (reg_ctx.WriteRegisterValueToMemory(&reg_info, addr, register_byte_size, reg_value));
2337 if (write_error.Fail())
Sean Callanan348b5892010-11-30 00:27:43 +00002338 {
Jason Molenda7e589a62011-09-20 00:26:08 +00002339 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", reg_info.name, write_error.AsCString());
Sean Callanan348b5892010-11-30 00:27:43 +00002340 return false;
2341 }
2342 }
2343
2344 return true;
2345}
2346
Sean Callanan63697e52011-05-07 01:06:41 +00002347lldb::VariableSP
Greg Clayton7b462cc2010-10-15 22:48:33 +00002348ClangExpressionDeclMap::FindVariableInScope
2349(
2350 StackFrame &frame,
2351 const ConstString &name,
Sean Callanan5056ab02012-02-18 02:01:03 +00002352 TypeFromUser *type,
Sean Callanan0259e512012-05-21 21:29:52 +00002353 bool object_pointer
Greg Clayton7b462cc2010-10-15 22:48:33 +00002354)
Sean Callanan979f74d2010-12-03 01:38:59 +00002355{
Greg Clayton2d4edfb2010-11-06 01:53:30 +00002356 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan44096b12010-09-14 21:59:34 +00002357
Sean Callanan69b53412011-08-06 00:28:14 +00002358 ValueObjectSP valobj;
2359 VariableSP var_sp;
2360 Error err;
Sean Callanan44096b12010-09-14 21:59:34 +00002361
Sean Callananaf776172013-02-12 07:56:36 +00002362 valobj = frame.GetValueForVariableExpressionPath(name.GetCString(),
Sean Callanan69b53412011-08-06 00:28:14 +00002363 eNoDynamicValues,
Sean Callananaf776172013-02-12 07:56:36 +00002364 StackFrame::eExpressionPathOptionCheckPtrVsMember ||
2365 StackFrame::eExpressionPathOptionsAllowDirectIVarAccess ||
2366 StackFrame::eExpressionPathOptionsNoFragileObjcIvar ||
2367 StackFrame::eExpressionPathOptionsNoSyntheticChildren ||
2368 StackFrame::eExpressionPathOptionsNoSyntheticArrayRange,
Sean Callanan69b53412011-08-06 00:28:14 +00002369 var_sp,
2370 err);
Greg Clayton83c5cd92010-11-14 22:13:40 +00002371
Sean Callanan69b53412011-08-06 00:28:14 +00002372 if (!err.Success() ||
2373 !var_sp ||
Sean Callananc6466fc2011-07-07 23:05:43 +00002374 !var_sp->IsInScope(&frame) ||
2375 !var_sp->LocationIsValidForFrame (&frame))
2376 return lldb::VariableSP();
Greg Clayton83c5cd92010-11-14 22:13:40 +00002377
Sean Callanan3e606ea2012-05-21 22:25:52 +00002378 if (var_sp)
Greg Clayton83c5cd92010-11-14 22:13:40 +00002379 {
Sean Callanan3e606ea2012-05-21 22:25:52 +00002380 if (!type)
2381 return var_sp;
2382
Sean Callanan0259e512012-05-21 21:29:52 +00002383 TypeFromUser candidate_type(var_sp->GetType()->GetClangFullType(),
2384 var_sp->GetType()->GetClangAST());
2385
2386 if (candidate_type.GetASTContext() != type->GetASTContext())
Greg Clayton83c5cd92010-11-14 22:13:40 +00002387 {
2388 if (log)
2389 log->PutCString("Skipping a candidate variable because of different AST contexts");
Sean Callanan63697e52011-05-07 01:06:41 +00002390 return lldb::VariableSP();
Greg Clayton83c5cd92010-11-14 22:13:40 +00002391 }
Sean Callanan0259e512012-05-21 21:29:52 +00002392
2393 if (object_pointer)
2394 {
2395 clang::QualType desired_qual_type = clang::QualType::getFromOpaquePtr(type->GetOpaqueQualType());
2396 clang::QualType candidate_qual_type = clang::QualType::getFromOpaquePtr(candidate_type.GetOpaqueQualType());
2397
Sean Callanan3e606ea2012-05-21 22:25:52 +00002398 const clang::ObjCObjectPointerType *desired_objc_ptr_type = desired_qual_type->getAs<clang::ObjCObjectPointerType>();
2399 const clang::ObjCObjectPointerType *candidate_objc_ptr_type = desired_qual_type->getAs<clang::ObjCObjectPointerType>();
2400
2401 if (desired_objc_ptr_type && candidate_objc_ptr_type) {
2402 clang::QualType desired_target_type = desired_objc_ptr_type->getPointeeType().getUnqualifiedType();
2403 clang::QualType candidate_target_type = candidate_objc_ptr_type->getPointeeType().getUnqualifiedType();
2404
2405 if (ClangASTContext::AreTypesSame(type->GetASTContext(),
2406 desired_target_type.getAsOpaquePtr(),
2407 candidate_target_type.getAsOpaquePtr()))
2408 return var_sp;
2409 }
2410
Sean Callanan0259e512012-05-21 21:29:52 +00002411 const clang::PointerType *desired_ptr_type = desired_qual_type->getAs<clang::PointerType>();
2412 const clang::PointerType *candidate_ptr_type = candidate_qual_type->getAs<clang::PointerType>();
2413
Sean Callanan3e606ea2012-05-21 22:25:52 +00002414 if (desired_ptr_type && candidate_ptr_type) {
2415 clang::QualType desired_target_type = desired_ptr_type->getPointeeType().getUnqualifiedType();
2416 clang::QualType candidate_target_type = candidate_ptr_type->getPointeeType().getUnqualifiedType();
2417
2418 if (ClangASTContext::AreTypesSame(type->GetASTContext(),
2419 desired_target_type.getAsOpaquePtr(),
2420 candidate_target_type.getAsOpaquePtr()))
2421 return var_sp;
2422 }
Sean Callanan0259e512012-05-21 21:29:52 +00002423
Sean Callanan3e606ea2012-05-21 22:25:52 +00002424 return lldb::VariableSP();
Sean Callanan0259e512012-05-21 21:29:52 +00002425 }
2426 else
2427 {
Sean Callanan3e606ea2012-05-21 22:25:52 +00002428 if (ClangASTContext::AreTypesSame(type->GetASTContext(),
Sean Callanan0259e512012-05-21 21:29:52 +00002429 type->GetOpaqueQualType(),
2430 var_sp->GetType()->GetClangFullType()))
Sean Callanan3e606ea2012-05-21 22:25:52 +00002431 return var_sp;
Sean Callanan0259e512012-05-21 21:29:52 +00002432 }
Sean Callanan44096b12010-09-14 21:59:34 +00002433 }
Greg Clayton83c5cd92010-11-14 22:13:40 +00002434
Sean Callanan3e606ea2012-05-21 22:25:52 +00002435 return lldb::VariableSP();
Sean Callanan44096b12010-09-14 21:59:34 +00002436}
Sean Callanan6b4067c2010-07-17 00:43:37 +00002437
Greg Clayton3d51b9f2012-11-27 01:52:16 +00002438const Symbol *
2439ClangExpressionDeclMap::FindGlobalDataSymbol (Target &target,
2440 const ConstString &name)
Sean Callanand9ca42a2011-05-08 02:21:26 +00002441{
2442 SymbolContextList sc_list;
2443
Greg Clayton3d51b9f2012-11-27 01:52:16 +00002444 target.GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeAny, sc_list);
Sean Callanand9ca42a2011-05-08 02:21:26 +00002445
Greg Clayton3d51b9f2012-11-27 01:52:16 +00002446 const uint32_t matches = sc_list.GetSize();
2447 for (uint32_t i=0; i<matches; ++i)
Sean Callanand9ca42a2011-05-08 02:21:26 +00002448 {
2449 SymbolContext sym_ctx;
Greg Clayton3d51b9f2012-11-27 01:52:16 +00002450 sc_list.GetContextAtIndex(i, sym_ctx);
2451 if (sym_ctx.symbol)
2452 {
2453 const Symbol *symbol = sym_ctx.symbol;
2454 const Address *sym_address = &symbol->GetAddress();
2455
2456 if (sym_address && sym_address->IsValid())
2457 {
2458 switch (symbol->GetType())
2459 {
2460 case eSymbolTypeData:
2461 case eSymbolTypeRuntime:
2462 case eSymbolTypeAbsolute:
2463 case eSymbolTypeObjCClass:
2464 case eSymbolTypeObjCMetaClass:
2465 case eSymbolTypeObjCIVar:
2466 if (symbol->GetDemangledNameIsSynthesized())
2467 {
2468 // If the demangled name was synthesized, then don't use it
2469 // for expressions. Only let the symbol match if the mangled
2470 // named matches for these symbols.
2471 if (symbol->GetMangled().GetMangledName() != name)
2472 break;
2473 }
2474 return symbol;
2475
2476 case eSymbolTypeCode: // We already lookup functions elsewhere
2477 case eSymbolTypeVariable:
2478 case eSymbolTypeLocal:
2479 case eSymbolTypeParam:
2480 case eSymbolTypeTrampoline:
2481 case eSymbolTypeInvalid:
2482 case eSymbolTypeException:
2483 case eSymbolTypeSourceFile:
2484 case eSymbolTypeHeaderFile:
2485 case eSymbolTypeObjectFile:
2486 case eSymbolTypeCommonBlock:
2487 case eSymbolTypeBlock:
2488 case eSymbolTypeVariableType:
2489 case eSymbolTypeLineEntry:
2490 case eSymbolTypeLineHeader:
2491 case eSymbolTypeScopeBegin:
2492 case eSymbolTypeScopeEnd:
2493 case eSymbolTypeAdditional:
2494 case eSymbolTypeCompiler:
2495 case eSymbolTypeInstrumentation:
2496 case eSymbolTypeUndefined:
Matt Kopec00049b82013-02-27 20:13:38 +00002497 case eSymbolTypeResolver:
Greg Clayton3d51b9f2012-11-27 01:52:16 +00002498 break;
2499 }
2500 }
2501 }
Sean Callanand9ca42a2011-05-08 02:21:26 +00002502 }
2503
2504 return NULL;
2505}
2506
Sean Callanan3bfdaa22011-09-15 02:13:07 +00002507lldb::VariableSP
2508ClangExpressionDeclMap::FindGlobalVariable
2509(
2510 Target &target,
Sean Callanan1fd3f4f2011-10-12 16:59:31 +00002511 ModuleSP &module,
2512 const ConstString &name,
2513 ClangNamespaceDecl *namespace_decl,
Sean Callanan3bfdaa22011-09-15 02:13:07 +00002514 TypeFromUser *type
2515)
2516{
2517 VariableList vars;
Sean Callanan3bfdaa22011-09-15 02:13:07 +00002518
Sean Callanan1fd3f4f2011-10-12 16:59:31 +00002519 if (module && namespace_decl)
2520 module->FindGlobalVariables (name, namespace_decl, true, -1, vars);
2521 else
2522 target.GetImages().FindGlobalVariables(name, true, -1, vars);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00002523
2524 if (vars.GetSize())
2525 {
2526 if (type)
2527 {
2528 for (size_t i = 0; i < vars.GetSize(); ++i)
2529 {
2530 VariableSP var_sp = vars.GetVariableAtIndex(i);
2531
2532 if (type->GetASTContext() == var_sp->GetType()->GetClangAST())
2533 {
2534 if (ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType()))
2535 return var_sp;
2536 }
2537 }
2538 }
2539 else
2540 {
2541 return vars.GetVariableAtIndex(0);
2542 }
2543 }
2544
2545 return VariableSP();
2546}
2547
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002548// Interface for ClangASTSource
Sean Callanan3bfdaa22011-09-15 02:13:07 +00002549
Sean Callanan503aa522011-10-12 00:12:34 +00002550void
Sean Callananeddeb3b2011-10-28 23:38:38 +00002551ClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002552{
Sean Callananeddeb3b2011-10-28 23:38:38 +00002553 assert (m_ast_context);
2554
2555 const ConstString name(context.m_decl_name.getAsString().c_str());
2556
Greg Clayton2d4edfb2010-11-06 01:53:30 +00002557 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002558
Sean Callananfb3e4302011-10-29 19:50:43 +00002559 if (GetImportInProgress())
Sean Callanan6abfabf2010-11-19 20:20:02 +00002560 {
Sean Callanan7dd98122011-10-14 20:34:21 +00002561 if (log && log->GetVerbose())
Sean Callanan6abfabf2010-11-19 20:20:02 +00002562 log->Printf("Ignoring a query during an import");
2563 return;
2564 }
Greg Claytona2721472011-06-25 00:44:06 +00002565
Sean Callanan7dd98122011-10-14 20:34:21 +00002566 static unsigned int invocation_id = 0;
2567 unsigned int current_id = invocation_id++;
2568
Sean Callanan503aa522011-10-12 00:12:34 +00002569 if (log)
2570 {
2571 if (!context.m_decl_context)
Sean Callananfb3e4302011-10-29 19:50:43 +00002572 log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in a NULL DeclContext", current_id, name.GetCString());
Sean Callanan503aa522011-10-12 00:12:34 +00002573 else if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context.m_decl_context))
Sean Callananfb3e4302011-10-29 19:50:43 +00002574 log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in '%s'", current_id, name.GetCString(), context_named_decl->getNameAsString().c_str());
Sean Callanan503aa522011-10-12 00:12:34 +00002575 else
Sean Callananfb3e4302011-10-29 19:50:43 +00002576 log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in a '%s'", current_id, name.GetCString(), context.m_decl_context->getDeclKindName());
Sean Callanan503aa522011-10-12 00:12:34 +00002577 }
Sean Callananfb3e4302011-10-29 19:50:43 +00002578
Sean Callanan503aa522011-10-12 00:12:34 +00002579 if (const NamespaceDecl *namespace_context = dyn_cast<NamespaceDecl>(context.m_decl_context))
2580 {
Sean Callanan1ee44b72011-10-29 01:58:46 +00002581 ClangASTImporter::NamespaceMapSP namespace_map = m_ast_importer->GetNamespaceMap(namespace_context);
Sean Callananc41e68b2011-10-13 21:08:11 +00002582
Sean Callanan7dd98122011-10-14 20:34:21 +00002583 if (log && log->GetVerbose())
Sean Callanan00f43622011-11-18 03:28:09 +00002584 log->Printf(" CEDM::FEVD[%u] Inspecting (NamespaceMap*)%p (%d entries)",
Sean Callanan7dd98122011-10-14 20:34:21 +00002585 current_id,
2586 namespace_map.get(),
2587 (int)namespace_map->size());
Sean Callananc41e68b2011-10-13 21:08:11 +00002588
Sean Callananb2269162011-10-21 22:18:07 +00002589 if (!namespace_map)
2590 return;
2591
Sean Callanan503aa522011-10-12 00:12:34 +00002592 for (ClangASTImporter::NamespaceMap::iterator i = namespace_map->begin(), e = namespace_map->end();
2593 i != e;
2594 ++i)
2595 {
2596 if (log)
Sean Callananfb3e4302011-10-29 19:50:43 +00002597 log->Printf(" CEDM::FEVD[%u] Searching namespace %s in module %s",
Sean Callanan7dd98122011-10-14 20:34:21 +00002598 current_id,
Sean Callanan503aa522011-10-12 00:12:34 +00002599 i->second.GetNamespaceDecl()->getNameAsString().c_str(),
2600 i->first->GetFileSpec().GetFilename().GetCString());
2601
Sean Callananebe60672011-10-13 21:50:33 +00002602 FindExternalVisibleDecls(context,
2603 i->first,
2604 i->second,
Sean Callanan7dd98122011-10-14 20:34:21 +00002605 current_id);
Sean Callanan503aa522011-10-12 00:12:34 +00002606 }
2607 }
Sean Callanand5c17ed2011-11-15 02:11:17 +00002608 else if (isa<TranslationUnitDecl>(context.m_decl_context))
Sean Callanan503aa522011-10-12 00:12:34 +00002609 {
2610 ClangNamespaceDecl namespace_decl;
2611
2612 if (log)
Sean Callananfb3e4302011-10-29 19:50:43 +00002613 log->Printf(" CEDM::FEVD[%u] Searching the root namespace", current_id);
Sean Callanan503aa522011-10-12 00:12:34 +00002614
2615 FindExternalVisibleDecls(context,
2616 lldb::ModuleSP(),
2617 namespace_decl,
Sean Callanan7dd98122011-10-14 20:34:21 +00002618 current_id);
Sean Callanan503aa522011-10-12 00:12:34 +00002619 }
Sean Callananc41e68b2011-10-13 21:08:11 +00002620
Sean Callananfb3e4302011-10-29 19:50:43 +00002621 if (!context.m_found.variable)
2622 ClangASTSource::FindExternalVisibleDecls(context);
Sean Callanan503aa522011-10-12 00:12:34 +00002623}
2624
2625void
2626ClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context,
Sean Callanan1a2c5382011-10-12 18:44:30 +00002627 lldb::ModuleSP module_sp,
Sean Callanan88972242011-10-12 01:39:28 +00002628 ClangNamespaceDecl &namespace_decl,
Sean Callanan7dd98122011-10-14 20:34:21 +00002629 unsigned int current_id)
Sean Callanan503aa522011-10-12 00:12:34 +00002630{
Sean Callananeddeb3b2011-10-28 23:38:38 +00002631 assert (m_ast_context);
Sean Callanan503aa522011-10-12 00:12:34 +00002632
2633 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callananfb3e4302011-10-29 19:50:43 +00002634
Greg Clayton7a345282010-11-09 23:46:37 +00002635 SymbolContextList sc_list;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002636
Sean Callananfb3e4302011-10-29 19:50:43 +00002637 const ConstString name(context.m_decl_name.getAsString().c_str());
2638
Greg Clayton83c5cd92010-11-14 22:13:40 +00002639 const char *name_unique_cstr = name.GetCString();
2640
2641 if (name_unique_cstr == NULL)
2642 return;
Sean Callananfb3e4302011-10-29 19:50:43 +00002643
Sean Callanan5b26f272012-02-04 08:49:35 +00002644 static ConstString id_name("id");
2645 static ConstString Class_name("Class");
2646
2647 if (name == id_name || name == Class_name)
2648 return;
2649
Greg Clayton7b462cc2010-10-15 22:48:33 +00002650 // Only look for functions by name out in our symbols if the function
2651 // doesn't start with our phony prefix of '$'
Sean Callanan933693b2012-02-10 01:22:05 +00002652 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
2653 StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
Sean Callanan88972242011-10-12 01:39:28 +00002654 if (name_unique_cstr[0] == '$' && !namespace_decl)
2655 {
2656 static ConstString g_lldb_class_name ("$__lldb_class");
2657
2658 if (name == g_lldb_class_name)
2659 {
2660 // Clang is looking for the type of "this"
Sean Callananc03bdd92012-02-08 03:45:08 +00002661
2662 if (frame == NULL)
Sean Callanan88972242011-10-12 01:39:28 +00002663 return;
2664
Sean Callananc03bdd92012-02-08 03:45:08 +00002665 SymbolContext sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction);
Sean Callanan88972242011-10-12 01:39:28 +00002666
Sean Callananc03bdd92012-02-08 03:45:08 +00002667 if (!sym_ctx.function)
Sean Callanan88972242011-10-12 01:39:28 +00002668 return;
2669
Greg Clayton685c88c2012-07-14 00:53:55 +00002670 // Get the block that defines the function
2671 Block *function_block = sym_ctx.GetFunctionBlock();
2672
2673 if (!function_block)
2674 return;
2675
2676 clang::DeclContext *decl_context = function_block->GetClangDeclContext();
Sean Callananc03bdd92012-02-08 03:45:08 +00002677
2678 if (!decl_context)
Sean Callanan88972242011-10-12 01:39:28 +00002679 return;
2680
Sean Callananc03bdd92012-02-08 03:45:08 +00002681 clang::CXXMethodDecl *method_decl = llvm::dyn_cast<clang::CXXMethodDecl>(decl_context);
Sean Callanan88972242011-10-12 01:39:28 +00002682
Jim Ingham5fdeed42012-10-30 23:35:54 +00002683 if (method_decl)
Sean Callanan88972242011-10-12 01:39:28 +00002684 {
Jim Ingham5fdeed42012-10-30 23:35:54 +00002685 clang::CXXRecordDecl *class_decl = method_decl->getParent();
2686
2687 QualType class_qual_type(class_decl->getTypeForDecl(), 0);
2688
2689 TypeFromUser class_user_type (class_qual_type.getAsOpaquePtr(),
2690 &class_decl->getASTContext());
2691
2692 if (log)
2693 {
2694 ASTDumper ast_dumper(class_qual_type);
2695 log->Printf(" CEDM::FEVD[%u] Adding type for $__lldb_class: %s", current_id, ast_dumper.GetCString());
2696 }
2697
Sean Callananfa4fab72013-02-01 06:55:48 +00002698 TypeFromParser class_type = CopyClassType(class_user_type, current_id);
2699
2700 if (!class_type.IsValid())
2701 return;
2702
2703 TypeSourceInfo *type_source_info = m_ast_context->CreateTypeSourceInfo(QualType::getFromOpaquePtr(class_type.GetOpaqueQualType()));
2704
2705 if (!type_source_info)
2706 return;
2707
2708 TypedefDecl *typedef_decl = TypedefDecl::Create(*m_ast_context,
2709 m_ast_context->getTranslationUnitDecl(),
2710 SourceLocation(),
2711 SourceLocation(),
2712 context.m_decl_name.getAsIdentifierInfo(),
2713 type_source_info);
2714
2715
2716 if (!typedef_decl)
2717 return;
2718
2719 context.AddNamedDecl(typedef_decl);
Jim Ingham5fdeed42012-10-30 23:35:54 +00002720
2721 if (method_decl->isInstance())
2722 {
2723 // self is a pointer to the object
2724
2725 QualType class_pointer_type = method_decl->getASTContext().getPointerType(class_qual_type);
2726
2727 TypeFromUser self_user_type(class_pointer_type.getAsOpaquePtr(),
2728 &method_decl->getASTContext());
2729
2730 m_struct_vars->m_object_pointer_type = self_user_type;
2731 }
Sean Callanan88972242011-10-12 01:39:28 +00002732 }
Jim Ingham5fdeed42012-10-30 23:35:54 +00002733 else
Sean Callananbb6e7ed2012-03-05 22:08:20 +00002734 {
Jim Ingham5fdeed42012-10-30 23:35:54 +00002735 // This branch will get hit if we are executing code in the context of a function that
2736 // claims to have an object pointer (through DW_AT_object_pointer?) but is not formally a
2737 // method of the class. In that case, just look up the "this" variable in the the current
2738 // scope and use its type.
2739 // FIXME: This code is formally correct, but clang doesn't currently emit DW_AT_object_pointer
2740 // for C++ so it hasn't actually been tested.
Sean Callananbb6e7ed2012-03-05 22:08:20 +00002741
Jim Ingham5fdeed42012-10-30 23:35:54 +00002742 VariableList *vars = frame->GetVariableList(false);
Sean Callananbb6e7ed2012-03-05 22:08:20 +00002743
Jim Ingham5fdeed42012-10-30 23:35:54 +00002744 lldb::VariableSP this_var = vars->FindVariable(ConstString("this"));
Sean Callananbb6e7ed2012-03-05 22:08:20 +00002745
Jim Ingham5fdeed42012-10-30 23:35:54 +00002746 if (this_var &&
2747 this_var->IsInScope(frame) &&
2748 this_var->LocationIsValidForFrame (frame))
2749 {
2750 Type *this_type = this_var->GetType();
2751
2752 if (!this_type)
2753 return;
2754
2755 QualType this_qual_type = QualType::getFromOpaquePtr(this_type->GetClangFullType());
2756 const PointerType *class_pointer_type = this_qual_type->getAs<PointerType>();
2757
2758 if (class_pointer_type)
2759 {
2760 QualType class_type = class_pointer_type->getPointeeType();
2761
2762 if (log)
2763 {
2764 ASTDumper ast_dumper(this_type->GetClangFullType());
2765 log->Printf(" FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, ast_dumper.GetCString());
2766 }
2767
2768 TypeFromUser class_user_type (class_type.getAsOpaquePtr(),
2769 this_type->GetClangAST());
Sean Callananfa4fab72013-02-01 06:55:48 +00002770 AddOneType(context, class_user_type, current_id);
Jim Ingham5fdeed42012-10-30 23:35:54 +00002771
2772
2773 TypeFromUser this_user_type(this_type->GetClangFullType(),
2774 this_type->GetClangAST());
2775
2776 m_struct_vars->m_object_pointer_type = this_user_type;
2777 return;
2778 }
2779 }
Sean Callananbb6e7ed2012-03-05 22:08:20 +00002780 }
2781
Sean Callanan88972242011-10-12 01:39:28 +00002782 return;
2783 }
2784
2785 static ConstString g_lldb_objc_class_name ("$__lldb_objc_class");
2786 if (name == g_lldb_objc_class_name)
2787 {
2788 // Clang is looking for the type of "*self"
2789
2790 if (!frame)
2791 return;
Sean Callanand5c17ed2011-11-15 02:11:17 +00002792
2793 SymbolContext sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction);
2794
2795 if (!sym_ctx.function)
2796 return;
2797
Greg Clayton685c88c2012-07-14 00:53:55 +00002798 // Get the block that defines the function
2799 Block *function_block = sym_ctx.GetFunctionBlock();
Sean Callanand5c17ed2011-11-15 02:11:17 +00002800
Greg Clayton685c88c2012-07-14 00:53:55 +00002801 if (!function_block)
2802 return;
2803
2804 clang::DeclContext *decl_context = function_block->GetClangDeclContext();
Sean Callanand5c17ed2011-11-15 02:11:17 +00002805
2806 if (!decl_context)
2807 return;
2808
2809 clang::ObjCMethodDecl *method_decl = llvm::dyn_cast<clang::ObjCMethodDecl>(decl_context);
2810
Jim Ingham5fdeed42012-10-30 23:35:54 +00002811 if (method_decl)
Sean Callanand5c17ed2011-11-15 02:11:17 +00002812 {
Jim Ingham5fdeed42012-10-30 23:35:54 +00002813 ObjCInterfaceDecl* self_interface = method_decl->getClassInterface();
Sean Callanand5c17ed2011-11-15 02:11:17 +00002814
Jim Ingham5fdeed42012-10-30 23:35:54 +00002815 if (!self_interface)
Sean Callananc03bdd92012-02-08 03:45:08 +00002816 return;
2817
Jim Ingham5fdeed42012-10-30 23:35:54 +00002818 const clang::Type *interface_type = self_interface->getTypeForDecl();
2819
2820 TypeFromUser class_user_type(QualType(interface_type, 0).getAsOpaquePtr(),
2821 &method_decl->getASTContext());
Sean Callananc03bdd92012-02-08 03:45:08 +00002822
Jim Ingham5fdeed42012-10-30 23:35:54 +00002823 if (log)
2824 {
2825 ASTDumper ast_dumper(interface_type);
2826 log->Printf(" FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, ast_dumper.GetCString());
2827 }
2828
Sean Callananfa4fab72013-02-01 06:55:48 +00002829 AddOneType(context, class_user_type, current_id);
Jim Ingham5fdeed42012-10-30 23:35:54 +00002830
2831 if (method_decl->isInstanceMethod())
2832 {
2833 // self is a pointer to the object
2834
2835 QualType class_pointer_type = method_decl->getASTContext().getObjCObjectPointerType(QualType(interface_type, 0));
2836
2837 TypeFromUser self_user_type(class_pointer_type.getAsOpaquePtr(),
2838 &method_decl->getASTContext());
2839
2840 m_struct_vars->m_object_pointer_type = self_user_type;
2841 }
2842 else
2843 {
2844 // self is a Class pointer
2845 QualType class_type = method_decl->getASTContext().getObjCClassType();
2846
2847 TypeFromUser self_user_type(class_type.getAsOpaquePtr(),
2848 &method_decl->getASTContext());
2849
2850 m_struct_vars->m_object_pointer_type = self_user_type;
2851 }
2852
2853 return;
Sean Callananc03bdd92012-02-08 03:45:08 +00002854 }
2855 else
2856 {
Jim Ingham5fdeed42012-10-30 23:35:54 +00002857 // This branch will get hit if we are executing code in the context of a function that
2858 // claims to have an object pointer (through DW_AT_object_pointer?) but is not formally a
2859 // method of the class. In that case, just look up the "self" variable in the the current
2860 // scope and use its type.
Sean Callananc03bdd92012-02-08 03:45:08 +00002861
Jim Ingham5fdeed42012-10-30 23:35:54 +00002862 VariableList *vars = frame->GetVariableList(false);
Sean Callananc03bdd92012-02-08 03:45:08 +00002863
Jim Ingham5fdeed42012-10-30 23:35:54 +00002864 lldb::VariableSP self_var = vars->FindVariable(ConstString("self"));
2865
2866 if (self_var &&
2867 self_var->IsInScope(frame) &&
2868 self_var->LocationIsValidForFrame (frame))
2869 {
2870 Type *self_type = self_var->GetType();
2871
2872 if (!self_type)
2873 return;
2874
2875 QualType self_qual_type = QualType::getFromOpaquePtr(self_type->GetClangFullType());
Jim Ingham5fdeed42012-10-30 23:35:54 +00002876
Sean Callanana2868d42013-01-19 01:49:02 +00002877 if (self_qual_type->isObjCClassType())
Jim Ingham5fdeed42012-10-30 23:35:54 +00002878 {
Sean Callanana2868d42013-01-19 01:49:02 +00002879 return;
2880 }
2881 else if (self_qual_type->isObjCObjectPointerType())
2882 {
2883 const ObjCObjectPointerType *class_pointer_type = self_qual_type->getAs<ObjCObjectPointerType>();
2884
Jim Ingham5fdeed42012-10-30 23:35:54 +00002885 QualType class_type = class_pointer_type->getPointeeType();
2886
2887 if (log)
2888 {
2889 ASTDumper ast_dumper(self_type->GetClangFullType());
2890 log->Printf(" FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, ast_dumper.GetCString());
2891 }
2892
2893 TypeFromUser class_user_type (class_type.getAsOpaquePtr(),
Sean Callanana2868d42013-01-19 01:49:02 +00002894 self_type->GetClangAST());
2895
Sean Callananfa4fab72013-02-01 06:55:48 +00002896 AddOneType(context, class_user_type, current_id);
Jim Ingham5fdeed42012-10-30 23:35:54 +00002897
Jim Ingham5fdeed42012-10-30 23:35:54 +00002898 TypeFromUser self_user_type(self_type->GetClangFullType(),
2899 self_type->GetClangAST());
2900
2901 m_struct_vars->m_object_pointer_type = self_user_type;
2902 return;
2903 }
2904 }
Sean Callananc03bdd92012-02-08 03:45:08 +00002905 }
2906
Sean Callanan88972242011-10-12 01:39:28 +00002907 return;
2908 }
2909
2910 // any other $__lldb names should be weeded out now
2911 if (!::strncmp(name_unique_cstr, "$__lldb", sizeof("$__lldb") - 1))
2912 return;
2913
2914 do
2915 {
2916 if (!target)
2917 break;
2918
2919 ClangASTContext *scratch_clang_ast_context = target->GetScratchClangASTContext();
2920
2921 if (!scratch_clang_ast_context)
2922 break;
2923
2924 ASTContext *scratch_ast_context = scratch_clang_ast_context->getASTContext();
2925
2926 if (!scratch_ast_context)
2927 break;
2928
2929 TypeDecl *ptype_type_decl = m_parser_vars->m_persistent_vars->GetPersistentType(name);
2930
2931 if (!ptype_type_decl)
2932 break;
2933
Sean Callanan0eed0d42011-12-06 03:41:14 +00002934 Decl *parser_ptype_decl = m_ast_importer->CopyDecl(m_ast_context, scratch_ast_context, ptype_type_decl);
Sean Callanan88972242011-10-12 01:39:28 +00002935
2936 if (!parser_ptype_decl)
2937 break;
2938
2939 TypeDecl *parser_ptype_type_decl = dyn_cast<TypeDecl>(parser_ptype_decl);
2940
2941 if (!parser_ptype_type_decl)
2942 break;
2943
2944 if (log)
Sean Callananfb3e4302011-10-29 19:50:43 +00002945 log->Printf(" CEDM::FEVD[%u] Found persistent type %s", current_id, name.GetCString());
Sean Callanan88972242011-10-12 01:39:28 +00002946
2947 context.AddNamedDecl(parser_ptype_type_decl);
2948 } while (0);
2949
2950 ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name));
2951
2952 if (pvar_sp)
2953 {
Sean Callanan7dd98122011-10-14 20:34:21 +00002954 AddOneVariable(context, pvar_sp, current_id);
Sean Callanan88972242011-10-12 01:39:28 +00002955 return;
2956 }
2957
2958 const char *reg_name(&name.GetCString()[1]);
2959
Sean Callanan933693b2012-02-10 01:22:05 +00002960 if (m_parser_vars->m_exe_ctx.GetRegisterContext())
Sean Callanan88972242011-10-12 01:39:28 +00002961 {
Sean Callanan933693b2012-02-10 01:22:05 +00002962 const RegisterInfo *reg_info(m_parser_vars->m_exe_ctx.GetRegisterContext()->GetRegisterInfoByName(reg_name));
Sean Callananfb3e4302011-10-29 19:50:43 +00002963
Sean Callanan88972242011-10-12 01:39:28 +00002964 if (reg_info)
Sean Callanan35c7f982011-10-18 16:46:55 +00002965 {
2966 if (log)
Sean Callananfb3e4302011-10-29 19:50:43 +00002967 log->Printf(" CEDM::FEVD[%u] Found register %s", current_id, reg_info->name);
Sean Callanan35c7f982011-10-18 16:46:55 +00002968
Sean Callanan7dd98122011-10-14 20:34:21 +00002969 AddOneRegister(context, reg_info, current_id);
Sean Callanan35c7f982011-10-18 16:46:55 +00002970 }
Sean Callanan88972242011-10-12 01:39:28 +00002971 }
2972 }
2973 else
Sean Callanan8ade1042010-07-27 00:55:47 +00002974 {
Sean Callanan69b53412011-08-06 00:28:14 +00002975 ValueObjectSP valobj;
2976 VariableSP var;
2977 Error err;
2978
Sean Callanan88972242011-10-12 01:39:28 +00002979 if (frame && !namespace_decl)
Greg Clayton7b462cc2010-10-15 22:48:33 +00002980 {
Greg Claytonc14ee322011-09-22 04:58:26 +00002981 valobj = frame->GetValueForVariableExpressionPath(name_unique_cstr,
Sean Callanan503aa522011-10-12 00:12:34 +00002982 eNoDynamicValues,
Sean Callananaf776172013-02-12 07:56:36 +00002983 StackFrame::eExpressionPathOptionCheckPtrVsMember ||
2984 StackFrame::eExpressionPathOptionsAllowDirectIVarAccess ||
2985 StackFrame::eExpressionPathOptionsNoFragileObjcIvar ||
2986 StackFrame::eExpressionPathOptionsNoSyntheticChildren ||
2987 StackFrame::eExpressionPathOptionsNoSyntheticArrayRange,
Sean Callanan503aa522011-10-12 00:12:34 +00002988 var,
2989 err);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00002990
2991 // If we found a variable in scope, no need to pull up function names
Sean Callanan9a028512012-08-09 00:50:26 +00002992 if (err.Success() && var)
Sean Callanan3bfdaa22011-09-15 02:13:07 +00002993 {
Sean Callanan0712f462011-11-29 22:03:21 +00002994 AddOneVariable(context, var, valobj, current_id);
Sean Callananca4e0fd2011-10-12 20:29:25 +00002995 context.m_found.variable = true;
Sean Callananefa7d1f2011-10-25 20:36:57 +00002996 return;
Sean Callanan3bfdaa22011-09-15 02:13:07 +00002997 }
Greg Clayton7b462cc2010-10-15 22:48:33 +00002998 }
Sean Callananfd1ba912011-12-10 04:03:38 +00002999
3000 if (target)
Sean Callanan3bfdaa22011-09-15 02:13:07 +00003001 {
Sean Callanan1fd3f4f2011-10-12 16:59:31 +00003002 var = FindGlobalVariable (*target,
Sean Callanan1a2c5382011-10-12 18:44:30 +00003003 module_sp,
Sean Callanan1fd3f4f2011-10-12 16:59:31 +00003004 name,
3005 &namespace_decl,
Greg Claytonc14ee322011-09-22 04:58:26 +00003006 NULL);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00003007
3008 if (var)
3009 {
Sean Callanan9b3569b2011-12-10 03:12:34 +00003010 valobj = ValueObjectVariable::Create(target, var);
Sean Callanan0712f462011-11-29 22:03:21 +00003011 AddOneVariable(context, var, valobj, current_id);
Sean Callananca4e0fd2011-10-12 20:29:25 +00003012 context.m_found.variable = true;
Sean Callananfd1ba912011-12-10 04:03:38 +00003013 return;
Sean Callanan3bfdaa22011-09-15 02:13:07 +00003014 }
3015 }
3016
Sean Callananca4e0fd2011-10-12 20:29:25 +00003017 if (!context.m_found.variable)
Greg Clayton7b462cc2010-10-15 22:48:33 +00003018 {
Sean Callanan9df05fb2012-02-10 22:52:19 +00003019 const bool include_inlines = false;
Greg Clayton931180e2011-01-27 06:44:37 +00003020 const bool append = false;
Sean Callanan25ea08e2011-10-12 17:38:09 +00003021
Sean Callanan1a2c5382011-10-12 18:44:30 +00003022 if (namespace_decl && module_sp)
Sean Callanan25ea08e2011-10-12 17:38:09 +00003023 {
Sean Callanan3ae61792012-02-15 17:14:49 +00003024 const bool include_symbols = false;
3025
Sean Callanan1a2c5382011-10-12 18:44:30 +00003026 module_sp->FindFunctions(name,
3027 &namespace_decl,
3028 eFunctionNameTypeBase,
3029 include_symbols,
Sean Callanan9df05fb2012-02-10 22:52:19 +00003030 include_inlines,
Sean Callanan1a2c5382011-10-12 18:44:30 +00003031 append,
3032 sc_list);
Sean Callanan25ea08e2011-10-12 17:38:09 +00003033 }
Jim Ingham28eb5712012-10-12 17:34:26 +00003034 else if (target && !namespace_decl)
Sean Callanan25ea08e2011-10-12 17:38:09 +00003035 {
Sean Callanan3ae61792012-02-15 17:14:49 +00003036 const bool include_symbols = true;
3037
Sean Callanan308a3c52012-07-28 00:21:01 +00003038 // TODO Fix FindFunctions so that it doesn't return
3039 // instance methods for eFunctionNameTypeBase.
3040
Sean Callanan25ea08e2011-10-12 17:38:09 +00003041 target->GetImages().FindFunctions(name,
3042 eFunctionNameTypeBase,
3043 include_symbols,
Sean Callanan9df05fb2012-02-10 22:52:19 +00003044 include_inlines,
Sean Callanan25ea08e2011-10-12 17:38:09 +00003045 append,
3046 sc_list);
3047 }
3048
Sean Callanand9ca42a2011-05-08 02:21:26 +00003049 if (sc_list.GetSize())
Greg Clayton7b462cc2010-10-15 22:48:33 +00003050 {
Sean Callanand9ca42a2011-05-08 02:21:26 +00003051 Symbol *generic_symbol = NULL;
3052 Symbol *non_extern_symbol = NULL;
3053
3054 for (uint32_t index = 0, num_indices = sc_list.GetSize();
3055 index < num_indices;
3056 ++index)
Greg Clayton7b462cc2010-10-15 22:48:33 +00003057 {
Sean Callanand9ca42a2011-05-08 02:21:26 +00003058 SymbolContext sym_ctx;
3059 sc_list.GetContextAtIndex(index, sym_ctx);
3060
3061 if (sym_ctx.function)
3062 {
Sean Callanan308a3c52012-07-28 00:21:01 +00003063 clang::DeclContext *decl_ctx = sym_ctx.function->GetClangDeclContext();
3064
3065 // Filter out class/instance methods.
3066 if (dyn_cast<clang::ObjCMethodDecl>(decl_ctx))
3067 continue;
3068 if (dyn_cast<clang::CXXMethodDecl>(decl_ctx))
3069 continue;
3070
Sean Callanand9ca42a2011-05-08 02:21:26 +00003071 // TODO only do this if it's a C function; C++ functions may be
3072 // overloaded
Sean Callananca4e0fd2011-10-12 20:29:25 +00003073 if (!context.m_found.function_with_type_info)
Sean Callanan7dd98122011-10-14 20:34:21 +00003074 AddOneFunction(context, sym_ctx.function, NULL, current_id);
Sean Callananca4e0fd2011-10-12 20:29:25 +00003075 context.m_found.function_with_type_info = true;
3076 context.m_found.function = true;
Sean Callanand9ca42a2011-05-08 02:21:26 +00003077 }
3078 else if (sym_ctx.symbol)
3079 {
3080 if (sym_ctx.symbol->IsExternal())
3081 generic_symbol = sym_ctx.symbol;
3082 else
3083 non_extern_symbol = sym_ctx.symbol;
3084 }
Greg Clayton7b462cc2010-10-15 22:48:33 +00003085 }
Sean Callanand9ca42a2011-05-08 02:21:26 +00003086
Sean Callananca4e0fd2011-10-12 20:29:25 +00003087 if (!context.m_found.function_with_type_info)
Greg Clayton7b462cc2010-10-15 22:48:33 +00003088 {
Sean Callanand9ca42a2011-05-08 02:21:26 +00003089 if (generic_symbol)
Sean Callanan3bfdaa22011-09-15 02:13:07 +00003090 {
Sean Callanan7dd98122011-10-14 20:34:21 +00003091 AddOneFunction (context, NULL, generic_symbol, current_id);
Sean Callananca4e0fd2011-10-12 20:29:25 +00003092 context.m_found.function = true;
Sean Callanan3bfdaa22011-09-15 02:13:07 +00003093 }
Sean Callanand9ca42a2011-05-08 02:21:26 +00003094 else if (non_extern_symbol)
Sean Callanan3bfdaa22011-09-15 02:13:07 +00003095 {
Sean Callanan7dd98122011-10-14 20:34:21 +00003096 AddOneFunction (context, NULL, non_extern_symbol, current_id);
Sean Callananca4e0fd2011-10-12 20:29:25 +00003097 context.m_found.function = true;
Sean Callanan3bfdaa22011-09-15 02:13:07 +00003098 }
Sean Callanand9ca42a2011-05-08 02:21:26 +00003099 }
Greg Clayton7b462cc2010-10-15 22:48:33 +00003100 }
Sean Callanan3bfdaa22011-09-15 02:13:07 +00003101
Sean Callanan20a33d52012-03-06 20:53:06 +00003102 if (!context.m_found.variable && !namespace_decl)
Greg Clayton7b462cc2010-10-15 22:48:33 +00003103 {
Sean Callananca4e0fd2011-10-12 20:29:25 +00003104 // We couldn't find a non-symbol variable for this. Now we'll hunt for a generic
Sean Callanand9ca42a2011-05-08 02:21:26 +00003105 // data symbol, and -- if it is found -- treat it as a variable.
3106
Greg Clayton3d51b9f2012-11-27 01:52:16 +00003107 const Symbol *data_symbol = FindGlobalDataSymbol(*target, name);
Sean Callanand9ca42a2011-05-08 02:21:26 +00003108
3109 if (data_symbol)
Sean Callanan3bfdaa22011-09-15 02:13:07 +00003110 {
Sean Callanan7dd98122011-10-14 20:34:21 +00003111 AddOneGenericVariable(context, *data_symbol, current_id);
Sean Callananca4e0fd2011-10-12 20:29:25 +00003112 context.m_found.variable = true;
Sean Callanan3bfdaa22011-09-15 02:13:07 +00003113 }
Greg Clayton526e5af2010-11-13 03:52:47 +00003114 }
Sean Callanan3883b5a2010-09-07 21:49:41 +00003115 }
Sean Callananfb40b0d2011-10-27 02:06:03 +00003116 }
Sean Callanan6b4067c2010-07-17 00:43:37 +00003117}
Greg Claytona2721472011-06-25 00:44:06 +00003118
Sean Callanan75383bf2012-03-06 21:56:33 +00003119static clang_type_t
3120MaybePromoteToBlockPointerType
3121(
3122 ASTContext *ast_context,
3123 clang_type_t candidate_type
3124)
3125{
3126 if (!candidate_type)
3127 return candidate_type;
3128
3129 QualType candidate_qual_type = QualType::getFromOpaquePtr(candidate_type);
3130
3131 const PointerType *candidate_pointer_type = dyn_cast<PointerType>(candidate_qual_type);
3132
3133 if (!candidate_pointer_type)
3134 return candidate_type;
3135
3136 QualType pointee_qual_type = candidate_pointer_type->getPointeeType();
3137
3138 const RecordType *pointee_record_type = dyn_cast<RecordType>(pointee_qual_type);
3139
3140 if (!pointee_record_type)
3141 return candidate_type;
3142
3143 RecordDecl *pointee_record_decl = pointee_record_type->getDecl();
3144
3145 if (!pointee_record_decl->isRecord())
3146 return candidate_type;
3147
3148 if (!pointee_record_decl->getName().startswith(llvm::StringRef("__block_literal_")))
3149 return candidate_type;
3150
3151 QualType generic_function_type = ast_context->getFunctionNoProtoType(ast_context->UnknownAnyTy);
3152 QualType block_pointer_type = ast_context->getBlockPointerType(generic_function_type);
3153
3154 return block_pointer_type.getAsOpaquePtr();
3155}
3156
Sean Callanan6b4067c2010-07-17 00:43:37 +00003157Value *
Greg Clayton7b462cc2010-10-15 22:48:33 +00003158ClangExpressionDeclMap::GetVariableValue
3159(
Sean Callanan8e5b8b92011-10-13 00:09:20 +00003160 VariableSP &var,
Sean Callanancc427fa2011-07-30 02:42:06 +00003161 ASTContext *parser_ast_context,
Greg Clayton7b462cc2010-10-15 22:48:33 +00003162 TypeFromUser *user_type,
3163 TypeFromParser *parser_type
3164)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003165{
Greg Clayton2d4edfb2010-11-06 01:53:30 +00003166 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callananf06ba8d2010-06-23 00:47:48 +00003167
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003168 Type *var_type = var->GetType();
3169
3170 if (!var_type)
3171 {
Sean Callananea22d422010-07-16 00:09:46 +00003172 if (log)
3173 log->PutCString("Skipped a definition because it has no type");
Sean Callanan6b4067c2010-07-17 00:43:37 +00003174 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003175 }
3176
Greg Claytonf4ecaa52011-02-16 23:00:21 +00003177 clang_type_t var_opaque_type = var_type->GetClangFullType();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003178
3179 if (!var_opaque_type)
3180 {
Sean Callananea22d422010-07-16 00:09:46 +00003181 if (log)
3182 log->PutCString("Skipped a definition because it has no Clang type");
Sean Callanan6b4067c2010-07-17 00:43:37 +00003183 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003184 }
3185
Sean Callanancc427fa2011-07-30 02:42:06 +00003186 ASTContext *ast = var_type->GetClangASTContext().getASTContext();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003187
Greg Clayton6beaaa62011-01-17 03:46:26 +00003188 if (!ast)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003189 {
Sean Callananea22d422010-07-16 00:09:46 +00003190 if (log)
3191 log->PutCString("There is no AST context for the current execution context");
Sean Callanan6b4067c2010-07-17 00:43:37 +00003192 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003193 }
Sean Callanan75383bf2012-03-06 21:56:33 +00003194
Enrico Granata7f3296a2012-03-30 16:58:37 +00003195 // commented out because of <rdar://problem/11024417>
3196 //var_opaque_type = MaybePromoteToBlockPointerType (ast, var_opaque_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003197
Sean Callanan6b4067c2010-07-17 00:43:37 +00003198 DWARFExpression &var_location_expr = var->LocationExpression();
3199
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003200 std::auto_ptr<Value> var_location(new Value);
3201
Greg Clayton016a95e2010-09-14 02:20:48 +00003202 lldb::addr_t loclist_base_load_addr = LLDB_INVALID_ADDRESS;
3203
Sean Callanan933693b2012-02-10 01:22:05 +00003204 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
Greg Claytonc14ee322011-09-22 04:58:26 +00003205
Greg Clayton016a95e2010-09-14 02:20:48 +00003206 if (var_location_expr.IsLocationList())
3207 {
3208 SymbolContext var_sc;
3209 var->CalculateSymbolContext (&var_sc);
Greg Claytonc14ee322011-09-22 04:58:26 +00003210 loclist_base_load_addr = var_sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress (target);
Greg Clayton016a95e2010-09-14 02:20:48 +00003211 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003212 Error err;
3213
Sean Callanan7b5805d2013-01-18 21:20:51 +00003214 if (var->GetLocationIsConstantValueData())
3215 {
3216 DataExtractor const_value_extractor;
3217
3218 if (var_location_expr.GetExpressionData(const_value_extractor))
3219 {
3220 var_location->operator=(Value(const_value_extractor.GetDataStart(), const_value_extractor.GetByteSize()));
3221 var_location->SetValueType(Value::eValueTypeHostAddress);
3222 }
3223 else
3224 {
3225 if (log)
3226 log->Printf("Error evaluating constant variable: %s", err.AsCString());
3227 return NULL;
3228 }
3229 }
3230 else if (!var_location_expr.Evaluate(&m_parser_vars->m_exe_ctx, ast, NULL, NULL, NULL, loclist_base_load_addr, NULL, *var_location.get(), &err))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003231 {
Sean Callananea22d422010-07-16 00:09:46 +00003232 if (log)
3233 log->Printf("Error evaluating location: %s", err.AsCString());
Sean Callanan6b4067c2010-07-17 00:43:37 +00003234 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003235 }
Greg Clayton6beaaa62011-01-17 03:46:26 +00003236
Sean Callanan77eaf442011-07-08 00:39:14 +00003237 void *type_to_use = NULL;
Sean Callanan6b4067c2010-07-17 00:43:37 +00003238
Sean Callanan1d180662010-07-20 23:31:16 +00003239 if (parser_ast_context)
3240 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00003241 type_to_use = GuardedCopyType(parser_ast_context, ast, var_opaque_type);
Sean Callanan1d180662010-07-20 23:31:16 +00003242
Sean Callanana3aa0cf2010-11-20 02:19:29 +00003243 if (!type_to_use)
3244 {
3245 if (log)
3246 log->Printf("Couldn't copy a variable's type into the parser's AST context");
3247
3248 return NULL;
3249 }
3250
Sean Callanan1d180662010-07-20 23:31:16 +00003251 if (parser_type)
3252 *parser_type = TypeFromParser(type_to_use, parser_ast_context);
3253 }
Sean Callanan6b4067c2010-07-17 00:43:37 +00003254 else
3255 type_to_use = var_opaque_type;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003256
3257 if (var_location.get()->GetContextType() == Value::eContextTypeInvalid)
Greg Clayton526e5af2010-11-13 03:52:47 +00003258 var_location.get()->SetContext(Value::eContextTypeClangType, type_to_use);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003259
3260 if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress)
3261 {
3262 SymbolContext var_sc;
3263 var->CalculateSymbolContext(&var_sc);
Sean Callanan6b4067c2010-07-17 00:43:37 +00003264
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003265 if (!var_sc.module_sp)
Sean Callanan6b4067c2010-07-17 00:43:37 +00003266 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003267
3268 ObjectFile *object_file = var_sc.module_sp->GetObjectFile();
3269
3270 if (!object_file)
Sean Callanan6b4067c2010-07-17 00:43:37 +00003271 return NULL;
3272
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003273 Address so_addr(var_location->GetScalar().ULongLong(), object_file->GetSectionList());
3274
Greg Claytonc14ee322011-09-22 04:58:26 +00003275 lldb::addr_t load_addr = so_addr.GetLoadAddress(target);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003276
Sean Callanan3bfdaa22011-09-15 02:13:07 +00003277 if (load_addr != LLDB_INVALID_ADDRESS)
3278 {
3279 var_location->GetScalar() = load_addr;
3280 var_location->SetValueType(Value::eValueTypeLoadAddress);
3281 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003282 }
3283
Sean Callanan1d180662010-07-20 23:31:16 +00003284 if (user_type)
Greg Clayton6beaaa62011-01-17 03:46:26 +00003285 *user_type = TypeFromUser(var_opaque_type, ast);
Sean Callanan6b4067c2010-07-17 00:43:37 +00003286
3287 return var_location.release();
3288}
3289
3290void
Sean Callanan0712f462011-11-29 22:03:21 +00003291ClangExpressionDeclMap::AddOneVariable (NameSearchContext &context, VariableSP var, ValueObjectSP valobj, unsigned int current_id)
Sean Callanan6b4067c2010-07-17 00:43:37 +00003292{
Sean Callanan979f74d2010-12-03 01:38:59 +00003293 assert (m_parser_vars.get());
3294
Greg Clayton2d4edfb2010-11-06 01:53:30 +00003295 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan3bfdaa22011-09-15 02:13:07 +00003296
Sean Callanan1d180662010-07-20 23:31:16 +00003297 TypeFromUser ut;
3298 TypeFromParser pt;
Sean Callanan6b4067c2010-07-17 00:43:37 +00003299
Sean Callanan933693b2012-02-10 01:22:05 +00003300 Value *var_location = GetVariableValue (var,
Sean Callananeddeb3b2011-10-28 23:38:38 +00003301 m_ast_context,
Greg Clayton7b462cc2010-10-15 22:48:33 +00003302 &ut,
3303 &pt);
Sean Callanan6b4067c2010-07-17 00:43:37 +00003304
Sean Callanancf128622012-03-15 01:53:17 +00003305 clang::QualType parser_opaque_type = QualType::getFromOpaquePtr(pt.GetOpaqueQualType());
3306
Sean Callanane2d47482012-03-21 17:13:20 +00003307 if (parser_opaque_type.isNull())
3308 return;
3309
Sean Callanancf128622012-03-15 01:53:17 +00003310 if (const clang::Type *parser_type = parser_opaque_type.getTypePtr())
3311 {
3312 if (const TagType *tag_type = dyn_cast<TagType>(parser_type))
3313 CompleteType(tag_type->getDecl());
3314 }
3315
Sean Callanana3aa0cf2010-11-20 02:19:29 +00003316 if (!var_location)
3317 return;
3318
Sean Callanan98298012011-10-27 19:41:13 +00003319 NamedDecl *var_decl;
3320
3321 bool is_reference = ClangASTContext::IsReferenceType(pt.GetOpaqueQualType());
3322
3323 if (is_reference)
3324 var_decl = context.AddVarDecl(pt.GetOpaqueQualType());
3325 else
3326 var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(pt.GetASTContext(), pt.GetOpaqueQualType()));
3327
Greg Clayton7b462cc2010-10-15 22:48:33 +00003328 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00003329 ConstString entity_name(decl_name.c_str());
Sean Callanan0712f462011-11-29 22:03:21 +00003330 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (valobj));
3331
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00003332 assert (entity.get());
Sean Callanan3c495c12013-01-15 23:29:36 +00003333 entity->EnableParserVars(GetParserID());
3334 ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID());
3335 parser_vars->m_parser_type = pt;
3336 parser_vars->m_named_decl = var_decl;
3337 parser_vars->m_llvm_value = NULL;
3338 parser_vars->m_lldb_value = var_location;
3339 parser_vars->m_lldb_var = var;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003340
Sean Callanan98298012011-10-27 19:41:13 +00003341 if (is_reference)
3342 entity->m_flags |= ClangExpressionVariable::EVTypeIsReference;
3343
Sean Callananea22d422010-07-16 00:09:46 +00003344 if (log)
Greg Clayton7b462cc2010-10-15 22:48:33 +00003345 {
Sean Callanan82695d62011-11-07 23:32:52 +00003346 ASTDumper orig_dumper(ut.GetOpaqueQualType());
Greg Clayton64bc6ca2011-10-20 00:47:21 +00003347 ASTDumper ast_dumper(var_decl);
Sean Callanan82695d62011-11-07 23:32:52 +00003348 log->Printf(" CEDM::FEVD[%u] Found variable %s, returned %s (original %s)", current_id, decl_name.c_str(), ast_dumper.GetCString(), orig_dumper.GetCString());
Greg Clayton7b462cc2010-10-15 22:48:33 +00003349 }
Sean Callanan468574b2010-06-22 23:46:24 +00003350}
3351
3352void
Sean Callanan2235f322010-08-11 03:57:18 +00003353ClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
Sean Callanan7dd98122011-10-14 20:34:21 +00003354 ClangExpressionVariableSP &pvar_sp,
3355 unsigned int current_id)
Sean Callanan2235f322010-08-11 03:57:18 +00003356{
Greg Clayton2d4edfb2010-11-06 01:53:30 +00003357 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan823bb4c2010-08-30 22:17:16 +00003358
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00003359 TypeFromUser user_type (pvar_sp->GetTypeFromUser());
Sean Callanan2235f322010-08-11 03:57:18 +00003360
Sean Callananeddeb3b2011-10-28 23:38:38 +00003361 TypeFromParser parser_type (GuardedCopyType(m_ast_context,
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00003362 user_type.GetASTContext(),
3363 user_type.GetOpaqueQualType()),
Sean Callananeddeb3b2011-10-28 23:38:38 +00003364 m_ast_context);
Sean Callanan2235f322010-08-11 03:57:18 +00003365
Sean Callanane0a64f72011-12-01 21:04:37 +00003366 if (!parser_type.GetOpaqueQualType())
3367 {
3368 if (log)
3369 log->Printf(" CEDM::FEVD[%u] Couldn't import type for pvar %s", current_id, pvar_sp->GetName().GetCString());
3370 return;
3371 }
3372
Sean Callanan92adcac2011-01-13 08:53:35 +00003373 NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(parser_type.GetASTContext(), parser_type.GetOpaqueQualType()));
Sean Callanan64dfc9a2010-08-23 23:09:38 +00003374
Sean Callanan3c495c12013-01-15 23:29:36 +00003375 pvar_sp->EnableParserVars(GetParserID());
3376 ClangExpressionVariable::ParserVars *parser_vars = pvar_sp->GetParserVars(GetParserID());
3377 parser_vars->m_parser_type = parser_type;
3378 parser_vars->m_named_decl = var_decl;
3379 parser_vars->m_llvm_value = NULL;
3380 parser_vars->m_lldb_value = NULL;
Sean Callanan823bb4c2010-08-30 22:17:16 +00003381
3382 if (log)
Sean Callanan530782942010-11-01 23:22:47 +00003383 {
Greg Clayton64bc6ca2011-10-20 00:47:21 +00003384 ASTDumper ast_dumper(var_decl);
Sean Callananfb3e4302011-10-29 19:50:43 +00003385 log->Printf(" CEDM::FEVD[%u] Added pvar %s, returned %s", current_id, pvar_sp->GetName().GetCString(), ast_dumper.GetCString());
Sean Callanan530782942010-11-01 23:22:47 +00003386 }
Sean Callanan2235f322010-08-11 03:57:18 +00003387}
3388
Sean Callanan348b5892010-11-30 00:27:43 +00003389void
Sean Callanand9ca42a2011-05-08 02:21:26 +00003390ClangExpressionDeclMap::AddOneGenericVariable(NameSearchContext &context,
Greg Clayton3d51b9f2012-11-27 01:52:16 +00003391 const Symbol &symbol,
Sean Callanan7dd98122011-10-14 20:34:21 +00003392 unsigned int current_id)
Sean Callanand9ca42a2011-05-08 02:21:26 +00003393{
3394 assert(m_parser_vars.get());
3395
3396 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
3397
Sean Callanan933693b2012-02-10 01:22:05 +00003398 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
Greg Claytonc14ee322011-09-22 04:58:26 +00003399
3400 if (target == NULL)
3401 return;
3402
3403 ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
Sean Callanand9ca42a2011-05-08 02:21:26 +00003404
Greg Clayton68510992012-12-14 00:26:21 +00003405 TypeFromUser user_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(scratch_ast_context, false)),
Sean Callanand9ca42a2011-05-08 02:21:26 +00003406 scratch_ast_context);
3407
Greg Clayton68510992012-12-14 00:26:21 +00003408 TypeFromParser parser_type (ClangASTContext::CreateLValueReferenceType(m_ast_context, ClangASTContext::GetVoidPtrType(m_ast_context, false)),
Sean Callananeddeb3b2011-10-28 23:38:38 +00003409 m_ast_context);
Sean Callanand9ca42a2011-05-08 02:21:26 +00003410
Sean Callanan77502262011-05-12 23:54:16 +00003411 NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
Sean Callanand9ca42a2011-05-08 02:21:26 +00003412
3413 std::string decl_name(context.m_decl_name.getAsString());
3414 ConstString entity_name(decl_name.c_str());
Sean Callanan933693b2012-02-10 01:22:05 +00003415 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope (),
Sean Callanand9ca42a2011-05-08 02:21:26 +00003416 entity_name,
3417 user_type,
Sean Callanan3bfdaa22011-09-15 02:13:07 +00003418 m_parser_vars->m_target_info.byte_order,
3419 m_parser_vars->m_target_info.address_byte_size));
Sean Callanand9ca42a2011-05-08 02:21:26 +00003420 assert (entity.get());
Sean Callanand9ca42a2011-05-08 02:21:26 +00003421
3422 std::auto_ptr<Value> symbol_location(new Value);
3423
Greg Clayton3d51b9f2012-11-27 01:52:16 +00003424 const Address &symbol_address = symbol.GetAddress();
Greg Claytonc14ee322011-09-22 04:58:26 +00003425 lldb::addr_t symbol_load_addr = symbol_address.GetLoadAddress(target);
Sean Callanand9ca42a2011-05-08 02:21:26 +00003426
3427 symbol_location->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
3428 symbol_location->GetScalar() = symbol_load_addr;
3429 symbol_location->SetValueType(Value::eValueTypeLoadAddress);
3430
Sean Callanan3c495c12013-01-15 23:29:36 +00003431 entity->EnableParserVars(GetParserID());
3432 ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID());
3433 parser_vars->m_parser_type = parser_type;
3434 parser_vars->m_named_decl = var_decl;
3435 parser_vars->m_llvm_value = NULL;
3436 parser_vars->m_lldb_value = symbol_location.release();
3437 parser_vars->m_lldb_sym = &symbol;
Sean Callanand9ca42a2011-05-08 02:21:26 +00003438
3439 if (log)
3440 {
Greg Clayton64bc6ca2011-10-20 00:47:21 +00003441 ASTDumper ast_dumper(var_decl);
Sean Callanand9ca42a2011-05-08 02:21:26 +00003442
Sean Callananfb3e4302011-10-29 19:50:43 +00003443 log->Printf(" CEDM::FEVD[%u] Found variable %s, returned %s", current_id, decl_name.c_str(), ast_dumper.GetCString());
Sean Callanand9ca42a2011-05-08 02:21:26 +00003444 }
3445}
3446
Sean Callanan77502262011-05-12 23:54:16 +00003447bool
3448ClangExpressionDeclMap::ResolveUnknownTypes()
3449{
3450 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan933693b2012-02-10 01:22:05 +00003451 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
Greg Claytonc14ee322011-09-22 04:58:26 +00003452
3453 ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
Sean Callanan77502262011-05-12 23:54:16 +00003454
3455 for (size_t index = 0, num_entities = m_found_entities.GetSize();
3456 index < num_entities;
3457 ++index)
3458 {
3459 ClangExpressionVariableSP entity = m_found_entities.GetVariableAtIndex(index);
3460
Sean Callanan3c495c12013-01-15 23:29:36 +00003461 ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID());
3462
Sean Callanan77502262011-05-12 23:54:16 +00003463 if (entity->m_flags & ClangExpressionVariable::EVUnknownType)
3464 {
Sean Callanan3c495c12013-01-15 23:29:36 +00003465 const NamedDecl *named_decl = parser_vars->m_named_decl;
Sean Callanan77502262011-05-12 23:54:16 +00003466 const VarDecl *var_decl = dyn_cast<VarDecl>(named_decl);
3467
3468 if (!var_decl)
3469 {
3470 if (log)
3471 log->Printf("Entity of unknown type does not have a VarDecl");
3472 return false;
3473 }
3474
3475 if (log)
3476 {
Greg Clayton64bc6ca2011-10-20 00:47:21 +00003477 ASTDumper ast_dumper(const_cast<VarDecl*>(var_decl));
3478 log->Printf("Variable of unknown type now has Decl %s", ast_dumper.GetCString());
Sean Callanan77502262011-05-12 23:54:16 +00003479 }
3480
3481 QualType var_type = var_decl->getType();
3482 TypeFromParser parser_type(var_type.getAsOpaquePtr(), &var_decl->getASTContext());
3483
Sean Callanan00f43622011-11-18 03:28:09 +00003484 lldb::clang_type_t copied_type = m_ast_importer->CopyType(scratch_ast_context, &var_decl->getASTContext(), var_type.getAsOpaquePtr());
Sean Callanan77502262011-05-12 23:54:16 +00003485
Sean Callanane0a64f72011-12-01 21:04:37 +00003486 if (!copied_type)
3487 {
3488 if (log)
3489 log->Printf("ClangExpressionDeclMap::ResolveUnknownType - Couldn't import the type for a variable");
3490
Jim Inghamf94e1792012-08-11 00:35:26 +00003491 return (bool) lldb::ClangExpressionVariableSP();
Sean Callanane0a64f72011-12-01 21:04:37 +00003492 }
3493
Sean Callanan77502262011-05-12 23:54:16 +00003494 TypeFromUser user_type(copied_type, scratch_ast_context);
3495
Sean Callanan3c495c12013-01-15 23:29:36 +00003496 parser_vars->m_lldb_value->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
3497 parser_vars->m_parser_type = parser_type;
Sean Callanan77502262011-05-12 23:54:16 +00003498
3499 entity->SetClangAST(user_type.GetASTContext());
3500 entity->SetClangType(user_type.GetOpaqueQualType());
3501
3502 entity->m_flags &= ~(ClangExpressionVariable::EVUnknownType);
3503 }
3504 }
3505
3506 return true;
3507}
3508
Sean Callanand9ca42a2011-05-08 02:21:26 +00003509void
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00003510ClangExpressionDeclMap::AddOneRegister (NameSearchContext &context,
Sean Callanan7dd98122011-10-14 20:34:21 +00003511 const RegisterInfo *reg_info,
3512 unsigned int current_id)
Sean Callanan348b5892010-11-30 00:27:43 +00003513{
3514 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
3515
Sean Callananeddeb3b2011-10-28 23:38:38 +00003516 void *ast_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize(m_ast_context,
Sean Callanan348b5892010-11-30 00:27:43 +00003517 reg_info->encoding,
3518 reg_info->byte_size * 8);
3519
3520 if (!ast_type)
3521 {
Johnny Chene95fcf72011-08-09 22:52:27 +00003522 if (log)
Sean Callanan7dd98122011-10-14 20:34:21 +00003523 log->Printf(" Tried to add a type for %s, but couldn't get one", context.m_decl_name.getAsString().c_str());
Sean Callanan348b5892010-11-30 00:27:43 +00003524 return;
3525 }
3526
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00003527 TypeFromParser parser_type (ast_type,
Sean Callananeddeb3b2011-10-28 23:38:38 +00003528 m_ast_context);
Sean Callanan348b5892010-11-30 00:27:43 +00003529
3530 NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
3531
Sean Callanan933693b2012-02-10 01:22:05 +00003532 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(),
Sean Callanan3bfdaa22011-09-15 02:13:07 +00003533 m_parser_vars->m_target_info.byte_order,
3534 m_parser_vars->m_target_info.address_byte_size));
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00003535 assert (entity.get());
Sean Callanan348b5892010-11-30 00:27:43 +00003536 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00003537 entity->SetName (ConstString (decl_name.c_str()));
3538 entity->SetRegisterInfo (reg_info);
Sean Callanan3c495c12013-01-15 23:29:36 +00003539 entity->EnableParserVars(GetParserID());
3540 ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID());
3541 parser_vars->m_parser_type = parser_type;
3542 parser_vars->m_named_decl = var_decl;
3543 parser_vars->m_llvm_value = NULL;
3544 parser_vars->m_lldb_value = NULL;
Sean Callananf673e762012-02-15 01:40:39 +00003545 entity->m_flags |= ClangExpressionVariable::EVBareRegister;
Sean Callanan348b5892010-11-30 00:27:43 +00003546
Sean Callananf673e762012-02-15 01:40:39 +00003547 if (log)
Sean Callanan348b5892010-11-30 00:27:43 +00003548 {
Greg Clayton64bc6ca2011-10-20 00:47:21 +00003549 ASTDumper ast_dumper(var_decl);
Sean Callananfb3e4302011-10-29 19:50:43 +00003550 log->Printf(" CEDM::FEVD[%d] Added register %s, returned %s", current_id, context.m_decl_name.getAsString().c_str(), ast_dumper.GetCString());
Sean Callanan348b5892010-11-30 00:27:43 +00003551 }
3552}
3553
Sean Callanan2235f322010-08-11 03:57:18 +00003554void
Greg Clayton3f5c08f2011-05-18 22:01:49 +00003555ClangExpressionDeclMap::AddOneFunction (NameSearchContext &context,
3556 Function* fun,
Sean Callanan7dd98122011-10-14 20:34:21 +00003557 Symbol* symbol,
3558 unsigned int current_id)
Sean Callanan468574b2010-06-22 23:46:24 +00003559{
Sean Callanan979f74d2010-12-03 01:38:59 +00003560 assert (m_parser_vars.get());
3561
Greg Clayton2d4edfb2010-11-06 01:53:30 +00003562 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan468574b2010-06-22 23:46:24 +00003563
Sean Callanan77eaf442011-07-08 00:39:14 +00003564 NamedDecl *fun_decl = NULL;
Sean Callanan468574b2010-06-22 23:46:24 +00003565 std::auto_ptr<Value> fun_location(new Value);
Sean Callanan77eaf442011-07-08 00:39:14 +00003566 const Address *fun_address = NULL;
Sean Callanan468574b2010-06-22 23:46:24 +00003567
Sean Callanan8ade1042010-07-27 00:55:47 +00003568 // only valid for Functions, not for Symbols
3569 void *fun_opaque_type = NULL;
Sean Callanancc427fa2011-07-30 02:42:06 +00003570 ASTContext *fun_ast_context = NULL;
Matt Kopec00049b82013-02-27 20:13:38 +00003571
3572 bool is_indirect_function = false;
3573
Sean Callanan8ade1042010-07-27 00:55:47 +00003574 if (fun)
3575 {
3576 Type *fun_type = fun->GetType();
3577
3578 if (!fun_type)
3579 {
3580 if (log)
Sean Callanan7dd98122011-10-14 20:34:21 +00003581 log->PutCString(" Skipped a function because it has no type");
Sean Callanan8ade1042010-07-27 00:55:47 +00003582 return;
3583 }
3584
Greg Claytonf4ecaa52011-02-16 23:00:21 +00003585 fun_opaque_type = fun_type->GetClangFullType();
Sean Callanan8ade1042010-07-27 00:55:47 +00003586
3587 if (!fun_opaque_type)
3588 {
3589 if (log)
Sean Callanan7dd98122011-10-14 20:34:21 +00003590 log->PutCString(" Skipped a function because it has no Clang type");
Sean Callanan8ade1042010-07-27 00:55:47 +00003591 return;
3592 }
3593
3594 fun_address = &fun->GetAddressRange().GetBaseAddress();
3595
Greg Clayton6beaaa62011-01-17 03:46:26 +00003596 fun_ast_context = fun_type->GetClangASTContext().getASTContext();
Sean Callananeddeb3b2011-10-28 23:38:38 +00003597 void *copied_type = GuardedCopyType(m_ast_context, fun_ast_context, fun_opaque_type);
Greg Clayton64bc6ca2011-10-20 00:47:21 +00003598 if (copied_type)
3599 {
3600 fun_decl = context.AddFunDecl(copied_type);
3601 }
3602 else
3603 {
3604 // We failed to copy the type we found
3605 if (log)
3606 {
Daniel Malead01b2952012-11-29 21:49:15 +00003607 log->Printf (" Failed to import the function type '%s' {0x%8.8" PRIx64 "} into the expression parser AST contenxt",
Greg Clayton64bc6ca2011-10-20 00:47:21 +00003608 fun_type->GetName().GetCString(),
3609 fun_type->GetID());
3610 }
Sean Callananed8d58f2011-11-16 00:40:13 +00003611
3612 return;
Greg Clayton64bc6ca2011-10-20 00:47:21 +00003613 }
Sean Callanan8ade1042010-07-27 00:55:47 +00003614 }
3615 else if (symbol)
3616 {
Greg Claytone7612132012-03-07 21:03:09 +00003617 fun_address = &symbol->GetAddress();
Sean Callanan8ade1042010-07-27 00:55:47 +00003618 fun_decl = context.AddGenericFunDecl();
Matt Kopec00049b82013-02-27 20:13:38 +00003619 is_indirect_function = symbol->IsIndirect();
Sean Callanan8ade1042010-07-27 00:55:47 +00003620 }
3621 else
3622 {
3623 if (log)
Sean Callanan7dd98122011-10-14 20:34:21 +00003624 log->PutCString(" AddOneFunction called with no function and no symbol");
Sean Callanan8ade1042010-07-27 00:55:47 +00003625 return;
3626 }
3627
Sean Callanan933693b2012-02-10 01:22:05 +00003628 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
Greg Claytonc14ee322011-09-22 04:58:26 +00003629
Matt Kopec00049b82013-02-27 20:13:38 +00003630 lldb::addr_t load_addr = fun_address->GetCallableLoadAddress(target, is_indirect_function);
Sean Callanan468574b2010-06-22 23:46:24 +00003631 fun_location->SetValueType(Value::eValueTypeLoadAddress);
3632 fun_location->GetScalar() = load_addr;
3633
Sean Callanan933693b2012-02-10 01:22:05 +00003634 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope (),
Sean Callanan3bfdaa22011-09-15 02:13:07 +00003635 m_parser_vars->m_target_info.byte_order,
3636 m_parser_vars->m_target_info.address_byte_size));
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00003637 assert (entity.get());
Greg Clayton7b462cc2010-10-15 22:48:33 +00003638 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00003639 entity->SetName(ConstString(decl_name.c_str()));
3640 entity->SetClangType (fun_opaque_type);
3641 entity->SetClangAST (fun_ast_context);
Sean Callanan468574b2010-06-22 23:46:24 +00003642
Sean Callanan3c495c12013-01-15 23:29:36 +00003643 entity->EnableParserVars(GetParserID());
3644 ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID());
3645 parser_vars->m_named_decl = fun_decl;
3646 parser_vars->m_llvm_value = NULL;
3647 parser_vars->m_lldb_value = fun_location.release();
Sean Callanan64dfc9a2010-08-23 23:09:38 +00003648
Sean Callananea22d422010-07-16 00:09:46 +00003649 if (log)
Greg Clayton7b462cc2010-10-15 22:48:33 +00003650 {
Greg Clayton64bc6ca2011-10-20 00:47:21 +00003651 ASTDumper ast_dumper(fun_decl);
Sean Callanan530782942010-11-01 23:22:47 +00003652
Sean Callanan308a3c52012-07-28 00:21:01 +00003653 StreamString ss;
3654
3655 fun_address->Dump(&ss, m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(), Address::DumpStyleResolvedDescription);
3656
3657 log->Printf(" CEDM::FEVD[%u] Found %s function %s (description %s), returned %s",
Sean Callanan7dd98122011-10-14 20:34:21 +00003658 current_id,
3659 (fun ? "specific" : "generic"),
Sean Callanan308a3c52012-07-28 00:21:01 +00003660 decl_name.c_str(),
3661 ss.GetData(),
Greg Clayton64bc6ca2011-10-20 00:47:21 +00003662 ast_dumper.GetCString());
Greg Clayton7b462cc2010-10-15 22:48:33 +00003663 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003664}
Sean Callanan5666b672010-08-04 01:02:13 +00003665
Sean Callananfa4fab72013-02-01 06:55:48 +00003666TypeFromParser
3667ClangExpressionDeclMap::CopyClassType(TypeFromUser &ut,
3668 unsigned int current_id)
Sean Callanan5666b672010-08-04 01:02:13 +00003669{
Sean Callananeddeb3b2011-10-28 23:38:38 +00003670 ASTContext *parser_ast_context = m_ast_context;
Sean Callanancc427fa2011-07-30 02:42:06 +00003671 ASTContext *user_ast_context = ut.GetASTContext();
Sean Callananfa4fab72013-02-01 06:55:48 +00003672
Sean Callanan6abfabf2010-11-19 20:20:02 +00003673 void *copied_type = GuardedCopyType(parser_ast_context, user_ast_context, ut.GetOpaqueQualType());
Sean Callanane0a64f72011-12-01 21:04:37 +00003674
3675 if (!copied_type)
3676 {
3677 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanane0a64f72011-12-01 21:04:37 +00003678
Sean Callananfa4fab72013-02-01 06:55:48 +00003679 if (log)
3680 log->Printf("ClangExpressionDeclMap::CopyClassType - Couldn't import the type");
3681
3682 return TypeFromParser();
Sean Callanane0a64f72011-12-01 21:04:37 +00003683 }
Sean Callananfa4fab72013-02-01 06:55:48 +00003684
3685 if (ClangASTContext::IsAggregateType(copied_type) && ClangASTContext::GetCompleteType (parser_ast_context, copied_type))
Sean Callananfc55f5d2010-09-21 00:44:12 +00003686 {
3687 void *args[1];
3688
3689 args[0] = ClangASTContext::GetVoidPtrType(parser_ast_context, false);
3690
Sean Callananc1b732d2011-11-01 18:07:13 +00003691 clang_type_t method_type = ClangASTContext::CreateFunctionType (parser_ast_context,
3692 ClangASTContext::GetBuiltInType_void(parser_ast_context),
3693 args,
3694 1,
3695 false,
3696 ClangASTContext::GetTypeQualifiers(copied_type));
3697
Greg Clayton0fffff52010-09-24 05:15:53 +00003698 const bool is_virtual = false;
3699 const bool is_static = false;
3700 const bool is_inline = false;
Greg Claytonf51de672010-10-01 02:31:07 +00003701 const bool is_explicit = false;
Sean Callananc8324752011-11-02 18:09:01 +00003702 const bool is_attr_used = true;
Sean Callanandbb58392011-11-02 01:38:59 +00003703 const bool is_artificial = false;
Greg Claytonf51de672010-10-01 02:31:07 +00003704
Greg Clayton0fffff52010-09-24 05:15:53 +00003705 ClangASTContext::AddMethodToCXXRecordType (parser_ast_context,
3706 copied_type,
Greg Clayton7b462cc2010-10-15 22:48:33 +00003707 "$__lldb_expr",
Greg Clayton0fffff52010-09-24 05:15:53 +00003708 method_type,
3709 lldb::eAccessPublic,
3710 is_virtual,
3711 is_static,
Greg Claytonf51de672010-10-01 02:31:07 +00003712 is_inline,
Sean Callananc1b732d2011-11-01 18:07:13 +00003713 is_explicit,
Sean Callanandbb58392011-11-02 01:38:59 +00003714 is_attr_used,
3715 is_artificial);
Sean Callananfc55f5d2010-09-21 00:44:12 +00003716 }
Sean Callanan5666b672010-08-04 01:02:13 +00003717
Sean Callananfa4fab72013-02-01 06:55:48 +00003718 return TypeFromParser(copied_type, parser_ast_context);
3719}
3720
3721void
3722ClangExpressionDeclMap::AddOneType(NameSearchContext &context,
3723 TypeFromUser &ut,
3724 unsigned int current_id)
3725{
3726 ASTContext *parser_ast_context = m_ast_context;
3727 ASTContext *user_ast_context = ut.GetASTContext();
3728
3729 void *copied_type = GuardedCopyType(parser_ast_context, user_ast_context, ut.GetOpaqueQualType());
3730
3731 if (!copied_type)
3732 {
3733 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
3734
3735 if (log)
3736 log->Printf("ClangExpressionDeclMap::AddOneType - Couldn't import the type");
3737
3738 return;
3739 }
3740
Sean Callanan5666b672010-08-04 01:02:13 +00003741 context.AddTypeDecl(copied_type);
3742}