IRInterpreter.cpp revision 36da2aa6dc5ad9994b638ed09eb81c44cc05540b
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, 3047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Stream *error_stream) : 31b9db9d5bb01963774f28540dbe2c5a11f586ff29Daniel Malea m_decl_map(decl_map) 3247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 3347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 3447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 3547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 3647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananIRInterpreter::~IRInterpreter() 3747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 3847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 3947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 4047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 4147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananstatic std::string 4247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananPrintValue(const Value *value, bool truncate = false) 4347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 4447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan std::string s; 4547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan raw_string_ostream rso(s); 4647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan value->print(rso); 4747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan rso.flush(); 4847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (truncate) 4947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan s.resize(s.length() - 1); 5047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 5147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t offset; 5247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan while ((offset = s.find('\n')) != s.npos) 5347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan s.erase(offset, 1); 5447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan while (s[0] == ' ' || s[0] == '\t') 5547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan s.erase(0, 1); 5647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 5747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return s; 5847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 5947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 6047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananstatic std::string 6147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananPrintType(const Type *type, bool truncate = false) 6247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 6347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan std::string s; 6447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan raw_string_ostream rso(s); 6547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan type->print(rso); 6647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan rso.flush(); 6747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (truncate) 6847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan s.resize(s.length() - 1); 6947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return s; 7047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 7147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 72598df88bd6fc33c6fb330bc859bdc277795501f3Greg Claytontypedef STD_SHARED_PTR(lldb_private::DataEncoder) DataEncoderSP; 73598df88bd6fc33c6fb330bc859bdc277795501f3Greg Claytontypedef STD_SHARED_PTR(lldb_private::DataExtractor) DataExtractorSP; 7447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 7547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananclass Memory 7647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 7747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananpublic: 7847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan typedef uint32_t index_t; 7947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 8047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan struct Allocation 8147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 8247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // m_virtual_address is always the address of the variable in the virtual memory 8347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // space provided by Memory. 8447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // 8547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // m_origin is always non-NULL and describes the source of the data (possibly 8647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // m_data if this allocation is the authoritative source). 8747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // 8847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Possible value configurations: 8947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // 9047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Allocation type getValueType() getContextType() m_origin->GetScalar() m_data 9147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // ========================================================================================================================= 9247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // FileAddress eValueTypeFileAddress eContextTypeInvalid A location in a binary NULL 9347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // image 9447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // 9547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // LoadAddress eValueTypeLoadAddress eContextTypeInvalid A location in the target's NULL 9647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // virtual memory 9747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // 9847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Alloca eValueTypeHostAddress eContextTypeInvalid == m_data->GetBytes() Deleted at end of 9947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // execution 10047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // 10147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // PersistentVar eValueTypeHostAddress eContextTypeClangType A persistent variable's NULL 10247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // location in LLDB's memory 10347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // 10447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Register [ignored] eContextTypeRegister [ignored] Flushed to the register 10547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // at the end of execution 10647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 10747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::addr_t m_virtual_address; 10847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t m_extent; 10947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Value m_origin; 11047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::DataBufferSP m_data; 11147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 11247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Allocation (lldb::addr_t virtual_address, 11347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t extent, 11447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::DataBufferSP data) : 11547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_virtual_address(virtual_address), 11647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_extent(extent), 11747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_data(data) 11847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 11947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 12047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 12147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Allocation (const Allocation &allocation) : 12247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_virtual_address(allocation.m_virtual_address), 12347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_extent(allocation.m_extent), 12447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_origin(allocation.m_origin), 12547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_data(allocation.m_data) 12647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 12747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 12847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan }; 12947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 130598df88bd6fc33c6fb330bc859bdc277795501f3Greg Clayton typedef STD_SHARED_PTR(Allocation) AllocationSP; 13147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 13247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan struct Region 13347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 13447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan AllocationSP m_allocation; 13547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan uint64_t m_base; 13647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan uint64_t m_extent; 13747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 13847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Region () : 13947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_allocation(), 14047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_base(0), 14147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_extent(0) 14247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 14347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 14447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 14547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Region (AllocationSP allocation, uint64_t base, uint64_t extent) : 14647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_allocation(allocation), 14747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_base(base), 14847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_extent(extent) 14947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 15047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 15147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 15247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Region (const Region ®ion) : 15347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_allocation(region.m_allocation), 15447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_base(region.m_base), 15547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_extent(region.m_extent) 15647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 15747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 15847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 15947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan bool IsValid () 16047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 1619880efacdd3a5e855b405d89433a01170422a889Jim Ingham return (bool) m_allocation; 16247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 16347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 16447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan bool IsInvalid () 16547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 166b386d82334b65fb984348f2027b1cb7714de993fSean Callanan return !m_allocation; 16747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 16847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan }; 16947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 17047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan typedef std::vector <AllocationSP> MemoryMap; 17147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 17247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananprivate: 17347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::addr_t m_addr_base; 17447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::addr_t m_addr_max; 17547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan MemoryMap m_memory; 17647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::ByteOrder m_byte_order; 17747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::addr_t m_addr_byte_size; 1783051ed73a487e92f12f8b6062f8415781453da21Micah Villmow DataLayout &m_target_data; 17947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 18047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::ClangExpressionDeclMap &m_decl_map; 18147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 18247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan MemoryMap::iterator LookupInternal (lldb::addr_t addr) 18347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 18447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan for (MemoryMap::iterator i = m_memory.begin(), e = m_memory.end(); 18547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan i != e; 18647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ++i) 18747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 18847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if ((*i)->m_virtual_address <= addr && 18947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan (*i)->m_virtual_address + (*i)->m_extent > addr) 19047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return i; 19147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 19247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 19347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return m_memory.end(); 19447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 19547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 19647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananpublic: 1973051ed73a487e92f12f8b6062f8415781453da21Micah Villmow Memory (DataLayout &target_data, 19847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::ClangExpressionDeclMap &decl_map, 19947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::addr_t alloc_start, 20047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::addr_t alloc_max) : 20147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_addr_base(alloc_start), 20247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_addr_max(alloc_max), 20347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_target_data(target_data), 20447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_decl_map(decl_map) 20547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 20647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_byte_order = (target_data.isLittleEndian() ? lldb::eByteOrderLittle : lldb::eByteOrderBig); 207ce6335881f330581f641ef808602cac192664adfMicah Villmow m_addr_byte_size = (target_data.getPointerSize(0)); 20847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 20947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 21047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Region Malloc (size_t size, size_t align) 21147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 21247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::DataBufferSP data(new lldb_private::DataBufferHeap(size, 0)); 21347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 21447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (data) 21547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 21647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan index_t index = m_memory.size(); 21747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 21847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const size_t mask = (align - 1); 21947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 22047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_addr_base += mask; 22147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_addr_base &= ~mask; 22247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 22347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (m_addr_base + size < m_addr_base || 22447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_addr_base + size > m_addr_max) 22547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Region(); 22647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 22747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan uint64_t base = m_addr_base; 22847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 22947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_memory.push_back(AllocationSP(new Allocation(base, size, data))); 23047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 23147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_addr_base += size; 23247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 23347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan AllocationSP alloc = m_memory[index]; 23447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 23547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan alloc->m_origin.GetScalar() = (unsigned long long)data->GetBytes(); 23647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan alloc->m_origin.SetContext(lldb_private::Value::eContextTypeInvalid, NULL); 23747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan alloc->m_origin.SetValueType(lldb_private::Value::eValueTypeHostAddress); 23847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 23947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Region(alloc, base, size); 24047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 24147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 24247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Region(); 24347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 24447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 24547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Region Malloc (Type *type) 24647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 24747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Malloc (m_target_data.getTypeAllocSize(type), 24847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_target_data.getPrefTypeAlignment(type)); 24947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 25047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 25147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Region Place (Type *type, lldb::addr_t base, lldb_private::Value &value) 25247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 25347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan index_t index = m_memory.size(); 25447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t size = m_target_data.getTypeAllocSize(type); 25547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 25647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_memory.push_back(AllocationSP(new Allocation(base, size, lldb::DataBufferSP()))); 25747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 25847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan AllocationSP alloc = m_memory[index]; 25947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 26047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan alloc->m_origin = value; 26147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 26247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Region(alloc, base, size); 26347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 26447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 26547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan void Free (lldb::addr_t addr) 26647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 26747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan MemoryMap::iterator i = LookupInternal (addr); 26847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 26947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (i != m_memory.end()) 27047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_memory.erase(i); 27147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 27247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 27347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Region Lookup (lldb::addr_t addr, Type *type) 27447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 27547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan MemoryMap::iterator i = LookupInternal(addr); 27647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 277740b3b79b72e91a3e791693f178eef916e7a6febSean Callanan if (i == m_memory.end() || !type->isSized()) 27847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Region(); 279740b3b79b72e91a3e791693f178eef916e7a6febSean Callanan 280740b3b79b72e91a3e791693f178eef916e7a6febSean Callanan size_t size = m_target_data.getTypeStoreSize(type); 28147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 28247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Region(*i, addr, size); 28347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 28447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 28547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan DataEncoderSP GetEncoder (Region region) 28647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 28747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (region.m_allocation->m_origin.GetValueType() != lldb_private::Value::eValueTypeHostAddress) 28847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return DataEncoderSP(); 28947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 29047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::DataBufferSP buffer = region.m_allocation->m_data; 29147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 29247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!buffer) 29347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return DataEncoderSP(); 29447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 29547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t base_offset = (size_t)(region.m_base - region.m_allocation->m_virtual_address); 29647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 29747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return DataEncoderSP(new lldb_private::DataEncoder(buffer->GetBytes() + base_offset, region.m_extent, m_byte_order, m_addr_byte_size)); 29847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 29947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 30047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan DataExtractorSP GetExtractor (Region region) 30147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 30247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (region.m_allocation->m_origin.GetValueType() != lldb_private::Value::eValueTypeHostAddress) 30347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return DataExtractorSP(); 30447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 30547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::DataBufferSP buffer = region.m_allocation->m_data; 30647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t base_offset = (size_t)(region.m_base - region.m_allocation->m_virtual_address); 30747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 30847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (buffer) 30947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return DataExtractorSP(new lldb_private::DataExtractor(buffer->GetBytes() + base_offset, region.m_extent, m_byte_order, m_addr_byte_size)); 31047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 31147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return DataExtractorSP(new lldb_private::DataExtractor((uint8_t*)region.m_allocation->m_origin.GetScalar().ULongLong() + base_offset, region.m_extent, m_byte_order, m_addr_byte_size)); 31247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 31347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 31447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Value GetAccessTarget(lldb::addr_t addr) 31547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 31647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan MemoryMap::iterator i = LookupInternal(addr); 31747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 31847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (i == m_memory.end()) 31947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return lldb_private::Value(); 32047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 32147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Value target = (*i)->m_origin; 32247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 32347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (target.GetContextType() == lldb_private::Value::eContextTypeRegisterInfo) 32447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 32547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan target.SetContext(lldb_private::Value::eContextTypeInvalid, NULL); 32647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan target.SetValueType(lldb_private::Value::eValueTypeHostAddress); 32747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan target.GetScalar() = (unsigned long long)(*i)->m_data->GetBytes(); 32847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 32947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 33047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan target.GetScalar() += (addr - (*i)->m_virtual_address); 33147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 33247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return target; 33347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 33447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 33547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan bool Write (lldb::addr_t addr, const uint8_t *data, size_t length) 33647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 33747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Value target = GetAccessTarget(addr); 33847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 33947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return m_decl_map.WriteTarget(target, data, length); 34047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 34147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 34247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan bool Read (uint8_t *data, lldb::addr_t addr, size_t length) 34347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 344557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan lldb_private::Value source = GetAccessTarget(addr); 345557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 346557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan return m_decl_map.ReadTarget(data, source, length); 347557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 348557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 349557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan bool WriteToRawPtr (lldb::addr_t addr, const uint8_t *data, size_t length) 350557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan { 351557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan lldb_private::Value target = m_decl_map.WrapBareAddress(addr); 352557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 353557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan return m_decl_map.WriteTarget(target, data, length); 354557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 355557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 356557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan bool ReadFromRawPtr (uint8_t *data, lldb::addr_t addr, size_t length) 357557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan { 358557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan lldb_private::Value source = m_decl_map.WrapBareAddress(addr); 35947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 360557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan return m_decl_map.ReadTarget(data, source, length); 36147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 36247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 36347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan std::string PrintData (lldb::addr_t addr, size_t length) 36447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 36547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Value target = GetAccessTarget(addr); 36647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 36747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::DataBufferHeap buf(length, 0); 36847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 36947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!m_decl_map.ReadTarget(buf.GetBytes(), target, length)) 37047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return std::string("<couldn't read data>"); 37147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 37247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::StreamString ss; 37347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 37447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan for (size_t i = 0; i < length; i++) 37547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 37647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if ((!(i & 0xf)) && i) 37747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ss.Printf("%02hhx - ", buf.GetBytes()[i]); 37847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 37947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ss.Printf("%02hhx ", buf.GetBytes()[i]); 38047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 38147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 38247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return ss.GetString(); 38347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 38447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 38547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan std::string SummarizeRegion (Region ®ion) 38647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 38747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::StreamString ss; 38847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 38947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Value base = GetAccessTarget(region.m_base); 39047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 3915f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea ss.Printf("%" PRIx64 " [%s - %s %llx]", 39247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan region.m_base, 39347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Value::GetValueTypeAsCString(base.GetValueType()), 39447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Value::GetContextTypeAsCString(base.GetContextType()), 39547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan base.GetScalar().ULongLong()); 39647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 39747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ss.Printf(" %s", PrintData(region.m_base, region.m_extent).c_str()); 39847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 39947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return ss.GetString(); 40047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 40147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}; 40247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 40347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananclass InterpreterStackFrame 40447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 40547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananpublic: 40647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan typedef std::map <const Value*, Memory::Region> ValueMap; 40747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 40847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ValueMap m_values; 40947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory &m_memory; 4103051ed73a487e92f12f8b6062f8415781453da21Micah Villmow DataLayout &m_target_data; 41147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::ClangExpressionDeclMap &m_decl_map; 41247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const BasicBlock *m_bb; 41347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan BasicBlock::const_iterator m_ii; 41447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan BasicBlock::const_iterator m_ie; 41547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 41647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::ByteOrder m_byte_order; 41747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t m_addr_byte_size; 41847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 4193051ed73a487e92f12f8b6062f8415781453da21Micah Villmow InterpreterStackFrame (DataLayout &target_data, 42047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory &memory, 42147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::ClangExpressionDeclMap &decl_map) : 42247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_memory (memory), 42397c8957257a3e0b3ce6f46f8e5a28c965e30f357Daniel Dunbar m_target_data (target_data), 42447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_decl_map (decl_map) 42547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 42647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_byte_order = (target_data.isLittleEndian() ? lldb::eByteOrderLittle : lldb::eByteOrderBig); 4274fbe61ba371bfde827b9424ebe5e14dce3d5fad3Sean Callanan m_addr_byte_size = (target_data.getPointerSize(0)); 42847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 42947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 43047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan void Jump (const BasicBlock *bb) 43147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 43247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_bb = bb; 43347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_ii = m_bb->begin(); 43447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_ie = m_bb->end(); 43547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 43647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 43747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan bool Cache (Memory::AllocationSP allocation, Type *type) 43847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 43947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (allocation->m_origin.GetContextType() != lldb_private::Value::eContextTypeRegisterInfo) 44047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 44147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 44247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return m_decl_map.ReadTarget(allocation->m_data->GetBytes(), allocation->m_origin, allocation->m_data->GetByteSize()); 44347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 44447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 44547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan std::string SummarizeValue (const Value *value) 44647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 44747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::StreamString ss; 44847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 44947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ss.Printf("%s", PrintValue(value).c_str()); 45047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 45147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ValueMap::iterator i = m_values.find(value); 45247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 45347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (i != m_values.end()) 45447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 45547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region region = i->second; 45647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 45747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ss.Printf(" %s", m_memory.SummarizeRegion(region).c_str()); 45847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 45947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 46047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return ss.GetString(); 46147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 46247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 46347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan bool AssignToMatchType (lldb_private::Scalar &scalar, uint64_t u64value, Type *type) 46447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 46547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t type_size = m_target_data.getTypeStoreSize(type); 46647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 46747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (type_size) 46847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 46947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case 1: 47047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan scalar = (uint8_t)u64value; 47147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 47247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case 2: 47347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan scalar = (uint16_t)u64value; 47447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 47547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case 4: 47647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan scalar = (uint32_t)u64value; 47747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 47847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case 8: 47947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan scalar = (uint64_t)u64value; 48047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 48147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan default: 48247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 48347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 48447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 48547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return true; 48647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 48747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 48847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan bool EvaluateValue (lldb_private::Scalar &scalar, const Value *value, Module &module) 48947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 49047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const Constant *constant = dyn_cast<Constant>(value); 49147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 49247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (constant) 49347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 49447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (const ConstantInt *constant_int = dyn_cast<ConstantInt>(constant)) 49547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 49647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return AssignToMatchType(scalar, constant_int->getLimitedValue(), value->getType()); 49747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 49847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 49947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 50047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 50147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region region = ResolveValue(value, module); 50247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan DataExtractorSP value_extractor = m_memory.GetExtractor(region); 50347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 50447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!value_extractor) 50547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 50647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 50747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t value_size = m_target_data.getTypeStoreSize(value->getType()); 50847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 50936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t offset = 0; 51047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan uint64_t u64value = value_extractor->GetMaxU64(&offset, value_size); 51147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 51247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return AssignToMatchType(scalar, u64value, value->getType()); 51347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 51447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 51547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 51647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 51747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 51847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan bool AssignValue (const Value *value, lldb_private::Scalar &scalar, Module &module) 51947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 52047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region region = ResolveValue (value, module); 52147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 52247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Scalar cast_scalar; 52347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 52447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!AssignToMatchType(cast_scalar, scalar.GetRawBits64(0), value->getType())) 52547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 52647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 52747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::DataBufferHeap buf(cast_scalar.GetByteSize(), 0); 52847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 52947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Error err; 53047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 53147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!cast_scalar.GetAsMemoryData(buf.GetBytes(), buf.GetByteSize(), m_byte_order, err)) 53247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 53347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 53447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan DataEncoderSP region_encoder = m_memory.GetEncoder(region); 53547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 53647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan memcpy(region_encoder->GetDataStart(), buf.GetBytes(), buf.GetByteSize()); 53747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 53847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return true; 53947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 54047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 5418eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan bool ResolveConstantValue (APInt &value, const Constant *constant) 54247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 54347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (const ConstantInt *constant_int = dyn_cast<ConstantInt>(constant)) 54447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 5458eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan value = constant_int->getValue(); 5468eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan return true; 54747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 548557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan else if (const ConstantFP *constant_fp = dyn_cast<ConstantFP>(constant)) 54947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 5508eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan value = constant_fp->getValueAPF().bitcastToAPInt(); 5518eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan return true; 55247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 553557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan else if (const ConstantExpr *constant_expr = dyn_cast<ConstantExpr>(constant)) 554557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan { 555557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan switch (constant_expr->getOpcode()) 556557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan { 5578eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan default: 5588eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan return false; 5598eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan case Instruction::IntToPtr: 5606b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan case Instruction::PtrToInt: 5618eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan case Instruction::BitCast: 5628eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan return ResolveConstantValue(value, constant_expr->getOperand(0)); 5638eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan case Instruction::GetElementPtr: 5648eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan { 5658eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan ConstantExpr::const_op_iterator op_cursor = constant_expr->op_begin(); 5668eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan ConstantExpr::const_op_iterator op_end = constant_expr->op_end(); 5678eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan 5688eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan Constant *base = dyn_cast<Constant>(*op_cursor); 5698eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan 5708eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan if (!base) 5718eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan return false; 5728eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan 5738eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan if (!ResolveConstantValue(value, base)) 5748eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan return false; 5758eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan 5768eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan op_cursor++; 5778eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan 5788eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan if (op_cursor == op_end) 5798eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan return true; // no offset to apply! 5808eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan 5818eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan SmallVector <Value *, 8> indices (op_cursor, op_end); 5828eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan 5838eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan uint64_t offset = m_target_data.getIndexedOffset(base->getType(), indices); 5848eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan 5858eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan const bool is_signed = true; 5868eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan value += APInt(value.getBitWidth(), offset, is_signed); 5878eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan 5888eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan return true; 5898eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan } 590557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 591557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 59247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 59347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 59447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 59547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 5968eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan bool ResolveConstant (Memory::Region ®ion, const Constant *constant) 5978eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan { 5988eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan APInt resolved_value; 5998eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan 6008eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan if (!ResolveConstantValue(resolved_value, constant)) 6018eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan return false; 6028eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan 6038eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan const uint64_t *raw_data = resolved_value.getRawData(); 6048eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan 6058eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan size_t constant_size = m_target_data.getTypeStoreSize(constant->getType()); 6068eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan return m_memory.Write(region.m_base, (const uint8_t*)raw_data, constant_size); 6078eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan } 6088eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan 60947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region ResolveValue (const Value *value, Module &module) 61047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 61147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ValueMap::iterator i = m_values.find(value); 61247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 61347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (i != m_values.end()) 61447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return i->second; 61547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 61647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const GlobalValue *global_value = dyn_cast<GlobalValue>(value); 61747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 6184b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan // If the variable is indirected through the argument 6194b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan // array then we need to build an extra level of indirection 6204b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan // for it. This is the default; only magic arguments like 6214b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan // "this", "self", and "_cmd" are direct. 622b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan bool variable_is_this = false; 6234b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 62447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Attempt to resolve the value using the program's data. 62547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // If it is, the values to be created are: 62647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // 62747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // data_region - a region of memory in which the variable's data resides. 62847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // ref_region - a region of memory in which its address (i.e., &var) resides. 62947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // In the JIT case, this region would be a member of the struct passed in. 63047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // pointer_region - a region of memory in which the address of the pointer 63147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // resides. This is an IR-level variable. 63247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan do 63347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 63447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 6354b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 6364b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan lldb_private::Value resolved_value; 6374a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton lldb_private::ClangExpressionVariable::FlagType flags = 0; 63847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 6394b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan if (global_value) 6404b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan { 6414b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan clang::NamedDecl *decl = IRForTarget::DeclForGlobal(global_value, &module); 6424b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 6434b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan if (!decl) 6444b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan break; 6454b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 6464b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan if (isa<clang::FunctionDecl>(decl)) 6474b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan { 6484b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan if (log) 6494b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan log->Printf("The interpreter does not handle function pointers at the moment"); 6504b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 6514b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return Memory::Region(); 6524b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan } 6534b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 65452d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan resolved_value = m_decl_map.LookupDecl(decl, flags); 6554b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan } 6564b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan else 6574b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan { 6584b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan // Special-case "this", "self", and "_cmd" 6594b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 660fecc09c3709262515add87254cb973ce5175f17bSean Callanan std::string name_str = value->getName().str(); 6614b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 6624b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan if (name_str == "this" || 6634b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan name_str == "self" || 6644b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan name_str == "_cmd") 6654b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan resolved_value = m_decl_map.GetSpecialValue(lldb_private::ConstString(name_str.c_str())); 6664b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 667b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan variable_is_this = true; 6684b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan } 66947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 67047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (resolved_value.GetScalar().GetType() != lldb_private::Scalar::e_void) 67147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 67247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (resolved_value.GetContextType() == lldb_private::Value::eContextTypeRegisterInfo) 67347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 674b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan if (variable_is_this) 675b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan { 676b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan Memory::Region data_region = m_memory.Place(value->getType(), resolved_value.GetScalar().ULongLong(), resolved_value); 677b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 678b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan lldb_private::Value origin; 679b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 680b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan origin.SetValueType(lldb_private::Value::eValueTypeLoadAddress); 681b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan origin.SetContext(lldb_private::Value::eContextTypeInvalid, NULL); 682b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan origin.GetScalar() = resolved_value.GetScalar(); 683b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 684b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan data_region.m_allocation->m_origin = origin; 685b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 686b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan Memory::Region ref_region = m_memory.Malloc(value->getType()); 687b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 688b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan if (ref_region.IsInvalid()) 689b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan return Memory::Region(); 690b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 691b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan DataEncoderSP ref_encoder = m_memory.GetEncoder(ref_region); 692b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 693b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan if (ref_encoder->PutAddress(0, data_region.m_base) == UINT32_MAX) 694b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan return Memory::Region(); 695b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 696b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan if (log) 697b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan { 698b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan log->Printf("Made an allocation for \"this\" register variable %s", PrintValue(value).c_str()); 699b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan log->Printf(" Data region : %llx", (unsigned long long)data_region.m_base); 700b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan log->Printf(" Ref region : %llx", (unsigned long long)ref_region.m_base); 701b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan } 702b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 703b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan m_values[value] = ref_region; 704b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan return ref_region; 705b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan } 706b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan else if (flags & lldb_private::ClangExpressionVariable::EVBareRegister) 707b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan { 708b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan lldb_private::RegisterInfo *reg_info = resolved_value.GetRegisterInfo(); 709b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan Memory::Region data_region = (reg_info->encoding == lldb::eEncodingVector) ? 7107c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton m_memory.Malloc(reg_info->byte_size, m_target_data.getPrefTypeAlignment(value->getType())) : 7117c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton m_memory.Malloc(value->getType()); 712b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 713b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan data_region.m_allocation->m_origin = resolved_value; 714b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan Memory::Region ref_region = m_memory.Malloc(value->getType()); 715b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 716b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan if (!Cache(data_region.m_allocation, value->getType())) 717b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan return Memory::Region(); 718b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 719b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan if (ref_region.IsInvalid()) 720b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan return Memory::Region(); 721b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 722b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan DataEncoderSP ref_encoder = m_memory.GetEncoder(ref_region); 723b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 724b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan if (ref_encoder->PutAddress(0, data_region.m_base) == UINT32_MAX) 725b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan return Memory::Region(); 726b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 727b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan if (log) 728b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan { 729b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan log->Printf("Made an allocation for bare register variable %s", PrintValue(value).c_str()); 730b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan log->Printf(" Data contents : %s", m_memory.PrintData(data_region.m_base, data_region.m_extent).c_str()); 731b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan log->Printf(" Data region : %llx", (unsigned long long)data_region.m_base); 732b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan log->Printf(" Ref region : %llx", (unsigned long long)ref_region.m_base); 733b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan } 734b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 735b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan m_values[value] = ref_region; 736b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan return ref_region; 737b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan } 738b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan else 739b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan { 740b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan lldb_private::RegisterInfo *reg_info = resolved_value.GetRegisterInfo(); 741b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan Memory::Region data_region = (reg_info->encoding == lldb::eEncodingVector) ? 742b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan m_memory.Malloc(reg_info->byte_size, m_target_data.getPrefTypeAlignment(value->getType())) : 743b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan m_memory.Malloc(value->getType()); 744b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 745b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan data_region.m_allocation->m_origin = resolved_value; 746b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan Memory::Region ref_region = m_memory.Malloc(value->getType()); 747b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan Memory::Region pointer_region; 748b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 7494b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan pointer_region = m_memory.Malloc(value->getType()); 750b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 751b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan if (!Cache(data_region.m_allocation, value->getType())) 752b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan return Memory::Region(); 753b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 754b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan if (ref_region.IsInvalid()) 755b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan return Memory::Region(); 756b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 757b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan if (pointer_region.IsInvalid()) 758b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan return Memory::Region(); 759b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 760b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan DataEncoderSP ref_encoder = m_memory.GetEncoder(ref_region); 761b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 762b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan if (ref_encoder->PutAddress(0, data_region.m_base) == UINT32_MAX) 763b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan return Memory::Region(); 764b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 765b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan if (log) 766b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan { 767b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan log->Printf("Made an allocation for ordinary register variable %s", PrintValue(value).c_str()); 768b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan log->Printf(" Data contents : %s", m_memory.PrintData(data_region.m_base, data_region.m_extent).c_str()); 769b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan log->Printf(" Data region : %llx", (unsigned long long)data_region.m_base); 770b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan log->Printf(" Ref region : %llx", (unsigned long long)ref_region.m_base); 7714237e1ea921ebd588b29319bf12050ba737fbca2Sean Callanan log->Printf(" Pointer region : %llx", (unsigned long long)pointer_region.m_base); 772b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan } 7734b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 774b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan DataEncoderSP pointer_encoder = m_memory.GetEncoder(pointer_region); 775b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 7764b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan if (pointer_encoder->PutAddress(0, ref_region.m_base) == UINT32_MAX) 7774b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return Memory::Region(); 7784b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 7794b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan m_values[value] = pointer_region; 7804b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return pointer_region; 7814b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan } 78247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 78347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 78447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 78547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region data_region = m_memory.Place(value->getType(), resolved_value.GetScalar().ULongLong(), resolved_value); 78647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region ref_region = m_memory.Malloc(value->getType()); 7874b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan Memory::Region pointer_region; 7884b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 789b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan if (!variable_is_this) 7904b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan pointer_region = m_memory.Malloc(value->getType()); 79147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 79247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (ref_region.IsInvalid()) 79347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Memory::Region(); 79447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 795b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan if (pointer_region.IsInvalid() && !variable_is_this) 79647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Memory::Region(); 79747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 79847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan DataEncoderSP ref_encoder = m_memory.GetEncoder(ref_region); 79947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 80047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (ref_encoder->PutAddress(0, data_region.m_base) == UINT32_MAX) 80147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Memory::Region(); 80247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 803b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan if (!variable_is_this) 8044b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan { 8054b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan DataEncoderSP pointer_encoder = m_memory.GetEncoder(pointer_region); 80647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 8074b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan if (pointer_encoder->PutAddress(0, ref_region.m_base) == UINT32_MAX) 8084b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return Memory::Region(); 8094b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 8104b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan m_values[value] = pointer_region; 8114b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan } 81247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 81347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 81447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 8154b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan log->Printf("Made an allocation for %s", PrintValue(value).c_str()); 81647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" Data contents : %s", m_memory.PrintData(data_region.m_base, data_region.m_extent).c_str()); 81747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" Data region : %llx", (unsigned long long)data_region.m_base); 81847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" Ref region : %llx", (unsigned long long)ref_region.m_base); 819b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan if (!variable_is_this) 8204b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan log->Printf(" Pointer region : %llx", (unsigned long long)pointer_region.m_base); 82147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 82247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 823b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan if (variable_is_this) 8244b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return ref_region; 825b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan else 826b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan return pointer_region; 82747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 82847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 82947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 83047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan while(0); 83147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 83247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Fall back and allocate space [allocation type Alloca] 83347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 83447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Type *type = value->getType(); 83547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 83647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::ValueSP backing_value(new lldb_private::Value); 83747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 83847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region data_region = m_memory.Malloc(type); 83947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan data_region.m_allocation->m_origin.GetScalar() = (unsigned long long)data_region.m_allocation->m_data->GetBytes(); 84047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan data_region.m_allocation->m_origin.SetContext(lldb_private::Value::eContextTypeInvalid, NULL); 84147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan data_region.m_allocation->m_origin.SetValueType(lldb_private::Value::eValueTypeHostAddress); 84247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 84347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const Constant *constant = dyn_cast<Constant>(value); 84447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 84547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan do 84647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 84747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!constant) 84847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 84947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 85047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!ResolveConstant (data_region, constant)) 85147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Memory::Region(); 85247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 85347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan while(0); 85447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 85547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_values[value] = data_region; 85647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return data_region; 85747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 85847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 85947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan bool ConstructResult (lldb::ClangExpressionVariableSP &result, 86047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const GlobalValue *result_value, 86147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const lldb_private::ConstString &result_name, 86247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::TypeFromParser result_type, 86347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Module &module) 86447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 86547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // The result_value resolves to P, a pointer to a region R containing the result data. 86647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // If the result variable is a reference, the region R contains a pointer to the result R_final in the original process. 86747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 86847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!result_value) 86947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return true; // There was no slot for a result – the expression doesn't return one. 87047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 87147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ValueMap::iterator i = m_values.find(result_value); 87247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 87347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (i == m_values.end()) 87447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; // There was a slot for the result, but we didn't write into it. 87547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 87647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region P = i->second; 87747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan DataExtractorSP P_extractor = m_memory.GetExtractor(P); 87847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 87947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!P_extractor) 88047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 88147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 88247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Type *pointer_ty = result_value->getType(); 88347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan PointerType *pointer_ptr_ty = dyn_cast<PointerType>(pointer_ty); 88447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!pointer_ptr_ty) 88547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 88647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Type *R_ty = pointer_ptr_ty->getElementType(); 88747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 88836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t offset = 0; 88947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::addr_t pointer = P_extractor->GetAddress(&offset); 89047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 89147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region R = m_memory.Lookup(pointer, R_ty); 89247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 89347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (R.m_allocation->m_origin.GetValueType() != lldb_private::Value::eValueTypeHostAddress || 89447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan !R.m_allocation->m_data) 89547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 89647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 89747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Value base; 89847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 899a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan bool transient = false; 900557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan bool maybe_make_load = false; 901a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan 90247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (m_decl_map.ResultIsReference(result_name)) 90347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 90447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan PointerType *R_ptr_ty = dyn_cast<PointerType>(R_ty); 90547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!R_ptr_ty) 90647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 90747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Type *R_final_ty = R_ptr_ty->getElementType(); 90847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 90947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan DataExtractorSP R_extractor = m_memory.GetExtractor(R); 91047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 91147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!R_extractor) 91247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 91347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 91447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan offset = 0; 91547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::addr_t R_pointer = R_extractor->GetAddress(&offset); 91647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 91747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region R_final = m_memory.Lookup(R_pointer, R_final_ty); 91847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 919557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan if (R_final.m_allocation) 920557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan { 921557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan if (R_final.m_allocation->m_data) 922557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan transient = true; // this is a stack allocation 923a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan 924557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan base = R_final.m_allocation->m_origin; 925557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan base.GetScalar() += (R_final.m_base - R_final.m_allocation->m_virtual_address); 926557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 927557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan else 928557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan { 929557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan // We got a bare pointer. We are going to treat it as a load address 930557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan // or a file address, letting decl_map make the choice based on whether 931557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan // or not a process exists. 932557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 933557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan base.SetContext(lldb_private::Value::eContextTypeInvalid, NULL); 934557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan base.SetValueType(lldb_private::Value::eValueTypeFileAddress); 935557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan base.GetScalar() = (unsigned long long)R_pointer; 936557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan maybe_make_load = true; 937557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 93847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 93947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 94047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 94147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan base.SetContext(lldb_private::Value::eContextTypeInvalid, NULL); 94247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan base.SetValueType(lldb_private::Value::eValueTypeHostAddress); 94347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan base.GetScalar() = (unsigned long long)R.m_allocation->m_data->GetBytes() + (R.m_base - R.m_allocation->m_virtual_address); 94447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 94547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 946557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan return m_decl_map.CompleteResultVariable (result, base, result_name, result_type, transient, maybe_make_load); 94747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 94847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}; 94947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 95047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool 95147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananIRInterpreter::maybeRunOnFunction (lldb::ClangExpressionVariableSP &result, 95247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const lldb_private::ConstString &result_name, 95347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::TypeFromParser result_type, 95447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Function &llvm_function, 955ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan Module &llvm_module, 956ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan lldb_private::Error &err) 95747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 958ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan if (supportsFunction (llvm_function, err)) 95947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return runOnFunction(result, 96047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result_name, 96147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result_type, 96247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan llvm_function, 963ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan llvm_module, 964ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err); 96547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 96647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 96747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 96847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 969ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callananstatic const char *unsupported_opcode_error = "Interpreter doesn't handle one of the expression's opcodes"; 970ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callananstatic const char *interpreter_initialization_error = "Interpreter couldn't be initialized"; 971ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callananstatic const char *interpreter_internal_error = "Interpreter encountered an internal error"; 972ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callananstatic const char *bad_value_error = "Interpreter couldn't resolve a value during execution"; 973ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callananstatic const char *memory_allocation_error = "Interpreter couldn't allocate memory"; 974ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callananstatic const char *memory_write_error = "Interpreter couldn't write to memory"; 975ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callananstatic const char *memory_read_error = "Interpreter couldn't read from memory"; 976ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callananstatic const char *infinite_loop_error = "Interpreter ran for too many cycles"; 9778f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callananstatic const char *bad_result_error = "Result of expression is in bad memory"; 978ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan 97947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool 980ddf110d67eb3d3e621441c4383904e838bc0c403Sean CallananIRInterpreter::supportsFunction (Function &llvm_function, 981ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan lldb_private::Error &err) 98247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 98347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 98447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 98547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan for (Function::iterator bbi = llvm_function.begin(), bbe = llvm_function.end(); 98647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan bbi != bbe; 98747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ++bbi) 98847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 98947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan for (BasicBlock::iterator ii = bbi->begin(), ie = bbi->end(); 99047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ii != ie; 99147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ++ii) 99247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 99347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (ii->getOpcode()) 99447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 99547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan default: 99647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 99747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 99847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Unsupported instruction: %s", PrintValue(ii).c_str()); 999ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1000ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(unsupported_opcode_error); 100147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 100247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 100347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Add: 100447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Alloca: 100547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::BitCast: 100647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Br: 100747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::GetElementPtr: 100847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 100947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::ICmp: 101047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 101147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ICmpInst *icmp_inst = dyn_cast<ICmpInst>(ii); 101247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 101347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!icmp_inst) 1014ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan { 1015ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1016ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(interpreter_internal_error); 101747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 1018ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan } 101947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 102047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (icmp_inst->getPredicate()) 102147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 102247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan default: 102347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 102447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 102547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Unsupported ICmp predicate: %s", PrintValue(ii).c_str()); 1026ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan 1027ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1028ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(unsupported_opcode_error); 102947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 103047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 103147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_EQ: 103247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_NE: 103347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_UGT: 103447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_UGE: 103547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_ULT: 103647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_ULE: 103747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_SGT: 103847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_SGE: 103947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_SLT: 104047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_SLE: 104147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 104247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 104347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 104447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 1045fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::And: 1046fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::AShr: 1047557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan case Instruction::IntToPtr: 10486b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan case Instruction::PtrToInt: 104947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Load: 1050fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::LShr: 105147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Mul: 1052fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::Or: 105347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Ret: 105447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::SDiv: 1055fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::Shl: 1056bab2a0caa65d114ab1dfc9314636c8057de285c7Sean Callanan case Instruction::SRem: 105747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Store: 105847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Sub: 105947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::UDiv: 1060bab2a0caa65d114ab1dfc9314636c8057de285c7Sean Callanan case Instruction::URem: 1061fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::Xor: 10626a3f9af114bfdc05c7b89de45fe7e0a52aceef0aSean Callanan case Instruction::ZExt: 106347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 106447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 106547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 106647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 106747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 106847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return true; 106947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 107047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 107147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool 107247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananIRInterpreter::runOnFunction (lldb::ClangExpressionVariableSP &result, 107347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const lldb_private::ConstString &result_name, 107447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::TypeFromParser result_type, 107547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Function &llvm_function, 1076ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan Module &llvm_module, 1077ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan lldb_private::Error &err) 107847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 107947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 108047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 108147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::ClangExpressionDeclMap::TargetInfo target_info = m_decl_map.GetTargetInfo(); 108247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 108347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!target_info.IsValid()) 1084ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan { 1085ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1086ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(interpreter_initialization_error); 108747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 1088ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan } 108947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 109047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::addr_t alloc_min; 109147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::addr_t alloc_max; 109247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 109347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (target_info.address_byte_size) 109447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 109547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan default: 1096ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1097ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(interpreter_initialization_error); 1098ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan return false; 109947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case 4: 110047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan alloc_min = 0x00001000llu; 110147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan alloc_max = 0x0000ffffllu; 110247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 110347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case 8: 110447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan alloc_min = 0x0000000000001000llu; 110547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan alloc_max = 0x000000000000ffffllu; 110647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 110747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 110847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 11093051ed73a487e92f12f8b6062f8415781453da21Micah Villmow DataLayout target_data(&llvm_module); 11104fbe61ba371bfde827b9424ebe5e14dce3d5fad3Sean Callanan if (target_data.getPointerSize(0) != target_info.address_byte_size) 1111ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan { 1112ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1113ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(interpreter_initialization_error); 111447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 1115ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan } 111647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (target_data.isLittleEndian() != (target_info.byte_order == lldb::eByteOrderLittle)) 1117ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan { 1118ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1119ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(interpreter_initialization_error); 112047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 1121ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan } 112247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 112347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory memory(target_data, m_decl_map, alloc_min, alloc_max); 112447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan InterpreterStackFrame frame(target_data, memory, m_decl_map); 112547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 112647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan uint32_t num_insts = 0; 112747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 112847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan frame.Jump(llvm_function.begin()); 112947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 113047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan while (frame.m_ii != frame.m_ie && (++num_insts < 4096)) 113147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 113247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const Instruction *inst = frame.m_ii; 113347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 113447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 113547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Interpreting %s", PrintValue(inst).c_str()); 113647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 113747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (inst->getOpcode()) 113847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 113947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan default: 114047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 114147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Add: 114247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Sub: 114347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Mul: 114447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::SDiv: 114547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::UDiv: 1146bab2a0caa65d114ab1dfc9314636c8057de285c7Sean Callanan case Instruction::SRem: 1147bab2a0caa65d114ab1dfc9314636c8057de285c7Sean Callanan case Instruction::URem: 1148fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::Shl: 1149fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::LShr: 1150fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::AShr: 1151fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::And: 1152fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::Or: 1153fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::Xor: 115447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 115547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const BinaryOperator *bin_op = dyn_cast<BinaryOperator>(inst); 115647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 115747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!bin_op) 115847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 115947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 116047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("getOpcode() returns %s, but instruction is not a BinaryOperator", inst->getOpcodeName()); 1161ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1162ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(interpreter_internal_error); 1163ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan return false; 116447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 116547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 116647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Value *lhs = inst->getOperand(0); 116747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Value *rhs = inst->getOperand(1); 116847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 116947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Scalar L; 117047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Scalar R; 117147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 117247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!frame.EvaluateValue(L, lhs, llvm_module)) 117347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 117447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 117547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Couldn't evaluate %s", PrintValue(lhs).c_str()); 1176ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1177ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(bad_value_error); 117847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 117947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 118047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 118147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!frame.EvaluateValue(R, rhs, llvm_module)) 118247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 118347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 118447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Couldn't evaluate %s", PrintValue(rhs).c_str()); 1185ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1186ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(bad_value_error); 118747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 118847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 118947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 119047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Scalar result; 119147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 119247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (inst->getOpcode()) 119347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 119447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan default: 119547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 119647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Add: 119747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = L + R; 119847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 119947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Mul: 120047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = L * R; 120147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 120247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Sub: 120347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = L - R; 120447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 120547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::SDiv: 120647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = L / R; 120747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 120847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::UDiv: 120947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = L.GetRawBits64(0) / R.GetRawBits64(1); 121047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 1211bab2a0caa65d114ab1dfc9314636c8057de285c7Sean Callanan case Instruction::SRem: 1212bab2a0caa65d114ab1dfc9314636c8057de285c7Sean Callanan result = L % R; 1213bab2a0caa65d114ab1dfc9314636c8057de285c7Sean Callanan break; 1214bab2a0caa65d114ab1dfc9314636c8057de285c7Sean Callanan case Instruction::URem: 1215bab2a0caa65d114ab1dfc9314636c8057de285c7Sean Callanan result = L.GetRawBits64(0) % R.GetRawBits64(1); 1216bab2a0caa65d114ab1dfc9314636c8057de285c7Sean Callanan break; 1217fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::Shl: 1218fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan result = L << R; 1219fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan break; 1220fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::AShr: 1221fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan result = L >> R; 1222fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan break; 1223fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::LShr: 1224fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan result = L; 1225fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan result.ShiftRightLogical(R); 1226fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan break; 1227fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::And: 1228fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan result = L & R; 1229fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan break; 1230fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::Or: 1231fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan result = L | R; 1232fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan break; 1233fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::Xor: 1234fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan result = L ^ R; 1235fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan break; 123647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 123747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 123847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan frame.AssignValue(inst, result, llvm_module); 123947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 124047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 124147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 124247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Interpreted a %s", inst->getOpcodeName()); 124347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" L : %s", frame.SummarizeValue(lhs).c_str()); 124447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" R : %s", frame.SummarizeValue(rhs).c_str()); 124547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" = : %s", frame.SummarizeValue(inst).c_str()); 124647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 124747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 124847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 124947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Alloca: 125047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 125147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const AllocaInst *alloca_inst = dyn_cast<AllocaInst>(inst); 125247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 125347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!alloca_inst) 125447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 125547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 125647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("getOpcode() returns Alloca, but instruction is not an AllocaInst"); 1257ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1258ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(interpreter_internal_error); 125947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 126047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 126147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 126247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (alloca_inst->isArrayAllocation()) 126347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 126447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 126547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("AllocaInsts are not handled if isArrayAllocation() is true"); 1266ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1267ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(unsupported_opcode_error); 126847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 126947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 127047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 127147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // The semantics of Alloca are: 127247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Create a region R of virtual memory of type T, backed by a data buffer 127347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Create a region P of virtual memory of type T*, backed by a data buffer 127447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Write the virtual address of R into P 127547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 127647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Type *T = alloca_inst->getAllocatedType(); 127747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Type *Tptr = alloca_inst->getType(); 127847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 127947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region R = memory.Malloc(T); 128047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 128147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (R.IsInvalid()) 128247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 128347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 128447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Couldn't allocate memory for an AllocaInst"); 1285ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1286ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(memory_allocation_error); 128747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 128847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 128947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 129047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region P = memory.Malloc(Tptr); 129147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 129247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (P.IsInvalid()) 129347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 129447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 129547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Couldn't allocate the result pointer for an AllocaInst"); 1296ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1297ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(memory_allocation_error); 129847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 129947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 130047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 130147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan DataEncoderSP P_encoder = memory.GetEncoder(P); 130247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 130347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (P_encoder->PutAddress(0, R.m_base) == UINT32_MAX) 130447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 130547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 1306ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan log->Printf("Couldn't write the result pointer for an AllocaInst"); 1307ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1308ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(memory_write_error); 130947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 131047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 131147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 131247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan frame.m_values[alloca_inst] = P; 131347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 131447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 131547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 131647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Interpreted an AllocaInst"); 131747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" R : %s", memory.SummarizeRegion(R).c_str()); 131847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" P : %s", frame.SummarizeValue(alloca_inst).c_str()); 131947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 132047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 132147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 132247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::BitCast: 13236a3f9af114bfdc05c7b89de45fe7e0a52aceef0aSean Callanan case Instruction::ZExt: 132447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 13256a3f9af114bfdc05c7b89de45fe7e0a52aceef0aSean Callanan const CastInst *cast_inst = dyn_cast<CastInst>(inst); 132647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 13276a3f9af114bfdc05c7b89de45fe7e0a52aceef0aSean Callanan if (!cast_inst) 132847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 132947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 13306a3f9af114bfdc05c7b89de45fe7e0a52aceef0aSean Callanan log->Printf("getOpcode() returns %s, but instruction is not a BitCastInst", cast_inst->getOpcodeName()); 1331ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1332ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(interpreter_internal_error); 133347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 133447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 133547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 13366a3f9af114bfdc05c7b89de45fe7e0a52aceef0aSean Callanan Value *source = cast_inst->getOperand(0); 133747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 133847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Scalar S; 133947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 134047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!frame.EvaluateValue(S, source, llvm_module)) 134147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 134247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 134347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Couldn't evaluate %s", PrintValue(source).c_str()); 1344ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1345ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(bad_value_error); 134647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 134747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 134847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 134947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan frame.AssignValue(inst, S, llvm_module); 135047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 135147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 135247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Br: 135347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 135447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const BranchInst *br_inst = dyn_cast<BranchInst>(inst); 135547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 135647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!br_inst) 135747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 135847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 135947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("getOpcode() returns Br, but instruction is not a BranchInst"); 1360ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1361ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(interpreter_internal_error); 136247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 136347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 136447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 136547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (br_inst->isConditional()) 136647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 136747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Value *condition = br_inst->getCondition(); 136847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 136947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Scalar C; 137047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 137147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!frame.EvaluateValue(C, condition, llvm_module)) 137247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 137347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 137447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Couldn't evaluate %s", PrintValue(condition).c_str()); 1375ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1376ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(bad_value_error); 137747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 137847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 137947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 138047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (C.GetRawBits64(0)) 138147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan frame.Jump(br_inst->getSuccessor(0)); 138247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 138347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan frame.Jump(br_inst->getSuccessor(1)); 138447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 138547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 138647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 138747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Interpreted a BrInst with a condition"); 138847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" cond : %s", frame.SummarizeValue(condition).c_str()); 138947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 139047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 139147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 139247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 139347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan frame.Jump(br_inst->getSuccessor(0)); 139447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 139547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 139647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 139747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Interpreted a BrInst with no condition"); 139847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 139947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 140047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 140147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan continue; 140247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::GetElementPtr: 140347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 140447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const GetElementPtrInst *gep_inst = dyn_cast<GetElementPtrInst>(inst); 140547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 140647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!gep_inst) 140747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 140847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 140947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("getOpcode() returns GetElementPtr, but instruction is not a GetElementPtrInst"); 1410ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1411ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(interpreter_internal_error); 141247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 141347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 141447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 141547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const Value *pointer_operand = gep_inst->getPointerOperand(); 141647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Type *pointer_type = pointer_operand->getType(); 141747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 141847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Scalar P; 141947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 142047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!frame.EvaluateValue(P, pointer_operand, llvm_module)) 1421ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan { 1422ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan if (log) 1423ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan log->Printf("Couldn't evaluate %s", PrintValue(pointer_operand).c_str()); 1424ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1425ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(bad_value_error); 142647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 1427ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan } 1428ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan 14297347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan typedef SmallVector <Value *, 8> IndexVector; 14307347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan typedef IndexVector::iterator IndexIterator; 14317347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan 143247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan SmallVector <Value *, 8> indices (gep_inst->idx_begin(), 143347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan gep_inst->idx_end()); 143447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 14357347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan SmallVector <Value *, 8> const_indices; 14367347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan 14377347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan for (IndexIterator ii = indices.begin(), ie = indices.end(); 14387347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan ii != ie; 14397347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan ++ii) 14407347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan { 14417347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan ConstantInt *constant_index = dyn_cast<ConstantInt>(*ii); 14427347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan 14437347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan if (!constant_index) 14447347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan { 14457347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan lldb_private::Scalar I; 14467347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan 14477347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan if (!frame.EvaluateValue(I, *ii, llvm_module)) 14487347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan { 14497347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan if (log) 14507347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan log->Printf("Couldn't evaluate %s", PrintValue(*ii).c_str()); 14517347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan err.SetErrorToGenericError(); 14527347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan err.SetErrorString(bad_value_error); 14537347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan return false; 14547347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan } 14557347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan 14567347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan if (log) 14577347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan log->Printf("Evaluated constant index %s as %llu", PrintValue(*ii).c_str(), I.ULongLong(LLDB_INVALID_ADDRESS)); 14587347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan 14597347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan constant_index = cast<ConstantInt>(ConstantInt::get((*ii)->getType(), I.ULongLong(LLDB_INVALID_ADDRESS))); 14607347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan } 14617347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan 14627347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan const_indices.push_back(constant_index); 14637347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan } 14647347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan 14657347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan uint64_t offset = target_data.getIndexedOffset(pointer_type, const_indices); 146647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 146747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Scalar Poffset = P + offset; 146847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 146947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan frame.AssignValue(inst, Poffset, llvm_module); 147047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 147147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 147247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 147347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Interpreted a GetElementPtrInst"); 147447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" P : %s", frame.SummarizeValue(pointer_operand).c_str()); 147547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" Poffset : %s", frame.SummarizeValue(inst).c_str()); 147647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 147747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 147847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 147947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::ICmp: 148047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 148147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const ICmpInst *icmp_inst = dyn_cast<ICmpInst>(inst); 148247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 148347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!icmp_inst) 148447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 148547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 148647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("getOpcode() returns ICmp, but instruction is not an ICmpInst"); 1487ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1488ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(interpreter_internal_error); 148947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 149047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 149147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 149247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan CmpInst::Predicate predicate = icmp_inst->getPredicate(); 149347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 149447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Value *lhs = inst->getOperand(0); 149547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Value *rhs = inst->getOperand(1); 149647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 149747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Scalar L; 149847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Scalar R; 149947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 150047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!frame.EvaluateValue(L, lhs, llvm_module)) 150147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 150247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 150347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Couldn't evaluate %s", PrintValue(lhs).c_str()); 1504ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1505ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(bad_value_error); 150647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 150747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 150847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 150947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!frame.EvaluateValue(R, rhs, llvm_module)) 151047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 151147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 151247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Couldn't evaluate %s", PrintValue(rhs).c_str()); 1513ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1514ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(bad_value_error); 151547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 151647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 151747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 151847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Scalar result; 151947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 152047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (predicate) 152147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 152247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan default: 152347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 152447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_EQ: 152547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = (L == R); 152647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 152747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_NE: 152847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = (L != R); 152947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 153047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_UGT: 153147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = (L.GetRawBits64(0) > R.GetRawBits64(0)); 153247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 153347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_UGE: 153447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = (L.GetRawBits64(0) >= R.GetRawBits64(0)); 153547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 153647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_ULT: 153747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = (L.GetRawBits64(0) < R.GetRawBits64(0)); 153847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 153947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_ULE: 154047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = (L.GetRawBits64(0) <= R.GetRawBits64(0)); 154147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 154247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_SGT: 154347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = (L > R); 154447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 154547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_SGE: 154647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = (L >= R); 154747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 154847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_SLT: 154947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = (L < R); 155047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 155147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_SLE: 155247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = (L <= R); 155347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 155447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 155547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 155647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan frame.AssignValue(inst, result, llvm_module); 155747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 155847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 155947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 156047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Interpreted an ICmpInst"); 156147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" L : %s", frame.SummarizeValue(lhs).c_str()); 156247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" R : %s", frame.SummarizeValue(rhs).c_str()); 156347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" = : %s", frame.SummarizeValue(inst).c_str()); 156447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 156547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 156647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 1567557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan case Instruction::IntToPtr: 1568557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan { 1569557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan const IntToPtrInst *int_to_ptr_inst = dyn_cast<IntToPtrInst>(inst); 1570557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 1571557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan if (!int_to_ptr_inst) 1572557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan { 1573557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan if (log) 1574557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan log->Printf("getOpcode() returns IntToPtr, but instruction is not an IntToPtrInst"); 1575ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1576ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(interpreter_internal_error); 1577557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan return false; 1578557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 1579557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 1580557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan Value *src_operand = int_to_ptr_inst->getOperand(0); 1581557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 1582557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan lldb_private::Scalar I; 1583557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 1584557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan if (!frame.EvaluateValue(I, src_operand, llvm_module)) 1585ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan { 1586ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan if (log) 1587ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan log->Printf("Couldn't evaluate %s", PrintValue(src_operand).c_str()); 1588ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1589ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(bad_value_error); 1590557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan return false; 1591ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan } 1592557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 1593557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan frame.AssignValue(inst, I, llvm_module); 1594557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 1595557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan if (log) 1596557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan { 1597557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan log->Printf("Interpreted an IntToPtr"); 1598557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan log->Printf(" Src : %s", frame.SummarizeValue(src_operand).c_str()); 1599557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan log->Printf(" = : %s", frame.SummarizeValue(inst).c_str()); 1600557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 1601557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 1602557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan break; 16036b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan case Instruction::PtrToInt: 16046b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan { 16056b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan const PtrToIntInst *ptr_to_int_inst = dyn_cast<PtrToIntInst>(inst); 16066b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan 16076b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan if (!ptr_to_int_inst) 16086b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan { 16096b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan if (log) 16106b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan log->Printf("getOpcode() returns PtrToInt, but instruction is not an PtrToIntInst"); 16116b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan err.SetErrorToGenericError(); 16126b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan err.SetErrorString(interpreter_internal_error); 16136b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan return false; 16146b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan } 16156b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan 16166b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan Value *src_operand = ptr_to_int_inst->getOperand(0); 16176b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan 16186b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan lldb_private::Scalar I; 16196b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan 16206b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan if (!frame.EvaluateValue(I, src_operand, llvm_module)) 16216b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan { 16226b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan if (log) 16236b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan log->Printf("Couldn't evaluate %s", PrintValue(src_operand).c_str()); 16246b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan err.SetErrorToGenericError(); 16256b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan err.SetErrorString(bad_value_error); 16266b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan return false; 16276b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan } 16286b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan 16296b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan frame.AssignValue(inst, I, llvm_module); 16306b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan 16316b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan if (log) 16326b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan { 16336b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan log->Printf("Interpreted a PtrToInt"); 16346b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan log->Printf(" Src : %s", frame.SummarizeValue(src_operand).c_str()); 16356b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan log->Printf(" = : %s", frame.SummarizeValue(inst).c_str()); 16366b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan } 16376b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan } 16386b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan break; 163947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Load: 164047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 164147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const LoadInst *load_inst = dyn_cast<LoadInst>(inst); 164247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 164347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!load_inst) 164447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 164547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 164647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("getOpcode() returns Load, but instruction is not a LoadInst"); 1647ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1648ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(interpreter_internal_error); 164947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 165047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 165147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 165247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // The semantics of Load are: 165347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Create a region D that will contain the loaded data 165447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Resolve the region P containing a pointer 165547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Dereference P to get the region R that the data should be loaded from 165647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Transfer a unit of type type(D) from R to D 165747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 165847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const Value *pointer_operand = load_inst->getPointerOperand(); 165947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 166047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Type *pointer_ty = pointer_operand->getType(); 166147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan PointerType *pointer_ptr_ty = dyn_cast<PointerType>(pointer_ty); 166247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!pointer_ptr_ty) 1663ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan { 1664ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan if (log) 1665ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan log->Printf("getPointerOperand()->getType() is not a PointerType"); 1666ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1667ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(interpreter_internal_error); 166847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 1669ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan } 167047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Type *target_ty = pointer_ptr_ty->getElementType(); 167147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 167247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region D = frame.ResolveValue(load_inst, llvm_module); 167347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region P = frame.ResolveValue(pointer_operand, llvm_module); 167447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 167547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (D.IsInvalid()) 167647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 167747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 167847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("LoadInst's value doesn't resolve to anything"); 1679ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1680ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(bad_value_error); 168147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 168247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 168347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 168447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (P.IsInvalid()) 168547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 168647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 168747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("LoadInst's pointer doesn't resolve to anything"); 1688ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1689ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(bad_value_error); 169047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 169147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 169247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 169347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan DataExtractorSP P_extractor(memory.GetExtractor(P)); 169447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan DataEncoderSP D_encoder(memory.GetEncoder(D)); 169547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 169636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t offset = 0; 169747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::addr_t pointer = P_extractor->GetAddress(&offset); 169847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 169947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region R = memory.Lookup(pointer, target_ty); 170047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 1701557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan if (R.IsValid()) 1702557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan { 1703557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan if (!memory.Read(D_encoder->GetDataStart(), R.m_base, target_data.getTypeStoreSize(target_ty))) 1704557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan { 1705557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan if (log) 1706557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan log->Printf("Couldn't read from a region on behalf of a LoadInst"); 1707ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1708ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(memory_read_error); 1709557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan return false; 1710557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 1711557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 1712557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan else 1713557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan { 1714557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan if (!memory.ReadFromRawPtr(D_encoder->GetDataStart(), pointer, target_data.getTypeStoreSize(target_ty))) 1715557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan { 1716557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan if (log) 1717557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan log->Printf("Couldn't read from a raw pointer on behalf of a LoadInst"); 1718ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1719ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(memory_read_error); 1720557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan return false; 1721557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 1722557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 172347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 172447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 172547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 172647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Interpreted a LoadInst"); 172747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" P : %s", frame.SummarizeValue(pointer_operand).c_str()); 1728557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan if (R.IsValid()) 1729557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan log->Printf(" R : %s", memory.SummarizeRegion(R).c_str()); 1730557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan else 1731557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan log->Printf(" R : raw pointer 0x%llx", (unsigned long long)pointer); 173247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" D : %s", frame.SummarizeValue(load_inst).c_str()); 173347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 173447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 173547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 173647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Ret: 173747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 173847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (result_name.IsEmpty()) 173947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return true; 174047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 174147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan GlobalValue *result_value = llvm_module.getNamedValue(result_name.GetCString()); 17428f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan 17438f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan if (!frame.ConstructResult(result, result_value, result_name, result_type, llvm_module)) 17448f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan { 17458f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan if (log) 17468f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan log->Printf("Couldn't construct the expression's result"); 17478f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan err.SetErrorToGenericError(); 17488f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan err.SetErrorString(bad_result_error); 17498f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan return false; 17508f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan } 17518f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan 17528f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan return true; 175347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 175447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Store: 175547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 175647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const StoreInst *store_inst = dyn_cast<StoreInst>(inst); 175747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 175847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!store_inst) 175947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 176047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 176147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("getOpcode() returns Store, but instruction is not a StoreInst"); 1762ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1763ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(interpreter_internal_error); 176447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 176547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 176647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 176747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // The semantics of Store are: 176847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Resolve the region D containing the data to be stored 176947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Resolve the region P containing a pointer 177047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Dereference P to get the region R that the data should be stored in 177147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Transfer a unit of type type(D) from D to R 177247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 177347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const Value *value_operand = store_inst->getValueOperand(); 177447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const Value *pointer_operand = store_inst->getPointerOperand(); 177547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 177647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Type *pointer_ty = pointer_operand->getType(); 177747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan PointerType *pointer_ptr_ty = dyn_cast<PointerType>(pointer_ty); 177847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!pointer_ptr_ty) 177947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 178047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Type *target_ty = pointer_ptr_ty->getElementType(); 178147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 178247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region D = frame.ResolveValue(value_operand, llvm_module); 178347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region P = frame.ResolveValue(pointer_operand, llvm_module); 178447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 178547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (D.IsInvalid()) 178647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 178747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 178847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("StoreInst's value doesn't resolve to anything"); 1789ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1790ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(bad_value_error); 179147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 179247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 179347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 179447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (P.IsInvalid()) 179547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 179647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 179747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("StoreInst's pointer doesn't resolve to anything"); 1798ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1799ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(bad_value_error); 180047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 180147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 180247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 180347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan DataExtractorSP P_extractor(memory.GetExtractor(P)); 180447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan DataExtractorSP D_extractor(memory.GetExtractor(D)); 180547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 180647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!P_extractor || !D_extractor) 180747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 180847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 180936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t offset = 0; 181047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::addr_t pointer = P_extractor->GetAddress(&offset); 181147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 181247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region R = memory.Lookup(pointer, target_ty); 181347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 1814557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan if (R.IsValid()) 181547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 1816557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan if (!memory.Write(R.m_base, D_extractor->GetDataStart(), target_data.getTypeStoreSize(target_ty))) 1817557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan { 1818557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan if (log) 1819557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan log->Printf("Couldn't write to a region on behalf of a LoadInst"); 1820ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1821ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(memory_write_error); 1822557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan return false; 1823557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 1824557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 1825557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan else 1826557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan { 1827557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan if (!memory.WriteToRawPtr(pointer, D_extractor->GetDataStart(), target_data.getTypeStoreSize(target_ty))) 1828557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan { 1829557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan if (log) 1830557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan log->Printf("Couldn't write to a raw pointer on behalf of a LoadInst"); 1831ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1832ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(memory_write_error); 1833557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan return false; 1834557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 183547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 183647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 183747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 183847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 183947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 184047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Interpreted a StoreInst"); 184147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" D : %s", frame.SummarizeValue(value_operand).c_str()); 184247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" P : %s", frame.SummarizeValue(pointer_operand).c_str()); 184347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" R : %s", memory.SummarizeRegion(R).c_str()); 184447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 184547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 184647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 184747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 184847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 184947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ++frame.m_ii; 185047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 185147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 185247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (num_insts >= 4096) 1853ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan { 1854ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1855ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(infinite_loop_error); 185647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 1857ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan } 1858ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan 185947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 1860141f8d98cb74262914d66a7af4732e8cb2d8699fGreg Clayton} 1861