2002-06-18 Dave Brolley <brolley@redhat.com>
authorDave Brolley <brolley@redhat.com>
Tue, 18 Jun 2002 21:10:55 +0000 (21:10 +0000)
committerDave Brolley <brolley@redhat.com>
Tue, 18 Jun 2002 21:10:55 +0000 (21:10 +0000)
From Catherine Moore, Michael Meissner, Dave Brolley:
* po/SRC-POTFILES.in: Add cpu-frv.c and elf32-frv.c
* targets.c: Support bfd_elf32_frv_vec.
* reloc.c: Add FRV relocs.
* configure.in: Add support for bfd-elf32-frv-vec.
* config.bfd (targ_cpu): Add support for frv-*-elf.
* archures.c: Add frv arch and machines.
* Makefile.am (ALL_MACHINES): Add cpu-frv.lo.
(ALL_MACHINES_CFILES): Add cpu-frv.c.
(BFD32_BACKENDS): Add elf32-frv.lo.
(BFD32_BACKENDS_CFILES): Add elf32-frv.c
(cpu-frv.lo): New target.
(elf32-frv.lo): New target.
* cpu-frv.c: New file.
* elf32-frv.c: New file.

13 files changed:
bfd/ChangeLog
bfd/Makefile.am
bfd/Makefile.in
bfd/archures.c
bfd/bfd-in2.h
bfd/config.bfd
bfd/configure
bfd/configure.in
bfd/cpu-frv.c [new file with mode: 0644]
bfd/elf32-frv.c [new file with mode: 0644]
bfd/po/SRC-POTFILES.in
bfd/reloc.c
bfd/targets.c

index 0ba7f4f..c2b4e54 100644 (file)
@@ -1,3 +1,21 @@
+2002-06-18  Dave Brolley  <brolley@redhat.com>
+
+       From Catherine Moore, Michael Meissner, Dave Brolley:
+       * po/SRC-POTFILES.in: Add cpu-frv.c and elf32-frv.c
+       * targets.c: Support bfd_elf32_frv_vec.
+       * reloc.c: Add FRV relocs.
+       * configure.in: Add support for bfd-elf32-frv-vec.
+       * config.bfd (targ_cpu): Add support for frv-*-elf.
+       * archures.c: Add frv arch and machines.
+       * Makefile.am (ALL_MACHINES): Add cpu-frv.lo.
+       (ALL_MACHINES_CFILES): Add cpu-frv.c.
+       (BFD32_BACKENDS): Add elf32-frv.lo.
+       (BFD32_BACKENDS_CFILES): Add elf32-frv.c
+       (cpu-frv.lo): New target.
+       (elf32-frv.lo): New target.
+       * cpu-frv.c: New file.
+       * elf32-frv.c: New file.
+
 2002-06-18  Jakub Jelinek  <jakub@redhat.com>
 
        * elfcode.h (elf_object_p): Sanity check eh_shoff == 0 implies
index da39978..62afb1d 100644 (file)
@@ -58,6 +58,7 @@ ALL_MACHINES = \
        cpu-d30v.lo \
        cpu-dlx.lo \
        cpu-fr30.lo \
+       cpu-frv.lo \
        cpu-h8300.lo \
        cpu-h8500.lo \
        cpu-hppa.lo \
@@ -107,6 +108,7 @@ ALL_MACHINES_CFILES = \
        cpu-d30v.c \
        cpu-dlx.c \
        cpu-fr30.c \
+       cpu-frv.c \
        cpu-h8300.c \
        cpu-h8500.c \
        cpu-hppa.c \
@@ -202,6 +204,7 @@ BFD32_BACKENDS = \
        elf32-d30v.lo \
        elf32-dlx.lo \
        elf32-fr30.lo \
+       elf32-frv.lo \
        elf32-gen.lo \
        elf32-h8300.lo \
        elf32-hppa.lo \
@@ -357,6 +360,7 @@ BFD32_BACKENDS_CFILES = \
        elf32-d30v.c \
        elf32-dlx.c \
        elf32-fr30.c \
+       elf32-frv.c \
        elf32-gen.c \
        elf32-h8300.c \
        elf32-hppa.c \
@@ -830,7 +834,6 @@ DISTCLEANFILES = $(BUILD_CFILES) $(BUILD_HFILES)
 config.status: $(srcdir)/configure $(srcdir)/config.bfd $(srcdir)/configure.host
        $(SHELL) ./config.status --recheck
 
-
 # What appears below is generated by a hacked mkdep using gcc -MM.
 
 # DO NOT DELETE THIS LINE -- mkdep uses it.
@@ -886,6 +889,7 @@ cpu-d10v.lo: cpu-d10v.c $(INCDIR)/filenames.h
 cpu-d30v.lo: cpu-d30v.c $(INCDIR)/filenames.h
 cpu-dlx.lo: cpu-dlx.c $(INCDIR)/filenames.h
 cpu-fr30.lo: cpu-fr30.c $(INCDIR)/filenames.h
+cpu-frv.lo: cpu-frv.c $(INCDIR)/filenames.h
 cpu-h8300.lo: cpu-h8300.c $(INCDIR)/filenames.h
 cpu-h8500.lo: cpu-h8500.c $(INCDIR)/filenames.h
 cpu-hppa.lo: cpu-hppa.c $(INCDIR)/filenames.h
@@ -1109,6 +1113,10 @@ elf32-fr30.lo: elf32-fr30.c $(INCDIR)/filenames.h elf-bfd.h \
   $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \
   $(INCDIR)/bfdlink.h $(INCDIR)/elf/fr30.h $(INCDIR)/elf/reloc-macros.h \
   elf32-target.h
+elf32-frv.lo: elf32-frv.c elf-bfd.h $(INCDIR)/elf/common.h \
+  $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h \
+  $(INCDIR)/elf/frv.h $(INCDIR)/elf/reloc-macros.h \
+  elf32-target.h
 elf32-gen.lo: elf32-gen.c $(INCDIR)/filenames.h elf-bfd.h \
   $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \
   $(INCDIR)/bfdlink.h elf32-target.h
index 983ac2f..bb24072 100644 (file)
@@ -163,18 +163,18 @@ BFD64_LIBS_CFILES = archive64.c
 
 # This list is alphabetized to make it easier to keep in sync
 # with the decls and initializer in archures.c.
-ALL_MACHINES =         cpu-a29k.lo     cpu-alpha.lo    cpu-arc.lo      cpu-arm.lo      cpu-avr.lo      cpu-cris.lo     cpu-d10v.lo     cpu-d30v.lo     cpu-dlx.lo      cpu-fr30.lo     cpu-h8300.lo    cpu-h8500.lo    cpu-hppa.lo     cpu-ia64.lo     cpu-i370.lo     cpu-i386.lo     cpu-i860.lo     cpu-i960.lo     cpu-m32r.lo     cpu-m68hc11.lo  cpu-m68hc12.lo  cpu-m68k.lo     cpu-m88k.lo     cpu-m10200.lo   cpu-m10300.lo   cpu-mcore.lo    cpu-mips.lo     cpu-mmix.lo     cpu-or32.lo     cpu-ns32k.lo    cpu-openrisc.lo         cpu-pdp11.lo    cpu-pj.lo       cpu-powerpc.lo  cpu-rs6000.lo   cpu-s390.lo     cpu-sh.lo       cpu-sparc.lo    cpu-tic30.lo    cpu-tic54x.lo   cpu-tic80.lo    cpu-v850.lo     cpu-vax.lo      cpu-we32k.lo    cpu-w65.lo      cpu-xstormy16.lo        cpu-z8k.lo
+ALL_MACHINES =         cpu-a29k.lo     cpu-alpha.lo    cpu-arc.lo      cpu-arm.lo      cpu-avr.lo      cpu-cris.lo     cpu-d10v.lo     cpu-d30v.lo     cpu-dlx.lo      cpu-fr30.lo     cpu-frv.lo      cpu-h8300.lo    cpu-h8500.lo    cpu-hppa.lo     cpu-ia64.lo     cpu-i370.lo     cpu-i386.lo     cpu-i860.lo     cpu-i960.lo     cpu-m32r.lo     cpu-m68hc11.lo  cpu-m68hc12.lo  cpu-m68k.lo     cpu-m88k.lo     cpu-m10200.lo   cpu-m10300.lo   cpu-mcore.lo    cpu-mips.lo     cpu-mmix.lo     cpu-or32.lo     cpu-ns32k.lo    cpu-openrisc.lo         cpu-pdp11.lo    cpu-pj.lo       cpu-powerpc.lo  cpu-rs6000.lo   cpu-s390.lo     cpu-sh.lo       cpu-sparc.lo    cpu-tic30.lo    cpu-tic54x.lo   cpu-tic80.lo    cpu-v850.lo     cpu-vax.lo      cpu-we32k.lo    cpu-w65.lo      cpu-xstormy16.lo        cpu-z8k.lo
 
 
-ALL_MACHINES_CFILES =          cpu-a29k.c      cpu-alpha.c     cpu-arc.c       cpu-arm.c       cpu-avr.c       cpu-cris.c      cpu-d10v.c      cpu-d30v.c      cpu-dlx.c       cpu-fr30.c      cpu-h8300.c     cpu-h8500.c     cpu-hppa.c      cpu-ia64.c      cpu-i370.c      cpu-i386.c      cpu-i860.c      cpu-i960.c      cpu-m32r.c      cpu-m68hc11.c   cpu-m68hc12.c   cpu-m68k.c      cpu-m88k.c      cpu-m10200.c    cpu-m10300.c    cpu-mcore.c     cpu-mips.c      cpu-mmix.c      cpu-or32.c      cpu-ns32k.c     cpu-openrisc.c  cpu-pdp11.c     cpu-pj.c        cpu-powerpc.c   cpu-rs6000.c    cpu-s390.c      cpu-sh.c        cpu-sparc.c     cpu-tic30.c     cpu-tic54x.c    cpu-tic80.c     cpu-v850.c      cpu-vax.c       cpu-we32k.c     cpu-w65.c       cpu-xstormy16.c         cpu-z8k.c
+ALL_MACHINES_CFILES =          cpu-a29k.c      cpu-alpha.c     cpu-arc.c       cpu-arm.c       cpu-avr.c       cpu-cris.c      cpu-d10v.c      cpu-d30v.c      cpu-dlx.c       cpu-fr30.c      cpu-frv.c       cpu-h8300.c     cpu-h8500.c     cpu-hppa.c      cpu-ia64.c      cpu-i370.c      cpu-i386.c      cpu-i860.c      cpu-i960.c      cpu-m32r.c      cpu-m68hc11.c   cpu-m68hc12.c   cpu-m68k.c      cpu-m88k.c      cpu-m10200.c    cpu-m10300.c    cpu-mcore.c     cpu-mips.c      cpu-mmix.c      cpu-or32.c      cpu-ns32k.c     cpu-openrisc.c  cpu-pdp11.c     cpu-pj.c        cpu-powerpc.c   cpu-rs6000.c    cpu-s390.c      cpu-sh.c        cpu-sparc.c     cpu-tic30.c     cpu-tic54x.c    cpu-tic80.c     cpu-v850.c      cpu-vax.c       cpu-we32k.c     cpu-w65.c       cpu-xstormy16.c         cpu-z8k.c
 
 
 # The .o files needed by all of the 32 bit vectors that are configured into
 # target_vector in targets.c if configured with --enable-targets=all.
