From patchwork Mon Apr 30 11:46:57 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Phil Muldoon X-Patchwork-Id: 27031 Received: (qmail 93874 invoked by alias); 30 Apr 2018 11:47:06 -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 93827 invoked by uid 89); 30 Apr 2018 11:47:04 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.2 spammy=Hardware, Break, maint, assisted X-HELO: mail-wr0-f173.google.com Received: from mail-wr0-f173.google.com (HELO mail-wr0-f173.google.com) (209.85.128.173) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 30 Apr 2018 11:47:02 +0000 Received: by mail-wr0-f173.google.com with SMTP id 94-v6so6433914wrf.5 for ; Mon, 30 Apr 2018 04:47:01 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:message-id:date:mime-version :content-language:content-transfer-encoding; bh=EUjzbTTJCFxRLRl7/X9IK0mhXr0SyS7OANCIOSRLG3w=; b=Xn7O0vYdJfsP+Udh0jWBZEuTGnQ6ymSsirArzwURNA+yYErrBTjs4GzMFuUDLEwRe0 aTdlQQJxOMNE3VkjcB4vC5zTk2/lX/d9rtjzYr9ajsH/Sa5/ybLRKpnzNOnOU4Z1EE3n Yl4o58NqNiEOIs2fNp+dtqdF0DFqIznWY5oopBDgW2wkALgeTSlCM+3aNvz2oraZDrN7 tEin/wbMBG8AywbYM2vXuVfyiw9vVEUgFg2hGLazxin0mE8QALD9hPL6NYfdK/kINBJs xISwU0hth2AYbiXAieEDJEaWxIp/TRul1vLy3HsVY4N7giEmIJrJEXkBCFQ8UcRev8I+ xotw== X-Gm-Message-State: ALQs6tB8uivbWydmU6vLr9ljR9RALOqVVVjOeqNupZ09XvC6CkVWJfEi DAK8sviVf4qFg4CPLG6p1K5jBwNd8OU= X-Google-Smtp-Source: AB8JxZqfCX+/55/hc9KrXvfoW1PKQYU2WP9VKco6RxZDpgpe6Jp8XJv6nWHEfqhOTUXpmi/mXaS7Ig== X-Received: by 2002:adf:e802:: with SMTP id o2-v6mr9366317wrm.123.1525088819816; Mon, 30 Apr 2018 04:46:59 -0700 (PDT) Received: from ?IPv6:2a02:c7f:ae6a:ed00:4685:ff:fe66:9f4? ([2a02:c7f:ae6a:ed00:4685:ff:fe66:9f4]) by smtp.gmail.com with ESMTPSA id u5sm13202847wmd.40.2018.04.30.04.46.58 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 30 Apr 2018 04:46:58 -0700 (PDT) From: Phil Muldoon To: "gdb-patches@sourceware.org" Subject: [python][patch] PR python/19151 Hardware breakpoints in GDB Python. Message-ID: <12c35b5f-aa8d-17b3-476d-2fbf4eb3587d@redhat.com> Date: Mon, 30 Apr 2018 12:46:57 +0100 MIME-Version: 1.0 X-IsSubscribed: yes This patch adds hardware breakpoint support for code based breakpoints to the Python API. Cheers, Phil 2018-04-30 Phil Muldoon PR python/19151 * python/py-breakpoint.c: Add hardware breakpoint constant gdb.BP_HARDWARE_BREAKPOINT. (bppy_init): Add bp_hardware_breakpoint case. Use the enum bptype variable 2018-04-30 Phil Muldoon * gdb.python/py-breakpoint.exp: Call test_hardware_breakpoints. (test_hardware_breakpoints): New function. 2018-04-30 Phil Muldoon * python.texi (Breakpoints In Python): Mention gdb.BP_HARDWARE_BREAKPOINT. diff --git a/gdb/doc/python.texi b/gdb/doc/python.texi index 28a7a1a9f5..9ca8f489bf 100644 --- a/gdb/doc/python.texi +++ b/gdb/doc/python.texi @@ -1,4 +1,4 @@ -@c Copyright (C) 2008-2017 Free Software Foundation, Inc. +@c Copyright (C) 2008-2018 Free Software Foundation, Inc. @c Permission is granted to copy, distribute and/or modify this document @c under the terms of the GNU Free Documentation License, Version 1.3 or @c any later version published by the Free Software Foundation; with the @@ -4888,20 +4888,20 @@ breakpoint (@pxref{Explicit Locations}) according to the specifications contained in the key words @var{source}, @var{function}, @var{label} and @var{line}. The optional @var{type} denotes the breakpoint to create from the types defined later in this -chapter. This argument can be either @code{gdb.BP_BREAKPOINT} or -@code{gdb.BP_WATCHPOINT}; it defaults to @code{gdb.BP_BREAKPOINT}. -The optional @var{internal} argument allows the breakpoint to become -invisible to the user. The breakpoint will neither be reported when -created, nor will it be listed in the output from @code{info -breakpoints} (but will be listed with the @code{maint info -breakpoints} command). The optional @var{temporary} argument makes -the breakpoint a temporary breakpoint. Temporary breakpoints are -deleted after they have been hit. Any further access to the Python -breakpoint after it has been hit will result in a runtime error (as -that breakpoint has now been automatically deleted). The optional -@var{wp_class} argument defines the class of watchpoint to create, if -@var{type} is @code{gdb.BP_WATCHPOINT}. If a watchpoint class is not -provided, it is assumed to be a @code{gdb.WP_WRITE} class. +chapter. This argument can be either @code{gdb.BP_BREAKPOINT}, +@code{gdb.BP_HARDWARE_BREAKPOINT} or @code{gdb.BP_WATCHPOINT}; it +defaults to @code{gdb.BP_BREAKPOINT}. The optional @var{internal} +argument allows the breakpoint to become invisible to the user. The +breakpoint will neither be reported when created, nor will it be listed +in the output from @code{info breakpoints} (but will be listed with the +@code{maint info breakpoints} command). The optional @var{temporary} +argument makes the breakpoint a temporary breakpoint. Temporary +breakpoints are deleted after they have been hit. Any further access to +the Python breakpoint after it has been hit will result in a runtime +error (as that breakpoint has now been automatically deleted). The +optional @var{wp_class} argument defines the class of watchpoint to +create, if @var{type} is @code{gdb.BP_WATCHPOINT}. If a watchpoint +class is not provided, it is assumed to be a @code{gdb.WP_WRITE} class. @end defun The available types are represented by constants defined in the @code{gdb} @@ -4912,6 +4912,10 @@ module: @item gdb.BP_BREAKPOINT Normal code breakpoint. +@vindex BP_BREAKPOINT +@item gdb.BP_HARDWARE_BREAKPOINT +Hardware assisted code breakpoint. + @vindex BP_WATCHPOINT @item gdb.BP_WATCHPOINT Watchpoint breakpoint. diff --git a/gdb/python/py-breakpoint.c b/gdb/python/py-breakpoint.c index f865317ab3..76a06898e9 100644 --- a/gdb/python/py-breakpoint.c +++ b/gdb/python/py-breakpoint.c @@ -1,6 +1,6 @@ /* Python interface to breakpoints - Copyright (C) 2008-2017 Free Software Foundation, Inc. + Copyright (C) 2008-2018 Free Software Foundation, Inc. This file is part of GDB. @@ -58,6 +58,7 @@ static struct pybp_code pybp_codes[] = { { "BP_NONE", bp_none}, { "BP_BREAKPOINT", bp_breakpoint}, + { "BP_HARDWARE_BREAKPOINT", bp_hardware_breakpoint}, { "BP_WATCHPOINT", bp_watchpoint}, { "BP_HARDWARE_WATCHPOINT", bp_hardware_watchpoint}, { "BP_READ_WATCHPOINT", bp_read_watchpoint}, @@ -757,6 +758,7 @@ bppy_init (PyObject *self, PyObject *args, PyObject *kwargs) switch (type) { case bp_breakpoint: + case bp_hardware_breakpoint: { event_location_up location; @@ -788,7 +790,7 @@ bppy_init (PyObject *self, PyObject *args, PyObject *kwargs) create_breakpoint (python_gdbarch, location.get (), NULL, -1, NULL, 0, - temporary_bp, bp_breakpoint, + temporary_bp, type, 0, AUTO_BOOLEAN_TRUE, &bkpt_breakpoint_ops, @@ -963,6 +965,7 @@ gdbpy_breakpoint_created (struct breakpoint *bp) return; if (bp->type != bp_breakpoint + && bp->type != bp_hardware_breakpoint && bp->type != bp_watchpoint && bp->type != bp_hardware_watchpoint && bp->type != bp_read_watchpoint diff --git a/gdb/testsuite/gdb.python/py-breakpoint.exp b/gdb/testsuite/gdb.python/py-breakpoint.exp index e89b9b8446..fdce60839a 100644 --- a/gdb/testsuite/gdb.python/py-breakpoint.exp +++ b/gdb/testsuite/gdb.python/py-breakpoint.exp @@ -1,4 +1,4 @@ -# Copyright (C) 2010-2017 Free Software Foundation, Inc. +# Copyright (C) 2010-2018 Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -610,6 +610,33 @@ proc test_bkpt_explicit_loc {} { } } +# Test hardware assisted breakpoints +proc_with_prefix test_hardware_breakpoints { } { + global srcfile testfile decimal + + # Start with a fresh gdb. + clean_restart ${testfile} + + if {[skip_hw_breakpoint_tests]} { + unsupported "Hardware breakpoints." + } + + if ![runto_main] then { + fail "cannot run to main." + return 0 + } + + set hardware_location [gdb_get_line_number "Break at multiply."] + gdb_test "python hbp = gdb.Breakpoint (\"$hardware_location\", type=gdb.BP_HARDWARE_BREAKPOINT)" \ + ".*Hardware assisted breakpoint ($decimal)+ at .*$srcfile, line ($decimal)+\." \ + "Set hardware breakpoint" + gdb_continue_to_breakpoint "Break at multiply." \ + ".*$srcfile:$hardware_location.*" + gdb_test "info breakpoints" \ + "2.*hw breakpoint.*$srcfile:$hardware_location.*" \ + "Check info breakpoints shows a hardware breakpoint" +} + test_bkpt_basic test_bkpt_deletion test_bkpt_cond_and_cmds @@ -622,3 +649,4 @@ test_bkpt_address test_bkpt_pending test_bkpt_events test_bkpt_explicit_loc +test_hardware_breakpoints