blob: 43c8a5fb1bcbbdfe54ed39401d11b7781e067e63 [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 Molendab57e4a12013-11-04 09:33:30 +00001277 StackFrame::eExpressionPathOptionCheckPtrVsMember ||
1278 StackFrame::eExpressionPathOptionsAllowDirectIVarAccess ||
1279 StackFrame::eExpressionPathOptionsNoFragileObjcIvar ||
1280 StackFrame::eExpressionPathOptionsNoSyntheticChildren ||
1281 StackFrame::eExpressionPathOptionsNoSyntheticArrayRange,
Sean Callanan503aa522011-10-12 00:12:34 +00001282 var,
1283 err);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001284
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001285 // If we found a variable in scope, no need to pull up function names
Sean Callanan9a028512012-08-09 00:50:26 +00001286 if (err.Success() && var)
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001287 {
Sean Callanan0712f462011-11-29 22:03:21 +00001288 AddOneVariable(context, var, valobj, current_id);
Sean Callananca4e0fd2011-10-12 20:29:25 +00001289 context.m_found.variable = true;
Sean Callananefa7d1f2011-10-25 20:36:57 +00001290 return;
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001291 }
Greg Clayton7b462cc2010-10-15 22:48:33 +00001292 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001293
Sean Callananfd1ba912011-12-10 04:03:38 +00001294 if (target)
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001295 {
Sean Callanan1fd3f4f2011-10-12 16:59:31 +00001296 var = FindGlobalVariable (*target,
Sean Callanan1a2c5382011-10-12 18:44:30 +00001297 module_sp,
Sean Callanan1fd3f4f2011-10-12 16:59:31 +00001298 name,
1299 &namespace_decl,
Greg Claytonc14ee322011-09-22 04:58:26 +00001300 NULL);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001301
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001302 if (var)
1303 {
Sean Callanan9b3569b2011-12-10 03:12:34 +00001304 valobj = ValueObjectVariable::Create(target, var);
Sean Callanan0712f462011-11-29 22:03:21 +00001305 AddOneVariable(context, var, valobj, current_id);
Sean Callananca4e0fd2011-10-12 20:29:25 +00001306 context.m_found.variable = true;
Sean Callananfd1ba912011-12-10 04:03:38 +00001307 return;
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001308 }
1309 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001310
Sean Callananca4e0fd2011-10-12 20:29:25 +00001311 if (!context.m_found.variable)
Greg Clayton7b462cc2010-10-15 22:48:33 +00001312 {
Sean Callanan9df05fb2012-02-10 22:52:19 +00001313 const bool include_inlines = false;
Greg Clayton931180e2011-01-27 06:44:37 +00001314 const bool append = false;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001315
Sean Callanan1a2c5382011-10-12 18:44:30 +00001316 if (namespace_decl && module_sp)
Sean Callanan25ea08e2011-10-12 17:38:09 +00001317 {
Sean Callanan3ae61792012-02-15 17:14:49 +00001318 const bool include_symbols = false;
1319
Sean Callanan1a2c5382011-10-12 18:44:30 +00001320 module_sp->FindFunctions(name,
1321 &namespace_decl,
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001322 eFunctionNameTypeBase,
Sean Callanan1a2c5382011-10-12 18:44:30 +00001323 include_symbols,
Sean Callanan9df05fb2012-02-10 22:52:19 +00001324 include_inlines,
Sean Callanan1a2c5382011-10-12 18:44:30 +00001325 append,
1326 sc_list);
Sean Callanan25ea08e2011-10-12 17:38:09 +00001327 }
Jim Ingham28eb5712012-10-12 17:34:26 +00001328 else if (target && !namespace_decl)
Sean Callanan25ea08e2011-10-12 17:38:09 +00001329 {
Sean Callanan3ae61792012-02-15 17:14:49 +00001330 const bool include_symbols = true;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001331
Sean Callanan308a3c52012-07-28 00:21:01 +00001332 // TODO Fix FindFunctions so that it doesn't return
1333 // instance methods for eFunctionNameTypeBase.
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001334
Sean Callanan25ea08e2011-10-12 17:38:09 +00001335 target->GetImages().FindFunctions(name,
Greg Clayton43fe2172013-04-03 02:00:15 +00001336 eFunctionNameTypeFull,
Sean Callanan25ea08e2011-10-12 17:38:09 +00001337 include_symbols,
Sean Callanan9df05fb2012-02-10 22:52:19 +00001338 include_inlines,
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001339 append,
Sean Callanan25ea08e2011-10-12 17:38:09 +00001340 sc_list);
1341 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001342
Sean Callanand9ca42a2011-05-08 02:21:26 +00001343 if (sc_list.GetSize())
Greg Clayton7b462cc2010-10-15 22:48:33 +00001344 {
Greg Claytondc25a0b2013-10-31 16:59:47 +00001345 Symbol *extern_symbol = NULL;
1346 Symbol *non_extern_symbol = NULL;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001347
Sean Callanand9ca42a2011-05-08 02:21:26 +00001348 for (uint32_t index = 0, num_indices = sc_list.GetSize();
1349 index < num_indices;
1350 ++index)
Greg Clayton7b462cc2010-10-15 22:48:33 +00001351 {
Sean Callanand9ca42a2011-05-08 02:21:26 +00001352 SymbolContext sym_ctx;
1353 sc_list.GetContextAtIndex(index, sym_ctx);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001354
Sean Callanand9ca42a2011-05-08 02:21:26 +00001355 if (sym_ctx.function)
1356 {
Sean Callanan308a3c52012-07-28 00:21:01 +00001357 clang::DeclContext *decl_ctx = sym_ctx.function->GetClangDeclContext();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001358
Sean Callanan956dca92013-04-27 01:57:44 +00001359 if (!decl_ctx)
1360 continue;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001361
Sean Callanan308a3c52012-07-28 00:21:01 +00001362 // Filter out class/instance methods.
1363 if (dyn_cast<clang::ObjCMethodDecl>(decl_ctx))
1364 continue;
1365 if (dyn_cast<clang::CXXMethodDecl>(decl_ctx))
1366 continue;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001367
Sean Callanan485f7322013-04-24 00:34:41 +00001368 AddOneFunction(context, sym_ctx.function, NULL, current_id);
Sean Callananca4e0fd2011-10-12 20:29:25 +00001369 context.m_found.function_with_type_info = true;
1370 context.m_found.function = true;
Sean Callanand9ca42a2011-05-08 02:21:26 +00001371 }
1372 else if (sym_ctx.symbol)
1373 {
Greg Claytonfc56a012014-06-13 21:57:58 +00001374 if (sym_ctx.symbol->GetType() == eSymbolTypeReExported && target)
Greg Claytondc25a0b2013-10-31 16:59:47 +00001375 {
1376 sym_ctx.symbol = sym_ctx.symbol->ResolveReExportedSymbol(*target);
1377 if (sym_ctx.symbol == NULL)
1378 continue;
1379 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001380
Greg Claytondc25a0b2013-10-31 16:59:47 +00001381 if (sym_ctx.symbol->IsExternal())
1382 extern_symbol = sym_ctx.symbol;
Sean Callanand9ca42a2011-05-08 02:21:26 +00001383 else
Greg Claytondc25a0b2013-10-31 16:59:47 +00001384 non_extern_symbol = sym_ctx.symbol;
Sean Callanand9ca42a2011-05-08 02:21:26 +00001385 }
Greg Clayton7b462cc2010-10-15 22:48:33 +00001386 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001387
Sean Callananca4e0fd2011-10-12 20:29:25 +00001388 if (!context.m_found.function_with_type_info)
Greg Clayton7b462cc2010-10-15 22:48:33 +00001389 {
Greg Claytondc25a0b2013-10-31 16:59:47 +00001390 if (extern_symbol)
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001391 {
Greg Claytondc25a0b2013-10-31 16:59:47 +00001392 AddOneFunction (context, NULL, extern_symbol, current_id);
1393 context.m_found.function = true;
1394 }
1395 else if (non_extern_symbol)
1396 {
1397 AddOneFunction (context, NULL, non_extern_symbol, current_id);
Sean Callananca4e0fd2011-10-12 20:29:25 +00001398 context.m_found.function = true;
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001399 }
Sean Callanand9ca42a2011-05-08 02:21:26 +00001400 }
Greg Clayton7b462cc2010-10-15 22:48:33 +00001401 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001402
Jim Ingham5c42d8a2013-05-15 18:27:08 +00001403 if (target && !context.m_found.variable && !namespace_decl)
Greg Clayton7b462cc2010-10-15 22:48:33 +00001404 {
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001405 // We couldn't find a non-symbol variable for this. Now we'll hunt for a generic
Sean Callanand9ca42a2011-05-08 02:21:26 +00001406 // data symbol, and -- if it is found -- treat it as a variable.
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001407
Greg Clayton3d51b9f2012-11-27 01:52:16 +00001408 const Symbol *data_symbol = FindGlobalDataSymbol(*target, name);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001409
Sean Callanand9ca42a2011-05-08 02:21:26 +00001410 if (data_symbol)
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001411 {
Sean Callanan92cdbc82014-02-19 23:37:25 +00001412 std::string warning("got name from symbols: ");
1413 warning.append(name.AsCString());
1414 const unsigned diag_id = m_ast_context->getDiagnostics().getCustomDiagID(clang::DiagnosticsEngine::Level::Warning, "%0");
1415 m_ast_context->getDiagnostics().Report(diag_id) << warning.c_str();
Sean Callanan7dd98122011-10-14 20:34:21 +00001416 AddOneGenericVariable(context, *data_symbol, current_id);
Sean Callananca4e0fd2011-10-12 20:29:25 +00001417 context.m_found.variable = true;
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001418 }
Greg Clayton526e5af2010-11-13 03:52:47 +00001419 }
Sean Callanan3883b5a2010-09-07 21:49:41 +00001420 }
Sean Callananfb40b0d2011-10-27 02:06:03 +00001421 }
Sean Callanan6b4067c2010-07-17 00:43:37 +00001422}
Greg Claytona2721472011-06-25 00:44:06 +00001423
Saleem Abdulrasoola68f7b62014-03-20 06:08:36 +00001424//static clang_type_t
1425//MaybePromoteToBlockPointerType
1426//(
1427// ASTContext *ast_context,
1428// clang_type_t candidate_type
1429//)
1430//{
1431// if (!candidate_type)
1432// return candidate_type;
1433//
1434// QualType candidate_qual_type = QualType::getFromOpaquePtr(candidate_type);
1435//
1436// const PointerType *candidate_pointer_type = dyn_cast<PointerType>(candidate_qual_type);
1437//
1438// if (!candidate_pointer_type)
1439// return candidate_type;
1440//
1441// QualType pointee_qual_type = candidate_pointer_type->getPointeeType();
1442//
1443// const RecordType *pointee_record_type = dyn_cast<RecordType>(pointee_qual_type);
1444//
1445// if (!pointee_record_type)
1446// return candidate_type;
1447//
1448// RecordDecl *pointee_record_decl = pointee_record_type->getDecl();
1449//
1450// if (!pointee_record_decl->isRecord())
1451// return candidate_type;
1452//
1453// if (!pointee_record_decl->getName().startswith(llvm::StringRef("__block_literal_")))
1454// return candidate_type;
1455//
1456// QualType generic_function_type = ast_context->getFunctionNoProtoType(ast_context->UnknownAnyTy);
1457// QualType block_pointer_type = ast_context->getBlockPointerType(generic_function_type);
1458//
1459// return block_pointer_type.getAsOpaquePtr();
1460//}
Sean Callanan75383bf2012-03-06 21:56:33 +00001461
Greg Clayton57ee3062013-07-11 22:46:58 +00001462bool
1463ClangExpressionDeclMap::GetVariableValue (VariableSP &var,
1464 lldb_private::Value &var_location,
1465 TypeFromUser *user_type,
1466 TypeFromParser *parser_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001467{
Greg Clayton5160ce52013-03-27 23:08:40 +00001468 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001469
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001470 Type *var_type = var->GetType();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001471
1472 if (!var_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001473 {
Sean Callananea22d422010-07-16 00:09:46 +00001474 if (log)
1475 log->PutCString("Skipped a definition because it has no type");
Greg Clayton57ee3062013-07-11 22:46:58 +00001476 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001477 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001478
Greg Clayton57ee3062013-07-11 22:46:58 +00001479 ClangASTType var_clang_type = var_type->GetClangFullType();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001480
Greg Clayton57ee3062013-07-11 22:46:58 +00001481 if (!var_clang_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001482 {
Sean Callananea22d422010-07-16 00:09:46 +00001483 if (log)
1484 log->PutCString("Skipped a definition because it has no Clang type");
Greg Clayton57ee3062013-07-11 22:46:58 +00001485 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001486 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001487
Sean Callanancc427fa2011-07-30 02:42:06 +00001488 ASTContext *ast = var_type->GetClangASTContext().getASTContext();
Greg Clayton57ee3062013-07-11 22:46:58 +00001489
Greg Clayton6beaaa62011-01-17 03:46:26 +00001490 if (!ast)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001491 {
Sean Callananea22d422010-07-16 00:09:46 +00001492 if (log)
1493 log->PutCString("There is no AST context for the current execution context");
Greg Clayton57ee3062013-07-11 22:46:58 +00001494 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001495 }
Greg Clayton57ee3062013-07-11 22:46:58 +00001496 //var_clang_type = MaybePromoteToBlockPointerType (ast, var_clang_type);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001497
Sean Callanan6b4067c2010-07-17 00:43:37 +00001498 DWARFExpression &var_location_expr = var->LocationExpression();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001499
Sean Callanan933693b2012-02-10 01:22:05 +00001500 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001501 Error err;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001502
Sean Callanan7b5805d2013-01-18 21:20:51 +00001503 if (var->GetLocationIsConstantValueData())
1504 {
1505 DataExtractor const_value_extractor;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001506
Sean Callanan7b5805d2013-01-18 21:20:51 +00001507 if (var_location_expr.GetExpressionData(const_value_extractor))
1508 {
Greg Clayton57ee3062013-07-11 22:46:58 +00001509 var_location = Value(const_value_extractor.GetDataStart(), const_value_extractor.GetByteSize());
1510 var_location.SetValueType(Value::eValueTypeHostAddress);
Sean Callanan7b5805d2013-01-18 21:20:51 +00001511 }
1512 else
1513 {
1514 if (log)
1515 log->Printf("Error evaluating constant variable: %s", err.AsCString());
Greg Clayton57ee3062013-07-11 22:46:58 +00001516 return false;
Sean Callanan7b5805d2013-01-18 21:20:51 +00001517 }
1518 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001519
Greg Clayton57ee3062013-07-11 22:46:58 +00001520 ClangASTType type_to_use = GuardedCopyType(var_clang_type);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001521
Greg Clayton57ee3062013-07-11 22:46:58 +00001522 if (!type_to_use)
Sean Callanan1d180662010-07-20 23:31:16 +00001523 {
Greg Clayton57ee3062013-07-11 22:46:58 +00001524 if (log)
1525 log->Printf("Couldn't copy a variable's type into the parser's AST context");
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001526
Greg Clayton57ee3062013-07-11 22:46:58 +00001527 return false;
Sean Callanan1d180662010-07-20 23:31:16 +00001528 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001529
Greg Clayton57ee3062013-07-11 22:46:58 +00001530 if (parser_type)
1531 *parser_type = TypeFromParser(type_to_use);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001532
Greg Clayton57ee3062013-07-11 22:46:58 +00001533 if (var_location.GetContextType() == Value::eContextTypeInvalid)
1534 var_location.SetClangType(type_to_use);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001535
Greg Clayton57ee3062013-07-11 22:46:58 +00001536 if (var_location.GetValueType() == Value::eValueTypeFileAddress)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001537 {
1538 SymbolContext var_sc;
1539 var->CalculateSymbolContext(&var_sc);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001540
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001541 if (!var_sc.module_sp)
Michael Sartain89c862f2013-08-07 19:05:15 +00001542 return false;
Greg Clayton3046e662013-07-10 01:23:25 +00001543
Greg Clayton57ee3062013-07-11 22:46:58 +00001544 Address so_addr(var_location.GetScalar().ULongLong(), var_sc.module_sp->GetSectionList());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001545
Greg Claytonc14ee322011-09-22 04:58:26 +00001546 lldb::addr_t load_addr = so_addr.GetLoadAddress(target);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001547
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001548 if (load_addr != LLDB_INVALID_ADDRESS)
1549 {
Greg Clayton57ee3062013-07-11 22:46:58 +00001550 var_location.GetScalar() = load_addr;
1551 var_location.SetValueType(Value::eValueTypeLoadAddress);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001552 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001553 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001554
Sean Callanan1d180662010-07-20 23:31:16 +00001555 if (user_type)
Greg Clayton57ee3062013-07-11 22:46:58 +00001556 *user_type = TypeFromUser(var_clang_type);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001557
Greg Clayton57ee3062013-07-11 22:46:58 +00001558 return true;
Sean Callanan6b4067c2010-07-17 00:43:37 +00001559}
1560
1561void
Sean Callanan0712f462011-11-29 22:03:21 +00001562ClangExpressionDeclMap::AddOneVariable (NameSearchContext &context, VariableSP var, ValueObjectSP valobj, unsigned int current_id)
Sean Callanan6b4067c2010-07-17 00:43:37 +00001563{
Sean Callanan979f74d2010-12-03 01:38:59 +00001564 assert (m_parser_vars.get());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001565
Greg Clayton5160ce52013-03-27 23:08:40 +00001566 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001567
Sean Callanan1d180662010-07-20 23:31:16 +00001568 TypeFromUser ut;
1569 TypeFromParser pt;
Greg Clayton57ee3062013-07-11 22:46:58 +00001570 Value var_location;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001571
Greg Clayton57ee3062013-07-11 22:46:58 +00001572 if (!GetVariableValue (var, var_location, &ut, &pt))
1573 return;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001574
Sean Callanancf128622012-03-15 01:53:17 +00001575 clang::QualType parser_opaque_type = QualType::getFromOpaquePtr(pt.GetOpaqueQualType());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001576
Sean Callanane2d47482012-03-21 17:13:20 +00001577 if (parser_opaque_type.isNull())
1578 return;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001579
Sean Callanancf128622012-03-15 01:53:17 +00001580 if (const clang::Type *parser_type = parser_opaque_type.getTypePtr())
1581 {
1582 if (const TagType *tag_type = dyn_cast<TagType>(parser_type))
1583 CompleteType(tag_type->getDecl());
Sean Callananf4c0a222013-12-20 04:09:05 +00001584 if (const ObjCObjectPointerType *objc_object_ptr_type = dyn_cast<ObjCObjectPointerType>(parser_type))
1585 CompleteType(objc_object_ptr_type->getInterfaceDecl());
Sean Callanancf128622012-03-15 01:53:17 +00001586 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001587
1588
Greg Clayton57ee3062013-07-11 22:46:58 +00001589 bool is_reference = pt.IsReferenceType();
Sean Callanan98298012011-10-27 19:41:13 +00001590
Greg Clayton57ee3062013-07-11 22:46:58 +00001591 NamedDecl *var_decl = NULL;
Sean Callanan98298012011-10-27 19:41:13 +00001592 if (is_reference)
Greg Clayton57ee3062013-07-11 22:46:58 +00001593 var_decl = context.AddVarDecl(pt);
Sean Callanan98298012011-10-27 19:41:13 +00001594 else
Greg Clayton57ee3062013-07-11 22:46:58 +00001595 var_decl = context.AddVarDecl(pt.GetLValueReferenceType());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001596
Greg Clayton7b462cc2010-10-15 22:48:33 +00001597 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001598 ConstString entity_name(decl_name.c_str());
Sean Callanan0712f462011-11-29 22:03:21 +00001599 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (valobj));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001600
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001601 assert (entity.get());
Sean Callanan3c495c12013-01-15 23:29:36 +00001602 entity->EnableParserVars(GetParserID());
1603 ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID());
1604 parser_vars->m_parser_type = pt;
1605 parser_vars->m_named_decl = var_decl;
1606 parser_vars->m_llvm_value = NULL;
1607 parser_vars->m_lldb_value = var_location;
1608 parser_vars->m_lldb_var = var;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001609
Sean Callanan98298012011-10-27 19:41:13 +00001610 if (is_reference)
1611 entity->m_flags |= ClangExpressionVariable::EVTypeIsReference;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001612
Sean Callananea22d422010-07-16 00:09:46 +00001613 if (log)
Greg Clayton7b462cc2010-10-15 22:48:33 +00001614 {
Sean Callanan82695d62011-11-07 23:32:52 +00001615 ASTDumper orig_dumper(ut.GetOpaqueQualType());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001616 ASTDumper ast_dumper(var_decl);
Sean Callanan82695d62011-11-07 23:32:52 +00001617 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 +00001618 }
Sean Callanan468574b2010-06-22 23:46:24 +00001619}
1620
1621void
Sean Callanan2235f322010-08-11 03:57:18 +00001622ClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001623 ClangExpressionVariableSP &pvar_sp,
Sean Callanan7dd98122011-10-14 20:34:21 +00001624 unsigned int current_id)
Sean Callanan2235f322010-08-11 03:57:18 +00001625{
Greg Clayton5160ce52013-03-27 23:08:40 +00001626 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001627
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001628 TypeFromUser user_type (pvar_sp->GetTypeFromUser());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001629
Greg Clayton57ee3062013-07-11 22:46:58 +00001630 TypeFromParser parser_type (GuardedCopyType(user_type));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001631
Sean Callanane0a64f72011-12-01 21:04:37 +00001632 if (!parser_type.GetOpaqueQualType())
1633 {
1634 if (log)
1635 log->Printf(" CEDM::FEVD[%u] Couldn't import type for pvar %s", current_id, pvar_sp->GetName().GetCString());
1636 return;
1637 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001638
Greg Clayton57ee3062013-07-11 22:46:58 +00001639 NamedDecl *var_decl = context.AddVarDecl(parser_type.GetLValueReferenceType());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001640
Sean Callanan3c495c12013-01-15 23:29:36 +00001641 pvar_sp->EnableParserVars(GetParserID());
1642 ClangExpressionVariable::ParserVars *parser_vars = pvar_sp->GetParserVars(GetParserID());
1643 parser_vars->m_parser_type = parser_type;
Greg Clayton57ee3062013-07-11 22:46:58 +00001644 parser_vars->m_named_decl = var_decl;
1645 parser_vars->m_llvm_value = NULL;
1646 parser_vars->m_lldb_value.Clear();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001647
Sean Callanan823bb4c2010-08-30 22:17:16 +00001648 if (log)
Sean Callanan530782942010-11-01 23:22:47 +00001649 {
Greg Clayton64bc6ca2011-10-20 00:47:21 +00001650 ASTDumper ast_dumper(var_decl);
Sean Callananfb3e4302011-10-29 19:50:43 +00001651 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 +00001652 }
Sean Callanan2235f322010-08-11 03:57:18 +00001653}
1654
Sean Callanan348b5892010-11-30 00:27:43 +00001655void
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001656ClangExpressionDeclMap::AddOneGenericVariable(NameSearchContext &context,
Greg Clayton3d51b9f2012-11-27 01:52:16 +00001657 const Symbol &symbol,
Sean Callanan7dd98122011-10-14 20:34:21 +00001658 unsigned int current_id)
Sean Callanand9ca42a2011-05-08 02:21:26 +00001659{
1660 assert(m_parser_vars.get());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001661
Greg Clayton5160ce52013-03-27 23:08:40 +00001662 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001663
Sean Callanan933693b2012-02-10 01:22:05 +00001664 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
Greg Claytonc14ee322011-09-22 04:58:26 +00001665
1666 if (target == NULL)
1667 return;
1668
1669 ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001670
Greg Clayton57ee3062013-07-11 22:46:58 +00001671 TypeFromUser user_type (ClangASTContext::GetBasicType(scratch_ast_context, eBasicTypeVoid).GetPointerType().GetLValueReferenceType());
1672 TypeFromParser parser_type (ClangASTContext::GetBasicType(m_ast_context, eBasicTypeVoid).GetPointerType().GetLValueReferenceType());
1673 NamedDecl *var_decl = context.AddVarDecl(parser_type);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001674
Sean Callanand9ca42a2011-05-08 02:21:26 +00001675 std::string decl_name(context.m_decl_name.getAsString());
1676 ConstString entity_name(decl_name.c_str());
Sean Callanan933693b2012-02-10 01:22:05 +00001677 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope (),
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001678 entity_name,
Sean Callanand9ca42a2011-05-08 02:21:26 +00001679 user_type,
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001680 m_parser_vars->m_target_info.byte_order,
1681 m_parser_vars->m_target_info.address_byte_size));
Sean Callanand9ca42a2011-05-08 02:21:26 +00001682 assert (entity.get());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001683
Greg Clayton57ee3062013-07-11 22:46:58 +00001684 entity->EnableParserVars(GetParserID());
1685 ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID());
1686
Greg Clayton3d51b9f2012-11-27 01:52:16 +00001687 const Address &symbol_address = symbol.GetAddress();
Greg Claytonc14ee322011-09-22 04:58:26 +00001688 lldb::addr_t symbol_load_addr = symbol_address.GetLoadAddress(target);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001689
Greg Clayton57ee3062013-07-11 22:46:58 +00001690 //parser_vars->m_lldb_value.SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
1691 parser_vars->m_lldb_value.SetClangType(user_type);
1692 parser_vars->m_lldb_value.GetScalar() = symbol_load_addr;
1693 parser_vars->m_lldb_value.SetValueType(Value::eValueTypeLoadAddress);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001694
Sean Callanan3c495c12013-01-15 23:29:36 +00001695 parser_vars->m_parser_type = parser_type;
1696 parser_vars->m_named_decl = var_decl;
1697 parser_vars->m_llvm_value = NULL;
Sean Callanan3c495c12013-01-15 23:29:36 +00001698 parser_vars->m_lldb_sym = &symbol;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001699
Sean Callanand9ca42a2011-05-08 02:21:26 +00001700 if (log)
1701 {
Greg Clayton64bc6ca2011-10-20 00:47:21 +00001702 ASTDumper ast_dumper(var_decl);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001703
Sean Callananfb3e4302011-10-29 19:50:43 +00001704 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 +00001705 }
1706}
1707
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001708bool
Sean Callanan77502262011-05-12 23:54:16 +00001709ClangExpressionDeclMap::ResolveUnknownTypes()
1710{
Greg Clayton5160ce52013-03-27 23:08:40 +00001711 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan933693b2012-02-10 01:22:05 +00001712 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
Greg Claytonc14ee322011-09-22 04:58:26 +00001713
1714 ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
Sean Callanan77502262011-05-12 23:54:16 +00001715
1716 for (size_t index = 0, num_entities = m_found_entities.GetSize();
1717 index < num_entities;
1718 ++index)
1719 {
1720 ClangExpressionVariableSP entity = m_found_entities.GetVariableAtIndex(index);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001721
Sean Callanan3c495c12013-01-15 23:29:36 +00001722 ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001723
Sean Callanan77502262011-05-12 23:54:16 +00001724 if (entity->m_flags & ClangExpressionVariable::EVUnknownType)
1725 {
Sean Callanan3c495c12013-01-15 23:29:36 +00001726 const NamedDecl *named_decl = parser_vars->m_named_decl;
Sean Callanan77502262011-05-12 23:54:16 +00001727 const VarDecl *var_decl = dyn_cast<VarDecl>(named_decl);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001728
Sean Callanan77502262011-05-12 23:54:16 +00001729 if (!var_decl)
1730 {
1731 if (log)
1732 log->Printf("Entity of unknown type does not have a VarDecl");
1733 return false;
1734 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001735
Sean Callanan77502262011-05-12 23:54:16 +00001736 if (log)
1737 {
Greg Clayton64bc6ca2011-10-20 00:47:21 +00001738 ASTDumper ast_dumper(const_cast<VarDecl*>(var_decl));
1739 log->Printf("Variable of unknown type now has Decl %s", ast_dumper.GetCString());
Sean Callanan77502262011-05-12 23:54:16 +00001740 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001741
Sean Callanan77502262011-05-12 23:54:16 +00001742 QualType var_type = var_decl->getType();
1743 TypeFromParser parser_type(var_type.getAsOpaquePtr(), &var_decl->getASTContext());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001744
Sean Callanan00f43622011-11-18 03:28:09 +00001745 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 +00001746
Sean Callanane0a64f72011-12-01 21:04:37 +00001747 if (!copied_type)
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001748 {
Sean Callanane0a64f72011-12-01 21:04:37 +00001749 if (log)
1750 log->Printf("ClangExpressionDeclMap::ResolveUnknownType - Couldn't import the type for a variable");
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001751
Jim Inghamf94e1792012-08-11 00:35:26 +00001752 return (bool) lldb::ClangExpressionVariableSP();
Sean Callanane0a64f72011-12-01 21:04:37 +00001753 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001754
Sean Callanan77502262011-05-12 23:54:16 +00001755 TypeFromUser user_type(copied_type, scratch_ast_context);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001756
Greg Clayton57ee3062013-07-11 22:46:58 +00001757// parser_vars->m_lldb_value.SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
1758 parser_vars->m_lldb_value.SetClangType(user_type);
Sean Callanan3c495c12013-01-15 23:29:36 +00001759 parser_vars->m_parser_type = parser_type;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001760
Greg Clayton57ee3062013-07-11 22:46:58 +00001761 entity->SetClangType(user_type);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001762
Sean Callanan77502262011-05-12 23:54:16 +00001763 entity->m_flags &= ~(ClangExpressionVariable::EVUnknownType);
1764 }
1765 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001766
Sean Callanan77502262011-05-12 23:54:16 +00001767 return true;
1768}
1769
Sean Callanand9ca42a2011-05-08 02:21:26 +00001770void
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001771ClangExpressionDeclMap::AddOneRegister (NameSearchContext &context,
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001772 const RegisterInfo *reg_info,
Sean Callanan7dd98122011-10-14 20:34:21 +00001773 unsigned int current_id)
Sean Callanan348b5892010-11-30 00:27:43 +00001774{
Greg Clayton5160ce52013-03-27 23:08:40 +00001775 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001776
Greg Clayton57ee3062013-07-11 22:46:58 +00001777 ClangASTType clang_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (m_ast_context,
1778 reg_info->encoding,
1779 reg_info->byte_size * 8);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001780
Greg Clayton57ee3062013-07-11 22:46:58 +00001781 if (!clang_type)
Sean Callanan348b5892010-11-30 00:27:43 +00001782 {
Johnny Chene95fcf72011-08-09 22:52:27 +00001783 if (log)
Sean Callanan7dd98122011-10-14 20:34:21 +00001784 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 +00001785 return;
1786 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001787
Greg Clayton57ee3062013-07-11 22:46:58 +00001788 TypeFromParser parser_clang_type (clang_type);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001789
Greg Clayton57ee3062013-07-11 22:46:58 +00001790 NamedDecl *var_decl = context.AddVarDecl(parser_clang_type);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001791
Sean Callanan933693b2012-02-10 01:22:05 +00001792 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(),
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001793 m_parser_vars->m_target_info.byte_order,
1794 m_parser_vars->m_target_info.address_byte_size));
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001795 assert (entity.get());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001796
Sean Callanan348b5892010-11-30 00:27:43 +00001797 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton8b2fe6d2010-12-14 02:59:59 +00001798 entity->SetName (ConstString (decl_name.c_str()));
1799 entity->SetRegisterInfo (reg_info);
Sean Callanan3c495c12013-01-15 23:29:36 +00001800 entity->EnableParserVars(GetParserID());
1801 ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID());
Greg Clayton57ee3062013-07-11 22:46:58 +00001802 parser_vars->m_parser_type = parser_clang_type;
1803 parser_vars->m_named_decl = var_decl;
1804 parser_vars->m_llvm_value = NULL;
1805 parser_vars->m_lldb_value.Clear();
Sean Callananf673e762012-02-15 01:40:39 +00001806 entity->m_flags |= ClangExpressionVariable::EVBareRegister;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001807
Sean Callananf673e762012-02-15 01:40:39 +00001808 if (log)
Sean Callanan348b5892010-11-30 00:27:43 +00001809 {
Greg Clayton64bc6ca2011-10-20 00:47:21 +00001810 ASTDumper ast_dumper(var_decl);
Sean Callananfb3e4302011-10-29 19:50:43 +00001811 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 +00001812 }
1813}
1814
Sean Callanan2235f322010-08-11 03:57:18 +00001815void
Greg Clayton3f5c08f2011-05-18 22:01:49 +00001816ClangExpressionDeclMap::AddOneFunction (NameSearchContext &context,
Greg Clayton57ee3062013-07-11 22:46:58 +00001817 Function* function,
Sean Callanan7dd98122011-10-14 20:34:21 +00001818 Symbol* symbol,
1819 unsigned int current_id)
Sean Callanan468574b2010-06-22 23:46:24 +00001820{
Sean Callanan979f74d2010-12-03 01:38:59 +00001821 assert (m_parser_vars.get());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001822
Greg Clayton5160ce52013-03-27 23:08:40 +00001823 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001824
Greg Clayton57ee3062013-07-11 22:46:58 +00001825 NamedDecl *function_decl = NULL;
Sean Callanan77eaf442011-07-08 00:39:14 +00001826 const Address *fun_address = NULL;
Greg Clayton57ee3062013-07-11 22:46:58 +00001827 ClangASTType function_clang_type;
Matt Kopec00049b82013-02-27 20:13:38 +00001828
1829 bool is_indirect_function = false;
1830
Greg Clayton57ee3062013-07-11 22:46:58 +00001831 if (function)
Sean Callanan8ade1042010-07-27 00:55:47 +00001832 {
Greg Clayton57ee3062013-07-11 22:46:58 +00001833 Type *function_type = function->GetType();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001834
Greg Clayton57ee3062013-07-11 22:46:58 +00001835 if (!function_type)
Sean Callanan8ade1042010-07-27 00:55:47 +00001836 {
1837 if (log)
Sean Callanan7dd98122011-10-14 20:34:21 +00001838 log->PutCString(" Skipped a function because it has no type");
Sean Callanan8ade1042010-07-27 00:55:47 +00001839 return;
1840 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001841
Greg Clayton57ee3062013-07-11 22:46:58 +00001842 function_clang_type = function_type->GetClangFullType();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001843
Greg Clayton57ee3062013-07-11 22:46:58 +00001844 if (!function_clang_type)
Sean Callanan8ade1042010-07-27 00:55:47 +00001845 {
1846 if (log)
Sean Callanan7dd98122011-10-14 20:34:21 +00001847 log->PutCString(" Skipped a function because it has no Clang type");
Sean Callanan8ade1042010-07-27 00:55:47 +00001848 return;
1849 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001850
Greg Clayton57ee3062013-07-11 22:46:58 +00001851 fun_address = &function->GetAddressRange().GetBaseAddress();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001852
Greg Clayton57ee3062013-07-11 22:46:58 +00001853 ClangASTType copied_function_type = GuardedCopyType(function_clang_type);
1854 if (copied_function_type)
Greg Clayton64bc6ca2011-10-20 00:47:21 +00001855 {
Greg Clayton57ee3062013-07-11 22:46:58 +00001856 function_decl = context.AddFunDecl(copied_function_type);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001857
Greg Clayton57ee3062013-07-11 22:46:58 +00001858 if (!function_decl)
Sean Callanan485f7322013-04-24 00:34:41 +00001859 {
1860 if (log)
1861 {
1862 log->Printf (" Failed to create a function decl for '%s' {0x%8.8" PRIx64 "}",
Greg Clayton57ee3062013-07-11 22:46:58 +00001863 function_type->GetName().GetCString(),
1864 function_type->GetID());
Sean Callanan485f7322013-04-24 00:34:41 +00001865 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001866
Sean Callanan485f7322013-04-24 00:34:41 +00001867 return;
1868 }
Greg Clayton64bc6ca2011-10-20 00:47:21 +00001869 }
1870 else
1871 {
1872 // We failed to copy the type we found
1873 if (log)
1874 {
Daniel Malead01b2952012-11-29 21:49:15 +00001875 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 +00001876 function_type->GetName().GetCString(),
1877 function_type->GetID());
Greg Clayton64bc6ca2011-10-20 00:47:21 +00001878 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001879
Sean Callananed8d58f2011-11-16 00:40:13 +00001880 return;
Greg Clayton64bc6ca2011-10-20 00:47:21 +00001881 }
Sean Callanan8ade1042010-07-27 00:55:47 +00001882 }
1883 else if (symbol)
1884 {
Greg Claytone7612132012-03-07 21:03:09 +00001885 fun_address = &symbol->GetAddress();
Greg Clayton57ee3062013-07-11 22:46:58 +00001886 function_decl = context.AddGenericFunDecl();
Matt Kopec00049b82013-02-27 20:13:38 +00001887 is_indirect_function = symbol->IsIndirect();
Sean Callanan8ade1042010-07-27 00:55:47 +00001888 }
1889 else
1890 {
1891 if (log)
Sean Callanan7dd98122011-10-14 20:34:21 +00001892 log->PutCString(" AddOneFunction called with no function and no symbol");
Sean Callanan8ade1042010-07-27 00:55:47 +00001893 return;
1894 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001895
Sean Callanan933693b2012-02-10 01:22:05 +00001896 Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
Greg Claytonc14ee322011-09-22 04:58:26 +00001897
Matt Kopec00049b82013-02-27 20:13:38 +00001898 lldb::addr_t load_addr = fun_address->GetCallableLoadAddress(target, is_indirect_function);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001899
Greg Clayton57ee3062013-07-11 22:46:58 +00001900 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope (),
1901 m_parser_vars->m_target_info.byte_order,
1902 m_parser_vars->m_target_info.address_byte_size));
1903 assert (entity.get());
1904
1905 std::string decl_name(context.m_decl_name.getAsString());
1906 entity->SetName(ConstString(decl_name.c_str()));
1907 entity->SetClangType (function_clang_type);
1908 entity->EnableParserVars(GetParserID());
1909
1910 ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001911
Sean Callanan9be9d172013-03-19 01:45:02 +00001912 if (load_addr != LLDB_INVALID_ADDRESS)
1913 {
Greg Clayton57ee3062013-07-11 22:46:58 +00001914 parser_vars->m_lldb_value.SetValueType(Value::eValueTypeLoadAddress);
1915 parser_vars->m_lldb_value.GetScalar() = load_addr;
Sean Callanan9be9d172013-03-19 01:45:02 +00001916 }
1917 else
1918 {
1919 // We have to try finding a file address.
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001920
Sean Callanan9be9d172013-03-19 01:45:02 +00001921 lldb::addr_t file_addr = fun_address->GetFileAddress();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001922
Greg Clayton57ee3062013-07-11 22:46:58 +00001923 parser_vars->m_lldb_value.SetValueType(Value::eValueTypeFileAddress);
1924 parser_vars->m_lldb_value.GetScalar() = file_addr;
Sean Callanan9be9d172013-03-19 01:45:02 +00001925 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001926
Greg Clayton57ee3062013-07-11 22:46:58 +00001927
1928 parser_vars->m_named_decl = function_decl;
Sean Callanan3c495c12013-01-15 23:29:36 +00001929 parser_vars->m_llvm_value = NULL;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001930
Sean Callananea22d422010-07-16 00:09:46 +00001931 if (log)
Greg Clayton7b462cc2010-10-15 22:48:33 +00001932 {
Greg Clayton57ee3062013-07-11 22:46:58 +00001933 ASTDumper ast_dumper(function_decl);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001934
Sean Callanan308a3c52012-07-28 00:21:01 +00001935 StreamString ss;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001936
Sean Callanan308a3c52012-07-28 00:21:01 +00001937 fun_address->Dump(&ss, m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(), Address::DumpStyleResolvedDescription);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001938
Sean Callanan308a3c52012-07-28 00:21:01 +00001939 log->Printf(" CEDM::FEVD[%u] Found %s function %s (description %s), returned %s",
Sean Callanan7dd98122011-10-14 20:34:21 +00001940 current_id,
Greg Clayton57ee3062013-07-11 22:46:58 +00001941 (function ? "specific" : "generic"),
Sean Callanan308a3c52012-07-28 00:21:01 +00001942 decl_name.c_str(),
1943 ss.GetData(),
Greg Clayton64bc6ca2011-10-20 00:47:21 +00001944 ast_dumper.GetCString());
Greg Clayton7b462cc2010-10-15 22:48:33 +00001945 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001946}
Sean Callanan5666b672010-08-04 01:02:13 +00001947
Sean Callananfa4fab72013-02-01 06:55:48 +00001948TypeFromParser
1949ClangExpressionDeclMap::CopyClassType(TypeFromUser &ut,
1950 unsigned int current_id)
Sean Callanan5666b672010-08-04 01:02:13 +00001951{
Greg Clayton57ee3062013-07-11 22:46:58 +00001952 ClangASTType copied_clang_type = GuardedCopyType(ut);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001953
Greg Clayton57ee3062013-07-11 22:46:58 +00001954 if (!copied_clang_type)
Sean Callanane0a64f72011-12-01 21:04:37 +00001955 {
Greg Clayton5160ce52013-03-27 23:08:40 +00001956 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001957
Sean Callananfa4fab72013-02-01 06:55:48 +00001958 if (log)
1959 log->Printf("ClangExpressionDeclMap::CopyClassType - Couldn't import the type");
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001960
Sean Callananfa4fab72013-02-01 06:55:48 +00001961 return TypeFromParser();
Sean Callanane0a64f72011-12-01 21:04:37 +00001962 }
Sean Callananfa4fab72013-02-01 06:55:48 +00001963
Greg Clayton57ee3062013-07-11 22:46:58 +00001964 if (copied_clang_type.IsAggregateType() && copied_clang_type.GetCompleteType ())
Sean Callananfc55f5d2010-09-21 00:44:12 +00001965 {
Greg Clayton57ee3062013-07-11 22:46:58 +00001966 ClangASTType void_clang_type = ClangASTContext::GetBasicType(m_ast_context, eBasicTypeVoid);
1967 ClangASTType void_ptr_clang_type = void_clang_type.GetPointerType();
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001968
Greg Clayton57ee3062013-07-11 22:46:58 +00001969 ClangASTType method_type = ClangASTContext::CreateFunctionType (m_ast_context,
1970 void_clang_type,
1971 &void_ptr_clang_type,
Sean Callananc1b732d2011-11-01 18:07:13 +00001972 1,
1973 false,
Greg Clayton57ee3062013-07-11 22:46:58 +00001974 copied_clang_type.GetTypeQualifiers());
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001975
Greg Clayton0fffff52010-09-24 05:15:53 +00001976 const bool is_virtual = false;
1977 const bool is_static = false;
1978 const bool is_inline = false;
Greg Claytonf51de672010-10-01 02:31:07 +00001979 const bool is_explicit = false;
Sean Callananc8324752011-11-02 18:09:01 +00001980 const bool is_attr_used = true;
Sean Callanandbb58392011-11-02 01:38:59 +00001981 const bool is_artificial = false;
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001982
Greg Clayton57ee3062013-07-11 22:46:58 +00001983 copied_clang_type.AddMethodToCXXRecordType ("$__lldb_expr",
1984 method_type,
1985 lldb::eAccessPublic,
1986 is_virtual,
1987 is_static,
1988 is_inline,
1989 is_explicit,
1990 is_attr_used,
1991 is_artificial);
Sean Callananfc55f5d2010-09-21 00:44:12 +00001992 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001993
Greg Clayton57ee3062013-07-11 22:46:58 +00001994 return TypeFromParser(copied_clang_type);
Sean Callananfa4fab72013-02-01 06:55:48 +00001995}
1996
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00001997void
1998ClangExpressionDeclMap::AddOneType(NameSearchContext &context,
Sean Callananfa4fab72013-02-01 06:55:48 +00001999 TypeFromUser &ut,
2000 unsigned int current_id)
2001{
Greg Clayton57ee3062013-07-11 22:46:58 +00002002 ClangASTType copied_clang_type = GuardedCopyType(ut);
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00002003
Greg Clayton57ee3062013-07-11 22:46:58 +00002004 if (!copied_clang_type)
Sean Callananfa4fab72013-02-01 06:55:48 +00002005 {
Greg Clayton5160ce52013-03-27 23:08:40 +00002006 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callananfa4fab72013-02-01 06:55:48 +00002007
2008 if (log)
2009 log->Printf("ClangExpressionDeclMap::AddOneType - Couldn't import the type");
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00002010
Sean Callananfa4fab72013-02-01 06:55:48 +00002011 return;
2012 }
Sylvestre Ledruceab3ac2014-07-06 17:54:58 +00002013
Greg Clayton57ee3062013-07-11 22:46:58 +00002014 context.AddTypeDecl(copied_clang_type);
Sean Callanan5666b672010-08-04 01:02:13 +00002015}