[libcxx-commits] [openmp] [clang-tools-extra] [llvm] [compiler-rt] [lldb] [libcxx] [flang] [clang] [OpenMP] Add memory diff dump for kernel record-replay (PR #70667)
Giorgis Georgakoudis via libcxx-commits
libcxx-commits at lists.llvm.org
Tue Oct 31 13:53:14 PDT 2023
================
@@ -141,13 +141,56 @@ struct RecordReplayTy {
if (Err)
report_fatal_error("Error retrieving data for target pointer");
- StringRef DeviceMemory(DeviceMemoryMB.get()->getBufferStart(), MemorySize);
std::error_code EC;
raw_fd_ostream OS(Filename, EC);
if (EC)
report_fatal_error("Error dumping memory to file " + Filename + " :" +
EC.message());
- OS << DeviceMemory;
+
+ if (saveDiff) {
+ // 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");
+
+ // get current memory contents
+ StringRef DeviceMemoryContents(DeviceMemoryMB.get()->getBuffer().data(),
+ DeviceMemoryMB.get()->getBuffer().size());
+
+ // compare pre-record memorydump to current contents
+ size_t i = 0;
+ while (i < MemorySize) {
+ // if mismatch found, create a new diff line
+ // current format - location, size, differences ...
+ if (InputBufferContents[i] != DeviceMemoryContents[i]) {
+ OS << i << " "; // marks the start offset
+ SmallVector<uint8_t, 128> modified;
+ modified.push_back(DeviceMemoryContents[i]);
+ size_t j = 1;
+ // loop until next match is found
+ while (InputBufferContents[i + j] != DeviceMemoryContents[i + j]) {
+ modified.push_back(DeviceMemoryContents[i + j]);
+ j++;
+ }
+ OS << j << " "; // marks the length of the mismatching sequence
+ for (const auto &value : modified)
+ OS << value << " ";
+ OS << "\n";
+ i += j + 1;
+ } else
+ i++;
+ }
+ } else {
+ StringRef DeviceMemory(DeviceMemoryMB.get()->getBufferStart(),
+ MemorySize);
+ OS << DeviceMemory;
+ }
----------------
ggeorgakoudis wrote:
Simplify control flow for readability:
```
for(size_t I = 0; I < MemorySize; ++I) {
If (InputBufferContest[I] == DeviceMemoryContest[I]
continue;
...
// do stuff, simplify too
...
I += J;
}
```
https://github.com/llvm/llvm-project/pull/70667
More information about the libcxx-commits
mailing list