Path: blob/main/contrib/llvm-project/llvm/lib/Target/Lanai/LanaiMCInstLower.cpp
35271 views
//=-- LanaiMCInstLower.cpp - Convert Lanai MachineInstr to an MCInst --------=//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// This file contains code to lower Lanai MachineInstrs to their corresponding9// MCInst records.10//11//===----------------------------------------------------------------------===//1213#include "LanaiMCInstLower.h"1415#include "MCTargetDesc/LanaiBaseInfo.h"16#include "MCTargetDesc/LanaiMCExpr.h"17#include "llvm/ADT/SmallString.h"18#include "llvm/CodeGen/AsmPrinter.h"19#include "llvm/CodeGen/MachineBasicBlock.h"20#include "llvm/CodeGen/MachineInstr.h"21#include "llvm/IR/Constants.h"22#include "llvm/MC/MCAsmInfo.h"23#include "llvm/MC/MCContext.h"24#include "llvm/MC/MCExpr.h"25#include "llvm/MC/MCInst.h"26#include "llvm/Support/ErrorHandling.h"27#include "llvm/Support/raw_ostream.h"2829using namespace llvm;3031MCSymbol *32LanaiMCInstLower::GetGlobalAddressSymbol(const MachineOperand &MO) const {33return Printer.getSymbol(MO.getGlobal());34}3536MCSymbol *37LanaiMCInstLower::GetBlockAddressSymbol(const MachineOperand &MO) const {38return Printer.GetBlockAddressSymbol(MO.getBlockAddress());39}4041MCSymbol *42LanaiMCInstLower::GetExternalSymbolSymbol(const MachineOperand &MO) const {43return Printer.GetExternalSymbolSymbol(MO.getSymbolName());44}4546MCSymbol *LanaiMCInstLower::GetJumpTableSymbol(const MachineOperand &MO) const {47SmallString<256> Name;48raw_svector_ostream(Name) << Printer.MAI->getPrivateGlobalPrefix() << "JTI"49<< Printer.getFunctionNumber() << '_'50<< MO.getIndex();51// Create a symbol for the name.52return Ctx.getOrCreateSymbol(Name.str());53}5455MCSymbol *56LanaiMCInstLower::GetConstantPoolIndexSymbol(const MachineOperand &MO) const {57SmallString<256> Name;58raw_svector_ostream(Name) << Printer.MAI->getPrivateGlobalPrefix() << "CPI"59<< Printer.getFunctionNumber() << '_'60<< MO.getIndex();61// Create a symbol for the name.62return Ctx.getOrCreateSymbol(Name.str());63}6465MCOperand LanaiMCInstLower::LowerSymbolOperand(const MachineOperand &MO,66MCSymbol *Sym) const {67LanaiMCExpr::VariantKind Kind;6869switch (MO.getTargetFlags()) {70case LanaiII::MO_NO_FLAG:71Kind = LanaiMCExpr::VK_Lanai_None;72break;73case LanaiII::MO_ABS_HI:74Kind = LanaiMCExpr::VK_Lanai_ABS_HI;75break;76case LanaiII::MO_ABS_LO:77Kind = LanaiMCExpr::VK_Lanai_ABS_LO;78break;79default:80llvm_unreachable("Unknown target flag on GV operand");81}8283const MCExpr *Expr =84MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_None, Ctx);85if (!MO.isJTI() && MO.getOffset())86Expr = MCBinaryExpr::createAdd(87Expr, MCConstantExpr::create(MO.getOffset(), Ctx), Ctx);88Expr = LanaiMCExpr::create(Kind, Expr, Ctx);89return MCOperand::createExpr(Expr);90}9192void LanaiMCInstLower::Lower(const MachineInstr *MI, MCInst &OutMI) const {93OutMI.setOpcode(MI->getOpcode());9495for (const MachineOperand &MO : MI->operands()) {96MCOperand MCOp;97switch (MO.getType()) {98case MachineOperand::MO_Register:99// Ignore all implicit register operands.100if (MO.isImplicit())101continue;102MCOp = MCOperand::createReg(MO.getReg());103break;104case MachineOperand::MO_Immediate:105MCOp = MCOperand::createImm(MO.getImm());106break;107case MachineOperand::MO_MachineBasicBlock:108MCOp = MCOperand::createExpr(109MCSymbolRefExpr::create(MO.getMBB()->getSymbol(), Ctx));110break;111case MachineOperand::MO_RegisterMask:112continue;113case MachineOperand::MO_GlobalAddress:114MCOp = LowerSymbolOperand(MO, GetGlobalAddressSymbol(MO));115break;116case MachineOperand::MO_BlockAddress:117MCOp = LowerSymbolOperand(MO, GetBlockAddressSymbol(MO));118break;119case MachineOperand::MO_ExternalSymbol:120MCOp = LowerSymbolOperand(MO, GetExternalSymbolSymbol(MO));121break;122case MachineOperand::MO_JumpTableIndex:123MCOp = LowerSymbolOperand(MO, GetJumpTableSymbol(MO));124break;125case MachineOperand::MO_ConstantPoolIndex:126MCOp = LowerSymbolOperand(MO, GetConstantPoolIndexSymbol(MO));127break;128default:129MI->print(errs());130llvm_unreachable("unknown operand type");131}132133OutMI.addOperand(MCOp);134}135}136137138