|  | //===- 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 |