| /* BFD support for KVX. |
| Copyright (C) 2009-2024 Free Software Foundation, Inc. |
| Contributed by Kalray SA. |
| |
| 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; see the file COPYING3. If not, |
| see <http://www.gnu.org/licenses/>. */ |
| |
| #include "sysdep.h" |
| #include "bfd.h" |
| #include "libbfd.h" |
| |
| /* This routine is provided two arch_infos and returns if machines |
| are compatible. |
| */ |
| |
| static const bfd_arch_info_type * |
| kvx_compatible (const bfd_arch_info_type *a, const bfd_arch_info_type *b) |
| { |
| long amach = a->mach, bmach = b->mach; |
| /* If a & b are for different architecture we can do nothing. */ |
| if (a->arch != b->arch) |
| return NULL; |
| |
| if ((amach == bfd_mach_kv3_1_64 && bmach == bfd_mach_kv3_1_usr) |
| || (amach == bfd_mach_kv3_2_64 && bmach == bfd_mach_kv3_2_usr)) |
| return b; |
| |
| if ((bmach == bfd_mach_kv3_1_64 && amach == bfd_mach_kv3_1_usr) |
| || (bmach == bfd_mach_kv3_2_64 && amach == bfd_mach_kv3_2_usr)) |
| return a; |
| |
| /* Otherwise if either a or b is the 'default' machine |
| * then it can be polymorphed into the other. |
| * This will enable to execute merge_private_bfd_data |
| */ |
| if (a->the_default) |
| return b; |
| |
| if (b->the_default) |
| return a; |
| |
| /* We do not want to transmute some machine into another one */ |
| if (amach != bmach) |
| return NULL; |
| |
| /* If a & b are for the same machine then all is well. */ |
| if (amach == bmach) |
| return a; |
| |
| return NULL; |
| } |
| |
| static bool |
| scan (const struct bfd_arch_info *info, const char *string) |
| { |
| /* First test for an exact match. */ |
| if (strcasecmp (string, info->printable_name) == 0) |
| return true; |
| |
| /* Finally check for the default architecture. */ |
| if (strcasecmp (string, "kvx") == 0) |
| return info->the_default; |
| |
| return false; |
| } |
| |
| #define N(addr_bits, machine, print, default, next) \ |
| { \ |
| 32, /* 32 bits in a word. */ \ |
| addr_bits, /* bits in an address. */ \ |
| 8, /* 8 bits in a byte. */ \ |
| bfd_arch_kvx, \ |
| machine, /* Machine number. */ \ |
| "kvx", /* Architecture name. */ \ |
| print, /* Printable name. */ \ |
| 4, /* Section align power. */ \ |
| default, /* Is this the default ? */ \ |
| kvx_compatible, \ |
| scan, \ |
| bfd_arch_default_fill, \ |
| next, \ |
| 0 \ |
| } |
| |
| |
| const bfd_arch_info_type bfd_kv4_1_usr_arch = |
| N (64 , bfd_mach_kv4_1_usr , "kvx:kv4-1:usr" , false , NULL); |
| |
| const bfd_arch_info_type bfd_kv3_2_usr_arch = |
| N (64 , bfd_mach_kv3_2_usr , "kvx:kv3-2:usr" , false , &bfd_kv4_1_usr_arch); |
| |
| const bfd_arch_info_type bfd_kv3_1_usr_arch = |
| N (64 , bfd_mach_kv3_1_usr , "kvx:kv3-1:usr" , false , &bfd_kv3_2_usr_arch); |
| |
| const bfd_arch_info_type bfd_kv4_1_64_arch = |
| N (64 , bfd_mach_kv4_1_64 , "kvx:kv4-1:64" , false , &bfd_kv3_1_usr_arch); |
| |
| const bfd_arch_info_type bfd_kv3_2_64_arch = |
| N (64 , bfd_mach_kv3_2_64 , "kvx:kv3-2:64" , false , &bfd_kv4_1_64_arch); |
| |
| const bfd_arch_info_type bfd_kv3_1_64_arch = |
| N (64 , bfd_mach_kv3_1_64 , "kvx:kv3-1:64" , false , &bfd_kv3_2_64_arch); |
| |
| const bfd_arch_info_type bfd_kv4_1_arch = |
| N (32 , bfd_mach_kv4_1 , "kvx:kv4-1" , false , &bfd_kv3_1_64_arch); |
| |
| const bfd_arch_info_type bfd_kv3_2_arch = |
| N (32 , bfd_mach_kv3_2 , "kvx:kv3-2" , false , &bfd_kv4_1_arch); |
| |
| const bfd_arch_info_type bfd_kvx_arch = |
| N (32 , bfd_mach_kv3_1 , "kvx:kv3-1" , true , &bfd_kv3_2_arch); |