-BFD32_BACKENDS =       aout-adobe.lo   aout-arm.lo     aout-cris.lo    aout-ns32k.lo   aout-sparcle.lo         aout-tic30.lo   aout0.lo        aout32.lo       armnetbsd.lo    bout.lo         cf-i386lynx.lo  cf-m68klynx.lo  cf-sparclynx.lo         coff-a29k.lo    coff-apollo.lo  coff-arm.lo     coff-aux.lo     coff-h8300.lo   coff-h8500.lo   coff-i386.lo    coff-go32.lo    coff-i860.lo    coff-i960.lo    coff-m68k.lo    coff-m88k.lo    coff-mips.lo    coff-or32.lo    coff-rs6000.lo  coff-sh.lo      coff-sparc.lo   coff-stgo32.lo  coff-svm68k.lo  coff-tic30.lo   coff-tic54x.lo  coff-tic80.lo   coff-u68k.lo    coff-we32k.lo   coff-w65.lo     coff-z8k.lo     cofflink.lo     dwarf1.lo       ecoff.lo        ecofflink.lo    efi-app-ia32.lo         elf.lo  elf32-arc.lo    elfarm-oabi.lo  elfarm-nabi.lo  elf32-avr.lo    elf32-cris.lo   elf32-d10v.lo   elf32-d30v.lo   elf32-dlx.lo    elf32-fr30.lo   elf32-gen.lo    elf32-h8300.lo  elf32-hppa.lo   elf32-i370.lo   elf32-i386.lo   elf32-i386qnx.lo        elf32-i860.lo   elf32-i960.lo   elf32-ia64.lo   elf32-m32r.lo   elf32-m68hc11.lo        elf32-m68hc12.lo        elf32-m68k.lo   elf32-m88k.lo   elf-m10200.lo   elf-m10300.lo   elf32-mcore.lo  elfxx-mips.lo   elf32-mips.lo   elf32-openrisc.lo       elf32-or32.lo   elf32-pj.lo     elf32-ppc.lo    elf32-s390.lo   elf32-sh.lo     elf32-sh-lin.lo         elf32-sh64.lo   elf32-sh64-com.lo       elf32-sh-nbsd.lo        elf32-sh64-nbsd.lo      elf32-sparc.lo  elf32-v850.lo   elf32-vax.lo    elf32-xstormy16.lo      elf32.lo        elflink.lo      elf-strtab.lo   elf-eh-frame.lo         epoc-pe-arm.lo  epoc-pei-arm.lo         hp300bsd.lo     hp300hpux.lo    som.lo  i386aout.lo     i386bsd.lo      i386dynix.lo    i386freebsd.lo  i386linux.lo    i386lynx.lo     i386msdos.lo    i386netbsd.lo   i386mach3.lo    i386os9k.lo     ieee.lo         m68k4knetbsd.lo         m68klinux.lo    m68klynx.lo     m68knetbsd.lo   m88kmach3.lo    mipsbsd.lo      newsos3.lo      nlm.lo  nlm32-i386.lo   nlm32-sparc.lo  nlm32-ppc.lo    nlm32.lo        ns32knetbsd.lo  oasys.lo        pc532-mach.lo   pdp11.lo        pe-arm.lo       pei-arm.lo      pe-i386.lo      pei-i386.lo     pe-mcore.lo     pei-mcore.lo    pe-ppc.lo       pei-ppc.lo      pe-sh.lo        pei-sh.lo       pe-mips.lo      pei-mips.lo     peigen.lo       ppcboot.lo      reloc16.lo      riscix.lo       sparclinux.lo   sparclynx.lo    sparcnetbsd.lo  sunos.lo        vaxnetbsd.lo    vax1knetbsd.lo  versados.lo     vms.lo  vms-gsd.lo      vms-hdr.lo      vms-misc.lo     vms-tir.lo      xcofflink.lo
+BFD32_BACKENDS =       aout-adobe.lo   aout-arm.lo     aout-cris.lo    aout-ns32k.lo   aout-sparcle.lo         aout-tic30.lo   aout0.lo        aout32.lo       armnetbsd.lo    bout.lo         cf-i386lynx.lo  cf-m68klynx.lo  cf-sparclynx.lo         coff-a29k.lo    coff-apollo.lo  coff-arm.lo     coff-aux.lo     coff-h8300.lo   coff-h8500.lo   coff-i386.lo    coff-go32.lo    coff-i860.lo    coff-i960.lo    coff-m68k.lo    coff-m88k.lo    coff-mips.lo    coff-or32.lo    coff-rs6000.lo  coff-sh.lo      coff-sparc.lo   coff-stgo32.lo  coff-svm68k.lo  coff-tic30.lo   coff-tic54x.lo  coff-tic80.lo   coff-u68k.lo    coff-we32k.lo   coff-w65.lo     coff-z8k.lo     cofflink.lo     dwarf1.lo       ecoff.lo        ecofflink.lo    efi-app-ia32.lo         elf.lo  elf32-arc.lo    elfarm-oabi.lo  elfarm-nabi.lo  elf32-avr.lo    elf32-cris.lo   elf32-d10v.lo   elf32-d30v.lo   elf32-dlx.lo    elf32-fr30.lo   elf32-frv.lo    elf32-gen.lo    elf32-h8300.lo  elf32-hppa.lo   elf32-i370.lo   elf32-i386.lo   elf32-i386qnx.lo        elf32-i860.lo   elf32-i960.lo   elf32-ia64.lo   elf32-m32r.lo   elf32-m68hc11.lo        elf32-m68hc12.lo        elf32-m68k.lo   elf32-m88k.lo   elf-m10200.lo   elf-m10300.lo   elf32-mcore.lo  elfxx-mips.lo   elf32-mips.lo   elf32-openrisc.lo       elf32-or32.lo   elf32-pj.lo     elf32-ppc.lo    elf32-s390.lo   elf32-sh.lo     elf32-sh-lin.lo         elf32-sh64.lo   elf32-sh64-com.lo       elf32-sh-nbsd.lo        elf32-sh64-nbsd.lo      elf32-sparc.lo  elf32-v850.lo   elf32-vax.lo    elf32-xstormy16.lo      elf32.lo        elflink.lo      elf-strtab.lo   elf-eh-frame.lo         epoc-pe-arm.lo  epoc-pei-arm.lo         hp300bsd.lo     hp300hpux.lo    som.lo  i386aout.lo     i386bsd.lo      i386dynix.lo    i386freebsd.lo  i386linux.lo    i386lynx.lo     i386msdos.lo    i386netbsd.lo   i386mach3.lo    i386os9k.lo     ieee.lo         m68k4knetbsd.lo         m68klinux.lo    m68klynx.lo     m68knetbsd.lo   m88kmach3.lo    mipsbsd.lo      newsos3.lo      nlm.lo  nlm32-i386.lo   nlm32-sparc.lo  nlm32-ppc.lo    nlm32.lo        ns32knetbsd.lo  oasys.lo        pc532-mach.lo   pdp11.lo        pe-arm.lo       pei-arm.lo      pe-i386.lo      pei-i386.lo     pe-mcore.lo     pei-mcore.lo    pe-ppc.lo       pei-ppc.lo      pe-sh.lo        pei-sh.lo       pe-mips.lo      pei-mips.lo     peigen.lo       ppcboot.lo      reloc16.lo      riscix.lo       sparclinux.lo   sparclynx.lo    sparcnetbsd.lo  sunos.lo        vaxnetbsd.lo    vax1knetbsd.lo  versados.lo     vms.lo  vms-gsd.lo      vms-hdr.lo      vms-misc.lo     vms-tir.lo      xcofflink.lo
 
 
-BFD32_BACKENDS_CFILES =        aout-adobe.c    aout-arm.c      aout-cris.c     aout-ns32k.c    aout-sparcle.c  aout-tic30.c    aout0.c         aout32.c        armnetbsd.c     bout.c  cf-i386lynx.c   cf-m68klynx.c   cf-sparclynx.c  coff-a29k.c     coff-apollo.c   coff-arm.c      coff-aux.c      coff-h8300.c    coff-h8500.c    coff-i386.c     coff-i860.c     coff-go32.c     coff-i960.c     coff-m68k.c     coff-m88k.c     coff-mips.c     coff-or32.c     coff-rs6000.c   coff-sh.c       coff-sparc.c    coff-stgo32.c   coff-svm68k.c   coff-tic30.c    coff-tic54x.c   coff-tic80.c    coff-u68k.c     coff-we32k.c    coff-w65.c      coff-z8k.c      cofflink.c      dwarf1.c        ecoff.c         ecofflink.c     efi-app-ia32.c  elf.c   elf32-arc.c     elfarm-oabi.c   elfarm-nabi.c   elf32-avr.c     elf32-cris.c    elf32-d10v.c    elf32-d30v.c    elf32-dlx.c     elf32-fr30.c    elf32-gen.c     elf32-h8300.c   elf32-hppa.c    elf32-i370.c    elf32-i386.c    elf32-i386qnx.c         elf32-i860.c    elf32-i960.c    elf32-m32r.c    elf32-m68k.c    elf32-m68hc11.c         elf32-m68hc12.c         elf32-m88k.c    elf-m10200.c    elf-m10300.c    elf32-mcore.c   elfxx-mips.c    elf32-mips.c    elf32-openrisc.c        elf32-or32.c    elf32-pj.c      elf32-ppc.c     elf32-sh64.c    elf32-sh64-com.c        elf32-s390.c    elf32-sh.c      elf32-sh-lin.c  elf32-sh-nbsd.c         elf32-sh64-nbsd.c       elf32-sparc.c   elf32-v850.c    elf32-vax.c     elf32-xstormy16.c       elf32.c         elflink.c       elf-strtab.c    elf-eh-frame.c  epoc-pe-arm.c   epoc-pei-arm.c  hp300bsd.c      hp300hpux.c     som.c   i386aout.c      i386bsd.c       i386dynix.c     i386freebsd.c   i386linux.c     i386lynx.c      i386msdos.c     i386netbsd.c    i386mach3.c     i386os9k.c      ieee.c  m68k4knetbsd.c  m68klinux.c     m68klynx.c      m68knetbsd.c    m88kmach3.c     mipsbsd.c       newsos3.c       nlm.c   nlm32-i386.c    nlm32-sparc.c   nlm32-ppc.c     nlm32.c         ns32knetbsd.c   oasys.c         pc532-mach.c    pdp11.c         pe-arm.c        pei-arm.c       pe-i386.c       pei-i386.c      pe-mcore.c      pei-mcore.c     pe-ppc.c        pei-ppc.c       pe-sh.c         pei-sh.c        pe-mips.c       pei-mips.c      ppcboot.c       reloc16.c       riscix.c        sparclinux.c    sparclynx.c     sparcnetbsd.c   sunos.c         vaxnetbsd.c     vax1knetbsd.c   versados.c      vms.c   vms-gsd.c       vms-hdr.c       vms-misc.c      vms-tir.c       xcofflink.c
+BFD32_BACKENDS_CFILES =        aout-adobe.c    aout-arm.c      aout-cris.c     aout-ns32k.c    aout-sparcle.c  aout-tic30.c    aout0.c         aout32.c        armnetbsd.c     bout.c  cf-i386lynx.c   cf-m68klynx.c   cf-sparclynx.c  coff-a29k.c     coff-apollo.c   coff-arm.c      coff-aux.c      coff-h8300.c    coff-h8500.c    coff-i386.c     coff-i860.c     coff-go32.c     coff-i960.c     coff-m68k.c     coff-m88k.c     coff-mips.c     coff-or32.c     coff-rs6000.c   coff-sh.c       coff-sparc.c    coff-stgo32.c   coff-svm68k.c   coff-tic30.c    coff-tic54x.c   coff-tic80.c    coff-u68k.c     coff-we32k.c    coff-w65.c      coff-z8k.c      cofflink.c      dwarf1.c        ecoff.c         ecofflink.c     efi-app-ia32.c  elf.c   elf32-arc.c     elfarm-oabi.c   elfarm-nabi.c   elf32-avr.c     elf32-cris.c    elf32-d10v.c    elf32-d30v.c    elf32-dlx.c     elf32-fr30.c    elf32-frv.c     elf32-gen.c     elf32-h8300.c   elf32-hppa.c    elf32-i370.c    elf32-i386.c    elf32-i386qnx.c         elf32-i860.c    elf32-i960.c    elf32-m32r.c    elf32-m68k.c    elf32-m68hc11.c         elf32-m68hc12.c         elf32-m88k.c    elf-m10200.c    elf-m10300.c    elf32-mcore.c   elfxx-mips.c    elf32-mips.c    elf32-openrisc.c        elf32-or32.c    elf32-pj.c      elf32-ppc.c     elf32-sh64.c    elf32-sh64-com.c        elf32-s390.c    elf32-sh.c      elf32-sh-lin.c  elf32-sh-nbsd.c         elf32-sh64-nbsd.c       elf32-sparc.c   elf32-v850.c    elf32-vax.c     elf32-xstormy16.c       elf32.c         elflink.c       elf-strtab.c    elf-eh-frame.c  epoc-pe-arm.c   epoc-pei-arm.c  hp300bsd.c      hp300hpux.c     som.c   i386aout.c      i386bsd.c       i386dynix.c     i386freebsd.c   i386linux.c     i386lynx.c      i386msdos.c     i386netbsd.c    i386mach3.c     i386os9k.c      ieee.c  m68k4knetbsd.c  m68klinux.c     m68klynx.c      m68knetbsd.c    m88kmach3.c     mipsbsd.c       newsos3.c       nlm.c   nlm32-i386.c    nlm32-sparc.c   nlm32-ppc.c     nlm32.c         ns32knetbsd.c   oasys.c         pc532-mach.c    pdp11.c         pe-arm.c        pei-arm.c       pe-i386.c       pei-i386.c      pe-mcore.c      pei-mcore.c     pe-ppc.c        pei-ppc.c       pe-sh.c         pei-sh.c        pe-mips.c       pei-mips.c      ppcboot.c       reloc16.c       riscix.c        sparclinux.c    sparclynx.c     sparcnetbsd.c   sunos.c         vaxnetbsd.c     vax1knetbsd.c   versados.c      vms.c   vms-gsd.c       vms-hdr.c       vms-misc.c      vms-tir.c       xcofflink.c
 
 
 # The .o files needed by all of the 64 bit vectors that are configured into
