llvmorg-github-actions[bot] wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-lldb

Author: Greg Clayton (clayborg)

<details>
<summary>Changes</summary>

ProcessElfCore was reading the NT_FILE list and using that to help 
FindModuleUUID to provide UUID information when loading core files. The NT_FILE 
list contains resolved paths only, while the DynamicLoaderPOSIXDYLD plug-in was 
using paths found in the r_debug structure which contains a linked list of all 
of the shared libraries in a process. The issue was these paths could be 
symlinks which would cause ProcessELFCore::FindModuleUUID(...) to fail because 
the paths wouldn't match up. This led to the ProcessELFCore often not being 
able to provide UUIDs for shared libraries and cause the incorrect binaries to 
be loaded from the current machine even when the shared library UUIDs don't 
match.

The solution was to add the ability for a ModuleSpec to contain a load address 
for the shared library. This allows ProcessELFCore to uniquely identify a 
library regardless of the name used in NT_FILE. We can now correctly supply the 
UUID from the .gnu-build-id to any binaries which use symlinks when linking, 
but have differing resolved paths to the libraries.

The process virtual function for finding a UUID was changed from:

        virtual lldb_private::UUID FindModuleUUID(const llvm::StringRef path);

to:

        virtual bool FindModuleUUID(ModuleSpec &amp;spec);

to allow Process::FindModuleUUID to rely on other data in the ModuleSpec since 
the path isn't enough.

We will be able to use the ModuleSpec's load address for creating a module from 
a ModuleSpec, but that isn't in this PR.

---

Patch is 153.50 KiB, truncated to 20.00 KiB below, full version: 
https://github.com/llvm/llvm-project/pull/205235.diff


10 Files Affected:

- (modified) lldb/include/lldb/Core/ModuleSpec.h (+31) 
- (modified) lldb/include/lldb/Target/DynamicLoader.h (+2-2) 
- (modified) lldb/include/lldb/Target/Process.h (+12-1) 
- (modified) lldb/source/Core/DynamicLoader.cpp (+9-8) 
- (modified) 
lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp (+2-2) 
- (modified) lldb/source/Plugins/Process/elf-core/ProcessElfCore.cpp (+36-10) 
- (modified) lldb/source/Plugins/Process/elf-core/ProcessElfCore.h (+1-1) 
- (modified) lldb/source/Target/Process.cpp (+2-2) 
- (modified) lldb/test/API/functionalities/postmortem/elf-core/TestLinuxCore.py 
(+204-157) 
- (added) 
lldb/test/API/functionalities/postmortem/elf-core/elf-dyld-nt-file-mismatch.yaml
 (+135) 


``````````diff
diff --git a/lldb/include/lldb/Core/ModuleSpec.h 
b/lldb/include/lldb/Core/ModuleSpec.h
index 0306dfc280e57..62ffa025fbf00 100644
--- a/lldb/include/lldb/Core/ModuleSpec.h
+++ b/lldb/include/lldb/Core/ModuleSpec.h
@@ -118,6 +118,15 @@ class ModuleSpec {
 
   void SetObjectSize(uint64_t object_size) { m_object_size = object_size; }
 
+  /// Get the load address of a module in process memory. If the optional
+  /// has no value, there is no load address for this module spec.
+  std::optional<lldb::addr_t> GetLoadAddress() const { return m_load_addr; }
+
+  /// Set the load address of a module in process memory.
+  void SetLoadAddress(lldb::addr_t addr) { m_load_addr = addr; }
+
+  void ClearLoadAddress() { m_load_addr.reset(); }
+
   llvm::sys::TimePoint<> &GetObjectModificationTime() {
     return m_object_mod_time;
   }
@@ -159,9 +168,11 @@ class ModuleSpec {
     m_object_offset = 0;
     m_object_size = 0;
     m_source_mappings.Clear(false);
+    m_extractor_sp.reset();
     m_object_mod_time = llvm::sys::TimePoint<>();
     m_target_wp.reset();
     m_platform_wp.reset();
+    m_load_addr.reset();
   }
 
   explicit operator bool() const {
@@ -181,6 +192,8 @@ class ModuleSpec {
       return true;
     if (m_object_mod_time != llvm::sys::TimePoint<>())
       return true;
+    if (m_load_addr.has_value())
+      return true;
     return false;
   }
 
@@ -245,6 +258,13 @@ class ModuleSpec {
         strm.PutCString(", ");
       strm.Format("object_mod_time = {0:x+}",
                   uint64_t(llvm::sys::toTimeT(m_object_mod_time)));
+      dumped_something = true;
+    }
+    if (m_load_addr.has_value()) {
+      if (dumped_something)
+        strm.PutCString(", ");
+      strm.Printf("load_addr = 0x%" PRIx64, m_load_addr.value());
+      dumped_something = true;
     }
   }
 
@@ -280,6 +300,11 @@ class ModuleSpec {
           return false;
       }
     }
