16c69427eSIlia Diachkov //===- llvm/MC/MCSPIRVObjectWriter.cpp - SPIR-V Object Writer ----*- C++ *-===// 26c69427eSIlia Diachkov // 36c69427eSIlia Diachkov // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 46c69427eSIlia Diachkov // See https://llvm.org/LICENSE.txt for license information. 56c69427eSIlia Diachkov // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 66c69427eSIlia Diachkov // 76c69427eSIlia Diachkov //===----------------------------------------------------------------------===// 86c69427eSIlia Diachkov 96c69427eSIlia Diachkov #include "llvm/MC/MCAssembler.h" 106c69427eSIlia Diachkov #include "llvm/MC/MCSPIRVObjectWriter.h" 116c69427eSIlia Diachkov #include "llvm/MC/MCSection.h" 126c69427eSIlia Diachkov #include "llvm/MC/MCValue.h" 136c69427eSIlia Diachkov #include "llvm/Support/EndianStream.h" 146c69427eSIlia Diachkov 156c69427eSIlia Diachkov using namespace llvm; 166c69427eSIlia Diachkov 176c69427eSIlia Diachkov void SPIRVObjectWriter::writeHeader(const MCAssembler &Asm) { 186c69427eSIlia Diachkov constexpr uint32_t MagicNumber = 0x07230203; 19f352ce36SMichal Paszkowski constexpr uint32_t GeneratorID = 43; 20f352ce36SMichal Paszkowski constexpr uint32_t GeneratorMagicNumber = 21f352ce36SMichal Paszkowski (GeneratorID << 16) | (LLVM_VERSION_MAJOR); 226c69427eSIlia Diachkov constexpr uint32_t Schema = 0; 2359f34e8cSVyacheslav Levytskyy 246c69427eSIlia Diachkov W.write<uint32_t>(MagicNumber); 25*ffcd7e98SFangrui Song W.write<uint32_t>((VersionInfo.Major << 16) | (VersionInfo.Minor << 8)); 266c69427eSIlia Diachkov W.write<uint32_t>(GeneratorMagicNumber); 27*ffcd7e98SFangrui Song W.write<uint32_t>(VersionInfo.Bound); 286c69427eSIlia Diachkov W.write<uint32_t>(Schema); 296c69427eSIlia Diachkov } 306c69427eSIlia Diachkov 31*ffcd7e98SFangrui Song void SPIRVObjectWriter::setBuildVersion(unsigned Major, unsigned Minor, 32*ffcd7e98SFangrui Song unsigned Bound) { 33*ffcd7e98SFangrui Song VersionInfo.Major = Major; 34*ffcd7e98SFangrui Song VersionInfo.Minor = Minor; 35*ffcd7e98SFangrui Song VersionInfo.Bound = Bound; 36*ffcd7e98SFangrui Song } 37*ffcd7e98SFangrui Song 3823e62243SFangrui Song uint64_t SPIRVObjectWriter::writeObject(MCAssembler &Asm) { 396c69427eSIlia Diachkov uint64_t StartOffset = W.OS.tell(); 406c69427eSIlia Diachkov writeHeader(Asm); 416c69427eSIlia Diachkov for (const MCSection &S : Asm) 4223e62243SFangrui Song Asm.writeSectionData(W.OS, &S); 436c69427eSIlia Diachkov return W.OS.tell() - StartOffset; 446c69427eSIlia Diachkov } 456c69427eSIlia Diachkov 466c69427eSIlia Diachkov std::unique_ptr<MCObjectWriter> 476c69427eSIlia Diachkov llvm::createSPIRVObjectWriter(std::unique_ptr<MCSPIRVObjectTargetWriter> MOTW, 486c69427eSIlia Diachkov raw_pwrite_stream &OS) { 496c69427eSIlia Diachkov return std::make_unique<SPIRVObjectWriter>(std::move(MOTW), OS); 506c69427eSIlia Diachkov } 51