mgorny created this revision. mgorny added reviewers: labath, emaste, krytarowski. mgorny requested review of this revision.
Create a helper GetOffsetRegSetData() method to get pointer to the regset data accounting for the necessary offset. Establish the offsets in the constructor and store them in the structure. This avoids having to add new Get*Offset() methods and combines some common code. https://reviews.llvm.org/D91411 Files: lldb/source/Plugins/Process/FreeBSDRemote/NativeRegisterContextFreeBSD_x86_64.cpp lldb/source/Plugins/Process/FreeBSDRemote/NativeRegisterContextFreeBSD_x86_64.h
Index: lldb/source/Plugins/Process/FreeBSDRemote/NativeRegisterContextFreeBSD_x86_64.h =================================================================== --- lldb/source/Plugins/Process/FreeBSDRemote/NativeRegisterContextFreeBSD_x86_64.h +++ lldb/source/Plugins/Process/FreeBSDRemote/NativeRegisterContextFreeBSD_x86_64.h @@ -69,6 +69,7 @@ GPRegSet, FPRegSet, DBRegSet, + MaxRegSet = DBRegSet, }; // Private member variables. @@ -77,14 +78,14 @@ std::array<uint8_t, sizeof(struct dbreg)> m_dbr; std::vector<uint8_t> m_xsave; std::array<uint32_t, MaxXSaveSet + 1> m_xsave_offsets; + std::array<size_t, MaxRegSet + 1> m_regset_offsets; llvm::Optional<enum RegSetKind> GetSetForNativeRegNum(int reg_num) const; Status ReadRegisterSet(uint32_t set); Status WriteRegisterSet(uint32_t set); - size_t GetFPROffset() const; - size_t GetDBROffset() const; + uint8_t *GetOffsetRegSetData(uint32_t set); llvm::Optional<YMMSplitPtr> GetYMMSplitReg(uint32_t reg); }; Index: lldb/source/Plugins/Process/FreeBSDRemote/NativeRegisterContextFreeBSD_x86_64.cpp =================================================================== --- lldb/source/Plugins/Process/FreeBSDRemote/NativeRegisterContextFreeBSD_x86_64.cpp +++ lldb/source/Plugins/Process/FreeBSDRemote/NativeRegisterContextFreeBSD_x86_64.cpp @@ -262,8 +262,28 @@ NativeRegisterContextFreeBSD_x86_64::NativeRegisterContextFreeBSD_x86_64( const ArchSpec &target_arch, NativeThreadProtocol &native_thread) : NativeRegisterContextRegisterInfo( - native_thread, CreateRegisterInfoInterface(target_arch)) { + native_thread, CreateRegisterInfoInterface(target_arch)), + m_regset_offsets({0}) { assert(m_gpr.size() == GetRegisterInfoInterface().GetGPRSize()); + std::array<uint32_t, MaxRegSet + 1> first_regnos; + + switch (GetRegisterInfoInterface().GetTargetArchitecture().GetMachine()) { + case llvm::Triple::x86: + first_regnos[FPRegSet] = lldb_fctrl_i386; + first_regnos[DBRegSet] = lldb_dr0_i386; + break; + case llvm::Triple::x86_64: + first_regnos[FPRegSet] = lldb_fctrl_x86_64; + first_regnos[DBRegSet] = lldb_dr0_x86_64; + break; + default: + llvm_unreachable("Unhandled target architecture."); + } + + for (int i = FPRegSet; i < MaxRegSet + 1; ++i) + m_regset_offsets[i] = GetRegisterInfoInterface() + .GetRegisterInfo()[first_regnos[i]] + .byte_offset; } // CONSIDER after local and llgs debugging are merged, register set support can @@ -429,15 +449,9 @@ switch (set) { case GPRegSet: - reg_value.SetBytes(m_gpr.data() + reg_info->byte_offset, - reg_info->byte_size, endian::InlHostByteOrder()); - break; case FPRegSet: - reg_value.SetBytes(m_fpr.data() + reg_info->byte_offset - GetFPROffset(), - reg_info->byte_size, endian::InlHostByteOrder()); - break; case DBRegSet: - reg_value.SetBytes(m_dbr.data() + reg_info->byte_offset - GetDBROffset(), + reg_value.SetBytes(GetOffsetRegSetData(set) + reg_info->byte_offset, reg_info->byte_size, endian::InlHostByteOrder()); break; case YMMRegSet: { @@ -493,15 +507,9 @@ switch (set) { case GPRegSet: - ::memcpy(m_gpr.data() + reg_info->byte_offset, reg_value.GetBytes(), - reg_value.GetByteSize()); - break; case FPRegSet: - ::memcpy(m_fpr.data() + reg_info->byte_offset - GetFPROffset(), - reg_value.GetBytes(), reg_value.GetByteSize()); - break; case DBRegSet: - ::memcpy(m_dbr.data() + reg_info->byte_offset - GetDBROffset(), + ::memcpy(GetOffsetRegSetData(set) + reg_info->byte_offset, reg_value.GetBytes(), reg_value.GetByteSize()); break; case YMMRegSet: { @@ -591,36 +599,23 @@ return res.ToError(); } -size_t NativeRegisterContextFreeBSD_x86_64::GetFPROffset() const { - uint32_t regno; - switch (GetRegisterInfoInterface().GetTargetArchitecture().GetMachine()) { - case llvm::Triple::x86: - regno = lldb_fctrl_i386; - break; - case llvm::Triple::x86_64: - regno = lldb_fctrl_x86_64; +uint8_t * +NativeRegisterContextFreeBSD_x86_64::GetOffsetRegSetData(uint32_t set) { + uint8_t *base; + switch (set) { + case GPRegSet: + base = m_gpr.data(); break; - default: - llvm_unreachable("Unhandled target architecture."); - } - - return GetRegisterInfoInterface().GetRegisterInfo()[regno].byte_offset; -} - -size_t NativeRegisterContextFreeBSD_x86_64::GetDBROffset() const { - uint32_t regno; - switch (GetRegisterInfoInterface().GetTargetArchitecture().GetMachine()) { - case llvm::Triple::x86: - regno = lldb_dr0_i386; + case FPRegSet: + base = m_fpr.data(); break; - case llvm::Triple::x86_64: - regno = lldb_dr0_x86_64; + case DBRegSet: + base = m_dbr.data(); break; - default: - llvm_unreachable("Unhandled target architecture."); + case YMMRegSet: + llvm_unreachable("GetRegSetData() is unsuitable for this regset."); } - - return GetRegisterInfoInterface().GetRegisterInfo()[regno].byte_offset; + return base - m_regset_offsets[set]; } llvm::Optional<YMMSplitPtr>
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits