From patchwork Sat Apr 14 19:09:49 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pedro Alves X-Patchwork-Id: 26731 Received: (qmail 29950 invoked by alias); 14 Apr 2018 19:18:21 -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 29821 invoked by uid 89); 14 Apr 2018 19:18:20 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.6 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3 autolearn=ham version=3.3.2 spammy=DOS, redirect, terminal X-HELO: mx1.redhat.com Received: from mx3-rdu2.redhat.com (HELO mx1.redhat.com) (66.187.233.73) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sat, 14 Apr 2018 19:18:18 +0000 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 450DF4305C70 for ; Sat, 14 Apr 2018 19:10:18 +0000 (UTC) Received: from localhost.localdomain (ovpn04.gateway.prod.ext.ams2.redhat.com [10.39.146.4]) by smtp.corp.redhat.com (Postfix) with ESMTP id E97A1215CDC8 for ; Sat, 14 Apr 2018 19:10:17 +0000 (UTC) From: Pedro Alves To: gdb-patches@sourceware.org Subject: [PATCH 36/40] target_ops/C++: go32/DJGPP Date: Sat, 14 Apr 2018 20:09:49 +0100 Message-Id: <20180414190953.24481-37-palves@redhat.com> In-Reply-To: <20180414190953.24481-1-palves@redhat.com> References: <20180414190953.24481-1-palves@redhat.com> Straightforward conversion. Build tested with a cross compiler. --- gdb/go32-nat.c | 181 +++++++++++++++++++++++++++++++-------------------------- 1 file changed, 97 insertions(+), 84 deletions(-) diff --git a/gdb/go32-nat.c b/gdb/go32-nat.c index f9a52a7a77..dcf60cb3d2 100644 --- a/gdb/go32-nat.c +++ b/gdb/go32-nat.c @@ -232,7 +232,6 @@ static int dr_ref_count[4]; #define SOME_PID 42 static int prog_has_started = 0; -static void go32_mourn_inferior (struct target_ops *ops); #define r_ofs(x) (offsetof(TSS,x)) @@ -335,8 +334,56 @@ static struct { {GDB_SIGNAL_LAST, -1} }; -static void -go32_attach (struct target_ops *ops, const char *args, int from_tty) +/* The go32 target. */ + +class go32_nat_target : public x86_nat_target +{ + void attach (const char *, int) override; + + void resume (ptid_t, int, enum gdb_signal) override; + + ptid_t wait (ptid_t, struct target_waitstatus *, int) override; + + void fetch_registers (struct regcache *, int) override; + void store_registers (struct regcache *, int) override; + + enum target_xfer_status xfer_partial (enum target_object object, + const char *annex, + gdb_byte *readbuf, + const gdb_byte *writebuf, + ULONGEST offset, ULONGEST len, + ULONGEST *xfered_len) override; + + void files_info () override; + + void terminal_init () override; + + void terminal_inferior () override; + + void terminal_ours_for_output () override; + + void terminal_ours () override; + + void terminal_info (const char *, int) override; + + void pass_ctrlc () override; + + void kill () override; + + void create_inferior (const char *, const std::string &, + char **, int) override; + + void mourn_inferior () override; + + int thread_alive (ptid_t ptid) override; + + const char *pid_to_str (ptid_t) override; +}; + +static go32_nat_target the_go32_nat_target; + +void +go32_nat_target::attach (const char *args, int from_tty) { error (_("\ You cannot attach to a running program on this platform.\n\ @@ -346,9 +393,8 @@ Use the `run' command to run DJGPP programs.")); static int resume_is_step; static int resume_signal = -1; -static void -go32_resume (struct target_ops *ops, - ptid_t ptid, int step, enum gdb_signal siggnal) +void +go32_nat_target::resume (ptid_t ptid, int step, enum gdb_signal siggnal) { int i; @@ -371,9 +417,9 @@ go32_resume (struct target_ops *ops, static char child_cwd[FILENAME_MAX]; -static ptid_t -go32_wait (struct target_ops *ops, - ptid_t ptid, struct target_waitstatus *status, int options) +ptid_t +go32_nat_target::wait (ptid_t ptid, struct target_waitstatus *status, + int options) { int i; unsigned char saved_opcode; @@ -505,9 +551,8 @@ fetch_register (struct regcache *regcache, int regno) _("Invalid register no. %d in fetch_register."), regno); } -static void -go32_fetch_registers (struct target_ops *ops, - struct regcache *regcache, int regno) +void +go32_nat_target::fetch_registers (struct regcache *regcache, int regno) { if (regno >= 0) fetch_register (regcache, regno); @@ -536,9 +581,8 @@ store_register (const struct regcache *regcache, int regno) _("Invalid register no. %d in store_register."), regno); } -static void -go32_store_registers (struct target_ops *ops, - struct regcache *regcache, int regno) +void +go32_nat_target::store_registers (struct regcache *regcache, int regno) { unsigned r; @@ -598,11 +642,12 @@ go32_xfer_memory (gdb_byte *readbuf, const gdb_byte *writebuf, /* Target to_xfer_partial implementation. */ -static enum target_xfer_status -go32_xfer_partial (struct target_ops *ops, enum target_object object, - const char *annex, gdb_byte *readbuf, - const gdb_byte *writebuf, ULONGEST offset, ULONGEST len, - ULONGEST *xfered_len) +enum target_xfer_status +go32_nat_target::xfer_partial (enum target_object object, + const char *annex, gdb_byte *readbuf, + const gdb_byte *writebuf, ULONGEST offset, + ULONGEST len, + ULONGEST *xfered_len) { switch (object) { @@ -610,30 +655,30 @@ go32_xfer_partial (struct target_ops *ops, enum target_object object, return go32_xfer_memory (readbuf, writebuf, offset, len, xfered_len); default: - return ops->beneath->to_xfer_partial (ops->beneath, object, annex, - readbuf, writebuf, offset, len, - xfered_len); + return this->beneath->xfer_partial (object, annex, + readbuf, writebuf, offset, len, + xfered_len); } } static cmdline_t child_cmd; /* Parsed child's command line kept here. */ -static void -go32_files_info (struct target_ops *target) +void +go32_nat_target::files_info () { printf_unfiltered ("You are running a DJGPP V2 program.\n"); } -static void -go32_kill_inferior (struct target_ops *ops) +void +go32_nat_target::kill_inferior () { - go32_mourn_inferior (ops); + mourn_inferior (); } -static void -go32_create_inferior (struct target_ops *ops, - const char *exec_file, - const std::string &allargs, char **env, int from_tty) +void +go32_nat_target::create_inferior (const char *exec_file, + const std::string &allargs, + char **env, int from_tty) { extern char **environ; jmp_buf start_state; @@ -711,8 +756,8 @@ go32_create_inferior (struct target_ops *ops, inf = current_inferior (); inferior_appeared (inf, SOME_PID); - if (!target_is_pushed (ops)) - push_target (ops); + if (!target_is_pushed (this)) + push_target (this); add_thread_silent (inferior_ptid); @@ -721,8 +766,8 @@ go32_create_inferior (struct target_ops *ops, prog_has_started = 1; } -static void -go32_mourn_inferior (struct target_ops *ops) +void +go32_nat_target::mourn_inferior () { ptid_t ptid; @@ -747,7 +792,7 @@ go32_mourn_inferior (struct target_ops *ops) prog_has_started = 0; generic_mourn_inferior (); - inf_child_maybe_unpush_target (ops); + maybe_unpush_target (); } /* Hardware watchpoint support. */ @@ -852,15 +897,15 @@ static int inf_terminal_mode; second call will always see GDB's own cooked terminal. */ static int terminal_is_ours = 1; -static void -go32_terminal_init (struct target_ops *self) +void +go32_nat_target::terminal_init () { inf_mode_valid = 0; /* Reinitialize, in case they are restarting child. */ terminal_is_ours = 1; } -static void -go32_terminal_info (struct target_ops *self, const char *args, int from_tty) +void +go32_nat_target::terminal_info (const char *args, int from_tty) { printf_unfiltered ("Inferior's terminal is in %s mode.\n", !inf_mode_valid @@ -889,8 +934,8 @@ go32_terminal_info (struct target_ops *self, const char *args, int from_tty) #endif } -static void -go32_terminal_inferior (struct target_ops *self) +void +go32_nat_target::terminal_inferior () { /* Redirect standard handles as child wants them. */ errno = 0; @@ -910,8 +955,8 @@ go32_terminal_inferior (struct target_ops *self) } } -static void -go32_terminal_ours (struct target_ops *self) +void +go32_nat_target::terminal_ours () { /* Switch to cooked mode on the gdb terminal and save the inferior terminal mode to be restored when it is resumed. */ @@ -937,52 +982,23 @@ go32_terminal_ours (struct target_ops *self) } } -static void -go32_pass_ctrlc (struct target_ops *self) +void +go32_nat_target::pass_ctrlc () { } -static int -go32_thread_alive (struct target_ops *ops, ptid_t ptid) +int +go32_nat_target::thread_alive (ptid_t ptid) { return !ptid_equal (ptid, null_ptid); } -static const char * -go32_pid_to_str (struct target_ops *ops, ptid_t ptid) +const char * +go32_nat_target::pid_to_str (ptid_t ptid) { return normal_pid_to_str (ptid); } -/* Create a go32 target. */ - -static struct target_ops * -go32_target (void) -{ - struct target_ops *t = inf_child_target (); - - t->to_attach = go32_attach; - t->to_resume = go32_resume; - t->to_wait = go32_wait; - t->to_fetch_registers = go32_fetch_registers; - t->to_store_registers = go32_store_registers; - t->to_xfer_partial = go32_xfer_partial; - t->to_files_info = go32_files_info; - t->to_terminal_init = go32_terminal_init; - t->to_terminal_inferior = go32_terminal_inferior; - t->to_terminal_ours_for_output = go32_terminal_ours; - t->to_terminal_ours = go32_terminal_ours; - t->to_terminal_info = go32_terminal_info; - t->to_pass_ctrlc = go32_pass_ctrlc; - t->to_kill = go32_kill_inferior; - t->to_create_inferior = go32_create_inferior; - t->to_mourn_inferior = go32_mourn_inferior; - t->to_thread_alive = go32_thread_alive; - t->to_pid_to_str = go32_pid_to_str; - - return t; -} - /* Return the current DOS codepage number. */ static int dos_codepage (void) @@ -2067,8 +2083,6 @@ go32_info_dos_command (const char *args, int from_tty) void _initialize_go32_nat (void) { - struct target_ops *t = go32_target (); - x86_dr_low.set_control = go32_set_dr7; x86_dr_low.set_addr = go32_set_dr; x86_dr_low.get_status = go32_get_dr6; @@ -2076,8 +2090,7 @@ _initialize_go32_nat (void) x86_dr_low.get_addr = go32_get_dr; x86_set_debug_register_length (4); - x86_use_watchpoints (t); - add_target (t); + add_target (&the_go32_nat_target); /* Initialize child's cwd as empty to be initialized when starting the child. */