xref: /freebsd-src/contrib/llvm-project/llvm/lib/MC/SPIRVObjectWriter.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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