[llvm] r340389 - [XRay] Refactor file header reading (NFC)

Dean Michael Berris via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 22 00:37:56 PDT 2018


Author: dberris
Date: Wed Aug 22 00:37:55 2018
New Revision: 340389

URL: http://llvm.org/viewvc/llvm-project?rev=340389&view=rev
Log:
[XRay] Refactor file header reading (NFC)

Summary:
This patch moves out the definition of the XRay log file header from
binary logs into its own header and implementation file.

This is one part of the refactoring being done in D50441.

Reviewers: eizan

Subscribers: mgorny, hiraditya, llvm-commits

Differential Revision: https://reviews.llvm.org/D51086

Added:
    llvm/trunk/include/llvm/XRay/FileHeaderReader.h
    llvm/trunk/lib/XRay/FileHeaderReader.cpp
Modified:
    llvm/trunk/lib/XRay/CMakeLists.txt
    llvm/trunk/lib/XRay/Trace.cpp

Added: llvm/trunk/include/llvm/XRay/FileHeaderReader.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/XRay/FileHeaderReader.h?rev=340389&view=auto
==============================================================================
--- llvm/trunk/include/llvm/XRay/FileHeaderReader.h (added)
+++ llvm/trunk/include/llvm/XRay/FileHeaderReader.h Wed Aug 22 00:37:55 2018
@@ -0,0 +1,33 @@
+//===- FileHeaderReader.h - XRay Trace File Header Reading Function -------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file declares functions that can load an XRay log header from various
+// sources.
+//
+//===----------------------------------------------------------------------===//
+#ifndef LLVM_LIB_XRAY_FILEHEADERREADER_H_
+#define LLVM_LIB_XRAY_FILEHEADERREADER_H_
+
+#include "llvm/Support/DataExtractor.h"
+#include "llvm/Support/Error.h"
+#include "llvm/XRay/XRayRecord.h"
+#include <cstdint>
+
+namespace llvm {
+namespace xray {
+
+/// Convenience function for loading the file header given a data extractor at a
+/// specified offset.
+Expected<XRayFileHeader> readBinaryFormatHeader(DataExtractor &HeaderExtractor,
+                                                uint32_t &OffsetPtr);
+
+} // namespace xray
+} // namespace llvm
+
+#endif // LLVM_LIB_XRAY_FILEHEADERREADER_H_

