From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 17989 invoked by alias); 10 Sep 2009 21:10:49 -0000 Received: (qmail 17980 invoked by uid 22791); 10 Sep 2009 21:10:48 -0000 X-SWARE-Spam-Status: No, hits=-1.9 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_31 X-Spam-Check-By: sourceware.org Received: from smtpauth12.prod.mesa1.secureserver.net (HELO smtpauth12.prod.mesa1.secureserver.net) (64.202.165.35) by sourceware.org (qpsmtpd/0.43rc1) with SMTP; Thu, 10 Sep 2009 21:10:43 +0000 Received: (qmail 6998 invoked from network); 10 Sep 2009 21:10:41 -0000 Received: from unknown (70.53.38.61) by smtpauth12.prod.mesa1.secureserver.net (64.202.165.35) with ESMTP; 10 Sep 2009 21:10:40 -0000 Subject: [Patch, moxie] Handle new prologue sequences From: Anthony Green To: gdb-patches@sourceware.org Content-Type: text/plain Date: Thu, 10 Sep 2009 21:10:00 -0000 Message-Id: <1252617264.7349.4.camel@localhost.localdomain> Mime-Version: 1.0 Content-Transfer-Encoding: 7bit X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2009-09/txt/msg00287.txt.bz2 This patch was developed in response to this recent GCC patch: http://gcc.gnu.org/ml/gcc-patches/2009-09/msg00652.html The GCC patch modifies moxie function prologues. This patch tweaks the prologue recognizer accordingly. I am checking it in. AG 2009-09-10 Anthony Green * moxie-tdep.c (moxie_analyze_prologue): Recognize new prologue sequences. Index: gdb/moxie-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/moxie-tdep.c,v retrieving revision 1.6 diff -u -r1.6 moxie-tdep.c --- gdb/moxie-tdep.c 18 Jul 2009 13:52:02 -0000 1.6 +++ gdb/moxie-tdep.c 10 Sep 2009 20:44:43 -0000 @@ -174,23 +174,37 @@ cache->saved_regs[regnum] = cache->framesize; next_addr += 2; } + } - /* Optional stack allocation for args and local vars <= 4 - byte. */ - else if (inst == 0x01f0) /* ldi.l $r12, X */ - { - offset = read_memory_integer (next_addr + 2, 4, byte_order); - inst2 = read_memory_unsigned_integer (next_addr + 6, 2, byte_order); + inst = read_memory_unsigned_integer (next_addr, 2, byte_order); - if (inst2 == 0x051f) /* add.l $sp, $r12 */ - { - cache->framesize += offset; - } + /* Optional stack allocation for args and local vars <= 4 + byte. */ + if (inst == 0x0170) /* ldi.l $r5, X */ + { + offset = read_memory_integer (next_addr + 2, 4, byte_order); + inst2 = read_memory_unsigned_integer (next_addr + 6, 2, byte_order); + + if (inst2 == 0x0517) /* add.l $sp, $r5 */ + { + cache->framesize += offset; + } + + return (next_addr + 8); + } + else if ((inst & 0xff00) == 0x91) /* dec $sp, X */ + { + cache->framesize += (inst & 0x00ff); + next_addr += 2; - return (next_addr + 8); + while (next_addr < end_addr) + { + inst = read_memory_unsigned_integer (next_addr, 2, byte_order); + if ((inst & 0xff00) != 0x91) /* no more dec $sp, X */ + break; + cache->framesize += (inst & 0x00ff); + next_addr += 2; } - else /* This is not a prologue instruction. */ - break; } return next_addr;