blob: d9b3863194342a8aea4cce37328ea7b055834af8 [file] [log] [blame]
//===-- ARM64_DWARF_Registers.c ---------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include <string.h>
#include "ARM64_DWARF_Registers.h"
using namespace lldb;
using namespace lldb_private;
using namespace arm64_dwarf;
const char *
arm64_dwarf::GetRegisterName (unsigned reg_num, bool altnernate_name)
{
if (altnernate_name)
{
switch (reg_num)
{
case fp: return "x29";
case lr: return "x30";
case sp: return "x31";
default:
break;
}
return nullptr;
}
switch (reg_num)
{
case x0: return "x0";
case x1: return "x1";
case x2: return "x2";
case x3: return "x3";
case x4: return "x4";
case x5: return "x5";
case x6: return "x6";
case x7: return "x7";
case x8: return "x8";
case x9: return "x9";
case x10: return "x10";
case x11: return "x11";
case x12: return "x12";
case x13: return "x13";
case x14: return "x14";
case x15: return "x15";
case x16: return "x16";
case x17: return "x17";
case x18: return "x18";
case x19: return "x19";
case x20: return "x20";
case x21: return "x21";
case x22: return "x22";
case x23: return "x23";
case x24: return "x24";
case x25: return "x25";
case x26: return "x26";
case x27: return "x27";
case x28: return "x28";
case fp: return "fp";
case lr: return "lr";
case sp: return "sp";
case pc: return "pc";
case cpsr: return "cpsr";
case v0: return "v0";
case v1: return "v1";
case v2: return "v2";
case v3: return "v3";
case v4: return "v4";
case v5: return "v5";
case v6: return "v6";
case v7: return "v7";
case v8: return "v8";
case v9: return "v9";
case v10: return "v10";
case v11: return "v11";
case v12: return "v12";
case v13: return "v13";
case v14: return "v14";
case v15: return "v15";
case v16: return "v16";
case v17: return "v17";
case v18: return "v18";
case v19: return "v19";
case v20: return "v20";
case v21: return "v21";
case v22: return "v22";
case v23: return "v23";
case v24: return "v24";
case v25: return "v25";
case v26: return "v26";
case v27: return "v27";
case v28: return "v28";
case v29: return "v29";
case v30: return "v30";
case v31: return "v31";
}
return nullptr;
}
bool
arm64_dwarf::GetRegisterInfo (unsigned reg_num, RegisterInfo &reg_info)
{
::memset (&reg_info, 0, sizeof(RegisterInfo));
::memset (reg_info.kinds, LLDB_INVALID_REGNUM, sizeof(reg_info.kinds));
if (reg_num >= x0 && reg_num <= pc)
{
reg_info.byte_size = 8;
reg_info.format = eFormatHex;
reg_info.encoding = eEncodingUint;
}
else if (reg_num >= v0 && reg_num <= v31)
{
reg_info.byte_size = 16;
reg_info.format = eFormatVectorOfFloat32;
reg_info.encoding = eEncodingVector;
}
else if (reg_num == cpsr)
{
reg_info.byte_size = 4;
reg_info.format = eFormatHex;
reg_info.encoding = eEncodingUint;
}
else
{
return false;
}
reg_info.name = arm64_dwarf::GetRegisterName (reg_num, false);
reg_info.alt_name = arm64_dwarf::GetRegisterName (reg_num, true);
reg_info.kinds[eRegisterKindDWARF] = reg_num;
switch (reg_num)
{
case fp: reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_FP; break;
case lr: reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_RA; break;
case sp: reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_SP; break;
case pc: reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_PC; break;
default: break;
}
return true;
}