Modified: llvm/trunk/lib/XRay/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/XRay/CMakeLists.txt?rev=340389&r1=340388&r2=340389&view=diff
==============================================================================
--- llvm/trunk/lib/XRay/CMakeLists.txt (original)
+++ llvm/trunk/lib/XRay/CMakeLists.txt Wed Aug 22 00:37:55 2018
@@ -1,4 +1,5 @@
 add_llvm_library(LLVMXRay
+  FileHeaderReader.cpp
   InstrumentationMap.cpp
   Trace.cpp
 

Added: llvm/trunk/lib/XRay/FileHeaderReader.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/XRay/FileHeaderReader.cpp?rev=340389&view=auto
==============================================================================
--- llvm/trunk/lib/XRay/FileHeaderReader.cpp (added)
+++ llvm/trunk/lib/XRay/FileHeaderReader.cpp Wed Aug 22 00:37:55 2018
@@ -0,0 +1,75 @@
+//===- FileHeaderReader.cpp - XRay File Header Reader  --------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+#include "llvm/XRay/FileHeaderReader.h"
+
+namespace llvm {
+namespace xray {
+
+// Populates the FileHeader reference by reading the first 32 bytes of the file.
+Expected<XRayFileHeader> readBinaryFormatHeader(DataExtractor &HeaderExtractor,
+                                                uint32_t &OffsetPtr) {
+  // FIXME: Maybe deduce whether the data is little or big-endian using some
+  // magic bytes in the beginning of the file?
+
+  // First 32 bytes of the file will always be the header. We assume a certain
+  // format here:
+  //
+  //   (2)   uint16 : version
+  //   (2)   uint16 : type
+  //   (4)   uint32 : bitfield
+  //   (8)   uint64 : cycle frequency
+  //   (16)  -      : padding
+  XRayFileHeader FileHeader;
+  auto PreReadOffset = OffsetPtr;
+  FileHeader.Version = HeaderExtractor.getU16(&OffsetPtr);
+  if (OffsetPtr == PreReadOffset)
+    return createStringError(
+        std::make_error_code(std::errc::invalid_argument),
+        "Failed reading version from file header at offset %d.", OffsetPtr);
+
+  PreReadOffset = OffsetPtr;
+  FileHeader.Type = HeaderExtractor.getU16(&OffsetPtr);
+  if (OffsetPtr == PreReadOffset)
+    return createStringError(
+        std::make_error_code(std::errc::invalid_argument),
+        "Failed reading file type from file header at offset %d.", OffsetPtr);
+
+  PreReadOffset = OffsetPtr;
+  uint32_t Bitfield = HeaderExtractor.getU32(&OffsetPtr);
+  if (OffsetPtr == PreReadOffset)
+    return createStringError(
+        std::make_error_code(std::errc::invalid_argument),
+        "Failed reading flag bits from file header at offset %d.", OffsetPtr);
+
+  FileHeader.ConstantTSC = Bitfield & 1uL;
+  FileHeader.NonstopTSC = Bitfield & 1uL << 1;
+  PreReadOffset = OffsetPtr;
+  FileHeader.CycleFrequency = HeaderExtractor.getU64(&OffsetPtr);
+  if (OffsetPtr == PreReadOffset)
+    return createStringError(
+        std::make_error_code(std::errc::invalid_argument),
+        "Failed reading cycle frequency from file header at offset %d.",
+        OffsetPtr);
+
+  std::memcpy(&FileHeader.FreeFormData,
+              HeaderExtractor.getData().bytes_begin() + OffsetPtr, 16);
+
+  // Manually advance the offset pointer 16 bytes, after getting a raw memcpy
+  // from the underlying data.
+  OffsetPtr += 16;
+  if (FileHeader.Version != 1 && FileHeader.Version != 2 &&
+      FileHeader.Version != 3)
+    return createStringError(std::make_error_code(std::errc::invalid_argument),
+                             "Unsupported XRay file version: %d at offset %d",
+                             FileHeader.Version, OffsetPtr);
+  return std::move(FileHeader);
+}
+
+} // namespace xray
+} // namespace llvm

Modified: llvm/trunk/lib/XRay/Trace.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/XRay/Trace.cpp?rev=340389&r1=340388&r2=340389&view=diff
==============================================================================
--- llvm/trunk/lib/XRay/Trace.cpp (original)
+++ llvm/trunk/lib/XRay/Trace.cpp Wed Aug 22 00:37:55 2018
@@ -15,6 +15,7 @@
 #include "llvm/Support/DataExtractor.h"
 #include "llvm/Support/Error.h"
 #include "llvm/Support/FileSystem.h"
+#include "llvm/XRay/FileHeaderReader.h"
 #include "llvm/XRay/YAMLXRayRecord.h"
 
 using namespace llvm;
@@ -30,66 +31,6 @@ using XRayRecordStorage =
 // record it is.
 constexpr auto kFDRMetadataBodySize = 15;
 
-// Populates the FileHeader reference by reading the first 32 bytes of the file.
-Error readBinaryFormatHeader(DataExtractor &HeaderExtractor,
-                             uint32_t &OffsetPtr, XRayFileHeader &FileHeader) {
-  // FIXME: Maybe deduce whether the data is little or big-endian using some
-  // magic bytes in the beginning of the file?
-
-  // First 32 bytes of the file will always be the header. We assume a certain
-  // format here:
-  //
-  //   (2)   uint16 : version
-  //   (2)   uint16 : type
-  //   (4)   uint32 : bitfield
-  //   (8)   uint64 : cycle frequency
-  //   (16)  -      : padding
-
-  auto PreReadOffset = OffsetPtr;
-  FileHeader.Version = HeaderExtractor.getU16(&OffsetPtr);
-  if (OffsetPtr == PreReadOffset)
-    return createStringError(
-        std::make_error_code(std::errc::invalid_argument),
-        "Failed reading version from file header at offset %d.", OffsetPtr);
-
-  PreReadOffset = OffsetPtr;
-  FileHeader.Type = HeaderExtractor.getU16(&OffsetPtr);
-  if (OffsetPtr == PreReadOffset)
-    return createStringError(
-        std::make_error_code(std::errc::invalid_argument),
-        "Failed reading file type from file header at offset %d.", OffsetPtr);
-
-  PreReadOffset = OffsetPtr;
-  uint32_t Bitfield = HeaderExtractor.getU32(&OffsetPtr);
-  if (OffsetPtr == PreReadOffset)
-    return createStringError(
-        std::make_error_code(std::errc::invalid_argument),
-        "Failed reading flag bits from file header at offset %d.", OffsetPtr);
-
-  FileHeader.ConstantTSC = Bitfield & 1uL;
-  FileHeader.NonstopTSC = Bitfield & 1uL << 1;
-  PreReadOffset = OffsetPtr;
-  FileHeader.CycleFrequency = HeaderExtractor.getU64(&OffsetPtr);
-  if (OffsetPtr == PreReadOffset)
-    return createStringError(
-        std::make_error_code(std::errc::invalid_argument),
-        "Failed reading cycle frequency from file header at offset %d.",
-        OffsetPtr);
-
-  std::memcpy(&FileHeader.FreeFormData,
-              HeaderExtractor.getData().bytes_begin() + OffsetPtr, 16);
-
-  // Manually advance the offset pointer 16 bytes, after getting a raw memcpy
-  // from the underlying data.
-  OffsetPtr += 16;
-  if (FileHeader.Version != 1 && FileHeader.Version != 2 &&
-      FileHeader.Version != 3)
-    return createStringError(std::make_error_code(std::errc::invalid_argument),
-                             "Unsupported XRay file version: %d at offset %d",
-                             FileHeader.Version, OffsetPtr);
-  return Error::success();
-}
-
 Error loadNaiveFormatLog(StringRef Data, XRayFileHeader &FileHeader,
                          std::vector<XRayRecord> &Records) {
   if (Data.size() < 32)
@@ -104,8 +45,10 @@ Error loadNaiveFormatLog(StringRef Data,
 
   DataExtractor Reader(Data, true, 8);
   uint32_t OffsetPtr = 0;
-  if (auto E = readBinaryFormatHeader(Reader, OffsetPtr, FileHeader))
-    return E;
+  auto FileHeaderOrError = readBinaryFormatHeader(Reader, OffsetPtr);
+  if (!FileHeaderOrError)
+    return FileHeaderOrError.takeError();
+  FileHeader = std::move(FileHeaderOrError.get());
 
   // Each record after the header will be 32 bytes, in the following format:
   //
@@ -762,6 +705,7 @@ Error processFDRFunctionRecord(FDRState
 /// EOB: *deprecated*
 Error loadFDRLog(StringRef Data, XRayFileHeader &FileHeader,
                  std::vector<XRayRecord> &Records) {
+
   if (Data.size() < 32)
     return make_error<StringError>(
         "Not enough bytes for an XRay log.",
@@ -770,8 +714,10 @@ Error loadFDRLog(StringRef Data, XRayFil
   DataExtractor Reader(Data, true, 8);
   uint32_t OffsetPtr = 0;
 
-  if (auto E = readBinaryFormatHeader(Reader, OffsetPtr, FileHeader))
-    return E;
+  auto FileHeaderOrError = readBinaryFormatHeader(Reader, OffsetPtr);
+  if (!FileHeaderOrError)
+    return FileHeaderOrError.takeError();
+  FileHeader = std::move(FileHeaderOrError.get());
 
   uint64_t BufferSize = 0;
   {




More information about the llvm-commits mailing list