450-mips-restore-embedded-pic is I believe the minimum necessary to get gcc
authorEric Andersen <andersen@codepoet.org>
Wed, 2 Mar 2005 11:15:05 +0000 (11:15 -0000)
committerEric Andersen <andersen@codepoet.org>
Wed, 2 Mar 2005 11:15:05 +0000 (11:15 -0000)
3.3.x to compile again on mips.  As was, compiling gcc 3.3.x for mips would
cause gcc to blow up whining about combining symbols from different segments,
since stock binutils no longer supports the PC relative expressions emitted by
gcc 3.3.x for mips when generating embedded PIC code.

toolchain/binutils/2.15.94.0.2.2/450-mips-restore-embedded-pic.patch [new file with mode: 0644]

diff --git a/toolchain/binutils/2.15.94.0.2.2/450-mips-restore-embedded-pic.patch b/toolchain/binutils/2.15.94.0.2.2/450-mips-restore-embedded-pic.patch
new file mode 100644 (file)
index 0000000..93c1c59
--- /dev/null
@@ -0,0 +1,75 @@
+--- binutils/gas/config/tc-mips.c.orig 2004-12-20 12:16:50.000000000 -0700
++++ binutils/gas/config/tc-mips.c      2005-03-02 03:42:08.000000000 -0700
+@@ -10955,8 +10955,6 @@
+   buf = (bfd_byte *) (fixP->fx_frag->fr_literal + fixP->fx_where);
+-  assert (! fixP->fx_pcrel);
+-
+   /* Don't treat parts of a composite relocation as done.  There are two
+      reasons for this:
+@@ -11000,7 +10998,6 @@
+     case BFD_RELOC_MIPS_CALL_HI16:
+     case BFD_RELOC_MIPS_CALL_LO16:
+     case BFD_RELOC_MIPS16_GPREL:
+-      assert (! fixP->fx_pcrel);
+       /* Nothing needed to do. The value comes from the reloc entry */
+       break;
+@@ -12867,8 +12864,23 @@
+   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
+   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
+-  assert (! fixp->fx_pcrel);
+-  reloc->addend = fixp->fx_addnumber;
++  if (fixp->fx_pcrel)
++    {
++      if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
++      {
++        /* At this point, fx_addnumber is "symbol offset - reloc->address".
++           Relocations want only the symbol offset.  */
++        reloc->addend = fixp->fx_addnumber + reloc->address;
++      }
++      else
++      {
++        /* A gruesome hack which is a result of the gruesome gas reloc
++           handling.  */
++        reloc->addend = reloc->address;
++      }
++    }
++  else
++    reloc->addend = fixp->fx_addnumber;
+   /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
+      entry to be used in the relocation's section offset.  */
+@@ -12879,6 +12891,16 @@
+     }
+   code = fixp->fx_r_type;
++  if (fixp->fx_pcrel)
++    {
++      if (code == BFD_RELOC_32)
++        code = BFD_RELOC_32_PCREL;
++      else
++        as_bad_where (fixp->fx_file, fixp->fx_line,
++                   _("Cannot make %s relocation PC relative"),
++                   bfd_get_reloc_code_name (code));
++    }
++  
+   /* To support a PC relative reloc, we used a Cygnus extension.
+      We check for that here to make sure that we don't let such a
+--- binutils/gas/config/tc-mips.h      29 Apr 2004 05:14:22 -0000      1.35
++++ binutils/gas/config/tc-mips.h      5 May 2004 17:38:51 -0000
+@@ -58,6 +58,10 @@
+ #define MAX_MEM_FOR_RS_ALIGN_CODE  (1 + 2)
++/* We permit PC relative difference expressions when generating
++   embedded PIC code.  */
++#define DIFF_EXPR_OK
++
+ /* Tell assembler that we have an itbl_mips.h header file to include.  */
+ #define HAVE_ITBL_CPU