summaryrefslogtreecommitdiff
path: root/bfd/elf32-spu.c
diff options
context:
space:
mode:
authorUlrich Weigand <uweigand@de.ibm.com>2009-05-28 10:42:47 +0000
committerUlrich Weigand <uweigand@de.ibm.com>2009-05-28 10:42:47 +0000
commit49842a7e64f4513db854a55884aeccb8e9b7ebee (patch)
tree80b59537580759922935ca5d7726c9dcf2eeb0f9 /bfd/elf32-spu.c
parentc4dd61d6072d5c8bbf47d95b672ceab7758a32ba (diff)
downloadbinutils-redhat-49842a7e64f4513db854a55884aeccb8e9b7ebee.tar.gz
* elf32-spu.c (insert_callee): Accumulate incoming callee->count.
(mark_functions_via_relocs): Initialize callee->count to 1. (pasted_function): Likewise. (spu_elf_auto_overlay): Honor call counts when determining number of stubs required in software i-cache mode.
Diffstat (limited to 'bfd/elf32-spu.c')
-rw-r--r--bfd/elf32-spu.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/bfd/elf32-spu.c b/bfd/elf32-spu.c
index 728cb452fb..46cc1c69df 100644
--- a/bfd/elf32-spu.c
+++ b/bfd/elf32-spu.c
@@ -2592,7 +2592,7 @@ insert_callee (struct function_info *caller, struct call_info *callee)
p->fun->start = NULL;
p->fun->is_func = TRUE;
}
- p->count += 1;
+ p->count += callee->count;
/* Reorder list so most recent call is first. */
*pp = p->next;
p->next = caller->call_list;
@@ -2600,7 +2600,6 @@ insert_callee (struct function_info *caller, struct call_info *callee)
return FALSE;
}
callee->next = caller->call_list;
- callee->count += 1;
caller->call_list = callee;
return TRUE;
}
@@ -2790,7 +2789,7 @@ mark_functions_via_relocs (asection *sec,
callee->is_tail = !is_call;
callee->is_pasted = FALSE;
callee->priority = priority;
- callee->count = 0;
+ callee->count = 1;
if (callee->fun->last_caller != sec)
{
callee->fun->last_caller = sec;
@@ -2882,7 +2881,7 @@ pasted_function (asection *sec)
callee->fun = fun;
callee->is_tail = TRUE;
callee->is_pasted = TRUE;
- callee->count = 0;
+ callee->count = 1;
if (!insert_callee (fun_start, callee))
free (callee);
return TRUE;
@@ -4438,14 +4437,18 @@ spu_elf_auto_overlay (struct bfd_link_info *info)
for (call = dummy_caller.call_list; call; call = call->next)
{
unsigned int k;
+ unsigned int stub_delta = 1;
+
+ if (htab->params->ovly_flavour == ovly_soft_icache)
+ stub_delta = call->count;
+ num_stubs += stub_delta;
- ++num_stubs;
/* If the call is within this overlay, we won't need a
stub. */
for (k = base; k < i + 1; k++)
if (call->fun->sec == ovly_sections[2 * k])
{
- --num_stubs;
+ num_stubs -= stub_delta;
break;
}
}