//===-- EmulationStateARM.h -------------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef LLDB_SOURCE_PLUGINS_INSTRUCTION_ARM_EMULATIONSTATEARM_H
#define LLDB_SOURCE_PLUGINS_INSTRUCTION_ARM_EMULATIONSTATEARM_H

#include <map>

#include "lldb/Core/EmulateInstruction.h"
#include "lldb/Core/Opcode.h"

class EmulationStateARM {
public:
  EmulationStateARM();

  virtual ~EmulationStateARM();

  bool StorePseudoRegisterValue(uint32_t reg_num, uint64_t value);

  uint64_t ReadPseudoRegisterValue(uint32_t reg_num, bool &success);

  bool StoreToPseudoAddress(lldb::addr_t p_address, uint32_t value);

  uint32_t ReadFromPseudoAddress(lldb::addr_t p_address, bool &success);

  void ClearPseudoRegisters();

  void ClearPseudoMemory();

  bool LoadPseudoRegistersFromFrame(lldb_private::StackFrame &frame);

  bool LoadStateFromDictionary(lldb_private::OptionValueDictionary *test_data);

  bool CompareState(EmulationStateARM &other_state);

  static size_t
  ReadPseudoMemory(lldb_private::EmulateInstruction *instruction, void *baton,
                   const lldb_private::EmulateInstruction::Context &context,
                   lldb::addr_t addr, void *dst, size_t length);

  static size_t
  WritePseudoMemory(lldb_private::EmulateInstruction *instruction, void *baton,
                    const lldb_private::EmulateInstruction::Context &context,
                    lldb::addr_t addr, const void *dst, size_t length);

  static bool ReadPseudoRegister(lldb_private::EmulateInstruction *instruction,
                                 void *baton,
                                 const lldb_private::RegisterInfo *reg_info,
                                 lldb_private::RegisterValue &reg_value);

  static bool
  WritePseudoRegister(lldb_private::EmulateInstruction *instruction,
                      void *baton,
                      const lldb_private::EmulateInstruction::Context &context,
                      const lldb_private::RegisterInfo *reg_info,
                      const lldb_private::RegisterValue &reg_value);

private:
  uint32_t m_gpr[17] = {0};
  struct _sd_regs {
    uint32_t s_regs[32]; // sregs 0 - 31 & dregs 0 - 15

    uint64_t d_regs[16]; // dregs 16-31

  } m_vfp_regs;

  std::map<lldb::addr_t, uint32_t> m_memory; // Eventually will want to change
                                             // uint32_t to a data buffer heap
                                             // type.

  EmulationStateARM(const EmulationStateARM &) = delete;
  const EmulationStateARM &operator=(const EmulationStateARM &) = delete;
};

#endif // LLDB_SOURCE_PLUGINS_INSTRUCTION_ARM_EMULATIONSTATEARM_H
