//===- SFrameParser.cpp ---------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "llvm/Object/SFrameParser.h" #include "llvm/BinaryFormat/SFrame.h" #include "llvm/Object/Error.h" #include "llvm/Support/FormatVariadic.h" using namespace llvm; using namespace llvm::object; template static Expected getDataSliceAs(ArrayRef Data, uint64_t Offset) { static_assert(std::is_trivial_v); if (Data.size() < Offset + sizeof(T)) { return createStringError( formatv("unexpected end of data at offset {0:x} while reading [{1:x}, " "{2:x})", Data.size(), Offset, Offset + sizeof(T)) .str(), object_error::unexpected_eof); } return *reinterpret_cast(Data.data() + Offset); } template Expected> SFrameParser::create(ArrayRef Contents) { Expected &> Preamble = getDataSliceAs>(Contents, 0); if (!Preamble) return Preamble.takeError(); if (Preamble->Magic != sframe::Magic) return createError( formatv("invalid magic number ({0:x+4})", Preamble->Magic.value())); if (Preamble->Version != sframe::Version::V2) return createError( formatv("invalid/unsupported version number ({0})", static_cast(Preamble->Version.value()))); Expected &> Header = getDataSliceAs>(Contents, 0); if (!Header) return Header.takeError(); return SFrameParser(Contents, *Header); } template class llvm::object::SFrameParser; template class llvm::object::SFrameParser;