From b944b044fb3664008f20a3f5434325437ed99a93 Mon Sep 17 00:00:00 2001
From: Mark Mitchell <mark@codesourcery.com>
Date: Mon, 9 Aug 1999 22:45:39 +0000
Subject: [PATCH] 	* elf32-mips.c (elf_mips_howto_table): Fix src_mask
 for 	R_MIPS_GOT16 and R_MIPS_CALL16. 	(mips_elf_got16_entry): Use
 mips_elf_high to calculate the value 	to use wheen looking for a preexisting
 GOT entry.

---
 bfd/ChangeLog    |  7 +++++++
 bfd/elf32-mips.c | 10 +++++++---
 2 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 349d9831e08..9be218b8577 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,10 @@
+1999-08-09  Mark Mitchell  <mark@codesourcery.com>
+
+	* elf32-mips.c (elf_mips_howto_table): Fix src_mask for
+	R_MIPS_GOT16 and R_MIPS_CALL16.
+	(mips_elf_got16_entry): Use mips_elf_high to calculate the value
+	to use wheen looking for a preexisting GOT entry.
+
 1999-08-09  Jakub Jelinek  <jj@ultra.linux.cz>
 
 	* elf64-sparc.c (sparc64_elf_relocate_section): Back out part of
diff --git a/bfd/elf32-mips.c b/bfd/elf32-mips.c
index f0b8bec2cb1..27e1c5ee87c 100644
--- a/bfd/elf32-mips.c
+++ b/bfd/elf32-mips.c
@@ -602,7 +602,7 @@ static reloc_howto_type elf_mips_howto_table[] =
 	 _bfd_mips_elf_got16_reloc,	/* special_function */
 	 "R_MIPS_GOT16",	/* name */
 	 false,			/* partial_inplace */
-	 0,			/* src_mask */
+	 0xffff,		/* src_mask */
 	 0xffff,		/* dst_mask */
 	 false),		/* pcrel_offset */
 
@@ -632,7 +632,7 @@ static reloc_howto_type elf_mips_howto_table[] =
 	 bfd_elf_generic_reloc,	/* special_function */
 	 "R_MIPS_CALL16",	/* name */
 	 false,			/* partial_inplace */
-	 0,			/* src_mask */
+	 0xffff,		/* src_mask */
 	 0xffff,		/* dst_mask */
 	 false),		/* pcrel_offset */
 
@@ -5537,7 +5537,11 @@ mips_elf_got16_entry (abfd, info, value)
   bfd_vma index;
   bfd_vma address;
 
-  value &= 0xffff0000;
+  /* Although the ABI says that it is "the high-order 16 bits" that we
+     want, it is really the %high value.  The complete value is
+     calculated with a `addiu' of a LO16 relocation, just as with a
+     HI16/LO16 pair.  */
+  value = mips_elf_high (value);
   g = mips_elf_got_info (elf_hash_table (info)->dynobj, &sgot);
 
   /* Look to see if we already have an appropriate entry.  */