summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog5
-rw-r--r--bfd/elf32-spu.c9
2 files changed, 13 insertions, 1 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 6829c5ca77b..2af36be92ad 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,5 +1,10 @@
2009-05-14 Ulrich Weigand <uweigand@de.ibm.com>
+ * elf32-spu.c (mark_functions_via_relocs): Handle cycles in the
+ control flow graph between fragments of a function.
+
+2009-05-14 Ulrich Weigand <uweigand@de.ibm.com>
+
* elf32-spu.c (spu_elf_size_stubs): Even in software i-cache mode,
generate only a 16-byte .toe section.
(spu_elf_build_stubs, spu_elf_auto_overlay): Likewise.
diff --git a/bfd/elf32-spu.c b/bfd/elf32-spu.c
index 7cdcb035f40..13bf5e2a5fb 100644
--- a/bfd/elf32-spu.c
+++ b/bfd/elf32-spu.c
@@ -2787,7 +2787,14 @@ mark_functions_via_relocs (asection *sec,
callee->fun->is_func = TRUE;
}
else if (callee->fun->start == NULL)
- callee->fun->start = caller;
+ {
+ struct function_info *caller_start = caller;
+ while (caller_start->start)
+ caller_start = caller_start->start;
+
+ if (caller_start != callee->fun)
+ callee->fun->start = caller_start;
+ }
else
{
struct function_info *callee_start;