@@ -930,6 +930,7 @@ cpu-d10v.lo: cpu-d10v.c $(INCDIR)/filenames.h
 cpu-d30v.lo: cpu-d30v.c $(INCDIR)/filenames.h
 cpu-dlx.lo: cpu-dlx.c $(INCDIR)/filenames.h
 cpu-fr30.lo: cpu-fr30.c $(INCDIR)/filenames.h
+cpu-frv.lo: cpu-frv.c $(INCDIR)/filenames.h
 cpu-h8300.lo: cpu-h8300.c $(INCDIR)/filenames.h
 cpu-h8500.lo: cpu-h8500.c $(INCDIR)/filenames.h
 cpu-hppa.lo: cpu-hppa.c $(INCDIR)/filenames.h
@@ -1153,6 +1154,10 @@ elf32-fr30.lo: elf32-fr30.c $(INCDIR)/filenames.h elf-bfd.h \
   $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \
   $(INCDIR)/bfdlink.h $(INCDIR)/elf/fr30.h $(INCDIR)/elf/reloc-macros.h \
   elf32-target.h
+elf32-frv.lo: elf32-frv.c $(INCDIR)/filenames.h elf-bfd.h \
+  $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \
+  $(INCDIR)/bfdlink.h $(INCDIR)/elf/frv.h $(INCDIR)/elf/reloc-macros.h \
+  elf32-target.h
 elf32-gen.lo: elf32-gen.c $(INCDIR)/filenames.h elf-bfd.h \
   $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \
   $(INCDIR)/bfdlink.h elf32-target.h
index 36fc568..063e4fb 100644 (file)
@@ -247,6 +247,13 @@ DESCRIPTION
 .#define bfd_mach_am33         330
 .  bfd_arch_fr30,
 .#define bfd_mach_fr30         0x46523330
+.  bfd_arch_frv,
+.#define bfd_mach_frv          0
+.#define bfd_mach_frvsimple    1
+.#define bfd_mach_fr300                300
+.#define bfd_mach_fr400                400
+.#define bfd_mach_frvtomcat    499     {* fr500 prototype *}
+.#define bfd_mach_fr500                500
 .  bfd_arch_mcore,
 .  bfd_arch_ia64,      {* HP/Intel ia64 *}
 .#define bfd_mach_ia64_elf64   0
@@ -315,6 +322,7 @@ extern const bfd_arch_info_type bfd_d10v_arch;
 extern const bfd_arch_info_type bfd_d30v_arch;
 extern const bfd_arch_info_type bfd_dlx_arch;
 extern const bfd_arch_info_type bfd_fr30_arch;
+extern const bfd_arch_info_type bfd_frv_arch;
 extern const bfd_arch_info_type bfd_h8300_arch;
 extern const bfd_arch_info_type bfd_h8500_arch;
 extern const bfd_arch_info_type bfd_hppa_arch;
@@ -369,6 +377,7 @@ static const bfd_arch_info_type * const bfd_archures_list[] =
     &bfd_d30v_arch,
     &bfd_dlx_arch,
     &bfd_fr30_arch,
+    &bfd_frv_arch,
     &bfd_h8300_arch,
     &bfd_h8500_arch,
     &bfd_hppa_arch,
index e4319ff..4a8d802 100644 (file)
@@ -1637,6 +1637,13 @@ enum bfd_architecture
 #define bfd_mach_am33          330
   bfd_arch_fr30,
 #define bfd_mach_fr30          0x46523330
+  bfd_arch_frv,
+#define bfd_mach_frv           0
+#define bfd_mach_frvsimple     1
+#define bfd_mach_fr300         300
+#define bfd_mach_fr400         400
+#define bfd_mach_frvtomcat     499     /* fr500 prototype */
+#define bfd_mach_fr500         500
   bfd_arch_mcore,
   bfd_arch_ia64,      /* HP/Intel ia64 */
 #define bfd_mach_ia64_elf64    0
@@ -2832,6 +2839,17 @@ value of SUBI insn.  */
 into 22 bits.  */
   BFD_RELOC_AVR_CALL,
 
+/* Fujitsu Frv Relocations. */
+  BFD_RELOC_FRV_LABEL16,
+  BFD_RELOC_FRV_LABEL24,
+  BFD_RELOC_FRV_LO16,
+  BFD_RELOC_FRV_HI16,
+  BFD_RELOC_FRV_GPREL12,
+  BFD_RELOC_FRV_GPRELU12,
+  BFD_RELOC_FRV_GPREL32,
+  BFD_RELOC_FRV_GPRELHI,
+  BFD_RELOC_FRV_GPRELLO,
+
 /* Direct 12 bit.  */
   BFD_RELOC_390_12,
 
index 520c36b..e875087 100644 (file)
@@ -281,6 +281,10 @@ case "${targ}" in
     targ_defvec=bfd_elf32_fr30_vec
     ;;
 
+  frv-*-elf)
+    targ_defvec=bfd_elf32_frv_vec
+    ;;
+
 
   h8300*-*-elf)
     targ_defvec=bfd_elf32_h8300_vec
index 626f56b..172290b 100755 (executable)
@@ -6068,6 +6068,7 @@ do
     bfd_elf32_d30v_vec)                tb="$tb elf32-d30v.lo elf32.lo $elf" ;;
     bfd_elf32_dlx_big_vec)     tb="$tb elf32-dlx.lo elf32.lo $elf" ;;
     bfd_elf32_fr30_vec)                tb="$tb elf32-fr30.lo elf32.lo $elf" ;;
+    bfd_elf32_frv_vec)         tb="$tb elf32-frv.lo elf32.lo $elf" ;;
     bfd_elf32_h8300_vec)       tb="$tb elf32-h8300.lo elf32.lo $elf" ;;
     bfd_elf32_hppa_linux_vec)  tb="$tb elf32-hppa.lo elf32.lo $elf" ;;
     bfd_elf32_hppa_vec)                tb="$tb elf32-hppa.lo elf32.lo $elf" ;;
index 161a8e4..b3f3557 100644 (file)
@@ -569,6 +569,7 @@ do
     bfd_elf32_d30v_vec)                tb="$tb elf32-d30v.lo elf32.lo $elf" ;;
     bfd_elf32_dlx_big_vec)     tb="$tb elf32-dlx.lo elf32.lo $elf" ;;
     bfd_elf32_fr30_vec)                tb="$tb elf32-fr30.lo elf32.lo $elf" ;;
+    bfd_elf32_frv_vec)         tb="$tb elf32-frv.lo elf32.lo $elf" ;;
     bfd_elf32_h8300_vec)       tb="$tb elf32-h8300.lo elf32.lo $elf" ;;
     bfd_elf32_hppa_linux_vec)  tb="$tb elf32-hppa.lo elf32.lo $elf" ;;
     bfd_elf32_hppa_vec)                tb="$tb elf32-hppa.lo elf32.lo $elf" ;;
