From fad9eaf0deff64167032634213f1070193d929f7 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Mon, 24 Sep 2007 00:30:03 +0000 Subject: [PATCH] * 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. --- bfd/ChangeLog | 6 ++++++ bfd/elf32-spu.c | 21 +++++++++++++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index efab24a2b72..42d91a7afd5 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2007-09-24 Trevor Smigiel + + * 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 * Makefile.am: Run "make dep-am". diff --git a/bfd/elf32-spu.c b/bfd/elf32-spu.c index 9073b634f43..187d469be3c 100644 --- a/bfd/elf32-spu.c +++ b/bfd/elf32-spu.c @@ -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) { -- 2.30.2