[libcxx-commits] [compiler-rt] [openmp] [clang] [flang] [llvm] [lldb] [libcxx] [clang-tools-extra] [OpenMP] Add memory diff dump for kernel record-replay (PR #70667)
Giorgis Georgakoudis via libcxx-commits
libcxx-commits at lists.llvm.org
Sat Nov 4 07:34:23 PDT 2023
================
@@ -151,6 +151,74 @@ struct RecordReplayTy {
OS.close();
}
+ void dumpDeviceMemoryDiff(StringRef Filename) {
+ ErrorOr<std::unique_ptr<WritableMemoryBuffer>> DeviceMemoryMB =
+ WritableMemoryBuffer::getNewUninitMemBuffer(MemorySize);
+ if (!DeviceMemoryMB)
+ report_fatal_error("Error creating MemoryBuffer for device memory");
+
+ auto Err = Device->dataRetrieve(DeviceMemoryMB.get()->getBufferStart(),
+ MemoryStart, MemorySize, nullptr);
+ if (Err)
+ report_fatal_error("Error retrieving data for target pointer");
+
+ // Get the pre-record memory filename
+ SmallString<128> InputFilename = {Filename.split('.').first, ".memory"};
+
+ // Read the pre-record memorydump
+ auto InputFileBuffer = MemoryBuffer::getFileOrSTDIN(InputFilename);
+ if (std::error_code EC = InputFileBuffer.getError())
+ report_fatal_error("Error reading pre-record device memory");
+
+ StringRef InputBufferContents = (*InputFileBuffer)->getBuffer();
+ if (InputBufferContents.size() != MemorySize)
+ report_fatal_error("Error: Pre-record device memory size mismatch");
+
+ std::error_code EC;
+ raw_fd_ostream OS(Filename, EC);
+ if (EC)
+ report_fatal_error("Error dumping memory to file " + Filename + " :" +
+ EC.message());
+
+ // Get current memory contents
+ StringRef DeviceMemoryContents(DeviceMemoryMB.get()->getBuffer().data(),
+ DeviceMemoryMB.get()->getBuffer().size());
+
+ for (size_t I = 0; I < MemorySize; ++I) {
+ // If buffers are same, continue
+ if (InputBufferContents[I] == DeviceMemoryContents[I])
+ continue;
+
+ // If mismatch is found create a new diff line
+ // Current format: location, size, differences
+ OS << I << " "; // Marks the start offset
+
+ SmallVector<uint8_t, 128> Modified;
+ Modified.push_back(DeviceMemoryContents[I]);
+
+ size_t J; // Length of current diff line
+ // Loop until next match is found
+ for (J = 1; J < MemorySize - I; ++J) {
+ // If no more mismatch, break out of the loop
+ if (InputBufferContents[I + J] == DeviceMemoryContents[I + J])
+ break;
+
+ // If mismatch continues - push diff to Modified
+ Modified.push_back(DeviceMemoryContents[I + J]);
+ }
+
+ OS << J << " "; // Marks the length of the mismatching sequence
+ for (const auto &value : Modified)
+ OS << value << " ";
+ OS << "\n";
+
+ // Increment I by J to skip ahead to next
+ // matching sequence in the buffer
+ I += J;
----------------
ggeorgakoudis wrote:
Simpler, more readable as:
```
for (I+=1; I < MemorySize; ++I) {
// If no more mismatch, break out of the loop
if (InputBufferContents[I] == DeviceMemoryContents[I])
break;
// If mismatch continues - push diff to Modified
Modified.push_back(DeviceMemoryContents[I]);
}
...
OS << Modified.size() << " ";
```
Avoids the skip-ahead increment too
https://github.com/llvm/llvm-project/pull/70667
More information about the libcxx-commits
mailing list