[Lldb-commits] [PATCH] D132710: [lldb] Computer and apply the slide to the fileset entry's vmaddr

2022-08-25 Thread Jonas Devlieghere via Phabricator via lldb-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rGe360281fa710: [lldb] Computer the slide when and apply it to 
each filesets vm addr (authored by JDevlieghere).
Herald added a project: LLDB.

Changed prior to commit:
  https://reviews.llvm.org/D132710?vs=455749=455756#toc

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D132710/new/

https://reviews.llvm.org/D132710

Files:
  
lldb/source/Plugins/ObjectContainer/Mach-O-Fileset/ObjectContainerMachOFileset.cpp
  
lldb/source/Plugins/ObjectContainer/Mach-O-Fileset/ObjectContainerMachOFileset.h


Index: 
lldb/source/Plugins/ObjectContainer/Mach-O-Fileset/ObjectContainerMachOFileset.h
===
--- 
lldb/source/Plugins/ObjectContainer/Mach-O-Fileset/ObjectContainerMachOFileset.h
+++ 
lldb/source/Plugins/ObjectContainer/Mach-O-Fileset/ObjectContainerMachOFileset.h
@@ -73,7 +73,6 @@
 : vmaddr(vmaddr), fileoff(fileoff), id(id) {}
 uint64_t vmaddr;
 uint64_t fileoff;
-uint64_t slide;
 std::string id;
   };
 
Index: 
lldb/source/Plugins/ObjectContainer/Mach-O-Fileset/ObjectContainerMachOFileset.cpp
===
--- 
lldb/source/Plugins/ObjectContainer/Mach-O-Fileset/ObjectContainerMachOFileset.cpp
+++ 
lldb/source/Plugins/ObjectContainer/Mach-O-Fileset/ObjectContainerMachOFileset.cpp
@@ -133,21 +133,35 @@
 
 static bool
 ParseFileset(DataExtractor , mach_header header,
- std::vector ) {
+ std::vector ,
+ llvm::Optional load_addr = llvm::None) {
   lldb::offset_t offset = MachHeaderSizeFromMagic(header.magic);
+  lldb::offset_t slide = 0;
   for (uint32_t i = 0; i < header.ncmds; ++i) {
 const lldb::offset_t load_cmd_offset = offset;
 load_command lc = {};
 if (data.GetU32(, , 2) == nullptr)
   break;
 
+// If we know the load address we can compute the slide.
+if (load_addr) {
+  if (lc.cmd == llvm::MachO::LC_SEGMENT_64) {
+segment_command_64 segment;
+data.CopyData(load_cmd_offset, sizeof(segment_command_64), );
+if (llvm::StringRef(segment.segname) == "__TEXT")
+  slide = *load_addr - segment.vmaddr;
+  }
+}
+
 if (lc.cmd == LC_FILESET_ENTRY) {
   fileset_entry_command entry;
   data.CopyData(load_cmd_offset, sizeof(fileset_entry_command), );
   lldb::offset_t entry_id_offset = load_cmd_offset + entry.entry_id;
   const char *id = data.GetCStr(_id_offset);
-  entries.emplace_back(entry.vmaddr, entry.fileoff, std::string(id));
+  entries.emplace_back(entry.vmaddr + slide, entry.fileoff,
+   std::string(id));
 }
+
 offset = load_cmd_offset + lc.cmdsize;
   }
 
@@ -198,7 +212,7 @@
 m_data.SetData(data_sp);
   }
 
-  return ParseFileset(m_data, *header, m_entries);
+  return ParseFileset(m_data, *header, m_entries, m_memory_addr);
 }
 
 size_t ObjectContainerMachOFileset::GetModuleSpecifications(


Index: lldb/source/Plugins/ObjectContainer/Mach-O-Fileset/ObjectContainerMachOFileset.h
===
--- lldb/source/Plugins/ObjectContainer/Mach-O-Fileset/ObjectContainerMachOFileset.h
+++ lldb/source/Plugins/ObjectContainer/Mach-O-Fileset/ObjectContainerMachOFileset.h
@@ -73,7 +73,6 @@
 : vmaddr(vmaddr), fileoff(fileoff), id(id) {}
 uint64_t vmaddr;
 uint64_t fileoff;
-uint64_t slide;
 std::string id;
   };
 
