// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "src/developer/debug/ipc/register_desc.h"

#include <map>

#include "src/developer/debug/ipc/protocol.h"
#include "src/lib/fxl/arraysize.h"
#include "src/lib/fxl/logging.h"

namespace debug_ipc {
namespace {

struct RegisterInfo {
  RegisterID id;
  std::string name;
  Arch arch;
};

const RegisterInfo kRegisterInfo[] = {
    // ARMv8
    // -------------------------------------------------------------------

    // General purpose.

    {.id = RegisterID::kARMv8_x0, .name = "x0", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_x1, .name = "x1", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_x2, .name = "x2", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_x3, .name = "x3", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_x4, .name = "x4", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_x5, .name = "x5", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_x6, .name = "x6", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_x7, .name = "x7", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_x8, .name = "x8", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_x9, .name = "x9", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_x10, .name = "x10", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_x11, .name = "x11", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_x12, .name = "x12", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_x13, .name = "x13", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_x14, .name = "x14", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_x15, .name = "x15", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_x16, .name = "x16", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_x17, .name = "x17", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_x18, .name = "x18", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_x19, .name = "x19", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_x20, .name = "x20", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_x21, .name = "x21", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_x22, .name = "x22", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_x23, .name = "x23", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_x24, .name = "x24", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_x25, .name = "x25", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_x26, .name = "x26", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_x27, .name = "x27", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_x28, .name = "x28", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_x29, .name = "x29", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_lr, .name = "lr", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_sp, .name = "sp", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_pc, .name = "pc", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_cpsr, .name = "cpsr", .arch = Arch::kArm64},

    // FP (none defined for ARM64).

    // Vector.

    {.id = RegisterID::kARMv8_fpcr, .name = "fpcr", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_fpsr, .name = "fpsr", .arch = Arch::kArm64},

    {.id = RegisterID::kARMv8_v0, .name = "v0", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_v1, .name = "v1", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_v2, .name = "v2", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_v3, .name = "v3", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_v4, .name = "v4", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_v5, .name = "v5", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_v6, .name = "v6", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_v7, .name = "v7", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_v8, .name = "v8", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_v9, .name = "v9", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_v10, .name = "v10", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_v11, .name = "v11", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_v12, .name = "v12", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_v13, .name = "v13", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_v14, .name = "v14", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_v15, .name = "v15", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_v16, .name = "v16", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_v17, .name = "v17", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_v18, .name = "v18", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_v19, .name = "v19", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_v20, .name = "v20", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_v21, .name = "v21", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_v22, .name = "v22", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_v23, .name = "v23", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_v24, .name = "v24", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_v25, .name = "v25", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_v26, .name = "v26", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_v27, .name = "v27", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_v28, .name = "v28", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_v29, .name = "v29", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_v30, .name = "v30", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_v31, .name = "v31", .arch = Arch::kArm64},

    // Debug.

    {.id = RegisterID::kARMv8_id_aa64dfr0_el1, .name = "id_aa64dfr0_el1", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_mdscr_el1, .name = "mdscr_el1", .arch = Arch::kArm64},

    {.id = RegisterID::kARMv8_dbgbcr0_el1, .name = "kARMv8_dbgbcr0_el1", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_dbgbcr1_el1, .name = "kARMv8_dbgbcr1_el1", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_dbgbcr2_el1, .name = "kARMv8_dbgbcr2_el1", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_dbgbcr3_el1, .name = "kARMv8_dbgbcr3_el1", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_dbgbcr4_el1, .name = "kARMv8_dbgbcr4_el1", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_dbgbcr5_el1, .name = "kARMv8_dbgbcr5_el1", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_dbgbcr6_el1, .name = "kARMv8_dbgbcr6_el1", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_dbgbcr7_el1, .name = "kARMv8_dbgbcr7_el1", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_dbgbcr8_el1, .name = "kARMv8_dbgbcr8_el1", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_dbgbcr9_el1, .name = "kARMv8_dbgbcr9_el1", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_dbgbcr10_el1, .name = "kARMv8_dbgbcr10_el1", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_dbgbcr11_el1, .name = "kARMv8_dbgbcr11_el1", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_dbgbcr12_el1, .name = "kARMv8_dbgbcr12_el1", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_dbgbcr13_el1, .name = "kARMv8_dbgbcr13_el1", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_dbgbcr14_el1, .name = "kARMv8_dbgbcr14_el1", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_dbgbcr15_el1, .name = "kARMv8_dbgbcr15_el1", .arch = Arch::kArm64},

    {.id = RegisterID::kARMv8_dbgbvr0_el1, .name = "kARMv8_dbgbvr0_el1", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_dbgbvr1_el1, .name = "kARMv8_dbgbvr1_el1", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_dbgbvr2_el1, .name = "kARMv8_dbgbvr2_el1", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_dbgbvr3_el1, .name = "kARMv8_dbgbvr3_el1", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_dbgbvr4_el1, .name = "kARMv8_dbgbvr4_el1", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_dbgbvr5_el1, .name = "kARMv8_dbgbvr5_el1", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_dbgbvr6_el1, .name = "kARMv8_dbgbvr6_el1", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_dbgbvr7_el1, .name = "kARMv8_dbgbvr7_el1", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_dbgbvr8_el1, .name = "kARMv8_dbgbvr8_el1", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_dbgbvr9_el1, .name = "kARMv8_dbgbvr9_el1", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_dbgbvr10_el1, .name = "kARMv8_dbgbvr10_el1", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_dbgbvr11_el1, .name = "kARMv8_dbgbvr11_el1", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_dbgbvr12_el1, .name = "kARMv8_dbgbvr12_el1", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_dbgbvr13_el1, .name = "kARMv8_dbgbvr13_el1", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_dbgbvr14_el1, .name = "kARMv8_dbgbvr14_el1", .arch = Arch::kArm64},
    {.id = RegisterID::kARMv8_dbgbvr15_el1, .name = "kARMv8_dbgbvr15_el1", .arch = Arch::kArm64},

    // x64
    // ---------------------------------------------------------------------

    // General purpose.

    {.id = RegisterID::kX64_rax, .name = "rax", .arch = Arch::kX64},
    {.id = RegisterID::kX64_rbx, .name = "rbx", .arch = Arch::kX64},
    {.id = RegisterID::kX64_rcx, .name = "rcx", .arch = Arch::kX64},
    {.id = RegisterID::kX64_rdx, .name = "rdx", .arch = Arch::kX64},
    {.id = RegisterID::kX64_rsi, .name = "rsi", .arch = Arch::kX64},
    {.id = RegisterID::kX64_rdi, .name = "rdi", .arch = Arch::kX64},
    {.id = RegisterID::kX64_rbp, .name = "rbp", .arch = Arch::kX64},
    {.id = RegisterID::kX64_rsp, .name = "rsp", .arch = Arch::kX64},
    {.id = RegisterID::kX64_r8, .name = "r8", .arch = Arch::kX64},
    {.id = RegisterID::kX64_r9, .name = "r9", .arch = Arch::kX64},
    {.id = RegisterID::kX64_r10, .name = "r10", .arch = Arch::kX64},
    {.id = RegisterID::kX64_r11, .name = "r11", .arch = Arch::kX64},
    {.id = RegisterID::kX64_r12, .name = "r12", .arch = Arch::kX64},
    {.id = RegisterID::kX64_r13, .name = "r13", .arch = Arch::kX64},
    {.id = RegisterID::kX64_r14, .name = "r14", .arch = Arch::kX64},
    {.id = RegisterID::kX64_r15, .name = "r15", .arch = Arch::kX64},
    {.id = RegisterID::kX64_rip, .name = "rip", .arch = Arch::kX64},
    {.id = RegisterID::kX64_rflags, .name = "rflags", .arch = Arch::kX64},

    // FP.

    {.id = RegisterID::kX64_fcw, .name = "fcw", .arch = Arch::kX64},
    {.id = RegisterID::kX64_fsw, .name = "fsw", .arch = Arch::kX64},
    {.id = RegisterID::kX64_ftw, .name = "ftw", .arch = Arch::kX64},
    {.id = RegisterID::kX64_fop, .name = "fop", .arch = Arch::kX64},
    {.id = RegisterID::kX64_fip, .name = "fip", .arch = Arch::kX64},
    {.id = RegisterID::kX64_fdp, .name = "fdp", .arch = Arch::kX64},

    {.id = RegisterID::kX64_st0, .name = "st0", .arch = Arch::kX64},
    {.id = RegisterID::kX64_st1, .name = "st1", .arch = Arch::kX64},
    {.id = RegisterID::kX64_st2, .name = "st2", .arch = Arch::kX64},
    {.id = RegisterID::kX64_st3, .name = "st3", .arch = Arch::kX64},
    {.id = RegisterID::kX64_st4, .name = "st4", .arch = Arch::kX64},
    {.id = RegisterID::kX64_st5, .name = "st5", .arch = Arch::kX64},
    {.id = RegisterID::kX64_st6, .name = "st6", .arch = Arch::kX64},
    {.id = RegisterID::kX64_st7, .name = "st7", .arch = Arch::kX64},

    // Vector.

    {.id = RegisterID::kX64_mxcsr, .name = "mxcsr", .arch = Arch::kX64},

    // SSE/SSE2 (128 bit).
    {.id = RegisterID::kX64_xmm0, .name = "xmm0", .arch = Arch::kX64},
    {.id = RegisterID::kX64_xmm1, .name = "xmm1", .arch = Arch::kX64},
    {.id = RegisterID::kX64_xmm2, .name = "xmm2", .arch = Arch::kX64},
    {.id = RegisterID::kX64_xmm3, .name = "xmm3", .arch = Arch::kX64},
    {.id = RegisterID::kX64_xmm4, .name = "xmm4", .arch = Arch::kX64},
    {.id = RegisterID::kX64_xmm5, .name = "xmm5", .arch = Arch::kX64},
    {.id = RegisterID::kX64_xmm6, .name = "xmm6", .arch = Arch::kX64},
    {.id = RegisterID::kX64_xmm7, .name = "xmm7", .arch = Arch::kX64},
    {.id = RegisterID::kX64_xmm8, .name = "xmm8", .arch = Arch::kX64},
    {.id = RegisterID::kX64_xmm9, .name = "xmm9", .arch = Arch::kX64},
    {.id = RegisterID::kX64_xmm10, .name = "xmm10", .arch = Arch::kX64},
    {.id = RegisterID::kX64_xmm11, .name = "xmm11", .arch = Arch::kX64},
    {.id = RegisterID::kX64_xmm12, .name = "xmm12", .arch = Arch::kX64},
    {.id = RegisterID::kX64_xmm13, .name = "xmm13", .arch = Arch::kX64},
    {.id = RegisterID::kX64_xmm14, .name = "xmm14", .arch = Arch::kX64},
    {.id = RegisterID::kX64_xmm15, .name = "xmm15", .arch = Arch::kX64},

    // AVX (256 bit).
    {.id = RegisterID::kX64_ymm0, .name = "ymm0", .arch = Arch::kX64},
    {.id = RegisterID::kX64_ymm1, .name = "ymm1", .arch = Arch::kX64},
    {.id = RegisterID::kX64_ymm2, .name = "ymm2", .arch = Arch::kX64},
    {.id = RegisterID::kX64_ymm3, .name = "ymm3", .arch = Arch::kX64},
    {.id = RegisterID::kX64_ymm4, .name = "ymm4", .arch = Arch::kX64},
    {.id = RegisterID::kX64_ymm5, .name = "ymm5", .arch = Arch::kX64},
    {.id = RegisterID::kX64_ymm6, .name = "ymm6", .arch = Arch::kX64},
    {.id = RegisterID::kX64_ymm7, .name = "ymm7", .arch = Arch::kX64},
    {.id = RegisterID::kX64_ymm8, .name = "ymm8", .arch = Arch::kX64},
    {.id = RegisterID::kX64_ymm9, .name = "ymm9", .arch = Arch::kX64},
    {.id = RegisterID::kX64_ymm10, .name = "ymm10", .arch = Arch::kX64},
    {.id = RegisterID::kX64_ymm11, .name = "ymm11", .arch = Arch::kX64},
    {.id = RegisterID::kX64_ymm12, .name = "ymm12", .arch = Arch::kX64},
    {.id = RegisterID::kX64_ymm13, .name = "ymm13", .arch = Arch::kX64},
    {.id = RegisterID::kX64_ymm14, .name = "ymm14", .arch = Arch::kX64},
    {.id = RegisterID::kX64_ymm15, .name = "ymm15", .arch = Arch::kX64},

    // TODO(donosoc): Add support for AVX-512 when zircon supports it.

    // Debug.

    {.id = RegisterID::kX64_dr0, .name = "dr0", .arch = Arch::kX64},
    {.id = RegisterID::kX64_dr1, .name = "dr1", .arch = Arch::kX64},
    {.id = RegisterID::kX64_dr2, .name = "dr2", .arch = Arch::kX64},
    {.id = RegisterID::kX64_dr3, .name = "dr3", .arch = Arch::kX64},
    {.id = RegisterID::kX64_dr6, .name = "dr6", .arch = Arch::kX64},
    {.id = RegisterID::kX64_dr7, .name = "dr7", .arch = Arch::kX64},
};

constexpr size_t kRegisterInfoCount = arraysize(kRegisterInfo);

const RegisterInfo* RegisterIDToInfo(RegisterID id) {
  static std::map<RegisterID, const RegisterInfo*> info_map;

  if (info_map.empty()) {
    for (size_t i = 0; i < kRegisterInfoCount; i++) {
      info_map[kRegisterInfo[i].id] = &kRegisterInfo[i];
    }
  }

  auto iter = info_map.find(id);

  if (iter != info_map.end()) {
    return iter->second;
  }

  return nullptr;
}

RegisterID DWARFToRegisterIDX64(uint32_t dwarf_reg_id) {
  // TODO: It's possibly more maintainable to capture DWARF IDs in the table
  // and just have a cached lookup rather than this switch. We wouldn't even
  // need the arch-specific functions.

  // https://software.intel.com/sites/default/files/article/402129/mpx-linux64-abi.pdf
  // Page 62

  // xmm0-15 register range.
  if (dwarf_reg_id >= 17 && dwarf_reg_id <= 32) {
    return static_cast<RegisterID>(static_cast<uint32_t>(RegisterID::kX64_xmm0) +
                                   (dwarf_reg_id - 17));
  }

  switch (dwarf_reg_id) {
    case 0:
      return RegisterID::kX64_rax;
    case 1:
      return RegisterID::kX64_rdx;
    case 2:
      return RegisterID::kX64_rcx;
    case 3:
      return RegisterID::kX64_rbx;
    case 4:
      return RegisterID::kX64_rsi;
    case 5:
      return RegisterID::kX64_rdi;
    case 6:
      return RegisterID::kX64_rbp;
    case 7:
      return RegisterID::kX64_rsp;
    case 8:
    case 9:
    case 10:
    case 11:
    case 12:
    case 13:
    case 14:
    case 15: {
      // 8 = r8, 15 = r15
      auto base = static_cast<uint32_t>(RegisterID::kX64_r8);
      return static_cast<RegisterID>(base - 8 + dwarf_reg_id);
    }
    // 17-32 -> %xmm0 - %xmm15 handled above.
    // TODO(donosoc): 33-40 -> %st0 - %st7
    // TODO(donosoc): 41-48 -> %mm0 - %mm7
    case 49:
      return RegisterID::kX64_rflags;
      // TODO(donosoc): 50-55 -> (%es, %cs, %ss, %ds, %fs, %gs)
      // 56-57: Reserved
      // TODO(donsooc): 58 -> FS Base Address
      // TODO(donosoc): 59 -> GS Base Address
      // 60-61: Reserved
      // TODO(donosoc): 62 -> %ts (Task Register)
      // TODO(donosoc): 63 -> %ldtr
      // TODO(donosoc): 64 -> %mxcsr (128-bit Media Control and Status)
      // TODO(donosoc): 65 -> %fcw (x87 Control Word)
      // TODO(donosoc): 66 -> %fsw (x87 Status Word)
      // TODO(donosoc): 67-82 -> %xmm16–%xmm31 (Upper Vector Registers 16–31)
      // 83-117: Reserved
      // TODO(donosoc):118-125 -> %k0–%k7 (Vector Mask Registers 0–7)
      // TODO(donosoc):126-129 -> %bnd0–%bnd3 (Bound Registers 0–3)
  }

  return RegisterID::kUnknown;
}

RegisterID DWARFToRegisterIDARMv8(uint32_t dwarf_reg_id) {
  // TODO: See comment in DWARFToRegisterIDX64 about getting rid of these and
  // just adding the info to the table.

  // http://infocenter.arm.com/help/topic/com.arm.doc.ecm0665627/abi_sve_aadwarf_100985_0000_00_en.pdf
  // Page 6
  if (dwarf_reg_id <= 31) {
    auto base = static_cast<uint32_t>(RegisterID::kARMv8_x0);
    return static_cast<RegisterID>(base + dwarf_reg_id);
  }

  // 32: Reserved
  // TODO(donosoc): 33 -> ELR_mode
  // 34-45: Reserved
  // TODO(donosoc): 46 -> VG 64-bit SVE Vector granule pseudo register
  // TODO(donosoc): 47 -> FFR VG´8-bit SVE first fault register
  // TODO(donosoc): 48-63 -> P0-P15 VG´8-bit SVE predicate registers
  // TODO(donosoc): 64-95 -> V0-V31 128-bit FP/Advanced SIMD registers
  // TODO(donosoc): 96-127 -> Z0-Z31 VG´64-bit SVE vector registers
  return RegisterID::kUnknown;
}

}  // namespace

RegisterID GetSpecialRegisterID(Arch arch, SpecialRegisterType type) {
  switch (arch) {
    case Arch::kX64:
      switch (type) {
        case SpecialRegisterType::kNone:
          break;
        case SpecialRegisterType::kIP:
          return RegisterID::kX64_rip;
        case SpecialRegisterType::kSP:
          return RegisterID::kX64_rsp;
      }
      break;

    case Arch::kArm64:
      switch (type) {
        case SpecialRegisterType::kNone:
          break;
        case SpecialRegisterType::kIP:
          return RegisterID::kARMv8_pc;
        case SpecialRegisterType::kSP:
          return RegisterID::kARMv8_sp;
      }
      break;

    case Arch::kUnknown:
      break;
  }

  FXL_NOTREACHED();
  return RegisterID::kUnknown;
}

const char* RegisterIDToString(RegisterID id) {
  auto info = RegisterIDToInfo(id);

  if (!info) {
    FXL_NOTREACHED() << "Unknown register requested: " << static_cast<uint32_t>(id);
    return "";
  }

  return info->name.c_str();
}

RegisterID StringToRegisterID(const std::string& reg) {
  static std::map<std::string, RegisterID> id_map;

  if (id_map.empty()) {
    // We populate the whole map at once, otherwise any time we try to look up
    // an invalid register ID (fairly often) we have to search the whole list.
    for (size_t i = 0; i < kRegisterInfoCount; i++) {
      id_map[kRegisterInfo[i].name] = kRegisterInfo[i].id;
    }
  }

  auto iter = id_map.find(reg);

  if (iter == id_map.end()) {
    return RegisterID::kUnknown;
  }

  return iter->second;
}

Arch GetArchForRegisterID(RegisterID id) {
  auto info = RegisterIDToInfo(id);

  if (!info) {
    FXL_NOTREACHED() << "Arch for unknown register requested: " << static_cast<uint32_t>(id);
    return Arch::kUnknown;
  }

  return info->arch;
}

SpecialRegisterType GetSpecialRegisterType(RegisterID id) {
  switch (id) {
    case RegisterID::kX64_rip:
    case RegisterID::kARMv8_pc:
      return debug_ipc::SpecialRegisterType::kIP;
    case RegisterID::kX64_rsp:
    case RegisterID::kARMv8_sp:
      return debug_ipc::SpecialRegisterType::kSP;
    case RegisterID::kX64_rbp:
    default:
      return debug_ipc::SpecialRegisterType::kNone;
  }
}

RegisterID DWARFToRegisterID(Arch arch, uint32_t dwarf_reg_id) {
  switch (arch) {
    case Arch::kX64:
      return DWARFToRegisterIDX64(dwarf_reg_id);
    case Arch::kArm64:
      return DWARFToRegisterIDARMv8(dwarf_reg_id);
    case Arch::kUnknown:
      FXL_NOTREACHED() << "Architecture should be known for DWARF mapping.";
      return RegisterID::kUnknown;
  }
}

bool IsGeneralRegister(RegisterID id) {
  return (static_cast<uint32_t>(id) >= static_cast<uint32_t>(kARMv8GeneralBegin) &&
          static_cast<uint32_t>(id) <= static_cast<uint32_t>(kARMv8GeneralEnd)) ||
         (static_cast<uint32_t>(id) >= static_cast<uint32_t>(kX64GeneralBegin) &&
          static_cast<uint32_t>(id) <= static_cast<uint32_t>(kX64GeneralEnd));
}

}  // namespace debug_ipc
