This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: powerpc stub tweaks


On Tue, Jun 17, 2003 at 06:40:18PM +0930, Alan Modra wrote:
> The improvement is to group input sections without regard to their
> output sections.  Previously, we kept a list of sections for each
> output section, but there's really no need to treat say .init separately
> from .text.  This change may result in fewer stubs being needed.

Oops.  This also has the potential to partition sections into groups
such that parts of _init end up in different groups - with stubs in
the middle.  Reverting..

	* elf64-ppc.c (struct ppc_link_hash_table): Reinstate top_index.
	Restore previous input_list type.
	(ppc64_elf_link_hash_table_create): Undo last change.
	(ppc64_elf_setup_section_lists): Reinstate code setting up input lists
	per output section, but don't bother with bfd_abs_section marker.
	(ppc64_elf_next_input_section): Adjust for multiple input section
	lists.
	(group_sections): Likewise.

Index: bfd/elf64-ppc.c
===================================================================
RCS file: /cvs/src/src/bfd/elf64-ppc.c,v
retrieving revision 1.106
diff -u -p -w -r1.106 elf64-ppc.c
--- bfd/elf64-ppc.c	17 Jun 2003 12:39:41 -0000	1.106
+++ bfd/elf64-ppc.c	17 Jun 2003 13:31:59 -0000
@@ -2773,8 +2773,11 @@ struct ppc_link_hash_table
   /* Temp used when calculating TOC pointers.  */
   bfd_vma toc_curr;
 
-  /* List of input code sections used by ppc64_elf_size_stubs.  */
-  asection *input_list;
+  /* Highest output section index.  */
+  int top_index;
+
+  /* List of input sections for each output section.  */
+  asection **input_list;
 
   /* Short-cuts to get to dynamic linker sections.  */
   asection *sgot;
@@ -3053,7 +3056,6 @@ ppc64_elf_link_hash_table_create (abfd)
   htab->no_multi_toc = 0;
   htab->multi_toc_needed = 0;
   htab->toc_curr = 0;
-  htab->input_list = NULL;
   htab->sgot = NULL;
   htab->srelgot = NULL;
   htab->splt = NULL;
@@ -6500,8 +6502,9 @@ ppc64_elf_setup_section_lists (output_bf
      struct bfd_link_info *info;
 {
   bfd *input_bfd;
-  int top_id, id;
+  int top_id, top_index, id;
   asection *section;
+  asection **input_list;
   bfd_size_type amt;
   struct ppc_link_hash_table *htab = ppc_hash_table (info);
 
@@ -6532,6 +6535,25 @@ ppc64_elf_setup_section_lists (output_bf
     htab->stub_group[id].toc_off = TOC_BASE_OFF;
 
   elf_gp (output_bfd) = htab->toc_curr = ppc64_elf_toc (output_bfd);
+
+  /* We can't use output_bfd->section_count here to find the top output
+     section index as some sections may have been removed, and
+     _bfd_strip_section_from_output doesn't renumber the indices.  */
+  for (section = output_bfd->sections, top_index = 0;
+       section != NULL;
+       section = section->next)
+    {
+      if (top_index < section->index)
+	top_index = section->index;
+    }
+
+  htab->top_index = top_index;
+  amt = sizeof (asection *) * (top_index + 1);
+  input_list = (asection **) bfd_zmalloc (amt);
+  htab->input_list = input_list;
+  if (input_list == NULL)
+    return -1;
+
   return 1;
 }
 
@@ -6588,14 +6610,16 @@ ppc64_elf_next_input_section (info, isec
 {
   struct ppc_link_hash_table *htab = ppc_hash_table (info);
 
-  if ((isec->output_section->flags & SEC_CODE) != 0)
+  if ((isec->output_section->flags & SEC_CODE) != 0
+      && isec->output_section->index <= htab->top_index)
     {
+      asection **list = htab->input_list + isec->output_section->index;
       /* Steal the link_sec pointer for our list.  */
 #define PREV_SEC(sec) (htab->stub_group[(sec)->id].link_sec)
       /* This happens to make the list in reverse order,
 	 which is what we want.  */
-      PREV_SEC (isec) = htab->input_list;
-      htab->input_list = isec;
+      PREV_SEC (isec) = *list;
+      *list = isec;
     }
 
   /* If a code section has a function that uses the TOC then we need
@@ -6624,7 +6648,10 @@ group_sections (htab, stub_group_size, s
      bfd_size_type stub_group_size;
      bfd_boolean stubs_always_before_branch;
 {
-  asection *tail = htab->input_list;
+  asection **list = htab->input_list + htab->top_index;
+  do
+    {
+      asection *tail = *list;
   while (tail != NULL)
     {
       asection *curr;
@@ -6642,10 +6669,7 @@ group_sections (htab, stub_group_size, s
       curr_toc = htab->stub_group[tail->id].toc_off;
 
       while ((prev = PREV_SEC (curr)) != NULL
-	     && ((total += (curr->output_section->vma
-			    + curr->output_offset
-			    - prev->output_section->vma
-			    - prev->output_offset))
+		 && ((total += curr->output_offset - prev->output_offset)
 		 < stub_group_size)
 	     && htab->stub_group[prev->id].toc_off == curr_toc)
 	curr = prev;
@@ -6677,10 +6701,7 @@ group_sections (htab, stub_group_size, s
 	{
 	  total = 0;
 	  while (prev != NULL
-		 && ((total += (tail->output_section->vma
-				+ tail->output_offset
-				- prev->output_section->vma
-				- prev->output_offset))
+		     && ((total += tail->output_offset - prev->output_offset)
 		     < stub_group_size)
 		 && htab->stub_group[prev->id].toc_off == curr_toc)
 	    {
@@ -6691,6 +6712,9 @@ group_sections (htab, stub_group_size, s
 	}
       tail = prev;
     }
+    }
+  while (list-- != htab->input_list);
+  free (htab->input_list);
 #undef PREV_SEC
 }
 

-- 
Alan Modra
IBM OzLabs - Linux Technology Centre


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]