aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Weigand <uweigand@de.ibm.com>2009-05-14 14:40:57 +0000
committerUlrich Weigand <uweigand@de.ibm.com>2009-05-14 14:40:57 +0000
commitcc210763ce675cfdc6bbf9fc1f98dd121cdf24ce (patch)
treed85ac87c828ad638ffcbc8f6dc40d75e0679de7b
parentc1ea05bbe875208b4c493220f7013bc2f491207e (diff)
downloadfsf-binutils-gdb-cc210763ce675cfdc6bbf9fc1f98dd121cdf24ce.zip
fsf-binutils-gdb-cc210763ce675cfdc6bbf9fc1f98dd121cdf24ce.tar.gz
fsf-binutils-gdb-cc210763ce675cfdc6bbf9fc1f98dd121cdf24ce.tar.bz2
* elf32-spu.c (mark_functions_via_relocs): Handle cycles in the
control flow graph between fragments of a function.
-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 6829c5c..2af36be 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 7cdcb03..13bf5e2 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;