14  if (!E.isValidOffsetForDataOfSize(OffsetPtr, 
sizeof(
uint64_t)))
 
   16        std::make_error_code(std::errc::bad_address),
 
   17        "Invalid offset for a buffer extent (%" PRId64 
").", OffsetPtr);
 
   19  auto PreReadOffset = OffsetPtr;
 
   20  R.Size = E.getU64(&OffsetPtr);
 
   21  if (PreReadOffset == OffsetPtr)
 
   23                             "Cannot read buffer extent at offset %" PRId64 
".",
 
 
   31  if (!E.isValidOffsetForDataOfSize(OffsetPtr,
 
   34        std::make_error_code(std::errc::bad_address),
 
   35        "Invalid offset for a wallclock record (%" PRId64 
").", OffsetPtr);
 
   36  auto BeginOffset = OffsetPtr;
 
   37  auto PreReadOffset = OffsetPtr;
 
   38  R.Seconds = E.getU64(&OffsetPtr);
 
   39  if (OffsetPtr == PreReadOffset)
 
   41        std::make_error_code(std::errc::invalid_argument),
 
   42        "Cannot read wall clock 'seconds' field at offset %" PRId64 
".",
 
   45  PreReadOffset = OffsetPtr;
 
   46  R.Nanos = E.getU32(&OffsetPtr);
 
   47  if (OffsetPtr == PreReadOffset)
 
   49        std::make_error_code(std::errc::invalid_argument),
 
   50        "Cannot read wall clock 'nanos' field at offset %" PRId64 
".",
 
 
   60  if (!E.isValidOffsetForDataOfSize(OffsetPtr,
 
   63        std::make_error_code(std::errc::bad_address),
 
   64        "Invalid offset for a new cpu id record (%" PRId64 
").", OffsetPtr);
 
   65  auto BeginOffset = OffsetPtr;
 
   66  auto PreReadOffset = OffsetPtr;
 
   67  R.CPUId = E.getU16(&OffsetPtr);
 
   68  if (OffsetPtr == PreReadOffset)
 
   70                             "Cannot read CPU id at offset %" PRId64 
".",
 
   73  PreReadOffset = OffsetPtr;
 
   74  R.TSC = E.getU64(&OffsetPtr);
 
   75  if (OffsetPtr == PreReadOffset)
 
   77                             "Cannot read CPU TSC at offset %" PRId64 
".",
 
 
   85  if (!E.isValidOffsetForDataOfSize(OffsetPtr,
 
   88        std::make_error_code(std::errc::bad_address),
 
   89        "Invalid offset for a new TSC wrap record (%" PRId64 
").", OffsetPtr);
 
   91  auto PreReadOffset = OffsetPtr;
 
   92  R.BaseTSC = E.getU64(&OffsetPtr);
 
   93  if (PreReadOffset == OffsetPtr)
 
   95        std::make_error_code(std::errc::invalid_argument),
 
   96        "Cannot read TSC wrap record at offset %" PRId64 
".", OffsetPtr);
 
 
  103  if (!E.isValidOffsetForDataOfSize(OffsetPtr,
 
  106        std::make_error_code(std::errc::bad_address),
 
  107        "Invalid offset for a custom event record (%" PRId64 
").", OffsetPtr);
 
  109  auto BeginOffset = OffsetPtr;
 
  110  auto PreReadOffset = OffsetPtr;
 
  111  R.Size = E.getSigned(&OffsetPtr, 
sizeof(int32_t));
 
  112  if (PreReadOffset == OffsetPtr)
 
  114        std::make_error_code(std::errc::invalid_argument),
 
  115        "Cannot read a custom event record size field offset %" PRId64 
".",
 
  120        std::make_error_code(std::errc::bad_address),
 
  121        "Invalid size for custom event (size = %d) at offset %" PRId64 
".",
 
  124  PreReadOffset = OffsetPtr;
 
  125  R.TSC = E.getU64(&OffsetPtr);
 
  126  if (PreReadOffset == OffsetPtr)
 
  128        std::make_error_code(std::errc::invalid_argument),
 
  129        "Cannot read a custom event TSC field at offset %" PRId64 
".",
 
  135    PreReadOffset = OffsetPtr;
 
  136    R.CPU = E.getU16(&OffsetPtr);
 
  137    if (PreReadOffset == OffsetPtr)
 
  139          std::make_error_code(std::errc::invalid_argument),
 
  140          "Missing CPU field at offset %" PRId64 
".", OffsetPtr);
 
  143  assert(OffsetPtr > BeginOffset &&
 
  148  if (!E.isValidOffsetForDataOfSize(OffsetPtr, R.Size))
 
  150        std::make_error_code(std::errc::bad_address),
 
  151        "Cannot read %d bytes of custom event data from offset %" PRId64 
".",
 
  154  std::vector<uint8_t> Buffer;
 
  155  Buffer.resize(R.Size);
 
  156  PreReadOffset = OffsetPtr;
 
  157  if (E.getU8(&OffsetPtr, Buffer.data(), R.Size) != Buffer.data())
 
  159        std::make_error_code(std::errc::invalid_argument),
 
  160        "Failed reading data into buffer of size %d at offset %" PRId64 
".",
 
  163  assert(OffsetPtr >= PreReadOffset);
 
  164  if (OffsetPtr - PreReadOffset != 
static_cast<uint32_t>(R.Size))
 
  166        std::make_error_code(std::errc::invalid_argument),
 
  167        "Failed reading enough bytes for the custom event payload -- read " 
  168        "%" PRId64 
" expecting %d bytes at offset %" PRId64 
".",
 
  169        OffsetPtr - PreReadOffset, R.Size, PreReadOffset);
 
  171  R.Data.assign(Buffer.begin(), Buffer.end());
 
 
  176  if (!E.isValidOffsetForDataOfSize(OffsetPtr,
 
  179        std::make_error_code(std::errc::bad_address),
 
  180        "Invalid offset for a custom event record (%" PRId64 
").", OffsetPtr);
 
  182  auto BeginOffset = OffsetPtr;
 
  183  auto PreReadOffset = OffsetPtr;
 
  185  R.Size = E.getSigned(&OffsetPtr, 
sizeof(int32_t));
 
  186  if (PreReadOffset == OffsetPtr)
 
  188        std::make_error_code(std::errc::invalid_argument),
 
  189        "Cannot read a custom event record size field offset %" PRId64 
".",
 
  194        std::make_error_code(std::errc::bad_address),
 
  195        "Invalid size for custom event (size = %d) at offset %" PRId64 
".",
 
  198  PreReadOffset = OffsetPtr;
 
  199  R.Delta = E.getSigned(&OffsetPtr, 
sizeof(int32_t));
 
  200  if (PreReadOffset == OffsetPtr)
 
  202        std::make_error_code(std::errc::invalid_argument),
 
  203        "Cannot read a custom event record TSC delta field at offset " 
  207  assert(OffsetPtr > BeginOffset &&
 
  212  if (!E.isValidOffsetForDataOfSize(OffsetPtr, R.Size))
 
  214        std::make_error_code(std::errc::bad_address),
 
  215        "Cannot read %d bytes of custom event data from offset %" PRId64 
".",
 
  218  std::vector<uint8_t> Buffer;
 
  219  Buffer.resize(R.Size);
 
  220  PreReadOffset = OffsetPtr;
 
  221  if (E.getU8(&OffsetPtr, Buffer.data(), R.Size) != Buffer.data())
 
  223        std::make_error_code(std::errc::invalid_argument),
 
  224        "Failed reading data into buffer of size %d at offset %" PRId64 
".",
 
  227  assert(OffsetPtr >= PreReadOffset);
 
  228  if (OffsetPtr - PreReadOffset != 
static_cast<uint32_t>(R.Size))
 
  230        std::make_error_code(std::errc::invalid_argument),
 
  231        "Failed reading enough bytes for the custom event payload -- read " 
  232        "%" PRId64 
" expecting %d bytes at offset %" PRId64 
".",
 
  233        OffsetPtr - PreReadOffset, R.Size, PreReadOffset);
 
  235  R.Data.assign(Buffer.begin(), Buffer.end());
 
 
  240  if (!E.isValidOffsetForDataOfSize(OffsetPtr,
 
  243        std::make_error_code(std::errc::bad_address),
 
  244        "Invalid offset for a typed event record (%" PRId64 
").", OffsetPtr);
 
  246  auto BeginOffset = OffsetPtr;
 
  247  auto PreReadOffset = OffsetPtr;
 
  249  R.Size = E.getSigned(&OffsetPtr, 
sizeof(int32_t));
 
  250  if (PreReadOffset == OffsetPtr)
 
  252        std::make_error_code(std::errc::invalid_argument),
 
  253        "Cannot read a typed event record size field offset %" PRId64 
".",
 
  258        std::make_error_code(std::errc::bad_address),
 
  259        "Invalid size for typed event (size = %d) at offset %" PRId64 
".",
 
  262  PreReadOffset = OffsetPtr;
 
  263  R.Delta = E.getSigned(&OffsetPtr, 
sizeof(int32_t));
 
  264  if (PreReadOffset == OffsetPtr)
 
  266        std::make_error_code(std::errc::invalid_argument),
 
  267        "Cannot read a typed event record TSC delta field at offset " 
  271  PreReadOffset = OffsetPtr;
 
  272  R.EventType = E.getU16(&OffsetPtr);
 
  273  if (PreReadOffset == OffsetPtr)
 
  275        std::make_error_code(std::errc::invalid_argument),
 
  276        "Cannot read a typed event record type field at offset %" PRId64 
".",
 
  279  assert(OffsetPtr > BeginOffset &&
 
  284  if (!E.isValidOffsetForDataOfSize(OffsetPtr, R.Size))
 
  286        std::make_error_code(std::errc::bad_address),
 
  287        "Cannot read %d bytes of custom event data from offset %" PRId64 
".",
 
  290  std::vector<uint8_t> Buffer;
 
  291  Buffer.resize(R.Size);
 
  292  PreReadOffset = OffsetPtr;
 
  293  if (E.getU8(&OffsetPtr, Buffer.data(), R.Size) != Buffer.data())
 
  295        std::make_error_code(std::errc::invalid_argument),
 
  296        "Failed reading data into buffer of size %d at offset %" PRId64 
".",
 
  299  assert(OffsetPtr >= PreReadOffset);
 
  300  if (OffsetPtr - PreReadOffset != 
static_cast<uint32_t>(R.Size))
 
  302        std::make_error_code(std::errc::invalid_argument),
 
  303        "Failed reading enough bytes for the typed event payload -- read " 
  304        "%" PRId64 
" expecting %d bytes at offset %" PRId64 
".",
 
  305        OffsetPtr - PreReadOffset, R.Size, PreReadOffset);
 
  307  R.Data.assign(Buffer.begin(), Buffer.end());
 
 
  312  if (!E.isValidOffsetForDataOfSize(OffsetPtr,
 
  315        std::make_error_code(std::errc::bad_address),
 
  316        "Invalid offset for a call argument record (%" PRId64 
").",
 
  319  auto PreReadOffset = OffsetPtr;
 
  320  R.Arg = E.getU64(&OffsetPtr);
 
  321  if (PreReadOffset == OffsetPtr)
 
  323        std::make_error_code(std::errc::invalid_argument),
 
  324        "Cannot read a call arg record at offset %" PRId64 
".", OffsetPtr);
 
 
  331  if (!E.isValidOffsetForDataOfSize(OffsetPtr,
 
  334        std::make_error_code(std::errc::bad_address),
 
  335        "Invalid offset for a process ID record (%" PRId64 
").", OffsetPtr);
 
  337  auto PreReadOffset = OffsetPtr;
 
  338  R.PID = E.getSigned(&OffsetPtr, 4);
 
  339  if (PreReadOffset == OffsetPtr)
 
  341        std::make_error_code(std::errc::invalid_argument),
 
  342        "Cannot read a process ID record at offset %" PRId64 
".", OffsetPtr);
 
 
  349  if (!E.isValidOffsetForDataOfSize(OffsetPtr,
 
  352        std::make_error_code(std::errc::bad_address),
 
  353        "Invalid offset for a new buffer record (%" PRId64 
").", OffsetPtr);
 
  355  auto PreReadOffset = OffsetPtr;
 
  356  R.TID = E.getSigned(&OffsetPtr, 
sizeof(int32_t));
 
  357  if (PreReadOffset == OffsetPtr)
 
  359        std::make_error_code(std::errc::invalid_argument),
 
  360        "Cannot read a new buffer record at offset %" PRId64 
".", OffsetPtr);
 
 
  387  if (OffsetPtr == 0 || !E.isValidOffsetForDataOfSize(
 
  388                            --OffsetPtr, FunctionRecord::kFunctionRecordSize))
 
  390        std::make_error_code(std::errc::bad_address),
 
  391        "Invalid offset for a function record (%" PRId64 
").", OffsetPtr);
 
  393  auto BeginOffset = OffsetPtr;
 
  394  auto PreReadOffset = BeginOffset;
 
  395  uint32_t Buffer = E.getU32(&OffsetPtr);
 
  396  if (PreReadOffset == OffsetPtr)
 
  398        std::make_error_code(std::errc::bad_address),
 
  399        "Cannot read function id field from offset %" PRId64 
".", OffsetPtr);
 
  414        std::make_error_code(std::errc::invalid_argument),
 
  415        "Unknown function record type '%d' at offset %" PRId64 
".",
 
  419  R.FuncId = Buffer >> 4;
 
  420  PreReadOffset = OffsetPtr;
 
  421  R.Delta = E.getU32(&OffsetPtr);
 
  422  if (OffsetPtr == PreReadOffset)
 
  424        std::make_error_code(std::errc::invalid_argument),
 
  425        "Failed reading TSC delta from offset %" PRId64 
".", OffsetPtr);
 
  426  assert(FunctionRecord::kFunctionRecordSize == (OffsetPtr - BeginOffset));