blob: 05d2b0bc261d4c2a8b22b7d8d903abbdb7572d80 [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- ClangExpressionDeclMap.cpp -----------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "lldb/Expression/ClangExpressionDeclMap.h"
11
12// C Includes
13// C++ Includes
14// Other libraries and framework includes
15// Project includes
Sean Callanan47a5c4c2010-09-23 03:01:22 +000016#include "clang/AST/DeclarationName.h"
Sean Callanana0744822010-11-01 23:22:47 +000017#include "clang/AST/Decl.h"
Chris Lattner24943d22010-06-08 16:52:24 +000018#include "lldb/lldb-private.h"
19#include "lldb/Core/Address.h"
Sean Callanan810f22d2010-07-16 00:09:46 +000020#include "lldb/Core/Error.h"
Sean Callanan6184dfe2010-06-23 00:47:48 +000021#include "lldb/Core/Log.h"
Chris Lattner24943d22010-06-08 16:52:24 +000022#include "lldb/Core/Module.h"
Sean Callanan05a5a1b2010-12-16 03:17:46 +000023#include "lldb/Core/ValueObjectConstResult.h"
Chris Lattner24943d22010-06-08 16:52:24 +000024#include "lldb/Expression/ClangASTSource.h"
Sean Callanana48fe162010-08-11 03:57:18 +000025#include "lldb/Expression/ClangPersistentVariables.h"
Chris Lattner24943d22010-06-08 16:52:24 +000026#include "lldb/Symbol/ClangASTContext.h"
Greg Clayton6916e352010-11-13 03:52:47 +000027#include "lldb/Symbol/ClangNamespaceDecl.h"
Chris Lattner24943d22010-06-08 16:52:24 +000028#include "lldb/Symbol/CompileUnit.h"
29#include "lldb/Symbol/Function.h"
30#include "lldb/Symbol/ObjectFile.h"
31#include "lldb/Symbol/SymbolContext.h"
32#include "lldb/Symbol/Type.h"
33#include "lldb/Symbol/TypeList.h"
34#include "lldb/Symbol/Variable.h"
35#include "lldb/Symbol/VariableList.h"
Sean Callananf328c9f2010-07-20 23:31:16 +000036#include "lldb/Target/ExecutionContext.h"
Sean Callanan810f22d2010-07-16 00:09:46 +000037#include "lldb/Target/Process.h"
Sean Callanan17c6a052010-10-05 20:18:48 +000038#include "lldb/Target/RegisterContext.h"
Chris Lattner24943d22010-06-08 16:52:24 +000039#include "lldb/Target/StackFrame.h"
Sean Callananf328c9f2010-07-20 23:31:16 +000040#include "lldb/Target/Target.h"
Jim Ingham78b9ee82010-12-07 01:56:02 +000041#include "lldb/Target/Thread.h"
Sean Callanana0744822010-11-01 23:22:47 +000042#include "llvm/Support/raw_ostream.h"
Chris Lattner24943d22010-06-08 16:52:24 +000043
Greg Clayton3bc52d02010-11-14 22:13:40 +000044using namespace lldb;
Chris Lattner24943d22010-06-08 16:52:24 +000045using namespace lldb_private;
46using namespace clang;
47
Sean Callananaa301c42010-12-03 01:38:59 +000048ClangExpressionDeclMap::ClangExpressionDeclMap () :
Greg Clayton8de27c72010-10-15 22:48:33 +000049 m_found_entities (),
50 m_struct_members (),
Sean Callananaa301c42010-12-03 01:38:59 +000051 m_parser_vars (),
52 m_struct_vars ()
Chris Lattner24943d22010-06-08 16:52:24 +000053{
Sean Callananaa301c42010-12-03 01:38:59 +000054 EnableStructVars();
Chris Lattner24943d22010-06-08 16:52:24 +000055}
56
57ClangExpressionDeclMap::~ClangExpressionDeclMap()
Sean Callananaa301c42010-12-03 01:38:59 +000058{
59 DidDematerialize();
60 DisableStructVars();
61}
Sean Callananc2c6f772010-10-26 00:31:56 +000062
Greg Clayton427f2902010-12-14 02:59:59 +000063void
64ClangExpressionDeclMap::WillParse(ExecutionContext &exe_ctx)
Sean Callananaa301c42010-12-03 01:38:59 +000065{
66 EnableParserVars();
67 m_parser_vars->m_exe_ctx = &exe_ctx;
68
69 if (exe_ctx.frame)
70 m_parser_vars->m_sym_ctx = exe_ctx.frame->GetSymbolContext(lldb::eSymbolContextEverything);
Jim Ingham78b9ee82010-12-07 01:56:02 +000071 else if (exe_ctx.thread)
72 m_parser_vars->m_sym_ctx = exe_ctx.thread->GetStackFrameAtIndex(0)->GetSymbolContext(lldb::eSymbolContextEverything);
73
Greg Clayton427f2902010-12-14 02:59:59 +000074 if (exe_ctx.target)
75 m_parser_vars->m_persistent_vars = &exe_ctx.target->GetPersistentVariables();
Sean Callananaa301c42010-12-03 01:38:59 +000076}
77
Greg Clayton427f2902010-12-14 02:59:59 +000078void
79ClangExpressionDeclMap::DidParse()
Sean Callananaa301c42010-12-03 01:38:59 +000080{
81 if (m_parser_vars.get())
82 {
Greg Clayton427f2902010-12-14 02:59:59 +000083 for (size_t entity_index = 0, num_entities = m_found_entities.GetSize();
Sean Callananaa301c42010-12-03 01:38:59 +000084 entity_index < num_entities;
85 ++entity_index)
86 {
Greg Clayton427f2902010-12-14 02:59:59 +000087 ClangExpressionVariableSP var_sp(m_found_entities.GetVariableAtIndex(entity_index));
88 if (var_sp &&
89 var_sp->m_parser_vars.get() &&
90 var_sp->m_parser_vars->m_lldb_value)
91 delete var_sp->m_parser_vars->m_lldb_value;
Sean Callananaa301c42010-12-03 01:38:59 +000092
Greg Clayton427f2902010-12-14 02:59:59 +000093 var_sp->DisableParserVars();
Sean Callananaa301c42010-12-03 01:38:59 +000094 }
95
Greg Clayton427f2902010-12-14 02:59:59 +000096 for (size_t pvar_index = 0, num_pvars = m_parser_vars->m_persistent_vars->GetSize();
Sean Callananaa301c42010-12-03 01:38:59 +000097 pvar_index < num_pvars;
98 ++pvar_index)
99 {
Greg Clayton427f2902010-12-14 02:59:59 +0000100 ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariableAtIndex(pvar_index));
101 if (pvar_sp)
102 pvar_sp->DisableParserVars();
Sean Callananaa301c42010-12-03 01:38:59 +0000103 }
104
105 DisableParserVars();
Sean Callanan7a60b942010-10-08 01:58:41 +0000106 }
Chris Lattner24943d22010-06-08 16:52:24 +0000107}
108
Sean Callanan8bce6652010-07-13 21:41:46 +0000109// Interface for IRForTarget
110
Greg Clayton8de27c72010-10-15 22:48:33 +0000111const ConstString &
112ClangExpressionDeclMap::GetPersistentResultName ()
Sean Callanan82b74c82010-08-12 01:56:52 +0000113{
Sean Callananaa301c42010-12-03 01:38:59 +0000114 assert (m_struct_vars.get());
115 assert (m_parser_vars.get());
Sean Callananaa301c42010-12-03 01:38:59 +0000116 if (!m_struct_vars->m_result_name)
Greg Clayton427f2902010-12-14 02:59:59 +0000117 {
118 Target *target = m_parser_vars->GetTarget();
119 assert (target);
120 m_struct_vars->m_result_name = target->GetPersistentVariables().GetNextPersistentVariableName();
121 }
Sean Callananaa301c42010-12-03 01:38:59 +0000122 return m_struct_vars->m_result_name;
Sean Callanan82b74c82010-08-12 01:56:52 +0000123}
124
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000125lldb::ClangExpressionVariableSP
126ClangExpressionDeclMap::BuildIntegerVariable (const ConstString &name,
127 lldb_private::TypeFromParser type,
128 const llvm::APInt& value)
129{
130 assert (m_parser_vars.get());
131
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000132 clang::ASTContext *context(m_parser_vars->m_exe_ctx->target->GetScratchClangASTContext()->getASTContext());
133
134 TypeFromUser user_type(ClangASTContext::CopyType(context,
135 type.GetASTContext(),
136 type.GetOpaqueQualType()),
137 context);
138
Sean Callanan0e0817d2011-01-04 02:41:41 +0000139 if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (name,
140 user_type,
141 m_parser_vars->m_exe_ctx->process->GetByteOrder(),
142 m_parser_vars->m_exe_ctx->process->GetAddressByteSize()))
143 return lldb::ClangExpressionVariableSP();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000144
Sean Callanan0e0817d2011-01-04 02:41:41 +0000145 ClangExpressionVariableSP pvar_sp (m_parser_vars->m_persistent_vars->GetVariable(name));
146
147 if (!pvar_sp)
148 return lldb::ClangExpressionVariableSP();
149
150 uint8_t *pvar_data = pvar_sp->GetValueBytes();
151 if (pvar_data == NULL)
152 return lldb::ClangExpressionVariableSP();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000153
154 uint64_t value64 = value.getLimitedValue();
155
156 ByteOrder byte_order = m_parser_vars->m_exe_ctx->process->GetByteOrder();
157
158 size_t num_val_bytes = sizeof(value64);
Sean Callanan0e0817d2011-01-04 02:41:41 +0000159 size_t num_data_bytes = pvar_sp->GetByteSize();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000160
161 size_t num_bytes = num_val_bytes;
162 if (num_bytes > num_data_bytes)
163 num_bytes = num_data_bytes;
164
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000165 for (off_t byte_idx = 0;
166 byte_idx < num_bytes;
167 ++byte_idx)
168 {
169 uint64_t shift = byte_idx * 8;
170 uint64_t mask = 0xffll << shift;
171 uint8_t cur_byte = (uint8_t)((value64 & mask) >> shift);
172
173 switch (byte_order)
174 {
Sean Callanan0e0817d2011-01-04 02:41:41 +0000175 case eByteOrderBig:
176 // High Low
177 // Original: |AABBCCDDEEFFGGHH|
178 // Target: |EEFFGGHH|
179
180 pvar_data[num_data_bytes - (1 + byte_idx)] = cur_byte;
181 break;
182 case eByteOrderLittle:
183 // Target: |HHGGFFEE|
184 pvar_data[byte_idx] = cur_byte;
185 break;
186 default:
187 return lldb::ClangExpressionVariableSP();
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000188 }
189 }
Sean Callanan0e0817d2011-01-04 02:41:41 +0000190
191 return pvar_sp;
Sean Callanan05a5a1b2010-12-16 03:17:46 +0000192}
193
Sean Callanan8bce6652010-07-13 21:41:46 +0000194bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000195ClangExpressionDeclMap::AddPersistentVariable
196(
197 const clang::NamedDecl *decl,
198 const ConstString &name,
199 TypeFromParser parser_type
200)
Sean Callanana48fe162010-08-11 03:57:18 +0000201{
Sean Callananaa301c42010-12-03 01:38:59 +0000202 assert (m_parser_vars.get());
203
204 clang::ASTContext *context(m_parser_vars->m_exe_ctx->target->GetScratchClangASTContext()->getASTContext());
Sean Callanana48fe162010-08-11 03:57:18 +0000205
Sean Callanana48fe162010-08-11 03:57:18 +0000206 TypeFromUser user_type(ClangASTContext::CopyType(context,
Sean Callanan82b74c82010-08-12 01:56:52 +0000207 parser_type.GetASTContext(),
208 parser_type.GetOpaqueQualType()),
Sean Callanana48fe162010-08-11 03:57:18 +0000209 context);
210
Greg Clayton427f2902010-12-14 02:59:59 +0000211 if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (name,
212 user_type,
213 m_parser_vars->m_exe_ctx->process->GetByteOrder(),
214 m_parser_vars->m_exe_ctx->process->GetAddressByteSize()))
Sean Callanan8c127202010-08-23 23:09:38 +0000215 return false;
216
Greg Clayton427f2902010-12-14 02:59:59 +0000217 ClangExpressionVariableSP var_sp (m_parser_vars->m_persistent_vars->GetVariable(name));
Sean Callanan8c127202010-08-23 23:09:38 +0000218
Greg Clayton427f2902010-12-14 02:59:59 +0000219 if (!var_sp)
Sean Callanan8c127202010-08-23 23:09:38 +0000220 return false;
221
Greg Clayton427f2902010-12-14 02:59:59 +0000222 var_sp->EnableParserVars();
Sean Callanan8c127202010-08-23 23:09:38 +0000223
Greg Clayton427f2902010-12-14 02:59:59 +0000224 var_sp->m_parser_vars->m_named_decl = decl;
225 var_sp->m_parser_vars->m_parser_type = parser_type;
Sean Callanan8c127202010-08-23 23:09:38 +0000226
227 return true;
Sean Callanana48fe162010-08-11 03:57:18 +0000228}
229
230bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000231ClangExpressionDeclMap::AddValueToStruct
232(
233 const clang::NamedDecl *decl,
234 const ConstString &name,
235 llvm::Value *value,
236 size_t size,
237 off_t alignment
238)
Sean Callanan8bce6652010-07-13 21:41:46 +0000239{
Sean Callananaa301c42010-12-03 01:38:59 +0000240 assert (m_struct_vars.get());
241 assert (m_parser_vars.get());
242
Greg Claytone005f2c2010-11-06 01:53:30 +0000243 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan45690fe2010-08-30 22:17:16 +0000244
Sean Callananaa301c42010-12-03 01:38:59 +0000245 m_struct_vars->m_struct_laid_out = false;
Sean Callanan8bce6652010-07-13 21:41:46 +0000246
Sean Callanan8c127202010-08-23 23:09:38 +0000247 if (m_struct_members.GetVariable(decl))
248 return true;
Sean Callanan8bce6652010-07-13 21:41:46 +0000249
Greg Clayton427f2902010-12-14 02:59:59 +0000250 ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl));
Sean Callanan8bce6652010-07-13 21:41:46 +0000251
Greg Clayton427f2902010-12-14 02:59:59 +0000252 if (!var_sp)
253 var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl);
Sean Callanan8bce6652010-07-13 21:41:46 +0000254
Greg Clayton427f2902010-12-14 02:59:59 +0000255 if (!var_sp)
Sean Callanan8c127202010-08-23 23:09:38 +0000256 return false;
257
Sean Callanan45690fe2010-08-30 22:17:16 +0000258 if (log)
259 log->Printf("Adding value for decl %p [%s - %s] to the structure",
260 decl,
Greg Clayton8de27c72010-10-15 22:48:33 +0000261 name.GetCString(),
Greg Clayton427f2902010-12-14 02:59:59 +0000262 var_sp->GetName().GetCString());
Sean Callanan45690fe2010-08-30 22:17:16 +0000263
Sean Callanan8c127202010-08-23 23:09:38 +0000264 // We know entity->m_parser_vars is valid because we used a parser variable
265 // to find it
Greg Clayton427f2902010-12-14 02:59:59 +0000266 var_sp->m_parser_vars->m_llvm_value = value;
Sean Callanan8c127202010-08-23 23:09:38 +0000267
Greg Clayton427f2902010-12-14 02:59:59 +0000268 var_sp->EnableJITVars();
269 var_sp->m_jit_vars->m_alignment = alignment;
270 var_sp->m_jit_vars->m_size = size;
Sean Callanan8c127202010-08-23 23:09:38 +0000271
Greg Clayton427f2902010-12-14 02:59:59 +0000272 m_struct_members.AddVariable(var_sp);
Sean Callanan8bce6652010-07-13 21:41:46 +0000273
274 return true;
275}
276
277bool
278ClangExpressionDeclMap::DoStructLayout ()
279{
Sean Callananaa301c42010-12-03 01:38:59 +0000280 assert (m_struct_vars.get());
281
282 if (m_struct_vars->m_struct_laid_out)
Sean Callanan8bce6652010-07-13 21:41:46 +0000283 return true;
284
Sean Callanan8bce6652010-07-13 21:41:46 +0000285 off_t cursor = 0;
286
Sean Callananaa301c42010-12-03 01:38:59 +0000287 m_struct_vars->m_struct_alignment = 0;
288 m_struct_vars->m_struct_size = 0;
Sean Callanan8bce6652010-07-13 21:41:46 +0000289
Greg Clayton427f2902010-12-14 02:59:59 +0000290 for (size_t member_index = 0, num_members = m_struct_members.GetSize();
Sean Callanan8c127202010-08-23 23:09:38 +0000291 member_index < num_members;
292 ++member_index)
Sean Callanan8bce6652010-07-13 21:41:46 +0000293 {
Greg Clayton427f2902010-12-14 02:59:59 +0000294 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
295 if (!member_sp)
296 return false;
297
298 if (!member_sp->m_jit_vars.get())
Sean Callanan8c127202010-08-23 23:09:38 +0000299 return false;
Sean Callanan8bce6652010-07-13 21:41:46 +0000300
Sean Callanan8c127202010-08-23 23:09:38 +0000301 if (member_index == 0)
Greg Clayton427f2902010-12-14 02:59:59 +0000302 m_struct_vars->m_struct_alignment = member_sp->m_jit_vars->m_alignment;
Sean Callanan8c127202010-08-23 23:09:38 +0000303
Greg Clayton427f2902010-12-14 02:59:59 +0000304 if (cursor % member_sp->m_jit_vars->m_alignment)
305 cursor += (member_sp->m_jit_vars->m_alignment - (cursor % member_sp->m_jit_vars->m_alignment));
Sean Callanan8c127202010-08-23 23:09:38 +0000306
Greg Clayton427f2902010-12-14 02:59:59 +0000307 member_sp->m_jit_vars->m_offset = cursor;
308 cursor += member_sp->m_jit_vars->m_size;
Sean Callanan8bce6652010-07-13 21:41:46 +0000309 }
310
Sean Callananaa301c42010-12-03 01:38:59 +0000311 m_struct_vars->m_struct_size = cursor;
Sean Callanan8bce6652010-07-13 21:41:46 +0000312
Sean Callananaa301c42010-12-03 01:38:59 +0000313 m_struct_vars->m_struct_laid_out = true;
Sean Callanan8bce6652010-07-13 21:41:46 +0000314 return true;
315}
316
Greg Clayton8de27c72010-10-15 22:48:33 +0000317bool ClangExpressionDeclMap::GetStructInfo
318(
319 uint32_t &num_elements,
320 size_t &size,
321 off_t &alignment
322)
Sean Callanan8bce6652010-07-13 21:41:46 +0000323{
Sean Callananaa301c42010-12-03 01:38:59 +0000324 assert (m_struct_vars.get());
325
326 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan8bce6652010-07-13 21:41:46 +0000327 return false;
328
Greg Clayton427f2902010-12-14 02:59:59 +0000329 num_elements = m_struct_members.GetSize();
Sean Callananaa301c42010-12-03 01:38:59 +0000330 size = m_struct_vars->m_struct_size;
331 alignment = m_struct_vars->m_struct_alignment;
Sean Callanan8bce6652010-07-13 21:41:46 +0000332
333 return true;
334}
335
336bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000337ClangExpressionDeclMap::GetStructElement
338(
339 const clang::NamedDecl *&decl,
340 llvm::Value *&value,
341 off_t &offset,
342 ConstString &name,
343 uint32_t index
344)
Sean Callanan8bce6652010-07-13 21:41:46 +0000345{
Sean Callananaa301c42010-12-03 01:38:59 +0000346 assert (m_struct_vars.get());
347
348 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan8bce6652010-07-13 21:41:46 +0000349 return false;
350
Greg Clayton427f2902010-12-14 02:59:59 +0000351 if (index >= m_struct_members.GetSize())
Sean Callanan8bce6652010-07-13 21:41:46 +0000352 return false;
353
Greg Clayton427f2902010-12-14 02:59:59 +0000354 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(index));
Sean Callanan8bce6652010-07-13 21:41:46 +0000355
Greg Clayton427f2902010-12-14 02:59:59 +0000356 if (!member_sp ||
357 !member_sp->m_parser_vars.get() ||
358 !member_sp->m_jit_vars.get())
Sean Callanan8c127202010-08-23 23:09:38 +0000359 return false;
360
Greg Clayton427f2902010-12-14 02:59:59 +0000361 decl = member_sp->m_parser_vars->m_named_decl;
362 value = member_sp->m_parser_vars->m_llvm_value;
363 offset = member_sp->m_jit_vars->m_offset;
364 name = member_sp->GetName();
Sean Callanan8c127202010-08-23 23:09:38 +0000365
Sean Callanan8bce6652010-07-13 21:41:46 +0000366 return true;
367}
368
Sean Callanan02fbafa2010-07-27 21:39:39 +0000369bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000370ClangExpressionDeclMap::GetFunctionInfo
371(
372 const clang::NamedDecl *decl,
373 llvm::Value**& value,
374 uint64_t &ptr
375)
Sean Callananba992c52010-07-27 02:07:53 +0000376{
Greg Clayton427f2902010-12-14 02:59:59 +0000377 ClangExpressionVariableSP entity_sp(m_found_entities.GetVariable(decl));
Sean Callanan8c127202010-08-23 23:09:38 +0000378
Greg Clayton427f2902010-12-14 02:59:59 +0000379 if (!entity_sp)
Sean Callanan8c127202010-08-23 23:09:38 +0000380 return false;
Sean Callananba992c52010-07-27 02:07:53 +0000381
Sean Callanan8c127202010-08-23 23:09:38 +0000382 // We know m_parser_vars is valid since we searched for the variable by
383 // its NamedDecl
Sean Callananba992c52010-07-27 02:07:53 +0000384
Greg Clayton427f2902010-12-14 02:59:59 +0000385 value = &entity_sp->m_parser_vars->m_llvm_value;
386 ptr = entity_sp->m_parser_vars->m_lldb_value->GetScalar().ULongLong();
Sean Callanan8c127202010-08-23 23:09:38 +0000387
388 return true;
Sean Callananba992c52010-07-27 02:07:53 +0000389}
390
Sean Callananf5857a02010-07-31 01:32:05 +0000391bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000392ClangExpressionDeclMap::GetFunctionAddress
393(
394 const ConstString &name,
395 uint64_t &ptr
396)
Sean Callananf5857a02010-07-31 01:32:05 +0000397{
Sean Callananaa301c42010-12-03 01:38:59 +0000398 assert (m_parser_vars.get());
399
Sean Callananf5857a02010-07-31 01:32:05 +0000400 // Back out in all cases where we're not fully initialized
Jim Ingham78b9ee82010-12-07 01:56:02 +0000401 if (m_parser_vars->m_exe_ctx->target == NULL)
402 return false;
403 if (!m_parser_vars->m_sym_ctx.target_sp)
Sean Callananf5857a02010-07-31 01:32:05 +0000404 return false;
405
Greg Claytone5748d82010-11-09 23:46:37 +0000406 SymbolContextList sc_list;
Sean Callananf5857a02010-07-31 01:32:05 +0000407
Sean Callananaa301c42010-12-03 01:38:59 +0000408 m_parser_vars->m_sym_ctx.FindFunctionsByName(name, false, sc_list);
Sean Callananf5857a02010-07-31 01:32:05 +0000409
Greg Claytone5748d82010-11-09 23:46:37 +0000410 if (!sc_list.GetSize())
Sean Callananf5857a02010-07-31 01:32:05 +0000411 return false;
412
413 SymbolContext sym_ctx;
Greg Claytone5748d82010-11-09 23:46:37 +0000414 sc_list.GetContextAtIndex(0, sym_ctx);
Sean Callananf5857a02010-07-31 01:32:05 +0000415
416 const Address *fun_address;
417
418 if (sym_ctx.function)
419 fun_address = &sym_ctx.function->GetAddressRange().GetBaseAddress();
420 else if (sym_ctx.symbol)
421 fun_address = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress();
422 else
423 return false;
424
Sean Callananaa301c42010-12-03 01:38:59 +0000425 ptr = fun_address->GetLoadAddress (m_parser_vars->m_exe_ctx->target);
Sean Callananf5857a02010-07-31 01:32:05 +0000426
427 return true;
428}
429
Sean Callanan810f22d2010-07-16 00:09:46 +0000430// Interface for CommandObjectExpression
Sean Callananf328c9f2010-07-20 23:31:16 +0000431
432bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000433ClangExpressionDeclMap::Materialize
434(
Sean Callananaa301c42010-12-03 01:38:59 +0000435 ExecutionContext &exe_ctx,
Greg Clayton8de27c72010-10-15 22:48:33 +0000436 lldb::addr_t &struct_address,
437 Error &err
438)
Sean Callananf328c9f2010-07-20 23:31:16 +0000439{
Sean Callananaa301c42010-12-03 01:38:59 +0000440 EnableMaterialVars();
441
442 m_material_vars->m_process = exe_ctx.process;
443
Sean Callananf328c9f2010-07-20 23:31:16 +0000444 bool result = DoMaterialize(false, exe_ctx, NULL, err);
445
446 if (result)
Sean Callananaa301c42010-12-03 01:38:59 +0000447 struct_address = m_material_vars->m_materialized_location;
Sean Callananf328c9f2010-07-20 23:31:16 +0000448
449 return result;
450}
451
452bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000453ClangExpressionDeclMap::GetObjectPointer
454(
455 lldb::addr_t &object_ptr,
Sean Callanan3aa7da52010-12-13 22:46:15 +0000456 ConstString &object_name,
Sean Callananaa301c42010-12-03 01:38:59 +0000457 ExecutionContext &exe_ctx,
Sean Callanan047923c2010-12-14 00:42:36 +0000458 Error &err,
459 bool suppress_type_check
Greg Clayton8de27c72010-10-15 22:48:33 +0000460)
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000461{
Sean Callananaa301c42010-12-03 01:38:59 +0000462 assert (m_struct_vars.get());
463
464 if (!exe_ctx.frame || !exe_ctx.target || !exe_ctx.process)
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000465 {
466 err.SetErrorString("Couldn't load 'this' because the context is incomplete");
467 return false;
468 }
469
Sean Callananaa301c42010-12-03 01:38:59 +0000470 if (!m_struct_vars->m_object_pointer_type.GetOpaqueQualType())
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000471 {
472 err.SetErrorString("Couldn't load 'this' because its type is unknown");
473 return false;
474 }
475
Sean Callanan047923c2010-12-14 00:42:36 +0000476 Variable *object_ptr_var = FindVariableInScope (*exe_ctx.frame,
477 object_name,
478 (suppress_type_check ? NULL : &m_struct_vars->m_object_pointer_type));
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000479
480 if (!object_ptr_var)
481 {
Sean Callanan3aa7da52010-12-13 22:46:15 +0000482 err.SetErrorStringWithFormat("Couldn't find '%s' with appropriate type in scope", object_name.GetCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000483 return false;
484 }
485
Sean Callananaa301c42010-12-03 01:38:59 +0000486 std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(exe_ctx,
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000487 object_ptr_var,
Sean Callananaa301c42010-12-03 01:38:59 +0000488 NULL));
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000489
490 if (!location_value.get())
491 {
Sean Callanan3aa7da52010-12-13 22:46:15 +0000492 err.SetErrorStringWithFormat("Couldn't get the location for '%s'", object_name.GetCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000493 return false;
494 }
495
496 if (location_value->GetValueType() == Value::eValueTypeLoadAddress)
497 {
498 lldb::addr_t value_addr = location_value->GetScalar().ULongLong();
Sean Callananaa301c42010-12-03 01:38:59 +0000499 uint32_t address_byte_size = exe_ctx.target->GetArchitecture().GetAddressByteSize();
500 lldb::ByteOrder address_byte_order = exe_ctx.process->GetByteOrder();
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000501
Sean Callananaa301c42010-12-03 01:38:59 +0000502 if (ClangASTType::GetClangTypeBitWidth(m_struct_vars->m_object_pointer_type.GetASTContext(),
503 m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) != address_byte_size * 8)
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000504 {
Sean Callanan3aa7da52010-12-13 22:46:15 +0000505 err.SetErrorStringWithFormat("'%s' is not of an expected pointer size", object_name.GetCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000506 return false;
507 }
508
509 DataBufferHeap data;
510 data.SetByteSize(address_byte_size);
511 Error read_error;
512
Sean Callananaa301c42010-12-03 01:38:59 +0000513 if (exe_ctx.process->ReadMemory (value_addr, data.GetBytes(), address_byte_size, read_error) != address_byte_size)
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000514 {
Sean Callanan3aa7da52010-12-13 22:46:15 +0000515 err.SetErrorStringWithFormat("Coldn't read '%s' from the target: %s", object_name.GetCString(), read_error.AsCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000516 return false;
517 }
518
519 DataExtractor extractor(data.GetBytes(), data.GetByteSize(), address_byte_order, address_byte_size);
520
521 uint32_t offset = 0;
522
523 object_ptr = extractor.GetPointer(&offset);
524
525 return true;
526 }
527 else
528 {
Sean Callanan3aa7da52010-12-13 22:46:15 +0000529 err.SetErrorStringWithFormat("'%s' is not in memory; LLDB must be extended to handle registers", object_name.GetCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000530 return false;
531 }
532}
533
534bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000535ClangExpressionDeclMap::Dematerialize
536(
Sean Callananaa301c42010-12-03 01:38:59 +0000537 ExecutionContext &exe_ctx,
Greg Clayton427f2902010-12-14 02:59:59 +0000538 ClangExpressionVariableSP &result_sp,
Greg Clayton8de27c72010-10-15 22:48:33 +0000539 Error &err
540)
Sean Callananf328c9f2010-07-20 23:31:16 +0000541{
Greg Clayton427f2902010-12-14 02:59:59 +0000542 return DoMaterialize(true, exe_ctx, &result_sp, err);
Sean Callananaa301c42010-12-03 01:38:59 +0000543
544 DidDematerialize();
545}
546
547void
548ClangExpressionDeclMap::DidDematerialize()
549{
550 if (m_material_vars.get())
551 {
552 if (m_material_vars->m_materialized_location)
553 {
554 //#define SINGLE_STEP_EXPRESSIONS
555
556#ifndef SINGLE_STEP_EXPRESSIONS
557 m_material_vars->m_process->DeallocateMemory(m_material_vars->m_materialized_location);
558#endif
559 m_material_vars->m_materialized_location = 0;
560 }
561
562 DisableMaterialVars();
563 }
Sean Callananf328c9f2010-07-20 23:31:16 +0000564}
565
Sean Callanan32824aa2010-07-23 22:19:18 +0000566bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000567ClangExpressionDeclMap::DumpMaterializedStruct
568(
Sean Callananaa301c42010-12-03 01:38:59 +0000569 ExecutionContext &exe_ctx,
Greg Clayton8de27c72010-10-15 22:48:33 +0000570 Stream &s,
571 Error &err
572)
Sean Callanan32824aa2010-07-23 22:19:18 +0000573{
Sean Callananaa301c42010-12-03 01:38:59 +0000574 assert (m_struct_vars.get());
575 assert (m_material_vars.get());
576
577 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan32824aa2010-07-23 22:19:18 +0000578 {
579 err.SetErrorString("Structure hasn't been laid out yet");
580 return false;
581 }
582
Sean Callananaa301c42010-12-03 01:38:59 +0000583 if (!exe_ctx.process)
Sean Callanan32824aa2010-07-23 22:19:18 +0000584 {
585 err.SetErrorString("Couldn't find the process");
586 return false;
587 }
588
Sean Callananaa301c42010-12-03 01:38:59 +0000589 if (!exe_ctx.target)
Sean Callanan32824aa2010-07-23 22:19:18 +0000590 {
591 err.SetErrorString("Couldn't find the target");
592 return false;
593 }
594
Sean Callanan33711022010-12-07 10:00:20 +0000595 if (!m_material_vars->m_materialized_location)
596 {
597 err.SetErrorString("No materialized location");
598 return false;
599 }
600
Sean Callananaa301c42010-12-03 01:38:59 +0000601 lldb::DataBufferSP data(new DataBufferHeap(m_struct_vars->m_struct_size, 0));
Sean Callanan32824aa2010-07-23 22:19:18 +0000602
603 Error error;
Sean Callananaa301c42010-12-03 01:38:59 +0000604 if (exe_ctx.process->ReadMemory (m_material_vars->m_materialized_location, data->GetBytes(), data->GetByteSize(), error) != data->GetByteSize())
Sean Callanan32824aa2010-07-23 22:19:18 +0000605 {
606 err.SetErrorStringWithFormat ("Couldn't read struct from the target: %s", error.AsCString());
607 return false;
608 }
609
Sean Callananaa301c42010-12-03 01:38:59 +0000610 DataExtractor extractor(data, exe_ctx.process->GetByteOrder(), exe_ctx.target->GetArchitecture().GetAddressByteSize());
Sean Callanan32824aa2010-07-23 22:19:18 +0000611
Greg Clayton427f2902010-12-14 02:59:59 +0000612 for (size_t member_idx = 0, num_members = m_struct_members.GetSize();
613 member_idx < num_members;
614 ++member_idx)
Sean Callanan32824aa2010-07-23 22:19:18 +0000615 {
Greg Clayton427f2902010-12-14 02:59:59 +0000616 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_idx));
Sean Callanan32824aa2010-07-23 22:19:18 +0000617
Greg Clayton427f2902010-12-14 02:59:59 +0000618 if (!member_sp)
619 return false;
620
621 s.Printf("[%s]\n", member_sp->GetName().GetCString());
Sean Callanan8c127202010-08-23 23:09:38 +0000622
Greg Clayton427f2902010-12-14 02:59:59 +0000623 if (!member_sp->m_jit_vars.get())
Sean Callanan8c127202010-08-23 23:09:38 +0000624 return false;
625
Greg Clayton427f2902010-12-14 02:59:59 +0000626 extractor.Dump (&s, // stream
627 member_sp->m_jit_vars->m_offset, // offset
628 lldb::eFormatBytesWithASCII, // format
629 1, // byte size of individual entries
630 member_sp->m_jit_vars->m_size, // number of entries
631 16, // entries per line
632 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, // address to print
633 0, // bit size (bitfields only; 0 means ignore)
634 0); // bit alignment (bitfields only; 0 means ignore)
Sean Callanan32824aa2010-07-23 22:19:18 +0000635
636 s.PutChar('\n');
637 }
638
639 return true;
640}
641
Sean Callananf328c9f2010-07-20 23:31:16 +0000642bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000643ClangExpressionDeclMap::DoMaterialize
644(
645 bool dematerialize,
Sean Callananaa301c42010-12-03 01:38:59 +0000646 ExecutionContext &exe_ctx,
Greg Clayton427f2902010-12-14 02:59:59 +0000647 lldb::ClangExpressionVariableSP *result_sp_ptr,
Greg Clayton8de27c72010-10-15 22:48:33 +0000648 Error &err
649)
Sean Callanan810f22d2010-07-16 00:09:46 +0000650{
Greg Clayton427f2902010-12-14 02:59:59 +0000651 if (result_sp_ptr)
652 result_sp_ptr->reset();
653
Sean Callananaa301c42010-12-03 01:38:59 +0000654 assert (m_struct_vars.get());
655
Greg Claytone005f2c2010-11-06 01:53:30 +0000656 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan82b74c82010-08-12 01:56:52 +0000657
Sean Callananaa301c42010-12-03 01:38:59 +0000658 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan810f22d2010-07-16 00:09:46 +0000659 {
660 err.SetErrorString("Structure hasn't been laid out yet");
661 return LLDB_INVALID_ADDRESS;
662 }
663
Sean Callananaa301c42010-12-03 01:38:59 +0000664 if (!exe_ctx.frame)
Sean Callanan45839272010-07-24 01:37:44 +0000665 {
666 err.SetErrorString("Received null execution frame");
667 return LLDB_INVALID_ADDRESS;
668 }
669
Greg Clayton427f2902010-12-14 02:59:59 +0000670 ClangPersistentVariables &persistent_vars = exe_ctx.target->GetPersistentVariables();
Sean Callananaa301c42010-12-03 01:38:59 +0000671
672 if (!m_struct_vars->m_struct_size)
Sean Callanane8a59a82010-09-13 21:34:21 +0000673 {
674 if (log)
675 log->PutCString("Not bothering to allocate a struct because no arguments are needed");
676
Sean Callananaa301c42010-12-03 01:38:59 +0000677 m_material_vars->m_allocated_area = NULL;
Sean Callanane8a59a82010-09-13 21:34:21 +0000678
679 return true;
680 }
681
Sean Callananaa301c42010-12-03 01:38:59 +0000682 const SymbolContext &sym_ctx(exe_ctx.frame->GetSymbolContext(lldb::eSymbolContextEverything));
Sean Callanan810f22d2010-07-16 00:09:46 +0000683
Sean Callananf328c9f2010-07-20 23:31:16 +0000684 if (!dematerialize)
Sean Callanan810f22d2010-07-16 00:09:46 +0000685 {
Sean Callananaa301c42010-12-03 01:38:59 +0000686 if (m_material_vars->m_materialized_location)
Sean Callananf328c9f2010-07-20 23:31:16 +0000687 {
Sean Callananaa301c42010-12-03 01:38:59 +0000688 exe_ctx.process->DeallocateMemory(m_material_vars->m_materialized_location);
689 m_material_vars->m_materialized_location = 0;
Sean Callananf328c9f2010-07-20 23:31:16 +0000690 }
691
Sean Callanan7a60b942010-10-08 01:58:41 +0000692 if (log)
693 log->PutCString("Allocating memory for materialized argument struct");
694
Sean Callananaa301c42010-12-03 01:38:59 +0000695 lldb::addr_t mem = exe_ctx.process->AllocateMemory(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size,
696 lldb::ePermissionsReadable | lldb::ePermissionsWritable,
697 err);
Sean Callananf328c9f2010-07-20 23:31:16 +0000698
699 if (mem == LLDB_INVALID_ADDRESS)
700 return false;
701
Sean Callananaa301c42010-12-03 01:38:59 +0000702 m_material_vars->m_allocated_area = mem;
Sean Callanan810f22d2010-07-16 00:09:46 +0000703 }
704
Sean Callananaa301c42010-12-03 01:38:59 +0000705 m_material_vars->m_materialized_location = m_material_vars->m_allocated_area;
Sean Callananf328c9f2010-07-20 23:31:16 +0000706
Sean Callananaa301c42010-12-03 01:38:59 +0000707 if (m_material_vars->m_materialized_location % m_struct_vars->m_struct_alignment)
708 m_material_vars->m_materialized_location += (m_struct_vars->m_struct_alignment - (m_material_vars->m_materialized_location % m_struct_vars->m_struct_alignment));
Sean Callananf328c9f2010-07-20 23:31:16 +0000709
Greg Clayton427f2902010-12-14 02:59:59 +0000710 for (uint64_t member_index = 0, num_members = m_struct_members.GetSize();
Sean Callanan8c127202010-08-23 23:09:38 +0000711 member_index < num_members;
712 ++member_index)
Sean Callanan810f22d2010-07-16 00:09:46 +0000713 {
Greg Clayton427f2902010-12-14 02:59:59 +0000714 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
Sean Callanan810f22d2010-07-16 00:09:46 +0000715
Greg Clayton427f2902010-12-14 02:59:59 +0000716 ClangExpressionVariableSP entity_sp (m_found_entities.GetVariable(member_sp->GetName()));
Sean Callananaa301c42010-12-03 01:38:59 +0000717
Greg Clayton427f2902010-12-14 02:59:59 +0000718 ClangExpressionVariableSP persistent_var_sp (persistent_vars.GetVariable(member_sp->GetName()));
Sean Callanan8c127202010-08-23 23:09:38 +0000719
Greg Clayton427f2902010-12-14 02:59:59 +0000720 if (entity_sp)
Sean Callanan8c127202010-08-23 23:09:38 +0000721 {
Greg Clayton427f2902010-12-14 02:59:59 +0000722 RegisterInfo *reg_info = entity_sp->GetRegisterInfo ();
723 if (reg_info)
Sean Callanan1ddd9fe2010-11-30 00:27:43 +0000724 {
725 // This is a register variable
726
Sean Callananaa301c42010-12-03 01:38:59 +0000727 RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
Sean Callanan1ddd9fe2010-11-30 00:27:43 +0000728
729 if (!reg_ctx)
730 return false;
731
Greg Clayton427f2902010-12-14 02:59:59 +0000732 if (!DoMaterializeOneRegister (dematerialize,
733 exe_ctx,
734 *reg_ctx,
735 *reg_info,
736 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
737 err))
Sean Callanan1ddd9fe2010-11-30 00:27:43 +0000738 return false;
739 }
740 else
741 {
Greg Clayton427f2902010-12-14 02:59:59 +0000742 if (!member_sp->m_jit_vars.get())
Sean Callanan1ddd9fe2010-11-30 00:27:43 +0000743 return false;
744
Greg Clayton427f2902010-12-14 02:59:59 +0000745 if (!DoMaterializeOneVariable (dematerialize,
746 exe_ctx,
747 sym_ctx,
748 member_sp->GetName(),
749 member_sp->GetTypeFromUser(),
750 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
751 err))
Sean Callanan1ddd9fe2010-11-30 00:27:43 +0000752 return false;
753 }
Sean Callanan8c127202010-08-23 23:09:38 +0000754 }
Greg Clayton427f2902010-12-14 02:59:59 +0000755 else if (persistent_var_sp)
Sean Callanan8c127202010-08-23 23:09:38 +0000756 {
Greg Clayton427f2902010-12-14 02:59:59 +0000757 if (member_sp->GetName() == m_struct_vars->m_result_name)
Sean Callanan45690fe2010-08-30 22:17:16 +0000758 {
759 if (!dematerialize)
760 continue;
Sean Callanan8c127202010-08-23 23:09:38 +0000761
Sean Callanan8c127202010-08-23 23:09:38 +0000762 if (log)
763 log->PutCString("Found result member in the struct");
Sean Callanan45690fe2010-08-30 22:17:16 +0000764
Greg Clayton427f2902010-12-14 02:59:59 +0000765 if (result_sp_ptr)
766 *result_sp_ptr = member_sp;
Sean Callanan8c127202010-08-23 23:09:38 +0000767 }
768
Sean Callanan45690fe2010-08-30 22:17:16 +0000769 if (log)
Greg Clayton427f2902010-12-14 02:59:59 +0000770 log->Printf("Searched for persistent variable %s and found %s", member_sp->GetName().GetCString(), persistent_var_sp->GetName().GetCString());
Sean Callanan45690fe2010-08-30 22:17:16 +0000771
Greg Clayton427f2902010-12-14 02:59:59 +0000772 if (!DoMaterializeOnePersistentVariable (dematerialize,
773 exe_ctx,
774 persistent_var_sp,
775 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
776 err))
Sean Callanan8c127202010-08-23 23:09:38 +0000777 return false;
778 }
779 else
780 {
Greg Clayton427f2902010-12-14 02:59:59 +0000781 err.SetErrorStringWithFormat("Unexpected variable %s", member_sp->GetName().GetCString());
Sean Callanan8c127202010-08-23 23:09:38 +0000782 return false;
783 }
Sean Callanan810f22d2010-07-16 00:09:46 +0000784 }
785
Sean Callananf328c9f2010-07-20 23:31:16 +0000786 return true;
787}
788
Sean Callanana48fe162010-08-11 03:57:18 +0000789bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000790ClangExpressionDeclMap::DoMaterializeOnePersistentVariable
791(
792 bool dematerialize,
793 ExecutionContext &exe_ctx,
Greg Clayton427f2902010-12-14 02:59:59 +0000794 ClangExpressionVariableSP &var_sp,
Greg Clayton8de27c72010-10-15 22:48:33 +0000795 lldb::addr_t addr,
796 Error &err
797)
Sean Callananaa301c42010-12-03 01:38:59 +0000798{
Greg Clayton427f2902010-12-14 02:59:59 +0000799 if (!var_sp)
Sean Callanana48fe162010-08-11 03:57:18 +0000800 {
Greg Clayton427f2902010-12-14 02:59:59 +0000801 err.SetErrorString("Invalid persistent variable");
Sean Callanana48fe162010-08-11 03:57:18 +0000802 return LLDB_INVALID_ADDRESS;
803 }
804
Greg Clayton427f2902010-12-14 02:59:59 +0000805 const size_t pvar_byte_size = var_sp->GetByteSize();
Sean Callanana6223432010-08-20 01:02:30 +0000806
Greg Clayton427f2902010-12-14 02:59:59 +0000807 uint8_t *pvar_data = var_sp->GetValueBytes();
808 if (pvar_data == NULL)
Sean Callanana6223432010-08-20 01:02:30 +0000809 return false;
810
Sean Callanana48fe162010-08-11 03:57:18 +0000811 Error error;
812
813 if (dematerialize)
814 {
Greg Clayton427f2902010-12-14 02:59:59 +0000815 var_sp->ValueUpdated ();
816 if (exe_ctx.process->ReadMemory (addr, pvar_data, pvar_byte_size, error) != pvar_byte_size)
Sean Callanana48fe162010-08-11 03:57:18 +0000817 {
818 err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString());
819 return false;
820 }
821 }
822 else
823 {
Greg Clayton427f2902010-12-14 02:59:59 +0000824 if (exe_ctx.process->WriteMemory (addr, pvar_data, pvar_byte_size, error) != pvar_byte_size)
Sean Callanana48fe162010-08-11 03:57:18 +0000825 {
826 err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString());
827 return false;
828 }
829 }
830
831 return true;
832}
833
Sean Callananf328c9f2010-07-20 23:31:16 +0000834bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000835ClangExpressionDeclMap::DoMaterializeOneVariable
836(
837 bool dematerialize,
838 ExecutionContext &exe_ctx,
839 const SymbolContext &sym_ctx,
840 const ConstString &name,
841 TypeFromUser type,
842 lldb::addr_t addr,
843 Error &err
844)
Sean Callananf328c9f2010-07-20 23:31:16 +0000845{
Greg Claytone005f2c2010-11-06 01:53:30 +0000846 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callananf328c9f2010-07-20 23:31:16 +0000847
Sean Callanan17c6a052010-10-05 20:18:48 +0000848 if (!exe_ctx.frame || !exe_ctx.process)
Sean Callanancc074622010-09-14 21:59:34 +0000849 return false;
850
Greg Clayton3bc52d02010-11-14 22:13:40 +0000851 Variable *var = FindVariableInScope (*exe_ctx.frame, name, &type);
Sean Callananf328c9f2010-07-20 23:31:16 +0000852
853 if (!var)
854 {
Greg Clayton8de27c72010-10-15 22:48:33 +0000855 err.SetErrorStringWithFormat("Couldn't find %s with appropriate type", name.GetCString());
Sean Callananf328c9f2010-07-20 23:31:16 +0000856 return false;
857 }
858
Sean Callanan841026f2010-07-23 00:16:21 +0000859 if (log)
Greg Clayton8de27c72010-10-15 22:48:33 +0000860 log->Printf("%s %s with type %p", (dematerialize ? "Dematerializing" : "Materializing"), name.GetCString(), type.GetOpaqueQualType());
Sean Callananf328c9f2010-07-20 23:31:16 +0000861
862 std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(exe_ctx,
863 var,
Sean Callananaa301c42010-12-03 01:38:59 +0000864 NULL));
Sean Callananf328c9f2010-07-20 23:31:16 +0000865
866 if (!location_value.get())
867 {
Greg Clayton8de27c72010-10-15 22:48:33 +0000868 err.SetErrorStringWithFormat("Couldn't get value for %s", name.GetCString());
Sean Callananf328c9f2010-07-20 23:31:16 +0000869 return false;
870 }
Sean Callanan17c6a052010-10-05 20:18:48 +0000871
872 // The size of the type contained in addr
Sean Callananf328c9f2010-07-20 23:31:16 +0000873
Sean Callanan17c6a052010-10-05 20:18:48 +0000874 size_t addr_bit_size = ClangASTType::GetClangTypeBitWidth(type.GetASTContext(), type.GetOpaqueQualType());
875 size_t addr_byte_size = addr_bit_size % 8 ? ((addr_bit_size + 8) / 8) : (addr_bit_size / 8);
876
877 Value::ValueType value_type = location_value->GetValueType();
878
879 switch (value_type)
Sean Callananf328c9f2010-07-20 23:31:16 +0000880 {
Sean Callanan17c6a052010-10-05 20:18:48 +0000881 default:
Sean Callananf328c9f2010-07-20 23:31:16 +0000882 {
Sean Callanan17c6a052010-10-05 20:18:48 +0000883 StreamString ss;
884
885 location_value->Dump(&ss);
886
Greg Clayton8de27c72010-10-15 22:48:33 +0000887 err.SetErrorStringWithFormat("%s has a value of unhandled type: %s", name.GetCString(), ss.GetString().c_str());
Sean Callananf328c9f2010-07-20 23:31:16 +0000888 return false;
889 }
Sean Callanan17c6a052010-10-05 20:18:48 +0000890 break;
891 case Value::eValueTypeLoadAddress:
Sean Callananf328c9f2010-07-20 23:31:16 +0000892 {
Sean Callanan17c6a052010-10-05 20:18:48 +0000893 lldb::addr_t value_addr = location_value->GetScalar().ULongLong();
894
895 DataBufferHeap data;
896 data.SetByteSize(addr_byte_size);
897
898 lldb::addr_t src_addr;
899 lldb::addr_t dest_addr;
900
901 if (dematerialize)
902 {
903 src_addr = addr;
904 dest_addr = value_addr;
905 }
906 else
907 {
908 src_addr = value_addr;
909 dest_addr = addr;
910 }
911
912 Error error;
913 if (exe_ctx.process->ReadMemory (src_addr, data.GetBytes(), addr_byte_size, error) != addr_byte_size)
914 {
Greg Clayton8de27c72010-10-15 22:48:33 +0000915 err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", name.GetCString(), error.AsCString());
Sean Callanan17c6a052010-10-05 20:18:48 +0000916 return false;
917 }
918
919 if (exe_ctx.process->WriteMemory (dest_addr, data.GetBytes(), addr_byte_size, error) != addr_byte_size)
920 {
Greg Clayton8de27c72010-10-15 22:48:33 +0000921 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", name.GetCString(), error.AsCString());
Sean Callanan17c6a052010-10-05 20:18:48 +0000922 return false;
923 }
924
925 if (log)
926 log->Printf("Copied from 0x%llx to 0x%llx", (uint64_t)src_addr, (uint64_t)addr);
Sean Callananf328c9f2010-07-20 23:31:16 +0000927 }
Sean Callanan17c6a052010-10-05 20:18:48 +0000928 break;
929 case Value::eValueTypeScalar:
930 {
Greg Clayton6916e352010-11-13 03:52:47 +0000931 if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
Sean Callanan17c6a052010-10-05 20:18:48 +0000932 {
933 StreamString ss;
934
935 location_value->Dump(&ss);
936
Greg Clayton8de27c72010-10-15 22:48:33 +0000937 err.SetErrorStringWithFormat("%s is a scalar of unhandled type: %s", name.GetCString(), ss.GetString().c_str());
Sean Callanan17c6a052010-10-05 20:18:48 +0000938 return false;
939 }
940
941 lldb::RegisterInfo *register_info = location_value->GetRegisterInfo();
942
943 if (!register_info)
944 {
Greg Clayton8de27c72010-10-15 22:48:33 +0000945 err.SetErrorStringWithFormat("Couldn't get the register information for %s", name.GetCString());
Sean Callanan17c6a052010-10-05 20:18:48 +0000946 return false;
947 }
948
949 RegisterContext *register_context = exe_ctx.GetRegisterContext();
950
951 if (!register_context)
952 {
Greg Clayton8de27c72010-10-15 22:48:33 +0000953 err.SetErrorStringWithFormat("Couldn't read register context to read %s from %s", name.GetCString(), register_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +0000954 return false;
955 }
956
957 uint32_t register_number = register_info->kinds[lldb::eRegisterKindLLDB];
958 uint32_t register_byte_size = register_info->byte_size;
959
960 if (dematerialize)
961 {
962 // Moving from addr into a register
963 //
964 // Case 1: addr_byte_size and register_byte_size are the same
965 //
966 // |AABBCCDD| Address contents
967 // |AABBCCDD| Register contents
968 //
969 // Case 2: addr_byte_size is bigger than register_byte_size
970 //
971 // Error! (The register should always be big enough to hold the data)
972 //
973 // Case 3: register_byte_size is bigger than addr_byte_size
974 //
975 // |AABB| Address contents
976 // |AABB0000| Register contents [on little-endian hardware]
977 // |0000AABB| Register contents [on big-endian hardware]
978
979 if (addr_byte_size > register_byte_size)
980 {
Greg Clayton8de27c72010-10-15 22:48:33 +0000981 err.SetErrorStringWithFormat("%s is too big to store in %s", name.GetCString(), register_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +0000982 return false;
983 }
984
985 uint32_t register_offset;
986
987 switch (exe_ctx.process->GetByteOrder())
988 {
989 default:
Greg Clayton8de27c72010-10-15 22:48:33 +0000990 err.SetErrorStringWithFormat("%s is stored with an unhandled byte order", name.GetCString());
Sean Callanan17c6a052010-10-05 20:18:48 +0000991 return false;
992 case lldb::eByteOrderLittle:
993 register_offset = 0;
994 break;
995 case lldb::eByteOrderBig:
996 register_offset = register_byte_size - addr_byte_size;
997 break;
998 }
999
1000 DataBufferHeap register_data (register_byte_size, 0);
1001
1002 Error error;
1003 if (exe_ctx.process->ReadMemory (addr, register_data.GetBytes() + register_offset, addr_byte_size, error) != addr_byte_size)
1004 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001005 err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", name.GetCString(), error.AsCString());
Sean Callanan17c6a052010-10-05 20:18:48 +00001006 return false;
1007 }
1008
1009 DataExtractor register_extractor (register_data.GetBytes(), register_byte_size, exe_ctx.process->GetByteOrder(), exe_ctx.process->GetAddressByteSize());
1010
1011 if (!register_context->WriteRegisterBytes(register_number, register_extractor, 0))
1012 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001013 err.SetErrorStringWithFormat("Couldn't read %s from %s", name.GetCString(), register_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001014 return false;
1015 }
1016 }
1017 else
1018 {
1019 // Moving from a register into addr
1020 //
1021 // Case 1: addr_byte_size and register_byte_size are the same
1022 //
1023 // |AABBCCDD| Register contents
1024 // |AABBCCDD| Address contents
1025 //
1026 // Case 2: addr_byte_size is bigger than register_byte_size
1027 //
1028 // Error! (The register should always be big enough to hold the data)
1029 //
1030 // Case 3: register_byte_size is bigger than addr_byte_size
1031 //
1032 // |AABBCCDD| Register contents
1033 // |AABB| Address contents on little-endian hardware
1034 // |CCDD| Address contents on big-endian hardware
1035
1036 if (addr_byte_size > register_byte_size)
1037 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001038 err.SetErrorStringWithFormat("%s is too big to store in %s", name.GetCString(), register_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001039 return false;
1040 }
1041
1042 uint32_t register_offset;
1043
1044 switch (exe_ctx.process->GetByteOrder())
1045 {
1046 default:
Greg Clayton8de27c72010-10-15 22:48:33 +00001047 err.SetErrorStringWithFormat("%s is stored with an unhandled byte order", name.GetCString());
Sean Callanan17c6a052010-10-05 20:18:48 +00001048 return false;
1049 case lldb::eByteOrderLittle:
1050 register_offset = 0;
1051 break;
1052 case lldb::eByteOrderBig:
1053 register_offset = register_byte_size - addr_byte_size;
1054 break;
1055 }
1056
1057 DataExtractor register_extractor;
1058
1059 if (!register_context->ReadRegisterBytes(register_number, register_extractor))
1060 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001061 err.SetErrorStringWithFormat("Couldn't read %s from %s", name.GetCString(), register_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001062 return false;
1063 }
1064
1065 const void *register_data = register_extractor.GetData(&register_offset, addr_byte_size);
1066
1067 if (!register_data)
1068 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001069 err.SetErrorStringWithFormat("Read but couldn't extract data for %s from %s", name.GetCString(), register_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001070 return false;
1071 }
1072
1073 Error error;
1074 if (exe_ctx.process->WriteMemory (addr, register_data, addr_byte_size, error) != addr_byte_size)
1075 {
1076 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", error.AsCString());
1077 return false;
1078 }
1079 }
1080 }
Sean Callananf328c9f2010-07-20 23:31:16 +00001081 }
1082
1083 return true;
Sean Callanan810f22d2010-07-16 00:09:46 +00001084}
1085
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001086bool
1087ClangExpressionDeclMap::DoMaterializeOneRegister
1088(
1089 bool dematerialize,
1090 ExecutionContext &exe_ctx,
1091 RegisterContext &reg_ctx,
1092 const lldb::RegisterInfo &reg_info,
1093 lldb::addr_t addr,
1094 Error &err
1095)
1096{
1097 uint32_t register_number = reg_info.kinds[lldb::eRegisterKindLLDB];
1098 uint32_t register_byte_size = reg_info.byte_size;
1099
1100 Error error;
1101
1102 if (dematerialize)
1103 {
1104 DataBufferHeap register_data (register_byte_size, 0);
1105
1106 Error error;
1107 if (exe_ctx.process->ReadMemory (addr, register_data.GetBytes(), register_byte_size, error) != register_byte_size)
1108 {
1109 err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", reg_info.name, error.AsCString());
1110 return false;
1111 }
1112
1113 DataExtractor register_extractor (register_data.GetBytes(), register_byte_size, exe_ctx.process->GetByteOrder(), exe_ctx.process->GetAddressByteSize());
1114
1115 if (!reg_ctx.WriteRegisterBytes(register_number, register_extractor, 0))
1116 {
1117 err.SetErrorStringWithFormat("Couldn't read %s", reg_info.name);
1118 return false;
1119 }
1120 }
1121 else
1122 {
1123 DataExtractor register_extractor;
1124
1125 if (!reg_ctx.ReadRegisterBytes(register_number, register_extractor))
1126 {
1127 err.SetErrorStringWithFormat("Couldn't read %s", reg_info.name);
1128 return false;
1129 }
1130
1131 uint32_t register_offset = 0;
1132
1133 const void *register_data = register_extractor.GetData(&register_offset, register_byte_size);
1134
1135 if (!register_data)
1136 {
1137 err.SetErrorStringWithFormat("Read but couldn't extract data for %s", reg_info.name);
1138 return false;
1139 }
1140
1141 Error error;
1142 if (exe_ctx.process->WriteMemory (addr, register_data, register_byte_size, error) != register_byte_size)
1143 {
1144 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", error.AsCString());
1145 return false;
1146 }
1147 }
1148
1149 return true;
1150}
1151
Sean Callanancc074622010-09-14 21:59:34 +00001152Variable *
Greg Clayton8de27c72010-10-15 22:48:33 +00001153ClangExpressionDeclMap::FindVariableInScope
1154(
1155 StackFrame &frame,
1156 const ConstString &name,
1157 TypeFromUser *type
1158)
Sean Callananaa301c42010-12-03 01:38:59 +00001159{
Greg Claytone005f2c2010-11-06 01:53:30 +00001160 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanancc074622010-09-14 21:59:34 +00001161
Sean Callanancc074622010-09-14 21:59:34 +00001162 VariableList *var_list = frame.GetVariableList(true);
1163
Greg Claytonbf8e42b2010-10-14 22:52:14 +00001164 if (!var_list)
1165 return NULL;
1166
Greg Clayton3bc52d02010-11-14 22:13:40 +00001167 lldb::VariableSP var_sp (var_list->FindVariable(name));
1168
1169 const bool append = true;
1170 const uint32_t max_matches = 1;
1171 if (!var_sp)
Sean Callanancc074622010-09-14 21:59:34 +00001172 {
Greg Clayton3bc52d02010-11-14 22:13:40 +00001173 // Look for globals elsewhere in the module for the frame
Sean Callananaa301c42010-12-03 01:38:59 +00001174 ModuleSP module_sp (frame.GetSymbolContext(eSymbolContextModule).module_sp);
Greg Clayton3bc52d02010-11-14 22:13:40 +00001175 if (module_sp)
1176 {
1177 VariableList module_globals;
1178 if (module_sp->FindGlobalVariables (name, append, max_matches, module_globals))
1179 var_sp = module_globals.GetVariableAtIndex (0);
1180 }
1181 }
1182
1183 if (!var_sp)
1184 {
1185 // Look for globals elsewhere in the program (all images)
Sean Callananaa301c42010-12-03 01:38:59 +00001186 TargetSP target_sp (frame.GetSymbolContext(eSymbolContextTarget).target_sp);
Greg Clayton3bc52d02010-11-14 22:13:40 +00001187 if (target_sp)
1188 {
1189 VariableList program_globals;
1190 if (target_sp->GetImages().FindGlobalVariables (name, append, max_matches, program_globals))
1191 var_sp = program_globals.GetVariableAtIndex (0);
1192 }
1193 }
1194
1195 if (var_sp && type)
1196 {
1197 if (type->GetASTContext() == var_sp->GetType()->GetClangAST())
1198 {
1199 if (!ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangType()))
1200 return NULL;
1201 }
1202 else
1203 {
1204 if (log)
1205 log->PutCString("Skipping a candidate variable because of different AST contexts");
Sean Callanancc074622010-09-14 21:59:34 +00001206 return NULL;
Greg Clayton3bc52d02010-11-14 22:13:40 +00001207 }
Sean Callanancc074622010-09-14 21:59:34 +00001208 }
Greg Clayton3bc52d02010-11-14 22:13:40 +00001209
1210 return var_sp.get();
Sean Callanancc074622010-09-14 21:59:34 +00001211}
Sean Callanan336a0002010-07-17 00:43:37 +00001212
Chris Lattner24943d22010-06-08 16:52:24 +00001213// Interface for ClangASTSource
1214void
Greg Claytone5748d82010-11-09 23:46:37 +00001215ClangExpressionDeclMap::GetDecls (NameSearchContext &context, const ConstString &name)
Chris Lattner24943d22010-06-08 16:52:24 +00001216{
Sean Callananaa301c42010-12-03 01:38:59 +00001217 assert (m_struct_vars.get());
1218 assert (m_parser_vars.get());
1219
Greg Claytone005f2c2010-11-06 01:53:30 +00001220 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001221
Sean Callanan810f22d2010-07-16 00:09:46 +00001222 if (log)
Greg Clayton8de27c72010-10-15 22:48:33 +00001223 log->Printf("Hunting for a definition for '%s'", name.GetCString());
Chris Lattner24943d22010-06-08 16:52:24 +00001224
1225 // Back out in all cases where we're not fully initialized
Sean Callananaa301c42010-12-03 01:38:59 +00001226 if (m_parser_vars->m_exe_ctx->frame == NULL)
Chris Lattner24943d22010-06-08 16:52:24 +00001227 return;
Sean Callananee8fc722010-11-19 20:20:02 +00001228
Sean Callananaa301c42010-12-03 01:38:59 +00001229 if (m_parser_vars->m_ignore_lookups)
Sean Callananee8fc722010-11-19 20:20:02 +00001230 {
1231 if (log)
1232 log->Printf("Ignoring a query during an import");
1233 return;
1234 }
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001235
Greg Claytone5748d82010-11-09 23:46:37 +00001236 SymbolContextList sc_list;
Chris Lattner24943d22010-06-08 16:52:24 +00001237
Greg Clayton3bc52d02010-11-14 22:13:40 +00001238 const char *name_unique_cstr = name.GetCString();
1239
1240 if (name_unique_cstr == NULL)
1241 return;
1242
Greg Clayton8de27c72010-10-15 22:48:33 +00001243 // Only look for functions by name out in our symbols if the function
1244 // doesn't start with our phony prefix of '$'
Greg Clayton3bc52d02010-11-14 22:13:40 +00001245 if (name_unique_cstr[0] != '$')
Sean Callanan0fc73582010-07-27 00:55:47 +00001246 {
Sean Callananaa301c42010-12-03 01:38:59 +00001247 Variable *var = FindVariableInScope(*m_parser_vars->m_exe_ctx->frame, name);
Greg Clayton8de27c72010-10-15 22:48:33 +00001248
1249 // If we found a variable in scope, no need to pull up function names
1250 if (var != NULL)
1251 {
1252 AddOneVariable(context, var);
1253 }
1254 else
1255 {
Sean Callananaa301c42010-12-03 01:38:59 +00001256 m_parser_vars->m_sym_ctx.FindFunctionsByName (name, false, sc_list);
Greg Clayton8de27c72010-10-15 22:48:33 +00001257
1258 bool found_specific = false;
1259 Symbol *generic_symbol = NULL;
1260 Symbol *non_extern_symbol = NULL;
1261
Greg Claytone5748d82010-11-09 23:46:37 +00001262 for (uint32_t index = 0, num_indices = sc_list.GetSize();
Greg Clayton8de27c72010-10-15 22:48:33 +00001263 index < num_indices;
1264 ++index)
1265 {
1266 SymbolContext sym_ctx;
Greg Claytone5748d82010-11-09 23:46:37 +00001267 sc_list.GetContextAtIndex(index, sym_ctx);
Sean Callanan3cfbd332010-10-06 00:10:07 +00001268
Greg Clayton8de27c72010-10-15 22:48:33 +00001269 if (sym_ctx.function)
1270 {
1271 // TODO only do this if it's a C function; C++ functions may be
1272 // overloaded
1273 if (!found_specific)
1274 AddOneFunction(context, sym_ctx.function, NULL);
1275 found_specific = true;
1276 }
1277 else if (sym_ctx.symbol)
1278 {
1279 if (sym_ctx.symbol->IsExternal())
1280 generic_symbol = sym_ctx.symbol;
1281 else
1282 non_extern_symbol = sym_ctx.symbol;
1283 }
1284 }
1285
Sean Callanan92aa6662010-09-07 21:49:41 +00001286 if (!found_specific)
Greg Clayton8de27c72010-10-15 22:48:33 +00001287 {
1288 if (generic_symbol)
1289 AddOneFunction(context, NULL, generic_symbol);
1290 else if (non_extern_symbol)
1291 AddOneFunction(context, NULL, non_extern_symbol);
1292 }
Greg Clayton6916e352010-11-13 03:52:47 +00001293
Sean Callananaa301c42010-12-03 01:38:59 +00001294 ClangNamespaceDecl namespace_decl (m_parser_vars->m_sym_ctx.FindNamespace(name));
Greg Clayton6916e352010-11-13 03:52:47 +00001295 if (namespace_decl)
1296 {
Greg Clayton9ceed1e2010-11-13 04:18:24 +00001297 clang::NamespaceDecl *clang_namespace_decl = AddNamespace(context, namespace_decl);
1298 if (clang_namespace_decl)
Greg Clayton9ceed1e2010-11-13 04:18:24 +00001299 clang_namespace_decl->setHasExternalLexicalStorage();
Greg Clayton6916e352010-11-13 03:52:47 +00001300 }
Sean Callanan92aa6662010-09-07 21:49:41 +00001301 }
Sean Callanan0fc73582010-07-27 00:55:47 +00001302 }
Greg Clayton8de27c72010-10-15 22:48:33 +00001303 else
Sean Callanan3cfbd332010-10-06 00:10:07 +00001304 {
Greg Clayton57452832010-11-09 04:42:43 +00001305 static ConstString g_lldb_class_name ("$__lldb_class");
1306 if (name == g_lldb_class_name)
1307 {
1308 // Clang is looking for the type of "this"
1309
Sean Callananaa301c42010-12-03 01:38:59 +00001310 VariableList *vars = m_parser_vars->m_exe_ctx->frame->GetVariableList(false);
Greg Clayton57452832010-11-09 04:42:43 +00001311
1312 if (!vars)
1313 return;
1314
1315 lldb::VariableSP this_var = vars->FindVariable(ConstString("this"));
1316
1317 if (!this_var)
1318 return;
1319
1320 Type *this_type = this_var->GetType();
1321
1322 if (!this_type)
1323 return;
1324
Greg Clayton2403b5e2010-11-16 02:10:54 +00001325 if (log)
1326 {
1327 log->PutCString ("Type for \"this\" is: ");
1328 StreamString strm;
1329 this_type->Dump(&strm, true);
1330 log->PutCString (strm.GetData());
1331 }
1332
Greg Clayton57452832010-11-09 04:42:43 +00001333 TypeFromUser this_user_type(this_type->GetClangType(),
1334 this_type->GetClangAST());
1335
Sean Callananaa301c42010-12-03 01:38:59 +00001336 m_struct_vars->m_object_pointer_type = this_user_type;
Greg Clayton57452832010-11-09 04:42:43 +00001337
1338 void *pointer_target_type;
1339
1340 if (!ClangASTContext::IsPointerType(this_user_type.GetOpaqueQualType(),
1341 &pointer_target_type))
1342 return;
1343
1344 TypeFromUser class_user_type(pointer_target_type,
1345 this_type->GetClangAST());
1346
Sean Callanan3aa7da52010-12-13 22:46:15 +00001347 if (log)
1348 {
1349 StreamString type_stream;
1350 class_user_type.DumpTypeCode(&type_stream);
1351 type_stream.Flush();
1352 log->Printf("Adding type for $__lldb_class: %s", type_stream.GetString().c_str());
1353 }
1354
Greg Clayton57452832010-11-09 04:42:43 +00001355 AddOneType(context, class_user_type, true);
1356
1357 return;
1358 }
1359
Sean Callanan3aa7da52010-12-13 22:46:15 +00001360 static ConstString g_lldb_objc_class_name ("$__lldb_objc_class");
1361 if (name == g_lldb_objc_class_name)
1362 {
1363 // Clang is looking for the type of "*self"
1364
1365 VariableList *vars = m_parser_vars->m_exe_ctx->frame->GetVariableList(false);
1366
1367 if (!vars)
1368 return;
1369
1370 lldb::VariableSP self_var = vars->FindVariable(ConstString("self"));
1371
1372 if (!self_var)
1373 return;
1374
1375 Type *self_type = self_var->GetType();
1376
1377 if (!self_type)
1378 return;
1379
1380 TypeFromUser self_user_type(self_type->GetClangType(),
1381 self_type->GetClangAST());
1382
1383 m_struct_vars->m_object_pointer_type = self_user_type;
1384
1385 void *pointer_target_type;
1386
1387 if (!ClangASTContext::IsPointerType(self_user_type.GetOpaqueQualType(),
1388 &pointer_target_type))
1389 return;
1390
1391 TypeFromUser class_user_type(pointer_target_type,
1392 self_type->GetClangAST());
1393
1394 if (log)
1395 {
1396 StreamString type_stream;
1397 class_user_type.DumpTypeCode(&type_stream);
1398 type_stream.Flush();
1399 log->Printf("Adding type for $__lldb_objc_class: %s", type_stream.GetString().c_str());
1400 }
1401
1402 AddOneType(context, class_user_type, false);
1403
1404 return;
1405 }
Greg Clayton427f2902010-12-14 02:59:59 +00001406
1407 ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name));
Greg Clayton8de27c72010-10-15 22:48:33 +00001408
Greg Clayton427f2902010-12-14 02:59:59 +00001409 if (pvar_sp)
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001410 {
Greg Clayton427f2902010-12-14 02:59:59 +00001411 AddOneVariable(context, pvar_sp);
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001412 return;
1413 }
1414
1415 const char *reg_name(&name.GetCString()[1]);
1416
Sean Callananaa301c42010-12-03 01:38:59 +00001417 if (m_parser_vars->m_exe_ctx->GetRegisterContext())
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001418 {
Sean Callananaa301c42010-12-03 01:38:59 +00001419 const lldb::RegisterInfo *reg_info(m_parser_vars->m_exe_ctx->GetRegisterContext()->GetRegisterInfoByName(reg_name));
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001420
1421 if (reg_info)
1422 AddOneRegister(context, reg_info);
1423 }
Sean Callanan3cfbd332010-10-06 00:10:07 +00001424 }
1425
Sean Callananaa301c42010-12-03 01:38:59 +00001426 lldb::TypeSP type_sp (m_parser_vars->m_sym_ctx.FindTypeByName (name));
Sean Callananee8fc722010-11-19 20:20:02 +00001427
1428 if (type_sp)
Sean Callanan6df08402010-09-27 23:54:58 +00001429 {
Sean Callananee8fc722010-11-19 20:20:02 +00001430 if (log)
Sean Callanan6df08402010-09-27 23:54:58 +00001431 {
Sean Callananee8fc722010-11-19 20:20:02 +00001432 log->Printf ("Matching type found for \"%s\": ", name.GetCString());
1433 StreamString strm;
1434 type_sp->Dump(&strm, true);
1435 log->PutCString (strm.GetData());
1436 }
Greg Clayton2403b5e2010-11-16 02:10:54 +00001437
Sean Callananee8fc722010-11-19 20:20:02 +00001438 TypeFromUser user_type(type_sp->GetClangType(),
Greg Clayton2403b5e2010-11-16 02:10:54 +00001439 type_sp->GetClangAST());
Sean Callanan6df08402010-09-27 23:54:58 +00001440
Sean Callananee8fc722010-11-19 20:20:02 +00001441 AddOneType(context, user_type, false);
Sean Callanan6df08402010-09-27 23:54:58 +00001442 }
Sean Callanan336a0002010-07-17 00:43:37 +00001443}
1444
1445Value *
Greg Clayton8de27c72010-10-15 22:48:33 +00001446ClangExpressionDeclMap::GetVariableValue
1447(
1448 ExecutionContext &exe_ctx,
1449 Variable *var,
1450 clang::ASTContext *parser_ast_context,
1451 TypeFromUser *user_type,
1452 TypeFromParser *parser_type
1453)
Chris Lattner24943d22010-06-08 16:52:24 +00001454{
Greg Claytone005f2c2010-11-06 01:53:30 +00001455 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan6184dfe2010-06-23 00:47:48 +00001456
Chris Lattner24943d22010-06-08 16:52:24 +00001457 Type *var_type = var->GetType();
1458
1459 if (!var_type)
1460 {
Sean Callanan810f22d2010-07-16 00:09:46 +00001461 if (log)
1462 log->PutCString("Skipped a definition because it has no type");
Sean Callanan336a0002010-07-17 00:43:37 +00001463 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00001464 }
1465
Greg Clayton462d4142010-09-29 01:12:09 +00001466 void *var_opaque_type = var_type->GetClangType();
Chris Lattner24943d22010-06-08 16:52:24 +00001467
1468 if (!var_opaque_type)
1469 {
Sean Callanan810f22d2010-07-16 00:09:46 +00001470 if (log)
1471 log->PutCString("Skipped a definition because it has no Clang type");
Sean Callanan336a0002010-07-17 00:43:37 +00001472 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00001473 }
1474
Chris Lattner24943d22010-06-08 16:52:24 +00001475 TypeList *type_list = var_type->GetTypeList();
1476
1477 if (!type_list)
1478 {
Sean Callanan810f22d2010-07-16 00:09:46 +00001479 if (log)
1480 log->PutCString("Skipped a definition because the type has no associated type list");
Sean Callanan336a0002010-07-17 00:43:37 +00001481 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00001482 }
1483
1484 clang::ASTContext *exe_ast_ctx = type_list->GetClangASTContext().getASTContext();
1485
1486 if (!exe_ast_ctx)
1487 {
Sean Callanan810f22d2010-07-16 00:09:46 +00001488 if (log)
1489 log->PutCString("There is no AST context for the current execution context");
Sean Callanan336a0002010-07-17 00:43:37 +00001490 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00001491 }
1492
Sean Callanan336a0002010-07-17 00:43:37 +00001493 DWARFExpression &var_location_expr = var->LocationExpression();
1494
Chris Lattner24943d22010-06-08 16:52:24 +00001495 std::auto_ptr<Value> var_location(new Value);
1496
Greg Clayton178710c2010-09-14 02:20:48 +00001497 lldb::addr_t loclist_base_load_addr = LLDB_INVALID_ADDRESS;
1498
1499 if (var_location_expr.IsLocationList())
1500 {
1501 SymbolContext var_sc;
1502 var->CalculateSymbolContext (&var_sc);
Greg Claytoneea26402010-09-14 23:36:40 +00001503 loclist_base_load_addr = var_sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress (exe_ctx.target);
Greg Clayton178710c2010-09-14 02:20:48 +00001504 }
Chris Lattner24943d22010-06-08 16:52:24 +00001505 Error err;
1506
Jason Molenda8e69de42010-11-20 01:28:30 +00001507 if (!var_location_expr.Evaluate(&exe_ctx, exe_ast_ctx, NULL, loclist_base_load_addr, NULL, *var_location.get(), &err))
Chris Lattner24943d22010-06-08 16:52:24 +00001508 {
Sean Callanan810f22d2010-07-16 00:09:46 +00001509 if (log)
1510 log->Printf("Error evaluating location: %s", err.AsCString());
Sean Callanan336a0002010-07-17 00:43:37 +00001511 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00001512 }
1513
Sean Callanan810f22d2010-07-16 00:09:46 +00001514 clang::ASTContext *var_ast_context = type_list->GetClangASTContext().getASTContext();
1515
Sean Callanan336a0002010-07-17 00:43:37 +00001516 void *type_to_use;
1517
Sean Callananf328c9f2010-07-20 23:31:16 +00001518 if (parser_ast_context)
1519 {
Sean Callananee8fc722010-11-19 20:20:02 +00001520 type_to_use = GuardedCopyType(parser_ast_context, var_ast_context, var_opaque_type);
Sean Callananf328c9f2010-07-20 23:31:16 +00001521
Sean Callanan4b5eec62010-11-20 02:19:29 +00001522 if (!type_to_use)
1523 {
1524 if (log)
1525 log->Printf("Couldn't copy a variable's type into the parser's AST context");
1526
1527 return NULL;
1528 }
1529
Sean Callananf328c9f2010-07-20 23:31:16 +00001530 if (parser_type)
1531 *parser_type = TypeFromParser(type_to_use, parser_ast_context);
1532 }
Sean Callanan336a0002010-07-17 00:43:37 +00001533 else
1534 type_to_use = var_opaque_type;
Chris Lattner24943d22010-06-08 16:52:24 +00001535
1536 if (var_location.get()->GetContextType() == Value::eContextTypeInvalid)
Greg Clayton6916e352010-11-13 03:52:47 +00001537 var_location.get()->SetContext(Value::eContextTypeClangType, type_to_use);
Chris Lattner24943d22010-06-08 16:52:24 +00001538
1539 if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress)
1540 {
1541 SymbolContext var_sc;
1542 var->CalculateSymbolContext(&var_sc);
Sean Callanan336a0002010-07-17 00:43:37 +00001543
Chris Lattner24943d22010-06-08 16:52:24 +00001544 if (!var_sc.module_sp)
Sean Callanan336a0002010-07-17 00:43:37 +00001545 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00001546
1547 ObjectFile *object_file = var_sc.module_sp->GetObjectFile();
1548
1549 if (!object_file)
Sean Callanan336a0002010-07-17 00:43:37 +00001550 return NULL;
1551
Chris Lattner24943d22010-06-08 16:52:24 +00001552 Address so_addr(var_location->GetScalar().ULongLong(), object_file->GetSectionList());
1553
Sean Callananaa301c42010-12-03 01:38:59 +00001554 lldb::addr_t load_addr = so_addr.GetLoadAddress(exe_ctx.target);
Chris Lattner24943d22010-06-08 16:52:24 +00001555
1556 var_location->GetScalar() = load_addr;
1557 var_location->SetValueType(Value::eValueTypeLoadAddress);
1558 }
1559
Sean Callananf328c9f2010-07-20 23:31:16 +00001560 if (user_type)
1561 *user_type = TypeFromUser(var_opaque_type, var_ast_context);
Sean Callanan336a0002010-07-17 00:43:37 +00001562
1563 return var_location.release();
1564}
1565
1566void
1567ClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001568 Variable* var)
Sean Callanan336a0002010-07-17 00:43:37 +00001569{
Sean Callananaa301c42010-12-03 01:38:59 +00001570 assert (m_parser_vars.get());
1571
Greg Claytone005f2c2010-11-06 01:53:30 +00001572 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan336a0002010-07-17 00:43:37 +00001573
Sean Callananf328c9f2010-07-20 23:31:16 +00001574 TypeFromUser ut;
1575 TypeFromParser pt;
Sean Callanan336a0002010-07-17 00:43:37 +00001576
Sean Callananaa301c42010-12-03 01:38:59 +00001577 Value *var_location = GetVariableValue (*m_parser_vars->m_exe_ctx,
Greg Clayton8de27c72010-10-15 22:48:33 +00001578 var,
1579 context.GetASTContext(),
1580 &ut,
1581 &pt);
Sean Callanan336a0002010-07-17 00:43:37 +00001582
Sean Callanan4b5eec62010-11-20 02:19:29 +00001583 if (!var_location)
1584 return;
1585
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001586 NamedDecl *var_decl = context.AddVarDecl(pt.GetOpaqueQualType());
Greg Clayton8de27c72010-10-15 22:48:33 +00001587 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton427f2902010-12-14 02:59:59 +00001588 ConstString entity_name(decl_name.c_str());
1589 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (entity_name,
1590 ut,
1591 m_parser_vars->m_exe_ctx->process->GetByteOrder(),
1592 m_parser_vars->m_exe_ctx->process->GetAddressByteSize()));
1593 assert (entity.get());
1594 entity->EnableParserVars();
1595 entity->m_parser_vars->m_parser_type = pt;
1596 entity->m_parser_vars->m_named_decl = var_decl;
1597 entity->m_parser_vars->m_llvm_value = NULL;
1598 entity->m_parser_vars->m_lldb_value = var_location;
Chris Lattner24943d22010-06-08 16:52:24 +00001599
Sean Callanan810f22d2010-07-16 00:09:46 +00001600 if (log)
Greg Clayton8de27c72010-10-15 22:48:33 +00001601 {
Sean Callanana0744822010-11-01 23:22:47 +00001602 std::string var_decl_print_string;
1603 llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
1604 var_decl->print(var_decl_print_stream);
1605 var_decl_print_stream.flush();
1606
1607 log->Printf("Found variable %s, returned %s", decl_name.c_str(), var_decl_print_string.c_str());
Greg Clayton8de27c72010-10-15 22:48:33 +00001608 }
Sean Callanan8f0dc342010-06-22 23:46:24 +00001609}
1610
1611void
Sean Callanana48fe162010-08-11 03:57:18 +00001612ClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
Greg Clayton427f2902010-12-14 02:59:59 +00001613 ClangExpressionVariableSP &pvar_sp)
Sean Callanana48fe162010-08-11 03:57:18 +00001614{
Greg Claytone005f2c2010-11-06 01:53:30 +00001615 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan45690fe2010-08-30 22:17:16 +00001616
Greg Clayton427f2902010-12-14 02:59:59 +00001617 TypeFromUser user_type (pvar_sp->GetTypeFromUser());
Sean Callanana48fe162010-08-11 03:57:18 +00001618
Greg Clayton427f2902010-12-14 02:59:59 +00001619 TypeFromParser parser_type (GuardedCopyType(context.GetASTContext(),
1620 user_type.GetASTContext(),
1621 user_type.GetOpaqueQualType()),
1622 context.GetASTContext());
Sean Callanana48fe162010-08-11 03:57:18 +00001623
Sean Callanan8c127202010-08-23 23:09:38 +00001624 NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
1625
Greg Clayton427f2902010-12-14 02:59:59 +00001626 pvar_sp->EnableParserVars();
1627 pvar_sp->m_parser_vars->m_parser_type = parser_type;
1628 pvar_sp->m_parser_vars->m_named_decl = var_decl;
1629 pvar_sp->m_parser_vars->m_llvm_value = NULL;
1630 pvar_sp->m_parser_vars->m_lldb_value = NULL;
Sean Callanan45690fe2010-08-30 22:17:16 +00001631
1632 if (log)
Sean Callanana0744822010-11-01 23:22:47 +00001633 {
1634 std::string var_decl_print_string;
1635 llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
1636 var_decl->print(var_decl_print_stream);
1637 var_decl_print_stream.flush();
1638
Greg Clayton427f2902010-12-14 02:59:59 +00001639 log->Printf("Added pvar %s, returned %s", pvar_sp->GetName().GetCString(), var_decl_print_string.c_str());
Sean Callanana0744822010-11-01 23:22:47 +00001640 }
Sean Callanana48fe162010-08-11 03:57:18 +00001641}
1642
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001643void
Greg Clayton427f2902010-12-14 02:59:59 +00001644ClangExpressionDeclMap::AddOneRegister (NameSearchContext &context,
1645 const RegisterInfo *reg_info)
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001646{
1647 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1648
1649 void *ast_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize(context.GetASTContext(),
1650 reg_info->encoding,
1651 reg_info->byte_size * 8);
1652
1653 if (!ast_type)
1654 {
1655 log->Printf("Tried to add a type for %s, but couldn't get one", context.m_decl_name.getAsString().c_str());
1656 return;
1657 }
1658
Greg Clayton427f2902010-12-14 02:59:59 +00001659 TypeFromParser parser_type (ast_type,
1660 context.GetASTContext());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001661
1662 NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
1663
Greg Clayton427f2902010-12-14 02:59:59 +00001664 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->process->GetByteOrder(),
1665 m_parser_vars->m_exe_ctx->process->GetAddressByteSize()));
1666 assert (entity.get());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001667 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton427f2902010-12-14 02:59:59 +00001668 entity->SetName (ConstString (decl_name.c_str()));
1669 entity->SetRegisterInfo (reg_info);
1670 entity->EnableParserVars();
1671 entity->m_parser_vars->m_parser_type = parser_type;
1672 entity->m_parser_vars->m_named_decl = var_decl;
1673 entity->m_parser_vars->m_llvm_value = NULL;
1674 entity->m_parser_vars->m_lldb_value = NULL;
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001675
1676 if (log)
1677 {
1678 std::string var_decl_print_string;
1679 llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
1680 var_decl->print(var_decl_print_stream);
1681 var_decl_print_stream.flush();
1682
1683 log->Printf("Added register %s, returned %s", context.m_decl_name.getAsString().c_str(), var_decl_print_string.c_str());
1684 }
1685}
1686
Greg Clayton6916e352010-11-13 03:52:47 +00001687clang::NamespaceDecl *
1688ClangExpressionDeclMap::AddNamespace (NameSearchContext &context, const ClangNamespaceDecl &namespace_decl)
1689{
1690 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1691
1692
1693 clang::Decl *copied_decl = ClangASTContext::CopyDecl (context.GetASTContext(),
1694 namespace_decl.GetASTContext(),
1695 namespace_decl.GetNamespaceDecl());
1696
1697 return dyn_cast<clang::NamespaceDecl>(copied_decl);
1698}
1699
Sean Callanana48fe162010-08-11 03:57:18 +00001700void
Sean Callanan8f0dc342010-06-22 23:46:24 +00001701ClangExpressionDeclMap::AddOneFunction(NameSearchContext &context,
Sean Callanan0fc73582010-07-27 00:55:47 +00001702 Function* fun,
1703 Symbol* symbol)
Sean Callanan8f0dc342010-06-22 23:46:24 +00001704{
Sean Callananaa301c42010-12-03 01:38:59 +00001705 assert (m_parser_vars.get());
1706
Greg Claytone005f2c2010-11-06 01:53:30 +00001707 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan8f0dc342010-06-22 23:46:24 +00001708
Sean Callanan0fc73582010-07-27 00:55:47 +00001709 NamedDecl *fun_decl;
Sean Callanan8f0dc342010-06-22 23:46:24 +00001710 std::auto_ptr<Value> fun_location(new Value);
Sean Callanan0fc73582010-07-27 00:55:47 +00001711 const Address *fun_address;
Sean Callanan8f0dc342010-06-22 23:46:24 +00001712
Sean Callanan0fc73582010-07-27 00:55:47 +00001713 // only valid for Functions, not for Symbols
1714 void *fun_opaque_type = NULL;
1715 clang::ASTContext *fun_ast_context = NULL;
1716
1717 if (fun)
1718 {
1719 Type *fun_type = fun->GetType();
1720
1721 if (!fun_type)
1722 {
1723 if (log)
1724 log->PutCString("Skipped a function because it has no type");
1725 return;
1726 }
1727
Greg Clayton462d4142010-09-29 01:12:09 +00001728 fun_opaque_type = fun_type->GetClangType();
Sean Callanan0fc73582010-07-27 00:55:47 +00001729
1730 if (!fun_opaque_type)
1731 {
1732 if (log)
1733 log->PutCString("Skipped a function because it has no Clang type");
1734 return;
1735 }
1736
1737 fun_address = &fun->GetAddressRange().GetBaseAddress();
1738
1739 TypeList *type_list = fun_type->GetTypeList();
1740 fun_ast_context = type_list->GetClangASTContext().getASTContext();
Sean Callananee8fc722010-11-19 20:20:02 +00001741 void *copied_type = GuardedCopyType(context.GetASTContext(), fun_ast_context, fun_opaque_type);
Sean Callanan0fc73582010-07-27 00:55:47 +00001742
1743 fun_decl = context.AddFunDecl(copied_type);
1744 }
1745 else if (symbol)
1746 {
1747 fun_address = &symbol->GetAddressRangeRef().GetBaseAddress();
1748
1749 fun_decl = context.AddGenericFunDecl();
1750 }
1751 else
1752 {
1753 if (log)
1754 log->PutCString("AddOneFunction called with no function and no symbol");
1755 return;
1756 }
1757
Sean Callananaa301c42010-12-03 01:38:59 +00001758 lldb::addr_t load_addr = fun_address->GetLoadAddress(m_parser_vars->m_exe_ctx->target);
Sean Callanan8f0dc342010-06-22 23:46:24 +00001759 fun_location->SetValueType(Value::eValueTypeLoadAddress);
1760 fun_location->GetScalar() = load_addr;
1761
Greg Clayton427f2902010-12-14 02:59:59 +00001762 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->process->GetByteOrder(),
1763 m_parser_vars->m_exe_ctx->process->GetAddressByteSize()));
1764 assert (entity.get());
Greg Clayton8de27c72010-10-15 22:48:33 +00001765 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton427f2902010-12-14 02:59:59 +00001766 entity->SetName(ConstString(decl_name.c_str()));
1767 entity->SetClangType (fun_opaque_type);
1768 entity->SetClangAST (fun_ast_context);
Sean Callanan8f0dc342010-06-22 23:46:24 +00001769
Greg Clayton427f2902010-12-14 02:59:59 +00001770 entity->EnableParserVars();
1771 entity->m_parser_vars->m_named_decl = fun_decl;
1772 entity->m_parser_vars->m_llvm_value = NULL;
1773 entity->m_parser_vars->m_lldb_value = fun_location.release();
Sean Callanan8c127202010-08-23 23:09:38 +00001774
Sean Callanan810f22d2010-07-16 00:09:46 +00001775 if (log)
Greg Clayton8de27c72010-10-15 22:48:33 +00001776 {
Sean Callanana0744822010-11-01 23:22:47 +00001777 std::string fun_decl_print_string;
1778 llvm::raw_string_ostream fun_decl_print_stream(fun_decl_print_string);
1779 fun_decl->print(fun_decl_print_stream);
1780 fun_decl_print_stream.flush();
1781
1782 log->Printf("Found %s function %s, returned %s", (fun ? "specific" : "generic"), decl_name.c_str(), fun_decl_print_string.c_str());
Greg Clayton8de27c72010-10-15 22:48:33 +00001783 }
Chris Lattner24943d22010-06-08 16:52:24 +00001784}
Sean Callanan93a4b1a2010-08-04 01:02:13 +00001785
1786void
1787ClangExpressionDeclMap::AddOneType(NameSearchContext &context,
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001788 TypeFromUser &ut,
1789 bool add_method)
Sean Callanan93a4b1a2010-08-04 01:02:13 +00001790{
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001791 clang::ASTContext *parser_ast_context = context.GetASTContext();
1792 clang::ASTContext *user_ast_context = ut.GetASTContext();
Sean Callanan93a4b1a2010-08-04 01:02:13 +00001793
Sean Callananee8fc722010-11-19 20:20:02 +00001794 void *copied_type = GuardedCopyType(parser_ast_context, user_ast_context, ut.GetOpaqueQualType());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001795
1796 TypeFromParser parser_type(copied_type, parser_ast_context);
1797
1798 if (add_method && ClangASTContext::IsAggregateType(copied_type))
1799 {
1800 void *args[1];
1801
1802 args[0] = ClangASTContext::GetVoidPtrType(parser_ast_context, false);
1803
1804 void *method_type = ClangASTContext::CreateFunctionType (parser_ast_context,
1805 ClangASTContext::GetBuiltInType_void(parser_ast_context),
1806 args,
1807 1,
1808 false,
1809 ClangASTContext::GetTypeQualifiers(copied_type));
Greg Clayton30449d52010-10-01 02:31:07 +00001810
Greg Clayton1d8173f2010-09-24 05:15:53 +00001811 const bool is_virtual = false;
1812 const bool is_static = false;
1813 const bool is_inline = false;
Greg Clayton30449d52010-10-01 02:31:07 +00001814 const bool is_explicit = false;
1815
Greg Clayton1d8173f2010-09-24 05:15:53 +00001816 ClangASTContext::AddMethodToCXXRecordType (parser_ast_context,
1817 copied_type,
Greg Clayton8de27c72010-10-15 22:48:33 +00001818 "$__lldb_expr",
Greg Clayton1d8173f2010-09-24 05:15:53 +00001819 method_type,
1820 lldb::eAccessPublic,
1821 is_virtual,
1822 is_static,
Greg Clayton30449d52010-10-01 02:31:07 +00001823 is_inline,
1824 is_explicit);
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001825 }
Sean Callanan93a4b1a2010-08-04 01:02:13 +00001826
1827 context.AddTypeDecl(copied_type);
1828}
Sean Callananee8fc722010-11-19 20:20:02 +00001829
1830void *
1831ClangExpressionDeclMap::GuardedCopyType (ASTContext *dest_context,
1832 ASTContext *source_context,
1833 void *clang_type)
1834{
Sean Callananaa301c42010-12-03 01:38:59 +00001835 assert (m_parser_vars.get());
1836
1837 m_parser_vars->m_ignore_lookups = true;
Sean Callananee8fc722010-11-19 20:20:02 +00001838
1839 void *ret = ClangASTContext::CopyType (dest_context,
1840 source_context,
1841 clang_type);
1842
Sean Callananaa301c42010-12-03 01:38:59 +00001843 m_parser_vars->m_ignore_lookups = false;
Sean Callananee8fc722010-11-19 20:20:02 +00001844
1845 return ret;
1846}