1*06c3fb27SDimitry Andric //===- llvm/MC/DXContainerPSVInfo.cpp - DXContainer PSVInfo -----*- C++ -*-===// 2*06c3fb27SDimitry Andric // 3*06c3fb27SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*06c3fb27SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*06c3fb27SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*06c3fb27SDimitry Andric // 7*06c3fb27SDimitry Andric //===----------------------------------------------------------------------===// 8*06c3fb27SDimitry Andric 9*06c3fb27SDimitry Andric #include "llvm/MC/DXContainerPSVInfo.h" 10*06c3fb27SDimitry Andric #include "llvm/BinaryFormat/DXContainer.h" 11*06c3fb27SDimitry Andric #include "llvm/Support/raw_ostream.h" 12*06c3fb27SDimitry Andric 13*06c3fb27SDimitry Andric using namespace llvm; 14*06c3fb27SDimitry Andric using namespace llvm::mcdxbc; 15*06c3fb27SDimitry Andric using namespace llvm::dxbc::PSV; 16*06c3fb27SDimitry Andric 17*06c3fb27SDimitry Andric void PSVRuntimeInfo::write(raw_ostream &OS, uint32_t Version) const { 18*06c3fb27SDimitry Andric uint32_t InfoSize; 19*06c3fb27SDimitry Andric uint32_t BindingSize; 20*06c3fb27SDimitry Andric switch (Version) { 21*06c3fb27SDimitry Andric case 0: 22*06c3fb27SDimitry Andric InfoSize = sizeof(dxbc::PSV::v0::RuntimeInfo); 23*06c3fb27SDimitry Andric BindingSize = sizeof(dxbc::PSV::v0::ResourceBindInfo); 24*06c3fb27SDimitry Andric break; 25*06c3fb27SDimitry Andric case 1: 26*06c3fb27SDimitry Andric InfoSize = sizeof(dxbc::PSV::v1::RuntimeInfo); 27*06c3fb27SDimitry Andric BindingSize = sizeof(dxbc::PSV::v0::ResourceBindInfo); 28*06c3fb27SDimitry Andric break; 29*06c3fb27SDimitry Andric case 2: 30*06c3fb27SDimitry Andric default: 31*06c3fb27SDimitry Andric InfoSize = sizeof(dxbc::PSV::v2::RuntimeInfo); 32*06c3fb27SDimitry Andric BindingSize = sizeof(dxbc::PSV::v2::ResourceBindInfo); 33*06c3fb27SDimitry Andric } 34*06c3fb27SDimitry Andric uint32_t InfoSizeSwapped = InfoSize; 35*06c3fb27SDimitry Andric if (sys::IsBigEndianHost) 36*06c3fb27SDimitry Andric sys::swapByteOrder(InfoSizeSwapped); 37*06c3fb27SDimitry Andric // Write the size of the info. 38*06c3fb27SDimitry Andric OS.write(reinterpret_cast<const char *>(&InfoSizeSwapped), sizeof(uint32_t)); 39*06c3fb27SDimitry Andric // Write the info itself. 40*06c3fb27SDimitry Andric OS.write(reinterpret_cast<const char *>(&BaseData), InfoSize); 41*06c3fb27SDimitry Andric 42*06c3fb27SDimitry Andric uint32_t ResourceCount = static_cast<uint32_t>(Resources.size()); 43*06c3fb27SDimitry Andric uint32_t BindingSizeSwapped = BindingSize; 44*06c3fb27SDimitry Andric if (sys::IsBigEndianHost) { 45*06c3fb27SDimitry Andric sys::swapByteOrder(ResourceCount); 46*06c3fb27SDimitry Andric sys::swapByteOrder(BindingSizeSwapped); 47*06c3fb27SDimitry Andric } 48*06c3fb27SDimitry Andric 49*06c3fb27SDimitry Andric OS.write(reinterpret_cast<const char *>(&ResourceCount), sizeof(uint32_t)); 50*06c3fb27SDimitry Andric OS.write(reinterpret_cast<const char *>(&BindingSizeSwapped), sizeof(uint32_t)); 51*06c3fb27SDimitry Andric 52*06c3fb27SDimitry Andric for (const auto &Res : Resources) 53*06c3fb27SDimitry Andric OS.write(reinterpret_cast<const char *>(&Res), BindingSize); 54*06c3fb27SDimitry Andric } 55