Index: lldb/source/Plugins/ObjectContainer/Mach-O-Fileset/ObjectContainerMachOFileset.cpp
===
--- lldb/source/Plugins/ObjectContainer/Mach-O-Fileset/ObjectContainerMachOFileset.cpp
+++ lldb/source/Plugins/ObjectContainer/Mach-O-Fileset/ObjectContainerMachOFileset.cpp
@@ -133,21 +133,35 @@
 
 static bool
 ParseFileset(DataExtractor , mach_header header,
- std::vector ) {
+ std::vector ,
+ llvm::Optional load_addr = llvm::None) {
   lldb::offset_t offset = MachHeaderSizeFromMagic(header.magic);
+  lldb::offset_t slide = 0;
   for (uint32_t i = 0; i < header.ncmds; ++i) {
 const lldb::offset_t load_cmd_offset = offset;
 load_command lc = {};
 if (data.GetU32(, , 2) == nullptr)
   break;
 
+// If we know the load address we can compute the slide.
+if (load_addr) {
+  if (lc.cmd == llvm::MachO::LC_SEGMENT_64) {
+segment_command_64 segment;
+data.CopyData(load_cmd_offset, sizeof(segment_command_64), );
+if (llvm::StringRef(segment.segname) == "__TEXT")
+  slide = *load_addr - segment.vmaddr;
+  }
+}
+
 if (lc.cmd == LC_FILESET_ENTRY) {
   fileset_entry_command entry;
   data.CopyData(load_cmd_offset, sizeof(fileset_entry_command), );
   lldb::offset_t entry_id_offset = load_cmd_offset + entry.entry_id;
   const char *id = 

[Lldb-commits] [PATCH] D132710: [lldb] Computer and apply the slide to the fileset entry's vmaddr

2022-08-25 Thread Jason Molenda via Phabricator via lldb-commits
jasonmolenda accepted this revision.
jasonmolenda added a comment.
This revision is now accepted and ready to land.

LGTM.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D132710/new/

https://reviews.llvm.org/D132710

___
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


[Lldb-commits] [PATCH] D132710: [lldb] Computer and apply the slide to the fileset entry's vmaddr

2022-08-25 Thread Jonas Devlieghere via Phabricator via lldb-commits
JDevlieghere created this revision.
JDevlieghere added a reviewer: jasonmolenda.
Herald added a project: All.
JDevlieghere requested review of this revision.

Computer and apply the slide to the fileset entry's vmaddr when reading a 
fileset from memory.


https://reviews.llvm.org/D132710

Files:
  
lldb/source/Plugins/ObjectContainer/Mach-O-Fileset/ObjectContainerMachOFileset.cpp
  
lldb/source/Plugins/ObjectContainer/Mach-O-Fileset/ObjectContainerMachOFileset.h


Index: 
lldb/source/Plugins/ObjectContainer/Mach-O-Fileset/ObjectContainerMachOFileset.h
===
--- 
lldb/source/Plugins/ObjectContainer/Mach-O-Fileset/ObjectContainerMachOFileset.h
+++ 
lldb/source/Plugins/ObjectContainer/Mach-O-Fileset/ObjectContainerMachOFileset.h
@@ -73,7 +73,6 @@
 : vmaddr(vmaddr), fileoff(fileoff), id(id) {}
 uint64_t vmaddr;
 uint64_t fileoff;
-uint64_t slide;
 std::string id;
   };
 
Index: 
lldb/source/Plugins/ObjectContainer/Mach-O-Fileset/ObjectContainerMachOFileset.cpp
===
--- 
lldb/source/Plugins/ObjectContainer/Mach-O-Fileset/ObjectContainerMachOFileset.cpp
+++ 
lldb/source/Plugins/ObjectContainer/Mach-O-Fileset/ObjectContainerMachOFileset.cpp
@@ -133,21 +133,34 @@
 
 static bool
 ParseFileset(DataExtractor , mach_header header,
- std::vector ) {
+ std::vector ,
+ llvm::Optional load_addr = llvm::None) {
   lldb::offset_t offset = MachHeaderSizeFromMagic(header.magic);
+  lldb::offset_t slide = 0;
   for (uint32_t i = 0; i < header.ncmds; ++i) {
 const lldb::offset_t load_cmd_offset = offset;
 load_command lc = {};
 if (data.GetU32(, , 2) == nullptr)
   break;
 
+// If we know the load address we can compute the slide.
+if (load_addr) {
+  if (lc.cmd == llvm::MachO::LC_SEGMENT_64) {
+segment_command_64 segment;
+data.CopyData(load_cmd_offset, sizeof(segment_command_64), );
+if (llvm::StringRef(segment.segname) == "__TEXT")
+  slide = *load_addr - segment.vmaddr;
+  }
+}
+
 if (lc.cmd == LC_FILESET_ENTRY) {
   fileset_entry_command entry;
   data.CopyData(load_cmd_offset, sizeof(fileset_entry_command), );
   lldb::offset_t entry_id_offset = load_cmd_offset + entry.entry_id;
   const char *id = data.GetCStr(_id_offset);
-  entries.emplace_back(entry.vmaddr, entry.fileoff, std::string(id));
+  entries.emplace_back(entry.vmaddr + slide, entry.fileoff, 
std::string(id));
 }
+
 offset = load_cmd_offset + lc.cmdsize;
   }
 
@@ -198,7 +211,7 @@
 m_data.SetData(data_sp);
   }
 
-  return ParseFileset(m_data, *header, m_entries);
+  return ParseFileset(m_data, *header, m_entries, m_memory_addr);
 }
 
 size_t ObjectContainerMachOFileset::GetModuleSpecifications(


Index: lldb/source/Plugins/ObjectContainer/Mach-O-Fileset/ObjectContainerMachOFileset.h
===
--- lldb/source/Plugins/ObjectContainer/Mach-O-Fileset/ObjectContainerMachOFileset.h
+++ lldb/source/Plugins/ObjectContainer/Mach-O-Fileset/ObjectContainerMachOFileset.h
@@ -73,7 +73,6 @@
 : vmaddr(vmaddr), fileoff(fileoff), id(id) {}
 uint64_t vmaddr;
 uint64_t fileoff;
-uint64_t slide;
 std::string id;
   };
 
Index: lldb/source/Plugins/ObjectContainer/Mach-O-Fileset/ObjectContainerMachOFileset.cpp
===
--- lldb/source/Plugins/ObjectContainer/Mach-O-Fileset/ObjectContainerMachOFileset.cpp
+++ lldb/source/Plugins/ObjectContainer/Mach-O-Fileset/ObjectContainerMachOFileset.cpp
@@ -133,21 +133,34 @@
 
 static bool
 ParseFileset(DataExtractor , mach_header header,
- std::vector ) {
+ std::vector ,
+ llvm::Optional load_addr = llvm::None) {
   lldb::offset_t offset = MachHeaderSizeFromMagic(header.magic);
+  lldb::offset_t slide = 0;
   for (uint32_t i = 0; i < header.ncmds; ++i) {
 const lldb::offset_t load_cmd_offset = offset;
 load_command lc = {};
 if (data.GetU32(, , 2) == nullptr)
   break;
 
+// If we know the load address we can compute the slide.
+if (load_addr) {
+  if (lc.cmd == llvm::MachO::LC_SEGMENT_64) {
+segment_command_64 segment;
+data.CopyData(load_cmd_offset, sizeof(segment_command_64), );
+if (llvm::StringRef(segment.segname) == "__TEXT")
+  slide = *load_addr - segment.vmaddr;
+  }
+}
+
 if (lc.cmd == LC_FILESET_ENTRY) {
   fileset_entry_command entry;
   data.CopyData(load_cmd_offset, sizeof(fileset_entry_command), );
   lldb::offset_t entry_id_offset = load_cmd_offset + entry.entry_id;
   const char *id = data.GetCStr(_id_offset);
-  entries.emplace_back(entry.vmaddr, entry.fileoff, std::string(id));
+  entries.emplace_back(entry.vmaddr + slide, entry.fileoff, std::string(id));
 }
+