[Lldb-commits] [lldb] [lldb][RISCV] Add RegisterContextPOSIXCore for RISC-V 64 (PR #93297)

Alexey Merzlyakov via lldb-commits lldb-commits at lists.llvm.org
Tue Jun 4 04:54:55 PDT 2024


https://github.com/AlexeyMerzlyakov updated https://github.com/llvm/llvm-project/pull/93297

>From d30c3b7017bd9f4b9f442ee728d7e3d7847c60cf Mon Sep 17 00:00:00 2001
From: Alexey Merzlyakov <alexey.merzlyakov at samsung.com>
Date: Fri, 24 May 2024 11:54:16 +0300
Subject: [PATCH 1/3] Add RegisterContextPOSIXCore for RISC-V 64

Fix GetRegisterSetCount() method name misprint for RegisterContextPOSIX_riscv64
---
 .../Utility/RegisterContextPOSIX_riscv64.cpp  |  2 +-
 .../Plugins/Process/elf-core/CMakeLists.txt   |  1 +
 .../RegisterContextPOSIXCore_riscv64.cpp      | 84 +++++++++++++++++++
 .../RegisterContextPOSIXCore_riscv64.h        | 60 +++++++++++++
 .../Process/elf-core/ThreadElfCore.cpp        |  8 +-
 5 files changed, 153 insertions(+), 2 deletions(-)
 create mode 100644 lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_riscv64.cpp
 create mode 100644 lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_riscv64.h

diff --git a/lldb/source/Plugins/Process/Utility/RegisterContextPOSIX_riscv64.cpp b/lldb/source/Plugins/Process/Utility/RegisterContextPOSIX_riscv64.cpp
index 1834a94dc0260..035ce00e11626 100644
--- a/lldb/source/Plugins/Process/Utility/RegisterContextPOSIX_riscv64.cpp
+++ b/lldb/source/Plugins/Process/Utility/RegisterContextPOSIX_riscv64.cpp
@@ -58,7 +58,7 @@ RegisterContextPOSIX_riscv64::GetRegisterInfoAtIndex(size_t reg) {
 }
 
 size_t RegisterContextPOSIX_riscv64::GetRegisterSetCount() {
-  return m_register_info_up->GetRegisterCount();
+  return m_register_info_up->GetRegisterSetCount();
 }
 
 const lldb_private::RegisterSet *
diff --git a/lldb/source/Plugins/Process/elf-core/CMakeLists.txt b/lldb/source/Plugins/Process/elf-core/CMakeLists.txt
index 8ddc671e3ae66..72925c835b5c8 100644
--- a/lldb/source/Plugins/Process/elf-core/CMakeLists.txt
+++ b/lldb/source/Plugins/Process/elf-core/CMakeLists.txt
@@ -9,6 +9,7 @@ add_lldb_library(lldbPluginProcessElfCore PLUGIN
   RegisterContextPOSIXCore_ppc64le.cpp
   RegisterContextPOSIXCore_s390x.cpp
   RegisterContextPOSIXCore_x86_64.cpp
+  RegisterContextPOSIXCore_riscv64.cpp
   RegisterUtilities.cpp
 
   LINK_LIBS
diff --git a/lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_riscv64.cpp b/lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_riscv64.cpp
new file mode 100644
index 0000000000000..2202be4d38082
--- /dev/null
+++ b/lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_riscv64.cpp
@@ -0,0 +1,84 @@
+//===-- RegisterContextPOSIXCore_riscv64.cpp ------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "RegisterContextPOSIXCore_riscv64.h"
+
+#include "lldb/Utility/DataBufferHeap.h"
+
+using namespace lldb_private;
+
+std::unique_ptr<RegisterContextCorePOSIX_riscv64>
+RegisterContextCorePOSIX_riscv64::Create(
+    lldb_private::Thread &thread, const lldb_private::ArchSpec &arch,
+    const lldb_private::DataExtractor &gpregset,
+    llvm::ArrayRef<lldb_private::CoreNote> notes) {
+  Flags flags = 0;
+
+  auto register_info_up =
+      std::make_unique<RegisterInfoPOSIX_riscv64>(arch, flags);
+  return std::unique_ptr<RegisterContextCorePOSIX_riscv64>(
+      new RegisterContextCorePOSIX_riscv64(thread, std::move(register_info_up),
+                                           gpregset, notes));
+}
+
+RegisterContextCorePOSIX_riscv64::RegisterContextCorePOSIX_riscv64(
+    Thread &thread, std::unique_ptr<RegisterInfoPOSIX_riscv64> register_info,
+    const DataExtractor &gpregset, llvm::ArrayRef<CoreNote> notes)
+    : RegisterContextPOSIX_riscv64(thread, std::move(register_info)) {
+
+  m_gpr_buffer = std::make_shared<DataBufferHeap>(gpregset.GetDataStart(),
+                                                  gpregset.GetByteSize());
+  m_gpr.SetData(m_gpr_buffer);
+  m_gpr.SetByteOrder(gpregset.GetByteOrder());
+
+  ArchSpec arch = m_register_info_up->GetTargetArchitecture();
+  DataExtractor fpregset = getRegset(notes, arch.GetTriple(), FPR_Desc);
+  m_fpr_buffer = std::make_shared<DataBufferHeap>(fpregset.GetDataStart(),
+                                                  fpregset.GetByteSize());
+  m_fpr.SetData(m_fpr_buffer);
+  m_fpr.SetByteOrder(fpregset.GetByteOrder());
+}
+
+RegisterContextCorePOSIX_riscv64::~RegisterContextCorePOSIX_riscv64() = default;
+
+bool RegisterContextCorePOSIX_riscv64::ReadGPR() { return true; }
+
+bool RegisterContextCorePOSIX_riscv64::ReadFPR() { return true; }
+
+bool RegisterContextCorePOSIX_riscv64::WriteGPR() {
+  assert(0);
+  return false;
+}
+
+bool RegisterContextCorePOSIX_riscv64::WriteFPR() {
+  assert(0);
+  return false;
+}
+
+bool RegisterContextCorePOSIX_riscv64::ReadRegister(
+    const RegisterInfo *reg_info, RegisterValue &value) {
+  const uint8_t *src = nullptr;
+  lldb::offset_t offset = reg_info->byte_offset;
+
+  if (IsGPR(reg_info->kinds[lldb::eRegisterKindLLDB])) {
+    src = m_gpr.GetDataStart();
+  } else { // IsFPR
+    src = m_fpr.GetDataStart();
+    offset -= GetGPRSize();
+  }
+
+  Status error;
+  value.SetFromMemoryData(*reg_info, src + offset, reg_info->byte_size,
+                          lldb::eByteOrderLittle, error);
+  return error.Success();
+}
+
+bool RegisterContextCorePOSIX_riscv64::WriteRegister(
+    const RegisterInfo *reg_info, const RegisterValue &value) {
+  return false;
+}
diff --git a/lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_riscv64.h b/lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_riscv64.h
new file mode 100644
index 0000000000000..3cf9531df2c1d
--- /dev/null
+++ b/lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_riscv64.h
@@ -0,0 +1,60 @@
+//===-- RegisterContextPOSIXCore_riscv64.h ----------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLDB_SOURCE_PLUGINS_PROCESS_ELF_CORE_REGISTERCONTEXTPOSIXCORE_RISCV64_H
+#define LLDB_SOURCE_PLUGINS_PROCESS_ELF_CORE_REGISTERCONTEXTPOSIXCORE_RISCV64_H
+
+#include "Plugins/Process/Utility/RegisterContextPOSIX_riscv64.h"
+#include "Plugins/Process/Utility/RegisterInfoPOSIX_riscv64.h"
+
+#include "Plugins/Process/elf-core/RegisterUtilities.h"
+#include "lldb/Target/Thread.h"
+#include "lldb/Utility/DataExtractor.h"
+#include "lldb/Utility/RegisterValue.h"
+
+#include <memory>
+
+class RegisterContextCorePOSIX_riscv64 : public RegisterContextPOSIX_riscv64 {
+public:
+  static std::unique_ptr<RegisterContextCorePOSIX_riscv64>
+  Create(lldb_private::Thread &thread, const lldb_private::ArchSpec &arch,
+         const lldb_private::DataExtractor &gpregset,
+         llvm::ArrayRef<lldb_private::CoreNote> notes);
+
+  ~RegisterContextCorePOSIX_riscv64() override;
+
+  bool ReadRegister(const lldb_private::RegisterInfo *reg_info,
+                    lldb_private::RegisterValue &value) override;
+
+  bool WriteRegister(const lldb_private::RegisterInfo *reg_info,
+                     const lldb_private::RegisterValue &value) override;
+
+protected:
+  RegisterContextCorePOSIX_riscv64(
+      lldb_private::Thread &thread,
+      std::unique_ptr<RegisterInfoPOSIX_riscv64> register_info,
+      const lldb_private::DataExtractor &gpregset,
+      llvm::ArrayRef<lldb_private::CoreNote> notes);
+
+  bool ReadGPR() override;
+
+  bool ReadFPR() override;
+
+  bool WriteGPR() override;
+
+  bool WriteFPR() override;
+
+private:
+  lldb::DataBufferSP m_gpr_buffer;
+  lldb::DataBufferSP m_fpr_buffer;
+
+  lldb_private::DataExtractor m_gpr;
+  lldb_private::DataExtractor m_fpr;
+};
+
+#endif // LLDB_SOURCE_PLUGINS_PROCESS_ELF_CORE_REGISTERCONTEXTPOSIXCORE_RISCV64_H
diff --git a/lldb/source/Plugins/Process/elf-core/ThreadElfCore.cpp b/lldb/source/Plugins/Process/elf-core/ThreadElfCore.cpp
index 3ce2a4a5c3fa4..2a83163884e16 100644
--- a/lldb/source/Plugins/Process/elf-core/ThreadElfCore.cpp
+++ b/lldb/source/Plugins/Process/elf-core/ThreadElfCore.cpp
@@ -35,6 +35,7 @@
 #include "RegisterContextPOSIXCore_mips64.h"
 #include "RegisterContextPOSIXCore_powerpc.h"
 #include "RegisterContextPOSIXCore_ppc64le.h"
+#include "RegisterContextPOSIXCore_riscv64.h"
 #include "RegisterContextPOSIXCore_s390x.h"
 #include "RegisterContextPOSIXCore_x86_64.h"
 #include "ThreadElfCore.h"
@@ -168,7 +169,8 @@ ThreadElfCore::CreateRegisterContextForFrame(StackFrame *frame) {
     }
 
     if (!reg_interface && arch.GetMachine() != llvm::Triple::aarch64 &&
-        arch.GetMachine() != llvm::Triple::arm) {
+        arch.GetMachine() != llvm::Triple::arm &&
+        arch.GetMachine() != llvm::Triple::riscv64) {
       LLDB_LOGF(log, "elf-core::%s:: Architecture(%d) or OS(%d) not supported",
                 __FUNCTION__, arch.GetMachine(), arch.GetTriple().getOS());
       assert(false && "Architecture or OS not supported");
@@ -184,6 +186,10 @@ ThreadElfCore::CreateRegisterContextForFrame(StackFrame *frame) {
           *this, std::make_unique<RegisterInfoPOSIX_arm>(arch), m_gpregset_data,
           m_notes);
       break;
+    case llvm::Triple::riscv64:
+      m_thread_reg_ctx_sp = RegisterContextCorePOSIX_riscv64::Create(
+          *this, arch, m_gpregset_data, m_notes);
+      break;
     case llvm::Triple::mipsel:
     case llvm::Triple::mips:
       m_thread_reg_ctx_sp = std::make_shared<RegisterContextCorePOSIX_mips64>(

>From 7239f6293ee088a7cde8fa2e6feee00aedf7ac9a Mon Sep 17 00:00:00 2001
From: Alexey Merzlyakov <alexey.merzlyakov at samsung.com>
Date: Wed, 29 May 2024 12:29:38 +0300
Subject: [PATCH 2/3] Meet review items

---
 .../RegisterContextPOSIXCore_riscv64.cpp      | 22 +++++++++----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_riscv64.cpp b/lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_riscv64.cpp
index 2202be4d38082..6f188a9fad5ed 100644
--- a/lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_riscv64.cpp
+++ b/lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_riscv64.cpp
@@ -13,17 +13,15 @@
 using namespace lldb_private;
 
 std::unique_ptr<RegisterContextCorePOSIX_riscv64>
-RegisterContextCorePOSIX_riscv64::Create(
-    lldb_private::Thread &thread, const lldb_private::ArchSpec &arch,
-    const lldb_private::DataExtractor &gpregset,
-    llvm::ArrayRef<lldb_private::CoreNote> notes) {
+RegisterContextCorePOSIX_riscv64::Create(Thread &thread, const ArchSpec &arch,
+                                         const DataExtractor &gpregset,
+                                         llvm::ArrayRef<CoreNote> notes) {
   Flags flags = 0;
 
-  auto register_info_up =
-      std::make_unique<RegisterInfoPOSIX_riscv64>(arch, flags);
   return std::unique_ptr<RegisterContextCorePOSIX_riscv64>(
-      new RegisterContextCorePOSIX_riscv64(thread, std::move(register_info_up),
-                                           gpregset, notes));
+      new RegisterContextCorePOSIX_riscv64(
+          thread, std::make_unique<RegisterInfoPOSIX_riscv64>(arch, flags),
+          gpregset, notes));
 }
 
 RegisterContextCorePOSIX_riscv64::RegisterContextCorePOSIX_riscv64(
@@ -51,12 +49,12 @@ bool RegisterContextCorePOSIX_riscv64::ReadGPR() { return true; }
 bool RegisterContextCorePOSIX_riscv64::ReadFPR() { return true; }
 
 bool RegisterContextCorePOSIX_riscv64::WriteGPR() {
-  assert(0);
+  assert(false && "Writing registers is not allowed for core dumps");
   return false;
 }
 
 bool RegisterContextCorePOSIX_riscv64::WriteFPR() {
-  assert(0);
+  assert(false && "Writing registers is not allowed for core dumps");
   return false;
 }
 
@@ -67,9 +65,11 @@ bool RegisterContextCorePOSIX_riscv64::ReadRegister(
 
   if (IsGPR(reg_info->kinds[lldb::eRegisterKindLLDB])) {
     src = m_gpr.GetDataStart();
-  } else { // IsFPR
+  } else if (IsFPR(reg_info->kinds[lldb::eRegisterKindLLDB])) {
     src = m_fpr.GetDataStart();
     offset -= GetGPRSize();
+  } else {
+    return false;
   }
 
   Status error;

>From 071886e99f4cc758789fab1701770a54bd240149 Mon Sep 17 00:00:00 2001
From: Alexey Merzlyakov <alexey.merzlyakov at samsung.com>
Date: Tue, 4 Jun 2024 14:51:32 +0300
Subject: [PATCH 3/3] Optimize flags initialization

Add RISC-V 64 testcases to TestLinuxCore.py
---
 .../RegisterContextPOSIXCore_riscv64.cpp      |   4 +-
 .../postmortem/elf-core/TestLinuxCore.py      |  57 ++++++++++++++++++
 .../postmortem/elf-core/linux-riscv64.core    | Bin 0 -> 24576 bytes
 .../postmortem/elf-core/linux-riscv64.out     | Bin 0 -> 3328 bytes
 4 files changed, 58 insertions(+), 3 deletions(-)
 create mode 100644 lldb/test/API/functionalities/postmortem/elf-core/linux-riscv64.core
 create mode 100755 lldb/test/API/functionalities/postmortem/elf-core/linux-riscv64.out

diff --git a/lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_riscv64.cpp b/lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_riscv64.cpp
index 6f188a9fad5ed..5ba18cdb9889a 100644
--- a/lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_riscv64.cpp
+++ b/lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_riscv64.cpp
@@ -16,11 +16,9 @@ std::unique_ptr<RegisterContextCorePOSIX_riscv64>
 RegisterContextCorePOSIX_riscv64::Create(Thread &thread, const ArchSpec &arch,
                                          const DataExtractor &gpregset,
                                          llvm::ArrayRef<CoreNote> notes) {
-  Flags flags = 0;
-
   return std::unique_ptr<RegisterContextCorePOSIX_riscv64>(
       new RegisterContextCorePOSIX_riscv64(
-          thread, std::make_unique<RegisterInfoPOSIX_riscv64>(arch, flags),
+          thread, std::make_unique<RegisterInfoPOSIX_riscv64>(arch, Flags()),
           gpregset, notes));
 }
 
diff --git a/lldb/test/API/functionalities/postmortem/elf-core/TestLinuxCore.py b/lldb/test/API/functionalities/postmortem/elf-core/TestLinuxCore.py
index 8ec0cbdd0fdd1..24d17a814a775 100644
--- a/lldb/test/API/functionalities/postmortem/elf-core/TestLinuxCore.py
+++ b/lldb/test/API/functionalities/postmortem/elf-core/TestLinuxCore.py
@@ -21,12 +21,14 @@ class LinuxCoreTestCase(TestBase):
     _x86_64_pid = 32259
     _s390x_pid = 1045
     _ppc64le_pid = 28147
+    _riscv64_pid = 87015
 
     _aarch64_regions = 4
     _i386_regions = 4
     _x86_64_regions = 5
     _s390x_regions = 2
     _ppc64le_regions = 2
+    _riscv64_regions = 4
 
     @skipIfLLVMTargetMissing("AArch64")
     def test_aarch64(self):
@@ -58,6 +60,11 @@ def test_s390x(self):
         """Test that lldb can read the process information from an s390x linux core file."""
         self.do_test("linux-s390x", self._s390x_pid, self._s390x_regions, "a.out")
 
+    @skipIfLLVMTargetMissing("RISCV")
+    def test_riscv64(self):
+        """Test that lldb can read the process information from an riscv64 linux core file."""
+        self.do_test("linux-riscv64", self._riscv64_pid, self._riscv64_regions, "a.out")
+
     @skipIfLLVMTargetMissing("X86")
     def test_same_pid_running(self):
         """Test that we read the information from the core correctly even if we have a running
@@ -629,6 +636,56 @@ def test_arm_core(self):
 
         self.expect("register read --all")
 
+    @skipIfLLVMTargetMissing("RISCV")
+    def test_riscv64_regs(self):
+        # check basic registers using 64 bit RISC-V core file
+        target = self.dbg.CreateTarget(None)
+        self.assertTrue(target, VALID_TARGET)
+        process = target.LoadCore("linux-riscv64.core")
+
+        values = {}
+        values["pc"] = "0x000000000001015e"
+        values["ra"] = "0x000000000001018c"
+        values["sp"] = "0x0000003fffb3e2a0"
+        values["gp"] = "0x0000002ad7ff1f50"
+        values["tp"] = "0x0000003fd11433e0"
+        values["t0"] = "0x0"
+        values["t1"] = "0x0000002ad7fdeb1c"
+        values["t2"] = "0x0000000000000021"
+        values["fp"] = "0x0000003fffb3e2d0"
+        values["s1"] = "0x0000002ad7ff3d98"
+        values["a0"] = "0x0"
+        values["a1"] = "0x0000000000010144"
+        values["a2"] = "0x0000002ad7ff3db0"
+        values["a3"] = "0x000000000000002f"
+        values["a4"] = "0x000000000000002f"
+        values["a5"] = "0x0"
+        values["a6"] = "0x7efefefefefefeff"
+        values["a7"] = "0x00000000000000dd"
+        values["s2"] = "0x0000002ad7fed860"
+        values["s3"] = "0x0000002ad7ff3db0"
+        values["s4"] = "0x0000003fff889be8"
+        values["s5"] = "0x0000002ad7ff3b78"
+        values["s6"] = "0x0000002ad7fed860"
+        values["s7"] = "0x0000002ad7fed860"
+        values["s8"] = "0x0"
+        values["s9"] = "0x000000000000000f"
+        values["s10"] = "0x0000002ad7ff18d0"
+        values["s11"] = "0x0000000000000008"
+        values["t3"] = "0x0000003fd109cdf4"
+        values["t4"] = "0x0"
+        values["t5"] = "0x0000000000000020"
+        values["t6"] = "0x0000002ad7ff61b0"
+        values["zero"] = "0x0"
+
+        for regname, value in values.items():
+            self.expect(
+                "register read {}".format(regname),
+                substrs=["{} = {}".format(regname, value)],
+            )
+
+        self.expect("register read --all")
+
     def test_get_core_file_api(self):
         """
         Test SBProcess::GetCoreFile() API can successfully get the core file.
diff --git a/lldb/test/API/functionalities/postmortem/elf-core/linux-riscv64.core b/lldb/test/API/functionalities/postmortem/elf-core/linux-riscv64.core
new file mode 100644
index 0000000000000000000000000000000000000000..84b352402e8ca8468a55465360578db2f15f7fd0
GIT binary patch
literal 24576
zcmeG^3vg7|b@%O}4-!ZM1tSJJEFgmIMyt1y5U}!Mt)xY0DkN1aCE&CyZ$DZs?9cml
zC80Pr9~<P>33$}0T!(z!7{~5(n34?5v at S5NO(veScAJUa8QW=13Cy_0xN%5H0QH>v
z?s at O+i*P(9?M%~mrT5Oc=bm%!x#xb~xp#NpLxJ8c4oPB^=CPkLBga at f6_{W<+sH~p
zex88a%|a&L>t&{l2}O3UqlSnU1w^+%UCt%sc0Kp<y`%!6g`e^$$8D7bbM~Xlm7++y
zkbC9iY*BqKK_ at 8c$F at yCrC4ug|6l;QD)A<g87JDspu~REATfeOx5BT at N3BM>Z$)wb
z#Tl(^r|8$m1pM0Dn(YHCXJ5M;SpK#76R(=vvf`Z^oW4q^ens#<;nVo3#x9}ngrGNy
z0)oUhdy}UJ-xP#huixbQN$%2 at rnoOB+BE%CPLT9e3*?nLjjvqfKls7?BKuu}enQds
z$Sc?vQ*b%qqP}2*g1NMvBbT5MFY-M>#hoeS1uFt~Bd54bq}xK#wtaB*boT_wHX0jb
z|7}(9F@(8IP&tl!vWdn76Z7p(i{85|c^qHn^t<K^;GeSO8!UO6#tn;HyoAp|#6-a&
zPGu}AAoeY$cCmW#xeob_oGR8Dz=>{MmS{`~b~axie=5d0^$Cs<Obax?#|)wiE%_=-
zeyPY4SSFBvxS-9+l_G!TJ<Iwc=-4M+a0PmMwosqw<Aa<<D|d}v!lfHWGpSf(G!{-M
z>Bd-cq#=^Y#k6tE*WhwscK|2p<wEw2kN<jf3=D?ep1$Gjwohyi*dDMwV0*y!fb9X>
z1HT0xc*wH<cZmHz#l7vKjqM^J#yAxB|MTEp&8l!umBpAkg>ljxDQKZlWQq`V8OdD2
z*jAyBAjSPy7hW#G?h^4i!Fr*PAo61R{R{c1zK76AA9|;d8s$F$7l!@aeZx%s^7+|^
zKKoSb%YENJwc~+v$v^!3^E>z6zxo4Kx8|Ndzdl{&Dt)T#gPR98Jba_J?22Q}zKal(
zug(XQ1N-*gU;4r7D;nRLjo${|U4nPs4d?oYZycDB*f+8c&MPe{{g2g`Sj}|Vl at io9
z1Fo8W<ia&6 at ZOcvzm(Y9yE>vJpi|!tG3VqUlOB+y<qI9m1-90~H99*x`$>STqe||W
za&#;xXMga$1rE6bHYezxd*Ip)JbW((JYD-8Q}d8(=h+T3UljP#z{mG|9aS!!?>^4w
zLVewxonF_SU3`z>@-(}f+;T%pE;hC|qk8TV1m?$0cP^nu#+bAf(0Mf_xv|!kL{rui
zN;PHWkb>AqQ?@A-#ajevlZl9$(~yx^IuZkJAf{4<q$ex$eWW&2v>hCsO-zFNxzam8
zEMXF7=40b`kPCN%b4iwjpg>w!O0$7`07=JiFCcAU)d(GrXIQCJJ_2ajNG8LivW2_F
zu%vCSbnKhRh_j(=DMugQ?m*eH`tM-D;{%{<J}Gk|QjP`lk(W82g<C~f$uUV<NOtm`
z1-f*MtCdJCDB|*H6_Z++v)sE%YOCC|s-maXQ3rLEFlUuUs?;dXYF4?byr&jAWRbMC
zs<zU(a{0<d(&Dlj*tM3prF)lwKqaWCT(=C#?R5_<lYqOlo>f+Eu5?28m$@aVXAYk7
zCDJ<1Jimlt4Hdu2IEj1VC*dk#<qXdaBuV;Z)j|X~$>9QIrG$OtkXAaXO)E`_#O6E5
zA+;qHPHBDxlS(Q9mIIUkE?|<=$#Ym*1Jn{zDR4t6%3vwVm`ke|>VxWG=DRvQ8^kzv
zHKdeq!k5gpwnPC>s7iyHjYWJ-vS*X0$<vJGxyY!GkL{E)5{+ns81C8#b~VIVIFm{7
zTP(*yYF^3ZS!5J?IHe at g?g*Q6&ki2=u;c_^xx~OT^EqL6PfjYPJK32z`T5K+vvS;N
zS+R-1$#=?>GoX{tD<e;s6Z(0s<kU}Hic6ggI$@6FEILuu7;wbQWAD#e*|A24$qzJp
zv~!$a^-rJRw at zeS!D>){9oA$dTqA4nDPcK#c?9T-p<e3>f at g|z@$b6@{jponzjO=w
zH*P_v at r8>?{lx9AzPQ?jLh)oKtRzF(Od_3+<?4YF?D7x!Lmh$cp1x2B@*TloDA3o%
z at vy3j@g52lv&EuHUSXkF8l34?_onhn7+^l9!BN7}nS9J0PZ!+bLLwP$NJN=CADhTC
zcWg8?l2cMK=8j}isaP6F{9)r(^7&jMT*${%=7wXiLOi78lyuz4CekAry(k=p=N9FX
zi8ScbgunnokqoWKftPPDEeCPFvI#Xbe<{AHx2U(yOgEI{NGuh6G|#)l at U%V$O^YX&
zXc6*6r}f~Bke?EI30P<DW+5*VgMbvbt+mi;))4H5a*QD at Y<fJ2PfT+nIil?V#7e`m
zGonFOyR5vUw~)Ug<ljSOreu}Jd2FR2`;ReTg!C;9=yxmc0VuK3ka<dU^jCCA4YBfm
z5y(ihw)2xE8vh;*=y#GQ_-9Zum;B>Go`*-ev|%gBBc!ooVq+(Se7h*b^YI$EX#7AR
z!V_*QgsTKa16OcTKsv4g{Z91~0Y3+rOMXUF^y~ajdTeNW;Qylstowf_ef}@zPrGo+
zl=uJ)=O69=Yv2R`^J1zC&SEeiLN|hZ5daok7I29>DkiTL%3`7uq;&&j at EQ<uR)~9A
zOa#R;$_8NnkN6ouu)=ySrR|FmB{{5y)+k((=sAl#n5gY&AIV_bP!1tB17)O|WsBM+
zCR4ll^7j4ZCxS=h(G`F4*zD8aO|4q?RA>60CFh=8cOo1Eky|E=hc8iOf(!Reiy<Da
zLSrGlqydJ{XQcm7(C-uUhXF2{BThzpk)IZ7^7|4&uMmWJqJMS?`aPnbDN at Hc8TH5(
zIs}7bQ8g3F<wI&Bo{QxRxirxt$xLKVC?3n_6A;7+Mv={oM3ucn(;0IR!Wn##Y=Lqk
z$$~l>N<@^%XpBLyR+wnOYTfYf(LT!ywYWX&!AMBBFEIWzngl(Ee_ua+c_E(vtbhxj
z^_Z~f4!9Q{x>$i_n9!e?uv?IZ{g3BGFJHZP`B(os`t{x)%FleRLw!GT_RBYMJW%)b
zqHU1Bzd{>Hu$ShE>LNau at b}Md&ce2yG5Wp at jlV1oEJ!pypAh`iA4jxe>{*`Z`70i?
zf~t4Bo)^Q0pC=*l`m9!eotS?&L|#<Su891c4`p5JZw`@`JKO3(9h%b)H=Orba7q;5
z0|3#tm at xLh1m|QyIw(UL`r$elPvhLgM{Hac`R0K>@+b1);m&pFAfiFmPPPaBPkCUv
z{6x9RE%q;3{qL;&`R>Tu$16&@ABnduJ<g^NZ<xAvWdFJuSXQPFJ^lHA`N!J20Be2X
zSV!&8m$J=={1>a4%kf6XH(yrQ)tqtOJLNcd`Vc#|+xgTX>EK_!Bsn*iJCNhxGo|eO
z9e3PlF8jIPQG4x3ZP4jBc{uJk^`j at -rVm~H>Mv$azV at 0Fxp|dsXpQ~7)LmOzy6dlI
zO4gmfeD$VdsWk2V%9;}|O2;m&j!FT)bYS0fc}*Ew4f(a0KY6aq at tsrC<7K7$-|_!(
z>Yr!s;P&o+^mJ|6TDG{Xbp|ZHx|GeojMmgdj{aLs{OAS5k9M3tbnX{FIE5PCKdt#d
zYwb(v9cQVXJI-tEeDwuv=fS at _<Z$wK9(?AI<ivKKEamNV@^+R&J1_bV)LlC={dzgH
zbE%Wsc@^4u?!($SU0b$q^WVI7(XmF3u>(u at Pp`Nj1s;8Ob(C89{Hf{kqZQb8Y3;kG
zW?=cAKD;jKJYH7y#My(#yQ|(f`>JRK^yGWT9j2aq6npZK^R?imB`=&>>I2ELqhEM&
z4Q$npK`mMxsPW*%!>J2UkE_VXQsCNYsI7b-ul>M2#N`^a1aXSr{1{+}BmMzE>40C>
z5BOy~;Fs}$U)B!z$K>pW(Bzns%4kSZRbz2PC-S2)C5j&cuyU!QQu~NudqGL(6S0O(
zvh30x?Caeg+1=ubClld_D;|lshBBEXoTVnxu1`0)H at an4M?;g`)a;Qx8{wk};C0J*
zz@#52;aSqCqK?Ah&fYYfJ82LPd$43ImQxd%bWtV*XHIww#W|H!B4Qjqg+`+wXdFdp
zM^pS{YmU<>I;a9q-Cn8&af}7%IZW{a!Hq(_cx>y>JBlwbF1QNMZjz_?f?)eC<OP{w
ze26+op5hOJuM0-34|(W$i_cX|c+P;fkvzpS1Sx(&UQ8mq(K2vf3m1GurQ5H^AELpF
z1t+zi>LJ(!<rvFQp5hyV<UgzZLM`(Hg0U3I-)dh%{N#7acLRd48`($mi6HHRNRIqR
z at e0m0^a<5}Mlcerhca^_Jw)3Hh*_TY7X+ikC?M5O<WV7yZQzL*1l&S~iDGO0X`o~M
z)c&m^s3J(}gt$I_h>r0x$Y!aWAniLpO9TP2E^|5r8Kl9=P?Vk%c5Ex6YP?7yJ!ad@
ztp6qCf8F>s%lvQRmv_HaiMC(9duHkx=p&dzJiUJYxu@|vtABfK=Lp*Kt?FgZzVNeZ
z_ST!)4h8bQ#9vTvA;(8cq;Kf(JNzrJq;K+{w&V2qjp-+Q$tvonTebJOXP at QmCH{{K
zUljgX^@X~zPrXUs^8L8lY&qKlwg+qv*dDMwV0*y!fb9X>1GWcj57-{CJz#sl_JHjH
z+XJ=-Y!BETusvXV!1jRc0owz%2W$`69<V)Nd%*U<Z at mY?dJE5M?@goMKkD>iWW*)-
zzCFk9o`E%#74I~>a)<V=Li*mwTjD)!r0ypo|DOUb`H5ElT>@?vaEpM$0>%aWoPb{x
z at M!_x5ODrQO<$dWT>=gZm=thaz&{f3djkGgz?%YAU()p5Dc}O}p1BnQ$^!nLfC&K)
z3iw?CUlH(vfaH%=gxK!~<et!eSFXKN5()p)?+4V}U;pmHLe+z(_y4qcv}tX!H!0p$
z$%cc0L7(;lKo$&c4R!YR1p0=29=R31JG;s4X at YB$tEG9<dfC;~#CkhJLp|F9zF0am
z9CQy4ZE4uZws&=hf`MSLr at t>Wv|}LP%jfs9;MU$x_xe0+TmMj3D7dx%Gkw0Sl44u?
zLD>8T1J>W$HSn3PVj3DUG_=D9ZzddT%;wcb87tn_-xnD25AG<cysKk4sMn6TzpHBy
zjPVuHi3x93$&dOPbA at zcL5<}aJ+dq}h6^ei&F8afD4WYn?DZk;ZEWNjcP<@ut4c~O
zq~q>f!Mjo32vzrY_xZtW;U(n%sG=dCyD_EgiShR;!uN`ceAU_OM?1kVHWV1#=9_?@
z$ft at pdb)hgo=t4PKeW{cEyy*(&!CiKV>pra at +?R6oK_fzpSi1AF-OsJ<P&SJ4G#BV
zZ-%;h1}$D<z5c%LB1dD-2YLeoTcH<<3xc7}{@(t<pf9KTWN$R#lRa(CE#73BBdy-l
zs85!?*@Uk}ZfkD#su at mS?~M`?j%r11vd0 at S;h7w#dyt+2wX#<&_?kDgwRpU0+}A9(
zwKRJp3exlAJlo{W0MgRd(&Sb1oU_Fno8Z+odGB_^t28+7K|DUG<M2uj6TVx=^NPWf
z9EFOYT_~HJY%$@`I-Q;}nDR+OI6q;+C$(mCBQ_ZH$wXFHWKg39YBD&PGsvcDk|x!r
z8YjUQWMbZ&2~RfZ1z|&Dz8E)n@&*sg1zj|kP3ib<lZ(eqc+7;WCOl`t6;o4`NKDr`
znK3*T$tH}9$$KV;L=?lc at q}TTI&R=m6CP8edR59;VuWYbLpSfv#!Yz4$fV3AkTDg-
zP4eNC)}yE^8`di4c-({w-yuC8*G3QG6DIx%GmlAsJ~3h#n at t<`sbfXB)@!IWWn#)k
zw28s#nK8YkDO0Oc=BA~ZOiX(Wd^~2d6*5MnGp2^7vf7;C)wLMXKsPdD8LjJ(>3(g{
zBAPB3EaNEyS5%|@Im4&9)R>`WB&p49)C0Y%H*+Lu#tohEq|OpG(20mq)5N$oUQpv+
zlVuT8Yhx*cKNB~!XX1v_6$LDV6|og9E9mG*(nL?S;PR&Nq!LiCf#Z583ig<ovdsoP
zYgCYl!;ldCIfH#%0ow#QgTs&TYysACkx{c?w7 at 6SEVN9^Jc!69*?adILfm0xkB(=O
z++JjGXL1Q%KhI?0jYc|GE(YtZrpB#~!`Kmc9w(2$quD+2hG+tpF*C(nK_N0y%z=b-
zY+RSXyjcJiEpstsi)@6vs*J%J#4ChoCeYjK!v}9;7=I1~4?`Xjm>;MZp#=QF;laQ*
zjG!z<JzYTT+0xVLAA&fksMH$%=r3Z{0<!+TzCb4znlmUf6I+`_jMg{2Eil;ASyT<!
fH{c(DXwPg}psQ!7f6zCUfS)#r_daX!B4hszsd{9)

literal 0
HcmV?d00001

diff --git a/lldb/test/API/functionalities/postmortem/elf-core/linux-riscv64.out b/lldb/test/API/functionalities/postmortem/elf-core/linux-riscv64.out
new file mode 100755
index 0000000000000000000000000000000000000000..ae28aa9ba9aad9700b193281fa8045587c344187
GIT binary patch
literal 3328
zcmbtW-ESL35TCuv*-o4|P6KM93dK#+4-mQ7Zs-?nN!_GrB@{seQp-oLXZswx_<Zj9
zQZ-RgOKGJ%Af%`g6;OC+K?t6B0P%z<PayaskU$kkAT@}*pi;uj-fnWa#DLV5ZfEv4
zznR^e-PyZ~V^1GZ7z5c9_ycJ4mcT}YVWibpG!!GS2U at W2gaoJn^%lfzMG!+`GBlPm
zk)&8FEocEaD&k2ANuNn`(UTJNlvt;f10tZ5#HIG^9j_Si)&JFt>G)g^p$EPvj88ld
zjrV?9y7=O)UEfc9_r=Kz-&9|I^~+N;XZshSXUqN%{<;=TMQ%kG|9*Y<mHXY%1!c>n
zpD~;L-k5p$(#+Y&V*i5A+p^~~<enDXmiy`xSMFcF&fsQU;at`g`K|vKNM4IBXcX@{
zrs~?&JAbmVy9;04WANkYTv5ZAAkzZs>~UZh7~9mLKnmB|gHL&BX=xiu$R*ObIVIN~
zgO|Q-SJJrz0Oe;tK4*~gxZsSwrp&bv>(tk|Ag_q_8uE7dywo!91<p%Ryz#?__oa4>
zTKS4uOJ#QISv@^C>{{n$oJQtR0l=Z-7{RSH3g>_wMYScVx#xBbSF-htVQ1 at U!z8Vg
zt!IrQbp^s^D}{#ZD<!K|u#k<QZBJJ-^)%4h{i712)xoGZ53_u<w)+(!4Hzf$v+)RV
zqWG-msTpWs9T8a#JOc#XI6?gp=p?DkI}l;95~|UX;{c0xoDs|5spSqI5|OGQx{<5%
zClvCH4t!3A`DZX#s|==+5+g$^aY6kAySBXP0%IL=oqT5zXE%6QCc|PN?oX=%HVkTP
z-)8n?eDCJAW8F#*&ZU8x at S(VmsGShs96Q#H8`8zLCc5Kl-=@AUwjr9_h{@8~Q@!XA
z#}M)Dy#$Z+T<B%UjtoFNelV`$_D6Mw^Q^;(J<PUqa;pY3L)%*7Y%jjWJNRf2gU9HN
z7`vC~AVEcr4=R0(_DErUN at w7v(HOKUG9leso61_-fN61*F_a8tJ1|w{BeEtD)dE&z
zqm_KfN<Kkr0w^9%kCmS~oY^hTaca;u^OXbD`mW(3>Xn8$*r;2D1KD(DZzh}BNp`nT
zKEThmZI+4!{}5yEpWxKs6yzPp=AGq&(eO;ygF+d1*fuLQy#PaH$F_!wyq<=vYH6_G
zxE5yM-<pcKN{NFP<f&L8GD)j(6>hJ~m$zn+O?RNS8W1BDB294Gv$ajdeO|ArAU-l7
zqYAhQ>ogVOYfw5dE%5tN*g!KXfjr3SY3IbX`I!*>a3RwTmZbPSG}B6>J2FXMiR5bh
zD&iY(-tZ0LHQ`@sg1^xOf42#Kvk5NG7hNU;=O6U;rQ6Ohrm9ZftQvKvQu8c#0FlYj
zL(d&Da%1DiCJY0|xyeamY+{t_`9?#Wcf(jsvx=r?f??G#nR;W!_RKs=&-G<lYBk5R
z^r_mko}aE%i-VOS=$>`n1KlbcCD*hq&<l=jTQ!9E$3{0j&#mOAJ*xpamell=VY+5*
zYGqidm7HZ$K9AomIjUA_7|(aY1xS@(d<z$|{9tVpy7QY&gpu_t|8E9D;lq`wqn%Ei
ztUy`kqv9Bbzk`9xlSdvF{t}n>!ENC`$5|^~xN;8)|MUulYx2KsYY3OsA>}yQ=^rvg
zTmGM<FJ`bwKZ%`0C5(~nws at iNy29LY6aNL_f0u#<TG*fJIE)ef2l`>e_OUOP`!M%1
zTEZBS=fp<8zwGHNVeXp<6Bd5YZQ`narHQ|c^L7*edEw80j{-5IUr@@k6QIGT!hb{<
oJJ6WKN1h-25#fz)e32 at F_+mkPIzC#3uFX|f6aVXCqW{YOKOsPGG5`Po

literal 0
HcmV?d00001




More information about the lldb-commits mailing list