Switched over to using machine numbers to distinguish v850 architecture variants.

This commit is contained in:
Nick Clifton 1997-08-25 23:00:29 +00:00
parent a3515171ce
commit 8988d935a3
11 changed files with 460 additions and 227 deletions

View File

@ -27,17 +27,14 @@ v850_files="elf32-v850.c"
if ( echo $* | grep keep\-v850 > /dev/null ) ; then
keep_these_too="cpu-v850.c ${v850_files} ${keep_these_too}"
lose_these_too="cpu-v850e.c cpu-v850eq.c ${lose_these_too}"
else
if ( echo $* | grep keep\-v850e > /dev/null ) ; then
keep_these_too="cpu-v850e.c ${v850_files} ${keep_these_too}"
lose_these_too="cpu-v850.c cpu-v850eq.c ${lose_these_too}"
keep_these_too="cpu-v850.c ${v850_files} ${keep_these_too}"
else
if ( echo $* | grep keep\-v850eq > /dev/null ) ; then
keep_these_too="cpu-v850eq.c ${v850_files} ${keep_these_too}"
lose_these_too="cpu-v850.c cpu-v850e.c ${lose_these_too}"
keep_these_too="cpu-v850.c ${v850_files} ${keep_these_too}"
else
lose_these_too="cpu-v850.c cpu-v850e.c cpu-v850eq.c ${v850_files} ${lose_these_too}"
lose_these_too="cpu-v850.c ${v850_files} ${lose_these_too}"
fi
fi
fi
@ -336,6 +333,59 @@ fi
v850_files="ChangeLog ChangeLog.2 Makefile.in Makefile.am archures.c reloc.c targets.c config.bfd configure.in configure bfd-in2.h elf.c libbfd.h elf32-v850.c"
v850e_files="ChangeLog ChangeLog.2 Makefile.in Makefile.am archures.c reloc.c targets.c config.bfd configure.in configure bfd-in2.h elf.c libbfd.h"
if ( echo $* | grep keep\-v850eq > /dev/null ) ; then
for i in $v850_files ; do
if test -r $i && (grep sanitize-v850eq $i > /dev/null) ; then
if [ -n "${verbose}" ] ; then
echo Keeping v850eq stuff in $i
fi
fi
done
else
for i in $v850_files ; do
if test -f $i && (grep sanitize-v850eq $i > /dev/null) ; then
if [ -n "${verbose}" ] ; then
echo Removing traces of \"v850eq\" from $i...
fi
cp $i new
sed '/start\-sanitize\-v850eq/,/end\-sanitize\-v850eq/d' < $i > new
if [ -n "${safe}" -a ! -f .Recover/$i ] ; then
if [ -n "${verbose}" ] ; then
echo Caching $i in .Recover...
fi
mv $i .Recover
fi
mv new $i
fi
done
fi
if ( echo $* | grep keep\-v850e > /dev/null ) ; then
for i in $v850_files ; do
if test -r $i && (grep sanitize-v850e $i > /dev/null) ; then
if [ -n "${verbose}" ] ; then
echo Keeping v850e stuff in $i
fi
fi
done
else
for i in $v850_files ; do
if test -f $i && (grep sanitize-v850e $i > /dev/null) ; then
if [ -n "${verbose}" ] ; then
echo Removing traces of \"v850e\" from $i...
fi
cp $i new
sed '/start\-sanitize\-v850e/,/end\-sanitize\-v850e/d' < $i > new
if [ -n "${safe}" -a ! -f .Recover/$i ] ; then
if [ -n "${verbose}" ] ; then
echo Caching $i in .Recover...
fi
mv $i .Recover
fi
mv new $i
fi
done
fi
if ( echo $* | grep keep\-v850 > /dev/null ) ; then
for i in $v850_files ; do
if test ! -d $i && (grep sanitize-v850 $i > /dev/null) ; then
@ -357,7 +407,7 @@ else
echo Removing traces of \"v850\" from $i...
fi
cp $i new
sed '/start\-sanitize\-v850/,/end-\sanitize\-v850/d' < $i > new
sed '/start\-sanitize\-v850/,/end\-sanitize\-v850/d' < $i > new
if [ -n "${safe}" -a ! -f .Recover/$i ] ; then
if [ -n "${verbose}" ] ; then
echo Caching $i in .Recover...
@ -371,59 +421,6 @@ else
fi
fi
if ( echo $* | grep keep\-v850e > /dev/null ) ; then
for i in $v850_files ; do
if test -r $i && (grep sanitize-v850e $i > /dev/null) ; then
if [ -n "${verbose}" ] ; then
echo Keeping v850e stuff in $i
fi
fi
done
else
for i in $v850_files ; do
if test -f $i && (grep sanitize-v850e $i > /dev/null) ; then
if [ -n "${verbose}" ] ; then
echo Removing traces of \"v850e\" from $i...
fi
cp $i new
sed '/start\-sanitize\-v850e/,/end-\sanitize\-v850e/d' < $i > new
if [ -n "${safe}" -a ! -f .Recover/$i ] ; then
if [ -n "${verbose}" ] ; then
echo Caching $i in .Recover...
fi
mv $i .Recover
fi
mv new $i
fi
done
fi
if ( echo $* | grep keep\-v850eq > /dev/null ) ; then
for i in $v850_files ; do
if test -r $i && (grep sanitize-v850eq $i > /dev/null) ; then
if [ -n "${verbose}" ] ; then
echo Keeping v850eq stuff in $i
fi
fi
done
else
for i in $v850_files ; do
if test -f $i && (grep sanitize-v850eq $i > /dev/null) ; then
if [ -n "${verbose}" ] ; then
echo Removing traces of \"v850eq\" from $i...
fi
cp $i new
sed '/start\-sanitize\-v850eq/,/end-\sanitize\-v850eq/d' < $i > new
if [ -n "${safe}" -a ! -f .Recover/$i ] ; then
if [ -n "${verbose}" ] ; then
echo Caching $i in .Recover...
fi
mv $i .Recover
fi
mv new $i
fi
done
fi
r5900_files="ChangeLog config.bfd"
if ( echo $* | grep keep\-r5900 > /dev/null ) ; then
for i in $r5900_files ; do

