blob: 13f19a16cf529ff2d51484f5763d75232a440804 [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"
Sean Callanan3d654b32012-09-24 22:25:51 +000011#include "clang/AST/ASTContext.h"
Sean Callanane2ef6e32010-09-23 03:01:22 +000012#include "clang/AST/DeclarationName.h"
Sean Callanan530782942010-11-01 23:22:47 +000013#include "clang/AST/Decl.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000014#include "lldb/lldb-private.h"
15#include "lldb/Core/Address.h"
Sean Callananea22d422010-07-16 00:09:46 +000016#include "lldb/Core/Error.h"
Sean Callananf06ba8d2010-06-23 00:47:48 +000017#include "lldb/Core/Log.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000018#include "lldb/Core/Module.h"
Greg Clayton9191db42013-10-21 18:40:51 +000019#include "lldb/Core/ModuleSpec.h"
Greg Clayton7349bd92011-05-09 20:18:18 +000020#include "lldb/Core/RegisterValue.h"
Sean Callanane4ec90e2010-12-16 03:17:46 +000021#include "lldb/Core/ValueObjectConstResult.h"
Sean Callanan9b3569b2011-12-10 03:12:34 +000022#include "lldb/Core/ValueObjectVariable.h"
Sean Callanan0917d6e2011-02-01 23:43:26 +000023#include "lldb/Expression/ASTDumper.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000024#include "lldb/Expression/ClangASTSource.h"
Sean Callanan2235f322010-08-11 03:57:18 +000025#include "lldb/Expression/ClangPersistentVariables.h"
Sean Callanan96d27302013-04-11 00:09:05 +000026#include "lldb/Expression/Materializer.h"
Greg Clayton7fb56d02011-02-01 01:31:41 +000027#include "lldb/Host/Endian.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000028#include "lldb/Symbol/ClangASTContext.h"
Greg Clayton526e5af2010-11-13 03:52:47 +000029#include "lldb/Symbol/ClangNamespaceDecl.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000030#include "lldb/Symbol/CompileUnit.h"
31#include "lldb/Symbol/Function.h"
32#include "lldb/Symbol/ObjectFile.h"
33#include "lldb/Symbol/SymbolContext.h"
Sean Callanan503aa522011-10-12 00:12:34 +000034#include "lldb/Symbol/SymbolVendor.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000035#include "lldb/Symbol/Type.h"
36#include "lldb/Symbol/TypeList.h"
37#include "lldb/Symbol/Variable.h"
38#include "lldb/Symbol/VariableList.h"
Sean Callanan1d180662010-07-20 23:31:16 +000039#include "lldb/Target/ExecutionContext.h"
Sean Callanane0b23b52012-11-15 02:02:04 +000040#include "lldb/Target/ObjCLanguageRuntime.h"
Sean Callananea22d422010-07-16 00:09:46 +000041#include "lldb/Target/Process.h"
Sean Callananf4b9bd32010-10-05 20:18:48 +000042#include "lldb/Target/RegisterContext.h"
Jason Molendab57e4a12013-11-04 09:33:30 +000043#include "lldb/Target/StackFrame.h"
Sean Callanan1d180662010-07-20 23:31:16 +000044#include "lldb/Target/Target.h"
Jim Ingham895c9822010-12-07 01:56:02 +000045#include "lldb/Target/Thread.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000046
Greg Clayton83c5cd92010-11-14 22:13:40 +000047using namespace lldb;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000048using namespace lldb_private;
49using namespace clang;
50
Sean Callanan1ee44b72011-10-29 01:58:46 +000051ClangExpressionDeclMap::ClangExpressionDeclMap (bool keep_result_in_memory, ExecutionContext &exe_ctx) :
52 ClangASTSource (exe_ctx.GetTargetSP()),
Greg Clayton7b462cc2010-10-15 22:48:33 +000053 m_found_entities (),
54 m_struct_members (),
Stephen Wilson71c21d12011-04-11 19:41:40 +000055 m_keep_result_in_memory (keep_result_in_memory),
Sean Callanan979f74d2010-12-03 01:38:59 +000056 m_parser_vars (),
Stephen Wilson71c21d12011-04-11 19:41:40 +000057 m_struct_vars ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +000058{
Sean Callanan979f74d2010-12-03 01:38:59 +000059 EnableStructVars();
Chris Lattner30fdc8d2010-06-08 16:52:24 +000060}
61
62ClangExpressionDeclMap::~ClangExpressionDeclMap()
Sean Callanan979f74d2010-12-03 01:38:59 +000063{
Sean Callanane3aef1d2011-10-12 22:20:02 +000064 // Note: The model is now that the parser's AST context and all associated
65 // data does not vanish until the expression has been executed. This means
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +000066 // that valuable lookup data (like namespaces) doesn't vanish, but
67
Sean Callanane3aef1d2011-10-12 22:20:02 +000068 DidParse();
Sean Callanan979f74d2010-12-03 01:38:59 +000069 DisableStructVars();
70}
Sean Callananbe3a1b12010-10-26 00:31:56 +000071
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +000072bool
Sean Callanan96d27302013-04-11 00:09:05 +000073ClangExpressionDeclMap::WillParse(ExecutionContext &exe_ctx,
74 Materializer *materializer)
Sean Callanan8106d802013-03-08 20:04:57 +000075{
76 ClangASTMetrics::ClearLocalCounters();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +000077
Sean Callanan979f74d2010-12-03 01:38:59 +000078 EnableParserVars();
Sean Callanan933693b2012-02-10 01:22:05 +000079 m_parser_vars->m_exe_ctx = exe_ctx;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +000080
Greg Claytonc14ee322011-09-22 04:58:26 +000081 Target *target = exe_ctx.GetTargetPtr();
82 if (exe_ctx.GetFramePtr())
83 m_parser_vars->m_sym_ctx = exe_ctx.GetFramePtr()->GetSymbolContext(lldb::eSymbolContextEverything);
Sean Callanand4fac252013-02-21 22:01:43 +000084 else if (exe_ctx.GetThreadPtr() && exe_ctx.GetThreadPtr()->GetStackFrameAtIndex(0))
Greg Claytonc14ee322011-09-22 04:58:26 +000085 m_parser_vars->m_sym_ctx = exe_ctx.GetThreadPtr()->GetStackFrameAtIndex(0)->GetSymbolContext(lldb::eSymbolContextEverything);
86 else if (exe_ctx.GetProcessPtr())
Greg Clayton4d122c42011-09-17 08:33:22 +000087 {
Greg Clayton72310352013-02-23 04:12:47 +000088 m_parser_vars->m_sym_ctx.Clear(true);
Greg Claytonc14ee322011-09-22 04:58:26 +000089 m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP();
Greg Clayton4d122c42011-09-17 08:33:22 +000090 }
Greg Claytonc14ee322011-09-22 04:58:26 +000091 else if (target)
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 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +000096
Greg Claytonc14ee322011-09-22 04:58:26 +000097 if (target)
98 {
99 m_parser_vars->m_persistent_vars = &target->GetPersistentVariables();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000100
Greg Claytonc14ee322011-09-22 04:58:26 +0000101 if (!target->GetScratchClangASTContext())
102 return false;
103 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000104
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000105 m_parser_vars->m_target_info = GetTargetInfo();
Sean Callanan96d27302013-04-11 00:09:05 +0000106 m_parser_vars->m_materializer = materializer;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000107
Sean Callananb9951192011-08-01 18:18:33 +0000108 return true;
Sean Callanan979f74d2010-12-03 01:38:59 +0000109}
110
Sean Callanan96d27302013-04-11 00:09:05 +0000111void
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000112ClangExpressionDeclMap::DidParse()
Sean Callanan979f74d2010-12-03 01:38:59 +0000113{
Greg Clayton5160ce52013-03-27 23:08:40 +0000114 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan8106d802013-03-08 20:04:57 +0000115
116 if (log)
117 ClangASTMetrics::DumpCounters(log);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000118
Sean Callanan979f74d2010-12-03 01:38:59 +0000119 if (m_parser_vars.get())
120 {
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000121 for (size_t entity_index = 0, num_entities = m_found_entities.GetSize();
Sean Callanan979f74d2010-12-03 01:38:59 +0000122 entity_index < num_entities;
123 ++entity_index)
124 {
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000125 ClangExpressionVariableSP var_sp(m_found_entities.GetVariableAtIndex(entity_index));
Jim Ingham28eb5712012-10-12 17:34:26 +0000126 if (var_sp)
Sean Callanan3c495c12013-01-15 23:29:36 +0000127 var_sp->DisableParserVars(GetParserID());
Sean Callanan979f74d2010-12-03 01:38:59 +0000128 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000129
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000130 for (size_t pvar_index = 0, num_pvars = m_parser_vars->m_persistent_vars->GetSize();
Sean Callanan979f74d2010-12-03 01:38:59 +0000131 pvar_index < num_pvars;
132 ++pvar_index)
133 {
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000134 ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariableAtIndex(pvar_index));
135 if (pvar_sp)
Sean Callanan3c495c12013-01-15 23:29:36 +0000136 pvar_sp->DisableParserVars(GetParserID());
Sean Callanan979f74d2010-12-03 01:38:59 +0000137 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000138
Sean Callanan979f74d2010-12-03 01:38:59 +0000139 DisableParserVars();
Sean Callanan6b1b9532010-10-08 01:58:41 +0000140 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000141}
142
Sean Callanan549c9f72010-07-13 21:41:46 +0000143// Interface for IRForTarget
144
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000145ClangExpressionDeclMap::TargetInfo
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000146ClangExpressionDeclMap::GetTargetInfo()
147{
148 assert (m_parser_vars.get());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000149
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000150 TargetInfo ret;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000151
Sean Callanan933693b2012-02-10 01:22:05 +0000152 ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
153
154 Process *process = exe_ctx.GetProcessPtr();
155 if (process)
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000156 {
Sean Callanan933693b2012-02-10 01:22:05 +0000157 ret.byte_order = process->GetByteOrder();
158 ret.address_byte_size = process->GetAddressByteSize();
159 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000160 else
Sean Callanan933693b2012-02-10 01:22:05 +0000161 {
162 Target *target = exe_ctx.GetTargetPtr();
163 if (target)
Greg Claytonc14ee322011-09-22 04:58:26 +0000164 {
Sean Callanan933693b2012-02-10 01:22:05 +0000165 ret.byte_order = target->GetArchitecture().GetByteOrder();
166 ret.address_byte_size = target->GetArchitecture().GetAddressByteSize();
Greg Claytonc14ee322011-09-22 04:58:26 +0000167 }
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000168 }
Sean Callanan933693b2012-02-10 01:22:05 +0000169
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000170 return ret;
171}
172
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000173bool
174ClangExpressionDeclMap::AddPersistentVariable
Greg Clayton7b462cc2010-10-15 22:48:33 +0000175(
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000176 const NamedDecl *decl,
177 const ConstString &name,
Sean Callanan92adcac2011-01-13 08:53:35 +0000178 TypeFromParser parser_type,
179 bool is_result,
180 bool is_lvalue
Greg Clayton7b462cc2010-10-15 22:48:33 +0000181)
Sean Callanan2235f322010-08-11 03:57:18 +0000182{
Sean Callanan979f74d2010-12-03 01:38:59 +0000183 assert (m_parser_vars.get());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000184
Sean Callanan1582ee62013-04-18 22:06:33 +0000185 if (m_parser_vars->m_materializer && is_result)
186 {
187 Error err;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000188
Sean Callanan1582ee62013-04-18 22:06:33 +0000189 ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
190 Target *target = exe_ctx.GetTargetPtr();
191 if (target == NULL)
192 return false;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000193
Sean Callanan1582ee62013-04-18 22:06:33 +0000194 ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000195
Sean Callanan1582ee62013-04-18 22:06:33 +0000196 TypeFromUser user_type(m_ast_importer->DeportType(context,
197 parser_type.GetASTContext(),
198 parser_type.GetOpaqueQualType()),
199 context);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000200
Sean Callanan1582ee62013-04-18 22:06:33 +0000201 uint32_t offset = m_parser_vars->m_materializer->AddResultVariable(user_type, is_lvalue, m_keep_result_in_memory, err);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000202
Sean Callananf35bbbc2013-07-15 18:43:36 +0000203 ClangExpressionVariableSP var_sp = m_found_entities.CreateVariable(exe_ctx.GetBestExecutionContextScope(),
204 name,
205 user_type,
206 m_parser_vars->m_target_info.byte_order,
207 m_parser_vars->m_target_info.address_byte_size);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000208
Sean Callanan1582ee62013-04-18 22:06:33 +0000209 if (!var_sp)
210 return false;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000211
Sean Callanan1582ee62013-04-18 22:06:33 +0000212 var_sp->EnableParserVars(GetParserID());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000213
Sean Callanan1582ee62013-04-18 22:06:33 +0000214 ClangExpressionVariable::ParserVars *parser_vars = var_sp->GetParserVars(GetParserID());
215
216 parser_vars->m_named_decl = decl;
217 parser_vars->m_parser_type = parser_type;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000218
Sean Callanan1582ee62013-04-18 22:06:33 +0000219 var_sp->EnableJITVars(GetParserID());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000220
Sean Callanan1582ee62013-04-18 22:06:33 +0000221 ClangExpressionVariable::JITVars *jit_vars = var_sp->GetJITVars(GetParserID());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000222
Sean Callanan1582ee62013-04-18 22:06:33 +0000223 jit_vars->m_offset = offset;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000224
Sean Callanan1582ee62013-04-18 22:06:33 +0000225 return true;
226 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000227
Greg Clayton5160ce52013-03-27 23:08:40 +0000228 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan933693b2012-02-10 01:22:05 +0000229 ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
230 Target *target = exe_ctx.GetTargetPtr();
Greg Claytonc14ee322011-09-22 04:58:26 +0000231 if (target == NULL)
232 return false;
233
234 ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000235
236 TypeFromUser user_type(m_ast_importer->DeportType(context,
Sean Callananbb120042011-12-16 21:06:35 +0000237 parser_type.GetASTContext(),
238 parser_type.GetOpaqueQualType()),
Sean Callanane1175b72011-01-13 21:23:32 +0000239 context);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000240
Sean Callanan00f43622011-11-18 03:28:09 +0000241 if (!user_type.GetOpaqueQualType())
242 {
243 if (log)
244 log->Printf("Persistent variable's type wasn't copied successfully");
245 return false;
246 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000247
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000248 if (!m_parser_vars->m_target_info.IsValid())
249 return false;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000250
Sean Callananf35bbbc2013-07-15 18:43:36 +0000251 ClangExpressionVariableSP var_sp = m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx.GetBestExecutionContextScope (),
252 name,
253 user_type,
254 m_parser_vars->m_target_info.byte_order,
255 m_parser_vars->m_target_info.address_byte_size);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000256
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000257 if (!var_sp)
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000258 return false;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000259
Sean Callanan2cb5e522012-09-20 23:21:16 +0000260 var_sp->m_frozen_sp->SetHasCompleteType();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000261
Sean Callanan92adcac2011-01-13 08:53:35 +0000262 if (is_result)
263 var_sp->m_flags |= ClangExpressionVariable::EVNeedsFreezeDry;
264 else
265 var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget; // explicitly-declared persistent variables should persist
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000266
Sean Callanan92adcac2011-01-13 08:53:35 +0000267 if (is_lvalue)
268 {
269 var_sp->m_flags |= ClangExpressionVariable::EVIsProgramReference;
270 }
271 else
272 {
273 var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
274 var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
275 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000276
Sean Callanan35005f72013-04-12 18:10:34 +0000277 if (m_keep_result_in_memory)
278 {
279 var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget;
280 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000281
Sean Callanan92adcac2011-01-13 08:53:35 +0000282 if (log)
283 log->Printf("Created persistent variable with flags 0x%hx", var_sp->m_flags);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000284
Sean Callanan3c495c12013-01-15 23:29:36 +0000285 var_sp->EnableParserVars(GetParserID());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000286
Sean Callanan3c495c12013-01-15 23:29:36 +0000287 ClangExpressionVariable::ParserVars *parser_vars = var_sp->GetParserVars(GetParserID());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000288
Sean Callanan3c495c12013-01-15 23:29:36 +0000289 parser_vars->m_named_decl = decl;
290 parser_vars->m_parser_type = parser_type;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000291
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000292 return true;
Sean Callanan2235f322010-08-11 03:57:18 +0000293}
294
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000295bool
296ClangExpressionDeclMap::AddValueToStruct
Greg Clayton7b462cc2010-10-15 22:48:33 +0000297(
Sean Callanancc427fa2011-07-30 02:42:06 +0000298 const NamedDecl *decl,
Greg Clayton7b462cc2010-10-15 22:48:33 +0000299 const ConstString &name,
300 llvm::Value *value,
301 size_t size,
Zachary Turnera746e8e2014-07-02 17:24:07 +0000302 lldb::offset_t alignment
Greg Clayton7b462cc2010-10-15 22:48:33 +0000303)
Sean Callanan549c9f72010-07-13 21:41:46 +0000304{
Sean Callanan979f74d2010-12-03 01:38:59 +0000305 assert (m_struct_vars.get());
306 assert (m_parser_vars.get());
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000307
Sean Callanandf667652013-04-11 02:05:11 +0000308 bool is_persistent_variable = false;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000309
Greg Clayton5160ce52013-03-27 23:08:40 +0000310 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000311
Sean Callanan979f74d2010-12-03 01:38:59 +0000312 m_struct_vars->m_struct_laid_out = false;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000313
Sean Callanan3c495c12013-01-15 23:29:36 +0000314 if (m_struct_members.GetVariable(decl, GetParserID()))
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000315 return true;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000316
Sean Callanan3c495c12013-01-15 23:29:36 +0000317 ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl, GetParserID()));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000318
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000319 if (!var_sp)
Sean Callanandf667652013-04-11 02:05:11 +0000320 {
Sean Callanan3c495c12013-01-15 23:29:36 +0000321 var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl, GetParserID());
Sean Callanandf667652013-04-11 02:05:11 +0000322 is_persistent_variable = true;
323 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000324
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000325 if (!var_sp)
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000326 return false;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000327
Sean Callanan823bb4c2010-08-30 22:17:16 +0000328 if (log)
Sean Callanan00f43622011-11-18 03:28:09 +0000329 log->Printf("Adding value for (NamedDecl*)%p [%s - %s] to the structure",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000330 static_cast<const void*>(decl), name.GetCString(),
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000331 var_sp->GetName().GetCString());
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000332
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000333 // We know entity->m_parser_vars is valid because we used a parser variable
334 // to find it
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000335
Sean Callanan3c495c12013-01-15 23:29:36 +0000336 ClangExpressionVariable::ParserVars *parser_vars = var_sp->GetParserVars(GetParserID());
337
338 parser_vars->m_llvm_value = value;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000339
Sean Callanan1582ee62013-04-18 22:06:33 +0000340 if (ClangExpressionVariable::JITVars *jit_vars = var_sp->GetJITVars(GetParserID()))
341 {
342 // We already laid this out; do not touch
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000343
Sean Callanan1582ee62013-04-18 22:06:33 +0000344 if (log)
345 log->Printf("Already placed at 0x%llx", (unsigned long long)jit_vars->m_offset);
346 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000347
Sean Callanan3c495c12013-01-15 23:29:36 +0000348 var_sp->EnableJITVars(GetParserID());
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000349
Sean Callanan3c495c12013-01-15 23:29:36 +0000350 ClangExpressionVariable::JITVars *jit_vars = var_sp->GetJITVars(GetParserID());
351
352 jit_vars->m_alignment = alignment;
353 jit_vars->m_size = size;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000354
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000355 m_struct_members.AddVariable(var_sp);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000356
Sean Callanandf667652013-04-11 02:05:11 +0000357 if (m_parser_vars->m_materializer)
358 {
Sean Callanan3dd6a422013-04-11 21:16:36 +0000359 uint32_t offset = 0;
360
Sean Callanandf667652013-04-11 02:05:11 +0000361 Error err;
362
363 if (is_persistent_variable)
364 {
Sean Callanan3dd6a422013-04-11 21:16:36 +0000365 offset = m_parser_vars->m_materializer->AddPersistentVariable(var_sp, err);
Sean Callanandf667652013-04-11 02:05:11 +0000366 }
367 else
368 {
369 if (const lldb_private::Symbol *sym = parser_vars->m_lldb_sym)
Sean Callanan3dd6a422013-04-11 21:16:36 +0000370 offset = m_parser_vars->m_materializer->AddSymbol(*sym, err);
Sean Callanandf667652013-04-11 02:05:11 +0000371 else if (const RegisterInfo *reg_info = var_sp->GetRegisterInfo())
Sean Callanan3dd6a422013-04-11 21:16:36 +0000372 offset = m_parser_vars->m_materializer->AddRegister(*reg_info, err);
Sean Callanandf667652013-04-11 02:05:11 +0000373 else if (parser_vars->m_lldb_var)
Sean Callanan3dd6a422013-04-11 21:16:36 +0000374 offset = m_parser_vars->m_materializer->AddVariable(parser_vars->m_lldb_var, err);
Sean Callanandf667652013-04-11 02:05:11 +0000375 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000376
Sean Callanan3dd6a422013-04-11 21:16:36 +0000377 if (!err.Success())
378 return false;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000379
Sean Callanan3dd6a422013-04-11 21:16:36 +0000380 if (log)
381 log->Printf("Placed at 0x%llx", (unsigned long long)offset);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000382
Sean Callanan3dd6a422013-04-11 21:16:36 +0000383 jit_vars->m_offset = offset; // TODO DoStructLayout() should not change this.
Sean Callanandf667652013-04-11 02:05:11 +0000384 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000385
Sean Callanan549c9f72010-07-13 21:41:46 +0000386 return true;
387}
388
389bool
390ClangExpressionDeclMap::DoStructLayout ()
391{
Sean Callanan979f74d2010-12-03 01:38:59 +0000392 assert (m_struct_vars.get());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000393
Sean Callanan979f74d2010-12-03 01:38:59 +0000394 if (m_struct_vars->m_struct_laid_out)
Sean Callanan549c9f72010-07-13 21:41:46 +0000395 return true;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000396
Sean Callanan14b1bae2013-04-16 23:25:35 +0000397 if (!m_parser_vars->m_materializer)
398 return false;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000399
Sean Callanan14b1bae2013-04-16 23:25:35 +0000400 m_struct_vars->m_struct_alignment = m_parser_vars->m_materializer->GetStructAlignment();
401 m_struct_vars->m_struct_size = m_parser_vars->m_materializer->GetStructByteSize();
Sean Callanan979f74d2010-12-03 01:38:59 +0000402 m_struct_vars->m_struct_laid_out = true;
Sean Callanan549c9f72010-07-13 21:41:46 +0000403 return true;
404}
405
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000406bool ClangExpressionDeclMap::GetStructInfo
Greg Clayton7b462cc2010-10-15 22:48:33 +0000407(
408 uint32_t &num_elements,
409 size_t &size,
Zachary Turnera746e8e2014-07-02 17:24:07 +0000410 lldb::offset_t &alignment
Greg Clayton7b462cc2010-10-15 22:48:33 +0000411)
Sean Callanan549c9f72010-07-13 21:41:46 +0000412{
Sean Callanan979f74d2010-12-03 01:38:59 +0000413 assert (m_struct_vars.get());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000414
Sean Callanan979f74d2010-12-03 01:38:59 +0000415 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan549c9f72010-07-13 21:41:46 +0000416 return false;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000417
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000418 num_elements = m_struct_members.GetSize();
Sean Callanan979f74d2010-12-03 01:38:59 +0000419 size = m_struct_vars->m_struct_size;
420 alignment = m_struct_vars->m_struct_alignment;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000421
Sean Callanan549c9f72010-07-13 21:41:46 +0000422 return true;
423}
424
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000425bool
426ClangExpressionDeclMap::GetStructElement
Greg Clayton7b462cc2010-10-15 22:48:33 +0000427(
Sean Callanancc427fa2011-07-30 02:42:06 +0000428 const NamedDecl *&decl,
Greg Clayton7b462cc2010-10-15 22:48:33 +0000429 llvm::Value *&value,
Zachary Turnera746e8e2014-07-02 17:24:07 +0000430 lldb::offset_t &offset,
Greg Clayton7b462cc2010-10-15 22:48:33 +0000431 ConstString &name,
432 uint32_t index
433)
Sean Callanan549c9f72010-07-13 21:41:46 +0000434{
Sean Callanan979f74d2010-12-03 01:38:59 +0000435 assert (m_struct_vars.get());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000436
Sean Callanan979f74d2010-12-03 01:38:59 +0000437 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan549c9f72010-07-13 21:41:46 +0000438 return false;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000439
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000440 if (index >= m_struct_members.GetSize())
Sean Callanan549c9f72010-07-13 21:41:46 +0000441 return false;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000442
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000443 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(index));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000444
Sean Callanan3c495c12013-01-15 23:29:36 +0000445 if (!member_sp)
446 return false;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000447
Sean Callanan3c495c12013-01-15 23:29:36 +0000448 ClangExpressionVariable::ParserVars *parser_vars = member_sp->GetParserVars(GetParserID());
449 ClangExpressionVariable::JITVars *jit_vars = member_sp->GetJITVars(GetParserID());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000450
Sean Callanan3c495c12013-01-15 23:29:36 +0000451 if (!parser_vars ||
452 !jit_vars ||
Sean Callanan6f3e5ad2012-04-12 16:58:26 +0000453 !member_sp->GetValueObject())
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000454 return false;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000455
Sean Callanan3c495c12013-01-15 23:29:36 +0000456 decl = parser_vars->m_named_decl;
457 value = parser_vars->m_llvm_value;
458 offset = jit_vars->m_offset;
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000459 name = member_sp->GetName();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000460
Sean Callanan549c9f72010-07-13 21:41:46 +0000461 return true;
462}
463
Sean Callanan7ea35012010-07-27 21:39:39 +0000464bool
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000465ClangExpressionDeclMap::GetFunctionInfo
Greg Clayton7b462cc2010-10-15 22:48:33 +0000466(
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000467 const NamedDecl *decl,
Greg Clayton7b462cc2010-10-15 22:48:33 +0000468 uint64_t &ptr
469)
Sean Callanan4edba2d2010-07-27 02:07:53 +0000470{
Sean Callanan3c495c12013-01-15 23:29:36 +0000471 ClangExpressionVariableSP entity_sp(m_found_entities.GetVariable(decl, GetParserID()));
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000472
Greg Clayton8b2fe6d2010-12-14 02:59:59 +0000473 if (!entity_sp)
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000474 return false;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000475
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000476 // We know m_parser_vars is valid since we searched for the variable by
477 // its NamedDecl
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000478
Sean Callanan3c495c12013-01-15 23:29:36 +0000479 ClangExpressionVariable::ParserVars *parser_vars = entity_sp->GetParserVars(GetParserID());
480
Greg Clayton57ee3062013-07-11 22:46:58 +0000481 ptr = parser_vars->m_lldb_value.GetScalar().ULongLong();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000482
Sean Callanan64dfc9a2010-08-23 23:09:38 +0000483 return true;
Sean Callanan4edba2d2010-07-27 02:07:53 +0000484}
485
Sean Callananefe9a422011-08-16 18:09:29 +0000486static void
487FindCodeSymbolInContext
488(
489 const ConstString &name,
490 SymbolContext &sym_ctx,
491 SymbolContextList &sc_list
492)
493{
Matt Kopec00049b82013-02-27 20:13:38 +0000494 SymbolContextList temp_sc_list;
Sean Callananefe9a422011-08-16 18:09:29 +0000495 if (sym_ctx.module_sp)
Matt Kopec00049b82013-02-27 20:13:38 +0000496 sym_ctx.module_sp->FindSymbolsWithNameAndType(name, eSymbolTypeAny, temp_sc_list);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000497
Matt Kopec00049b82013-02-27 20:13:38 +0000498 if (!sc_list.GetSize() && sym_ctx.target_sp)
499 sym_ctx.target_sp->GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeAny, temp_sc_list);
500
501 unsigned temp_sc_list_size = temp_sc_list.GetSize();
502 for (unsigned i = 0; i < temp_sc_list_size; i++)
503 {
504 SymbolContext sym_ctx;
505 temp_sc_list.GetContextAtIndex(i, sym_ctx);
506 if (sym_ctx.symbol)
507 {
508 switch (sym_ctx.symbol->GetType())
509 {
510 case eSymbolTypeCode:
511 case eSymbolTypeResolver:
Greg Claytonf32db512013-10-30 21:37:46 +0000512 case eSymbolTypeReExported:
Matt Kopec00049b82013-02-27 20:13:38 +0000513 sc_list.Append(sym_ctx);
514 break;
515
516 default:
517 break;
518 }
519 }
520 }
Sean Callananefe9a422011-08-16 18:09:29 +0000521}
522
Sean Callanan5300d372010-07-31 01:32:05 +0000523bool
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000524ClangExpressionDeclMap::GetFunctionAddress
Greg Clayton7b462cc2010-10-15 22:48:33 +0000525(
526 const ConstString &name,
Greg Clayton3f5c08f2011-05-18 22:01:49 +0000527 uint64_t &func_addr
Greg Clayton7b462cc2010-10-15 22:48:33 +0000528)
Sean Callanan5300d372010-07-31 01:32:05 +0000529{
Sean Callanan979f74d2010-12-03 01:38:59 +0000530 assert (m_parser_vars.get());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000531
Greg Clayton5160ce52013-03-27 23:08:40 +0000532 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan933693b2012-02-10 01:22:05 +0000533 ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
534 Target *target = exe_ctx.GetTargetPtr();
Sean Callanan5300d372010-07-31 01:32:05 +0000535 // Back out in all cases where we're not fully initialized
Greg Claytonc14ee322011-09-22 04:58:26 +0000536 if (target == NULL)
Jim Ingham895c9822010-12-07 01:56:02 +0000537 return false;
538 if (!m_parser_vars->m_sym_ctx.target_sp)
Sean Callanan5300d372010-07-31 01:32:05 +0000539 return false;
540
Greg Clayton7a345282010-11-09 23:46:37 +0000541 SymbolContextList sc_list;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000542
Sean Callananefe9a422011-08-16 18:09:29 +0000543 FindCodeSymbolInContext(name, m_parser_vars->m_sym_ctx, sc_list);
Matt Kopec00049b82013-02-27 20:13:38 +0000544
Greg Claytonf32db512013-10-30 21:37:46 +0000545 uint32_t sc_list_size = sc_list.GetSize();
546 if (sc_list_size == 0)
Sean Callanan19b6afe2011-05-13 18:27:02 +0000547 {
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000548 // We occasionally get debug information in which a const function is reported
Sean Callanan19b6afe2011-05-13 18:27:02 +0000549 // as non-const, so the mangled name is wrong. This is a hack to compensate.
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000550
Sean Callananf4638562011-10-25 18:02:05 +0000551 if (!strncmp(name.GetCString(), "_ZN", 3) &&
552 strncmp(name.GetCString(), "_ZNK", 4))
Sean Callanan19b6afe2011-05-13 18:27:02 +0000553 {
Sean Callananf4638562011-10-25 18:02:05 +0000554 std::string fixed_scratch("_ZNK");
555 fixed_scratch.append(name.GetCString() + 3);
556 ConstString fixed_name(fixed_scratch.c_str());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000557
Sean Callanan19b6afe2011-05-13 18:27:02 +0000558 if (log)
Sean Callananf4638562011-10-25 18:02:05 +0000559 log->Printf("Failed to find symbols given non-const name %s; trying %s", name.GetCString(), fixed_name.GetCString());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000560
Sean Callananf4638562011-10-25 18:02:05 +0000561 FindCodeSymbolInContext(fixed_name, m_parser_vars->m_sym_ctx, sc_list);
Greg Claytonf32db512013-10-30 21:37:46 +0000562 sc_list_size = sc_list.GetSize();
Sean Callanan19b6afe2011-05-13 18:27:02 +0000563 }
564 }
Matt Kopec00049b82013-02-27 20:13:38 +0000565
Greg Claytonf32db512013-10-30 21:37:46 +0000566 for (uint32_t i=0; i<sc_list_size; ++i)
567 {
568 SymbolContext sym_ctx;
569 sc_list.GetContextAtIndex(i, sym_ctx);
Matt Kopec00049b82013-02-27 20:13:38 +0000570
Sean Callanan25ea6a12014-05-23 02:30:48 +0000571 lldb::addr_t callable_load_addr = LLDB_INVALID_ADDRESS;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000572
Greg Claytonf32db512013-10-30 21:37:46 +0000573 if (sym_ctx.function)
Greg Claytonf32db512013-10-30 21:37:46 +0000574 {
Sean Callanan25ea6a12014-05-23 02:30:48 +0000575 const Address func_so_addr = sym_ctx.function->GetAddressRange().GetBaseAddress();
576 if (func_so_addr.IsValid())
Greg Claytonf32db512013-10-30 21:37:46 +0000577 {
Sean Callanan25ea6a12014-05-23 02:30:48 +0000578 callable_load_addr = func_so_addr.GetCallableLoadAddress(target, false);
Greg Claytonf32db512013-10-30 21:37:46 +0000579 }
580 }
Sean Callanan25ea6a12014-05-23 02:30:48 +0000581 else if (sym_ctx.symbol)
Greg Claytonf32db512013-10-30 21:37:46 +0000582 {
Sean Callanan25ea6a12014-05-23 02:30:48 +0000583 callable_load_addr = sym_ctx.symbol->ResolveCallableAddress(*target);
584 }
585
586 if (callable_load_addr != LLDB_INVALID_ADDRESS)
587 {
588 func_addr = callable_load_addr;
589 return true;
Greg Claytonf32db512013-10-30 21:37:46 +0000590 }
591 }
592 return false;
Sean Callanan5300d372010-07-31 01:32:05 +0000593}
594
Greg Clayton084db102011-06-23 04:25:29 +0000595addr_t
Greg Clayton9191db42013-10-21 18:40:51 +0000596ClangExpressionDeclMap::GetSymbolAddress (Target &target,
597 Process *process,
598 const ConstString &name,
599 lldb::SymbolType symbol_type,
Deepak Panickald66b50c2013-10-22 12:27:43 +0000600 lldb_private::Module *module)
Sean Callananc3a16002011-01-17 23:42:46 +0000601{
Sean Callananc3a16002011-01-17 23:42:46 +0000602 SymbolContextList sc_list;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000603
Greg Clayton9191db42013-10-21 18:40:51 +0000604 if (module)
605 module->FindSymbolsWithNameAndType(name, symbol_type, sc_list);
606 else
607 target.GetImages().FindSymbolsWithNameAndType(name, symbol_type, sc_list);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000608
Greg Clayton084db102011-06-23 04:25:29 +0000609 const uint32_t num_matches = sc_list.GetSize();
610 addr_t symbol_load_addr = LLDB_INVALID_ADDRESS;
611
Sean Callanan947ccc72011-12-01 02:04:16 +0000612 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 +0000613 {
614 SymbolContext sym_ctx;
615 sc_list.GetContextAtIndex(i, sym_ctx);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000616
Greg Claytone7612132012-03-07 21:03:09 +0000617 const Address *sym_address = &sym_ctx.symbol->GetAddress();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000618
Sean Callananc6466fc2011-07-07 23:05:43 +0000619 if (!sym_address || !sym_address->IsValid())
Sean Callanan116ace22013-04-30 00:21:42 +0000620 continue;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000621
Greg Clayton084db102011-06-23 04:25:29 +0000622 if (sym_address)
623 {
624 switch (sym_ctx.symbol->GetType())
625 {
626 case eSymbolTypeCode:
627 case eSymbolTypeTrampoline:
628 symbol_load_addr = sym_address->GetCallableLoadAddress (&target);
629 break;
Matt Kopec00049b82013-02-27 20:13:38 +0000630
631 case eSymbolTypeResolver:
632 symbol_load_addr = sym_address->GetCallableLoadAddress (&target, true);
633 break;
634
Greg Clayton9191db42013-10-21 18:40:51 +0000635 case eSymbolTypeReExported:
636 {
637 ConstString reexport_name = sym_ctx.symbol->GetReExportedSymbolName();
638 if (reexport_name)
639 {
640 ModuleSP reexport_module_sp;
641 ModuleSpec reexport_module_spec;
642 reexport_module_spec.GetPlatformFileSpec() = sym_ctx.symbol->GetReExportedSymbolSharedLibrary();
643 if (reexport_module_spec.GetPlatformFileSpec())
644 {
645 reexport_module_sp = target.GetImages().FindFirstModule(reexport_module_spec);
646 if (!reexport_module_sp)
647 {
648 reexport_module_spec.GetPlatformFileSpec().GetDirectory().Clear();
649 reexport_module_sp = target.GetImages().FindFirstModule(reexport_module_spec);
650 }
651 }
652 symbol_load_addr = GetSymbolAddress(target, process, sym_ctx.symbol->GetReExportedSymbolName(), symbol_type, reexport_module_sp.get());
653 }
654 }
655 break;
656
Greg Clayton084db102011-06-23 04:25:29 +0000657 case eSymbolTypeData:
658 case eSymbolTypeRuntime:
659 case eSymbolTypeVariable:
660 case eSymbolTypeLocal:
661 case eSymbolTypeParam:
662 case eSymbolTypeInvalid:
663 case eSymbolTypeAbsolute:
Greg Clayton084db102011-06-23 04:25:29 +0000664 case eSymbolTypeException:
665 case eSymbolTypeSourceFile:
666 case eSymbolTypeHeaderFile:
667 case eSymbolTypeObjectFile:
668 case eSymbolTypeCommonBlock:
669 case eSymbolTypeBlock:
670 case eSymbolTypeVariableType:
671 case eSymbolTypeLineEntry:
672 case eSymbolTypeLineHeader:
673 case eSymbolTypeScopeBegin:
674 case eSymbolTypeScopeEnd:
675 case eSymbolTypeAdditional:
676 case eSymbolTypeCompiler:
677 case eSymbolTypeInstrumentation:
678 case eSymbolTypeUndefined:
Greg Clayton456809c2011-12-03 02:30:59 +0000679 case eSymbolTypeObjCClass:
680 case eSymbolTypeObjCMetaClass:
681 case eSymbolTypeObjCIVar:
Greg Clayton084db102011-06-23 04:25:29 +0000682 symbol_load_addr = sym_address->GetLoadAddress (&target);
683 break;
684 }
685 }
686 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000687
Sean Callanane0b23b52012-11-15 02:02:04 +0000688 if (symbol_load_addr == LLDB_INVALID_ADDRESS && process)
689 {
690 ObjCLanguageRuntime *runtime = process->GetObjCLanguageRuntime();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000691
Sean Callanane0b23b52012-11-15 02:02:04 +0000692 if (runtime)
693 {
694 symbol_load_addr = runtime->LookupRuntimeSymbol(name);
695 }
696 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000697
Greg Clayton084db102011-06-23 04:25:29 +0000698 return symbol_load_addr;
Sean Callananc3a16002011-01-17 23:42:46 +0000699}
700
Greg Clayton084db102011-06-23 04:25:29 +0000701addr_t
Sean Callanan947ccc72011-12-01 02:04:16 +0000702ClangExpressionDeclMap::GetSymbolAddress (const ConstString &name, lldb::SymbolType symbol_type)
Sean Callanand9ca42a2011-05-08 02:21:26 +0000703{
704 assert (m_parser_vars.get());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000705
Sean Callanan933693b2012-02-10 01:22:05 +0000706 if (!m_parser_vars->m_exe_ctx.GetTargetPtr())
Sean Callanand9ca42a2011-05-08 02:21:26 +0000707 return false;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000708
Sean Callanane0b23b52012-11-15 02:02:04 +0000709 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 +0000710}
711
Greg Clayton3d51b9f2012-11-27 01:52:16 +0000712const Symbol *
713ClangExpressionDeclMap::FindGlobalDataSymbol (Target &target,
Greg Clayton9191db42013-10-21 18:40:51 +0000714 const ConstString &name,
Deepak Panickald66b50c2013-10-22 12:27:43 +0000715 lldb_private::Module *module)
Sean Callanand9ca42a2011-05-08 02:21:26 +0000716{
717 SymbolContextList sc_list;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000718
Greg Clayton9191db42013-10-21 18:40:51 +0000719 if (module)
720 module->FindSymbolsWithNameAndType(name, eSymbolTypeAny, sc_list);
721 else
722 target.GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeAny, sc_list);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000723
Greg Clayton3d51b9f2012-11-27 01:52:16 +0000724 const uint32_t matches = sc_list.GetSize();
725 for (uint32_t i=0; i<matches; ++i)
Sean Callanand9ca42a2011-05-08 02:21:26 +0000726 {
727 SymbolContext sym_ctx;
Greg Clayton3d51b9f2012-11-27 01:52:16 +0000728 sc_list.GetContextAtIndex(i, sym_ctx);
729 if (sym_ctx.symbol)
730 {
731 const Symbol *symbol = sym_ctx.symbol;
732 const Address *sym_address = &symbol->GetAddress();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000733
Greg Clayton3d51b9f2012-11-27 01:52:16 +0000734 if (sym_address && sym_address->IsValid())
735 {
736 switch (symbol->GetType())
737 {
738 case eSymbolTypeData:
739 case eSymbolTypeRuntime:
740 case eSymbolTypeAbsolute:
741 case eSymbolTypeObjCClass:
742 case eSymbolTypeObjCMetaClass:
743 case eSymbolTypeObjCIVar:
744 if (symbol->GetDemangledNameIsSynthesized())
745 {
746 // If the demangled name was synthesized, then don't use it
747 // for expressions. Only let the symbol match if the mangled
748 // named matches for these symbols.
749 if (symbol->GetMangled().GetMangledName() != name)
750 break;
751 }
752 return symbol;
753
Greg Clayton9191db42013-10-21 18:40:51 +0000754 case eSymbolTypeReExported:
755 {
756 ConstString reexport_name = symbol->GetReExportedSymbolName();
757 if (reexport_name)
758 {
759 ModuleSP reexport_module_sp;
760 ModuleSpec reexport_module_spec;
761 reexport_module_spec.GetPlatformFileSpec() = symbol->GetReExportedSymbolSharedLibrary();
762 if (reexport_module_spec.GetPlatformFileSpec())
763 {
764 reexport_module_sp = target.GetImages().FindFirstModule(reexport_module_spec);
765 if (!reexport_module_sp)
766 {
767 reexport_module_spec.GetPlatformFileSpec().GetDirectory().Clear();
768 reexport_module_sp = target.GetImages().FindFirstModule(reexport_module_spec);
769 }
770 }
771 return FindGlobalDataSymbol(target, symbol->GetReExportedSymbolName(), reexport_module_sp.get());
772 }
773 }
774 break;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000775
Greg Clayton3d51b9f2012-11-27 01:52:16 +0000776 case eSymbolTypeCode: // We already lookup functions elsewhere
777 case eSymbolTypeVariable:
778 case eSymbolTypeLocal:
779 case eSymbolTypeParam:
780 case eSymbolTypeTrampoline:
781 case eSymbolTypeInvalid:
782 case eSymbolTypeException:
783 case eSymbolTypeSourceFile:
784 case eSymbolTypeHeaderFile:
785 case eSymbolTypeObjectFile:
786 case eSymbolTypeCommonBlock:
787 case eSymbolTypeBlock:
788 case eSymbolTypeVariableType:
789 case eSymbolTypeLineEntry:
790 case eSymbolTypeLineHeader:
791 case eSymbolTypeScopeBegin:
792 case eSymbolTypeScopeEnd:
793 case eSymbolTypeAdditional:
794 case eSymbolTypeCompiler:
795 case eSymbolTypeInstrumentation:
796 case eSymbolTypeUndefined:
Matt Kopec00049b82013-02-27 20:13:38 +0000797 case eSymbolTypeResolver:
Greg Clayton3d51b9f2012-11-27 01:52:16 +0000798 break;
799 }
800 }
801 }
Sean Callanand9ca42a2011-05-08 02:21:26 +0000802 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000803
Sean Callanand9ca42a2011-05-08 02:21:26 +0000804 return NULL;
805}
806
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000807lldb::VariableSP
808ClangExpressionDeclMap::FindGlobalVariable
809(
810 Target &target,
Sean Callanan1fd3f4f2011-10-12 16:59:31 +0000811 ModuleSP &module,
812 const ConstString &name,
813 ClangNamespaceDecl *namespace_decl,
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000814 TypeFromUser *type
815)
816{
817 VariableList vars;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000818
Sean Callanan1fd3f4f2011-10-12 16:59:31 +0000819 if (module && namespace_decl)
820 module->FindGlobalVariables (name, namespace_decl, true, -1, vars);
821 else
822 target.GetImages().FindGlobalVariables(name, true, -1, vars);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000823
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000824 if (vars.GetSize())
825 {
826 if (type)
827 {
828 for (size_t i = 0; i < vars.GetSize(); ++i)
829 {
830 VariableSP var_sp = vars.GetVariableAtIndex(i);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000831
Greg Clayton57ee3062013-07-11 22:46:58 +0000832 if (ClangASTContext::AreTypesSame(*type, var_sp->GetType()->GetClangFullType()))
833 return var_sp;
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000834 }
835 }
836 else
837 {
838 return vars.GetVariableAtIndex(0);
839 }
840 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000841
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000842 return VariableSP();
843}
844
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000845// Interface for ClangASTSource
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000846
Sean Callanan503aa522011-10-12 00:12:34 +0000847void
Sean Callananeddeb3b2011-10-28 23:38:38 +0000848ClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000849{
Sean Callananeddeb3b2011-10-28 23:38:38 +0000850 assert (m_ast_context);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000851
Sean Callanan8106d802013-03-08 20:04:57 +0000852 ClangASTMetrics::RegisterVisibleQuery();
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000853
Sean Callananeddeb3b2011-10-28 23:38:38 +0000854 const ConstString name(context.m_decl_name.getAsString().c_str());
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000855
Greg Clayton5160ce52013-03-27 23:08:40 +0000856 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000857
Sean Callananfb3e4302011-10-29 19:50:43 +0000858 if (GetImportInProgress())
Sean Callanan6abfabf2010-11-19 20:20:02 +0000859 {
Sean Callanan7dd98122011-10-14 20:34:21 +0000860 if (log && log->GetVerbose())
Sean Callanan6abfabf2010-11-19 20:20:02 +0000861 log->Printf("Ignoring a query during an import");
862 return;
863 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000864
Sean Callanan7dd98122011-10-14 20:34:21 +0000865 static unsigned int invocation_id = 0;
866 unsigned int current_id = invocation_id++;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000867
Sean Callanan503aa522011-10-12 00:12:34 +0000868 if (log)
869 {
870 if (!context.m_decl_context)
Sean Callananfb3e4302011-10-29 19:50:43 +0000871 log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in a NULL DeclContext", current_id, name.GetCString());
Sean Callanan503aa522011-10-12 00:12:34 +0000872 else if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context.m_decl_context))
Sean Callananfb3e4302011-10-29 19:50:43 +0000873 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 +0000874 else
Sean Callananfb3e4302011-10-29 19:50:43 +0000875 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 +0000876 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000877
Sean Callanan503aa522011-10-12 00:12:34 +0000878 if (const NamespaceDecl *namespace_context = dyn_cast<NamespaceDecl>(context.m_decl_context))
879 {
Sean Callanan1ee44b72011-10-29 01:58:46 +0000880 ClangASTImporter::NamespaceMapSP namespace_map = m_ast_importer->GetNamespaceMap(namespace_context);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000881
Sean Callanan7dd98122011-10-14 20:34:21 +0000882 if (log && log->GetVerbose())
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000883 log->Printf(" CEDM::FEVD[%u] Inspecting (NamespaceMap*)%p (%d entries)",
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000884 current_id, static_cast<void*>(namespace_map.get()),
Sean Callanan7dd98122011-10-14 20:34:21 +0000885 (int)namespace_map->size());
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000886
Sean Callananb2269162011-10-21 22:18:07 +0000887 if (!namespace_map)
888 return;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000889
Sean Callanan503aa522011-10-12 00:12:34 +0000890 for (ClangASTImporter::NamespaceMap::iterator i = namespace_map->begin(), e = namespace_map->end();
891 i != e;
892 ++i)
893 {
894 if (log)
Sean Callananfb3e4302011-10-29 19:50:43 +0000895 log->Printf(" CEDM::FEVD[%u] Searching namespace %s in module %s",
Sean Callanan7dd98122011-10-14 20:34:21 +0000896 current_id,
Sean Callanan503aa522011-10-12 00:12:34 +0000897 i->second.GetNamespaceDecl()->getNameAsString().c_str(),
898 i->first->GetFileSpec().GetFilename().GetCString());
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000899
Sean Callananebe60672011-10-13 21:50:33 +0000900 FindExternalVisibleDecls(context,
901 i->first,
902 i->second,
Sean Callanan7dd98122011-10-14 20:34:21 +0000903 current_id);
Sean Callanan503aa522011-10-12 00:12:34 +0000904 }
905 }
Sean Callanand5c17ed2011-11-15 02:11:17 +0000906 else if (isa<TranslationUnitDecl>(context.m_decl_context))
Sean Callanan503aa522011-10-12 00:12:34 +0000907 {
908 ClangNamespaceDecl namespace_decl;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000909
Sean Callanan503aa522011-10-12 00:12:34 +0000910 if (log)
Sean Callananfb3e4302011-10-29 19:50:43 +0000911 log->Printf(" CEDM::FEVD[%u] Searching the root namespace", current_id);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000912
Sean Callanan503aa522011-10-12 00:12:34 +0000913 FindExternalVisibleDecls(context,
914 lldb::ModuleSP(),
915 namespace_decl,
Sean Callanan7dd98122011-10-14 20:34:21 +0000916 current_id);
Sean Callanan503aa522011-10-12 00:12:34 +0000917 }
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000918
Sean Callananfb3e4302011-10-29 19:50:43 +0000919 if (!context.m_found.variable)
920 ClangASTSource::FindExternalVisibleDecls(context);
Sean Callanan503aa522011-10-12 00:12:34 +0000921}
922
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000923void
924ClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context,
Sean Callanan1a2c5382011-10-12 18:44:30 +0000925 lldb::ModuleSP module_sp,
Sean Callanan88972242011-10-12 01:39:28 +0000926 ClangNamespaceDecl &namespace_decl,
Sean Callanan7dd98122011-10-14 20:34:21 +0000927 unsigned int current_id)
Sean Callanan503aa522011-10-12 00:12:34 +0000928{
Sean Callananeddeb3b2011-10-28 23:38:38 +0000929 assert (m_ast_context);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000930
Greg Clayton5160ce52013-03-27 23:08:40 +0000931 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000932
Greg Clayton7a345282010-11-09 23:46:37 +0000933 SymbolContextList sc_list;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000934
Sean Callananfb3e4302011-10-29 19:50:43 +0000935 const ConstString name(context.m_decl_name.getAsString().c_str());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000936
Greg Clayton83c5cd92010-11-14 22:13:40 +0000937 const char *name_unique_cstr = name.GetCString();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000938
Greg Clayton83c5cd92010-11-14 22:13:40 +0000939 if (name_unique_cstr == NULL)
940 return;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000941
Sean Callanan5b26f272012-02-04 08:49:35 +0000942 static ConstString id_name("id");
943 static ConstString Class_name("Class");
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000944
Sean Callanan5b26f272012-02-04 08:49:35 +0000945 if (name == id_name || name == Class_name)
946 return;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000947
948 // Only look for functions by name out in our symbols if the function
Greg Clayton7b462cc2010-10-15 22:48:33 +0000949 // doesn't start with our phony prefix of '$'
Sean Callanan933693b2012-02-10 01:22:05 +0000950 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
Jason Molendab57e4a12013-11-04 09:33:30 +0000951 StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
Sean Callanan88972242011-10-12 01:39:28 +0000952 if (name_unique_cstr[0] == '$' && !namespace_decl)
953 {
954 static ConstString g_lldb_class_name ("$__lldb_class");
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000955
Sean Callanan88972242011-10-12 01:39:28 +0000956 if (name == g_lldb_class_name)
957 {
958 // Clang is looking for the type of "this"
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000959
Sean Callananc03bdd92012-02-08 03:45:08 +0000960 if (frame == NULL)
Sean Callanan88972242011-10-12 01:39:28 +0000961 return;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000962
Sean Callananc03bdd92012-02-08 03:45:08 +0000963 SymbolContext sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000964
Sean Callananc03bdd92012-02-08 03:45:08 +0000965 if (!sym_ctx.function)
Sean Callanan88972242011-10-12 01:39:28 +0000966 return;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000967
Greg Clayton685c88c2012-07-14 00:53:55 +0000968 // Get the block that defines the function
969 Block *function_block = sym_ctx.GetFunctionBlock();
970
971 if (!function_block)
972 return;
973
974 clang::DeclContext *decl_context = function_block->GetClangDeclContext();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000975
Sean Callananc03bdd92012-02-08 03:45:08 +0000976 if (!decl_context)
Sean Callanan88972242011-10-12 01:39:28 +0000977 return;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000978
Sean Callananc03bdd92012-02-08 03:45:08 +0000979 clang::CXXMethodDecl *method_decl = llvm::dyn_cast<clang::CXXMethodDecl>(decl_context);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000980
Jim Ingham5fdeed42012-10-30 23:35:54 +0000981 if (method_decl)
Sean Callanan88972242011-10-12 01:39:28 +0000982 {
Jim Ingham5fdeed42012-10-30 23:35:54 +0000983 clang::CXXRecordDecl *class_decl = method_decl->getParent();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000984
Jim Ingham5fdeed42012-10-30 23:35:54 +0000985 QualType class_qual_type(class_decl->getTypeForDecl(), 0);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000986
Jim Ingham5fdeed42012-10-30 23:35:54 +0000987 TypeFromUser class_user_type (class_qual_type.getAsOpaquePtr(),
988 &class_decl->getASTContext());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000989
Jim Ingham5fdeed42012-10-30 23:35:54 +0000990 if (log)
991 {
992 ASTDumper ast_dumper(class_qual_type);
993 log->Printf(" CEDM::FEVD[%u] Adding type for $__lldb_class: %s", current_id, ast_dumper.GetCString());
994 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000995
Sean Callananfa4fab72013-02-01 06:55:48 +0000996 TypeFromParser class_type = CopyClassType(class_user_type, current_id);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +0000997
Sean Callananfa4fab72013-02-01 06:55:48 +0000998 if (!class_type.IsValid())
999 return;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001000
Sean Callanan34cf8202013-03-12 21:22:00 +00001001 TypeSourceInfo *type_source_info = m_ast_context->getTrivialTypeSourceInfo(QualType::getFromOpaquePtr(class_type.GetOpaqueQualType()));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001002
Sean Callananfa4fab72013-02-01 06:55:48 +00001003 if (!type_source_info)
1004 return;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001005
Sean Callananfa4fab72013-02-01 06:55:48 +00001006 TypedefDecl *typedef_decl = TypedefDecl::Create(*m_ast_context,
1007 m_ast_context->getTranslationUnitDecl(),
1008 SourceLocation(),
1009 SourceLocation(),
1010 context.m_decl_name.getAsIdentifierInfo(),
1011 type_source_info);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001012
1013
Sean Callananfa4fab72013-02-01 06:55:48 +00001014 if (!typedef_decl)
1015 return;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001016
Sean Callananfa4fab72013-02-01 06:55:48 +00001017 context.AddNamedDecl(typedef_decl);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001018
Jim Ingham5fdeed42012-10-30 23:35:54 +00001019 if (method_decl->isInstance())
1020 {
1021 // self is a pointer to the object
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001022
Jim Ingham5fdeed42012-10-30 23:35:54 +00001023 QualType class_pointer_type = method_decl->getASTContext().getPointerType(class_qual_type);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001024
Jim Ingham5fdeed42012-10-30 23:35:54 +00001025 TypeFromUser self_user_type(class_pointer_type.getAsOpaquePtr(),
1026 &method_decl->getASTContext());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001027
Jim Ingham5fdeed42012-10-30 23:35:54 +00001028 m_struct_vars->m_object_pointer_type = self_user_type;
1029 }
Sean Callanan88972242011-10-12 01:39:28 +00001030 }
Jim Ingham5fdeed42012-10-30 23:35:54 +00001031 else
Sean Callananbb6e7ed2012-03-05 22:08:20 +00001032 {
Jim Ingham5fdeed42012-10-30 23:35:54 +00001033 // This branch will get hit if we are executing code in the context of a function that
1034 // claims to have an object pointer (through DW_AT_object_pointer?) but is not formally a
1035 // method of the class. In that case, just look up the "this" variable in the the current
1036 // scope and use its type.
1037 // FIXME: This code is formally correct, but clang doesn't currently emit DW_AT_object_pointer
1038 // for C++ so it hasn't actually been tested.
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001039
Jim Ingham5fdeed42012-10-30 23:35:54 +00001040 VariableList *vars = frame->GetVariableList(false);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001041
Jim Ingham5fdeed42012-10-30 23:35:54 +00001042 lldb::VariableSP this_var = vars->FindVariable(ConstString("this"));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001043
Jim Ingham5fdeed42012-10-30 23:35:54 +00001044 if (this_var &&
1045 this_var->IsInScope(frame) &&
1046 this_var->LocationIsValidForFrame (frame))
1047 {
1048 Type *this_type = this_var->GetType();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001049
Jim Ingham5fdeed42012-10-30 23:35:54 +00001050 if (!this_type)
1051 return;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001052
Greg Clayton57ee3062013-07-11 22:46:58 +00001053 ClangASTType pointee_type = this_type->GetClangForwardType().GetPointeeType();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001054
Greg Clayton57ee3062013-07-11 22:46:58 +00001055 if (pointee_type.IsValid())
Jim Ingham5fdeed42012-10-30 23:35:54 +00001056 {
Jim Ingham5fdeed42012-10-30 23:35:54 +00001057 if (log)
1058 {
1059 ASTDumper ast_dumper(this_type->GetClangFullType());
1060 log->Printf(" FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, ast_dumper.GetCString());
1061 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001062
Greg Clayton57ee3062013-07-11 22:46:58 +00001063 TypeFromUser class_user_type(pointee_type);
Sean Callananfa4fab72013-02-01 06:55:48 +00001064 AddOneType(context, class_user_type, current_id);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001065
1066
Greg Clayton57ee3062013-07-11 22:46:58 +00001067 TypeFromUser this_user_type(this_type->GetClangFullType());
Jim Ingham5fdeed42012-10-30 23:35:54 +00001068 m_struct_vars->m_object_pointer_type = this_user_type;
1069 return;
1070 }
1071 }
Sean Callananbb6e7ed2012-03-05 22:08:20 +00001072 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001073
Sean Callanan88972242011-10-12 01:39:28 +00001074 return;
1075 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001076
Sean Callanan88972242011-10-12 01:39:28 +00001077 static ConstString g_lldb_objc_class_name ("$__lldb_objc_class");
1078 if (name == g_lldb_objc_class_name)
1079 {
1080 // Clang is looking for the type of "*self"
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001081
Sean Callanan88972242011-10-12 01:39:28 +00001082 if (!frame)
1083 return;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001084
Sean Callanand5c17ed2011-11-15 02:11:17 +00001085 SymbolContext sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001086
Sean Callanand5c17ed2011-11-15 02:11:17 +00001087 if (!sym_ctx.function)
1088 return;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001089
Greg Clayton685c88c2012-07-14 00:53:55 +00001090 // Get the block that defines the function
1091 Block *function_block = sym_ctx.GetFunctionBlock();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001092
Greg Clayton685c88c2012-07-14 00:53:55 +00001093 if (!function_block)
1094 return;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001095
Greg Clayton685c88c2012-07-14 00:53:55 +00001096 clang::DeclContext *decl_context = function_block->GetClangDeclContext();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001097
Sean Callanand5c17ed2011-11-15 02:11:17 +00001098 if (!decl_context)
1099 return;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001100
Sean Callanand5c17ed2011-11-15 02:11:17 +00001101 clang::ObjCMethodDecl *method_decl = llvm::dyn_cast<clang::ObjCMethodDecl>(decl_context);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001102
Jim Ingham5fdeed42012-10-30 23:35:54 +00001103 if (method_decl)
Sean Callanand5c17ed2011-11-15 02:11:17 +00001104 {
Jim Ingham5fdeed42012-10-30 23:35:54 +00001105 ObjCInterfaceDecl* self_interface = method_decl->getClassInterface();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001106
Jim Ingham5fdeed42012-10-30 23:35:54 +00001107 if (!self_interface)
Sean Callananc03bdd92012-02-08 03:45:08 +00001108 return;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001109
Jim Ingham5fdeed42012-10-30 23:35:54 +00001110 const clang::Type *interface_type = self_interface->getTypeForDecl();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001111
Sean Callanandfb87d62013-04-09 21:30:48 +00001112 if (!interface_type)
1113 return; // This is unlikely, but we have seen crashes where this occurred
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001114
Jim Ingham5fdeed42012-10-30 23:35:54 +00001115 TypeFromUser class_user_type(QualType(interface_type, 0).getAsOpaquePtr(),
1116 &method_decl->getASTContext());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001117
Jim Ingham5fdeed42012-10-30 23:35:54 +00001118 if (log)
1119 {
1120 ASTDumper ast_dumper(interface_type);
1121 log->Printf(" FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, ast_dumper.GetCString());
1122 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001123
Sean Callananfa4fab72013-02-01 06:55:48 +00001124 AddOneType(context, class_user_type, current_id);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001125
Jim Ingham5fdeed42012-10-30 23:35:54 +00001126 if (method_decl->isInstanceMethod())
1127 {
1128 // self is a pointer to the object
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001129
Jim Ingham5fdeed42012-10-30 23:35:54 +00001130 QualType class_pointer_type = method_decl->getASTContext().getObjCObjectPointerType(QualType(interface_type, 0));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001131
Jim Ingham5fdeed42012-10-30 23:35:54 +00001132 TypeFromUser self_user_type(class_pointer_type.getAsOpaquePtr(),
1133 &method_decl->getASTContext());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001134
Jim Ingham5fdeed42012-10-30 23:35:54 +00001135 m_struct_vars->m_object_pointer_type = self_user_type;
1136 }
1137 else
1138 {
1139 // self is a Class pointer
1140 QualType class_type = method_decl->getASTContext().getObjCClassType();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001141
Jim Ingham5fdeed42012-10-30 23:35:54 +00001142 TypeFromUser self_user_type(class_type.getAsOpaquePtr(),
1143 &method_decl->getASTContext());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001144
Jim Ingham5fdeed42012-10-30 23:35:54 +00001145 m_struct_vars->m_object_pointer_type = self_user_type;
1146 }
1147
1148 return;
Sean Callananc03bdd92012-02-08 03:45:08 +00001149 }
1150 else
1151 {
Jim Ingham5fdeed42012-10-30 23:35:54 +00001152 // This branch will get hit if we are executing code in the context of a function that
1153 // claims to have an object pointer (through DW_AT_object_pointer?) but is not formally a
1154 // method of the class. In that case, just look up the "self" variable in the the current
1155 // scope and use its type.
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001156
Jim Ingham5fdeed42012-10-30 23:35:54 +00001157 VariableList *vars = frame->GetVariableList(false);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001158
Jim Ingham5fdeed42012-10-30 23:35:54 +00001159 lldb::VariableSP self_var = vars->FindVariable(ConstString("self"));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001160
Jim Ingham5fdeed42012-10-30 23:35:54 +00001161 if (self_var &&
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001162 self_var->IsInScope(frame) &&
Jim Ingham5fdeed42012-10-30 23:35:54 +00001163 self_var->LocationIsValidForFrame (frame))
1164 {
1165 Type *self_type = self_var->GetType();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001166
Jim Ingham5fdeed42012-10-30 23:35:54 +00001167 if (!self_type)
1168 return;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001169
Greg Clayton57ee3062013-07-11 22:46:58 +00001170 ClangASTType self_clang_type = self_type->GetClangFullType();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001171
Greg Clayton57ee3062013-07-11 22:46:58 +00001172 if (self_clang_type.IsObjCClassType())
Jim Ingham5fdeed42012-10-30 23:35:54 +00001173 {
Sean Callanana2868d42013-01-19 01:49:02 +00001174 return;
1175 }
Greg Clayton57ee3062013-07-11 22:46:58 +00001176 else if (self_clang_type.IsObjCObjectPointerType())
Sean Callanana2868d42013-01-19 01:49:02 +00001177 {
Greg Clayton57ee3062013-07-11 22:46:58 +00001178 self_clang_type = self_clang_type.GetPointeeType();
1179
1180 if (!self_clang_type)
Sean Callanane5270592013-04-26 22:54:19 +00001181 return;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001182
Jim Ingham5fdeed42012-10-30 23:35:54 +00001183 if (log)
1184 {
1185 ASTDumper ast_dumper(self_type->GetClangFullType());
1186 log->Printf(" FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, ast_dumper.GetCString());
1187 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001188
Greg Clayton57ee3062013-07-11 22:46:58 +00001189 TypeFromUser class_user_type (self_clang_type);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001190
Sean Callananfa4fab72013-02-01 06:55:48 +00001191 AddOneType(context, class_user_type, current_id);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001192
Greg Clayton57ee3062013-07-11 22:46:58 +00001193 TypeFromUser self_user_type(self_type->GetClangFullType());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001194
Jim Ingham5fdeed42012-10-30 23:35:54 +00001195 m_struct_vars->m_object_pointer_type = self_user_type;
1196 return;
1197 }
1198 }
Sean Callananc03bdd92012-02-08 03:45:08 +00001199 }
1200
Sean Callanan88972242011-10-12 01:39:28 +00001201 return;
1202 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001203
Sean Callanan88972242011-10-12 01:39:28 +00001204 // any other $__lldb names should be weeded out now
1205 if (!::strncmp(name_unique_cstr, "$__lldb", sizeof("$__lldb") - 1))
1206 return;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001207
Sean Callanan88972242011-10-12 01:39:28 +00001208 do
1209 {
1210 if (!target)
1211 break;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001212
Sean Callanan88972242011-10-12 01:39:28 +00001213 ClangASTContext *scratch_clang_ast_context = target->GetScratchClangASTContext();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001214
Sean Callanan88972242011-10-12 01:39:28 +00001215 if (!scratch_clang_ast_context)
1216 break;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001217
Sean Callanan88972242011-10-12 01:39:28 +00001218 ASTContext *scratch_ast_context = scratch_clang_ast_context->getASTContext();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001219
Sean Callanan88972242011-10-12 01:39:28 +00001220 if (!scratch_ast_context)
1221 break;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001222
Sean Callanan88972242011-10-12 01:39:28 +00001223 TypeDecl *ptype_type_decl = m_parser_vars->m_persistent_vars->GetPersistentType(name);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001224
Sean Callanan88972242011-10-12 01:39:28 +00001225 if (!ptype_type_decl)
1226 break;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001227
Sean Callanan0eed0d42011-12-06 03:41:14 +00001228 Decl *parser_ptype_decl = m_ast_importer->CopyDecl(m_ast_context, scratch_ast_context, ptype_type_decl);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001229
Sean Callanan88972242011-10-12 01:39:28 +00001230 if (!parser_ptype_decl)
1231 break;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001232
Sean Callanan88972242011-10-12 01:39:28 +00001233 TypeDecl *parser_ptype_type_decl = dyn_cast<TypeDecl>(parser_ptype_decl);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001234
Sean Callanan88972242011-10-12 01:39:28 +00001235 if (!parser_ptype_type_decl)
1236 break;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001237
Sean Callanan88972242011-10-12 01:39:28 +00001238 if (log)
Sean Callananfb3e4302011-10-29 19:50:43 +00001239 log->Printf(" CEDM::FEVD[%u] Found persistent type %s", current_id, name.GetCString());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001240
Sean Callanan88972242011-10-12 01:39:28 +00001241 context.AddNamedDecl(parser_ptype_type_decl);
1242 } while (0);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001243
Sean Callanan88972242011-10-12 01:39:28 +00001244 ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001245
Sean Callanan88972242011-10-12 01:39:28 +00001246 if (pvar_sp)
1247 {
Sean Callanan7dd98122011-10-14 20:34:21 +00001248 AddOneVariable(context, pvar_sp, current_id);
Sean Callanan88972242011-10-12 01:39:28 +00001249 return;
1250 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001251
Sean Callanan88972242011-10-12 01:39:28 +00001252 const char *reg_name(&name.GetCString()[1]);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001253
Sean Callanan933693b2012-02-10 01:22:05 +00001254 if (m_parser_vars->m_exe_ctx.GetRegisterContext())
Sean Callanan88972242011-10-12 01:39:28 +00001255 {
Sean Callanan933693b2012-02-10 01:22:05 +00001256 const RegisterInfo *reg_info(m_parser_vars->m_exe_ctx.GetRegisterContext()->GetRegisterInfoByName(reg_name));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001257
Sean Callanan88972242011-10-12 01:39:28 +00001258 if (reg_info)
Sean Callanan35c7f982011-10-18 16:46:55 +00001259 {
1260 if (log)
Sean Callananfb3e4302011-10-29 19:50:43 +00001261 log->Printf(" CEDM::FEVD[%u] Found register %s", current_id, reg_info->name);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001262
Sean Callanan7dd98122011-10-14 20:34:21 +00001263 AddOneRegister(context, reg_info, current_id);
Sean Callanan35c7f982011-10-18 16:46:55 +00001264 }
Sean Callanan88972242011-10-12 01:39:28 +00001265 }
1266 }
1267 else
Sean Callanan8ade1042010-07-27 00:55:47 +00001268 {
Sean Callanan69b53412011-08-06 00:28:14 +00001269 ValueObjectSP valobj;
1270 VariableSP var;
1271 Error err;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001272
Sean Callanan88972242011-10-12 01:39:28 +00001273 if (frame && !namespace_decl)
Greg Clayton7b462cc2010-10-15 22:48:33 +00001274 {
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001275 valobj = frame->GetValueForVariableExpressionPath(name_unique_cstr,
1276 eNoDynamicValues,
Jason Molenda0060a382014-10-16 08:15:11 +00001277 StackFrame::eExpressionPathOptionCheckPtrVsMember |
Jason Molenda0060a382014-10-16 08:15:11 +00001278 StackFrame::eExpressionPathOptionsNoFragileObjcIvar |
1279 StackFrame::eExpressionPathOptionsNoSyntheticChildren |
Jason Molendab57e4a12013-11-04 09:33:30 +00001280 StackFrame::eExpressionPathOptionsNoSyntheticArrayRange,
Sean Callanan503aa522011-10-12 00:12:34 +00001281 var,
1282 err);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001283
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001284 // If we found a variable in scope, no need to pull up function names
Sean Callanan9a028512012-08-09 00:50:26 +00001285 if (err.Success() && var)
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001286 {
Sean Callanan0712f462011-11-29 22:03:21 +00001287 AddOneVariable(context, var, valobj, current_id);
Sean Callananca4e0fd2011-10-12 20:29:25 +00001288 context.m_found.variable = true;
Sean Callananefa7d1f2011-10-25 20:36:57 +00001289 return;
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001290 }
Greg Clayton7b462cc2010-10-15 22:48:33 +00001291 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001292
Sean Callananfd1ba912011-12-10 04:03:38 +00001293 if (target)
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001294 {
Sean Callanan1fd3f4f2011-10-12 16:59:31 +00001295 var = FindGlobalVariable (*target,
Sean Callanan1a2c5382011-10-12 18:44:30 +00001296 module_sp,
Sean Callanan1fd3f4f2011-10-12 16:59:31 +00001297 name,
1298 &namespace_decl,
Greg Claytonc14ee322011-09-22 04:58:26 +00001299 NULL);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001300
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001301 if (var)
1302 {
Sean Callanan9b3569b2011-12-10 03:12:34 +00001303 valobj = ValueObjectVariable::Create(target, var);
Sean Callanan0712f462011-11-29 22:03:21 +00001304 AddOneVariable(context, var, valobj, current_id);
Sean Callananca4e0fd2011-10-12 20:29:25 +00001305 context.m_found.variable = true;
Sean Callananfd1ba912011-12-10 04:03:38 +00001306 return;
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001307 }
1308 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001309
Sean Callananca4e0fd2011-10-12 20:29:25 +00001310 if (!context.m_found.variable)
Greg Clayton7b462cc2010-10-15 22:48:33 +00001311 {
Sean Callanan9df05fb2012-02-10 22:52:19 +00001312 const bool include_inlines = false;
Greg Clayton931180e2011-01-27 06:44:37 +00001313 const bool append = false;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001314
Sean Callanan1a2c5382011-10-12 18:44:30 +00001315 if (namespace_decl && module_sp)
Sean Callanan25ea08e2011-10-12 17:38:09 +00001316 {
Sean Callanan3ae61792012-02-15 17:14:49 +00001317 const bool include_symbols = false;
1318
Sean Callanan1a2c5382011-10-12 18:44:30 +00001319 module_sp->FindFunctions(name,
1320 &namespace_decl,
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001321 eFunctionNameTypeBase,
Sean Callanan1a2c5382011-10-12 18:44:30 +00001322 include_symbols,
Sean Callanan9df05fb2012-02-10 22:52:19 +00001323 include_inlines,
Sean Callanan1a2c5382011-10-12 18:44:30 +00001324 append,
1325 sc_list);
Sean Callanan25ea08e2011-10-12 17:38:09 +00001326 }
Jim Ingham28eb5712012-10-12 17:34:26 +00001327 else if (target && !namespace_decl)
Sean Callanan25ea08e2011-10-12 17:38:09 +00001328 {
Sean Callanan3ae61792012-02-15 17:14:49 +00001329 const bool include_symbols = true;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001330
Sean Callanan308a3c52012-07-28 00:21:01 +00001331 // TODO Fix FindFunctions so that it doesn't return
1332 // instance methods for eFunctionNameTypeBase.
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001333
Sean Callanan25ea08e2011-10-12 17:38:09 +00001334 target->GetImages().FindFunctions(name,
Greg Clayton43fe2172013-04-03 02:00:15 +00001335 eFunctionNameTypeFull,
Sean Callanan25ea08e2011-10-12 17:38:09 +00001336 include_symbols,
Sean Callanan9df05fb2012-02-10 22:52:19 +00001337 include_inlines,
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001338 append,
Sean Callanan25ea08e2011-10-12 17:38:09 +00001339 sc_list);
1340 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001341
Sean Callanand9ca42a2011-05-08 02:21:26 +00001342 if (sc_list.GetSize())
Greg Clayton7b462cc2010-10-15 22:48:33 +00001343 {
Greg Claytondc25a0b2013-10-31 16:59:47 +00001344 Symbol *extern_symbol = NULL;
1345 Symbol *non_extern_symbol = NULL;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001346
Sean Callanand9ca42a2011-05-08 02:21:26 +00001347 for (uint32_t index = 0, num_indices = sc_list.GetSize();
1348 index < num_indices;
1349 ++index)
Greg Clayton7b462cc2010-10-15 22:48:33 +00001350 {
Sean Callanand9ca42a2011-05-08 02:21:26 +00001351 SymbolContext sym_ctx;
1352 sc_list.GetContextAtIndex(index, sym_ctx);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001353
Sean Callanand9ca42a2011-05-08 02:21:26 +00001354 if (sym_ctx.function)
1355 {
Sean Callanan308a3c52012-07-28 00:21:01 +00001356 clang::DeclContext *decl_ctx = sym_ctx.function->GetClangDeclContext();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001357
Sean Callanan956dca92013-04-27 01:57:44 +00001358 if (!decl_ctx)
1359 continue;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001360
Sean Callanan308a3c52012-07-28 00:21:01 +00001361 // Filter out class/instance methods.
1362 if (dyn_cast<clang::ObjCMethodDecl>(decl_ctx))
1363 continue;
1364 if (dyn_cast<clang::CXXMethodDecl>(decl_ctx))
1365 continue;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001366
Sean Callanan485f7322013-04-24 00:34:41 +00001367 AddOneFunction(context, sym_ctx.function, NULL, current_id);
Sean Callananca4e0fd2011-10-12 20:29:25 +00001368 context.m_found.function_with_type_info = true;
1369 context.m_found.function = true;
Sean Callanand9ca42a2011-05-08 02:21:26 +00001370 }
1371 else if (sym_ctx.symbol)
1372 {
Greg Claytonfc56a012014-06-13 21:57:58 +00001373 if (sym_ctx.symbol->GetType() == eSymbolTypeReExported && target)
Greg Claytondc25a0b2013-10-31 16:59:47 +00001374 {
1375 sym_ctx.symbol = sym_ctx.symbol->ResolveReExportedSymbol(*target);
1376 if (sym_ctx.symbol == NULL)
1377 continue;
1378 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001379
Greg Claytondc25a0b2013-10-31 16:59:47 +00001380 if (sym_ctx.symbol->IsExternal())
1381 extern_symbol = sym_ctx.symbol;
Sean Callanand9ca42a2011-05-08 02:21:26 +00001382 else
Greg Claytondc25a0b2013-10-31 16:59:47 +00001383 non_extern_symbol = sym_ctx.symbol;
Sean Callanand9ca42a2011-05-08 02:21:26 +00001384 }
Greg Clayton7b462cc2010-10-15 22:48:33 +00001385 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001386
Sean Callananca4e0fd2011-10-12 20:29:25 +00001387 if (!context.m_found.function_with_type_info)
Greg Clayton7b462cc2010-10-15 22:48:33 +00001388 {
Greg Claytondc25a0b2013-10-31 16:59:47 +00001389 if (extern_symbol)
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001390 {
Greg Claytondc25a0b2013-10-31 16:59:47 +00001391 AddOneFunction (context, NULL, extern_symbol, current_id);
1392 context.m_found.function = true;
1393 }
1394 else if (non_extern_symbol)
1395 {
1396 AddOneFunction (context, NULL, non_extern_symbol, current_id);
Sean Callananca4e0fd2011-10-12 20:29:25 +00001397 context.m_found.function = true;
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001398 }
Sean Callanand9ca42a2011-05-08 02:21:26 +00001399 }
Greg Clayton7b462cc2010-10-15 22:48:33 +00001400 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001401
Jim Ingham5c42d8a2013-05-15 18:27:08 +00001402 if (target && !context.m_found.variable && !namespace_decl)
Greg Clayton7b462cc2010-10-15 22:48:33 +00001403 {
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001404 // We couldn't find a non-symbol variable for this. Now we'll hunt for a generic
Sean Callanand9ca42a2011-05-08 02:21:26 +00001405 // data symbol, and -- if it is found -- treat it as a variable.
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001406
Greg Clayton3d51b9f2012-11-27 01:52:16 +00001407 const Symbol *data_symbol = FindGlobalDataSymbol(*target, name);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001408
Sean Callanand9ca42a2011-05-08 02:21:26 +00001409 if (data_symbol)
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001410 {
Sean Callanan92cdbc82014-02-19 23:37:25 +00001411 std::string warning("got name from symbols: ");
1412 warning.append(name.AsCString());
1413 const unsigned diag_id = m_ast_context->getDiagnostics().getCustomDiagID(clang::DiagnosticsEngine::Level::Warning, "%0");
1414 m_ast_context->getDiagnostics().Report(diag_id) << warning.c_str();
Sean Callanan7dd98122011-10-14 20:34:21 +00001415 AddOneGenericVariable(context, *data_symbol, current_id);
Sean Callananca4e0fd2011-10-12 20:29:25 +00001416 context.m_found.variable = true;
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001417 }
Greg Clayton526e5af2010-11-13 03:52:47 +00001418 }
Sean Callanan3883b5a2010-09-07 21:49:41 +00001419 }
Sean Callananfb40b0d2011-10-27 02:06:03 +00001420 }
Sean Callanan6b4067c2010-07-17 00:43:37 +00001421}
Greg Claytona2721472011-06-25 00:44:06 +00001422
Saleem Abdulrasoola68f7b62014-03-20 06:08:36 +00001423//static clang_type_t
1424//MaybePromoteToBlockPointerType
1425//(
1426// ASTContext *ast_context,
1427// clang_type_t candidate_type
1428//)
1429//{
1430// if (!candidate_type)
1431// return candidate_type;
1432//
1433// QualType candidate_qual_type = QualType::getFromOpaquePtr(candidate_type);
1434//
1435// const PointerType *candidate_pointer_type = dyn_cast<PointerType>(candidate_qual_type);
1436//
1437// if (!candidate_pointer_type)
1438// return candidate_type;
1439//
1440// QualType pointee_qual_type = candidate_pointer_type->getPointeeType();
1441//
1442// const RecordType *pointee_record_type = dyn_cast<RecordType>(pointee_qual_type);
1443//
1444// if (!pointee_record_type)
1445// return candidate_type;
1446//
1447// RecordDecl *pointee_record_decl = pointee_record_type->getDecl();
1448//
1449// if (!pointee_record_decl->isRecord())
1450// return candidate_type;
1451//
1452// if (!pointee_record_decl->getName().startswith(llvm::StringRef("__block_literal_")))
1453// return candidate_type;
1454//
1455// QualType generic_function_type = ast_context->getFunctionNoProtoType(ast_context->UnknownAnyTy);
1456// QualType block_pointer_type = ast_context->getBlockPointerType(generic_function_type);
1457//
1458// return block_pointer_type.getAsOpaquePtr();
1459//}
Sean Callanan75383bf2012-03-06 21:56:33 +00001460
Greg Clayton57ee3062013-07-11 22:46:58 +00001461bool
1462ClangExpressionDeclMap::GetVariableValue (VariableSP &var,
1463 lldb_private::Value &var_location,
1464 TypeFromUser *user_type,
1465 TypeFromParser *parser_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001466{
Greg Clayton5160ce52013-03-27 23:08:40 +00001467 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001468
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001469 Type *var_type = var->GetType();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001470
1471 if (!var_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001472 {
Sean Callananea22d422010-07-16 00:09:46 +00001473 if (log)
1474 log->PutCString("Skipped a definition because it has no type");
Greg Clayton57ee3062013-07-11 22:46:58 +00001475 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001476 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001477
Greg Clayton57ee3062013-07-11 22:46:58 +00001478 ClangASTType var_clang_type = var_type->GetClangFullType();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001479
Greg Clayton57ee3062013-07-11 22:46:58 +00001480 if (!var_clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001481 {
Sean Callananea22d422010-07-16 00:09:46 +00001482 if (log)
1483 log->PutCString("Skipped a definition because it has no Clang type");
Greg Clayton57ee3062013-07-11 22:46:58 +00001484 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001485 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001486
Sean Callanancc427fa2011-07-30 02:42:06 +00001487 ASTContext *ast = var_type->GetClangASTContext().getASTContext();
Greg Clayton57ee3062013-07-11 22:46:58 +00001488
Greg Clayton6beaaa62011-01-17 03:46:26 +00001489 if (!ast)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001490 {
Sean Callananea22d422010-07-16 00:09:46 +00001491 if (log)
1492 log->PutCString("There is no AST context for the current execution context");
Greg Clayton57ee3062013-07-11 22:46:58 +00001493 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001494 }
Greg Clayton57ee3062013-07-11 22:46:58 +00001495 //var_clang_type = MaybePromoteToBlockPointerType (ast, var_clang_type);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001496
Sean Callanan6b4067c2010-07-17 00:43:37 +00001497 DWARFExpression &var_location_expr = var->LocationExpression();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001498
Sean Callanan933693b2012-02-10 01:22:05 +00001499 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001500 Error err;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001501
Sean Callanan7b5805d2013-01-18 21:20:51 +00001502 if (var->GetLocationIsConstantValueData())
1503 {
1504 DataExtractor const_value_extractor;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001505
Sean Callanan7b5805d2013-01-18 21:20:51 +00001506 if (var_location_expr.GetExpressionData(const_value_extractor))
1507 {
Greg Clayton57ee3062013-07-11 22:46:58 +00001508 var_location = Value(const_value_extractor.GetDataStart(), const_value_extractor.GetByteSize());
1509 var_location.SetValueType(Value::eValueTypeHostAddress);
Sean Callanan7b5805d2013-01-18 21:20:51 +00001510 }
1511 else
1512 {
1513 if (log)
1514 log->Printf("Error evaluating constant variable: %s", err.AsCString());
Greg Clayton57ee3062013-07-11 22:46:58 +00001515 return false;
Sean Callanan7b5805d2013-01-18 21:20:51 +00001516 }
1517 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001518
Greg Clayton57ee3062013-07-11 22:46:58 +00001519 ClangASTType type_to_use = GuardedCopyType(var_clang_type);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001520
Greg Clayton57ee3062013-07-11 22:46:58 +00001521 if (!type_to_use)
Sean Callanan1d180662010-07-20 23:31:16 +00001522 {
Greg Clayton57ee3062013-07-11 22:46:58 +00001523 if (log)
1524 log->Printf("Couldn't copy a variable's type into the parser's AST context");
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001525
Greg Clayton57ee3062013-07-11 22:46:58 +00001526 return false;
Sean Callanan1d180662010-07-20 23:31:16 +00001527 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001528
Greg Clayton57ee3062013-07-11 22:46:58 +00001529 if (parser_type)
1530 *parser_type = TypeFromParser(type_to_use);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001531
Greg Clayton57ee3062013-07-11 22:46:58 +00001532 if (var_location.GetContextType() == Value::eContextTypeInvalid)
1533 var_location.SetClangType(type_to_use);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001534
Greg Clayton57ee3062013-07-11 22:46:58 +00001535 if (var_location.GetValueType() == Value::eValueTypeFileAddress)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001536 {
1537 SymbolContext var_sc;
1538 var->CalculateSymbolContext(&var_sc);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001539
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001540 if (!var_sc.module_sp)
Michael Sartain89c862f2013-08-07 19:05:15 +00001541 return false;
Greg Clayton3046e662013-07-10 01:23:25 +00001542
Greg Clayton57ee3062013-07-11 22:46:58 +00001543 Address so_addr(var_location.GetScalar().ULongLong(), var_sc.module_sp->GetSectionList());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001544
Greg Claytonc14ee322011-09-22 04:58:26 +00001545 lldb::addr_t load_addr = so_addr.GetLoadAddress(target);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001546
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001547 if (load_addr != LLDB_INVALID_ADDRESS)
1548 {
Greg Clayton57ee3062013-07-11 22:46:58 +00001549 var_location.GetScalar() = load_addr;
1550 var_location.SetValueType(Value::eValueTypeLoadAddress);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001551 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001552 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001553
Sean Callanan1d180662010-07-20 23:31:16 +00001554 if (user_type)
Greg Clayton57ee3062013-07-11 22:46:58 +00001555 *user_type = TypeFromUser(var_clang_type);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001556
Greg Clayton57ee3062013-07-11 22:46:58 +00001557 return true;
Sean Callanan6b4067c2010-07-17 00:43:37 +00001558}
1559
1560void
Sean Callanan0712f462011-11-29 22:03:21 +00001561ClangExpressionDeclMap::AddOneVariable (NameSearchContext &context, VariableSP var, ValueObjectSP valobj, unsigned int current_id)
Sean Callanan6b4067c2010-07-17 00:43:37 +00001562{
Sean Callanan979f74d2010-12-03 01:38:59 +00001563 assert (m_parser_vars.get());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001564
Greg Clayton5160ce52013-03-27 23:08:40 +00001565 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001566
Sean Callanan1d180662010-07-20 23:31:16 +00001567 TypeFromUser ut;
1568 TypeFromParser pt;
Greg Clayton57ee3062013-07-11 22:46:58 +00001569 Value var_location;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001570
Greg Clayton57ee3062013-07-11 22:46:58 +00001571 if (!GetVariableValue (var, var_location, &ut, &pt))
1572 return;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001573
Sean Callanancf128622012-03-15 01:53:17 +00001574 clang::QualType parser_opaque_type = QualType::getFromOpaquePtr(pt.GetOpaqueQualType());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001575
Sean Callanane2d47482012-03-21 17:13:20 +00001576 if (parser_opaque_type.isNull())
1577 return;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001578
Sean Callanancf128622012-03-15 01:53:17 +00001579 if (const clang::Type *parser_type = parser_opaque_type.getTypePtr())
1580 {
1581 if (const TagType *tag_type = dyn_cast<TagType>(parser_type))
1582 CompleteType(tag_type->getDecl());
Sean Callananf4c0a222013-12-20 04:09:05 +00001583 if (const ObjCObjectPointerType *objc_object_ptr_type = dyn_cast<ObjCObjectPointerType>(parser_type))
1584 CompleteType(objc_object_ptr_type->getInterfaceDecl());
Sean Callanancf128622012-03-15 01:53:17 +00001585 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001586
1587
Greg Clayton57ee3062013-07-11 22:46:58 +00001588 bool is_reference = pt.IsReferenceType();
Sean Callanan98298012011-10-27 19:41:13 +00001589
Greg Clayton57ee3062013-07-11 22:46:58 +00001590 NamedDecl *var_decl = NULL;
Sean Callanan98298012011-10-27 19:41:13 +00001591 if (is_reference)
Greg Clayton57ee3062013-07-11 22:46:58 +00001592 var_decl = context.AddVarDecl(pt);
Sean Callanan98298012011-10-27 19:41:13 +00001593 else
Greg Clayton57ee3062013-07-11 22:46:58 +00001594 var_decl = context.AddVarDecl(pt.GetLValueReferenceType());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001595
Greg Clayton7b462cc2010-10-15 22:48:33 +00001596 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001597 ConstString entity_name(decl_name.c_str());
Sean Callanan0712f462011-11-29 22:03:21 +00001598 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (valobj));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001599
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001600 assert (entity.get());
Sean Callanan3c495c12013-01-15 23:29:36 +00001601 entity->EnableParserVars(GetParserID());
1602 ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID());
1603 parser_vars->m_parser_type = pt;
1604 parser_vars->m_named_decl = var_decl;
1605 parser_vars->m_llvm_value = NULL;
1606 parser_vars->m_lldb_value = var_location;
1607 parser_vars->m_lldb_var = var;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001608
Sean Callanan98298012011-10-27 19:41:13 +00001609 if (is_reference)
1610 entity->m_flags |= ClangExpressionVariable::EVTypeIsReference;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001611
Sean Callananea22d422010-07-16 00:09:46 +00001612 if (log)
Greg Clayton7b462cc2010-10-15 22:48:33 +00001613 {
Sean Callanan82695d62011-11-07 23:32:52 +00001614 ASTDumper orig_dumper(ut.GetOpaqueQualType());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001615 ASTDumper ast_dumper(var_decl);
Sean Callanan82695d62011-11-07 23:32:52 +00001616 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 +00001617 }
Sean Callanan468574b2010-06-22 23:46:24 +00001618}
1619
1620void
Sean Callanan2235f322010-08-11 03:57:18 +00001621ClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001622 ClangExpressionVariableSP &pvar_sp,
Sean Callanan7dd98122011-10-14 20:34:21 +00001623 unsigned int current_id)
Sean Callanan2235f322010-08-11 03:57:18 +00001624{
Greg Clayton5160ce52013-03-27 23:08:40 +00001625 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001626
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001627 TypeFromUser user_type (pvar_sp->GetTypeFromUser());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001628
Greg Clayton57ee3062013-07-11 22:46:58 +00001629 TypeFromParser parser_type (GuardedCopyType(user_type));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001630
Sean Callanane0a64f72011-12-01 21:04:37 +00001631 if (!parser_type.GetOpaqueQualType())
1632 {
1633 if (log)
1634 log->Printf(" CEDM::FEVD[%u] Couldn't import type for pvar %s", current_id, pvar_sp->GetName().GetCString());
1635 return;
1636 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001637
Greg Clayton57ee3062013-07-11 22:46:58 +00001638 NamedDecl *var_decl = context.AddVarDecl(parser_type.GetLValueReferenceType());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001639
Sean Callanan3c495c12013-01-15 23:29:36 +00001640 pvar_sp->EnableParserVars(GetParserID());
1641 ClangExpressionVariable::ParserVars *parser_vars = pvar_sp->GetParserVars(GetParserID());
1642 parser_vars->m_parser_type = parser_type;
Greg Clayton57ee3062013-07-11 22:46:58 +00001643 parser_vars->m_named_decl = var_decl;
1644 parser_vars->m_llvm_value = NULL;
1645 parser_vars->m_lldb_value.Clear();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001646
Sean Callanan823bb4c2010-08-30 22:17:16 +00001647 if (log)
Sean Callanan530782942010-11-01 23:22:47 +00001648 {
Greg Clayton64bc6ca2011-10-20 00:47:21 +00001649 ASTDumper ast_dumper(var_decl);
Sean Callananfb3e4302011-10-29 19:50:43 +00001650 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 +00001651 }
Sean Callanan2235f322010-08-11 03:57:18 +00001652}
1653
Sean Callanan348b5892010-11-30 00:27:43 +00001654void
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001655ClangExpressionDeclMap::AddOneGenericVariable(NameSearchContext &context,
Greg Clayton3d51b9f2012-11-27 01:52:16 +00001656 const Symbol &symbol,
Sean Callanan7dd98122011-10-14 20:34:21 +00001657 unsigned int current_id)
Sean Callanand9ca42a2011-05-08 02:21:26 +00001658{
1659 assert(m_parser_vars.get());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001660
Greg Clayton5160ce52013-03-27 23:08:40 +00001661 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001662
Sean Callanan933693b2012-02-10 01:22:05 +00001663 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
Greg Claytonc14ee322011-09-22 04:58:26 +00001664
1665 if (target == NULL)
1666 return;
1667
1668 ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001669
Greg Clayton57ee3062013-07-11 22:46:58 +00001670 TypeFromUser user_type (ClangASTContext::GetBasicType(scratch_ast_context, eBasicTypeVoid).GetPointerType().GetLValueReferenceType());
1671 TypeFromParser parser_type (ClangASTContext::GetBasicType(m_ast_context, eBasicTypeVoid).GetPointerType().GetLValueReferenceType());
1672 NamedDecl *var_decl = context.AddVarDecl(parser_type);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001673
Sean Callanand9ca42a2011-05-08 02:21:26 +00001674 std::string decl_name(context.m_decl_name.getAsString());
1675 ConstString entity_name(decl_name.c_str());
Sean Callanan933693b2012-02-10 01:22:05 +00001676 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope (),
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001677 entity_name,
Sean Callanand9ca42a2011-05-08 02:21:26 +00001678 user_type,
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001679 m_parser_vars->m_target_info.byte_order,
1680 m_parser_vars->m_target_info.address_byte_size));
Sean Callanand9ca42a2011-05-08 02:21:26 +00001681 assert (entity.get());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001682
Greg Clayton57ee3062013-07-11 22:46:58 +00001683 entity->EnableParserVars(GetParserID());
1684 ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID());
1685
Greg Clayton3d51b9f2012-11-27 01:52:16 +00001686 const Address &symbol_address = symbol.GetAddress();
Greg Claytonc14ee322011-09-22 04:58:26 +00001687 lldb::addr_t symbol_load_addr = symbol_address.GetLoadAddress(target);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001688
Greg Clayton57ee3062013-07-11 22:46:58 +00001689 //parser_vars->m_lldb_value.SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
1690 parser_vars->m_lldb_value.SetClangType(user_type);
1691 parser_vars->m_lldb_value.GetScalar() = symbol_load_addr;
1692 parser_vars->m_lldb_value.SetValueType(Value::eValueTypeLoadAddress);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001693
Sean Callanan3c495c12013-01-15 23:29:36 +00001694 parser_vars->m_parser_type = parser_type;
1695 parser_vars->m_named_decl = var_decl;
1696 parser_vars->m_llvm_value = NULL;
Sean Callanan3c495c12013-01-15 23:29:36 +00001697 parser_vars->m_lldb_sym = &symbol;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001698
Sean Callanand9ca42a2011-05-08 02:21:26 +00001699 if (log)
1700 {
Greg Clayton64bc6ca2011-10-20 00:47:21 +00001701 ASTDumper ast_dumper(var_decl);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001702
Sean Callananfb3e4302011-10-29 19:50:43 +00001703 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 +00001704 }
1705}
1706
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001707bool
Sean Callanan77502262011-05-12 23:54:16 +00001708ClangExpressionDeclMap::ResolveUnknownTypes()
1709{
Greg Clayton5160ce52013-03-27 23:08:40 +00001710 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan933693b2012-02-10 01:22:05 +00001711 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
Greg Claytonc14ee322011-09-22 04:58:26 +00001712
1713 ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
Sean Callanan77502262011-05-12 23:54:16 +00001714
1715 for (size_t index = 0, num_entities = m_found_entities.GetSize();
1716 index < num_entities;
1717 ++index)
1718 {
1719 ClangExpressionVariableSP entity = m_found_entities.GetVariableAtIndex(index);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001720
Sean Callanan3c495c12013-01-15 23:29:36 +00001721 ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001722
Sean Callanan77502262011-05-12 23:54:16 +00001723 if (entity->m_flags & ClangExpressionVariable::EVUnknownType)
1724 {
Sean Callanan3c495c12013-01-15 23:29:36 +00001725 const NamedDecl *named_decl = parser_vars->m_named_decl;
Sean Callanan77502262011-05-12 23:54:16 +00001726 const VarDecl *var_decl = dyn_cast<VarDecl>(named_decl);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001727
Sean Callanan77502262011-05-12 23:54:16 +00001728 if (!var_decl)
1729 {
1730 if (log)
1731 log->Printf("Entity of unknown type does not have a VarDecl");
1732 return false;
1733 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001734
Sean Callanan77502262011-05-12 23:54:16 +00001735 if (log)
1736 {
Greg Clayton64bc6ca2011-10-20 00:47:21 +00001737 ASTDumper ast_dumper(const_cast<VarDecl*>(var_decl));
1738 log->Printf("Variable of unknown type now has Decl %s", ast_dumper.GetCString());
Sean Callanan77502262011-05-12 23:54:16 +00001739 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001740
Sean Callanan77502262011-05-12 23:54:16 +00001741 QualType var_type = var_decl->getType();
1742 TypeFromParser parser_type(var_type.getAsOpaquePtr(), &var_decl->getASTContext());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001743
Sean Callanan00f43622011-11-18 03:28:09 +00001744 lldb::clang_type_t copied_type = m_ast_importer->CopyType(scratch_ast_context, &var_decl->getASTContext(), var_type.getAsOpaquePtr());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001745
Sean Callanane0a64f72011-12-01 21:04:37 +00001746 if (!copied_type)
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001747 {
Sean Callanane0a64f72011-12-01 21:04:37 +00001748 if (log)
1749 log->Printf("ClangExpressionDeclMap::ResolveUnknownType - Couldn't import the type for a variable");
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001750
Jim Inghamf94e1792012-08-11 00:35:26 +00001751 return (bool) lldb::ClangExpressionVariableSP();
Sean Callanane0a64f72011-12-01 21:04:37 +00001752 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001753
Sean Callanan77502262011-05-12 23:54:16 +00001754 TypeFromUser user_type(copied_type, scratch_ast_context);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001755
Greg Clayton57ee3062013-07-11 22:46:58 +00001756// parser_vars->m_lldb_value.SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
1757 parser_vars->m_lldb_value.SetClangType(user_type);
Sean Callanan3c495c12013-01-15 23:29:36 +00001758 parser_vars->m_parser_type = parser_type;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001759
Greg Clayton57ee3062013-07-11 22:46:58 +00001760 entity->SetClangType(user_type);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001761
Sean Callanan77502262011-05-12 23:54:16 +00001762 entity->m_flags &= ~(ClangExpressionVariable::EVUnknownType);
1763 }
1764 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001765
Sean Callanan77502262011-05-12 23:54:16 +00001766 return true;
1767}
1768
Sean Callanand9ca42a2011-05-08 02:21:26 +00001769void
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001770ClangExpressionDeclMap::AddOneRegister (NameSearchContext &context,
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001771 const RegisterInfo *reg_info,
Sean Callanan7dd98122011-10-14 20:34:21 +00001772 unsigned int current_id)
Sean Callanan348b5892010-11-30 00:27:43 +00001773{
Greg Clayton5160ce52013-03-27 23:08:40 +00001774 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001775
Greg Clayton57ee3062013-07-11 22:46:58 +00001776 ClangASTType clang_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (m_ast_context,
1777 reg_info->encoding,
1778 reg_info->byte_size * 8);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001779
Greg Clayton57ee3062013-07-11 22:46:58 +00001780 if (!clang_type)
Sean Callanan348b5892010-11-30 00:27:43 +00001781 {
Johnny Chene95fcf72011-08-09 22:52:27 +00001782 if (log)
Sean Callanan7dd98122011-10-14 20:34:21 +00001783 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 +00001784 return;
1785 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001786
Greg Clayton57ee3062013-07-11 22:46:58 +00001787 TypeFromParser parser_clang_type (clang_type);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001788
Greg Clayton57ee3062013-07-11 22:46:58 +00001789 NamedDecl *var_decl = context.AddVarDecl(parser_clang_type);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001790
Sean Callanan933693b2012-02-10 01:22:05 +00001791 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(),
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001792 m_parser_vars->m_target_info.byte_order,
1793 m_parser_vars->m_target_info.address_byte_size));
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001794 assert (entity.get());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001795
Sean Callanan348b5892010-11-30 00:27:43 +00001796 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001797 entity->SetName (ConstString (decl_name.c_str()));
1798 entity->SetRegisterInfo (reg_info);
Sean Callanan3c495c12013-01-15 23:29:36 +00001799 entity->EnableParserVars(GetParserID());
1800 ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID());
Greg Clayton57ee3062013-07-11 22:46:58 +00001801 parser_vars->m_parser_type = parser_clang_type;
1802 parser_vars->m_named_decl = var_decl;
1803 parser_vars->m_llvm_value = NULL;
1804 parser_vars->m_lldb_value.Clear();
Sean Callananf673e762012-02-15 01:40:39 +00001805 entity->m_flags |= ClangExpressionVariable::EVBareRegister;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001806
Sean Callananf673e762012-02-15 01:40:39 +00001807 if (log)
Sean Callanan348b5892010-11-30 00:27:43 +00001808 {
Greg Clayton64bc6ca2011-10-20 00:47:21 +00001809 ASTDumper ast_dumper(var_decl);
Sean Callananfb3e4302011-10-29 19:50:43 +00001810 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 +00001811 }
1812}
1813
Sean Callanan2235f322010-08-11 03:57:18 +00001814void
Greg Clayton3f5c08f2011-05-18 22:01:49 +00001815ClangExpressionDeclMap::AddOneFunction (NameSearchContext &context,
Greg Clayton57ee3062013-07-11 22:46:58 +00001816 Function* function,
Sean Callanan7dd98122011-10-14 20:34:21 +00001817 Symbol* symbol,
1818 unsigned int current_id)
Sean Callanan468574b2010-06-22 23:46:24 +00001819{
Sean Callanan979f74d2010-12-03 01:38:59 +00001820 assert (m_parser_vars.get());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001821
Greg Clayton5160ce52013-03-27 23:08:40 +00001822 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001823
Greg Clayton57ee3062013-07-11 22:46:58 +00001824 NamedDecl *function_decl = NULL;
Sean Callanan77eaf442011-07-08 00:39:14 +00001825 const Address *fun_address = NULL;
Greg Clayton57ee3062013-07-11 22:46:58 +00001826 ClangASTType function_clang_type;
Matt Kopec00049b82013-02-27 20:13:38 +00001827
1828 bool is_indirect_function = false;
1829
Greg Clayton57ee3062013-07-11 22:46:58 +00001830 if (function)
Sean Callanan8ade1042010-07-27 00:55:47 +00001831 {
Greg Clayton57ee3062013-07-11 22:46:58 +00001832 Type *function_type = function->GetType();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001833
Greg Clayton57ee3062013-07-11 22:46:58 +00001834 if (!function_type)
Sean Callanan8ade1042010-07-27 00:55:47 +00001835 {
1836 if (log)
Sean Callanan7dd98122011-10-14 20:34:21 +00001837 log->PutCString(" Skipped a function because it has no type");
Sean Callanan8ade1042010-07-27 00:55:47 +00001838 return;
1839 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001840
Greg Clayton57ee3062013-07-11 22:46:58 +00001841 function_clang_type = function_type->GetClangFullType();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001842
Greg Clayton57ee3062013-07-11 22:46:58 +00001843 if (!function_clang_type)
Sean Callanan8ade1042010-07-27 00:55:47 +00001844 {
1845 if (log)
Sean Callanan7dd98122011-10-14 20:34:21 +00001846 log->PutCString(" Skipped a function because it has no Clang type");
Sean Callanan8ade1042010-07-27 00:55:47 +00001847 return;
1848 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001849
Greg Clayton57ee3062013-07-11 22:46:58 +00001850 fun_address = &function->GetAddressRange().GetBaseAddress();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001851
Greg Clayton57ee3062013-07-11 22:46:58 +00001852 ClangASTType copied_function_type = GuardedCopyType(function_clang_type);
1853 if (copied_function_type)
Greg Clayton64bc6ca2011-10-20 00:47:21 +00001854 {
Greg Clayton57ee3062013-07-11 22:46:58 +00001855 function_decl = context.AddFunDecl(copied_function_type);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001856
Greg Clayton57ee3062013-07-11 22:46:58 +00001857 if (!function_decl)
Sean Callanan485f7322013-04-24 00:34:41 +00001858 {
1859 if (log)
1860 {
1861 log->Printf (" Failed to create a function decl for '%s' {0x%8.8" PRIx64 "}",
Greg Clayton57ee3062013-07-11 22:46:58 +00001862 function_type->GetName().GetCString(),
1863 function_type->GetID());
Sean Callanan485f7322013-04-24 00:34:41 +00001864 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001865
Sean Callanan485f7322013-04-24 00:34:41 +00001866 return;
1867 }
Greg Clayton64bc6ca2011-10-20 00:47:21 +00001868 }
1869 else
1870 {
1871 // We failed to copy the type we found
1872 if (log)
1873 {
Daniel Malead01b2952012-11-29 21:49:15 +00001874 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 +00001875 function_type->GetName().GetCString(),
1876 function_type->GetID());
Greg Clayton64bc6ca2011-10-20 00:47:21 +00001877 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001878
Sean Callananed8d58f2011-11-16 00:40:13 +00001879 return;
Greg Clayton64bc6ca2011-10-20 00:47:21 +00001880 }
Sean Callanan8ade1042010-07-27 00:55:47 +00001881 }
1882 else if (symbol)
1883 {
Greg Claytone7612132012-03-07 21:03:09 +00001884 fun_address = &symbol->GetAddress();
Greg Clayton57ee3062013-07-11 22:46:58 +00001885 function_decl = context.AddGenericFunDecl();
Matt Kopec00049b82013-02-27 20:13:38 +00001886 is_indirect_function = symbol->IsIndirect();
Sean Callanan8ade1042010-07-27 00:55:47 +00001887 }
1888 else
1889 {
1890 if (log)
Sean Callanan7dd98122011-10-14 20:34:21 +00001891 log->PutCString(" AddOneFunction called with no function and no symbol");
Sean Callanan8ade1042010-07-27 00:55:47 +00001892 return;
1893 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001894
Sean Callanan933693b2012-02-10 01:22:05 +00001895 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
Greg Claytonc14ee322011-09-22 04:58:26 +00001896
Matt Kopec00049b82013-02-27 20:13:38 +00001897 lldb::addr_t load_addr = fun_address->GetCallableLoadAddress(target, is_indirect_function);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001898
Greg Clayton57ee3062013-07-11 22:46:58 +00001899 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope (),
1900 m_parser_vars->m_target_info.byte_order,
1901 m_parser_vars->m_target_info.address_byte_size));
1902 assert (entity.get());
1903
1904 std::string decl_name(context.m_decl_name.getAsString());
1905 entity->SetName(ConstString(decl_name.c_str()));
1906 entity->SetClangType (function_clang_type);
1907 entity->EnableParserVars(GetParserID());
1908
1909 ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001910
Sean Callanan9be9d172013-03-19 01:45:02 +00001911 if (load_addr != LLDB_INVALID_ADDRESS)
1912 {
Greg Clayton57ee3062013-07-11 22:46:58 +00001913 parser_vars->m_lldb_value.SetValueType(Value::eValueTypeLoadAddress);
1914 parser_vars->m_lldb_value.GetScalar() = load_addr;
Sean Callanan9be9d172013-03-19 01:45:02 +00001915 }
1916 else
1917 {
1918 // We have to try finding a file address.
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001919
Sean Callanan9be9d172013-03-19 01:45:02 +00001920 lldb::addr_t file_addr = fun_address->GetFileAddress();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001921
Greg Clayton57ee3062013-07-11 22:46:58 +00001922 parser_vars->m_lldb_value.SetValueType(Value::eValueTypeFileAddress);
1923 parser_vars->m_lldb_value.GetScalar() = file_addr;
Sean Callanan9be9d172013-03-19 01:45:02 +00001924 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001925
Greg Clayton57ee3062013-07-11 22:46:58 +00001926
1927 parser_vars->m_named_decl = function_decl;
Sean Callanan3c495c12013-01-15 23:29:36 +00001928 parser_vars->m_llvm_value = NULL;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001929
Sean Callananea22d422010-07-16 00:09:46 +00001930 if (log)
Greg Clayton7b462cc2010-10-15 22:48:33 +00001931 {
Greg Clayton57ee3062013-07-11 22:46:58 +00001932 ASTDumper ast_dumper(function_decl);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001933
Sean Callanan308a3c52012-07-28 00:21:01 +00001934 StreamString ss;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001935
Sean Callanan308a3c52012-07-28 00:21:01 +00001936 fun_address->Dump(&ss, m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(), Address::DumpStyleResolvedDescription);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001937
Sean Callanan308a3c52012-07-28 00:21:01 +00001938 log->Printf(" CEDM::FEVD[%u] Found %s function %s (description %s), returned %s",
Sean Callanan7dd98122011-10-14 20:34:21 +00001939 current_id,
Greg Clayton57ee3062013-07-11 22:46:58 +00001940 (function ? "specific" : "generic"),
Sean Callanan308a3c52012-07-28 00:21:01 +00001941 decl_name.c_str(),
1942 ss.GetData(),
Greg Clayton64bc6ca2011-10-20 00:47:21 +00001943 ast_dumper.GetCString());
Greg Clayton7b462cc2010-10-15 22:48:33 +00001944 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001945}
Sean Callanan5666b672010-08-04 01:02:13 +00001946
Sean Callananfa4fab72013-02-01 06:55:48 +00001947TypeFromParser
1948ClangExpressionDeclMap::CopyClassType(TypeFromUser &ut,
1949 unsigned int current_id)
Sean Callanan5666b672010-08-04 01:02:13 +00001950{
Greg Clayton57ee3062013-07-11 22:46:58 +00001951 ClangASTType copied_clang_type = GuardedCopyType(ut);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001952
Greg Clayton57ee3062013-07-11 22:46:58 +00001953 if (!copied_clang_type)
Sean Callanane0a64f72011-12-01 21:04:37 +00001954 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001955 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001956
Sean Callananfa4fab72013-02-01 06:55:48 +00001957 if (log)
1958 log->Printf("ClangExpressionDeclMap::CopyClassType - Couldn't import the type");
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001959
Sean Callananfa4fab72013-02-01 06:55:48 +00001960 return TypeFromParser();
Sean Callanane0a64f72011-12-01 21:04:37 +00001961 }
Sean Callananfa4fab72013-02-01 06:55:48 +00001962
Greg Clayton57ee3062013-07-11 22:46:58 +00001963 if (copied_clang_type.IsAggregateType() && copied_clang_type.GetCompleteType ())
Sean Callananfc55f5d2010-09-21 00:44:12 +00001964 {
Greg Clayton57ee3062013-07-11 22:46:58 +00001965 ClangASTType void_clang_type = ClangASTContext::GetBasicType(m_ast_context, eBasicTypeVoid);
1966 ClangASTType void_ptr_clang_type = void_clang_type.GetPointerType();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001967
Greg Clayton57ee3062013-07-11 22:46:58 +00001968 ClangASTType method_type = ClangASTContext::CreateFunctionType (m_ast_context,
1969 void_clang_type,
1970 &void_ptr_clang_type,
Sean Callananc1b732d2011-11-01 18:07:13 +00001971 1,
1972 false,
Greg Clayton57ee3062013-07-11 22:46:58 +00001973 copied_clang_type.GetTypeQualifiers());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001974
Greg Clayton0fffff52010-09-24 05:15:53 +00001975 const bool is_virtual = false;
1976 const bool is_static = false;
1977 const bool is_inline = false;
Greg Claytonf51de672010-10-01 02:31:07 +00001978 const bool is_explicit = false;
Sean Callananc8324752011-11-02 18:09:01 +00001979 const bool is_attr_used = true;
Sean Callanandbb58392011-11-02 01:38:59 +00001980 const bool is_artificial = false;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001981
Greg Clayton57ee3062013-07-11 22:46:58 +00001982 copied_clang_type.AddMethodToCXXRecordType ("$__lldb_expr",
1983 method_type,
1984 lldb::eAccessPublic,
1985 is_virtual,
1986 is_static,
1987 is_inline,
1988 is_explicit,
1989 is_attr_used,
1990 is_artificial);
Sean Callananfc55f5d2010-09-21 00:44:12 +00001991 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001992
Greg Clayton57ee3062013-07-11 22:46:58 +00001993 return TypeFromParser(copied_clang_type);
Sean Callananfa4fab72013-02-01 06:55:48 +00001994}
1995
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001996void
1997ClangExpressionDeclMap::AddOneType(NameSearchContext &context,
Sean Callananfa4fab72013-02-01 06:55:48 +00001998 TypeFromUser &ut,
1999 unsigned int current_id)
2000{
Greg Clayton57ee3062013-07-11 22:46:58 +00002001 ClangASTType copied_clang_type = GuardedCopyType(ut);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00002002
Greg Clayton57ee3062013-07-11 22:46:58 +00002003 if (!copied_clang_type)
Sean Callananfa4fab72013-02-01 06:55:48 +00002004 {
Greg Clayton5160ce52013-03-27 23:08:40 +00002005 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callananfa4fab72013-02-01 06:55:48 +00002006
2007 if (log)
2008 log->Printf("ClangExpressionDeclMap::AddOneType - Couldn't import the type");
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00002009
Sean Callananfa4fab72013-02-01 06:55:48 +00002010 return;
2011 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00002012
Greg Clayton57ee3062013-07-11 22:46:58 +00002013 context.AddTypeDecl(copied_clang_type);
Sean Callanan5666b672010-08-04 01:02:13 +00002014}