From patchwork Fri Aug 29 13:51:35 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gary Benson X-Patchwork-Id: 2593 Received: (qmail 32231 invoked by alias); 29 Aug 2014 14:03:25 -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 32220 invoked by uid 89); 29 Aug 2014 14:03:24 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.1 required=5.0 tests=AWL, BAYES_00, RP_MATCHES_RCVD, SPF_HELO_PASS autolearn=ham version=3.3.2 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Fri, 29 Aug 2014 14:03:18 +0000 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s7TDpnCO022292 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 29 Aug 2014 09:51:49 -0400 Received: from blade.nx (ovpn-116-113.ams2.redhat.com [10.36.116.113]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s7TDpmP9012095; Fri, 29 Aug 2014 09:51:48 -0400 Received: from blade.nx (localhost [127.0.0.1]) by blade.nx (Postfix) with ESMTP id 3E3592640EE; Fri, 29 Aug 2014 14:51:44 +0100 (BST) From: Gary Benson To: gdb-patches@sourceware.org Cc: Pedro Alves , Doug Evans Subject: [PATCH 5/9 v7] Introduce common-regcache.h Date: Fri, 29 Aug 2014 14:51:35 +0100 Message-Id: <1409320299-6812-6-git-send-email-gbenson@redhat.com> In-Reply-To: <1409320299-6812-1-git-send-email-gbenson@redhat.com> References: <1409320299-6812-1-git-send-email-gbenson@redhat.com> X-IsSubscribed: yes This introduces common-regcache.h. This contains two functions that allow nat/linux-btrace.c to be simplified. A better long term solution would be unify the regcache code, but this is sufficient for now. This patch differs from the version I posted on August 1 (https://sourceware.org/ml/gdb-patches/2014-08/msg00010.html) in that some suggested documentation changes have been made and that various updates were required to reflect regcache changes recently committed by Andreas Arnez. gdb/ChangeLog: * common/common-regcache.h: New file. * Makefile.in (HFILES_NO_SRCDIR): Add common/common-regcache.h. * regcache.h: Include common-regcache.h. (regcache_read_pc): Don't declare. * regcache.c (get_thread_regcache_for_ptid): New function. * nat/linux-btrace.c: Don't include regcache.h. Include common-regcache.h. (perf_event_read_bts): Use get_thread_regcache_for_ptid. gdb/gdbserver/ChangeLog: * regcache.h: Include common-regcache.h. (regcache_read_pc): Don't declare. * regcache.c (get_thread_regcache_for_ptid): New function. --- gdb/ChangeLog | 12 ++++++++++++ gdb/Makefile.in | 3 ++- gdb/common/common-regcache.h | 35 +++++++++++++++++++++++++++++++++++ gdb/gdbserver/ChangeLog | 7 +++++++ gdb/gdbserver/regcache.c | 8 ++++++++ gdb/gdbserver/regcache.h | 4 ++-- gdb/nat/linux-btrace.c | 8 ++------ gdb/regcache.c | 7 +++++++ gdb/regcache.h | 3 ++- 9 files changed, 77 insertions(+), 10 deletions(-) create mode 100644 gdb/common/common-regcache.h diff --git a/gdb/Makefile.in b/gdb/Makefile.in index 49b7c74..b9e766f 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -938,7 +938,8 @@ target/wait.h target/waitstatus.h nat/linux-nat.h nat/linux-waitpid.h \ common/print-utils.h common/rsp-low.h nat/i386-dregs.h x86-linux-nat.h \ i386-linux-nat.h common/common-defs.h common/errors.h common/common-types.h \ common/common-debug.h common/cleanups.h common/gdb_setjmp.h \ -common/common-exceptions.h target/target.h target/symbol.h +common/common-exceptions.h target/target.h target/symbol.h \ +common/common-regcache.h # Header files that already have srcdir in them, or which are in objdir. diff --git a/gdb/common/common-regcache.h b/gdb/common/common-regcache.h new file mode 100644 index 0000000..aef6bfd --- /dev/null +++ b/gdb/common/common-regcache.h @@ -0,0 +1,35 @@ +/* Cache and manage the values of registers + + Copyright (C) 1986-2014 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 . */ + +#ifndef COMMON_REGCACHE_H +#define COMMON_REGCACHE_H + +/* This header is a stopgap until we have an independent regcache. */ + +/* Return the register cache associated with the thread specified + by PTID. This function must be provided by the client. */ + +extern struct regcache *get_thread_regcache_for_ptid (ptid_t ptid); + +/* Read the PC register. This function must be provided by the + client. */ + +extern CORE_ADDR regcache_read_pc (struct regcache *regcache); + +#endif /* COMMON_REGCACHE_H */ diff --git a/gdb/gdbserver/regcache.c b/gdb/gdbserver/regcache.c index fda2069..ad66ff7 100644 --- a/gdb/gdbserver/regcache.c +++ b/gdb/gdbserver/regcache.c @@ -60,6 +60,14 @@ get_thread_regcache (struct thread_info *thread, int fetch) return regcache; } +/* See common/common-regcache.h. */ + +struct regcache * +get_thread_regcache_for_ptid (ptid_t ptid) +{ + return get_thread_regcache (find_thread_ptid (ptid), 1); +} + void regcache_invalidate_thread (struct thread_info *thread) { diff --git a/gdb/gdbserver/regcache.h b/gdb/gdbserver/regcache.h index 891fead..0c933f3 100644 --- a/gdb/gdbserver/regcache.h +++ b/gdb/gdbserver/regcache.h @@ -19,6 +19,8 @@ #ifndef REGCACHE_H #define REGCACHE_H +#include "common-regcache.h" + struct thread_info; struct target_desc; @@ -91,8 +93,6 @@ void registers_to_string (struct regcache *regcache, char *buf); void registers_from_string (struct regcache *regcache, char *buf); -CORE_ADDR regcache_read_pc (struct regcache *regcache); - void regcache_write_pc (struct regcache *regcache, CORE_ADDR pc); /* Return a pointer to the description of register ``n''. */ diff --git a/gdb/nat/linux-btrace.c b/gdb/nat/linux-btrace.c index f6fdbda..cf98582 100644 --- a/gdb/nat/linux-btrace.c +++ b/gdb/nat/linux-btrace.c @@ -26,7 +26,7 @@ #endif #include "linux-btrace.h" -#include "regcache.h" +#include "common-regcache.h" #include "gdbthread.h" #include "gdb_wait.h" #include "i386-cpuid.h" @@ -180,11 +180,7 @@ perf_event_read_bts (struct btrace_target_info* tinfo, const uint8_t *begin, gdb_assert (start <= end); /* The first block ends at the current pc. */ -#ifdef GDBSERVER - regcache = get_thread_regcache (find_thread_ptid (tinfo->ptid), 1); -#else - regcache = get_thread_regcache (tinfo->ptid); -#endif + regcache = get_thread_regcache_for_ptid (tinfo->ptid); block.end = regcache_read_pc (regcache); /* The buffer may contain a partial record as its last entry (i.e. when the diff --git a/gdb/regcache.c b/gdb/regcache.c index 05b8fb9..9b6c794 100644 --- a/gdb/regcache.c +++ b/gdb/regcache.c @@ -536,6 +536,13 @@ get_current_regcache (void) return get_thread_regcache (inferior_ptid); } +/* See common/common-regcache.h. */ + +struct regcache * +get_thread_regcache_for_ptid (ptid_t ptid) +{ + return get_thread_regcache (ptid); +} /* Observer for the target_changed event. */ diff --git a/gdb/regcache.h b/gdb/regcache.h index 0361f22..37cffe3 100644 --- a/gdb/regcache.h +++ b/gdb/regcache.h @@ -20,6 +20,8 @@ #ifndef REGCACHE_H #define REGCACHE_H +#include "common-regcache.h" + struct regcache; struct gdbarch; struct address_space; @@ -135,7 +137,6 @@ void regcache_cooked_write_part (struct regcache *regcache, int regnum, /* Special routines to read/write the PC. */ -extern CORE_ADDR regcache_read_pc (struct regcache *regcache); extern void regcache_write_pc (struct regcache *regcache, CORE_ADDR pc); /* Transfer a raw register [0..NUM_REGS) between the regcache and the