blob: 4a76871128b9a2adc7daec45892ebb50cdd2b9ba [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 Clayton9191db42013-10-21 18:40:51 +000024#include "lldb/Core/ModuleSpec.h"
Greg Clayton7349bd92011-05-09 20:18:18 +000025#include "lldb/Core/RegisterValue.h"
Sean Callanane4ec90e2010-12-16 03:17:46 +000026#include "lldb/Core/ValueObjectConstResult.h"
Sean Callanan9b3569b2011-12-10 03:12:34 +000027#include "lldb/Core/ValueObjectVariable.h"
Sean Callanan0917d6e2011-02-01 23:43:26 +000028#include "lldb/Expression/ASTDumper.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000029#include "lldb/Expression/ClangASTSource.h"
Sean Callanan2235f322010-08-11 03:57:18 +000030#include "lldb/Expression/ClangPersistentVariables.h"
Sean Callanan96d27302013-04-11 00:09:05 +000031#include "lldb/Expression/Materializer.h"
Greg Clayton7fb56d02011-02-01 01:31:41 +000032#include "lldb/Host/Endian.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000033#include "lldb/Symbol/ClangASTContext.h"
Greg Clayton526e5af2010-11-13 03:52:47 +000034#include "lldb/Symbol/ClangNamespaceDecl.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000035#include "lldb/Symbol/CompileUnit.h"
36#include "lldb/Symbol/Function.h"
37#include "lldb/Symbol/ObjectFile.h"
38#include "lldb/Symbol/SymbolContext.h"
Sean Callanan503aa522011-10-12 00:12:34 +000039#include "lldb/Symbol/SymbolVendor.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000040#include "lldb/Symbol/Type.h"
41#include "lldb/Symbol/TypeList.h"
42#include "lldb/Symbol/Variable.h"
43#include "lldb/Symbol/VariableList.h"
Sean Callanan1d180662010-07-20 23:31:16 +000044#include "lldb/Target/ExecutionContext.h"
Sean Callanane0b23b52012-11-15 02:02:04 +000045#include "lldb/Target/ObjCLanguageRuntime.h"
Sean Callananea22d422010-07-16 00:09:46 +000046#include "lldb/Target/Process.h"
Sean Callananf4b9bd32010-10-05 20:18:48 +000047#include "lldb/Target/RegisterContext.h"
Jason Molendab57e4a12013-11-04 09:33:30 +000048#include "lldb/Target/StackFrame.h"
Sean Callanan1d180662010-07-20 23:31:16 +000049#include "lldb/Target/Target.h"
Jim Ingham895c9822010-12-07 01:56:02 +000050#include "lldb/Target/Thread.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000051
Greg Clayton83c5cd92010-11-14 22:13:40 +000052using namespace lldb;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000053using namespace lldb_private;
54using namespace clang;
55
Sean Callanan1ee44b72011-10-29 01:58:46 +000056ClangExpressionDeclMap::ClangExpressionDeclMap (bool keep_result_in_memory, ExecutionContext &exe_ctx) :
57 ClangASTSource (exe_ctx.GetTargetSP()),
Greg Clayton7b462cc2010-10-15 22:48:33 +000058 m_found_entities (),
59 m_struct_members (),
Stephen Wilson71c21d12011-04-11 19:41:40 +000060 m_keep_result_in_memory (keep_result_in_memory),
Sean Callanan979f74d2010-12-03 01:38:59 +000061 m_parser_vars (),
Stephen Wilson71c21d12011-04-11 19:41:40 +000062 m_struct_vars ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +000063{
Sean Callanan979f74d2010-12-03 01:38:59 +000064 EnableStructVars();
Chris Lattner30fdc8d2010-06-08 16:52:24 +000065}
66
67ClangExpressionDeclMap::~ClangExpressionDeclMap()
Sean Callanan979f74d2010-12-03 01:38:59 +000068{
Sean Callanane3aef1d2011-10-12 22:20:02 +000069 // Note: The model is now that the parser's AST context and all associated
70 // data does not vanish until the expression has been executed. This means
71 // that valuable lookup data (like namespaces) doesn't vanish, but
72
73 DidParse();
Sean Callanan979f74d2010-12-03 01:38:59 +000074 DisableStructVars();
75}
Sean Callananbe3a1b12010-10-26 00:31:56 +000076
Sean Callananb9951192011-08-01 18:18:33 +000077bool
Sean Callanan96d27302013-04-11 00:09:05 +000078ClangExpressionDeclMap::WillParse(ExecutionContext &exe_ctx,
79 Materializer *materializer)
Sean Callanan8106d802013-03-08 20:04:57 +000080{
81 ClangASTMetrics::ClearLocalCounters();
82
Sean Callanan979f74d2010-12-03 01:38:59 +000083 EnableParserVars();
Sean Callanan933693b2012-02-10 01:22:05 +000084 m_parser_vars->m_exe_ctx = exe_ctx;
Greg Claytonc14ee322011-09-22 04:58:26 +000085
86 Target *target = exe_ctx.GetTargetPtr();
87 if (exe_ctx.GetFramePtr())
88 m_parser_vars->m_sym_ctx = exe_ctx.GetFramePtr()->GetSymbolContext(lldb::eSymbolContextEverything);
Sean Callanand4fac252013-02-21 22:01:43 +000089 else if (exe_ctx.GetThreadPtr() && exe_ctx.GetThreadPtr()->GetStackFrameAtIndex(0))
Greg Claytonc14ee322011-09-22 04:58:26 +000090 m_parser_vars->m_sym_ctx = exe_ctx.GetThreadPtr()->GetStackFrameAtIndex(0)->GetSymbolContext(lldb::eSymbolContextEverything);
91 else if (exe_ctx.GetProcessPtr())
Greg Clayton4d122c42011-09-17 08:33:22 +000092 {
Greg Clayton72310352013-02-23 04:12:47 +000093 m_parser_vars->m_sym_ctx.Clear(true);
Greg Claytonc14ee322011-09-22 04:58:26 +000094 m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP();
Greg Clayton4d122c42011-09-17 08:33:22 +000095 }
Greg Claytonc14ee322011-09-22 04:58:26 +000096 else if (target)
Greg Clayton4d122c42011-09-17 08:33:22 +000097 {
Greg Clayton72310352013-02-23 04:12:47 +000098 m_parser_vars->m_sym_ctx.Clear(true);
Greg Claytonc14ee322011-09-22 04:58:26 +000099 m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP();
Greg Clayton4d122c42011-09-17 08:33:22 +0000100 }
Sean Callananc2ff2742011-09-15 18:41:04 +0000101
Greg Claytonc14ee322011-09-22 04:58:26 +0000102 if (target)
103 {
104 m_parser_vars->m_persistent_vars = &target->GetPersistentVariables();
Sean Callananb9951192011-08-01 18:18:33 +0000105
Greg Claytonc14ee322011-09-22 04:58:26 +0000106 if (!target->GetScratchClangASTContext())
107 return false;
108 }
Sean Callananb9951192011-08-01 18:18:33 +0000109
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000110 m_parser_vars->m_target_info = GetTargetInfo();
Sean Callanan96d27302013-04-11 00:09:05 +0000111 m_parser_vars->m_materializer = materializer;
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000112
Sean Callananb9951192011-08-01 18:18:33 +0000113 return true;
Sean Callanan979f74d2010-12-03 01:38:59 +0000114}
115
Sean Callanan96d27302013-04-11 00:09:05 +0000116void
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000117ClangExpressionDeclMap::DidParse()
Sean Callanan979f74d2010-12-03 01:38:59 +0000118{
Greg Clayton5160ce52013-03-27 23:08:40 +0000119 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan8106d802013-03-08 20:04:57 +0000120
121 if (log)
122 ClangASTMetrics::DumpCounters(log);
123
Sean Callanan979f74d2010-12-03 01:38:59 +0000124 if (m_parser_vars.get())
125 {
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000126 for (size_t entity_index = 0, num_entities = m_found_entities.GetSize();
Sean Callanan979f74d2010-12-03 01:38:59 +0000127 entity_index < num_entities;
128 ++entity_index)
129 {
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000130 ClangExpressionVariableSP var_sp(m_found_entities.GetVariableAtIndex(entity_index));
Jim Ingham28eb5712012-10-12 17:34:26 +0000131 if (var_sp)
Sean Callanan3c495c12013-01-15 23:29:36 +0000132 var_sp->DisableParserVars(GetParserID());
Sean Callanan979f74d2010-12-03 01:38:59 +0000133 }
134
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000135 for (size_t pvar_index = 0, num_pvars = m_parser_vars->m_persistent_vars->GetSize();
Sean Callanan979f74d2010-12-03 01:38:59 +0000136 pvar_index < num_pvars;
137 ++pvar_index)
138 {
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000139 ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariableAtIndex(pvar_index));
140 if (pvar_sp)
Sean Callanan3c495c12013-01-15 23:29:36 +0000141 pvar_sp->DisableParserVars(GetParserID());
Sean Callanan979f74d2010-12-03 01:38:59 +0000142 }
143
144 DisableParserVars();
Sean Callanan6b1b9532010-10-08 01:58:41 +0000145 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000146}
147
Sean Callanan549c9f72010-07-13 21:41:46 +0000148// Interface for IRForTarget
149
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000150ClangExpressionDeclMap::TargetInfo
151ClangExpressionDeclMap::GetTargetInfo()
152{
153 assert (m_parser_vars.get());
154
155 TargetInfo ret;
156
Sean Callanan933693b2012-02-10 01:22:05 +0000157 ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
158
159 Process *process = exe_ctx.GetProcessPtr();
160 if (process)
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000161 {
Sean Callanan933693b2012-02-10 01:22:05 +0000162 ret.byte_order = process->GetByteOrder();
163 ret.address_byte_size = process->GetAddressByteSize();
164 }
165 else
166 {
167 Target *target = exe_ctx.GetTargetPtr();
168 if (target)
Greg Claytonc14ee322011-09-22 04:58:26 +0000169 {
Sean Callanan933693b2012-02-10 01:22:05 +0000170 ret.byte_order = target->GetArchitecture().GetByteOrder();
171 ret.address_byte_size = target->GetArchitecture().GetAddressByteSize();
Greg Claytonc14ee322011-09-22 04:58:26 +0000172 }
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000173 }
Sean Callanan933693b2012-02-10 01:22:05 +0000174
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000175 return ret;
176}
177
Sean Callanan549c9f72010-07-13 21:41:46 +0000178bool
Greg Clayton7b462cc2010-10-15 22:48:33 +0000179ClangExpressionDeclMap::AddPersistentVariable
180(
Sean Callanancc427fa2011-07-30 02:42:06 +0000181 const NamedDecl *decl,
Greg Clayton7b462cc2010-10-15 22:48:33 +0000182 const ConstString &name,
Sean Callanan92adcac2011-01-13 08:53:35 +0000183 TypeFromParser parser_type,
184 bool is_result,
185 bool is_lvalue
Greg Clayton7b462cc2010-10-15 22:48:33 +0000186)
Sean Callanan2235f322010-08-11 03:57:18 +0000187{
Sean Callanan979f74d2010-12-03 01:38:59 +0000188 assert (m_parser_vars.get());
189
Sean Callanan1582ee62013-04-18 22:06:33 +0000190 if (m_parser_vars->m_materializer && is_result)
191 {
192 Error err;
193
194 ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
195 Target *target = exe_ctx.GetTargetPtr();
196 if (target == NULL)
197 return false;
198
199 ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
200
201 TypeFromUser user_type(m_ast_importer->DeportType(context,
202 parser_type.GetASTContext(),
203 parser_type.GetOpaqueQualType()),
204 context);
205
206 uint32_t offset = m_parser_vars->m_materializer->AddResultVariable(user_type, is_lvalue, m_keep_result_in_memory, err);
207
Sean Callananf35bbbc2013-07-15 18:43:36 +0000208 ClangExpressionVariableSP var_sp = m_found_entities.CreateVariable(exe_ctx.GetBestExecutionContextScope(),
209 name,
210 user_type,
211 m_parser_vars->m_target_info.byte_order,
212 m_parser_vars->m_target_info.address_byte_size);
Sean Callanan1582ee62013-04-18 22:06:33 +0000213
214 if (!var_sp)
215 return false;
216
217 var_sp->EnableParserVars(GetParserID());
218
219 ClangExpressionVariable::ParserVars *parser_vars = var_sp->GetParserVars(GetParserID());
220
221 parser_vars->m_named_decl = decl;
222 parser_vars->m_parser_type = parser_type;
223
224 var_sp->EnableJITVars(GetParserID());
225
226 ClangExpressionVariable::JITVars *jit_vars = var_sp->GetJITVars(GetParserID());
227
228 jit_vars->m_offset = offset;
229
230 return true;
231 }
232
Greg Clayton5160ce52013-03-27 23:08:40 +0000233 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan933693b2012-02-10 01:22:05 +0000234 ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
235 Target *target = exe_ctx.GetTargetPtr();
Greg Claytonc14ee322011-09-22 04:58:26 +0000236 if (target == NULL)
237 return false;
238
239 ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
Sean Callanan2235f322010-08-11 03:57:18 +0000240
Sean Callananbb120042011-12-16 21:06:35 +0000241 TypeFromUser user_type(m_ast_importer->DeportType(context,
242 parser_type.GetASTContext(),
243 parser_type.GetOpaqueQualType()),
Sean Callanane1175b72011-01-13 21:23:32 +0000244 context);
Sean Callanan00f43622011-11-18 03:28:09 +0000245
246 if (!user_type.GetOpaqueQualType())
247 {
248 if (log)
249 log->Printf("Persistent variable's type wasn't copied successfully");
250 return false;
251 }
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000252
253 if (!m_parser_vars->m_target_info.IsValid())
254 return false;
Sean Callanan2235f322010-08-11 03:57:18 +0000255
Sean Callananf35bbbc2013-07-15 18:43:36 +0000256 ClangExpressionVariableSP var_sp = m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx.GetBestExecutionContextScope (),
257 name,
258 user_type,
259 m_parser_vars->m_target_info.byte_order,
260 m_parser_vars->m_target_info.address_byte_size);
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000261
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000262 if (!var_sp)
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000263 return false;
264
Sean Callanan2cb5e522012-09-20 23:21:16 +0000265 var_sp->m_frozen_sp->SetHasCompleteType();
266
Sean Callanan92adcac2011-01-13 08:53:35 +0000267 if (is_result)
268 var_sp->m_flags |= ClangExpressionVariable::EVNeedsFreezeDry;
269 else
270 var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget; // explicitly-declared persistent variables should persist
271
272 if (is_lvalue)
273 {
274 var_sp->m_flags |= ClangExpressionVariable::EVIsProgramReference;
275 }
276 else
277 {
278 var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
279 var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
280 }
281
Sean Callanan35005f72013-04-12 18:10:34 +0000282 if (m_keep_result_in_memory)
283 {
284 var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget;
285 }
286
Sean Callanan92adcac2011-01-13 08:53:35 +0000287 if (log)
288 log->Printf("Created persistent variable with flags 0x%hx", var_sp->m_flags);
289
Sean Callanan3c495c12013-01-15 23:29:36 +0000290 var_sp->EnableParserVars(GetParserID());
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000291
Sean Callanan3c495c12013-01-15 23:29:36 +0000292 ClangExpressionVariable::ParserVars *parser_vars = var_sp->GetParserVars(GetParserID());
293
294 parser_vars->m_named_decl = decl;
295 parser_vars->m_parser_type = parser_type;
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000296
297 return true;
Sean Callanan2235f322010-08-11 03:57:18 +0000298}
299
300bool
Greg Clayton7b462cc2010-10-15 22:48:33 +0000301ClangExpressionDeclMap::AddValueToStruct
302(
Sean Callanancc427fa2011-07-30 02:42:06 +0000303 const NamedDecl *decl,
Greg Clayton7b462cc2010-10-15 22:48:33 +0000304 const ConstString &name,
305 llvm::Value *value,
306 size_t size,
307 off_t alignment
308)
Sean Callanan549c9f72010-07-13 21:41:46 +0000309{
Sean Callanan979f74d2010-12-03 01:38:59 +0000310 assert (m_struct_vars.get());
311 assert (m_parser_vars.get());
312
Sean Callanandf667652013-04-11 02:05:11 +0000313 bool is_persistent_variable = false;
314
Greg Clayton5160ce52013-03-27 23:08:40 +0000315 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan823bb4c2010-08-30 22:17:16 +0000316
Sean Callanan979f74d2010-12-03 01:38:59 +0000317 m_struct_vars->m_struct_laid_out = false;
Sean Callanan549c9f72010-07-13 21:41:46 +0000318
Sean Callanan3c495c12013-01-15 23:29:36 +0000319 if (m_struct_members.GetVariable(decl, GetParserID()))
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000320 return true;
Sean Callanan549c9f72010-07-13 21:41:46 +0000321
Sean Callanan3c495c12013-01-15 23:29:36 +0000322 ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl, GetParserID()));
Sean Callanan549c9f72010-07-13 21:41:46 +0000323
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000324 if (!var_sp)
Sean Callanandf667652013-04-11 02:05:11 +0000325 {
Sean Callanan3c495c12013-01-15 23:29:36 +0000326 var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl, GetParserID());
Sean Callanandf667652013-04-11 02:05:11 +0000327 is_persistent_variable = true;
328 }
Sean Callanan549c9f72010-07-13 21:41:46 +0000329
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000330 if (!var_sp)
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000331 return false;
332
Sean Callanan823bb4c2010-08-30 22:17:16 +0000333 if (log)
Sean Callanan00f43622011-11-18 03:28:09 +0000334 log->Printf("Adding value for (NamedDecl*)%p [%s - %s] to the structure",
Sean Callanan823bb4c2010-08-30 22:17:16 +0000335 decl,
Greg Clayton7b462cc2010-10-15 22:48:33 +0000336 name.GetCString(),
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000337 var_sp->GetName().GetCString());
Sean Callanan823bb4c2010-08-30 22:17:16 +0000338
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000339 // We know entity->m_parser_vars is valid because we used a parser variable
340 // to find it
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000341
Sean Callanan3c495c12013-01-15 23:29:36 +0000342 ClangExpressionVariable::ParserVars *parser_vars = var_sp->GetParserVars(GetParserID());
343
344 parser_vars->m_llvm_value = value;
345
Sean Callanan1582ee62013-04-18 22:06:33 +0000346 if (ClangExpressionVariable::JITVars *jit_vars = var_sp->GetJITVars(GetParserID()))
347 {
348 // We already laid this out; do not touch
349
350 if (log)
351 log->Printf("Already placed at 0x%llx", (unsigned long long)jit_vars->m_offset);
352 }
353
Sean Callanan3c495c12013-01-15 23:29:36 +0000354 var_sp->EnableJITVars(GetParserID());
355
356 ClangExpressionVariable::JITVars *jit_vars = var_sp->GetJITVars(GetParserID());
357
358 jit_vars->m_alignment = alignment;
359 jit_vars->m_size = size;
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000360
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000361 m_struct_members.AddVariable(var_sp);
Sean Callanan549c9f72010-07-13 21:41:46 +0000362
Sean Callanandf667652013-04-11 02:05:11 +0000363 if (m_parser_vars->m_materializer)
364 {
Sean Callanan3dd6a422013-04-11 21:16:36 +0000365 uint32_t offset = 0;
366
Sean Callanandf667652013-04-11 02:05:11 +0000367 Error err;
368
369 if (is_persistent_variable)
370 {
Sean Callanan3dd6a422013-04-11 21:16:36 +0000371 offset = m_parser_vars->m_materializer->AddPersistentVariable(var_sp, err);
Sean Callanandf667652013-04-11 02:05:11 +0000372 }
373 else
374 {
375 if (const lldb_private::Symbol *sym = parser_vars->m_lldb_sym)
Sean Callanan3dd6a422013-04-11 21:16:36 +0000376 offset = m_parser_vars->m_materializer->AddSymbol(*sym, err);
Sean Callanandf667652013-04-11 02:05:11 +0000377 else if (const RegisterInfo *reg_info = var_sp->GetRegisterInfo())
Sean Callanan3dd6a422013-04-11 21:16:36 +0000378 offset = m_parser_vars->m_materializer->AddRegister(*reg_info, err);
Sean Callanandf667652013-04-11 02:05:11 +0000379 else if (parser_vars->m_lldb_var)
Sean Callanan3dd6a422013-04-11 21:16:36 +0000380 offset = m_parser_vars->m_materializer->AddVariable(parser_vars->m_lldb_var, err);
Sean Callanandf667652013-04-11 02:05:11 +0000381 }
Sean Callanan3dd6a422013-04-11 21:16:36 +0000382
383 if (!err.Success())
384 return false;
385
386 if (log)
387 log->Printf("Placed at 0x%llx", (unsigned long long)offset);
388
389 jit_vars->m_offset = offset; // TODO DoStructLayout() should not change this.
Sean Callanandf667652013-04-11 02:05:11 +0000390 }
391
Sean Callanan549c9f72010-07-13 21:41:46 +0000392 return true;
393}
394
395bool
396ClangExpressionDeclMap::DoStructLayout ()
397{
Sean Callanan979f74d2010-12-03 01:38:59 +0000398 assert (m_struct_vars.get());
399
400 if (m_struct_vars->m_struct_laid_out)
Sean Callanan549c9f72010-07-13 21:41:46 +0000401 return true;
402
Sean Callanan14b1bae2013-04-16 23:25:35 +0000403 if (!m_parser_vars->m_materializer)
404 return false;
Sean Callanan3dd6a422013-04-11 21:16:36 +0000405
Sean Callanan14b1bae2013-04-16 23:25:35 +0000406 m_struct_vars->m_struct_alignment = m_parser_vars->m_materializer->GetStructAlignment();
407 m_struct_vars->m_struct_size = m_parser_vars->m_materializer->GetStructByteSize();
Sean Callanan979f74d2010-12-03 01:38:59 +0000408 m_struct_vars->m_struct_laid_out = true;
Sean Callanan549c9f72010-07-13 21:41:46 +0000409 return true;
410}
411
Greg Clayton7b462cc2010-10-15 22:48:33 +0000412bool ClangExpressionDeclMap::GetStructInfo
413(
414 uint32_t &num_elements,
415 size_t &size,
416 off_t &alignment
417)
Sean Callanan549c9f72010-07-13 21:41:46 +0000418{
Sean Callanan979f74d2010-12-03 01:38:59 +0000419 assert (m_struct_vars.get());
420
421 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan549c9f72010-07-13 21:41:46 +0000422 return false;
423
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000424 num_elements = m_struct_members.GetSize();
Sean Callanan979f74d2010-12-03 01:38:59 +0000425 size = m_struct_vars->m_struct_size;
426 alignment = m_struct_vars->m_struct_alignment;
Sean Callanan549c9f72010-07-13 21:41:46 +0000427
428 return true;
429}
430
431bool
Greg Clayton7b462cc2010-10-15 22:48:33 +0000432ClangExpressionDeclMap::GetStructElement
433(
Sean Callanancc427fa2011-07-30 02:42:06 +0000434 const NamedDecl *&decl,
Greg Clayton7b462cc2010-10-15 22:48:33 +0000435 llvm::Value *&value,
436 off_t &offset,
437 ConstString &name,
438 uint32_t index
439)
Sean Callanan549c9f72010-07-13 21:41:46 +0000440{
Sean Callanan979f74d2010-12-03 01:38:59 +0000441 assert (m_struct_vars.get());
442
443 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan549c9f72010-07-13 21:41:46 +0000444 return false;
445
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000446 if (index >= m_struct_members.GetSize())
Sean Callanan549c9f72010-07-13 21:41:46 +0000447 return false;
448
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000449 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(index));
Sean Callanan549c9f72010-07-13 21:41:46 +0000450
Sean Callanan3c495c12013-01-15 23:29:36 +0000451 if (!member_sp)
452 return false;
453
454 ClangExpressionVariable::ParserVars *parser_vars = member_sp->GetParserVars(GetParserID());
455 ClangExpressionVariable::JITVars *jit_vars = member_sp->GetJITVars(GetParserID());
456
457 if (!parser_vars ||
458 !jit_vars ||
Sean Callanan6f3e5ad2012-04-12 16:58:26 +0000459 !member_sp->GetValueObject())
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000460 return false;
461
Sean Callanan3c495c12013-01-15 23:29:36 +0000462 decl = parser_vars->m_named_decl;
463 value = parser_vars->m_llvm_value;
464 offset = jit_vars->m_offset;
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000465 name = member_sp->GetName();
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000466
Sean Callanan549c9f72010-07-13 21:41:46 +0000467 return true;
468}
469
Sean Callanan7ea35012010-07-27 21:39:39 +0000470bool
Greg Clayton7b462cc2010-10-15 22:48:33 +0000471ClangExpressionDeclMap::GetFunctionInfo
472(
Sean Callanancc427fa2011-07-30 02:42:06 +0000473 const NamedDecl *decl,
Greg Clayton7b462cc2010-10-15 22:48:33 +0000474 uint64_t &ptr
475)
Sean Callanan4edba2d2010-07-27 02:07:53 +0000476{
Sean Callanan3c495c12013-01-15 23:29:36 +0000477 ClangExpressionVariableSP entity_sp(m_found_entities.GetVariable(decl, GetParserID()));
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000478
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000479 if (!entity_sp)
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000480 return false;
Sean Callanan4edba2d2010-07-27 02:07:53 +0000481
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000482 // We know m_parser_vars is valid since we searched for the variable by
483 // its NamedDecl
Sean Callanan4edba2d2010-07-27 02:07:53 +0000484
Sean Callanan3c495c12013-01-15 23:29:36 +0000485 ClangExpressionVariable::ParserVars *parser_vars = entity_sp->GetParserVars(GetParserID());
486
Greg Clayton57ee3062013-07-11 22:46:58 +0000487 ptr = parser_vars->m_lldb_value.GetScalar().ULongLong();
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000488
489 return true;
Sean Callanan4edba2d2010-07-27 02:07:53 +0000490}
491
Sean Callananefe9a422011-08-16 18:09:29 +0000492static void
493FindCodeSymbolInContext
494(
495 const ConstString &name,
496 SymbolContext &sym_ctx,
497 SymbolContextList &sc_list
498)
499{
Matt Kopec00049b82013-02-27 20:13:38 +0000500 SymbolContextList temp_sc_list;
Sean Callananefe9a422011-08-16 18:09:29 +0000501 if (sym_ctx.module_sp)
Matt Kopec00049b82013-02-27 20:13:38 +0000502 sym_ctx.module_sp->FindSymbolsWithNameAndType(name, eSymbolTypeAny, temp_sc_list);
Sean Callananefe9a422011-08-16 18:09:29 +0000503
Matt Kopec00049b82013-02-27 20:13:38 +0000504 if (!sc_list.GetSize() && sym_ctx.target_sp)
505 sym_ctx.target_sp->GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeAny, temp_sc_list);
506
507 unsigned temp_sc_list_size = temp_sc_list.GetSize();
508 for (unsigned i = 0; i < temp_sc_list_size; i++)
509 {
510 SymbolContext sym_ctx;
511 temp_sc_list.GetContextAtIndex(i, sym_ctx);
512 if (sym_ctx.symbol)
513 {
514 switch (sym_ctx.symbol->GetType())
515 {
516 case eSymbolTypeCode:
517 case eSymbolTypeResolver:
Greg Claytonf32db512013-10-30 21:37:46 +0000518 case eSymbolTypeReExported:
Matt Kopec00049b82013-02-27 20:13:38 +0000519 sc_list.Append(sym_ctx);
520 break;
521
522 default:
523 break;
524 }
525 }
526 }
Sean Callananefe9a422011-08-16 18:09:29 +0000527}
528
Sean Callanan5300d372010-07-31 01:32:05 +0000529bool
Greg Clayton7b462cc2010-10-15 22:48:33 +0000530ClangExpressionDeclMap::GetFunctionAddress
531(
532 const ConstString &name,
Greg Clayton3f5c08f2011-05-18 22:01:49 +0000533 uint64_t &func_addr
Greg Clayton7b462cc2010-10-15 22:48:33 +0000534)
Sean Callanan5300d372010-07-31 01:32:05 +0000535{
Sean Callanan979f74d2010-12-03 01:38:59 +0000536 assert (m_parser_vars.get());
537
Greg Clayton5160ce52013-03-27 23:08:40 +0000538 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan933693b2012-02-10 01:22:05 +0000539 ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
540 Target *target = exe_ctx.GetTargetPtr();
Sean Callanan5300d372010-07-31 01:32:05 +0000541 // Back out in all cases where we're not fully initialized
Greg Claytonc14ee322011-09-22 04:58:26 +0000542 if (target == NULL)
Jim Ingham895c9822010-12-07 01:56:02 +0000543 return false;
544 if (!m_parser_vars->m_sym_ctx.target_sp)
Sean Callanan5300d372010-07-31 01:32:05 +0000545 return false;
546
Greg Clayton7a345282010-11-09 23:46:37 +0000547 SymbolContextList sc_list;
Sean Callanan5300d372010-07-31 01:32:05 +0000548
Sean Callananefe9a422011-08-16 18:09:29 +0000549 FindCodeSymbolInContext(name, m_parser_vars->m_sym_ctx, sc_list);
Matt Kopec00049b82013-02-27 20:13:38 +0000550
Greg Claytonf32db512013-10-30 21:37:46 +0000551 uint32_t sc_list_size = sc_list.GetSize();
552 if (sc_list_size == 0)
Sean Callanan19b6afe2011-05-13 18:27:02 +0000553 {
554 // We occasionally get debug information in which a const function is reported
555 // as non-const, so the mangled name is wrong. This is a hack to compensate.
556
Sean Callananf4638562011-10-25 18:02:05 +0000557 if (!strncmp(name.GetCString(), "_ZN", 3) &&
558 strncmp(name.GetCString(), "_ZNK", 4))
Sean Callanan19b6afe2011-05-13 18:27:02 +0000559 {
Sean Callananf4638562011-10-25 18:02:05 +0000560 std::string fixed_scratch("_ZNK");
561 fixed_scratch.append(name.GetCString() + 3);
562 ConstString fixed_name(fixed_scratch.c_str());
Sean Callanan19b6afe2011-05-13 18:27:02 +0000563
564 if (log)
Sean Callananf4638562011-10-25 18:02:05 +0000565 log->Printf("Failed to find symbols given non-const name %s; trying %s", name.GetCString(), fixed_name.GetCString());
566
567 FindCodeSymbolInContext(fixed_name, m_parser_vars->m_sym_ctx, sc_list);
Greg Claytonf32db512013-10-30 21:37:46 +0000568 sc_list_size = sc_list.GetSize();
Sean Callanan19b6afe2011-05-13 18:27:02 +0000569 }
570 }
Matt Kopec00049b82013-02-27 20:13:38 +0000571
Greg Claytonf32db512013-10-30 21:37:46 +0000572 for (uint32_t i=0; i<sc_list_size; ++i)
573 {
574 SymbolContext sym_ctx;
575 sc_list.GetContextAtIndex(i, sym_ctx);
Matt Kopec00049b82013-02-27 20:13:38 +0000576
Greg Claytonf32db512013-10-30 21:37:46 +0000577 const Address *func_so_addr = NULL;
578 bool is_indirect_function = false;
579 if (sym_ctx.function)
580 func_so_addr = &sym_ctx.function->GetAddressRange().GetBaseAddress();
581 else if (sym_ctx.symbol)
582 {
583 if (sym_ctx.symbol->GetType() == eSymbolTypeReExported)
584 {
585 Symbol *reexported_symbol = sym_ctx.symbol->ResolveReExportedSymbol(*target);
586 if (reexported_symbol)
587 {
588 func_so_addr = &reexported_symbol->GetAddress();
589 is_indirect_function = reexported_symbol->IsIndirect();
590 }
591 }
592 else
593 {
594 func_so_addr = &sym_ctx.symbol->GetAddress();
595 is_indirect_function = sym_ctx.symbol->IsIndirect();
596 }
597 }
Matt Kopec00049b82013-02-27 20:13:38 +0000598
Greg Claytonf32db512013-10-30 21:37:46 +0000599 if (func_so_addr && func_so_addr->IsValid())
600 {
601 lldb::addr_t load_addr = func_so_addr->GetCallableLoadAddress (target, is_indirect_function);
602
603 if (load_addr != LLDB_INVALID_ADDRESS)
604 {
605 func_addr = load_addr;
606 return true;
607 }
608 }
609 }
610 return false;
Sean Callanan5300d372010-07-31 01:32:05 +0000611}
612
Greg Clayton084db102011-06-23 04:25:29 +0000613addr_t
Greg Clayton9191db42013-10-21 18:40:51 +0000614ClangExpressionDeclMap::GetSymbolAddress (Target &target,
615 Process *process,
616 const ConstString &name,
617 lldb::SymbolType symbol_type,
Deepak Panickald66b50c2013-10-22 12:27:43 +0000618 lldb_private::Module *module)
Sean Callananc3a16002011-01-17 23:42:46 +0000619{
Sean Callananc3a16002011-01-17 23:42:46 +0000620 SymbolContextList sc_list;
621
Greg Clayton9191db42013-10-21 18:40:51 +0000622 if (module)
623 module->FindSymbolsWithNameAndType(name, symbol_type, sc_list);
624 else
625 target.GetImages().FindSymbolsWithNameAndType(name, symbol_type, sc_list);
Sean Callananc3a16002011-01-17 23:42:46 +0000626
Greg Clayton084db102011-06-23 04:25:29 +0000627 const uint32_t num_matches = sc_list.GetSize();
628 addr_t symbol_load_addr = LLDB_INVALID_ADDRESS;
629
Sean Callanan947ccc72011-12-01 02:04:16 +0000630 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 +0000631 {
632 SymbolContext sym_ctx;
633 sc_list.GetContextAtIndex(i, sym_ctx);
Sean Callananc3a16002011-01-17 23:42:46 +0000634
Greg Claytone7612132012-03-07 21:03:09 +0000635 const Address *sym_address = &sym_ctx.symbol->GetAddress();
Sean Callananc6466fc2011-07-07 23:05:43 +0000636
637 if (!sym_address || !sym_address->IsValid())
Sean Callanan116ace22013-04-30 00:21:42 +0000638 continue;
Sean Callananc6466fc2011-07-07 23:05:43 +0000639
Greg Clayton084db102011-06-23 04:25:29 +0000640 if (sym_address)
641 {
642 switch (sym_ctx.symbol->GetType())
643 {
644 case eSymbolTypeCode:
645 case eSymbolTypeTrampoline:
646 symbol_load_addr = sym_address->GetCallableLoadAddress (&target);
647 break;
Matt Kopec00049b82013-02-27 20:13:38 +0000648
649 case eSymbolTypeResolver:
650 symbol_load_addr = sym_address->GetCallableLoadAddress (&target, true);
651 break;
652
Greg Clayton9191db42013-10-21 18:40:51 +0000653 case eSymbolTypeReExported:
654 {
655 ConstString reexport_name = sym_ctx.symbol->GetReExportedSymbolName();
656 if (reexport_name)
657 {
658 ModuleSP reexport_module_sp;
659 ModuleSpec reexport_module_spec;
660 reexport_module_spec.GetPlatformFileSpec() = sym_ctx.symbol->GetReExportedSymbolSharedLibrary();
661 if (reexport_module_spec.GetPlatformFileSpec())
662 {
663 reexport_module_sp = target.GetImages().FindFirstModule(reexport_module_spec);
664 if (!reexport_module_sp)
665 {
666 reexport_module_spec.GetPlatformFileSpec().GetDirectory().Clear();
667 reexport_module_sp = target.GetImages().FindFirstModule(reexport_module_spec);
668 }
669 }
670 symbol_load_addr = GetSymbolAddress(target, process, sym_ctx.symbol->GetReExportedSymbolName(), symbol_type, reexport_module_sp.get());
671 }
672 }
673 break;
674
Greg Clayton084db102011-06-23 04:25:29 +0000675 case eSymbolTypeData:
676 case eSymbolTypeRuntime:
677 case eSymbolTypeVariable:
678 case eSymbolTypeLocal:
679 case eSymbolTypeParam:
680 case eSymbolTypeInvalid:
681 case eSymbolTypeAbsolute:
Greg Clayton084db102011-06-23 04:25:29 +0000682 case eSymbolTypeException:
683 case eSymbolTypeSourceFile:
684 case eSymbolTypeHeaderFile:
685 case eSymbolTypeObjectFile:
686 case eSymbolTypeCommonBlock:
687 case eSymbolTypeBlock:
688 case eSymbolTypeVariableType:
689 case eSymbolTypeLineEntry:
690 case eSymbolTypeLineHeader:
691 case eSymbolTypeScopeBegin:
692 case eSymbolTypeScopeEnd:
693 case eSymbolTypeAdditional:
694 case eSymbolTypeCompiler:
695 case eSymbolTypeInstrumentation:
696 case eSymbolTypeUndefined:
Greg Clayton456809c2011-12-03 02:30:59 +0000697 case eSymbolTypeObjCClass:
698 case eSymbolTypeObjCMetaClass:
699 case eSymbolTypeObjCIVar:
Greg Clayton084db102011-06-23 04:25:29 +0000700 symbol_load_addr = sym_address->GetLoadAddress (&target);
701 break;
702 }
703 }
704 }
Sean Callananc3a16002011-01-17 23:42:46 +0000705
Sean Callanane0b23b52012-11-15 02:02:04 +0000706 if (symbol_load_addr == LLDB_INVALID_ADDRESS && process)
707 {
708 ObjCLanguageRuntime *runtime = process->GetObjCLanguageRuntime();
709
710 if (runtime)
711 {
712 symbol_load_addr = runtime->LookupRuntimeSymbol(name);
713 }
714 }
715
Greg Clayton084db102011-06-23 04:25:29 +0000716 return symbol_load_addr;
Sean Callananc3a16002011-01-17 23:42:46 +0000717}
718
Greg Clayton084db102011-06-23 04:25:29 +0000719addr_t
Sean Callanan947ccc72011-12-01 02:04:16 +0000720ClangExpressionDeclMap::GetSymbolAddress (const ConstString &name, lldb::SymbolType symbol_type)
Sean Callanand9ca42a2011-05-08 02:21:26 +0000721{
722 assert (m_parser_vars.get());
723
Sean Callanan933693b2012-02-10 01:22:05 +0000724 if (!m_parser_vars->m_exe_ctx.GetTargetPtr())
Sean Callanand9ca42a2011-05-08 02:21:26 +0000725 return false;
726
Sean Callanane0b23b52012-11-15 02:02:04 +0000727 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 +0000728}
729
Greg Clayton3d51b9f2012-11-27 01:52:16 +0000730const Symbol *
731ClangExpressionDeclMap::FindGlobalDataSymbol (Target &target,
Greg Clayton9191db42013-10-21 18:40:51 +0000732 const ConstString &name,
Deepak Panickald66b50c2013-10-22 12:27:43 +0000733 lldb_private::Module *module)
Sean Callanand9ca42a2011-05-08 02:21:26 +0000734{
735 SymbolContextList sc_list;
736
Greg Clayton9191db42013-10-21 18:40:51 +0000737 if (module)
738 module->FindSymbolsWithNameAndType(name, eSymbolTypeAny, sc_list);
739 else
740 target.GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeAny, sc_list);
Sean Callanand9ca42a2011-05-08 02:21:26 +0000741
Greg Clayton3d51b9f2012-11-27 01:52:16 +0000742 const uint32_t matches = sc_list.GetSize();
743 for (uint32_t i=0; i<matches; ++i)
Sean Callanand9ca42a2011-05-08 02:21:26 +0000744 {
745 SymbolContext sym_ctx;
Greg Clayton3d51b9f2012-11-27 01:52:16 +0000746 sc_list.GetContextAtIndex(i, sym_ctx);
747 if (sym_ctx.symbol)
748 {
749 const Symbol *symbol = sym_ctx.symbol;
750 const Address *sym_address = &symbol->GetAddress();
751
752 if (sym_address && sym_address->IsValid())
753 {
754 switch (symbol->GetType())
755 {
756 case eSymbolTypeData:
757 case eSymbolTypeRuntime:
758 case eSymbolTypeAbsolute:
759 case eSymbolTypeObjCClass:
760 case eSymbolTypeObjCMetaClass:
761 case eSymbolTypeObjCIVar:
762 if (symbol->GetDemangledNameIsSynthesized())
763 {
764 // If the demangled name was synthesized, then don't use it
765 // for expressions. Only let the symbol match if the mangled
766 // named matches for these symbols.
767 if (symbol->GetMangled().GetMangledName() != name)
768 break;
769 }
770 return symbol;
771
Greg Clayton9191db42013-10-21 18:40:51 +0000772 case eSymbolTypeReExported:
773 {
774 ConstString reexport_name = symbol->GetReExportedSymbolName();
775 if (reexport_name)
776 {
777 ModuleSP reexport_module_sp;
778 ModuleSpec reexport_module_spec;
779 reexport_module_spec.GetPlatformFileSpec() = symbol->GetReExportedSymbolSharedLibrary();
780 if (reexport_module_spec.GetPlatformFileSpec())
781 {
782 reexport_module_sp = target.GetImages().FindFirstModule(reexport_module_spec);
783 if (!reexport_module_sp)
784 {
785 reexport_module_spec.GetPlatformFileSpec().GetDirectory().Clear();
786 reexport_module_sp = target.GetImages().FindFirstModule(reexport_module_spec);
787 }
788 }
789 return FindGlobalDataSymbol(target, symbol->GetReExportedSymbolName(), reexport_module_sp.get());
790 }
791 }
792 break;
793
Greg Clayton3d51b9f2012-11-27 01:52:16 +0000794 case eSymbolTypeCode: // We already lookup functions elsewhere
795 case eSymbolTypeVariable:
796 case eSymbolTypeLocal:
797 case eSymbolTypeParam:
798 case eSymbolTypeTrampoline:
799 case eSymbolTypeInvalid:
800 case eSymbolTypeException:
801 case eSymbolTypeSourceFile:
802 case eSymbolTypeHeaderFile:
803 case eSymbolTypeObjectFile:
804 case eSymbolTypeCommonBlock:
805 case eSymbolTypeBlock:
806 case eSymbolTypeVariableType:
807 case eSymbolTypeLineEntry:
808 case eSymbolTypeLineHeader:
809 case eSymbolTypeScopeBegin:
810 case eSymbolTypeScopeEnd:
811 case eSymbolTypeAdditional:
812 case eSymbolTypeCompiler:
813 case eSymbolTypeInstrumentation:
814 case eSymbolTypeUndefined:
Matt Kopec00049b82013-02-27 20:13:38 +0000815 case eSymbolTypeResolver:
Greg Clayton3d51b9f2012-11-27 01:52:16 +0000816 break;
817 }
818 }
819 }
Sean Callanand9ca42a2011-05-08 02:21:26 +0000820 }
821
822 return NULL;
823}
824
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000825lldb::VariableSP
826ClangExpressionDeclMap::FindGlobalVariable
827(
828 Target &target,
Sean Callanan1fd3f4f2011-10-12 16:59:31 +0000829 ModuleSP &module,
830 const ConstString &name,
831 ClangNamespaceDecl *namespace_decl,
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000832 TypeFromUser *type
833)
834{
835 VariableList vars;
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000836
Sean Callanan1fd3f4f2011-10-12 16:59:31 +0000837 if (module && namespace_decl)
838 module->FindGlobalVariables (name, namespace_decl, true, -1, vars);
839 else
840 target.GetImages().FindGlobalVariables(name, true, -1, vars);
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000841
842 if (vars.GetSize())
843 {
844 if (type)
845 {
846 for (size_t i = 0; i < vars.GetSize(); ++i)
847 {
848 VariableSP var_sp = vars.GetVariableAtIndex(i);
849
Greg Clayton57ee3062013-07-11 22:46:58 +0000850 if (ClangASTContext::AreTypesSame(*type, var_sp->GetType()->GetClangFullType()))
851 return var_sp;
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000852 }
853 }
854 else
855 {
856 return vars.GetVariableAtIndex(0);
857 }
858 }
859
860 return VariableSP();
861}
862
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000863// Interface for ClangASTSource
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000864
Sean Callanan503aa522011-10-12 00:12:34 +0000865void
Sean Callananeddeb3b2011-10-28 23:38:38 +0000866ClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000867{
Sean Callananeddeb3b2011-10-28 23:38:38 +0000868 assert (m_ast_context);
869
Sean Callanan8106d802013-03-08 20:04:57 +0000870 ClangASTMetrics::RegisterVisibleQuery();
871
Sean Callananeddeb3b2011-10-28 23:38:38 +0000872 const ConstString name(context.m_decl_name.getAsString().c_str());
873
Greg Clayton5160ce52013-03-27 23:08:40 +0000874 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000875
Sean Callananfb3e4302011-10-29 19:50:43 +0000876 if (GetImportInProgress())
Sean Callanan6abfabf2010-11-19 20:20:02 +0000877 {
Sean Callanan7dd98122011-10-14 20:34:21 +0000878 if (log && log->GetVerbose())
Sean Callanan6abfabf2010-11-19 20:20:02 +0000879 log->Printf("Ignoring a query during an import");
880 return;
881 }
Greg Claytona2721472011-06-25 00:44:06 +0000882
Sean Callanan7dd98122011-10-14 20:34:21 +0000883 static unsigned int invocation_id = 0;
884 unsigned int current_id = invocation_id++;
885
Sean Callanan503aa522011-10-12 00:12:34 +0000886 if (log)
887 {
888 if (!context.m_decl_context)
Sean Callananfb3e4302011-10-29 19:50:43 +0000889 log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in a NULL DeclContext", current_id, name.GetCString());
Sean Callanan503aa522011-10-12 00:12:34 +0000890 else if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context.m_decl_context))
Sean Callananfb3e4302011-10-29 19:50:43 +0000891 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 +0000892 else
Sean Callananfb3e4302011-10-29 19:50:43 +0000893 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 +0000894 }
Sean Callananfb3e4302011-10-29 19:50:43 +0000895
Sean Callanan503aa522011-10-12 00:12:34 +0000896 if (const NamespaceDecl *namespace_context = dyn_cast<NamespaceDecl>(context.m_decl_context))
897 {
Sean Callanan1ee44b72011-10-29 01:58:46 +0000898 ClangASTImporter::NamespaceMapSP namespace_map = m_ast_importer->GetNamespaceMap(namespace_context);
Sean Callananc41e68b2011-10-13 21:08:11 +0000899
Sean Callanan7dd98122011-10-14 20:34:21 +0000900 if (log && log->GetVerbose())
Sean Callanan00f43622011-11-18 03:28:09 +0000901 log->Printf(" CEDM::FEVD[%u] Inspecting (NamespaceMap*)%p (%d entries)",
Sean Callanan7dd98122011-10-14 20:34:21 +0000902 current_id,
903 namespace_map.get(),
904 (int)namespace_map->size());
Sean Callananc41e68b2011-10-13 21:08:11 +0000905
Sean Callananb2269162011-10-21 22:18:07 +0000906 if (!namespace_map)
907 return;
908
Sean Callanan503aa522011-10-12 00:12:34 +0000909 for (ClangASTImporter::NamespaceMap::iterator i = namespace_map->begin(), e = namespace_map->end();
910 i != e;
911 ++i)
912 {
913 if (log)
Sean Callananfb3e4302011-10-29 19:50:43 +0000914 log->Printf(" CEDM::FEVD[%u] Searching namespace %s in module %s",
Sean Callanan7dd98122011-10-14 20:34:21 +0000915 current_id,
Sean Callanan503aa522011-10-12 00:12:34 +0000916 i->second.GetNamespaceDecl()->getNameAsString().c_str(),
917 i->first->GetFileSpec().GetFilename().GetCString());
918
Sean Callananebe60672011-10-13 21:50:33 +0000919 FindExternalVisibleDecls(context,
920 i->first,
921 i->second,
Sean Callanan7dd98122011-10-14 20:34:21 +0000922 current_id);
Sean Callanan503aa522011-10-12 00:12:34 +0000923 }
924 }
Sean Callanand5c17ed2011-11-15 02:11:17 +0000925 else if (isa<TranslationUnitDecl>(context.m_decl_context))
Sean Callanan503aa522011-10-12 00:12:34 +0000926 {
927 ClangNamespaceDecl namespace_decl;
928
929 if (log)
Sean Callananfb3e4302011-10-29 19:50:43 +0000930 log->Printf(" CEDM::FEVD[%u] Searching the root namespace", current_id);
Sean Callanan503aa522011-10-12 00:12:34 +0000931
932 FindExternalVisibleDecls(context,
933 lldb::ModuleSP(),
934 namespace_decl,
Sean Callanan7dd98122011-10-14 20:34:21 +0000935 current_id);
Sean Callanan503aa522011-10-12 00:12:34 +0000936 }
Sean Callananc41e68b2011-10-13 21:08:11 +0000937
Sean Callananfb3e4302011-10-29 19:50:43 +0000938 if (!context.m_found.variable)
939 ClangASTSource::FindExternalVisibleDecls(context);
Sean Callanan503aa522011-10-12 00:12:34 +0000940}
941
942void
943ClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context,
Sean Callanan1a2c5382011-10-12 18:44:30 +0000944 lldb::ModuleSP module_sp,
Sean Callanan88972242011-10-12 01:39:28 +0000945 ClangNamespaceDecl &namespace_decl,
Sean Callanan7dd98122011-10-14 20:34:21 +0000946 unsigned int current_id)
Sean Callanan503aa522011-10-12 00:12:34 +0000947{
Sean Callananeddeb3b2011-10-28 23:38:38 +0000948 assert (m_ast_context);
Sean Callanan503aa522011-10-12 00:12:34 +0000949
Greg Clayton5160ce52013-03-27 23:08:40 +0000950 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callananfb3e4302011-10-29 19:50:43 +0000951
Greg Clayton7a345282010-11-09 23:46:37 +0000952 SymbolContextList sc_list;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000953
Sean Callananfb3e4302011-10-29 19:50:43 +0000954 const ConstString name(context.m_decl_name.getAsString().c_str());
955
Greg Clayton83c5cd92010-11-14 22:13:40 +0000956 const char *name_unique_cstr = name.GetCString();
957
958 if (name_unique_cstr == NULL)
959 return;
Sean Callananfb3e4302011-10-29 19:50:43 +0000960
Sean Callanan5b26f272012-02-04 08:49:35 +0000961 static ConstString id_name("id");
962 static ConstString Class_name("Class");
963
964 if (name == id_name || name == Class_name)
965 return;
966
Greg Clayton7b462cc2010-10-15 22:48:33 +0000967 // Only look for functions by name out in our symbols if the function
968 // doesn't start with our phony prefix of '$'
Sean Callanan933693b2012-02-10 01:22:05 +0000969 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
Jason Molendab57e4a12013-11-04 09:33:30 +0000970 StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
Sean Callanan88972242011-10-12 01:39:28 +0000971 if (name_unique_cstr[0] == '$' && !namespace_decl)
972 {
973 static ConstString g_lldb_class_name ("$__lldb_class");
974
975 if (name == g_lldb_class_name)
976 {
977 // Clang is looking for the type of "this"
Sean Callananc03bdd92012-02-08 03:45:08 +0000978
979 if (frame == NULL)
Sean Callanan88972242011-10-12 01:39:28 +0000980 return;
981
Sean Callananc03bdd92012-02-08 03:45:08 +0000982 SymbolContext sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction);
Sean Callanan88972242011-10-12 01:39:28 +0000983
Sean Callananc03bdd92012-02-08 03:45:08 +0000984 if (!sym_ctx.function)
Sean Callanan88972242011-10-12 01:39:28 +0000985 return;
986
Greg Clayton685c88c2012-07-14 00:53:55 +0000987 // Get the block that defines the function
988 Block *function_block = sym_ctx.GetFunctionBlock();
989
990 if (!function_block)
991 return;
992
993 clang::DeclContext *decl_context = function_block->GetClangDeclContext();
Sean Callananc03bdd92012-02-08 03:45:08 +0000994
995 if (!decl_context)
Sean Callanan88972242011-10-12 01:39:28 +0000996 return;
997
Sean Callananc03bdd92012-02-08 03:45:08 +0000998 clang::CXXMethodDecl *method_decl = llvm::dyn_cast<clang::CXXMethodDecl>(decl_context);
Sean Callanan88972242011-10-12 01:39:28 +0000999
Jim Ingham5fdeed42012-10-30 23:35:54 +00001000 if (method_decl)
Sean Callanan88972242011-10-12 01:39:28 +00001001 {
Jim Ingham5fdeed42012-10-30 23:35:54 +00001002 clang::CXXRecordDecl *class_decl = method_decl->getParent();
1003
1004 QualType class_qual_type(class_decl->getTypeForDecl(), 0);
1005
1006 TypeFromUser class_user_type (class_qual_type.getAsOpaquePtr(),
1007 &class_decl->getASTContext());
1008
1009 if (log)
1010 {
1011 ASTDumper ast_dumper(class_qual_type);
1012 log->Printf(" CEDM::FEVD[%u] Adding type for $__lldb_class: %s", current_id, ast_dumper.GetCString());
1013 }
1014
Sean Callananfa4fab72013-02-01 06:55:48 +00001015 TypeFromParser class_type = CopyClassType(class_user_type, current_id);
1016
1017 if (!class_type.IsValid())
1018 return;
1019
Sean Callanan34cf8202013-03-12 21:22:00 +00001020 TypeSourceInfo *type_source_info = m_ast_context->getTrivialTypeSourceInfo(QualType::getFromOpaquePtr(class_type.GetOpaqueQualType()));
Sean Callananfa4fab72013-02-01 06:55:48 +00001021
1022 if (!type_source_info)
1023 return;
1024
1025 TypedefDecl *typedef_decl = TypedefDecl::Create(*m_ast_context,
1026 m_ast_context->getTranslationUnitDecl(),
1027 SourceLocation(),
1028 SourceLocation(),
1029 context.m_decl_name.getAsIdentifierInfo(),
1030 type_source_info);
1031
1032
1033 if (!typedef_decl)
1034 return;
1035
1036 context.AddNamedDecl(typedef_decl);
Jim Ingham5fdeed42012-10-30 23:35:54 +00001037
1038 if (method_decl->isInstance())
1039 {
1040 // self is a pointer to the object
1041
1042 QualType class_pointer_type = method_decl->getASTContext().getPointerType(class_qual_type);
1043
1044 TypeFromUser self_user_type(class_pointer_type.getAsOpaquePtr(),
1045 &method_decl->getASTContext());
1046
1047 m_struct_vars->m_object_pointer_type = self_user_type;
1048 }
Sean Callanan88972242011-10-12 01:39:28 +00001049 }
Jim Ingham5fdeed42012-10-30 23:35:54 +00001050 else
Sean Callananbb6e7ed2012-03-05 22:08:20 +00001051 {
Jim Ingham5fdeed42012-10-30 23:35:54 +00001052 // This branch will get hit if we are executing code in the context of a function that
1053 // claims to have an object pointer (through DW_AT_object_pointer?) but is not formally a
1054 // method of the class. In that case, just look up the "this" variable in the the current
1055 // scope and use its type.
1056 // FIXME: This code is formally correct, but clang doesn't currently emit DW_AT_object_pointer
1057 // for C++ so it hasn't actually been tested.
Sean Callananbb6e7ed2012-03-05 22:08:20 +00001058
Jim Ingham5fdeed42012-10-30 23:35:54 +00001059 VariableList *vars = frame->GetVariableList(false);
Sean Callananbb6e7ed2012-03-05 22:08:20 +00001060
Jim Ingham5fdeed42012-10-30 23:35:54 +00001061 lldb::VariableSP this_var = vars->FindVariable(ConstString("this"));
Sean Callananbb6e7ed2012-03-05 22:08:20 +00001062
Jim Ingham5fdeed42012-10-30 23:35:54 +00001063 if (this_var &&
1064 this_var->IsInScope(frame) &&
1065 this_var->LocationIsValidForFrame (frame))
1066 {
1067 Type *this_type = this_var->GetType();
1068
1069 if (!this_type)
1070 return;
1071
Greg Clayton57ee3062013-07-11 22:46:58 +00001072 ClangASTType pointee_type = this_type->GetClangForwardType().GetPointeeType();
Jim Ingham5fdeed42012-10-30 23:35:54 +00001073
Greg Clayton57ee3062013-07-11 22:46:58 +00001074 if (pointee_type.IsValid())
Jim Ingham5fdeed42012-10-30 23:35:54 +00001075 {
Jim Ingham5fdeed42012-10-30 23:35:54 +00001076 if (log)
1077 {
1078 ASTDumper ast_dumper(this_type->GetClangFullType());
1079 log->Printf(" FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, ast_dumper.GetCString());
1080 }
1081
Greg Clayton57ee3062013-07-11 22:46:58 +00001082 TypeFromUser class_user_type(pointee_type);
Sean Callananfa4fab72013-02-01 06:55:48 +00001083 AddOneType(context, class_user_type, current_id);
Jim Ingham5fdeed42012-10-30 23:35:54 +00001084
1085
Greg Clayton57ee3062013-07-11 22:46:58 +00001086 TypeFromUser this_user_type(this_type->GetClangFullType());
Jim Ingham5fdeed42012-10-30 23:35:54 +00001087 m_struct_vars->m_object_pointer_type = this_user_type;
1088 return;
1089 }
1090 }
Sean Callananbb6e7ed2012-03-05 22:08:20 +00001091 }
1092
Sean Callanan88972242011-10-12 01:39:28 +00001093 return;
1094 }
1095
1096 static ConstString g_lldb_objc_class_name ("$__lldb_objc_class");
1097 if (name == g_lldb_objc_class_name)
1098 {
1099 // Clang is looking for the type of "*self"
1100
1101 if (!frame)
1102 return;
Sean Callanand5c17ed2011-11-15 02:11:17 +00001103
1104 SymbolContext sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction);
1105
1106 if (!sym_ctx.function)
1107 return;
1108
Greg Clayton685c88c2012-07-14 00:53:55 +00001109 // Get the block that defines the function
1110 Block *function_block = sym_ctx.GetFunctionBlock();
Sean Callanand5c17ed2011-11-15 02:11:17 +00001111
Greg Clayton685c88c2012-07-14 00:53:55 +00001112 if (!function_block)
1113 return;
1114
1115 clang::DeclContext *decl_context = function_block->GetClangDeclContext();
Sean Callanand5c17ed2011-11-15 02:11:17 +00001116
1117 if (!decl_context)
1118 return;
1119
1120 clang::ObjCMethodDecl *method_decl = llvm::dyn_cast<clang::ObjCMethodDecl>(decl_context);
1121
Jim Ingham5fdeed42012-10-30 23:35:54 +00001122 if (method_decl)
Sean Callanand5c17ed2011-11-15 02:11:17 +00001123 {
Jim Ingham5fdeed42012-10-30 23:35:54 +00001124 ObjCInterfaceDecl* self_interface = method_decl->getClassInterface();
Sean Callanand5c17ed2011-11-15 02:11:17 +00001125
Jim Ingham5fdeed42012-10-30 23:35:54 +00001126 if (!self_interface)
Sean Callananc03bdd92012-02-08 03:45:08 +00001127 return;
1128
Jim Ingham5fdeed42012-10-30 23:35:54 +00001129 const clang::Type *interface_type = self_interface->getTypeForDecl();
Sean Callanandfb87d62013-04-09 21:30:48 +00001130
1131 if (!interface_type)
1132 return; // This is unlikely, but we have seen crashes where this occurred
Jim Ingham5fdeed42012-10-30 23:35:54 +00001133
1134 TypeFromUser class_user_type(QualType(interface_type, 0).getAsOpaquePtr(),
1135 &method_decl->getASTContext());
Sean Callananc03bdd92012-02-08 03:45:08 +00001136
Jim Ingham5fdeed42012-10-30 23:35:54 +00001137 if (log)
1138 {
1139 ASTDumper ast_dumper(interface_type);
1140 log->Printf(" FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, ast_dumper.GetCString());
1141 }
1142
Sean Callananfa4fab72013-02-01 06:55:48 +00001143 AddOneType(context, class_user_type, current_id);
Jim Ingham5fdeed42012-10-30 23:35:54 +00001144
1145 if (method_decl->isInstanceMethod())
1146 {
1147 // self is a pointer to the object
1148
1149 QualType class_pointer_type = method_decl->getASTContext().getObjCObjectPointerType(QualType(interface_type, 0));
1150
1151 TypeFromUser self_user_type(class_pointer_type.getAsOpaquePtr(),
1152 &method_decl->getASTContext());
1153
1154 m_struct_vars->m_object_pointer_type = self_user_type;
1155 }
1156 else
1157 {
1158 // self is a Class pointer
1159 QualType class_type = method_decl->getASTContext().getObjCClassType();
1160
1161 TypeFromUser self_user_type(class_type.getAsOpaquePtr(),
1162 &method_decl->getASTContext());
1163
1164 m_struct_vars->m_object_pointer_type = self_user_type;
1165 }
1166
1167 return;
Sean Callananc03bdd92012-02-08 03:45:08 +00001168 }
1169 else
1170 {
Jim Ingham5fdeed42012-10-30 23:35:54 +00001171 // This branch will get hit if we are executing code in the context of a function that
1172 // claims to have an object pointer (through DW_AT_object_pointer?) but is not formally a
1173 // method of the class. In that case, just look up the "self" variable in the the current
1174 // scope and use its type.
Sean Callananc03bdd92012-02-08 03:45:08 +00001175
Jim Ingham5fdeed42012-10-30 23:35:54 +00001176 VariableList *vars = frame->GetVariableList(false);
Sean Callananc03bdd92012-02-08 03:45:08 +00001177
Jim Ingham5fdeed42012-10-30 23:35:54 +00001178 lldb::VariableSP self_var = vars->FindVariable(ConstString("self"));
1179
1180 if (self_var &&
1181 self_var->IsInScope(frame) &&
1182 self_var->LocationIsValidForFrame (frame))
1183 {
1184 Type *self_type = self_var->GetType();
1185
1186 if (!self_type)
1187 return;
1188
Greg Clayton57ee3062013-07-11 22:46:58 +00001189 ClangASTType self_clang_type = self_type->GetClangFullType();
Jim Ingham5fdeed42012-10-30 23:35:54 +00001190
Greg Clayton57ee3062013-07-11 22:46:58 +00001191 if (self_clang_type.IsObjCClassType())
Jim Ingham5fdeed42012-10-30 23:35:54 +00001192 {
Sean Callanana2868d42013-01-19 01:49:02 +00001193 return;
1194 }
Greg Clayton57ee3062013-07-11 22:46:58 +00001195 else if (self_clang_type.IsObjCObjectPointerType())
Sean Callanana2868d42013-01-19 01:49:02 +00001196 {
Greg Clayton57ee3062013-07-11 22:46:58 +00001197 self_clang_type = self_clang_type.GetPointeeType();
1198
1199 if (!self_clang_type)
Sean Callanane5270592013-04-26 22:54:19 +00001200 return;
1201
Jim Ingham5fdeed42012-10-30 23:35:54 +00001202 if (log)
1203 {
1204 ASTDumper ast_dumper(self_type->GetClangFullType());
1205 log->Printf(" FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, ast_dumper.GetCString());
1206 }
1207
Greg Clayton57ee3062013-07-11 22:46:58 +00001208 TypeFromUser class_user_type (self_clang_type);
Sean Callanana2868d42013-01-19 01:49:02 +00001209
Sean Callananfa4fab72013-02-01 06:55:48 +00001210 AddOneType(context, class_user_type, current_id);
Jim Ingham5fdeed42012-10-30 23:35:54 +00001211
Greg Clayton57ee3062013-07-11 22:46:58 +00001212 TypeFromUser self_user_type(self_type->GetClangFullType());
Jim Ingham5fdeed42012-10-30 23:35:54 +00001213
1214 m_struct_vars->m_object_pointer_type = self_user_type;
1215 return;
1216 }
1217 }
Sean Callananc03bdd92012-02-08 03:45:08 +00001218 }
1219
Sean Callanan88972242011-10-12 01:39:28 +00001220 return;
1221 }
1222
1223 // any other $__lldb names should be weeded out now
1224 if (!::strncmp(name_unique_cstr, "$__lldb", sizeof("$__lldb") - 1))
1225 return;
1226
1227 do
1228 {
1229 if (!target)
1230 break;
1231
1232 ClangASTContext *scratch_clang_ast_context = target->GetScratchClangASTContext();
1233
1234 if (!scratch_clang_ast_context)
1235 break;
1236
1237 ASTContext *scratch_ast_context = scratch_clang_ast_context->getASTContext();
1238
1239 if (!scratch_ast_context)
1240 break;
1241
1242 TypeDecl *ptype_type_decl = m_parser_vars->m_persistent_vars->GetPersistentType(name);
1243
1244 if (!ptype_type_decl)
1245 break;
1246
Sean Callanan0eed0d42011-12-06 03:41:14 +00001247 Decl *parser_ptype_decl = m_ast_importer->CopyDecl(m_ast_context, scratch_ast_context, ptype_type_decl);
Sean Callanan88972242011-10-12 01:39:28 +00001248
1249 if (!parser_ptype_decl)
1250 break;
1251
1252 TypeDecl *parser_ptype_type_decl = dyn_cast<TypeDecl>(parser_ptype_decl);
1253
1254 if (!parser_ptype_type_decl)
1255 break;
1256
1257 if (log)
Sean Callananfb3e4302011-10-29 19:50:43 +00001258 log->Printf(" CEDM::FEVD[%u] Found persistent type %s", current_id, name.GetCString());
Sean Callanan88972242011-10-12 01:39:28 +00001259
1260 context.AddNamedDecl(parser_ptype_type_decl);
1261 } while (0);
1262
1263 ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name));
1264
1265 if (pvar_sp)
1266 {
Sean Callanan7dd98122011-10-14 20:34:21 +00001267 AddOneVariable(context, pvar_sp, current_id);
Sean Callanan88972242011-10-12 01:39:28 +00001268 return;
1269 }
1270
1271 const char *reg_name(&name.GetCString()[1]);
1272
Sean Callanan933693b2012-02-10 01:22:05 +00001273 if (m_parser_vars->m_exe_ctx.GetRegisterContext())
Sean Callanan88972242011-10-12 01:39:28 +00001274 {
Sean Callanan933693b2012-02-10 01:22:05 +00001275 const RegisterInfo *reg_info(m_parser_vars->m_exe_ctx.GetRegisterContext()->GetRegisterInfoByName(reg_name));
Sean Callananfb3e4302011-10-29 19:50:43 +00001276
Sean Callanan88972242011-10-12 01:39:28 +00001277 if (reg_info)
Sean Callanan35c7f982011-10-18 16:46:55 +00001278 {
1279 if (log)
Sean Callananfb3e4302011-10-29 19:50:43 +00001280 log->Printf(" CEDM::FEVD[%u] Found register %s", current_id, reg_info->name);
Sean Callanan35c7f982011-10-18 16:46:55 +00001281
Sean Callanan7dd98122011-10-14 20:34:21 +00001282 AddOneRegister(context, reg_info, current_id);
Sean Callanan35c7f982011-10-18 16:46:55 +00001283 }
Sean Callanan88972242011-10-12 01:39:28 +00001284 }
1285 }
1286 else
Sean Callanan8ade1042010-07-27 00:55:47 +00001287 {
Sean Callanan69b53412011-08-06 00:28:14 +00001288 ValueObjectSP valobj;
1289 VariableSP var;
1290 Error err;
1291
Sean Callanan88972242011-10-12 01:39:28 +00001292 if (frame && !namespace_decl)
Greg Clayton7b462cc2010-10-15 22:48:33 +00001293 {
Greg Claytonc14ee322011-09-22 04:58:26 +00001294 valobj = frame->GetValueForVariableExpressionPath(name_unique_cstr,
Sean Callanan503aa522011-10-12 00:12:34 +00001295 eNoDynamicValues,
Jason Molendab57e4a12013-11-04 09:33:30 +00001296 StackFrame::eExpressionPathOptionCheckPtrVsMember ||
1297 StackFrame::eExpressionPathOptionsAllowDirectIVarAccess ||
1298 StackFrame::eExpressionPathOptionsNoFragileObjcIvar ||
1299 StackFrame::eExpressionPathOptionsNoSyntheticChildren ||
1300 StackFrame::eExpressionPathOptionsNoSyntheticArrayRange,
Sean Callanan503aa522011-10-12 00:12:34 +00001301 var,
1302 err);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001303
1304 // If we found a variable in scope, no need to pull up function names
Sean Callanan9a028512012-08-09 00:50:26 +00001305 if (err.Success() && var)
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001306 {
Sean Callanan0712f462011-11-29 22:03:21 +00001307 AddOneVariable(context, var, valobj, current_id);
Sean Callananca4e0fd2011-10-12 20:29:25 +00001308 context.m_found.variable = true;
Sean Callananefa7d1f2011-10-25 20:36:57 +00001309 return;
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001310 }
Greg Clayton7b462cc2010-10-15 22:48:33 +00001311 }
Sean Callananfd1ba912011-12-10 04:03:38 +00001312
1313 if (target)
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001314 {
Sean Callanan1fd3f4f2011-10-12 16:59:31 +00001315 var = FindGlobalVariable (*target,
Sean Callanan1a2c5382011-10-12 18:44:30 +00001316 module_sp,
Sean Callanan1fd3f4f2011-10-12 16:59:31 +00001317 name,
1318 &namespace_decl,
Greg Claytonc14ee322011-09-22 04:58:26 +00001319 NULL);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001320
1321 if (var)
1322 {
Sean Callanan9b3569b2011-12-10 03:12:34 +00001323 valobj = ValueObjectVariable::Create(target, var);
Sean Callanan0712f462011-11-29 22:03:21 +00001324 AddOneVariable(context, var, valobj, current_id);
Sean Callananca4e0fd2011-10-12 20:29:25 +00001325 context.m_found.variable = true;
Sean Callananfd1ba912011-12-10 04:03:38 +00001326 return;
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001327 }
1328 }
1329
Sean Callananca4e0fd2011-10-12 20:29:25 +00001330 if (!context.m_found.variable)
Greg Clayton7b462cc2010-10-15 22:48:33 +00001331 {
Sean Callanan9df05fb2012-02-10 22:52:19 +00001332 const bool include_inlines = false;
Greg Clayton931180e2011-01-27 06:44:37 +00001333 const bool append = false;
Sean Callanan25ea08e2011-10-12 17:38:09 +00001334
Sean Callanan1a2c5382011-10-12 18:44:30 +00001335 if (namespace_decl && module_sp)
Sean Callanan25ea08e2011-10-12 17:38:09 +00001336 {
Sean Callanan3ae61792012-02-15 17:14:49 +00001337 const bool include_symbols = false;
1338
Sean Callanan1a2c5382011-10-12 18:44:30 +00001339 module_sp->FindFunctions(name,
1340 &namespace_decl,
1341 eFunctionNameTypeBase,
1342 include_symbols,
Sean Callanan9df05fb2012-02-10 22:52:19 +00001343 include_inlines,
Sean Callanan1a2c5382011-10-12 18:44:30 +00001344 append,
1345 sc_list);
Sean Callanan25ea08e2011-10-12 17:38:09 +00001346 }
Jim Ingham28eb5712012-10-12 17:34:26 +00001347 else if (target && !namespace_decl)
Sean Callanan25ea08e2011-10-12 17:38:09 +00001348 {
Sean Callanan3ae61792012-02-15 17:14:49 +00001349 const bool include_symbols = true;
1350
Sean Callanan308a3c52012-07-28 00:21:01 +00001351 // TODO Fix FindFunctions so that it doesn't return
1352 // instance methods for eFunctionNameTypeBase.
1353
Sean Callanan25ea08e2011-10-12 17:38:09 +00001354 target->GetImages().FindFunctions(name,
Greg Clayton43fe2172013-04-03 02:00:15 +00001355 eFunctionNameTypeFull,
Sean Callanan25ea08e2011-10-12 17:38:09 +00001356 include_symbols,
Sean Callanan9df05fb2012-02-10 22:52:19 +00001357 include_inlines,
Sean Callanan25ea08e2011-10-12 17:38:09 +00001358 append,
1359 sc_list);
1360 }
1361
Sean Callanand9ca42a2011-05-08 02:21:26 +00001362 if (sc_list.GetSize())
Greg Clayton7b462cc2010-10-15 22:48:33 +00001363 {
Greg Claytondc25a0b2013-10-31 16:59:47 +00001364 Symbol *extern_symbol = NULL;
1365 Symbol *non_extern_symbol = NULL;
Sean Callanand9ca42a2011-05-08 02:21:26 +00001366
1367 for (uint32_t index = 0, num_indices = sc_list.GetSize();
1368 index < num_indices;
1369 ++index)
Greg Clayton7b462cc2010-10-15 22:48:33 +00001370 {
Sean Callanand9ca42a2011-05-08 02:21:26 +00001371 SymbolContext sym_ctx;
1372 sc_list.GetContextAtIndex(index, sym_ctx);
1373
1374 if (sym_ctx.function)
1375 {
Sean Callanan308a3c52012-07-28 00:21:01 +00001376 clang::DeclContext *decl_ctx = sym_ctx.function->GetClangDeclContext();
1377
Sean Callanan956dca92013-04-27 01:57:44 +00001378 if (!decl_ctx)
1379 continue;
1380
Sean Callanan308a3c52012-07-28 00:21:01 +00001381 // Filter out class/instance methods.
1382 if (dyn_cast<clang::ObjCMethodDecl>(decl_ctx))
1383 continue;
1384 if (dyn_cast<clang::CXXMethodDecl>(decl_ctx))
1385 continue;
1386
Sean Callanan485f7322013-04-24 00:34:41 +00001387 AddOneFunction(context, sym_ctx.function, NULL, current_id);
Sean Callananca4e0fd2011-10-12 20:29:25 +00001388 context.m_found.function_with_type_info = true;
1389 context.m_found.function = true;
Sean Callanand9ca42a2011-05-08 02:21:26 +00001390 }
1391 else if (sym_ctx.symbol)
1392 {
Greg Clayton9191db42013-10-21 18:40:51 +00001393 if (sym_ctx.symbol->GetType() == eSymbolTypeReExported)
Greg Claytondc25a0b2013-10-31 16:59:47 +00001394 {
1395 sym_ctx.symbol = sym_ctx.symbol->ResolveReExportedSymbol(*target);
1396 if (sym_ctx.symbol == NULL)
1397 continue;
1398 }
1399
1400 if (sym_ctx.symbol->IsExternal())
1401 extern_symbol = sym_ctx.symbol;
Sean Callanand9ca42a2011-05-08 02:21:26 +00001402 else
Greg Claytondc25a0b2013-10-31 16:59:47 +00001403 non_extern_symbol = sym_ctx.symbol;
Sean Callanand9ca42a2011-05-08 02:21:26 +00001404 }
Greg Clayton7b462cc2010-10-15 22:48:33 +00001405 }
Sean Callanand9ca42a2011-05-08 02:21:26 +00001406
Sean Callananca4e0fd2011-10-12 20:29:25 +00001407 if (!context.m_found.function_with_type_info)
Greg Clayton7b462cc2010-10-15 22:48:33 +00001408 {
Greg Claytondc25a0b2013-10-31 16:59:47 +00001409 if (extern_symbol)
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001410 {
Greg Claytondc25a0b2013-10-31 16:59:47 +00001411 AddOneFunction (context, NULL, extern_symbol, current_id);
1412 context.m_found.function = true;
1413 }
1414 else if (non_extern_symbol)
1415 {
1416 AddOneFunction (context, NULL, non_extern_symbol, current_id);
Sean Callananca4e0fd2011-10-12 20:29:25 +00001417 context.m_found.function = true;
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001418 }
Sean Callanand9ca42a2011-05-08 02:21:26 +00001419 }
Greg Clayton7b462cc2010-10-15 22:48:33 +00001420 }
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001421
Jim Ingham5c42d8a2013-05-15 18:27:08 +00001422 if (target && !context.m_found.variable && !namespace_decl)
Greg Clayton7b462cc2010-10-15 22:48:33 +00001423 {
Sean Callananca4e0fd2011-10-12 20:29:25 +00001424 // We couldn't find a non-symbol variable for this. Now we'll hunt for a generic
Sean Callanand9ca42a2011-05-08 02:21:26 +00001425 // data symbol, and -- if it is found -- treat it as a variable.
1426
Greg Clayton3d51b9f2012-11-27 01:52:16 +00001427 const Symbol *data_symbol = FindGlobalDataSymbol(*target, name);
Sean Callanand9ca42a2011-05-08 02:21:26 +00001428
1429 if (data_symbol)
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001430 {
Sean Callanan92cdbc82014-02-19 23:37:25 +00001431 std::string warning("got name from symbols: ");
1432 warning.append(name.AsCString());
1433 const unsigned diag_id = m_ast_context->getDiagnostics().getCustomDiagID(clang::DiagnosticsEngine::Level::Warning, "%0");
1434 m_ast_context->getDiagnostics().Report(diag_id) << warning.c_str();
Sean Callanan7dd98122011-10-14 20:34:21 +00001435 AddOneGenericVariable(context, *data_symbol, current_id);
Sean Callananca4e0fd2011-10-12 20:29:25 +00001436 context.m_found.variable = true;
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001437 }
Greg Clayton526e5af2010-11-13 03:52:47 +00001438 }
Sean Callanan3883b5a2010-09-07 21:49:41 +00001439 }
Sean Callananfb40b0d2011-10-27 02:06:03 +00001440 }
Sean Callanan6b4067c2010-07-17 00:43:37 +00001441}
Greg Claytona2721472011-06-25 00:44:06 +00001442
Saleem Abdulrasoola68f7b62014-03-20 06:08:36 +00001443//static clang_type_t
1444//MaybePromoteToBlockPointerType
1445//(
1446// ASTContext *ast_context,
1447// clang_type_t candidate_type
1448//)
1449//{
1450// if (!candidate_type)
1451// return candidate_type;
1452//
1453// QualType candidate_qual_type = QualType::getFromOpaquePtr(candidate_type);
1454//
1455// const PointerType *candidate_pointer_type = dyn_cast<PointerType>(candidate_qual_type);
1456//
1457// if (!candidate_pointer_type)
1458// return candidate_type;
1459//
1460// QualType pointee_qual_type = candidate_pointer_type->getPointeeType();
1461//
1462// const RecordType *pointee_record_type = dyn_cast<RecordType>(pointee_qual_type);
1463//
1464// if (!pointee_record_type)
1465// return candidate_type;
1466//
1467// RecordDecl *pointee_record_decl = pointee_record_type->getDecl();
1468//
1469// if (!pointee_record_decl->isRecord())
1470// return candidate_type;
1471//
1472// if (!pointee_record_decl->getName().startswith(llvm::StringRef("__block_literal_")))
1473// return candidate_type;
1474//
1475// QualType generic_function_type = ast_context->getFunctionNoProtoType(ast_context->UnknownAnyTy);
1476// QualType block_pointer_type = ast_context->getBlockPointerType(generic_function_type);
1477//
1478// return block_pointer_type.getAsOpaquePtr();
1479//}
Sean Callanan75383bf2012-03-06 21:56:33 +00001480
Greg Clayton57ee3062013-07-11 22:46:58 +00001481bool
1482ClangExpressionDeclMap::GetVariableValue (VariableSP &var,
1483 lldb_private::Value &var_location,
1484 TypeFromUser *user_type,
1485 TypeFromParser *parser_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001486{
Greg Clayton5160ce52013-03-27 23:08:40 +00001487 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callananf06ba8d2010-06-23 00:47:48 +00001488
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001489 Type *var_type = var->GetType();
1490
1491 if (!var_type)
1492 {
Sean Callananea22d422010-07-16 00:09:46 +00001493 if (log)
1494 log->PutCString("Skipped a definition because it has no type");
Greg Clayton57ee3062013-07-11 22:46:58 +00001495 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001496 }
1497
Greg Clayton57ee3062013-07-11 22:46:58 +00001498 ClangASTType var_clang_type = var_type->GetClangFullType();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001499
Greg Clayton57ee3062013-07-11 22:46:58 +00001500 if (!var_clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001501 {
Sean Callananea22d422010-07-16 00:09:46 +00001502 if (log)
1503 log->PutCString("Skipped a definition because it has no Clang type");
Greg Clayton57ee3062013-07-11 22:46:58 +00001504 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001505 }
1506
Sean Callanancc427fa2011-07-30 02:42:06 +00001507 ASTContext *ast = var_type->GetClangASTContext().getASTContext();
Greg Clayton57ee3062013-07-11 22:46:58 +00001508
Greg Clayton6beaaa62011-01-17 03:46:26 +00001509 if (!ast)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001510 {
Sean Callananea22d422010-07-16 00:09:46 +00001511 if (log)
1512 log->PutCString("There is no AST context for the current execution context");
Greg Clayton57ee3062013-07-11 22:46:58 +00001513 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001514 }
Greg Clayton57ee3062013-07-11 22:46:58 +00001515 //var_clang_type = MaybePromoteToBlockPointerType (ast, var_clang_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001516
Sean Callanan6b4067c2010-07-17 00:43:37 +00001517 DWARFExpression &var_location_expr = var->LocationExpression();
1518
Greg Clayton016a95e2010-09-14 02:20:48 +00001519 lldb::addr_t loclist_base_load_addr = LLDB_INVALID_ADDRESS;
1520
Sean Callanan933693b2012-02-10 01:22:05 +00001521 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
Greg Claytonc14ee322011-09-22 04:58:26 +00001522
Greg Clayton016a95e2010-09-14 02:20:48 +00001523 if (var_location_expr.IsLocationList())
1524 {
1525 SymbolContext var_sc;
1526 var->CalculateSymbolContext (&var_sc);
Greg Claytonc14ee322011-09-22 04:58:26 +00001527 loclist_base_load_addr = var_sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress (target);
Greg Clayton016a95e2010-09-14 02:20:48 +00001528 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001529 Error err;
1530
Sean Callanan7b5805d2013-01-18 21:20:51 +00001531 if (var->GetLocationIsConstantValueData())
1532 {
1533 DataExtractor const_value_extractor;
1534
1535 if (var_location_expr.GetExpressionData(const_value_extractor))
1536 {
Greg Clayton57ee3062013-07-11 22:46:58 +00001537 var_location = Value(const_value_extractor.GetDataStart(), const_value_extractor.GetByteSize());
1538 var_location.SetValueType(Value::eValueTypeHostAddress);
Sean Callanan7b5805d2013-01-18 21:20:51 +00001539 }
1540 else
1541 {
1542 if (log)
1543 log->Printf("Error evaluating constant variable: %s", err.AsCString());
Greg Clayton57ee3062013-07-11 22:46:58 +00001544 return false;
Sean Callanan7b5805d2013-01-18 21:20:51 +00001545 }
1546 }
Greg Clayton9e9f2192013-05-17 00:55:28 +00001547
Greg Clayton57ee3062013-07-11 22:46:58 +00001548 ClangASTType type_to_use = GuardedCopyType(var_clang_type);
Sean Callanan6b4067c2010-07-17 00:43:37 +00001549
Greg Clayton57ee3062013-07-11 22:46:58 +00001550 if (!type_to_use)
Sean Callanan1d180662010-07-20 23:31:16 +00001551 {
Greg Clayton57ee3062013-07-11 22:46:58 +00001552 if (log)
1553 log->Printf("Couldn't copy a variable's type into the parser's AST context");
Sean Callanan1d180662010-07-20 23:31:16 +00001554
Greg Clayton57ee3062013-07-11 22:46:58 +00001555 return false;
Sean Callanan1d180662010-07-20 23:31:16 +00001556 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001557
Greg Clayton57ee3062013-07-11 22:46:58 +00001558 if (parser_type)
1559 *parser_type = TypeFromParser(type_to_use);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001560
Greg Clayton57ee3062013-07-11 22:46:58 +00001561 if (var_location.GetContextType() == Value::eContextTypeInvalid)
1562 var_location.SetClangType(type_to_use);
1563
1564 if (var_location.GetValueType() == Value::eValueTypeFileAddress)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001565 {
1566 SymbolContext var_sc;
1567 var->CalculateSymbolContext(&var_sc);
Sean Callanan6b4067c2010-07-17 00:43:37 +00001568
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001569 if (!var_sc.module_sp)
Michael Sartain89c862f2013-08-07 19:05:15 +00001570 return false;
Greg Clayton3046e662013-07-10 01:23:25 +00001571
Greg Clayton57ee3062013-07-11 22:46:58 +00001572 Address so_addr(var_location.GetScalar().ULongLong(), var_sc.module_sp->GetSectionList());
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001573
Greg Claytonc14ee322011-09-22 04:58:26 +00001574 lldb::addr_t load_addr = so_addr.GetLoadAddress(target);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001575
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001576 if (load_addr != LLDB_INVALID_ADDRESS)
1577 {
Greg Clayton57ee3062013-07-11 22:46:58 +00001578 var_location.GetScalar() = load_addr;
1579 var_location.SetValueType(Value::eValueTypeLoadAddress);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001580 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001581 }
1582
Sean Callanan1d180662010-07-20 23:31:16 +00001583 if (user_type)
Greg Clayton57ee3062013-07-11 22:46:58 +00001584 *user_type = TypeFromUser(var_clang_type);
Sean Callanan6b4067c2010-07-17 00:43:37 +00001585
Greg Clayton57ee3062013-07-11 22:46:58 +00001586 return true;
Sean Callanan6b4067c2010-07-17 00:43:37 +00001587}
1588
1589void
Sean Callanan0712f462011-11-29 22:03:21 +00001590ClangExpressionDeclMap::AddOneVariable (NameSearchContext &context, VariableSP var, ValueObjectSP valobj, unsigned int current_id)
Sean Callanan6b4067c2010-07-17 00:43:37 +00001591{
Sean Callanan979f74d2010-12-03 01:38:59 +00001592 assert (m_parser_vars.get());
1593
Greg Clayton5160ce52013-03-27 23:08:40 +00001594 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001595
Sean Callanan1d180662010-07-20 23:31:16 +00001596 TypeFromUser ut;
1597 TypeFromParser pt;
Greg Clayton57ee3062013-07-11 22:46:58 +00001598 Value var_location;
Sean Callanan6b4067c2010-07-17 00:43:37 +00001599
Greg Clayton57ee3062013-07-11 22:46:58 +00001600 if (!GetVariableValue (var, var_location, &ut, &pt))
1601 return;
Sean Callanan6b4067c2010-07-17 00:43:37 +00001602
Sean Callanancf128622012-03-15 01:53:17 +00001603 clang::QualType parser_opaque_type = QualType::getFromOpaquePtr(pt.GetOpaqueQualType());
1604
Sean Callanane2d47482012-03-21 17:13:20 +00001605 if (parser_opaque_type.isNull())
1606 return;
1607
Sean Callanancf128622012-03-15 01:53:17 +00001608 if (const clang::Type *parser_type = parser_opaque_type.getTypePtr())
1609 {
1610 if (const TagType *tag_type = dyn_cast<TagType>(parser_type))
1611 CompleteType(tag_type->getDecl());
Sean Callananf4c0a222013-12-20 04:09:05 +00001612 if (const ObjCObjectPointerType *objc_object_ptr_type = dyn_cast<ObjCObjectPointerType>(parser_type))
1613 CompleteType(objc_object_ptr_type->getInterfaceDecl());
Sean Callanancf128622012-03-15 01:53:17 +00001614 }
1615
Sean Callanana3aa0cf2010-11-20 02:19:29 +00001616
Greg Clayton57ee3062013-07-11 22:46:58 +00001617 bool is_reference = pt.IsReferenceType();
Sean Callanan98298012011-10-27 19:41:13 +00001618
Greg Clayton57ee3062013-07-11 22:46:58 +00001619 NamedDecl *var_decl = NULL;
Sean Callanan98298012011-10-27 19:41:13 +00001620 if (is_reference)
Greg Clayton57ee3062013-07-11 22:46:58 +00001621 var_decl = context.AddVarDecl(pt);
Sean Callanan98298012011-10-27 19:41:13 +00001622 else
Greg Clayton57ee3062013-07-11 22:46:58 +00001623 var_decl = context.AddVarDecl(pt.GetLValueReferenceType());
Sean Callanan98298012011-10-27 19:41:13 +00001624
Greg Clayton7b462cc2010-10-15 22:48:33 +00001625 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001626 ConstString entity_name(decl_name.c_str());
Sean Callanan0712f462011-11-29 22:03:21 +00001627 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (valobj));
1628
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001629 assert (entity.get());
Sean Callanan3c495c12013-01-15 23:29:36 +00001630 entity->EnableParserVars(GetParserID());
1631 ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID());
1632 parser_vars->m_parser_type = pt;
1633 parser_vars->m_named_decl = var_decl;
1634 parser_vars->m_llvm_value = NULL;
1635 parser_vars->m_lldb_value = var_location;
1636 parser_vars->m_lldb_var = var;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001637
Sean Callanan98298012011-10-27 19:41:13 +00001638 if (is_reference)
1639 entity->m_flags |= ClangExpressionVariable::EVTypeIsReference;
1640
Sean Callananea22d422010-07-16 00:09:46 +00001641 if (log)
Greg Clayton7b462cc2010-10-15 22:48:33 +00001642 {
Sean Callanan82695d62011-11-07 23:32:52 +00001643 ASTDumper orig_dumper(ut.GetOpaqueQualType());
Greg Clayton64bc6ca2011-10-20 00:47:21 +00001644 ASTDumper ast_dumper(var_decl);
Sean Callanan82695d62011-11-07 23:32:52 +00001645 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 +00001646 }
Sean Callanan468574b2010-06-22 23:46:24 +00001647}
1648
1649void
Sean Callanan2235f322010-08-11 03:57:18 +00001650ClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
Sean Callanan7dd98122011-10-14 20:34:21 +00001651 ClangExpressionVariableSP &pvar_sp,
1652 unsigned int current_id)
Sean Callanan2235f322010-08-11 03:57:18 +00001653{
Greg Clayton5160ce52013-03-27 23:08:40 +00001654 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan823bb4c2010-08-30 22:17:16 +00001655
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001656 TypeFromUser user_type (pvar_sp->GetTypeFromUser());
Sean Callanan2235f322010-08-11 03:57:18 +00001657
Greg Clayton57ee3062013-07-11 22:46:58 +00001658 TypeFromParser parser_type (GuardedCopyType(user_type));
Sean Callanan2235f322010-08-11 03:57:18 +00001659
Sean Callanane0a64f72011-12-01 21:04:37 +00001660 if (!parser_type.GetOpaqueQualType())
1661 {
1662 if (log)
1663 log->Printf(" CEDM::FEVD[%u] Couldn't import type for pvar %s", current_id, pvar_sp->GetName().GetCString());
1664 return;
1665 }
1666
Greg Clayton57ee3062013-07-11 22:46:58 +00001667 NamedDecl *var_decl = context.AddVarDecl(parser_type.GetLValueReferenceType());
Sean Callanan64dfc9a2010-08-23 23:09:38 +00001668
Sean Callanan3c495c12013-01-15 23:29:36 +00001669 pvar_sp->EnableParserVars(GetParserID());
1670 ClangExpressionVariable::ParserVars *parser_vars = pvar_sp->GetParserVars(GetParserID());
1671 parser_vars->m_parser_type = parser_type;
Greg Clayton57ee3062013-07-11 22:46:58 +00001672 parser_vars->m_named_decl = var_decl;
1673 parser_vars->m_llvm_value = NULL;
1674 parser_vars->m_lldb_value.Clear();
Sean Callanan823bb4c2010-08-30 22:17:16 +00001675
1676 if (log)
Sean Callanan530782942010-11-01 23:22:47 +00001677 {
Greg Clayton64bc6ca2011-10-20 00:47:21 +00001678 ASTDumper ast_dumper(var_decl);
Sean Callananfb3e4302011-10-29 19:50:43 +00001679 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 +00001680 }
Sean Callanan2235f322010-08-11 03:57:18 +00001681}
1682
Sean Callanan348b5892010-11-30 00:27:43 +00001683void
Sean Callanand9ca42a2011-05-08 02:21:26 +00001684ClangExpressionDeclMap::AddOneGenericVariable(NameSearchContext &context,
Greg Clayton3d51b9f2012-11-27 01:52:16 +00001685 const Symbol &symbol,
Sean Callanan7dd98122011-10-14 20:34:21 +00001686 unsigned int current_id)
Sean Callanand9ca42a2011-05-08 02:21:26 +00001687{
1688 assert(m_parser_vars.get());
1689
Greg Clayton5160ce52013-03-27 23:08:40 +00001690 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanand9ca42a2011-05-08 02:21:26 +00001691
Sean Callanan933693b2012-02-10 01:22:05 +00001692 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
Greg Claytonc14ee322011-09-22 04:58:26 +00001693
1694 if (target == NULL)
1695 return;
1696
1697 ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
Sean Callanand9ca42a2011-05-08 02:21:26 +00001698
Greg Clayton57ee3062013-07-11 22:46:58 +00001699 TypeFromUser user_type (ClangASTContext::GetBasicType(scratch_ast_context, eBasicTypeVoid).GetPointerType().GetLValueReferenceType());
1700 TypeFromParser parser_type (ClangASTContext::GetBasicType(m_ast_context, eBasicTypeVoid).GetPointerType().GetLValueReferenceType());
1701 NamedDecl *var_decl = context.AddVarDecl(parser_type);
Sean Callanand9ca42a2011-05-08 02:21:26 +00001702
1703 std::string decl_name(context.m_decl_name.getAsString());
1704 ConstString entity_name(decl_name.c_str());
Sean Callanan933693b2012-02-10 01:22:05 +00001705 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope (),
Sean Callanand9ca42a2011-05-08 02:21:26 +00001706 entity_name,
1707 user_type,
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001708 m_parser_vars->m_target_info.byte_order,
1709 m_parser_vars->m_target_info.address_byte_size));
Sean Callanand9ca42a2011-05-08 02:21:26 +00001710 assert (entity.get());
Sean Callanand9ca42a2011-05-08 02:21:26 +00001711
Greg Clayton57ee3062013-07-11 22:46:58 +00001712 entity->EnableParserVars(GetParserID());
1713 ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID());
1714
Greg Clayton3d51b9f2012-11-27 01:52:16 +00001715 const Address &symbol_address = symbol.GetAddress();
Greg Claytonc14ee322011-09-22 04:58:26 +00001716 lldb::addr_t symbol_load_addr = symbol_address.GetLoadAddress(target);
Sean Callanand9ca42a2011-05-08 02:21:26 +00001717
Greg Clayton57ee3062013-07-11 22:46:58 +00001718 //parser_vars->m_lldb_value.SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
1719 parser_vars->m_lldb_value.SetClangType(user_type);
1720 parser_vars->m_lldb_value.GetScalar() = symbol_load_addr;
1721 parser_vars->m_lldb_value.SetValueType(Value::eValueTypeLoadAddress);
Sean Callanand9ca42a2011-05-08 02:21:26 +00001722
Sean Callanan3c495c12013-01-15 23:29:36 +00001723 parser_vars->m_parser_type = parser_type;
1724 parser_vars->m_named_decl = var_decl;
1725 parser_vars->m_llvm_value = NULL;
Sean Callanan3c495c12013-01-15 23:29:36 +00001726 parser_vars->m_lldb_sym = &symbol;
Sean Callanand9ca42a2011-05-08 02:21:26 +00001727
1728 if (log)
1729 {
Greg Clayton64bc6ca2011-10-20 00:47:21 +00001730 ASTDumper ast_dumper(var_decl);
Sean Callanand9ca42a2011-05-08 02:21:26 +00001731
Sean Callananfb3e4302011-10-29 19:50:43 +00001732 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 +00001733 }
1734}
1735
Sean Callanan77502262011-05-12 23:54:16 +00001736bool
1737ClangExpressionDeclMap::ResolveUnknownTypes()
1738{
Greg Clayton5160ce52013-03-27 23:08:40 +00001739 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan933693b2012-02-10 01:22:05 +00001740 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
Greg Claytonc14ee322011-09-22 04:58:26 +00001741
1742 ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
Sean Callanan77502262011-05-12 23:54:16 +00001743
1744 for (size_t index = 0, num_entities = m_found_entities.GetSize();
1745 index < num_entities;
1746 ++index)
1747 {
1748 ClangExpressionVariableSP entity = m_found_entities.GetVariableAtIndex(index);
1749
Sean Callanan3c495c12013-01-15 23:29:36 +00001750 ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID());
1751
Sean Callanan77502262011-05-12 23:54:16 +00001752 if (entity->m_flags & ClangExpressionVariable::EVUnknownType)
1753 {
Sean Callanan3c495c12013-01-15 23:29:36 +00001754 const NamedDecl *named_decl = parser_vars->m_named_decl;
Sean Callanan77502262011-05-12 23:54:16 +00001755 const VarDecl *var_decl = dyn_cast<VarDecl>(named_decl);
1756
1757 if (!var_decl)
1758 {
1759 if (log)
1760 log->Printf("Entity of unknown type does not have a VarDecl");
1761 return false;
1762 }
1763
1764 if (log)
1765 {
Greg Clayton64bc6ca2011-10-20 00:47:21 +00001766 ASTDumper ast_dumper(const_cast<VarDecl*>(var_decl));
1767 log->Printf("Variable of unknown type now has Decl %s", ast_dumper.GetCString());
Sean Callanan77502262011-05-12 23:54:16 +00001768 }
1769
1770 QualType var_type = var_decl->getType();
1771 TypeFromParser parser_type(var_type.getAsOpaquePtr(), &var_decl->getASTContext());
1772
Sean Callanan00f43622011-11-18 03:28:09 +00001773 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 +00001774
Sean Callanane0a64f72011-12-01 21:04:37 +00001775 if (!copied_type)
1776 {
1777 if (log)
1778 log->Printf("ClangExpressionDeclMap::ResolveUnknownType - Couldn't import the type for a variable");
1779
Jim Inghamf94e1792012-08-11 00:35:26 +00001780 return (bool) lldb::ClangExpressionVariableSP();
Sean Callanane0a64f72011-12-01 21:04:37 +00001781 }
1782
Sean Callanan77502262011-05-12 23:54:16 +00001783 TypeFromUser user_type(copied_type, scratch_ast_context);
1784
Greg Clayton57ee3062013-07-11 22:46:58 +00001785// parser_vars->m_lldb_value.SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
1786 parser_vars->m_lldb_value.SetClangType(user_type);
Sean Callanan3c495c12013-01-15 23:29:36 +00001787 parser_vars->m_parser_type = parser_type;
Sean Callanan77502262011-05-12 23:54:16 +00001788
Greg Clayton57ee3062013-07-11 22:46:58 +00001789 entity->SetClangType(user_type);
Sean Callanan77502262011-05-12 23:54:16 +00001790
1791 entity->m_flags &= ~(ClangExpressionVariable::EVUnknownType);
1792 }
1793 }
1794
1795 return true;
1796}
1797
Sean Callanand9ca42a2011-05-08 02:21:26 +00001798void
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001799ClangExpressionDeclMap::AddOneRegister (NameSearchContext &context,
Sean Callanan7dd98122011-10-14 20:34:21 +00001800 const RegisterInfo *reg_info,
1801 unsigned int current_id)
Sean Callanan348b5892010-11-30 00:27:43 +00001802{
Greg Clayton5160ce52013-03-27 23:08:40 +00001803 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan348b5892010-11-30 00:27:43 +00001804
Greg Clayton57ee3062013-07-11 22:46:58 +00001805 ClangASTType clang_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (m_ast_context,
1806 reg_info->encoding,
1807 reg_info->byte_size * 8);
Sean Callanan348b5892010-11-30 00:27:43 +00001808
Greg Clayton57ee3062013-07-11 22:46:58 +00001809 if (!clang_type)
Sean Callanan348b5892010-11-30 00:27:43 +00001810 {
Johnny Chene95fcf72011-08-09 22:52:27 +00001811 if (log)
Sean Callanan7dd98122011-10-14 20:34:21 +00001812 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 +00001813 return;
1814 }
1815
Greg Clayton57ee3062013-07-11 22:46:58 +00001816 TypeFromParser parser_clang_type (clang_type);
Sean Callanan348b5892010-11-30 00:27:43 +00001817
Greg Clayton57ee3062013-07-11 22:46:58 +00001818 NamedDecl *var_decl = context.AddVarDecl(parser_clang_type);
Sean Callanan348b5892010-11-30 00:27:43 +00001819
Sean Callanan933693b2012-02-10 01:22:05 +00001820 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(),
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001821 m_parser_vars->m_target_info.byte_order,
1822 m_parser_vars->m_target_info.address_byte_size));
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001823 assert (entity.get());
Sean Callanan96d27302013-04-11 00:09:05 +00001824
Sean Callanan348b5892010-11-30 00:27:43 +00001825 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001826 entity->SetName (ConstString (decl_name.c_str()));
1827 entity->SetRegisterInfo (reg_info);
Sean Callanan3c495c12013-01-15 23:29:36 +00001828 entity->EnableParserVars(GetParserID());
1829 ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID());
Greg Clayton57ee3062013-07-11 22:46:58 +00001830 parser_vars->m_parser_type = parser_clang_type;
1831 parser_vars->m_named_decl = var_decl;
1832 parser_vars->m_llvm_value = NULL;
1833 parser_vars->m_lldb_value.Clear();
Sean Callananf673e762012-02-15 01:40:39 +00001834 entity->m_flags |= ClangExpressionVariable::EVBareRegister;
Sean Callanan348b5892010-11-30 00:27:43 +00001835
Sean Callananf673e762012-02-15 01:40:39 +00001836 if (log)
Sean Callanan348b5892010-11-30 00:27:43 +00001837 {
Greg Clayton64bc6ca2011-10-20 00:47:21 +00001838 ASTDumper ast_dumper(var_decl);
Sean Callananfb3e4302011-10-29 19:50:43 +00001839 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 +00001840 }
1841}
1842
Sean Callanan2235f322010-08-11 03:57:18 +00001843void
Greg Clayton3f5c08f2011-05-18 22:01:49 +00001844ClangExpressionDeclMap::AddOneFunction (NameSearchContext &context,
Greg Clayton57ee3062013-07-11 22:46:58 +00001845 Function* function,
Sean Callanan7dd98122011-10-14 20:34:21 +00001846 Symbol* symbol,
1847 unsigned int current_id)
Sean Callanan468574b2010-06-22 23:46:24 +00001848{
Sean Callanan979f74d2010-12-03 01:38:59 +00001849 assert (m_parser_vars.get());
1850
Greg Clayton5160ce52013-03-27 23:08:40 +00001851 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan468574b2010-06-22 23:46:24 +00001852
Greg Clayton57ee3062013-07-11 22:46:58 +00001853 NamedDecl *function_decl = NULL;
Sean Callanan77eaf442011-07-08 00:39:14 +00001854 const Address *fun_address = NULL;
Greg Clayton57ee3062013-07-11 22:46:58 +00001855 ClangASTType function_clang_type;
Matt Kopec00049b82013-02-27 20:13:38 +00001856
1857 bool is_indirect_function = false;
1858
Greg Clayton57ee3062013-07-11 22:46:58 +00001859 if (function)
Sean Callanan8ade1042010-07-27 00:55:47 +00001860 {
Greg Clayton57ee3062013-07-11 22:46:58 +00001861 Type *function_type = function->GetType();
Sean Callanan8ade1042010-07-27 00:55:47 +00001862
Greg Clayton57ee3062013-07-11 22:46:58 +00001863 if (!function_type)
Sean Callanan8ade1042010-07-27 00:55:47 +00001864 {
1865 if (log)
Sean Callanan7dd98122011-10-14 20:34:21 +00001866 log->PutCString(" Skipped a function because it has no type");
Sean Callanan8ade1042010-07-27 00:55:47 +00001867 return;
1868 }
1869
Greg Clayton57ee3062013-07-11 22:46:58 +00001870 function_clang_type = function_type->GetClangFullType();
Sean Callanan8ade1042010-07-27 00:55:47 +00001871
Greg Clayton57ee3062013-07-11 22:46:58 +00001872 if (!function_clang_type)
Sean Callanan8ade1042010-07-27 00:55:47 +00001873 {
1874 if (log)
Sean Callanan7dd98122011-10-14 20:34:21 +00001875 log->PutCString(" Skipped a function because it has no Clang type");
Sean Callanan8ade1042010-07-27 00:55:47 +00001876 return;
1877 }
1878
Greg Clayton57ee3062013-07-11 22:46:58 +00001879 fun_address = &function->GetAddressRange().GetBaseAddress();
Sean Callanan8ade1042010-07-27 00:55:47 +00001880
Greg Clayton57ee3062013-07-11 22:46:58 +00001881 ClangASTType copied_function_type = GuardedCopyType(function_clang_type);
1882 if (copied_function_type)
Greg Clayton64bc6ca2011-10-20 00:47:21 +00001883 {
Greg Clayton57ee3062013-07-11 22:46:58 +00001884 function_decl = context.AddFunDecl(copied_function_type);
Sean Callanan485f7322013-04-24 00:34:41 +00001885
Greg Clayton57ee3062013-07-11 22:46:58 +00001886 if (!function_decl)
Sean Callanan485f7322013-04-24 00:34:41 +00001887 {
1888 if (log)
1889 {
1890 log->Printf (" Failed to create a function decl for '%s' {0x%8.8" PRIx64 "}",
Greg Clayton57ee3062013-07-11 22:46:58 +00001891 function_type->GetName().GetCString(),
1892 function_type->GetID());
Sean Callanan485f7322013-04-24 00:34:41 +00001893 }
1894
1895 return;
1896 }
Greg Clayton64bc6ca2011-10-20 00:47:21 +00001897 }
1898 else
1899 {
1900 // We failed to copy the type we found
1901 if (log)
1902 {
Daniel Malead01b2952012-11-29 21:49:15 +00001903 log->Printf (" Failed to import the function type '%s' {0x%8.8" PRIx64 "} into the expression parser AST contenxt",
Greg Clayton57ee3062013-07-11 22:46:58 +00001904 function_type->GetName().GetCString(),
1905 function_type->GetID());
Greg Clayton64bc6ca2011-10-20 00:47:21 +00001906 }
Sean Callananed8d58f2011-11-16 00:40:13 +00001907
1908 return;
Greg Clayton64bc6ca2011-10-20 00:47:21 +00001909 }
Sean Callanan8ade1042010-07-27 00:55:47 +00001910 }
1911 else if (symbol)
1912 {
Greg Claytone7612132012-03-07 21:03:09 +00001913 fun_address = &symbol->GetAddress();
Greg Clayton57ee3062013-07-11 22:46:58 +00001914 function_decl = context.AddGenericFunDecl();
Matt Kopec00049b82013-02-27 20:13:38 +00001915 is_indirect_function = symbol->IsIndirect();
Sean Callanan8ade1042010-07-27 00:55:47 +00001916 }
1917 else
1918 {
1919 if (log)
Sean Callanan7dd98122011-10-14 20:34:21 +00001920 log->PutCString(" AddOneFunction called with no function and no symbol");
Sean Callanan8ade1042010-07-27 00:55:47 +00001921 return;
1922 }
1923
Sean Callanan933693b2012-02-10 01:22:05 +00001924 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
Greg Claytonc14ee322011-09-22 04:58:26 +00001925
Matt Kopec00049b82013-02-27 20:13:38 +00001926 lldb::addr_t load_addr = fun_address->GetCallableLoadAddress(target, is_indirect_function);
Sean Callanan9be9d172013-03-19 01:45:02 +00001927
Greg Clayton57ee3062013-07-11 22:46:58 +00001928 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope (),
1929 m_parser_vars->m_target_info.byte_order,
1930 m_parser_vars->m_target_info.address_byte_size));
1931 assert (entity.get());
1932
1933 std::string decl_name(context.m_decl_name.getAsString());
1934 entity->SetName(ConstString(decl_name.c_str()));
1935 entity->SetClangType (function_clang_type);
1936 entity->EnableParserVars(GetParserID());
1937
1938 ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID());
1939
Sean Callanan9be9d172013-03-19 01:45:02 +00001940 if (load_addr != LLDB_INVALID_ADDRESS)
1941 {
Greg Clayton57ee3062013-07-11 22:46:58 +00001942 parser_vars->m_lldb_value.SetValueType(Value::eValueTypeLoadAddress);
1943 parser_vars->m_lldb_value.GetScalar() = load_addr;
Sean Callanan9be9d172013-03-19 01:45:02 +00001944 }
1945 else
1946 {
1947 // We have to try finding a file address.
1948
1949 lldb::addr_t file_addr = fun_address->GetFileAddress();
1950
Greg Clayton57ee3062013-07-11 22:46:58 +00001951 parser_vars->m_lldb_value.SetValueType(Value::eValueTypeFileAddress);
1952 parser_vars->m_lldb_value.GetScalar() = file_addr;
Sean Callanan9be9d172013-03-19 01:45:02 +00001953 }
Sean Callanan468574b2010-06-22 23:46:24 +00001954
Greg Clayton57ee3062013-07-11 22:46:58 +00001955
1956 parser_vars->m_named_decl = function_decl;
Sean Callanan3c495c12013-01-15 23:29:36 +00001957 parser_vars->m_llvm_value = NULL;
Greg Clayton57ee3062013-07-11 22:46:58 +00001958
Sean Callananea22d422010-07-16 00:09:46 +00001959 if (log)
Greg Clayton7b462cc2010-10-15 22:48:33 +00001960 {
Greg Clayton57ee3062013-07-11 22:46:58 +00001961 ASTDumper ast_dumper(function_decl);
Sean Callanan530782942010-11-01 23:22:47 +00001962
Sean Callanan308a3c52012-07-28 00:21:01 +00001963 StreamString ss;
1964
1965 fun_address->Dump(&ss, m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(), Address::DumpStyleResolvedDescription);
1966
1967 log->Printf(" CEDM::FEVD[%u] Found %s function %s (description %s), returned %s",
Sean Callanan7dd98122011-10-14 20:34:21 +00001968 current_id,
Greg Clayton57ee3062013-07-11 22:46:58 +00001969 (function ? "specific" : "generic"),
Sean Callanan308a3c52012-07-28 00:21:01 +00001970 decl_name.c_str(),
1971 ss.GetData(),
Greg Clayton64bc6ca2011-10-20 00:47:21 +00001972 ast_dumper.GetCString());
Greg Clayton7b462cc2010-10-15 22:48:33 +00001973 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001974}
Sean Callanan5666b672010-08-04 01:02:13 +00001975
Sean Callananfa4fab72013-02-01 06:55:48 +00001976TypeFromParser
1977ClangExpressionDeclMap::CopyClassType(TypeFromUser &ut,
1978 unsigned int current_id)
Sean Callanan5666b672010-08-04 01:02:13 +00001979{
Greg Clayton57ee3062013-07-11 22:46:58 +00001980 ClangASTType copied_clang_type = GuardedCopyType(ut);
Sean Callanane0a64f72011-12-01 21:04:37 +00001981
Greg Clayton57ee3062013-07-11 22:46:58 +00001982 if (!copied_clang_type)
Sean Callanane0a64f72011-12-01 21:04:37 +00001983 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001984 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanane0a64f72011-12-01 21:04:37 +00001985
Sean Callananfa4fab72013-02-01 06:55:48 +00001986 if (log)
1987 log->Printf("ClangExpressionDeclMap::CopyClassType - Couldn't import the type");
1988
1989 return TypeFromParser();
Sean Callanane0a64f72011-12-01 21:04:37 +00001990 }
Sean Callananfa4fab72013-02-01 06:55:48 +00001991
Greg Clayton57ee3062013-07-11 22:46:58 +00001992 if (copied_clang_type.IsAggregateType() && copied_clang_type.GetCompleteType ())
Sean Callananfc55f5d2010-09-21 00:44:12 +00001993 {
Greg Clayton57ee3062013-07-11 22:46:58 +00001994 ClangASTType void_clang_type = ClangASTContext::GetBasicType(m_ast_context, eBasicTypeVoid);
1995 ClangASTType void_ptr_clang_type = void_clang_type.GetPointerType();
Sean Callananfc55f5d2010-09-21 00:44:12 +00001996
Greg Clayton57ee3062013-07-11 22:46:58 +00001997 ClangASTType method_type = ClangASTContext::CreateFunctionType (m_ast_context,
1998 void_clang_type,
1999 &void_ptr_clang_type,
Sean Callananc1b732d2011-11-01 18:07:13 +00002000 1,
2001 false,
Greg Clayton57ee3062013-07-11 22:46:58 +00002002 copied_clang_type.GetTypeQualifiers());
Sean Callananc1b732d2011-11-01 18:07:13 +00002003
Greg Clayton0fffff52010-09-24 05:15:53 +00002004 const bool is_virtual = false;
2005 const bool is_static = false;
2006 const bool is_inline = false;
Greg Claytonf51de672010-10-01 02:31:07 +00002007 const bool is_explicit = false;
Sean Callananc8324752011-11-02 18:09:01 +00002008 const bool is_attr_used = true;
Sean Callanandbb58392011-11-02 01:38:59 +00002009 const bool is_artificial = false;
Greg Claytonf51de672010-10-01 02:31:07 +00002010
Greg Clayton57ee3062013-07-11 22:46:58 +00002011 copied_clang_type.AddMethodToCXXRecordType ("$__lldb_expr",
2012 method_type,
2013 lldb::eAccessPublic,
2014 is_virtual,
2015 is_static,
2016 is_inline,
2017 is_explicit,
2018 is_attr_used,
2019 is_artificial);
Sean Callananfc55f5d2010-09-21 00:44:12 +00002020 }
Sean Callanan5666b672010-08-04 01:02:13 +00002021
Greg Clayton57ee3062013-07-11 22:46:58 +00002022 return TypeFromParser(copied_clang_type);
Sean Callananfa4fab72013-02-01 06:55:48 +00002023}
2024
2025void
2026ClangExpressionDeclMap::AddOneType(NameSearchContext &context,
2027 TypeFromUser &ut,
2028 unsigned int current_id)
2029{
Greg Clayton57ee3062013-07-11 22:46:58 +00002030 ClangASTType copied_clang_type = GuardedCopyType(ut);
Sean Callananfa4fab72013-02-01 06:55:48 +00002031
Greg Clayton57ee3062013-07-11 22:46:58 +00002032 if (!copied_clang_type)
Sean Callananfa4fab72013-02-01 06:55:48 +00002033 {
Greg Clayton5160ce52013-03-27 23:08:40 +00002034 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callananfa4fab72013-02-01 06:55:48 +00002035
2036 if (log)
2037 log->Printf("ClangExpressionDeclMap::AddOneType - Couldn't import the type");
2038
2039 return;
2040 }
2041
Greg Clayton57ee3062013-07-11 22:46:58 +00002042 context.AddTypeDecl(copied_clang_type);
Sean Callanan5666b672010-08-04 01:02:13 +00002043}