From patchwork Thu Mar 17 22:41:50 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cristiano X-Patchwork-Id: 11370 Received: (qmail 31399 invoked by alias); 17 Mar 2016 22:42:02 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 31382 invoked by uid 89); 17 Mar 2016 22:42:01 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.7 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, RP_MATCHES_RCVD, SPF_PASS autolearn=ham version=3.3.2 spammy=Device, Drivers, stepi, Class X-HELO: BLU004-OMC2S33.hotmail.com Received: from blu004-omc2s33.hotmail.com (HELO BLU004-OMC2S33.hotmail.com) (65.55.111.108) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-SHA256 encrypted) ESMTPS; Thu, 17 Mar 2016 22:41:59 +0000 Received: from BLU437-SMTP65 ([65.55.111.73]) by BLU004-OMC2S33.hotmail.com over TLS secured channel with Microsoft SMTPSVC(7.5.7601.23008); Thu, 17 Mar 2016 15:41:57 -0700 X-TMN: [dUPjjkwJZCWZtTZ/Nf7FYgbr2NJbWv8A] Message-ID: From: Cristiano De Alti To: gdb-patches@sourceware.org CC: Cristiano De Alti Subject: [PATCH] Minor fix in AVR prologue scan. Date: Thu, 17 Mar 2016 23:41:50 +0100 MIME-Version: 1.0 I use GDB from Eclipse with Avarice to debug AVR microcontrollers. While single stepping (stepi) through the instructions of a normal function prologue, stepping over the sbiw r28, 0x0f instruction, which is near the end of the prologue, causes the following change in the backtrace output: Before stepi: #0 0x000042b0 in HID_Device_USBTask (HIDInterfaceInfo=0x80b8b8) at ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.c:157 #1 0x000002e0 in main () at HIDRadio.c:83 After stepi: #0 0x000042b2 in HID_Device_USBTask (HIDInterfaceInfo=0x8000ff) at ../../LUFA/Drivers/USB/Class/Device/HIDClassDevice.c:157 #1 0x00017170 in ?? () Note that the frame #1 is inconsistent. If you now return from frame #0 with the finish command, the target does not stop at the return address at main. Instead, the target starts running and it's necessary to manually stop it. This is not a big issue and I'm not an expert of the gdb internals but the fix seems easy enough. gdb/ChangeLog: 2016-03-17 Cristiano De Alti * avr-tdep.c (avr_scan_prologue): fix comparison to detect the prologue limits. --- gdb/avr-tdep.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/gdb/avr-tdep.c b/gdb/avr-tdep.c index 993e92b..a8080db 100644 --- a/gdb/avr-tdep.c +++ b/gdb/avr-tdep.c @@ -833,25 +833,26 @@ avr_scan_prologue (struct gdbarch *gdbarch, CORE_ADDR pc_beg, CORE_ADDR pc_end, or signal handler functions, which is why we set the prologue type when we saw the beginning of the prologue previously. */ - if (vpc + sizeof (img_sig) < len + if (vpc + sizeof (img_sig) <= len && memcmp (prologue + vpc, img_sig, sizeof (img_sig)) == 0) { + info->size += locals_size; vpc += sizeof (img_sig); } - else if (vpc + sizeof (img_int) < len + else if (vpc + sizeof (img_int) <= len && memcmp (prologue + vpc, img_int, sizeof (img_int)) == 0) { + info->size += locals_size; vpc += sizeof (img_int); } - if (vpc + sizeof (img) < len + if (vpc + sizeof (img) <= len && memcmp (prologue + vpc, img, sizeof (img)) == 0) { + info->size += locals_size; info->prologue_type = AVR_PROLOGUE_NORMAL; vpc += sizeof (img); } - info->size += locals_size; - /* Fall through. */ }