20 Thread &thread, uint32_t concrete_frame_idx,
25 ProcessSP process_sp(thread.GetProcess());
26 Target &target = process_sp->GetTarget();
31 if (metadata_thread_registers &&
32 metadata_thread_registers->GetAsDictionary() &&
33 metadata_thread_registers->GetAsDictionary()->HasKey(
"register_info")) {
37 if (metadata_registers_dict)
38 if (!metadata_registers_dict->
HasKey(
"sets") ||
39 !metadata_registers_dict->
HasKey(
"registers"))
40 metadata_registers_dict =
nullptr;
51 std::map<size_t, size_t> metadata_regset_to_combined_regset;
59 uint32_t core_buffer_end = 0;
60 for (
size_t idx = 0; idx < core_thread_regctx_sp->GetRegisterCount(); idx++) {
62 core_thread_regctx_sp->GetRegisterInfoAtIndex(idx);
68 uint32_t combined_buffer_end = core_buffer_end;
69 if (metadata_registers_dict) {
78 combined_buffer_end += (bitsize / 8);
87 for (
size_t idx = 0; idx < core_thread_regctx_sp->GetRegisterCount(); idx++) {
89 core_thread_regctx_sp->GetRegisterInfoAtIndex(idx);
92 core_thread_regctx_sp->ReadRegister(reginfo, val))
101 if (metadata_registers_dict) {
102 size_t offset = core_buffer_end;
103 ByteOrder byte_order = core_thread_regctx_sp->GetByteOrder();
106 registers->
ForEach([
this, &offset,
115 offset += (bitsize / 8);
120 const int bytesize = bitsize / 8;
123 Scalar value_scalar((uint16_t)value);
125 bytesize, byte_order,
error);
129 Scalar value_scalar((uint32_t)value);
131 bytesize, byte_order,
error);
135 Scalar value_scalar((uint64_t)value);
137 bytesize, byte_order,
error);
146 std::unique_ptr<DynamicRegisterInfo> additional_reginfo_up;
147 if (metadata_registers_dict)
163 for (
size_t idx = 0; idx < core_thread_regctx_sp->GetRegisterSetCount();
166 const RegisterSet *old_set = core_thread_regctx_sp->GetRegisterSet(idx);
167 copy_regset_name(new_set, *old_set);
172 if (additional_reginfo_up) {
173 for (
size_t idx = 0; idx < additional_reginfo_up->GetNumRegisterSets();
177 bool found_match =
false;
178 const RegisterSet *old_set = additional_reginfo_up->GetRegisterSet(idx);
181 metadata_regset_to_combined_regset[idx] = jdx;
190 copy_regset_name(new_set, *old_set);
198 for (
size_t combined_regset_idx = 0;
200 uint32_t registers_this_regset = 0;
211 core_thread_regctx_sp->GetRegisterSet(combined_regset_idx);
216 core_thread_regctx_sp->GetRegisterInfoAtIndex(reg_idx);
219 core_thread_regctx_sp->ReadRegister(reginfo, val)) {
223 registers_this_regset++;
233 if (additional_reginfo_up) {
236 for (
size_t setidx = 0;
237 setidx < additional_reginfo_up->GetNumRegisterSets(); setidx++) {
238 if (metadata_regset_to_combined_regset[setidx] == combined_regset_idx) {
240 additional_reginfo_up->GetRegisterSet(setidx);
244 additional_reginfo_up->GetRegisterInfoAtIndex(reg_idx);
248 registers_this_regset++;
253 m_register_sets[combined_regset_idx].num_registers = registers_this_regset;
const lldb_private::RegisterSet * GetRegisterSet(size_t set) override
bool ReadRegister(const lldb_private::RegisterInfo *reg_info, lldb_private::RegisterValue &value) override
std::vector< lldb_private::RegisterInfo > m_register_infos
std::vector< lldb_private::RegisterSet > m_register_sets
bool WriteRegister(const lldb_private::RegisterInfo *reg_info, const lldb_private::RegisterValue &value) override
const lldb_private::RegisterInfo * GetRegisterInfoAtIndex(size_t reg) override
RegisterContextUnifiedCore(Thread &thread, uint32_t concrete_frame_idx, lldb::RegisterContextSP core_thread_regctx_sp, lldb_private::StructuredData::ObjectSP metadata_thread_registers)
std::vector< uint8_t > m_register_data
Bytes of the register contents.
std::map< size_t, std::vector< uint32_t > > m_regset_regnum_collection
For each register set, an array of register numbers included.
RegisterContext(Thread &thread, uint32_t concrete_frame_idx)