diff --git a/bfd/cpu-frv.c b/bfd/cpu-frv.c
new file mode 100644 (file)
index 0000000..cd9ff1e
--- /dev/null
@@ -0,0 +1,64 @@
+/* BFD support for the FRV processor.
+   Copyright (C) 2002 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"
+
+enum {
+  I_frv_generic,
+  I_frv_simple,
+  I_frv_500,
+  I_frv_300,
+};
+
+#define FRV_ARCH(MACHINE, NAME, DEFAULT, NEXT)                         \
+{                                                                      \
+  32,                          /* 32 bits in a word */                 \
+  32,                          /* 32 bits in an address */             \
+  8,                           /* 8 bits in a byte */                  \
+  bfd_arch_frv,                        /* architecture */                      \
+  MACHINE,                     /* which machine */                     \
+  "frv",                       /* architecture name */                 \
+  NAME,                                /* machine name */                      \
+  4,                           /* default alignment */                 \
+  DEFAULT,                     /* is this the default? */              \
+  bfd_default_compatible,      /* architecture comparison fn */        \
+  bfd_default_scan,            /* string to architecture convert fn */ \
+  NEXT                         /* next in list */                      \
+}
+
+static const bfd_arch_info_type arch_info_300
+  = FRV_ARCH (bfd_mach_fr300,   "fr300",   false, (bfd_arch_info_type *)0);
+
+static const bfd_arch_info_type arch_info_400
+  = FRV_ARCH (bfd_mach_fr400, "fr400", false, &arch_info_300);
+
+static const bfd_arch_info_type arch_info_500
+  = FRV_ARCH (bfd_mach_fr500, "fr500", false, &arch_info_400);
+
+static const bfd_arch_info_type arch_info_simple
+  = FRV_ARCH (bfd_mach_frvsimple, "simple", false, &arch_info_500);
+
+static const bfd_arch_info_type arch_info_tomcat
+  = FRV_ARCH (bfd_mach_frvtomcat, "tomcat", false, &arch_info_simple);
+
+const bfd_arch_info_type bfd_frv_arch
+  = FRV_ARCH (bfd_mach_frv, "frv", true, &arch_info_tomcat);
+
diff --git a/bfd/elf32-frv.c b/bfd/elf32-frv.c
new file mode 100644 (file)
index 0000000..cc26b96
--- /dev/null
@@ -0,0 +1,1405 @@
+/* FRV-specific support for 32-bit ELF.
+   Copyright (C) 2002 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"
+#include "elf-bfd.h"
+#include "elf/frv.h"
+
+/* Forward declarations.  */
+static bfd_reloc_status_type elf32_frv_relocate_lo16
+  PARAMS ((bfd *,  Elf_Internal_Rela *, bfd_byte *, bfd_vma));
+static bfd_reloc_status_type elf32_frv_relocate_hi16
+  PARAMS ((bfd *,  Elf_Internal_Rela *, bfd_byte *, bfd_vma));
+static bfd_reloc_status_type elf32_frv_relocate_label24
+  PARAMS ((bfd *, asection *, Elf_Internal_Rela *, bfd_byte *, bfd_vma));
+static bfd_reloc_status_type elf32_frv_relocate_gprel12
+  PARAMS ((struct bfd_link_info *, bfd *, asection *, Elf_Internal_Rela *, bfd_byte *, bfd_vma));
+static bfd_reloc_status_type elf32_frv_relocate_gprelu12
+  PARAMS ((struct bfd_link_info *, bfd *, asection *, Elf_Internal_Rela *, bfd_byte *, bfd_vma));
+static bfd_reloc_status_type elf32_frv_relocate_gprello
+  PARAMS ((struct bfd_link_info *, bfd *, asection *, Elf_Internal_Rela *, bfd_byte *, bfd_vma));
+static bfd_reloc_status_type elf32_frv_relocate_gprelhi
+  PARAMS ((struct bfd_link_info *, bfd *, asection *, Elf_Internal_Rela *, bfd_byte *, bfd_vma));
+static reloc_howto_type *frv_reloc_type_lookup
+  PARAMS ((bfd *, bfd_reloc_code_real_type));
+static void frv_info_to_howto_rela 
+  PARAMS ((bfd *, arelent *, Elf32_Internal_Rela *));
+static boolean elf32_frv_relocate_section 
+  PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
+static boolean elf32_frv_add_symbol_hook
+  PARAMS (( bfd *, struct bfd_link_info *, const Elf_Internal_Sym *, const char **, flagword *, asection **, bfd_vma *));
+static bfd_reloc_status_type frv_final_link_relocate
+  PARAMS ((reloc_howto_type *, bfd *, asection *, bfd_byte *, Elf_Internal_Rela *, bfd_vma));
+static boolean elf32_frv_gc_sweep_hook
+  PARAMS ((bfd *, struct bfd_link_info *, asection *, const Elf_Internal_Rela *));
+static asection * elf32_frv_gc_mark_hook
+  PARAMS ((bfd *, struct bfd_link_info *, Elf_Internal_Rela *, struct elf_link_hash_entry *, Elf_Internal_Sym *));
+static boolean elf32_frv_check_relocs
+  PARAMS ((bfd *, struct bfd_link_info *, asection *, const Elf_Internal_Rela *));
+static int elf32_frv_machine PARAMS ((bfd *));
+static boolean elf32_frv_object_p PARAMS ((bfd *));
+static boolean frv_elf_set_private_flags PARAMS ((bfd *, flagword));
+static boolean frv_elf_copy_private_bfd_data PARAMS ((bfd *, bfd *));
+static boolean frv_elf_merge_private_bfd_data PARAMS ((bfd *, bfd *));
+static boolean frv_elf_print_private_bfd_data PARAMS ((bfd *, PTR));
+
+static reloc_howto_type elf32_frv_howto_table [] =
+{
+  /* This reloc does nothing.  */
+  HOWTO (R_FRV_NONE,           /* type */
+        0,                     /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        32,                    /* bitsize */
+        false,                 /* pc_relative */
+        0,                     /* bitpos */
+        complain_overflow_bitfield, /* complain_on_overflow */
+        bfd_elf_generic_reloc, /* special_function */
+        "R_FRV_NONE",          /* name */
+        false,                 /* partial_inplace */
+        0,                     /* src_mask */
+        0,                     /* dst_mask */
+        false),                /* pcrel_offset */
+
+  /* A 32 bit absolute relocation.  */
+  HOWTO (R_FRV_32,             /* type */
+        0,                     /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        32,                    /* bitsize */
+        false,                 /* pc_relative */
+        0,                     /* bitpos */
+        complain_overflow_bitfield, /* complain_on_overflow */
+        bfd_elf_generic_reloc, /* special_function */
+        "R_FRV_32",            /* name */
+        false,                 /* partial_inplace */
+        0xffffffff,            /* src_mask */
+        0xffffffff,            /* dst_mask */
+        false),                /* pcrel_offset */
+
+  /* A 16 bit pc-relative relocation.  */
+  HOWTO (R_FRV_LABEL16,                /* type */
+        0,                     /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        16,                    /* bitsize */
+        true,                  /* pc_relative */
+        0,                     /* bitpos */
+        complain_overflow_bitfield, /* complain_on_overflow */
+        bfd_elf_generic_reloc, /* special_function */
+        "R_FRV_LABEL16",       /* name */
+        false,                 /* partial_inplace */
+        0xffff,                /* src_mask */
+        0xffff,                /* dst_mask */
+        true),                 /* pcrel_offset */
+
+  /* A 24-bit pc-relative relocation.  */
+  HOWTO (R_FRV_LABEL24,        /* type */
+        2,                     /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        26,                    /* bitsize */
+        true,                  /* pc_relative */
+        0,                     /* bitpos */
+        complain_overflow_bitfield, /* complain_on_overflow */
+        bfd_elf_generic_reloc, /* special_function */
+        "R_FRV_LABEL24",       /* name */
+        false,                 /* partial_inplace */
+        0x7e03ffff,            /* src_mask */
+        0x7e03ffff,            /* dst_mask */
+        true),                 /* pcrel_offset */
+
+  HOWTO (R_FRV_LO16,           /* type */
+        0,                     /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        16,                    /* bitsize */
+        false,                 /* pc_relative */
+        0,                     /* bitpos */
+        complain_overflow_dont, /* complain_on_overflow */
+        bfd_elf_generic_reloc, /* special_function */
+        "R_FRV_LO16",          /* name */
+       false,                  /* partial_inplace */
+        0xffff,                /* src_mask */
+        0xffff,                /* dst_mask */
+        false),                /* pcrel_offset */
+
+  HOWTO (R_FRV_HI16,           /* type */
+        0,                     /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        16,                    /* bitsize */
+        false,                 /* pc_relative */
+        0,                     /* bitpos */
+        complain_overflow_dont, /* complain_on_overflow */
+        bfd_elf_generic_reloc, /* special_function */
+        "R_FRV_HI16",          /* name */
+        false,                 /* partial_inplace */
+        0xffff,                /* src_mask */
+        0xffff,                /* dst_mask */
+        false),                /* pcrel_offset */
+
+  HOWTO (R_FRV_GPREL12,                /* type */
+        0,                     /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        12,                    /* bitsize */
+        false,                 /* pc_relative */
+        0,                     /* bitpos */
+        complain_overflow_dont, /* complain_on_overflow */
+        bfd_elf_generic_reloc, /* special_function */
+        "R_FRV_GPREL12",       /* name */
+        false,                 /* partial_inplace */
+        0xfff,                 /* src_mask */
+        0xfff,                 /* dst_mask */
+        false),                /* pcrel_offset */
+
+  HOWTO (R_FRV_GPRELU12,        /* type */
+        0,                     /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        12,                    /* bitsize */
+        false,                 /* pc_relative */
+        0,                     /* bitpos */
+        complain_overflow_dont, /* complain_on_overflow */
+        bfd_elf_generic_reloc, /* special_function */
+        "R_FRV_GPRELU12",      /* name */
+        false,                 /* partial_inplace */
+        0xfff,                 /* src_mask */
+        0x3f03f,               /* dst_mask */
+        false),                /* pcrel_offset */
+
+  HOWTO (R_FRV_GPREL32,         /* type */
+        0,                     /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        32,                    /* bitsize */
+        false,                 /* pc_relative */
+        0,                     /* bitpos */
+        complain_overflow_dont, /* complain_on_overflow */
+        bfd_elf_generic_reloc, /* special_function */
+        "R_FRV_GPREL32",       /* name */
+        false,                 /* partial_inplace */
+        0xffffffff,            /* src_mask */
+        0xffffffff,            /* dst_mask */
+        false),                /* pcrel_offset */
+
+  HOWTO (R_FRV_GPRELHI,                /* type */
+        0,                     /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        16,                    /* bitsize */
+        false,                 /* pc_relative */
+        0,                     /* bitpos */
+        complain_overflow_dont, /* complain_on_overflow */
+        bfd_elf_generic_reloc, /* special_function */
+        "R_FRV_GPRELHI",       /* name */
+        false,                 /* partial_inplace */
+        0xffff,                        /* src_mask */
+        0xffff,                /* dst_mask */
+        false),                /* pcrel_offset */
+
+  HOWTO (R_FRV_GPRELLO,                /* type */
+        0,                     /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        16,                    /* bitsize */
+        false,                 /* pc_relative */
+        0,                     /* bitpos */
+        complain_overflow_dont, /* complain_on_overflow */
+        bfd_elf_generic_reloc, /* special_function */
+        "R_FRV_GPRELLO",       /* name */
+        false,                 /* partial_inplace */
+        0xffff,                        /* src_mask */
+        0xffff,                /* dst_mask */
+        false),                /* pcrel_offset */
+};
+
+/* GNU extension to record C++ vtable hierarchy.  */
+static reloc_howto_type elf32_frv_vtinherit_howto =
+  HOWTO (R_FRV_GNU_VTINHERIT,   /* type */
+         0,                     /* rightshift */
+         2,                     /* size (0 = byte, 1 = short, 2 = long) */
+         0,                     /* bitsize */
+         false,                 /* pc_relative */
+         0,                     /* bitpos */
+         complain_overflow_dont, /* complain_on_overflow */
+         NULL,                  /* special_function */
+         "R_FRV_GNU_VTINHERIT", /* name */
+         false,                 /* partial_inplace */
+         0,                     /* src_mask */
+         0,                     /* dst_mask */
+         false);                /* pcrel_offset */
+
+  /* GNU extension to record C++ vtable member usage.  */
+static reloc_howto_type elf32_frv_vtentry_howto =
+  HOWTO (R_FRV_GNU_VTENTRY,     /* type */
+         0,                     /* rightshift */
+         2,                     /* size (0 = byte, 1 = short, 2 = long) */
+         0,                     /* bitsize */
+         false,                 /* pc_relative */
+         0,                     /* bitpos */
+         complain_overflow_dont, /* complain_on_overflow */
+         _bfd_elf_rel_vtable_reloc_fn,  /* special_function */
+         "R_FRV_GNU_VTENTRY",   /* name */
+         false,                 /* partial_inplace */
+         0,                     /* src_mask */
+         0,                     /* dst_mask */
+         false);                /* pcrel_offset */
+\f
+/* Map BFD reloc types to FRV ELF reloc types.  */
+#if 0
+struct frv_reloc_map
+{
+  unsigned int bfd_reloc_val;
+  unsigned int frv_reloc_val;
+};
+
+static const struct frv_reloc_map frv_reloc_map [] =
+{
+  { BFD_RELOC_NONE,           R_FRV_NONE },
+  { BFD_RELOC_32,             R_FRV_32 },
+  { BFD_RELOC_FRV_LABEL16,    R_FRV_LABEL16 },
+  { BFD_RELOC_FRV_LABEL24,    R_FRV_LABEL24 },
+  { BFD_RELOC_FRV_LO16,       R_FRV_LO16 },
+  { BFD_RELOC_FRV_HI16,       R_FRV_HI16 },
+  { BFD_RELOC_FRV_GPREL12,    R_FRV_GPREL12 },
+  { BFD_RELOC_FRV_GPRELU12,   R_FRV_GPRELU12 },
+  { BFD_RELOC_FRV_GPREL32,    R_FRV_GPREL32 },
+  { BFD_RELOC_FRV_GPRELHI,    R_FRV_GPRELHI },
+  { BFD_RELOC_FRV_GPRELLO,    R_FRV_GPRELLO },
+  { BFD_RELOC_VTABLE_INHERIT, R_FRV_GNU_VTINHERIT },
+  { BFD_RELOC_VTABLE_ENTRY,   R_FRV_GNU_VTENTRY },
+};
+#endif
+
+/* Handle an FRV small data reloc.  */
+
+static bfd_reloc_status_type
+elf32_frv_relocate_gprel12 (info, input_bfd, input_section, relocation, contents, value)
+     struct bfd_link_info *info;
+     bfd *input_bfd;
+     asection *input_section;
+     Elf_Internal_Rela *relocation;
+     bfd_byte *contents;
+     bfd_vma value;
+{
+  bfd_vma insn;
+  bfd_vma gp;
+  struct bfd_link_hash_entry *h;
+
+  h = bfd_link_hash_lookup (info->hash, "_gp", false, false, true);
+
+  gp = (h->u.def.value
+       + h->u.def.section->output_section->vma
+       + h->u.def.section->output_offset);
+
+  value -= input_section->output_section->vma;
+  value -= (gp - input_section->output_section->vma);
+
+  insn = bfd_get_32 (input_bfd, contents + relocation->r_offset);
+
+  value += relocation->r_addend;
+
+  if ((long) value > 0x7ff || (long) value < -0x800)
+    return bfd_reloc_overflow;
+
+  bfd_put_32 (input_bfd,
+             (insn & 0xfffff000) | (value & 0xfff),
+             contents + relocation->r_offset);
+
+  return bfd_reloc_ok;
+}
+
+/* Handle an FRV small data reloc. for the u12 field.  */
+
+static bfd_reloc_status_type
+elf32_frv_relocate_gprelu12 (info, input_bfd, input_section, relocation, contents, value)
+     struct bfd_link_info *info;
+     bfd *input_bfd;
+     asection *input_section;
+     Elf_Internal_Rela *relocation;
+     bfd_byte *contents;
+     bfd_vma value;
+{
+  bfd_vma insn;
+  bfd_vma gp;
+  struct bfd_link_hash_entry *h;
+  bfd_vma mask;
+
+  h = bfd_link_hash_lookup (info->hash, "_gp", false, false, true);
+
+  gp = (h->u.def.value
+       + h->u.def.section->output_section->vma
+       + h->u.def.section->output_offset);
+  value -= input_section->output_section->vma;
+  value -= (gp - input_section->output_section->vma);
+
+  insn = bfd_get_32 (input_bfd, contents + relocation->r_offset);
+
+  value += relocation->r_addend;
+
+  if ((long) value > 0x7ff || (long) value < -0x800)
+    return bfd_reloc_overflow;
+
+  /* The high 6 bits go into bits 17-12. The low 6 bits go into bits 5-0.  */
+  mask = 0x3f03f;
+  insn = (insn & ~mask) | ((value & 0xfc0) << 12) | (value & 0x3f);
+
+  bfd_put_32 (input_bfd, insn, contents + relocation->r_offset);
+
+  return bfd_reloc_ok;
+}
+
+/* Handle an FRV ELF HI16 reloc.  */
+
+static bfd_reloc_status_type
+elf32_frv_relocate_hi16 (input_bfd, relhi, contents, value)
+     bfd *input_bfd;
+     Elf_Internal_Rela *relhi;
+     bfd_byte *contents;
+     bfd_vma value;
+{
+  bfd_vma insn;
+
+  insn = bfd_get_32 (input_bfd, contents + relhi->r_offset);
+
+  value += relhi->r_addend;
+  value = ((value >> 16) & 0xffff);
+
+  insn = (insn & 0xffff0000) | value;
+
+  if ((long) value > 0xffff || (long) value < -0x10000)
+    return bfd_reloc_overflow;
+
+  bfd_put_32 (input_bfd, insn, contents + relhi->r_offset);
+  return bfd_reloc_ok;
+
+}
+static bfd_reloc_status_type
+elf32_frv_relocate_lo16 (input_bfd, rello, contents, value)
+     bfd *input_bfd;
+     Elf_Internal_Rela *rello;
+     bfd_byte *contents;
+     bfd_vma value;
+{
+  bfd_vma insn;
+
+  insn = bfd_get_32 (input_bfd, contents + rello->r_offset);
+
+  value += rello->r_addend;
+  value = value & 0xffff;
+
+  insn = (insn & 0xffff0000) | value;
+
+  if ((long) value > 0xffff || (long) value < -0x10000)
+    return bfd_reloc_overflow;
+
+  bfd_put_32 (input_bfd, insn, contents + rello->r_offset);
+  return bfd_reloc_ok;
+}
+
+/* Perform the relocation for the CALL label24 instruction.  */
+
+static bfd_reloc_status_type
+elf32_frv_relocate_label24 (input_bfd, input_section, rello, contents, value)
+     bfd *input_bfd;
+     asection *input_section;
+     Elf_Internal_Rela *rello;
+     bfd_byte *contents;
+     bfd_vma value;
+{
+  bfd_vma insn;
+  bfd_vma label6;
+  bfd_vma label18;
+
+  /* The format for the call instruction is:
+
+    0 000000 0001111 000000000000000000 
+      label6 opcode  label18
+
+    The branch calculation is: pc + (4*label24)
+    where label24 is the concatenation of label6 and label18.  */
+
+  /* Grab the instruction.  */
+  insn = bfd_get_32 (input_bfd, contents + rello->r_offset);
+
+  value -= input_section->output_section->vma + input_section->output_offset;
+  value -= rello->r_offset;
+  value += rello->r_addend;
+
+  value = value >> 2;
+
+  label6  = value & 0xfc0000;
+  label6  = label6 << 7;
+
+  label18 = value & 0x3ffff;
+
+  insn = insn & 0x803c0000;
+  insn = insn | label6;
+  insn = insn | label18;
+
+  bfd_put_32 (input_bfd, insn, contents + rello->r_offset);
+
+  return bfd_reloc_ok;
+}
+
+static bfd_reloc_status_type
+elf32_frv_relocate_gprelhi (info, input_bfd, input_section, relocation, contents, value)
+     struct bfd_link_info *info;
+     bfd *input_bfd;
+     asection *input_section;
+     Elf_Internal_Rela *relocation;
+     bfd_byte *contents;
+     bfd_vma value;
+{
+  bfd_vma insn;
+  bfd_vma gp;
+  struct bfd_link_hash_entry *h;
+
+  h = bfd_link_hash_lookup (info->hash, "_gp", false, false, true);
+
+  gp = (h->u.def.value
+        + h->u.def.section->output_section->vma
+        + h->u.def.section->output_offset);
+
+  value -= input_section->output_section->vma;
+  value -= (gp - input_section->output_section->vma);
+  value += relocation->r_addend;
+  value = ((value >> 16) & 0xffff);
+
+  if ((long) value > 0xffff || (long) value < -0x10000)
+    return bfd_reloc_overflow;
+
+  insn = bfd_get_32 (input_bfd, contents + relocation->r_offset);
+  insn = (insn & 0xffff0000) | value;
+
+  bfd_put_32 (input_bfd, insn, contents + relocation->r_offset);
+  return bfd_reloc_ok;
+}
+
+static bfd_reloc_status_type
+elf32_frv_relocate_gprello (info, input_bfd, input_section, relocation, contents, value)
+     struct bfd_link_info *info;
+     bfd *input_bfd;
+     asection *input_section;
+     Elf_Internal_Rela *relocation;
+     bfd_byte *contents;
+     bfd_vma value;
+{
+  bfd_vma insn;
+  bfd_vma gp;
+  struct bfd_link_hash_entry *h;
+
+  h = bfd_link_hash_lookup (info->hash, "_gp", false, false, true);
+
+  gp = (h->u.def.value
+        + h->u.def.section->output_section->vma
+        + h->u.def.section->output_offset);
+
+  value -= input_section->output_section->vma;
+  value -= (gp - input_section->output_section->vma);
+  value += relocation->r_addend;
+  value = value & 0xffff;
+
+  if ((long) value > 0xffff || (long) value < -0x10000)
+    return bfd_reloc_overflow;
+
+  insn = bfd_get_32 (input_bfd, contents + relocation->r_offset);
+  insn = (insn & 0xffff0000) | value;
+
+  bfd_put_32 (input_bfd, insn, contents + relocation->r_offset);
+
+ return bfd_reloc_ok;
+}
+
+static reloc_howto_type *
+frv_reloc_type_lookup (abfd, code)
+     bfd * abfd ATTRIBUTE_UNUSED;
+     bfd_reloc_code_real_type code;
+{
+  switch (code)
+    {
+    default:
+      break;
+
+    case BFD_RELOC_NONE:
+      return &elf32_frv_howto_table[ (int) R_FRV_NONE];
+  
+    case BFD_RELOC_32:
+    case BFD_RELOC_CTOR:
+      return &elf32_frv_howto_table[ (int) R_FRV_32];
+
+    case BFD_RELOC_FRV_LABEL16:
+      return &elf32_frv_howto_table[ (int) R_FRV_LABEL16];
+
+    case BFD_RELOC_FRV_LABEL24:
+      return &elf32_frv_howto_table[ (int) R_FRV_LABEL24];
+
+    case BFD_RELOC_FRV_LO16:
+      return &elf32_frv_howto_table[ (int) R_FRV_LO16];
+
+    case BFD_RELOC_FRV_HI16:
+      return &elf32_frv_howto_table[ (int) R_FRV_HI16];
+
+    case BFD_RELOC_FRV_GPREL12:
+      return &elf32_frv_howto_table[ (int) R_FRV_GPREL12];
+
+    case BFD_RELOC_FRV_GPRELU12:
+      return &elf32_frv_howto_table[ (int) R_FRV_GPRELU12];
+
+    case BFD_RELOC_FRV_GPREL32:
+      return &elf32_frv_howto_table[ (int) R_FRV_GPREL32];
+
+    case BFD_RELOC_FRV_GPRELHI:
+      return &elf32_frv_howto_table[ (int) R_FRV_GPRELHI];
+
+    case BFD_RELOC_FRV_GPRELLO:
+      return &elf32_frv_howto_table[ (int) R_FRV_GPRELLO];
+
+    case BFD_RELOC_VTABLE_INHERIT:
+      return &elf32_frv_vtinherit_howto;
+
+    case BFD_RELOC_VTABLE_ENTRY:
+      return &elf32_frv_vtentry_howto;
+    }
+
+  return NULL;
+}
+
+/* Set the howto pointer for an FRV ELF reloc.  */
+
+static void
+frv_info_to_howto_rela (abfd, cache_ptr, dst)
+     bfd * abfd ATTRIBUTE_UNUSED;
+     arelent * cache_ptr;
+     Elf32_Internal_Rela * dst;
+{
+  unsigned int r_type;
+
+  r_type = ELF32_R_TYPE (dst->r_info);
+  switch (r_type)
+    {
+    case R_FRV_GNU_VTINHERIT:
+      cache_ptr->howto = &elf32_frv_vtinherit_howto;
+      break;
+
+    case R_FRV_GNU_VTENTRY:
+      cache_ptr->howto = &elf32_frv_vtentry_howto;
+      break;
+
+    default:
+      cache_ptr->howto = & elf32_frv_howto_table [r_type];
+      break;
+    }
+}
+\f
+/* Perform a single relocation.  By default we use the standard BFD
+   routines, but a few relocs, we have to do them ourselves.  */
+
+static bfd_reloc_status_type
+frv_final_link_relocate (howto, input_bfd, input_section, contents, rel, relocation)
+     reloc_howto_type *  howto;
+     bfd *               input_bfd;
+     asection *          input_section;
+     bfd_byte *          contents;
+     Elf_Internal_Rela * rel;
+     bfd_vma             relocation;
+{
+  return _bfd_final_link_relocate (howto, input_bfd, input_section,
+                                  contents, rel->r_offset, relocation,
+                                  rel->r_addend);
+}
+
+\f
+/* Relocate an FRV ELF section.
+   There is some attempt to make this function usable for many architectures,
+   both USE_REL and USE_RELA ['twould be nice if such a critter existed],
+   if only to serve as a learning tool.
+
+   The RELOCATE_SECTION function is called by the new ELF backend linker
+   to handle the relocations for a section.
+
+   The relocs are always passed as Rela structures; if the section
+   actually uses Rel structures, the r_addend field will always be
+   zero.
+
+   This function is responsible for adjusting the section contents as
+   necessary, and (if using Rela relocs and generating a relocateable
+   output file) adjusting the reloc addend as necessary.
+
+   This function does not have to worry about setting the reloc
+   address or the reloc symbol index.
+
+   LOCAL_SYMS is a pointer to the swapped in local symbols.
+
+   LOCAL_SECTIONS is an array giving the section in the input file
+   corresponding to the st_shndx field of each local symbol.
+
+   The global hash table entry for the global symbols can be found
+   via elf_sym_hashes (input_bfd).
+
+   When generating relocateable output, this function must handle
+   STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
+   going to be the section symbol corresponding to the output
+   section, which means that the addend must be adjusted
+   accordingly.  */
+
+static boolean
+elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section,
+                          contents, relocs, local_syms, local_sections)
+     bfd *                   output_bfd ATTRIBUTE_UNUSED;
+     struct bfd_link_info *  info;
+     bfd *                   input_bfd;
+     asection *              input_section;
+     bfd_byte *              contents;
+     Elf_Internal_Rela *     relocs;
+     Elf_Internal_Sym *      local_syms;
+     asection **             local_sections;
+{
+  Elf_Internal_Shdr *           symtab_hdr;
+  struct elf_link_hash_entry ** sym_hashes;
+  Elf_Internal_Rela *           rel;
+  Elf_Internal_Rela *           relend;
+
+  symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
+  sym_hashes = elf_sym_hashes (input_bfd);
+  relend     = relocs + input_section->reloc_count;
+
+  for (rel = relocs; rel < relend; rel ++)
+    {
+      reloc_howto_type *           howto;
+      unsigned long                r_symndx;
+      Elf_Internal_Sym *           sym;
+      asection *                   sec;
+      struct elf_link_hash_entry * h;
+      bfd_vma                      relocation;
+      bfd_reloc_status_type        r;
+      const char *                 name = NULL;
+      int                          r_type;
+      
+      r_type = ELF32_R_TYPE (rel->r_info);
+      
+      if (   r_type == R_FRV_GNU_VTINHERIT
+         || r_type == R_FRV_GNU_VTENTRY)
+       continue;
+      
+      r_symndx = ELF32_R_SYM (rel->r_info);
+
+      if (info->relocateable)
+       {
+         /* This is a relocateable link.  We don't have to change
+             anything, unless the reloc is against a section symbol,
+             in which case we have to adjust according to where the
+             section symbol winds up in the output section.  */
+         if (r_symndx < symtab_hdr->sh_info)
+           {
+             sym = local_syms + r_symndx;
+             
+             if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
+               {
+                 sec = local_sections [r_symndx];
+                 rel->r_addend += sec->output_offset + sym->st_value;
+               }
+           }
+
+         continue;
+       }
+
+      /* This is a final link.  */
+      howto  = elf32_frv_howto_table + ELF32_R_TYPE (rel->r_info);
+      h      = NULL;
+      sym    = NULL;
+      sec    = NULL;
+      
+      if (r_symndx < symtab_hdr->sh_info)
+       {
+         sym = local_syms + r_symndx;
+         sec = local_sections [r_symndx];
+         relocation = (sec->output_section->vma
+                       + sec->output_offset
+                       + sym->st_value);
+         
+         name = bfd_elf_string_from_elf_section
+           (input_bfd, symtab_hdr->sh_link, sym->st_name);
+         name = (name == NULL) ? bfd_section_name (input_bfd, sec) : name;
+       }
+      else
+       {
+         h = sym_hashes [r_symndx - symtab_hdr->sh_info];
+         
+         while (h->root.type == bfd_link_hash_indirect
+                || h->root.type == bfd_link_hash_warning)
+           h = (struct elf_link_hash_entry *) h->root.u.i.link;
+
+         name = h->root.root.string;
+         
+         if (h->root.type == bfd_link_hash_defined
+             || h->root.type == bfd_link_hash_defweak)
+           {
+             sec = h->root.u.def.section;
+             relocation = (h->root.u.def.value
+                           + sec->output_section->vma
+                           + sec->output_offset);
+           }
+         else if (h->root.type == bfd_link_hash_undefweak)
+           {
+             relocation = 0;
+           }
+         else
+           {
+             if (! ((*info->callbacks->undefined_symbol)
+                    (info, h->root.root.string, input_bfd,
+                     input_section, rel->r_offset, true)))
+               return false;
+             relocation = 0;
+           }
+       }
+      
+     if (r_type == R_FRV_HI16)
+       r = elf32_frv_relocate_hi16 (input_bfd, rel, contents, relocation);
+
+     else if (r_type == R_FRV_LO16)
+       r = elf32_frv_relocate_lo16 (input_bfd, rel, contents, relocation);
+
+     else if (r_type == R_FRV_LABEL24)
+       r = elf32_frv_relocate_label24 (input_bfd, input_section, rel, contents, relocation);
+
+     else if (r_type == R_FRV_GPREL12)
+       r = elf32_frv_relocate_gprel12 (info, input_bfd, input_section, rel, contents, relocation);
+
+     else if (r_type == R_FRV_GPRELU12)
+       r = elf32_frv_relocate_gprelu12 (info, input_bfd, input_section, rel, contents, relocation);
+
+     else if (r_type == R_FRV_GPRELLO)
+       r = elf32_frv_relocate_gprello (info, input_bfd, input_section, rel, contents, relocation);
+
+     else if (r_type == R_FRV_GPRELHI)
+       r = elf32_frv_relocate_gprelhi (info, input_bfd, input_section, rel, contents, relocation);
+
+     else
+       r = frv_final_link_relocate (howto, input_bfd, input_section, contents, rel, relocation);
+
+      if (r != bfd_reloc_ok)
+       {
+         const char * msg = (const char *) NULL;
+
+         switch (r)
+           {
+           case bfd_reloc_overflow:
+             r = info->callbacks->reloc_overflow
+               (info, name, howto->name, (bfd_vma) 0,
+                input_bfd, input_section, rel->r_offset);
+             break;
+             
+           case bfd_reloc_undefined:
+             r = info->callbacks->undefined_symbol
+               (info, name, input_bfd, input_section, rel->r_offset, true);
+             break;
+             
+           case bfd_reloc_outofrange:
+             msg = _("internal error: out of range error");
+             break;
+
+           case bfd_reloc_notsupported:
+             msg = _("internal error: unsupported relocation error");
+             break;
+
+           case bfd_reloc_dangerous:
+             msg = _("internal error: dangerous relocation");
+             break;
+
+           default:
+             msg = _("internal error: unknown error");
+             break;
+           }
+
+         if (msg)
+           r = info->callbacks->warning
+             (info, msg, name, input_bfd, input_section, rel->r_offset);
+
+         if (! r)
+           return false;
+       }
+    }
+
+  return true;
+}
+\f
+/* Return the section that should be marked against GC for a given
+   relocation.  */
+
+static asection *
+elf32_frv_gc_mark_hook (abfd, info, rel, h, sym)
+     bfd *                        abfd;
+     struct bfd_link_info *       info ATTRIBUTE_UNUSED;
+     Elf_Internal_Rela *          rel;
+     struct elf_link_hash_entry * h;
+     Elf_Internal_Sym *           sym;
+{
+  if (h != NULL)
+    {
+      switch (ELF32_R_TYPE (rel->r_info))
+       {
+       case R_FRV_GNU_VTINHERIT:
+       case R_FRV_GNU_VTENTRY:
+         break;
+
+       default:
+         switch (h->root.type)
+           {
+           default:
+             break;
+
+           case bfd_link_hash_defined:
+           case bfd_link_hash_defweak:
+             return h->root.u.def.section;
+
+           case bfd_link_hash_common:
+             return h->root.u.c.p->section;
+           }
+       }
+    }
+  else
+    {
+      if (!(elf_bad_symtab (abfd)
+           && ELF_ST_BIND (sym->st_info) != STB_LOCAL)
+         && ! ((sym->st_shndx <= 0 || sym->st_shndx >= SHN_LORESERVE)
+               && sym->st_shndx != SHN_COMMON))
+       return bfd_section_from_elf_index (abfd, sym->st_shndx);
+    }
+
+  return NULL;
+}
+
+/* Update the got entry reference counts for the section being removed.  */
+
+static boolean
+elf32_frv_gc_sweep_hook (abfd, info, sec, relocs)
+     bfd *                     abfd ATTRIBUTE_UNUSED;
+     struct bfd_link_info *    info ATTRIBUTE_UNUSED;
+     asection *                sec ATTRIBUTE_UNUSED;
+     const Elf_Internal_Rela * relocs ATTRIBUTE_UNUSED;
+{
+  return true;
+}
+
+\f
+/* Hook called by the linker routine which adds symbols from an object
+   file.  We use it to put .comm items in .scomm, and not .comm.  */
+
+static boolean
+elf32_frv_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp)
+     bfd *abfd;
+     struct bfd_link_info *info;
+     const Elf_Internal_Sym *sym;
+     const char **namep ATTRIBUTE_UNUSED;
+     flagword *flagsp ATTRIBUTE_UNUSED;
+     asection **secp;
+     bfd_vma *valp;
+{
+  if (sym->st_shndx == SHN_COMMON
+      && !info->relocateable
+      && (int)sym->st_size <= (int)bfd_get_gp_size (abfd))
+    {
+      /* Common symbols less than or equal to -G nn bytes are
+        automatically put into .sbss.  */
+
+      asection *scomm = bfd_get_section_by_name (abfd, ".scommon");
+
+      if (scomm == NULL)
+       {
+         scomm = bfd_make_section (abfd, ".scommon");
+         if (scomm == NULL
+             || !bfd_set_section_flags (abfd, scomm, (SEC_ALLOC
+                                                      | SEC_IS_COMMON
+                                                      | SEC_LINKER_CREATED)))
+           return false;
+       }
+
+      *secp = scomm;
+      *valp = sym->st_size;
+    }
+
+  return true;
+}
+/* Look through the relocs for a section during the first phase.
+   Since we don't do .gots or .plts, we just need to consider the
+   virtual table relocs for gc.  */
+static boolean
+elf32_frv_check_relocs (abfd, info, sec, relocs)
+     bfd *abfd;
+     struct bfd_link_info *info;
+     asection *sec;
+     const Elf_Internal_Rela *relocs;
+{
+  Elf_Internal_Shdr *symtab_hdr;
+  struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
+  const Elf_Internal_Rela *rel;
+  const Elf_Internal_Rela *rel_end;
+  if (info->relocateable)
+    return true;
+  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
+  sym_hashes = elf_sym_hashes (abfd);
+  sym_hashes_end = sym_hashes + symtab_hdr->sh_size/sizeof(Elf32_External_Sym);
+  if (!elf_bad_symtab (abfd))
+    sym_hashes_end -= symtab_hdr->sh_info;
+  rel_end = relocs + sec->reloc_count;
+  for (rel = relocs; rel < rel_end; rel++)
+    {
+      struct elf_link_hash_entry *h;
+      unsigned long r_symndx;
+      r_symndx = ELF32_R_SYM (rel->r_info);
+      if (r_symndx < symtab_hdr->sh_info)
+        h = NULL;
+      else
+        h = sym_hashes[r_symndx - symtab_hdr->sh_info];
+      switch (ELF32_R_TYPE (rel->r_info))
+        {
+        /* This relocation describes the C++ object vtable hierarchy.
+           Reconstruct it for later use during GC.  */
+        case R_FRV_GNU_VTINHERIT:
+          if (!_bfd_elf32_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
+            return false;
+          break;
+        /* This relocation describes which C++ vtable entries are actually
+           used.  Record for later use during GC.  */
+        case R_FRV_GNU_VTENTRY:
+          if (!_bfd_elf32_gc_record_vtentry (abfd, sec, h, rel->r_addend))
+            return false;
+          break;
+        }
+    }
+  return true;
+}
+
+\f
+/* Return the machine subcode from the ELF e_flags header.  */
+
+static int
+elf32_frv_machine (abfd)
+     bfd *abfd;
+{
+  switch (elf_elfheader (abfd)->e_flags & EF_FRV_CPU_MASK)
+    {
+    default:               break;
+    case EF_FRV_CPU_FR500:  return bfd_mach_fr500;
+    case EF_FRV_CPU_FR400:  return bfd_mach_fr400;
+    case EF_FRV_CPU_FR300:  return bfd_mach_fr300;
+    case EF_FRV_CPU_SIMPLE: return bfd_mach_frvsimple;
+    case EF_FRV_CPU_TOMCAT: return bfd_mach_frvtomcat;
+    }
+
+  return bfd_mach_frv;
+}
+
+/* Set the right machine number for a FRV ELF file.  */
+
+static boolean
+elf32_frv_object_p (abfd)
+     bfd *abfd;
+{
+  bfd_default_set_arch_mach (abfd, bfd_arch_frv, elf32_frv_machine (abfd));
+  return true;
+}
+\f
+/* Function to set the ELF flag bits.  */
+
+static boolean
+frv_elf_set_private_flags (abfd, flags)
+     bfd *abfd;
+     flagword flags;
+{
+  elf_elfheader (abfd)->e_flags = flags;
+  elf_flags_init (abfd) = true;
+  return true;
+}
+
+/* Copy backend specific data from one object module to another.  */
+
+static boolean
+frv_elf_copy_private_bfd_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;
+
+  BFD_ASSERT (!elf_flags_init (obfd)
+             || elf_elfheader (obfd)->e_flags == elf_elfheader (ibfd)->e_flags);
+
+  elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
+  elf_flags_init (obfd) = true;
+  return true;
+}
+
+/* Merge backend specific data from an object file to the output
+   object file when linking.  */
+
+static boolean
+frv_elf_merge_private_bfd_data (ibfd, obfd)
+     bfd *ibfd;
+     bfd *obfd;
+{
+  flagword old_flags, old_partial;
+  flagword new_flags, new_partial;
+  boolean error = false;
+  char new_opt[80];
+  char old_opt[80];
+
+  new_opt[0] = old_opt[0] = '\0';
+  new_flags = elf_elfheader (ibfd)->e_flags;
+  old_flags = elf_elfheader (obfd)->e_flags;
+
+#ifdef DEBUG
+  (*_bfd_error_handler) ("old_flags = 0x%.8lx, new_flags = 0x%.8lx, init = %s, filename = %s",
+                        old_flags, new_flags, elf_flags_init (obfd) ? "yes" : "no",
+                        bfd_get_filename (ibfd));
+#endif
+
+  if (!elf_flags_init (obfd))                  /* First call, no flags set.  */
+    {
+      elf_flags_init (obfd) = true;
+      old_flags = new_flags;
+    }
+
+  else if (new_flags == old_flags)             /* Compatible flags are ok.  */
+    ;
+
+  else                                         /* Possibly incompatible flags.  */
+    {
+      /* Warn if different # of gprs are used.  Note, 0 means nothing is
+         said about the size of gprs.  */
+      new_partial = (new_flags & EF_FRV_GPR_MASK);
+      old_partial = (old_flags & EF_FRV_GPR_MASK);
+      if (new_partial == old_partial)
+       ;
+
+      else if (new_partial == 0)
+       ;
+
+      else if (old_partial == 0)
+       old_flags |= new_partial;
+
+      else
+       {
+         switch (new_partial)
+           {
+           default:            strcat (new_opt, " -mgpr-??"); break;
+           case EF_FRV_GPR_32: strcat (new_opt, " -mgpr-32"); break;
+           case EF_FRV_GPR_64: strcat (new_opt, " -mgpr-64"); break;
+           }
+
+         switch (old_partial)
+           {
+           default:            strcat (old_opt, " -mgpr-??"); break;
+           case EF_FRV_GPR_32: strcat (old_opt, " -mgpr-32"); break;
+           case EF_FRV_GPR_64: strcat (old_opt, " -mgpr-64"); break;
+           }
+       }
+
+      /* Warn if different # of fprs are used.  Note, 0 means nothing is
+         said about the size of fprs.  */
+      new_partial = (new_flags & EF_FRV_FPR_MASK);
+      old_partial = (old_flags & EF_FRV_FPR_MASK);
+      if (new_partial == old_partial)
+       ;
+
+      else if (new_partial == 0)
+       ;
+
+      else if (old_partial == 0)
+       old_flags |= new_partial;
+
+      else
+       {
+         switch (new_partial)
+           {
+           default:              strcat (new_opt, " -mfpr-?");      break;
+           case EF_FRV_FPR_32:   strcat (new_opt, " -mfpr-32");     break;
+           case EF_FRV_FPR_64:   strcat (new_opt, " -mfpr-64");     break;
+           case EF_FRV_FPR_NONE: strcat (new_opt, " -msoft-float"); break;
+           }
+
+         switch (old_partial)
+           {
+           default:              strcat (old_opt, " -mfpr-?");      break;
+           case EF_FRV_FPR_32:   strcat (old_opt, " -mfpr-32");     break;
+           case EF_FRV_FPR_64:   strcat (old_opt, " -mfpr-64");     break;
+           case EF_FRV_FPR_NONE: strcat (old_opt, " -msoft-float"); break;
+           }
+       }
+
+      /* Warn if different dword support was used.  Note, 0 means nothing is
+         said about the dword support.  */
+      new_partial = (new_flags & EF_FRV_DWORD_MASK);
+      old_partial = (old_flags & EF_FRV_DWORD_MASK);
+      if (new_partial == old_partial)
+       ;
+
+      else if (new_partial == 0)
+       ;
+
+      else if (old_partial == 0)
+       old_flags |= new_partial;
+
+      else
+       {
+         switch (new_partial)
+           {
+           default:               strcat (new_opt, " -mdword-?");  break;
+           case EF_FRV_DWORD_YES: strcat (new_opt, " -mdword");    break;
+           case EF_FRV_DWORD_NO:  strcat (new_opt, " -mno-dword"); break;
+           }
+
+         switch (old_partial)
+           {
+           default:               strcat (old_opt, " -mdword-?");  break;
+           case EF_FRV_DWORD_YES: strcat (old_opt, " -mdword");    break;
+           case EF_FRV_DWORD_NO:  strcat (old_opt, " -mno-dword"); break;
+           }
+       }
+
+      /* Or in flags that accumulate (ie, if one module uses it, mark that the
+        feature is used.  */
+      old_flags |= new_flags & (EF_FRV_DOUBLE
+                               | EF_FRV_MEDIA
+                               | EF_FRV_MULADD
+                               | EF_FRV_NON_PIC_RELOCS);
+
+      /* If any module was compiled without -G0, clear the G0 bit.  */
+      old_flags = ((old_flags & ~ EF_FRV_G0)
+                  | (old_flags & new_flags & EF_FRV_G0));
+
+      /* If any module was compiled without -mnopack, clear the mnopack bit.  */
+      old_flags = ((old_flags & ~ EF_FRV_NOPACK)
+                  | (old_flags & new_flags & EF_FRV_NOPACK));
+
+      /* We don't have to do anything if the pic flags are the same, or the new
+         module(s) were compiled with -mlibrary-pic.  */
+      new_partial = (new_flags & EF_FRV_PIC_FLAGS);
+      old_partial = (old_flags & EF_FRV_PIC_FLAGS);
+      if ((new_partial == old_partial) || ((new_partial & EF_FRV_LIBPIC) != 0))
+       ;
+
+      /* If the old module(s) were compiled with -mlibrary-pic, copy in the pic
+         flags if any from the new module.  */
+      else if ((old_partial & EF_FRV_LIBPIC) != 0)
+       old_flags = (old_flags & ~ EF_FRV_PIC_FLAGS) | new_partial;
+
+      /* If we have mixtures of -fpic and -fPIC, or in both bits.  */
+      else if (new_partial != 0 && old_partial != 0)
+       old_flags |= new_partial;
+
+      /* One module was compiled for pic and the other was not, see if we have
+         had any relocations that are not pic-safe.  */
+      else
+       {
+         if ((old_flags & EF_FRV_NON_PIC_RELOCS) == 0)
+           old_flags |= new_partial;
+         else
+           {
+             old_flags &= ~ EF_FRV_PIC_FLAGS;
+#ifndef FRV_NO_PIC_ERROR
+             error = true;
+             (*_bfd_error_handler)
+               (_("%s: compiled with %s and linked with modules that use non-pic relocations"),
+                bfd_get_filename (ibfd),
+                (new_flags & EF_FRV_BIGPIC) ? "-fPIC" : "-fpic");
+#endif
+           }
+       }
+
+      /* Warn if different cpu is used (allow a specific cpu to override
+        the generic cpu).  */
+      new_partial = (new_flags & EF_FRV_CPU_MASK);
+      old_partial = (old_flags & EF_FRV_CPU_MASK);
+      if (new_partial == old_partial)
+       ;
+
+      else if (new_partial == EF_FRV_CPU_GENERIC)
+       ;
+
+      else if (old_partial == EF_FRV_CPU_GENERIC)
+       old_flags = (old_flags & ~EF_FRV_CPU_MASK) | new_partial;
+
+      else
+       {
+         switch (new_partial)
+           {
+           default:                 strcat (new_opt, " -mcpu=?");      break;
+           case EF_FRV_CPU_GENERIC: strcat (new_opt, " -mcpu=frv");    break;
+           case EF_FRV_CPU_SIMPLE:  strcat (new_opt, " -mcpu=simple"); break;
+           case EF_FRV_CPU_FR500:   strcat (new_opt, " -mcpu=fr500");  break;
+           case EF_FRV_CPU_FR400:   strcat (new_opt, " -mcpu=fr400");  break;
+           case EF_FRV_CPU_FR300:   strcat (new_opt, " -mcpu=fr300");  break;
+           case EF_FRV_CPU_TOMCAT:  strcat (new_opt, " -mcpu=tomcat"); break;
+           }
+
+         switch (old_partial)
+           {
+           default:                 strcat (old_opt, " -mcpu=?");      break;
+           case EF_FRV_CPU_GENERIC: strcat (old_opt, " -mcpu=frv");    break;
+           case EF_FRV_CPU_SIMPLE:  strcat (old_opt, " -mcpu=simple"); break;
+           case EF_FRV_CPU_FR500:   strcat (old_opt, " -mcpu=fr500");  break;
+           case EF_FRV_CPU_FR400:   strcat (old_opt, " -mcpu=fr400");  break;
+           case EF_FRV_CPU_FR300:   strcat (old_opt, " -mcpu=fr300");  break;
+           case EF_FRV_CPU_TOMCAT:  strcat (old_opt, " -mcpu=tomcat"); break;
+           }
+       }
+      
+      /* Print out any mismatches from above.  */
+      if (new_opt[0])
+       {
+         error = true;
+         (*_bfd_error_handler)
+           (_("%s: compiled with %s and linked with modules compiled with %s"),
+            bfd_get_filename (ibfd), new_opt, old_opt);
+       }
+
+      /* Warn about any other mismatches */
+      new_partial = (new_flags & ~ EF_FRV_ALL_FLAGS);
+      old_partial = (old_flags & ~ EF_FRV_ALL_FLAGS);
+      if (new_partial != old_partial)
+       {
+         old_flags |= new_partial;
+         error = true;
+         (*_bfd_error_handler)
+           (_("%s: uses different unknown e_flags (0x%lx) fields than previous modules (0x%lx)"),
+            bfd_get_filename (ibfd), (long)new_partial, (long)old_partial);
+       }
+    }
+
+  /* If the cpu is -mcpu=simple, then set the -mnopack bit.  */
+  if ((old_flags & EF_FRV_CPU_MASK) == EF_FRV_CPU_SIMPLE)
+    old_flags |= EF_FRV_NOPACK;
+
+  /* Update the old flags now with changes made above.  */
+  old_partial = elf_elfheader (obfd)->e_flags & EF_FRV_CPU_MASK;
+  elf_elfheader (obfd)->e_flags = old_flags;
+  if (old_partial != (old_flags & EF_FRV_CPU_MASK))
+    bfd_default_set_arch_mach (obfd, bfd_arch_frv, elf32_frv_machine (obfd));
+
+  if (error)
+    bfd_set_error (bfd_error_bad_value);
+
+  return !error;
+}
+
+\f
+boolean
+frv_elf_print_private_bfd_data (abfd, ptr)
+     bfd *abfd;
+     PTR ptr;
+{
+  FILE *file = (FILE *) ptr;
+  flagword flags;
+
+  BFD_ASSERT (abfd != NULL && ptr != NULL);
+
+  /* Print normal ELF private data.  */
+  _bfd_elf_print_private_bfd_data (abfd, ptr);
+
+  flags = elf_elfheader (abfd)->e_flags;
+  fprintf (file, _("private flags = 0x%lx:"), (long)flags);
+
+  switch (flags & EF_FRV_CPU_MASK)
+    {
+    default:                                                   break;
+    case EF_FRV_CPU_SIMPLE: fprintf (file, " -mcpu=simple");   break;
+    case EF_FRV_CPU_FR500:  fprintf (file, " -mcpu=fr500");    break;
+    case EF_FRV_CPU_FR400:  fprintf (file, " -mcpu=fr400");    break;
+    case EF_FRV_CPU_FR300:  fprintf (file, " -mcpu=fr300");    break;
+    case EF_FRV_CPU_TOMCAT: fprintf (file, " -mcpu=tomcat");   break;
+    }
+
+  switch (flags & EF_FRV_GPR_MASK)
+    {
+    default:                                                   break;
+    case EF_FRV_GPR_32: fprintf (file, " -mgpr-32");           break;
+    case EF_FRV_GPR_64: fprintf (file, " -mgpr-64");           break;
+    }
+
+  switch (flags & EF_FRV_FPR_MASK)
+    {
+    default:                                                   break;
+    case EF_FRV_FPR_32:   fprintf (file, " -mfpr-32");         break;
+    case EF_FRV_FPR_64:   fprintf (file, " -mfpr-64");         break;
+    case EF_FRV_FPR_NONE: fprintf (file, " -msoft-float");     break;
+    }
+
+  switch (flags & EF_FRV_DWORD_MASK)
+    {
+    default:                                                   break;
+    case EF_FRV_DWORD_YES: fprintf (file, " -mdword");         break;
+    case EF_FRV_DWORD_NO:  fprintf (file, " -mno-dword");      break;
+    }
+
+  if (flags & EF_FRV_DOUBLE)
+    fprintf (file, " -mdouble");
+
+  if (flags & EF_FRV_MEDIA)
+    fprintf (file, " -mmedia");
+
+  if (flags & EF_FRV_MULADD)
+    fprintf (file, " -mmuladd");
+
+  if (flags & EF_FRV_PIC)
+    fprintf (file, " -fpic");
+
+  if (flags & EF_FRV_BIGPIC)
+    fprintf (file, " -fPIC");
+
+  if (flags & EF_FRV_NON_PIC_RELOCS)
+    fprintf (file, " non-pic relocations");
+
+  if (flags & EF_FRV_G0)
+    fprintf (file, " -G0");
+
+  fputc ('\n', file);
+  return true;
+}
+
+\f
+#define ELF_ARCH               bfd_arch_frv
+#define ELF_MACHINE_CODE       EM_CYGNUS_FRV
+#define ELF_MAXPAGESIZE                0x1000
+
+#define TARGET_BIG_SYM          bfd_elf32_frv_vec
+#define TARGET_BIG_NAME                "elf32-frv"
+
+#define elf_info_to_howto_rel                  NULL
+#define elf_info_to_howto                      frv_info_to_howto_rela
+#define elf_backend_relocate_section           elf32_frv_relocate_section
+#define elf_backend_gc_mark_hook               elf32_frv_gc_mark_hook
+#define elf_backend_gc_sweep_hook              elf32_frv_gc_sweep_hook
+#define elf_backend_check_relocs                elf32_frv_check_relocs
+#define elf_backend_object_p                   elf32_frv_object_p
+#define elf_backend_add_symbol_hook             elf32_frv_add_symbol_hook
+
+#define elf_backend_can_gc_sections            1
+
+#define bfd_elf32_bfd_reloc_type_lookup                frv_reloc_type_lookup
+#define bfd_elf32_bfd_set_private_flags                frv_elf_set_private_flags
+#define bfd_elf32_bfd_copy_private_bfd_data    frv_elf_copy_private_bfd_data
+#define bfd_elf32_bfd_merge_private_bfd_data   frv_elf_merge_private_bfd_data
+#define bfd_elf32_bfd_print_private_bfd_data   frv_elf_print_private_bfd_data
+
+#include "elf32-target.h"
index 086d802..dce7d0d 100644 (file)
@@ -67,6 +67,7 @@ cpu-d10v.c
 cpu-d30v.c
 cpu-dlx.c
 cpu-fr30.c
