Path: blob/main/contrib/llvm-project/llvm/lib/Target/MSP430/MSP430MCInstLower.cpp
35266 views
//===-- MSP430MCInstLower.cpp - Convert MSP430 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 MSP430 MachineInstrs to their corresponding9// MCInst records.10//11//===----------------------------------------------------------------------===//1213#include "MSP430MCInstLower.h"14#include "llvm/ADT/SmallString.h"15#include "llvm/CodeGen/AsmPrinter.h"16#include "llvm/CodeGen/MachineBasicBlock.h"17#include "llvm/CodeGen/MachineInstr.h"18#include "llvm/IR/DataLayout.h"19#include "llvm/IR/Mangler.h"20#include "llvm/MC/MCAsmInfo.h"21#include "llvm/MC/MCContext.h"22#include "llvm/MC/MCExpr.h"23#include "llvm/MC/MCInst.h"24#include "llvm/Support/ErrorHandling.h"25#include "llvm/Support/raw_ostream.h"26#include "llvm/Target/TargetMachine.h"27using namespace llvm;2829MCSymbol *MSP430MCInstLower::30GetGlobalAddressSymbol(const MachineOperand &MO) const {31switch (MO.getTargetFlags()) {32default: llvm_unreachable("Unknown target flag on GV operand");33case 0: break;34}3536return Printer.getSymbol(MO.getGlobal());37}3839MCSymbol *MSP430MCInstLower::40GetExternalSymbolSymbol(const MachineOperand &MO) const {41switch (MO.getTargetFlags()) {42default: llvm_unreachable("Unknown target flag on GV operand");43case 0: break;44}4546return Printer.GetExternalSymbolSymbol(MO.getSymbolName());47}4849MCSymbol *MSP430MCInstLower::50GetJumpTableSymbol(const MachineOperand &MO) const {51const DataLayout &DL = Printer.getDataLayout();52SmallString<256> Name;53raw_svector_ostream(Name) << DL.getPrivateGlobalPrefix() << "JTI"54<< Printer.getFunctionNumber() << '_'55<< MO.getIndex();5657switch (MO.getTargetFlags()) {58default: llvm_unreachable("Unknown target flag on GV operand");59case 0: break;60}6162// Create a symbol for the name.63return Ctx.getOrCreateSymbol(Name);64}6566MCSymbol *MSP430MCInstLower::67GetConstantPoolIndexSymbol(const MachineOperand &MO) const {68const DataLayout &DL = Printer.getDataLayout();69SmallString<256> Name;70raw_svector_ostream(Name) << DL.getPrivateGlobalPrefix() << "CPI"71<< Printer.getFunctionNumber() << '_'72<< MO.getIndex();7374switch (MO.getTargetFlags()) {75default: llvm_unreachable("Unknown target flag on GV operand");76case 0: break;77}7879// Create a symbol for the name.80return Ctx.getOrCreateSymbol(Name);81}8283MCSymbol *MSP430MCInstLower::84GetBlockAddressSymbol(const MachineOperand &MO) const {85switch (MO.getTargetFlags()) {86default: llvm_unreachable("Unknown target flag on GV operand");87case 0: break;88}8990return Printer.GetBlockAddressSymbol(MO.getBlockAddress());91}9293MCOperand MSP430MCInstLower::94LowerSymbolOperand(const MachineOperand &MO, MCSymbol *Sym) const {95// FIXME: We would like an efficient form for this, so we don't have to do a96// lot of extra uniquing.97const MCExpr *Expr = MCSymbolRefExpr::create(Sym, Ctx);9899switch (MO.getTargetFlags()) {100default: llvm_unreachable("Unknown target flag on GV operand");101case 0: break;102}103104if (!MO.isJTI() && MO.getOffset())105Expr = MCBinaryExpr::createAdd(Expr,106MCConstantExpr::create(MO.getOffset(), Ctx),107Ctx);108return MCOperand::createExpr(Expr);109}110111#define GET_REGINFO_ENUM112#include "MSP430GenRegisterInfo.inc"113114void MSP430MCInstLower::Lower(const MachineInstr *MI, MCInst &OutMI) const {115OutMI.setOpcode(MI->getOpcode());116117for (const MachineOperand &MO : MI->operands()) {118MCOperand MCOp;119switch (MO.getType()) {120default:121MI->print(errs());122llvm_unreachable("unknown operand type");123case MachineOperand::MO_Register:124// Ignore all implicit register operands.125if (MO.isImplicit()) continue;126MCOp = MCOperand::createReg(MO.getReg());127break;128case MachineOperand::MO_Immediate:129MCOp = MCOperand::createImm(MO.getImm());130break;131case MachineOperand::MO_MachineBasicBlock:132MCOp = MCOperand::createExpr(MCSymbolRefExpr::create(133MO.getMBB()->getSymbol(), Ctx));134break;135case MachineOperand::MO_GlobalAddress:136MCOp = LowerSymbolOperand(MO, GetGlobalAddressSymbol(MO));137break;138case MachineOperand::MO_ExternalSymbol:139MCOp = LowerSymbolOperand(MO, GetExternalSymbolSymbol(MO));140break;141case MachineOperand::MO_JumpTableIndex:142MCOp = LowerSymbolOperand(MO, GetJumpTableSymbol(MO));143break;144case MachineOperand::MO_ConstantPoolIndex:145MCOp = LowerSymbolOperand(MO, GetConstantPoolIndexSymbol(MO));146break;147case MachineOperand::MO_BlockAddress:148MCOp = LowerSymbolOperand(MO, GetBlockAddressSymbol(MO));149break;150case MachineOperand::MO_RegisterMask:151continue;152}153154OutMI.addOperand(MCOp);155}156}157158159