| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| #include "sysdep.h" |
| #include "bfd.h" |
| #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 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 NULL |
| |
| static const bfd_arch_info_type arch_info_struct[] = |
| { |
| { |
| 32, |
| 32, |
| 8, |
| bfd_arch_sh, |
| bfd_mach_sh2, |
| "sh", |
| "sh2", |
| 1, |
| FALSE, |
| bfd_default_compatible, |
| bfd_default_scan, |
| bfd_arch_default_fill, |
| SH2_NEXT |
| }, |
| { |
| 32, |
| 32, |
| 8, |
| bfd_arch_sh, |
| bfd_mach_sh2e, |
| "sh", |
| "sh2e", |
| 1, |
| FALSE, |
| bfd_default_compatible, |
| bfd_default_scan, |
| bfd_arch_default_fill, |
| SH2E_NEXT |
| }, |
| { |
| 32, |
| 32, |
| 8, |
| bfd_arch_sh, |
| bfd_mach_sh_dsp, |
| "sh", |
| "sh-dsp", |
| 1, |
| FALSE, |
| bfd_default_compatible, |
| bfd_default_scan, |
| bfd_arch_default_fill, |
| SH_DSP_NEXT |
| }, |
| { |
| 32, |
| 32, |
| 8, |
| bfd_arch_sh, |
| bfd_mach_sh3, |
| "sh", |
| "sh3", |
| 1, |
| FALSE, |
| bfd_default_compatible, |
| bfd_default_scan, |
| bfd_arch_default_fill, |
| SH3_NEXT |
| }, |
| { |
| 32, |
| 32, |
| 8, |
| bfd_arch_sh, |
| bfd_mach_sh3_nommu, |
| "sh", |
| "sh3-nommu", |
| 1, |
| FALSE, |
| bfd_default_compatible, |
| bfd_default_scan, |
| bfd_arch_default_fill, |
| SH3_NOMMU_NEXT |
| }, |
| { |
| 32, |
| 32, |
| 8, |
| bfd_arch_sh, |
| bfd_mach_sh3_dsp, |
| "sh", |
| "sh3-dsp", |
| 1, |
| FALSE, |
| bfd_default_compatible, |
| bfd_default_scan, |
| bfd_arch_default_fill, |
| SH3_DSP_NEXT |
| }, |
| { |
| 32, |
| 32, |
| 8, |
| bfd_arch_sh, |
| bfd_mach_sh3e, |
| "sh", |
| "sh3e", |
| 1, |
| FALSE, |
| bfd_default_compatible, |
| bfd_default_scan, |
| bfd_arch_default_fill, |
| SH3E_NEXT |
| }, |
| { |
| 32, |
| 32, |
| 8, |
| bfd_arch_sh, |
| bfd_mach_sh4, |
| "sh", |
| "sh4", |
| 1, |
| FALSE, |
| bfd_default_compatible, |
| bfd_default_scan, |
| bfd_arch_default_fill, |
| SH4_NEXT |
| }, |
| { |
| 32, |
| 32, |
| 8, |
| bfd_arch_sh, |
| bfd_mach_sh4a, |
| "sh", |
| "sh4a", |
| 1, |
| FALSE, |
| bfd_default_compatible, |
| bfd_default_scan, |
| bfd_arch_default_fill, |
| SH4A_NEXT |
| }, |
| { |
| 32, |
| 32, |
| 8, |
| bfd_arch_sh, |
| bfd_mach_sh4al_dsp, |
| "sh", |
| "sh4al-dsp", |
| 1, |
| FALSE, |
| bfd_default_compatible, |
| bfd_default_scan, |
| bfd_arch_default_fill, |
| SH4AL_DSP_NEXT |
| }, |
| { |
| 32, |
| 32, |
| 8, |
| bfd_arch_sh, |
| bfd_mach_sh4_nofpu, |
| "sh", |
| "sh4-nofpu", |
| 1, |
| FALSE, |
| bfd_default_compatible, |
| bfd_default_scan, |
| bfd_arch_default_fill, |
| SH4_NOFPU_NEXT |
| }, |
| { |
| 32, |
| 32, |
| 8, |
| bfd_arch_sh, |
| bfd_mach_sh4_nommu_nofpu, |
| "sh", |
| "sh4-nommu-nofpu", |
| 1, |
| FALSE, |
| bfd_default_compatible, |
| bfd_default_scan, |
| bfd_arch_default_fill, |
| SH4_NOMMU_NOFPU_NEXT |
| }, |
| { |
| 32, |
| 32, |
| 8, |
| bfd_arch_sh, |
| bfd_mach_sh4a_nofpu, |
| "sh", |
| "sh4a-nofpu", |
| 1, |
| FALSE, |
| bfd_default_compatible, |
| bfd_default_scan, |
| bfd_arch_default_fill, |
| SH4A_NOFPU_NEXT |
| }, |
| { |
| 32, |
| 32, |
| 8, |
| bfd_arch_sh, |
| bfd_mach_sh2a, |
| "sh", |
| "sh2a", |
| 1, |
| FALSE, |
| bfd_default_compatible, |
| bfd_default_scan, |
| bfd_arch_default_fill, |
| SH2A_NEXT |
| }, |
| { |
| 32, |
| 32, |
| 8, |
| bfd_arch_sh, |
| bfd_mach_sh2a_nofpu, |
| "sh", |
| "sh2a-nofpu", |
| 1, |
| FALSE, |
| bfd_default_compatible, |
| bfd_default_scan, |
| bfd_arch_default_fill, |
| SH2A_NOFPU_NEXT |
| }, |
| { |
| 32, |
| 32, |
| 8, |
| bfd_arch_sh, |
| bfd_mach_sh2a_nofpu_or_sh4_nommu_nofpu, |
| "sh", |
| "sh2a-nofpu-or-sh4-nommu-nofpu", |
| 1, |
| FALSE, |
| bfd_default_compatible, |
| bfd_default_scan, |
| bfd_arch_default_fill, |
| SH2A_NOFPU_OR_SH4_NOMMU_NOFPU_NEXT |
| }, |
| { |
| 32, |
| 32, |
| 8, |
| bfd_arch_sh, |
| bfd_mach_sh2a_nofpu_or_sh3_nommu, |
| "sh", |
| "sh2a-nofpu-or-sh3-nommu", |
| 1, |
| FALSE, |
| bfd_default_compatible, |
| bfd_default_scan, |
| bfd_arch_default_fill, |
| SH2A_NOFPU_OR_SH3_NOMMU_NEXT |
| }, |
| { |
| 32, |
| 32, |
| 8, |
| bfd_arch_sh, |
| bfd_mach_sh2a_or_sh4, |
| "sh", |
| "sh2a-or-sh4", |
| 1, |
| FALSE, |
| bfd_default_compatible, |
| bfd_default_scan, |
| bfd_arch_default_fill, |
| SH2A_OR_SH4_NEXT |
| }, |
| { |
| 32, |
| 32, |
| 8, |
| bfd_arch_sh, |
| bfd_mach_sh2a_or_sh3e, |
| "sh", |
| "sh2a-or-sh3e", |
| 1, |
| FALSE, |
| bfd_default_compatible, |
| bfd_default_scan, |
| bfd_arch_default_fill, |
| SH2A_OR_SH3E_NEXT |
| }, |
| }; |
| |
| const bfd_arch_info_type bfd_sh_arch = |
| { |
| 32, |
| 32, |
| 8, |
| bfd_arch_sh, |
| bfd_mach_sh, |
| "sh", |
| "sh", |
| 1, |
| TRUE, |
| bfd_default_compatible, |
| bfd_default_scan, |
| bfd_arch_default_fill, |
| SH_NEXT |
| }; |
| |
| |
| |
| |
| |
| |
| |
| |
| static struct { unsigned long bfd_mach, arch, arch_up; } bfd_to_arch_table[] = |
| { |
| { 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 }, |
| { bfd_mach_sh3e, arch_sh3e, arch_sh3e_up }, |
| { 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_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_nofpu_up }, |
| { 0, 0, 0 } |
| }; |
| |
| |
| |
| |
| |
| 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++; |
| |
| |
| BFD_FAIL(); |
| |
| return SH_ARCH_UNKNOWN_ARCH; |
| } |
| |
| |
| |
| |
| |
| |
| 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++; |
| |
| |
| BFD_FAIL(); |
| |
| return SH_ARCH_UNKNOWN_ARCH; |
| } |
| |
| |
| |
| |
| |
| |
| |
| unsigned long |
| sh_get_bfd_mach_from_arch_set (unsigned int arch_set) |
| { |
| unsigned long result = 0; |
| unsigned int best = ~arch_set; |
| unsigned int co_mask = ~0; |
| int i = 0; |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| if (arch_set & arch_sh_no_co) |
| co_mask = ~(arch_sh_sp_fpu | arch_sh_dp_fpu | arch_sh_has_dsp); |
| |
| while (bfd_to_arch_table[i].bfd_mach != 0) |
| { |
| unsigned int try = bfd_to_arch_table[i].arch_up & co_mask; |
| |
| |
| |
| |
| |
| |
| if (((try & ~arch_set) < (best & ~arch_set) |
| || ((try & ~arch_set) == (best & ~arch_set) |
| && (~try & arch_set) < (~best & arch_set))) |
| && SH_MERGE_ARCH_SET_VALID (try, arch_set)) |
| { |
| result = bfd_to_arch_table[i].bfd_mach; |
| best = try; |
| } |
| |
| i++; |
| } |
| |
| |
| |
| BFD_ASSERT (result != 0); |
| |
| return result; |
| } |