Index: source/Plugins/Process/elf-core/ProcessElfCore.cpp =================================================================== --- source/Plugins/Process/elf-core/ProcessElfCore.cpp +++ source/Plugins/Process/elf-core/ProcessElfCore.cpp @@ -456,7 +456,7 @@ offset += 4; size_t len = data.GetByteSize() - offset; - thread_data.gpregset = DataExtractor(data, offset, len); + thread_data.regsets[CoreRegset::GPR] = DataExtractor(data, offset, len); } static void ParseFreeBSDThrMisc(ThreadData &thread_data, DataExtractor &data) { @@ -536,7 +536,8 @@ ((note.n_type == LINUX::NT_PRPSINFO || note.n_type == FREEBSD::NT_PRPSINFO) && have_prpsinfo)) { - assert(thread_data->gpregset.GetByteSize() > 0); + assert(thread_data->regsets.find(CoreRegset::GPR) != + thread_data->regsets.end()); // Add the new thread to thread list m_thread_data.push_back(*thread_data); *thread_data = ThreadData(); @@ -560,7 +561,10 @@ ParseFreeBSDPrStatus(*thread_data, note_data, arch); break; case FREEBSD::NT_FPREGSET: - thread_data->fpregset = note_data; + thread_data->regsets[CoreRegset::FPR] = note_data; + break; + case FREEBSD::NT_PPC_VMX: + thread_data->regsets[CoreRegset::PPC_VMX] = note_data; break; case FREEBSD::NT_PRPSINFO: have_prpsinfo = true; @@ -572,9 +576,6 @@ // FIXME: FreeBSD sticks an int at the beginning of the note m_auxv = DataExtractor(segment_data, note_start + 4, note_size - 4); break; - case FREEBSD::NT_PPC_VMX: - thread_data->vregset = note_data; - break; default: break; } @@ -586,12 +587,15 @@ ParseNetBSDProcInfo(*thread_data, note_data); } else if (note.n_type == NETBSD::NT_AUXV) { m_auxv = DataExtractor(note_data); - } else if (arch.GetMachine() == llvm::Triple::x86_64 && - note.n_type == NETBSD::NT_AMD64_REGS) { - thread_data->gpregset = note_data; - } else if (arch.GetMachine() == llvm::Triple::x86_64 && - note.n_type == NETBSD::NT_AMD64_FPREGS) { - thread_data->fpregset = note_data; + } else if (arch.GetMachine() == llvm::Triple::x86_64) { + switch (note.n_type) { + case NETBSD::NT_AMD64_REGS: + thread_data->regsets[CoreRegset::GPR] = note_data; + break; + case NETBSD::NT_AMD64_FPREGS: + thread_data->regsets[CoreRegset::FPR] = note_data; + break; + } } } else if (note.n_name.substr(0, 7) == "OpenBSD") { // OpenBSD per-thread information is stored in notes named @@ -605,10 +609,10 @@ m_auxv = DataExtractor(note_data); break; case OPENBSD::NT_REGS: - thread_data->gpregset = note_data; + thread_data->regsets[CoreRegset::GPR] = note_data; break; case OPENBSD::NT_FPREGS: - thread_data->fpregset = note_data; + thread_data->regsets[CoreRegset::FPR] = note_data; break; } } else if (note.n_name == "CORE") { @@ -622,21 +626,14 @@ thread_data->tid = prstatus.pr_pid; header_size = ELFLinuxPrStatus::GetSize(arch); len = note_data.GetByteSize() - header_size; - thread_data->gpregset = DataExtractor(note_data, header_size, len); - - if (arch.GetCore() == ArchSpec::eCore_ppc64le_generic) - thread_data->regsets.insert( - std::make_pair(note.n_type, thread_data->gpregset)); + thread_data->regsets[CoreRegset::GPR] = + DataExtractor(note_data, header_size, len); break; case LINUX::NT_FPREGSET: // In a i386 core file NT_FPREGSET is present, but it's not the result // of the FXSAVE instruction like in 64 bit files. // The result from FXSAVE is in NT_PRXFPREG for i386 core files - if (arch.GetCore() == ArchSpec::eCore_x86_64_x86_64 || arch.IsMIPS()) - thread_data->fpregset = note_data; - else if (arch.GetCore() == ArchSpec::eCore_ppc64le_generic) { - thread_data->regsets.insert(std::make_pair(note.n_type, note_data)); - } + thread_data->regsets[CoreRegset::FPR] = note_data; break; case LINUX::NT_PRPSINFO: have_prpsinfo = true; @@ -678,13 +675,14 @@ } } else if (note.n_name == "LINUX") { switch (note.n_type) { - case LINUX::NT_PRXFPREG: - thread_data->fpregset = note_data; - break; case LINUX::NT_PPC_VMX: + thread_data->regsets[CoreRegset::PPC_VMX] = note_data; + break; case LINUX::NT_PPC_VSX: - if (arch.GetCore() == ArchSpec::eCore_ppc64le_generic) - thread_data->regsets.insert(std::make_pair(note.n_type, note_data)); + thread_data->regsets[CoreRegset::PPC_VSX] = note_data; + break; + case LINUX::NT_PRXFPREG: + thread_data->regsets[CoreRegset::FPR] = note_data; break; } } @@ -692,7 +690,7 @@ offset += note_size; } // Add last entry in the note section - if (thread_data && thread_data->gpregset.GetByteSize() > 0) { + if (thread_data && have_prstatus) { m_thread_data.push_back(*thread_data); } Index: source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm.h =================================================================== --- source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm.h +++ source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm.h @@ -10,11 +10,8 @@ #ifndef liblldb_RegisterContextCorePOSIX_arm_h_ #define liblldb_RegisterContextCorePOSIX_arm_h_ -// C Includes -// C++ Includes -// Other libraries and framework includes -// Project includes #include "Plugins/Process/Utility/RegisterContextPOSIX_arm.h" +#include "Plugins/Process/elf-core/elf-core-enums.h" #include "lldb/Utility/DataBufferHeap.h" #include "lldb/Utility/DataExtractor.h" @@ -23,8 +20,7 @@ RegisterContextCorePOSIX_arm( lldb_private::Thread &thread, lldb_private::RegisterInfoInterface *register_info, - const lldb_private::DataExtractor &gpregset, - const lldb_private::DataExtractor &fpregset); + const lldb_private::CoreRegsetMap ®sets); ~RegisterContextCorePOSIX_arm() override; Index: source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm.cpp =================================================================== --- source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm.cpp +++ source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm.cpp @@ -16,8 +16,9 @@ RegisterContextCorePOSIX_arm::RegisterContextCorePOSIX_arm( Thread &thread, RegisterInfoInterface *register_info, - const DataExtractor &gpregset, const DataExtractor &fpregset) + const CoreRegsetMap ®sets) : RegisterContextPOSIX_arm(thread, 0, register_info) { + DataExtractor gpregset = regsets.lookup(CoreRegset::GPR); m_gpr_buffer.reset( new DataBufferHeap(gpregset.GetDataStart(), gpregset.GetByteSize())); m_gpr.SetData(m_gpr_buffer); Index: source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm64.h =================================================================== --- source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm64.h +++ source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm64.h @@ -10,11 +10,8 @@ #ifndef liblldb_RegisterContextCorePOSIX_arm64_h_ #define liblldb_RegisterContextCorePOSIX_arm64_h_ -// C Includes -// C++ Includes -// Other libraries and framework includes -// Project includes #include "Plugins/Process/Utility/RegisterContextPOSIX_arm64.h" +#include "Plugins/Process/elf-core/elf-core-enums.h" #include "lldb/Utility/DataBufferHeap.h" #include "lldb/Utility/DataExtractor.h" @@ -23,8 +20,7 @@ RegisterContextCorePOSIX_arm64( lldb_private::Thread &thread, lldb_private::RegisterInfoInterface *register_info, - const lldb_private::DataExtractor &gpregset, - const lldb_private::DataExtractor &fpregset); + const lldb_private::CoreRegsetMap ®sets); ~RegisterContextCorePOSIX_arm64() override; Index: source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm64.cpp =================================================================== --- source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm64.cpp +++ source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm64.cpp @@ -9,6 +9,7 @@ #include "RegisterContextPOSIXCore_arm64.h" +#include "Plugins/Process/elf-core/elf-core-enums.h" #include "lldb/Core/RegisterValue.h" #include "lldb/Target/Thread.h" @@ -16,8 +17,9 @@ RegisterContextCorePOSIX_arm64::RegisterContextCorePOSIX_arm64( Thread &thread, RegisterInfoInterface *register_info, - const DataExtractor &gpregset, const DataExtractor &fpregset) + const CoreRegsetMap ®sets) : RegisterContextPOSIX_arm64(thread, 0, register_info) { + DataExtractor gpregset = regsets.lookup(CoreRegset::GPR); m_gpr_buffer.reset( new DataBufferHeap(gpregset.GetDataStart(), gpregset.GetByteSize())); m_gpr.SetData(m_gpr_buffer); Index: source/Plugins/Process/elf-core/RegisterContextPOSIXCore_mips64.h =================================================================== --- source/Plugins/Process/elf-core/RegisterContextPOSIXCore_mips64.h +++ source/Plugins/Process/elf-core/RegisterContextPOSIXCore_mips64.h @@ -10,11 +10,8 @@ #ifndef liblldb_RegisterContextCorePOSIX_mips64_h_ #define liblldb_RegisterContextCorePOSIX_mips64_h_ -// C Includes -// C++ Includes -// Other libraries and framework includes -// Project includes #include "Plugins/Process/Utility/RegisterContextPOSIX_mips64.h" +#include "Plugins/Process/elf-core/elf-core-enums.h" #include "lldb/Utility/DataBufferHeap.h" #include "lldb/Utility/DataExtractor.h" @@ -23,8 +20,7 @@ RegisterContextCorePOSIX_mips64( lldb_private::Thread &thread, lldb_private::RegisterInfoInterface *register_info, - const lldb_private::DataExtractor &gpregset, - const lldb_private::DataExtractor &fpregset); + const lldb_private::CoreRegsetMap ®sets); ~RegisterContextCorePOSIX_mips64() override; Index: source/Plugins/Process/elf-core/RegisterContextPOSIXCore_mips64.cpp =================================================================== --- source/Plugins/Process/elf-core/RegisterContextPOSIXCore_mips64.cpp +++ source/Plugins/Process/elf-core/RegisterContextPOSIXCore_mips64.cpp @@ -16,12 +16,15 @@ RegisterContextCorePOSIX_mips64::RegisterContextCorePOSIX_mips64( Thread &thread, RegisterInfoInterface *register_info, - const DataExtractor &gpregset, const DataExtractor &fpregset) + const CoreRegsetMap ®sets) : RegisterContextPOSIX_mips64(thread, 0, register_info) { + DataExtractor gpregset = regsets.lookup(CoreRegset::GPR); m_gpr_buffer.reset( new DataBufferHeap(gpregset.GetDataStart(), gpregset.GetByteSize())); m_gpr.SetData(m_gpr_buffer); m_gpr.SetByteOrder(gpregset.GetByteOrder()); + + DataExtractor fpregset = regsets.lookup(CoreRegset::FPR); m_fpr_buffer.reset( new DataBufferHeap(fpregset.GetDataStart(), fpregset.GetByteSize())); m_fpr.SetData(m_fpr_buffer); Index: source/Plugins/Process/elf-core/RegisterContextPOSIXCore_powerpc.h =================================================================== --- source/Plugins/Process/elf-core/RegisterContextPOSIXCore_powerpc.h +++ source/Plugins/Process/elf-core/RegisterContextPOSIXCore_powerpc.h @@ -10,11 +10,8 @@ #ifndef liblldb_RegisterContextCorePOSIX_powerpc_h_ #define liblldb_RegisterContextCorePOSIX_powerpc_h_ -// C Includes -// C++ Includes -// Other libraries and framework includes -// Project includes #include "Plugins/Process/Utility/RegisterContextPOSIX_powerpc.h" +#include "Plugins/Process/elf-core/elf-core-enums.h" #include "lldb/Utility/DataExtractor.h" class RegisterContextCorePOSIX_powerpc : public RegisterContextPOSIX_powerpc { @@ -22,9 +19,7 @@ RegisterContextCorePOSIX_powerpc( lldb_private::Thread &thread, lldb_private::RegisterInfoInterface *register_info, - const lldb_private::DataExtractor &gpregset, - const lldb_private::DataExtractor &fpregset, - const lldb_private::DataExtractor &vregset); + const lldb_private::CoreRegsetMap ®sets); ~RegisterContextCorePOSIX_powerpc() override; Index: source/Plugins/Process/elf-core/RegisterContextPOSIXCore_powerpc.cpp =================================================================== --- source/Plugins/Process/elf-core/RegisterContextPOSIXCore_powerpc.cpp +++ source/Plugins/Process/elf-core/RegisterContextPOSIXCore_powerpc.cpp @@ -17,17 +17,21 @@ RegisterContextCorePOSIX_powerpc::RegisterContextCorePOSIX_powerpc( Thread &thread, RegisterInfoInterface *register_info, - const DataExtractor &gpregset, const DataExtractor &fpregset, - const DataExtractor &vregset) + const CoreRegsetMap ®sets) : RegisterContextPOSIX_powerpc(thread, 0, register_info) { + DataExtractor gpregset = regsets.lookup(CoreRegset::GPR); m_gpr_buffer.reset( new DataBufferHeap(gpregset.GetDataStart(), gpregset.GetByteSize())); m_gpr.SetData(m_gpr_buffer); m_gpr.SetByteOrder(gpregset.GetByteOrder()); + + DataExtractor fpregset = regsets.lookup(CoreRegset::FPR); m_fpr_buffer.reset( new DataBufferHeap(fpregset.GetDataStart(), fpregset.GetByteSize())); m_fpr.SetData(m_fpr_buffer); m_fpr.SetByteOrder(fpregset.GetByteOrder()); + + DataExtractor vregset = regsets.lookup(CoreRegset::PPC_VMX); m_vec_buffer.reset( new DataBufferHeap(vregset.GetDataStart(), vregset.GetByteSize())); m_vec.SetData(m_vec_buffer); Index: source/Plugins/Process/elf-core/RegisterContextPOSIXCore_ppc64le.h =================================================================== --- source/Plugins/Process/elf-core/RegisterContextPOSIXCore_ppc64le.h +++ source/Plugins/Process/elf-core/RegisterContextPOSIXCore_ppc64le.h @@ -10,20 +10,16 @@ #ifndef liblldb_RegisterContextCorePOSIX_ppc64le_h_ #define liblldb_RegisterContextCorePOSIX_ppc64le_h_ -// C Includes -// C++ Includes -// Other libraries and framework includes -// Project includes #include "Plugins/Process/Utility/RegisterContextPOSIX_ppc64le.h" +#include "Plugins/Process/elf-core/elf-core-enums.h" #include "lldb/Utility/DataExtractor.h" -#include "llvm/ADT/DenseMap.h" class RegisterContextCorePOSIX_ppc64le : public RegisterContextPOSIX_ppc64le { public: RegisterContextCorePOSIX_ppc64le( lldb_private::Thread &thread, lldb_private::RegisterInfoInterface *register_info, - const llvm::DenseMap ®sets); + const lldb_private::CoreRegsetMap ®sets); bool ReadRegister(const lldb_private::RegisterInfo *reg_info, lldb_private::RegisterValue &value) override; Index: source/Plugins/Process/elf-core/RegisterContextPOSIXCore_ppc64le.cpp =================================================================== --- source/Plugins/Process/elf-core/RegisterContextPOSIXCore_ppc64le.cpp +++ source/Plugins/Process/elf-core/RegisterContextPOSIXCore_ppc64le.cpp @@ -20,27 +20,27 @@ RegisterContextCorePOSIX_ppc64le::RegisterContextCorePOSIX_ppc64le( Thread &thread, RegisterInfoInterface *register_info, - const llvm::DenseMap ®sets) + const CoreRegsetMap ®sets) : RegisterContextPOSIX_ppc64le(thread, 0, register_info) { - DataExtractor gpregset = regsets.lookup(LINUX::NT_PRSTATUS); + DataExtractor gpregset = regsets.lookup(CoreRegset::GPR); m_gpr_buffer.reset( new DataBufferHeap(gpregset.GetDataStart(), gpregset.GetByteSize())); m_gpr.SetData(m_gpr_buffer); m_gpr.SetByteOrder(gpregset.GetByteOrder()); - DataExtractor fpregset = regsets.lookup(LINUX::NT_FPREGSET); + DataExtractor fpregset = regsets.lookup(CoreRegset::FPR); m_fpr_buffer.reset( new DataBufferHeap(fpregset.GetDataStart(), fpregset.GetByteSize())); m_fpr.SetData(m_fpr_buffer); m_fpr.SetByteOrder(fpregset.GetByteOrder()); - DataExtractor vmxregset = regsets.lookup(LINUX::NT_PPC_VMX); + DataExtractor vmxregset = regsets.lookup(CoreRegset::PPC_VMX); m_vmx_buffer.reset( new DataBufferHeap(vmxregset.GetDataStart(), vmxregset.GetByteSize())); m_vmx.SetData(m_vmx_buffer); m_vmx.SetByteOrder(vmxregset.GetByteOrder()); - DataExtractor vsxregset = regsets.lookup(LINUX::NT_PPC_VSX); + DataExtractor vsxregset = regsets.lookup(CoreRegset::PPC_VSX); m_vsx_buffer.reset( new DataBufferHeap(vsxregset.GetDataStart(), vsxregset.GetByteSize())); m_vsx.SetData(m_vsx_buffer); Index: source/Plugins/Process/elf-core/RegisterContextPOSIXCore_s390x.h =================================================================== --- source/Plugins/Process/elf-core/RegisterContextPOSIXCore_s390x.h +++ source/Plugins/Process/elf-core/RegisterContextPOSIXCore_s390x.h @@ -10,11 +10,8 @@ #ifndef liblldb_RegisterContextCorePOSIX_s390x_h_ #define liblldb_RegisterContextCorePOSIX_s390x_h_ -// C Includes -// C++ Includes -// Other libraries and framework includes -// Project includes #include "Plugins/Process/Utility/RegisterContextPOSIX_s390x.h" +#include "Plugins/Process/elf-core/elf-core-enums.h" #include "lldb/Utility/DataExtractor.h" class RegisterContextCorePOSIX_s390x : public RegisterContextPOSIX_s390x { @@ -22,8 +19,7 @@ RegisterContextCorePOSIX_s390x( lldb_private::Thread &thread, lldb_private::RegisterInfoInterface *register_info, - const lldb_private::DataExtractor &gpregset, - const lldb_private::DataExtractor &fpregset); + const lldb_private::CoreRegsetMap ®sets); ~RegisterContextCorePOSIX_s390x() override; Index: source/Plugins/Process/elf-core/RegisterContextPOSIXCore_s390x.cpp =================================================================== --- source/Plugins/Process/elf-core/RegisterContextPOSIXCore_s390x.cpp +++ source/Plugins/Process/elf-core/RegisterContextPOSIXCore_s390x.cpp @@ -17,13 +17,15 @@ RegisterContextCorePOSIX_s390x::RegisterContextCorePOSIX_s390x( Thread &thread, RegisterInfoInterface *register_info, - const DataExtractor &gpregset, const DataExtractor &fpregset) + const CoreRegsetMap ®sets) : RegisterContextPOSIX_s390x(thread, 0, register_info) { + DataExtractor gpregset = regsets.lookup(CoreRegset::GPR); m_gpr_buffer.reset( new DataBufferHeap(gpregset.GetDataStart(), gpregset.GetByteSize())); m_gpr.SetData(m_gpr_buffer); m_gpr.SetByteOrder(gpregset.GetByteOrder()); + DataExtractor fpregset = regsets.lookup(CoreRegset::GPR); m_fpr_buffer.reset( new DataBufferHeap(fpregset.GetDataStart(), fpregset.GetByteSize())); m_fpr.SetData(m_fpr_buffer); Index: source/Plugins/Process/elf-core/RegisterContextPOSIXCore_x86_64.h =================================================================== --- source/Plugins/Process/elf-core/RegisterContextPOSIXCore_x86_64.h +++ source/Plugins/Process/elf-core/RegisterContextPOSIXCore_x86_64.h @@ -10,19 +10,15 @@ #ifndef liblldb_RegisterContextCorePOSIX_x86_64_h_ #define liblldb_RegisterContextCorePOSIX_x86_64_h_ -// C Includes -// C++ Includes -// Other libraries and framework includes -// Project includes #include "Plugins/Process/Utility/RegisterContextPOSIX_x86.h" +#include "Plugins/Process/elf-core/elf-core-enums.h" class RegisterContextCorePOSIX_x86_64 : public RegisterContextPOSIX_x86 { public: RegisterContextCorePOSIX_x86_64( lldb_private::Thread &thread, lldb_private::RegisterInfoInterface *register_info, - const lldb_private::DataExtractor &gpregset, - const lldb_private::DataExtractor &fpregset); + const lldb_private::CoreRegsetMap ®sets); bool ReadRegister(const lldb_private::RegisterInfo *reg_info, lldb_private::RegisterValue &value) override; Index: source/Plugins/Process/elf-core/RegisterContextPOSIXCore_x86_64.cpp =================================================================== --- source/Plugins/Process/elf-core/RegisterContextPOSIXCore_x86_64.cpp +++ source/Plugins/Process/elf-core/RegisterContextPOSIXCore_x86_64.cpp @@ -16,10 +16,11 @@ RegisterContextCorePOSIX_x86_64::RegisterContextCorePOSIX_x86_64( Thread &thread, RegisterInfoInterface *register_info, - const DataExtractor &gpregset, const DataExtractor &fpregset) + const CoreRegsetMap ®sets) : RegisterContextPOSIX_x86(thread, 0, register_info) { size_t size, len; + DataExtractor gpregset = regsets.lookup(CoreRegset::GPR); size = GetGPRSize(); m_gpregset.reset(new uint8_t[size]); len = @@ -27,6 +28,7 @@ if (len != size) m_gpregset.reset(); + DataExtractor fpregset = regsets.lookup(CoreRegset::FPR); size = sizeof(FXSAVE); m_fpregset.reset(new uint8_t[size]); len = Index: source/Plugins/Process/elf-core/ThreadElfCore.h =================================================================== --- source/Plugins/Process/elf-core/ThreadElfCore.h +++ source/Plugins/Process/elf-core/ThreadElfCore.h @@ -10,15 +10,11 @@ #ifndef liblldb_ThreadElfCore_h_ #define liblldb_ThreadElfCore_h_ -// C Includes -// C++ Includes -#include - -// Other libraries and framework includes -// Project includes +#include "Plugins/Process/elf-core/elf-core-enums.h" #include "lldb/Target/Thread.h" #include "lldb/Utility/DataExtractor.h" #include "llvm/ADT/DenseMap.h" +#include struct compat_timeval { alignas(8) uint64_t tv_sec; @@ -129,10 +125,7 @@ "sizeof ELFLinuxPrPsInfo is not correct!"); struct ThreadData { - lldb_private::DataExtractor gpregset; - lldb_private::DataExtractor fpregset; - lldb_private::DataExtractor vregset; - llvm::DenseMap regsets; + lldb_private::CoreRegsetMap regsets; lldb::tid_t tid; int signo = 0; int prstatus_sig = 0; @@ -178,10 +171,7 @@ int m_signo; - lldb_private::DataExtractor m_gpregset_data; - lldb_private::DataExtractor m_fpregset_data; - lldb_private::DataExtractor m_vregset_data; - llvm::DenseMap m_regsets_data; + lldb_private::CoreRegsetMap m_regsets_data; bool CalculateStopInfo() override; }; Index: source/Plugins/Process/elf-core/ThreadElfCore.cpp =================================================================== --- source/Plugins/Process/elf-core/ThreadElfCore.cpp +++ source/Plugins/Process/elf-core/ThreadElfCore.cpp @@ -47,9 +47,7 @@ //---------------------------------------------------------------------- ThreadElfCore::ThreadElfCore(Process &process, const ThreadData &td) : Thread(process, td.tid), m_thread_name(td.name), m_thread_reg_ctx_sp(), - m_signo(td.signo), m_gpregset_data(td.gpregset), - m_fpregset_data(td.fpregset), m_vregset_data(td.vregset), - m_regsets_data(td.regsets) {} + m_signo(td.signo), m_regsets_data(td.regsets) {} ThreadElfCore::~ThreadElfCore() { DestroyThread(); } @@ -197,27 +195,26 @@ switch (arch.GetMachine()) { case llvm::Triple::aarch64: m_thread_reg_ctx_sp.reset(new RegisterContextCorePOSIX_arm64( - *this, reg_interface, m_gpregset_data, m_fpregset_data)); + *this, reg_interface, m_regsets_data)); break; case llvm::Triple::arm: m_thread_reg_ctx_sp.reset(new RegisterContextCorePOSIX_arm( - *this, reg_interface, m_gpregset_data, m_fpregset_data)); + *this, reg_interface, m_regsets_data)); break; case llvm::Triple::mipsel: case llvm::Triple::mips: m_thread_reg_ctx_sp.reset(new RegisterContextCorePOSIX_mips64( - *this, reg_interface, m_gpregset_data, m_fpregset_data)); + *this, reg_interface, m_regsets_data)); break; case llvm::Triple::mips64: case llvm::Triple::mips64el: m_thread_reg_ctx_sp.reset(new RegisterContextCorePOSIX_mips64( - *this, reg_interface, m_gpregset_data, m_fpregset_data)); + *this, reg_interface, m_regsets_data)); break; case llvm::Triple::ppc: case llvm::Triple::ppc64: m_thread_reg_ctx_sp.reset(new RegisterContextCorePOSIX_powerpc( - *this, reg_interface, m_gpregset_data, m_fpregset_data, - m_vregset_data)); + *this, reg_interface, m_regsets_data)); break; case llvm::Triple::ppc64le: m_thread_reg_ctx_sp.reset(new RegisterContextCorePOSIX_ppc64le( @@ -225,12 +222,12 @@ break; case llvm::Triple::systemz: m_thread_reg_ctx_sp.reset(new RegisterContextCorePOSIX_s390x( - *this, reg_interface, m_gpregset_data, m_fpregset_data)); + *this, reg_interface, m_regsets_data)); break; case llvm::Triple::x86: case llvm::Triple::x86_64: m_thread_reg_ctx_sp.reset(new RegisterContextCorePOSIX_x86_64( - *this, reg_interface, m_gpregset_data, m_fpregset_data)); + *this, reg_interface, m_regsets_data)); break; default: break; Index: source/Plugins/Process/elf-core/elf-core-enums.h =================================================================== --- source/Plugins/Process/elf-core/elf-core-enums.h +++ source/Plugins/Process/elf-core/elf-core-enums.h @@ -10,6 +10,9 @@ #ifndef LLDB_ELF_CORE_ENUMS_H #define LLDB_ELF_CORE_ENUMS_H +#include "llvm/ADT/DenseMap.h" + +namespace lldb_private { /// Core files PT_NOTE segment descriptor types namespace FREEBSD { @@ -52,4 +55,17 @@ }; } +enum class CoreRegset : uint8_t { GPR, FPR, PPC_VMX, PPC_VSX }; + +struct CoreRegsetInfo { + static inline CoreRegset getEmptyKey() { return CoreRegset(-1); } + static inline CoreRegset getTombstoneKey() { return CoreRegset(-2); } + static inline unsigned getHashValue(CoreRegset set) { return unsigned(set); } + static bool isEqual(CoreRegset s1, CoreRegset s2) { return s1 == s2; } +}; + +using CoreRegsetMap = llvm::DenseMap; + +} // namespace lldb_private + #endif // #ifndef LLDB_ELF_CORE_ENUMS_H Index: source/Plugins/Process/minidump/ThreadMinidump.cpp =================================================================== --- source/Plugins/Process/minidump/ThreadMinidump.cpp +++ source/Plugins/Process/minidump/ThreadMinidump.cpp @@ -17,8 +17,8 @@ // Other libraries and framework includes #include "Plugins/Process/Utility/RegisterContextLinux_i386.h" #include "Plugins/Process/Utility/RegisterContextLinux_x86_64.h" - #include "Plugins/Process/elf-core/RegisterContextPOSIXCore_x86_64.h" +#include "Plugins/Process/elf-core/elf-core-enums.h" #include "lldb/Target/RegisterContext.h" #include "lldb/Target/StopInfo.h" @@ -74,20 +74,20 @@ reg_interface = new RegisterContextLinux_i386(arch); lldb::DataBufferSP buf = ConvertMinidumpContext_x86_32(m_gpregset_data, reg_interface); - DataExtractor gpregs(buf, lldb::eByteOrderLittle, 4); - DataExtractor fpregs; - m_thread_reg_ctx_sp.reset(new RegisterContextCorePOSIX_x86_64( - *this, reg_interface, gpregs, fpregs)); + CoreRegsetMap regsets; + regsets[CoreRegset::GPR] = DataExtractor(buf, lldb::eByteOrderLittle, 4); + m_thread_reg_ctx_sp.reset( + new RegisterContextCorePOSIX_x86_64(*this, reg_interface, regsets)); break; } case llvm::Triple::x86_64: { reg_interface = new RegisterContextLinux_x86_64(arch); lldb::DataBufferSP buf = ConvertMinidumpContext_x86_64(m_gpregset_data, reg_interface); - DataExtractor gpregs(buf, lldb::eByteOrderLittle, 8); - DataExtractor fpregs; - m_thread_reg_ctx_sp.reset(new RegisterContextCorePOSIX_x86_64( - *this, reg_interface, gpregs, fpregs)); + CoreRegsetMap regsets; + regsets[CoreRegset::GPR] = DataExtractor(buf, lldb::eByteOrderLittle, 8); + m_thread_reg_ctx_sp.reset( + new RegisterContextCorePOSIX_x86_64(*this, reg_interface, regsets)); break; } default: