xref: /llvm-project/llvm/lib/MC/SPIRVObjectWriter.cpp (revision ffcd7e98d93cda157b4ab9dddd0aa42f364db576)
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