https://github.com/igorkudrin updated https://github.com/llvm/llvm-project/pull/155956
>From b1348c5099d6071b08872b0bba67b8468c86c6fe Mon Sep 17 00:00:00 2001 From: Igor Kudrin <ikud...@accesssoftek.com> Date: Thu, 28 Aug 2025 14:39:37 -0700 Subject: [PATCH 1/4] [lldb][elf-core][ARM] Add support for VFP registers This patch loads values of the VFP registers from the NT_ARM_VFP note. Note that a CORE/NT_FPREGSET note is typically present in core dump files and used to store the FPA registers. The FPA unit is rare and obsolete; however, at least Linux and FreeBSD create the note even if the unit is absent. --- .../elf-core/RegisterContextPOSIXCore_arm.cpp | 21 ++++++++++++++++++ .../elf-core/RegisterContextPOSIXCore_arm.h | 1 + .../Process/elf-core/RegisterUtilities.cpp | 2 +- .../Process/elf-core/RegisterUtilities.h | 4 ++++ .../postmortem/elf-core/TestLinuxCore.py | 21 ++++++++++++++++++ .../postmortem/elf-core/linux-arm.core | Bin 252 -> 532 bytes 6 files changed, 48 insertions(+), 1 deletion(-) diff --git a/lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm.cpp b/lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm.cpp index 3a62081827c6a..acfa1103d62f0 100644 --- a/lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm.cpp +++ b/lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm.cpp @@ -23,6 +23,10 @@ RegisterContextCorePOSIX_arm::RegisterContextCorePOSIX_arm( gpregset.GetByteSize()); m_gpr.SetData(m_gpr_buffer); m_gpr.SetByteOrder(gpregset.GetByteOrder()); + + const llvm::Triple &target_triple = + m_register_info_up->GetTargetArchitecture().GetTriple(); + m_fpr = getRegset(notes, target_triple, ARM_VFP_Desc); } RegisterContextCorePOSIX_arm::~RegisterContextCorePOSIX_arm() = default; @@ -51,6 +55,23 @@ bool RegisterContextCorePOSIX_arm::ReadRegister(const RegisterInfo *reg_info, return true; } } + + const uint32_t reg = reg_info->kinds[lldb::eRegisterKindLLDB]; + if (reg == LLDB_INVALID_REGNUM) + return false; + + if (IsFPR(reg)) { + assert(offset >= GetGPRSize()); + offset -= GetGPRSize(); + if (m_fpr.ValidOffsetForDataOfSize(offset, reg_info->byte_size)) { + Status error; + value.SetFromMemoryData(*reg_info, m_fpr.GetDataStart() + offset, + reg_info->byte_size, lldb::eByteOrderLittle, + error); + return error.Success(); + } + } + return false; } diff --git a/lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm.h b/lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm.h index 8d773a046bcac..e466ee242181b 100644 --- a/lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm.h +++ b/lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm.h @@ -48,6 +48,7 @@ class RegisterContextCorePOSIX_arm : public RegisterContextPOSIX_arm { private: lldb::DataBufferSP m_gpr_buffer; lldb_private::DataExtractor m_gpr; + lldb_private::DataExtractor m_fpr; }; #endif // LLDB_SOURCE_PLUGINS_PROCESS_ELF_CORE_REGISTERCONTEXTPOSIXCORE_ARM_H diff --git a/lldb/source/Plugins/Process/elf-core/RegisterUtilities.cpp b/lldb/source/Plugins/Process/elf-core/RegisterUtilities.cpp index 7455d78774ee6..0100c2fdbd34b 100644 --- a/lldb/source/Plugins/Process/elf-core/RegisterUtilities.cpp +++ b/lldb/source/Plugins/Process/elf-core/RegisterUtilities.cpp @@ -16,7 +16,7 @@ static std::optional<uint32_t> getNoteType(const llvm::Triple &Triple, llvm::ArrayRef<RegsetDesc> RegsetDescs) { for (const auto &Entry : RegsetDescs) { - if (Entry.OS != Triple.getOS()) + if (Entry.OS != llvm::Triple::UnknownOS && Entry.OS != Triple.getOS()) continue; if (Entry.Arch != llvm::Triple::UnknownArch && Entry.Arch != Triple.getArch()) diff --git a/lldb/source/Plugins/Process/elf-core/RegisterUtilities.h b/lldb/source/Plugins/Process/elf-core/RegisterUtilities.h index 59382a12cde0a..645ec363768e9 100644 --- a/lldb/source/Plugins/Process/elf-core/RegisterUtilities.h +++ b/lldb/source/Plugins/Process/elf-core/RegisterUtilities.h @@ -152,6 +152,10 @@ constexpr RegsetDesc AARCH64_GCS_Desc[] = { {llvm::Triple::Linux, llvm::Triple::aarch64, llvm::ELF::NT_ARM_GCS}, }; +constexpr RegsetDesc ARM_VFP_Desc[] = { + {llvm::Triple::UnknownOS, llvm::Triple::arm, llvm::ELF::NT_ARM_VFP}, +}; + constexpr RegsetDesc PPC_VMX_Desc[] = { {llvm::Triple::FreeBSD, llvm::Triple::UnknownArch, llvm::ELF::NT_PPC_VMX}, {llvm::Triple::Linux, llvm::Triple::UnknownArch, llvm::ELF::NT_PPC_VMX}, diff --git a/lldb/test/API/functionalities/postmortem/elf-core/TestLinuxCore.py b/lldb/test/API/functionalities/postmortem/elf-core/TestLinuxCore.py index a68175dc4e4d7..d8b389fab0170 100644 --- a/lldb/test/API/functionalities/postmortem/elf-core/TestLinuxCore.py +++ b/lldb/test/API/functionalities/postmortem/elf-core/TestLinuxCore.py @@ -688,6 +688,27 @@ def test_arm_core(self): values["lr"] = "0x0000000e" values["pc"] = "0x0000000f" values["cpsr"] = "0x00000010" + for i in range(32): + values["s" + str(i)] = str(i) + values["fpscr"] = "0x12345678" + values["d0"] = "0.0078125" + values["d1"] = "32.000007629394531" + values["d2"] = "2048.0004920959473" + values["d3"] = "32768.007904052734" + values["d4"] = "262144.0634765625" + values["d5"] = "1048576.2543945313" + values["d6"] = "4194305.01953125" + values["d7"] = "16777220.0859375" + values["d8"] = "50331656.1875" + values["d9"] = "100663312.390625" + values["d10"] = "201326624.8125" + values["d11"] = "402653249.6875" + values["d12"] = "805306499.5" + values["d13"] = "1610612999.25" + values["d14"] = "3221225999" + values["d15"] = "6442451999" + for i in range(16, 32): + values["d" + str(i)] = str(i) for regname, value in values.items(): self.expect( "register read {}".format(regname), diff --git a/lldb/test/API/functionalities/postmortem/elf-core/linux-arm.core b/lldb/test/API/functionalities/postmortem/elf-core/linux-arm.core index a919a9d6ae66667f781743e60ca338edee61effe..be501a56c1c8c1811bbf4059afb1b3225fefc744 100644 GIT binary patch literal 532 zcmYk$zfZzI7{>9d)*tu-fyA8+M${^bA~gmR69UAjar94MG%j{@bZ~I&=;&yiIyy2s zGBUF1==W_O2$z2P+`YZKw@>ZPh39#TPQ!Oq=V=~Hi)7%+v%1gvdhS~?J)qhW`3fta z_paJjUbmOVY+mACG}u_#&OX|i$(MC-uJE{$=Af80h<~%+wABJ^Wjn3kGHmxMa#(}) z*}x|9*g^qC&^A5e+httRx$NHDG0jHQB10ZTh>>6fcg8I!qlOTD++%<U&v?NbV!Y!6 zpGfeHA$~Bz7!&-#MlDRk?I?GZd&)q$uRKuJm50hBWkY$aJW)24r^;6Na2u5V0Z7R$ A-2eap delta 12 TcmbQj@`rJP3)2dQiEi5f9j*kS >From bc1482b9f75a5347f30fafc9a4c2c5aa72c6a405 Mon Sep 17 00:00:00 2001 From: Igor Kudrin <ikud...@accesssoftek.com> Date: Fri, 29 Aug 2025 17:52:58 -0700 Subject: [PATCH 2/4] fixup! Rework RegisterContextCorePOSIX_arm::ReadRegister() --- .../elf-core/RegisterContextPOSIXCore_arm.cpp | 30 ++++++++----------- 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm.cpp b/lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm.cpp index acfa1103d62f0..c9e90ebf8a4dd 100644 --- a/lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm.cpp +++ b/lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm.cpp @@ -47,29 +47,23 @@ bool RegisterContextCorePOSIX_arm::WriteFPR() { bool RegisterContextCorePOSIX_arm::ReadRegister(const RegisterInfo *reg_info, RegisterValue &value) { - lldb::offset_t offset = reg_info->byte_offset; - if (offset + reg_info->byte_size <= GetGPRSize()) { - uint64_t v = m_gpr.GetMaxU64(&offset, reg_info->byte_size); - if (offset == reg_info->byte_offset + reg_info->byte_size) { - value = v; - return true; - } - } - const uint32_t reg = reg_info->kinds[lldb::eRegisterKindLLDB]; if (reg == LLDB_INVALID_REGNUM) return false; - if (IsFPR(reg)) { - assert(offset >= GetGPRSize()); - offset -= GetGPRSize(); - if (m_fpr.ValidOffsetForDataOfSize(offset, reg_info->byte_size)) { - Status error; - value.SetFromMemoryData(*reg_info, m_fpr.GetDataStart() + offset, - reg_info->byte_size, lldb::eByteOrderLittle, - error); - return error.Success(); + if (IsGPR(reg)) { + lldb::offset_t offset = reg_info->byte_offset; + if (m_gpr.ValidOffsetForDataOfSize(offset, reg_info->byte_size)) { + value = m_gpr.GetMaxU64(&offset, reg_info->byte_size); + return offset == reg_info->byte_offset + reg_info->byte_size; } + } else if (IsFPR(reg)) { + assert(reg_info->byte_offset >= GetGPRSize()); + lldb::offset_t offset = reg_info->byte_offset - GetGPRSize(); + if (m_fpr.ValidOffsetForDataOfSize(offset, reg_info->byte_size)) + return value + .SetValueFromData(*reg_info, m_fpr, offset, /*partial_data_ok=*/false) + .Success(); } return false; >From 545a50da6ef9eed8e9c75b5728fe911b512f1212 Mon Sep 17 00:00:00 2001 From: Igor Kudrin <ikud...@accesssoftek.com> Date: Wed, 3 Sep 2025 23:13:12 -0700 Subject: [PATCH 3/4] fixup! Specify supported OSes directly --- lldb/source/Plugins/Process/elf-core/RegisterUtilities.cpp | 2 +- lldb/source/Plugins/Process/elf-core/RegisterUtilities.h | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lldb/source/Plugins/Process/elf-core/RegisterUtilities.cpp b/lldb/source/Plugins/Process/elf-core/RegisterUtilities.cpp index 0100c2fdbd34b..7455d78774ee6 100644 --- a/lldb/source/Plugins/Process/elf-core/RegisterUtilities.cpp +++ b/lldb/source/Plugins/Process/elf-core/RegisterUtilities.cpp @@ -16,7 +16,7 @@ static std::optional<uint32_t> getNoteType(const llvm::Triple &Triple, llvm::ArrayRef<RegsetDesc> RegsetDescs) { for (const auto &Entry : RegsetDescs) { - if (Entry.OS != llvm::Triple::UnknownOS && Entry.OS != Triple.getOS()) + if (Entry.OS != Triple.getOS()) continue; if (Entry.Arch != llvm::Triple::UnknownArch && Entry.Arch != Triple.getArch()) diff --git a/lldb/source/Plugins/Process/elf-core/RegisterUtilities.h b/lldb/source/Plugins/Process/elf-core/RegisterUtilities.h index 645ec363768e9..270ce1e4375dc 100644 --- a/lldb/source/Plugins/Process/elf-core/RegisterUtilities.h +++ b/lldb/source/Plugins/Process/elf-core/RegisterUtilities.h @@ -153,7 +153,8 @@ constexpr RegsetDesc AARCH64_GCS_Desc[] = { }; constexpr RegsetDesc ARM_VFP_Desc[] = { - {llvm::Triple::UnknownOS, llvm::Triple::arm, llvm::ELF::NT_ARM_VFP}, + {llvm::Triple::FreeBSD, llvm::Triple::UnknownArch, llvm::ELF::NT_ARM_VFP}, + {llvm::Triple::Linux, llvm::Triple::UnknownArch, llvm::ELF::NT_ARM_VFP}, }; constexpr RegsetDesc PPC_VMX_Desc[] = { >From 17add1f0f5b50f385426270051f7e9e8ec2f09a1 Mon Sep 17 00:00:00 2001 From: Igor Kudrin <ikud...@accesssoftek.com> Date: Wed, 3 Sep 2025 23:16:14 -0700 Subject: [PATCH 4/4] fixup! Use a real core file; add a source file so that it can be regenerated --- .../postmortem/elf-core/TestLinuxCore.py | 46 ++++++++++-------- .../postmortem/elf-core/linux-arm-vfp.c | 21 ++++++++ .../postmortem/elf-core/linux-arm-vfp.core | Bin 0 -> 24576 bytes .../postmortem/elf-core/linux-arm.core | Bin 532 -> 252 bytes 4 files changed, 46 insertions(+), 21 deletions(-) create mode 100644 lldb/test/API/functionalities/postmortem/elf-core/linux-arm-vfp.c create mode 100644 lldb/test/API/functionalities/postmortem/elf-core/linux-arm-vfp.core diff --git a/lldb/test/API/functionalities/postmortem/elf-core/TestLinuxCore.py b/lldb/test/API/functionalities/postmortem/elf-core/TestLinuxCore.py index d8b389fab0170..685767f75e6f3 100644 --- a/lldb/test/API/functionalities/postmortem/elf-core/TestLinuxCore.py +++ b/lldb/test/API/functionalities/postmortem/elf-core/TestLinuxCore.py @@ -688,27 +688,31 @@ def test_arm_core(self): values["lr"] = "0x0000000e" values["pc"] = "0x0000000f" values["cpsr"] = "0x00000010" - for i in range(32): - values["s" + str(i)] = str(i) - values["fpscr"] = "0x12345678" - values["d0"] = "0.0078125" - values["d1"] = "32.000007629394531" - values["d2"] = "2048.0004920959473" - values["d3"] = "32768.007904052734" - values["d4"] = "262144.0634765625" - values["d5"] = "1048576.2543945313" - values["d6"] = "4194305.01953125" - values["d7"] = "16777220.0859375" - values["d8"] = "50331656.1875" - values["d9"] = "100663312.390625" - values["d10"] = "201326624.8125" - values["d11"] = "402653249.6875" - values["d12"] = "805306499.5" - values["d13"] = "1610612999.25" - values["d14"] = "3221225999" - values["d15"] = "6442451999" - for i in range(16, 32): - values["d" + str(i)] = str(i) + for regname, value in values.items(): + self.expect( + "register read {}".format(regname), + substrs=["{} = {}".format(regname, value)], + ) + + self.expect("register read --all") + + @skipIfLLVMTargetMissing("ARM") + def test_arm_core_vfp(self): + # check reading VFP registers + target = self.dbg.CreateTarget(None) + self.assertTrue(target, VALID_TARGET) + process = target.LoadCore("linux-arm-vfp.core") + + values = {} + values["d0"] = "0.5" + values["d1"] = "1.5" + values["d2"] = "2.5" + values["d3"] = "3.5" + values["s8"] = "4.5" + values["s9"] = "5.5" + values["s10"] = "6.5" + values["s11"] = "7.5" + values["fpscr"] = "0x20000000" for regname, value in values.items(): self.expect( "register read {}".format(regname), diff --git a/lldb/test/API/functionalities/postmortem/elf-core/linux-arm-vfp.c b/lldb/test/API/functionalities/postmortem/elf-core/linux-arm-vfp.c new file mode 100644 index 0000000000000..9cba59efa8881 --- /dev/null +++ b/lldb/test/API/functionalities/postmortem/elf-core/linux-arm-vfp.c @@ -0,0 +1,21 @@ +// commandline: -march=armv7+fp -nostdlib -static -Wl,--build-id=none linux-arm-vfp.c + +static void foo(char *boom) { + asm volatile(R"( + vmov.f64 d0, #0.5 + vmov.f64 d1, #1.5 + vmov.f64 d2, #2.5 + vmov.f64 d3, #3.5 + vmov.f32 s8, #4.5 + vmov.f32 s9, #5.5 + vmov.f32 s10, #6.5 + vmov.f32 s11, #7.5 + vcmp.f32 s9, s8 + )"); + + *boom = 47; +} + +void _start(void) { + foo(0); +} diff --git a/lldb/test/API/functionalities/postmortem/elf-core/linux-arm-vfp.core b/lldb/test/API/functionalities/postmortem/elf-core/linux-arm-vfp.core new file mode 100644 index 0000000000000000000000000000000000000000..a4303faf7f9ac3d5d7efb1396dc6be6e5336a0fd GIT binary patch literal 24576 zcmeI4?@wE06vxkPFNHB2Y{3i|&Pt3-vA?hh1`}XGKnR=Kxx~z9cRRYQ$qG$-JJ6ZX z=u6+IF~)Z@#uvVjteZdfiVXh)vKU`2j_QmU@vbBqrir<p)82=51*7AI5%N9B>3Pm` zp6A}@`8=mD&P{t~hsK9BO(P{b9U|q0RVUjpd8x+nb+%tu#BRFpI1($(Z<0ReO44R6 z&1YNc^-BD$HTjg-hIo+smR4*D^Q}wjk+z!uoH%wlUNv9t^B$|*XYkp`5F6SpAC6SE zYukv5twhSIG5=%(n+&MC<*c_VCjIlgnvYq7lv|I=I$viMd}^H(VaGE-%kE{jT9dM8 z6O-8)pOH@b&Ye#Ar^p|u>dBg3p1oy}_2gJbM@EmS^(a=(NpAVtTb(Ft`h-=^Uad)v z`<wilrt)Dg`xC6fG0cp0wq915>td~C6{#y5+Qs%W9w&QS=1C2Xz0a|G9J`;b2&V^K z=QHF~p(yKvtT*iyyOHe*_a9)}?x>fo61l&Rb!dEaSgpOpQ8vK$r=~L1fSF7MLK_cL zM#&y^8OEC$A3b{fMd>WbQh(XrcC0>7_8Zu~&6;OjWG%ApIPvbd9brQt00JNY0w4ea zAOHd&@E;JEt*ZZBPW><Sk<|YmNCBl&jnw}VtL2KMT(!vJq@~dUe~L=IBlY?7KbTUE zZ4jwtr1Z&s{$`#o&Yb+xqTN@lx&wJj@5);ZPhGNHW2=^D?2=V~V%6Gn;#ceGvGZpF z9c?MP+R!sU{PJ!6d}<{31zjYsy>{KEtGW4+!NFedp@@-5#S+G(H`ML#_6L2Ta928& z2z5=wW1;SB=uxMi4nNMfH{wPtL0ShlYkJ62zspsx@6(&L`?dY<7OholbG2&+Jso#; z$phELbawBqpddkasnT2@#{S(SbXv8gPF3@TTQmDvwtZ|}Y&+R5I5lAt`z=-eBUOG6 z`*KcFukK^pT@{z>R$gzo%0E)&)7_5~PSL|Aot~PaXf&3|L^Gz5HltC;i%(9hw@VT3 zclzQJhG~#^ME=aHNz;h2HPdB#MzzfNj7k1eQ^{m}k{gF3NBo9qrW3KO8PD*_{+&qe zEhi<pC2UQ$<E%>LS%AnxtTHYr4$A_oUmA``O!P5Uek71`y2;{()bL7VjEGqIYA9*v zjv_nq9gyb@a$m`HdDbA$C6qMqq=<6Zs_RK^RE~Rv$MtS9uA&P~5C8!X009sH0T2KI z5C8!XxF-VBsSm%OCb~7<IelY}+jHEW>zuo>`t6@TLcstzfE+*$AP0~G$N}U4asWAi z96$~r2ap3hBM0v3VF3n%00@8p2!H?xfB*=900@8p2!Oy2BG6LtKW_Pb?jrx!S8Y#z z)4Lu1do1hiZT{uTr>`9k|Gc;Vg=bo?Mb15WR&4_o1V8`;KmY_l00ck)1V8`;KmY_l zU>g(I<ehMvy(exP?+{A|0T2KI5C8!X009sH0T2KI5CDPyAAutIep(z@C@h}*s&Jw4 zazPIUmui9`dcW@@e(U}d?%!>@{-xsVZ$z2ziZs7`&<+$TcOkLrzRLK8{&x!$Jht>s Y-y5at{ZVl}nU`vO!1}xS@~*PK06W0@HUIzs literal 0 HcmV?d00001 diff --git a/lldb/test/API/functionalities/postmortem/elf-core/linux-arm.core b/lldb/test/API/functionalities/postmortem/elf-core/linux-arm.core index be501a56c1c8c1811bbf4059afb1b3225fefc744..a919a9d6ae66667f781743e60ca338edee61effe 100644 GIT binary patch delta 12 TcmbQj@`rJP3)2dQiEi5f9j*kS literal 532 zcmYk$zfZzI7{>9d)*tu-fyA8+M${^bA~gmR69UAjar94MG%j{@bZ~I&=;&yiIyy2s zGBUF1==W_O2$z2P+`YZKw@>ZPh39#TPQ!Oq=V=~Hi)7%+v%1gvdhS~?J)qhW`3fta z_paJjUbmOVY+mACG}u_#&OX|i$(MC-uJE{$=Af80h<~%+wABJ^Wjn3kGHmxMa#(}) z*}x|9*g^qC&^A5e+httRx$NHDG0jHQB10ZTh>>6fcg8I!qlOTD++%<U&v?NbV!Y!6 zpGfeHA$~Bz7!&-#MlDRk?I?GZd&)q$uRKuJm50hBWkY$aJW)24r^;6Na2u5V0Z7R$ A-2eap _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits