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