From b0a4a3373f3263e6c70732ec2932a557d5f637da Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Mon, 17 Jan 2005 14:08:16 +0000 Subject: Fix SH2A machine variants in order to correctly select instruction inheritance --- bfd/cpu-sh.c | 304 ++++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 185 insertions(+), 119 deletions(-) (limited to 'bfd/cpu-sh.c') diff --git a/bfd/cpu-sh.c b/bfd/cpu-sh.c index 2fb738780a9..1f36645eade 100644 --- a/bfd/cpu-sh.c +++ b/bfd/cpu-sh.c @@ -1,5 +1,5 @@ /* BFD library support routines for the Renesas / SuperH SH architecture. - Copyright 1993, 1994, 1997, 1998, 2000, 2001, 2002, 2003, 2004 + Copyright 1993, 1994, 1997, 1998, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. Hacked by Steve Chamberlain of Cygnus Support. @@ -24,204 +24,208 @@ #include "libbfd.h" #include "../opcodes/sh-opc.h" -#define SH_NEXT &arch_info_struct[0] -#define SH2_NEXT &arch_info_struct[1] -#define SH2E_NEXT &arch_info_struct[2] -#define SH_DSP_NEXT &arch_info_struct[3] -#define SH3_NEXT &arch_info_struct[4] -#define SH3_NOMMU_NEXT &arch_info_struct[5] -#define SH3_DSP_NEXT &arch_info_struct[6] -#define SH3E_NEXT &arch_info_struct[7] -#define SH4_NEXT &arch_info_struct[8] -#define SH4A_NEXT &arch_info_struct[9] -#define SH4AL_DSP_NEXT &arch_info_struct[10] -#define SH4_NOFPU_NEXT &arch_info_struct[11] -#define SH4_NOMMU_NOFPU_NEXT &arch_info_struct[12] -#define SH4A_NOFPU_NEXT &arch_info_struct[13] -#define SH2A_NEXT &arch_info_struct[14] -#define SH2A_NOFPU_NEXT &arch_info_struct[15] -#define SH64_NEXT NULL +#define SH_NEXT arch_info_struct + 0 +#define SH2_NEXT arch_info_struct + 1 +#define SH2E_NEXT arch_info_struct + 2 +#define SH_DSP_NEXT arch_info_struct + 3 +#define SH3_NEXT arch_info_struct + 4 +#define SH3_NOMMU_NEXT arch_info_struct + 5 +#define SH3_DSP_NEXT arch_info_struct + 6 +#define SH3E_NEXT arch_info_struct + 7 +#define SH4_NEXT arch_info_struct + 8 +#define SH4A_NEXT arch_info_struct + 9 +#define SH4AL_DSP_NEXT arch_info_struct + 10 +#define SH4_NOFPU_NEXT arch_info_struct + 11 +#define SH4_NOMMU_NOFPU_NEXT arch_info_struct + 12 +#define SH4A_NOFPU_NEXT arch_info_struct + 13 +#define SH2A_NEXT arch_info_struct + 14 +#define SH2A_NOFPU_NEXT arch_info_struct + 15 +#define SH2A_NOFPU_OR_SH4_NOMMU_NOFPU_NEXT arch_info_struct + 16 +#define SH2A_NOFPU_OR_SH3_NOMMU_NEXT arch_info_struct + 17 +#define SH2A_OR_SH4_NEXT arch_info_struct + 18 +#define SH2A_OR_SH3E_NEXT arch_info_struct + 19 +#define SH64_NEXT NULL static const bfd_arch_info_type arch_info_struct[] = { { - 32, /* 32 bits in a word */ - 32, /* 32 bits in an address */ - 8, /* 8 bits in a byte */ + 32, /* 32 bits in a word. */ + 32, /* 32 bits in an address. */ + 8, /* 8 bits in a byte. */ bfd_arch_sh, bfd_mach_sh2, - "sh", /* arch_name */ - "sh2", /* printable name */ + "sh", /* Architecture name. */ + "sh2", /* Machine name. */ 1, - FALSE, /* not the default */ + FALSE, /* Not the default. */ bfd_default_compatible, bfd_default_scan, SH2_NEXT }, { - 32, /* 32 bits in a word */ - 32, /* 32 bits in an address */ - 8, /* 8 bits in a byte */ + 32, /* 32 bits in a word. */ + 32, /* 32 bits in an address. */ + 8, /* 8 bits in a byte. */ bfd_arch_sh, bfd_mach_sh2e, - "sh", /* arch_name */ - "sh2e", /* printable name */ + "sh", /* Architecture name. */ + "sh2e", /* Machine name. */ 1, - FALSE, /* not the default */ + FALSE, /* Not the default. */ bfd_default_compatible, bfd_default_scan, SH2E_NEXT }, { - 32, /* 32 bits in a word */ - 32, /* 32 bits in an address */ - 8, /* 8 bits in a byte */ + 32, /* 32 bits in a word. */ + 32, /* 32 bits in an address. */ + 8, /* 8 bits in a byte. */ bfd_arch_sh, bfd_mach_sh_dsp, - "sh", /* arch_name */ - "sh-dsp", /* printable name */ + "sh", /* Architecture name. */ + "sh-dsp", /* Machine name. */ 1, - FALSE, /* not the default */ + FALSE, /* Not the default. */ bfd_default_compatible, bfd_default_scan, SH_DSP_NEXT }, { - 32, /* 32 bits in a word */ - 32, /* 32 bits in an address */ - 8, /* 8 bits in a byte */ + 32, /* 32 bits in a word. */ + 32, /* 32 bits in an address. */ + 8, /* 8 bits in a byte. */ bfd_arch_sh, bfd_mach_sh3, - "sh", /* arch_name */ - "sh3", /* printable name */ + "sh", /* Architecture name. */ + "sh3", /* Machine name. */ 1, - FALSE, /* not the default */ + FALSE, /* Not the default. */ bfd_default_compatible, bfd_default_scan, SH3_NEXT }, { - 32, /* 32 bits in a word */ - 32, /* 32 bits in an address */ - 8, /* 8 bits in a byte */ + 32, /* 32 bits in a word. */ + 32, /* 32 bits in an address. */ + 8, /* 8 bits in a byte. */ bfd_arch_sh, bfd_mach_sh3_nommu, - "sh", /* arch_name */ - "sh3-nommu", /* printable name */ + "sh", /* Architecture name. */ + "sh3-nommu", /* Machine name. */ 1, - FALSE, /* not the default */ + FALSE, /* Not the default. */ bfd_default_compatible, bfd_default_scan, SH3_NOMMU_NEXT }, { - 32, /* 32 bits in a word */ - 32, /* 32 bits in an address */ - 8, /* 8 bits in a byte */ + 32, /* 32 bits in a word. */ + 32, /* 32 bits in an address. */ + 8, /* 8 bits in a byte. */ bfd_arch_sh, bfd_mach_sh3_dsp, - "sh", /* arch_name */ - "sh3-dsp", /* printable name */ + "sh", /* Architecture name. */ + "sh3-dsp", /* Machine name. */ 1, - FALSE, /* not the default */ + FALSE, /* Not the default. */ bfd_default_compatible, bfd_default_scan, SH3_DSP_NEXT }, { - 32, /* 32 bits in a word */ - 32, /* 32 bits in an address */ - 8, /* 8 bits in a byte */ + 32, /* 32 bits in a word. */ + 32, /* 32 bits in an address. */ + 8, /* 8 bits in a byte. */ bfd_arch_sh, bfd_mach_sh3e, - "sh", /* arch_name */ - "sh3e", /* printable name */ + "sh", /* Architecture name. */ + "sh3e", /* Machine name. */ 1, - FALSE, /* not the default */ + FALSE, /* Not the default. */ bfd_default_compatible, bfd_default_scan, SH3E_NEXT }, { - 32, /* 32 bits in a word */ - 32, /* 32 bits in an address */ - 8, /* 8 bits in a byte */ + 32, /* 32 bits in a word. */ + 32, /* 32 bits in an address. */ + 8, /* 8 bits in a byte. */ bfd_arch_sh, bfd_mach_sh4, - "sh", /* arch_name */ - "sh4", /* printable name */ + "sh", /* Architecture name. */ + "sh4", /* Machine name. */ 1, - FALSE, /* not the default */ + FALSE, /* Not the default. */ bfd_default_compatible, bfd_default_scan, SH4_NEXT }, { - 32, /* 32 bits in a word */ - 32, /* 32 bits in an address */ - 8, /* 8 bits in a byte */ + 32, /* 32 bits in a word. */ + 32, /* 32 bits in an address. */ + 8, /* 8 bits in a byte. */ bfd_arch_sh, bfd_mach_sh4a, - "sh", /* arch_name */ - "sh4a", /* printable name */ + "sh", /* Architecture name. */ + "sh4a", /* Machine name. */ 1, - FALSE, /* not the default */ + FALSE, /* Not the default. */ bfd_default_compatible, bfd_default_scan, SH4A_NEXT }, { - 32, /* 32 bits in a word */ - 32, /* 32 bits in an address */ - 8, /* 8 bits in a byte */ + 32, /* 32 bits in a word. */ + 32, /* 32 bits in an address. */ + 8, /* 8 bits in a byte. */ bfd_arch_sh, bfd_mach_sh4al_dsp, - "sh", /* arch_name */ - "sh4al-dsp", /* printable name */ + "sh", /* Architecture name. */ + "sh4al-dsp", /* Machine name. */ 1, - FALSE, /* not the default */ + FALSE, /* Not the default. */ bfd_default_compatible, bfd_default_scan, SH4AL_DSP_NEXT }, { - 32, /* 32 bits in a word */ - 32, /* 32 bits in an address */ - 8, /* 8 bits in a byte */ + 32, /* 32 bits in a word. */ + 32, /* 32 bits in an address. */ + 8, /* 8 bits in a byte. */ bfd_arch_sh, bfd_mach_sh4_nofpu, - "sh", /* arch_name */ - "sh4-nofpu", /* printable name */ + "sh", /* Architecture name. */ + "sh4-nofpu", /* Machine name. */ 1, - FALSE, /* not the default */ + FALSE, /* Not the default. */ bfd_default_compatible, bfd_default_scan, SH4_NOFPU_NEXT }, { - 32, /* 32 bits in a word */ - 32, /* 32 bits in an address */ - 8, /* 8 bits in a byte */ + 32, /* 32 bits in a word. */ + 32, /* 32 bits in an address. */ + 8, /* 8 bits in a byte. */ bfd_arch_sh, bfd_mach_sh4_nommu_nofpu, - "sh", /* arch_name */ - "sh4-nommu-nofpu", /* printable name */ + "sh", /* Architecture name. */ + "sh4-nommu-nofpu", /* Machine name. */ 1, - FALSE, /* not the default */ + FALSE, /* Not the default. */ bfd_default_compatible, bfd_default_scan, SH4_NOMMU_NOFPU_NEXT }, { - 32, /* 32 bits in a word */ - 32, /* 32 bits in an address */ - 8, /* 8 bits in a byte */ + 32, /* 32 bits in a word. */ + 32, /* 32 bits in an address. */ + 8, /* 8 bits in a byte. */ bfd_arch_sh, bfd_mach_sh4a_nofpu, - "sh", /* arch_name */ - "sh4a-nofpu", /* printable name */ + "sh", /* Architecture name. */ + "sh4a-nofpu", /* Machine name. */ 1, - FALSE, /* not the default */ + FALSE, /* Not the default. */ bfd_default_compatible, bfd_default_scan, SH4A_NOFPU_NEXT @@ -232,8 +236,8 @@ static const bfd_arch_info_type arch_info_struct[] = 8, /* 8 bits in a byte. */ bfd_arch_sh, bfd_mach_sh2a, - "sh", /* Arch_name. */ - "sh2a", /* Printable name. */ + "sh", /* Architecture name. */ + "sh2a", /* Machine name. */ 1, FALSE, /* Not the default. */ bfd_default_compatible, @@ -246,8 +250,8 @@ static const bfd_arch_info_type arch_info_struct[] = 8, /* 8 bits in a byte. */ bfd_arch_sh, bfd_mach_sh2a_nofpu, - "sh", /* Arch_name. */ - "sh2a-nofpu", /* Printable name. */ + "sh", /* Architecture name. */ + "sh2a-nofpu", /* Machine name. */ 1, FALSE, /* Not the default. */ bfd_default_compatible, @@ -255,15 +259,71 @@ static const bfd_arch_info_type arch_info_struct[] = SH2A_NOFPU_NEXT }, { - 64, /* 64 bits in a word */ - 64, /* 64 bits in an address */ - 8, /* 8 bits in a byte */ + 32, /* 32 bits in a word. */ + 32, /* 32 bits in an address. */ + 8, /* 8 bits in a byte. */ + bfd_arch_sh, + bfd_mach_sh2a_nofpu_or_sh4_nommu_nofpu, + "sh", /* Architecture name. */ + "sh2a-nofpu-or-sh4-nommu-nofpu", /* Machine name. */ + 1, + FALSE, /* Not the default. */ + bfd_default_compatible, + bfd_default_scan, + SH2A_NOFPU_OR_SH4_NOMMU_NOFPU_NEXT + }, + { + 32, /* 32 bits in a word. */ + 32, /* 32 bits in an address. */ + 8, /* 8 bits in a byte. */ + bfd_arch_sh, + bfd_mach_sh2a_nofpu_or_sh3_nommu, + "sh", /* Architecture name. . */ + "sh2a-nofpu-or-sh3-nommu", /* Machine name. */ + 1, + FALSE, /* Not the default. */ + bfd_default_compatible, + bfd_default_scan, + SH2A_NOFPU_OR_SH3_NOMMU_NEXT + }, + { + 32, /* 32 bits in a word. */ + 32, /* 32 bits in an address. */ + 8, /* 8 bits in a byte. */ + bfd_arch_sh, + bfd_mach_sh2a_or_sh4, + "sh", /* Architecture name. */ + "sh2a-or-sh4", /* Machine name. */ + 1, + FALSE, /* Not the default. */ + bfd_default_compatible, + bfd_default_scan, + SH2A_OR_SH4_NEXT + }, + { + 32, /* 32 bits in a word. */ + 32, /* 32 bits in an address. */ + 8, /* 8 bits in a byte. */ + bfd_arch_sh, + bfd_mach_sh2a_or_sh3e, + "sh", /* Architecture name. */ + "sh2a-or-sh3e", /* Machine name. */ + 1, + FALSE, /* Not the default. */ + bfd_default_compatible, + bfd_default_scan, + SH2A_OR_SH3E_NEXT + }, + { + 64, /* 64 bits in a word. */ + 64, /* 64 bits in an address. */ + 8, /* 8 bits in a byte. */ bfd_arch_sh, bfd_mach_sh5, - "sh", /* arch_name */ - "sh5", /* printable name */ + "sh", /* Architecture name. */ + "sh5", /* Machine name. */ 1, - FALSE, /* not the default */ + FALSE, /* Not the default. */ bfd_default_compatible, bfd_default_scan, SH64_NEXT @@ -272,15 +332,15 @@ static const bfd_arch_info_type arch_info_struct[] = const bfd_arch_info_type bfd_sh_arch = { - 32, /* 32 bits in a word */ - 32, /* 32 bits in an address */ - 8, /* 8 bits in a byte */ + 32, /* 32 bits in a word. */ + 32, /* 32 bits in an address. */ + 8, /* 8 bits in a byte. */ bfd_arch_sh, bfd_mach_sh, - "sh", /* arch_name */ - "sh", /* printable name */ + "sh", /* Architecture name. */ + "sh", /* Machine name. */ 1, - TRUE, /* the default machine */ + TRUE, /* The default machine. */ bfd_default_compatible, bfd_default_scan, SH_NEXT @@ -295,12 +355,18 @@ const bfd_arch_info_type bfd_sh_arch = static struct { unsigned long bfd_mach, arch, arch_up; } bfd_to_arch_table[] = { - { bfd_mach_sh, arch_sh1, arch_sh1_up }, + { bfd_mach_sh, arch_sh1, arch_sh_up }, { bfd_mach_sh2, arch_sh2, arch_sh2_up }, { bfd_mach_sh2e, arch_sh2e, arch_sh2e_up }, { bfd_mach_sh_dsp, arch_sh_dsp, arch_sh_dsp_up }, { bfd_mach_sh2a, arch_sh2a, arch_sh2a_up }, { bfd_mach_sh2a_nofpu, arch_sh2a_nofpu, arch_sh2a_nofpu_up }, + + { bfd_mach_sh2a_nofpu_or_sh4_nommu_nofpu, arch_sh2a_nofpu_or_sh4_nommu_nofpu, arch_sh2a_nofpu_or_sh4_nommu_nofpu_up }, + { bfd_mach_sh2a_nofpu_or_sh3_nommu, arch_sh2a_nofpu_or_sh3_nommu, arch_sh2a_nofpu_or_sh3_nommu_up }, + { bfd_mach_sh2a_or_sh4, arch_sh2a_or_sh4, arch_sh2a_or_sh4_up }, + { bfd_mach_sh2a_or_sh3e, arch_sh2a_or_sh3e, arch_sh2a_or_sh3e_up }, + { bfd_mach_sh3, arch_sh3, arch_sh3_up }, { bfd_mach_sh3_nommu, arch_sh3_nommu, arch_sh3_nommu_up }, { bfd_mach_sh3_dsp, arch_sh3_dsp, arch_sh3_dsp_up }, @@ -308,9 +374,9 @@ static struct { unsigned long bfd_mach, arch, arch_up; } bfd_to_arch_table[] = { bfd_mach_sh4, arch_sh4, arch_sh4_up }, { bfd_mach_sh4a, arch_sh4a, arch_sh4a_up }, { bfd_mach_sh4al_dsp, arch_sh4al_dsp, arch_sh4al_dsp_up }, - { bfd_mach_sh4_nofpu, arch_sh4_nofpu, arch_sh4_nofp_up }, + { bfd_mach_sh4_nofpu, arch_sh4_nofpu, arch_sh4_nofpu_up }, { bfd_mach_sh4_nommu_nofpu, arch_sh4_nommu_nofpu, arch_sh4_nommu_nofpu_up }, - { bfd_mach_sh4a_nofpu, arch_sh4a_nofpu, arch_sh4a_nofp_up }, + { bfd_mach_sh4a_nofpu, arch_sh4a_nofpu, arch_sh4a_nofpu_up }, { 0, 0, 0 } /* Terminator. */ }; @@ -322,14 +388,14 @@ unsigned int sh_get_arch_from_bfd_mach (unsigned long mach) { int i = 0; - + while (bfd_to_arch_table[i].bfd_mach != 0) if (bfd_to_arch_table[i].bfd_mach == mach) return bfd_to_arch_table[i].arch; else i++; - /* mach not found. */ + /* Machine not found. */ BFD_FAIL(); return SH_ARCH_UNKNOWN_ARCH; @@ -344,14 +410,14 @@ unsigned int sh_get_arch_up_from_bfd_mach (unsigned long mach) { int i = 0; - + while (bfd_to_arch_table[i].bfd_mach != 0) if (bfd_to_arch_table[i].bfd_mach == mach) return bfd_to_arch_table[i].arch_up; else i++; - /* mach not found. */ + /* Machine not found. */ BFD_FAIL(); return SH_ARCH_UNKNOWN_ARCH; -- cgit v1.2.1