ppc64 dot symbols

Alan Modra amodra@bigpond.net.au
Mon Aug 9 00:54:00 GMT 2004


Simplify support for a ppc64 linker feature that probably no one uses.

	* elf64-ppc.c (struct ppc_link_hash_table): Remove have_undefweak.
	(func_desc_adjust): Don't set have_undefweak.
	(ppc64_elf_func_desc_adjust): Don't add an extr nop to sfpr.
	(ppc64_elf_relocate_section): NOP out calls to undefweak functions.

Index: bfd/elf64-ppc.c
===================================================================
RCS file: /cvs/src/src/bfd/elf64-ppc.c,v
retrieving revision 1.151
diff -u -p -r1.151 elf64-ppc.c
--- bfd/elf64-ppc.c	9 Aug 2004 00:40:48 -0000	1.151
+++ bfd/elf64-ppc.c	9 Aug 2004 00:47:05 -0000
@@ -2872,9 +2872,6 @@ struct ppc_link_hash_table
      select suitable defaults for the stub group size.  */
   unsigned int has_14bit_branch;
 
-  /* Set if we detect a reference undefined weak symbol.  */
-  unsigned int have_undefweak;
-
   /* Incremented every time we size stubs.  */
   unsigned int stub_iteration;
 
@@ -4355,10 +4352,6 @@ func_desc_adjust (struct elf_link_hash_e
   if (!fh->is_func)
     return TRUE;
 
-  if (fh->elf.root.type == bfd_link_hash_undefweak
-      && (fh->elf.elf_link_hash_flags & ELF_LINK_HASH_REF_REGULAR))
-    htab->have_undefweak = TRUE;
-
   for (ent = fh->elf.plt.plist; ent != NULL; ent = ent->next)
     if (ent->plt.refcount > 0)
       break;
@@ -4525,13 +4518,8 @@ ppc64_elf_func_desc_adjust (bfd *obfd AT
 
   if (htab->sfpr->size == 0)
     {
-      if (!htab->have_undefweak)
-	{
-	  _bfd_strip_section_from_output (info, htab->sfpr);
-	  return TRUE;
-	}
-
-      htab->sfpr->size = 4;
+      _bfd_strip_section_from_output (info, htab->sfpr);
+      return TRUE;
     }
 
   p = bfd_alloc (htab->elf.dynobj, htab->sfpr->size);
@@ -4559,11 +4547,8 @@ ppc64_elf_func_desc_adjust (bfd *obfd AT
       bfd_put_32 (htab->elf.dynobj, LFD_FR0_0R1 + fpr + stackoff, p);
       p += 4;
     }
-  if (lowest_restf <= MAX_SAVE_FPR
-      || htab->sfpr->size == 4)
-    {
-      bfd_put_32 (htab->elf.dynobj, BLR, p);
-    }
+  if (lowest_restf <= MAX_SAVE_FPR)
+    bfd_put_32 (htab->elf.dynobj, BLR, p);
 
   return TRUE;
 }
@@ -7988,28 +7973,16 @@ ppc64_elf_relocate_section (bfd *output_
 		}
 	    }
 
+	  /* NOP out calls to undefined weak functions.
+	     We can thus call a weak function without first
+	     checking whether the function is defined.  */
 	  if (h != NULL
 	      && h->root.type == bfd_link_hash_undefweak
 	      && relocation == 0
 	      && rel->r_addend == 0)
 	    {
-	      /* Tweak calls to undefined weak functions to point at a
-		 blr.  We can thus call a weak function without first
-		 checking whether the function is defined.  We have a
-		 blr at the end of .sfpr.  */
-	      BFD_ASSERT (htab->sfpr->size != 0);
-	      relocation = (htab->sfpr->size - 4
-			    + htab->sfpr->output_offset
-			    + htab->sfpr->output_section->vma);
-	      from = (rel->r_offset
-		      + input_section->output_offset
-		      + input_section->output_section->vma);
-
-	      /* But let's not be silly about it.  If the blr isn't in
-		 reach, just go to the next instruction.  */
-	      if (relocation - from + (1 << 25) >= (1 << 26)
-		  || htab->sfpr->size == 0)
-		relocation = from + 4;
+	      bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
+	      continue;
 	    }
 	  break;
 	}

-- 
Alan Modra
IBM OzLabs - Linux Technology Centre



More information about the Binutils mailing list