/* BFD library support routines for the Renesas / SuperH SH architecture.
- Copyright (C) 1993-2016 Free Software Foundation, Inc.
+ Copyright (C) 1993-2019 Free Software Foundation, Inc.
Hacked by Steve Chamberlain of Cygnus Support.
This file is part of BFD, the Binary File Descriptor library.
#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 arch_info_struct + 19
-#define SH64_NEXT NULL
+
+#define N(NUMBER, PRINT, DEFAULT, NEXT) \
+ { \
+ 32, /* Bits in a word. */ \
+ 32, /* Bits in an address. */ \
+ 8, /* Bits in a byte. */ \
+ bfd_arch_sh, \
+ NUMBER, \
+ "sh", \
+ PRINT, \
+ 1, /* Section alignment power. */ \
+ DEFAULT, \
+ bfd_default_compatible, \
+ bfd_default_scan, \
+ bfd_arch_default_fill, \
+ NEXT, \
+ 0 /* Maximum offset of a reloc from the start of an insn. */ \
+ }
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. */
- bfd_arch_sh,
- bfd_mach_sh2,
- "sh", /* Architecture name. */
- "sh2", /* Machine name. */
- 1,
- FALSE, /* Not the default. */
- bfd_default_compatible,
- bfd_default_scan,
- bfd_arch_default_fill,
- SH2_NEXT
- },
- {
- 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", /* Architecture name. */
- "sh2e", /* Machine name. */
- 1,
- FALSE, /* Not the default. */
- bfd_default_compatible,
- bfd_default_scan,
- bfd_arch_default_fill,
- SH2E_NEXT
- },
- {
- 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", /* Architecture name. */
- "sh-dsp", /* Machine name. */
- 1,
- FALSE, /* Not the default. */
- bfd_default_compatible,
- bfd_default_scan,
- bfd_arch_default_fill,
- SH_DSP_NEXT
- },
- {
- 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", /* Architecture name. */
- "sh3", /* Machine name. */
- 1,
- FALSE, /* Not the default. */
- bfd_default_compatible,
- bfd_default_scan,
- bfd_arch_default_fill,
- SH3_NEXT
- },
- {
- 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", /* Architecture name. */
- "sh3-nommu", /* Machine name. */
- 1,
- FALSE, /* Not the default. */
- bfd_default_compatible,
- bfd_default_scan,
- bfd_arch_default_fill,
- 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_sh3_dsp,
- "sh", /* Architecture name. */
- "sh3-dsp", /* Machine name. */
- 1,
- FALSE, /* Not the default. */
- bfd_default_compatible,
- bfd_default_scan,
- bfd_arch_default_fill,
- SH3_DSP_NEXT
- },
- {
- 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", /* Architecture name. */
- "sh3e", /* Machine name. */
- 1,
- FALSE, /* Not the default. */
- bfd_default_compatible,
- bfd_default_scan,
- bfd_arch_default_fill,
- SH3E_NEXT
- },
- {
- 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", /* Architecture name. */
- "sh4", /* Machine name. */
- 1,
- FALSE, /* Not the default. */
- bfd_default_compatible,
- bfd_default_scan,
- bfd_arch_default_fill,
- 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_sh4a,
- "sh", /* Architecture name. */
- "sh4a", /* Machine name. */
- 1,
- FALSE, /* Not the default. */
- bfd_default_compatible,
- bfd_default_scan,
- bfd_arch_default_fill,
- SH4A_NEXT
- },
- {
- 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", /* Architecture name. */
- "sh4al-dsp", /* Machine name. */
- 1,
- FALSE, /* Not the default. */
- bfd_default_compatible,
- bfd_default_scan,
- bfd_arch_default_fill,
- SH4AL_DSP_NEXT
- },
- {
- 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", /* Architecture name. */
- "sh4-nofpu", /* Machine name. */
- 1,
- FALSE, /* Not the default. */
- bfd_default_compatible,
- bfd_default_scan,
- bfd_arch_default_fill,
- SH4_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_sh4_nommu_nofpu,
- "sh", /* Architecture name. */
- "sh4-nommu-nofpu", /* Machine name. */
- 1,
- FALSE, /* Not the default. */
- bfd_default_compatible,
- bfd_default_scan,
- bfd_arch_default_fill,
- 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_sh4a_nofpu,
- "sh", /* Architecture name. */
- "sh4a-nofpu", /* Machine name. */
- 1,
- FALSE, /* Not the default. */
- bfd_default_compatible,
- bfd_default_scan,
- bfd_arch_default_fill,
- SH4A_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,
- "sh", /* Architecture name. */
- "sh2a", /* Machine name. */
- 1,
- FALSE, /* Not the default. */
- bfd_default_compatible,
- bfd_default_scan,
- bfd_arch_default_fill,
- SH2A_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,
- "sh", /* Architecture name. */
- "sh2a-nofpu", /* Machine name. */
- 1,
- FALSE, /* Not the default. */
- bfd_default_compatible,
- bfd_default_scan,
- bfd_arch_default_fill,
- SH2A_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_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,
- bfd_arch_default_fill,
- 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,
- bfd_arch_default_fill,
- 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,
- bfd_arch_default_fill,
- 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,
- bfd_arch_default_fill,
- 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", /* Architecture name. */
- "sh5", /* Machine name. */
- 1,
- FALSE, /* Not the default. */
- bfd_default_compatible,
- bfd_default_scan,
- bfd_arch_default_fill,
- SH64_NEXT
- },
+ N (bfd_mach_sh2, "sh2", FALSE, arch_info_struct + 1),
+ N (bfd_mach_sh2e, "sh2e", FALSE, arch_info_struct + 2),
+ N (bfd_mach_sh_dsp, "sh-dsp", FALSE, arch_info_struct + 3),
+ N (bfd_mach_sh3, "sh3", FALSE, arch_info_struct + 4),
+ N (bfd_mach_sh3_nommu, "sh3-nommu", FALSE, arch_info_struct + 5),
+ N (bfd_mach_sh3_dsp, "sh3-dsp", FALSE, arch_info_struct + 6),
+ N (bfd_mach_sh3e, "sh3e", FALSE, arch_info_struct + 7),
+ N (bfd_mach_sh4, "sh4", FALSE, arch_info_struct + 8),
+ N (bfd_mach_sh4a, "sh4a", FALSE, arch_info_struct + 9),
+ N (bfd_mach_sh4al_dsp, "sh4al-dsp", FALSE, arch_info_struct + 10),
+ N (bfd_mach_sh4_nofpu, "sh4-nofpu", FALSE, arch_info_struct + 11),
+ N (bfd_mach_sh4_nommu_nofpu, "sh4-nommu-nofpu", FALSE, arch_info_struct + 12),
+ N (bfd_mach_sh4a_nofpu, "sh4a-nofpu", FALSE, arch_info_struct + 13),
+ N (bfd_mach_sh2a, "sh2a", FALSE, arch_info_struct + 14),
+ N (bfd_mach_sh2a_nofpu, "sh2a-nofpu", FALSE, arch_info_struct + 15),
+ N (bfd_mach_sh2a_nofpu_or_sh4_nommu_nofpu, "sh2a-nofpu-or-sh4-nommu-nofpu", FALSE, arch_info_struct + 16),
+ N (bfd_mach_sh2a_nofpu_or_sh3_nommu, "sh2a-nofpu-or-sh3-nommu", FALSE, arch_info_struct + 17),
+ N (bfd_mach_sh2a_or_sh4, "sh2a-or-sh4", FALSE, arch_info_struct + 18),
+ N (bfd_mach_sh2a_or_sh3e, "sh2a-or-sh3e", FALSE, NULL)
};
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. */
- bfd_arch_sh,
- bfd_mach_sh,
- "sh", /* Architecture name. */
- "sh", /* Machine name. */
- 1,
- TRUE, /* The default machine. */
- bfd_default_compatible,
- bfd_default_scan,
- bfd_arch_default_fill,
- SH_NEXT
-};
-
+ N (bfd_mach_sh, "sh", TRUE, arch_info_struct + 0);
/* This table defines the mappings from the BFD internal numbering
system to the opcodes internal flags system.
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_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_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 } /* Terminator. */
+ { bfd_mach_sh4a_nofpu, arch_sh4a_nofpu, arch_sh4a_nofpu_up },
+ { 0, 0, 0 } /* Terminator. */
};
/* Conceptually: Find the architecture with the least number
of extra features or, if they have the same number, then
the greatest number of required features. Disregard
- architectures where the required features alone do
+ architectures where the required features alone do
not describe a valid architecture. */
if (((try & ~arch_set) < (best & ~arch_set)
|| ((try & ~arch_set) == (best & ~arch_set)