From f15cb84a84613a5017e41ae435312ddcb17877b5 Mon Sep 17 00:00:00 2001 From: Yao Qi Date: Wed, 4 Dec 2013 09:28:44 +0800 Subject: [PATCH] Invalidate target cache before starting to handle event. gdb: 2013-12-10 Yao Qi * infrun.c: Include "target-dcache.h". (prepare_for_detach): Call target_dcache_invalidate. (wait_for_inferior): Likewise. (fetch_inferior_event): Likewise. (infrun_thread_stop_requested_callback): Likewise. Set overlay_cache_invalid to 1. --- gdb/ChangeLog | 9 +++++++++ gdb/infrun.c | 24 ++++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d9e492f00b3..8d79661ba38 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2013-12-10 Yao Qi + + * infrun.c: Include "target-dcache.h". + (prepare_for_detach): Call target_dcache_invalidate. + (wait_for_inferior): Likewise. + (fetch_inferior_event): Likewise. + (infrun_thread_stop_requested_callback): Likewise. Set + overlay_cache_invalid to 1. + 2013-12-10 Joel Brobecker * symtab.c (symbol_find_demangled_name): Add handling of diff --git a/gdb/infrun.c b/gdb/infrun.c index 3b55583594d..d8f9787ff28 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -60,6 +60,7 @@ #include "objfiles.h" #include "completer.h" #include "target-descriptions.h" +#include "target-dcache.h" /* Prototypes for local functions */ @@ -2475,6 +2476,13 @@ infrun_thread_stop_requested_callback (struct thread_info *info, void *arg) old_chain = make_cleanup_restore_current_thread (); + overlay_cache_invalid = 1; + /* Flush target cache before starting to handle each event. + Target was running and cache could be stale. This is just a + heuristic. Running threads may modify target memory, but we + don't get any event. */ + target_dcache_invalidate (); + /* Go through handle_inferior_event/normal_stop, so we always have consistent output as if the stop event had been reported. */ @@ -2677,6 +2685,11 @@ prepare_for_detach (void) memset (ecs, 0, sizeof (*ecs)); overlay_cache_invalid = 1; + /* Flush target cache before starting to handle each event. + Target was running and cache could be stale. This is just a + heuristic. Running threads may modify target memory, but we + don't get any event. */ + target_dcache_invalidate (); if (deprecated_target_wait_hook) ecs->ptid = deprecated_target_wait_hook (pid_ptid, &ecs->ws, 0); @@ -2740,6 +2753,12 @@ wait_for_inferior (void) overlay_cache_invalid = 1; + /* Flush target cache before starting to handle each event. + Target was running and cache could be stale. This is just a + heuristic. Running threads may modify target memory, but we + don't get any event. */ + target_dcache_invalidate (); + if (deprecated_target_wait_hook) ecs->ptid = deprecated_target_wait_hook (waiton_ptid, &ecs->ws, 0); else @@ -2805,6 +2824,11 @@ fetch_inferior_event (void *client_data) make_cleanup_restore_current_thread (); overlay_cache_invalid = 1; + /* Flush target cache before starting to handle each event. Target + was running and cache could be stale. This is just a heuristic. + Running threads may modify target memory, but we don't get any + event. */ + target_dcache_invalidate (); make_cleanup_restore_integer (&execution_direction); execution_direction = target_execution_direction (); -- 2.30.2