View File

@ -1,17 +1,43 @@
start-sanitize-v850
Mon Aug 25 15:35:46 1997 Nick Clifton <nickc@cygnus.com>
* cpu-v850.c (scan): New function.
(arch_info_struct): New structure.
(bfd_v850_arch): Add link into arch_info_structure.
* config.bfd (targ_cpu): All v850 variants use the bfd_arch_v850
architecture.
* elf32-v850.c (v850_elf_object_p): New function.
start-sanitize-v850e
* archures.c (bfd_mach_v850e): Machine value for v850e.
* bfd-in2.h (bfd_mach_v850e): Machine value for v850e.
* elf32-v850.c (ELF_MACHINE_CODE): Default to v850e machine
number.
* elf.c (prep_headers): Add support for v850e machine number.
end-sanitize-v850e
start-sanitize-v850eq
* archures.c (bfd_mach_v850eq): Machine value for v850eq.
* bfd-in2.h (bfd_mach_v850eq): Machine value for v850eq.
* elf32-v850.c (ELF_MACHINE_CODE): Default to v850eq machine
number.
* elf.c (prep_headers): Add support for v850eq machine number.
end-sanitize-v850eq
end-sanitize-v850
Mon Aug 25 14:07:33 1997 Ian Lance Taylor <ian@cygnus.com>
* syms.c (_bfd_stab_section_find_nearest_line): Clear the
cached_stab field if the offset prevents us from using the cache.
start-sanitize-v850e
Mon Aug 25 10:04:35 1997 Nick Clifton <nickc@cygnus.com>
* Makefile.in: Add rule to build cpu-v850e.lo object file.
start-sanitize-v850eq
* Makefile.in: Add rule to build cpu-v850eq.lo object file.
end-sanitize-v850eq
end-sanitize-v850e
Mon Aug 25 12:08:13 1997 Ian Lance Taylor <ian@cygnus.com>
* aout-target.h (MY(vec)): Add SEC_CODE and SEC_DATA to section

