IRInterpreter.cpp revision 86d6ac2a3d920622c1ee7a68b5ca28b09dc18142
147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan//===-- IRInterpreter.cpp ---------------------------------------*- C++ -*-===// 247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan// 347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan// The LLVM Compiler Infrastructure 447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan// 547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan// This file is distributed under the University of Illinois Open Source 647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan// License. See LICENSE.TXT for details. 747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan// 847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan//===----------------------------------------------------------------------===// 947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 1047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan#include "lldb/Core/DataEncoder.h" 1147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan#include "lldb/Core/Log.h" 1247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan#include "lldb/Core/ValueObjectConstResult.h" 1347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan#include "lldb/Expression/ClangExpressionDeclMap.h" 1452d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan#include "lldb/Expression/ClangExpressionVariable.h" 1547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan#include "lldb/Expression/IRForTarget.h" 1647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan#include "lldb/Expression/IRInterpreter.h" 1747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 18a80c70c22a3e25d693e1a569a5209820873d44c8Chandler Carruth#include "llvm/IR/Constants.h" 19a80c70c22a3e25d693e1a569a5209820873d44c8Chandler Carruth#include "llvm/IR/Function.h" 20a80c70c22a3e25d693e1a569a5209820873d44c8Chandler Carruth#include "llvm/IR/Instructions.h" 21a80c70c22a3e25d693e1a569a5209820873d44c8Chandler Carruth#include "llvm/IR/Module.h" 2247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan#include "llvm/Support/raw_ostream.h" 23a80c70c22a3e25d693e1a569a5209820873d44c8Chandler Carruth#include "llvm/IR/DataLayout.h" 2447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 2547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan#include <map> 2647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 2747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananusing namespace llvm; 2847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 2947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananIRInterpreter::IRInterpreter(lldb_private::ClangExpressionDeclMap &decl_map, 3086d6ac2a3d920622c1ee7a68b5ca28b09dc18142Sean Callanan lldb_private::IRMemoryMap &memory_map, 3186d6ac2a3d920622c1ee7a68b5ca28b09dc18142Sean Callanan lldb_private::Stream *error_stream) : 3286d6ac2a3d920622c1ee7a68b5ca28b09dc18142Sean Callanan m_decl_map(decl_map), 3386d6ac2a3d920622c1ee7a68b5ca28b09dc18142Sean Callanan m_memory_map(memory_map) 3447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 3547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 3647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 3747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 3847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananIRInterpreter::~IRInterpreter() 3947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 4047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 4147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 4247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 4347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananstatic std::string 4447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananPrintValue(const Value *value, bool truncate = false) 4547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 4647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan std::string s; 4747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan raw_string_ostream rso(s); 4847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan value->print(rso); 4947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan rso.flush(); 5047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (truncate) 5147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan s.resize(s.length() - 1); 5247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 5347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t offset; 5447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan while ((offset = s.find('\n')) != s.npos) 5547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan s.erase(offset, 1); 5647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan while (s[0] == ' ' || s[0] == '\t') 5747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan s.erase(0, 1); 5847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 5947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return s; 6047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 6147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 6247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananstatic std::string 6347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananPrintType(const Type *type, bool truncate = false) 6447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 6547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan std::string s; 6647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan raw_string_ostream rso(s); 6747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan type->print(rso); 6847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan rso.flush(); 6947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (truncate) 7047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan s.resize(s.length() - 1); 7147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return s; 7247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 7347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 74598df88bd6fc33c6fb330bc859bdc277795501f3Greg Claytontypedef STD_SHARED_PTR(lldb_private::DataEncoder) DataEncoderSP; 75598df88bd6fc33c6fb330bc859bdc277795501f3Greg Claytontypedef STD_SHARED_PTR(lldb_private::DataExtractor) DataExtractorSP; 7647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 7747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananclass Memory 7847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 7947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananpublic: 8047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan typedef uint32_t index_t; 8147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 8247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan struct Allocation 8347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 8447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // m_virtual_address is always the address of the variable in the virtual memory 8547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // space provided by Memory. 8647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // 8747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // m_origin is always non-NULL and describes the source of the data (possibly 8847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // m_data if this allocation is the authoritative source). 8947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // 9047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Possible value configurations: 9147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // 9247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Allocation type getValueType() getContextType() m_origin->GetScalar() m_data 9347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // ========================================================================================================================= 9447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // FileAddress eValueTypeFileAddress eContextTypeInvalid A location in a binary NULL 9547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // image 9647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // 9747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // LoadAddress eValueTypeLoadAddress eContextTypeInvalid A location in the target's NULL 9847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // virtual memory 9947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // 10047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Alloca eValueTypeHostAddress eContextTypeInvalid == m_data->GetBytes() Deleted at end of 10147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // execution 10247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // 10347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // PersistentVar eValueTypeHostAddress eContextTypeClangType A persistent variable's NULL 10447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // location in LLDB's memory 10547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // 10647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Register [ignored] eContextTypeRegister [ignored] Flushed to the register 10747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // at the end of execution 10847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 10947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::addr_t m_virtual_address; 11047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t m_extent; 11147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Value m_origin; 11247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::DataBufferSP m_data; 11347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 11447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Allocation (lldb::addr_t virtual_address, 11547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t extent, 11647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::DataBufferSP data) : 11747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_virtual_address(virtual_address), 11847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_extent(extent), 11947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_data(data) 12047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 12147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 12247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 12347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Allocation (const Allocation &allocation) : 12447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_virtual_address(allocation.m_virtual_address), 12547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_extent(allocation.m_extent), 12647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_origin(allocation.m_origin), 12747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_data(allocation.m_data) 12847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 12947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 13047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan }; 13147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 132598df88bd6fc33c6fb330bc859bdc277795501f3Greg Clayton typedef STD_SHARED_PTR(Allocation) AllocationSP; 13347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 13447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan struct Region 13547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 13647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan AllocationSP m_allocation; 13747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan uint64_t m_base; 13847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan uint64_t m_extent; 13947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 14047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Region () : 14147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_allocation(), 14247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_base(0), 14347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_extent(0) 14447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 14547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 14647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 14747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Region (AllocationSP allocation, uint64_t base, uint64_t extent) : 14847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_allocation(allocation), 14947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_base(base), 15047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_extent(extent) 15147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 15247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 15347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 15447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Region (const Region ®ion) : 15547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_allocation(region.m_allocation), 15647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_base(region.m_base), 15747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_extent(region.m_extent) 15847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 15947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 16047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 16147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan bool IsValid () 16247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 1639880efacdd3a5e855b405d89433a01170422a889Jim Ingham return (bool) m_allocation; 16447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 16547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 16647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan bool IsInvalid () 16747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 168b386d82334b65fb984348f2027b1cb7714de993fSean Callanan return !m_allocation; 16947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 17047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan }; 17147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 17247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan typedef std::vector <AllocationSP> MemoryMap; 17347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 17447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananprivate: 17547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::addr_t m_addr_base; 17647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::addr_t m_addr_max; 17747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan MemoryMap m_memory; 17847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::ByteOrder m_byte_order; 17947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::addr_t m_addr_byte_size; 1803051ed73a487e92f12f8b6062f8415781453da21Micah Villmow DataLayout &m_target_data; 18147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 18247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::ClangExpressionDeclMap &m_decl_map; 18347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 18447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan MemoryMap::iterator LookupInternal (lldb::addr_t addr) 18547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 18647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan for (MemoryMap::iterator i = m_memory.begin(), e = m_memory.end(); 18747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan i != e; 18847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ++i) 18947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 19047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if ((*i)->m_virtual_address <= addr && 19147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan (*i)->m_virtual_address + (*i)->m_extent > addr) 19247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return i; 19347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 19447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 19547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return m_memory.end(); 19647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 19747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 19847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananpublic: 1993051ed73a487e92f12f8b6062f8415781453da21Micah Villmow Memory (DataLayout &target_data, 20047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::ClangExpressionDeclMap &decl_map, 20147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::addr_t alloc_start, 20247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::addr_t alloc_max) : 20347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_addr_base(alloc_start), 20447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_addr_max(alloc_max), 20547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_target_data(target_data), 20647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_decl_map(decl_map) 20747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 20847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_byte_order = (target_data.isLittleEndian() ? lldb::eByteOrderLittle : lldb::eByteOrderBig); 209ce6335881f330581f641ef808602cac192664adfMicah Villmow m_addr_byte_size = (target_data.getPointerSize(0)); 21047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 21147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 21247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Region Malloc (size_t size, size_t align) 21347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 21447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::DataBufferSP data(new lldb_private::DataBufferHeap(size, 0)); 21547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 21647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (data) 21747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 21847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan index_t index = m_memory.size(); 21947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 22047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const size_t mask = (align - 1); 22147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 22247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_addr_base += mask; 22347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_addr_base &= ~mask; 22447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 22547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (m_addr_base + size < m_addr_base || 22647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_addr_base + size > m_addr_max) 22747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Region(); 22847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 22947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan uint64_t base = m_addr_base; 23047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 23147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_memory.push_back(AllocationSP(new Allocation(base, size, data))); 23247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 23347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_addr_base += size; 23447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 23547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan AllocationSP alloc = m_memory[index]; 23647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 23747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan alloc->m_origin.GetScalar() = (unsigned long long)data->GetBytes(); 23847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan alloc->m_origin.SetContext(lldb_private::Value::eContextTypeInvalid, NULL); 23947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan alloc->m_origin.SetValueType(lldb_private::Value::eValueTypeHostAddress); 24047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 24147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Region(alloc, base, size); 24247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 24347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 24447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Region(); 24547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 24647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 24747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Region Malloc (Type *type) 24847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 24947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Malloc (m_target_data.getTypeAllocSize(type), 25047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_target_data.getPrefTypeAlignment(type)); 25147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 25247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 25347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Region Place (Type *type, lldb::addr_t base, lldb_private::Value &value) 25447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 25547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan index_t index = m_memory.size(); 25647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t size = m_target_data.getTypeAllocSize(type); 25747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 25847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_memory.push_back(AllocationSP(new Allocation(base, size, lldb::DataBufferSP()))); 25947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 26047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan AllocationSP alloc = m_memory[index]; 26147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 26247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan alloc->m_origin = value; 26347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 26447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Region(alloc, base, size); 26547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 26647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 26747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan void Free (lldb::addr_t addr) 26847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 26947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan MemoryMap::iterator i = LookupInternal (addr); 27047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 27147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (i != m_memory.end()) 27247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_memory.erase(i); 27347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 27447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 27547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Region Lookup (lldb::addr_t addr, Type *type) 27647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 27747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan MemoryMap::iterator i = LookupInternal(addr); 27847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 279740b3b79b72e91a3e791693f178eef916e7a6febSean Callanan if (i == m_memory.end() || !type->isSized()) 28047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Region(); 281740b3b79b72e91a3e791693f178eef916e7a6febSean Callanan 282740b3b79b72e91a3e791693f178eef916e7a6febSean Callanan size_t size = m_target_data.getTypeStoreSize(type); 28347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 28447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Region(*i, addr, size); 28547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 28647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 28747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan DataEncoderSP GetEncoder (Region region) 28847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 28947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (region.m_allocation->m_origin.GetValueType() != lldb_private::Value::eValueTypeHostAddress) 29047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return DataEncoderSP(); 29147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 29247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::DataBufferSP buffer = region.m_allocation->m_data; 29347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 29447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!buffer) 29547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return DataEncoderSP(); 29647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 29747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t base_offset = (size_t)(region.m_base - region.m_allocation->m_virtual_address); 29847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 29947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return DataEncoderSP(new lldb_private::DataEncoder(buffer->GetBytes() + base_offset, region.m_extent, m_byte_order, m_addr_byte_size)); 30047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 30147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 30247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan DataExtractorSP GetExtractor (Region region) 30347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 30447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (region.m_allocation->m_origin.GetValueType() != lldb_private::Value::eValueTypeHostAddress) 30547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return DataExtractorSP(); 30647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 30747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::DataBufferSP buffer = region.m_allocation->m_data; 30847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t base_offset = (size_t)(region.m_base - region.m_allocation->m_virtual_address); 30947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 31047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (buffer) 31147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return DataExtractorSP(new lldb_private::DataExtractor(buffer->GetBytes() + base_offset, region.m_extent, m_byte_order, m_addr_byte_size)); 31247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 31347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean 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)); 31447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 31547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 31647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Value GetAccessTarget(lldb::addr_t addr) 31747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 31847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan MemoryMap::iterator i = LookupInternal(addr); 31947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 32047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (i == m_memory.end()) 32147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return lldb_private::Value(); 32247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 32347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Value target = (*i)->m_origin; 32447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 32547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (target.GetContextType() == lldb_private::Value::eContextTypeRegisterInfo) 32647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 32747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan target.SetContext(lldb_private::Value::eContextTypeInvalid, NULL); 32847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan target.SetValueType(lldb_private::Value::eValueTypeHostAddress); 32947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan target.GetScalar() = (unsigned long long)(*i)->m_data->GetBytes(); 33047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 33147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 33247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan target.GetScalar() += (addr - (*i)->m_virtual_address); 33347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 33447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return target; 33547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 33647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 33747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan bool Write (lldb::addr_t addr, const uint8_t *data, size_t length) 33847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 33947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Value target = GetAccessTarget(addr); 34047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 34147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return m_decl_map.WriteTarget(target, data, length); 34247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 34347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 34447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan bool Read (uint8_t *data, lldb::addr_t addr, size_t length) 34547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 346557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan lldb_private::Value source = GetAccessTarget(addr); 347557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 348557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan return m_decl_map.ReadTarget(data, source, length); 349557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 350557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 351557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan bool WriteToRawPtr (lldb::addr_t addr, const uint8_t *data, size_t length) 352557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan { 353557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan lldb_private::Value target = m_decl_map.WrapBareAddress(addr); 354557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 355557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan return m_decl_map.WriteTarget(target, data, length); 356557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 357557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 358557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan bool ReadFromRawPtr (uint8_t *data, lldb::addr_t addr, size_t length) 359557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan { 360557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan lldb_private::Value source = m_decl_map.WrapBareAddress(addr); 36147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 362557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan return m_decl_map.ReadTarget(data, source, length); 36347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 36447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 36547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan std::string PrintData (lldb::addr_t addr, size_t length) 36647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 36747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Value target = GetAccessTarget(addr); 36847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 36947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::DataBufferHeap buf(length, 0); 37047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 37147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!m_decl_map.ReadTarget(buf.GetBytes(), target, length)) 37247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return std::string("<couldn't read data>"); 37347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 37447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::StreamString ss; 37547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 37647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan for (size_t i = 0; i < length; i++) 37747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 37847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if ((!(i & 0xf)) && i) 37947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ss.Printf("%02hhx - ", buf.GetBytes()[i]); 38047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 38147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ss.Printf("%02hhx ", buf.GetBytes()[i]); 38247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 38347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 38447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return ss.GetString(); 38547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 38647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 38747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan std::string SummarizeRegion (Region ®ion) 38847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 38947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::StreamString ss; 39047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 39147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Value base = GetAccessTarget(region.m_base); 39247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 3935f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea ss.Printf("%" PRIx64 " [%s - %s %llx]", 39447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan region.m_base, 39547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Value::GetValueTypeAsCString(base.GetValueType()), 39647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Value::GetContextTypeAsCString(base.GetContextType()), 39747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan base.GetScalar().ULongLong()); 39847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 39947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ss.Printf(" %s", PrintData(region.m_base, region.m_extent).c_str()); 40047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 40147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return ss.GetString(); 40247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 40347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}; 40447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 40547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananclass InterpreterStackFrame 40647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 40747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananpublic: 40847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan typedef std::map <const Value*, Memory::Region> ValueMap; 40947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 41047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ValueMap m_values; 41147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory &m_memory; 4123051ed73a487e92f12f8b6062f8415781453da21Micah Villmow DataLayout &m_target_data; 41347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::ClangExpressionDeclMap &m_decl_map; 41486d6ac2a3d920622c1ee7a68b5ca28b09dc18142Sean Callanan lldb_private::IRMemoryMap &m_memory_map; 41547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const BasicBlock *m_bb; 41647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan BasicBlock::const_iterator m_ii; 41747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan BasicBlock::const_iterator m_ie; 41847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 41947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::ByteOrder m_byte_order; 42047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t m_addr_byte_size; 42147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 4223051ed73a487e92f12f8b6062f8415781453da21Micah Villmow InterpreterStackFrame (DataLayout &target_data, 42347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory &memory, 42486d6ac2a3d920622c1ee7a68b5ca28b09dc18142Sean Callanan lldb_private::ClangExpressionDeclMap &decl_map, 42586d6ac2a3d920622c1ee7a68b5ca28b09dc18142Sean Callanan lldb_private::IRMemoryMap &memory_map) : 42647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_memory (memory), 42797c8957257a3e0b3ce6f46f8e5a28c965e30f357Daniel Dunbar m_target_data (target_data), 42886d6ac2a3d920622c1ee7a68b5ca28b09dc18142Sean Callanan m_decl_map (decl_map), 42986d6ac2a3d920622c1ee7a68b5ca28b09dc18142Sean Callanan m_memory_map (memory_map) 43047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 43147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_byte_order = (target_data.isLittleEndian() ? lldb::eByteOrderLittle : lldb::eByteOrderBig); 4324fbe61ba371bfde827b9424ebe5e14dce3d5fad3Sean Callanan m_addr_byte_size = (target_data.getPointerSize(0)); 43347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 43447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 43547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan void Jump (const BasicBlock *bb) 43647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 43747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_bb = bb; 43847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_ii = m_bb->begin(); 43947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_ie = m_bb->end(); 44047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 44147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 44247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan bool Cache (Memory::AllocationSP allocation, Type *type) 44347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 44447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (allocation->m_origin.GetContextType() != lldb_private::Value::eContextTypeRegisterInfo) 44547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 44647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 44747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return m_decl_map.ReadTarget(allocation->m_data->GetBytes(), allocation->m_origin, allocation->m_data->GetByteSize()); 44847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 44947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 45047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan std::string SummarizeValue (const Value *value) 45147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 45247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::StreamString ss; 45347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 45447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ss.Printf("%s", PrintValue(value).c_str()); 45547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 45647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ValueMap::iterator i = m_values.find(value); 45747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 45847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (i != m_values.end()) 45947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 46047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region region = i->second; 46147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 46247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ss.Printf(" %s", m_memory.SummarizeRegion(region).c_str()); 46347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 46447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 46547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return ss.GetString(); 46647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 46747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 46847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan bool AssignToMatchType (lldb_private::Scalar &scalar, uint64_t u64value, Type *type) 46947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 47047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t type_size = m_target_data.getTypeStoreSize(type); 47147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 47247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (type_size) 47347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 47447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case 1: 47547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan scalar = (uint8_t)u64value; 47647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 47747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case 2: 47847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan scalar = (uint16_t)u64value; 47947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 48047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case 4: 48147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan scalar = (uint32_t)u64value; 48247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 48347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case 8: 48447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan scalar = (uint64_t)u64value; 48547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 48647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan default: 48747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 48847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 48947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 49047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return true; 49147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 49247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 49347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan bool EvaluateValue (lldb_private::Scalar &scalar, const Value *value, Module &module) 49447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 49547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const Constant *constant = dyn_cast<Constant>(value); 49647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 49747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (constant) 49847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 49947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (const ConstantInt *constant_int = dyn_cast<ConstantInt>(constant)) 50047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 50147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return AssignToMatchType(scalar, constant_int->getLimitedValue(), value->getType()); 50247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 50347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 50447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 50547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 50647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region region = ResolveValue(value, module); 50747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan DataExtractorSP value_extractor = m_memory.GetExtractor(region); 50847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 50947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!value_extractor) 51047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 51147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 51247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t value_size = m_target_data.getTypeStoreSize(value->getType()); 51347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 51436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t offset = 0; 51547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan uint64_t u64value = value_extractor->GetMaxU64(&offset, value_size); 51647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 51747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return AssignToMatchType(scalar, u64value, value->getType()); 51847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 51947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 52047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 52147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 52247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 52347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan bool AssignValue (const Value *value, lldb_private::Scalar &scalar, Module &module) 52447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 52547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region region = ResolveValue (value, module); 52647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 52747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Scalar cast_scalar; 52847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 52947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!AssignToMatchType(cast_scalar, scalar.GetRawBits64(0), value->getType())) 53047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 53147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 5325aff015bfe8ef7ae68c61801e320870471b2c4dfSean Callanan lldb_private::DataBufferHeap buf(region.m_extent, 0); 53347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 53447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Error err; 53547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 53647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!cast_scalar.GetAsMemoryData(buf.GetBytes(), buf.GetByteSize(), m_byte_order, err)) 53747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 53847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 53947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan DataEncoderSP region_encoder = m_memory.GetEncoder(region); 54047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 541d6d63d68de4fd26caee9e953ff912f9250911ec8Greg Clayton if (buf.GetByteSize() > region_encoder->GetByteSize()) 5425aff015bfe8ef7ae68c61801e320870471b2c4dfSean Callanan return false; // This should not happen 5435aff015bfe8ef7ae68c61801e320870471b2c4dfSean Callanan 54447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan memcpy(region_encoder->GetDataStart(), buf.GetBytes(), buf.GetByteSize()); 54547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 54647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return true; 54747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 54847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 5498eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan bool ResolveConstantValue (APInt &value, const Constant *constant) 55047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 55147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (const ConstantInt *constant_int = dyn_cast<ConstantInt>(constant)) 55247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 5538eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan value = constant_int->getValue(); 5548eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan return true; 55547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 556557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan else if (const ConstantFP *constant_fp = dyn_cast<ConstantFP>(constant)) 55747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 5588eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan value = constant_fp->getValueAPF().bitcastToAPInt(); 5598eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan return true; 56047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 561557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan else if (const ConstantExpr *constant_expr = dyn_cast<ConstantExpr>(constant)) 562557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan { 563557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan switch (constant_expr->getOpcode()) 564557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan { 5658eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan default: 5668eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan return false; 5678eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan case Instruction::IntToPtr: 5686b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan case Instruction::PtrToInt: 5698eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan case Instruction::BitCast: 5708eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan return ResolveConstantValue(value, constant_expr->getOperand(0)); 5718eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan case Instruction::GetElementPtr: 5728eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan { 5738eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan ConstantExpr::const_op_iterator op_cursor = constant_expr->op_begin(); 5748eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan ConstantExpr::const_op_iterator op_end = constant_expr->op_end(); 5758eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan 5768eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan Constant *base = dyn_cast<Constant>(*op_cursor); 5778eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan 5788eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan if (!base) 5798eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan return false; 5808eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan 5818eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan if (!ResolveConstantValue(value, base)) 5828eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan return false; 5838eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan 5848eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan op_cursor++; 5858eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan 5868eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan if (op_cursor == op_end) 5878eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan return true; // no offset to apply! 5888eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan 5898eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan SmallVector <Value *, 8> indices (op_cursor, op_end); 5908eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan 5918eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan uint64_t offset = m_target_data.getIndexedOffset(base->getType(), indices); 5928eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan 5938eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan const bool is_signed = true; 5948eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan value += APInt(value.getBitWidth(), offset, is_signed); 5958eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan 5968eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan return true; 5978eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan } 598557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 599557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 60047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 60147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 60247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 60347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 6048eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan bool ResolveConstant (Memory::Region ®ion, const Constant *constant) 6058eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan { 6068eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan APInt resolved_value; 6078eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan 6088eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan if (!ResolveConstantValue(resolved_value, constant)) 6098eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan return false; 6108eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan 6118eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan const uint64_t *raw_data = resolved_value.getRawData(); 6128eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan 6138eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan size_t constant_size = m_target_data.getTypeStoreSize(constant->getType()); 6148eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan return m_memory.Write(region.m_base, (const uint8_t*)raw_data, constant_size); 6158eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan } 6168eac77d782851ae85f821fee8eb0070b5d84b53bSean Callanan 61747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region ResolveValue (const Value *value, Module &module) 61847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 61947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ValueMap::iterator i = m_values.find(value); 62047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 62147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (i != m_values.end()) 62247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return i->second; 62347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 62447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const GlobalValue *global_value = dyn_cast<GlobalValue>(value); 62547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 6264b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan // If the variable is indirected through the argument 6274b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan // array then we need to build an extra level of indirection 6284b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan // for it. This is the default; only magic arguments like 6294b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan // "this", "self", and "_cmd" are direct. 630b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan bool variable_is_this = false; 6314b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 632583f15dfb8f680cee0c499bcd876c5eb3b173136Sean Callanan // If the variable is a function pointer, we do not need to 633583f15dfb8f680cee0c499bcd876c5eb3b173136Sean Callanan // build an extra layer of indirection for it because it is 634583f15dfb8f680cee0c499bcd876c5eb3b173136Sean Callanan // accessed directly. 635583f15dfb8f680cee0c499bcd876c5eb3b173136Sean Callanan bool variable_is_function_address = false; 636583f15dfb8f680cee0c499bcd876c5eb3b173136Sean Callanan 63747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Attempt to resolve the value using the program's data. 63847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // If it is, the values to be created are: 63947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // 64047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // data_region - a region of memory in which the variable's data resides. 64147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // ref_region - a region of memory in which its address (i.e., &var) resides. 64247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // In the JIT case, this region would be a member of the struct passed in. 64347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // pointer_region - a region of memory in which the address of the pointer 64447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // resides. This is an IR-level variable. 64547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan do 64647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 647952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton lldb_private::Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 6484b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 6494b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan lldb_private::Value resolved_value; 6504a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton lldb_private::ClangExpressionVariable::FlagType flags = 0; 65147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 6524b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan if (global_value) 6534b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan { 6544b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan clang::NamedDecl *decl = IRForTarget::DeclForGlobal(global_value, &module); 6554b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 6564b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan if (!decl) 6574b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan break; 6584b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 6594b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan if (isa<clang::FunctionDecl>(decl)) 660583f15dfb8f680cee0c499bcd876c5eb3b173136Sean Callanan variable_is_function_address = true; 6614b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 66252d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan resolved_value = m_decl_map.LookupDecl(decl, flags); 6634b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan } 6644b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan else 6654b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan { 6664b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan // Special-case "this", "self", and "_cmd" 6674b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 668fecc09c3709262515add87254cb973ce5175f17bSean Callanan std::string name_str = value->getName().str(); 6694b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 6704b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan if (name_str == "this" || 6714b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan name_str == "self" || 6724b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan name_str == "_cmd") 6735aff015bfe8ef7ae68c61801e320870471b2c4dfSean Callanan { 6744b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan resolved_value = m_decl_map.GetSpecialValue(lldb_private::ConstString(name_str.c_str())); 6755aff015bfe8ef7ae68c61801e320870471b2c4dfSean Callanan variable_is_this = true; 6765aff015bfe8ef7ae68c61801e320870471b2c4dfSean Callanan } 6774b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan } 67847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 67947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (resolved_value.GetScalar().GetType() != lldb_private::Scalar::e_void) 68047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 68147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (resolved_value.GetContextType() == lldb_private::Value::eContextTypeRegisterInfo) 68247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 683b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan if (variable_is_this) 684b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan { 685b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan Memory::Region data_region = m_memory.Place(value->getType(), resolved_value.GetScalar().ULongLong(), resolved_value); 686b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 687b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan lldb_private::Value origin; 688b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 689b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan origin.SetValueType(lldb_private::Value::eValueTypeLoadAddress); 690b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan origin.SetContext(lldb_private::Value::eContextTypeInvalid, NULL); 691b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan origin.GetScalar() = resolved_value.GetScalar(); 692b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 693b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan data_region.m_allocation->m_origin = origin; 694b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 695b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan Memory::Region ref_region = m_memory.Malloc(value->getType()); 696b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 697b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan if (ref_region.IsInvalid()) 698b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan return Memory::Region(); 699b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 700b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan DataEncoderSP ref_encoder = m_memory.GetEncoder(ref_region); 701b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 702b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan if (ref_encoder->PutAddress(0, data_region.m_base) == UINT32_MAX) 703b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan return Memory::Region(); 704b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 705b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan if (log) 706b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan { 707b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan log->Printf("Made an allocation for \"this\" register variable %s", PrintValue(value).c_str()); 708b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan log->Printf(" Data region : %llx", (unsigned long long)data_region.m_base); 709b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan log->Printf(" Ref region : %llx", (unsigned long long)ref_region.m_base); 710b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan } 711b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 712b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan m_values[value] = ref_region; 713b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan return ref_region; 714b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan } 715b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan else if (flags & lldb_private::ClangExpressionVariable::EVBareRegister) 716b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan { 717b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan lldb_private::RegisterInfo *reg_info = resolved_value.GetRegisterInfo(); 718b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan Memory::Region data_region = (reg_info->encoding == lldb::eEncodingVector) ? 7197c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton m_memory.Malloc(reg_info->byte_size, m_target_data.getPrefTypeAlignment(value->getType())) : 7207c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton m_memory.Malloc(value->getType()); 721b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 722b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan data_region.m_allocation->m_origin = resolved_value; 723b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan Memory::Region ref_region = m_memory.Malloc(value->getType()); 724b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 725b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan if (!Cache(data_region.m_allocation, value->getType())) 726b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan return Memory::Region(); 727b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 728b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan if (ref_region.IsInvalid()) 729b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan return Memory::Region(); 730b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 731b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan DataEncoderSP ref_encoder = m_memory.GetEncoder(ref_region); 732b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 733b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan if (ref_encoder->PutAddress(0, data_region.m_base) == UINT32_MAX) 734b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan return Memory::Region(); 735b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 736b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan if (log) 737b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan { 738b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan log->Printf("Made an allocation for bare register variable %s", PrintValue(value).c_str()); 739b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan log->Printf(" Data contents : %s", m_memory.PrintData(data_region.m_base, data_region.m_extent).c_str()); 740b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan log->Printf(" Data region : %llx", (unsigned long long)data_region.m_base); 741b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan log->Printf(" Ref region : %llx", (unsigned long long)ref_region.m_base); 742b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan } 743b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 744b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan m_values[value] = ref_region; 745b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan return ref_region; 746b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan } 747b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan else 748b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan { 749b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan lldb_private::RegisterInfo *reg_info = resolved_value.GetRegisterInfo(); 750b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan Memory::Region data_region = (reg_info->encoding == lldb::eEncodingVector) ? 751b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan m_memory.Malloc(reg_info->byte_size, m_target_data.getPrefTypeAlignment(value->getType())) : 752b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan m_memory.Malloc(value->getType()); 753b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 754b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan data_region.m_allocation->m_origin = resolved_value; 755b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan Memory::Region ref_region = m_memory.Malloc(value->getType()); 756b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan Memory::Region pointer_region; 757b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 7584b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan pointer_region = m_memory.Malloc(value->getType()); 759b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 760b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan if (!Cache(data_region.m_allocation, value->getType())) 761b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan return Memory::Region(); 762b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 763b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan if (ref_region.IsInvalid()) 764b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan return Memory::Region(); 765b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 766b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan if (pointer_region.IsInvalid()) 767b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan return Memory::Region(); 768b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 769b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan DataEncoderSP ref_encoder = m_memory.GetEncoder(ref_region); 770b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 771b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan if (ref_encoder->PutAddress(0, data_region.m_base) == UINT32_MAX) 772b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan return Memory::Region(); 773b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 774b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan if (log) 775b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan { 776b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan log->Printf("Made an allocation for ordinary register variable %s", PrintValue(value).c_str()); 777b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan log->Printf(" Data contents : %s", m_memory.PrintData(data_region.m_base, data_region.m_extent).c_str()); 778b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan log->Printf(" Data region : %llx", (unsigned long long)data_region.m_base); 779b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan log->Printf(" Ref region : %llx", (unsigned long long)ref_region.m_base); 7804237e1ea921ebd588b29319bf12050ba737fbca2Sean Callanan log->Printf(" Pointer region : %llx", (unsigned long long)pointer_region.m_base); 781b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan } 7824b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 783b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan DataEncoderSP pointer_encoder = m_memory.GetEncoder(pointer_region); 784b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan 7854b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan if (pointer_encoder->PutAddress(0, ref_region.m_base) == UINT32_MAX) 7864b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return Memory::Region(); 7874b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 7884b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan m_values[value] = pointer_region; 7894b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return pointer_region; 7904b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan } 79147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 79247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 79347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 794583f15dfb8f680cee0c499bcd876c5eb3b173136Sean Callanan bool no_extra_redirect = (variable_is_this || variable_is_function_address); 795583f15dfb8f680cee0c499bcd876c5eb3b173136Sean Callanan 79647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region data_region = m_memory.Place(value->getType(), resolved_value.GetScalar().ULongLong(), resolved_value); 79747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region ref_region = m_memory.Malloc(value->getType()); 7984b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan Memory::Region pointer_region; 7994b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 800583f15dfb8f680cee0c499bcd876c5eb3b173136Sean Callanan if (!no_extra_redirect) 8014b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan pointer_region = m_memory.Malloc(value->getType()); 80247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 80347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (ref_region.IsInvalid()) 80447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Memory::Region(); 80547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 806583f15dfb8f680cee0c499bcd876c5eb3b173136Sean Callanan if (pointer_region.IsInvalid() && !no_extra_redirect) 80747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Memory::Region(); 80847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 80947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan DataEncoderSP ref_encoder = m_memory.GetEncoder(ref_region); 81047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 81147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (ref_encoder->PutAddress(0, data_region.m_base) == UINT32_MAX) 81247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Memory::Region(); 81347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 814583f15dfb8f680cee0c499bcd876c5eb3b173136Sean Callanan if (!no_extra_redirect) 8154b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan { 8164b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan DataEncoderSP pointer_encoder = m_memory.GetEncoder(pointer_region); 81747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 8184b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan if (pointer_encoder->PutAddress(0, ref_region.m_base) == UINT32_MAX) 8194b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return Memory::Region(); 8204b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 8214b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan m_values[value] = pointer_region; 8224b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan } 82347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 82447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 82547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 8264b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan log->Printf("Made an allocation for %s", PrintValue(value).c_str()); 82747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" Data contents : %s", m_memory.PrintData(data_region.m_base, data_region.m_extent).c_str()); 82847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" Data region : %llx", (unsigned long long)data_region.m_base); 82947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" Ref region : %llx", (unsigned long long)ref_region.m_base); 830b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan if (!variable_is_this) 8314b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan log->Printf(" Pointer region : %llx", (unsigned long long)pointer_region.m_base); 83247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 83347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 834583f15dfb8f680cee0c499bcd876c5eb3b173136Sean Callanan if (no_extra_redirect) 8354b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return ref_region; 836b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan else 837b31911838a69b0c0fe63e89f4d12f6efcc09bffbSean Callanan return pointer_region; 83847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 83947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 84047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 84147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan while(0); 84247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 84347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Fall back and allocate space [allocation type Alloca] 84447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 84547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Type *type = value->getType(); 8465aff015bfe8ef7ae68c61801e320870471b2c4dfSean Callanan 84747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region data_region = m_memory.Malloc(type); 84847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan data_region.m_allocation->m_origin.GetScalar() = (unsigned long long)data_region.m_allocation->m_data->GetBytes(); 84947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan data_region.m_allocation->m_origin.SetContext(lldb_private::Value::eContextTypeInvalid, NULL); 85047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan data_region.m_allocation->m_origin.SetValueType(lldb_private::Value::eValueTypeHostAddress); 85147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 85247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const Constant *constant = dyn_cast<Constant>(value); 85347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 85447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan do 85547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 85647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!constant) 85747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 85847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 85947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!ResolveConstant (data_region, constant)) 86047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Memory::Region(); 86147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 86247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan while(0); 86347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 86447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_values[value] = data_region; 86547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return data_region; 86647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 86747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 86847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan bool ConstructResult (lldb::ClangExpressionVariableSP &result, 86947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const GlobalValue *result_value, 87047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const lldb_private::ConstString &result_name, 87147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::TypeFromParser result_type, 87247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Module &module) 87347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 87447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // The result_value resolves to P, a pointer to a region R containing the result data. 87547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // If the result variable is a reference, the region R contains a pointer to the result R_final in the original process. 87647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 87747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!result_value) 87847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return true; // There was no slot for a result – the expression doesn't return one. 87947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 88047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ValueMap::iterator i = m_values.find(result_value); 88147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 88247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (i == m_values.end()) 88347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; // There was a slot for the result, but we didn't write into it. 88447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 88547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region P = i->second; 88647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan DataExtractorSP P_extractor = m_memory.GetExtractor(P); 88747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 88847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!P_extractor) 88947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 89047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 89147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Type *pointer_ty = result_value->getType(); 89247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan PointerType *pointer_ptr_ty = dyn_cast<PointerType>(pointer_ty); 89347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!pointer_ptr_ty) 89447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 89547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Type *R_ty = pointer_ptr_ty->getElementType(); 89647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 89736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t offset = 0; 89847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::addr_t pointer = P_extractor->GetAddress(&offset); 89947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 90047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region R = m_memory.Lookup(pointer, R_ty); 90147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 90247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (R.m_allocation->m_origin.GetValueType() != lldb_private::Value::eValueTypeHostAddress || 90347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan !R.m_allocation->m_data) 90447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 90547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 90647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Value base; 90747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 908a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan bool transient = false; 909557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan bool maybe_make_load = false; 910a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan 91147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (m_decl_map.ResultIsReference(result_name)) 91247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 91347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan PointerType *R_ptr_ty = dyn_cast<PointerType>(R_ty); 91447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!R_ptr_ty) 91547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 91647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Type *R_final_ty = R_ptr_ty->getElementType(); 91747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 91847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan DataExtractorSP R_extractor = m_memory.GetExtractor(R); 91947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 92047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!R_extractor) 92147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 92247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 92347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan offset = 0; 92447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::addr_t R_pointer = R_extractor->GetAddress(&offset); 92547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 92647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region R_final = m_memory.Lookup(R_pointer, R_final_ty); 92747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 928557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan if (R_final.m_allocation) 929557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan { 930557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan if (R_final.m_allocation->m_data) 931557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan transient = true; // this is a stack allocation 932a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan 933557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan base = R_final.m_allocation->m_origin; 934557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan base.GetScalar() += (R_final.m_base - R_final.m_allocation->m_virtual_address); 935557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 936557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan else 937557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan { 938557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan // We got a bare pointer. We are going to treat it as a load address 939557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan // or a file address, letting decl_map make the choice based on whether 940557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan // or not a process exists. 941557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 942557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan base.SetContext(lldb_private::Value::eContextTypeInvalid, NULL); 943557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan base.SetValueType(lldb_private::Value::eValueTypeFileAddress); 944557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan base.GetScalar() = (unsigned long long)R_pointer; 945557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan maybe_make_load = true; 946557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 94747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 94847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 94947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 95047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan base.SetContext(lldb_private::Value::eContextTypeInvalid, NULL); 95147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan base.SetValueType(lldb_private::Value::eValueTypeHostAddress); 95247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan base.GetScalar() = (unsigned long long)R.m_allocation->m_data->GetBytes() + (R.m_base - R.m_allocation->m_virtual_address); 95347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 95447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 955557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan return m_decl_map.CompleteResultVariable (result, base, result_name, result_type, transient, maybe_make_load); 95647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 95747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}; 95847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 95947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool 96047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananIRInterpreter::maybeRunOnFunction (lldb::ClangExpressionVariableSP &result, 96147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const lldb_private::ConstString &result_name, 96247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::TypeFromParser result_type, 96347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Function &llvm_function, 964ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan Module &llvm_module, 965ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan lldb_private::Error &err) 96647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 967ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan if (supportsFunction (llvm_function, err)) 96847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return runOnFunction(result, 96947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result_name, 97047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result_type, 97147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan llvm_function, 972ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan llvm_module, 973ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err); 97447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 97547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 97647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 97747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 978ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callananstatic const char *unsupported_opcode_error = "Interpreter doesn't handle one of the expression's opcodes"; 979ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callananstatic const char *interpreter_initialization_error = "Interpreter couldn't be initialized"; 980ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callananstatic const char *interpreter_internal_error = "Interpreter encountered an internal error"; 981ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callananstatic const char *bad_value_error = "Interpreter couldn't resolve a value during execution"; 982ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callananstatic const char *memory_allocation_error = "Interpreter couldn't allocate memory"; 983ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callananstatic const char *memory_write_error = "Interpreter couldn't write to memory"; 984ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callananstatic const char *memory_read_error = "Interpreter couldn't read from memory"; 985ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callananstatic const char *infinite_loop_error = "Interpreter ran for too many cycles"; 9868f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callananstatic const char *bad_result_error = "Result of expression is in bad memory"; 987ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan 98847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool 989ddf110d67eb3d3e621441c4383904e838bc0c403Sean CallananIRInterpreter::supportsFunction (Function &llvm_function, 990ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan lldb_private::Error &err) 99147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 992952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton lldb_private::Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 99347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 99447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan for (Function::iterator bbi = llvm_function.begin(), bbe = llvm_function.end(); 99547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan bbi != bbe; 99647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ++bbi) 99747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 99847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan for (BasicBlock::iterator ii = bbi->begin(), ie = bbi->end(); 99947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ii != ie; 100047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ++ii) 100147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 100247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (ii->getOpcode()) 100347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 100447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan default: 100547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 100647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 100747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Unsupported instruction: %s", PrintValue(ii).c_str()); 1008ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1009ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(unsupported_opcode_error); 101047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 101147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 101247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Add: 101347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Alloca: 101447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::BitCast: 101547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Br: 101647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::GetElementPtr: 101747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 101847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::ICmp: 101947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 102047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ICmpInst *icmp_inst = dyn_cast<ICmpInst>(ii); 102147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 102247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!icmp_inst) 1023ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan { 1024ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1025ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(interpreter_internal_error); 102647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 1027ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan } 102847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 102947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (icmp_inst->getPredicate()) 103047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 103147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan default: 103247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 103347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 103447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Unsupported ICmp predicate: %s", PrintValue(ii).c_str()); 1035ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan 1036ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1037ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(unsupported_opcode_error); 103847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 103947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 104047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_EQ: 104147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_NE: 104247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_UGT: 104347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_UGE: 104447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_ULT: 104547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_ULE: 104647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_SGT: 104747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_SGE: 104847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_SLT: 104947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_SLE: 105047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 105147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 105247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 105347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 1054fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::And: 1055fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::AShr: 1056557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan case Instruction::IntToPtr: 10576b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan case Instruction::PtrToInt: 105847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Load: 1059fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::LShr: 106047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Mul: 1061fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::Or: 106247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Ret: 106347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::SDiv: 1064fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::Shl: 1065bab2a0caa65d114ab1dfc9314636c8057de285c7Sean Callanan case Instruction::SRem: 106647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Store: 106747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Sub: 106847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::UDiv: 1069bab2a0caa65d114ab1dfc9314636c8057de285c7Sean Callanan case Instruction::URem: 1070fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::Xor: 10716a3f9af114bfdc05c7b89de45fe7e0a52aceef0aSean Callanan case Instruction::ZExt: 107247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 107347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 107447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 107547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 107647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 107747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return true; 107847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 107947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 108047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool 108147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananIRInterpreter::runOnFunction (lldb::ClangExpressionVariableSP &result, 108247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const lldb_private::ConstString &result_name, 108347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::TypeFromParser result_type, 108447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Function &llvm_function, 1085ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan Module &llvm_module, 1086ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan lldb_private::Error &err) 108747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 1088952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton lldb_private::Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 108947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 109047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::ClangExpressionDeclMap::TargetInfo target_info = m_decl_map.GetTargetInfo(); 109147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 109247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!target_info.IsValid()) 1093ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan { 1094ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1095ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(interpreter_initialization_error); 109647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 1097ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan } 109847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 109947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::addr_t alloc_min; 110047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::addr_t alloc_max; 110147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 110247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (target_info.address_byte_size) 110347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 110447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan default: 1105ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1106ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(interpreter_initialization_error); 1107ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan return false; 110847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case 4: 110947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan alloc_min = 0x00001000llu; 111047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan alloc_max = 0x0000ffffllu; 111147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 111247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case 8: 111347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan alloc_min = 0x0000000000001000llu; 111447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan alloc_max = 0x000000000000ffffllu; 111547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 111647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 111747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 11183051ed73a487e92f12f8b6062f8415781453da21Micah Villmow DataLayout target_data(&llvm_module); 11194fbe61ba371bfde827b9424ebe5e14dce3d5fad3Sean Callanan if (target_data.getPointerSize(0) != target_info.address_byte_size) 1120ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan { 1121ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1122ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(interpreter_initialization_error); 112347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 1124ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan } 112547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (target_data.isLittleEndian() != (target_info.byte_order == lldb::eByteOrderLittle)) 1126ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan { 1127ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1128ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(interpreter_initialization_error); 112947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 1130ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan } 113147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 113247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory memory(target_data, m_decl_map, alloc_min, alloc_max); 113386d6ac2a3d920622c1ee7a68b5ca28b09dc18142Sean Callanan InterpreterStackFrame frame(target_data, memory, m_decl_map, m_memory_map); 113447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 113547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan uint32_t num_insts = 0; 113647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 113747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan frame.Jump(llvm_function.begin()); 113847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 113947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan while (frame.m_ii != frame.m_ie && (++num_insts < 4096)) 114047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 114147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const Instruction *inst = frame.m_ii; 114247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 114347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 114447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Interpreting %s", PrintValue(inst).c_str()); 114547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 114647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (inst->getOpcode()) 114747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 114847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan default: 114947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 115047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Add: 115147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Sub: 115247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Mul: 115347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::SDiv: 115447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::UDiv: 1155bab2a0caa65d114ab1dfc9314636c8057de285c7Sean Callanan case Instruction::SRem: 1156bab2a0caa65d114ab1dfc9314636c8057de285c7Sean Callanan case Instruction::URem: 1157fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::Shl: 1158fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::LShr: 1159fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::AShr: 1160fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::And: 1161fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::Or: 1162fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::Xor: 116347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 116447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const BinaryOperator *bin_op = dyn_cast<BinaryOperator>(inst); 116547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 116647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!bin_op) 116747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 116847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 116947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("getOpcode() returns %s, but instruction is not a BinaryOperator", inst->getOpcodeName()); 1170ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1171ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(interpreter_internal_error); 1172ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan return false; 117347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 117447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 117547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Value *lhs = inst->getOperand(0); 117647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Value *rhs = inst->getOperand(1); 117747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 117847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Scalar L; 117947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Scalar R; 118047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 118147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!frame.EvaluateValue(L, lhs, llvm_module)) 118247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 118347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 118447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Couldn't evaluate %s", PrintValue(lhs).c_str()); 1185ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1186ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(bad_value_error); 118747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 118847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 118947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 119047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!frame.EvaluateValue(R, rhs, llvm_module)) 119147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 119247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 119347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Couldn't evaluate %s", PrintValue(rhs).c_str()); 1194ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1195ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(bad_value_error); 119647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 119747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 119847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 119947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Scalar result; 120047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 120147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (inst->getOpcode()) 120247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 120347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan default: 120447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 120547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Add: 120647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = L + R; 120747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 120847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Mul: 120947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = L * R; 121047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 121147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Sub: 121247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = L - R; 121347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 121447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::SDiv: 121547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = L / R; 121647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 121747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::UDiv: 121847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = L.GetRawBits64(0) / R.GetRawBits64(1); 121947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 1220bab2a0caa65d114ab1dfc9314636c8057de285c7Sean Callanan case Instruction::SRem: 1221bab2a0caa65d114ab1dfc9314636c8057de285c7Sean Callanan result = L % R; 1222bab2a0caa65d114ab1dfc9314636c8057de285c7Sean Callanan break; 1223bab2a0caa65d114ab1dfc9314636c8057de285c7Sean Callanan case Instruction::URem: 1224bab2a0caa65d114ab1dfc9314636c8057de285c7Sean Callanan result = L.GetRawBits64(0) % R.GetRawBits64(1); 1225bab2a0caa65d114ab1dfc9314636c8057de285c7Sean Callanan break; 1226fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::Shl: 1227fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan result = L << R; 1228fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan break; 1229fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::AShr: 1230fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan result = L >> R; 1231fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan break; 1232fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::LShr: 1233fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan result = L; 1234fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan result.ShiftRightLogical(R); 1235fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan break; 1236fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::And: 1237fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan result = L & R; 1238fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan break; 1239fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::Or: 1240fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan result = L | R; 1241fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan break; 1242fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan case Instruction::Xor: 1243fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan result = L ^ R; 1244fac004ce7f0d5bbfaa6b59a88365bb752e31129dSean Callanan break; 124547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 124647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 124747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan frame.AssignValue(inst, result, llvm_module); 124847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 124947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 125047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 125147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Interpreted a %s", inst->getOpcodeName()); 125247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" L : %s", frame.SummarizeValue(lhs).c_str()); 125347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" R : %s", frame.SummarizeValue(rhs).c_str()); 125447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" = : %s", frame.SummarizeValue(inst).c_str()); 125547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 125647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 125747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 125847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Alloca: 125947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 126047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const AllocaInst *alloca_inst = dyn_cast<AllocaInst>(inst); 126147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 126247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!alloca_inst) 126347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 126447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 126547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("getOpcode() returns Alloca, but instruction is not an AllocaInst"); 1266ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1267ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(interpreter_internal_error); 126847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 126947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 127047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 127147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (alloca_inst->isArrayAllocation()) 127247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 127347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 127447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("AllocaInsts are not handled if isArrayAllocation() is true"); 1275ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1276ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(unsupported_opcode_error); 127747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 127847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 127947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 128047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // The semantics of Alloca are: 128147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Create a region R of virtual memory of type T, backed by a data buffer 128247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Create a region P of virtual memory of type T*, backed by a data buffer 128347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Write the virtual address of R into P 128447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 128547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Type *T = alloca_inst->getAllocatedType(); 128647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Type *Tptr = alloca_inst->getType(); 128747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 128847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region R = memory.Malloc(T); 128947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 129047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (R.IsInvalid()) 129147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 129247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 129347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Couldn't allocate memory for an AllocaInst"); 1294ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1295ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(memory_allocation_error); 129647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 129747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 129847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 129947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region P = memory.Malloc(Tptr); 130047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 130147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (P.IsInvalid()) 130247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 130347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 130447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Couldn't allocate the result pointer for an AllocaInst"); 1305ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1306ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(memory_allocation_error); 130747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 130847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 130947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 131047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan DataEncoderSP P_encoder = memory.GetEncoder(P); 131147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 131247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (P_encoder->PutAddress(0, R.m_base) == UINT32_MAX) 131347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 131447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 1315ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan log->Printf("Couldn't write the result pointer for an AllocaInst"); 1316ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1317ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(memory_write_error); 131847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 131947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 132047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 132147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan frame.m_values[alloca_inst] = P; 132247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 132347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 132447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 132547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Interpreted an AllocaInst"); 132647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" R : %s", memory.SummarizeRegion(R).c_str()); 132747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" P : %s", frame.SummarizeValue(alloca_inst).c_str()); 132847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 132947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 133047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 133147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::BitCast: 13326a3f9af114bfdc05c7b89de45fe7e0a52aceef0aSean Callanan case Instruction::ZExt: 133347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 13346a3f9af114bfdc05c7b89de45fe7e0a52aceef0aSean Callanan const CastInst *cast_inst = dyn_cast<CastInst>(inst); 133547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 13366a3f9af114bfdc05c7b89de45fe7e0a52aceef0aSean Callanan if (!cast_inst) 133747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 133847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 13396a3f9af114bfdc05c7b89de45fe7e0a52aceef0aSean Callanan log->Printf("getOpcode() returns %s, but instruction is not a BitCastInst", cast_inst->getOpcodeName()); 1340ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1341ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(interpreter_internal_error); 134247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 134347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 134447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 13456a3f9af114bfdc05c7b89de45fe7e0a52aceef0aSean Callanan Value *source = cast_inst->getOperand(0); 134647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 134747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Scalar S; 134847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 134947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!frame.EvaluateValue(S, source, llvm_module)) 135047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 135147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 135247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Couldn't evaluate %s", PrintValue(source).c_str()); 1353ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1354ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(bad_value_error); 135547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 135647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 135747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 135847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan frame.AssignValue(inst, S, llvm_module); 135947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 136047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 136147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Br: 136247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 136347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const BranchInst *br_inst = dyn_cast<BranchInst>(inst); 136447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 136547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!br_inst) 136647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 136747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 136847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("getOpcode() returns Br, but instruction is not a BranchInst"); 1369ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1370ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(interpreter_internal_error); 137147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 137247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 137347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 137447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (br_inst->isConditional()) 137547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 137647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Value *condition = br_inst->getCondition(); 137747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 137847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Scalar C; 137947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 138047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!frame.EvaluateValue(C, condition, llvm_module)) 138147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 138247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 138347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Couldn't evaluate %s", PrintValue(condition).c_str()); 1384ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1385ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(bad_value_error); 138647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 138747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 138847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 138947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (C.GetRawBits64(0)) 139047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan frame.Jump(br_inst->getSuccessor(0)); 139147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 139247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan frame.Jump(br_inst->getSuccessor(1)); 139347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 139447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 139547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 139647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Interpreted a BrInst with a condition"); 139747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" cond : %s", frame.SummarizeValue(condition).c_str()); 139847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 139947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 140047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 140147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 140247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan frame.Jump(br_inst->getSuccessor(0)); 140347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 140447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 140547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 140647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Interpreted a BrInst with no condition"); 140747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 140847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 140947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 141047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan continue; 141147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::GetElementPtr: 141247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 141347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const GetElementPtrInst *gep_inst = dyn_cast<GetElementPtrInst>(inst); 141447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 141547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!gep_inst) 141647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 141747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 141847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("getOpcode() returns GetElementPtr, but instruction is not a GetElementPtrInst"); 1419ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1420ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(interpreter_internal_error); 142147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 142247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 142347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 142447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const Value *pointer_operand = gep_inst->getPointerOperand(); 142547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Type *pointer_type = pointer_operand->getType(); 142647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 142747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Scalar P; 142847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 142947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!frame.EvaluateValue(P, pointer_operand, llvm_module)) 1430ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan { 1431ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan if (log) 1432ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan log->Printf("Couldn't evaluate %s", PrintValue(pointer_operand).c_str()); 1433ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1434ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(bad_value_error); 143547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 1436ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan } 1437ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan 14387347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan typedef SmallVector <Value *, 8> IndexVector; 14397347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan typedef IndexVector::iterator IndexIterator; 14407347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan 144147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan SmallVector <Value *, 8> indices (gep_inst->idx_begin(), 144247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan gep_inst->idx_end()); 144347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 14447347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan SmallVector <Value *, 8> const_indices; 14457347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan 14467347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan for (IndexIterator ii = indices.begin(), ie = indices.end(); 14477347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan ii != ie; 14487347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan ++ii) 14497347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan { 14507347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan ConstantInt *constant_index = dyn_cast<ConstantInt>(*ii); 14517347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan 14527347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan if (!constant_index) 14537347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan { 14547347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan lldb_private::Scalar I; 14557347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan 14567347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan if (!frame.EvaluateValue(I, *ii, llvm_module)) 14577347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan { 14587347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan if (log) 14597347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan log->Printf("Couldn't evaluate %s", PrintValue(*ii).c_str()); 14607347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan err.SetErrorToGenericError(); 14617347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan err.SetErrorString(bad_value_error); 14627347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan return false; 14637347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan } 14647347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan 14657347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan if (log) 14667347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan log->Printf("Evaluated constant index %s as %llu", PrintValue(*ii).c_str(), I.ULongLong(LLDB_INVALID_ADDRESS)); 14677347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan 14687347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan constant_index = cast<ConstantInt>(ConstantInt::get((*ii)->getType(), I.ULongLong(LLDB_INVALID_ADDRESS))); 14697347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan } 14707347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan 14717347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan const_indices.push_back(constant_index); 14727347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan } 14737347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan 14747347ef89c01f564d9cd84a77f6d860c607e8fee4Sean Callanan uint64_t offset = target_data.getIndexedOffset(pointer_type, const_indices); 147547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 147647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Scalar Poffset = P + offset; 147747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 147847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan frame.AssignValue(inst, Poffset, llvm_module); 147947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 148047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 148147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 148247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Interpreted a GetElementPtrInst"); 148347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" P : %s", frame.SummarizeValue(pointer_operand).c_str()); 148447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" Poffset : %s", frame.SummarizeValue(inst).c_str()); 148547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 148647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 148747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 148847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::ICmp: 148947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 149047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const ICmpInst *icmp_inst = dyn_cast<ICmpInst>(inst); 149147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 149247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!icmp_inst) 149347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 149447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 149547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("getOpcode() returns ICmp, but instruction is not an ICmpInst"); 1496ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1497ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(interpreter_internal_error); 149847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 149947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 150047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 150147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan CmpInst::Predicate predicate = icmp_inst->getPredicate(); 150247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 150347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Value *lhs = inst->getOperand(0); 150447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Value *rhs = inst->getOperand(1); 150547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 150647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Scalar L; 150747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Scalar R; 150847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 150947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!frame.EvaluateValue(L, lhs, llvm_module)) 151047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 151147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 151247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Couldn't evaluate %s", PrintValue(lhs).c_str()); 1513ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1514ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(bad_value_error); 151547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 151647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 151747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 151847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!frame.EvaluateValue(R, rhs, llvm_module)) 151947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 152047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 152147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Couldn't evaluate %s", PrintValue(rhs).c_str()); 1522ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1523ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(bad_value_error); 152447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 152547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 152647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 152747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Scalar result; 152847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 152947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (predicate) 153047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 153147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan default: 153247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 153347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_EQ: 153447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = (L == R); 153547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 153647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_NE: 153747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = (L != R); 153847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 153947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_UGT: 154047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = (L.GetRawBits64(0) > R.GetRawBits64(0)); 154147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 154247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_UGE: 154347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = (L.GetRawBits64(0) >= R.GetRawBits64(0)); 154447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 154547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_ULT: 154647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = (L.GetRawBits64(0) < R.GetRawBits64(0)); 154747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 154847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_ULE: 154947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = (L.GetRawBits64(0) <= R.GetRawBits64(0)); 155047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 155147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_SGT: 155247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = (L > R); 155347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 155447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_SGE: 155547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = (L >= R); 155647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 155747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_SLT: 155847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = (L < R); 155947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 156047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_SLE: 156147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = (L <= R); 156247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 156347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 156447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 156547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan frame.AssignValue(inst, result, llvm_module); 156647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 156747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 156847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 156947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Interpreted an ICmpInst"); 157047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" L : %s", frame.SummarizeValue(lhs).c_str()); 157147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" R : %s", frame.SummarizeValue(rhs).c_str()); 157247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" = : %s", frame.SummarizeValue(inst).c_str()); 157347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 157447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 157547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 1576557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan case Instruction::IntToPtr: 1577557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan { 1578557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan const IntToPtrInst *int_to_ptr_inst = dyn_cast<IntToPtrInst>(inst); 1579557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 1580557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan if (!int_to_ptr_inst) 1581557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan { 1582557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan if (log) 1583557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan log->Printf("getOpcode() returns IntToPtr, but instruction is not an IntToPtrInst"); 1584ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1585ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(interpreter_internal_error); 1586557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan return false; 1587557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 1588557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 1589557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan Value *src_operand = int_to_ptr_inst->getOperand(0); 1590557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 1591557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan lldb_private::Scalar I; 1592557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 1593557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan if (!frame.EvaluateValue(I, src_operand, llvm_module)) 1594ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan { 1595ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan if (log) 1596ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan log->Printf("Couldn't evaluate %s", PrintValue(src_operand).c_str()); 1597ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1598ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(bad_value_error); 1599557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan return false; 1600ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan } 1601557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 1602557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan frame.AssignValue(inst, I, llvm_module); 1603557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 1604557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan if (log) 1605557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan { 1606557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan log->Printf("Interpreted an IntToPtr"); 1607557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan log->Printf(" Src : %s", frame.SummarizeValue(src_operand).c_str()); 1608557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan log->Printf(" = : %s", frame.SummarizeValue(inst).c_str()); 1609557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 1610557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 1611557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan break; 16126b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan case Instruction::PtrToInt: 16136b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan { 16146b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan const PtrToIntInst *ptr_to_int_inst = dyn_cast<PtrToIntInst>(inst); 16156b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan 16166b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan if (!ptr_to_int_inst) 16176b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan { 16186b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan if (log) 16196b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan log->Printf("getOpcode() returns PtrToInt, but instruction is not an PtrToIntInst"); 16206b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan err.SetErrorToGenericError(); 16216b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan err.SetErrorString(interpreter_internal_error); 16226b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan return false; 16236b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan } 16246b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan 16256b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan Value *src_operand = ptr_to_int_inst->getOperand(0); 16266b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan 16276b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan lldb_private::Scalar I; 16286b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan 16296b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan if (!frame.EvaluateValue(I, src_operand, llvm_module)) 16306b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan { 16316b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan if (log) 16326b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan log->Printf("Couldn't evaluate %s", PrintValue(src_operand).c_str()); 16336b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan err.SetErrorToGenericError(); 16346b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan err.SetErrorString(bad_value_error); 16356b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan return false; 16366b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan } 16376b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan 16386b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan frame.AssignValue(inst, I, llvm_module); 16396b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan 16406b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan if (log) 16416b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan { 16426b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan log->Printf("Interpreted a PtrToInt"); 16436b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan log->Printf(" Src : %s", frame.SummarizeValue(src_operand).c_str()); 16446b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan log->Printf(" = : %s", frame.SummarizeValue(inst).c_str()); 16456b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan } 16466b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan } 16476b21a9b7c854ccf1eef1753e1ce2e9ab4976e4c2Sean Callanan break; 164847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Load: 164947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 165047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const LoadInst *load_inst = dyn_cast<LoadInst>(inst); 165147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 165247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!load_inst) 165347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 165447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 165547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("getOpcode() returns Load, but instruction is not a LoadInst"); 1656ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1657ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(interpreter_internal_error); 165847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 165947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 166047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 166147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // The semantics of Load are: 166247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Create a region D that will contain the loaded data 166347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Resolve the region P containing a pointer 166447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Dereference P to get the region R that the data should be loaded from 166547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Transfer a unit of type type(D) from R to D 166647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 166747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const Value *pointer_operand = load_inst->getPointerOperand(); 166847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 166947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Type *pointer_ty = pointer_operand->getType(); 167047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan PointerType *pointer_ptr_ty = dyn_cast<PointerType>(pointer_ty); 167147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!pointer_ptr_ty) 1672ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan { 1673ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan if (log) 1674ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan log->Printf("getPointerOperand()->getType() is not a PointerType"); 1675ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1676ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(interpreter_internal_error); 167747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 1678ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan } 167947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Type *target_ty = pointer_ptr_ty->getElementType(); 168047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 168147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region D = frame.ResolveValue(load_inst, llvm_module); 168247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region P = frame.ResolveValue(pointer_operand, llvm_module); 168347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 168447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (D.IsInvalid()) 168547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 168647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 168747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("LoadInst's value 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 if (P.IsInvalid()) 169447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 169547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 169647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("LoadInst's pointer doesn't resolve to anything"); 1697ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1698ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(bad_value_error); 169947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 170047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 170147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 170247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan DataExtractorSP P_extractor(memory.GetExtractor(P)); 170347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan DataEncoderSP D_encoder(memory.GetEncoder(D)); 170447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 170536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t offset = 0; 170647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::addr_t pointer = P_extractor->GetAddress(&offset); 170747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 170847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region R = memory.Lookup(pointer, target_ty); 170947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 1710557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan if (R.IsValid()) 1711557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan { 1712557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan if (!memory.Read(D_encoder->GetDataStart(), R.m_base, target_data.getTypeStoreSize(target_ty))) 1713557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan { 1714557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan if (log) 1715557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan log->Printf("Couldn't read from a region on behalf of a LoadInst"); 1716ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1717ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(memory_read_error); 1718557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan return false; 1719557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 1720557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 1721557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan else 1722557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan { 1723557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan if (!memory.ReadFromRawPtr(D_encoder->GetDataStart(), pointer, target_data.getTypeStoreSize(target_ty))) 1724557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan { 1725557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan if (log) 1726557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan log->Printf("Couldn't read from a raw pointer on behalf of a LoadInst"); 1727ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1728ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(memory_read_error); 1729557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan return false; 1730557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 1731557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 173247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 173347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 173447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 173547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Interpreted a LoadInst"); 173647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" P : %s", frame.SummarizeValue(pointer_operand).c_str()); 1737557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan if (R.IsValid()) 1738557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan log->Printf(" R : %s", memory.SummarizeRegion(R).c_str()); 1739557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan else 1740557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan log->Printf(" R : raw pointer 0x%llx", (unsigned long long)pointer); 174147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" D : %s", frame.SummarizeValue(load_inst).c_str()); 174247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 174347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 174447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 174547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Ret: 174647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 174747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (result_name.IsEmpty()) 174847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return true; 174947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 175047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan GlobalValue *result_value = llvm_module.getNamedValue(result_name.GetCString()); 17518f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan 17528f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan if (!frame.ConstructResult(result, result_value, result_name, result_type, llvm_module)) 17538f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan { 17548f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan if (log) 17558f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan log->Printf("Couldn't construct the expression's result"); 17568f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan err.SetErrorToGenericError(); 17578f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan err.SetErrorString(bad_result_error); 17588f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan return false; 17598f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan } 17608f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan 17618f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan return true; 176247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 176347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Store: 176447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 176547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const StoreInst *store_inst = dyn_cast<StoreInst>(inst); 176647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 176747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!store_inst) 176847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 176947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 177047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("getOpcode() returns Store, but instruction is not a StoreInst"); 1771ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1772ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(interpreter_internal_error); 177347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 177447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 177547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 177647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // The semantics of Store are: 177747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Resolve the region D containing the data to be stored 177847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Resolve the region P containing a pointer 177947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Dereference P to get the region R that the data should be stored in 178047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Transfer a unit of type type(D) from D to R 178147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 178247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const Value *value_operand = store_inst->getValueOperand(); 178347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const Value *pointer_operand = store_inst->getPointerOperand(); 178447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 178547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Type *pointer_ty = pointer_operand->getType(); 178647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan PointerType *pointer_ptr_ty = dyn_cast<PointerType>(pointer_ty); 178747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!pointer_ptr_ty) 178847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 178947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Type *target_ty = pointer_ptr_ty->getElementType(); 179047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 179147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region D = frame.ResolveValue(value_operand, llvm_module); 179247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region P = frame.ResolveValue(pointer_operand, llvm_module); 179347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 179447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (D.IsInvalid()) 179547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 179647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 179747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("StoreInst's value 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 if (P.IsInvalid()) 180447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 180547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 180647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("StoreInst's pointer doesn't resolve to anything"); 1807ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1808ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(bad_value_error); 180947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 181047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 181147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 181247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan DataExtractorSP P_extractor(memory.GetExtractor(P)); 181347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan DataExtractorSP D_extractor(memory.GetExtractor(D)); 181447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 181547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!P_extractor || !D_extractor) 181647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 181747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 181836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t offset = 0; 181947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::addr_t pointer = P_extractor->GetAddress(&offset); 182047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 182147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region R = memory.Lookup(pointer, target_ty); 182247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 1823557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan if (R.IsValid()) 182447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 1825557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan if (!memory.Write(R.m_base, D_extractor->GetDataStart(), target_data.getTypeStoreSize(target_ty))) 1826557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan { 1827557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan if (log) 1828557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan log->Printf("Couldn't write to a region on behalf of a LoadInst"); 1829ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1830ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(memory_write_error); 1831557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan return false; 1832557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 1833557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 1834557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan else 1835557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan { 1836557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan if (!memory.WriteToRawPtr(pointer, D_extractor->GetDataStart(), target_data.getTypeStoreSize(target_ty))) 1837557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan { 1838557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan if (log) 1839557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan log->Printf("Couldn't write to a raw pointer on behalf of a LoadInst"); 1840ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1841ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(memory_write_error); 1842557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan return false; 1843557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 184447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 184547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 184647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 184747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 184847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 184947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Interpreted a StoreInst"); 185047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" D : %s", frame.SummarizeValue(value_operand).c_str()); 185147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" P : %s", frame.SummarizeValue(pointer_operand).c_str()); 185247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" R : %s", memory.SummarizeRegion(R).c_str()); 185347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 185447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 185547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 185647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 185747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 185847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ++frame.m_ii; 185947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 186047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 186147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (num_insts >= 4096) 1862ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan { 1863ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorToGenericError(); 1864ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan err.SetErrorString(infinite_loop_error); 186547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 1866ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan } 1867ddf110d67eb3d3e621441c4383904e838bc0c403Sean Callanan 186847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 1869141f8d98cb74262914d66a7af4732e8cb2d8699fGreg Clayton} 1870