-Index: bfd/ChangeLog
-===================================================================
-RCS file: /cvsroot/gcc/src-cvs/src/bfd/ChangeLog,v
-retrieving revision 1.2535
-diff -u -r1.2535 ChangeLog
---- bfd/ChangeLog 3 May 2004 14:52:01 -0000 1.2535
-+++ bfd/ChangeLog 5 May 2004 17:38:51 -0000
-@@ -1,0 +1,12 @@
-+2004-05-05 David Ung <davidu@mips.com>
-+
-+ * elfxx-mips.c (mips_elf_calculate_relocation): Put back cases for
-+ R_MIPS_PC32 and R_MIPS_PC64.
-+
-+ * elf32-mips.c: Put back elf_mips_gnu_pcrel64 and
-+ elf_mips_gnu_pcrel32.
-+ (bfd_elf32_bfd_reloc_type_lookup): Put back cases for
-+ BFD_RELOC_64_PCREL and BFD_RELOC_32_PCREL.
-+ (mips_elf32_rtype_to_howto): Put back cases for R_MIPS_PC32 and
-+ R_MIPS_PC64.
-+
-Index: bfd/elf32-mips.c
-===================================================================
-RCS file: /cvsroot/gcc/src-cvs/src/bfd/elf32-mips.c,v
-retrieving revision 1.175
-diff -u -r1.175 elf32-mips.c
---- bfd/elf32-mips.c 24 Apr 2004 22:07:13 -0000 1.175
-+++ bfd/elf32-mips.c 5 May 2004 17:38:51 -0000
-@@ -615,6 +615,38 @@
- 0xffff, /* dst_mask */
- TRUE); /* pcrel_offset */
-
-+/* 64 bit pc-relative. */
-+static reloc_howto_type elf_mips_gnu_pcrel64 =
-+ HOWTO (R_MIPS_PC64, /* type */
-+ 0, /* rightshift */
-+ 4, /* size (0 = byte, 1 = short, 2 = long) */
-+ 64, /* bitsize */
-+ TRUE, /* pc_relative */
-+ 0, /* bitpos */
-+ complain_overflow_signed, /* complain_on_overflow */
-+ _bfd_mips_elf_generic_reloc, /* special_function */
-+ "R_MIPS_PC64", /* name */
-+ TRUE, /* partial_inplace */
-+ MINUS_ONE, /* src_mask */
-+ MINUS_ONE, /* dst_mask */
-+ TRUE); /* pcrel_offset */
-+
-+/* 32 bit pc-relative. */
-+static reloc_howto_type elf_mips_gnu_pcrel32 =
-+ HOWTO (R_MIPS_PC32, /* type */
-+ 0, /* rightshift */
-+ 2, /* size (0 = byte, 1 = short, 2 = long) */
-+ 32, /* bitsize */
-+ TRUE, /* pc_relative */
-+ 0, /* bitpos */
-+ complain_overflow_signed, /* complain_on_overflow */
-+ _bfd_mips_elf_generic_reloc, /* special_function */
-+ "R_MIPS_PC32", /* name */
-+ TRUE, /* partial_inplace */
-+ 0xffffffff, /* src_mask */
-+ 0xffffffff, /* dst_mask */
-+ TRUE); /* pcrel_offset */
-+
- /* GNU extension to record C++ vtable hierarchy */
- static reloc_howto_type elf_mips_gnu_vtinherit_howto =
- HOWTO (R_MIPS_GNU_VTINHERIT, /* type */
-@@ -1071,6 +1103,10 @@
- return &elf_mips_gnu_vtentry_howto;
- case BFD_RELOC_16_PCREL_S2:
- return &elf_mips_gnu_rel16_s2;
-+ case BFD_RELOC_64_PCREL:
-+ return &elf_mips_gnu_pcrel64;
-+ case BFD_RELOC_32_PCREL:
-+ return &elf_mips_gnu_pcrel32;
- }
- }
-
-@@ -1092,6 +1128,10 @@
- return &elf_mips_gnu_vtentry_howto;
- case R_MIPS_GNU_REL16_S2:
- return &elf_mips_gnu_rel16_s2;
-+ case R_MIPS_PC64:
-+ return &elf_mips_gnu_pcrel64;
-+ case R_MIPS_PC32:
-+ return &elf_mips_gnu_pcrel32;
- default:
- BFD_ASSERT (r_type < (unsigned int) R_MIPS_max);
- return &elf_mips_howto_table_rel[r_type];
-Index: bfd/elfxx-mips.c
-===================================================================
-RCS file: /cvsroot/gcc/src-cvs/src/bfd/elfxx-mips.c,v
-retrieving revision 1.100
-diff -u -r1.100 elfxx-mips.c
---- bfd/elfxx-mips.c 24 Apr 2004 22:07:13 -0000 1.100
-+++ bfd/elfxx-mips.c 5 May 2004 17:38:51 -0000
-@@ -3335,6 +3335,12 @@
- value &= howto->dst_mask;
- break;
-
-+ case R_MIPS_PC32:
-+ case R_MIPS_PC64:
-+ value = symbol + addend - p;
-+ value &= howto->dst_mask;
-+ break;
-+
- case R_MIPS_GNU_REL16_S2:
- value = symbol + _bfd_mips_elf_sign_extend (addend, 18) - p;
- overflowed_p = mips_elf_overflow_p (value, 18);
Index: gas/ChangeLog
===================================================================
RCS file: /cvsroot/gcc/src-cvs/src/gas/ChangeLog,v
+ (tc_gen_reloc): Put back pc rel handling.
+ * config/tc-mips.h: Defines DIFF_EXPR_OK.
+
-Index: gas/config/tc-mips.c
-===================================================================
-RCS file: /cvsroot/gcc/src-cvs/src/gas/config/tc-mips.c,v
-retrieving revision 1.263
-diff -u -r1.263 tc-mips.c
---- gas/config/tc-mips.c 29 Apr 2004 05:14:21 -0000 1.263
-+++ gas/config/tc-mips.c 5 May 2004 17:38:51 -0000
-@@ -10861,8 +10861,7 @@
+--- gas/config/tc-mips.c.orig 2006-07-15 20:23:51.000000000 +0200
++++ gas/config/tc-mips.c 2006-07-17 10:51:06.164440000 +0200
+@@ -11736,8 +11736,6 @@
+
buf = (bfd_byte *) (fixP->fx_frag->fr_literal + fixP->fx_where);
- /* We are not done if this is a composite relocation to set up gp. */
-- assert (! fixP->fx_pcrel);
-- if (fixP->fx_addsy == NULL
-+ if (fixP->fx_addsy == NULL && ! fixP->fx_pcrel
- && !(fixP->fx_r_type == BFD_RELOC_MIPS_SUB
- || (fixP->fx_r_type == BFD_RELOC_64
- && (previous_fx_r_type == BFD_RELOC_GPREL32
-@@ -12723,8 +12722,27 @@
- *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
- reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
+- assert (!fixP->fx_pcrel || fixP->fx_r_type == BFD_RELOC_16_PCREL_S2);
+-
+ /* Don't treat parts of a composite relocation as done. There are two
+ reasons for this:
-- assert (! fixp->fx_pcrel);
-- reloc->addend = fixp->fx_addnumber;
-+ if (fixp->fx_pcrel)
-+ {
-+ bfd_vma pcrel_address;
-+
-+ pcrel_address = reloc->address;
-+
-+ if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
-+ {
-+ /* At this point, fx_addnumber is "symbol offset - pcrel_address".
-+ Relocations want only the symbol offset. */
-+ reloc->addend = fixp->fx_addnumber + pcrel_address;
-+ }
-+ else
-+ {
-+ /* A gruesome hack which is a result of the gruesome gas reloc
-+ handling. */
-+ reloc->addend = pcrel_address;
-+ }
-+ }
-+ else
-+ reloc->addend = fixp->fx_addnumber;
+@@ -13562,8 +13560,6 @@
- /* Since the old MIPS ELF ABI uses Rel instead of Rela, encode the vtable
- entry to be used in the relocation's section offset. */
-@@ -12735,6 +12753,34 @@
+ if (fixp->fx_pcrel)
+ {
+- assert (fixp->fx_r_type == BFD_RELOC_16_PCREL_S2);
+-
+ /* At this point, fx_addnumber is "symbol offset - pcrel address".
+ Relocations want only the symbol offset. */
+ reloc->addend = fixp->fx_addnumber + reloc->address;
+@@ -13588,6 +13584,34 @@
}
code = fixp->fx_r_type;
+ }
+ }
- /* 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
+ reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
+ if (reloc->howto == NULL)
Index: gas/config/tc-mips.h
===================================================================
RCS file: /cvsroot/gcc/src-cvs/src/gas/config/tc-mips.h,v
/* Tell assembler that we have an itbl_mips.h header file to include. */
#define HAVE_ITBL_CPU
-Index: include/elf/ChangeLog
-===================================================================
-RCS file: /cvsroot/gcc/src-cvs/src/include/elf/ChangeLog,v
-retrieving revision 1.205
-diff -u -r1.205 ChangeLog
---- include/elf/ChangeLog 24 Apr 2004 22:07:14 -0000 1.205
-+++ include/elf/ChangeLog 5 May 2004 17:38:51 -0000
-@@ -1,3 +1,7 @@
-+2004-05-05 David Ung <davidu@mips.com>
-+
-+ * mips.h: Put back R_MIPS_PC32 and R_MIPS_PC64.
-+
- 2004-04-24 Chris Demetriou <cgd@broadcom.com>
-
- * mips.h (R_MIPS_PC32, R_MIPS_PC64, R_MIPS_GNU_REL_LO16)
-Index: include/elf/mips.h
-===================================================================
-RCS file: /cvsroot/gcc/src-cvs/src/include/elf/mips.h,v
-retrieving revision 1.22
-diff -u -r1.22 mips.h
---- include/elf/mips.h 24 Apr 2004 22:07:14 -0000 1.22
-+++ include/elf/mips.h 5 May 2004 17:38:51 -0000
-@@ -76,6 +76,8 @@
- /* These relocs are used for the mips16. */
- RELOC_NUMBER (R_MIPS16_26, 100)
- RELOC_NUMBER (R_MIPS16_GPREL, 101)
-+ RELOC_NUMBER (R_MIPS_PC32, 248)
-+ RELOC_NUMBER (R_MIPS_PC64, 249)
- /* FIXME: this relocation is used internally by gas. */
- RELOC_NUMBER (R_MIPS_GNU_REL16_S2, 250)
- /* These are GNU extensions to enable C++ vtable garbage collection. */