//===- DXContainer.cpp - DXContainer object file implementation -----------===// // // 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/DXContainer.h" #include "llvm/BinaryFormat/DXContainer.h" #include "llvm/Object/Error.h" using namespace llvm; using namespace llvm::object; static Error parseFailed(const Twine &Msg) { return make_error(Msg.str(), object_error::parse_failed); } template static Error readStruct(StringRef Buffer, const char *P, T &Struct) { // Don't read before the beginning or past the end of the file if (P < Buffer.begin() || P + sizeof(T) > Buffer.end()) return parseFailed("Reading structure out of file bounds"); memcpy(&Struct, P, sizeof(T)); // DXContainer is always BigEndian if (sys::IsBigEndianHost) Struct.byteSwap(); return Error::success(); } DXContainer::DXContainer(MemoryBufferRef O) : Data(O) {} Error DXContainer::parseHeader() { return readStruct(Data.getBuffer(), Data.getBuffer().data(), Header); } Expected DXContainer::create(MemoryBufferRef Object) { DXContainer Container(Object); if (Error Err = Container.parseHeader()) return std::move(Err); return Container; }