struct regcache * get_thread_regcache (struct thread_info *thread, int fetch) { struct regcache *regcache; regcache = inferior_regcache_data (thread); /* Threads' regcaches are created lazily, because biarch targets add the main thread/lwp before seeing it stop for the first time, and it is only after the target sees the thread stop for the first time that the target has a chance of determining the process's architecture. IOW, when we first add the process's main thread we don't know which architecture/tdesc its regcache should have. */ if (regcache == NULL) { struct process_info *proc = get_thread_process (thread); gdb_assert (proc->tdesc != NULL); regcache = new_register_cache (proc->tdesc); set_inferior_regcache_data (thread, regcache); } if (fetch && regcache->registers_valid == 0) { struct thread_info *saved_thread = current_thread; current_thread = thread; /* Invalidate all registers, to prevent stale left-overs. */ memset (regcache->register_status, REG_UNAVAILABLE, regcache->tdesc->num_registers); fetch_inferior_registers (regcache, -1); current_thread = saved_thread; regcache->registers_valid = 1; } return regcache; }
struct regcache * get_thread_regcache (struct thread_info *thread, int fetch) { struct regcache *regcache; regcache = (struct regcache *) inferior_regcache_data (thread); if (regcache == NULL) fatal ("no register cache"); if (fetch && regcache->registers_valid == 0) { struct thread_info *saved_inferior = current_inferior; current_inferior = thread; fetch_inferior_registers (regcache, -1); current_inferior = saved_inferior; regcache->registers_valid = 1; } return regcache; }
void regcache_invalidate_one (struct inferior_list_entry *entry) { struct thread_info *thread = (struct thread_info *) entry; struct regcache *regcache; regcache = (struct regcache *) inferior_regcache_data (thread); if (regcache == NULL) return; if (regcache->registers_valid) { struct thread_info *saved_inferior = current_inferior; current_inferior = thread; store_inferior_registers (regcache, -1); current_inferior = saved_inferior; } regcache->registers_valid = 0; }
struct regcache * get_thread_regcache (struct thread_info *thread, int fetch) { struct regcache *regcache; regcache = (struct regcache *) inferior_regcache_data (thread); /* Threads' regcaches are created lazily, because biarch targets add the main thread/lwp before seeing it stop for the first time, and it is only after the target sees the thread stop for the first time that the target has a chance of determining the process's architecture. IOW, when we first add the process's main thread we don't know which architecture/tdesc its regcache should have. */ if (regcache == NULL) { struct process_info *proc = get_thread_process (thread); if (proc->tdesc == NULL) fatal ("no target description"); regcache = new_register_cache (proc->tdesc); set_inferior_regcache_data (thread, regcache); } if (fetch && regcache->registers_valid == 0) { struct thread_info *saved_inferior = current_inferior; current_inferior = thread; fetch_inferior_registers (regcache, -1); current_inferior = saved_inferior; regcache->registers_valid = 1; } return regcache; }