Movatterモバイル変換


[0]ホーム

URL:


This is the mail archive of thebinutils@sources.redhat.commailing list for thebinutils 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 groupssuch that parts of _init end up in different groups - with stubs inthe 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 listsper output section, but don't bother with bfd_abs_section marker.(ppc64_elf_next_input_section): Adjust for multiple input sectionlists.(group_sections): Likewise.Index: bfd/elf64-ppc.c===================================================================RCS file: /cvs/src/src/bfd/elf64-ppc.c,vretrieving revision 1.106diff -u -p -w -r1.106 elf64-ppc.c--- bfd/elf64-ppc.c17 Jun 2003 12:39:41 -00001.106+++ bfd/elf64-ppc.c17 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 ModraIBM OzLabs - Linux Technology Centre

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

[8]ページ先頭

©2009-2025 Movatter.jp