IRInterpreter.cpp revision 47dc457387b690c5e4df1c0c7dd8c4337b92e630
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" 1447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan#include "lldb/Expression/IRForTarget.h" 1547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan#include "lldb/Expression/IRInterpreter.h" 1647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 1747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan#include "llvm/Constants.h" 1847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan#include "llvm/Function.h" 1947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan#include "llvm/Instructions.h" 2047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan#include "llvm/Module.h" 2147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan#include "llvm/Support/raw_ostream.h" 2247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan#include "llvm/Target/TargetData.h" 2347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 2447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan#include <map> 2547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 2647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananusing namespace llvm; 2747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 2847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananIRInterpreter::IRInterpreter(lldb_private::ClangExpressionDeclMap &decl_map, 2947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Stream *error_stream) : 3047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_decl_map(decl_map), 3147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_error_stream(error_stream) 3247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 3347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 3447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 3547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 3647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananIRInterpreter::~IRInterpreter() 3747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 3847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 3947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 4047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 4147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananstatic std::string 4247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananPrintValue(const Value *value, bool truncate = false) 4347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 4447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan std::string s; 4547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan raw_string_ostream rso(s); 4647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan value->print(rso); 4747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan rso.flush(); 4847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (truncate) 4947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan s.resize(s.length() - 1); 5047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 5147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t offset; 5247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan while ((offset = s.find('\n')) != s.npos) 5347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan s.erase(offset, 1); 5447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan while (s[0] == ' ' || s[0] == '\t') 5547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan s.erase(0, 1); 5647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 5747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return s; 5847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 5947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 6047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananstatic std::string 6147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananPrintType(const Type *type, bool truncate = false) 6247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 6347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan std::string s; 6447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan raw_string_ostream rso(s); 6547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan type->print(rso); 6647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan rso.flush(); 6747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (truncate) 6847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan s.resize(s.length() - 1); 6947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return s; 7047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 7147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 7247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanantypedef lldb::SharedPtr <lldb_private::DataEncoder>::Type DataEncoderSP; 7347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanantypedef lldb::SharedPtr <lldb_private::DataExtractor>::Type DataExtractorSP; 7447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 7547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananclass Memory 7647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 7747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananpublic: 7847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan typedef uint32_t index_t; 7947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 8047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan struct Allocation 8147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 8247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // m_virtual_address is always the address of the variable in the virtual memory 8347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // space provided by Memory. 8447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // 8547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // m_origin is always non-NULL and describes the source of the data (possibly 8647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // m_data if this allocation is the authoritative source). 8747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // 8847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Possible value configurations: 8947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // 9047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Allocation type getValueType() getContextType() m_origin->GetScalar() m_data 9147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // ========================================================================================================================= 9247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // FileAddress eValueTypeFileAddress eContextTypeInvalid A location in a binary NULL 9347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // image 9447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // 9547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // LoadAddress eValueTypeLoadAddress eContextTypeInvalid A location in the target's NULL 9647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // virtual memory 9747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // 9847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Alloca eValueTypeHostAddress eContextTypeInvalid == m_data->GetBytes() Deleted at end of 9947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // execution 10047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // 10147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // PersistentVar eValueTypeHostAddress eContextTypeClangType A persistent variable's NULL 10247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // location in LLDB's memory 10347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // 10447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Register [ignored] eContextTypeRegister [ignored] Flushed to the register 10547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // at the end of execution 10647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 10747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::addr_t m_virtual_address; 10847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t m_extent; 10947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Value m_origin; 11047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::DataBufferSP m_data; 11147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 11247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Allocation (lldb::addr_t virtual_address, 11347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t extent, 11447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::DataBufferSP data) : 11547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_virtual_address(virtual_address), 11647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_extent(extent), 11747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_data(data) 11847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 11947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 12047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 12147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Allocation (const Allocation &allocation) : 12247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_virtual_address(allocation.m_virtual_address), 12347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_extent(allocation.m_extent), 12447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_origin(allocation.m_origin), 12547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_data(allocation.m_data) 12647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 12747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 12847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan }; 12947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 13047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan typedef lldb::SharedPtr <Allocation>::Type AllocationSP; 13147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 13247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan struct Region 13347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 13447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan AllocationSP m_allocation; 13547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan uint64_t m_base; 13647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan uint64_t m_extent; 13747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 13847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Region () : 13947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_allocation(), 14047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_base(0), 14147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_extent(0) 14247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 14347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 14447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 14547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Region (AllocationSP allocation, uint64_t base, uint64_t extent) : 14647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_allocation(allocation), 14747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_base(base), 14847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_extent(extent) 14947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 15047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 15147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 15247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Region (const Region ®ion) : 15347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_allocation(region.m_allocation), 15447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_base(region.m_base), 15547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_extent(region.m_extent) 15647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 15747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 15847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 15947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan bool IsValid () 16047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 16147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return m_allocation != NULL; 16247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 16347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 16447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan bool IsInvalid () 16547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 16647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return m_allocation == NULL; 16747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 16847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan }; 16947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 17047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan typedef std::vector <AllocationSP> MemoryMap; 17147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 17247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananprivate: 17347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::addr_t m_addr_base; 17447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::addr_t m_addr_max; 17547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan MemoryMap m_memory; 17647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::ByteOrder m_byte_order; 17747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::addr_t m_addr_byte_size; 17847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan TargetData &m_target_data; 17947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 18047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::ClangExpressionDeclMap &m_decl_map; 18147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 18247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan MemoryMap::iterator LookupInternal (lldb::addr_t addr) 18347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 18447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan for (MemoryMap::iterator i = m_memory.begin(), e = m_memory.end(); 18547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan i != e; 18647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ++i) 18747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 18847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if ((*i)->m_virtual_address <= addr && 18947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan (*i)->m_virtual_address + (*i)->m_extent > addr) 19047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return i; 19147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 19247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 19347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return m_memory.end(); 19447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 19547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 19647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananpublic: 19747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory (TargetData &target_data, 19847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::ClangExpressionDeclMap &decl_map, 19947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::addr_t alloc_start, 20047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::addr_t alloc_max) : 20147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_addr_base(alloc_start), 20247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_addr_max(alloc_max), 20347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_target_data(target_data), 20447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_decl_map(decl_map) 20547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 20647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_byte_order = (target_data.isLittleEndian() ? lldb::eByteOrderLittle : lldb::eByteOrderBig); 20747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_addr_byte_size = (target_data.getPointerSize()); 20847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 20947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 21047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Region Malloc (size_t size, size_t align) 21147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 21247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::DataBufferSP data(new lldb_private::DataBufferHeap(size, 0)); 21347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 21447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (data) 21547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 21647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan index_t index = m_memory.size(); 21747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 21847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const size_t mask = (align - 1); 21947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 22047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_addr_base += mask; 22147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_addr_base &= ~mask; 22247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 22347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (m_addr_base + size < m_addr_base || 22447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_addr_base + size > m_addr_max) 22547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Region(); 22647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 22747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan uint64_t base = m_addr_base; 22847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 22947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_memory.push_back(AllocationSP(new Allocation(base, size, data))); 23047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 23147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_addr_base += size; 23247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 23347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan AllocationSP alloc = m_memory[index]; 23447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 23547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan alloc->m_origin.GetScalar() = (unsigned long long)data->GetBytes(); 23647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan alloc->m_origin.SetContext(lldb_private::Value::eContextTypeInvalid, NULL); 23747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan alloc->m_origin.SetValueType(lldb_private::Value::eValueTypeHostAddress); 23847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 23947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Region(alloc, base, size); 24047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 24147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 24247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Region(); 24347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 24447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 24547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Region Malloc (Type *type) 24647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 24747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Malloc (m_target_data.getTypeAllocSize(type), 24847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_target_data.getPrefTypeAlignment(type)); 24947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 25047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 25147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Region Place (Type *type, lldb::addr_t base, lldb_private::Value &value) 25247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 25347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan index_t index = m_memory.size(); 25447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t size = m_target_data.getTypeAllocSize(type); 25547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 25647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_memory.push_back(AllocationSP(new Allocation(base, size, lldb::DataBufferSP()))); 25747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 25847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan AllocationSP alloc = m_memory[index]; 25947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 26047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan alloc->m_origin = value; 26147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 26247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Region(alloc, base, size); 26347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 26447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 26547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan void Free (lldb::addr_t addr) 26647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 26747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan MemoryMap::iterator i = LookupInternal (addr); 26847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 26947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (i != m_memory.end()) 27047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_memory.erase(i); 27147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 27247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 27347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Region Lookup (lldb::addr_t addr, Type *type) 27447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 27547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan MemoryMap::iterator i = LookupInternal(addr); 27647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 27747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (i == m_memory.end()) 27847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Region(); 27947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 28047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t size = m_target_data.getTypeStoreSize(type); 28147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 28247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Region(*i, addr, size); 28347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 28447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 28547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan DataEncoderSP GetEncoder (Region region) 28647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 28747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (region.m_allocation->m_origin.GetValueType() != lldb_private::Value::eValueTypeHostAddress) 28847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return DataEncoderSP(); 28947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 29047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::DataBufferSP buffer = region.m_allocation->m_data; 29147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 29247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!buffer) 29347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return DataEncoderSP(); 29447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 29547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t base_offset = (size_t)(region.m_base - region.m_allocation->m_virtual_address); 29647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 29747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return DataEncoderSP(new lldb_private::DataEncoder(buffer->GetBytes() + base_offset, region.m_extent, m_byte_order, m_addr_byte_size)); 29847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 29947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 30047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan DataExtractorSP GetExtractor (Region region) 30147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 30247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (region.m_allocation->m_origin.GetValueType() != lldb_private::Value::eValueTypeHostAddress) 30347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return DataExtractorSP(); 30447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 30547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::DataBufferSP buffer = region.m_allocation->m_data; 30647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t base_offset = (size_t)(region.m_base - region.m_allocation->m_virtual_address); 30747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 30847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (buffer) 30947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return DataExtractorSP(new lldb_private::DataExtractor(buffer->GetBytes() + base_offset, region.m_extent, m_byte_order, m_addr_byte_size)); 31047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 31147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return DataExtractorSP(new lldb_private::DataExtractor((uint8_t*)region.m_allocation->m_origin.GetScalar().ULongLong() + base_offset, region.m_extent, m_byte_order, m_addr_byte_size)); 31247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 31347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 31447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Value GetAccessTarget(lldb::addr_t addr) 31547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 31647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan MemoryMap::iterator i = LookupInternal(addr); 31747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 31847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (i == m_memory.end()) 31947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return lldb_private::Value(); 32047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 32147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Value target = (*i)->m_origin; 32247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 32347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (target.GetContextType() == lldb_private::Value::eContextTypeRegisterInfo) 32447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 32547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan target.SetContext(lldb_private::Value::eContextTypeInvalid, NULL); 32647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan target.SetValueType(lldb_private::Value::eValueTypeHostAddress); 32747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan target.GetScalar() = (unsigned long long)(*i)->m_data->GetBytes(); 32847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 32947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 33047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan target.GetScalar() += (addr - (*i)->m_virtual_address); 33147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 33247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return target; 33347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 33447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 33547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan bool Write (lldb::addr_t addr, const uint8_t *data, size_t length) 33647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 33747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Value target = GetAccessTarget(addr); 33847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 33947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return m_decl_map.WriteTarget(target, data, length); 34047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 34147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 34247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan bool Read (uint8_t *data, lldb::addr_t addr, size_t length) 34347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 34447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Value target = GetAccessTarget(addr); 34547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 34647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return m_decl_map.ReadTarget(data, target, length); 34747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 34847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 34947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan std::string PrintData (lldb::addr_t addr, size_t length) 35047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 35147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Value target = GetAccessTarget(addr); 35247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 35347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::DataBufferHeap buf(length, 0); 35447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 35547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!m_decl_map.ReadTarget(buf.GetBytes(), target, length)) 35647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return std::string("<couldn't read data>"); 35747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 35847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::StreamString ss; 35947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 36047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan for (size_t i = 0; i < length; i++) 36147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 36247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if ((!(i & 0xf)) && i) 36347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ss.Printf("%02hhx - ", buf.GetBytes()[i]); 36447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 36547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ss.Printf("%02hhx ", buf.GetBytes()[i]); 36647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 36747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 36847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return ss.GetString(); 36947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 37047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 37147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan std::string SummarizeRegion (Region ®ion) 37247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 37347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::StreamString ss; 37447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 37547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Value base = GetAccessTarget(region.m_base); 37647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 37747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ss.Printf("%llx [%s - %s %llx]", 37847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan region.m_base, 37947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Value::GetValueTypeAsCString(base.GetValueType()), 38047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Value::GetContextTypeAsCString(base.GetContextType()), 38147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan base.GetScalar().ULongLong()); 38247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 38347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ss.Printf(" %s", PrintData(region.m_base, region.m_extent).c_str()); 38447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 38547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return ss.GetString(); 38647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 38747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}; 38847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 38947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananclass InterpreterStackFrame 39047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 39147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananpublic: 39247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan typedef std::map <const Value*, Memory::Region> ValueMap; 39347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 39447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ValueMap m_values; 39547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory &m_memory; 39647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan TargetData &m_target_data; 39747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::ClangExpressionDeclMap &m_decl_map; 39847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const BasicBlock *m_bb; 39947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan BasicBlock::const_iterator m_ii; 40047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan BasicBlock::const_iterator m_ie; 40147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 40247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::ByteOrder m_byte_order; 40347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t m_addr_byte_size; 40447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 40547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan InterpreterStackFrame (TargetData &target_data, 40647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory &memory, 40747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::ClangExpressionDeclMap &decl_map) : 40847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_target_data (target_data), 40947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_memory (memory), 41047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_decl_map (decl_map) 41147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 41247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_byte_order = (target_data.isLittleEndian() ? lldb::eByteOrderLittle : lldb::eByteOrderBig); 41347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_addr_byte_size = (target_data.getPointerSize()); 41447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 41547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 41647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan void Jump (const BasicBlock *bb) 41747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 41847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_bb = bb; 41947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_ii = m_bb->begin(); 42047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_ie = m_bb->end(); 42147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 42247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 42347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan bool Cache (Memory::AllocationSP allocation, Type *type) 42447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 42547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (allocation->m_origin.GetContextType() != lldb_private::Value::eContextTypeRegisterInfo) 42647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 42747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 42847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return m_decl_map.ReadTarget(allocation->m_data->GetBytes(), allocation->m_origin, allocation->m_data->GetByteSize()); 42947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 43047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 43147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan std::string SummarizeValue (const Value *value) 43247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 43347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::StreamString ss; 43447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 43547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ss.Printf("%s", PrintValue(value).c_str()); 43647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 43747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ValueMap::iterator i = m_values.find(value); 43847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 43947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (i != m_values.end()) 44047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 44147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region region = i->second; 44247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 44347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ss.Printf(" %s", m_memory.SummarizeRegion(region).c_str()); 44447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 44547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 44647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return ss.GetString(); 44747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 44847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 44947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan bool AssignToMatchType (lldb_private::Scalar &scalar, uint64_t u64value, Type *type) 45047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 45147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t type_size = m_target_data.getTypeStoreSize(type); 45247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 45347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (type_size) 45447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 45547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case 1: 45647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan scalar = (uint8_t)u64value; 45747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 45847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case 2: 45947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan scalar = (uint16_t)u64value; 46047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 46147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case 4: 46247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan scalar = (uint32_t)u64value; 46347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 46447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case 8: 46547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan scalar = (uint64_t)u64value; 46647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 46747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan default: 46847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 46947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 47047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 47147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return true; 47247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 47347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 47447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan bool EvaluateValue (lldb_private::Scalar &scalar, const Value *value, Module &module) 47547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 47647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const Constant *constant = dyn_cast<Constant>(value); 47747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 47847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (constant) 47947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 48047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (const ConstantInt *constant_int = dyn_cast<ConstantInt>(constant)) 48147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 48247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return AssignToMatchType(scalar, constant_int->getLimitedValue(), value->getType()); 48347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 48447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 48547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 48647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 48747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region region = ResolveValue(value, module); 48847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan DataExtractorSP value_extractor = m_memory.GetExtractor(region); 48947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 49047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!value_extractor) 49147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 49247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 49347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t value_size = m_target_data.getTypeStoreSize(value->getType()); 49447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 49547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan uint32_t offset = 0; 49647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan uint64_t u64value = value_extractor->GetMaxU64(&offset, value_size); 49747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 49847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return AssignToMatchType(scalar, u64value, value->getType()); 49947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 50047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 50147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 50247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 50347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 50447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan bool AssignValue (const Value *value, lldb_private::Scalar &scalar, Module &module) 50547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 50647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region region = ResolveValue (value, module); 50747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 50847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Scalar cast_scalar; 50947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 51047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!AssignToMatchType(cast_scalar, scalar.GetRawBits64(0), value->getType())) 51147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 51247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 51347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::DataBufferHeap buf(cast_scalar.GetByteSize(), 0); 51447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 51547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Error err; 51647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 51747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!cast_scalar.GetAsMemoryData(buf.GetBytes(), buf.GetByteSize(), m_byte_order, err)) 51847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 51947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 52047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan DataEncoderSP region_encoder = m_memory.GetEncoder(region); 52147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 52247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan memcpy(region_encoder->GetDataStart(), buf.GetBytes(), buf.GetByteSize()); 52347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 52447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return true; 52547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 52647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 52747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan bool ResolveConstant (Memory::Region ®ion, const Constant *constant) 52847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 52947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t constant_size = m_target_data.getTypeStoreSize(constant->getType()); 53047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 53147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (const ConstantInt *constant_int = dyn_cast<ConstantInt>(constant)) 53247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 53347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const uint64_t *raw_data = constant_int->getValue().getRawData(); 53447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return m_memory.Write(region.m_base, (const uint8_t*)raw_data, constant_size); 53547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 53647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (const ConstantFP *constant_fp = dyn_cast<ConstantFP>(constant)) 53747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 53847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const uint64_t *raw_data = constant_fp->getValueAPF().bitcastToAPInt().getRawData(); 53947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return m_memory.Write(region.m_base, (const uint8_t*)raw_data, constant_size); 54047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 54147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 54247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 54347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 54447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 54547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region ResolveValue (const Value *value, Module &module) 54647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 54747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ValueMap::iterator i = m_values.find(value); 54847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 54947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (i != m_values.end()) 55047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return i->second; 55147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 55247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const GlobalValue *global_value = dyn_cast<GlobalValue>(value); 55347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 55447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Attempt to resolve the value using the program's data. 55547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // If it is, the values to be created are: 55647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // 55747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // data_region - a region of memory in which the variable's data resides. 55847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // ref_region - a region of memory in which its address (i.e., &var) resides. 55947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // In the JIT case, this region would be a member of the struct passed in. 56047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // pointer_region - a region of memory in which the address of the pointer 56147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // resides. This is an IR-level variable. 56247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan do 56347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 56447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!global_value) 56547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 56647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 56747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 56847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 56947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan clang::NamedDecl *decl = IRForTarget::DeclForGlobal(global_value, &module); 57047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 57147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!decl) 57247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 57347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 57447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Value resolved_value = m_decl_map.LookupDecl(decl); 57547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 57647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (resolved_value.GetScalar().GetType() != lldb_private::Scalar::e_void) 57747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 57847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (resolved_value.GetContextType() == lldb_private::Value::eContextTypeRegisterInfo) 57947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 58047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region data_region = m_memory.Malloc(value->getType()); 58147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan data_region.m_allocation->m_origin = resolved_value; 58247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region ref_region = m_memory.Malloc(value->getType()); 58347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region pointer_region = m_memory.Malloc(value->getType()); 58447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 58547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!Cache(data_region.m_allocation, value->getType())) 58647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Memory::Region(); 58747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 58847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (ref_region.IsInvalid()) 58947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Memory::Region(); 59047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 59147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (pointer_region.IsInvalid()) 59247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Memory::Region(); 59347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 59447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan DataEncoderSP ref_encoder = m_memory.GetEncoder(ref_region); 59547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 59647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (ref_encoder->PutAddress(0, data_region.m_base) == UINT32_MAX) 59747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Memory::Region(); 59847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 59947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan DataEncoderSP pointer_encoder = m_memory.GetEncoder(pointer_region); 60047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 60147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (pointer_encoder->PutAddress(0, ref_region.m_base) == UINT32_MAX) 60247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Memory::Region(); 60347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 60447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_values[value] = pointer_region; 60547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return pointer_region; 60647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 60747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else if (isa<clang::FunctionDecl>(decl)) 60847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 60947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 61047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("The interpreter does not handle function pointers at the moment"); 61147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 61247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Memory::Region(); 61347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 61447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 61547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 61647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region data_region = m_memory.Place(value->getType(), resolved_value.GetScalar().ULongLong(), resolved_value); 61747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region ref_region = m_memory.Malloc(value->getType()); 61847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region pointer_region = m_memory.Malloc(value->getType()); 61947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 62047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (ref_region.IsInvalid()) 62147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Memory::Region(); 62247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 62347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (pointer_region.IsInvalid()) 62447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Memory::Region(); 62547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 62647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan DataEncoderSP ref_encoder = m_memory.GetEncoder(ref_region); 62747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 62847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (ref_encoder->PutAddress(0, data_region.m_base) == UINT32_MAX) 62947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Memory::Region(); 63047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 63147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan DataEncoderSP pointer_encoder = m_memory.GetEncoder(pointer_region); 63247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 63347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (pointer_encoder->PutAddress(0, ref_region.m_base) == UINT32_MAX) 63447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Memory::Region(); 63547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 63647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_values[value] = pointer_region; 63747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 63847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 63947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 64047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Made an allocation for %s", PrintValue(global_value).c_str()); 64147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" Data contents : %s", m_memory.PrintData(data_region.m_base, data_region.m_extent).c_str()); 64247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" Data region : %llx", (unsigned long long)data_region.m_base); 64347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" Ref region : %llx", (unsigned long long)ref_region.m_base); 64447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" Pointer region : %llx", (unsigned long long)pointer_region.m_base); 64547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 64647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 64747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return pointer_region; 64847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 64947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 65047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 65147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan while(0); 65247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 65347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Fall back and allocate space [allocation type Alloca] 65447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 65547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Type *type = value->getType(); 65647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 65747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::ValueSP backing_value(new lldb_private::Value); 65847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 65947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region data_region = m_memory.Malloc(type); 66047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan data_region.m_allocation->m_origin.GetScalar() = (unsigned long long)data_region.m_allocation->m_data->GetBytes(); 66147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan data_region.m_allocation->m_origin.SetContext(lldb_private::Value::eContextTypeInvalid, NULL); 66247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan data_region.m_allocation->m_origin.SetValueType(lldb_private::Value::eValueTypeHostAddress); 66347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 66447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const Constant *constant = dyn_cast<Constant>(value); 66547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 66647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan do 66747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 66847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!constant) 66947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 67047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 67147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!ResolveConstant (data_region, constant)) 67247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Memory::Region(); 67347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 67447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan while(0); 67547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 67647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_values[value] = data_region; 67747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return data_region; 67847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 67947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 68047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan bool ConstructResult (lldb::ClangExpressionVariableSP &result, 68147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const GlobalValue *result_value, 68247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const lldb_private::ConstString &result_name, 68347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::TypeFromParser result_type, 68447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Module &module) 68547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 68647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // The result_value resolves to P, a pointer to a region R containing the result data. 68747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // If the result variable is a reference, the region R contains a pointer to the result R_final in the original process. 68847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 68947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!result_value) 69047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return true; // There was no slot for a result – the expression doesn't return one. 69147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 69247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ValueMap::iterator i = m_values.find(result_value); 69347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 69447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (i == m_values.end()) 69547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; // There was a slot for the result, but we didn't write into it. 69647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 69747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region P = i->second; 69847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan DataExtractorSP P_extractor = m_memory.GetExtractor(P); 69947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 70047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!P_extractor) 70147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 70247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 70347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Type *pointer_ty = result_value->getType(); 70447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan PointerType *pointer_ptr_ty = dyn_cast<PointerType>(pointer_ty); 70547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!pointer_ptr_ty) 70647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 70747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Type *R_ty = pointer_ptr_ty->getElementType(); 70847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 70947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan uint32_t offset = 0; 71047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::addr_t pointer = P_extractor->GetAddress(&offset); 71147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 71247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region R = m_memory.Lookup(pointer, R_ty); 71347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 71447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (R.m_allocation->m_origin.GetValueType() != lldb_private::Value::eValueTypeHostAddress || 71547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan !R.m_allocation->m_data) 71647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 71747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 71847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Value base; 71947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 72047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (m_decl_map.ResultIsReference(result_name)) 72147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 72247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan PointerType *R_ptr_ty = dyn_cast<PointerType>(R_ty); 72347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!R_ptr_ty) 72447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 72547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Type *R_final_ty = R_ptr_ty->getElementType(); 72647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 72747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan DataExtractorSP R_extractor = m_memory.GetExtractor(R); 72847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 72947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!R_extractor) 73047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 73147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 73247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan offset = 0; 73347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::addr_t R_pointer = R_extractor->GetAddress(&offset); 73447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 73547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region R_final = m_memory.Lookup(R_pointer, R_final_ty); 73647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 73747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!R_final.m_allocation) 73847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 73947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 74047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan base = R_final.m_allocation->m_origin; 74147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan base.GetScalar() += (R_final.m_base - R_final.m_allocation->m_virtual_address); 74247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 74347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 74447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 74547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan base.SetContext(lldb_private::Value::eContextTypeInvalid, NULL); 74647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan base.SetValueType(lldb_private::Value::eValueTypeHostAddress); 74747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan base.GetScalar() = (unsigned long long)R.m_allocation->m_data->GetBytes() + (R.m_base - R.m_allocation->m_virtual_address); 74847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 74947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 75047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return m_decl_map.CompleteResultVariable (result, base, result_name, result_type); 75147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 75247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}; 75347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 75447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool 75547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananIRInterpreter::maybeRunOnFunction (lldb::ClangExpressionVariableSP &result, 75647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const lldb_private::ConstString &result_name, 75747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::TypeFromParser result_type, 75847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Function &llvm_function, 75947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Module &llvm_module) 76047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 76147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (supportsFunction (llvm_function)) 76247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return runOnFunction(result, 76347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result_name, 76447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result_type, 76547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan llvm_function, 76647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan llvm_module); 76747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 76847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 76947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 77047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 77147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool 77247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananIRInterpreter::supportsFunction (Function &llvm_function) 77347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 77447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 77547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 77647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan for (Function::iterator bbi = llvm_function.begin(), bbe = llvm_function.end(); 77747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan bbi != bbe; 77847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ++bbi) 77947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 78047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan for (BasicBlock::iterator ii = bbi->begin(), ie = bbi->end(); 78147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ii != ie; 78247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ++ii) 78347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 78447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (ii->getOpcode()) 78547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 78647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan default: 78747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 78847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 78947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Unsupported instruction: %s", PrintValue(ii).c_str()); 79047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 79147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 79247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Add: 79347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Alloca: 79447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::BitCast: 79547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Br: 79647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::GetElementPtr: 79747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 79847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::ICmp: 79947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 80047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ICmpInst *icmp_inst = dyn_cast<ICmpInst>(ii); 80147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 80247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!icmp_inst) 80347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 80447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 80547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (icmp_inst->getPredicate()) 80647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 80747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan default: 80847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 80947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 81047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Unsupported ICmp predicate: %s", PrintValue(ii).c_str()); 81147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 81247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 81347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_EQ: 81447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_NE: 81547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_UGT: 81647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_UGE: 81747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_ULT: 81847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_ULE: 81947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_SGT: 82047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_SGE: 82147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_SLT: 82247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_SLE: 82347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 82447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 82547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 82647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 82747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Load: 82847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Mul: 82947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Ret: 83047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::SDiv: 83147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Store: 83247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Sub: 83347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::UDiv: 83447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 83547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 83647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 83747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 83847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 83947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return true; 84047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 84147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 84247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool 84347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananIRInterpreter::runOnFunction (lldb::ClangExpressionVariableSP &result, 84447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const lldb_private::ConstString &result_name, 84547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::TypeFromParser result_type, 84647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Function &llvm_function, 84747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Module &llvm_module) 84847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 84947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 85047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 85147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::ClangExpressionDeclMap::TargetInfo target_info = m_decl_map.GetTargetInfo(); 85247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 85347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!target_info.IsValid()) 85447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 85547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 85647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::addr_t alloc_min; 85747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::addr_t alloc_max; 85847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 85947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (target_info.address_byte_size) 86047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 86147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan default: 86247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 86347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case 4: 86447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan alloc_min = 0x00001000llu; 86547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan alloc_max = 0x0000ffffllu; 86647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 86747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case 8: 86847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan alloc_min = 0x0000000000001000llu; 86947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan alloc_max = 0x000000000000ffffllu; 87047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 87147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 87247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 87347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan TargetData target_data(&llvm_module); 87447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (target_data.getPointerSize() != target_info.address_byte_size) 87547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 87647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (target_data.isLittleEndian() != (target_info.byte_order == lldb::eByteOrderLittle)) 87747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 87847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 87947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory memory(target_data, m_decl_map, alloc_min, alloc_max); 88047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan InterpreterStackFrame frame(target_data, memory, m_decl_map); 88147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 88247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan uint32_t num_insts = 0; 88347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 88447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan frame.Jump(llvm_function.begin()); 88547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 88647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan while (frame.m_ii != frame.m_ie && (++num_insts < 4096)) 88747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 88847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const Instruction *inst = frame.m_ii; 88947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 89047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 89147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Interpreting %s", PrintValue(inst).c_str()); 89247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 89347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (inst->getOpcode()) 89447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 89547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan default: 89647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 89747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Add: 89847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Sub: 89947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Mul: 90047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::SDiv: 90147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::UDiv: 90247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 90347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const BinaryOperator *bin_op = dyn_cast<BinaryOperator>(inst); 90447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 90547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!bin_op) 90647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 90747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 90847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("getOpcode() returns %s, but instruction is not a BinaryOperator", inst->getOpcodeName()); 90947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 91047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 91147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 91247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 91347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Value *lhs = inst->getOperand(0); 91447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Value *rhs = inst->getOperand(1); 91547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 91647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Scalar L; 91747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Scalar R; 91847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 91947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!frame.EvaluateValue(L, lhs, llvm_module)) 92047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 92147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 92247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Couldn't evaluate %s", PrintValue(lhs).c_str()); 92347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 92447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 92547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 92647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 92747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!frame.EvaluateValue(R, rhs, llvm_module)) 92847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 92947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 93047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Couldn't evaluate %s", PrintValue(rhs).c_str()); 93147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 93247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 93347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 93447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 93547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Scalar result; 93647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 93747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (inst->getOpcode()) 93847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 93947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan default: 94047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 94147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Add: 94247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = L + R; 94347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 94447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Mul: 94547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = L * R; 94647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 94747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Sub: 94847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = L - R; 94947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 95047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::SDiv: 95147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = L / R; 95247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 95347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::UDiv: 95447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = L.GetRawBits64(0) / R.GetRawBits64(1); 95547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 95647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 95747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 95847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan frame.AssignValue(inst, result, llvm_module); 95947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 96047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 96147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 96247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Interpreted a %s", inst->getOpcodeName()); 96347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" L : %s", frame.SummarizeValue(lhs).c_str()); 96447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" R : %s", frame.SummarizeValue(rhs).c_str()); 96547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" = : %s", frame.SummarizeValue(inst).c_str()); 96647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 96747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 96847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 96947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Alloca: 97047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 97147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const AllocaInst *alloca_inst = dyn_cast<AllocaInst>(inst); 97247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 97347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!alloca_inst) 97447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 97547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 97647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("getOpcode() returns Alloca, but instruction is not an AllocaInst"); 97747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 97847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 97947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 98047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 98147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (alloca_inst->isArrayAllocation()) 98247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 98347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 98447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("AllocaInsts are not handled if isArrayAllocation() is true"); 98547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 98647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 98747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 98847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 98947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // The semantics of Alloca are: 99047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Create a region R of virtual memory of type T, backed by a data buffer 99147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Create a region P of virtual memory of type T*, backed by a data buffer 99247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Write the virtual address of R into P 99347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 99447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Type *T = alloca_inst->getAllocatedType(); 99547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Type *Tptr = alloca_inst->getType(); 99647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 99747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region R = memory.Malloc(T); 99847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 99947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (R.IsInvalid()) 100047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 100147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 100247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Couldn't allocate memory for an AllocaInst"); 100347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 100447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 100547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 100647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 100747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region P = memory.Malloc(Tptr); 100847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 100947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (P.IsInvalid()) 101047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 101147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 101247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Couldn't allocate the result pointer for an AllocaInst"); 101347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 101447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 101547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 101647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 101747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan DataEncoderSP P_encoder = memory.GetEncoder(P); 101847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 101947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (P_encoder->PutAddress(0, R.m_base) == UINT32_MAX) 102047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 102147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 102247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Couldn't write the reseult pointer for an AllocaInst"); 102347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 102447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 102547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 102647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 102747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan frame.m_values[alloca_inst] = P; 102847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 102947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 103047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 103147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Interpreted an AllocaInst"); 103247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" R : %s", memory.SummarizeRegion(R).c_str()); 103347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" P : %s", frame.SummarizeValue(alloca_inst).c_str()); 103447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 103547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 103647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 103747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::BitCast: 103847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 103947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const BitCastInst *bit_cast_inst = dyn_cast<BitCastInst>(inst); 104047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 104147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!bit_cast_inst) 104247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 104347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 104447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("getOpcode() returns BitCast, but instruction is not a BitCastInst"); 104547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 104647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 104747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 104847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 104947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Value *source = bit_cast_inst->getOperand(0); 105047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 105147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Scalar S; 105247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 105347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!frame.EvaluateValue(S, source, llvm_module)) 105447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 105547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 105647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Couldn't evaluate %s", PrintValue(source).c_str()); 105747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 105847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 105947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 106047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 106147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan frame.AssignValue(inst, S, llvm_module); 106247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 106347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 106447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Br: 106547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 106647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const BranchInst *br_inst = dyn_cast<BranchInst>(inst); 106747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 106847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!br_inst) 106947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 107047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 107147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("getOpcode() returns Br, but instruction is not a BranchInst"); 107247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 107347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 107447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 107547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 107647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (br_inst->isConditional()) 107747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 107847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Value *condition = br_inst->getCondition(); 107947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 108047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Scalar C; 108147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 108247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!frame.EvaluateValue(C, condition, llvm_module)) 108347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 108447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 108547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Couldn't evaluate %s", PrintValue(condition).c_str()); 108647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 108747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 108847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 108947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 109047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (C.GetRawBits64(0)) 109147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan frame.Jump(br_inst->getSuccessor(0)); 109247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 109347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan frame.Jump(br_inst->getSuccessor(1)); 109447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 109547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 109647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 109747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Interpreted a BrInst with a condition"); 109847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" cond : %s", frame.SummarizeValue(condition).c_str()); 109947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 110047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 110147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 110247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 110347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan frame.Jump(br_inst->getSuccessor(0)); 110447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 110547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 110647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 110747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Interpreted a BrInst with no condition"); 110847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 110947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 111047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 111147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan continue; 111247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::GetElementPtr: 111347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 111447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const GetElementPtrInst *gep_inst = dyn_cast<GetElementPtrInst>(inst); 111547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 111647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!gep_inst) 111747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 111847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 111947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("getOpcode() returns GetElementPtr, but instruction is not a GetElementPtrInst"); 112047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 112147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 112247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 112347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 112447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const Value *pointer_operand = gep_inst->getPointerOperand(); 112547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Type *pointer_type = pointer_operand->getType(); 112647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 112747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Scalar P; 112847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 112947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!frame.EvaluateValue(P, pointer_operand, llvm_module)) 113047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 113147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 113247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan SmallVector <Value *, 8> indices (gep_inst->idx_begin(), 113347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan gep_inst->idx_end()); 113447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 113547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan uint64_t offset = target_data.getIndexedOffset(pointer_type, indices); 113647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 113747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Scalar Poffset = P + offset; 113847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 113947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan frame.AssignValue(inst, Poffset, llvm_module); 114047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 114147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 114247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 114347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Interpreted a GetElementPtrInst"); 114447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" P : %s", frame.SummarizeValue(pointer_operand).c_str()); 114547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" Poffset : %s", frame.SummarizeValue(inst).c_str()); 114647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 114747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 114847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 114947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::ICmp: 115047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 115147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const ICmpInst *icmp_inst = dyn_cast<ICmpInst>(inst); 115247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 115347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!icmp_inst) 115447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 115547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 115647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("getOpcode() returns ICmp, but instruction is not an ICmpInst"); 115747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 115847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 115947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 116047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 116147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan CmpInst::Predicate predicate = icmp_inst->getPredicate(); 116247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 116347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Value *lhs = inst->getOperand(0); 116447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Value *rhs = inst->getOperand(1); 116547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 116647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Scalar L; 116747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Scalar R; 116847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 116947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!frame.EvaluateValue(L, lhs, llvm_module)) 117047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 117147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 117247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Couldn't evaluate %s", PrintValue(lhs).c_str()); 117347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 117447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 117547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 117647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 117747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!frame.EvaluateValue(R, rhs, llvm_module)) 117847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 117947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 118047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Couldn't evaluate %s", PrintValue(rhs).c_str()); 118147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 118247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 118347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 118447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 118547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Scalar result; 118647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 118747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (predicate) 118847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 118947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan default: 119047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 119147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_EQ: 119247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = (L == R); 119347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 119447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_NE: 119547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = (L != R); 119647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 119747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_UGT: 119847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = (L.GetRawBits64(0) > R.GetRawBits64(0)); 119947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 120047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_UGE: 120147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = (L.GetRawBits64(0) >= R.GetRawBits64(0)); 120247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 120347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_ULT: 120447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = (L.GetRawBits64(0) < R.GetRawBits64(0)); 120547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 120647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_ULE: 120747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = (L.GetRawBits64(0) <= R.GetRawBits64(0)); 120847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 120947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_SGT: 121047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = (L > R); 121147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 121247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_SGE: 121347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = (L >= R); 121447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 121547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_SLT: 121647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = (L < R); 121747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 121847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case CmpInst::ICMP_SLE: 121947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan result = (L <= R); 122047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 122147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 122247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 122347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan frame.AssignValue(inst, result, llvm_module); 122447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 122547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 122647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 122747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Interpreted an ICmpInst"); 122847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" L : %s", frame.SummarizeValue(lhs).c_str()); 122947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" R : %s", frame.SummarizeValue(rhs).c_str()); 123047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" = : %s", frame.SummarizeValue(inst).c_str()); 123147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 123247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 123347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 123447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Load: 123547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 123647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const LoadInst *load_inst = dyn_cast<LoadInst>(inst); 123747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 123847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!load_inst) 123947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 124047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 124147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("getOpcode() returns Load, but instruction is not a LoadInst"); 124247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 124347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 124447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 124547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 124647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // The semantics of Load are: 124747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Create a region D that will contain the loaded data 124847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Resolve the region P containing a pointer 124947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Dereference P to get the region R that the data should be loaded from 125047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Transfer a unit of type type(D) from R to D 125147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 125247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const Value *pointer_operand = load_inst->getPointerOperand(); 125347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 125447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Type *pointer_ty = pointer_operand->getType(); 125547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan PointerType *pointer_ptr_ty = dyn_cast<PointerType>(pointer_ty); 125647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!pointer_ptr_ty) 125747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 125847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Type *target_ty = pointer_ptr_ty->getElementType(); 125947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 126047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region D = frame.ResolveValue(load_inst, llvm_module); 126147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region P = frame.ResolveValue(pointer_operand, llvm_module); 126247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 126347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (D.IsInvalid()) 126447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 126547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 126647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("LoadInst's value doesn't resolve to anything"); 126747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 126847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 126947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 127047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 127147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (P.IsInvalid()) 127247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 127347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 127447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("LoadInst's pointer doesn't resolve to anything"); 127547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 127647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 127747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 127847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 127947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan DataExtractorSP P_extractor(memory.GetExtractor(P)); 128047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan DataEncoderSP D_encoder(memory.GetEncoder(D)); 128147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 128247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan uint32_t offset = 0; 128347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::addr_t pointer = P_extractor->GetAddress(&offset); 128447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 128547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region R = memory.Lookup(pointer, target_ty); 128647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 128747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan memory.Read(D_encoder->GetDataStart(), R.m_base, target_data.getTypeStoreSize(target_ty)); 128847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 128947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 129047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 129147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Interpreted a LoadInst"); 129247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" P : %s", frame.SummarizeValue(pointer_operand).c_str()); 129347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" R : %s", memory.SummarizeRegion(R).c_str()); 129447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" D : %s", frame.SummarizeValue(load_inst).c_str()); 129547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 129647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 129747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 129847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Ret: 129947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 130047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (result_name.IsEmpty()) 130147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return true; 130247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 130347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan GlobalValue *result_value = llvm_module.getNamedValue(result_name.GetCString()); 130447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return frame.ConstructResult(result, result_value, result_name, result_type, llvm_module); 130547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 130647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Instruction::Store: 130747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 130847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const StoreInst *store_inst = dyn_cast<StoreInst>(inst); 130947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 131047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!store_inst) 131147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 131247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 131347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("getOpcode() returns Store, but instruction is not a StoreInst"); 131447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 131547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 131647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 131747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 131847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // The semantics of Store are: 131947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Resolve the region D containing the data to be stored 132047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Resolve the region P containing a pointer 132147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Dereference P to get the region R that the data should be stored in 132247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // Transfer a unit of type type(D) from D to R 132347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 132447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const Value *value_operand = store_inst->getValueOperand(); 132547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const Value *pointer_operand = store_inst->getPointerOperand(); 132647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 132747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Type *pointer_ty = pointer_operand->getType(); 132847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan PointerType *pointer_ptr_ty = dyn_cast<PointerType>(pointer_ty); 132947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!pointer_ptr_ty) 133047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 133147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Type *target_ty = pointer_ptr_ty->getElementType(); 133247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 133347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region D = frame.ResolveValue(value_operand, llvm_module); 133447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region P = frame.ResolveValue(pointer_operand, llvm_module); 133547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 133647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (D.IsInvalid()) 133747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 133847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 133947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("StoreInst's value doesn't resolve to anything"); 134047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 134147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 134247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 134347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 134447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (P.IsInvalid()) 134547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 134647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 134747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("StoreInst's pointer doesn't resolve to anything"); 134847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 134947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 135047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 135147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 135247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan DataExtractorSP P_extractor(memory.GetExtractor(P)); 135347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan DataExtractorSP D_extractor(memory.GetExtractor(D)); 135447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 135547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!P_extractor || !D_extractor) 135647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 135747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 135847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan uint32_t offset = 0; 135947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb::addr_t pointer = P_extractor->GetAddress(&offset); 136047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 136147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Memory::Region R = memory.Lookup(pointer, target_ty); 136247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 136347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (R.IsInvalid()) 136447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 136547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 136647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("StoreInst's pointer doesn't point to a valid target"); 136747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 136847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 136947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 137047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 137147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan memory.Write(R.m_base, D_extractor->GetDataStart(), target_data.getTypeStoreSize(target_ty)); 137247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 137347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (log) 137447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 137547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf("Interpreted a StoreInst"); 137647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" D : %s", frame.SummarizeValue(value_operand).c_str()); 137747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" P : %s", frame.SummarizeValue(pointer_operand).c_str()); 137847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan log->Printf(" R : %s", memory.SummarizeRegion(R).c_str()); 137947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 138047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 138147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan break; 138247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 138347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 138447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ++frame.m_ii; 138547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 138647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 138747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (num_insts >= 4096) 138847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 138947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 139047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 139147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}