IRInterpreter.cpp revision 13615cfef0435af28ccc1e93e13c6161e94585ed
147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan//===-- IRInterpreter.cpp ---------------------------------------*- C++ -*-===// 247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan// 347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan// The LLVM Compiler Infrastructure 447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan// 547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan// This file is distributed under the University of Illinois Open Source 647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan// License. See LICENSE.TXT for details. 747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan// 847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan//===----------------------------------------------------------------------===// 947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 1047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan#include "lldb/Core/DataEncoder.h" 1147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan#include "lldb/Core/Log.h" 1247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan#include "lldb/Core/ValueObjectConstResult.h" 1347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan#include "lldb/Expression/ClangExpressionDeclMap.h" 1452d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan#include "lldb/Expression/ClangExpressionVariable.h" 1547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan#include "lldb/Expression/IRForTarget.h" 1647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan#include "lldb/Expression/IRInterpreter.h" 1747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 18a80c70c22a3e25d693e1a569a5209820873d44c8Chandler Carruth#include "llvm/IR/Constants.h" 19a80c70c22a3e25d693e1a569a5209820873d44c8Chandler Carruth#include "llvm/IR/Function.h" 20a80c70c22a3e25d693e1a569a5209820873d44c8Chandler Carruth#include "llvm/IR/Instructions.h" 21a80c70c22a3e25d693e1a569a5209820873d44c8Chandler Carruth#include "llvm/IR/Module.h" 2247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan#include "llvm/Support/raw_ostream.h" 23a80c70c22a3e25d693e1a569a5209820873d44c8Chandler Carruth#include "llvm/IR/DataLayout.h" 2447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 2547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan#include <map> 2647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 2747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananusing namespace llvm; 2847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 2947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananIRInterpreter::IRInterpreter(lldb_private::ClangExpressionDeclMap &decl_map, 3086d6ac2a3d920622c1ee7a68b5ca28b09dc18142Sean Callanan lldb_private::IRMemoryMap &memory_map, 3186d6ac2a3d920622c1ee7a68b5ca28b09dc18142Sean Callanan lldb_private::Stream *error_stream) : 3286d6ac2a3d920622c1ee7a68b5ca28b09dc18142Sean Callanan m_decl_map(decl_map), 3386d6ac2a3d920622c1ee7a68b5ca28b09dc18142Sean Callanan m_memory_map(memory_map) 3447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 3547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 3647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 3747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 3847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananIRInterpreter::~IRInterpreter() 3947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 4047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 4147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 4247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 4347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananstatic std::string 4447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananPrintValue(const Value *value, bool truncate = false) 4547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 4647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan std::string s; 4747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan raw_string_ostream rso(s); 4847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan value->print(rso); 4947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan rso.flush(); 5047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (truncate) 5147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan s.resize(s.length() - 1); 5247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 5347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t offset; 5447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan while ((offset = s.find('\n')) != s.npos) 5547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan s.erase(offset, 1); 5647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan while (s[0] == ' ' || s[0] == '\t') 5747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan s.erase(0, 1); 5847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 5947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return s; 6047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 6147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 6247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananstatic std::string 6347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananPrintType(const Type *type, bool truncate = false) 6447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 6547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan std::string s; 6647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan raw_string_ostream rso(s); 6747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan type->print(rso); 6847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan rso.flush(); 6947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (truncate) 7047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan s.resize(s.length() - 1); 7147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return s; 7247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 7347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 7413615cfef0435af28ccc1e93e13c6161e94585edSean Callananclass InterpreterStackFrame 7547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 7647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananpublic: 7713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan typedef std::map <const Value*, lldb::addr_t> ValueMap; 7847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 7913615cfef0435af28ccc1e93e13c6161e94585edSean Callanan struct PlacedValue 8047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 8113615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb_private::Value lldb_value; 8213615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb::addr_t process_address; 8313615cfef0435af28ccc1e93e13c6161e94585edSean Callanan size_t size; 8413615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 8513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan PlacedValue (lldb_private::Value &_lldb_value, 8613615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb::addr_t _process_address, 8713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan size_t _size) : 8813615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb_value(_lldb_value), 8913615cfef0435af28ccc1e93e13c6161e94585edSean Callanan process_address(_process_address), 9013615cfef0435af28ccc1e93e13c6161e94585edSean Callanan size(_size) 9147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 9247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 9347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan }; 9447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 9513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan typedef std::vector <PlacedValue> PlacedValueVector; 9647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 9747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ValueMap m_values; 9813615cfef0435af28ccc1e93e13c6161e94585edSean Callanan PlacedValueVector m_placed_values; 993051ed73a487e92f12f8b6062f8415781453da21Micah Villmow DataLayout &m_target_data; 10047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::ClangExpressionDeclMap &m_decl_map; 10186d6ac2a3d920622c1ee7a68b5ca28b09dc18142Sean Callanan lldb_private::IRMemoryMap &m_memory_map; 10247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const BasicBlock *m_bb; 10347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan BasicBlock::const_iterator m_ii; 10447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan BasicBlock::const_iterator m_ie; 10547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 10647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::ByteOrder m_byte_order; 10747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t m_addr_byte_size; 10847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 1093051ed73a487e92f12f8b6062f8415781453da21Micah Villmow InterpreterStackFrame (DataLayout &target_data, 11086d6ac2a3d920622c1ee7a68b5ca28b09dc18142Sean Callanan lldb_private::ClangExpressionDeclMap &decl_map, 11186d6ac2a3d920622c1ee7a68b5ca28b09dc18142Sean Callanan lldb_private::IRMemoryMap &memory_map) : 11297c8957257a3e0b3ce6f46f8e5a28c965e30f357Daniel Dunbar m_target_data (target_data), 11386d6ac2a3d920622c1ee7a68b5ca28b09dc18142Sean Callanan m_decl_map (decl_map), 11486d6ac2a3d920622c1ee7a68b5ca28b09dc18142Sean Callanan m_memory_map (memory_map) 11547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 11647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_byte_order = (target_data.isLittleEndian() ? lldb::eByteOrderLittle : lldb::eByteOrderBig); 1174fbe61ba371bfde827b9424ebe5e14dce3d5fad3Sean Callanan m_addr_byte_size = (target_data.getPointerSize(0)); 11847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 11947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 12047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan void Jump (const BasicBlock *bb) 12147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 12247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_bb = bb; 12347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_ii = m_bb->begin(); 12447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_ie = m_bb->end(); 12547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 12647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 12747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan std::string SummarizeValue (const Value *value) 12847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 12947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::StreamString ss; 13047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 13147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ss.Printf("%s", PrintValue(value).c_str()); 13247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 13347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ValueMap::iterator i = m_values.find(value); 13447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 13547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (i != m_values.end()) 13647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 13713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb::addr_t addr = i->second; 13847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 13913615cfef0435af28ccc1e93e13c6161e94585edSean Callanan ss.Printf(" 0x%llx", (unsigned long long)addr); 14047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 14147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 14247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return ss.GetString(); 14347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 14447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 14547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan bool AssignToMatchType (lldb_private::Scalar &scalar, uint64_t u64value, Type *type) 14647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 14747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t type_size = m_target_data.getTypeStoreSize(type); 14847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 14947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (type_size) 15047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 15147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case 1: 15247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan scalar = (uint8_t)u64value; 15347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 15447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case 2: 15547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan scalar = (uint16_t)u64value; 15647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 15747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case 4: 15847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan scalar = (uint32_t)u64value; 15947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 16047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case 8: 16147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan scalar = (uint64_t)u64value; 16247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 16347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan default: 16447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 16547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 16647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 16747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return true; 16847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 16947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 17047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan bool EvaluateValue (lldb_private::Scalar &scalar, const Value *value, Module &module) 17147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 17247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const Constant *constant = dyn_cast<Constant>(value); 17347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 17447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (constant) 17547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 17647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (const ConstantInt *constant_int = dyn_cast<ConstantInt>(constant)) 17747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 17847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return AssignToMatchType(scalar, constant_int->getLimitedValue(), value->getType()); 17947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 18047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 18147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 18247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 18313615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb::addr_t process_address = ResolveValue(value, module); 18413615cfef0435af28ccc1e93e13c6161e94585edSean Callanan size_t value_size = m_target_data.getTypeStoreSize(value->getType()); 18513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 18613615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb_private::DataExtractor value_extractor; 18713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb_private::Error extract_error; 18847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 18913615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.GetMemoryData(value_extractor, process_address, value_size, extract_error); 19013615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 19113615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (!extract_error.Success()) 19247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 19347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 19436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t offset = 0; 19513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan uint64_t u64value = value_extractor.GetMaxU64(&offset, value_size); 19647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 19747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return AssignToMatchType(scalar, u64value, value->getType()); 19847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 19947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 20047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 20147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 20247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 20347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan bool AssignValue (const Value *value, lldb_private::Scalar &scalar, Module &module) 20447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 20513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb::addr_t process_address = ResolveValue (value, module); 20613615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 20713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (process_address == LLDB_INVALID_ADDRESS) 20813615cfef0435af28ccc1e93e13c6161e94585edSean Callanan return false; 20947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 21047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Scalar cast_scalar; 21147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 21247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!AssignToMatchType(cast_scalar, scalar.GetRawBits64(0), value->getType())) 21347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 21413615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 21513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan size_t value_byte_size = m_target_data.getTypeStoreSize(value->getType()); 21647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 21713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb_private::DataBufferHeap buf(value_byte_size, 0); 21847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 21913615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb_private::Error get_data_error; 22047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 22113615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (!cast_scalar.GetAsMemoryData(buf.GetBytes(), buf.GetByteSize(), m_byte_order, get_data_error)) 22247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 22347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 22413615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb_private::Error write_error; 22547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 22613615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.WriteMemory(process_address, buf.GetBytes(), buf.GetByteSize(), write_error); 2275aff015bfe8ef7ae68c61801e320870471b2c4dfSean Callanan 22813615cfef0435af28ccc1e93e13c6161e94585edSean Callanan return write_error.Success(); 22947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 23047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 2318eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan bool ResolveConstantValue (APInt &value, const Constant *constant) 23247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 23347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (const ConstantInt *constant_int = dyn_cast<ConstantInt>(constant)) 23447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 2358eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan value = constant_int->getValue(); 2368eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan return true; 23747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 238557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan else if (const ConstantFP *constant_fp = dyn_cast<ConstantFP>(constant)) 23947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 2408eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan value = constant_fp->getValueAPF().bitcastToAPInt(); 2418eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan return true; 24247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 243557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan else if (const ConstantExpr *constant_expr = dyn_cast<ConstantExpr>(constant)) 244557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan { 245557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan switch (constant_expr->getOpcode()) 246557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan { 2478eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan default: 2488eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan return false; 2498eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan case Instruction::IntToPtr: 2506b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan case Instruction::PtrToInt: 2518eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan case Instruction::BitCast: 2528eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan return ResolveConstantValue(value, constant_expr->getOperand(0)); 2538eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan case Instruction::GetElementPtr: 2548eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan { 2558eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan ConstantExpr::const_op_iterator op_cursor = constant_expr->op_begin(); 2568eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan ConstantExpr::const_op_iterator op_end = constant_expr->op_end(); 2578eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan 2588eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan Constant *base = dyn_cast<Constant>(*op_cursor); 2598eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan 2608eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan if (!base) 2618eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan return false; 2628eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan 2638eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan if (!ResolveConstantValue(value, base)) 2648eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan return false; 2658eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan 2668eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan op_cursor++; 2678eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan 2688eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan if (op_cursor == op_end) 2698eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan return true; // no offset to apply! 2708eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan 2718eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan SmallVector <Value *, 8> indices (op_cursor, op_end); 2728eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan 2738eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan uint64_t offset = m_target_data.getIndexedOffset(base->getType(), indices); 2748eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan 2758eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan const bool is_signed = true; 2768eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan value += APInt(value.getBitWidth(), offset, is_signed); 2778eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan 2788eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan return true; 2798eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan } 280557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 281557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 28247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 28347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 28447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 28547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 28613615cfef0435af28ccc1e93e13c6161e94585edSean Callanan bool ResolveConstant (lldb::addr_t process_address, const Constant *constant) 2878eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan { 2888eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan APInt resolved_value; 2898eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan 2908eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan if (!ResolveConstantValue(resolved_value, constant)) 2918eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan return false; 2928eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan 2938eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan const uint64_t *raw_data = resolved_value.getRawData(); 2948eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan 2958eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan size_t constant_size = m_target_data.getTypeStoreSize(constant->getType()); 29613615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 29713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb_private::Error write_error; 29813615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 29913615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.WriteMemory(process_address, (uint8_t*)raw_data, constant_size, write_error); 30013615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 30113615cfef0435af28ccc1e93e13c6161e94585edSean Callanan return write_error.Success(); 3028eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan } 30313615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 30413615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb::addr_t MallocPointer () 30513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan { 30613615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb_private::Error alloc_error; 30713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 30813615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 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); 3098eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan 31013615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (alloc_error.Success()) 31113615cfef0435af28ccc1e93e13c6161e94585edSean Callanan return ret; 31213615cfef0435af28ccc1e93e13c6161e94585edSean Callanan else 31313615cfef0435af28ccc1e93e13c6161e94585edSean Callanan return LLDB_INVALID_ADDRESS; 31413615cfef0435af28ccc1e93e13c6161e94585edSean Callanan } 31513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 31613615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb::addr_t Malloc (llvm::Type *type, size_t override_byte_size = 0) 31713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan { 31813615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb_private::Error alloc_error; 31913615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 32013615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (!override_byte_size) 32113615cfef0435af28ccc1e93e13c6161e94585edSean Callanan override_byte_size = m_target_data.getTypeStoreSize(type); 32213615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 32313615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 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); 32413615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 32513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (alloc_error.Success()) 32613615cfef0435af28ccc1e93e13c6161e94585edSean Callanan return ret; 32713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan else 32813615cfef0435af28ccc1e93e13c6161e94585edSean Callanan return LLDB_INVALID_ADDRESS; 32913615cfef0435af28ccc1e93e13c6161e94585edSean Callanan } 33013615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 33113615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb::addr_t PlaceLLDBValue (const llvm::Value *value, lldb_private::Value lldb_value) 33213615cfef0435af28ccc1e93e13c6161e94585edSean Callanan { 33313615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb_private::Error alloc_error; 33413615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb_private::RegisterInfo *reg_info = lldb_value.GetRegisterInfo(); 33513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 33613615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb::addr_t ret; 33713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 33813615cfef0435af28ccc1e93e13c6161e94585edSean Callanan size_t value_size = m_target_data.getTypeStoreSize(value->getType()); 33913615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 34013615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (reg_info && (reg_info->encoding == lldb::eEncodingVector)) 34113615cfef0435af28ccc1e93e13c6161e94585edSean Callanan value_size = reg_info->byte_size; 34213615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 34313615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (!reg_info && (lldb_value.GetValueType() == lldb_private::Value::eValueTypeLoadAddress)) 34413615cfef0435af28ccc1e93e13c6161e94585edSean Callanan return lldb_value.GetScalar().ULongLong(); 34513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 34613615cfef0435af28ccc1e93e13c6161e94585edSean Callanan ret = Malloc(value->getType(), value_size); 34713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 34813615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (ret == LLDB_INVALID_ADDRESS) 34913615cfef0435af28ccc1e93e13c6161e94585edSean Callanan return LLDB_INVALID_ADDRESS; 35013615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 35113615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb_private::DataBufferHeap buf(value_size, 0); 35213615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 35313615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_decl_map.ReadTarget(m_memory_map, buf.GetBytes(), lldb_value, value_size); 35413615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 35513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb_private::Error write_error; 35613615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 35713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.WriteMemory(ret, buf.GetBytes(), buf.GetByteSize(), write_error); 35813615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 35913615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (!write_error.Success()) 36013615cfef0435af28ccc1e93e13c6161e94585edSean Callanan { 36113615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb_private::Error free_error; 36213615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.Free(ret, free_error); 36313615cfef0435af28ccc1e93e13c6161e94585edSean Callanan return LLDB_INVALID_ADDRESS; 36413615cfef0435af28ccc1e93e13c6161e94585edSean Callanan } 36513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 36613615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_placed_values.push_back(PlacedValue(lldb_value, ret, value_size)); 36713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 36813615cfef0435af28ccc1e93e13c6161e94585edSean Callanan return ret; 36913615cfef0435af28ccc1e93e13c6161e94585edSean Callanan } 37013615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 37113615cfef0435af28ccc1e93e13c6161e94585edSean Callanan void RestoreLLDBValues () 37213615cfef0435af28ccc1e93e13c6161e94585edSean Callanan { 37313615cfef0435af28ccc1e93e13c6161e94585edSean Callanan for (PlacedValue &placed_value : m_placed_values) 37413615cfef0435af28ccc1e93e13c6161e94585edSean Callanan { 37513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb_private::DataBufferHeap buf(placed_value.size, 0); 37613615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 37713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb_private::Error read_error; 37813615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 37913615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.ReadMemory(buf.GetBytes(), placed_value.process_address, buf.GetByteSize(), read_error); 38013615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 38113615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (read_error.Success()) 38213615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_decl_map.WriteTarget(m_memory_map, placed_value.lldb_value, buf.GetBytes(), buf.GetByteSize()); 38313615cfef0435af28ccc1e93e13c6161e94585edSean Callanan } 38413615cfef0435af28ccc1e93e13c6161e94585edSean Callanan } 38513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 38613615cfef0435af28ccc1e93e13c6161e94585edSean Callanan std::string PrintData (lldb::addr_t addr, llvm::Type *type) 38713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan { 38813615cfef0435af28ccc1e93e13c6161e94585edSean Callanan size_t length = m_target_data.getTypeStoreSize(type); 38913615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 39013615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb_private::DataBufferHeap buf(length, 0); 39113615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 39213615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb_private::Error read_error; 39313615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 39413615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.ReadMemory(buf.GetBytes(), addr, length, read_error); 39513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 39613615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (!read_error.Success()) 39713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan return std::string("<couldn't read data>"); 39813615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 39913615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb_private::StreamString ss; 40013615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 40113615cfef0435af28ccc1e93e13c6161e94585edSean Callanan for (size_t i = 0; i < length; i++) 40213615cfef0435af28ccc1e93e13c6161e94585edSean Callanan { 40313615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if ((!(i & 0xf)) && i) 40413615cfef0435af28ccc1e93e13c6161e94585edSean Callanan ss.Printf("%02hhx - ", buf.GetBytes()[i]); 40513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan else 40613615cfef0435af28ccc1e93e13c6161e94585edSean Callanan ss.Printf("%02hhx ", buf.GetBytes()[i]); 40713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan } 40813615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 40913615cfef0435af28ccc1e93e13c6161e94585edSean Callanan return ss.GetString(); 41013615cfef0435af28ccc1e93e13c6161e94585edSean Callanan } 41113615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 41213615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb::addr_t ResolveValue (const Value *value, Module &module) 41347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 41447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ValueMap::iterator i = m_values.find(value); 41547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 41647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (i != m_values.end()) 41747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return i->second; 41847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 41947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const GlobalValue *global_value = dyn_cast<GlobalValue>(value); 42047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 4214b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan // If the variable is indirected through the argument 4224b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan // array then we need to build an extra level of indirection 4234b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan // for it. This is the default; only magic arguments like 4244b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan // "this", "self", and "_cmd" are direct. 425b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan bool variable_is_this = false; 4264b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 427583f15dfb8f680cee0c499bcd876c5eb3b173136Sean Callanan // If the variable is a function pointer, we do not need to 428583f15dfb8f680cee0c499bcd876c5eb3b173136Sean Callanan // build an extra layer of indirection for it because it is 429583f15dfb8f680cee0c499bcd876c5eb3b173136Sean Callanan // accessed directly. 430583f15dfb8f680cee0c499bcd876c5eb3b173136Sean Callanan bool variable_is_function_address = false; 431583f15dfb8f680cee0c499bcd876c5eb3b173136Sean Callanan 43247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Attempt to resolve the value using the program's data. 43347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // If it is, the values to be created are: 43447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // 43547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // data_region - a region of memory in which the variable's data resides. 43647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // ref_region - a region of memory in which its address (i.e., &var) resides. 43747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // In the JIT case, this region would be a member of the struct passed in. 43847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // pointer_region - a region of memory in which the address of the pointer 43947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // resides. This is an IR-level variable. 44047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan do 44147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 442952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton lldb_private::Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 4434b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 4444b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan lldb_private::Value resolved_value; 4454a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton lldb_private::ClangExpressionVariable::FlagType flags = 0; 44647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 4474b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan if (global_value) 4484b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan { 4494b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan clang::NamedDecl *decl = IRForTarget::DeclForGlobal(global_value, &module); 4504b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 4514b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan if (!decl) 4524b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan break; 4534b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 4544b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan if (isa<clang::FunctionDecl>(decl)) 455583f15dfb8f680cee0c499bcd876c5eb3b173136Sean Callanan variable_is_function_address = true; 4564b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 45752d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan resolved_value = m_decl_map.LookupDecl(decl, flags); 4584b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan } 4594b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan else 4604b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan { 4614b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan // Special-case "this", "self", and "_cmd" 4624b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 463fecc09c3709262515add87254cb973ce5175f17bSean Callanan std::string name_str = value->getName().str(); 4644b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 4654b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan if (name_str == "this" || 4664b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan name_str == "self" || 4674b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan name_str == "_cmd") 4685aff015bfe8ef7ae68c61801e320870471b2c4dfSean Callanan { 4694b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan resolved_value = m_decl_map.GetSpecialValue(lldb_private::ConstString(name_str.c_str())); 4705aff015bfe8ef7ae68c61801e320870471b2c4dfSean Callanan variable_is_this = true; 4715aff015bfe8ef7ae68c61801e320870471b2c4dfSean Callanan } 4724b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan } 47347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 47447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (resolved_value.GetScalar().GetType() != lldb_private::Scalar::e_void) 47547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 47647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (resolved_value.GetContextType() == lldb_private::Value::eContextTypeRegisterInfo) 47747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 478b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan if (variable_is_this) 47913615cfef0435af28ccc1e93e13c6161e94585edSean Callanan { 48013615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb_private::Error alloc_error; 48113615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb::addr_t ref_addr = Malloc(value->getType()); 482b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 48313615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (ref_addr == LLDB_INVALID_ADDRESS) 48413615cfef0435af28ccc1e93e13c6161e94585edSean Callanan return LLDB_INVALID_ADDRESS; 485b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 48613615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb_private::Error write_error; 48713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.WritePointerToMemory(ref_addr, resolved_value.GetScalar().ULongLong(), write_error); 488b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 48913615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (!write_error.Success()) 49013615cfef0435af28ccc1e93e13c6161e94585edSean Callanan return LLDB_INVALID_ADDRESS; 491b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 492b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan if (log) 493b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan { 494b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan log->Printf("Made an allocation for \"this\" register variable %s", PrintValue(value).c_str()); 49513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan log->Printf(" Data region : %llx", (unsigned long long)resolved_value.GetScalar().ULongLong()); 49613615cfef0435af28ccc1e93e13c6161e94585edSean Callanan log->Printf(" Ref region : %llx", (unsigned long long)ref_addr); 497b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan } 498b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 49913615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_values[value] = ref_addr; 50013615cfef0435af28ccc1e93e13c6161e94585edSean Callanan return ref_addr; 501b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan } 502b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan else if (flags & lldb_private::ClangExpressionVariable::EVBareRegister) 50313615cfef0435af28ccc1e93e13c6161e94585edSean Callanan { 50413615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb::addr_t data_address = PlaceLLDBValue(value, resolved_value); 505b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 50613615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (!data_address) 50713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan return LLDB_INVALID_ADDRESS; 508b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 50913615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb::addr_t ref_address = MallocPointer(); 510b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 51113615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (ref_address == LLDB_INVALID_ADDRESS) 51213615cfef0435af28ccc1e93e13c6161e94585edSean Callanan { 51313615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb_private::Error free_error; 51413615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.Free(data_address, free_error); 51513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan return LLDB_INVALID_ADDRESS; 51613615cfef0435af28ccc1e93e13c6161e94585edSean Callanan } 517b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 51813615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb_private::Error write_error; 51913615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 52013615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.WritePointerToMemory(ref_address, data_address, write_error); 521b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 52213615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (!write_error.Success()) 52313615cfef0435af28ccc1e93e13c6161e94585edSean Callanan { 52413615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb_private::Error free_error; 52513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.Free(data_address, free_error); 52613615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.Free(ref_address, free_error); 52713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan return LLDB_INVALID_ADDRESS; 52813615cfef0435af28ccc1e93e13c6161e94585edSean Callanan } 529b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 530b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan if (log) 531b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan { 532b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan log->Printf("Made an allocation for bare register variable %s", PrintValue(value).c_str()); 53313615cfef0435af28ccc1e93e13c6161e94585edSean Callanan log->Printf(" Data contents : %s", PrintData(data_address, value->getType()).c_str()); 53413615cfef0435af28ccc1e93e13c6161e94585edSean Callanan log->Printf(" Data region : 0x%llx", (unsigned long long)data_address); 53513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan log->Printf(" Ref region : 0x%llx", (unsigned long long)ref_address); 536b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan } 537b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 53813615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_values[value] = ref_address; 53913615cfef0435af28ccc1e93e13c6161e94585edSean Callanan return ref_address; 540b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan } 541b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan else 54213615cfef0435af28ccc1e93e13c6161e94585edSean Callanan { 54313615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb::addr_t data_address = PlaceLLDBValue(value, resolved_value); 54413615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 54513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (data_address == LLDB_INVALID_ADDRESS) 54613615cfef0435af28ccc1e93e13c6161e94585edSean Callanan return LLDB_INVALID_ADDRESS; 547b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 54813615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb::addr_t ref_address = MallocPointer(); 549b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 55013615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (ref_address == LLDB_INVALID_ADDRESS) 55113615cfef0435af28ccc1e93e13c6161e94585edSean Callanan { 55213615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb_private::Error free_error; 55313615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.Free(data_address, free_error); 55413615cfef0435af28ccc1e93e13c6161e94585edSean Callanan return LLDB_INVALID_ADDRESS; 55513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan } 55613615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 55713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb::addr_t pointer_address = MallocPointer(); 55813615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 55913615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (pointer_address == LLDB_INVALID_ADDRESS) 56013615cfef0435af28ccc1e93e13c6161e94585edSean Callanan { 56113615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb_private::Error free_error; 56213615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.Free(data_address, free_error); 56313615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.Free(ref_address, free_error); 56413615cfef0435af28ccc1e93e13c6161e94585edSean Callanan return LLDB_INVALID_ADDRESS; 56513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan } 56613615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 56713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb_private::Error write_error; 568b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 56913615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.WritePointerToMemory(ref_address, data_address, write_error); 570b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 57113615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (!write_error.Success()) 57213615cfef0435af28ccc1e93e13c6161e94585edSean Callanan { 57313615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb_private::Error free_error; 57413615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.Free(data_address, free_error); 57513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.Free(ref_address, free_error); 57613615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.Free(pointer_address, free_error); 57713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan return LLDB_INVALID_ADDRESS; 57813615cfef0435af28ccc1e93e13c6161e94585edSean Callanan } 579b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 58013615cfef0435af28ccc1e93e13c6161e94585edSean Callanan write_error.Clear(); 581b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 58213615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.WritePointerToMemory(pointer_address, ref_address, write_error); 583b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 58413615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (!write_error.Success()) 58513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan { 58613615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb_private::Error free_error; 58713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.Free(data_address, free_error); 58813615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.Free(ref_address, free_error); 58913615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.Free(pointer_address, free_error); 59013615cfef0435af28ccc1e93e13c6161e94585edSean Callanan return LLDB_INVALID_ADDRESS; 59113615cfef0435af28ccc1e93e13c6161e94585edSean Callanan } 592b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 593b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan if (log) 594b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan { 595b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan log->Printf("Made an allocation for ordinary register variable %s", PrintValue(value).c_str()); 59613615cfef0435af28ccc1e93e13c6161e94585edSean Callanan log->Printf(" Data contents : %s", PrintData(data_address, value->getType()).c_str()); 59713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan log->Printf(" Data region : 0x%llx", (unsigned long long)data_address); 59813615cfef0435af28ccc1e93e13c6161e94585edSean Callanan log->Printf(" Ref region : 0x%llx", (unsigned long long)ref_address); 59913615cfef0435af28ccc1e93e13c6161e94585edSean Callanan log->Printf(" Pointer region : 0x%llx", (unsigned long long)pointer_address); 600b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan } 6014b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 60213615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_values[value] = pointer_address; 60313615cfef0435af28ccc1e93e13c6161e94585edSean Callanan return pointer_address; 6044b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan } 60547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 60647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 60747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 608583f15dfb8f680cee0c499bcd876c5eb3b173136Sean Callanan bool no_extra_redirect = (variable_is_this || variable_is_function_address); 609583f15dfb8f680cee0c499bcd876c5eb3b173136Sean Callanan 61013615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb::addr_t data_address = PlaceLLDBValue(value, resolved_value); 61147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 61213615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (data_address == LLDB_INVALID_ADDRESS) 61313615cfef0435af28ccc1e93e13c6161e94585edSean Callanan return LLDB_INVALID_ADDRESS; 61447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 61513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb::addr_t ref_address = MallocPointer(); 61647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 61713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (ref_address == LLDB_INVALID_ADDRESS) 61813615cfef0435af28ccc1e93e13c6161e94585edSean Callanan { 61913615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb_private::Error free_error; 62013615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.Free(data_address, free_error); 62113615cfef0435af28ccc1e93e13c6161e94585edSean Callanan return LLDB_INVALID_ADDRESS; 62213615cfef0435af28ccc1e93e13c6161e94585edSean Callanan } 62313615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 62413615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb::addr_t pointer_address = LLDB_INVALID_ADDRESS; 62547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 626583f15dfb8f680cee0c499bcd876c5eb3b173136Sean Callanan if (!no_extra_redirect) 6274b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan { 62813615cfef0435af28ccc1e93e13c6161e94585edSean Callanan pointer_address = MallocPointer(); 62913615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 63013615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (pointer_address == LLDB_INVALID_ADDRESS) 63113615cfef0435af28ccc1e93e13c6161e94585edSean Callanan { 63213615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb_private::Error free_error; 63313615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.Free(data_address, free_error); 63413615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.Free(ref_address, free_error); 63513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan return LLDB_INVALID_ADDRESS; 63613615cfef0435af28ccc1e93e13c6161e94585edSean Callanan } 63713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan } 63813615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 63913615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb_private::Error write_error; 64047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 64113615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.WritePointerToMemory(ref_address, data_address, write_error); 64213615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 64313615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (!write_error.Success()) 64413615cfef0435af28ccc1e93e13c6161e94585edSean Callanan { 64513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb_private::Error free_error; 64613615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.Free(data_address, free_error); 64713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.Free(ref_address, free_error); 64813615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (pointer_address != LLDB_INVALID_ADDRESS) 64913615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.Free(pointer_address, free_error); 65013615cfef0435af28ccc1e93e13c6161e94585edSean Callanan return LLDB_INVALID_ADDRESS; 65113615cfef0435af28ccc1e93e13c6161e94585edSean Callanan } 65213615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 65313615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (!no_extra_redirect) 65413615cfef0435af28ccc1e93e13c6161e94585edSean Callanan { 65513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan write_error.Clear(); 6564b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 65713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.WritePointerToMemory(pointer_address, ref_address, write_error); 65813615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 65913615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (!write_error.Success()) 66013615cfef0435af28ccc1e93e13c6161e94585edSean Callanan { 66113615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb_private::Error free_error; 66213615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.Free(data_address, free_error); 66313615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.Free(ref_address, free_error); 66413615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (pointer_address != LLDB_INVALID_ADDRESS) 66513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.Free(pointer_address, free_error); 66613615cfef0435af28ccc1e93e13c6161e94585edSean Callanan return LLDB_INVALID_ADDRESS; 66713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan } 6684b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan } 66947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 67047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 67147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 6724b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan log->Printf("Made an allocation for %s", PrintValue(value).c_str()); 67313615cfef0435af28ccc1e93e13c6161e94585edSean Callanan log->Printf(" Data contents : %s", PrintData(data_address, value->getType()).c_str()); 67413615cfef0435af28ccc1e93e13c6161e94585edSean Callanan log->Printf(" Data region : %llx", (unsigned long long)data_address); 67513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan log->Printf(" Ref region : %llx", (unsigned long long)ref_address); 676b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan if (!variable_is_this) 67713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan log->Printf(" Pointer region : %llx", (unsigned long long)pointer_address); 67847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 67947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 680583f15dfb8f680cee0c499bcd876c5eb3b173136Sean Callanan if (no_extra_redirect) 68113615cfef0435af28ccc1e93e13c6161e94585edSean Callanan { 68213615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_values[value] = ref_address; 68313615cfef0435af28ccc1e93e13c6161e94585edSean Callanan return ref_address; 68413615cfef0435af28ccc1e93e13c6161e94585edSean Callanan } 685b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan else 68613615cfef0435af28ccc1e93e13c6161e94585edSean Callanan { 68713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_values[value] = pointer_address; 68813615cfef0435af28ccc1e93e13c6161e94585edSean Callanan return pointer_address; 68913615cfef0435af28ccc1e93e13c6161e94585edSean Callanan } 69047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 69147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 69247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 69347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan while(0); 69447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 69547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Fall back and allocate space [allocation type Alloca] 69647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 69713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb::addr_t data_address = Malloc(value->getType()); 69813615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 69913615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (const Constant *constant = dyn_cast<Constant>(value)) 70047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 70113615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (!ResolveConstant (data_address, constant)) 70213615cfef0435af28ccc1e93e13c6161e94585edSean Callanan { 70313615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb_private::Error free_error; 70413615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.Free(data_address, free_error); 70513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan return LLDB_INVALID_ADDRESS; 70613615cfef0435af28ccc1e93e13c6161e94585edSean Callanan } 70747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 70847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 70913615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_values[value] = data_address; 71013615cfef0435af28ccc1e93e13c6161e94585edSean Callanan return data_address; 71147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 71247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 71347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan bool ConstructResult (lldb::ClangExpressionVariableSP &result, 71447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const GlobalValue *result_value, 71547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const lldb_private::ConstString &result_name, 71647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::TypeFromParser result_type, 71747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Module &module) 71847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 71947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // The result_value resolves to P, a pointer to a region R containing the result data. 72047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // If the result variable is a reference, the region R contains a pointer to the result R_final in the original process. 72147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 72247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!result_value) 72347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return true; // There was no slot for a result – the expression doesn't return one. 72447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 72547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ValueMap::iterator i = m_values.find(result_value); 72647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 72747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (i == m_values.end()) 72847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; // There was a slot for the result, but we didn't write into it. 72947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 73013615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb::addr_t P = i->second; 73147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 73247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Type *pointer_ty = result_value->getType(); 73347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan PointerType *pointer_ptr_ty = dyn_cast<PointerType>(pointer_ty); 73447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!pointer_ptr_ty) 73547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 73647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Type *R_ty = pointer_ptr_ty->getElementType(); 73747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 73813615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb_private::Error read_error; 73913615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb::addr_t R; 74013615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.ReadPointerFromMemory(&R, P, read_error); 74113615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (!read_error.Success()) 74247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 74347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 74447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Value base; 74547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 746a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan bool transient = false; 747557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan bool maybe_make_load = false; 748a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan 74947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (m_decl_map.ResultIsReference(result_name)) 75047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 75147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan PointerType *R_ptr_ty = dyn_cast<PointerType>(R_ty); 75247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!R_ptr_ty) 75347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 75447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 75513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan read_error.Clear(); 75613615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb::addr_t R_pointer; 75713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.ReadPointerFromMemory(&R_pointer, R, read_error); 75813615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (!read_error.Success()) 75947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 76047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 76113615cfef0435af28ccc1e93e13c6161e94585edSean Callanan // We got a bare pointer. We are going to treat it as a load address 76213615cfef0435af28ccc1e93e13c6161e94585edSean Callanan // or a file address, letting decl_map make the choice based on whether 76313615cfef0435af28ccc1e93e13c6161e94585edSean Callanan // or not a process exists. 76447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 76513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan bool was_placed = false; 766a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan 76713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan for (PlacedValue &value : m_placed_values) 76813615cfef0435af28ccc1e93e13c6161e94585edSean Callanan { 76913615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (value.process_address == R_pointer) 77013615cfef0435af28ccc1e93e13c6161e94585edSean Callanan { 77113615cfef0435af28ccc1e93e13c6161e94585edSean Callanan base = value.lldb_value; 77213615cfef0435af28ccc1e93e13c6161e94585edSean Callanan was_placed = true; 77313615cfef0435af28ccc1e93e13c6161e94585edSean Callanan break; 77413615cfef0435af28ccc1e93e13c6161e94585edSean Callanan } 775557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 77613615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 77713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (!was_placed) 778557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan { 779557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan base.SetContext(lldb_private::Value::eContextTypeInvalid, NULL); 780557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan base.SetValueType(lldb_private::Value::eValueTypeFileAddress); 781557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan base.GetScalar() = (unsigned long long)R_pointer; 782557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan maybe_make_load = true; 783557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 78447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 78547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 78647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 78747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan base.SetContext(lldb_private::Value::eContextTypeInvalid, NULL); 78813615cfef0435af28ccc1e93e13c6161e94585edSean Callanan base.SetValueType(lldb_private::Value::eValueTypeLoadAddress); 78913615cfef0435af28ccc1e93e13c6161e94585edSean Callanan base.GetScalar() = (unsigned long long)R; 79047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 79147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 79213615cfef0435af28ccc1e93e13c6161e94585edSean Callanan return m_decl_map.CompleteResultVariable (result, m_memory_map, base, result_name, result_type, transient, maybe_make_load); 79347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 79447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}; 79547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 79647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool 79747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananIRInterpreter::maybeRunOnFunction (lldb::ClangExpressionVariableSP &result, 79847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const lldb_private::ConstString &result_name, 79947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::TypeFromParser result_type, 80047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Function &llvm_function, 801ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan Module &llvm_module, 802ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan lldb_private::Error &err) 80347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 804ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan if (supportsFunction (llvm_function, err)) 80547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return runOnFunction(result, 80647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result_name, 80747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result_type, 80847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan llvm_function, 809ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan llvm_module, 810ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err); 81147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 81247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 81347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 81447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 815ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callananstatic const char *unsupported_opcode_error = "Interpreter doesn't handle one of the expression's opcodes"; 816ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callananstatic const char *interpreter_initialization_error = "Interpreter couldn't be initialized"; 817ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callananstatic const char *interpreter_internal_error = "Interpreter encountered an internal error"; 818ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callananstatic const char *bad_value_error = "Interpreter couldn't resolve a value during execution"; 819ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callananstatic const char *memory_allocation_error = "Interpreter couldn't allocate memory"; 820ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callananstatic const char *memory_write_error = "Interpreter couldn't write to memory"; 821ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callananstatic const char *memory_read_error = "Interpreter couldn't read from memory"; 822ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callananstatic const char *infinite_loop_error = "Interpreter ran for too many cycles"; 8238f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callananstatic const char *bad_result_error = "Result of expression is in bad memory"; 824ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan 82547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool 826ddf110d67eb3d3e621441c4383904e838bc0c403Sean CallananIRInterpreter::supportsFunction (Function &llvm_function, 827ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan lldb_private::Error &err) 82847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 829952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton lldb_private::Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 83047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 83147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan for (Function::iterator bbi = llvm_function.begin(), bbe = llvm_function.end(); 83247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan bbi != bbe; 83347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ++bbi) 83447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 83547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan for (BasicBlock::iterator ii = bbi->begin(), ie = bbi->end(); 83647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ii != ie; 83747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ++ii) 83847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 83947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (ii->getOpcode()) 84047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 84147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan default: 84247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 84347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 84447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Unsupported instruction: %s", PrintValue(ii).c_str()); 845ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 846ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(unsupported_opcode_error); 84747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 84847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 84947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Add: 85047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Alloca: 85147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::BitCast: 85247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Br: 85347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::GetElementPtr: 85447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 85547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::ICmp: 85647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 85747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ICmpInst *icmp_inst = dyn_cast<ICmpInst>(ii); 85847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 85947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!icmp_inst) 860ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan { 861ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 862ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(interpreter_internal_error); 86347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 864ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan } 86547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 86647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (icmp_inst->getPredicate()) 86747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 86847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan default: 86947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 87047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 87147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Unsupported ICmp predicate: %s", PrintValue(ii).c_str()); 872ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan 873ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 874ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(unsupported_opcode_error); 87547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 87647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 87747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_EQ: 87847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_NE: 87947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_UGT: 88047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_UGE: 88147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_ULT: 88247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_ULE: 88347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_SGT: 88447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_SGE: 88547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_SLT: 88647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_SLE: 88747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 88847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 88947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 89047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 891fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::And: 892fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::AShr: 893557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan case Instruction::IntToPtr: 8946b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan case Instruction::PtrToInt: 89547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Load: 896fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::LShr: 89747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Mul: 898fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::Or: 89947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Ret: 90047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::SDiv: 901fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::Shl: 902bab2a0caa65d114ab1dfc9314636c8057de285c7Sean Callanan case Instruction::SRem: 90347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Store: 90447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Sub: 90547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::UDiv: 906bab2a0caa65d114ab1dfc9314636c8057de285c7Sean Callanan case Instruction::URem: 907fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::Xor: 9086a3f9af114bfdc05c7b89de45fe7e0a52aceef0aSean Callanan case Instruction::ZExt: 90947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 91047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 91147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 91247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 91347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 91447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return true; 91547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 91647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 91747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool 91847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananIRInterpreter::runOnFunction (lldb::ClangExpressionVariableSP &result, 91947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const lldb_private::ConstString &result_name, 92047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::TypeFromParser result_type, 92147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Function &llvm_function, 922ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan Module &llvm_module, 923ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan lldb_private::Error &err) 92447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 925952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton lldb_private::Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 92647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 92747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::ClangExpressionDeclMap::TargetInfo target_info = m_decl_map.GetTargetInfo(); 92847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 92947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!target_info.IsValid()) 930ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan { 931ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 932ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(interpreter_initialization_error); 93347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 934ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan } 93547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 93647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::addr_t alloc_min; 93747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::addr_t alloc_max; 93847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 93947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (target_info.address_byte_size) 94047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 94147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan default: 942ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 943ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(interpreter_initialization_error); 944ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan return false; 94547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case 4: 94647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan alloc_min = 0x00001000llu; 94747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan alloc_max = 0x0000ffffllu; 94847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 94947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case 8: 95047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan alloc_min = 0x0000000000001000llu; 95147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan alloc_max = 0x000000000000ffffllu; 95247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 95347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 95447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 9553051ed73a487e92f12f8b6062f8415781453da21Micah Villmow DataLayout target_data(&llvm_module); 9564fbe61ba371bfde827b9424ebe5e14dce3d5fad3Sean Callanan if (target_data.getPointerSize(0) != target_info.address_byte_size) 957ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan { 958ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 959ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(interpreter_initialization_error); 96047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 961ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan } 96247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (target_data.isLittleEndian() != (target_info.byte_order == lldb::eByteOrderLittle)) 963ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan { 964ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 965ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(interpreter_initialization_error); 96647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 967ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan } 96847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 96913615cfef0435af28ccc1e93e13c6161e94585edSean Callanan InterpreterStackFrame frame(target_data, m_decl_map, m_memory_map); 97047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 97147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan uint32_t num_insts = 0; 97247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 97347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan frame.Jump(llvm_function.begin()); 97447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 97547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan while (frame.m_ii != frame.m_ie && (++num_insts < 4096)) 97647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 97747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const Instruction *inst = frame.m_ii; 97847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 97947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 98047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Interpreting %s", PrintValue(inst).c_str()); 98147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 98247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (inst->getOpcode()) 98347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 98447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan default: 98547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 98647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Add: 98747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Sub: 98847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Mul: 98947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::SDiv: 99047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::UDiv: 991bab2a0caa65d114ab1dfc9314636c8057de285c7Sean Callanan case Instruction::SRem: 992bab2a0caa65d114ab1dfc9314636c8057de285c7Sean Callanan case Instruction::URem: 993fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::Shl: 994fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::LShr: 995fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::AShr: 996fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::And: 997fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::Or: 998fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::Xor: 99947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 100047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const BinaryOperator *bin_op = dyn_cast<BinaryOperator>(inst); 100147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 100247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!bin_op) 100347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 100447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 100547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("getOpcode() returns %s, but instruction is not a BinaryOperator", inst->getOpcodeName()); 1006ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1007ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(interpreter_internal_error); 1008ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan return false; 100947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 101047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 101147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Value *lhs = inst->getOperand(0); 101247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Value *rhs = inst->getOperand(1); 101347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 101447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Scalar L; 101547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Scalar R; 101647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 101747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!frame.EvaluateValue(L, lhs, llvm_module)) 101847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 101947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 102047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Couldn't evaluate %s", PrintValue(lhs).c_str()); 1021ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1022ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(bad_value_error); 102347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 102447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 102547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 102647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!frame.EvaluateValue(R, rhs, llvm_module)) 102747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 102847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 102947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Couldn't evaluate %s", PrintValue(rhs).c_str()); 1030ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1031ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(bad_value_error); 103247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 103347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 103447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 103547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Scalar result; 103647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 103747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (inst->getOpcode()) 103847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 103947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan default: 104047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 104147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Add: 104247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = L + R; 104347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 104447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Mul: 104547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = L * R; 104647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 104747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Sub: 104847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = L - R; 104947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 105047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::SDiv: 105147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = L / R; 105247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 105347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::UDiv: 105447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = L.GetRawBits64(0) / R.GetRawBits64(1); 105547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 1056bab2a0caa65d114ab1dfc9314636c8057de285c7Sean Callanan case Instruction::SRem: 1057bab2a0caa65d114ab1dfc9314636c8057de285c7Sean Callanan result = L % R; 1058bab2a0caa65d114ab1dfc9314636c8057de285c7Sean Callanan break; 1059bab2a0caa65d114ab1dfc9314636c8057de285c7Sean Callanan case Instruction::URem: 1060bab2a0caa65d114ab1dfc9314636c8057de285c7Sean Callanan result = L.GetRawBits64(0) % R.GetRawBits64(1); 1061bab2a0caa65d114ab1dfc9314636c8057de285c7Sean Callanan break; 1062fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::Shl: 1063fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan result = L << R; 1064fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan break; 1065fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::AShr: 1066fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan result = L >> R; 1067fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan break; 1068fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::LShr: 1069fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan result = L; 1070fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan result.ShiftRightLogical(R); 1071fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan break; 1072fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::And: 1073fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan result = L & R; 1074fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan break; 1075fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::Or: 1076fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan result = L | R; 1077fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan break; 1078fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::Xor: 1079fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan result = L ^ R; 1080fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan break; 108147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 108247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 108347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan frame.AssignValue(inst, result, llvm_module); 108447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 108547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 108647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 108747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Interpreted a %s", inst->getOpcodeName()); 108847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" L : %s", frame.SummarizeValue(lhs).c_str()); 108947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" R : %s", frame.SummarizeValue(rhs).c_str()); 109047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" = : %s", frame.SummarizeValue(inst).c_str()); 109147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 109247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 109347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 109447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Alloca: 109547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 109647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const AllocaInst *alloca_inst = dyn_cast<AllocaInst>(inst); 109747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 109847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!alloca_inst) 109947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 110047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 110147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("getOpcode() returns Alloca, but instruction is not an AllocaInst"); 1102ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1103ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(interpreter_internal_error); 110447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 110547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 110647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 110747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (alloca_inst->isArrayAllocation()) 110847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 110947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 111047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("AllocaInsts are not handled if isArrayAllocation() is true"); 1111ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1112ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(unsupported_opcode_error); 111347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 111447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 111547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 111647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // The semantics of Alloca are: 111747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Create a region R of virtual memory of type T, backed by a data buffer 111847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Create a region P of virtual memory of type T*, backed by a data buffer 111947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Write the virtual address of R into P 112047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 112147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Type *T = alloca_inst->getAllocatedType(); 112247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Type *Tptr = alloca_inst->getType(); 112347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 112413615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb::addr_t R = frame.Malloc(T); 112513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 112613615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (R == LLDB_INVALID_ADDRESS) 112747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 112847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 112947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Couldn't allocate memory for an AllocaInst"); 1130ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1131ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(memory_allocation_error); 113247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 113347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 113447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 113513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb::addr_t P = frame.Malloc(Tptr); 113647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 113713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (P == LLDB_INVALID_ADDRESS) 113847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 113947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 114047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Couldn't allocate the result pointer for an AllocaInst"); 1141ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1142ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(memory_allocation_error); 114347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 114447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 114547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 114613615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb_private::Error write_error; 114713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 114813615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.WritePointerToMemory(P, R, write_error); 114947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 115013615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (!write_error.Success()) 115147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 115247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 1153ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan log->Printf("Couldn't write the result pointer for an AllocaInst"); 1154ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1155ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(memory_write_error); 115613615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb_private::Error free_error; 115713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.Free(P, free_error); 115813615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.Free(R, free_error); 115947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 116047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 116147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 116247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan frame.m_values[alloca_inst] = P; 116347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 116447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 116547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 116647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Interpreted an AllocaInst"); 116713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan log->Printf(" R : 0x%llx", R); 116813615cfef0435af28ccc1e93e13c6161e94585edSean Callanan log->Printf(" P : 0x%llx", P); 116947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 117047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 117147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 117247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::BitCast: 11736a3f9af114bfdc05c7b89de45fe7e0a52aceef0aSean Callanan case Instruction::ZExt: 117447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 11756a3f9af114bfdc05c7b89de45fe7e0a52aceef0aSean Callanan const CastInst *cast_inst = dyn_cast<CastInst>(inst); 117647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 11776a3f9af114bfdc05c7b89de45fe7e0a52aceef0aSean Callanan if (!cast_inst) 117847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 117947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 11806a3f9af114bfdc05c7b89de45fe7e0a52aceef0aSean Callanan log->Printf("getOpcode() returns %s, but instruction is not a BitCastInst", cast_inst->getOpcodeName()); 1181ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1182ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(interpreter_internal_error); 118347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 118447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 118547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 11866a3f9af114bfdc05c7b89de45fe7e0a52aceef0aSean Callanan Value *source = cast_inst->getOperand(0); 118747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 118847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Scalar S; 118947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 119047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!frame.EvaluateValue(S, source, llvm_module)) 119147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 119247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 119347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Couldn't evaluate %s", PrintValue(source).c_str()); 1194ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1195ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(bad_value_error); 119647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 119747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 119847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 119947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan frame.AssignValue(inst, S, llvm_module); 120047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 120147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 120247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Br: 120347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 120447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const BranchInst *br_inst = dyn_cast<BranchInst>(inst); 120547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 120647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!br_inst) 120747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 120847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 120947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("getOpcode() returns Br, but instruction is not a BranchInst"); 1210ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1211ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(interpreter_internal_error); 121247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 121347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 121447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 121547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (br_inst->isConditional()) 121647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 121747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Value *condition = br_inst->getCondition(); 121847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 121947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Scalar C; 122047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 122147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!frame.EvaluateValue(C, condition, llvm_module)) 122247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 122347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 122447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Couldn't evaluate %s", PrintValue(condition).c_str()); 1225ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1226ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(bad_value_error); 122747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 122847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 122947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 123047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (C.GetRawBits64(0)) 123147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan frame.Jump(br_inst->getSuccessor(0)); 123247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 123347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan frame.Jump(br_inst->getSuccessor(1)); 123447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 123547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 123647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 123747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Interpreted a BrInst with a condition"); 123847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" cond : %s", frame.SummarizeValue(condition).c_str()); 123947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 124047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 124147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 124247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 124347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan frame.Jump(br_inst->getSuccessor(0)); 124447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 124547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 124647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 124747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Interpreted a BrInst with no condition"); 124847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 124947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 125047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 125147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan continue; 125247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::GetElementPtr: 125347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 125447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const GetElementPtrInst *gep_inst = dyn_cast<GetElementPtrInst>(inst); 125547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 125647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!gep_inst) 125747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 125847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 125947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("getOpcode() returns GetElementPtr, but instruction is not a GetElementPtrInst"); 1260ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1261ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(interpreter_internal_error); 126247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 126347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 126447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 126547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const Value *pointer_operand = gep_inst->getPointerOperand(); 126647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Type *pointer_type = pointer_operand->getType(); 126747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 126847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Scalar P; 126947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 127047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!frame.EvaluateValue(P, pointer_operand, llvm_module)) 1271ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan { 1272ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan if (log) 1273ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan log->Printf("Couldn't evaluate %s", PrintValue(pointer_operand).c_str()); 1274ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1275ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(bad_value_error); 127647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 1277ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan } 1278ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan 12797347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan typedef SmallVector <Value *, 8> IndexVector; 12807347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan typedef IndexVector::iterator IndexIterator; 12817347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan 128247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan SmallVector <Value *, 8> indices (gep_inst->idx_begin(), 128347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan gep_inst->idx_end()); 128447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 12857347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan SmallVector <Value *, 8> const_indices; 12867347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan 12877347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan for (IndexIterator ii = indices.begin(), ie = indices.end(); 12887347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan ii != ie; 12897347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan ++ii) 12907347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan { 12917347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan ConstantInt *constant_index = dyn_cast<ConstantInt>(*ii); 12927347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan 12937347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan if (!constant_index) 12947347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan { 12957347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan lldb_private::Scalar I; 12967347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan 12977347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan if (!frame.EvaluateValue(I, *ii, llvm_module)) 12987347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan { 12997347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan if (log) 13007347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan log->Printf("Couldn't evaluate %s", PrintValue(*ii).c_str()); 13017347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan err.SetErrorToGenericError(); 13027347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan err.SetErrorString(bad_value_error); 13037347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan return false; 13047347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan } 13057347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan 13067347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan if (log) 13077347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan log->Printf("Evaluated constant index %s as %llu", PrintValue(*ii).c_str(), I.ULongLong(LLDB_INVALID_ADDRESS)); 13087347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan 13097347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan constant_index = cast<ConstantInt>(ConstantInt::get((*ii)->getType(), I.ULongLong(LLDB_INVALID_ADDRESS))); 13107347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan } 13117347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan 13127347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan const_indices.push_back(constant_index); 13137347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan } 13147347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan 13157347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan uint64_t offset = target_data.getIndexedOffset(pointer_type, const_indices); 131647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 131747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Scalar Poffset = P + offset; 131847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 131947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan frame.AssignValue(inst, Poffset, llvm_module); 132047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 132147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 132247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 132347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Interpreted a GetElementPtrInst"); 132447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" P : %s", frame.SummarizeValue(pointer_operand).c_str()); 132547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" Poffset : %s", frame.SummarizeValue(inst).c_str()); 132647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 132747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 132847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 132947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::ICmp: 133047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 133147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const ICmpInst *icmp_inst = dyn_cast<ICmpInst>(inst); 133247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 133347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!icmp_inst) 133447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 133547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 133647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("getOpcode() returns ICmp, but instruction is not an ICmpInst"); 1337ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1338ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(interpreter_internal_error); 133947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 134047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 134147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 134247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan CmpInst::Predicate predicate = icmp_inst->getPredicate(); 134347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 134447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Value *lhs = inst->getOperand(0); 134547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Value *rhs = inst->getOperand(1); 134647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 134747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Scalar L; 134847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Scalar R; 134947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 135047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!frame.EvaluateValue(L, lhs, llvm_module)) 135147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 135247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 135347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Couldn't evaluate %s", PrintValue(lhs).c_str()); 1354ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1355ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(bad_value_error); 135647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 135747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 135847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 135947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!frame.EvaluateValue(R, rhs, llvm_module)) 136047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 136147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 136247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Couldn't evaluate %s", PrintValue(rhs).c_str()); 1363ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1364ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(bad_value_error); 136547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 136647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 136747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 136847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Scalar result; 136947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 137047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (predicate) 137147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 137247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan default: 137347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 137447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_EQ: 137547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = (L == R); 137647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 137747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_NE: 137847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = (L != R); 137947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 138047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_UGT: 138147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = (L.GetRawBits64(0) > R.GetRawBits64(0)); 138247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 138347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_UGE: 138447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = (L.GetRawBits64(0) >= R.GetRawBits64(0)); 138547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 138647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_ULT: 138747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = (L.GetRawBits64(0) < R.GetRawBits64(0)); 138847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 138947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_ULE: 139047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = (L.GetRawBits64(0) <= R.GetRawBits64(0)); 139147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 139247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_SGT: 139347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = (L > R); 139447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 139547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_SGE: 139647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = (L >= R); 139747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 139847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_SLT: 139947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = (L < R); 140047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 140147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_SLE: 140247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = (L <= R); 140347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 140447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 140547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 140647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan frame.AssignValue(inst, result, llvm_module); 140747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 140847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 140947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 141047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Interpreted an ICmpInst"); 141147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" L : %s", frame.SummarizeValue(lhs).c_str()); 141247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" R : %s", frame.SummarizeValue(rhs).c_str()); 141347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" = : %s", frame.SummarizeValue(inst).c_str()); 141447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 141547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 141647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 1417557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan case Instruction::IntToPtr: 1418557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan { 1419557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan const IntToPtrInst *int_to_ptr_inst = dyn_cast<IntToPtrInst>(inst); 1420557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 1421557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan if (!int_to_ptr_inst) 1422557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan { 1423557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan if (log) 1424557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan log->Printf("getOpcode() returns IntToPtr, but instruction is not an IntToPtrInst"); 1425ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1426ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(interpreter_internal_error); 1427557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan return false; 1428557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 1429557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 1430557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan Value *src_operand = int_to_ptr_inst->getOperand(0); 1431557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 1432557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan lldb_private::Scalar I; 1433557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 1434557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan if (!frame.EvaluateValue(I, src_operand, llvm_module)) 1435ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan { 1436ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan if (log) 1437ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan log->Printf("Couldn't evaluate %s", PrintValue(src_operand).c_str()); 1438ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1439ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(bad_value_error); 1440557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan return false; 1441ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan } 1442557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 1443557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan frame.AssignValue(inst, I, llvm_module); 1444557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 1445557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan if (log) 1446557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan { 1447557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan log->Printf("Interpreted an IntToPtr"); 1448557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan log->Printf(" Src : %s", frame.SummarizeValue(src_operand).c_str()); 1449557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan log->Printf(" = : %s", frame.SummarizeValue(inst).c_str()); 1450557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 1451557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 1452557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan break; 14536b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan case Instruction::PtrToInt: 14546b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan { 14556b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan const PtrToIntInst *ptr_to_int_inst = dyn_cast<PtrToIntInst>(inst); 14566b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan 14576b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan if (!ptr_to_int_inst) 14586b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan { 14596b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan if (log) 14606b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan log->Printf("getOpcode() returns PtrToInt, but instruction is not an PtrToIntInst"); 14616b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan err.SetErrorToGenericError(); 14626b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan err.SetErrorString(interpreter_internal_error); 14636b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan return false; 14646b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan } 14656b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan 14666b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan Value *src_operand = ptr_to_int_inst->getOperand(0); 14676b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan 14686b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan lldb_private::Scalar I; 14696b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan 14706b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan if (!frame.EvaluateValue(I, src_operand, llvm_module)) 14716b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan { 14726b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan if (log) 14736b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan log->Printf("Couldn't evaluate %s", PrintValue(src_operand).c_str()); 14746b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan err.SetErrorToGenericError(); 14756b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan err.SetErrorString(bad_value_error); 14766b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan return false; 14776b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan } 14786b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan 14796b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan frame.AssignValue(inst, I, llvm_module); 14806b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan 14816b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan if (log) 14826b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan { 14836b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan log->Printf("Interpreted a PtrToInt"); 14846b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan log->Printf(" Src : %s", frame.SummarizeValue(src_operand).c_str()); 14856b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan log->Printf(" = : %s", frame.SummarizeValue(inst).c_str()); 14866b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan } 14876b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan } 14886b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan break; 148947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Load: 149047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 149147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const LoadInst *load_inst = dyn_cast<LoadInst>(inst); 149247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 149347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!load_inst) 149447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 149547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 149647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("getOpcode() returns Load, but instruction is not a LoadInst"); 1497ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1498ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(interpreter_internal_error); 149947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 150047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 150147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 150247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // The semantics of Load are: 150347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Create a region D that will contain the loaded data 150447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Resolve the region P containing a pointer 150547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Dereference P to get the region R that the data should be loaded from 150647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Transfer a unit of type type(D) from R to D 150747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 150847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const Value *pointer_operand = load_inst->getPointerOperand(); 150947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 151047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Type *pointer_ty = pointer_operand->getType(); 151147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan PointerType *pointer_ptr_ty = dyn_cast<PointerType>(pointer_ty); 151247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!pointer_ptr_ty) 1513ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan { 1514ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan if (log) 1515ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan log->Printf("getPointerOperand()->getType() is not a PointerType"); 1516ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1517ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(interpreter_internal_error); 151847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 1519ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan } 152047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Type *target_ty = pointer_ptr_ty->getElementType(); 152147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 152213615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb::addr_t D = frame.ResolveValue(load_inst, llvm_module); 152313615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb::addr_t P = frame.ResolveValue(pointer_operand, llvm_module); 152447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 152513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (D == LLDB_INVALID_ADDRESS) 152647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 152747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 152847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("LoadInst's value doesn't resolve to anything"); 1529ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1530ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(bad_value_error); 153147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 153247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 153347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 153413615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (P == LLDB_INVALID_ADDRESS) 153547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 153647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 153747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("LoadInst's pointer doesn't resolve to anything"); 1538ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1539ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(bad_value_error); 154047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 154147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 154247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 154313615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb::addr_t R; 154413615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb_private::Error read_error; 154513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.ReadPointerFromMemory(&R, P, read_error); 154647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 154713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (!read_error.Success()) 154813615cfef0435af28ccc1e93e13c6161e94585edSean Callanan { 154913615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (log) 155013615cfef0435af28ccc1e93e13c6161e94585edSean Callanan log->Printf("Couldn't read the address to be loaded for a LoadInst"); 155113615cfef0435af28ccc1e93e13c6161e94585edSean Callanan err.SetErrorToGenericError(); 155213615cfef0435af28ccc1e93e13c6161e94585edSean Callanan err.SetErrorString(memory_read_error); 155313615cfef0435af28ccc1e93e13c6161e94585edSean Callanan return false; 155413615cfef0435af28ccc1e93e13c6161e94585edSean Callanan } 155513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 155613615cfef0435af28ccc1e93e13c6161e94585edSean Callanan size_t target_size = target_data.getTypeStoreSize(target_ty); 155713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb_private::DataBufferHeap buffer(target_size, 0); 155847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 155913615cfef0435af28ccc1e93e13c6161e94585edSean Callanan read_error.Clear(); 156013615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.ReadMemory(buffer.GetBytes(), R, buffer.GetByteSize(), read_error); 156113615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (!read_error.Success()) 1562557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan { 156313615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (log) 156413615cfef0435af28ccc1e93e13c6161e94585edSean Callanan log->Printf("Couldn't read from a region on behalf of a LoadInst"); 156513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan err.SetErrorToGenericError(); 156613615cfef0435af28ccc1e93e13c6161e94585edSean Callanan err.SetErrorString(memory_read_error); 156713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan return false; 1568557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 156913615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 157013615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb_private::Error write_error; 157113615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.WriteMemory(D, buffer.GetBytes(), buffer.GetByteSize(), write_error); 157213615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (!write_error.Success()) 1573557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan { 157413615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (log) 157513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan log->Printf("Couldn't write to a region on behalf of a LoadInst"); 157613615cfef0435af28ccc1e93e13c6161e94585edSean Callanan err.SetErrorToGenericError(); 157713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan err.SetErrorString(memory_read_error); 157813615cfef0435af28ccc1e93e13c6161e94585edSean Callanan return false; 1579557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 158047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 158147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 158247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 158347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Interpreted a LoadInst"); 158413615cfef0435af28ccc1e93e13c6161e94585edSean Callanan log->Printf(" P : 0x%llx", P); 158513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan log->Printf(" R : 0x%llx", R); 158613615cfef0435af28ccc1e93e13c6161e94585edSean Callanan log->Printf(" D : 0x%llx", D); 158747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 158847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 158947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 159047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Ret: 159147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 159213615cfef0435af28ccc1e93e13c6161e94585edSean Callanan frame.RestoreLLDBValues(); 159313615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 159447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (result_name.IsEmpty()) 159547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return true; 159647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 159747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan GlobalValue *result_value = llvm_module.getNamedValue(result_name.GetCString()); 15988f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan 15998f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan if (!frame.ConstructResult(result, result_value, result_name, result_type, llvm_module)) 16008f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan { 16018f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan if (log) 16028f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan log->Printf("Couldn't construct the expression's result"); 16038f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan err.SetErrorToGenericError(); 16048f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan err.SetErrorString(bad_result_error); 16058f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan return false; 16068f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan } 16078f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan 16088f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan return true; 160947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 161047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Store: 161147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 161247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const StoreInst *store_inst = dyn_cast<StoreInst>(inst); 161347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 161447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!store_inst) 161547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 161647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 161747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("getOpcode() returns Store, but instruction is not a StoreInst"); 1618ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1619ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(interpreter_internal_error); 162047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 162147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 162247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 162347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // The semantics of Store are: 162447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Resolve the region D containing the data to be stored 162547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Resolve the region P containing a pointer 162647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Dereference P to get the region R that the data should be stored in 162747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Transfer a unit of type type(D) from D to R 162847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 162947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const Value *value_operand = store_inst->getValueOperand(); 163047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const Value *pointer_operand = store_inst->getPointerOperand(); 163147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 163247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Type *pointer_ty = pointer_operand->getType(); 163347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan PointerType *pointer_ptr_ty = dyn_cast<PointerType>(pointer_ty); 163447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!pointer_ptr_ty) 163547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 163647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Type *target_ty = pointer_ptr_ty->getElementType(); 163747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 163813615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb::addr_t D = frame.ResolveValue(value_operand, llvm_module); 163913615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb::addr_t P = frame.ResolveValue(pointer_operand, llvm_module); 164047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 164113615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (D == LLDB_INVALID_ADDRESS) 164247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 164347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 164447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("StoreInst's value doesn't resolve to anything"); 1645ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1646ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(bad_value_error); 164747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 164847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 164947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 165013615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (P == LLDB_INVALID_ADDRESS) 165147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 165247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 165347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("StoreInst's pointer doesn't resolve to anything"); 1654ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1655ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(bad_value_error); 165647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 165747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 165847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 165913615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb::addr_t R; 166013615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb_private::Error read_error; 166113615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.ReadPointerFromMemory(&R, P, read_error); 166247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 166313615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (!read_error.Success()) 166413615cfef0435af28ccc1e93e13c6161e94585edSean Callanan { 166513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (log) 166613615cfef0435af28ccc1e93e13c6161e94585edSean Callanan log->Printf("Couldn't read the address to be loaded for a LoadInst"); 166713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan err.SetErrorToGenericError(); 166813615cfef0435af28ccc1e93e13c6161e94585edSean Callanan err.SetErrorString(memory_read_error); 166913615cfef0435af28ccc1e93e13c6161e94585edSean Callanan return false; 167013615cfef0435af28ccc1e93e13c6161e94585edSean Callanan } 167147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 167213615cfef0435af28ccc1e93e13c6161e94585edSean Callanan size_t target_size = target_data.getTypeStoreSize(target_ty); 167313615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb_private::DataBufferHeap buffer(target_size, 0); 167447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 167513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan read_error.Clear(); 167613615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.ReadMemory(buffer.GetBytes(), D, buffer.GetByteSize(), read_error); 167713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (!read_error.Success()) 167847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 167913615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (log) 168013615cfef0435af28ccc1e93e13c6161e94585edSean Callanan log->Printf("Couldn't read from a region on behalf of a StoreInst"); 168113615cfef0435af28ccc1e93e13c6161e94585edSean Callanan err.SetErrorToGenericError(); 168213615cfef0435af28ccc1e93e13c6161e94585edSean Callanan err.SetErrorString(memory_read_error); 168313615cfef0435af28ccc1e93e13c6161e94585edSean Callanan return false; 1684557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 168513615cfef0435af28ccc1e93e13c6161e94585edSean Callanan 168613615cfef0435af28ccc1e93e13c6161e94585edSean Callanan lldb_private::Error write_error; 168713615cfef0435af28ccc1e93e13c6161e94585edSean Callanan m_memory_map.WriteMemory(R, buffer.GetBytes(), buffer.GetByteSize(), write_error); 168813615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (!write_error.Success()) 1689557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan { 169013615cfef0435af28ccc1e93e13c6161e94585edSean Callanan if (log) 169113615cfef0435af28ccc1e93e13c6161e94585edSean Callanan log->Printf("Couldn't write to a region on behalf of a StoreInst"); 169213615cfef0435af28ccc1e93e13c6161e94585edSean Callanan err.SetErrorToGenericError(); 169313615cfef0435af28ccc1e93e13c6161e94585edSean Callanan err.SetErrorString(memory_read_error); 169413615cfef0435af28ccc1e93e13c6161e94585edSean Callanan return false; 169547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 169647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 169747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 169847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 169947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Interpreted a StoreInst"); 170013615cfef0435af28ccc1e93e13c6161e94585edSean Callanan log->Printf(" D : 0x%llx", D); 170113615cfef0435af28ccc1e93e13c6161e94585edSean Callanan log->Printf(" P : 0x%llx", P); 170213615cfef0435af28ccc1e93e13c6161e94585edSean Callanan log->Printf(" R : 0x%llx", R); 170347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 170447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 170547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 170647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 170747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 170847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ++frame.m_ii; 170947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 171047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 171147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (num_insts >= 4096) 1712ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan { 1713ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1714ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(infinite_loop_error); 171547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 1716ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan } 1717ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan 171847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 1719141f8d98cb74262914d66a7af4732e8cb2d8699fGreg Clayton} 1720