/* Copyright (C) 2017-2025 Free Software Foundation, Inc.

   This file is part of GDB.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

#ifndef GDB_ARCH_ARC_H
#define GDB_ARCH_ARC_H

#include "gdbsupport/tdesc.h"

/* Supported ARC ISAs.  */
enum arc_isa
{
  ARC_ISA_ARCV1 = 1,  /* a.k.a. ARCompact (ARC600, ARC700)  */
  ARC_ISA_ARCV2	      /* such as ARC EM and ARC HS  */
};

struct arc_arch_features
{
  arc_arch_features (int reg_size, arc_isa isa)
    : reg_size (reg_size), isa (isa)
  {}

  /* Register size in bytes.  Possible values are 4, and 8.  A 0 indicates
     an uninitialised value.  */
  const int reg_size;

  /* See ARC_ISA enum.  */
  const arc_isa isa;

  /* Equality operator.  */
  bool operator== (const struct arc_arch_features &rhs) const
  {
    return (reg_size == rhs.reg_size && isa == rhs.isa);
  }

  /* Inequality operator.  */
  bool operator!= (const struct arc_arch_features &rhs) const
  {
    return !(*this == rhs);
  }

  /* Used by std::unordered_map to hash the feature sets.  The hash is
     calculated in the manner below:
     REG_SIZE |  ISA
      5-bits  | 4-bits  */

  std::size_t hash () const noexcept
  {
    std::size_t val = ((reg_size & 0x1f) << 8 | (isa & 0xf) << 0);
    return val;
  }
};

#ifdef GDBSERVER

/* Create and return a target description that is compatible with FEATURES.
   The only external client of this must be the gdbserver which manipulates
   the returned data.  */

target_desc_up arc_create_target_description
	(const struct arc_arch_features &features);

#else

/* Lookup the cache for a target description matching the FEATURES.
   If nothing is found, then create one and return it.  */

const target_desc *arc_lookup_target_description
	(const struct arc_arch_features &features);

#endif /* GDBSERVER */


#endif /* GDB_ARCH_ARC_H */
