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

Reply via email to