1 | //===- lib/MC/MCSPIRVStreamer.cpp - SPIR-V Object Output ------*- 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 | // |
9 | // This file assembles .s files and emits SPIR-V .o object files. |
10 | // |
11 | //===----------------------------------------------------------------------===// |
12 | |
13 | #include "llvm/MC/MCSPIRVStreamer.h" |
14 | #include "llvm/MC/MCAssembler.h" |
15 | #include "llvm/MC/TargetRegistry.h" |
16 | |
17 | using namespace llvm; |
18 | |
19 | void MCSPIRVStreamer::emitInstToData(const MCInst &Inst, |
20 | const MCSubtargetInfo &STI) { |
21 | MCAssembler &Assembler = getAssembler(); |
22 | SmallVector<MCFixup, 0> Fixups; |
23 | SmallString<256> Code; |
24 | Assembler.getEmitter().encodeInstruction(Inst, CB&: Code, Fixups, STI); |
25 | |
26 | // Append the encoded instruction to the current data fragment (or create a |
27 | // new such fragment if the current fragment is not a data fragment). |
28 | MCDataFragment *DF = getOrCreateDataFragment(); |
29 | |
30 | DF->setHasInstructions(STI); |
31 | DF->getContents().append(in_start: Code.begin(), in_end: Code.end()); |
32 | } |
33 | |
34 | MCStreamer *llvm::createSPIRVStreamer(MCContext &Context, |
35 | std::unique_ptr<MCAsmBackend> &&MAB, |
36 | std::unique_ptr<MCObjectWriter> &&OW, |
37 | std::unique_ptr<MCCodeEmitter> &&CE) { |
38 | MCSPIRVStreamer *S = new MCSPIRVStreamer(Context, std::move(MAB), |
39 | std::move(OW), std::move(CE)); |
40 | return S; |
41 | } |
42 | |