* elf32-spu.c (mark_functions_via_relocs): Handle cycles in the
authorUlrich Weigand <uweigand@de.ibm.com>
Thu, 14 May 2009 14:40:57 +0000 (14:40 +0000)
committerUlrich Weigand <uweigand@de.ibm.com>
Thu, 14 May 2009 14:40:57 +0000 (14:40 +0000)
control flow graph between fragments of a function.

bfd/ChangeLog
bfd/elf32-spu.c

index 6829c5c..2af36be 100644 (file)
@@ -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.
index 7cdcb03..13bf5e2 100644 (file)
@@ -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;