| /* BFD support for KVX. | |
| Copyright (C) 2009-2023 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); |