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

#include "ArchDefaultUnwindPlan-x86.h"
#include "lldb/Core/ArchSpec.h"
#include "lldb/Core/PluginManager.h"
#include "lldb/Utility/ArchDefaultUnwindPlan.h"

using namespace lldb;
using namespace lldb_private;

lldb_private::ArchDefaultUnwindPlan *
ArchDefaultUnwindPlan_x86_64::CreateInstance (const lldb_private::ArchSpec &arch)
{
    if (arch.GetMachine () == llvm::Triple::x86_64)
        return new ArchDefaultUnwindPlan_x86_64 ();
    return NULL;
}

ArchDefaultUnwindPlan_x86_64::ArchDefaultUnwindPlan_x86_64() :
                lldb_private::ArchDefaultUnwindPlan(), 
                m_unwind_plan_sp (new UnwindPlan)
{ 
    UnwindPlan::Row row;
    UnwindPlan::Row::RegisterLocation regloc;

    m_unwind_plan_sp->SetRegisterKind (eRegisterKindGeneric);
    row.SetCFARegister (LLDB_REGNUM_GENERIC_FP);
    row.SetCFAOffset (2 * 8);
    row.SetOffset (0);

    regloc.SetAtCFAPlusOffset (2 * -8);
    row.SetRegisterInfo (LLDB_REGNUM_GENERIC_FP, regloc);
    regloc.SetAtCFAPlusOffset (1 * -8);
    row.SetRegisterInfo (LLDB_REGNUM_GENERIC_PC, regloc);
    regloc.SetIsCFAPlusOffset (0);
    row.SetRegisterInfo (LLDB_REGNUM_GENERIC_SP, regloc);

    m_unwind_plan_sp->AppendRow (row);
    m_unwind_plan_sp->SetSourceName ("x86_64 architectural default");
}

//------------------------------------------------------------------
// PluginInterface protocol in UnwindAssemblyParser_x86
//------------------------------------------------------------------

const char *
ArchDefaultUnwindPlan_x86_64::GetPluginName()
{
    return "ArchDefaultUnwindPlan_x86_64";
}

const char *
ArchDefaultUnwindPlan_x86_64::GetShortPluginName()
{
    return "lldb.arch-default-unwind-plan.x86-64";
}


uint32_t
ArchDefaultUnwindPlan_x86_64::GetPluginVersion()
{
    return 1;
}

void
ArchDefaultUnwindPlan_x86_64::GetPluginCommandHelp (const char *command, Stream *strm)
{
}

Error
ArchDefaultUnwindPlan_x86_64::ExecutePluginCommand (Args &command, Stream *strm)
{
    Error error;
    error.SetErrorString("No plug-in command are currently supported.");
    return error;
}

Log *
ArchDefaultUnwindPlan_x86_64::EnablePluginLogging (Stream *strm, Args &command)
{
    return NULL;
}

void
ArchDefaultUnwindPlan_x86_64::Initialize()
{
    PluginManager::RegisterPlugin (GetPluginNameStatic(),
                                   GetPluginDescriptionStatic(),
                                   CreateInstance);
}

void
ArchDefaultUnwindPlan_x86_64::Terminate()
{
    PluginManager::UnregisterPlugin (CreateInstance);
}


const char *
ArchDefaultUnwindPlan_x86_64::GetPluginNameStatic()
{
    return "ArchDefaultUnwindPlan_x86_64";
}

const char *
ArchDefaultUnwindPlan_x86_64::GetPluginDescriptionStatic()
{
    return "x86_64 architecture default unwind plan assembly plugin.";
}

UnwindPlanSP
ArchDefaultUnwindPlan_x86_64::GetArchDefaultUnwindPlan (Thread& thread, Address current_pc)
{
    return m_unwind_plan_sp;
}



lldb_private::ArchDefaultUnwindPlan *
ArchDefaultUnwindPlan_i386::CreateInstance (const lldb_private::ArchSpec &arch)
{
    if (arch.GetMachine () == llvm::Triple::x86)
        return new ArchDefaultUnwindPlan_i386 ();
    return NULL;
}

ArchDefaultUnwindPlan_i386::ArchDefaultUnwindPlan_i386() :
                lldb_private::ArchDefaultUnwindPlan(), 
                m_unwind_plan_sp (new UnwindPlan)
{ 
    UnwindPlan::Row row;
    UnwindPlan::Row::RegisterLocation regloc;

    m_unwind_plan_sp->SetRegisterKind (eRegisterKindGeneric);
    row.SetCFARegister (LLDB_REGNUM_GENERIC_FP);
    row.SetCFAOffset (2 * 4);
    row.SetOffset (0);

    regloc.SetAtCFAPlusOffset (2 * -4);
    row.SetRegisterInfo (LLDB_REGNUM_GENERIC_FP, regloc);
    regloc.SetAtCFAPlusOffset (1 * -4);
    row.SetRegisterInfo (LLDB_REGNUM_GENERIC_PC, regloc);
    regloc.SetIsCFAPlusOffset (0);
    row.SetRegisterInfo (LLDB_REGNUM_GENERIC_SP, regloc);

    m_unwind_plan_sp->AppendRow (row);
    m_unwind_plan_sp->SetSourceName ("i386 architectural default");
}

//------------------------------------------------------------------
// PluginInterface protocol in UnwindAssemblyParser_x86
//------------------------------------------------------------------

const char *
ArchDefaultUnwindPlan_i386::GetPluginName()
{
    return "ArchDefaultUnwindPlan_i386";
}

const char *
ArchDefaultUnwindPlan_i386::GetShortPluginName()
{
    return "archdefaultunwindplan.x86";
}


uint32_t
ArchDefaultUnwindPlan_i386::GetPluginVersion()
{
    return 1;
}

void
ArchDefaultUnwindPlan_i386::GetPluginCommandHelp (const char *command, Stream *strm)
{
}

Error
ArchDefaultUnwindPlan_i386::ExecutePluginCommand (Args &command, Stream *strm)
{
    Error error;
    error.SetErrorString("No plug-in command are currently supported.");
    return error;
}

Log *
ArchDefaultUnwindPlan_i386::EnablePluginLogging (Stream *strm, Args &command)
{
    return NULL;
}

void
ArchDefaultUnwindPlan_i386::Initialize()
{
    PluginManager::RegisterPlugin (GetPluginNameStatic(),
                                   GetPluginDescriptionStatic(),
                                   CreateInstance);
}

void
ArchDefaultUnwindPlan_i386::Terminate()
{
    PluginManager::UnregisterPlugin (CreateInstance);
}


const char *
ArchDefaultUnwindPlan_i386::GetPluginNameStatic()
{
    return "ArchDefaultUnwindPlan_i386";
}

const char *
ArchDefaultUnwindPlan_i386::GetPluginDescriptionStatic()
{
    return "i386 architecture default unwind plan assembly plugin.";
}

UnwindPlanSP
ArchDefaultUnwindPlan_i386::GetArchDefaultUnwindPlan (Thread& thread, Address current_pc)
{
    return m_unwind_plan_sp;
}

