blob: 419165c79b14b132f77fb1ffad9ea20b6c1a73d3 [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
Sean Callanan3bfdaa22011-09-15 02:13:07 +000029static std::string
30PrintValue(const Value *value, bool truncate = false)
31{
32 std::string s;
33 raw_string_ostream rso(s);
34 value->print(rso);
35 rso.flush();
36 if (truncate)
37 s.resize(s.length() - 1);
38
39 size_t offset;
40 while ((offset = s.find('\n')) != s.npos)
41 s.erase(offset, 1);
42 while (s[0] == ' ' || s[0] == '\t')
43 s.erase(0, 1);
44
45 return s;
46}
47
48static std::string
49PrintType(const Type *type, bool truncate = false)
50{
51 std::string s;
52 raw_string_ostream rso(s);
53 type->print(rso);
54 rso.flush();
55 if (truncate)
56 s.resize(s.length() - 1);
57 return s;
58}
59
Sean Callanan3bfdaa22011-09-15 02:13:07 +000060class InterpreterStackFrame
61{
62public:
Sean Callanan08052af2013-04-17 07:50:58 +000063 typedef std::map <const Value*, lldb::addr_t> ValueMap;
64
65 struct PlacedValue
66 {
67 lldb_private::Value lldb_value;
68 lldb::addr_t process_address;
69 size_t size;
70
71 PlacedValue (lldb_private::Value &_lldb_value,
72 lldb::addr_t _process_address,
73 size_t _size) :
74 lldb_value(_lldb_value),
75 process_address(_process_address),
76 size(_size)
77 {
78 }
79 };
80
81 typedef std::vector <PlacedValue> PlacedValueVector;
Sean Callanan3bfdaa22011-09-15 02:13:07 +000082
83 ValueMap m_values;
Sean Callanan08052af2013-04-17 07:50:58 +000084 PlacedValueVector m_placed_values;
Micah Villmow8468dbe2012-10-08 16:28:57 +000085 DataLayout &m_target_data;
Sean Callanan175187b2013-04-17 17:51:08 +000086 lldb_private::ClangExpressionDeclMap *m_decl_map;
Sean Callanan179b5482013-04-16 23:49:09 +000087 lldb_private::IRMemoryMap &m_memory_map;
Sean Callanan3bfdaa22011-09-15 02:13:07 +000088 const BasicBlock *m_bb;
89 BasicBlock::const_iterator m_ii;
90 BasicBlock::const_iterator m_ie;
91
92 lldb::ByteOrder m_byte_order;
93 size_t m_addr_byte_size;
94
Micah Villmow8468dbe2012-10-08 16:28:57 +000095 InterpreterStackFrame (DataLayout &target_data,
Sean Callanan175187b2013-04-17 17:51:08 +000096 lldb_private::ClangExpressionDeclMap *decl_map,
Sean Callanan179b5482013-04-16 23:49:09 +000097 lldb_private::IRMemoryMap &memory_map) :
Daniel Dunbara08823f2011-10-31 22:50:49 +000098 m_target_data (target_data),
Sean Callanan179b5482013-04-16 23:49:09 +000099 m_decl_map (decl_map),
100 m_memory_map (memory_map)
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000101 {
102 m_byte_order = (target_data.isLittleEndian() ? lldb::eByteOrderLittle : lldb::eByteOrderBig);
Sean Callanan95769bf2012-10-11 22:00:52 +0000103 m_addr_byte_size = (target_data.getPointerSize(0));
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000104 }
105
106 void Jump (const BasicBlock *bb)
107 {
108 m_bb = bb;
109 m_ii = m_bb->begin();
110 m_ie = m_bb->end();
111 }
112
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000113 std::string SummarizeValue (const Value *value)
114 {
115 lldb_private::StreamString ss;
116
117 ss.Printf("%s", PrintValue(value).c_str());
118
119 ValueMap::iterator i = m_values.find(value);
120
121 if (i != m_values.end())
122 {
Sean Callanan08052af2013-04-17 07:50:58 +0000123 lldb::addr_t addr = i->second;
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000124
Sean Callanan08052af2013-04-17 07:50:58 +0000125 ss.Printf(" 0x%llx", (unsigned long long)addr);
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000126 }
127
128 return ss.GetString();
129 }
130
131 bool AssignToMatchType (lldb_private::Scalar &scalar, uint64_t u64value, Type *type)
132 {
133 size_t type_size = m_target_data.getTypeStoreSize(type);
134
135 switch (type_size)
136 {
137 case 1:
138 scalar = (uint8_t)u64value;
139 break;
140 case 2:
141 scalar = (uint16_t)u64value;
142 break;
143 case 4:
144 scalar = (uint32_t)u64value;
145 break;
146 case 8:
147 scalar = (uint64_t)u64value;
148 break;
149 default:
150 return false;
151 }
152
153 return true;
154 }
155
156 bool EvaluateValue (lldb_private::Scalar &scalar, const Value *value, Module &module)
157 {
158 const Constant *constant = dyn_cast<Constant>(value);
159
160 if (constant)
161 {
162 if (const ConstantInt *constant_int = dyn_cast<ConstantInt>(constant))
163 {
164 return AssignToMatchType(scalar, constant_int->getLimitedValue(), value->getType());
165 }
166 }
167 else
168 {
Sean Callanan08052af2013-04-17 07:50:58 +0000169 lldb::addr_t process_address = ResolveValue(value, module);
170 size_t value_size = m_target_data.getTypeStoreSize(value->getType());
171
172 lldb_private::DataExtractor value_extractor;
173 lldb_private::Error extract_error;
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000174
Sean Callanan08052af2013-04-17 07:50:58 +0000175 m_memory_map.GetMemoryData(value_extractor, process_address, value_size, extract_error);
176
177 if (!extract_error.Success())
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000178 return false;
179
Greg Claytonc7bece562013-01-25 18:06:21 +0000180 lldb::offset_t offset = 0;
Sean Callanan08052af2013-04-17 07:50:58 +0000181 uint64_t u64value = value_extractor.GetMaxU64(&offset, value_size);
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000182
183 return AssignToMatchType(scalar, u64value, value->getType());
184 }
185
186 return false;
187 }
188
189 bool AssignValue (const Value *value, lldb_private::Scalar &scalar, Module &module)
190 {
Sean Callanan08052af2013-04-17 07:50:58 +0000191 lldb::addr_t process_address = ResolveValue (value, module);
192
193 if (process_address == LLDB_INVALID_ADDRESS)
194 return false;
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000195
196 lldb_private::Scalar cast_scalar;
197
198 if (!AssignToMatchType(cast_scalar, scalar.GetRawBits64(0), value->getType()))
199 return false;
Sean Callanan08052af2013-04-17 07:50:58 +0000200
201 size_t value_byte_size = m_target_data.getTypeStoreSize(value->getType());
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000202
Sean Callanan08052af2013-04-17 07:50:58 +0000203 lldb_private::DataBufferHeap buf(value_byte_size, 0);
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000204
Sean Callanan08052af2013-04-17 07:50:58 +0000205 lldb_private::Error get_data_error;
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000206
Sean Callanan08052af2013-04-17 07:50:58 +0000207 if (!cast_scalar.GetAsMemoryData(buf.GetBytes(), buf.GetByteSize(), m_byte_order, get_data_error))
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000208 return false;
209
Sean Callanan08052af2013-04-17 07:50:58 +0000210 lldb_private::Error write_error;
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000211
Sean Callanan08052af2013-04-17 07:50:58 +0000212 m_memory_map.WriteMemory(process_address, buf.GetBytes(), buf.GetByteSize(), write_error);
Sean Callananc8675502013-02-15 23:07:52 +0000213
Sean Callanan08052af2013-04-17 07:50:58 +0000214 return write_error.Success();
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000215 }
216
Sean Callanan94a9a392012-02-08 01:27:49 +0000217 bool ResolveConstantValue (APInt &value, const Constant *constant)
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000218 {
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000219 if (const ConstantInt *constant_int = dyn_cast<ConstantInt>(constant))
220 {
Sean Callanan94a9a392012-02-08 01:27:49 +0000221 value = constant_int->getValue();
222 return true;
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000223 }
Sean Callanan80c48c12011-10-21 05:18:02 +0000224 else if (const ConstantFP *constant_fp = dyn_cast<ConstantFP>(constant))
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000225 {
Sean Callanan94a9a392012-02-08 01:27:49 +0000226 value = constant_fp->getValueAPF().bitcastToAPInt();
227 return true;
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000228 }
Sean Callanan80c48c12011-10-21 05:18:02 +0000229 else if (const ConstantExpr *constant_expr = dyn_cast<ConstantExpr>(constant))
230 {
231 switch (constant_expr->getOpcode())
232 {
Sean Callanan94a9a392012-02-08 01:27:49 +0000233 default:
234 return false;
235 case Instruction::IntToPtr:
Sean Callanan2abffe02012-12-01 00:09:34 +0000236 case Instruction::PtrToInt:
Sean Callanan94a9a392012-02-08 01:27:49 +0000237 case Instruction::BitCast:
238 return ResolveConstantValue(value, constant_expr->getOperand(0));
239 case Instruction::GetElementPtr:
240 {
241 ConstantExpr::const_op_iterator op_cursor = constant_expr->op_begin();
242 ConstantExpr::const_op_iterator op_end = constant_expr->op_end();
243
244 Constant *base = dyn_cast<Constant>(*op_cursor);
245
246 if (!base)
247 return false;
248
249 if (!ResolveConstantValue(value, base))
250 return false;
251
252 op_cursor++;
253
254 if (op_cursor == op_end)
255 return true; // no offset to apply!
256
257 SmallVector <Value *, 8> indices (op_cursor, op_end);
258
259 uint64_t offset = m_target_data.getIndexedOffset(base->getType(), indices);
260
261 const bool is_signed = true;
262 value += APInt(value.getBitWidth(), offset, is_signed);
263
264 return true;
265 }
Sean Callanan80c48c12011-10-21 05:18:02 +0000266 }
267 }
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000268
269 return false;
270 }
271
Sean Callanan08052af2013-04-17 07:50:58 +0000272 bool ResolveConstant (lldb::addr_t process_address, const Constant *constant)
Sean Callanan94a9a392012-02-08 01:27:49 +0000273 {
274 APInt resolved_value;
275
276 if (!ResolveConstantValue(resolved_value, constant))
277 return false;
278
279 const uint64_t *raw_data = resolved_value.getRawData();
280
281 size_t constant_size = m_target_data.getTypeStoreSize(constant->getType());
Sean Callanan94a9a392012-02-08 01:27:49 +0000282
Sean Callanan08052af2013-04-17 07:50:58 +0000283 lldb_private::Error write_error;
284
285 m_memory_map.WriteMemory(process_address, (uint8_t*)raw_data, constant_size, write_error);
286
287 return write_error.Success();
288 }
289
290 lldb::addr_t MallocPointer ()
291 {
292 lldb_private::Error alloc_error;
293
294 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);
295
296 if (alloc_error.Success())
297 return ret;
298 else
299 return LLDB_INVALID_ADDRESS;
300 }
301
302 lldb::addr_t Malloc (llvm::Type *type, size_t override_byte_size = 0)
303 {
304 lldb_private::Error alloc_error;
305
306 if (!override_byte_size)
307 override_byte_size = m_target_data.getTypeStoreSize(type);
308
309 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);
310
311 if (alloc_error.Success())
312 return ret;
313 else
314 return LLDB_INVALID_ADDRESS;
315 }
316
317 lldb::addr_t PlaceLLDBValue (const llvm::Value *value, lldb_private::Value lldb_value)
318 {
Sean Callanan175187b2013-04-17 17:51:08 +0000319 if (!m_decl_map)
320 return false;
321
Sean Callanan08052af2013-04-17 07:50:58 +0000322 lldb_private::Error alloc_error;
323 lldb_private::RegisterInfo *reg_info = lldb_value.GetRegisterInfo();
324
325 lldb::addr_t ret;
326
327 size_t value_size = m_target_data.getTypeStoreSize(value->getType());
328
329 if (reg_info && (reg_info->encoding == lldb::eEncodingVector))
330 value_size = reg_info->byte_size;
331
332 if (!reg_info && (lldb_value.GetValueType() == lldb_private::Value::eValueTypeLoadAddress))
333 return lldb_value.GetScalar().ULongLong();
334
335 ret = Malloc(value->getType(), value_size);
336
337 if (ret == LLDB_INVALID_ADDRESS)
338 return LLDB_INVALID_ADDRESS;
339
340 lldb_private::DataBufferHeap buf(value_size, 0);
341
Sean Callanan175187b2013-04-17 17:51:08 +0000342 m_decl_map->ReadTarget(m_memory_map, buf.GetBytes(), lldb_value, value_size);
Sean Callanan08052af2013-04-17 07:50:58 +0000343
344 lldb_private::Error write_error;
345
346 m_memory_map.WriteMemory(ret, buf.GetBytes(), buf.GetByteSize(), write_error);
347
348 if (!write_error.Success())
349 {
350 lldb_private::Error free_error;
351 m_memory_map.Free(ret, free_error);
352 return LLDB_INVALID_ADDRESS;
353 }
354
355 m_placed_values.push_back(PlacedValue(lldb_value, ret, value_size));
356
357 return ret;
358 }
359
360 void RestoreLLDBValues ()
361 {
Sean Callanan175187b2013-04-17 17:51:08 +0000362 if (!m_decl_map)
363 return;
364
Sean Callanan08052af2013-04-17 07:50:58 +0000365 for (PlacedValue &placed_value : m_placed_values)
366 {
367 lldb_private::DataBufferHeap buf(placed_value.size, 0);
368
369 lldb_private::Error read_error;
370
371 m_memory_map.ReadMemory(buf.GetBytes(), placed_value.process_address, buf.GetByteSize(), read_error);
372
373 if (read_error.Success())
Sean Callanan175187b2013-04-17 17:51:08 +0000374 m_decl_map->WriteTarget(m_memory_map, placed_value.lldb_value, buf.GetBytes(), buf.GetByteSize());
Sean Callanan08052af2013-04-17 07:50:58 +0000375 }
376 }
377
378 std::string PrintData (lldb::addr_t addr, llvm::Type *type)
379 {
380 size_t length = m_target_data.getTypeStoreSize(type);
381
382 lldb_private::DataBufferHeap buf(length, 0);
383
384 lldb_private::Error read_error;
385
386 m_memory_map.ReadMemory(buf.GetBytes(), addr, length, read_error);
387
388 if (!read_error.Success())
389 return std::string("<couldn't read data>");
390
391 lldb_private::StreamString ss;
392
393 for (size_t i = 0; i < length; i++)
394 {
395 if ((!(i & 0xf)) && i)
396 ss.Printf("%02hhx - ", buf.GetBytes()[i]);
397 else
398 ss.Printf("%02hhx ", buf.GetBytes()[i]);
399 }
400
401 return ss.GetString();
402 }
403
404 lldb::addr_t ResolveValue (const Value *value, Module &module)
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000405 {
Sean Callanan175187b2013-04-17 17:51:08 +0000406 if (!m_decl_map)
407 return LLDB_INVALID_ADDRESS;
408
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000409 ValueMap::iterator i = m_values.find(value);
410
411 if (i != m_values.end())
412 return i->second;
413
414 const GlobalValue *global_value = dyn_cast<GlobalValue>(value);
415
Sean Callanand2cb6262011-10-26 21:20:00 +0000416 // If the variable is indirected through the argument
417 // array then we need to build an extra level of indirection
418 // for it. This is the default; only magic arguments like
419 // "this", "self", and "_cmd" are direct.
Sean Callanan496970f2012-12-11 22:39:36 +0000420 bool variable_is_this = false;
Sean Callanand2cb6262011-10-26 21:20:00 +0000421
Sean Callanan9be9d172013-03-19 01:45:02 +0000422 // If the variable is a function pointer, we do not need to
423 // build an extra layer of indirection for it because it is
424 // accessed directly.
425 bool variable_is_function_address = false;
426
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000427 // Attempt to resolve the value using the program's data.
428 // If it is, the values to be created are:
429 //
430 // data_region - a region of memory in which the variable's data resides.
431 // ref_region - a region of memory in which its address (i.e., &var) resides.
432 // In the JIT case, this region would be a member of the struct passed in.
433 // pointer_region - a region of memory in which the address of the pointer
434 // resides. This is an IR-level variable.
435 do
436 {
Greg Clayton5160ce52013-03-27 23:08:40 +0000437 lldb_private::Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanand2cb6262011-10-26 21:20:00 +0000438
439 lldb_private::Value resolved_value;
Greg Clayton23f59502012-07-17 03:23:13 +0000440 lldb_private::ClangExpressionVariable::FlagType flags = 0;
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000441
Sean Callanand2cb6262011-10-26 21:20:00 +0000442 if (global_value)
443 {
444 clang::NamedDecl *decl = IRForTarget::DeclForGlobal(global_value, &module);
445
446 if (!decl)
447 break;
448
449 if (isa<clang::FunctionDecl>(decl))
Sean Callanan9be9d172013-03-19 01:45:02 +0000450 variable_is_function_address = true;
Sean Callanand2cb6262011-10-26 21:20:00 +0000451
Sean Callanan175187b2013-04-17 17:51:08 +0000452 resolved_value = m_decl_map->LookupDecl(decl, flags);
Sean Callanand2cb6262011-10-26 21:20:00 +0000453 }
454 else
455 {
456 // Special-case "this", "self", and "_cmd"
457
Sean Callanan7f27d602011-11-19 02:54:21 +0000458 std::string name_str = value->getName().str();
Sean Callanand2cb6262011-10-26 21:20:00 +0000459
460 if (name_str == "this" ||
461 name_str == "self" ||
462 name_str == "_cmd")
Sean Callananc8675502013-02-15 23:07:52 +0000463 {
Sean Callanan175187b2013-04-17 17:51:08 +0000464 resolved_value = m_decl_map->GetSpecialValue(lldb_private::ConstString(name_str.c_str()));
Sean Callananc8675502013-02-15 23:07:52 +0000465 variable_is_this = true;
466 }
Sean Callanand2cb6262011-10-26 21:20:00 +0000467 }
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000468
469 if (resolved_value.GetScalar().GetType() != lldb_private::Scalar::e_void)
470 {
471 if (resolved_value.GetContextType() == lldb_private::Value::eContextTypeRegisterInfo)
472 {
Sean Callanan496970f2012-12-11 22:39:36 +0000473 if (variable_is_this)
Sean Callanan08052af2013-04-17 07:50:58 +0000474 {
475 lldb_private::Error alloc_error;
476 lldb::addr_t ref_addr = Malloc(value->getType());
Sean Callanan496970f2012-12-11 22:39:36 +0000477
Sean Callanan08052af2013-04-17 07:50:58 +0000478 if (ref_addr == LLDB_INVALID_ADDRESS)
479 return LLDB_INVALID_ADDRESS;
Sean Callanan496970f2012-12-11 22:39:36 +0000480
Sean Callanan08052af2013-04-17 07:50:58 +0000481 lldb_private::Error write_error;
482 m_memory_map.WritePointerToMemory(ref_addr, resolved_value.GetScalar().ULongLong(), write_error);
Sean Callanan496970f2012-12-11 22:39:36 +0000483
Sean Callanan08052af2013-04-17 07:50:58 +0000484 if (!write_error.Success())
485 return LLDB_INVALID_ADDRESS;
Sean Callanan496970f2012-12-11 22:39:36 +0000486
487 if (log)
488 {
489 log->Printf("Made an allocation for \"this\" register variable %s", PrintValue(value).c_str());
Sean Callanan08052af2013-04-17 07:50:58 +0000490 log->Printf(" Data region : %llx", (unsigned long long)resolved_value.GetScalar().ULongLong());
491 log->Printf(" Ref region : %llx", (unsigned long long)ref_addr);
Sean Callanan496970f2012-12-11 22:39:36 +0000492 }
493
Sean Callanan08052af2013-04-17 07:50:58 +0000494 m_values[value] = ref_addr;
495 return ref_addr;
Sean Callanan496970f2012-12-11 22:39:36 +0000496 }
497 else if (flags & lldb_private::ClangExpressionVariable::EVBareRegister)
Sean Callanan08052af2013-04-17 07:50:58 +0000498 {
499 lldb::addr_t data_address = PlaceLLDBValue(value, resolved_value);
Sean Callanand2cb6262011-10-26 21:20:00 +0000500
Sean Callanan08052af2013-04-17 07:50:58 +0000501 if (!data_address)
502 return LLDB_INVALID_ADDRESS;
Sean Callanan496970f2012-12-11 22:39:36 +0000503
Sean Callanan08052af2013-04-17 07:50:58 +0000504 lldb::addr_t ref_address = MallocPointer();
Sean Callanan496970f2012-12-11 22:39:36 +0000505
Sean Callanan08052af2013-04-17 07:50:58 +0000506 if (ref_address == LLDB_INVALID_ADDRESS)
507 {
508 lldb_private::Error free_error;
509 m_memory_map.Free(data_address, free_error);
510 return LLDB_INVALID_ADDRESS;
511 }
Sean Callanan496970f2012-12-11 22:39:36 +0000512
Sean Callanan08052af2013-04-17 07:50:58 +0000513 lldb_private::Error write_error;
514
515 m_memory_map.WritePointerToMemory(ref_address, data_address, write_error);
Sean Callanan496970f2012-12-11 22:39:36 +0000516
Sean Callanan08052af2013-04-17 07:50:58 +0000517 if (!write_error.Success())
518 {
519 lldb_private::Error free_error;
520 m_memory_map.Free(data_address, free_error);
521 m_memory_map.Free(ref_address, free_error);
522 return LLDB_INVALID_ADDRESS;
523 }
Sean Callanan496970f2012-12-11 22:39:36 +0000524
525 if (log)
526 {
527 log->Printf("Made an allocation for bare register variable %s", PrintValue(value).c_str());
Sean Callanan08052af2013-04-17 07:50:58 +0000528 log->Printf(" Data contents : %s", PrintData(data_address, value->getType()).c_str());
529 log->Printf(" Data region : 0x%llx", (unsigned long long)data_address);
530 log->Printf(" Ref region : 0x%llx", (unsigned long long)ref_address);
Sean Callanan496970f2012-12-11 22:39:36 +0000531 }
532
Sean Callanan08052af2013-04-17 07:50:58 +0000533 m_values[value] = ref_address;
534 return ref_address;
Sean Callanan496970f2012-12-11 22:39:36 +0000535 }
536 else
Sean Callanan08052af2013-04-17 07:50:58 +0000537 {
538 lldb::addr_t data_address = PlaceLLDBValue(value, resolved_value);
Sean Callanan496970f2012-12-11 22:39:36 +0000539
Sean Callanan08052af2013-04-17 07:50:58 +0000540 if (data_address == LLDB_INVALID_ADDRESS)
541 return LLDB_INVALID_ADDRESS;
Sean Callanan496970f2012-12-11 22:39:36 +0000542
Sean Callanan08052af2013-04-17 07:50:58 +0000543 lldb::addr_t ref_address = MallocPointer();
Sean Callanan496970f2012-12-11 22:39:36 +0000544
Sean Callanan08052af2013-04-17 07:50:58 +0000545 if (ref_address == LLDB_INVALID_ADDRESS)
546 {
547 lldb_private::Error free_error;
548 m_memory_map.Free(data_address, free_error);
549 return LLDB_INVALID_ADDRESS;
550 }
Sean Callanan496970f2012-12-11 22:39:36 +0000551
Sean Callanan08052af2013-04-17 07:50:58 +0000552 lldb::addr_t pointer_address = MallocPointer();
Sean Callanan496970f2012-12-11 22:39:36 +0000553
Sean Callanan08052af2013-04-17 07:50:58 +0000554 if (pointer_address == LLDB_INVALID_ADDRESS)
555 {
556 lldb_private::Error free_error;
557 m_memory_map.Free(data_address, free_error);
558 m_memory_map.Free(ref_address, free_error);
559 return LLDB_INVALID_ADDRESS;
560 }
561
562 lldb_private::Error write_error;
Sean Callanan496970f2012-12-11 22:39:36 +0000563
Sean Callanan08052af2013-04-17 07:50:58 +0000564 m_memory_map.WritePointerToMemory(ref_address, data_address, write_error);
Sean Callanan496970f2012-12-11 22:39:36 +0000565
Sean Callanan08052af2013-04-17 07:50:58 +0000566 if (!write_error.Success())
567 {
568 lldb_private::Error free_error;
569 m_memory_map.Free(data_address, free_error);
570 m_memory_map.Free(ref_address, free_error);
571 m_memory_map.Free(pointer_address, free_error);
572 return LLDB_INVALID_ADDRESS;
573 }
574
575 write_error.Clear();
576
577 m_memory_map.WritePointerToMemory(pointer_address, ref_address, write_error);
578
579 if (!write_error.Success())
580 {
581 lldb_private::Error free_error;
582 m_memory_map.Free(data_address, free_error);
583 m_memory_map.Free(ref_address, free_error);
584 m_memory_map.Free(pointer_address, free_error);
585 return LLDB_INVALID_ADDRESS;
586 }
Sean Callanan496970f2012-12-11 22:39:36 +0000587
588 if (log)
589 {
590 log->Printf("Made an allocation for ordinary register variable %s", PrintValue(value).c_str());
Sean Callanan08052af2013-04-17 07:50:58 +0000591 log->Printf(" Data contents : %s", PrintData(data_address, value->getType()).c_str());
592 log->Printf(" Data region : 0x%llx", (unsigned long long)data_address);
593 log->Printf(" Ref region : 0x%llx", (unsigned long long)ref_address);
594 log->Printf(" Pointer region : 0x%llx", (unsigned long long)pointer_address);
Sean Callanan496970f2012-12-11 22:39:36 +0000595 }
596
Sean Callanan08052af2013-04-17 07:50:58 +0000597 m_values[value] = pointer_address;
598 return pointer_address;
Sean Callanand2cb6262011-10-26 21:20:00 +0000599 }
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000600 }
601 else
602 {
Sean Callanan9be9d172013-03-19 01:45:02 +0000603 bool no_extra_redirect = (variable_is_this || variable_is_function_address);
604
Sean Callanan08052af2013-04-17 07:50:58 +0000605 lldb::addr_t data_address = PlaceLLDBValue(value, resolved_value);
Sean Callanand2cb6262011-10-26 21:20:00 +0000606
Sean Callanan08052af2013-04-17 07:50:58 +0000607 if (data_address == LLDB_INVALID_ADDRESS)
608 return LLDB_INVALID_ADDRESS;
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000609
Sean Callanan08052af2013-04-17 07:50:58 +0000610 lldb::addr_t ref_address = MallocPointer();
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000611
Sean Callanan08052af2013-04-17 07:50:58 +0000612 if (ref_address == LLDB_INVALID_ADDRESS)
613 {
614 lldb_private::Error free_error;
615 m_memory_map.Free(data_address, free_error);
616 return LLDB_INVALID_ADDRESS;
617 }
618
619 lldb::addr_t pointer_address = LLDB_INVALID_ADDRESS;
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000620
Sean Callanan9be9d172013-03-19 01:45:02 +0000621 if (!no_extra_redirect)
Sean Callanand2cb6262011-10-26 21:20:00 +0000622 {
Sean Callanan08052af2013-04-17 07:50:58 +0000623 pointer_address = MallocPointer();
Sean Callanand2cb6262011-10-26 21:20:00 +0000624
Sean Callanan08052af2013-04-17 07:50:58 +0000625 if (pointer_address == LLDB_INVALID_ADDRESS)
626 {
627 lldb_private::Error free_error;
628 m_memory_map.Free(data_address, free_error);
629 m_memory_map.Free(ref_address, free_error);
630 return LLDB_INVALID_ADDRESS;
631 }
632 }
633
634 lldb_private::Error write_error;
635
636 m_memory_map.WritePointerToMemory(ref_address, data_address, write_error);
637
638 if (!write_error.Success())
639 {
640 lldb_private::Error free_error;
641 m_memory_map.Free(data_address, free_error);
642 m_memory_map.Free(ref_address, free_error);
643 if (pointer_address != LLDB_INVALID_ADDRESS)
644 m_memory_map.Free(pointer_address, free_error);
645 return LLDB_INVALID_ADDRESS;
646 }
647
648 if (!no_extra_redirect)
649 {
650 write_error.Clear();
651
652 m_memory_map.WritePointerToMemory(pointer_address, ref_address, write_error);
653
654 if (!write_error.Success())
655 {
656 lldb_private::Error free_error;
657 m_memory_map.Free(data_address, free_error);
658 m_memory_map.Free(ref_address, free_error);
659 if (pointer_address != LLDB_INVALID_ADDRESS)
660 m_memory_map.Free(pointer_address, free_error);
661 return LLDB_INVALID_ADDRESS;
662 }
Sean Callanand2cb6262011-10-26 21:20:00 +0000663 }
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000664
665 if (log)
666 {
Sean Callanand2cb6262011-10-26 21:20:00 +0000667 log->Printf("Made an allocation for %s", PrintValue(value).c_str());
Sean Callanan08052af2013-04-17 07:50:58 +0000668 log->Printf(" Data contents : %s", PrintData(data_address, value->getType()).c_str());
669 log->Printf(" Data region : %llx", (unsigned long long)data_address);
670 log->Printf(" Ref region : %llx", (unsigned long long)ref_address);
Sean Callanan496970f2012-12-11 22:39:36 +0000671 if (!variable_is_this)
Sean Callanan08052af2013-04-17 07:50:58 +0000672 log->Printf(" Pointer region : %llx", (unsigned long long)pointer_address);
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000673 }
674
Sean Callanan9be9d172013-03-19 01:45:02 +0000675 if (no_extra_redirect)
Sean Callanan08052af2013-04-17 07:50:58 +0000676 {
677 m_values[value] = ref_address;
678 return ref_address;
679 }
Sean Callanan496970f2012-12-11 22:39:36 +0000680 else
Sean Callanan08052af2013-04-17 07:50:58 +0000681 {
682 m_values[value] = pointer_address;
683 return pointer_address;
684 }
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000685 }
686 }
687 }
688 while(0);
689
690 // Fall back and allocate space [allocation type Alloca]
691
Sean Callanan08052af2013-04-17 07:50:58 +0000692 lldb::addr_t data_address = Malloc(value->getType());
693
694 if (const Constant *constant = dyn_cast<Constant>(value))
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000695 {
Sean Callanan08052af2013-04-17 07:50:58 +0000696 if (!ResolveConstant (data_address, constant))
697 {
698 lldb_private::Error free_error;
699 m_memory_map.Free(data_address, free_error);
700 return LLDB_INVALID_ADDRESS;
701 }
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000702 }
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000703
Sean Callanan08052af2013-04-17 07:50:58 +0000704 m_values[value] = data_address;
705 return data_address;
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000706 }
707
708 bool ConstructResult (lldb::ClangExpressionVariableSP &result,
709 const GlobalValue *result_value,
710 const lldb_private::ConstString &result_name,
711 lldb_private::TypeFromParser result_type,
712 Module &module)
713 {
Sean Callanan175187b2013-04-17 17:51:08 +0000714 if (!m_decl_map)
715 return false;
716
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000717 // The result_value resolves to P, a pointer to a region R containing the result data.
718 // If the result variable is a reference, the region R contains a pointer to the result R_final in the original process.
719
720 if (!result_value)
721 return true; // There was no slot for a result – the expression doesn't return one.
722
723 ValueMap::iterator i = m_values.find(result_value);
724
725 if (i == m_values.end())
726 return false; // There was a slot for the result, but we didn't write into it.
727
Sean Callanan08052af2013-04-17 07:50:58 +0000728 lldb::addr_t P = i->second;
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000729
730 Type *pointer_ty = result_value->getType();
731 PointerType *pointer_ptr_ty = dyn_cast<PointerType>(pointer_ty);
732 if (!pointer_ptr_ty)
733 return false;
734 Type *R_ty = pointer_ptr_ty->getElementType();
735
Sean Callanan08052af2013-04-17 07:50:58 +0000736 lldb_private::Error read_error;
737 lldb::addr_t R;
738 m_memory_map.ReadPointerFromMemory(&R, P, read_error);
739 if (!read_error.Success())
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000740 return false;
741
742 lldb_private::Value base;
743
Sean Callanan0886e562011-09-22 00:41:11 +0000744 bool transient = false;
Sean Callanan80c48c12011-10-21 05:18:02 +0000745 bool maybe_make_load = false;
Sean Callanan0886e562011-09-22 00:41:11 +0000746
Sean Callanan175187b2013-04-17 17:51:08 +0000747 if (m_decl_map->ResultIsReference(result_name))
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000748 {
749 PointerType *R_ptr_ty = dyn_cast<PointerType>(R_ty);
750 if (!R_ptr_ty)
751 return false;
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000752
Sean Callanan08052af2013-04-17 07:50:58 +0000753 read_error.Clear();
754 lldb::addr_t R_pointer;
755 m_memory_map.ReadPointerFromMemory(&R_pointer, R, read_error);
756 if (!read_error.Success())
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000757 return false;
758
Sean Callanan08052af2013-04-17 07:50:58 +0000759 // We got a bare pointer. We are going to treat it as a load address
760 // or a file address, letting decl_map make the choice based on whether
761 // or not a process exists.
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000762
Sean Callanan08052af2013-04-17 07:50:58 +0000763 bool was_placed = false;
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000764
Sean Callanan08052af2013-04-17 07:50:58 +0000765 for (PlacedValue &value : m_placed_values)
Sean Callanan80c48c12011-10-21 05:18:02 +0000766 {
Sean Callanan08052af2013-04-17 07:50:58 +0000767 if (value.process_address == R_pointer)
768 {
769 base = value.lldb_value;
770 was_placed = true;
771 break;
772 }
773 }
774
775 if (!was_placed)
776 {
Sean Callanan80c48c12011-10-21 05:18:02 +0000777 base.SetContext(lldb_private::Value::eContextTypeInvalid, NULL);
778 base.SetValueType(lldb_private::Value::eValueTypeFileAddress);
779 base.GetScalar() = (unsigned long long)R_pointer;
780 maybe_make_load = true;
781 }
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000782 }
783 else
784 {
785 base.SetContext(lldb_private::Value::eContextTypeInvalid, NULL);
Sean Callanan08052af2013-04-17 07:50:58 +0000786 base.SetValueType(lldb_private::Value::eValueTypeLoadAddress);
787 base.GetScalar() = (unsigned long long)R;
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000788 }
789
Sean Callanan175187b2013-04-17 17:51:08 +0000790 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 +0000791 }
792};
793
794bool
Sean Callanan182bd6c2013-04-17 18:07:40 +0000795IRInterpreter::maybeRunOnFunction (lldb_private::ClangExpressionDeclMap *decl_map,
796 lldb_private::IRMemoryMap &memory_map,
797 lldb_private::Stream *error_stream,
798 lldb::ClangExpressionVariableSP &result,
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000799 const lldb_private::ConstString &result_name,
800 lldb_private::TypeFromParser result_type,
801 Function &llvm_function,
Sean Callanan175a0d02012-01-24 22:06:48 +0000802 Module &llvm_module,
803 lldb_private::Error &err)
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000804{
Sean Callanan175a0d02012-01-24 22:06:48 +0000805 if (supportsFunction (llvm_function, err))
Sean Callanan182bd6c2013-04-17 18:07:40 +0000806 return runOnFunction(decl_map,
807 memory_map,
808 error_stream,
809 result,
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000810 result_name,
811 result_type,
812 llvm_function,
Sean Callanan175a0d02012-01-24 22:06:48 +0000813 llvm_module,
814 err);
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000815 else
816 return false;
817}
818
Sean Callanan175a0d02012-01-24 22:06:48 +0000819static const char *unsupported_opcode_error = "Interpreter doesn't handle one of the expression's opcodes";
820static const char *interpreter_initialization_error = "Interpreter couldn't be initialized";
821static const char *interpreter_internal_error = "Interpreter encountered an internal error";
822static const char *bad_value_error = "Interpreter couldn't resolve a value during execution";
823static const char *memory_allocation_error = "Interpreter couldn't allocate memory";
824static const char *memory_write_error = "Interpreter couldn't write to memory";
825static const char *memory_read_error = "Interpreter couldn't read from memory";
826static const char *infinite_loop_error = "Interpreter ran for too many cycles";
Sean Callanan5b26f272012-02-04 08:49:35 +0000827static const char *bad_result_error = "Result of expression is in bad memory";
Sean Callanan175a0d02012-01-24 22:06:48 +0000828
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000829bool
Sean Callanan175a0d02012-01-24 22:06:48 +0000830IRInterpreter::supportsFunction (Function &llvm_function,
831 lldb_private::Error &err)
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000832{
Greg Clayton5160ce52013-03-27 23:08:40 +0000833 lldb_private::Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000834
835 for (Function::iterator bbi = llvm_function.begin(), bbe = llvm_function.end();
836 bbi != bbe;
837 ++bbi)
838 {
839 for (BasicBlock::iterator ii = bbi->begin(), ie = bbi->end();
840 ii != ie;
841 ++ii)
842 {
843 switch (ii->getOpcode())
844 {
845 default:
846 {
847 if (log)
848 log->Printf("Unsupported instruction: %s", PrintValue(ii).c_str());
Sean Callanan175a0d02012-01-24 22:06:48 +0000849 err.SetErrorToGenericError();
850 err.SetErrorString(unsupported_opcode_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000851 return false;
852 }
853 case Instruction::Add:
854 case Instruction::Alloca:
855 case Instruction::BitCast:
856 case Instruction::Br:
857 case Instruction::GetElementPtr:
858 break;
859 case Instruction::ICmp:
860 {
861 ICmpInst *icmp_inst = dyn_cast<ICmpInst>(ii);
862
863 if (!icmp_inst)
Sean Callanan175a0d02012-01-24 22:06:48 +0000864 {
865 err.SetErrorToGenericError();
866 err.SetErrorString(interpreter_internal_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000867 return false;
Sean Callanan175a0d02012-01-24 22:06:48 +0000868 }
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000869
870 switch (icmp_inst->getPredicate())
871 {
872 default:
873 {
874 if (log)
875 log->Printf("Unsupported ICmp predicate: %s", PrintValue(ii).c_str());
Sean Callanan175a0d02012-01-24 22:06:48 +0000876
877 err.SetErrorToGenericError();
878 err.SetErrorString(unsupported_opcode_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000879 return false;
880 }
881 case CmpInst::ICMP_EQ:
882 case CmpInst::ICMP_NE:
883 case CmpInst::ICMP_UGT:
884 case CmpInst::ICMP_UGE:
885 case CmpInst::ICMP_ULT:
886 case CmpInst::ICMP_ULE:
887 case CmpInst::ICMP_SGT:
888 case CmpInst::ICMP_SGE:
889 case CmpInst::ICMP_SLT:
890 case CmpInst::ICMP_SLE:
891 break;
892 }
893 }
894 break;
Sean Callanan087f4372013-01-09 22:44:41 +0000895 case Instruction::And:
896 case Instruction::AShr:
Sean Callanan80c48c12011-10-21 05:18:02 +0000897 case Instruction::IntToPtr:
Sean Callanan2abffe02012-12-01 00:09:34 +0000898 case Instruction::PtrToInt:
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000899 case Instruction::Load:
Sean Callanan087f4372013-01-09 22:44:41 +0000900 case Instruction::LShr:
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000901 case Instruction::Mul:
Sean Callanan087f4372013-01-09 22:44:41 +0000902 case Instruction::Or:
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000903 case Instruction::Ret:
904 case Instruction::SDiv:
Sean Callanan087f4372013-01-09 22:44:41 +0000905 case Instruction::Shl:
Sean Callananf466a6e2012-12-21 22:27:55 +0000906 case Instruction::SRem:
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000907 case Instruction::Store:
908 case Instruction::Sub:
909 case Instruction::UDiv:
Sean Callananf466a6e2012-12-21 22:27:55 +0000910 case Instruction::URem:
Sean Callanan087f4372013-01-09 22:44:41 +0000911 case Instruction::Xor:
Sean Callanan1ef77432012-04-23 17:25:38 +0000912 case Instruction::ZExt:
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000913 break;
914 }
915 }
916 }
917
918 return true;
919}
920
921bool
Sean Callanan182bd6c2013-04-17 18:07:40 +0000922IRInterpreter::runOnFunction (lldb_private::ClangExpressionDeclMap *decl_map,
923 lldb_private::IRMemoryMap &memory_map,
924 lldb_private::Stream *error_stream,
925 lldb::ClangExpressionVariableSP &result,
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000926 const lldb_private::ConstString &result_name,
927 lldb_private::TypeFromParser result_type,
928 Function &llvm_function,
Sean Callanan175a0d02012-01-24 22:06:48 +0000929 Module &llvm_module,
930 lldb_private::Error &err)
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000931{
Greg Clayton5160ce52013-03-27 23:08:40 +0000932 lldb_private::Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000933
Micah Villmow8468dbe2012-10-08 16:28:57 +0000934 DataLayout target_data(&llvm_module);
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000935
Sean Callanan182bd6c2013-04-17 18:07:40 +0000936 InterpreterStackFrame frame(target_data, decl_map, memory_map);
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000937
938 uint32_t num_insts = 0;
939
940 frame.Jump(llvm_function.begin());
941
942 while (frame.m_ii != frame.m_ie && (++num_insts < 4096))
943 {
944 const Instruction *inst = frame.m_ii;
945
946 if (log)
947 log->Printf("Interpreting %s", PrintValue(inst).c_str());
948
949 switch (inst->getOpcode())
950 {
951 default:
952 break;
953 case Instruction::Add:
954 case Instruction::Sub:
955 case Instruction::Mul:
956 case Instruction::SDiv:
957 case Instruction::UDiv:
Sean Callananf466a6e2012-12-21 22:27:55 +0000958 case Instruction::SRem:
959 case Instruction::URem:
Sean Callanan087f4372013-01-09 22:44:41 +0000960 case Instruction::Shl:
961 case Instruction::LShr:
962 case Instruction::AShr:
963 case Instruction::And:
964 case Instruction::Or:
965 case Instruction::Xor:
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000966 {
967 const BinaryOperator *bin_op = dyn_cast<BinaryOperator>(inst);
968
969 if (!bin_op)
970 {
971 if (log)
972 log->Printf("getOpcode() returns %s, but instruction is not a BinaryOperator", inst->getOpcodeName());
Sean Callanan175a0d02012-01-24 22:06:48 +0000973 err.SetErrorToGenericError();
974 err.SetErrorString(interpreter_internal_error);
975 return false;
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000976 }
977
978 Value *lhs = inst->getOperand(0);
979 Value *rhs = inst->getOperand(1);
980
981 lldb_private::Scalar L;
982 lldb_private::Scalar R;
983
984 if (!frame.EvaluateValue(L, lhs, llvm_module))
985 {
986 if (log)
987 log->Printf("Couldn't evaluate %s", PrintValue(lhs).c_str());
Sean Callanan175a0d02012-01-24 22:06:48 +0000988 err.SetErrorToGenericError();
989 err.SetErrorString(bad_value_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000990 return false;
991 }
992
993 if (!frame.EvaluateValue(R, rhs, llvm_module))
994 {
995 if (log)
996 log->Printf("Couldn't evaluate %s", PrintValue(rhs).c_str());
Sean Callanan175a0d02012-01-24 22:06:48 +0000997 err.SetErrorToGenericError();
998 err.SetErrorString(bad_value_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +0000999 return false;
1000 }
1001
1002 lldb_private::Scalar result;
1003
1004 switch (inst->getOpcode())
1005 {
1006 default:
1007 break;
1008 case Instruction::Add:
1009 result = L + R;
1010 break;
1011 case Instruction::Mul:
1012 result = L * R;
1013 break;
1014 case Instruction::Sub:
1015 result = L - R;
1016 break;
1017 case Instruction::SDiv:
1018 result = L / R;
1019 break;
1020 case Instruction::UDiv:
1021 result = L.GetRawBits64(0) / R.GetRawBits64(1);
1022 break;
Sean Callananf466a6e2012-12-21 22:27:55 +00001023 case Instruction::SRem:
1024 result = L % R;
1025 break;
1026 case Instruction::URem:
1027 result = L.GetRawBits64(0) % R.GetRawBits64(1);
1028 break;
Sean Callanan087f4372013-01-09 22:44:41 +00001029 case Instruction::Shl:
1030 result = L << R;
1031 break;
1032 case Instruction::AShr:
1033 result = L >> R;
1034 break;
1035 case Instruction::LShr:
1036 result = L;
1037 result.ShiftRightLogical(R);
1038 break;
1039 case Instruction::And:
1040 result = L & R;
1041 break;
1042 case Instruction::Or:
1043 result = L | R;
1044 break;
1045 case Instruction::Xor:
1046 result = L ^ R;
1047 break;
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001048 }
1049
1050 frame.AssignValue(inst, result, llvm_module);
1051
1052 if (log)
1053 {
1054 log->Printf("Interpreted a %s", inst->getOpcodeName());
1055 log->Printf(" L : %s", frame.SummarizeValue(lhs).c_str());
1056 log->Printf(" R : %s", frame.SummarizeValue(rhs).c_str());
1057 log->Printf(" = : %s", frame.SummarizeValue(inst).c_str());
1058 }
1059 }
1060 break;
1061 case Instruction::Alloca:
1062 {
1063 const AllocaInst *alloca_inst = dyn_cast<AllocaInst>(inst);
1064
1065 if (!alloca_inst)
1066 {
1067 if (log)
1068 log->Printf("getOpcode() returns Alloca, but instruction is not an AllocaInst");
Sean Callanan175a0d02012-01-24 22:06:48 +00001069 err.SetErrorToGenericError();
1070 err.SetErrorString(interpreter_internal_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001071 return false;
1072 }
1073
1074 if (alloca_inst->isArrayAllocation())
1075 {
1076 if (log)
1077 log->Printf("AllocaInsts are not handled if isArrayAllocation() is true");
Sean Callanan175a0d02012-01-24 22:06:48 +00001078 err.SetErrorToGenericError();
1079 err.SetErrorString(unsupported_opcode_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001080 return false;
1081 }
1082
1083 // The semantics of Alloca are:
1084 // Create a region R of virtual memory of type T, backed by a data buffer
1085 // Create a region P of virtual memory of type T*, backed by a data buffer
1086 // Write the virtual address of R into P
1087
1088 Type *T = alloca_inst->getAllocatedType();
1089 Type *Tptr = alloca_inst->getType();
1090
Sean Callanan08052af2013-04-17 07:50:58 +00001091 lldb::addr_t R = frame.Malloc(T);
1092
1093 if (R == LLDB_INVALID_ADDRESS)
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001094 {
1095 if (log)
1096 log->Printf("Couldn't allocate memory for an AllocaInst");
Sean Callanan175a0d02012-01-24 22:06:48 +00001097 err.SetErrorToGenericError();
1098 err.SetErrorString(memory_allocation_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001099 return false;
1100 }
1101
Sean Callanan08052af2013-04-17 07:50:58 +00001102 lldb::addr_t P = frame.Malloc(Tptr);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001103
Sean Callanan08052af2013-04-17 07:50:58 +00001104 if (P == LLDB_INVALID_ADDRESS)
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001105 {
1106 if (log)
1107 log->Printf("Couldn't allocate the result pointer for an AllocaInst");
Sean Callanan175a0d02012-01-24 22:06:48 +00001108 err.SetErrorToGenericError();
1109 err.SetErrorString(memory_allocation_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001110 return false;
1111 }
1112
Sean Callanan08052af2013-04-17 07:50:58 +00001113 lldb_private::Error write_error;
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001114
Sean Callanan182bd6c2013-04-17 18:07:40 +00001115 memory_map.WritePointerToMemory(P, R, write_error);
Sean Callanan08052af2013-04-17 07:50:58 +00001116
1117 if (!write_error.Success())
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001118 {
1119 if (log)
Sean Callanan175a0d02012-01-24 22:06:48 +00001120 log->Printf("Couldn't write the result pointer for an AllocaInst");
1121 err.SetErrorToGenericError();
1122 err.SetErrorString(memory_write_error);
Sean Callanan08052af2013-04-17 07:50:58 +00001123 lldb_private::Error free_error;
Sean Callanan182bd6c2013-04-17 18:07:40 +00001124 memory_map.Free(P, free_error);
1125 memory_map.Free(R, free_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001126 return false;
1127 }
1128
1129 frame.m_values[alloca_inst] = P;
1130
1131 if (log)
1132 {
1133 log->Printf("Interpreted an AllocaInst");
Sean Callanan08052af2013-04-17 07:50:58 +00001134 log->Printf(" R : 0x%llx", R);
1135 log->Printf(" P : 0x%llx", P);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001136 }
1137 }
1138 break;
1139 case Instruction::BitCast:
Sean Callanan1ef77432012-04-23 17:25:38 +00001140 case Instruction::ZExt:
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001141 {
Sean Callanan1ef77432012-04-23 17:25:38 +00001142 const CastInst *cast_inst = dyn_cast<CastInst>(inst);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001143
Sean Callanan1ef77432012-04-23 17:25:38 +00001144 if (!cast_inst)
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001145 {
1146 if (log)
Sean Callanan1ef77432012-04-23 17:25:38 +00001147 log->Printf("getOpcode() returns %s, but instruction is not a BitCastInst", cast_inst->getOpcodeName());
Sean Callanan175a0d02012-01-24 22:06:48 +00001148 err.SetErrorToGenericError();
1149 err.SetErrorString(interpreter_internal_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001150 return false;
1151 }
1152
Sean Callanan1ef77432012-04-23 17:25:38 +00001153 Value *source = cast_inst->getOperand(0);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001154
1155 lldb_private::Scalar S;
1156
1157 if (!frame.EvaluateValue(S, source, llvm_module))
1158 {
1159 if (log)
1160 log->Printf("Couldn't evaluate %s", PrintValue(source).c_str());
Sean Callanan175a0d02012-01-24 22:06:48 +00001161 err.SetErrorToGenericError();
1162 err.SetErrorString(bad_value_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001163 return false;
1164 }
1165
1166 frame.AssignValue(inst, S, llvm_module);
1167 }
1168 break;
1169 case Instruction::Br:
1170 {
1171 const BranchInst *br_inst = dyn_cast<BranchInst>(inst);
1172
1173 if (!br_inst)
1174 {
1175 if (log)
1176 log->Printf("getOpcode() returns Br, but instruction is not a BranchInst");
Sean Callanan175a0d02012-01-24 22:06:48 +00001177 err.SetErrorToGenericError();
1178 err.SetErrorString(interpreter_internal_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001179 return false;
1180 }
1181
1182 if (br_inst->isConditional())
1183 {
1184 Value *condition = br_inst->getCondition();
1185
1186 lldb_private::Scalar C;
1187
1188 if (!frame.EvaluateValue(C, condition, llvm_module))
1189 {
1190 if (log)
1191 log->Printf("Couldn't evaluate %s", PrintValue(condition).c_str());
Sean Callanan175a0d02012-01-24 22:06:48 +00001192 err.SetErrorToGenericError();
1193 err.SetErrorString(bad_value_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001194 return false;
1195 }
1196
1197 if (C.GetRawBits64(0))
1198 frame.Jump(br_inst->getSuccessor(0));
1199 else
1200 frame.Jump(br_inst->getSuccessor(1));
1201
1202 if (log)
1203 {
1204 log->Printf("Interpreted a BrInst with a condition");
1205 log->Printf(" cond : %s", frame.SummarizeValue(condition).c_str());
1206 }
1207 }
1208 else
1209 {
1210 frame.Jump(br_inst->getSuccessor(0));
1211
1212 if (log)
1213 {
1214 log->Printf("Interpreted a BrInst with no condition");
1215 }
1216 }
1217 }
1218 continue;
1219 case Instruction::GetElementPtr:
1220 {
1221 const GetElementPtrInst *gep_inst = dyn_cast<GetElementPtrInst>(inst);
1222
1223 if (!gep_inst)
1224 {
1225 if (log)
1226 log->Printf("getOpcode() returns GetElementPtr, but instruction is not a GetElementPtrInst");
Sean Callanan175a0d02012-01-24 22:06:48 +00001227 err.SetErrorToGenericError();
1228 err.SetErrorString(interpreter_internal_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001229 return false;
1230 }
1231
1232 const Value *pointer_operand = gep_inst->getPointerOperand();
1233 Type *pointer_type = pointer_operand->getType();
1234
1235 lldb_private::Scalar P;
1236
1237 if (!frame.EvaluateValue(P, pointer_operand, llvm_module))
Sean Callanan175a0d02012-01-24 22:06:48 +00001238 {
1239 if (log)
1240 log->Printf("Couldn't evaluate %s", PrintValue(pointer_operand).c_str());
1241 err.SetErrorToGenericError();
1242 err.SetErrorString(bad_value_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001243 return false;
Sean Callanan175a0d02012-01-24 22:06:48 +00001244 }
1245
Sean Callanan3f548132012-02-29 17:57:18 +00001246 typedef SmallVector <Value *, 8> IndexVector;
1247 typedef IndexVector::iterator IndexIterator;
1248
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001249 SmallVector <Value *, 8> indices (gep_inst->idx_begin(),
1250 gep_inst->idx_end());
1251
Sean Callanan3f548132012-02-29 17:57:18 +00001252 SmallVector <Value *, 8> const_indices;
1253
1254 for (IndexIterator ii = indices.begin(), ie = indices.end();
1255 ii != ie;
1256 ++ii)
1257 {
1258 ConstantInt *constant_index = dyn_cast<ConstantInt>(*ii);
1259
1260 if (!constant_index)
1261 {
1262 lldb_private::Scalar I;
1263
1264 if (!frame.EvaluateValue(I, *ii, llvm_module))
1265 {
1266 if (log)
1267 log->Printf("Couldn't evaluate %s", PrintValue(*ii).c_str());
1268 err.SetErrorToGenericError();
1269 err.SetErrorString(bad_value_error);
1270 return false;
1271 }
1272
1273 if (log)
1274 log->Printf("Evaluated constant index %s as %llu", PrintValue(*ii).c_str(), I.ULongLong(LLDB_INVALID_ADDRESS));
1275
1276 constant_index = cast<ConstantInt>(ConstantInt::get((*ii)->getType(), I.ULongLong(LLDB_INVALID_ADDRESS)));
1277 }
1278
1279 const_indices.push_back(constant_index);
1280 }
1281
1282 uint64_t offset = target_data.getIndexedOffset(pointer_type, const_indices);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001283
1284 lldb_private::Scalar Poffset = P + offset;
1285
1286 frame.AssignValue(inst, Poffset, llvm_module);
1287
1288 if (log)
1289 {
1290 log->Printf("Interpreted a GetElementPtrInst");
1291 log->Printf(" P : %s", frame.SummarizeValue(pointer_operand).c_str());
1292 log->Printf(" Poffset : %s", frame.SummarizeValue(inst).c_str());
1293 }
1294 }
1295 break;
1296 case Instruction::ICmp:
1297 {
1298 const ICmpInst *icmp_inst = dyn_cast<ICmpInst>(inst);
1299
1300 if (!icmp_inst)
1301 {
1302 if (log)
1303 log->Printf("getOpcode() returns ICmp, but instruction is not an ICmpInst");
Sean Callanan175a0d02012-01-24 22:06:48 +00001304 err.SetErrorToGenericError();
1305 err.SetErrorString(interpreter_internal_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001306 return false;
1307 }
1308
1309 CmpInst::Predicate predicate = icmp_inst->getPredicate();
1310
1311 Value *lhs = inst->getOperand(0);
1312 Value *rhs = inst->getOperand(1);
1313
1314 lldb_private::Scalar L;
1315 lldb_private::Scalar R;
1316
1317 if (!frame.EvaluateValue(L, lhs, llvm_module))
1318 {
1319 if (log)
1320 log->Printf("Couldn't evaluate %s", PrintValue(lhs).c_str());
Sean Callanan175a0d02012-01-24 22:06:48 +00001321 err.SetErrorToGenericError();
1322 err.SetErrorString(bad_value_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001323 return false;
1324 }
1325
1326 if (!frame.EvaluateValue(R, rhs, llvm_module))
1327 {
1328 if (log)
1329 log->Printf("Couldn't evaluate %s", PrintValue(rhs).c_str());
Sean Callanan175a0d02012-01-24 22:06:48 +00001330 err.SetErrorToGenericError();
1331 err.SetErrorString(bad_value_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001332 return false;
1333 }
1334
1335 lldb_private::Scalar result;
1336
1337 switch (predicate)
1338 {
1339 default:
1340 return false;
1341 case CmpInst::ICMP_EQ:
1342 result = (L == R);
1343 break;
1344 case CmpInst::ICMP_NE:
1345 result = (L != R);
1346 break;
1347 case CmpInst::ICMP_UGT:
1348 result = (L.GetRawBits64(0) > R.GetRawBits64(0));
1349 break;
1350 case CmpInst::ICMP_UGE:
1351 result = (L.GetRawBits64(0) >= R.GetRawBits64(0));
1352 break;
1353 case CmpInst::ICMP_ULT:
1354 result = (L.GetRawBits64(0) < R.GetRawBits64(0));
1355 break;
1356 case CmpInst::ICMP_ULE:
1357 result = (L.GetRawBits64(0) <= R.GetRawBits64(0));
1358 break;
1359 case CmpInst::ICMP_SGT:
1360 result = (L > R);
1361 break;
1362 case CmpInst::ICMP_SGE:
1363 result = (L >= R);
1364 break;
1365 case CmpInst::ICMP_SLT:
1366 result = (L < R);
1367 break;
1368 case CmpInst::ICMP_SLE:
1369 result = (L <= R);
1370 break;
1371 }
1372
1373 frame.AssignValue(inst, result, llvm_module);
1374
1375 if (log)
1376 {
1377 log->Printf("Interpreted an ICmpInst");
1378 log->Printf(" L : %s", frame.SummarizeValue(lhs).c_str());
1379 log->Printf(" R : %s", frame.SummarizeValue(rhs).c_str());
1380 log->Printf(" = : %s", frame.SummarizeValue(inst).c_str());
1381 }
1382 }
1383 break;
Sean Callanan80c48c12011-10-21 05:18:02 +00001384 case Instruction::IntToPtr:
1385 {
1386 const IntToPtrInst *int_to_ptr_inst = dyn_cast<IntToPtrInst>(inst);
1387
1388 if (!int_to_ptr_inst)
1389 {
1390 if (log)
1391 log->Printf("getOpcode() returns IntToPtr, but instruction is not an IntToPtrInst");
Sean Callanan175a0d02012-01-24 22:06:48 +00001392 err.SetErrorToGenericError();
1393 err.SetErrorString(interpreter_internal_error);
Sean Callanan80c48c12011-10-21 05:18:02 +00001394 return false;
1395 }
1396
1397 Value *src_operand = int_to_ptr_inst->getOperand(0);
1398
1399 lldb_private::Scalar I;
1400
1401 if (!frame.EvaluateValue(I, src_operand, llvm_module))
Sean Callanan175a0d02012-01-24 22:06:48 +00001402 {
1403 if (log)
1404 log->Printf("Couldn't evaluate %s", PrintValue(src_operand).c_str());
1405 err.SetErrorToGenericError();
1406 err.SetErrorString(bad_value_error);
Sean Callanan80c48c12011-10-21 05:18:02 +00001407 return false;
Sean Callanan175a0d02012-01-24 22:06:48 +00001408 }
Sean Callanan80c48c12011-10-21 05:18:02 +00001409
1410 frame.AssignValue(inst, I, llvm_module);
1411
1412 if (log)
1413 {
1414 log->Printf("Interpreted an IntToPtr");
1415 log->Printf(" Src : %s", frame.SummarizeValue(src_operand).c_str());
1416 log->Printf(" = : %s", frame.SummarizeValue(inst).c_str());
1417 }
1418 }
1419 break;
Sean Callanan2abffe02012-12-01 00:09:34 +00001420 case Instruction::PtrToInt:
1421 {
1422 const PtrToIntInst *ptr_to_int_inst = dyn_cast<PtrToIntInst>(inst);
1423
1424 if (!ptr_to_int_inst)
1425 {
1426 if (log)
1427 log->Printf("getOpcode() returns PtrToInt, but instruction is not an PtrToIntInst");
1428 err.SetErrorToGenericError();
1429 err.SetErrorString(interpreter_internal_error);
1430 return false;
1431 }
1432
1433 Value *src_operand = ptr_to_int_inst->getOperand(0);
1434
1435 lldb_private::Scalar I;
1436
1437 if (!frame.EvaluateValue(I, src_operand, llvm_module))
1438 {
1439 if (log)
1440 log->Printf("Couldn't evaluate %s", PrintValue(src_operand).c_str());
1441 err.SetErrorToGenericError();
1442 err.SetErrorString(bad_value_error);
1443 return false;
1444 }
1445
1446 frame.AssignValue(inst, I, llvm_module);
1447
1448 if (log)
1449 {
1450 log->Printf("Interpreted a PtrToInt");
1451 log->Printf(" Src : %s", frame.SummarizeValue(src_operand).c_str());
1452 log->Printf(" = : %s", frame.SummarizeValue(inst).c_str());
1453 }
1454 }
1455 break;
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001456 case Instruction::Load:
1457 {
1458 const LoadInst *load_inst = dyn_cast<LoadInst>(inst);
1459
1460 if (!load_inst)
1461 {
1462 if (log)
1463 log->Printf("getOpcode() returns Load, but instruction is not a LoadInst");
Sean Callanan175a0d02012-01-24 22:06:48 +00001464 err.SetErrorToGenericError();
1465 err.SetErrorString(interpreter_internal_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001466 return false;
1467 }
1468
1469 // The semantics of Load are:
1470 // Create a region D that will contain the loaded data
1471 // Resolve the region P containing a pointer
1472 // Dereference P to get the region R that the data should be loaded from
1473 // Transfer a unit of type type(D) from R to D
1474
1475 const Value *pointer_operand = load_inst->getPointerOperand();
1476
1477 Type *pointer_ty = pointer_operand->getType();
1478 PointerType *pointer_ptr_ty = dyn_cast<PointerType>(pointer_ty);
1479 if (!pointer_ptr_ty)
Sean Callanan175a0d02012-01-24 22:06:48 +00001480 {
1481 if (log)
1482 log->Printf("getPointerOperand()->getType() is not a PointerType");
1483 err.SetErrorToGenericError();
1484 err.SetErrorString(interpreter_internal_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001485 return false;
Sean Callanan175a0d02012-01-24 22:06:48 +00001486 }
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001487 Type *target_ty = pointer_ptr_ty->getElementType();
1488
Sean Callanan08052af2013-04-17 07:50:58 +00001489 lldb::addr_t D = frame.ResolveValue(load_inst, llvm_module);
1490 lldb::addr_t P = frame.ResolveValue(pointer_operand, llvm_module);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001491
Sean Callanan08052af2013-04-17 07:50:58 +00001492 if (D == LLDB_INVALID_ADDRESS)
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001493 {
1494 if (log)
1495 log->Printf("LoadInst's value doesn't resolve to anything");
Sean Callanan175a0d02012-01-24 22:06:48 +00001496 err.SetErrorToGenericError();
1497 err.SetErrorString(bad_value_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001498 return false;
1499 }
1500
Sean Callanan08052af2013-04-17 07:50:58 +00001501 if (P == LLDB_INVALID_ADDRESS)
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001502 {
1503 if (log)
1504 log->Printf("LoadInst's pointer doesn't resolve to anything");
Sean Callanan175a0d02012-01-24 22:06:48 +00001505 err.SetErrorToGenericError();
1506 err.SetErrorString(bad_value_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001507 return false;
1508 }
1509
Sean Callanan08052af2013-04-17 07:50:58 +00001510 lldb::addr_t R;
1511 lldb_private::Error read_error;
Sean Callanan182bd6c2013-04-17 18:07:40 +00001512 memory_map.ReadPointerFromMemory(&R, P, read_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001513
Sean Callanan08052af2013-04-17 07:50:58 +00001514 if (!read_error.Success())
Sean Callanan80c48c12011-10-21 05:18:02 +00001515 {
Sean Callanan08052af2013-04-17 07:50:58 +00001516 if (log)
1517 log->Printf("Couldn't read the address to be loaded for a LoadInst");
1518 err.SetErrorToGenericError();
1519 err.SetErrorString(memory_read_error);
1520 return false;
Sean Callanan80c48c12011-10-21 05:18:02 +00001521 }
Sean Callanan08052af2013-04-17 07:50:58 +00001522
1523 size_t target_size = target_data.getTypeStoreSize(target_ty);
1524 lldb_private::DataBufferHeap buffer(target_size, 0);
1525
1526 read_error.Clear();
Sean Callanan182bd6c2013-04-17 18:07:40 +00001527 memory_map.ReadMemory(buffer.GetBytes(), R, buffer.GetByteSize(), read_error);
Sean Callanan08052af2013-04-17 07:50:58 +00001528 if (!read_error.Success())
Sean Callanan80c48c12011-10-21 05:18:02 +00001529 {
Sean Callanan08052af2013-04-17 07:50:58 +00001530 if (log)
1531 log->Printf("Couldn't read from a region on behalf of a LoadInst");
1532 err.SetErrorToGenericError();
1533 err.SetErrorString(memory_read_error);
1534 return false;
1535 }
1536
1537 lldb_private::Error write_error;
Sean Callanan182bd6c2013-04-17 18:07:40 +00001538 memory_map.WriteMemory(D, buffer.GetBytes(), buffer.GetByteSize(), write_error);
Sean Callanan08052af2013-04-17 07:50:58 +00001539 if (!write_error.Success())
1540 {
1541 if (log)
1542 log->Printf("Couldn't write to a region on behalf of a LoadInst");
1543 err.SetErrorToGenericError();
1544 err.SetErrorString(memory_read_error);
1545 return false;
Sean Callanan80c48c12011-10-21 05:18:02 +00001546 }
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001547
1548 if (log)
1549 {
1550 log->Printf("Interpreted a LoadInst");
Sean Callanan08052af2013-04-17 07:50:58 +00001551 log->Printf(" P : 0x%llx", P);
1552 log->Printf(" R : 0x%llx", R);
1553 log->Printf(" D : 0x%llx", D);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001554 }
1555 }
1556 break;
1557 case Instruction::Ret:
1558 {
Sean Callanan08052af2013-04-17 07:50:58 +00001559 frame.RestoreLLDBValues();
1560
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001561 if (result_name.IsEmpty())
1562 return true;
1563
1564 GlobalValue *result_value = llvm_module.getNamedValue(result_name.GetCString());
Sean Callanan5b26f272012-02-04 08:49:35 +00001565
1566 if (!frame.ConstructResult(result, result_value, result_name, result_type, llvm_module))
1567 {
1568 if (log)
1569 log->Printf("Couldn't construct the expression's result");
1570 err.SetErrorToGenericError();
1571 err.SetErrorString(bad_result_error);
1572 return false;
1573 }
1574
1575 return true;
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001576 }
1577 case Instruction::Store:
1578 {
1579 const StoreInst *store_inst = dyn_cast<StoreInst>(inst);
1580
1581 if (!store_inst)
1582 {
1583 if (log)
1584 log->Printf("getOpcode() returns Store, but instruction is not a StoreInst");
Sean Callanan175a0d02012-01-24 22:06:48 +00001585 err.SetErrorToGenericError();
1586 err.SetErrorString(interpreter_internal_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001587 return false;
1588 }
1589
1590 // The semantics of Store are:
1591 // Resolve the region D containing the data to be stored
1592 // Resolve the region P containing a pointer
1593 // Dereference P to get the region R that the data should be stored in
1594 // Transfer a unit of type type(D) from D to R
1595
1596 const Value *value_operand = store_inst->getValueOperand();
1597 const Value *pointer_operand = store_inst->getPointerOperand();
1598
1599 Type *pointer_ty = pointer_operand->getType();
1600 PointerType *pointer_ptr_ty = dyn_cast<PointerType>(pointer_ty);
1601 if (!pointer_ptr_ty)
1602 return false;
1603 Type *target_ty = pointer_ptr_ty->getElementType();
1604
Sean Callanan08052af2013-04-17 07:50:58 +00001605 lldb::addr_t D = frame.ResolveValue(value_operand, llvm_module);
1606 lldb::addr_t P = frame.ResolveValue(pointer_operand, llvm_module);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001607
Sean Callanan08052af2013-04-17 07:50:58 +00001608 if (D == LLDB_INVALID_ADDRESS)
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001609 {
1610 if (log)
1611 log->Printf("StoreInst's value doesn't resolve to anything");
Sean Callanan175a0d02012-01-24 22:06:48 +00001612 err.SetErrorToGenericError();
1613 err.SetErrorString(bad_value_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001614 return false;
1615 }
1616
Sean Callanan08052af2013-04-17 07:50:58 +00001617 if (P == LLDB_INVALID_ADDRESS)
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001618 {
1619 if (log)
1620 log->Printf("StoreInst's pointer doesn't resolve to anything");
Sean Callanan175a0d02012-01-24 22:06:48 +00001621 err.SetErrorToGenericError();
1622 err.SetErrorString(bad_value_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001623 return false;
1624 }
1625
Sean Callanan08052af2013-04-17 07:50:58 +00001626 lldb::addr_t R;
1627 lldb_private::Error read_error;
Sean Callanan182bd6c2013-04-17 18:07:40 +00001628 memory_map.ReadPointerFromMemory(&R, P, read_error);
Sean Callanan08052af2013-04-17 07:50:58 +00001629
1630 if (!read_error.Success())
1631 {
1632 if (log)
1633 log->Printf("Couldn't read the address to be loaded for a LoadInst");
1634 err.SetErrorToGenericError();
1635 err.SetErrorString(memory_read_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001636 return false;
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001637 }
1638
Sean Callanan08052af2013-04-17 07:50:58 +00001639 size_t target_size = target_data.getTypeStoreSize(target_ty);
1640 lldb_private::DataBufferHeap buffer(target_size, 0);
1641
1642 read_error.Clear();
Sean Callanan182bd6c2013-04-17 18:07:40 +00001643 memory_map.ReadMemory(buffer.GetBytes(), D, buffer.GetByteSize(), read_error);
Sean Callanan08052af2013-04-17 07:50:58 +00001644 if (!read_error.Success())
1645 {
1646 if (log)
1647 log->Printf("Couldn't read from a region on behalf of a StoreInst");
1648 err.SetErrorToGenericError();
1649 err.SetErrorString(memory_read_error);
1650 return false;
1651 }
1652
1653 lldb_private::Error write_error;
Sean Callanan182bd6c2013-04-17 18:07:40 +00001654 memory_map.WriteMemory(R, buffer.GetBytes(), buffer.GetByteSize(), write_error);
Sean Callanan08052af2013-04-17 07:50:58 +00001655 if (!write_error.Success())
1656 {
1657 if (log)
1658 log->Printf("Couldn't write to a region on behalf of a StoreInst");
1659 err.SetErrorToGenericError();
1660 err.SetErrorString(memory_read_error);
1661 return false;
1662 }
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001663
1664 if (log)
1665 {
1666 log->Printf("Interpreted a StoreInst");
Sean Callanan08052af2013-04-17 07:50:58 +00001667 log->Printf(" D : 0x%llx", D);
1668 log->Printf(" P : 0x%llx", P);
1669 log->Printf(" R : 0x%llx", R);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001670 }
1671 }
1672 break;
1673 }
1674
1675 ++frame.m_ii;
1676 }
1677
1678 if (num_insts >= 4096)
Sean Callanan175a0d02012-01-24 22:06:48 +00001679 {
1680 err.SetErrorToGenericError();
1681 err.SetErrorString(infinite_loop_error);
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001682 return false;
Sean Callanan175a0d02012-01-24 22:06:48 +00001683 }
1684
Sean Callanan3bfdaa22011-09-15 02:13:07 +00001685 return false;
Greg Claytond4e25522011-10-12 00:53:29 +00001686}
Sean Callanan14cb2aa2013-04-17 18:35:47 +00001687
1688// new api
1689
1690bool
1691IRInterpreter::CanInterpret (llvm::Module &module,
1692 llvm::Function &function,
1693 lldb_private::Error &error)
1694{
1695 return supportsFunction(function, error);
1696}
1697
1698bool
1699IRInterpreter::Interpret (llvm::Module &module,
1700 llvm::Function &function,
1701 lldb_private::IRMemoryMap &memory_map,
1702 lldb_private::Error &error)
1703{
1704 lldb_private::Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1705
1706 DataLayout data_layout(&module);
1707
1708 InterpreterStackFrame frame(data_layout, NULL, memory_map);
1709
1710 uint32_t num_insts = 0;
1711
1712 frame.Jump(function.begin());
1713
1714 while (frame.m_ii != frame.m_ie && (++num_insts < 4096))
1715 {
1716 const Instruction *inst = frame.m_ii;
1717
1718 if (log)
1719 log->Printf("Interpreting %s", PrintValue(inst).c_str());
1720
1721 switch (inst->getOpcode())
1722 {
1723 default:
1724 break;
1725 case Instruction::Add:
1726 case Instruction::Sub:
1727 case Instruction::Mul:
1728 case Instruction::SDiv:
1729 case Instruction::UDiv:
1730 case Instruction::SRem:
1731 case Instruction::URem:
1732 case Instruction::Shl:
1733 case Instruction::LShr:
1734 case Instruction::AShr:
1735 case Instruction::And:
1736 case Instruction::Or:
1737 case Instruction::Xor:
1738 {
1739 const BinaryOperator *bin_op = dyn_cast<BinaryOperator>(inst);
1740
1741 if (!bin_op)
1742 {
1743 if (log)
1744 log->Printf("getOpcode() returns %s, but instruction is not a BinaryOperator", inst->getOpcodeName());
1745 error.SetErrorToGenericError();
1746 error.SetErrorString(interpreter_internal_error);
1747 return false;
1748 }
1749
1750 Value *lhs = inst->getOperand(0);
1751 Value *rhs = inst->getOperand(1);
1752
1753 lldb_private::Scalar L;
1754 lldb_private::Scalar R;
1755
1756 if (!frame.EvaluateValue(L, lhs, module))
1757 {
1758 if (log)
1759 log->Printf("Couldn't evaluate %s", PrintValue(lhs).c_str());
1760 error.SetErrorToGenericError();
1761 error.SetErrorString(bad_value_error);
1762 return false;
1763 }
1764
1765 if (!frame.EvaluateValue(R, rhs, module))
1766 {
1767 if (log)
1768 log->Printf("Couldn't evaluate %s", PrintValue(rhs).c_str());
1769 error.SetErrorToGenericError();
1770 error.SetErrorString(bad_value_error);
1771 return false;
1772 }
1773
1774 lldb_private::Scalar result;
1775
1776 switch (inst->getOpcode())
1777 {
1778 default:
1779 break;
1780 case Instruction::Add:
1781 result = L + R;
1782 break;
1783 case Instruction::Mul:
1784 result = L * R;
1785 break;
1786 case Instruction::Sub:
1787 result = L - R;
1788 break;
1789 case Instruction::SDiv:
1790 result = L / R;
1791 break;
1792 case Instruction::UDiv:
1793 result = L.GetRawBits64(0) / R.GetRawBits64(1);
1794 break;
1795 case Instruction::SRem:
1796 result = L % R;
1797 break;
1798 case Instruction::URem:
1799 result = L.GetRawBits64(0) % R.GetRawBits64(1);
1800 break;
1801 case Instruction::Shl:
1802 result = L << R;
1803 break;
1804 case Instruction::AShr:
1805 result = L >> R;
1806 break;
1807 case Instruction::LShr:
1808 result = L;
1809 result.ShiftRightLogical(R);
1810 break;
1811 case Instruction::And:
1812 result = L & R;
1813 break;
1814 case Instruction::Or:
1815 result = L | R;
1816 break;
1817 case Instruction::Xor:
1818 result = L ^ R;
1819 break;
1820 }
1821
1822 frame.AssignValue(inst, result, module);
1823
1824 if (log)
1825 {
1826 log->Printf("Interpreted a %s", inst->getOpcodeName());
1827 log->Printf(" L : %s", frame.SummarizeValue(lhs).c_str());
1828 log->Printf(" R : %s", frame.SummarizeValue(rhs).c_str());
1829 log->Printf(" = : %s", frame.SummarizeValue(inst).c_str());
1830 }
1831 }
1832 break;
1833 case Instruction::Alloca:
1834 {
1835 const AllocaInst *alloca_inst = dyn_cast<AllocaInst>(inst);
1836
1837 if (!alloca_inst)
1838 {
1839 if (log)
1840 log->Printf("getOpcode() returns Alloca, but instruction is not an AllocaInst");
1841 error.SetErrorToGenericError();
1842 error.SetErrorString(interpreter_internal_error);
1843 return false;
1844 }
1845
1846 if (alloca_inst->isArrayAllocation())
1847 {
1848 if (log)
1849 log->Printf("AllocaInsts are not handled if isArrayAllocation() is true");
1850 error.SetErrorToGenericError();
1851 error.SetErrorString(unsupported_opcode_error);
1852 return false;
1853 }
1854
1855 // The semantics of Alloca are:
1856 // Create a region R of virtual memory of type T, backed by a data buffer
1857 // Create a region P of virtual memory of type T*, backed by a data buffer
1858 // Write the virtual address of R into P
1859
1860 Type *T = alloca_inst->getAllocatedType();
1861 Type *Tptr = alloca_inst->getType();
1862
1863 lldb::addr_t R = frame.Malloc(T);
1864
1865 if (R == LLDB_INVALID_ADDRESS)
1866 {
1867 if (log)
1868 log->Printf("Couldn't allocate memory for an AllocaInst");
1869 error.SetErrorToGenericError();
1870 error.SetErrorString(memory_allocation_error);
1871 return false;
1872 }
1873
1874 lldb::addr_t P = frame.Malloc(Tptr);
1875
1876 if (P == LLDB_INVALID_ADDRESS)
1877 {
1878 if (log)
1879 log->Printf("Couldn't allocate the result pointer for an AllocaInst");
1880 error.SetErrorToGenericError();
1881 error.SetErrorString(memory_allocation_error);
1882 return false;
1883 }
1884
1885 lldb_private::Error write_error;
1886
1887 memory_map.WritePointerToMemory(P, R, write_error);
1888
1889 if (!write_error.Success())
1890 {
1891 if (log)
1892 log->Printf("Couldn't write the result pointer for an AllocaInst");
1893 error.SetErrorToGenericError();
1894 error.SetErrorString(memory_write_error);
1895 lldb_private::Error free_error;
1896 memory_map.Free(P, free_error);
1897 memory_map.Free(R, free_error);
1898 return false;
1899 }
1900
1901 frame.m_values[alloca_inst] = P;
1902
1903 if (log)
1904 {
1905 log->Printf("Interpreted an AllocaInst");
1906 log->Printf(" R : 0x%llx", R);
1907 log->Printf(" P : 0x%llx", P);
1908 }
1909 }
1910 break;
1911 case Instruction::BitCast:
1912 case Instruction::ZExt:
1913 {
1914 const CastInst *cast_inst = dyn_cast<CastInst>(inst);
1915
1916 if (!cast_inst)
1917 {
1918 if (log)
1919 log->Printf("getOpcode() returns %s, but instruction is not a BitCastInst", cast_inst->getOpcodeName());
1920 error.SetErrorToGenericError();
1921 error.SetErrorString(interpreter_internal_error);
1922 return false;
1923 }
1924
1925 Value *source = cast_inst->getOperand(0);
1926
1927 lldb_private::Scalar S;
1928
1929 if (!frame.EvaluateValue(S, source, module))
1930 {
1931 if (log)
1932 log->Printf("Couldn't evaluate %s", PrintValue(source).c_str());
1933 error.SetErrorToGenericError();
1934 error.SetErrorString(bad_value_error);
1935 return false;
1936 }
1937
1938 frame.AssignValue(inst, S, module);
1939 }
1940 break;
1941 case Instruction::Br:
1942 {
1943 const BranchInst *br_inst = dyn_cast<BranchInst>(inst);
1944
1945 if (!br_inst)
1946 {
1947 if (log)
1948 log->Printf("getOpcode() returns Br, but instruction is not a BranchInst");
1949 error.SetErrorToGenericError();
1950 error.SetErrorString(interpreter_internal_error);
1951 return false;
1952 }
1953
1954 if (br_inst->isConditional())
1955 {
1956 Value *condition = br_inst->getCondition();
1957
1958 lldb_private::Scalar C;
1959
1960 if (!frame.EvaluateValue(C, condition, module))
1961 {
1962 if (log)
1963 log->Printf("Couldn't evaluate %s", PrintValue(condition).c_str());
1964 error.SetErrorToGenericError();
1965 error.SetErrorString(bad_value_error);
1966 return false;
1967 }
1968
1969 if (C.GetRawBits64(0))
1970 frame.Jump(br_inst->getSuccessor(0));
1971 else
1972 frame.Jump(br_inst->getSuccessor(1));
1973
1974 if (log)
1975 {
1976 log->Printf("Interpreted a BrInst with a condition");
1977 log->Printf(" cond : %s", frame.SummarizeValue(condition).c_str());
1978 }
1979 }
1980 else
1981 {
1982 frame.Jump(br_inst->getSuccessor(0));
1983
1984 if (log)
1985 {
1986 log->Printf("Interpreted a BrInst with no condition");
1987 }
1988 }
1989 }
1990 continue;
1991 case Instruction::GetElementPtr:
1992 {
1993 const GetElementPtrInst *gep_inst = dyn_cast<GetElementPtrInst>(inst);
1994
1995 if (!gep_inst)
1996 {
1997 if (log)
1998 log->Printf("getOpcode() returns GetElementPtr, but instruction is not a GetElementPtrInst");
1999 error.SetErrorToGenericError();
2000 error.SetErrorString(interpreter_internal_error);
2001 return false;
2002 }
2003
2004 const Value *pointer_operand = gep_inst->getPointerOperand();
2005 Type *pointer_type = pointer_operand->getType();
2006
2007 lldb_private::Scalar P;
2008
2009 if (!frame.EvaluateValue(P, pointer_operand, module))
2010 {
2011 if (log)
2012 log->Printf("Couldn't evaluate %s", PrintValue(pointer_operand).c_str());
2013 error.SetErrorToGenericError();
2014 error.SetErrorString(bad_value_error);
2015 return false;
2016 }
2017
2018 typedef SmallVector <Value *, 8> IndexVector;
2019 typedef IndexVector::iterator IndexIterator;
2020
2021 SmallVector <Value *, 8> indices (gep_inst->idx_begin(),
2022 gep_inst->idx_end());
2023
2024 SmallVector <Value *, 8> const_indices;
2025
2026 for (IndexIterator ii = indices.begin(), ie = indices.end();
2027 ii != ie;
2028 ++ii)
2029 {
2030 ConstantInt *constant_index = dyn_cast<ConstantInt>(*ii);
2031
2032 if (!constant_index)
2033 {
2034 lldb_private::Scalar I;
2035
2036 if (!frame.EvaluateValue(I, *ii, module))
2037 {
2038 if (log)
2039 log->Printf("Couldn't evaluate %s", PrintValue(*ii).c_str());
2040 error.SetErrorToGenericError();
2041 error.SetErrorString(bad_value_error);
2042 return false;
2043 }
2044
2045 if (log)
2046 log->Printf("Evaluated constant index %s as %llu", PrintValue(*ii).c_str(), I.ULongLong(LLDB_INVALID_ADDRESS));
2047
2048 constant_index = cast<ConstantInt>(ConstantInt::get((*ii)->getType(), I.ULongLong(LLDB_INVALID_ADDRESS)));
2049 }
2050
2051 const_indices.push_back(constant_index);
2052 }
2053
2054 uint64_t offset = data_layout.getIndexedOffset(pointer_type, const_indices);
2055
2056 lldb_private::Scalar Poffset = P + offset;
2057
2058 frame.AssignValue(inst, Poffset, module);
2059
2060 if (log)
2061 {
2062 log->Printf("Interpreted a GetElementPtrInst");
2063 log->Printf(" P : %s", frame.SummarizeValue(pointer_operand).c_str());
2064 log->Printf(" Poffset : %s", frame.SummarizeValue(inst).c_str());
2065 }
2066 }
2067 break;
2068 case Instruction::ICmp:
2069 {
2070 const ICmpInst *icmp_inst = dyn_cast<ICmpInst>(inst);
2071
2072 if (!icmp_inst)
2073 {
2074 if (log)
2075 log->Printf("getOpcode() returns ICmp, but instruction is not an ICmpInst");
2076 error.SetErrorToGenericError();
2077 error.SetErrorString(interpreter_internal_error);
2078 return false;
2079 }
2080
2081 CmpInst::Predicate predicate = icmp_inst->getPredicate();
2082
2083 Value *lhs = inst->getOperand(0);
2084 Value *rhs = inst->getOperand(1);
2085
2086 lldb_private::Scalar L;
2087 lldb_private::Scalar R;
2088
2089 if (!frame.EvaluateValue(L, lhs, module))
2090 {
2091 if (log)
2092 log->Printf("Couldn't evaluate %s", PrintValue(lhs).c_str());
2093 error.SetErrorToGenericError();
2094 error.SetErrorString(bad_value_error);
2095 return false;
2096 }
2097
2098 if (!frame.EvaluateValue(R, rhs, module))
2099 {
2100 if (log)
2101 log->Printf("Couldn't evaluate %s", PrintValue(rhs).c_str());
2102 error.SetErrorToGenericError();
2103 error.SetErrorString(bad_value_error);
2104 return false;
2105 }
2106
2107 lldb_private::Scalar result;
2108
2109 switch (predicate)
2110 {
2111 default:
2112 return false;
2113 case CmpInst::ICMP_EQ:
2114 result = (L == R);
2115 break;
2116 case CmpInst::ICMP_NE:
2117 result = (L != R);
2118 break;
2119 case CmpInst::ICMP_UGT:
2120 result = (L.GetRawBits64(0) > R.GetRawBits64(0));
2121 break;
2122 case CmpInst::ICMP_UGE:
2123 result = (L.GetRawBits64(0) >= R.GetRawBits64(0));
2124 break;
2125 case CmpInst::ICMP_ULT:
2126 result = (L.GetRawBits64(0) < R.GetRawBits64(0));
2127 break;
2128 case CmpInst::ICMP_ULE:
2129 result = (L.GetRawBits64(0) <= R.GetRawBits64(0));
2130 break;
2131 case CmpInst::ICMP_SGT:
2132 result = (L > R);
2133 break;
2134 case CmpInst::ICMP_SGE:
2135 result = (L >= R);
2136 break;
2137 case CmpInst::ICMP_SLT:
2138 result = (L < R);
2139 break;
2140 case CmpInst::ICMP_SLE:
2141 result = (L <= R);
2142 break;
2143 }
2144
2145 frame.AssignValue(inst, result, module);
2146
2147 if (log)
2148 {
2149 log->Printf("Interpreted an ICmpInst");
2150 log->Printf(" L : %s", frame.SummarizeValue(lhs).c_str());
2151 log->Printf(" R : %s", frame.SummarizeValue(rhs).c_str());
2152 log->Printf(" = : %s", frame.SummarizeValue(inst).c_str());
2153 }
2154 }
2155 break;
2156 case Instruction::IntToPtr:
2157 {
2158 const IntToPtrInst *int_to_ptr_inst = dyn_cast<IntToPtrInst>(inst);
2159
2160 if (!int_to_ptr_inst)
2161 {
2162 if (log)
2163 log->Printf("getOpcode() returns IntToPtr, but instruction is not an IntToPtrInst");
2164 error.SetErrorToGenericError();
2165 error.SetErrorString(interpreter_internal_error);
2166 return false;
2167 }
2168
2169 Value *src_operand = int_to_ptr_inst->getOperand(0);
2170
2171 lldb_private::Scalar I;
2172
2173 if (!frame.EvaluateValue(I, src_operand, module))
2174 {
2175 if (log)
2176 log->Printf("Couldn't evaluate %s", PrintValue(src_operand).c_str());
2177 error.SetErrorToGenericError();
2178 error.SetErrorString(bad_value_error);
2179 return false;
2180 }
2181
2182 frame.AssignValue(inst, I, module);
2183
2184 if (log)
2185 {
2186 log->Printf("Interpreted an IntToPtr");
2187 log->Printf(" Src : %s", frame.SummarizeValue(src_operand).c_str());
2188 log->Printf(" = : %s", frame.SummarizeValue(inst).c_str());
2189 }
2190 }
2191 break;
2192 case Instruction::PtrToInt:
2193 {
2194 const PtrToIntInst *ptr_to_int_inst = dyn_cast<PtrToIntInst>(inst);
2195
2196 if (!ptr_to_int_inst)
2197 {
2198 if (log)
2199 log->Printf("getOpcode() returns PtrToInt, but instruction is not an PtrToIntInst");
2200 error.SetErrorToGenericError();
2201 error.SetErrorString(interpreter_internal_error);
2202 return false;
2203 }
2204
2205 Value *src_operand = ptr_to_int_inst->getOperand(0);
2206
2207 lldb_private::Scalar I;
2208
2209 if (!frame.EvaluateValue(I, src_operand, module))
2210 {
2211 if (log)
2212 log->Printf("Couldn't evaluate %s", PrintValue(src_operand).c_str());
2213 error.SetErrorToGenericError();
2214 error.SetErrorString(bad_value_error);
2215 return false;
2216 }
2217
2218 frame.AssignValue(inst, I, module);
2219
2220 if (log)
2221 {
2222 log->Printf("Interpreted a PtrToInt");
2223 log->Printf(" Src : %s", frame.SummarizeValue(src_operand).c_str());
2224 log->Printf(" = : %s", frame.SummarizeValue(inst).c_str());
2225 }
2226 }
2227 break;
2228 case Instruction::Load:
2229 {
2230 const LoadInst *load_inst = dyn_cast<LoadInst>(inst);
2231
2232 if (!load_inst)
2233 {
2234 if (log)
2235 log->Printf("getOpcode() returns Load, but instruction is not a LoadInst");
2236 error.SetErrorToGenericError();
2237 error.SetErrorString(interpreter_internal_error);
2238 return false;
2239 }
2240
2241 // The semantics of Load are:
2242 // Create a region D that will contain the loaded data
2243 // Resolve the region P containing a pointer
2244 // Dereference P to get the region R that the data should be loaded from
2245 // Transfer a unit of type type(D) from R to D
2246
2247 const Value *pointer_operand = load_inst->getPointerOperand();
2248
2249 Type *pointer_ty = pointer_operand->getType();
2250 PointerType *pointer_ptr_ty = dyn_cast<PointerType>(pointer_ty);
2251 if (!pointer_ptr_ty)
2252 {
2253 if (log)
2254 log->Printf("getPointerOperand()->getType() is not a PointerType");
2255 error.SetErrorToGenericError();
2256 error.SetErrorString(interpreter_internal_error);
2257 return false;
2258 }
2259 Type *target_ty = pointer_ptr_ty->getElementType();
2260
2261 lldb::addr_t D = frame.ResolveValue(load_inst, module);
2262 lldb::addr_t P = frame.ResolveValue(pointer_operand, module);
2263
2264 if (D == LLDB_INVALID_ADDRESS)
2265 {
2266 if (log)
2267 log->Printf("LoadInst's value doesn't resolve to anything");
2268 error.SetErrorToGenericError();
2269 error.SetErrorString(bad_value_error);
2270 return false;
2271 }
2272
2273 if (P == LLDB_INVALID_ADDRESS)
2274 {
2275 if (log)
2276 log->Printf("LoadInst's pointer doesn't resolve to anything");
2277 error.SetErrorToGenericError();
2278 error.SetErrorString(bad_value_error);
2279 return false;
2280 }
2281
2282 lldb::addr_t R;
2283 lldb_private::Error read_error;
2284 memory_map.ReadPointerFromMemory(&R, P, read_error);
2285
2286 if (!read_error.Success())
2287 {
2288 if (log)
2289 log->Printf("Couldn't read the address to be loaded for a LoadInst");
2290 error.SetErrorToGenericError();
2291 error.SetErrorString(memory_read_error);
2292 return false;
2293 }
2294
2295 size_t target_size = data_layout.getTypeStoreSize(target_ty);
2296 lldb_private::DataBufferHeap buffer(target_size, 0);
2297
2298 read_error.Clear();
2299 memory_map.ReadMemory(buffer.GetBytes(), R, buffer.GetByteSize(), read_error);
2300 if (!read_error.Success())
2301 {
2302 if (log)
2303 log->Printf("Couldn't read from a region on behalf of a LoadInst");
2304 error.SetErrorToGenericError();
2305 error.SetErrorString(memory_read_error);
2306 return false;
2307 }
2308
2309 lldb_private::Error write_error;
2310 memory_map.WriteMemory(D, buffer.GetBytes(), buffer.GetByteSize(), write_error);
2311 if (!write_error.Success())
2312 {
2313 if (log)
2314 log->Printf("Couldn't write to a region on behalf of a LoadInst");
2315 error.SetErrorToGenericError();
2316 error.SetErrorString(memory_read_error);
2317 return false;
2318 }
2319
2320 if (log)
2321 {
2322 log->Printf("Interpreted a LoadInst");
2323 log->Printf(" P : 0x%llx", P);
2324 log->Printf(" R : 0x%llx", R);
2325 log->Printf(" D : 0x%llx", D);
2326 }
2327 }
2328 break;
2329 case Instruction::Ret:
2330 {
2331 return true;
2332 }
2333 case Instruction::Store:
2334 {
2335 const StoreInst *store_inst = dyn_cast<StoreInst>(inst);
2336
2337 if (!store_inst)
2338 {
2339 if (log)
2340 log->Printf("getOpcode() returns Store, but instruction is not a StoreInst");
2341 error.SetErrorToGenericError();
2342 error.SetErrorString(interpreter_internal_error);
2343 return false;
2344 }
2345
2346 // The semantics of Store are:
2347 // Resolve the region D containing the data to be stored
2348 // Resolve the region P containing a pointer
2349 // Dereference P to get the region R that the data should be stored in
2350 // Transfer a unit of type type(D) from D to R
2351
2352 const Value *value_operand = store_inst->getValueOperand();
2353 const Value *pointer_operand = store_inst->getPointerOperand();
2354
2355 Type *pointer_ty = pointer_operand->getType();
2356 PointerType *pointer_ptr_ty = dyn_cast<PointerType>(pointer_ty);
2357 if (!pointer_ptr_ty)
2358 return false;
2359 Type *target_ty = pointer_ptr_ty->getElementType();
2360
2361 lldb::addr_t D = frame.ResolveValue(value_operand, module);
2362 lldb::addr_t P = frame.ResolveValue(pointer_operand, module);
2363
2364 if (D == LLDB_INVALID_ADDRESS)
2365 {
2366 if (log)
2367 log->Printf("StoreInst's value doesn't resolve to anything");
2368 error.SetErrorToGenericError();
2369 error.SetErrorString(bad_value_error);
2370 return false;
2371 }
2372
2373 if (P == LLDB_INVALID_ADDRESS)
2374 {
2375 if (log)
2376 log->Printf("StoreInst's pointer doesn't resolve to anything");
2377 error.SetErrorToGenericError();
2378 error.SetErrorString(bad_value_error);
2379 return false;
2380 }
2381
2382 lldb::addr_t R;
2383 lldb_private::Error read_error;
2384 memory_map.ReadPointerFromMemory(&R, P, read_error);
2385
2386 if (!read_error.Success())
2387 {
2388 if (log)
2389 log->Printf("Couldn't read the address to be loaded for a LoadInst");
2390 error.SetErrorToGenericError();
2391 error.SetErrorString(memory_read_error);
2392 return false;
2393 }
2394
2395 size_t target_size = data_layout.getTypeStoreSize(target_ty);
2396 lldb_private::DataBufferHeap buffer(target_size, 0);
2397
2398 read_error.Clear();
2399 memory_map.ReadMemory(buffer.GetBytes(), D, buffer.GetByteSize(), read_error);
2400 if (!read_error.Success())
2401 {
2402 if (log)
2403 log->Printf("Couldn't read from a region on behalf of a StoreInst");
2404 error.SetErrorToGenericError();
2405 error.SetErrorString(memory_read_error);
2406 return false;
2407 }
2408
2409 lldb_private::Error write_error;
2410 memory_map.WriteMemory(R, buffer.GetBytes(), buffer.GetByteSize(), write_error);
2411 if (!write_error.Success())
2412 {
2413 if (log)
2414 log->Printf("Couldn't write to a region on behalf of a StoreInst");
2415 error.SetErrorToGenericError();
2416 error.SetErrorString(memory_read_error);
2417 return false;
2418 }
2419
2420 if (log)
2421 {
2422 log->Printf("Interpreted a StoreInst");
2423 log->Printf(" D : 0x%llx", D);
2424 log->Printf(" P : 0x%llx", P);
2425 log->Printf(" R : 0x%llx", R);
2426 }
2427 }
2428 break;
2429 }
2430
2431 ++frame.m_ii;
2432 }
2433
2434 if (num_insts >= 4096)
2435 {
2436 error.SetErrorToGenericError();
2437 error.SetErrorString(infinite_loop_error);
2438 return false;
2439 }
2440
2441 return false;
2442}