* elf32-spu.c (spu_elf_check_vma): Do not reset auto_overlay
authorUlrich Weigand <uweigand@de.ibm.com>
Sun, 15 Mar 2009 15:15:29 +0000 (15:15 +0000)
committerUlrich Weigand <uweigand@de.ibm.com>
Sun, 15 Mar 2009 15:15:29 +0000 (15:15 +0000)
parameter just because fixed sections fit into local store.
(spu_elf_auto_overlay): Do not declare as "noreturn".  Skip
generating overlays if fixed sections plus reserved stack
and heap space fit into local store.

bfd/ChangeLog
bfd/elf32-spu.c

index 33174a319be013bc5b90d12d1cdf6cfa1448b9b7..0aefc610bd225ab1851d3228f5face8d7ac7259b 100644 (file)
@@ -1,3 +1,11 @@
+2009-03-15  Ulrich Weigand  <uweigand@de.ibm.com>
+
+       * elf32-spu.c (spu_elf_check_vma): Do not reset auto_overlay
+       parameter just because fixed sections fit into local store.
+       (spu_elf_auto_overlay): Do not declare as "noreturn".  Skip
+       generating overlays if fixed sections plus reserved stack
+       and heap space fit into local store.
+
 2009-03-15  Alan Modra  <amodra@bigpond.net.au>
 
        * elf32-spu.c (build_stub): Correct icache set_id.
index 72ddccf25e89a1f9d6de01b4ca2cd6a72e046d15..58719f52ca2d05415c7dfdfb14986e391ecda897 100644 (file)
@@ -2062,9 +2062,6 @@ spu_elf_check_vma (struct bfd_link_info *info)
                || m->sections[i]->vma + m->sections[i]->size - 1 > hi))
          return m->sections[i];
 
-  /* No need for overlays if it all fits.  */
-  if (htab->params->ovly_flavour != ovly_soft_icache)
-    htab->params->auto_overlay = 0;
   return NULL;
 }
 
@@ -4035,9 +4032,6 @@ print_one_overlay_section (FILE *script,
 
 /* Handle --auto-overlay.  */
 
-static void spu_elf_auto_overlay (struct bfd_link_info *)
-     ATTRIBUTE_NORETURN;
-
 static void
 spu_elf_auto_overlay (struct bfd_link_info *info)
 {
@@ -4079,11 +4073,30 @@ spu_elf_auto_overlay (struct bfd_link_info *info)
   if (!build_call_tree (info))
     goto err_exit;
 
+  htab = spu_hash_table (info);
+  if (htab->reserved == 0)
+    {
+      struct _sum_stack_param sum_stack_param;
+
+      sum_stack_param.emit_stack_syms = 0;
+      sum_stack_param.overall_stack = 0;
+      if (!for_each_node (sum_stack, info, &sum_stack_param, TRUE))
+       goto err_exit;
+      htab->reserved = sum_stack_param.overall_stack + htab->extra_stack_space;
+    }
+
+  /* No need for overlays if everything already fits.  */
+  if (fixed_size + htab->reserved <= htab->local_store
+      && htab->params->ovly_flavour != ovly_soft_icache)
+    {
+      htab->params->auto_overlay = 0;
+      return;
+    }
+
   uos_param.exclude_input_section = 0;
   uos_param.exclude_output_section
     = bfd_get_section_by_name (info->output_bfd, ".interrupt");
 
-  htab = spu_hash_table (info);
   ovly_mgr_entry = "__ovly_load";
   if (htab->params->ovly_flavour == ovly_soft_icache)
     ovly_mgr_entry = "__icache_br_handler";
@@ -4186,16 +4199,6 @@ spu_elf_auto_overlay (struct bfd_link_info *info)
     }
   free (bfd_arr);
 
-  if (htab->reserved == 0)
-    {
-      struct _sum_stack_param sum_stack_param;
-
-      sum_stack_param.emit_stack_syms = 0;
-      sum_stack_param.overall_stack = 0;
-      if (!for_each_node (sum_stack, info, &sum_stack_param, TRUE))
-       goto err_exit;
-      htab->reserved = sum_stack_param.overall_stack + htab->extra_stack_space;
-    }
   fixed_size += htab->reserved;
   fixed_size += htab->non_ovly_stub * ovl_stub_size (htab->params->ovly_flavour);
   if (fixed_size + mos_param.max_overlay_size <= htab->local_store)