blob: 302ebf8ec5349d6593be3d77699bb4cd4af19490 [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
132
133 clang::ASTContext *context(m_parser_vars->m_exe_ctx->target->GetScratchClangASTContext()->getASTContext());
134
135 TypeFromUser user_type(ClangASTContext::CopyType(context,
136 type.GetASTContext(),
137 type.GetOpaqueQualType()),
138 context);
139
140 DataBufferHeap *heap_data_buf = new DataBufferHeap(ClangASTType::GetClangTypeBitWidth(user_type.GetASTContext(),
141 user_type.GetOpaqueQualType()) / 8,
142 '\0');
143
144 DataBufferSP data_sp(heap_data_buf);
145
146 uint64_t value64 = value.getLimitedValue();
147
148 ByteOrder byte_order = m_parser_vars->m_exe_ctx->process->GetByteOrder();
149
150 size_t num_val_bytes = sizeof(value64);
151 size_t num_data_bytes = heap_data_buf->GetByteSize();
152
153 size_t num_bytes = num_val_bytes;
154 if (num_bytes > num_data_bytes)
155 num_bytes = num_data_bytes;
156
157 uint8_t *data_bytes = heap_data_buf->GetBytes();
158
159 for (off_t byte_idx = 0;
160 byte_idx < num_bytes;
161 ++byte_idx)
162 {
163 uint64_t shift = byte_idx * 8;
164 uint64_t mask = 0xffll << shift;
165 uint8_t cur_byte = (uint8_t)((value64 & mask) >> shift);
166
167 switch (byte_order)
168 {
169 case eByteOrderBig:
170 // High Low
171 // Original: |AABBCCDDEEFFGGHH|
172 // Target: |EEFFGGHH|
173
174 data_bytes[num_data_bytes - (1 + byte_idx)] = cur_byte;
175 break;
176 case eByteOrderLittle:
177 // Target: |HHGGFFEE|
178 data_bytes[byte_idx] = cur_byte;
179 break;
180 default:
181 return lldb::ClangExpressionVariableSP();
182 }
183 }
184
185 ValueObjectSP valobj_sp(new ValueObjectConstResult(user_type.GetASTContext(),
186 user_type.GetOpaqueQualType(),
187 name,
188 data_sp,
189 m_parser_vars->m_exe_ctx->process->GetByteOrder(),
190 m_parser_vars->m_exe_ctx->process->GetAddressByteSize()));
191
192 ClangExpressionVariableSP var_sp(new ClangExpressionVariable(valobj_sp));
193
194 return var_sp;
195}
196
Sean Callanan8bce6652010-07-13 21:41:46 +0000197bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000198ClangExpressionDeclMap::AddPersistentVariable
199(
200 const clang::NamedDecl *decl,
201 const ConstString &name,
202 TypeFromParser parser_type
203)
Sean Callanana48fe162010-08-11 03:57:18 +0000204{
Sean Callananaa301c42010-12-03 01:38:59 +0000205 assert (m_parser_vars.get());
206
207 clang::ASTContext *context(m_parser_vars->m_exe_ctx->target->GetScratchClangASTContext()->getASTContext());
Sean Callanana48fe162010-08-11 03:57:18 +0000208
Sean Callanana48fe162010-08-11 03:57:18 +0000209 TypeFromUser user_type(ClangASTContext::CopyType(context,
Sean Callanan82b74c82010-08-12 01:56:52 +0000210 parser_type.GetASTContext(),
211 parser_type.GetOpaqueQualType()),
Sean Callanana48fe162010-08-11 03:57:18 +0000212 context);
213
Greg Clayton427f2902010-12-14 02:59:59 +0000214 if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (name,
215 user_type,
216 m_parser_vars->m_exe_ctx->process->GetByteOrder(),
217 m_parser_vars->m_exe_ctx->process->GetAddressByteSize()))
Sean Callanan8c127202010-08-23 23:09:38 +0000218 return false;
219
Greg Clayton427f2902010-12-14 02:59:59 +0000220 ClangExpressionVariableSP var_sp (m_parser_vars->m_persistent_vars->GetVariable(name));
Sean Callanan8c127202010-08-23 23:09:38 +0000221
Greg Clayton427f2902010-12-14 02:59:59 +0000222 if (!var_sp)
Sean Callanan8c127202010-08-23 23:09:38 +0000223 return false;
224
Greg Clayton427f2902010-12-14 02:59:59 +0000225 var_sp->EnableParserVars();
Sean Callanan8c127202010-08-23 23:09:38 +0000226
Greg Clayton427f2902010-12-14 02:59:59 +0000227 var_sp->m_parser_vars->m_named_decl = decl;
228 var_sp->m_parser_vars->m_parser_type = parser_type;
Sean Callanan8c127202010-08-23 23:09:38 +0000229
230 return true;
Sean Callanana48fe162010-08-11 03:57:18 +0000231}
232
233bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000234ClangExpressionDeclMap::AddValueToStruct
235(
236 const clang::NamedDecl *decl,
237 const ConstString &name,
238 llvm::Value *value,
239 size_t size,
240 off_t alignment
241)
Sean Callanan8bce6652010-07-13 21:41:46 +0000242{
Sean Callananaa301c42010-12-03 01:38:59 +0000243 assert (m_struct_vars.get());
244 assert (m_parser_vars.get());
245
Greg Claytone005f2c2010-11-06 01:53:30 +0000246 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan45690fe2010-08-30 22:17:16 +0000247
Sean Callananaa301c42010-12-03 01:38:59 +0000248 m_struct_vars->m_struct_laid_out = false;
Sean Callanan8bce6652010-07-13 21:41:46 +0000249
Sean Callanan8c127202010-08-23 23:09:38 +0000250 if (m_struct_members.GetVariable(decl))
251 return true;
Sean Callanan8bce6652010-07-13 21:41:46 +0000252
Greg Clayton427f2902010-12-14 02:59:59 +0000253 ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl));
Sean Callanan8bce6652010-07-13 21:41:46 +0000254
Greg Clayton427f2902010-12-14 02:59:59 +0000255 if (!var_sp)
256 var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl);
Sean Callanan8bce6652010-07-13 21:41:46 +0000257
Greg Clayton427f2902010-12-14 02:59:59 +0000258 if (!var_sp)
Sean Callanan8c127202010-08-23 23:09:38 +0000259 return false;
260
Sean Callanan45690fe2010-08-30 22:17:16 +0000261 if (log)
262 log->Printf("Adding value for decl %p [%s - %s] to the structure",
263 decl,
Greg Clayton8de27c72010-10-15 22:48:33 +0000264 name.GetCString(),
Greg Clayton427f2902010-12-14 02:59:59 +0000265 var_sp->GetName().GetCString());
Sean Callanan45690fe2010-08-30 22:17:16 +0000266
Sean Callanan8c127202010-08-23 23:09:38 +0000267 // We know entity->m_parser_vars is valid because we used a parser variable
268 // to find it
Greg Clayton427f2902010-12-14 02:59:59 +0000269 var_sp->m_parser_vars->m_llvm_value = value;
Sean Callanan8c127202010-08-23 23:09:38 +0000270
Greg Clayton427f2902010-12-14 02:59:59 +0000271 var_sp->EnableJITVars();
272 var_sp->m_jit_vars->m_alignment = alignment;
273 var_sp->m_jit_vars->m_size = size;
Sean Callanan8c127202010-08-23 23:09:38 +0000274
Greg Clayton427f2902010-12-14 02:59:59 +0000275 m_struct_members.AddVariable(var_sp);
Sean Callanan8bce6652010-07-13 21:41:46 +0000276
277 return true;
278}
279
280bool
281ClangExpressionDeclMap::DoStructLayout ()
282{
Sean Callananaa301c42010-12-03 01:38:59 +0000283 assert (m_struct_vars.get());
284
285 if (m_struct_vars->m_struct_laid_out)
Sean Callanan8bce6652010-07-13 21:41:46 +0000286 return true;
287
Sean Callanan8bce6652010-07-13 21:41:46 +0000288 off_t cursor = 0;
289
Sean Callananaa301c42010-12-03 01:38:59 +0000290 m_struct_vars->m_struct_alignment = 0;
291 m_struct_vars->m_struct_size = 0;
Sean Callanan8bce6652010-07-13 21:41:46 +0000292
Greg Clayton427f2902010-12-14 02:59:59 +0000293 for (size_t member_index = 0, num_members = m_struct_members.GetSize();
Sean Callanan8c127202010-08-23 23:09:38 +0000294 member_index < num_members;
295 ++member_index)
Sean Callanan8bce6652010-07-13 21:41:46 +0000296 {
Greg Clayton427f2902010-12-14 02:59:59 +0000297 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
298 if (!member_sp)
299 return false;
300
301 if (!member_sp->m_jit_vars.get())
Sean Callanan8c127202010-08-23 23:09:38 +0000302 return false;
Sean Callanan8bce6652010-07-13 21:41:46 +0000303
Sean Callanan8c127202010-08-23 23:09:38 +0000304 if (member_index == 0)
Greg Clayton427f2902010-12-14 02:59:59 +0000305 m_struct_vars->m_struct_alignment = member_sp->m_jit_vars->m_alignment;
Sean Callanan8c127202010-08-23 23:09:38 +0000306
Greg Clayton427f2902010-12-14 02:59:59 +0000307 if (cursor % member_sp->m_jit_vars->m_alignment)
308 cursor += (member_sp->m_jit_vars->m_alignment - (cursor % member_sp->m_jit_vars->m_alignment));
Sean Callanan8c127202010-08-23 23:09:38 +0000309
Greg Clayton427f2902010-12-14 02:59:59 +0000310 member_sp->m_jit_vars->m_offset = cursor;
311 cursor += member_sp->m_jit_vars->m_size;
Sean Callanan8bce6652010-07-13 21:41:46 +0000312 }
313
Sean Callananaa301c42010-12-03 01:38:59 +0000314 m_struct_vars->m_struct_size = cursor;
Sean Callanan8bce6652010-07-13 21:41:46 +0000315
Sean Callananaa301c42010-12-03 01:38:59 +0000316 m_struct_vars->m_struct_laid_out = true;
Sean Callanan8bce6652010-07-13 21:41:46 +0000317 return true;
318}
319
Greg Clayton8de27c72010-10-15 22:48:33 +0000320bool ClangExpressionDeclMap::GetStructInfo
321(
322 uint32_t &num_elements,
323 size_t &size,
324 off_t &alignment
325)
Sean Callanan8bce6652010-07-13 21:41:46 +0000326{
Sean Callananaa301c42010-12-03 01:38:59 +0000327 assert (m_struct_vars.get());
328
329 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan8bce6652010-07-13 21:41:46 +0000330 return false;
331
Greg Clayton427f2902010-12-14 02:59:59 +0000332 num_elements = m_struct_members.GetSize();
Sean Callananaa301c42010-12-03 01:38:59 +0000333 size = m_struct_vars->m_struct_size;
334 alignment = m_struct_vars->m_struct_alignment;
Sean Callanan8bce6652010-07-13 21:41:46 +0000335
336 return true;
337}
338
339bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000340ClangExpressionDeclMap::GetStructElement
341(
342 const clang::NamedDecl *&decl,
343 llvm::Value *&value,
344 off_t &offset,
345 ConstString &name,
346 uint32_t index
347)
Sean Callanan8bce6652010-07-13 21:41:46 +0000348{
Sean Callananaa301c42010-12-03 01:38:59 +0000349 assert (m_struct_vars.get());
350
351 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan8bce6652010-07-13 21:41:46 +0000352 return false;
353
Greg Clayton427f2902010-12-14 02:59:59 +0000354 if (index >= m_struct_members.GetSize())
Sean Callanan8bce6652010-07-13 21:41:46 +0000355 return false;
356
Greg Clayton427f2902010-12-14 02:59:59 +0000357 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(index));
Sean Callanan8bce6652010-07-13 21:41:46 +0000358
Greg Clayton427f2902010-12-14 02:59:59 +0000359 if (!member_sp ||
360 !member_sp->m_parser_vars.get() ||
361 !member_sp->m_jit_vars.get())
Sean Callanan8c127202010-08-23 23:09:38 +0000362 return false;
363
Greg Clayton427f2902010-12-14 02:59:59 +0000364 decl = member_sp->m_parser_vars->m_named_decl;
365 value = member_sp->m_parser_vars->m_llvm_value;
366 offset = member_sp->m_jit_vars->m_offset;
367 name = member_sp->GetName();
Sean Callanan8c127202010-08-23 23:09:38 +0000368
Sean Callanan8bce6652010-07-13 21:41:46 +0000369 return true;
370}
371
Sean Callanan02fbafa2010-07-27 21:39:39 +0000372bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000373ClangExpressionDeclMap::GetFunctionInfo
374(
375 const clang::NamedDecl *decl,
376 llvm::Value**& value,
377 uint64_t &ptr
378)
Sean Callananba992c52010-07-27 02:07:53 +0000379{
Greg Clayton427f2902010-12-14 02:59:59 +0000380 ClangExpressionVariableSP entity_sp(m_found_entities.GetVariable(decl));
Sean Callanan8c127202010-08-23 23:09:38 +0000381
Greg Clayton427f2902010-12-14 02:59:59 +0000382 if (!entity_sp)
Sean Callanan8c127202010-08-23 23:09:38 +0000383 return false;
Sean Callananba992c52010-07-27 02:07:53 +0000384
Sean Callanan8c127202010-08-23 23:09:38 +0000385 // We know m_parser_vars is valid since we searched for the variable by
386 // its NamedDecl
Sean Callananba992c52010-07-27 02:07:53 +0000387
Greg Clayton427f2902010-12-14 02:59:59 +0000388 value = &entity_sp->m_parser_vars->m_llvm_value;
389 ptr = entity_sp->m_parser_vars->m_lldb_value->GetScalar().ULongLong();
Sean Callanan8c127202010-08-23 23:09:38 +0000390
391 return true;
Sean Callananba992c52010-07-27 02:07:53 +0000392}
393
Sean Callananf5857a02010-07-31 01:32:05 +0000394bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000395ClangExpressionDeclMap::GetFunctionAddress
396(
397 const ConstString &name,
398 uint64_t &ptr
399)
Sean Callananf5857a02010-07-31 01:32:05 +0000400{
Sean Callananaa301c42010-12-03 01:38:59 +0000401 assert (m_parser_vars.get());
402
Sean Callananf5857a02010-07-31 01:32:05 +0000403 // Back out in all cases where we're not fully initialized
Jim Ingham78b9ee82010-12-07 01:56:02 +0000404 if (m_parser_vars->m_exe_ctx->target == NULL)
405 return false;
406 if (!m_parser_vars->m_sym_ctx.target_sp)
Sean Callananf5857a02010-07-31 01:32:05 +0000407 return false;
408
Greg Claytone5748d82010-11-09 23:46:37 +0000409 SymbolContextList sc_list;
Sean Callananf5857a02010-07-31 01:32:05 +0000410
Sean Callananaa301c42010-12-03 01:38:59 +0000411 m_parser_vars->m_sym_ctx.FindFunctionsByName(name, false, sc_list);
Sean Callananf5857a02010-07-31 01:32:05 +0000412
Greg Claytone5748d82010-11-09 23:46:37 +0000413 if (!sc_list.GetSize())
Sean Callananf5857a02010-07-31 01:32:05 +0000414 return false;
415
416 SymbolContext sym_ctx;
Greg Claytone5748d82010-11-09 23:46:37 +0000417 sc_list.GetContextAtIndex(0, sym_ctx);
Sean Callananf5857a02010-07-31 01:32:05 +0000418
419 const Address *fun_address;
420
421 if (sym_ctx.function)
422 fun_address = &sym_ctx.function->GetAddressRange().GetBaseAddress();
423 else if (sym_ctx.symbol)
424 fun_address = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress();
425 else
426 return false;
427
Sean Callananaa301c42010-12-03 01:38:59 +0000428 ptr = fun_address->GetLoadAddress (m_parser_vars->m_exe_ctx->target);
Sean Callananf5857a02010-07-31 01:32:05 +0000429
430 return true;
431}
432
Sean Callanan810f22d2010-07-16 00:09:46 +0000433// Interface for CommandObjectExpression
Sean Callananf328c9f2010-07-20 23:31:16 +0000434
435bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000436ClangExpressionDeclMap::Materialize
437(
Sean Callananaa301c42010-12-03 01:38:59 +0000438 ExecutionContext &exe_ctx,
Greg Clayton8de27c72010-10-15 22:48:33 +0000439 lldb::addr_t &struct_address,
440 Error &err
441)
Sean Callananf328c9f2010-07-20 23:31:16 +0000442{
Sean Callananaa301c42010-12-03 01:38:59 +0000443 EnableMaterialVars();
444
445 m_material_vars->m_process = exe_ctx.process;
446
Sean Callananf328c9f2010-07-20 23:31:16 +0000447 bool result = DoMaterialize(false, exe_ctx, NULL, err);
448
449 if (result)
Sean Callananaa301c42010-12-03 01:38:59 +0000450 struct_address = m_material_vars->m_materialized_location;
Sean Callananf328c9f2010-07-20 23:31:16 +0000451
452 return result;
453}
454
455bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000456ClangExpressionDeclMap::GetObjectPointer
457(
458 lldb::addr_t &object_ptr,
Sean Callanan3aa7da52010-12-13 22:46:15 +0000459 ConstString &object_name,
Sean Callananaa301c42010-12-03 01:38:59 +0000460 ExecutionContext &exe_ctx,
Sean Callanan047923c2010-12-14 00:42:36 +0000461 Error &err,
462 bool suppress_type_check
Greg Clayton8de27c72010-10-15 22:48:33 +0000463)
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000464{
Sean Callananaa301c42010-12-03 01:38:59 +0000465 assert (m_struct_vars.get());
466
467 if (!exe_ctx.frame || !exe_ctx.target || !exe_ctx.process)
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000468 {
469 err.SetErrorString("Couldn't load 'this' because the context is incomplete");
470 return false;
471 }
472
Sean Callananaa301c42010-12-03 01:38:59 +0000473 if (!m_struct_vars->m_object_pointer_type.GetOpaqueQualType())
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000474 {
475 err.SetErrorString("Couldn't load 'this' because its type is unknown");
476 return false;
477 }
478
Sean Callanan047923c2010-12-14 00:42:36 +0000479 Variable *object_ptr_var = FindVariableInScope (*exe_ctx.frame,
480 object_name,
481 (suppress_type_check ? NULL : &m_struct_vars->m_object_pointer_type));
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000482
483 if (!object_ptr_var)
484 {
Sean Callanan3aa7da52010-12-13 22:46:15 +0000485 err.SetErrorStringWithFormat("Couldn't find '%s' with appropriate type in scope", object_name.GetCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000486 return false;
487 }
488
Sean Callananaa301c42010-12-03 01:38:59 +0000489 std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(exe_ctx,
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000490 object_ptr_var,
Sean Callananaa301c42010-12-03 01:38:59 +0000491 NULL));
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000492
493 if (!location_value.get())
494 {
Sean Callanan3aa7da52010-12-13 22:46:15 +0000495 err.SetErrorStringWithFormat("Couldn't get the location for '%s'", object_name.GetCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000496 return false;
497 }
498
499 if (location_value->GetValueType() == Value::eValueTypeLoadAddress)
500 {
501 lldb::addr_t value_addr = location_value->GetScalar().ULongLong();
Sean Callananaa301c42010-12-03 01:38:59 +0000502 uint32_t address_byte_size = exe_ctx.target->GetArchitecture().GetAddressByteSize();
503 lldb::ByteOrder address_byte_order = exe_ctx.process->GetByteOrder();
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000504
Sean Callananaa301c42010-12-03 01:38:59 +0000505 if (ClangASTType::GetClangTypeBitWidth(m_struct_vars->m_object_pointer_type.GetASTContext(),
506 m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) != address_byte_size * 8)
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000507 {
Sean Callanan3aa7da52010-12-13 22:46:15 +0000508 err.SetErrorStringWithFormat("'%s' is not of an expected pointer size", object_name.GetCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000509 return false;
510 }
511
512 DataBufferHeap data;
513 data.SetByteSize(address_byte_size);
514 Error read_error;
515
Sean Callananaa301c42010-12-03 01:38:59 +0000516 if (exe_ctx.process->ReadMemory (value_addr, data.GetBytes(), address_byte_size, read_error) != address_byte_size)
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000517 {
Sean Callanan3aa7da52010-12-13 22:46:15 +0000518 err.SetErrorStringWithFormat("Coldn't read '%s' from the target: %s", object_name.GetCString(), read_error.AsCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000519 return false;
520 }
521
522 DataExtractor extractor(data.GetBytes(), data.GetByteSize(), address_byte_order, address_byte_size);
523
524 uint32_t offset = 0;
525
526 object_ptr = extractor.GetPointer(&offset);
527
528 return true;
529 }
530 else
531 {
Sean Callanan3aa7da52010-12-13 22:46:15 +0000532 err.SetErrorStringWithFormat("'%s' is not in memory; LLDB must be extended to handle registers", object_name.GetCString());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +0000533 return false;
534 }
535}
536
537bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000538ClangExpressionDeclMap::Dematerialize
539(
Sean Callananaa301c42010-12-03 01:38:59 +0000540 ExecutionContext &exe_ctx,
Greg Clayton427f2902010-12-14 02:59:59 +0000541 ClangExpressionVariableSP &result_sp,
Greg Clayton8de27c72010-10-15 22:48:33 +0000542 Error &err
543)
Sean Callananf328c9f2010-07-20 23:31:16 +0000544{
Greg Clayton427f2902010-12-14 02:59:59 +0000545 return DoMaterialize(true, exe_ctx, &result_sp, err);
Sean Callananaa301c42010-12-03 01:38:59 +0000546
547 DidDematerialize();
548}
549
550void
551ClangExpressionDeclMap::DidDematerialize()
552{
553 if (m_material_vars.get())
554 {
555 if (m_material_vars->m_materialized_location)
556 {
557 //#define SINGLE_STEP_EXPRESSIONS
558
559#ifndef SINGLE_STEP_EXPRESSIONS
560 m_material_vars->m_process->DeallocateMemory(m_material_vars->m_materialized_location);
561#endif
562 m_material_vars->m_materialized_location = 0;
563 }
564
565 DisableMaterialVars();
566 }
Sean Callananf328c9f2010-07-20 23:31:16 +0000567}
568
Sean Callanan32824aa2010-07-23 22:19:18 +0000569bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000570ClangExpressionDeclMap::DumpMaterializedStruct
571(
Sean Callananaa301c42010-12-03 01:38:59 +0000572 ExecutionContext &exe_ctx,
Greg Clayton8de27c72010-10-15 22:48:33 +0000573 Stream &s,
574 Error &err
575)
Sean Callanan32824aa2010-07-23 22:19:18 +0000576{
Sean Callananaa301c42010-12-03 01:38:59 +0000577 assert (m_struct_vars.get());
578 assert (m_material_vars.get());
579
580 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan32824aa2010-07-23 22:19:18 +0000581 {
582 err.SetErrorString("Structure hasn't been laid out yet");
583 return false;
584 }
585
Sean Callananaa301c42010-12-03 01:38:59 +0000586 if (!exe_ctx.process)
Sean Callanan32824aa2010-07-23 22:19:18 +0000587 {
588 err.SetErrorString("Couldn't find the process");
589 return false;
590 }
591
Sean Callananaa301c42010-12-03 01:38:59 +0000592 if (!exe_ctx.target)
Sean Callanan32824aa2010-07-23 22:19:18 +0000593 {
594 err.SetErrorString("Couldn't find the target");
595 return false;
596 }
597
Sean Callanan33711022010-12-07 10:00:20 +0000598 if (!m_material_vars->m_materialized_location)
599 {
600 err.SetErrorString("No materialized location");
601 return false;
602 }
603
Sean Callananaa301c42010-12-03 01:38:59 +0000604 lldb::DataBufferSP data(new DataBufferHeap(m_struct_vars->m_struct_size, 0));
Sean Callanan32824aa2010-07-23 22:19:18 +0000605
606 Error error;
Sean Callananaa301c42010-12-03 01:38:59 +0000607 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 +0000608 {
609 err.SetErrorStringWithFormat ("Couldn't read struct from the target: %s", error.AsCString());
610 return false;
611 }
612
Sean Callananaa301c42010-12-03 01:38:59 +0000613 DataExtractor extractor(data, exe_ctx.process->GetByteOrder(), exe_ctx.target->GetArchitecture().GetAddressByteSize());
Sean Callanan32824aa2010-07-23 22:19:18 +0000614
Greg Clayton427f2902010-12-14 02:59:59 +0000615 for (size_t member_idx = 0, num_members = m_struct_members.GetSize();
616 member_idx < num_members;
617 ++member_idx)
Sean Callanan32824aa2010-07-23 22:19:18 +0000618 {
Greg Clayton427f2902010-12-14 02:59:59 +0000619 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_idx));
Sean Callanan32824aa2010-07-23 22:19:18 +0000620
Greg Clayton427f2902010-12-14 02:59:59 +0000621 if (!member_sp)
622 return false;
623
624 s.Printf("[%s]\n", member_sp->GetName().GetCString());
Sean Callanan8c127202010-08-23 23:09:38 +0000625
Greg Clayton427f2902010-12-14 02:59:59 +0000626 if (!member_sp->m_jit_vars.get())
Sean Callanan8c127202010-08-23 23:09:38 +0000627 return false;
628
Greg Clayton427f2902010-12-14 02:59:59 +0000629 extractor.Dump (&s, // stream
630 member_sp->m_jit_vars->m_offset, // offset
631 lldb::eFormatBytesWithASCII, // format
632 1, // byte size of individual entries
633 member_sp->m_jit_vars->m_size, // number of entries
634 16, // entries per line
635 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, // address to print
636 0, // bit size (bitfields only; 0 means ignore)
637 0); // bit alignment (bitfields only; 0 means ignore)
Sean Callanan32824aa2010-07-23 22:19:18 +0000638
639 s.PutChar('\n');
640 }
641
642 return true;
643}
644
Sean Callananf328c9f2010-07-20 23:31:16 +0000645bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000646ClangExpressionDeclMap::DoMaterialize
647(
648 bool dematerialize,
Sean Callananaa301c42010-12-03 01:38:59 +0000649 ExecutionContext &exe_ctx,
Greg Clayton427f2902010-12-14 02:59:59 +0000650 lldb::ClangExpressionVariableSP *result_sp_ptr,
Greg Clayton8de27c72010-10-15 22:48:33 +0000651 Error &err
652)
Sean Callanan810f22d2010-07-16 00:09:46 +0000653{
Greg Clayton427f2902010-12-14 02:59:59 +0000654 if (result_sp_ptr)
655 result_sp_ptr->reset();
656
Sean Callananaa301c42010-12-03 01:38:59 +0000657 assert (m_struct_vars.get());
658
Greg Claytone005f2c2010-11-06 01:53:30 +0000659 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan82b74c82010-08-12 01:56:52 +0000660
Sean Callananaa301c42010-12-03 01:38:59 +0000661 if (!m_struct_vars->m_struct_laid_out)
Sean Callanan810f22d2010-07-16 00:09:46 +0000662 {
663 err.SetErrorString("Structure hasn't been laid out yet");
664 return LLDB_INVALID_ADDRESS;
665 }
666
Sean Callananaa301c42010-12-03 01:38:59 +0000667 if (!exe_ctx.frame)
Sean Callanan45839272010-07-24 01:37:44 +0000668 {
669 err.SetErrorString("Received null execution frame");
670 return LLDB_INVALID_ADDRESS;
671 }
672
Greg Clayton427f2902010-12-14 02:59:59 +0000673 ClangPersistentVariables &persistent_vars = exe_ctx.target->GetPersistentVariables();
Sean Callananaa301c42010-12-03 01:38:59 +0000674
675 if (!m_struct_vars->m_struct_size)
Sean Callanane8a59a82010-09-13 21:34:21 +0000676 {
677 if (log)
678 log->PutCString("Not bothering to allocate a struct because no arguments are needed");
679
Sean Callananaa301c42010-12-03 01:38:59 +0000680 m_material_vars->m_allocated_area = NULL;
Sean Callanane8a59a82010-09-13 21:34:21 +0000681
682 return true;
683 }
684
Sean Callananaa301c42010-12-03 01:38:59 +0000685 const SymbolContext &sym_ctx(exe_ctx.frame->GetSymbolContext(lldb::eSymbolContextEverything));
Sean Callanan810f22d2010-07-16 00:09:46 +0000686
Sean Callananf328c9f2010-07-20 23:31:16 +0000687 if (!dematerialize)
Sean Callanan810f22d2010-07-16 00:09:46 +0000688 {
Sean Callananaa301c42010-12-03 01:38:59 +0000689 if (m_material_vars->m_materialized_location)
Sean Callananf328c9f2010-07-20 23:31:16 +0000690 {
Sean Callananaa301c42010-12-03 01:38:59 +0000691 exe_ctx.process->DeallocateMemory(m_material_vars->m_materialized_location);
692 m_material_vars->m_materialized_location = 0;
Sean Callananf328c9f2010-07-20 23:31:16 +0000693 }
694
Sean Callanan7a60b942010-10-08 01:58:41 +0000695 if (log)
696 log->PutCString("Allocating memory for materialized argument struct");
697
Sean Callananaa301c42010-12-03 01:38:59 +0000698 lldb::addr_t mem = exe_ctx.process->AllocateMemory(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size,
699 lldb::ePermissionsReadable | lldb::ePermissionsWritable,
700 err);
Sean Callananf328c9f2010-07-20 23:31:16 +0000701
702 if (mem == LLDB_INVALID_ADDRESS)
703 return false;
704
Sean Callananaa301c42010-12-03 01:38:59 +0000705 m_material_vars->m_allocated_area = mem;
Sean Callanan810f22d2010-07-16 00:09:46 +0000706 }
707
Sean Callananaa301c42010-12-03 01:38:59 +0000708 m_material_vars->m_materialized_location = m_material_vars->m_allocated_area;
Sean Callananf328c9f2010-07-20 23:31:16 +0000709
Sean Callananaa301c42010-12-03 01:38:59 +0000710 if (m_material_vars->m_materialized_location % m_struct_vars->m_struct_alignment)
711 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 +0000712
Greg Clayton427f2902010-12-14 02:59:59 +0000713 for (uint64_t member_index = 0, num_members = m_struct_members.GetSize();
Sean Callanan8c127202010-08-23 23:09:38 +0000714 member_index < num_members;
715 ++member_index)
Sean Callanan810f22d2010-07-16 00:09:46 +0000716 {
Greg Clayton427f2902010-12-14 02:59:59 +0000717 ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
Sean Callanan810f22d2010-07-16 00:09:46 +0000718
Greg Clayton427f2902010-12-14 02:59:59 +0000719 ClangExpressionVariableSP entity_sp (m_found_entities.GetVariable(member_sp->GetName()));
Sean Callananaa301c42010-12-03 01:38:59 +0000720
Greg Clayton427f2902010-12-14 02:59:59 +0000721 ClangExpressionVariableSP persistent_var_sp (persistent_vars.GetVariable(member_sp->GetName()));
Sean Callanan8c127202010-08-23 23:09:38 +0000722
Greg Clayton427f2902010-12-14 02:59:59 +0000723 if (entity_sp)
Sean Callanan8c127202010-08-23 23:09:38 +0000724 {
Greg Clayton427f2902010-12-14 02:59:59 +0000725 RegisterInfo *reg_info = entity_sp->GetRegisterInfo ();
726 if (reg_info)
Sean Callanan1ddd9fe2010-11-30 00:27:43 +0000727 {
728 // This is a register variable
729
Sean Callananaa301c42010-12-03 01:38:59 +0000730 RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
Sean Callanan1ddd9fe2010-11-30 00:27:43 +0000731
732 if (!reg_ctx)
733 return false;
734
Greg Clayton427f2902010-12-14 02:59:59 +0000735 if (!DoMaterializeOneRegister (dematerialize,
736 exe_ctx,
737 *reg_ctx,
738 *reg_info,
739 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
740 err))
Sean Callanan1ddd9fe2010-11-30 00:27:43 +0000741 return false;
742 }
743 else
744 {
Greg Clayton427f2902010-12-14 02:59:59 +0000745 if (!member_sp->m_jit_vars.get())
Sean Callanan1ddd9fe2010-11-30 00:27:43 +0000746 return false;
747
Greg Clayton427f2902010-12-14 02:59:59 +0000748 if (!DoMaterializeOneVariable (dematerialize,
749 exe_ctx,
750 sym_ctx,
751 member_sp->GetName(),
752 member_sp->GetTypeFromUser(),
753 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
754 err))
Sean Callanan1ddd9fe2010-11-30 00:27:43 +0000755 return false;
756 }
Sean Callanan8c127202010-08-23 23:09:38 +0000757 }
Greg Clayton427f2902010-12-14 02:59:59 +0000758 else if (persistent_var_sp)
Sean Callanan8c127202010-08-23 23:09:38 +0000759 {
Greg Clayton427f2902010-12-14 02:59:59 +0000760 if (member_sp->GetName() == m_struct_vars->m_result_name)
Sean Callanan45690fe2010-08-30 22:17:16 +0000761 {
762 if (!dematerialize)
763 continue;
Sean Callanan8c127202010-08-23 23:09:38 +0000764
Sean Callanan8c127202010-08-23 23:09:38 +0000765 if (log)
766 log->PutCString("Found result member in the struct");
Sean Callanan45690fe2010-08-30 22:17:16 +0000767
Greg Clayton427f2902010-12-14 02:59:59 +0000768 if (result_sp_ptr)
769 *result_sp_ptr = member_sp;
Sean Callanan8c127202010-08-23 23:09:38 +0000770 }
771
Sean Callanan45690fe2010-08-30 22:17:16 +0000772 if (log)
Greg Clayton427f2902010-12-14 02:59:59 +0000773 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 +0000774
Greg Clayton427f2902010-12-14 02:59:59 +0000775 if (!DoMaterializeOnePersistentVariable (dematerialize,
776 exe_ctx,
777 persistent_var_sp,
778 m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
779 err))
Sean Callanan8c127202010-08-23 23:09:38 +0000780 return false;
781 }
782 else
783 {
Greg Clayton427f2902010-12-14 02:59:59 +0000784 err.SetErrorStringWithFormat("Unexpected variable %s", member_sp->GetName().GetCString());
Sean Callanan8c127202010-08-23 23:09:38 +0000785 return false;
786 }
Sean Callanan810f22d2010-07-16 00:09:46 +0000787 }
788
Sean Callananf328c9f2010-07-20 23:31:16 +0000789 return true;
790}
791
Sean Callanana48fe162010-08-11 03:57:18 +0000792bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000793ClangExpressionDeclMap::DoMaterializeOnePersistentVariable
794(
795 bool dematerialize,
796 ExecutionContext &exe_ctx,
Greg Clayton427f2902010-12-14 02:59:59 +0000797 ClangExpressionVariableSP &var_sp,
Greg Clayton8de27c72010-10-15 22:48:33 +0000798 lldb::addr_t addr,
799 Error &err
800)
Sean Callananaa301c42010-12-03 01:38:59 +0000801{
Greg Clayton427f2902010-12-14 02:59:59 +0000802 if (!var_sp)
Sean Callanana48fe162010-08-11 03:57:18 +0000803 {
Greg Clayton427f2902010-12-14 02:59:59 +0000804 err.SetErrorString("Invalid persistent variable");
Sean Callanana48fe162010-08-11 03:57:18 +0000805 return LLDB_INVALID_ADDRESS;
806 }
807
Greg Clayton427f2902010-12-14 02:59:59 +0000808 const size_t pvar_byte_size = var_sp->GetByteSize();
Sean Callanana6223432010-08-20 01:02:30 +0000809
Greg Clayton427f2902010-12-14 02:59:59 +0000810 uint8_t *pvar_data = var_sp->GetValueBytes();
811 if (pvar_data == NULL)
Sean Callanana6223432010-08-20 01:02:30 +0000812 return false;
813
Sean Callanana48fe162010-08-11 03:57:18 +0000814 Error error;
815
816 if (dematerialize)
817 {
Greg Clayton427f2902010-12-14 02:59:59 +0000818 var_sp->ValueUpdated ();
819 if (exe_ctx.process->ReadMemory (addr, pvar_data, pvar_byte_size, error) != pvar_byte_size)
Sean Callanana48fe162010-08-11 03:57:18 +0000820 {
821 err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString());
822 return false;
823 }
824 }
825 else
826 {
Greg Clayton427f2902010-12-14 02:59:59 +0000827 if (exe_ctx.process->WriteMemory (addr, pvar_data, pvar_byte_size, error) != pvar_byte_size)
Sean Callanana48fe162010-08-11 03:57:18 +0000828 {
829 err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString());
830 return false;
831 }
832 }
833
834 return true;
835}
836
Sean Callananf328c9f2010-07-20 23:31:16 +0000837bool
Greg Clayton8de27c72010-10-15 22:48:33 +0000838ClangExpressionDeclMap::DoMaterializeOneVariable
839(
840 bool dematerialize,
841 ExecutionContext &exe_ctx,
842 const SymbolContext &sym_ctx,
843 const ConstString &name,
844 TypeFromUser type,
845 lldb::addr_t addr,
846 Error &err
847)
Sean Callananf328c9f2010-07-20 23:31:16 +0000848{
Greg Claytone005f2c2010-11-06 01:53:30 +0000849 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callananf328c9f2010-07-20 23:31:16 +0000850
Sean Callanan17c6a052010-10-05 20:18:48 +0000851 if (!exe_ctx.frame || !exe_ctx.process)
Sean Callanancc074622010-09-14 21:59:34 +0000852 return false;
853
Greg Clayton3bc52d02010-11-14 22:13:40 +0000854 Variable *var = FindVariableInScope (*exe_ctx.frame, name, &type);
Sean Callananf328c9f2010-07-20 23:31:16 +0000855
856 if (!var)
857 {
Greg Clayton8de27c72010-10-15 22:48:33 +0000858 err.SetErrorStringWithFormat("Couldn't find %s with appropriate type", name.GetCString());
Sean Callananf328c9f2010-07-20 23:31:16 +0000859 return false;
860 }
861
Sean Callanan841026f2010-07-23 00:16:21 +0000862 if (log)
Greg Clayton8de27c72010-10-15 22:48:33 +0000863 log->Printf("%s %s with type %p", (dematerialize ? "Dematerializing" : "Materializing"), name.GetCString(), type.GetOpaqueQualType());
Sean Callananf328c9f2010-07-20 23:31:16 +0000864
865 std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(exe_ctx,
866 var,
Sean Callananaa301c42010-12-03 01:38:59 +0000867 NULL));
Sean Callananf328c9f2010-07-20 23:31:16 +0000868
869 if (!location_value.get())
870 {
Greg Clayton8de27c72010-10-15 22:48:33 +0000871 err.SetErrorStringWithFormat("Couldn't get value for %s", name.GetCString());
Sean Callananf328c9f2010-07-20 23:31:16 +0000872 return false;
873 }
Sean Callanan17c6a052010-10-05 20:18:48 +0000874
875 // The size of the type contained in addr
Sean Callananf328c9f2010-07-20 23:31:16 +0000876
Sean Callanan17c6a052010-10-05 20:18:48 +0000877 size_t addr_bit_size = ClangASTType::GetClangTypeBitWidth(type.GetASTContext(), type.GetOpaqueQualType());
878 size_t addr_byte_size = addr_bit_size % 8 ? ((addr_bit_size + 8) / 8) : (addr_bit_size / 8);
879
880 Value::ValueType value_type = location_value->GetValueType();
881
882 switch (value_type)
Sean Callananf328c9f2010-07-20 23:31:16 +0000883 {
Sean Callanan17c6a052010-10-05 20:18:48 +0000884 default:
Sean Callananf328c9f2010-07-20 23:31:16 +0000885 {
Sean Callanan17c6a052010-10-05 20:18:48 +0000886 StreamString ss;
887
888 location_value->Dump(&ss);
889
Greg Clayton8de27c72010-10-15 22:48:33 +0000890 err.SetErrorStringWithFormat("%s has a value of unhandled type: %s", name.GetCString(), ss.GetString().c_str());
Sean Callananf328c9f2010-07-20 23:31:16 +0000891 return false;
892 }
Sean Callanan17c6a052010-10-05 20:18:48 +0000893 break;
894 case Value::eValueTypeLoadAddress:
Sean Callananf328c9f2010-07-20 23:31:16 +0000895 {
Sean Callanan17c6a052010-10-05 20:18:48 +0000896 lldb::addr_t value_addr = location_value->GetScalar().ULongLong();
897
898 DataBufferHeap data;
899 data.SetByteSize(addr_byte_size);
900
901 lldb::addr_t src_addr;
902 lldb::addr_t dest_addr;
903
904 if (dematerialize)
905 {
906 src_addr = addr;
907 dest_addr = value_addr;
908 }
909 else
910 {
911 src_addr = value_addr;
912 dest_addr = addr;
913 }
914
915 Error error;
916 if (exe_ctx.process->ReadMemory (src_addr, data.GetBytes(), addr_byte_size, error) != addr_byte_size)
917 {
Greg Clayton8de27c72010-10-15 22:48:33 +0000918 err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", name.GetCString(), error.AsCString());
Sean Callanan17c6a052010-10-05 20:18:48 +0000919 return false;
920 }
921
922 if (exe_ctx.process->WriteMemory (dest_addr, data.GetBytes(), addr_byte_size, error) != addr_byte_size)
923 {
Greg Clayton8de27c72010-10-15 22:48:33 +0000924 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", name.GetCString(), error.AsCString());
Sean Callanan17c6a052010-10-05 20:18:48 +0000925 return false;
926 }
927
928 if (log)
929 log->Printf("Copied from 0x%llx to 0x%llx", (uint64_t)src_addr, (uint64_t)addr);
Sean Callananf328c9f2010-07-20 23:31:16 +0000930 }
Sean Callanan17c6a052010-10-05 20:18:48 +0000931 break;
932 case Value::eValueTypeScalar:
933 {
Greg Clayton6916e352010-11-13 03:52:47 +0000934 if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
Sean Callanan17c6a052010-10-05 20:18:48 +0000935 {
936 StreamString ss;
937
938 location_value->Dump(&ss);
939
Greg Clayton8de27c72010-10-15 22:48:33 +0000940 err.SetErrorStringWithFormat("%s is a scalar of unhandled type: %s", name.GetCString(), ss.GetString().c_str());
Sean Callanan17c6a052010-10-05 20:18:48 +0000941 return false;
942 }
943
944 lldb::RegisterInfo *register_info = location_value->GetRegisterInfo();
945
946 if (!register_info)
947 {
Greg Clayton8de27c72010-10-15 22:48:33 +0000948 err.SetErrorStringWithFormat("Couldn't get the register information for %s", name.GetCString());
Sean Callanan17c6a052010-10-05 20:18:48 +0000949 return false;
950 }
951
952 RegisterContext *register_context = exe_ctx.GetRegisterContext();
953
954 if (!register_context)
955 {
Greg Clayton8de27c72010-10-15 22:48:33 +0000956 err.SetErrorStringWithFormat("Couldn't read register context to read %s from %s", name.GetCString(), register_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +0000957 return false;
958 }
959
960 uint32_t register_number = register_info->kinds[lldb::eRegisterKindLLDB];
961 uint32_t register_byte_size = register_info->byte_size;
962
963 if (dematerialize)
964 {
965 // Moving from addr into a register
966 //
967 // Case 1: addr_byte_size and register_byte_size are the same
968 //
969 // |AABBCCDD| Address contents
970 // |AABBCCDD| Register contents
971 //
972 // Case 2: addr_byte_size is bigger than register_byte_size
973 //
974 // Error! (The register should always be big enough to hold the data)
975 //
976 // Case 3: register_byte_size is bigger than addr_byte_size
977 //
978 // |AABB| Address contents
979 // |AABB0000| Register contents [on little-endian hardware]
980 // |0000AABB| Register contents [on big-endian hardware]
981
982 if (addr_byte_size > register_byte_size)
983 {
Greg Clayton8de27c72010-10-15 22:48:33 +0000984 err.SetErrorStringWithFormat("%s is too big to store in %s", name.GetCString(), register_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +0000985 return false;
986 }
987
988 uint32_t register_offset;
989
990 switch (exe_ctx.process->GetByteOrder())
991 {
992 default:
Greg Clayton8de27c72010-10-15 22:48:33 +0000993 err.SetErrorStringWithFormat("%s is stored with an unhandled byte order", name.GetCString());
Sean Callanan17c6a052010-10-05 20:18:48 +0000994 return false;
995 case lldb::eByteOrderLittle:
996 register_offset = 0;
997 break;
998 case lldb::eByteOrderBig:
999 register_offset = register_byte_size - addr_byte_size;
1000 break;
1001 }
1002
1003 DataBufferHeap register_data (register_byte_size, 0);
1004
1005 Error error;
1006 if (exe_ctx.process->ReadMemory (addr, register_data.GetBytes() + register_offset, addr_byte_size, error) != addr_byte_size)
1007 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001008 err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", name.GetCString(), error.AsCString());
Sean Callanan17c6a052010-10-05 20:18:48 +00001009 return false;
1010 }
1011
1012 DataExtractor register_extractor (register_data.GetBytes(), register_byte_size, exe_ctx.process->GetByteOrder(), exe_ctx.process->GetAddressByteSize());
1013
1014 if (!register_context->WriteRegisterBytes(register_number, register_extractor, 0))
1015 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001016 err.SetErrorStringWithFormat("Couldn't read %s from %s", name.GetCString(), register_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001017 return false;
1018 }
1019 }
1020 else
1021 {
1022 // Moving from a register into addr
1023 //
1024 // Case 1: addr_byte_size and register_byte_size are the same
1025 //
1026 // |AABBCCDD| Register contents
1027 // |AABBCCDD| Address contents
1028 //
1029 // Case 2: addr_byte_size is bigger than register_byte_size
1030 //
1031 // Error! (The register should always be big enough to hold the data)
1032 //
1033 // Case 3: register_byte_size is bigger than addr_byte_size
1034 //
1035 // |AABBCCDD| Register contents
1036 // |AABB| Address contents on little-endian hardware
1037 // |CCDD| Address contents on big-endian hardware
1038
1039 if (addr_byte_size > register_byte_size)
1040 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001041 err.SetErrorStringWithFormat("%s is too big to store in %s", name.GetCString(), register_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001042 return false;
1043 }
1044
1045 uint32_t register_offset;
1046
1047 switch (exe_ctx.process->GetByteOrder())
1048 {
1049 default:
Greg Clayton8de27c72010-10-15 22:48:33 +00001050 err.SetErrorStringWithFormat("%s is stored with an unhandled byte order", name.GetCString());
Sean Callanan17c6a052010-10-05 20:18:48 +00001051 return false;
1052 case lldb::eByteOrderLittle:
1053 register_offset = 0;
1054 break;
1055 case lldb::eByteOrderBig:
1056 register_offset = register_byte_size - addr_byte_size;
1057 break;
1058 }
1059
1060 DataExtractor register_extractor;
1061
1062 if (!register_context->ReadRegisterBytes(register_number, register_extractor))
1063 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001064 err.SetErrorStringWithFormat("Couldn't read %s from %s", name.GetCString(), register_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001065 return false;
1066 }
1067
1068 const void *register_data = register_extractor.GetData(&register_offset, addr_byte_size);
1069
1070 if (!register_data)
1071 {
Greg Clayton8de27c72010-10-15 22:48:33 +00001072 err.SetErrorStringWithFormat("Read but couldn't extract data for %s from %s", name.GetCString(), register_info->name);
Sean Callanan17c6a052010-10-05 20:18:48 +00001073 return false;
1074 }
1075
1076 Error error;
1077 if (exe_ctx.process->WriteMemory (addr, register_data, addr_byte_size, error) != addr_byte_size)
1078 {
1079 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", error.AsCString());
1080 return false;
1081 }
1082 }
1083 }
Sean Callananf328c9f2010-07-20 23:31:16 +00001084 }
1085
1086 return true;
Sean Callanan810f22d2010-07-16 00:09:46 +00001087}
1088
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001089bool
1090ClangExpressionDeclMap::DoMaterializeOneRegister
1091(
1092 bool dematerialize,
1093 ExecutionContext &exe_ctx,
1094 RegisterContext &reg_ctx,
1095 const lldb::RegisterInfo &reg_info,
1096 lldb::addr_t addr,
1097 Error &err
1098)
1099{
1100 uint32_t register_number = reg_info.kinds[lldb::eRegisterKindLLDB];
1101 uint32_t register_byte_size = reg_info.byte_size;
1102
1103 Error error;
1104
1105 if (dematerialize)
1106 {
1107 DataBufferHeap register_data (register_byte_size, 0);
1108
1109 Error error;
1110 if (exe_ctx.process->ReadMemory (addr, register_data.GetBytes(), register_byte_size, error) != register_byte_size)
1111 {
1112 err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", reg_info.name, error.AsCString());
1113 return false;
1114 }
1115
1116 DataExtractor register_extractor (register_data.GetBytes(), register_byte_size, exe_ctx.process->GetByteOrder(), exe_ctx.process->GetAddressByteSize());
1117
1118 if (!reg_ctx.WriteRegisterBytes(register_number, register_extractor, 0))
1119 {
1120 err.SetErrorStringWithFormat("Couldn't read %s", reg_info.name);
1121 return false;
1122 }
1123 }
1124 else
1125 {
1126 DataExtractor register_extractor;
1127
1128 if (!reg_ctx.ReadRegisterBytes(register_number, register_extractor))
1129 {
1130 err.SetErrorStringWithFormat("Couldn't read %s", reg_info.name);
1131 return false;
1132 }
1133
1134 uint32_t register_offset = 0;
1135
1136 const void *register_data = register_extractor.GetData(&register_offset, register_byte_size);
1137
1138 if (!register_data)
1139 {
1140 err.SetErrorStringWithFormat("Read but couldn't extract data for %s", reg_info.name);
1141 return false;
1142 }
1143
1144 Error error;
1145 if (exe_ctx.process->WriteMemory (addr, register_data, register_byte_size, error) != register_byte_size)
1146 {
1147 err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", error.AsCString());
1148 return false;
1149 }
1150 }
1151
1152 return true;
1153}
1154
Sean Callanancc074622010-09-14 21:59:34 +00001155Variable *
Greg Clayton8de27c72010-10-15 22:48:33 +00001156ClangExpressionDeclMap::FindVariableInScope
1157(
1158 StackFrame &frame,
1159 const ConstString &name,
1160 TypeFromUser *type
1161)
Sean Callananaa301c42010-12-03 01:38:59 +00001162{
Greg Claytone005f2c2010-11-06 01:53:30 +00001163 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanancc074622010-09-14 21:59:34 +00001164
Sean Callanancc074622010-09-14 21:59:34 +00001165 VariableList *var_list = frame.GetVariableList(true);
1166
Greg Claytonbf8e42b2010-10-14 22:52:14 +00001167 if (!var_list)
1168 return NULL;
1169
Greg Clayton3bc52d02010-11-14 22:13:40 +00001170 lldb::VariableSP var_sp (var_list->FindVariable(name));
1171
1172 const bool append = true;
1173 const uint32_t max_matches = 1;
1174 if (!var_sp)
Sean Callanancc074622010-09-14 21:59:34 +00001175 {
Greg Clayton3bc52d02010-11-14 22:13:40 +00001176 // Look for globals elsewhere in the module for the frame
Sean Callananaa301c42010-12-03 01:38:59 +00001177 ModuleSP module_sp (frame.GetSymbolContext(eSymbolContextModule).module_sp);
Greg Clayton3bc52d02010-11-14 22:13:40 +00001178 if (module_sp)
1179 {
1180 VariableList module_globals;
1181 if (module_sp->FindGlobalVariables (name, append, max_matches, module_globals))
1182 var_sp = module_globals.GetVariableAtIndex (0);
1183 }
1184 }
1185
1186 if (!var_sp)
1187 {
1188 // Look for globals elsewhere in the program (all images)
Sean Callananaa301c42010-12-03 01:38:59 +00001189 TargetSP target_sp (frame.GetSymbolContext(eSymbolContextTarget).target_sp);
Greg Clayton3bc52d02010-11-14 22:13:40 +00001190 if (target_sp)
1191 {
1192 VariableList program_globals;
1193 if (target_sp->GetImages().FindGlobalVariables (name, append, max_matches, program_globals))
1194 var_sp = program_globals.GetVariableAtIndex (0);
1195 }
1196 }
1197
1198 if (var_sp && type)
1199 {
1200 if (type->GetASTContext() == var_sp->GetType()->GetClangAST())
1201 {
1202 if (!ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangType()))
1203 return NULL;
1204 }
1205 else
1206 {
1207 if (log)
1208 log->PutCString("Skipping a candidate variable because of different AST contexts");
Sean Callanancc074622010-09-14 21:59:34 +00001209 return NULL;
Greg Clayton3bc52d02010-11-14 22:13:40 +00001210 }
Sean Callanancc074622010-09-14 21:59:34 +00001211 }
Greg Clayton3bc52d02010-11-14 22:13:40 +00001212
1213 return var_sp.get();
Sean Callanancc074622010-09-14 21:59:34 +00001214}
Sean Callanan336a0002010-07-17 00:43:37 +00001215
Chris Lattner24943d22010-06-08 16:52:24 +00001216// Interface for ClangASTSource
1217void
Greg Claytone5748d82010-11-09 23:46:37 +00001218ClangExpressionDeclMap::GetDecls (NameSearchContext &context, const ConstString &name)
Chris Lattner24943d22010-06-08 16:52:24 +00001219{
Sean Callananaa301c42010-12-03 01:38:59 +00001220 assert (m_struct_vars.get());
1221 assert (m_parser_vars.get());
1222
Greg Claytone005f2c2010-11-06 01:53:30 +00001223 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001224
Sean Callanan810f22d2010-07-16 00:09:46 +00001225 if (log)
Greg Clayton8de27c72010-10-15 22:48:33 +00001226 log->Printf("Hunting for a definition for '%s'", name.GetCString());
Chris Lattner24943d22010-06-08 16:52:24 +00001227
1228 // Back out in all cases where we're not fully initialized
Sean Callananaa301c42010-12-03 01:38:59 +00001229 if (m_parser_vars->m_exe_ctx->frame == NULL)
Chris Lattner24943d22010-06-08 16:52:24 +00001230 return;
Sean Callananee8fc722010-11-19 20:20:02 +00001231
Sean Callananaa301c42010-12-03 01:38:59 +00001232 if (m_parser_vars->m_ignore_lookups)
Sean Callananee8fc722010-11-19 20:20:02 +00001233 {
1234 if (log)
1235 log->Printf("Ignoring a query during an import");
1236 return;
1237 }
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001238
Greg Claytone5748d82010-11-09 23:46:37 +00001239 SymbolContextList sc_list;
Chris Lattner24943d22010-06-08 16:52:24 +00001240
Greg Clayton3bc52d02010-11-14 22:13:40 +00001241 const char *name_unique_cstr = name.GetCString();
1242
1243 if (name_unique_cstr == NULL)
1244 return;
1245
Greg Clayton8de27c72010-10-15 22:48:33 +00001246 // Only look for functions by name out in our symbols if the function
1247 // doesn't start with our phony prefix of '$'
Greg Clayton3bc52d02010-11-14 22:13:40 +00001248 if (name_unique_cstr[0] != '$')
Sean Callanan0fc73582010-07-27 00:55:47 +00001249 {
Sean Callananaa301c42010-12-03 01:38:59 +00001250 Variable *var = FindVariableInScope(*m_parser_vars->m_exe_ctx->frame, name);
Greg Clayton8de27c72010-10-15 22:48:33 +00001251
1252 // If we found a variable in scope, no need to pull up function names
1253 if (var != NULL)
1254 {
1255 AddOneVariable(context, var);
1256 }
1257 else
1258 {
Sean Callananaa301c42010-12-03 01:38:59 +00001259 m_parser_vars->m_sym_ctx.FindFunctionsByName (name, false, sc_list);
Greg Clayton8de27c72010-10-15 22:48:33 +00001260
1261 bool found_specific = false;
1262 Symbol *generic_symbol = NULL;
1263 Symbol *non_extern_symbol = NULL;
1264
Greg Claytone5748d82010-11-09 23:46:37 +00001265 for (uint32_t index = 0, num_indices = sc_list.GetSize();
Greg Clayton8de27c72010-10-15 22:48:33 +00001266 index < num_indices;
1267 ++index)
1268 {
1269 SymbolContext sym_ctx;
Greg Claytone5748d82010-11-09 23:46:37 +00001270 sc_list.GetContextAtIndex(index, sym_ctx);
Sean Callanan3cfbd332010-10-06 00:10:07 +00001271
Greg Clayton8de27c72010-10-15 22:48:33 +00001272 if (sym_ctx.function)
1273 {
1274 // TODO only do this if it's a C function; C++ functions may be
1275 // overloaded
1276 if (!found_specific)
1277 AddOneFunction(context, sym_ctx.function, NULL);
1278 found_specific = true;
1279 }
1280 else if (sym_ctx.symbol)
1281 {
1282 if (sym_ctx.symbol->IsExternal())
1283 generic_symbol = sym_ctx.symbol;
1284 else
1285 non_extern_symbol = sym_ctx.symbol;
1286 }
1287 }
1288
Sean Callanan92aa6662010-09-07 21:49:41 +00001289 if (!found_specific)
Greg Clayton8de27c72010-10-15 22:48:33 +00001290 {
1291 if (generic_symbol)
1292 AddOneFunction(context, NULL, generic_symbol);
1293 else if (non_extern_symbol)
1294 AddOneFunction(context, NULL, non_extern_symbol);
1295 }
Greg Clayton6916e352010-11-13 03:52:47 +00001296
Sean Callananaa301c42010-12-03 01:38:59 +00001297 ClangNamespaceDecl namespace_decl (m_parser_vars->m_sym_ctx.FindNamespace(name));
Greg Clayton6916e352010-11-13 03:52:47 +00001298 if (namespace_decl)
1299 {
Greg Clayton9ceed1e2010-11-13 04:18:24 +00001300 clang::NamespaceDecl *clang_namespace_decl = AddNamespace(context, namespace_decl);
1301 if (clang_namespace_decl)
Greg Clayton9ceed1e2010-11-13 04:18:24 +00001302 clang_namespace_decl->setHasExternalLexicalStorage();
Greg Clayton6916e352010-11-13 03:52:47 +00001303 }
Sean Callanan92aa6662010-09-07 21:49:41 +00001304 }
Sean Callanan0fc73582010-07-27 00:55:47 +00001305 }
Greg Clayton8de27c72010-10-15 22:48:33 +00001306 else
Sean Callanan3cfbd332010-10-06 00:10:07 +00001307 {
Greg Clayton57452832010-11-09 04:42:43 +00001308 static ConstString g_lldb_class_name ("$__lldb_class");
1309 if (name == g_lldb_class_name)
1310 {
1311 // Clang is looking for the type of "this"
1312
Sean Callananaa301c42010-12-03 01:38:59 +00001313 VariableList *vars = m_parser_vars->m_exe_ctx->frame->GetVariableList(false);
Greg Clayton57452832010-11-09 04:42:43 +00001314
1315 if (!vars)
1316 return;
1317
1318 lldb::VariableSP this_var = vars->FindVariable(ConstString("this"));
1319
1320 if (!this_var)
1321 return;
1322
1323 Type *this_type = this_var->GetType();
1324
1325 if (!this_type)
1326 return;
1327
Greg Clayton2403b5e2010-11-16 02:10:54 +00001328 if (log)
1329 {
1330 log->PutCString ("Type for \"this\" is: ");
1331 StreamString strm;
1332 this_type->Dump(&strm, true);
1333 log->PutCString (strm.GetData());
1334 }
1335
Greg Clayton57452832010-11-09 04:42:43 +00001336 TypeFromUser this_user_type(this_type->GetClangType(),
1337 this_type->GetClangAST());
1338
Sean Callananaa301c42010-12-03 01:38:59 +00001339 m_struct_vars->m_object_pointer_type = this_user_type;
Greg Clayton57452832010-11-09 04:42:43 +00001340
1341 void *pointer_target_type;
1342
1343 if (!ClangASTContext::IsPointerType(this_user_type.GetOpaqueQualType(),
1344 &pointer_target_type))
1345 return;
1346
1347 TypeFromUser class_user_type(pointer_target_type,
1348 this_type->GetClangAST());
1349
Sean Callanan3aa7da52010-12-13 22:46:15 +00001350 if (log)
1351 {
1352 StreamString type_stream;
1353 class_user_type.DumpTypeCode(&type_stream);
1354 type_stream.Flush();
1355 log->Printf("Adding type for $__lldb_class: %s", type_stream.GetString().c_str());
1356 }
1357
Greg Clayton57452832010-11-09 04:42:43 +00001358 AddOneType(context, class_user_type, true);
1359
1360 return;
1361 }
1362
Sean Callanan3aa7da52010-12-13 22:46:15 +00001363 static ConstString g_lldb_objc_class_name ("$__lldb_objc_class");
1364 if (name == g_lldb_objc_class_name)
1365 {
1366 // Clang is looking for the type of "*self"
1367
1368 VariableList *vars = m_parser_vars->m_exe_ctx->frame->GetVariableList(false);
1369
1370 if (!vars)
1371 return;
1372
1373 lldb::VariableSP self_var = vars->FindVariable(ConstString("self"));
1374
1375 if (!self_var)
1376 return;
1377
1378 Type *self_type = self_var->GetType();
1379
1380 if (!self_type)
1381 return;
1382
1383 TypeFromUser self_user_type(self_type->GetClangType(),
1384 self_type->GetClangAST());
1385
1386 m_struct_vars->m_object_pointer_type = self_user_type;
1387
1388 void *pointer_target_type;
1389
1390 if (!ClangASTContext::IsPointerType(self_user_type.GetOpaqueQualType(),
1391 &pointer_target_type))
1392 return;
1393
1394 TypeFromUser class_user_type(pointer_target_type,
1395 self_type->GetClangAST());
1396
1397 if (log)
1398 {
1399 StreamString type_stream;
1400 class_user_type.DumpTypeCode(&type_stream);
1401 type_stream.Flush();
1402 log->Printf("Adding type for $__lldb_objc_class: %s", type_stream.GetString().c_str());
1403 }
1404
1405 AddOneType(context, class_user_type, false);
1406
1407 return;
1408 }
Greg Clayton427f2902010-12-14 02:59:59 +00001409
1410 ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name));
Greg Clayton8de27c72010-10-15 22:48:33 +00001411
Greg Clayton427f2902010-12-14 02:59:59 +00001412 if (pvar_sp)
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001413 {
Greg Clayton427f2902010-12-14 02:59:59 +00001414 AddOneVariable(context, pvar_sp);
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001415 return;
1416 }
1417
1418 const char *reg_name(&name.GetCString()[1]);
1419
Sean Callananaa301c42010-12-03 01:38:59 +00001420 if (m_parser_vars->m_exe_ctx->GetRegisterContext())
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001421 {
Sean Callananaa301c42010-12-03 01:38:59 +00001422 const lldb::RegisterInfo *reg_info(m_parser_vars->m_exe_ctx->GetRegisterContext()->GetRegisterInfoByName(reg_name));
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001423
1424 if (reg_info)
1425 AddOneRegister(context, reg_info);
1426 }
Sean Callanan3cfbd332010-10-06 00:10:07 +00001427 }
1428
Sean Callananaa301c42010-12-03 01:38:59 +00001429 lldb::TypeSP type_sp (m_parser_vars->m_sym_ctx.FindTypeByName (name));
Sean Callananee8fc722010-11-19 20:20:02 +00001430
1431 if (type_sp)
Sean Callanan6df08402010-09-27 23:54:58 +00001432 {
Sean Callananee8fc722010-11-19 20:20:02 +00001433 if (log)
Sean Callanan6df08402010-09-27 23:54:58 +00001434 {
Sean Callananee8fc722010-11-19 20:20:02 +00001435 log->Printf ("Matching type found for \"%s\": ", name.GetCString());
1436 StreamString strm;
1437 type_sp->Dump(&strm, true);
1438 log->PutCString (strm.GetData());
1439 }
Greg Clayton2403b5e2010-11-16 02:10:54 +00001440
Sean Callananee8fc722010-11-19 20:20:02 +00001441 TypeFromUser user_type(type_sp->GetClangType(),
Greg Clayton2403b5e2010-11-16 02:10:54 +00001442 type_sp->GetClangAST());
Sean Callanan6df08402010-09-27 23:54:58 +00001443
Sean Callananee8fc722010-11-19 20:20:02 +00001444 AddOneType(context, user_type, false);
Sean Callanan6df08402010-09-27 23:54:58 +00001445 }
Sean Callanan336a0002010-07-17 00:43:37 +00001446}
1447
1448Value *
Greg Clayton8de27c72010-10-15 22:48:33 +00001449ClangExpressionDeclMap::GetVariableValue
1450(
1451 ExecutionContext &exe_ctx,
1452 Variable *var,
1453 clang::ASTContext *parser_ast_context,
1454 TypeFromUser *user_type,
1455 TypeFromParser *parser_type
1456)
Chris Lattner24943d22010-06-08 16:52:24 +00001457{
Greg Claytone005f2c2010-11-06 01:53:30 +00001458 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan6184dfe2010-06-23 00:47:48 +00001459
Chris Lattner24943d22010-06-08 16:52:24 +00001460 Type *var_type = var->GetType();
1461
1462 if (!var_type)
1463 {
Sean Callanan810f22d2010-07-16 00:09:46 +00001464 if (log)
1465 log->PutCString("Skipped a definition because it has no type");
Sean Callanan336a0002010-07-17 00:43:37 +00001466 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00001467 }
1468
Greg Clayton462d4142010-09-29 01:12:09 +00001469 void *var_opaque_type = var_type->GetClangType();
Chris Lattner24943d22010-06-08 16:52:24 +00001470
1471 if (!var_opaque_type)
1472 {
Sean Callanan810f22d2010-07-16 00:09:46 +00001473 if (log)
1474 log->PutCString("Skipped a definition because it has no Clang type");
Sean Callanan336a0002010-07-17 00:43:37 +00001475 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00001476 }
1477
Chris Lattner24943d22010-06-08 16:52:24 +00001478 TypeList *type_list = var_type->GetTypeList();
1479
1480 if (!type_list)
1481 {
Sean Callanan810f22d2010-07-16 00:09:46 +00001482 if (log)
1483 log->PutCString("Skipped a definition because the type has no associated type list");
Sean Callanan336a0002010-07-17 00:43:37 +00001484 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00001485 }
1486
1487 clang::ASTContext *exe_ast_ctx = type_list->GetClangASTContext().getASTContext();
1488
1489 if (!exe_ast_ctx)
1490 {
Sean Callanan810f22d2010-07-16 00:09:46 +00001491 if (log)
1492 log->PutCString("There is no AST context for the current execution context");
Sean Callanan336a0002010-07-17 00:43:37 +00001493 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00001494 }
1495
Sean Callanan336a0002010-07-17 00:43:37 +00001496 DWARFExpression &var_location_expr = var->LocationExpression();
1497
Chris Lattner24943d22010-06-08 16:52:24 +00001498 std::auto_ptr<Value> var_location(new Value);
1499
Greg Clayton178710c2010-09-14 02:20:48 +00001500 lldb::addr_t loclist_base_load_addr = LLDB_INVALID_ADDRESS;
1501
1502 if (var_location_expr.IsLocationList())
1503 {
1504 SymbolContext var_sc;
1505 var->CalculateSymbolContext (&var_sc);
Greg Claytoneea26402010-09-14 23:36:40 +00001506 loclist_base_load_addr = var_sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress (exe_ctx.target);
Greg Clayton178710c2010-09-14 02:20:48 +00001507 }
Chris Lattner24943d22010-06-08 16:52:24 +00001508 Error err;
1509
Jason Molenda8e69de42010-11-20 01:28:30 +00001510 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 +00001511 {
Sean Callanan810f22d2010-07-16 00:09:46 +00001512 if (log)
1513 log->Printf("Error evaluating location: %s", err.AsCString());
Sean Callanan336a0002010-07-17 00:43:37 +00001514 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00001515 }
1516
Sean Callanan810f22d2010-07-16 00:09:46 +00001517 clang::ASTContext *var_ast_context = type_list->GetClangASTContext().getASTContext();
1518
Sean Callanan336a0002010-07-17 00:43:37 +00001519 void *type_to_use;
1520
Sean Callananf328c9f2010-07-20 23:31:16 +00001521 if (parser_ast_context)
1522 {
Sean Callananee8fc722010-11-19 20:20:02 +00001523 type_to_use = GuardedCopyType(parser_ast_context, var_ast_context, var_opaque_type);
Sean Callananf328c9f2010-07-20 23:31:16 +00001524
Sean Callanan4b5eec62010-11-20 02:19:29 +00001525 if (!type_to_use)
1526 {
1527 if (log)
1528 log->Printf("Couldn't copy a variable's type into the parser's AST context");
1529
1530 return NULL;
1531 }
1532
Sean Callananf328c9f2010-07-20 23:31:16 +00001533 if (parser_type)
1534 *parser_type = TypeFromParser(type_to_use, parser_ast_context);
1535 }
Sean Callanan336a0002010-07-17 00:43:37 +00001536 else
1537 type_to_use = var_opaque_type;
Chris Lattner24943d22010-06-08 16:52:24 +00001538
1539 if (var_location.get()->GetContextType() == Value::eContextTypeInvalid)
Greg Clayton6916e352010-11-13 03:52:47 +00001540 var_location.get()->SetContext(Value::eContextTypeClangType, type_to_use);
Chris Lattner24943d22010-06-08 16:52:24 +00001541
1542 if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress)
1543 {
1544 SymbolContext var_sc;
1545 var->CalculateSymbolContext(&var_sc);
Sean Callanan336a0002010-07-17 00:43:37 +00001546
Chris Lattner24943d22010-06-08 16:52:24 +00001547 if (!var_sc.module_sp)
Sean Callanan336a0002010-07-17 00:43:37 +00001548 return NULL;
Chris Lattner24943d22010-06-08 16:52:24 +00001549
1550 ObjectFile *object_file = var_sc.module_sp->GetObjectFile();
1551
1552 if (!object_file)
Sean Callanan336a0002010-07-17 00:43:37 +00001553 return NULL;
1554
Chris Lattner24943d22010-06-08 16:52:24 +00001555 Address so_addr(var_location->GetScalar().ULongLong(), object_file->GetSectionList());
1556
Sean Callananaa301c42010-12-03 01:38:59 +00001557 lldb::addr_t load_addr = so_addr.GetLoadAddress(exe_ctx.target);
Chris Lattner24943d22010-06-08 16:52:24 +00001558
1559 var_location->GetScalar() = load_addr;
1560 var_location->SetValueType(Value::eValueTypeLoadAddress);
1561 }
1562
Sean Callananf328c9f2010-07-20 23:31:16 +00001563 if (user_type)
1564 *user_type = TypeFromUser(var_opaque_type, var_ast_context);
Sean Callanan336a0002010-07-17 00:43:37 +00001565
1566 return var_location.release();
1567}
1568
1569void
1570ClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001571 Variable* var)
Sean Callanan336a0002010-07-17 00:43:37 +00001572{
Sean Callananaa301c42010-12-03 01:38:59 +00001573 assert (m_parser_vars.get());
1574
Greg Claytone005f2c2010-11-06 01:53:30 +00001575 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan336a0002010-07-17 00:43:37 +00001576
Sean Callananf328c9f2010-07-20 23:31:16 +00001577 TypeFromUser ut;
1578 TypeFromParser pt;
Sean Callanan336a0002010-07-17 00:43:37 +00001579
Sean Callananaa301c42010-12-03 01:38:59 +00001580 Value *var_location = GetVariableValue (*m_parser_vars->m_exe_ctx,
Greg Clayton8de27c72010-10-15 22:48:33 +00001581 var,
1582 context.GetASTContext(),
1583 &ut,
1584 &pt);
Sean Callanan336a0002010-07-17 00:43:37 +00001585
Sean Callanan4b5eec62010-11-20 02:19:29 +00001586 if (!var_location)
1587 return;
1588
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001589 NamedDecl *var_decl = context.AddVarDecl(pt.GetOpaqueQualType());
Greg Clayton8de27c72010-10-15 22:48:33 +00001590 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton427f2902010-12-14 02:59:59 +00001591 ConstString entity_name(decl_name.c_str());
1592 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (entity_name,
1593 ut,
1594 m_parser_vars->m_exe_ctx->process->GetByteOrder(),
1595 m_parser_vars->m_exe_ctx->process->GetAddressByteSize()));
1596 assert (entity.get());
1597 entity->EnableParserVars();
1598 entity->m_parser_vars->m_parser_type = pt;
1599 entity->m_parser_vars->m_named_decl = var_decl;
1600 entity->m_parser_vars->m_llvm_value = NULL;
1601 entity->m_parser_vars->m_lldb_value = var_location;
Chris Lattner24943d22010-06-08 16:52:24 +00001602
Sean Callanan810f22d2010-07-16 00:09:46 +00001603 if (log)
Greg Clayton8de27c72010-10-15 22:48:33 +00001604 {
Sean Callanana0744822010-11-01 23:22:47 +00001605 std::string var_decl_print_string;
1606 llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
1607 var_decl->print(var_decl_print_stream);
1608 var_decl_print_stream.flush();
1609
1610 log->Printf("Found variable %s, returned %s", decl_name.c_str(), var_decl_print_string.c_str());
Greg Clayton8de27c72010-10-15 22:48:33 +00001611 }
Sean Callanan8f0dc342010-06-22 23:46:24 +00001612}
1613
1614void
Sean Callanana48fe162010-08-11 03:57:18 +00001615ClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
Greg Clayton427f2902010-12-14 02:59:59 +00001616 ClangExpressionVariableSP &pvar_sp)
Sean Callanana48fe162010-08-11 03:57:18 +00001617{
Greg Claytone005f2c2010-11-06 01:53:30 +00001618 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan45690fe2010-08-30 22:17:16 +00001619
Greg Clayton427f2902010-12-14 02:59:59 +00001620 TypeFromUser user_type (pvar_sp->GetTypeFromUser());
Sean Callanana48fe162010-08-11 03:57:18 +00001621
Greg Clayton427f2902010-12-14 02:59:59 +00001622 TypeFromParser parser_type (GuardedCopyType(context.GetASTContext(),
1623 user_type.GetASTContext(),
1624 user_type.GetOpaqueQualType()),
1625 context.GetASTContext());
Sean Callanana48fe162010-08-11 03:57:18 +00001626
Sean Callanan8c127202010-08-23 23:09:38 +00001627 NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
1628
Greg Clayton427f2902010-12-14 02:59:59 +00001629 pvar_sp->EnableParserVars();
1630 pvar_sp->m_parser_vars->m_parser_type = parser_type;
1631 pvar_sp->m_parser_vars->m_named_decl = var_decl;
1632 pvar_sp->m_parser_vars->m_llvm_value = NULL;
1633 pvar_sp->m_parser_vars->m_lldb_value = NULL;
Sean Callanan45690fe2010-08-30 22:17:16 +00001634
1635 if (log)
Sean Callanana0744822010-11-01 23:22:47 +00001636 {
1637 std::string var_decl_print_string;
1638 llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
1639 var_decl->print(var_decl_print_stream);
1640 var_decl_print_stream.flush();
1641
Greg Clayton427f2902010-12-14 02:59:59 +00001642 log->Printf("Added pvar %s, returned %s", pvar_sp->GetName().GetCString(), var_decl_print_string.c_str());
Sean Callanana0744822010-11-01 23:22:47 +00001643 }
Sean Callanana48fe162010-08-11 03:57:18 +00001644}
1645
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001646void
Greg Clayton427f2902010-12-14 02:59:59 +00001647ClangExpressionDeclMap::AddOneRegister (NameSearchContext &context,
1648 const RegisterInfo *reg_info)
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001649{
1650 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1651
1652 void *ast_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize(context.GetASTContext(),
1653 reg_info->encoding,
1654 reg_info->byte_size * 8);
1655
1656 if (!ast_type)
1657 {
1658 log->Printf("Tried to add a type for %s, but couldn't get one", context.m_decl_name.getAsString().c_str());
1659 return;
1660 }
1661
Greg Clayton427f2902010-12-14 02:59:59 +00001662 TypeFromParser parser_type (ast_type,
1663 context.GetASTContext());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001664
1665 NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
1666
Greg Clayton427f2902010-12-14 02:59:59 +00001667 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->process->GetByteOrder(),
1668 m_parser_vars->m_exe_ctx->process->GetAddressByteSize()));
1669 assert (entity.get());
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001670 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton427f2902010-12-14 02:59:59 +00001671 entity->SetName (ConstString (decl_name.c_str()));
1672 entity->SetRegisterInfo (reg_info);
1673 entity->EnableParserVars();
1674 entity->m_parser_vars->m_parser_type = parser_type;
1675 entity->m_parser_vars->m_named_decl = var_decl;
1676 entity->m_parser_vars->m_llvm_value = NULL;
1677 entity->m_parser_vars->m_lldb_value = NULL;
Sean Callanan1ddd9fe2010-11-30 00:27:43 +00001678
1679 if (log)
1680 {
1681 std::string var_decl_print_string;
1682 llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
1683 var_decl->print(var_decl_print_stream);
1684 var_decl_print_stream.flush();
1685
1686 log->Printf("Added register %s, returned %s", context.m_decl_name.getAsString().c_str(), var_decl_print_string.c_str());
1687 }
1688}
1689
Greg Clayton6916e352010-11-13 03:52:47 +00001690clang::NamespaceDecl *
1691ClangExpressionDeclMap::AddNamespace (NameSearchContext &context, const ClangNamespaceDecl &namespace_decl)
1692{
1693 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1694
1695
1696 clang::Decl *copied_decl = ClangASTContext::CopyDecl (context.GetASTContext(),
1697 namespace_decl.GetASTContext(),
1698 namespace_decl.GetNamespaceDecl());
1699
1700 return dyn_cast<clang::NamespaceDecl>(copied_decl);
1701}
1702
Sean Callanana48fe162010-08-11 03:57:18 +00001703void
Sean Callanan8f0dc342010-06-22 23:46:24 +00001704ClangExpressionDeclMap::AddOneFunction(NameSearchContext &context,
Sean Callanan0fc73582010-07-27 00:55:47 +00001705 Function* fun,
1706 Symbol* symbol)
Sean Callanan8f0dc342010-06-22 23:46:24 +00001707{
Sean Callananaa301c42010-12-03 01:38:59 +00001708 assert (m_parser_vars.get());
1709
Greg Claytone005f2c2010-11-06 01:53:30 +00001710 lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan8f0dc342010-06-22 23:46:24 +00001711
Sean Callanan0fc73582010-07-27 00:55:47 +00001712 NamedDecl *fun_decl;
Sean Callanan8f0dc342010-06-22 23:46:24 +00001713 std::auto_ptr<Value> fun_location(new Value);
Sean Callanan0fc73582010-07-27 00:55:47 +00001714 const Address *fun_address;
Sean Callanan8f0dc342010-06-22 23:46:24 +00001715
Sean Callanan0fc73582010-07-27 00:55:47 +00001716 // only valid for Functions, not for Symbols
1717 void *fun_opaque_type = NULL;
1718 clang::ASTContext *fun_ast_context = NULL;
1719
1720 if (fun)
1721 {
1722 Type *fun_type = fun->GetType();
1723
1724 if (!fun_type)
1725 {
1726 if (log)
1727 log->PutCString("Skipped a function because it has no type");
1728 return;
1729 }
1730
Greg Clayton462d4142010-09-29 01:12:09 +00001731 fun_opaque_type = fun_type->GetClangType();
Sean Callanan0fc73582010-07-27 00:55:47 +00001732
1733 if (!fun_opaque_type)
1734 {
1735 if (log)
1736 log->PutCString("Skipped a function because it has no Clang type");
1737 return;
1738 }
1739
1740 fun_address = &fun->GetAddressRange().GetBaseAddress();
1741
1742 TypeList *type_list = fun_type->GetTypeList();
1743 fun_ast_context = type_list->GetClangASTContext().getASTContext();
Sean Callananee8fc722010-11-19 20:20:02 +00001744 void *copied_type = GuardedCopyType(context.GetASTContext(), fun_ast_context, fun_opaque_type);
Sean Callanan0fc73582010-07-27 00:55:47 +00001745
1746 fun_decl = context.AddFunDecl(copied_type);
1747 }
1748 else if (symbol)
1749 {
1750 fun_address = &symbol->GetAddressRangeRef().GetBaseAddress();
1751
1752 fun_decl = context.AddGenericFunDecl();
1753 }
1754 else
1755 {
1756 if (log)
1757 log->PutCString("AddOneFunction called with no function and no symbol");
1758 return;
1759 }
1760
Sean Callananaa301c42010-12-03 01:38:59 +00001761 lldb::addr_t load_addr = fun_address->GetLoadAddress(m_parser_vars->m_exe_ctx->target);
Sean Callanan8f0dc342010-06-22 23:46:24 +00001762 fun_location->SetValueType(Value::eValueTypeLoadAddress);
1763 fun_location->GetScalar() = load_addr;
1764
Greg Clayton427f2902010-12-14 02:59:59 +00001765 ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->process->GetByteOrder(),
1766 m_parser_vars->m_exe_ctx->process->GetAddressByteSize()));
1767 assert (entity.get());
Greg Clayton8de27c72010-10-15 22:48:33 +00001768 std::string decl_name(context.m_decl_name.getAsString());
Greg Clayton427f2902010-12-14 02:59:59 +00001769 entity->SetName(ConstString(decl_name.c_str()));
1770 entity->SetClangType (fun_opaque_type);
1771 entity->SetClangAST (fun_ast_context);
Sean Callanan8f0dc342010-06-22 23:46:24 +00001772
Greg Clayton427f2902010-12-14 02:59:59 +00001773 entity->EnableParserVars();
1774 entity->m_parser_vars->m_named_decl = fun_decl;
1775 entity->m_parser_vars->m_llvm_value = NULL;
1776 entity->m_parser_vars->m_lldb_value = fun_location.release();
Sean Callanan8c127202010-08-23 23:09:38 +00001777
Sean Callanan810f22d2010-07-16 00:09:46 +00001778 if (log)
Greg Clayton8de27c72010-10-15 22:48:33 +00001779 {
Sean Callanana0744822010-11-01 23:22:47 +00001780 std::string fun_decl_print_string;
1781 llvm::raw_string_ostream fun_decl_print_stream(fun_decl_print_string);
1782 fun_decl->print(fun_decl_print_stream);
1783 fun_decl_print_stream.flush();
1784
1785 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 +00001786 }
Chris Lattner24943d22010-06-08 16:52:24 +00001787}
Sean Callanan93a4b1a2010-08-04 01:02:13 +00001788
1789void
1790ClangExpressionDeclMap::AddOneType(NameSearchContext &context,
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001791 TypeFromUser &ut,
1792 bool add_method)
Sean Callanan93a4b1a2010-08-04 01:02:13 +00001793{
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001794 clang::ASTContext *parser_ast_context = context.GetASTContext();
1795 clang::ASTContext *user_ast_context = ut.GetASTContext();
Sean Callanan93a4b1a2010-08-04 01:02:13 +00001796
Sean Callananee8fc722010-11-19 20:20:02 +00001797 void *copied_type = GuardedCopyType(parser_ast_context, user_ast_context, ut.GetOpaqueQualType());
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001798
1799 TypeFromParser parser_type(copied_type, parser_ast_context);
1800
1801 if (add_method && ClangASTContext::IsAggregateType(copied_type))
1802 {
1803 void *args[1];
1804
1805 args[0] = ClangASTContext::GetVoidPtrType(parser_ast_context, false);
1806
1807 void *method_type = ClangASTContext::CreateFunctionType (parser_ast_context,
1808 ClangASTContext::GetBuiltInType_void(parser_ast_context),
1809 args,
1810 1,
1811 false,
1812 ClangASTContext::GetTypeQualifiers(copied_type));
Greg Clayton30449d52010-10-01 02:31:07 +00001813
Greg Clayton1d8173f2010-09-24 05:15:53 +00001814 const bool is_virtual = false;
1815 const bool is_static = false;
1816 const bool is_inline = false;
Greg Clayton30449d52010-10-01 02:31:07 +00001817 const bool is_explicit = false;
1818
Greg Clayton1d8173f2010-09-24 05:15:53 +00001819 ClangASTContext::AddMethodToCXXRecordType (parser_ast_context,
1820 copied_type,
Greg Clayton8de27c72010-10-15 22:48:33 +00001821 "$__lldb_expr",
Greg Clayton1d8173f2010-09-24 05:15:53 +00001822 method_type,
1823 lldb::eAccessPublic,
1824 is_virtual,
1825 is_static,
Greg Clayton30449d52010-10-01 02:31:07 +00001826 is_inline,
1827 is_explicit);
Sean Callanan3c9c5eb2010-09-21 00:44:12 +00001828 }
Sean Callanan93a4b1a2010-08-04 01:02:13 +00001829
1830 context.AddTypeDecl(copied_type);
1831}
Sean Callananee8fc722010-11-19 20:20:02 +00001832
1833void *
1834ClangExpressionDeclMap::GuardedCopyType (ASTContext *dest_context,
1835 ASTContext *source_context,
1836 void *clang_type)
1837{
Sean Callananaa301c42010-12-03 01:38:59 +00001838 assert (m_parser_vars.get());
1839
1840 m_parser_vars->m_ignore_lookups = true;
Sean Callananee8fc722010-11-19 20:20:02 +00001841
1842 void *ret = ClangASTContext::CopyType (dest_context,
1843 source_context,
1844 clang_type);
1845
Sean Callananaa301c42010-12-03 01:38:59 +00001846 m_parser_vars->m_ignore_lookups = false;
Sean Callananee8fc722010-11-19 20:20:02 +00001847
1848 return ret;
1849}