View File

@ -153,12 +153,6 @@ ALL_MACHINES = \
$(start-sanitize-v850) \
cpu-v850.lo \
$(end-sanitize-v850) \
$(start-sanitize-v850e) \
cpu-v850e.lo \
$(end-sanitize-v850e) \
$(start-sanitize-v850eq) \
cpu-v850eq.lo \
$(end-sanitize-v850eq) \
cpu-vax.lo \
cpu-we32k.lo \
cpu-w65.lo \
@ -1017,20 +1011,6 @@ elf32-v850.lo: elf32-v850.c $(INCDIR)/bfdlink.h elf-bfd.h \
elf32-target.h
end-sanitize-v850:
start-sanitize-v850e:
cpu-v850e.lo: cpu-v850e.c
elf32-v850.lo: elf32-v850.c $(INCDIR)/bfdlink.h elf-bfd.h \
$(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \
elf32-target.h
end-sanitize-v850e:
start-sanitize-v850eq:
cpu-v850eq.lo: cpu-v850eq.c
elf32-v850.lo: elf32-v850.c $(INCDIR)/bfdlink.h elf-bfd.h \
$(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \
elf32-target.h
end-sanitize-v850eq:
start-sanitize-tic80:
cpu-tic80.lo: cpu-tic80.c
coff-tic80.lo: coff-tic80.c $(INCDIR)/bfdlink.h elf-bfd.h \

View File

@ -145,6 +145,12 @@ DESCRIPTION
. {* end-sanitize-tic80 *}
. {* start-sanitize-v850 *}
. bfd_arch_v850, {* NEC V850 *}
. {* start-sanitize-v850e *}
#define bfd_mach_v850e 'E'
. {* end-sanitize-v850e *}
. {* start-sanitize-v850eq *}
#define bfd_mach_v850eq 'Q'
. {* end-sanitize-v850eq *}
. {* end-sanitize-v850 *}
. bfd_arch_arc, {* Argonaut RISC Core *}
.#define bfd_mach_arc_base 0
@ -265,8 +271,8 @@ static const bfd_arch_info_type * const bfd_archures_list[] =
/* start-sanitize-v850*/
&bfd_v850_arch,
/* end-sanitize-v850 */
#endif
0
#endif
};
/*

View File

@ -1238,6 +1238,12 @@ enum bfd_architecture
/* start-sanitize-v850 */
bfd_arch_v850, /* NEC V850 */
/* end-sanitize-v850 */
/* start-sanitize-v850e */
#define bfd_mach_v850e 'E'
/* end-sanitize-v850e */
/* start-sanitize-v850eq */
#define bfd_mach_v850eq 'Q'
/* end-sanitize-v850eq */
bfd_arch_arc, /* Argonaut RISC Core */
#define bfd_mach_arc_base 0
bfd_arch_m32r, /* Mitsubishi M32R/D */
@ -1929,6 +1935,9 @@ add3, load, and store instructions. */
/* This is a 9-bit reloc */
BFD_RELOC_V850_9_PCREL,
/* This is a 16-bit reloc */
BFD_RELOC_V850_16_PCREL,
/* This is a 22-bit reloc */
BFD_RELOC_V850_22_PCREL,

View File

@ -37,6 +37,9 @@ mips*) targ_archs=bfd_mips_arch ;;
powerpc*) targ_archs="bfd_rs6000_arch bfd_powerpc_arch" ;;
rs6000) targ_archs="bfd_rs6000_arch bfd_powerpc_arch" ;;
sparc*) targ_archs=bfd_sparc_arch ;;
# start-sanitize-v850
v850*) targ_archs=bfd_v850_arch ;;
# end-sanitize-v850
z8k*) targ_archs=bfd_z8k_arch ;;
*) targ_archs=bfd_${targ_cpu}_arch ;;
esac
@ -551,6 +554,16 @@ case "${targ}" in
;;
# end-sanitize-v850
# start-sanitize-v850e
v850e-*-*)
targ_defvec=bfd_elf32_v850_vec
;;
# end-sanitize-v850e
# start-sanitize-v850eq
v850eq-*-*)
targ_defvec=bfd_elf32_v850_vec
;;
# end-sanitize-v850eq
#if HAVE_host_aout_vec
vax-*-bsd* | vax-*-ultrix*)
targ_defvec=host_aout_vec

