X-Git-Url: http://drtracing.org/?a=blobdiff_plain;ds=sidebyside;f=bfd%2Fcpu-riscv.c;h=b5c972ff4dc9c2287fe97fcb20bb540b798dbe14;hb=6fde587ff78a54b9e3bd70259de60cc5d7d8ced7;hp=43cd7592252d892498732b455bea6caacf0ec151;hpb=2571583aed598dd3f9651b53434e5f177a0e3cf7;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/cpu-riscv.c b/bfd/cpu-riscv.c index 43cd759225..b5c972ff4d 100644 --- a/bfd/cpu-riscv.c +++ b/bfd/cpu-riscv.c @@ -1,5 +1,5 @@ /* BFD backend for RISC-V - Copyright (C) 2011-2017 Free Software Foundation, Inc. + Copyright (C) 2011-2020 Free Software Foundation, Inc. Contributed by Andrew Waterman (andrew@sifive.com). Based on MIPS target. @@ -39,11 +39,28 @@ riscv_compatible (const bfd_arch_info_type *a, const bfd_arch_info_type *b) return a; } -#define N(BITS_WORD, BITS_ADDR, NUMBER, PRINT, DEFAULT, NEXT) \ +/* Return TRUE if STRING matches the architecture described by INFO. */ + +static bfd_boolean +riscv_scan (const struct bfd_arch_info *info, const char *string) +{ + if (bfd_default_scan (info, string)) + return TRUE; + + /* The string might have extra characters for supported subsets. So allow + a match that ignores trailing characters in string. */ + if (strncasecmp (string, info->printable_name, + strlen (info->printable_name)) == 0) + return TRUE; + + return FALSE; +} + +#define N(BITS, NUMBER, PRINT, DEFAULT, NEXT) \ { \ - BITS_WORD, /* bits in a word */ \ - BITS_ADDR, /* bits in an address */ \ - 8, /* 8 bits in a byte */ \ + BITS, /* Bits in a word. */ \ + BITS, /* Bits in an address. */ \ + 8, /* Bits in a byte. */ \ bfd_arch_riscv, \ NUMBER, \ "riscv", \ @@ -51,9 +68,10 @@ riscv_compatible (const bfd_arch_info_type *a, const bfd_arch_info_type *b) 3, \ DEFAULT, \ riscv_compatible, \ - bfd_default_scan, \ + riscv_scan, \ bfd_arch_default_fill, \ NEXT, \ + 0 /* Maximum offset of a reloc from the start of an insn. */\ } /* This enum must be kept in the same order as arch_info_struct. */ @@ -69,11 +87,11 @@ enum and each entry except the last should end with NN (my enum value). */ static const bfd_arch_info_type arch_info_struct[] = { - N (64, 64, bfd_mach_riscv64, "riscv:rv64", FALSE, NN (I_riscv64)), - N (32, 32, bfd_mach_riscv32, "riscv:rv32", FALSE, 0) + N (64, bfd_mach_riscv64, "riscv:rv64", FALSE, NN (I_riscv64)), + N (32, bfd_mach_riscv32, "riscv:rv32", FALSE, NULL) }; /* The default architecture is riscv:rv64. */ const bfd_arch_info_type bfd_riscv_arch = - N (64, 64, 0, "riscv", TRUE, &arch_info_struct[0]); + N (64, 0, "riscv", TRUE, &arch_info_struct[0]);