//===- DXContainerWriter.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 "DXContainerWriter.h" namespace llvm { namespace objcopy { namespace dxbc { using namespace object; size_t DXContainerWriter::finalize() { assert(Offsets.empty() && "Attempted to finalize writer with already computed offsets"); Offsets.reserve(Obj.Parts.size()); size_t Offset = Obj.headerSize(); for (const Part &P : Obj.Parts) { Offsets.push_back(Offset); Offset += P.size(); } return Obj.Header.FileSize; } Error DXContainerWriter::write() { size_t TotalSize = finalize(); Out.reserveExtraSpace(TotalSize); llvm::dxbc::Header Header = Obj.Header; if (sys::IsBigEndianHost) Header.swapBytes(); Out.write(reinterpret_cast(&Header), sizeof(::llvm::dxbc::Header)); if (sys::IsBigEndianHost) for (auto &O : Offsets) sys::swapByteOrder(O); Out.write(reinterpret_cast(Offsets.data()), Offsets.size() * sizeof(uint32_t)); for (const Part &P : Obj.Parts) { Out.write(reinterpret_cast(P.Name.data()), 4); uint32_t Size = P.Data.size(); if (sys::IsBigEndianHost) sys::swapByteOrder(Size); Out.write(reinterpret_cast(&Size), sizeof(uint32_t)); Out.write(reinterpret_cast(P.Data.data()), P.Data.size()); } return Error::success(); } } // end namespace dxbc } // end namespace objcopy } // end namespace llvm