llvm-project/llvm/lib/Target/Foot/FootAsmPrinter.cpp
2025-10-25 22:30:05 -04:00

128 lines
4.3 KiB
C++

#include "MCTargetDesc/FootMCTargetDesc.h"
#include "TargetInfo/FootTargetInfo.h"
#include "llvm/BinaryFormat/ELF.h"
#include "llvm/CodeGen/AsmPrinter.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/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;
};
} // 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: {
const MachineBasicBlock *MBB = MO.getMBB();
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());
}