137
bfd/cpu-v850.c Normal file
View File

@ -0,0 +1,137 @@
/* BFD support for the NEC V850 processor
Copyright 1994, 1995 Free Software Foundation, Inc.
This file is part of BFD, the Binary File Descriptor library.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include "bfd.h"
#include "sysdep.h"
#include "libbfd.h"
static boolean
scan (info, string)
const struct bfd_arch_info * info;
const char * string;
{
const char *ptr_src;
const char *ptr_tst;
unsigned long number;
enum bfd_architecture arch;
/* First test for an exact match */
if (strcmp (string, info->printable_name) == 0)
return true;
/* See how much of the supplied string matches with the
architecture, eg the string m68k:68020 would match the m68k entry
up to the :, then we get left with the machine number */
for (ptr_src = string, ptr_tst = info->arch_name;
*ptr_src && *ptr_tst;
ptr_src++, ptr_tst++)
{
if (*ptr_src != *ptr_tst) break;
}
/* Chewed up as much of the architecture as will match, skip any
colons */
if (*ptr_src == ':')
ptr_src++;
if (*ptr_src == 0)
{
/* nothing more, then only keep this one if it is the default
machine for this architecture */
return info->the_default;
}
number = 0;
while (isdigit (*ptr_src))
{
number = number * 10 + * ptr_src - '0';
ptr_src++;
}
switch (number)
{
case bfd_mach_v850e: arch = bfd_arch_v850; break;
case bfd_mach_v850eq: arch = bfd_arch_v850; break;
default:
return false;
}
if (arch != info->arch)
return false;
if (number != info->mach)
return false;
return true;
}
static const bfd_arch_info_type arch_info_struct[2] =
{
/* start-sanitize-v850e */
{
32, /* 32 bits in a word */
32, /* 32 bits in an address */
8, /* 8 bits in a byte */
bfd_arch_v850,
bfd_mach_v850e,
"v850e",
"v850e",
2,
false,
bfd_default_compatible,
scan,
& arch_info_struct[ 1 ],
},
/* end-sanitize-v850e */
/* start-sanitize-v850eq */
{
32, /* 32 bits in a word */
32, /* 32 bits in an address */
8, /* 8 bits in a byte */
bfd_arch_v850,
bfd_mach_v850eq,
"v850eq",
"v850eq",
2,
false,
bfd_default_compatible,
scan,
0,
}
/* end-sanitize-v850eq */
};
const bfd_arch_info_type bfd_v850_arch =
{
32, /* 32 bits in a word */
32, /* 32 bits in an address */
8, /* 8 bits in a byte */
bfd_arch_v850,
0, /* only 1 machine */
"v850",
"plain v850",
2,
true, /* the default */
bfd_default_compatible,
scan ,
& arch_info_struct[ 0 ],
};

View File

@ -1,39 +0,0 @@
/* BFD support for the NEC V850E processor
Copyright 1994, 1995 Free Software Foundation, Inc.
This file is part of BFD, the Binary File Descriptor library.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include "bfd.h"
#include "sysdep.h"
#include "libbfd.h"
const bfd_arch_info_type bfd_v850e_arch =
{
32, /* 32 bits in a word */
32, /* 32 bits in an address */
8, /* 8 bits in a byte */
bfd_arch_v850e,
0, /* only 1 machine */
"v850e",
"v850e",
2,
true, /* the one and only */
bfd_default_compatible,
bfd_default_scan ,
0,
};

View File

