[compiler-rt] r337441 - [XRay][compiler-rt] FDR Mode: Add extents metadata to buffer

Dean Michael Berris via llvm-commits llvm-commits at lists.llvm.org
Wed Jul 18 22:17:32 PDT 2018


Author: dberris
Date: Wed Jul 18 22:17:32 2018
New Revision: 337441

URL: http://llvm.org/viewvc/llvm-project?rev=337441&view=rev
Log:
[XRay][compiler-rt] FDR Mode: Add extents metadata to buffer

When providing raw access to the FDR mode buffers, we used to not
include the extents metadata record. This oversight means that
processing the buffers in-memory will lose important information that
would have been written in files.

This change exposes the metadata record by serializing the data
similarly to how we would do it when flushing to files.

Modified:
    compiler-rt/trunk/lib/xray/xray_fdr_logging.cc

Modified: compiler-rt/trunk/lib/xray/xray_fdr_logging.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/xray/xray_fdr_logging.cc?rev=337441&r1=337440&r2=337441&view=diff
==============================================================================
--- compiler-rt/trunk/lib/xray/xray_fdr_logging.cc (original)
+++ compiler-rt/trunk/lib/xray/xray_fdr_logging.cc Wed Jul 18 22:17:32 2018
@@ -741,6 +741,7 @@ XRayBuffer fdrIterator(const XRayBuffer
 
   static BufferQueue::const_iterator It{};
   static BufferQueue::const_iterator End{};
+  static void *CurrentBuffer{nullptr};
   if (B.Data == static_cast<void *>(&Header) && B.Size == sizeof(Header)) {
     // From this point on, we provide raw access to the raw buffer we're getting
     // from the BufferQueue. We're relying on the iterators from the current
@@ -749,12 +750,39 @@ XRayBuffer fdrIterator(const XRayBuffer
     End = BQ->cend();
   }
 
+  if (CurrentBuffer != nullptr) {
+    InternalFree(CurrentBuffer);
+    CurrentBuffer = nullptr;
+  }
+
   if (It == End)
     return {nullptr, 0};
 
+  // Set up the current buffer to contain the extents like we would when writing
+  // out to disk. The difference here would be that we still write "empty"
+  // buffers, or at least go through the iterators faithfully to let the
+  // handlers see the empty buffers in the queue.
+  auto BufferSize = atomic_load(&It->Extents->Size, memory_order_acquire);
+  auto SerializedBufferSize = BufferSize + sizeof(MetadataRecord);
+  CurrentBuffer = InternalAlloc(SerializedBufferSize);
+  if (CurrentBuffer == nullptr)
+    return {nullptr, 0};
+
+  // Write out the extents as a Metadata Record into the CurrentBuffer.
+  MetadataRecord ExtentsRecord;
+  ExtentsRecord.Type = uint8_t(RecordType::Metadata);
+  ExtentsRecord.RecordKind =
+      uint8_t(MetadataRecord::RecordKinds::BufferExtents);
+  internal_memcpy(ExtentsRecord.Data, &BufferSize, sizeof(BufferSize));
+  auto AfterExtents =
+      static_cast<char *>(internal_memcpy(CurrentBuffer, &ExtentsRecord,
+                                          sizeof(MetadataRecord))) +
+      sizeof(MetadataRecord);
+  internal_memcpy(AfterExtents, It->Data, BufferSize);
+
   XRayBuffer Result;
-  Result.Data = It->Data;
-  Result.Size = atomic_load(&It->Extents->Size, memory_order_acquire);
+  Result.Data = CurrentBuffer;
+  Result.Size = SerializedBufferSize;
   ++It;
   return Result;
 }




More information about the llvm-commits mailing list