/* bfd back-end for TMS320C[34]x support
   Copyright (C) 1996-2026 Free Software Foundation, Inc.

   Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz)

   This file is part of BFD, the Binary File Descriptor library.

   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, write to the Free Software
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
   MA 02110-1301, USA.  */

#include "sysdep.h"
#include "bfd.h"
#include "libbfd.h"

static bool
tic4x_scan (const struct bfd_arch_info *info,
	    const char *string)
{
  /* Allow strings of form (tms320|ti|)[Cc][34], let's not be too picky
     about strange numbered machines in C3x or C4x series.  */
  if (string[0] == 't' && string[1] == 'i')
    string += 2;
  else if (startswith (string, "tms320"))
    string += 6;
  if (*string == 'C' || *string == 'c')
    string++;
  if (*string == '3')
    return (info->mach == bfd_mach_tic3x);
  else if (*string == '4')
    return info->mach == bfd_mach_tic4x;

  return false;
}

#define N(NUMBER, NAME, PRINT, DEFAULT, NEXT)		\
  {							\
    32,        /* Bits in a word.  */			\
    32,        /* Bits in an address.  */		\
    32,	       /* Bits in a byte.  */			\
    bfd_arch_tic4x,					\
    NUMBER,						\
    NAME,						\
    PRINT,						\
    0,		/* Section alignment power.  */		\
    DEFAULT,						\
    bfd_default_compatible,				\
    tic4x_scan,						\
    bfd_arch_default_fill,				\
    NEXT,						\
    0 /* Maximum offset of a reloc from the start of an insn.  */ \
  }

const bfd_arch_info_type bfd_tic3x_arch =
  N (bfd_mach_tic3x, "tic3x", "tms320c3x", false, NULL);

const bfd_arch_info_type bfd_tic4x_arch =
  N (bfd_mach_tic4x, "tic4x", "tms320c4x", true, &bfd_tic3x_arch);