@ -1,39 +0,0 @@
/* BFD support for the NEC V850EQ processor
Copyright 1994, 1995 Free Software Foundation, Inc.
This file is part of BFD, the Binary File Descriptor library.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include "bfd.h"
#include "sysdep.h"
#include "libbfd.h"
const bfd_arch_info_type bfd_v850eq_arch =
{
32, /* 32 bits in a word */
32, /* 32 bits in an address */
8, /* 8 bits in a byte */
bfd_arch_v850eq,
0, /* only 1 machine */
"v850eq",
"v850eq",
2,
true, /* the one and only */
bfd_default_compatible,
bfd_default_scan ,
0,
};

View File

@ -2872,10 +2872,20 @@ prep_headers (abfd)
/* end-sanitize-d30v */
/* start-sanitize-v850 */
case bfd_arch_v850:
i_ehdrp->e_machine = EM_CYGNUS_V850;
switch (bfd_get_mach (abfd))
{
default:
case 0: i_ehdrp->e_machine = EM_CYGNUS_V850; break;
/* start-sanitize-v850e */
case bfd_mach_v850e: i_ehdrp->e_machine = EM_CYGNUS_V850E; break;
/* end-sanitize-v850e */
/* start-sanitize-v850eq */
case bfd_mach_v850eq: i_ehdrp->e_machine = EM_CYGNUS_V850EQ; break;
/* end-sanitize-v850eq */
}
break;
/* end-sanitize-v850 */
case bfd_arch_arc:
case bfd_arch_arc:
i_ehdrp->e_machine = EM_CYGNUS_ARC;
break;
case bfd_arch_m32r:

View File

