From patchwork Wed Mar 23 16:09:40 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yao Qi X-Patchwork-Id: 11492 Received: (qmail 90431 invoked by alias); 23 Mar 2016 16:10:11 -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 90357 invoked by uid 89); 23 Mar 2016 16:10:10 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.6 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 spammy= X-HELO: mail-pf0-f194.google.com Received: from mail-pf0-f194.google.com (HELO mail-pf0-f194.google.com) (209.85.192.194) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Wed, 23 Mar 2016 16:09:54 +0000 Received: by mail-pf0-f194.google.com with SMTP id x3so4557635pfb.0 for ; Wed, 23 Mar 2016 09:09:54 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=rmv8TWlfZ1qdXS+NhJuPGNRViTc3PnAKYG1RSrjO3js=; b=ASAIpgLeqXuKOZHUDUc7PAXWKnWYwig5cCnPzRtslDitb63morRQNSi85Qv+FcL1cK qJCpGCDITns7sMnVca7uCKcAP69sV/wy3nptZpWxYVGzrwIwxxRHeVfHaCYbW22Wpt6p +xbVThJyH1XB/+rt68hmRxjX1ymtgFhYniLEa6N3AamCiXjp54hM56VyiIG9kC5zsw+U 8K0otMpFVrOJd1hH9kriVMUUQsIOdlZAY1dz+ukHbt36DDri8f5haBziYQ0QYblZ4afX NBSZO7+vd1eIDdN2e6HRE/a2ltKGF67wK2mEzzBE84wAy+OZQRVVerEiDs8n1fIE99Ne bUAA== X-Gm-Message-State: AD7BkJKYyM84f0IW/p3xSTzj/16MYPoSucwpD39k41y0ic7UJOh1lzp38cpE6ABhn0agog== X-Received: by 10.98.72.16 with SMTP id v16mr5445761pfa.5.1458749392712; Wed, 23 Mar 2016 09:09:52 -0700 (PDT) Received: from E107787-LIN.cambridge.arm.com (gcc1-power7.osuosl.org. [140.211.15.137]) by smtp.gmail.com with ESMTPSA id 79sm5206701pfq.65.2016.03.23.09.09.51 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 23 Mar 2016 09:09:52 -0700 (PDT) From: Yao Qi X-Google-Original-From: Yao Qi To: gdb-patches@sourceware.org Subject: [PATCH 3/7] Force to insert software single step breakpoint Date: Wed, 23 Mar 2016 16:09:40 +0000 Message-Id: <1458749384-19793-4-git-send-email-yao.qi@linaro.org> In-Reply-To: <1458749384-19793-1-git-send-email-yao.qi@linaro.org> References: <1458749384-19793-1-git-send-email-yao.qi@linaro.org> X-IsSubscribed: yes GDB doesn't insert software single step breakpoint if the instruction branches to itself, so that the program can't stop after command "si". (gdb) b 32 Breakpoint 2 at 0x8680: file git/gdb/testsuite/gdb.base/branch-to-self.c, line 32. (gdb) c Continuing. Breakpoint 2, main () at gdb/git/gdb/testsuite/gdb.base/branch-to-self.c:32 32 asm (".Lhere: " BRANCH_INSN " .Lhere"); /* loop-line */ (gdb) si infrun: clear_proceed_status_thread (Thread 3991.3991) infrun: proceed (addr=0xffffffff, signal=GDB_SIGNAL_DEFAULT) infrun: step-over queue now empty infrun: resuming [Thread 3991.3991] for step-over infrun: skipping breakpoint: stepping past insn at: 0x8680 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Sending packet: $Z0,8678,4#f3...Packet received: OK infrun: skipping breakpoint: stepping past insn at: 0x8680 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Sending packet: $Z0,b6fe86c8,4#82...Packet received: OK infrun: resume (step=1, signal=GDB_SIGNAL_0), trap_expected=1, current thread [Thread 3991.3991] at 0x868 breakpoint.c:should_be_inserted thinks the breakpoint shouldn't be inserted, which is wrong. This patch restrict the condition that only return false if breakpoint is NOT single step breakpoint. gdb: 2016-03-23 Yao Qi * breakpoint.c (should_be_inserted): Don't return 0 if single step breakpoint is inserted at the address we're stepping over. * gdbarch.sh (software_single_step): Update comments. * gdbarch.h: Regenerated. --- gdb/breakpoint.c | 9 ++++++++- gdb/gdbarch.h | 5 ++++- gdb/gdbarch.sh | 5 ++++- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index f99a7ab..9ecfb07 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -2219,9 +2219,16 @@ should_be_inserted (struct bp_location *bl) return 0; /* Don't insert a breakpoint if we're trying to step past its - location. */ + location except single step breakpoint, because the single step + breakpoint may be inserted at the location we're trying to step + if the instruction branches to itself. However, the instruction + won't be executed at all and it may break the semantics of the + instruction, for example, the instruction is a conditional + branch or updates some flags. We can't fix it unless GDB is able + to emulate the instruction or switch to displaced stepping. */ if ((bl->loc_type == bp_loc_software_breakpoint || bl->loc_type == bp_loc_hardware_breakpoint) + && bl->owner->type != bp_single_step && stepping_past_instruction_at (bl->pspace->aspace, bl->address)) { diff --git a/gdb/gdbarch.h b/gdb/gdbarch.h index 252fc4b..ba3d4ca 100644 --- a/gdb/gdbarch.h +++ b/gdb/gdbarch.h @@ -650,7 +650,10 @@ extern void set_gdbarch_addr_bits_remove (struct gdbarch *gdbarch, gdbarch_addr_ target can single step. If not, then implement single step using breakpoints. A return value of 1 means that the software_single_step breakpoints - were inserted; 0 means they were not. */ + were inserted; 0 means they were not. Multiple breakpoints may be + inserted for some instructions such as conditional branch. However, + each implementation must always evaluate the condition and only put + the breakpoint at the branch destination if the condition is true. */ extern int gdbarch_software_single_step_p (struct gdbarch *gdbarch); diff --git a/gdb/gdbarch.sh b/gdb/gdbarch.sh index 37f59b7..8192370 100755 --- a/gdb/gdbarch.sh +++ b/gdb/gdbarch.sh @@ -609,7 +609,10 @@ m:CORE_ADDR:addr_bits_remove:CORE_ADDR addr:addr::core_addr_identity::0 # target can single step. If not, then implement single step using breakpoints. # # A return value of 1 means that the software_single_step breakpoints -# were inserted; 0 means they were not. +# were inserted; 0 means they were not. Multiple breakpoints may be +# inserted for some instructions such as conditional branch. However, +# each implementation must always evaluate the condition and only put +# the breakpoint at the branch destination if the condition is true. F:int:software_single_step:struct frame_info *frame:frame # Return non-zero if the processor is executing a delay slot and a