From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id J7Q/BjQKq18oGQAAWB0awg (envelope-from ) for ; Tue, 10 Nov 2020 16:46:28 -0500 Received: by simark.ca (Postfix, from userid 112) id E9D411E58E; Tue, 10 Nov 2020 16:46:27 -0500 (EST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on simark.ca X-Spam-Level: X-Spam-Status: No, score=0.2 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,MAILING_LIST_MULTI,RDNS_NONE,URIBL_BLOCKED autolearn=no autolearn_force=no version=3.4.2 Received: from sourceware.org (unknown [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id 1EE571E58E for ; Tue, 10 Nov 2020 16:46:26 -0500 (EST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id CAE943840C0C; Tue, 10 Nov 2020 21:46:23 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org CAE943840C0C DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1605044783; bh=mr4LPOw3+QR5D81IvnDopMgUA7QJipNuqxyP8/j1x5I=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=oEoeAuOoqxLr54DG2BU1HJ0pz2YMtAibNCve7Rt1+zfK0XsOd17yJ10z9WA4+jinJ XyxMxrmnjtUoYrvl235jH60tNhm2kkS2+ttd8KKPrVU7U4eb+69efegEJBbplsfjrD ypoIA0fgUba02fo5EZDZVZFDulV3njHoqajDyIpc= Received: from barracuda.ebox.ca (barracuda.ebox.ca [96.127.255.19]) by sourceware.org (Postfix) with ESMTPS id DE1683986838 for ; Tue, 10 Nov 2020 21:46:18 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org DE1683986838 X-ASG-Debug-ID: 1605044777-0c856e6cd6716a0001-fS2M51 Received: from smtp.ebox.ca (smtp.ebox.ca [96.127.255.82]) by barracuda.ebox.ca with ESMTP id pQHXHMSYeEJXiZMX (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 10 Nov 2020 16:46:17 -0500 (EST) X-Barracuda-Envelope-From: simon.marchi@efficios.com X-Barracuda-RBL-Trusted-Forwarder: 96.127.255.82 Received: from epycamd.internal.efficios.com (192-222-181-218.qc.cable.ebox.net [192.222.181.218]) by smtp.ebox.ca (Postfix) with ESMTP id 2F081441D66; Tue, 10 Nov 2020 16:46:17 -0500 (EST) X-Barracuda-RBL-IP: 192.222.181.218 X-Barracuda-Effective-Source-IP: 192-222-181-218.qc.cable.ebox.net[192.222.181.218] X-Barracuda-Apparent-Source-IP: 192.222.181.218 To: gdb-patches@sourceware.org Subject: [PATCH 08/12] gdb: move displaced stepping types to displaced-stepping.{h, c} Date: Tue, 10 Nov 2020 16:46:10 -0500 X-ASG-Orig-Subj: [PATCH 08/12] gdb: move displaced stepping types to displaced-stepping.{h, c} Message-Id: <20201110214614.2842615-9-simon.marchi@efficios.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20201110214614.2842615-1-simon.marchi@efficios.com> References: <20201110214614.2842615-1-simon.marchi@efficios.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: smtp.ebox.ca[96.127.255.82] X-Barracuda-Start-Time: 1605044777 X-Barracuda-Encrypted: DHE-RSA-AES256-SHA X-Barracuda-URL: https://96.127.255.19:443/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at ebox.ca X-Barracuda-Scan-Msg-Size: 12758 X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using global scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=8.0 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.85785 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , From: Simon Marchi via Gdb-patches Reply-To: Simon Marchi Cc: Simon Marchi Errors-To: gdb-patches-bounces@sourceware.org Sender: "Gdb-patches" Move displaced-stepping related stuff unchanged to displaced-stepping.h and displaced-stepping.c. This helps make the following patch a bit smaller and easier to read. gdb/ChangeLog: * Makefile.in (COMMON_SFILES): Add displaced-stepping.c. * aarch64-tdep.h: Include displaced-stepping.h. * displaced-stepping.h (struct displaced_step_copy_insn_closure): Move here. (displaced_step_copy_insn_closure_up): Move here. (struct buf_displaced_step_copy_insn_closure): Move here. (struct displaced_step_inferior_state): Move here. (debug_displaced): Move here. (displaced_debug_printf_1): Move here. (displaced_debug_printf): Move here. * displaced-stepping.c: New file. * gdbarch.sh: Include displaced-stepping.h in gdbarch.h. * gdbarch.h: Re-generate. * inferior.h: Include displaced-stepping.h. * infrun.h (debug_displaced): Move to displaced-stepping.h. (displaced_debug_printf_1): Likewise. (displaced_debug_printf): Likewise. (struct displaced_step_copy_insn_closure): Likewise. (displaced_step_copy_insn_closure_up): Likewise. (struct buf_displaced_step_copy_insn_closure): Likewise. (struct displaced_step_inferior_state): Likewise. * infrun.c (show_debug_displaced): Move to displaced-stepping.c. (displaced_debug_printf_1): Likewise. (displaced_step_copy_insn_closure::~displaced_step_copy_insn_closure): Likewise. (_initialize_infrun): Don't register "set/show debug displaced". Change-Id: I29935f5959b80425370630a45148fc06cd4227ca --- gdb/Makefile.in | 1 + gdb/aarch64-tdep.h | 1 + gdb/displaced-stepping.c | 52 +++++++++++++++++++++++++ gdb/displaced-stepping.h | 84 ++++++++++++++++++++++++++++++++++++++++ gdb/gdbarch.h | 1 + gdb/gdbarch.sh | 1 + gdb/inferior.h | 1 + gdb/infrun.c | 22 ----------- gdb/infrun.h | 78 ------------------------------------- 9 files changed, 141 insertions(+), 100 deletions(-) create mode 100644 gdb/displaced-stepping.c diff --git a/gdb/Makefile.in b/gdb/Makefile.in index c46935efafa..f8a962549ac 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -1015,6 +1015,7 @@ COMMON_SFILES = \ debuginfod-support.c \ dictionary.c \ disasm.c \ + displaced-stepping.c \ dummy-frame.c \ dwarf2/abbrev.c \ dwarf2/attribute.c \ diff --git a/gdb/aarch64-tdep.h b/gdb/aarch64-tdep.h index 895aa5977f0..76ff812abc6 100644 --- a/gdb/aarch64-tdep.h +++ b/gdb/aarch64-tdep.h @@ -23,6 +23,7 @@ #define AARCH64_TDEP_H #include "arch/aarch64.h" +#include "displaced-stepping.h" #include "infrun.h" /* Forward declarations. */ diff --git a/gdb/displaced-stepping.c b/gdb/displaced-stepping.c new file mode 100644 index 00000000000..5ae280fac39 --- /dev/null +++ b/gdb/displaced-stepping.c @@ -0,0 +1,52 @@ +/* Displaced stepping related things. + + Copyright (C) 2020 Free Software Foundation, Inc. + + This file is part of GDB. + + 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 + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include "defs.h" +#include "displaced-stepping.h" +#include "cli/cli-cmds.h" + +#include "command.h" + +/* Default destructor for displaced_step_copy_insn_closure. */ + +displaced_step_copy_insn_closure::~displaced_step_copy_insn_closure () + = default; + +bool debug_displaced = false; + +static void +show_debug_displaced (struct ui_file *file, int from_tty, + struct cmd_list_element *c, const char *value) +{ + fprintf_filtered (file, _("Displace stepping debugging is %s.\n"), value); +} + +void _initialize_displaced_stepping (); +void +_initialize_displaced_stepping () +{ + add_setshow_boolean_cmd ("displaced", class_maintenance, + &debug_displaced, _("\ +Set displaced stepping debugging."), _("\ +Show displaced stepping debugging."), _("\ +When non-zero, displaced stepping specific debugging is enabled."), + NULL, + show_debug_displaced, + &setdebuglist, &showdebuglist); +} diff --git a/gdb/displaced-stepping.h b/gdb/displaced-stepping.h index 9c7e85c3769..99343f84e44 100644 --- a/gdb/displaced-stepping.h +++ b/gdb/displaced-stepping.h @@ -20,6 +20,24 @@ #ifndef DISPLACED_STEPPING_H #define DISPLACED_STEPPING_H +#include "gdbsupport/byte-vector.h" + +struct thread_info; + +/* True if we are debugging displaced stepping. */ + +extern bool debug_displaced; + +/* Print a "displaced" debug statement. */ + +#define displaced_debug_printf(fmt, ...) \ + do \ + { \ + if (debug_displaced) \ + debug_prefixed_printf ("displaced", __func__, fmt, ##__VA_ARGS__); \ + } \ + while (0) + enum displaced_step_prepare_status { /* A displaced stepping buffer was successfully allocated and prepared. */ @@ -43,4 +61,70 @@ enum displaced_step_finish_status DISPLACED_STEP_FINISH_STATUS_NOT_EXECUTED, }; +/* Base class for displaced stepping closures (the arch-specific data). */ + +struct displaced_step_copy_insn_closure +{ + virtual ~displaced_step_copy_insn_closure () = 0; +}; + +using displaced_step_copy_insn_closure_up + = std::unique_ptr; + +/* A simple displaced step closure that contains only a byte buffer. */ + +struct buf_displaced_step_copy_insn_closure : displaced_step_copy_insn_closure +{ + buf_displaced_step_copy_insn_closure (int buf_size) + : buf (buf_size) + {} + + gdb::byte_vector buf; +}; + +/* Per-inferior displaced stepping state. */ + +struct displaced_step_inferior_state +{ + displaced_step_inferior_state () + { + reset (); + } + + /* Put this object back in its original state. */ + void reset () + { + failed_before = 0; + step_thread = nullptr; + step_gdbarch = nullptr; + step_closure.reset (); + step_original = 0; + step_copy = 0; + step_saved_copy.clear (); + } + + /* True if preparing a displaced step ever failed. If so, we won't + try displaced stepping for this inferior again. */ + int failed_before; + + /* If this is not nullptr, this is the thread carrying out a + displaced single-step in process PID. This thread's state will + require fixing up once it has completed its step. */ + thread_info *step_thread; + + /* The architecture the thread had when we stepped it. */ + gdbarch *step_gdbarch; + + /* The closure provided gdbarch_displaced_step_copy_insn, to be used + for post-step cleanup. */ + displaced_step_copy_insn_closure_up step_closure; + + /* The address of the original instruction, and the copy we + made. */ + CORE_ADDR step_original, step_copy; + + /* Saved contents of copy area. */ + gdb::byte_vector step_saved_copy; +}; + #endif /* DISPLACED_STEPPING_H */ diff --git a/gdb/gdbarch.h b/gdb/gdbarch.h index 0e4e4da0c1b..883f8fb3329 100644 --- a/gdb/gdbarch.h +++ b/gdb/gdbarch.h @@ -31,6 +31,7 @@ #include "gdb_obstack.h" #include "infrun.h" #include "osabi.h" +#include "displaced-stepping.h" struct floatformat; struct ui_file; diff --git a/gdb/gdbarch.sh b/gdb/gdbarch.sh index d096b7bffec..47007807c1e 100755 --- a/gdb/gdbarch.sh +++ b/gdb/gdbarch.sh @@ -1270,6 +1270,7 @@ cat <; - -/* A simple displaced step closure that contains only a byte buffer. */ - -struct buf_displaced_step_copy_insn_closure : displaced_step_copy_insn_closure -{ - buf_displaced_step_copy_insn_closure (int buf_size) - : buf (buf_size) - {} - - gdb::byte_vector buf; -}; - -/* Per-inferior displaced stepping state. */ -struct displaced_step_inferior_state -{ - displaced_step_inferior_state () - { - reset (); - } - - /* Put this object back in its original state. */ - void reset () - { - failed_before = 0; - step_thread = nullptr; - step_gdbarch = nullptr; - step_closure.reset (); - step_original = 0; - step_copy = 0; - step_saved_copy.clear (); - } - - /* True if preparing a displaced step ever failed. If so, we won't - try displaced stepping for this inferior again. */ - int failed_before; - - /* If this is not nullptr, this is the thread carrying out a - displaced single-step in process PID. This thread's state will - require fixing up once it has completed its step. */ - thread_info *step_thread; - - /* The architecture the thread had when we stepped it. */ - gdbarch *step_gdbarch; - - /* The closure provided gdbarch_displaced_step_copy_insn, to be used - for post-step cleanup. */ - displaced_step_copy_insn_closure_up step_closure; - - /* The address of the original instruction, and the copy we - made. */ - CORE_ADDR step_original, step_copy; - - /* Saved contents of copy area. */ - gdb::byte_vector step_saved_copy; -}; - #endif /* INFRUN_H */ -- 2.28.0