* elf32-spu.c (is_indirect_branch): New function.
authorAlan Modra <amodra@gmail.com>
Mon, 24 Sep 2007 00:30:03 +0000 (00:30 +0000)
committerAlan Modra <amodra@gmail.com>
Mon, 24 Sep 2007 00:30:03 +0000 (00:30 +0000)
(find_function_stack_adjust): End scan on hitting indirect branch.
(sum_stack): Cast %v arg to correct type.

bfd/ChangeLog
bfd/elf32-spu.c

index efab24a2b72aff1798d93670c48695ad158b580d..42d91a7afd5b36449a9cfc9ae105f1921a9324ee 100644 (file)
@@ -1,3 +1,9 @@
+2007-09-24  Trevor Smigiel  <Trevor_Smigiel@playstation.sony.com>
+
+       * elf32-spu.c (is_indirect_branch): New function.
+       (find_function_stack_adjust): End scan on hitting indirect branch.
+       (sum_stack): Cast %v arg to correct type.
+
 2007-09-21  H.J. Lu  <hongjiu.lu@intel.com>
 
        * Makefile.am: Run "make dep-am".
index 9073b634f434e72e3a6bcb96edd58da3ec160835..187d469be3cef75003e4ba6449019254d5f4f116 100644 (file)
@@ -698,6 +698,22 @@ is_branch (const unsigned char *insn)
   return (insn[0] & 0xec) == 0x20 && (insn[1] & 0x80) == 0;
 }
 
+/* Return true for all indirect branch instructions.
+   bi     00110101 000
+   bisl   00110101 001
+   iret   00110101 010
+   bisled 00110101 011
+   biz    00100101 000
+   binz   00100101 001
+   bihz   00100101 010
+   bihnz  00100101 011  */
+
+static bfd_boolean
+is_indirect_branch (const unsigned char *insn)
+{
+  return (insn[0] & 0xef) == 0x25 && (insn[1] & 0x80) == 0;
+}
+
 /* Return true for branch hint instructions.
    hbra  0001000..
    hbrr  0001001..  */
@@ -1534,7 +1550,7 @@ find_function_stack_adjust (asection *sec, bfd_vma offset)
          reg[rt] = 0;
          continue;
        }
-      else if (is_branch (buf))
+      else if (is_branch (buf) || is_indirect_branch (buf))
        /* If we hit a branch then we must be out of the prologue.  */
        break;
     unknown_insn:
@@ -2510,7 +2526,8 @@ sum_stack (struct function_info *fun,
     }
 
   f1 = func_name (fun);
-  info->callbacks->minfo (_("%s: 0x%v 0x%v\n"), f1, fun->stack, max_stack);
+  info->callbacks->minfo (_("%s: 0x%v 0x%v\n"),
+                         f1, (bfd_vma) fun->stack, max_stack);
 
   if (fun->call_list)
     {