X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Ftarget-dcache.c;h=c8a415512c5b3d06e6b4b65bcdb8f981ba43110e;hb=268e4f09144c48e02f01d82ab3aab359457df214;hp=6b7986a4124eb6e27dd94a2353f1c2455e6c3989;hpb=0fb14d8ffde0940e0b55d529c50a5d424b763b13;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/target-dcache.c b/gdb/target-dcache.c index 6b7986a412..c8a415512c 100644 --- a/gdb/target-dcache.c +++ b/gdb/target-dcache.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1992-2013 Free Software Foundation, Inc. +/* Copyright (C) 1992-2019 Free Software Foundation, Inc. This file is part of GDB. @@ -23,24 +23,16 @@ /* 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); -} +static const struct address_space_key + target_dcache_aspace_key; /* Target dcache is initialized or not. */ int target_dcache_init_p (void) { - DCACHE *dcache = address_space_data (current_program_space->aspace, - target_dcache_aspace_key); + DCACHE *dcache + = target_dcache_aspace_key.get (current_program_space->aspace); return (dcache != NULL); } @@ -50,8 +42,8 @@ target_dcache_init_p (void) void target_dcache_invalidate (void) { - DCACHE *dcache = address_space_data (current_program_space->aspace, - target_dcache_aspace_key); + DCACHE *dcache + = target_dcache_aspace_key.get (current_program_space->aspace); if (dcache != NULL) dcache_invalidate (dcache); @@ -63,10 +55,7 @@ target_dcache_invalidate (void) DCACHE * target_dcache_get (void) { - DCACHE *dcache = address_space_data (current_program_space->aspace, - target_dcache_aspace_key); - - return dcache; + return target_dcache_aspace_key.get (current_program_space->aspace); } /* Return the target dcache. If it is not initialized yet, initialize @@ -75,21 +64,20 @@ target_dcache_get (void) DCACHE * target_dcache_get_or_init (void) { - DCACHE *dcache = address_space_data (current_program_space->aspace, - target_dcache_aspace_key); + DCACHE *dcache + = target_dcache_aspace_key.get (current_program_space->aspace); if (dcache == NULL) { dcache = dcache_init (); - set_address_space_data (current_program_space->aspace, - target_dcache_aspace_key, dcache); + target_dcache_aspace_key.set (current_program_space->aspace, dcache); } return dcache; } /* The option sets this. */ -static int stack_cache_enabled_1 = 1; +static bool stack_cache_enabled_1 = true; /* And set_stack_cache updates this. The reason for the separation is so that we don't flush the cache for on->on transitions. */ @@ -101,7 +89,7 @@ static int stack_cache_enabled = 1; except cleanliness. */ static void -set_stack_cache (char *args, int from_tty, struct cmd_list_element *c) +set_stack_cache (const char *args, int from_tty, struct cmd_list_element *c) { if (stack_cache_enabled != stack_cache_enabled_1) target_dcache_invalidate (); @@ -124,8 +112,45 @@ stack_cache_enabled_p (void) return stack_cache_enabled; } -/* -Wmissing-prototypes */ -extern initialize_file_ftype _initialize_target_dcache; +/* The option sets this. */ + +static bool code_cache_enabled_1 = true; + +/* And set_code_cache updates this. + The reason for the separation is so that we don't flush the cache for + on->on transitions. */ +static int code_cache_enabled = 1; + +/* This is called *after* the code-cache has been set. + Flush the cache for off->on and on->off transitions. + There's no real need to flush the cache for on->off transitions, + except cleanliness. */ + +static void +set_code_cache (const char *args, int from_tty, struct cmd_list_element *c) +{ + if (code_cache_enabled != code_cache_enabled_1) + target_dcache_invalidate (); + + code_cache_enabled = code_cache_enabled_1; +} + +/* Show option "code-cache". */ + +static void +show_code_cache (struct ui_file *file, int from_tty, + struct cmd_list_element *c, const char *value) +{ + fprintf_filtered (file, _("Cache use for code accesses is %s.\n"), value); +} + +/* Return true if "code cache" is enabled, otherwise, return false. */ + +int +code_cache_enabled_p (void) +{ + return code_cache_enabled; +} void _initialize_target_dcache (void) @@ -141,7 +166,15 @@ By default, caching for stack access is on."), show_stack_cache, &setlist, &showlist); - target_dcache_aspace_key - = register_address_space_data_with_cleanup (NULL, - target_dcache_cleanup); + add_setshow_boolean_cmd ("code-cache", class_support, + &code_cache_enabled_1, _("\ +Set cache use for code segment access."), _("\ +Show cache use for code segment access."), _("\ +When on, use the target memory cache for all code segment accesses,\n\ +regardless of any configured memory regions. This improves remote\n\ +performance significantly. By default, caching for code segment\n\ +access is on."), + set_code_cache, + show_code_cache, + &setlist, &showlist); }