+    // Only match on load address if they both have a valid value.
+    if (m_load_addr.has_value() && 
+        match_module_spec.m_load_addr.has_value() &&
+        match_module_spec.GetLoadAddress() != GetLoadAddress())
+      return false;
     return true;
   }
 
@@ -303,6 +328,12 @@ class ModuleSpec {
   llvm::sys::TimePoint<> m_object_mod_time;
   mutable PathMappingList m_source_mappings;
   lldb::DataExtractorSP m_extractor_sp = {};
+  /// The load address of the module in a process. This allows for modules
+  /// to be uniquely identified and created by reading an object file from
+  /// memory when we can't locate the correct file on disk. Useful for post
+  /// mortem debugging when we might not be able to locate symbols for the
+  /// core file, but we can read the object file from memory.
+  std::optional<lldb::addr_t> m_load_addr = std::nullopt;
 };
 
 class ModuleSpecList {
diff --git a/lldb/include/lldb/Target/DynamicLoader.h 
b/lldb/include/lldb/Target/DynamicLoader.h
index 784da7567fc4a..e85036c2887d1 100644
--- a/lldb/include/lldb/Target/DynamicLoader.h
+++ b/lldb/include/lldb/Target/DynamicLoader.h
@@ -359,8 +359,8 @@ class DynamicLoader : public PluginInterface {
 protected:
   // Utility methods for derived classes
 
-  /// Find a module in the target that matches the given file.
-  lldb::ModuleSP FindModuleViaTarget(const FileSpec &file);
+  /// Find a module in the target that matches the given module spec.
+  lldb::ModuleSP FindModuleViaTarget(const ModuleSpec &module_spec);
 
   /// Checks to see if the target module has changed, updates the target
   /// accordingly and returns the target executable module.
diff --git a/lldb/include/lldb/Target/Process.h 
b/lldb/include/lldb/Target/Process.h
index 8432c326d3281..e105dbeb2ff90 100644
--- a/lldb/include/lldb/Target/Process.h
+++ b/lldb/include/lldb/Target/Process.h
@@ -1421,7 +1421,18 @@ class Process : public 
std::enable_shared_from_this<Process>,
 
   virtual bool GetProcessInfo(ProcessInstanceInfo &info);
 
-  virtual lldb_private::UUID FindModuleUUID(const llvm::StringRef path);
+  /// Given a module spec, try to find the UUID information.
+  ///
+  /// \param [in,out] spec
+  ///     A module specification with as much detail as possible about the
+  ///     module for which we are trying to find a UUID. The 
+  ///     ModuleSpec.m_file should be filled in. If a dynamic loader is
+  ///     calling this, the load address of the module can be filled in as
+  ///     well. Sometimes the file path for a library can be a symlink and
+  ///     the load address can help resolve the module.
+  ///
+  /// \return True if the UUID was added, false otherwise.
+  virtual bool FindModuleUUID(ModuleSpec &spec);
 
   /// Get the exit status for a process.
   ///
diff --git a/lldb/source/Core/DynamicLoader.cpp 
b/lldb/source/Core/DynamicLoader.cpp
index 0259e7e63a161..dd771a7a3a8ae 100644
--- a/lldb/source/Core/DynamicLoader.cpp
+++ b/lldb/source/Core/DynamicLoader.cpp
@@ -151,14 +151,12 @@ DynamicLoader::GetSectionListFromModule(const ModuleSP 
module) const {
   return sections;
 }
 
-ModuleSP DynamicLoader::FindModuleViaTarget(const FileSpec &file) {
+ModuleSP DynamicLoader::FindModuleViaTarget(const ModuleSpec &spec) {
+  ModuleSpec module_spec(spec);
   Target &target = m_process->GetTarget();
-  ModuleSpec module_spec(file, target.GetArchitecture());
-  if (UUID uuid = m_process->FindModuleUUID(file.GetPath())) {
-    // Process may be able to augment the module_spec with UUID, e.g. ELF core.
-    module_spec.GetUUID() = uuid;
-  }
-
+  // The process may be able to augment the module_spec with a UUID.
+  if (!module_spec.GetUUID().IsValid())
+    m_process->FindModuleUUID(module_spec);
   if (ModuleSP module_sp = target.GetImages().FindFirstModule(module_spec))
     return module_sp;
 
@@ -173,7 +171,10 @@ ModuleSP DynamicLoader::LoadModuleAtAddress(const FileSpec 
&file,
                                             addr_t link_map_addr,
                                             addr_t base_addr,
                                             bool base_addr_is_offset) {
-  ModuleSP module_sp = FindModuleViaTarget(file);
+  Target &target = m_process->GetTarget();
+  ModuleSpec module_spec(file, target.GetArchitecture());
+  module_spec.SetLoadAddress(base_addr);
+  ModuleSP module_sp = FindModuleViaTarget(module_spec);
   // We have a core file, try to load the image from memory if we didn't find
   // the module.
   if (!module_sp && !m_process->IsLiveDebugSession()) {
diff --git 
a/lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp 
b/lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp
index 29723089ce7b1..6db4d99ccbdba 100644
--- a/lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp
+++ b/lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp
@@ -722,8 +722,8 @@ void DynamicLoaderPOSIXDYLD::LoadAllCurrentModules() {
       // Create placeholder modules for any modules we couldn't load from disk
       // or from memory.
       ModuleSpec module_spec(so_entry.file_spec, target.GetArchitecture());
-      if (UUID uuid = m_process->FindModuleUUID(so_entry.file_spec.GetPath()))
-        module_spec.GetUUID() = uuid;
+      module_spec.SetLoadAddress(so_entry.base_addr);
+      m_process->FindModuleUUID(module_spec);
       module_sp = Module::CreateModuleFromObjectFile<ObjectFilePlaceholder>(
           module_spec, so_entry.base_addr, 512);
       bool load_addr_changed = false;
diff --git a/lldb/source/Plugins/Process/elf-core/ProcessElfCore.cpp 
b/lldb/source/Plugins/Process/elf-core/ProcessElfCore.cpp
index 8a1c03ebf1dbe..6cee49987f470 100644
--- a/lldb/source/Plugins/Process/elf-core/ProcessElfCore.cpp
+++ b/lldb/source/Plugins/Process/elf-core/ProcessElfCore.cpp
@@ -337,7 +337,7 @@ bool ProcessElfCore::GetMainExecutableModuleSpec(ModuleSpec 
&exe_spec) {
       GetNTFileEntryForExecutableELFHeader();
   if (exe_header) {
     exe_spec.GetFileSpec() = CreateFileSpecFromPath(exe_header->path);
-    exe_spec.GetUUID() = FindModuleUUID(exe_header->path);
+    exe_spec.SetLoadAddress(exe_header->start);
   }
 
   // If we failed to find the executable program in the NT_FILE list with the
@@ -364,7 +364,6 @@ bool ProcessElfCore::GetMainExecutableModuleSpec(ModuleSpec 
&exe_spec) {
       } else {
         // We don't have an executable file spec yet, lets set it.
         exe_spec.GetFileSpec() = execfn_spec;
-        exe_spec.GetUUID() = FindModuleUUID(execfn_str);
       }
     }
   }
@@ -377,18 +376,45 @@ bool 
ProcessElfCore::GetMainExecutableModuleSpec(ModuleSpec &exe_spec) {
   if (!exe_spec.GetFileSpec() && !m_executable_name.empty())
     exe_spec.GetFileSpec() = CreateFileSpecFromPath(m_executable_name);
 
+  // Try and find the UUID after the module spec was filled in.
+  FindModuleUUID(exe_spec);
+
   // We succeeded if we got a path.
   return (bool)exe_spec.GetFileSpec();
 }
 
-UUID ProcessElfCore::FindModuleUUID(const llvm::StringRef path) {
-  // Lookup the UUID for the given path in the map.
-  // Note that this could be called by multiple threads so make sure
-  // we access the map in a thread safe way (i.e. don't use operator[]).
-  auto it = m_uuids.find(std::string(path));
-  if (it != m_uuids.end())
-    return it->second;
-  return UUID();
+bool ProcessElfCore::FindModuleUUID(ModuleSpec &spec) {
+  if (!spec.GetUUID().IsValid()) {
+    // Lookup the UUID for the given path in the map.
+    // Note that this could be called by multiple threads so make sure
+    // we access the map in a thread safe way (i.e. don't use operator[]).
+    std::string path;
+    // Sometimes the path to a file or shared library from the dynamic loader,
+    // one of the main clients of this function, is a symlink. The information
+    // in the NT_FILE note contains resolved paths and might not match. The
+    // best way for us to find a module is by load address, so use this trick
+    // if the load address is set in the module specification.
+    if (std::optional<lldb::addr_t> load_addr = spec.GetLoadAddress()) {
+      if (std::optional<NT_FILE_Entry> nt = 
+              GetNTFileEntryContainingAddress(*load_addr))
+        path = nt->path;
+    }
+    // If we didn't find a file spec from the load address, fall back to using
+    // the file spec.
+    if (path.empty())
+      path = spec.GetFileSpec().GetPath();
+
+    auto it = m_uuids.find(path);
+    if (it != m_uuids.end()) {
+      Log *log = GetLog(LLDBLog::Process);
+      spec.GetUUID() = it->second;
+      LLDB_LOGF(log, 
+                "ProcessElfCore::FindModuleUUID() found UUID for %s: %s",
+                spec.GetFileSpec().GetPath().c_str(), 
+                it->second.GetAsString().c_str());
+    }
+  }
+  return spec.GetUUID().IsValid();
 }
 
 lldb_private::DynamicLoader *ProcessElfCore::GetDynamicLoader() {
diff --git a/lldb/source/Plugins/Process/elf-core/ProcessElfCore.h 
b/lldb/source/Plugins/Process/elf-core/ProcessElfCore.h
index e6f1fa0027554..846d8cb91cadf 100644
--- a/lldb/source/Plugins/Process/elf-core/ProcessElfCore.h
+++ b/lldb/source/Plugins/Process/elf-core/ProcessElfCore.h
@@ -170,7 +170,7 @@ class ProcessElfCore : public 
lldb_private::PostMortemProcess {
   // Populate gnu uuid for each NT_FILE entry
   void UpdateBuildIdForNTFileEntries();
 
-  lldb_private::UUID FindModuleUUID(const llvm::StringRef path) override;
+  bool FindModuleUUID(lldb_private::ModuleSpec &spec) override;
 
   // Extract the executable module spec for the executable in this core file.
   bool GetMainExecutableModuleSpec(lldb_private::ModuleSpec &exe_spec);
diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp
index 6e20703f65a45..ff7734a47fdca 100644
--- a/lldb/source/Target/Process.cpp
+++ b/lldb/source/Target/Process.cpp
@@ -6381,8 +6381,8 @@ bool Process::GetProcessInfo(ProcessInstanceInfo &info) {
   return platform_sp->GetProcessInfo(GetID(), info);
 }
 
-lldb_private::UUID Process::FindModuleUUID(const llvm::StringRef path) {
-  return lldb_private::UUID();
+bool Process::FindModuleUUID(ModuleSpec &spec) {
+  return spec.GetUUID().IsValid();
 }
 
 ThreadCollectionSP Process::GetHistoryThreads(lldb::addr_t addr) {
diff --git a/lldb/test/API/functionalities/postmortem/elf-core/TestLinuxCore.py 
b/lldb/test/API/functionalities/postmortem/elf-core/TestLinuxCore.py
index 0a5dc6e6a41a2..fddee84120bee 100644
--- a/lldb/test/API/functionalities/postmortem/elf-core/TestLinuxCore.py
+++ b/lldb/test/API/functionalities/postmortem/elf-core/TestLinuxCore.py
@@ -2,9 +2,9 @@
 Test basics of linux core file debugging.
 """
 
+import os
 import shutil
 import struct
-import os
 
 import lldb
 from lldbsuite.test.decorators import *
@@ -281,30 +281,30 @@ def test_FPR_SSE(self):
         values["st5"] = "{0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 0xff 0x3f}"
         values["st6"] = "{0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}"
         values["st7"] = "{0x35 0xc2 0x68 0x21 0xa2 0xda 0x0f 0xc9 0x00 0x40}"
-        values[
-            "xmm0"
-        ] = "{0x29 0x31 0x64 0x46 0x29 0x31 0x64 0x46 0x29 0x31 0x64 0x46 0x29 
0x31 0x64 0x46}"
-        values[
-            "xmm1"
-        ] = "{0x9c 0xed 0x86 0x64 0x9c 0xed 0x86 0x64 0x9c 0xed 0x86 0x64 0x9c 
0xed 0x86 0x64}"
-        values[
-            "xmm2"
-        ] = "{0x07 0xc2 0x1f 0xd7 0x07 0xc2 0x1f 0xd7 0x07 0xc2 0x1f 0xd7 0x07 
0xc2 0x1f 0xd7}"
-        values[
-            "xmm3"
-        ] = "{0xa2 0x20 0x48 0x25 0xa2 0x20 0x48 0x25 0xa2 0x20 0x48 0x25 0xa2 
0x20 0x48 0x25}"
-        values[
-            "xmm4"
-        ] = "{0xeb 0x5a 0xa8 0xc4 0xeb 0x5a 0xa8 0xc4 0xeb 0x5a 0xa8 0xc4 0xeb 
0x5a 0xa8 0xc4}"
-        values[
-            "xmm5"
-        ] = "{0x49 0x41 0x20 0x0b 0x49 0x41 0x20 0x0b 0x49 0x41 0x20 0x0b 0x49 
0x41 0x20 0x0b}"
-        values[
-            "xmm6"
-        ] = "{0xf8 0xf1 0x8b 0x4f 0xf8 0xf1 0x8b 0x4f 0xf8 0xf1 0x8b 0x4f 0xf8 
0xf1 0x8b 0x4f}"
-        values[
-            "xmm7"
-        ] = "{0x13 0xf1 0x30 0xcd 0x13 0xf1 0x30 0xcd 0x13 0xf1 0x30 0xcd 0x13 
0xf1 0x30 0xcd}"
+        values["xmm0"] = (
+            "{0x29 0x31 0x64 0x46 0x29 0x31 0x64 0x46 0x29 0x31 0x64 0x46 0x29 
0x31 0x64 0x46}"
+        )
+        values["xmm1"] = (
+            "{0x9c 0xed 0x86 0x64 0x9c 0xed 0x86 0x64 0x9c 0xed 0x86 0x64 0x9c 
0xed 0x86 0x64}"
+        )
+        values["xmm2"] = (
+            "{0x07 0xc2 0x1f 0xd7 0x07 0xc2 0x1f 0xd7 0x07 0xc2 0x1f 0xd7 0x07 
0xc2 0x1f 0xd7}"
+        )
+        values["xmm3"] = (
+            "{0xa2 0x20 0x48 0x25 0xa2 0x20 0x48 0x25 0xa2 0x20 0x48 0x25 0xa2 
0x20 0x48 0x25}"
+        )
+        values["xmm4"] = (
+            "{0xeb 0x5a 0xa8 0xc4 0xeb 0x5a 0xa8 0xc4 0xeb 0x5a 0xa8 0xc4 0xeb 
0x5a 0xa8 0xc4}"
+        )
+        values["xmm5"] = (
+            "{0x49 0x41 0x20 0x0b 0x49 0x41 0x20 0x0b 0x49 0x41 0x20 0x0b 0x49 
0x41 0x20 0x0b}"
+        )
+        values["xmm6"] = (
+            "{0xf8 0xf1 0x8b 0x4f 0xf8 0xf1 0x8b 0x4f 0xf8 0xf1 0x8b 0x4f 0xf8 
0xf1 0x8b 0x4f}"
+        )
+        values["xmm7"] = (
+            "{0x13 0xf1 0x30 0xcd 0x13 0xf1 0x30 0xcd 0x13 0xf1 0x30 0xcd 0x13 
0xf1 0x30 0xcd}"
+        )
 
         for regname, value in values.items():
             self.expect(
@@ -438,42 +438,42 @@ def test_aarch64_regs(self):
         values["lr"] = "0x000000000040019c"
         values["sp"] = "0x0000ffffdab7c750"
         values["pc"] = "0x0000000000400168"
-        values[
-            "v0"
-        ] = "{0x00 0x00 0x00 0x00 0x00 0x00 0xe0 0x3f 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00}"
-        values[
-            "v1"
-        ] = "{0x00 0x00 0x00 0x00 0x00 0x00 0xf8 0x3f 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00}"
-        values[
-            "v2"
-        ] = "{0x00 0x00 0x00 0x00 0x00 0x00 0x04 0x40 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00}"
-        values[
-            "v3"
-        ] = "{0x00 0x00 0x00 0x00 0x00 0x00 0x0c 0x40 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00}"
-        values[
-            "v4"
-        ] = "{0x00 0x00 0x90 0x40 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00}"
-        values[
-            "v5"
-        ] = "{0x00 0x00 0xb0 0x40 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00}"
-        values[
-            "v6"
-        ] = "{0x00 0x00 0xd0 0x40 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00}"
-        values[
-            "v7"
-        ] = "{0x00 0x00 0xf0 0x40 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00}"
-        values[
-            "v8"
-        ] = "{0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 
0x11 0x11 0x11}"
-        values[
-            "v27"
-        ] = "{0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00}"
-        values[
-            "v28"
-        ] = "{0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00}"
-        values[
-            "v31"
-        ] = "{0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 
0x30 0x30 0x30}"
+        values["v0"] = (
+            "{0x00 0x00 0x00 0x00 0x00 0x00 0xe0 0x3f 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00}"
+        )
+        values["v1"] = (
+            "{0x00 0x00 0x00 0x00 0x00 0x00 0xf8 0x3f 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00}"
+        )
+        values["v2"] = (
+            "{0x00 0x00 0x00 0x00 0x00 0x00 0x04 0x40 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00}"
+        )
+        values["v3"] = (
+            "{0x00 0x00 0x00 0x00 0x00 0x00 0x0c 0x40 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00}"
+        )
+        values["v4"] = (
+            "{0x00 0x00 0x90 0x40 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00}"
+        )
+        values["v5"] = (
+            "{0x00 0x00 0xb0 0x40 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00}"
+        )
+        values["v6"] = (
+            "{0x00 0x00 0xd0 0x40 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00}"
+        )
+        values["v7"] = (
+            "{0x00 0x00 0xf0 0x40 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00}"
+        )
+        values["v8"] = (
+            "{0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 
0x11 0x11 0x11}"
+        )
+        values["v27"] = (
+            "{0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00}"
+        )
+        values["v28"] = (
+            "{0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00}"
+        )
+        values["v31"] = (
+            "{0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 
0x30 0x30 0x30}"
+        )
         values["s2"] = "0"
         values["s3"] = "0"
         values["s4"] = "4.5"
@@ -522,42 +522,42 @@ def test_aarch64_sve_regs_fpsimd(self):
         values["sp"] = "0x0000ffffcbad8d30"
         values["pc"] = "0x000000000040014c"
         values["cpsr"] = "0x00001000"
-        values[
-            "v0"
-        ] = "{0x00 0x00 0x00 0x00 0x00 0x00 0xe0 0x3f 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00}"
-        values[
-            "v1"
-        ] = "{0x00 0x00 0x00 0x00 0x00 0x00 0xf8 0x3f 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00}"
-        values[
-            "v2"
-        ] = "{0x00 0x00 0x00 0x00 0x00 0x00 0x04 0x40 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00}"
-        values[
-            "v3"
-        ] = "{0x00 0x00 0x00 0x00 0x00 0x00 0x0c 0x40 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00}"
-        values[
-            "v4"
-        ] = "{0x00 0x00 0x90 0x40 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00}"
-        values[
-            "v5"
-        ] = "{0x00 0x00 0xb0 0x40 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00}"
-        values[
-            "v6"
-        ] = "{0x00 0x00 0xd0 0x40 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00}"
-        values[
-            "v7"
-        ] = "{0x00 0x00 0xf0 0x40 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00}"
-        values[
-            "v8"
-        ] = "{0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 0x11 
0x11 0x11 0x11}"
-        values[
-            "v27"
-        ] = "{0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00}"
-        values[
-            "v28"
-        ] = "{0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 
0x00 0x00 0x00}"
-        values[
-            "v31"
-        ] = "{0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 
0x30 0x30 0x30}"
+        values["v0"] = (
+            "{0x00 0x00 0x00 0x0...
[truncated]

``````````

</details>


https://github.com/llvm/llvm-project/pull/205235
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to