Path: blob/main/contrib/llvm-project/llvm/lib/XRay/FileHeaderReader.cpp
35232 views
//===- FileHeaderReader.cpp - XRay File Header Reader --------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7#include "llvm/XRay/FileHeaderReader.h"89namespace llvm {10namespace xray {1112// Populates the FileHeader reference by reading the first 32 bytes of the file.13Expected<XRayFileHeader> readBinaryFormatHeader(DataExtractor &HeaderExtractor,14uint64_t &OffsetPtr) {15// FIXME: Maybe deduce whether the data is little or big-endian using some16// magic bytes in the beginning of the file?1718// First 32 bytes of the file will always be the header. We assume a certain19// format here:20//21// (2) uint16 : version22// (2) uint16 : type23// (4) uint32 : bitfield24// (8) uint64 : cycle frequency25// (16) - : padding26XRayFileHeader FileHeader;27auto PreReadOffset = OffsetPtr;28FileHeader.Version = HeaderExtractor.getU16(&OffsetPtr);29if (OffsetPtr == PreReadOffset)30return createStringError(31std::make_error_code(std::errc::invalid_argument),32"Failed reading version from file header at offset %" PRId64 ".",33OffsetPtr);3435PreReadOffset = OffsetPtr;36FileHeader.Type = HeaderExtractor.getU16(&OffsetPtr);37if (OffsetPtr == PreReadOffset)38return createStringError(39std::make_error_code(std::errc::invalid_argument),40"Failed reading file type from file header at offset %" PRId64 ".",41OffsetPtr);4243PreReadOffset = OffsetPtr;44uint32_t Bitfield = HeaderExtractor.getU32(&OffsetPtr);45if (OffsetPtr == PreReadOffset)46return createStringError(47std::make_error_code(std::errc::invalid_argument),48"Failed reading flag bits from file header at offset %" PRId64 ".",49OffsetPtr);5051FileHeader.ConstantTSC = Bitfield & 1uL;52FileHeader.NonstopTSC = Bitfield & 1uL << 1;53PreReadOffset = OffsetPtr;54FileHeader.CycleFrequency = HeaderExtractor.getU64(&OffsetPtr);55if (OffsetPtr == PreReadOffset)56return createStringError(57std::make_error_code(std::errc::invalid_argument),58"Failed reading cycle frequency from file header at offset %" PRId6459".",60OffsetPtr);6162std::memcpy(&FileHeader.FreeFormData,63HeaderExtractor.getData().bytes_begin() + OffsetPtr, 16);6465// Manually advance the offset pointer 16 bytes, after getting a raw memcpy66// from the underlying data.67OffsetPtr += 16;68return std::move(FileHeader);69}7071} // namespace xray72} // namespace llvm737475