@ -36,7 +36,7 @@ static void v850_elf_info_to_howto_rel
PARAMS ((bfd *, arelent *, Elf32_Internal_Rel *));
static bfd_reloc_status_type v850_elf_reloc
PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
static boolean v850_elf_is_local_label PARAMS ((bfd *, asymbol *));
static boolean v850_elf_is_local_label_name PARAMS ((bfd *, const char *));
static boolean v850_elf_relocate_section PARAMS((bfd *,
struct bfd_link_info *,
bfd *,
@ -82,6 +82,21 @@ static reloc_howto_type v850_elf_howto_table[] =
0x00ffffff, /* dst_mask */
true), /* pcrel_offset */
/* A PC relative 16 bit load/store. */
HOWTO (R_V850_16_PCREL, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
15, /* bitsize */
true, /* pc_relative */
17, /* bitpos */
complain_overflow_bitfield, /* complain_on_overflow */
v850_elf_reloc, /* special_function */
"R_V850_16_PCREL", /* name */
false, /* partial_inplace */
0xfffe0000, /* src_mask */
0xfffe0000, /* dst_mask */
true), /* pcrel_offset */
/* A PC relative 22 bit branch. */
HOWTO (R_V850_22_PCREL, /* type */
2, /* rightshift */
@ -135,7 +150,7 @@ static reloc_howto_type v850_elf_howto_table[] =
false, /* pc_relative */
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
v850_elf_reloc, /* special_function */
"R_V850_LO16", /* name */
true, /* partial_inplace */
0xffff, /* src_mask */
@ -195,7 +210,7 @@ static reloc_howto_type v850_elf_howto_table[] =
false, /* pc_relative */
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
v850_elf_reloc, /* special_function */
"R_V850_SDA_OFFSET", /* name */
true, /* partial_inplace */
0xffff, /* src_mask */
@ -210,7 +225,7 @@ static reloc_howto_type v850_elf_howto_table[] =
false, /* pc_relative */
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
v850_elf_reloc, /* special_function */
"R_V850_ZDA_OFFSET", /* name */
true, /* partial_inplace */
0xffff, /* src_mask */
@ -225,7 +240,7 @@ static reloc_howto_type v850_elf_howto_table[] =
false, /* pc_relative */
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
v850_elf_reloc, /* special_function */
"R_V850_TDA_OFFSET", /* name */
true, /* partial_inplace */
0xff, /* src_mask */
@ -246,6 +261,7 @@ static const struct v850_elf_reloc_map v850_elf_reloc_map[] =
{
{ BFD_RELOC_NONE, R_V850_NONE, },
{ BFD_RELOC_V850_9_PCREL, R_V850_9_PCREL, },
{ BFD_RELOC_V850_16_PCREL, R_V850_16_PCREL, },
{ BFD_RELOC_V850_22_PCREL, R_V850_22_PCREL, },
{ BFD_RELOC_HI16_S, R_V850_HI16_S, },
{ BFD_RELOC_HI16, R_V850_HI16, },
@ -348,6 +364,7 @@ v850_elf_check_relocs (abfd, info, sec, relocs)
default:
case R_V850_NONE:
case R_V850_9_PCREL:
case R_V850_16_PCREL:
case R_V850_22_PCREL:
case R_V850_HI16_S:
case R_V850_HI16:
@ -411,7 +428,7 @@ v850_elf_check_relocs (abfd, info, sec, relocs)
}
}
if (h->root.type == bfd_link_hash_common
if (h && h->root.type == bfd_link_hash_common
&& h->root.u.c.p
&& !strcmp (bfd_get_section_name (abfd, h->root.u.c.p->section), "COMMON"))
{
@ -497,8 +514,12 @@ v850_elf_reloc (abfd, reloc, symbol, data, isection, obfd, err)
/* I've got no clue... */
reloc->addend = 0;
if (reloc->howto->type == R_V850_22_PCREL)
switch (reloc->howto->type)
{
default:
return bfd_reloc_notsupported;
case R_V850_22_PCREL:
if (relocation > 0x1ffff || relocation < -0x200000)
return bfd_reloc_overflow;
@ -511,9 +532,21 @@ v850_elf_reloc (abfd, reloc, symbol, data, isection, obfd, err)
| ((relocation & 0x3f0000) >> 16));
bfd_put_32 (abfd, insn, (bfd_byte *)data + reloc->address);
return bfd_reloc_ok;
}
else if (reloc->howto->type == R_V850_9_PCREL)
{
case R_V850_16_PCREL:
if (relocation > 0x7fff || relocation < -0x10000)
return bfd_reloc_overflow;
if ((relocation % 2) != 0)
return bfd_reloc_dangerous;
insn = bfd_get_32 (abfd, (bfd_byte *) data + reloc->address);
insn &= 0x1ffff;
insn |= ((relocation & 0xfffe) << 16);
bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc->address);
return bfd_reloc_ok;
case R_V850_9_PCREL:
if (relocation > 0xff || relocation < -0x100)
return bfd_reloc_overflow;
@ -521,27 +554,60 @@ v850_elf_reloc (abfd, reloc, symbol, data, isection, obfd, err)
return bfd_reloc_dangerous;
insn = bfd_get_16 (abfd, (bfd_byte *) data + reloc->address);
insn &= 0xf870;
insn &= ~ 0xf870;
insn |= ((relocation & 0x1f0) << 7) | ((relocation & 0x0e) << 3);
bfd_put_16 (abfd, insn, (bfd_byte *)data + reloc->address);
return bfd_reloc_ok;
}
else if (reloc->howto->type == R_V850_HI16_S)
{
case R_V850_HI16_S:
relocation += bfd_get_16 (abfd, (bfd_byte *) data + reloc->address);
relocation = (relocation >> 16) + ((relocation & 0x8000) != 0);
bfd_put_16 (abfd, relocation, (bfd_byte *)data + reloc->address);
return bfd_reloc_ok;
}
else if (reloc->howto->type == R_V850_HI16)
{
case R_V850_HI16:
relocation += bfd_get_16 (abfd, (bfd_byte *) data + reloc->address);
relocation = (relocation >> 16);
bfd_put_16 (abfd, relocation, (bfd_byte *)data + reloc->address);
return bfd_reloc_ok;
case R_V850_16:
case R_V850_ZDA_OFFSET:
relocation += (short)bfd_get_16 (abfd, (bfd_byte *) data + reloc->address);
if ((long)relocation > 0x7fff || (long)relocation < -0x8000)
return bfd_reloc_overflow;
bfd_put_16 (abfd, relocation, (bfd_byte *)data + reloc->address);
return bfd_reloc_ok;
#if 0
case R_V850_SDA_OFFSET:
{
unsigned long gp;
struct bfd_link_hash_entry *h;
relocation += (short)bfd_get_16 (abfd, (bfd_byte *) data + reloc->address);
/* Get the value of __gp. */
h = bfd_link_hash_lookup (info->hash, "__gp", false, false, true);
if (h == (struct bfd_link_hash_entry *) NULL
|| h->type != bfd_link_hash_defined)
return bfd_reloc_undefined;
gp = (h->u.def.value
+ h->u.def.section->output_section->vma
+ h->u.def.section->output_offset);
relocation -= gp;
if ((long)relocation > 0x7fff || (long)relocation < -0x8000)
return bfd_reloc_overflow;
bfd_put_16 (abfd, relocation, (bfd_byte *)data + reloc->address);
return bfd_reloc_ok;
}
#endif
}
else
return bfd_reloc_notsupported;
}
return bfd_reloc_continue;
@ -550,13 +616,13 @@ v850_elf_reloc (abfd, reloc, symbol, data, isection, obfd, err)
/*ARGSUSED*/
static boolean
v850_elf_is_local_label (abfd, symbol)
v850_elf_is_local_label_name (abfd, name)
bfd *abfd;
asymbol *symbol;
const char *name;
{
return ((symbol->name[0] == '.' && (symbol->name[1] == 'L' || symbol->name[1] == '.'))
|| (symbol->name[0] == '_' && symbol->name[1] == '.' && symbol->name[2] == 'L'
&& symbol->name[3] == '_'));
return ((name[0] == '.' && (name[1] == 'L' || name[1] == '.'))
|| (name[0] == '_' && name[1] == '.' && name[2] == 'L'
&& name[3] == '_'));
}
@ -579,9 +645,7 @@ v850_elf_final_link_relocate (howto, input_bfd, output_bfd,
{
unsigned long insn;
unsigned long r_type = howto->type;
unsigned long r_format = howto->bitsize;
bfd_byte *hit_data = contents + offset;
boolean r_pcrel = howto->pc_relative;
switch (r_type)
{
@ -602,6 +666,22 @@ v850_elf_final_link_relocate (howto, input_bfd, output_bfd,
bfd_put_16 (input_bfd, insn, hit_data);
return bfd_reloc_ok;
case R_V850_16_PCREL:
value -= (input_section->output_section->vma + input_section->output_offset);
value -= offset;
if ((long)value > 0x7fff || (long)value < -0x10000)
return bfd_reloc_overflow;
if ((value % 2) != 0)
return bfd_reloc_dangerous;
insn = bfd_get_32 (input_bfd, hit_data);
insn &= 0x1ffff;
insn |= ((value & 0xfffe) << 16);
bfd_put_32 (input_bfd, insn, hit_data);
return bfd_reloc_ok;
case R_V850_22_PCREL:
value -= (input_section->output_section->vma
+ input_section->output_offset);
@ -777,10 +857,11 @@ v850_elf_final_link_relocate (howto, input_bfd, output_bfd,
}
case R_V850_NONE:
default:
break;
}
return bfd_reloc_ok;
default:
return bfd_reloc_notsupported;
}
}
@ -817,6 +898,10 @@ v850_elf_relocate_section (output_bfd, info, input_bfd, input_section,
bfd_vma relocation;
bfd_reloc_status_type r;
r_symndx = ELF32_R_SYM (rel->r_info);
r_type = ELF32_R_TYPE (rel->r_info);
howto = v850_elf_howto_table + r_type;
if (info->relocateable)
{
/* This is a relocateable link. We don't have to change
@ -836,12 +921,6 @@ v850_elf_relocate_section (output_bfd, info, input_bfd, input_section,
continue;
}
r_type = ELF32_R_TYPE (rel->r_info);
howto = v850_elf_howto_table + r_type;
r_symndx = ELF32_R_SYM (rel->r_info);
/* This is a final link. */
h = NULL;
sym = NULL;
@ -890,31 +969,56 @@ v850_elf_relocate_section (output_bfd, info, input_bfd, input_section,
if (r != bfd_reloc_ok)
{
const char *name;
const char *msg = (const char *)0;
if (h != NULL)
name = h->root.root.string;
else
{
name = (bfd_elf_string_from_elf_section
(input_bfd, symtab_hdr->sh_link, sym->st_name));
if (name == NULL || *name == '\0')
name = bfd_section_name (input_bfd, sec);
}
switch (r)
{
default:
case bfd_reloc_outofrange:
abort ();
case bfd_reloc_overflow:
{
const char *name;
if (! ((*info->callbacks->reloc_overflow)
(info, name, howto->name, (bfd_vma) 0,
input_bfd, input_section, rel->r_offset)))
return false;
break;
if (h != NULL)
name = h->root.root.string;
else
{
name = (bfd_elf_string_from_elf_section
(input_bfd, symtab_hdr->sh_link, sym->st_name));
if (name == NULL)
return false;
if (*name == '\0')
name = bfd_section_name (input_bfd, sec);
}
if (! ((*info->callbacks->reloc_overflow)
(info, name, howto->name, (bfd_vma) 0,
input_bfd, input_section, rel->r_offset)))
return false;
}
case bfd_reloc_undefined:
if (! ((*info->callbacks->undefined_symbol)
(info, name, input_bfd, input_section,
rel->r_offset)))
return false;
break;
case bfd_reloc_outofrange:
msg = "internal error: out of range error";
goto common_error;
case bfd_reloc_notsupported:
msg = "internal error: unsupported relocation error";
goto common_error;
case bfd_reloc_dangerous:
msg = "internal error: dangerous error";
goto common_error;
default:
msg = "internal error: unknown error";
/* fall through */
common_error:
if (!((*info->callbacks->warning)
(info, msg, name, input_bfd, input_section,
rel->r_offset)))
return false;
break;
}
}
@ -923,18 +1027,47 @@ v850_elf_relocate_section (output_bfd, info, input_bfd, input_section,
return true;
}
/* Set the right machine number. */
static boolean
v850_elf_object_p (abfd)
bfd *abfd;
{
switch (get_elf_backend_data (abfd) -> elf_machine_code)
{
default:
case EM_CYGNUS_V850: (void) bfd_default_set_arch_mach (abfd, bfd_arch_v850, 0); break;
/* start-sanitize-v850e */
case EM_CYGNUS_V850E: (void) bfd_default_set_arch_mach (abfd, bfd_arch_v850, bfd_mach_v850e); break;
/* end-sanitize-v850e */
/* start-sanitize-v850eq */
case EM_CYGNUS_V850EQ: (void) bfd_default_set_arch_mach (abfd, bfd_arch_v850, bfd_mach_v850eq); break;
/* start-sanitize-v850eq */
}
}
#define TARGET_LITTLE_SYM bfd_elf32_v850_vec
#define TARGET_LITTLE_NAME "elf32-v850"
#define ELF_ARCH bfd_arch_v850
#define ELF_MACHINE_CODE EM_CYGNUS_V850
/* start-sanitize-v850e */
#undef ELF_MACHINE_CODE
#define ELF_MACHINE_CODE EM_CYGNUS_V850E
/* end-sanitize-v850e */
/* start-sanitize-v850eq */
#undef ELF_MACHINE_CODE
#define ELF_MACHINE_CODE EM_CYGNUS_V850EQ
/* end-sanitize-v850eq */
#define ELF_MAXPAGESIZE 0x1000
#define elf_info_to_howto 0
#define elf_info_to_howto_rel v850_elf_info_to_howto_rel
#define elf_backend_check_relocs v850_elf_check_relocs
#define elf_backend_relocate_section v850_elf_relocate_section
#define bfd_elf32_bfd_is_local_label v850_elf_is_local_label
#define elf_backend_object_p v850_elf_object_p
#define bfd_elf32_bfd_is_local_label_name v850_elf_is_local_label_name
#define bfd_elf32_bfd_reloc_type_lookup v850_elf_reloc_type_lookup
#define elf_symbol_leading_char '_'