|
@@ -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
|
|
|
+
|