// Copyright 2026 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// This file contains the definition of the RiscVGdbDebugInfo class. The
// RiscVGdbDebugInfo class is used to provide information about the registers
// and target XML to gdbserver.

#ifndef THIRD_PARTY_MPACT_RISCV_RISCV_GDB_DEBUG_INFO_H_
#define THIRD_PARTY_MPACT_RISCV_RISCV_GDB_DEBUG_INFO_H_

#include <string>
#include <string_view>

#include "absl/strings/string_view.h"
#include "mpact/sim/generic/debug_info.h"

namespace mpact::sim::riscv {

enum class RiscVGdbRegisterEnum : int {
  // Integer registers.
  kGprFirst = 0,
  kGprX0 = kGprFirst,
  kGprX1,
  kGprX2,
  kGprX3,
  kGprX4,
  kGprX5,
  kGprX6,
  kGprX7,
  kGprX8,
  kGprX9,
  kGprX10,
  kGprX11,
  kGprX12,
  kGprX13,
  kGprX14,
  kGprX15,
  kGprX16,
  kGprX17,
  kGprX18,
  kGprX19,
  kGprX20,
  kGprX21,
  kGprX22,
  kGprX23,
  kGprX24,
  kGprX25,
  kGprX26,
  kGprX27,
  kGprX28,
  kGprX29,
  kGprX30,
  kGprX31,
  kGprPc,
  kGprLast = kGprPc,
  // Floating point registers.
  kFprFirst = kGprLast + 1,
  kFprF0 = kFprFirst,
  kFprF1,
  kFprF2,
  kFprF3,
  kFprF4,
  kFprF5,
  kFprF6,
  kFprF7,
  kFprF8,
  kFprF9,
  kFprF10,
  kFprF11,
  kFprF12,
  kFprF13,
  kFprF14,
  kFprF15,
  kFprF16,
  kFprF17,
  kFprF18,
  kFprF19,
  kFprF20,
  kFprF21,
  kFprF22,
  kFprF23,
  kFprF24,
  kFprF25,
  kFprF26,
  kFprF27,
  kFprF28,
  kFprF29,
  kFprF30,
  kFprF31,
  kFprLast = kFprF31,
  kFprFcsr,
  // Vector registers.
  kVprFirst = kFprFcsr + 1,
  kVprV0 = kVprFirst,
  kVprV1,
  kVprV2,
  kVprV3,
  kVprV4,
  kVprV5,
  kVprV6,
  kVprV7,
  kVprV8,
  kVprV9,
  kVprV10,
  kVprV11,
  kVprV12,
  kVprV13,
  kVprV14,
  kVprV15,
  kVprV16,
  kVprV17,
  kVprV18,
  kVprV19,
  kVprV20,
  kVprV21,
  kVprV22,
  kVprV23,
  kVprV24,
  kVprV25,
  kVprV26,
  kVprV27,
  kVprV28,
  kVprV29,
  kVprV30,
  kVprV31,
  kVprLast = kVprV31,
  kVprVstart,
  kVprVxsat,
  kVprVxrm,
  kVprVcsr,
  kVprVl,
  kVprVtype,
  kVprVlenb,
};

class RiscVGdbDebugInfo : public generic::DebugInfo {
 public:
  using DebugRegisterMap = generic::DebugInfo::DebugRegisterMap;

  static RiscVGdbDebugInfo* Instance(int gpr_width, int fp_width,
                                     int vec_width);

  const DebugRegisterMap& debug_register_map() const override {
    return debug_register_map_;
  }
  int GetFirstGpr() const override {
    return static_cast<int>(RiscVGdbRegisterEnum::kGprFirst);
  };
  int GetLastGpr() const override {
    return static_cast<int>(RiscVGdbRegisterEnum::kGprLast);
  }
  int GetPcRegister() const override {
    return static_cast<int>(RiscVGdbRegisterEnum::kGprPc);
  }
  int GetGprWidth() const override { return gpr_width_; };
  // For now assume that all registers have the same width as the GPRs.
  int GetRegisterByteWidth(int register_number) const override {
    return gpr_width_ / 8;
  }
  std::string_view GetLLDBHostInfo() const override {
    return absl::string_view(host_info_);
  }
  std::string_view GetGdbTargetXml() const override {
    return absl::string_view(gdb_target_xml_);
  }

 private:
  RiscVGdbDebugInfo(int gpr_width, int fp_width, int vec_width);
  int gpr_width_;
  int fp_width_;
  int vec_width_;
  std::string host_info_;
  DebugRegisterMap debug_register_map_;
  // "Escaped" GDB target XML string.
  std::string gdb_target_xml_;
};

}  // namespace mpact::sim::riscv

#endif  // THIRD_PARTY_MPACT_RISCV_RISCV_GDB_DEBUG_INFO_H_
