forked from Imagelibrary/binutils-gdb
bfd:
Reinstate bits of sh4 support that got accidentally deleted.
Add sh-dsp support.
bfd:
* archures.c (bfd_mach_sh2, bfd_mach_sh_dsp): New macros.
(bfd_mach_sh3_dsp): Likewise.
(bfd_mach_sh4): Reinstate.
(bfd_default_scan): Recognize 7410, 7708, 7729 and 7750.
* bfd-in2.h: Regenerate.
* coff-sh.c (struct sh_opcode): flags is no longer short.
(USESAS, USESAS_REG, USESR8, SETSAS, SETSAS_REG): New macros.
(sh_opcode41, sh_opcode42): Integrate as sh_opcode41.
(sh_opcode01, sh_opcode02, sh_opcode40): Add sh-dsp opcodes.
(sh_opcode41, sh_opcode4, sh_opcode80): Likewise.
(sh_opcodes): No longer const.
(sh_dsp_opcodef0, sh_dsp_opcodef): New arrays.
(sh_insn_uses_reg): Check for USESAS and USESR8.
(sh_insn_sets_reg, sh_insns_conflict): Check for SETSAS.
(_bfd_sh_align_load_span): Return early for SH4.
Modify sh_opcodes lookup table for sh-dsp / sh3-dsp.
Take into account that field b of a parallel processing insn
could be mistaken for a separate insn.
* cpu-sh.c (arch_info_struct): New array elements for
sh2, sh-dsp and sh3-dsp.
Reinstate element for sh4.
(SH2_NEXT, SH_DSP_NEXT, SH3_DSP_NEXT): New macros.
(SH4_NEXT): Reinstate.
(SH3_NEXT, SH3E_NEXT): Adjust.
* elf-bfd.h (_sh_elf_set_mach_from_flags): Declare.
* elf32-sh.c (sh_elf_set_private_flags): New function.
(sh_elf_copy_private_data, sh_elf_set_mach_from_flags): Likewise.
(sh_elf_merge_private_data): New function.
(elf_backend_object_p, bfd_elf32_bfd_set_private_bfd_flags): Define.
(bfd_elf32_bfd_copy_private_bfd_data): Define.
(bfd_elf32_bfd_merge_private_bfd_data): Change to
sh_elf_merge_private_data.
gas:
* config/tc-sh.c ("elf/sh.h"): Include.
(sh_dsp, valid_arch, reg_x, reg_y, reg_efg): New static variables.
(md.begin): Initialize target_arch.
Only include opcodes in has table that match selected architecture.
(parse_reg): Recognize register names for sh-dsp.
(parse_at): Recognize post-modify addressing.
(get_operands): The leading space is now optional.
(get_specific): Remove FDREG_N support. Add support for sh-dsp
arguments. Update valid_arch.
(build_Mytes): Add support for SDT_REG_N.
(find_cooked_opcode): New function, broken out of md_assemble.
(assemble_ppi, sh_elf_final_processing): New functions.
(md_assemble): Use find_cooked_opcode and assemble_ppi.
(md_longopts, md_parse_option): New option: -dsp.
* config/tc-sh.h (elf_tc_final_processing): Define.
(sh_elf_final_processing): Declare.
include/elf:
* sh.h: (EF_SH_MACH_MASK, EF_SH_UNKNOWN, EF_SH1, EF_SH2): New macros.
(EF_SH3, EF_SH_HAS_DSP, EF_SH_DSP, EF_SH3_DSP): Likewise.
(EF_SH_HAS_FP, EF_SH3E, EF_SH4, EF_SH_MERGE_MACH): Likewise.
opcodes:
* sh-dis.c (print_movxy, print_insn_ddt, print_dsp_reg): New functions.
(print_insn_ppi): Likewise.
(print_insn_shx): Use info->mach to select appropriate insn set.
Add support for sh-dsp. Remove FD_REG_N support.
* sh-opc.h (sh_nibble_type): Add new values for sh-dsp support.
(sh_arg_type): Likewise. Remove FD_REG_N.
(sh_dsp_reg_nums): New enum.
(arch_sh1, arch_sh2, arch_sh3, arch_sh3e, arch_sh4): New macros.
(arch_sh_dsp, arch_sh3_dsp, arch_sh1_up, arch_sh2_up): Likewise.
(arch_sh3_up, arch_sh3e_up, arch_sh4_up, arch_sh_dsp_up): Likewise.
(arch_sh3_dsp_up): Likewise.
(sh_opcode_info): New field: arch.
(sh_table): Split up insn with FD_REG_N into ones with F_REG_N and
D_REG_N. Fill in arch field. Add sh-dsp insns.
This commit is contained in:
120
bfd/elf32-sh.c
120
bfd/elf32-sh.c
@@ -1,5 +1,5 @@
|
||||
/* Hitachi SH specific support for 32-bit ELF
|
||||
Copyright 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
|
||||
Copyright 1996, 97, 98, 1999, 2000 Free Software Foundation, Inc.
|
||||
Contributed by Ian Lance Taylor, Cygnus Support.
|
||||
|
||||
This file is part of BFD, the Binary File Descriptor library.
|
||||
@@ -33,6 +33,14 @@ static reloc_howto_type *sh_elf_reloc_type_lookup
|
||||
PARAMS ((bfd *, bfd_reloc_code_real_type));
|
||||
static void sh_elf_info_to_howto
|
||||
PARAMS ((bfd *, arelent *, Elf_Internal_Rela *));
|
||||
static boolean sh_elf_set_private_flags
|
||||
PARAMS ((bfd *, flagword));
|
||||
static boolean sh_elf_copy_private_data
|
||||
PARAMS ((bfd *, bfd *));
|
||||
static boolean sh_elf_merge_private_data
|
||||
PARAMS ((bfd *, bfd *));
|
||||
boolean sh_elf_set_mach_from_flags
|
||||
PARAMS ((bfd *));
|
||||
static boolean sh_elf_relax_section
|
||||
PARAMS ((bfd *, asection *, struct bfd_link_info *, boolean *));
|
||||
static boolean sh_elf_relax_delete_bytes
|
||||
@@ -2087,6 +2095,109 @@ sh_elf_check_relocs (abfd, info, sec, relocs)
|
||||
return true;
|
||||
}
|
||||
|
||||
boolean
|
||||
sh_elf_set_mach_from_flags (abfd)
|
||||
bfd * abfd;
|
||||
{
|
||||
flagword flags = elf_elfheader (abfd)->e_flags;
|
||||
|
||||
switch (elf_elfheader (abfd)->e_flags & EF_SH_MACH_MASK)
|
||||
{
|
||||
case EF_SH1:
|
||||
bfd_default_set_arch_mach (abfd, bfd_arch_sh, bfd_mach_sh);
|
||||
break;
|
||||
case EF_SH2:
|
||||
bfd_default_set_arch_mach (abfd, bfd_arch_sh, bfd_mach_sh2);
|
||||
break;
|
||||
case EF_SH_DSP:
|
||||
bfd_default_set_arch_mach (abfd, bfd_arch_sh, bfd_mach_sh_dsp);
|
||||
break;
|
||||
case EF_SH3:
|
||||
bfd_default_set_arch_mach (abfd, bfd_arch_sh, bfd_mach_sh3);
|
||||
break;
|
||||
case EF_SH3_DSP:
|
||||
bfd_default_set_arch_mach (abfd, bfd_arch_sh, bfd_mach_sh3_dsp);
|
||||
break;
|
||||
case EF_SH3E:
|
||||
bfd_default_set_arch_mach (abfd, bfd_arch_sh, bfd_mach_sh3e);
|
||||
break;
|
||||
case EF_SH_UNKNOWN:
|
||||
case EF_SH4:
|
||||
bfd_default_set_arch_mach (abfd, bfd_arch_sh, bfd_mach_sh4);
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Function to keep SH specific file flags. */
|
||||
static boolean
|
||||
sh_elf_set_private_flags (abfd, flags)
|
||||
bfd * abfd;
|
||||
flagword flags;
|
||||
{
|
||||
BFD_ASSERT (! elf_flags_init (abfd)
|
||||
|| elf_elfheader (abfd)->e_flags == flags);
|
||||
|
||||
elf_elfheader (abfd)->e_flags = flags;
|
||||
elf_flags_init (abfd) = true;
|
||||
return sh_elf_set_mach_from_flags (abfd);
|
||||
}
|
||||
|
||||
/* Copy backend specific data from one object module to another */
|
||||
static boolean
|
||||
sh_elf_copy_private_data (ibfd, obfd)
|
||||
bfd * ibfd;
|
||||
bfd * obfd;
|
||||
{
|
||||
if ( bfd_get_flavour (ibfd) != bfd_target_elf_flavour
|
||||
|| bfd_get_flavour (obfd) != bfd_target_elf_flavour)
|
||||
return true;
|
||||
|
||||
return sh_elf_set_private_flags (obfd, elf_elfheader (ibfd)->e_flags);
|
||||
}
|
||||
|
||||
/* This routine checks for linking big and little endian objects
|
||||
together, and for linking sh-dsp with sh3e / sh4 objects. */
|
||||
|
||||
static boolean
|
||||
sh_elf_merge_private_data (ibfd, obfd)
|
||||
bfd *ibfd;
|
||||
bfd *obfd;
|
||||
{
|
||||
flagword old_flags, new_flags;
|
||||
|
||||
if (_bfd_generic_verify_endian_match (ibfd, obfd) == false)
|
||||
return false;
|
||||
|
||||
if ( bfd_get_flavour (ibfd) != bfd_target_elf_flavour
|
||||
|| bfd_get_flavour (obfd) != bfd_target_elf_flavour)
|
||||
return true;
|
||||
|
||||
if (! elf_flags_init (obfd))
|
||||
{
|
||||
elf_flags_init (obfd) = true;
|
||||
elf_elfheader (obfd)->e_flags = 0;
|
||||
}
|
||||
old_flags = elf_elfheader (obfd)->e_flags;
|
||||
new_flags = elf_elfheader (ibfd)->e_flags;
|
||||
if ((EF_SH_HAS_DSP (old_flags) && EF_SH_HAS_FP (new_flags))
|
||||
|| (EF_SH_HAS_DSP (new_flags) && EF_SH_HAS_FP (old_flags)))
|
||||
{
|
||||
(*_bfd_error_handler)
|
||||
("%s: uses %s instructions while previous modules use %s instructions",
|
||||
bfd_get_filename (ibfd),
|
||||
EF_SH_HAS_DSP (new_flags) ? "dsp" : "floating point",
|
||||
EF_SH_HAS_DSP (new_flags) ? "floating point" : "dsp");
|
||||
bfd_set_error (bfd_error_bad_value);
|
||||
return false;
|
||||
}
|
||||
elf_elfheader (obfd)->e_flags = EF_SH_MERGE_MACH (old_flags, new_flags);
|
||||
|
||||
return sh_elf_set_mach_from_flags (obfd);
|
||||
}
|
||||
|
||||
#define TARGET_BIG_SYM bfd_elf32_sh_vec
|
||||
#define TARGET_BIG_NAME "elf32-sh"
|
||||
#define TARGET_LITTLE_SYM bfd_elf32_shl_vec
|
||||
@@ -2103,8 +2214,13 @@ sh_elf_check_relocs (abfd, info, sec, relocs)
|
||||
#define elf_backend_relocate_section sh_elf_relocate_section
|
||||
#define bfd_elf32_bfd_get_relocated_section_contents \
|
||||
sh_elf_get_relocated_section_contents
|
||||
#define elf_backend_object_p sh_elf_set_mach_from_flags
|
||||
#define bfd_elf32_bfd_set_private_bfd_flags \
|
||||
sh_elf_set_private_flags
|
||||
#define bfd_elf32_bfd_copy_private_bfd_data \
|
||||
sh_elf_copy_private_data
|
||||
#define bfd_elf32_bfd_merge_private_bfd_data \
|
||||
_bfd_generic_verify_endian_match
|
||||
sh_elf_merge_private_data
|
||||
|
||||
#define elf_backend_gc_mark_hook sh_elf_gc_mark_hook
|
||||
#define elf_backend_gc_sweep_hook sh_elf_gc_sweep_hook
|
||||
|
||||
Reference in New Issue
Block a user