6c69427e88
The patch adds SPIRV-specific MC layer implementation, SPIRV object file support and SPIRVInstPrinter. Differential Revision: https://reviews.llvm.org/D116462 Authors: Aleksandr Bezzubikov, Lewis Crawford, Ilia Diachkov, Michal Paszkowski, Andrey Tretyakov, Konrad Trifunovic Co-authored-by: Aleksandr Bezzubikov <zuban32s@gmail.com> Co-authored-by: Ilia Diachkov <iliya.diyachkov@intel.com> Co-authored-by: Michal Paszkowski <michal.paszkowski@outlook.com> Co-authored-by: Andrey Tretyakov <andrey1.tretyakov@intel.com> Co-authored-by: Konrad Trifunovic <konrad.trifunovic@intel.com>
46 lines
1.8 KiB
C++
46 lines
1.8 KiB
C++
//===- lib/MC/MCSPIRVStreamer.cpp - SPIR-V Object Output ------*- C++ -*---===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file assembles .s files and emits SPIR-V .o object files.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/MC/MCSPIRVStreamer.h"
|
|
#include "llvm/MC/MCAssembler.h"
|
|
#include "llvm/MC/TargetRegistry.h"
|
|
|
|
using namespace llvm;
|
|
|
|
void MCSPIRVStreamer::emitInstToData(const MCInst &Inst,
|
|
const MCSubtargetInfo &STI) {
|
|
MCAssembler &Assembler = getAssembler();
|
|
SmallVector<MCFixup, 0> Fixups;
|
|
SmallString<256> Code;
|
|
raw_svector_ostream VecOS(Code);
|
|
Assembler.getEmitter().encodeInstruction(Inst, VecOS, Fixups, STI);
|
|
|
|
// Append the encoded instruction to the current data fragment (or create a
|
|
// new such fragment if the current fragment is not a data fragment).
|
|
MCDataFragment *DF = getOrCreateDataFragment();
|
|
|
|
DF->setHasInstructions(STI);
|
|
DF->getContents().append(Code.begin(), Code.end());
|
|
}
|
|
|
|
MCStreamer *llvm::createSPIRVStreamer(MCContext &Context,
|
|
std::unique_ptr<MCAsmBackend> &&MAB,
|
|
std::unique_ptr<MCObjectWriter> &&OW,
|
|
std::unique_ptr<MCCodeEmitter> &&CE,
|
|
bool RelaxAll) {
|
|
MCSPIRVStreamer *S = new MCSPIRVStreamer(Context, std::move(MAB),
|
|
std::move(OW), std::move(CE));
|
|
if (RelaxAll)
|
|
S->getAssembler().setRelaxAll(true);
|
|
return S;
|
|
}
|