mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-23 21:13:02 +02:00
2903b8e615
This is enough to compile and link but doesn't yet do anything particularly useful. Once an ASM parser and printer are added in the next two patches, the whole thing can be usefully tested. Differential Revision: https://reviews.llvm.org/D23562 llvm-svn: 285770
92 lines
3.0 KiB
C++
92 lines
3.0 KiB
C++
//===-- RISCVAsmBackend.cpp - RISCV Assembler Backend ---------------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "MCTargetDesc/RISCVMCTargetDesc.h"
|
|
#include "llvm/MC/MCAsmBackend.h"
|
|
#include "llvm/MC/MCAssembler.h"
|
|
#include "llvm/MC/MCDirectives.h"
|
|
#include "llvm/MC/MCELFObjectWriter.h"
|
|
#include "llvm/MC/MCFixupKindInfo.h"
|
|
#include "llvm/MC/MCObjectWriter.h"
|
|
#include "llvm/MC/MCSubtargetInfo.h"
|
|
#include "llvm/MC/MCExpr.h"
|
|
#include "llvm/MC/MCSymbol.h"
|
|
#include "llvm/Support/ErrorHandling.h"
|
|
#include "llvm/Support/raw_ostream.h"
|
|
|
|
using namespace llvm;
|
|
|
|
namespace {
|
|
class RISCVAsmBackend : public MCAsmBackend {
|
|
uint8_t OSABI;
|
|
bool Is64Bit;
|
|
|
|
public:
|
|
RISCVAsmBackend(uint8_t OSABI, bool Is64Bit)
|
|
: MCAsmBackend(), OSABI(OSABI), Is64Bit(Is64Bit) {}
|
|
~RISCVAsmBackend() override {}
|
|
|
|
void applyFixup(const MCFixup &Fixup, char *Data, unsigned DataSize,
|
|
uint64_t Value, bool IsPCRel) const override;
|
|
|
|
MCObjectWriter *createObjectWriter(raw_pwrite_stream &OS) const override;
|
|
|
|
bool fixupNeedsRelaxation(const MCFixup &Fixup, uint64_t Value,
|
|
const MCRelaxableFragment *DF,
|
|
const MCAsmLayout &Layout) const override {
|
|
return false;
|
|
}
|
|
|
|
unsigned getNumFixupKinds() const override { return 1; }
|
|
|
|
bool mayNeedRelaxation(const MCInst &Inst) const override { return false; }
|
|
|
|
void relaxInstruction(const MCInst &Inst, const MCSubtargetInfo &STI,
|
|
MCInst &Res) const override {
|
|
|
|
llvm_unreachable("RISCVAsmBackend::relaxInstruction() unimplemented");
|
|
}
|
|
|
|
bool writeNopData(uint64_t Count, MCObjectWriter *OW) const override;
|
|
};
|
|
|
|
bool RISCVAsmBackend::writeNopData(uint64_t Count, MCObjectWriter *OW) const {
|
|
// Once support for the compressed instruction set is added, we will be able
|
|
// to conditionally support 16-bit NOPs
|
|
if ((Count % 4) != 0)
|
|
return false;
|
|
|
|
// The canonical nop on RISC-V is addi x0, x0, 0
|
|
for (uint64_t i = 0; i < Count; i += 4)
|
|
OW->write32(0x13);
|
|
|
|
return true;
|
|
}
|
|
|
|
void RISCVAsmBackend::applyFixup(const MCFixup &Fixup, char *Data,
|
|
unsigned DataSize, uint64_t Value,
|
|
bool IsPCRel) const {
|
|
return;
|
|
}
|
|
|
|
MCObjectWriter *
|
|
RISCVAsmBackend::createObjectWriter(raw_pwrite_stream &OS) const {
|
|
return createRISCVELFObjectWriter(OS, OSABI, Is64Bit);
|
|
}
|
|
|
|
} // end anonymous namespace
|
|
|
|
MCAsmBackend *llvm::createRISCVAsmBackend(const Target &T,
|
|
const MCRegisterInfo &MRI,
|
|
const Triple &TT, StringRef CPU,
|
|
const MCTargetOptions &Options) {
|
|
uint8_t OSABI = MCELFObjectTargetWriter::getOSABI(TT.getOS());
|
|
return new RISCVAsmBackend(OSABI, TT.isArch64Bit());
|
|
}
|