/* Target-dependent code for the Motorola 68000 series.

   Copyright (C) 1990-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_M68K_TDEP_H
#define GDB_M68K_TDEP_H

#include "gdbarch.h"

class frame_info_ptr;

/* Register numbers of various important registers.  */

enum m68k_regnum
{
  M68K_D0_REGNUM = 0,
  M68K_D1_REGNUM = 1,
  M68K_D2_REGNUM = 2,
  M68K_D7_REGNUM = 7,
  M68K_A0_REGNUM = 8,
  M68K_A1_REGNUM = 9,
  M68K_A2_REGNUM = 10,
  M68K_FP_REGNUM = 14,		/* Address of executing stack frame.  */
  M68K_SP_REGNUM = 15,		/* Address of top of stack.  */
  M68K_PS_REGNUM = 16,		/* Processor status.  */
  M68K_PC_REGNUM = 17,		/* Program counter.  */
  M68K_FP0_REGNUM = 18,		/* Floating point register 0.  */
  M68K_FPC_REGNUM = 26,		/* 68881 control register.  */
  M68K_FPS_REGNUM = 27,		/* 68881 status register.  */
  M68K_FPI_REGNUM = 28
};

/* Number of machine registers.  */
#define M68K_NUM_REGS	(M68K_FPI_REGNUM + 1)

/* Size of the largest register.  */
#define M68K_MAX_REGISTER_SIZE	12

/* Convention for returning structures.  */

enum struct_return
{
  pcc_struct_return,		/* Return "short" structures in memory.  */
  reg_struct_return		/* Return "short" structures in registers.  */
};

/* Particular flavour of m68k.  */
enum m68k_flavour
  {
    m68k_no_flavour,
    m68k_coldfire_flavour,
    m68k_fido_flavour
  };

/* Target-dependent structure in gdbarch.  */

struct m68k_gdbarch_tdep : gdbarch_tdep_base
{
  /* Offset to PC value in the jump buffer.  If this is negative,
     longjmp support will be disabled.  */
  int jb_pc = 0;
  /* The size of each entry in the jump buffer.  */
  size_t jb_elt_size = 0;

  /* Register in which the address to store a structure value is
     passed to a function.  */
  int struct_value_regnum = 0;

  /* Register in which a pointer value is returned.  In the SVR4 ABI,
     this is %a0, but in GCC's "embedded" ABI, this is %d0.  */
  int pointer_result_regnum = 0;

  /* Convention for returning structures.  */
  enum struct_return struct_return {};

  /* Convention for returning floats.  zero in int regs, non-zero in float.  */
  int float_return = 0;

  /* The particular flavour of m68k.  */
  enum m68k_flavour flavour {};

  /* Flag set if the floating point registers are present, or assumed
     to be present.  */
  int fpregs_present = 0;

   /* ISA-specific data types.  */
  struct type *m68k_ps_type = nullptr;
  struct type *m68881_ext_type = nullptr;
};

/* Initialize a SVR4 architecture variant.  */
extern void m68k_svr4_init_abi (struct gdbarch_info, struct gdbarch *);


/* Functions exported from m68k-bsd-tdep.c.  */

extern int m68kbsd_fpreg_offset (struct gdbarch *gdbarch, int regnum);

#endif /* GDB_M68K_TDEP_H */
