2011-05-09 Paul Brook <paul@codesourcery.com>
authorPaul Brook <paul@codesourcery.com>
Mon, 9 May 2011 13:12:52 +0000 (13:12 +0000)
committerPaul Brook <paul@codesourcery.com>
Mon, 9 May 2011 13:12:52 +0000 (13:12 +0000)
bfd/
* elf32-tic6x.c (elf32_tic6x_gc_mark_extra_sections): New function.
(elf_backend_gc_mark_extra_sections): Define.

bfd/ChangeLog
bfd/elf32-tic6x.c

index b8c2cf4b0d753f11e0dc470e75c36f48851fc019..57025970efb695b58d4bbede1f28209299d6ea0d 100644 (file)
@@ -1,3 +1,8 @@
+2011-05-09  Paul Brook  <paul@codesourcery.com>
+
+       * elf32-tic6x.c (elf32_tic6x_gc_mark_extra_sections): New function.
+       (elf_backend_gc_mark_extra_sections): Define.
+
 2011-05-07  Dave Korn  <dave.korn.cygwin@gmail.com>
 
        PR ld/12365
index 909225a5c3b705630255596aa234fbab13ae381a..6b1065432fa3151f4613607f397e44791bdca320 100644 (file)
@@ -1839,6 +1839,53 @@ elf32_tic6x_finish_dynamic_symbol (bfd * output_bfd,
   return TRUE;
 }
 
+/* Unwinding tables are not referenced directly.  This pass marks them as
+   required if the corresponding code section is marked.  */
+
+static bfd_boolean
+elf32_tic6x_gc_mark_extra_sections (struct bfd_link_info *info,
+                                   elf_gc_mark_hook_fn gc_mark_hook)
+{
+  bfd *sub;
+  Elf_Internal_Shdr **elf_shdrp;
+  bfd_boolean again;
+
+  /* Marking EH data may cause additional code sections to be marked,
+     requiring multiple passes.  */
+  again = TRUE;
+  while (again)
+    {
+      again = FALSE;
+      for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
+       {
+         asection *o;
+
+         if (! is_tic6x_elf (sub))
+           continue;
+
+         elf_shdrp = elf_elfsections (sub);
+         for (o = sub->sections; o != NULL; o = o->next)
+           {
+             Elf_Internal_Shdr *hdr;
+
+             hdr = &elf_section_data (o)->this_hdr;
+             if (hdr->sh_type == SHT_C6000_UNWIND
+                 && hdr->sh_link
+                 && hdr->sh_link < elf_numsections (sub)
+                 && !o->gc_mark
+                 && elf_shdrp[hdr->sh_link]->bfd_section->gc_mark)
+               {
+                 again = TRUE;
+                 if (!_bfd_elf_gc_mark (info, o, gc_mark_hook))
+                   return FALSE;
+               }
+           }
+       }
+    }
+
+  return TRUE;
+}
+
 /* Update the got entry reference counts for the section being removed.  */
 
 static bfd_boolean
@@ -3933,6 +3980,7 @@ elf32_tic6x_copy_private_data (bfd * ibfd, bfd * obfd)
 #define elf_backend_rela_normal                1
 #define elf_backend_got_header_size     8
 #define elf_backend_gc_sweep_hook      elf32_tic6x_gc_sweep_hook
+#define elf_backend_gc_mark_extra_sections elf32_tic6x_gc_mark_extra_sections
 #define elf_backend_modify_program_headers \
   elf32_tic6x_modify_program_headers
 #define elf_backend_create_dynamic_sections \