+cpu-frv.c
 cpu-h8300.c
 cpu-h8500.c
 cpu-hppa.c
@@ -127,6 +128,7 @@ elf32-d10v.c
 elf32-d30v.c
 elf32-dlx.c
 elf32-fr30.c
+elf32-frv.c
 elf32-gen.c
 elf32-h8300.c
 elf32-hppa.c
index 8af90fc..8d5ee15 100644 (file)
@@ -2079,6 +2079,27 @@ ENUMX
 ENUMX
   BFD_RELOC_MIPS_JALR
 COMMENT
+ENUM
+  BFD_RELOC_FRV_LABEL16
+ENUMX
+  BFD_RELOC_FRV_LABEL24
+ENUMX
+  BFD_RELOC_FRV_LO16
+ENUMX
+  BFD_RELOC_FRV_HI16
+ENUMX
+  BFD_RELOC_FRV_GPREL12
+ENUMX
+  BFD_RELOC_FRV_GPRELU12
+ENUMX
+  BFD_RELOC_FRV_GPREL32
+ENUMX
+  BFD_RELOC_FRV_GPRELHI
+ENUMX
+  BFD_RELOC_FRV_GPRELLO
+ENUMDOC
+  Fujitsu Frv Relocations.
+COMMENT
 COMMENT
 ENUMDOC
   MIPS ELF relocations.
index 9a8bed2..49fd7d0 100644 (file)
@@ -514,6 +514,7 @@ extern const bfd_target bfd_elf32_d10v_vec;
 extern const bfd_target bfd_elf32_d30v_vec;
 extern const bfd_target bfd_elf32_dlx_big_vec;
 extern const bfd_target bfd_elf32_fr30_vec;
+extern const bfd_target bfd_elf32_frv_vec;
 extern const bfd_target bfd_elf32_h8300_vec;
 extern const bfd_target bfd_elf32_hppa_linux_vec;
 extern const bfd_target bfd_elf32_hppa_vec;
@@ -772,6 +773,7 @@ static const bfd_target * const _bfd_target_vector[] = {
        &bfd_elf32_d30v_vec,
        &bfd_elf32_dlx_big_vec,
        &bfd_elf32_fr30_vec,
+       &bfd_elf32_frv_vec,
        &bfd_elf32_h8300_vec,
        &bfd_elf32_hppa_linux_vec,
        &bfd_elf32_hppa_vec,