summaryrefslogtreecommitdiff
path: root/bfd/elf32-spu.c
diff options
context:
space:
mode:
authorUlrich Weigand <uweigand@de.ibm.com>2009-03-15 15:15:29 +0000
committerUlrich Weigand <uweigand@de.ibm.com>2009-03-15 15:15:29 +0000
commita14c90c1e75ece04307e201c7f0f8fb26f488628 (patch)
treee0d6d5fdf882bfe4efa199cd31670062e6fde43c /bfd/elf32-spu.c
parent588b6e15ae5d0c49dadff66168b2db20b802eab5 (diff)
downloadbinutils-a14c90c1e75ece04307e201c7f0f8fb26f488628.tar.gz
binutils-a14c90c1e75ece04307e201c7f0f8fb26f488628.tar.bz2
binutils-a14c90c1e75ece04307e201c7f0f8fb26f488628.zip
* 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.
Diffstat (limited to 'bfd/elf32-spu.c')
-rw-r--r--bfd/elf32-spu.c37
1 files changed, 20 insertions, 17 deletions
diff --git a/bfd/elf32-spu.c b/bfd/elf32-spu.c
index 72ddccf25e8..58719f52ca2 100644
--- a/bfd/elf32-spu.c
+++ b/bfd/elf32-spu.c
@@ -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)