SPIRVObjectWriter.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. //===- llvm/MC/MCSPIRVObjectWriter.cpp - SPIR-V Object Writer ----*- C++ *-===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. #include "llvm/MC/MCAssembler.h"
  9. #include "llvm/MC/MCSPIRVObjectWriter.h"
  10. #include "llvm/MC/MCSection.h"
  11. #include "llvm/MC/MCValue.h"
  12. #include "llvm/Support/EndianStream.h"
  13. using namespace llvm;
  14. namespace {
  15. class SPIRVObjectWriter : public MCObjectWriter {
  16. ::support::endian::Writer W;
  17. /// The target specific SPIR-V writer instance.
  18. std::unique_ptr<MCSPIRVObjectTargetWriter> TargetObjectWriter;
  19. public:
  20. SPIRVObjectWriter(std::unique_ptr<MCSPIRVObjectTargetWriter> MOTW,
  21. raw_pwrite_stream &OS)
  22. : W(OS, support::little), TargetObjectWriter(std::move(MOTW)) {}
  23. ~SPIRVObjectWriter() override {}
  24. private:
  25. void recordRelocation(MCAssembler &Asm, const MCAsmLayout &Layout,
  26. const MCFragment *Fragment, const MCFixup &Fixup,
  27. MCValue Target, uint64_t &FixedValue) override {}
  28. void executePostLayoutBinding(MCAssembler &Asm,
  29. const MCAsmLayout &Layout) override {}
  30. uint64_t writeObject(MCAssembler &Asm, const MCAsmLayout &Layout) override;
  31. void writeHeader(const MCAssembler &Asm);
  32. };
  33. } // namespace
  34. void SPIRVObjectWriter::writeHeader(const MCAssembler &Asm) {
  35. constexpr uint32_t MagicNumber = 0x07230203;
  36. // TODO: set the version on a min-necessary basis (just like the translator
  37. // does) requires some refactoring of MCAssembler::VersionInfoType.
  38. constexpr uint32_t Major = 1;
  39. constexpr uint32_t Minor = 0;
  40. constexpr uint32_t VersionNumber = 0 | (Major << 16) | (Minor << 8);
  41. // TODO: check if we could use anything other than 0 (spec allows).
  42. constexpr uint32_t GeneratorMagicNumber = 0;
  43. // TODO: do not hardcode this as well.
  44. constexpr uint32_t Bound = 900;
  45. constexpr uint32_t Schema = 0;
  46. W.write<uint32_t>(MagicNumber);
  47. W.write<uint32_t>(VersionNumber);
  48. W.write<uint32_t>(GeneratorMagicNumber);
  49. W.write<uint32_t>(Bound);
  50. W.write<uint32_t>(Schema);
  51. }
  52. uint64_t SPIRVObjectWriter::writeObject(MCAssembler &Asm,
  53. const MCAsmLayout &Layout) {
  54. uint64_t StartOffset = W.OS.tell();
  55. writeHeader(Asm);
  56. for (const MCSection &S : Asm)
  57. Asm.writeSectionData(W.OS, &S, Layout);
  58. return W.OS.tell() - StartOffset;
  59. }
  60. std::unique_ptr<MCObjectWriter>
  61. llvm::createSPIRVObjectWriter(std::unique_ptr<MCSPIRVObjectTargetWriter> MOTW,
  62. raw_pwrite_stream &OS) {
  63. return std::make_unique<SPIRVObjectWriter>(std::move(MOTW), OS);
  64. }