From: Yao Qi Date: Tue, 9 May 2017 11:36:53 +0000 (+0100) Subject: Use std::forward_list for current_regcache X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=94bb8dfe28219e4b747cb874aae401d18df91c9b;p=binutils-gdb.git Use std::forward_list for current_regcache gdb: 2017-05-09 Yao Qi * regcache.c: Include . (struct regcache_list): Remove. (current_regcache): Update. (get_thread_arch_aspace_regcache): Update for std::forward_list. (regcache_thread_ptid_changed): Likewise. (registers_changed_ptid): Likewise. (current_regcache_size): Likewise. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index cec30582ac5..7fa037038f2 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2017-05-09 Yao Qi + + * regcache.c: Include . + (struct regcache_list): Remove. + (current_regcache): Update. + (get_thread_arch_aspace_regcache): Update for std::forward_list. + (regcache_thread_ptid_changed): Likewise. + (registers_changed_ptid): Likewise. + (current_regcache_size): Likewise. + 2017-05-09 Yao Qi * regcache.c [GDB_SELF_TEST]: Include selftest.h. diff --git a/gdb/regcache.c b/gdb/regcache.c index 07b1c97fd30..7250763203d 100644 --- a/gdb/regcache.c +++ b/gdb/regcache.c @@ -28,6 +28,7 @@ #include "remote.h" #include "valprint.h" #include "regset.h" +#include /* * DATA STRUCTURE @@ -472,34 +473,21 @@ regcache::invalidate (int regnum) user). Therefore all registers must be written back to the target when appropriate. */ -struct regcache_list -{ - struct regcache *regcache; - struct regcache_list *next; -}; - -static struct regcache_list *current_regcache; +static std::forward_list current_regcache; struct regcache * get_thread_arch_aspace_regcache (ptid_t ptid, struct gdbarch *gdbarch, struct address_space *aspace) { - struct regcache_list *list; - struct regcache *new_regcache; + for (const auto ®cache : current_regcache) + if (ptid_equal (regcache->ptid (), ptid) && regcache->arch () == gdbarch) + return regcache; - for (list = current_regcache; list; list = list->next) - if (ptid_equal (list->regcache->ptid (), ptid) - && get_regcache_arch (list->regcache) == gdbarch) - return list->regcache; + regcache *new_regcache = new regcache (gdbarch, aspace, false); - new_regcache = new regcache (gdbarch, aspace, false); + current_regcache.push_front (new_regcache); new_regcache->set_ptid (ptid); - list = XNEW (struct regcache_list); - list->regcache = new_regcache; - list->next = current_regcache; - current_regcache = list; - return new_regcache; } @@ -563,11 +551,11 @@ regcache_observer_target_changed (struct target_ops *target) static void regcache_thread_ptid_changed (ptid_t old_ptid, ptid_t new_ptid) { - struct regcache_list *list; - - for (list = current_regcache; list; list = list->next) - if (ptid_equal (list->regcache->ptid (), old_ptid)) - list->regcache->set_ptid (new_ptid); + for (auto ®cache : current_regcache) + { + if (ptid_equal (regcache->ptid (), old_ptid)) + regcache->set_ptid (new_ptid); + } } /* Low level examining and depositing of registers. @@ -584,25 +572,18 @@ regcache_thread_ptid_changed (ptid_t old_ptid, ptid_t new_ptid) void registers_changed_ptid (ptid_t ptid) { - struct regcache_list *list, **list_link; - - list = current_regcache; - list_link = ¤t_regcache; - while (list) + for (auto oit = current_regcache.before_begin (), + it = std::next (oit); + it != current_regcache.end (); + ) { - if (ptid_match (list->regcache->ptid (), ptid)) + if (ptid_match ((*it)->ptid (), ptid)) { - struct regcache_list *dead = list; - - *list_link = list->next; - regcache_xfree (list->regcache); - list = *list_link; - xfree (dead); - continue; + delete *it; + it = current_regcache.erase_after (oit); } - - list_link = &list->next; - list = *list_link; + else + oit = it++; } if (ptid_match (current_thread_ptid, ptid)) @@ -1709,11 +1690,7 @@ namespace selftests { static size_t current_regcache_size () { - size_t i = 0; - for (auto list = current_regcache; list; list = list->next) - i++; - - return i; + return std::distance (current_regcache.begin (), current_regcache.end ()); } static void