| //===- 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<const char *>(&Header), | |
| sizeof(::llvm::dxbc::Header)); | |
| if (sys::IsBigEndianHost) | |
| for (auto &O : Offsets) | |
| sys::swapByteOrder(O); | |
| Out.write(reinterpret_cast<const char *>(Offsets.data()), | |
| Offsets.size() * sizeof(uint32_t)); | |
| for (const Part &P : Obj.Parts) { | |
| Out.write(reinterpret_cast<const char *>(P.Name.data()), 4); | |
| uint32_t Size = P.Data.size(); | |
| if (sys::IsBigEndianHost) | |
| sys::swapByteOrder(Size); | |
| Out.write(reinterpret_cast<const char *>(&Size), sizeof(uint32_t)); | |
| Out.write(reinterpret_cast<const char *>(P.Data.data()), P.Data.size()); | |
| } | |
| return Error::success(); | |
| } | |
| } // end namespace dxbc | |
| } // end namespace objcopy | |
| } // end namespace llvm |