181ad6265SDimitry Andric //===- llvm/MC/MCSPIRVObjectWriter.cpp - SPIR-V Object Writer ----*- C++ *-===// 281ad6265SDimitry Andric // 381ad6265SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 481ad6265SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 581ad6265SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 681ad6265SDimitry Andric // 781ad6265SDimitry Andric //===----------------------------------------------------------------------===// 881ad6265SDimitry Andric 981ad6265SDimitry Andric #include "llvm/MC/MCAssembler.h" 1081ad6265SDimitry Andric #include "llvm/MC/MCSPIRVObjectWriter.h" 1181ad6265SDimitry Andric #include "llvm/MC/MCSection.h" 1281ad6265SDimitry Andric #include "llvm/MC/MCValue.h" 1381ad6265SDimitry Andric #include "llvm/Support/EndianStream.h" 1481ad6265SDimitry Andric 1581ad6265SDimitry Andric using namespace llvm; 1681ad6265SDimitry Andric 1781ad6265SDimitry Andric void SPIRVObjectWriter::writeHeader(const MCAssembler &Asm) { 1881ad6265SDimitry Andric constexpr uint32_t MagicNumber = 0x07230203; 19*0fca6ea1SDimitry Andric constexpr uint32_t GeneratorID = 43; 20*0fca6ea1SDimitry Andric constexpr uint32_t GeneratorMagicNumber = 21*0fca6ea1SDimitry Andric (GeneratorID << 16) | (LLVM_VERSION_MAJOR); 2281ad6265SDimitry Andric constexpr uint32_t Schema = 0; 2381ad6265SDimitry Andric 2481ad6265SDimitry Andric W.write<uint32_t>(MagicNumber); 25*0fca6ea1SDimitry Andric W.write<uint32_t>((VersionInfo.Major << 16) | (VersionInfo.Minor << 8)); 2681ad6265SDimitry Andric W.write<uint32_t>(GeneratorMagicNumber); 27*0fca6ea1SDimitry Andric W.write<uint32_t>(VersionInfo.Bound); 2881ad6265SDimitry Andric W.write<uint32_t>(Schema); 2981ad6265SDimitry Andric } 3081ad6265SDimitry Andric 31*0fca6ea1SDimitry Andric void SPIRVObjectWriter::setBuildVersion(unsigned Major, unsigned Minor, 32*0fca6ea1SDimitry Andric unsigned Bound) { 33*0fca6ea1SDimitry Andric VersionInfo.Major = Major; 34*0fca6ea1SDimitry Andric VersionInfo.Minor = Minor; 35*0fca6ea1SDimitry Andric VersionInfo.Bound = Bound; 36*0fca6ea1SDimitry Andric } 37*0fca6ea1SDimitry Andric 38*0fca6ea1SDimitry Andric uint64_t SPIRVObjectWriter::writeObject(MCAssembler &Asm) { 3981ad6265SDimitry Andric uint64_t StartOffset = W.OS.tell(); 4081ad6265SDimitry Andric writeHeader(Asm); 4181ad6265SDimitry Andric for (const MCSection &S : Asm) 42*0fca6ea1SDimitry Andric Asm.writeSectionData(W.OS, &S); 4381ad6265SDimitry Andric return W.OS.tell() - StartOffset; 4481ad6265SDimitry Andric } 4581ad6265SDimitry Andric 4681ad6265SDimitry Andric std::unique_ptr<MCObjectWriter> 4781ad6265SDimitry Andric llvm::createSPIRVObjectWriter(std::unique_ptr<MCSPIRVObjectTargetWriter> MOTW, 4881ad6265SDimitry Andric raw_pwrite_stream &OS) { 4981ad6265SDimitry Andric return std::make_unique<SPIRVObjectWriter>(std::move(MOTW), OS); 5081ad6265SDimitry Andric } 51