From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 18802 invoked by alias); 3 Nov 2013 05:56:06 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 18627 invoked by uid 89); 3 Nov 2013 05:56:04 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.6 required=5.0 tests=AWL,BAYES_00,RDNS_NONE,URIBL_BLOCKED autolearn=no version=3.3.2 X-HELO: relay1.mentorg.com Received: from Unknown (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sun, 03 Nov 2013 05:56:03 +0000 Received: from svr-orw-exc-10.mgc.mentorg.com ([147.34.98.58]) by relay1.mentorg.com with esmtp id 1VcqfE-000227-3W from Yao_Qi@mentor.com for gdb-patches@sourceware.org; Sat, 02 Nov 2013 22:55:56 -0700 Received: from SVR-ORW-FEM-02.mgc.mentorg.com ([147.34.96.206]) by SVR-ORW-EXC-10.mgc.mentorg.com with Microsoft SMTPSVC(6.0.3790.4675); Sat, 2 Nov 2013 22:55:56 -0700 Received: from qiyao.dyndns.org (147.34.91.1) by svr-orw-fem-02.mgc.mentorg.com (147.34.96.168) with Microsoft SMTP Server id 14.2.247.3; Sat, 2 Nov 2013 22:55:54 -0700 From: Yao Qi To: Subject: [PATCH 07/10] Associate target_dcache to address_space. Date: Sun, 03 Nov 2013 05:56:00 -0000 Message-ID: <1383458049-20893-8-git-send-email-yao@codesourcery.com> In-Reply-To: <1383458049-20893-1-git-send-email-yao@codesourcery.com> References: <1383458049-20893-1-git-send-email-yao@codesourcery.com> MIME-Version: 1.0 Content-Type: text/plain X-IsSubscribed: yes X-SW-Source: 2013-11/txt/msg00035.txt.bz2 Hi, Nowadays, 'target_dcache' is a global variable in GDB, which is not necessary. It can be a per-address-space variable. In this patch, we associate target_dcache to address_space. gdb/doc: 2013-11-02 Yao Qi * gdb.texinfo (Caching Target Data): Update doc for per-address-space dcache. gdb: 2013-11-02 Yao Qi * progspace.h (struct address_space_data): Declare. * target-dcache.c: Include "progspace.h". (target_dache): Remove. (target_dcache_aspace_key): New. (target_dcache_cleanup): New function. (target_dcache_init_p): Get data through target_dcache_aspace_key. (target_dcache_invalidate): Likewise. (target_dcache_get): Likewise. (target_dcache_get_or_init): Likewise. (_initialize_target_dcache): Initialize target_dcache_aspace_key. --- gdb/doc/gdb.texinfo | 12 ++++++---- gdb/progspace.h | 1 + gdb/target-dcache.c | 60 +++++++++++++++++++++++++++++++++++++------------- 3 files changed, 52 insertions(+), 21 deletions(-) diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 561243b..a64bb0b 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -10813,6 +10813,8 @@ character. @cindex caching data of targets @value{GDBN} caches data exchanged between the debugger and a target. +Each cache is associated with the address space of the inferior. See +@ref{Inferiors and Programs} about inferior and address space. Such caching generally improves performance in @ref{Remote Debugging}, because it reduces the overhead of the remote protocol by bundling memory reads and writes into large chunks. Unfortunately, simply @@ -10851,11 +10853,11 @@ Show the current state of data caching for memory accesses. @kindex info dcache @item info dcache @r{[}line@r{]} -Print the information about the data cache performance. The -information displayed includes the dcache width and depth, and for -each cache line, its number, address, and how many times it was -referenced. This command is useful for debugging the data cache -operation. +Print the information about the performance of data cache of the +current inferior's address space. The information displayed +includes the dcache width and depth, and for each cache line, its +number, address, and how many times it was referenced. This +command is useful for debugging the data cache operation. If a line number is specified, the contents of that line will be printed in hex. diff --git a/gdb/progspace.h b/gdb/progspace.h index 3735202..bbe81a4 100644 --- a/gdb/progspace.h +++ b/gdb/progspace.h @@ -32,6 +32,7 @@ struct objfile; struct inferior; struct exec; struct program_space_data; +struct address_space_data; typedef struct so_list *so_list_ptr; DEF_VEC_P (so_list_ptr); diff --git a/gdb/target-dcache.c b/gdb/target-dcache.c index 28f1aa6..a840c40 100644 --- a/gdb/target-dcache.c +++ b/gdb/target-dcache.c @@ -18,16 +18,31 @@ #include "defs.h" #include "target-dcache.h" #include "gdbcmd.h" +#include "progspace.h" -/* Cache of memory operations, to speed up remote access. */ -static DCACHE *target_dcache; +/* The target dcache is kept per-address-space. This key lets us + associate the cache with the address space. */ + +static const struct address_space_data *target_dcache_aspace_key; + +/* Clean up dcache, represented by ARG, which is associated with + ASPACE. */ + +static void +target_dcache_cleanup (struct address_space *aspace, void *arg) +{ + dcache_free (arg); +} /* Target dcache is initialized or not. */ int target_dcache_init_p (void) { - return (target_dcache != NULL); + DCACHE *dcache = address_space_data (current_program_space->aspace, + target_dcache_aspace_key); + + return (dcache != NULL); } /* Invalidate the target dcache. */ @@ -35,8 +50,11 @@ target_dcache_init_p (void) void target_dcache_invalidate (void) { - if (target_dcache_init_p ()) - dcache_invalidate (target_dcache); + DCACHE *dcache = address_space_data (current_program_space->aspace, + target_dcache_aspace_key); + + if (dcache != NULL) + dcache_invalidate (dcache); } /* Return the target dcache. Return NULL if target dcache is not @@ -45,15 +63,18 @@ target_dcache_invalidate (void) DCACHE * target_dcache_get (void) { - if (target_dcache_init_p ()) + DCACHE *dcache = address_space_data (current_program_space->aspace, + target_dcache_aspace_key); + + if (dcache != NULL) { - if (dcache_invalidate_p (target_dcache)) - dcache_invalidate (target_dcache); + if (dcache_invalidate_p (dcache)) + dcache_invalidate (dcache); - dcache_shrink (target_dcache); + dcache_shrink (dcache); } - return target_dcache; + return dcache; } /* Return the target dcache. If it is not initialized yet, initialize @@ -62,17 +83,20 @@ target_dcache_get (void) DCACHE * target_dcache_get_or_init (void) { - if (target_dcache_init_p ()) + DCACHE *dcache = address_space_data (current_program_space->aspace, + target_dcache_aspace_key); + + if (dcache != NULL) { - if (dcache_invalidate_p (target_dcache)) - dcache_invalidate (target_dcache); + if (dcache_invalidate_p (dcache)) + dcache_invalidate (dcache); - dcache_shrink (target_dcache); + dcache_shrink (dcache); } else - target_dcache = dcache_init (); + dcache = dcache_init (); - return target_dcache; + return dcache; } /* The option sets this. */ @@ -128,4 +152,8 @@ By default, caching for stack access is on."), set_stack_cache_enabled_p, show_stack_cache_enabled_p, &setlist, &showlist); + + target_dcache_aspace_key + = register_address_space_data_with_cleanup (NULL, + target_dcache_cleanup); } -- 1.7.7.6