blob: 0629f7e5f8f98de71e6ea228a6f4df4e42eff318 [file] [log] [blame]
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001//===-- IRInterpreter.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/Core/DataEncoder.h"
11#include "lldb/Core/Log.h"
12#include "lldb/Core/ValueObjectConstResult.h"
13#include "lldb/Expression/ClangExpressionDeclMap.h"
Sean Callananf673e762012-02-15 01:40:39 +000014#include "lldb/Expression/ClangExpressionVariable.h"
Sean Callanan3bfdaa22011-09-15 02:13:07 +000015#include "lldb/Expression/IRForTarget.h"
16#include "lldb/Expression/IRInterpreter.h"
17
Chandler Carruth1e157582013-01-02 12:20:07 +000018#include "llvm/IR/Constants.h"
19#include "llvm/IR/Function.h"
20#include "llvm/IR/Instructions.h"
21#include "llvm/IR/Module.h"
Sean Callanan3bfdaa22011-09-15 02:13:07 +000022#include "llvm/Support/raw_ostream.h"
Chandler Carruth1e157582013-01-02 12:20:07 +000023#include "llvm/IR/DataLayout.h"
Sean Callanan3bfdaa22011-09-15 02:13:07 +000024
25#include <map>
26
27using namespace llvm;
28
29IRInterpreter::IRInterpreter(lldb_private::ClangExpressionDeclMap &decl_map,
Sean Callanan179b5482013-04-16 23:49:09 +000030 lldb_private::IRMemoryMap &memory_map,
31 lldb_private::Stream *error_stream) :
32 m_decl_map(decl_map),
33 m_memory_map(memory_map)
Sean Callanan3bfdaa22011-09-15 02:13:07 +000034{
35
36}
37
38IRInterpreter::~IRInterpreter()
39{
40
41}
42
43static std::string
44PrintValue(const Value *value, bool truncate = false)
45{
46 std::string s;
47 raw_string_ostream rso(s);
48 value->print(rso);
49 rso.flush();
50 if (truncate)
51 s.resize(s.length() - 1);
52
53 size_t offset;
54 while ((offset = s.find('\n')) != s.npos)
55 s.erase(offset, 1);
56 while (s[0] == ' ' || s[0] == '\t')
57 s.erase(0, 1);
58
59 return s;
60}
61
62static std::string
63PrintType(const Type *type, bool truncate = false)
64{
65 std::string s;
66 raw_string_ostream rso(s);
67 type->print(rso);
68 rso.flush();
69 if (truncate)
70 s.resize(s.length() - 1);
71 return s;
72}
73
Sean Callanan3bfdaa22011-09-15 02:13:07 +000074class InterpreterStackFrame
75{
76public:
Sean Callanan08052af2013-04-17 07:50:58 +000077 typedef std::map <const Value*, lldb::addr_t> ValueMap;
78
79 struct PlacedValue
80 {
81 lldb_private::Value lldb_value;
82 lldb::addr_t process_address;
83 size_t size;
84
85 PlacedValue (lldb_private::Value &_lldb_value,
86 lldb::addr_t _process_address,
87 size_t _size) :
88 lldb_value(_lldb_value),
89 process_address(_process_address),
90 size(_size)
91 {
92 }
93 };
94
95 typedef std::vector <PlacedValue> PlacedValueVector;
Sean Callanan3bfdaa22011-09-15 02:13:07 +000096
97 ValueMap m_values;
Sean Callanan08052af2013-04-17 07:50:58 +000098 PlacedValueVector m_placed_values;
Micah Villmow8468dbe2012-10-08 16:28:57 +000099 DataLayout &m_target_data;
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000100 lldb_private::ClangExpressionDeclMap &m_decl_map;
Sean Callanan179b5482013-04-16 23:49:09 +0000101 lldb_private::IRMemoryMap &m_memory_map;
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000102 const BasicBlock *m_bb;
103 BasicBlock::const_iterator m_ii;
104 BasicBlock::const_iterator m_ie;
105
106 lldb::ByteOrder m_byte_order;
107 size_t m_addr_byte_size;
108
Micah Villmow8468dbe2012-10-08 16:28:57 +0000109 InterpreterStackFrame (DataLayout &target_data,
Sean Callanan179b5482013-04-16 23:49:09 +0000110 lldb_private::ClangExpressionDeclMap &decl_map,
111 lldb_private::IRMemoryMap &memory_map) :
Daniel Dunbara08823f2011-10-31 22:50:49 +0000112 m_target_data (target_data),
Sean Callanan179b5482013-04-16 23:49:09 +0000113 m_decl_map (decl_map),
114 m_memory_map (memory_map)
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000115 {
116 m_byte_order = (target_data.isLittleEndian() ? lldb::eByteOrderLittle : lldb::eByteOrderBig);
Sean Callanan95769bf2012-10-11 22:00:52 +0000117 m_addr_byte_size = (target_data.getPointerSize(0));
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000118 }
119
120 void Jump (const BasicBlock *bb)
121 {
122 m_bb = bb;
123 m_ii = m_bb->begin();
124 m_ie = m_bb->end();
125 }
126
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000127 std::string SummarizeValue (const Value *value)
128 {
129 lldb_private::StreamString ss;
130
131 ss.Printf("%s", PrintValue(value).c_str());
132
133 ValueMap::iterator i = m_values.find(value);
134
135 if (i != m_values.end())
136 {
Sean Callanan08052af2013-04-17 07:50:58 +0000137 lldb::addr_t addr = i->second;
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000138
Sean Callanan08052af2013-04-17 07:50:58 +0000139 ss.Printf(" 0x%llx", (unsigned long long)addr);
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000140 }
141
142 return ss.GetString();
143 }
144
145 bool AssignToMatchType (lldb_private::Scalar &scalar, uint64_t u64value, Type *type)
146 {
147 size_t type_size = m_target_data.getTypeStoreSize(type);
148
149 switch (type_size)
150 {
151 case 1:
152 scalar = (uint8_t)u64value;
153 break;
154 case 2:
155 scalar = (uint16_t)u64value;
156 break;
157 case 4:
158 scalar = (uint32_t)u64value;
159 break;
160 case 8:
161 scalar = (uint64_t)u64value;
162 break;
163 default:
164 return false;
165 }
166
167 return true;
168 }
169
170 bool EvaluateValue (lldb_private::Scalar &scalar, const Value *value, Module &module)
171 {
172 const Constant *constant = dyn_cast<Constant>(value);
173
174 if (constant)
175 {
176 if (const ConstantInt *constant_int = dyn_cast<ConstantInt>(constant))
177 {
178 return AssignToMatchType(scalar, constant_int->getLimitedValue(), value->getType());
179 }
180 }
181 else
182 {
Sean Callanan08052af2013-04-17 07:50:58 +0000183 lldb::addr_t process_address = ResolveValue(value, module);
184 size_t value_size = m_target_data.getTypeStoreSize(value->getType());
185
186 lldb_private::DataExtractor value_extractor;
187 lldb_private::Error extract_error;
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000188
Sean Callanan08052af2013-04-17 07:50:58 +0000189 m_memory_map.GetMemoryData(value_extractor, process_address, value_size, extract_error);
190
191 if (!extract_error.Success())
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000192 return false;
193
Greg Claytonc7bece562013-01-25 18:06:21 +0000194 lldb::offset_t offset = 0;
Sean Callanan08052af2013-04-17 07:50:58 +0000195 uint64_t u64value = value_extractor.GetMaxU64(&offset, value_size);
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000196
197 return AssignToMatchType(scalar, u64value, value->getType());
198 }
199
200 return false;
201 }
202
203 bool AssignValue (const Value *value, lldb_private::Scalar &scalar, Module &module)
204 {
Sean Callanan08052af2013-04-17 07:50:58 +0000205 lldb::addr_t process_address = ResolveValue (value, module);
206
207 if (process_address == LLDB_INVALID_ADDRESS)
208 return false;
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000209
210 lldb_private::Scalar cast_scalar;
211
212 if (!AssignToMatchType(cast_scalar, scalar.GetRawBits64(0), value->getType()))
213 return false;
Sean Callanan08052af2013-04-17 07:50:58 +0000214
215 size_t value_byte_size = m_target_data.getTypeStoreSize(value->getType());
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000216
Sean Callanan08052af2013-04-17 07:50:58 +0000217 lldb_private::DataBufferHeap buf(value_byte_size, 0);
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000218
Sean Callanan08052af2013-04-17 07:50:58 +0000219 lldb_private::Error get_data_error;
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000220
Sean Callanan08052af2013-04-17 07:50:58 +0000221 if (!cast_scalar.GetAsMemoryData(buf.GetBytes(), buf.GetByteSize(), m_byte_order, get_data_error))
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000222 return false;
223
Sean Callanan08052af2013-04-17 07:50:58 +0000224 lldb_private::Error write_error;
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000225
Sean Callanan08052af2013-04-17 07:50:58 +0000226 m_memory_map.WriteMemory(process_address, buf.GetBytes(), buf.GetByteSize(), write_error);
Sean Callananc8675502013-02-15 23:07:52 +0000227
Sean Callanan08052af2013-04-17 07:50:58 +0000228 return write_error.Success();
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000229 }
230
Sean Callanan94a9a392012-02-08 01:27:49 +0000231 bool ResolveConstantValue (APInt &value, const Constant *constant)
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000232 {
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000233 if (const ConstantInt *constant_int = dyn_cast<ConstantInt>(constant))
234 {
Sean Callanan94a9a392012-02-08 01:27:49 +0000235 value = constant_int->getValue();
236 return true;
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000237 }
Sean Callanan80c48c12011-10-21 05:18:02 +0000238 else if (const ConstantFP *constant_fp = dyn_cast<ConstantFP>(constant))
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000239 {
Sean Callanan94a9a392012-02-08 01:27:49 +0000240 value = constant_fp->getValueAPF().bitcastToAPInt();
241 return true;
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000242 }
Sean Callanan80c48c12011-10-21 05:18:02 +0000243 else if (const ConstantExpr *constant_expr = dyn_cast<ConstantExpr>(constant))
244 {
245 switch (constant_expr->getOpcode())
246 {
Sean Callanan94a9a392012-02-08 01:27:49 +0000247 default:
248 return false;
249 case Instruction::IntToPtr:
Sean Callanan2abffe02012-12-01 00:09:34 +0000250 case Instruction::PtrToInt:
Sean Callanan94a9a392012-02-08 01:27:49 +0000251 case Instruction::BitCast:
252 return ResolveConstantValue(value, constant_expr->getOperand(0));
253 case Instruction::GetElementPtr:
254 {
255 ConstantExpr::const_op_iterator op_cursor = constant_expr->op_begin();
256 ConstantExpr::const_op_iterator op_end = constant_expr->op_end();
257
258 Constant *base = dyn_cast<Constant>(*op_cursor);
259
260 if (!base)
261 return false;
262
263 if (!ResolveConstantValue(value, base))
264 return false;
265
266 op_cursor++;
267
268 if (op_cursor == op_end)
269 return true; // no offset to apply!
270
271 SmallVector <Value *, 8> indices (op_cursor, op_end);
272
273 uint64_t offset = m_target_data.getIndexedOffset(base->getType(), indices);
274
275 const bool is_signed = true;
276 value += APInt(value.getBitWidth(), offset, is_signed);
277
278 return true;
279 }
Sean Callanan80c48c12011-10-21 05:18:02 +0000280 }
281 }
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000282
283 return false;
284 }
285
Sean Callanan08052af2013-04-17 07:50:58 +0000286 bool ResolveConstant (lldb::addr_t process_address, const Constant *constant)
Sean Callanan94a9a392012-02-08 01:27:49 +0000287 {
288 APInt resolved_value;
289
290 if (!ResolveConstantValue(resolved_value, constant))
291 return false;
292
293 const uint64_t *raw_data = resolved_value.getRawData();
294
295 size_t constant_size = m_target_data.getTypeStoreSize(constant->getType());
Sean Callanan94a9a392012-02-08 01:27:49 +0000296
Sean Callanan08052af2013-04-17 07:50:58 +0000297 lldb_private::Error write_error;
298
299 m_memory_map.WriteMemory(process_address, (uint8_t*)raw_data, constant_size, write_error);
300
301 return write_error.Success();
302 }
303
304 lldb::addr_t MallocPointer ()
305 {
306 lldb_private::Error alloc_error;
307
308 lldb::addr_t ret = m_memory_map.Malloc(m_target_data.getPointerSize(), m_target_data.getPointerPrefAlignment(), lldb::ePermissionsReadable | lldb::ePermissionsWritable, lldb_private::IRMemoryMap::eAllocationPolicyMirror, alloc_error);
309
310 if (alloc_error.Success())
311 return ret;
312 else
313 return LLDB_INVALID_ADDRESS;
314 }
315
316 lldb::addr_t Malloc (llvm::Type *type, size_t override_byte_size = 0)
317 {
318 lldb_private::Error alloc_error;
319
320 if (!override_byte_size)
321 override_byte_size = m_target_data.getTypeStoreSize(type);
322
323 lldb::addr_t ret = m_memory_map.Malloc(override_byte_size, m_target_data.getPrefTypeAlignment(type), lldb::ePermissionsReadable | lldb::ePermissionsWritable, lldb_private::IRMemoryMap::eAllocationPolicyMirror, alloc_error);
324
325 if (alloc_error.Success())
326 return ret;
327 else
328 return LLDB_INVALID_ADDRESS;
329 }
330
331 lldb::addr_t PlaceLLDBValue (const llvm::Value *value, lldb_private::Value lldb_value)
332 {
333 lldb_private::Error alloc_error;
334 lldb_private::RegisterInfo *reg_info = lldb_value.GetRegisterInfo();
335
336 lldb::addr_t ret;
337
338 size_t value_size = m_target_data.getTypeStoreSize(value->getType());
339
340 if (reg_info && (reg_info->encoding == lldb::eEncodingVector))
341 value_size = reg_info->byte_size;
342
343 if (!reg_info && (lldb_value.GetValueType() == lldb_private::Value::eValueTypeLoadAddress))
344 return lldb_value.GetScalar().ULongLong();
345
346 ret = Malloc(value->getType(), value_size);
347
348 if (ret == LLDB_INVALID_ADDRESS)
349 return LLDB_INVALID_ADDRESS;
350
351 lldb_private::DataBufferHeap buf(value_size, 0);
352
353 m_decl_map.ReadTarget(m_memory_map, buf.GetBytes(), lldb_value, value_size);
354
355 lldb_private::Error write_error;
356
357 m_memory_map.WriteMemory(ret, buf.GetBytes(), buf.GetByteSize(), write_error);
358
359 if (!write_error.Success())
360 {
361 lldb_private::Error free_error;
362 m_memory_map.Free(ret, free_error);
363 return LLDB_INVALID_ADDRESS;
364 }
365
366 m_placed_values.push_back(PlacedValue(lldb_value, ret, value_size));
367
368 return ret;
369 }
370
371 void RestoreLLDBValues ()
372 {
373 for (PlacedValue &placed_value : m_placed_values)
374 {
375 lldb_private::DataBufferHeap buf(placed_value.size, 0);
376
377 lldb_private::Error read_error;
378
379 m_memory_map.ReadMemory(buf.GetBytes(), placed_value.process_address, buf.GetByteSize(), read_error);
380
381 if (read_error.Success())
382 m_decl_map.WriteTarget(m_memory_map, placed_value.lldb_value, buf.GetBytes(), buf.GetByteSize());
383 }
384 }
385
386 std::string PrintData (lldb::addr_t addr, llvm::Type *type)
387 {
388 size_t length = m_target_data.getTypeStoreSize(type);
389
390 lldb_private::DataBufferHeap buf(length, 0);
391
392 lldb_private::Error read_error;
393
394 m_memory_map.ReadMemory(buf.GetBytes(), addr, length, read_error);
395
396 if (!read_error.Success())
397 return std::string("<couldn't read data>");
398
399 lldb_private::StreamString ss;
400
401 for (size_t i = 0; i < length; i++)
402 {
403 if ((!(i & 0xf)) && i)
404 ss.Printf("%02hhx - ", buf.GetBytes()[i]);
405 else
406 ss.Printf("%02hhx ", buf.GetBytes()[i]);
407 }
408
409 return ss.GetString();
410 }
411
412 lldb::addr_t ResolveValue (const Value *value, Module &module)
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000413 {
414 ValueMap::iterator i = m_values.find(value);
415
416 if (i != m_values.end())
417 return i->second;
418
419 const GlobalValue *global_value = dyn_cast<GlobalValue>(value);
420
Sean Callanand2cb6262011-10-26 21:20:00 +0000421 // If the variable is indirected through the argument
422 // array then we need to build an extra level of indirection
423 // for it. This is the default; only magic arguments like
424 // "this", "self", and "_cmd" are direct.
Sean Callanan496970f2012-12-11 22:39:36 +0000425 bool variable_is_this = false;
Sean Callanand2cb6262011-10-26 21:20:00 +0000426
Sean Callanan9be9d172013-03-19 01:45:02 +0000427 // If the variable is a function pointer, we do not need to
428 // build an extra layer of indirection for it because it is
429 // accessed directly.
430 bool variable_is_function_address = false;
431
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000432 // Attempt to resolve the value using the program's data.
433 // If it is, the values to be created are:
434 //
435 // data_region - a region of memory in which the variable's data resides.
436 // ref_region - a region of memory in which its address (i.e., &var) resides.
437 // In the JIT case, this region would be a member of the struct passed in.
438 // pointer_region - a region of memory in which the address of the pointer
439 // resides. This is an IR-level variable.
440 do
441 {
Greg Clayton5160ce52013-03-27 23:08:40 +0000442 lldb_private::Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanand2cb6262011-10-26 21:20:00 +0000443
444 lldb_private::Value resolved_value;
Greg Clayton23f59502012-07-17 03:23:13 +0000445 lldb_private::ClangExpressionVariable::FlagType flags = 0;
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000446
Sean Callanand2cb6262011-10-26 21:20:00 +0000447 if (global_value)
448 {
449 clang::NamedDecl *decl = IRForTarget::DeclForGlobal(global_value, &module);
450
451 if (!decl)
452 break;
453
454 if (isa<clang::FunctionDecl>(decl))
Sean Callanan9be9d172013-03-19 01:45:02 +0000455 variable_is_function_address = true;
Sean Callanand2cb6262011-10-26 21:20:00 +0000456
Sean Callananf673e762012-02-15 01:40:39 +0000457 resolved_value = m_decl_map.LookupDecl(decl, flags);
Sean Callanand2cb6262011-10-26 21:20:00 +0000458 }
459 else
460 {
461 // Special-case "this", "self", and "_cmd"
462
Sean Callanan7f27d602011-11-19 02:54:21 +0000463 std::string name_str = value->getName().str();
Sean Callanand2cb6262011-10-26 21:20:00 +0000464
465 if (name_str == "this" ||
466 name_str == "self" ||
467 name_str == "_cmd")
Sean Callananc8675502013-02-15 23:07:52 +0000468 {
Sean Callanand2cb6262011-10-26 21:20:00 +0000469 resolved_value = m_decl_map.GetSpecialValue(lldb_private::ConstString(name_str.c_str()));
Sean Callananc8675502013-02-15 23:07:52 +0000470 variable_is_this = true;
471 }
Sean Callanand2cb6262011-10-26 21:20:00 +0000472 }
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000473
474 if (resolved_value.GetScalar().GetType() != lldb_private::Scalar::e_void)
475 {
476 if (resolved_value.GetContextType() == lldb_private::Value::eContextTypeRegisterInfo)
477 {
Sean Callanan496970f2012-12-11 22:39:36 +0000478 if (variable_is_this)
Sean Callanan08052af2013-04-17 07:50:58 +0000479 {
480 lldb_private::Error alloc_error;
481 lldb::addr_t ref_addr = Malloc(value->getType());
Sean Callanan496970f2012-12-11 22:39:36 +0000482
Sean Callanan08052af2013-04-17 07:50:58 +0000483 if (ref_addr == LLDB_INVALID_ADDRESS)
484 return LLDB_INVALID_ADDRESS;
Sean Callanan496970f2012-12-11 22:39:36 +0000485
Sean Callanan08052af2013-04-17 07:50:58 +0000486 lldb_private::Error write_error;
487 m_memory_map.WritePointerToMemory(ref_addr, resolved_value.GetScalar().ULongLong(), write_error);
Sean Callanan496970f2012-12-11 22:39:36 +0000488
Sean Callanan08052af2013-04-17 07:50:58 +0000489 if (!write_error.Success())
490 return LLDB_INVALID_ADDRESS;
Sean Callanan496970f2012-12-11 22:39:36 +0000491
492 if (log)
493 {
494 log->Printf("Made an allocation for \"this\" register variable %s", PrintValue(value).c_str());
Sean Callanan08052af2013-04-17 07:50:58 +0000495 log->Printf(" Data region : %llx", (unsigned long long)resolved_value.GetScalar().ULongLong());
496 log->Printf(" Ref region : %llx", (unsigned long long)ref_addr);
Sean Callanan496970f2012-12-11 22:39:36 +0000497 }
498
Sean Callanan08052af2013-04-17 07:50:58 +0000499 m_values[value] = ref_addr;
500 return ref_addr;
Sean Callanan496970f2012-12-11 22:39:36 +0000501 }
502 else if (flags & lldb_private::ClangExpressionVariable::EVBareRegister)
Sean Callanan08052af2013-04-17 07:50:58 +0000503 {
504 lldb::addr_t data_address = PlaceLLDBValue(value, resolved_value);
Sean Callanand2cb6262011-10-26 21:20:00 +0000505
Sean Callanan08052af2013-04-17 07:50:58 +0000506 if (!data_address)
507 return LLDB_INVALID_ADDRESS;
Sean Callanan496970f2012-12-11 22:39:36 +0000508
Sean Callanan08052af2013-04-17 07:50:58 +0000509 lldb::addr_t ref_address = MallocPointer();
Sean Callanan496970f2012-12-11 22:39:36 +0000510
Sean Callanan08052af2013-04-17 07:50:58 +0000511 if (ref_address == LLDB_INVALID_ADDRESS)
512 {
513 lldb_private::Error free_error;
514 m_memory_map.Free(data_address, free_error);
515 return LLDB_INVALID_ADDRESS;
516 }
Sean Callanan496970f2012-12-11 22:39:36 +0000517
Sean Callanan08052af2013-04-17 07:50:58 +0000518 lldb_private::Error write_error;
519
520 m_memory_map.WritePointerToMemory(ref_address, data_address, write_error);
Sean Callanan496970f2012-12-11 22:39:36 +0000521
Sean Callanan08052af2013-04-17 07:50:58 +0000522 if (!write_error.Success())
523 {
524 lldb_private::Error free_error;
525 m_memory_map.Free(data_address, free_error);
526 m_memory_map.Free(ref_address, free_error);
527 return LLDB_INVALID_ADDRESS;
528 }
Sean Callanan496970f2012-12-11 22:39:36 +0000529
530 if (log)
531 {
532 log->Printf("Made an allocation for bare register variable %s", PrintValue(value).c_str());
Sean Callanan08052af2013-04-17 07:50:58 +0000533 log->Printf(" Data contents : %s", PrintData(data_address, value->getType()).c_str());
534 log->Printf(" Data region : 0x%llx", (unsigned long long)data_address);
535 log->Printf(" Ref region : 0x%llx", (unsigned long long)ref_address);
Sean Callanan496970f2012-12-11 22:39:36 +0000536 }
537
Sean Callanan08052af2013-04-17 07:50:58 +0000538 m_values[value] = ref_address;
539 return ref_address;
Sean Callanan496970f2012-12-11 22:39:36 +0000540 }
541 else
Sean Callanan08052af2013-04-17 07:50:58 +0000542 {
543 lldb::addr_t data_address = PlaceLLDBValue(value, resolved_value);
Sean Callanan496970f2012-12-11 22:39:36 +0000544
Sean Callanan08052af2013-04-17 07:50:58 +0000545 if (data_address == LLDB_INVALID_ADDRESS)
546 return LLDB_INVALID_ADDRESS;
Sean Callanan496970f2012-12-11 22:39:36 +0000547
Sean Callanan08052af2013-04-17 07:50:58 +0000548 lldb::addr_t ref_address = MallocPointer();
Sean Callanan496970f2012-12-11 22:39:36 +0000549
Sean Callanan08052af2013-04-17 07:50:58 +0000550 if (ref_address == LLDB_INVALID_ADDRESS)
551 {
552 lldb_private::Error free_error;
553 m_memory_map.Free(data_address, free_error);
554 return LLDB_INVALID_ADDRESS;
555 }
Sean Callanan496970f2012-12-11 22:39:36 +0000556
Sean Callanan08052af2013-04-17 07:50:58 +0000557 lldb::addr_t pointer_address = MallocPointer();
Sean Callanan496970f2012-12-11 22:39:36 +0000558
Sean Callanan08052af2013-04-17 07:50:58 +0000559 if (pointer_address == LLDB_INVALID_ADDRESS)
560 {
561 lldb_private::Error free_error;
562 m_memory_map.Free(data_address, free_error);
563 m_memory_map.Free(ref_address, free_error);
564 return LLDB_INVALID_ADDRESS;
565 }
566
567 lldb_private::Error write_error;
Sean Callanan496970f2012-12-11 22:39:36 +0000568
Sean Callanan08052af2013-04-17 07:50:58 +0000569 m_memory_map.WritePointerToMemory(ref_address, data_address, write_error);
Sean Callanan496970f2012-12-11 22:39:36 +0000570
Sean Callanan08052af2013-04-17 07:50:58 +0000571 if (!write_error.Success())
572 {
573 lldb_private::Error free_error;
574 m_memory_map.Free(data_address, free_error);
575 m_memory_map.Free(ref_address, free_error);
576 m_memory_map.Free(pointer_address, free_error);
577 return LLDB_INVALID_ADDRESS;
578 }
579
580 write_error.Clear();
581
582 m_memory_map.WritePointerToMemory(pointer_address, ref_address, write_error);
583
584 if (!write_error.Success())
585 {
586 lldb_private::Error free_error;
587 m_memory_map.Free(data_address, free_error);
588 m_memory_map.Free(ref_address, free_error);
589 m_memory_map.Free(pointer_address, free_error);
590 return LLDB_INVALID_ADDRESS;
591 }
Sean Callanan496970f2012-12-11 22:39:36 +0000592
593 if (log)
594 {
595 log->Printf("Made an allocation for ordinary register variable %s", PrintValue(value).c_str());
Sean Callanan08052af2013-04-17 07:50:58 +0000596 log->Printf(" Data contents : %s", PrintData(data_address, value->getType()).c_str());
597 log->Printf(" Data region : 0x%llx", (unsigned long long)data_address);
598 log->Printf(" Ref region : 0x%llx", (unsigned long long)ref_address);
599 log->Printf(" Pointer region : 0x%llx", (unsigned long long)pointer_address);
Sean Callanan496970f2012-12-11 22:39:36 +0000600 }
601
Sean Callanan08052af2013-04-17 07:50:58 +0000602 m_values[value] = pointer_address;
603 return pointer_address;
Sean Callanand2cb6262011-10-26 21:20:00 +0000604 }
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000605 }
606 else
607 {
Sean Callanan9be9d172013-03-19 01:45:02 +0000608 bool no_extra_redirect = (variable_is_this || variable_is_function_address);
609
Sean Callanan08052af2013-04-17 07:50:58 +0000610 lldb::addr_t data_address = PlaceLLDBValue(value, resolved_value);
Sean Callanand2cb6262011-10-26 21:20:00 +0000611
Sean Callanan08052af2013-04-17 07:50:58 +0000612 if (data_address == LLDB_INVALID_ADDRESS)
613 return LLDB_INVALID_ADDRESS;
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000614
Sean Callanan08052af2013-04-17 07:50:58 +0000615 lldb::addr_t ref_address = MallocPointer();
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000616
Sean Callanan08052af2013-04-17 07:50:58 +0000617 if (ref_address == LLDB_INVALID_ADDRESS)
618 {
619 lldb_private::Error free_error;
620 m_memory_map.Free(data_address, free_error);
621 return LLDB_INVALID_ADDRESS;
622 }
623
624 lldb::addr_t pointer_address = LLDB_INVALID_ADDRESS;
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000625
Sean Callanan9be9d172013-03-19 01:45:02 +0000626 if (!no_extra_redirect)
Sean Callanand2cb6262011-10-26 21:20:00 +0000627 {
Sean Callanan08052af2013-04-17 07:50:58 +0000628 pointer_address = MallocPointer();
Sean Callanand2cb6262011-10-26 21:20:00 +0000629
Sean Callanan08052af2013-04-17 07:50:58 +0000630 if (pointer_address == LLDB_INVALID_ADDRESS)
631 {
632 lldb_private::Error free_error;
633 m_memory_map.Free(data_address, free_error);
634 m_memory_map.Free(ref_address, free_error);
635 return LLDB_INVALID_ADDRESS;
636 }
637 }
638
639 lldb_private::Error write_error;
640
641 m_memory_map.WritePointerToMemory(ref_address, data_address, write_error);
642
643 if (!write_error.Success())
644 {
645 lldb_private::Error free_error;
646 m_memory_map.Free(data_address, free_error);
647 m_memory_map.Free(ref_address, free_error);
648 if (pointer_address != LLDB_INVALID_ADDRESS)
649 m_memory_map.Free(pointer_address, free_error);
650 return LLDB_INVALID_ADDRESS;
651 }
652
653 if (!no_extra_redirect)
654 {
655 write_error.Clear();
656
657 m_memory_map.WritePointerToMemory(pointer_address, ref_address, write_error);
658
659 if (!write_error.Success())
660 {
661 lldb_private::Error free_error;
662 m_memory_map.Free(data_address, free_error);
663 m_memory_map.Free(ref_address, free_error);
664 if (pointer_address != LLDB_INVALID_ADDRESS)
665 m_memory_map.Free(pointer_address, free_error);
666 return LLDB_INVALID_ADDRESS;
667 }
Sean Callanand2cb6262011-10-26 21:20:00 +0000668 }
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000669
670 if (log)
671 {
Sean Callanand2cb6262011-10-26 21:20:00 +0000672 log->Printf("Made an allocation for %s", PrintValue(value).c_str());
Sean Callanan08052af2013-04-17 07:50:58 +0000673 log->Printf(" Data contents : %s", PrintData(data_address, value->getType()).c_str());
674 log->Printf(" Data region : %llx", (unsigned long long)data_address);
675 log->Printf(" Ref region : %llx", (unsigned long long)ref_address);
Sean Callanan496970f2012-12-11 22:39:36 +0000676 if (!variable_is_this)
Sean Callanan08052af2013-04-17 07:50:58 +0000677 log->Printf(" Pointer region : %llx", (unsigned long long)pointer_address);
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000678 }
679
Sean Callanan9be9d172013-03-19 01:45:02 +0000680 if (no_extra_redirect)
Sean Callanan08052af2013-04-17 07:50:58 +0000681 {
682 m_values[value] = ref_address;
683 return ref_address;
684 }
Sean Callanan496970f2012-12-11 22:39:36 +0000685 else
Sean Callanan08052af2013-04-17 07:50:58 +0000686 {
687 m_values[value] = pointer_address;
688 return pointer_address;
689 }
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000690 }
691 }
692 }
693 while(0);
694
695 // Fall back and allocate space [allocation type Alloca]
696
Sean Callanan08052af2013-04-17 07:50:58 +0000697 lldb::addr_t data_address = Malloc(value->getType());
698
699 if (const Constant *constant = dyn_cast<Constant>(value))
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000700 {
Sean Callanan08052af2013-04-17 07:50:58 +0000701 if (!ResolveConstant (data_address, constant))
702 {
703 lldb_private::Error free_error;
704 m_memory_map.Free(data_address, free_error);
705 return LLDB_INVALID_ADDRESS;
706 }
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000707 }
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000708
Sean Callanan08052af2013-04-17 07:50:58 +0000709 m_values[value] = data_address;
710 return data_address;
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000711 }
712
713 bool ConstructResult (lldb::ClangExpressionVariableSP &result,
714 const GlobalValue *result_value,
715 const lldb_private::ConstString &result_name,
716 lldb_private::TypeFromParser result_type,
717 Module &module)
718 {
719 // The result_value resolves to P, a pointer to a region R containing the result data.
720 // If the result variable is a reference, the region R contains a pointer to the result R_final in the original process.
721
722 if (!result_value)
723 return true; // There was no slot for a result – the expression doesn't return one.
724
725 ValueMap::iterator i = m_values.find(result_value);
726
727 if (i == m_values.end())
728 return false; // There was a slot for the result, but we didn't write into it.
729
Sean Callanan08052af2013-04-17 07:50:58 +0000730 lldb::addr_t P = i->second;
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000731
732 Type *pointer_ty = result_value->getType();
733 PointerType *pointer_ptr_ty = dyn_cast<PointerType>(pointer_ty);
734 if (!pointer_ptr_ty)
735 return false;
736 Type *R_ty = pointer_ptr_ty->getElementType();
737
Sean Callanan08052af2013-04-17 07:50:58 +0000738 lldb_private::Error read_error;
739 lldb::addr_t R;
740 m_memory_map.ReadPointerFromMemory(&R, P, read_error);
741 if (!read_error.Success())
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000742 return false;
743
744 lldb_private::Value base;
745
Sean Callanan0886e562011-09-22 00:41:11 +0000746 bool transient = false;
Sean Callanan80c48c12011-10-21 05:18:02 +0000747 bool maybe_make_load = false;
Sean Callanan0886e562011-09-22 00:41:11 +0000748
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000749 if (m_decl_map.ResultIsReference(result_name))
750 {
751 PointerType *R_ptr_ty = dyn_cast<PointerType>(R_ty);
752 if (!R_ptr_ty)
753 return false;
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000754
Sean Callanan08052af2013-04-17 07:50:58 +0000755 read_error.Clear();
756 lldb::addr_t R_pointer;
757 m_memory_map.ReadPointerFromMemory(&R_pointer, R, read_error);
758 if (!read_error.Success())
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000759 return false;
760
Sean Callanan08052af2013-04-17 07:50:58 +0000761 // We got a bare pointer. We are going to treat it as a load address
762 // or a file address, letting decl_map make the choice based on whether
763 // or not a process exists.
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000764
Sean Callanan08052af2013-04-17 07:50:58 +0000765 bool was_placed = false;
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000766
Sean Callanan08052af2013-04-17 07:50:58 +0000767 for (PlacedValue &value : m_placed_values)
Sean Callanan80c48c12011-10-21 05:18:02 +0000768 {
Sean Callanan08052af2013-04-17 07:50:58 +0000769 if (value.process_address == R_pointer)
770 {
771 base = value.lldb_value;
772 was_placed = true;
773 break;
774 }
775 }
776
777 if (!was_placed)
778 {
Sean Callanan80c48c12011-10-21 05:18:02 +0000779 base.SetContext(lldb_private::Value::eContextTypeInvalid, NULL);
780 base.SetValueType(lldb_private::Value::eValueTypeFileAddress);
781 base.GetScalar() = (unsigned long long)R_pointer;
782 maybe_make_load = true;
783 }
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000784 }
785 else
786 {
787 base.SetContext(lldb_private::Value::eContextTypeInvalid, NULL);
Sean Callanan08052af2013-04-17 07:50:58 +0000788 base.SetValueType(lldb_private::Value::eValueTypeLoadAddress);
789 base.GetScalar() = (unsigned long long)R;
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000790 }
791
Sean Callanan08052af2013-04-17 07:50:58 +0000792 return m_decl_map.CompleteResultVariable (result, m_memory_map, base, result_name, result_type, transient, maybe_make_load);
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000793 }
794};
795
796bool
797IRInterpreter::maybeRunOnFunction (lldb::ClangExpressionVariableSP &result,
798 const lldb_private::ConstString &result_name,
799 lldb_private::TypeFromParser result_type,
800 Function &llvm_function,
Sean Callanan175a0d02012-01-24 22:06:48 +0000801 Module &llvm_module,
802 lldb_private::Error &err)
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000803{
Sean Callanan175a0d02012-01-24 22:06:48 +0000804 if (supportsFunction (llvm_function, err))
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000805 return runOnFunction(result,
806 result_name,
807 result_type,
808 llvm_function,
Sean Callanan175a0d02012-01-24 22:06:48 +0000809 llvm_module,
810 err);
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000811 else
812 return false;
813}
814
Sean Callanan175a0d02012-01-24 22:06:48 +0000815static const char *unsupported_opcode_error = "Interpreter doesn't handle one of the expression's opcodes";
816static const char *interpreter_initialization_error = "Interpreter couldn't be initialized";
817static const char *interpreter_internal_error = "Interpreter encountered an internal error";
818static const char *bad_value_error = "Interpreter couldn't resolve a value during execution";
819static const char *memory_allocation_error = "Interpreter couldn't allocate memory";
820static const char *memory_write_error = "Interpreter couldn't write to memory";
821static const char *memory_read_error = "Interpreter couldn't read from memory";
822static const char *infinite_loop_error = "Interpreter ran for too many cycles";
Sean Callanan5b26f272012-02-04 08:49:35 +0000823static const char *bad_result_error = "Result of expression is in bad memory";
Sean Callanan175a0d02012-01-24 22:06:48 +0000824
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000825bool
Sean Callanan175a0d02012-01-24 22:06:48 +0000826IRInterpreter::supportsFunction (Function &llvm_function,
827 lldb_private::Error &err)
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000828{
Greg Clayton5160ce52013-03-27 23:08:40 +0000829 lldb_private::Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000830
831 for (Function::iterator bbi = llvm_function.begin(), bbe = llvm_function.end();
832 bbi != bbe;
833 ++bbi)
834 {
835 for (BasicBlock::iterator ii = bbi->begin(), ie = bbi->end();
836 ii != ie;
837 ++ii)
838 {
839 switch (ii->getOpcode())
840 {
841 default:
842 {
843 if (log)
844 log->Printf("Unsupported instruction: %s", PrintValue(ii).c_str());
Sean Callanan175a0d02012-01-24 22:06:48 +0000845 err.SetErrorToGenericError();
846 err.SetErrorString(unsupported_opcode_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000847 return false;
848 }
849 case Instruction::Add:
850 case Instruction::Alloca:
851 case Instruction::BitCast:
852 case Instruction::Br:
853 case Instruction::GetElementPtr:
854 break;
855 case Instruction::ICmp:
856 {
857 ICmpInst *icmp_inst = dyn_cast<ICmpInst>(ii);
858
859 if (!icmp_inst)
Sean Callanan175a0d02012-01-24 22:06:48 +0000860 {
861 err.SetErrorToGenericError();
862 err.SetErrorString(interpreter_internal_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000863 return false;
Sean Callanan175a0d02012-01-24 22:06:48 +0000864 }
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000865
866 switch (icmp_inst->getPredicate())
867 {
868 default:
869 {
870 if (log)
871 log->Printf("Unsupported ICmp predicate: %s", PrintValue(ii).c_str());
Sean Callanan175a0d02012-01-24 22:06:48 +0000872
873 err.SetErrorToGenericError();
874 err.SetErrorString(unsupported_opcode_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000875 return false;
876 }
877 case CmpInst::ICMP_EQ:
878 case CmpInst::ICMP_NE:
879 case CmpInst::ICMP_UGT:
880 case CmpInst::ICMP_UGE:
881 case CmpInst::ICMP_ULT:
882 case CmpInst::ICMP_ULE:
883 case CmpInst::ICMP_SGT:
884 case CmpInst::ICMP_SGE:
885 case CmpInst::ICMP_SLT:
886 case CmpInst::ICMP_SLE:
887 break;
888 }
889 }
890 break;
Sean Callanan087f4372013-01-09 22:44:41 +0000891 case Instruction::And:
892 case Instruction::AShr:
Sean Callanan80c48c12011-10-21 05:18:02 +0000893 case Instruction::IntToPtr:
Sean Callanan2abffe02012-12-01 00:09:34 +0000894 case Instruction::PtrToInt:
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000895 case Instruction::Load:
Sean Callanan087f4372013-01-09 22:44:41 +0000896 case Instruction::LShr:
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000897 case Instruction::Mul:
Sean Callanan087f4372013-01-09 22:44:41 +0000898 case Instruction::Or:
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000899 case Instruction::Ret:
900 case Instruction::SDiv:
Sean Callanan087f4372013-01-09 22:44:41 +0000901 case Instruction::Shl:
Sean Callananf466a6e2012-12-21 22:27:55 +0000902 case Instruction::SRem:
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000903 case Instruction::Store:
904 case Instruction::Sub:
905 case Instruction::UDiv:
Sean Callananf466a6e2012-12-21 22:27:55 +0000906 case Instruction::URem:
Sean Callanan087f4372013-01-09 22:44:41 +0000907 case Instruction::Xor:
Sean Callanan1ef77432012-04-23 17:25:38 +0000908 case Instruction::ZExt:
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000909 break;
910 }
911 }
912 }
913
914 return true;
915}
916
917bool
918IRInterpreter::runOnFunction (lldb::ClangExpressionVariableSP &result,
919 const lldb_private::ConstString &result_name,
920 lldb_private::TypeFromParser result_type,
921 Function &llvm_function,
Sean Callanan175a0d02012-01-24 22:06:48 +0000922 Module &llvm_module,
923 lldb_private::Error &err)
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000924{
Greg Clayton5160ce52013-03-27 23:08:40 +0000925 lldb_private::Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000926
927 lldb_private::ClangExpressionDeclMap::TargetInfo target_info = m_decl_map.GetTargetInfo();
928
929 if (!target_info.IsValid())
Sean Callanan175a0d02012-01-24 22:06:48 +0000930 {
931 err.SetErrorToGenericError();
932 err.SetErrorString(interpreter_initialization_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000933 return false;
Sean Callanan175a0d02012-01-24 22:06:48 +0000934 }
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000935
936 lldb::addr_t alloc_min;
937 lldb::addr_t alloc_max;
938
939 switch (target_info.address_byte_size)
940 {
941 default:
Sean Callanan175a0d02012-01-24 22:06:48 +0000942 err.SetErrorToGenericError();
943 err.SetErrorString(interpreter_initialization_error);
944 return false;
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000945 case 4:
946 alloc_min = 0x00001000llu;
947 alloc_max = 0x0000ffffllu;
948 break;
949 case 8:
950 alloc_min = 0x0000000000001000llu;
951 alloc_max = 0x000000000000ffffllu;
952 break;
953 }
954
Micah Villmow8468dbe2012-10-08 16:28:57 +0000955 DataLayout target_data(&llvm_module);
Sean Callanan95769bf2012-10-11 22:00:52 +0000956 if (target_data.getPointerSize(0) != target_info.address_byte_size)
Sean Callanan175a0d02012-01-24 22:06:48 +0000957 {
958 err.SetErrorToGenericError();
959 err.SetErrorString(interpreter_initialization_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000960 return false;
Sean Callanan175a0d02012-01-24 22:06:48 +0000961 }
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000962 if (target_data.isLittleEndian() != (target_info.byte_order == lldb::eByteOrderLittle))
Sean Callanan175a0d02012-01-24 22:06:48 +0000963 {
964 err.SetErrorToGenericError();
965 err.SetErrorString(interpreter_initialization_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000966 return false;
Sean Callanan175a0d02012-01-24 22:06:48 +0000967 }
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000968
Sean Callanan08052af2013-04-17 07:50:58 +0000969 InterpreterStackFrame frame(target_data, m_decl_map, m_memory_map);
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000970
971 uint32_t num_insts = 0;
972
973 frame.Jump(llvm_function.begin());
974
975 while (frame.m_ii != frame.m_ie && (++num_insts < 4096))
976 {
977 const Instruction *inst = frame.m_ii;
978
979 if (log)
980 log->Printf("Interpreting %s", PrintValue(inst).c_str());
981
982 switch (inst->getOpcode())
983 {
984 default:
985 break;
986 case Instruction::Add:
987 case Instruction::Sub:
988 case Instruction::Mul:
989 case Instruction::SDiv:
990 case Instruction::UDiv:
Sean Callananf466a6e2012-12-21 22:27:55 +0000991 case Instruction::SRem:
992 case Instruction::URem:
Sean Callanan087f4372013-01-09 22:44:41 +0000993 case Instruction::Shl:
994 case Instruction::LShr:
995 case Instruction::AShr:
996 case Instruction::And:
997 case Instruction::Or:
998 case Instruction::Xor:
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000999 {
1000 const BinaryOperator *bin_op = dyn_cast<BinaryOperator>(inst);
1001
1002 if (!bin_op)
1003 {
1004 if (log)
1005 log->Printf("getOpcode() returns %s, but instruction is not a BinaryOperator", inst->getOpcodeName());
Sean Callanan175a0d02012-01-24 22:06:48 +00001006 err.SetErrorToGenericError();
1007 err.SetErrorString(interpreter_internal_error);
1008 return false;
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001009 }
1010
1011 Value *lhs = inst->getOperand(0);
1012 Value *rhs = inst->getOperand(1);
1013
1014 lldb_private::Scalar L;
1015 lldb_private::Scalar R;
1016
1017 if (!frame.EvaluateValue(L, lhs, llvm_module))
1018 {
1019 if (log)
1020 log->Printf("Couldn't evaluate %s", PrintValue(lhs).c_str());
Sean Callanan175a0d02012-01-24 22:06:48 +00001021 err.SetErrorToGenericError();
1022 err.SetErrorString(bad_value_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001023 return false;
1024 }
1025
1026 if (!frame.EvaluateValue(R, rhs, llvm_module))
1027 {
1028 if (log)
1029 log->Printf("Couldn't evaluate %s", PrintValue(rhs).c_str());
Sean Callanan175a0d02012-01-24 22:06:48 +00001030 err.SetErrorToGenericError();
1031 err.SetErrorString(bad_value_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001032 return false;
1033 }
1034
1035 lldb_private::Scalar result;
1036
1037 switch (inst->getOpcode())
1038 {
1039 default:
1040 break;
1041 case Instruction::Add:
1042 result = L + R;
1043 break;
1044 case Instruction::Mul:
1045 result = L * R;
1046 break;
1047 case Instruction::Sub:
1048 result = L - R;
1049 break;
1050 case Instruction::SDiv:
1051 result = L / R;
1052 break;
1053 case Instruction::UDiv:
1054 result = L.GetRawBits64(0) / R.GetRawBits64(1);
1055 break;
Sean Callananf466a6e2012-12-21 22:27:55 +00001056 case Instruction::SRem:
1057 result = L % R;
1058 break;
1059 case Instruction::URem:
1060 result = L.GetRawBits64(0) % R.GetRawBits64(1);
1061 break;
Sean Callanan087f4372013-01-09 22:44:41 +00001062 case Instruction::Shl:
1063 result = L << R;
1064 break;
1065 case Instruction::AShr:
1066 result = L >> R;
1067 break;
1068 case Instruction::LShr:
1069 result = L;
1070 result.ShiftRightLogical(R);
1071 break;
1072 case Instruction::And:
1073 result = L & R;
1074 break;
1075 case Instruction::Or:
1076 result = L | R;
1077 break;
1078 case Instruction::Xor:
1079 result = L ^ R;
1080 break;
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001081 }
1082
1083 frame.AssignValue(inst, result, llvm_module);
1084
1085 if (log)
1086 {
1087 log->Printf("Interpreted a %s", inst->getOpcodeName());
1088 log->Printf(" L : %s", frame.SummarizeValue(lhs).c_str());
1089 log->Printf(" R : %s", frame.SummarizeValue(rhs).c_str());
1090 log->Printf(" = : %s", frame.SummarizeValue(inst).c_str());
1091 }
1092 }
1093 break;
1094 case Instruction::Alloca:
1095 {
1096 const AllocaInst *alloca_inst = dyn_cast<AllocaInst>(inst);
1097
1098 if (!alloca_inst)
1099 {
1100 if (log)
1101 log->Printf("getOpcode() returns Alloca, but instruction is not an AllocaInst");
Sean Callanan175a0d02012-01-24 22:06:48 +00001102 err.SetErrorToGenericError();
1103 err.SetErrorString(interpreter_internal_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001104 return false;
1105 }
1106
1107 if (alloca_inst->isArrayAllocation())
1108 {
1109 if (log)
1110 log->Printf("AllocaInsts are not handled if isArrayAllocation() is true");
Sean Callanan175a0d02012-01-24 22:06:48 +00001111 err.SetErrorToGenericError();
1112 err.SetErrorString(unsupported_opcode_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001113 return false;
1114 }
1115
1116 // The semantics of Alloca are:
1117 // Create a region R of virtual memory of type T, backed by a data buffer
1118 // Create a region P of virtual memory of type T*, backed by a data buffer
1119 // Write the virtual address of R into P
1120
1121 Type *T = alloca_inst->getAllocatedType();
1122 Type *Tptr = alloca_inst->getType();
1123
Sean Callanan08052af2013-04-17 07:50:58 +00001124 lldb::addr_t R = frame.Malloc(T);
1125
1126 if (R == LLDB_INVALID_ADDRESS)
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001127 {
1128 if (log)
1129 log->Printf("Couldn't allocate memory for an AllocaInst");
Sean Callanan175a0d02012-01-24 22:06:48 +00001130 err.SetErrorToGenericError();
1131 err.SetErrorString(memory_allocation_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001132 return false;
1133 }
1134
Sean Callanan08052af2013-04-17 07:50:58 +00001135 lldb::addr_t P = frame.Malloc(Tptr);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001136
Sean Callanan08052af2013-04-17 07:50:58 +00001137 if (P == LLDB_INVALID_ADDRESS)
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001138 {
1139 if (log)
1140 log->Printf("Couldn't allocate the result pointer for an AllocaInst");
Sean Callanan175a0d02012-01-24 22:06:48 +00001141 err.SetErrorToGenericError();
1142 err.SetErrorString(memory_allocation_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001143 return false;
1144 }
1145
Sean Callanan08052af2013-04-17 07:50:58 +00001146 lldb_private::Error write_error;
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001147
Sean Callanan08052af2013-04-17 07:50:58 +00001148 m_memory_map.WritePointerToMemory(P, R, write_error);
1149
1150 if (!write_error.Success())
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001151 {
1152 if (log)
Sean Callanan175a0d02012-01-24 22:06:48 +00001153 log->Printf("Couldn't write the result pointer for an AllocaInst");
1154 err.SetErrorToGenericError();
1155 err.SetErrorString(memory_write_error);
Sean Callanan08052af2013-04-17 07:50:58 +00001156 lldb_private::Error free_error;
1157 m_memory_map.Free(P, free_error);
1158 m_memory_map.Free(R, free_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001159 return false;
1160 }
1161
1162 frame.m_values[alloca_inst] = P;
1163
1164 if (log)
1165 {
1166 log->Printf("Interpreted an AllocaInst");
Sean Callanan08052af2013-04-17 07:50:58 +00001167 log->Printf(" R : 0x%llx", R);
1168 log->Printf(" P : 0x%llx", P);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001169 }
1170 }
1171 break;
1172 case Instruction::BitCast:
Sean Callanan1ef77432012-04-23 17:25:38 +00001173 case Instruction::ZExt:
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001174 {
Sean Callanan1ef77432012-04-23 17:25:38 +00001175 const CastInst *cast_inst = dyn_cast<CastInst>(inst);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001176
Sean Callanan1ef77432012-04-23 17:25:38 +00001177 if (!cast_inst)
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001178 {
1179 if (log)
Sean Callanan1ef77432012-04-23 17:25:38 +00001180 log->Printf("getOpcode() returns %s, but instruction is not a BitCastInst", cast_inst->getOpcodeName());
Sean Callanan175a0d02012-01-24 22:06:48 +00001181 err.SetErrorToGenericError();
1182 err.SetErrorString(interpreter_internal_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001183 return false;
1184 }
1185
Sean Callanan1ef77432012-04-23 17:25:38 +00001186 Value *source = cast_inst->getOperand(0);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001187
1188 lldb_private::Scalar S;
1189
1190 if (!frame.EvaluateValue(S, source, llvm_module))
1191 {
1192 if (log)
1193 log->Printf("Couldn't evaluate %s", PrintValue(source).c_str());
Sean Callanan175a0d02012-01-24 22:06:48 +00001194 err.SetErrorToGenericError();
1195 err.SetErrorString(bad_value_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001196 return false;
1197 }
1198
1199 frame.AssignValue(inst, S, llvm_module);
1200 }
1201 break;
1202 case Instruction::Br:
1203 {
1204 const BranchInst *br_inst = dyn_cast<BranchInst>(inst);
1205
1206 if (!br_inst)
1207 {
1208 if (log)
1209 log->Printf("getOpcode() returns Br, but instruction is not a BranchInst");
Sean Callanan175a0d02012-01-24 22:06:48 +00001210 err.SetErrorToGenericError();
1211 err.SetErrorString(interpreter_internal_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001212 return false;
1213 }
1214
1215 if (br_inst->isConditional())
1216 {
1217 Value *condition = br_inst->getCondition();
1218
1219 lldb_private::Scalar C;
1220
1221 if (!frame.EvaluateValue(C, condition, llvm_module))
1222 {
1223 if (log)
1224 log->Printf("Couldn't evaluate %s", PrintValue(condition).c_str());
Sean Callanan175a0d02012-01-24 22:06:48 +00001225 err.SetErrorToGenericError();
1226 err.SetErrorString(bad_value_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001227 return false;
1228 }
1229
1230 if (C.GetRawBits64(0))
1231 frame.Jump(br_inst->getSuccessor(0));
1232 else
1233 frame.Jump(br_inst->getSuccessor(1));
1234
1235 if (log)
1236 {
1237 log->Printf("Interpreted a BrInst with a condition");
1238 log->Printf(" cond : %s", frame.SummarizeValue(condition).c_str());
1239 }
1240 }
1241 else
1242 {
1243 frame.Jump(br_inst->getSuccessor(0));
1244
1245 if (log)
1246 {
1247 log->Printf("Interpreted a BrInst with no condition");
1248 }
1249 }
1250 }
1251 continue;
1252 case Instruction::GetElementPtr:
1253 {
1254 const GetElementPtrInst *gep_inst = dyn_cast<GetElementPtrInst>(inst);
1255
1256 if (!gep_inst)
1257 {
1258 if (log)
1259 log->Printf("getOpcode() returns GetElementPtr, but instruction is not a GetElementPtrInst");
Sean Callanan175a0d02012-01-24 22:06:48 +00001260 err.SetErrorToGenericError();
1261 err.SetErrorString(interpreter_internal_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001262 return false;
1263 }
1264
1265 const Value *pointer_operand = gep_inst->getPointerOperand();
1266 Type *pointer_type = pointer_operand->getType();
1267
1268 lldb_private::Scalar P;
1269
1270 if (!frame.EvaluateValue(P, pointer_operand, llvm_module))
Sean Callanan175a0d02012-01-24 22:06:48 +00001271 {
1272 if (log)
1273 log->Printf("Couldn't evaluate %s", PrintValue(pointer_operand).c_str());
1274 err.SetErrorToGenericError();
1275 err.SetErrorString(bad_value_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001276 return false;
Sean Callanan175a0d02012-01-24 22:06:48 +00001277 }
1278
Sean Callanan3f548132012-02-29 17:57:18 +00001279 typedef SmallVector <Value *, 8> IndexVector;
1280 typedef IndexVector::iterator IndexIterator;
1281
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001282 SmallVector <Value *, 8> indices (gep_inst->idx_begin(),
1283 gep_inst->idx_end());
1284
Sean Callanan3f548132012-02-29 17:57:18 +00001285 SmallVector <Value *, 8> const_indices;
1286
1287 for (IndexIterator ii = indices.begin(), ie = indices.end();
1288 ii != ie;
1289 ++ii)
1290 {
1291 ConstantInt *constant_index = dyn_cast<ConstantInt>(*ii);
1292
1293 if (!constant_index)
1294 {
1295 lldb_private::Scalar I;
1296
1297 if (!frame.EvaluateValue(I, *ii, llvm_module))
1298 {
1299 if (log)
1300 log->Printf("Couldn't evaluate %s", PrintValue(*ii).c_str());
1301 err.SetErrorToGenericError();
1302 err.SetErrorString(bad_value_error);
1303 return false;
1304 }
1305
1306 if (log)
1307 log->Printf("Evaluated constant index %s as %llu", PrintValue(*ii).c_str(), I.ULongLong(LLDB_INVALID_ADDRESS));
1308
1309 constant_index = cast<ConstantInt>(ConstantInt::get((*ii)->getType(), I.ULongLong(LLDB_INVALID_ADDRESS)));
1310 }
1311
1312 const_indices.push_back(constant_index);
1313 }
1314
1315 uint64_t offset = target_data.getIndexedOffset(pointer_type, const_indices);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001316
1317 lldb_private::Scalar Poffset = P + offset;
1318
1319 frame.AssignValue(inst, Poffset, llvm_module);
1320
1321 if (log)
1322 {
1323 log->Printf("Interpreted a GetElementPtrInst");
1324 log->Printf(" P : %s", frame.SummarizeValue(pointer_operand).c_str());
1325 log->Printf(" Poffset : %s", frame.SummarizeValue(inst).c_str());
1326 }
1327 }
1328 break;
1329 case Instruction::ICmp:
1330 {
1331 const ICmpInst *icmp_inst = dyn_cast<ICmpInst>(inst);
1332
1333 if (!icmp_inst)
1334 {
1335 if (log)
1336 log->Printf("getOpcode() returns ICmp, but instruction is not an ICmpInst");
Sean Callanan175a0d02012-01-24 22:06:48 +00001337 err.SetErrorToGenericError();
1338 err.SetErrorString(interpreter_internal_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001339 return false;
1340 }
1341
1342 CmpInst::Predicate predicate = icmp_inst->getPredicate();
1343
1344 Value *lhs = inst->getOperand(0);
1345 Value *rhs = inst->getOperand(1);
1346
1347 lldb_private::Scalar L;
1348 lldb_private::Scalar R;
1349
1350 if (!frame.EvaluateValue(L, lhs, llvm_module))
1351 {
1352 if (log)
1353 log->Printf("Couldn't evaluate %s", PrintValue(lhs).c_str());
Sean Callanan175a0d02012-01-24 22:06:48 +00001354 err.SetErrorToGenericError();
1355 err.SetErrorString(bad_value_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001356 return false;
1357 }
1358
1359 if (!frame.EvaluateValue(R, rhs, llvm_module))
1360 {
1361 if (log)
1362 log->Printf("Couldn't evaluate %s", PrintValue(rhs).c_str());
Sean Callanan175a0d02012-01-24 22:06:48 +00001363 err.SetErrorToGenericError();
1364 err.SetErrorString(bad_value_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001365 return false;
1366 }
1367
1368 lldb_private::Scalar result;
1369
1370 switch (predicate)
1371 {
1372 default:
1373 return false;
1374 case CmpInst::ICMP_EQ:
1375 result = (L == R);
1376 break;
1377 case CmpInst::ICMP_NE:
1378 result = (L != R);
1379 break;
1380 case CmpInst::ICMP_UGT:
1381 result = (L.GetRawBits64(0) > R.GetRawBits64(0));
1382 break;
1383 case CmpInst::ICMP_UGE:
1384 result = (L.GetRawBits64(0) >= R.GetRawBits64(0));
1385 break;
1386 case CmpInst::ICMP_ULT:
1387 result = (L.GetRawBits64(0) < R.GetRawBits64(0));
1388 break;
1389 case CmpInst::ICMP_ULE:
1390 result = (L.GetRawBits64(0) <= R.GetRawBits64(0));
1391 break;
1392 case CmpInst::ICMP_SGT:
1393 result = (L > R);
1394 break;
1395 case CmpInst::ICMP_SGE:
1396 result = (L >= R);
1397 break;
1398 case CmpInst::ICMP_SLT:
1399 result = (L < R);
1400 break;
1401 case CmpInst::ICMP_SLE:
1402 result = (L <= R);
1403 break;
1404 }
1405
1406 frame.AssignValue(inst, result, llvm_module);
1407
1408 if (log)
1409 {
1410 log->Printf("Interpreted an ICmpInst");
1411 log->Printf(" L : %s", frame.SummarizeValue(lhs).c_str());
1412 log->Printf(" R : %s", frame.SummarizeValue(rhs).c_str());
1413 log->Printf(" = : %s", frame.SummarizeValue(inst).c_str());
1414 }
1415 }
1416 break;
Sean Callanan80c48c12011-10-21 05:18:02 +00001417 case Instruction::IntToPtr:
1418 {
1419 const IntToPtrInst *int_to_ptr_inst = dyn_cast<IntToPtrInst>(inst);
1420
1421 if (!int_to_ptr_inst)
1422 {
1423 if (log)
1424 log->Printf("getOpcode() returns IntToPtr, but instruction is not an IntToPtrInst");
Sean Callanan175a0d02012-01-24 22:06:48 +00001425 err.SetErrorToGenericError();
1426 err.SetErrorString(interpreter_internal_error);
Sean Callanan80c48c12011-10-21 05:18:02 +00001427 return false;
1428 }
1429
1430 Value *src_operand = int_to_ptr_inst->getOperand(0);
1431
1432 lldb_private::Scalar I;
1433
1434 if (!frame.EvaluateValue(I, src_operand, llvm_module))
Sean Callanan175a0d02012-01-24 22:06:48 +00001435 {
1436 if (log)
1437 log->Printf("Couldn't evaluate %s", PrintValue(src_operand).c_str());
1438 err.SetErrorToGenericError();
1439 err.SetErrorString(bad_value_error);
Sean Callanan80c48c12011-10-21 05:18:02 +00001440 return false;
Sean Callanan175a0d02012-01-24 22:06:48 +00001441 }
Sean Callanan80c48c12011-10-21 05:18:02 +00001442
1443 frame.AssignValue(inst, I, llvm_module);
1444
1445 if (log)
1446 {
1447 log->Printf("Interpreted an IntToPtr");
1448 log->Printf(" Src : %s", frame.SummarizeValue(src_operand).c_str());
1449 log->Printf(" = : %s", frame.SummarizeValue(inst).c_str());
1450 }
1451 }
1452 break;
Sean Callanan2abffe02012-12-01 00:09:34 +00001453 case Instruction::PtrToInt:
1454 {
1455 const PtrToIntInst *ptr_to_int_inst = dyn_cast<PtrToIntInst>(inst);
1456
1457 if (!ptr_to_int_inst)
1458 {
1459 if (log)
1460 log->Printf("getOpcode() returns PtrToInt, but instruction is not an PtrToIntInst");
1461 err.SetErrorToGenericError();
1462 err.SetErrorString(interpreter_internal_error);
1463 return false;
1464 }
1465
1466 Value *src_operand = ptr_to_int_inst->getOperand(0);
1467
1468 lldb_private::Scalar I;
1469
1470 if (!frame.EvaluateValue(I, src_operand, llvm_module))
1471 {
1472 if (log)
1473 log->Printf("Couldn't evaluate %s", PrintValue(src_operand).c_str());
1474 err.SetErrorToGenericError();
1475 err.SetErrorString(bad_value_error);
1476 return false;
1477 }
1478
1479 frame.AssignValue(inst, I, llvm_module);
1480
1481 if (log)
1482 {
1483 log->Printf("Interpreted a PtrToInt");
1484 log->Printf(" Src : %s", frame.SummarizeValue(src_operand).c_str());
1485 log->Printf(" = : %s", frame.SummarizeValue(inst).c_str());
1486 }
1487 }
1488 break;
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001489 case Instruction::Load:
1490 {
1491 const LoadInst *load_inst = dyn_cast<LoadInst>(inst);
1492
1493 if (!load_inst)
1494 {
1495 if (log)
1496 log->Printf("getOpcode() returns Load, but instruction is not a LoadInst");
Sean Callanan175a0d02012-01-24 22:06:48 +00001497 err.SetErrorToGenericError();
1498 err.SetErrorString(interpreter_internal_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001499 return false;
1500 }
1501
1502 // The semantics of Load are:
1503 // Create a region D that will contain the loaded data
1504 // Resolve the region P containing a pointer
1505 // Dereference P to get the region R that the data should be loaded from
1506 // Transfer a unit of type type(D) from R to D
1507
1508 const Value *pointer_operand = load_inst->getPointerOperand();
1509
1510 Type *pointer_ty = pointer_operand->getType();
1511 PointerType *pointer_ptr_ty = dyn_cast<PointerType>(pointer_ty);
1512 if (!pointer_ptr_ty)
Sean Callanan175a0d02012-01-24 22:06:48 +00001513 {
1514 if (log)
1515 log->Printf("getPointerOperand()->getType() is not a PointerType");
1516 err.SetErrorToGenericError();
1517 err.SetErrorString(interpreter_internal_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001518 return false;
Sean Callanan175a0d02012-01-24 22:06:48 +00001519 }
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001520 Type *target_ty = pointer_ptr_ty->getElementType();
1521
Sean Callanan08052af2013-04-17 07:50:58 +00001522 lldb::addr_t D = frame.ResolveValue(load_inst, llvm_module);
1523 lldb::addr_t P = frame.ResolveValue(pointer_operand, llvm_module);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001524
Sean Callanan08052af2013-04-17 07:50:58 +00001525 if (D == LLDB_INVALID_ADDRESS)
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001526 {
1527 if (log)
1528 log->Printf("LoadInst's value doesn't resolve to anything");
Sean Callanan175a0d02012-01-24 22:06:48 +00001529 err.SetErrorToGenericError();
1530 err.SetErrorString(bad_value_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001531 return false;
1532 }
1533
Sean Callanan08052af2013-04-17 07:50:58 +00001534 if (P == LLDB_INVALID_ADDRESS)
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001535 {
1536 if (log)
1537 log->Printf("LoadInst's pointer doesn't resolve to anything");
Sean Callanan175a0d02012-01-24 22:06:48 +00001538 err.SetErrorToGenericError();
1539 err.SetErrorString(bad_value_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001540 return false;
1541 }
1542
Sean Callanan08052af2013-04-17 07:50:58 +00001543 lldb::addr_t R;
1544 lldb_private::Error read_error;
1545 m_memory_map.ReadPointerFromMemory(&R, P, read_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001546
Sean Callanan08052af2013-04-17 07:50:58 +00001547 if (!read_error.Success())
Sean Callanan80c48c12011-10-21 05:18:02 +00001548 {
Sean Callanan08052af2013-04-17 07:50:58 +00001549 if (log)
1550 log->Printf("Couldn't read the address to be loaded for a LoadInst");
1551 err.SetErrorToGenericError();
1552 err.SetErrorString(memory_read_error);
1553 return false;
Sean Callanan80c48c12011-10-21 05:18:02 +00001554 }
Sean Callanan08052af2013-04-17 07:50:58 +00001555
1556 size_t target_size = target_data.getTypeStoreSize(target_ty);
1557 lldb_private::DataBufferHeap buffer(target_size, 0);
1558
1559 read_error.Clear();
1560 m_memory_map.ReadMemory(buffer.GetBytes(), R, buffer.GetByteSize(), read_error);
1561 if (!read_error.Success())
Sean Callanan80c48c12011-10-21 05:18:02 +00001562 {
Sean Callanan08052af2013-04-17 07:50:58 +00001563 if (log)
1564 log->Printf("Couldn't read from a region on behalf of a LoadInst");
1565 err.SetErrorToGenericError();
1566 err.SetErrorString(memory_read_error);
1567 return false;
1568 }
1569
1570 lldb_private::Error write_error;
1571 m_memory_map.WriteMemory(D, buffer.GetBytes(), buffer.GetByteSize(), write_error);
1572 if (!write_error.Success())
1573 {
1574 if (log)
1575 log->Printf("Couldn't write to a region on behalf of a LoadInst");
1576 err.SetErrorToGenericError();
1577 err.SetErrorString(memory_read_error);
1578 return false;
Sean Callanan80c48c12011-10-21 05:18:02 +00001579 }
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001580
1581 if (log)
1582 {
1583 log->Printf("Interpreted a LoadInst");
Sean Callanan08052af2013-04-17 07:50:58 +00001584 log->Printf(" P : 0x%llx", P);
1585 log->Printf(" R : 0x%llx", R);
1586 log->Printf(" D : 0x%llx", D);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001587 }
1588 }
1589 break;
1590 case Instruction::Ret:
1591 {
Sean Callanan08052af2013-04-17 07:50:58 +00001592 frame.RestoreLLDBValues();
1593
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001594 if (result_name.IsEmpty())
1595 return true;
1596
1597 GlobalValue *result_value = llvm_module.getNamedValue(result_name.GetCString());
Sean Callanan5b26f272012-02-04 08:49:35 +00001598
1599 if (!frame.ConstructResult(result, result_value, result_name, result_type, llvm_module))
1600 {
1601 if (log)
1602 log->Printf("Couldn't construct the expression's result");
1603 err.SetErrorToGenericError();
1604 err.SetErrorString(bad_result_error);
1605 return false;
1606 }
1607
1608 return true;
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001609 }
1610 case Instruction::Store:
1611 {
1612 const StoreInst *store_inst = dyn_cast<StoreInst>(inst);
1613
1614 if (!store_inst)
1615 {
1616 if (log)
1617 log->Printf("getOpcode() returns Store, but instruction is not a StoreInst");
Sean Callanan175a0d02012-01-24 22:06:48 +00001618 err.SetErrorToGenericError();
1619 err.SetErrorString(interpreter_internal_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001620 return false;
1621 }
1622
1623 // The semantics of Store are:
1624 // Resolve the region D containing the data to be stored
1625 // Resolve the region P containing a pointer
1626 // Dereference P to get the region R that the data should be stored in
1627 // Transfer a unit of type type(D) from D to R
1628
1629 const Value *value_operand = store_inst->getValueOperand();
1630 const Value *pointer_operand = store_inst->getPointerOperand();
1631
1632 Type *pointer_ty = pointer_operand->getType();
1633 PointerType *pointer_ptr_ty = dyn_cast<PointerType>(pointer_ty);
1634 if (!pointer_ptr_ty)
1635 return false;
1636 Type *target_ty = pointer_ptr_ty->getElementType();
1637
Sean Callanan08052af2013-04-17 07:50:58 +00001638 lldb::addr_t D = frame.ResolveValue(value_operand, llvm_module);
1639 lldb::addr_t P = frame.ResolveValue(pointer_operand, llvm_module);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001640
Sean Callanan08052af2013-04-17 07:50:58 +00001641 if (D == LLDB_INVALID_ADDRESS)
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001642 {
1643 if (log)
1644 log->Printf("StoreInst's value doesn't resolve to anything");
Sean Callanan175a0d02012-01-24 22:06:48 +00001645 err.SetErrorToGenericError();
1646 err.SetErrorString(bad_value_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001647 return false;
1648 }
1649
Sean Callanan08052af2013-04-17 07:50:58 +00001650 if (P == LLDB_INVALID_ADDRESS)
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001651 {
1652 if (log)
1653 log->Printf("StoreInst's pointer doesn't resolve to anything");
Sean Callanan175a0d02012-01-24 22:06:48 +00001654 err.SetErrorToGenericError();
1655 err.SetErrorString(bad_value_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001656 return false;
1657 }
1658
Sean Callanan08052af2013-04-17 07:50:58 +00001659 lldb::addr_t R;
1660 lldb_private::Error read_error;
1661 m_memory_map.ReadPointerFromMemory(&R, P, read_error);
1662
1663 if (!read_error.Success())
1664 {
1665 if (log)
1666 log->Printf("Couldn't read the address to be loaded for a LoadInst");
1667 err.SetErrorToGenericError();
1668 err.SetErrorString(memory_read_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001669 return false;
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001670 }
1671
Sean Callanan08052af2013-04-17 07:50:58 +00001672 size_t target_size = target_data.getTypeStoreSize(target_ty);
1673 lldb_private::DataBufferHeap buffer(target_size, 0);
1674
1675 read_error.Clear();
1676 m_memory_map.ReadMemory(buffer.GetBytes(), D, buffer.GetByteSize(), read_error);
1677 if (!read_error.Success())
1678 {
1679 if (log)
1680 log->Printf("Couldn't read from a region on behalf of a StoreInst");
1681 err.SetErrorToGenericError();
1682 err.SetErrorString(memory_read_error);
1683 return false;
1684 }
1685
1686 lldb_private::Error write_error;
1687 m_memory_map.WriteMemory(R, buffer.GetBytes(), buffer.GetByteSize(), write_error);
1688 if (!write_error.Success())
1689 {
1690 if (log)
1691 log->Printf("Couldn't write to a region on behalf of a StoreInst");
1692 err.SetErrorToGenericError();
1693 err.SetErrorString(memory_read_error);
1694 return false;
1695 }
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001696
1697 if (log)
1698 {
1699 log->Printf("Interpreted a StoreInst");
Sean Callanan08052af2013-04-17 07:50:58 +00001700 log->Printf(" D : 0x%llx", D);
1701 log->Printf(" P : 0x%llx", P);
1702 log->Printf(" R : 0x%llx", R);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001703 }
1704 }
1705 break;
1706 }
1707
1708 ++frame.m_ii;
1709 }
1710
1711 if (num_insts >= 4096)
Sean Callanan175a0d02012-01-24 22:06:48 +00001712 {
1713 err.SetErrorToGenericError();
1714 err.SetErrorString(infinite_loop_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001715 return false;
Sean Callanan175a0d02012-01-24 22:06:48 +00001716 }
1717
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001718 return false;
Greg Claytond4e25522011-10-12 00:53:29 +00001719}