From 325d39e4e09f0b7c8eec7e33ca93d0a9c82632ec Mon Sep 17 00:00:00 2001 From: Hannes Domani Date: Sat, 2 Jan 2021 13:51:27 +0100 Subject: [PATCH] Add Python support for hardware breakpoints This allows the creation of hardware breakpoints in Python with gdb.Breakpoint(type=gdb.BP_HARDWARE_BREAKPOINT) And they are included in the sequence returned by gdb.breakpoints(). gdb/ChangeLog: 2021-01-21 Hannes Domani PR python/19151 * python/py-breakpoint.c (bppy_get_location): Handle bp_hardware_breakpoint. (bppy_init): Likewise. (gdbpy_breakpoint_created): Likewise. gdb/doc/ChangeLog: 2021-01-21 Hannes Domani PR python/19151 * python.texi (Breakpoints In Python): Document gdb.BP_HARDWARE_BREAKPOINT. gdb/testsuite/ChangeLog: 2021-01-21 Hannes Domani PR python/19151 * gdb.python/py-breakpoint.exp: Add tests for hardware breakpoints. --- gdb/ChangeLog | 8 ++++++++ gdb/doc/ChangeLog | 6 ++++++ gdb/doc/python.texi | 4 ++++ gdb/python/py-breakpoint.c | 8 ++++++-- gdb/testsuite/ChangeLog | 5 +++++ gdb/testsuite/gdb.python/py-breakpoint.exp | 24 ++++++++++++++++++++++ 6 files changed, 53 insertions(+), 2 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index b51bb152105..468447dd03a 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2021-01-21 Hannes Domani + + PR python/19151 + * python/py-breakpoint.c (bppy_get_location): Handle + bp_hardware_breakpoint. + (bppy_init): Likewise. + (gdbpy_breakpoint_created): Likewise. + 2021-01-21 Simon Marchi * arm-tdep.c (arm_debug_printf): Add and use throughout file. diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index d718fdda75e..64eb52bd521 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,9 @@ +2021-01-21 Hannes Domani + + PR python/19151 + * python.texi (Breakpoints In Python): Document + gdb.BP_HARDWARE_BREAKPOINT. + 2021-01-01 Joel Brobecker * gdb.texinfo, refcard.tex: Update copyright year range. diff --git a/gdb/doc/python.texi b/gdb/doc/python.texi index 0f776f54768..35568594f58 100644 --- a/gdb/doc/python.texi +++ b/gdb/doc/python.texi @@ -5402,6 +5402,10 @@ module: @item gdb.BP_BREAKPOINT Normal code breakpoint. +@vindex BP_HARDWARE_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 9f6ae96266f..3fbb1c633ff 100644 --- a/gdb/python/py-breakpoint.c +++ b/gdb/python/py-breakpoint.c @@ -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}, @@ -383,7 +384,8 @@ bppy_get_location (PyObject *self, void *closure) BPPY_REQUIRE_VALID (obj); - if (obj->bp->type != bp_breakpoint) + if (obj->bp->type != bp_breakpoint + && obj->bp->type != bp_hardware_breakpoint) Py_RETURN_NONE; const char *str = event_location_to_string (obj->bp->location.get ()); @@ -793,6 +795,7 @@ bppy_init (PyObject *self, PyObject *args, PyObject *kwargs) switch (type) { case bp_breakpoint: + case bp_hardware_breakpoint: { event_location_up location; symbol_name_match_type func_name_match_type @@ -834,7 +837,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, ops, @@ -1008,6 +1011,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/ChangeLog b/gdb/testsuite/ChangeLog index 554d9e0823e..507b985e7a8 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2021-01-21 Hannes Domani + + PR python/19151 + * gdb.python/py-breakpoint.exp: Add tests for hardware breakpoints. + 2021-01-20 Simon Marchi * lib/tuiterm.exp: Rename _cur_x/_cur_y to _cur_col/_cur_row. diff --git a/gdb/testsuite/gdb.python/py-breakpoint.exp b/gdb/testsuite/gdb.python/py-breakpoint.exp index 3c06a89856e..64a70abb126 100644 --- a/gdb/testsuite/gdb.python/py-breakpoint.exp +++ b/gdb/testsuite/gdb.python/py-breakpoint.exp @@ -252,6 +252,29 @@ proc_with_prefix test_bkpt_invisible { } { "Check maint info breakpoints shows invisible breakpoints" } +proc_with_prefix test_hardware_breakpoints { } { + global srcfile testfile hex decimal + + # Start with a fresh gdb. + clean_restart ${testfile} + + if ![runto_main] then { + fail "cannot run to main." + return 0 + } + + delete_breakpoints + + gdb_test "python hbp1 = gdb.Breakpoint(\"add\", type=gdb.BP_HARDWARE_BREAKPOINT)" \ + ".*Hardware assisted breakpoint ($decimal)+ at .*$srcfile, line ($decimal)+\." \ + "Set hardware breakpoint" + gdb_test "python print (gdb.breakpoints()\[0\].type == gdb.BP_HARDWARE_BREAKPOINT)" \ + "True" "Check hardware breakpoint type" + gdb_test "continue" \ + ".*Breakpoint ($decimal)+, add.*" \ + "Test hardware breakpoint stop" +} + proc_with_prefix test_watchpoints { } { global srcfile testfile hex decimal @@ -718,6 +741,7 @@ test_bkpt_basic test_bkpt_deletion test_bkpt_cond_and_cmds test_bkpt_invisible +test_hardware_breakpoints test_watchpoints test_bkpt_internal test_bkpt_eval_funcs -- 2.30.2