//===-- RegisterContextDummy.cpp ---------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//


#include "lldb/lldb-private.h"
#include "lldb/Core/Address.h"
#include "lldb/Core/AddressRange.h"
#include "lldb/Core/DataBufferHeap.h"
#include "lldb/Core/Log.h"
#include "lldb/Core/Module.h"
#include "lldb/Core/RegisterValue.h"
#include "lldb/Core/Value.h"
#include "lldb/Expression/DWARFExpression.h"
#include "lldb/Symbol/FuncUnwinders.h"
#include "lldb/Symbol/Function.h"
#include "lldb/Symbol/ObjectFile.h"
#include "lldb/Symbol/SymbolContext.h"
#include "lldb/Symbol/Symbol.h"
#include "lldb/Target/ABI.h"
#include "lldb/Target/ExecutionContext.h"
#include "lldb/Target/Process.h"
#include "lldb/Target/StackFrame.h"
#include "lldb/Target/Target.h"
#include "lldb/Target/Thread.h"
#include "lldb/Target/DynamicLoader.h"

#include "RegisterContextDummy.h"

using namespace lldb;
using namespace lldb_private;

RegisterContextDummy::RegisterContextDummy (Thread &thread, uint32_t concrete_frame_idx, uint32_t address_byte_size) :
RegisterContext (thread, concrete_frame_idx)
{
    m_reg_set0.name = "General Purpose Registers";
    m_reg_set0.short_name = "GPR";
    m_reg_set0.num_registers = 1;
    m_reg_set0.registers = new uint32_t(0);
    
    m_pc_reg_info.name = "pc";
    m_pc_reg_info.alt_name = "pc";
    m_pc_reg_info.byte_offset = 0;
    m_pc_reg_info.byte_size = address_byte_size;
    m_pc_reg_info.encoding = eEncodingUint;
    m_pc_reg_info.format = eFormatPointer;
    m_pc_reg_info.invalidate_regs = NULL;
    m_pc_reg_info.value_regs = NULL;
    m_pc_reg_info.kinds[eRegisterKindGCC] = LLDB_INVALID_REGNUM;
    m_pc_reg_info.kinds[eRegisterKindDWARF] = LLDB_INVALID_REGNUM;
    m_pc_reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_PC;
    m_pc_reg_info.kinds[eRegisterKindGDB] = LLDB_INVALID_REGNUM;
    m_pc_reg_info.kinds[eRegisterKindLLDB] = LLDB_INVALID_REGNUM;
}

RegisterContextDummy::~RegisterContextDummy ()
{
    delete m_reg_set0.registers;
    delete m_pc_reg_info.invalidate_regs;
    delete m_pc_reg_info.value_regs;
}

void
RegisterContextDummy::InvalidateAllRegisters () {}

size_t
RegisterContextDummy::GetRegisterCount ()
{
    return 1;
}

const lldb_private::RegisterInfo *
RegisterContextDummy::GetRegisterInfoAtIndex (size_t reg)
{
    if (reg)
        return NULL;
    return &m_pc_reg_info;
}

size_t
RegisterContextDummy::GetRegisterSetCount ()
{
    return 1;
}

const lldb_private::RegisterSet *
RegisterContextDummy::GetRegisterSet (size_t reg_set)
{
    if (reg_set)
        return NULL;
    return &m_reg_set0;
}

bool
RegisterContextDummy::ReadRegister (const lldb_private::RegisterInfo *reg_info, lldb_private::RegisterValue &value)
{
    if (!reg_info)
        return false;
    uint32_t reg_number = reg_info->kinds[eRegisterKindGeneric];
    if (reg_number == LLDB_REGNUM_GENERIC_PC)
    {
        value.SetUInt(LLDB_INVALID_ADDRESS, reg_info->byte_size);
        return true;
    }
    return false;
}

bool
RegisterContextDummy::WriteRegister (const lldb_private::RegisterInfo *reg_info, const lldb_private::RegisterValue &value)
{
    return false;
}

bool
RegisterContextDummy::ReadAllRegisterValues (lldb::DataBufferSP &data_sp)
{
    return false;
}

bool
RegisterContextDummy::WriteAllRegisterValues (const lldb::DataBufferSP &data_sp)
{
    return false;
}

uint32_t
RegisterContextDummy::ConvertRegisterKindToRegisterNumber (uint32_t kind, uint32_t num)
{
    if (kind == eRegisterKindGeneric && num == LLDB_REGNUM_GENERIC_PC)
        return 0;
    return LLDB_INVALID_REGNUM;
}
