133 lines
4.5 KiB
C++
133 lines
4.5 KiB
C++
#include "MCTargetDesc/FootMCTargetDesc.h"
|
|
#include "TargetInfo/FootTargetInfo.h"
|
|
#include "llvm/BinaryFormat/ELF.h"
|
|
#include "llvm/CodeGen/AsmPrinter.h"
|
|
#include "llvm/CodeGen/MachineConstantPool.h"
|
|
#include "llvm/IR/Constants.h"
|
|
#include "llvm/MC/MCContext.h"
|
|
#include "llvm/MC/MCInst.h"
|
|
#include "llvm/MC/MCStreamer.h"
|
|
#include "llvm/MC/MCSubtargetInfo.h"
|
|
#include "llvm/MC/TargetRegistry.h"
|
|
#include "llvm/Target/TargetLoweringObjectFile.h"
|
|
#include "llvm/Target/TargetMachine.h"
|
|
|
|
using namespace llvm;
|
|
|
|
namespace {
|
|
|
|
class FootAsmPrinter : public AsmPrinter {
|
|
public:
|
|
explicit FootAsmPrinter(TargetMachine &TM,
|
|
std::unique_ptr<MCStreamer> Streamer) :
|
|
AsmPrinter(TM, std::move(Streamer)) {}
|
|
|
|
MCInst machineInstrToMCInst(const MachineInstr &MI);
|
|
bool lowerOperand(const MachineOperand &MO, MCOperand &MCO);
|
|
|
|
void emitInstruction(const MachineInstr *MI) override;
|
|
|
|
StringRef getPassName() const override { return "FootAsmPrinter"; }
|
|
};
|
|
|
|
} // namespace
|
|
|
|
bool FootAsmPrinter::lowerOperand(const MachineOperand &MO, MCOperand &MCO) {
|
|
switch (MO.getType()) {
|
|
case MachineOperand::MO_Register:
|
|
MCO = MCOperand::createReg(MO.getReg());
|
|
break;
|
|
case MachineOperand::MO_Immediate:
|
|
MCO = MCOperand::createImm(MO.getImm());
|
|
break;
|
|
case MachineOperand::MO_CImmediate:
|
|
llvm_unreachable("cimm not yet implemented");
|
|
case MachineOperand::MO_FPImmediate:
|
|
llvm_unreachable("fpimm not yet implemented");
|
|
case MachineOperand::MO_MachineBasicBlock: {
|
|
MachineBasicBlock *MBB = MO.getMBB();
|
|
MBB->setLabelMustBeEmitted();
|
|
MCSymbol *Label = MBB->getSymbol();
|
|
MCO = MCOperand::createExpr(MCSymbolRefExpr::create(Label, OutContext));
|
|
break;
|
|
}
|
|
case MachineOperand::MO_FrameIndex:
|
|
llvm_unreachable("frame index not yet implemented");
|
|
case MachineOperand::MO_ConstantPoolIndex: {
|
|
unsigned Index = MO.getIndex();
|
|
MCSymbol *Sym = GetCPISymbol(Index);
|
|
const MCExpr *Expr = MCSymbolRefExpr::create(Sym, OutContext);
|
|
MCO = MCOperand::createExpr(Expr);
|
|
break;
|
|
}
|
|
case MachineOperand::MO_TargetIndex:
|
|
llvm_unreachable("target index not yet implemented");
|
|
case MachineOperand::MO_JumpTableIndex:
|
|
llvm_unreachable("jump table index not yet implemented");
|
|
case MachineOperand::MO_ExternalSymbol: {
|
|
StringRef Name = MO.getSymbolName();
|
|
MCSymbol *Sym = OutContext.getOrCreateSymbol(Name);
|
|
const MCExpr *Expr = MCSymbolRefExpr::create(Sym, OutContext);
|
|
MCO = MCOperand::createExpr(Expr);
|
|
break;
|
|
}
|
|
case MachineOperand::MO_GlobalAddress: {
|
|
const GlobalValue *GV = MO.getGlobal();
|
|
MCSymbol *Sym = getSymbol(GV);
|
|
const MCExpr *Expr = MCSymbolRefExpr::create(Sym, OutContext);
|
|
MCO = MCOperand::createExpr(Expr);
|
|
break;
|
|
}
|
|
case MachineOperand::MO_BlockAddress: {
|
|
MCSymbol *Sym = GetBlockAddressSymbol(MO.getBlockAddress());
|
|
const MCExpr *Expr = MCSymbolRefExpr::create(Sym, OutContext);
|
|
MCO = MCOperand::createExpr(Expr);
|
|
break;
|
|
}
|
|
case MachineOperand::MO_RegisterMask:
|
|
return false;
|
|
case MachineOperand::MO_RegisterLiveOut:
|
|
llvm_unreachable("register live out not yet implemented");
|
|
case MachineOperand::MO_Metadata:
|
|
llvm_unreachable("metadata not yet implemented");
|
|
case MachineOperand::MO_MCSymbol:
|
|
llvm_unreachable("mc symbol not yet implemented");
|
|
case MachineOperand::MO_CFIIndex:
|
|
llvm_unreachable("cfi index not yet implemented");
|
|
case MachineOperand::MO_IntrinsicID:
|
|
llvm_unreachable("intrinsic id not yet implemented");
|
|
case MachineOperand::MO_Predicate:
|
|
llvm_unreachable("predicate not yet implemented");
|
|
case MachineOperand::MO_ShuffleMask:
|
|
llvm_unreachable("shuffle mask not yet implemented");
|
|
case MachineOperand::MO_DbgInstrRef:
|
|
llvm_unreachable("debug instr ref not yet implemented");
|
|
}
|
|
return true;
|
|
}
|
|
|
|
MCInst FootAsmPrinter::machineInstrToMCInst(const MachineInstr &MI) {
|
|
MCInst TmpInst;
|
|
TmpInst.setOpcode(MI.getOpcode());
|
|
|
|
for (const MachineOperand &MO : MI.operands()) {
|
|
MCOperand MCOp;
|
|
if (lowerOperand(MO, MCOp)) {
|
|
TmpInst.addOperand(MCOp);
|
|
}
|
|
}
|
|
|
|
return TmpInst;
|
|
}
|
|
|
|
void FootAsmPrinter::emitInstruction(const MachineInstr *MI) {
|
|
Foot_MC::verifyInstructionPredicates(MI->getOpcode(), getSubtargetInfo().getFeatureBits());
|
|
|
|
MCInst TmpInst = machineInstrToMCInst(*MI);
|
|
EmitToStreamer(*OutStreamer, TmpInst);
|
|
}
|
|
|
|
extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeFootAsmPrinter() {
|
|
RegisterAsmPrinter<FootAsmPrinter> Tmp(getTheFootTarget());
|
|
}
|