| //===-- M68kAsmPrinter.cpp - M68k LLVM Assembly Printer ---------*- C++ -*-===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| /// |
| /// \file |
| /// This file contains a printer that converts from our internal representation |
| /// of machine-dependent LLVM code to GAS-format M68k assembly language. |
| /// |
| //===----------------------------------------------------------------------===// |
| |
| // TODO Conform to Motorola ASM syntax |
| |
| #include "M68kAsmPrinter.h" |
| |
| #include "M68k.h" |
| #include "M68kMachineFunction.h" |
| #include "MCTargetDesc/M68kInstPrinter.h" |
| #include "TargetInfo/M68kTargetInfo.h" |
| |
| #include "llvm/MC/TargetRegistry.h" |
| |
| using namespace llvm; |
| |
| #define DEBUG_TYPE "m68k-asm-printer" |
| |
| bool M68kAsmPrinter::runOnMachineFunction(MachineFunction &MF) { |
| MMFI = MF.getInfo<M68kMachineFunctionInfo>(); |
| MCInstLowering = std::make_unique<M68kMCInstLower>(MF, *this); |
| AsmPrinter::runOnMachineFunction(MF); |
| return true; |
| } |
| |
| void M68kAsmPrinter::printOperand(const MachineInstr *MI, int OpNum, |
| raw_ostream &OS) { |
| const MachineOperand &MO = MI->getOperand(OpNum); |
| switch (MO.getType()) { |
| case MachineOperand::MO_Register: |
| OS << "%" << M68kInstPrinter::getRegisterName(MO.getReg()); |
| break; |
| case MachineOperand::MO_Immediate: |
| OS << '#' << MO.getImm(); |
| break; |
| case MachineOperand::MO_MachineBasicBlock: |
| MO.getMBB()->getSymbol()->print(OS, MAI); |
| break; |
| case MachineOperand::MO_GlobalAddress: |
| PrintSymbolOperand(MO, OS); |
| break; |
| case MachineOperand::MO_BlockAddress: |
| GetBlockAddressSymbol(MO.getBlockAddress())->print(OS, MAI); |
| break; |
| case MachineOperand::MO_ConstantPoolIndex: { |
| const DataLayout &DL = getDataLayout(); |
| OS << DL.getPrivateGlobalPrefix() << "CPI" << getFunctionNumber() << '_' |
| << MO.getIndex(); |
| break; |
| } |
| default: |
| llvm_unreachable("not implemented"); |
| } |
| } |
| |
| bool M68kAsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, |
| const char *ExtraCode, raw_ostream &OS) { |
| // Print the operand if there is no operand modifier. |
| if (!ExtraCode || !ExtraCode[0]) { |
| printOperand(MI, OpNo, OS); |
| return false; |
| } |
| |
| // Fallback to the default implementation. |
| return AsmPrinter::PrintAsmOperand(MI, OpNo, ExtraCode, OS); |
| } |
| |
| void M68kAsmPrinter::emitInstruction(const MachineInstr *MI) { |
| M68k_MC::verifyInstructionPredicates(MI->getOpcode(), |
| getSubtargetInfo().getFeatureBits()); |
| |
| switch (MI->getOpcode()) { |
| default: { |
| if (MI->isPseudo()) { |
| LLVM_DEBUG(dbgs() << "Pseudo opcode(" << MI->getOpcode() |
| << ") found in EmitInstruction()\n"); |
| llvm_unreachable("Cannot proceed"); |
| } |
| break; |
| } |
| case M68k::TAILJMPj: |
| case M68k::TAILJMPq: |
| // Lower these as normal, but add some comments. |
| OutStreamer->AddComment("TAILCALL"); |
| break; |
| } |
| |
| MCInst TmpInst0; |
| MCInstLowering->Lower(MI, TmpInst0); |
| OutStreamer->emitInstruction(TmpInst0, getSubtargetInfo()); |
| } |
| |
| void M68kAsmPrinter::emitFunctionBodyStart() {} |
| |
| void M68kAsmPrinter::emitFunctionBodyEnd() {} |
| |
| void M68kAsmPrinter::emitStartOfAsmFile(Module &M) { |
| OutStreamer->emitSyntaxDirective(); |
| } |
| |
| void M68kAsmPrinter::emitEndOfAsmFile(Module &M) {} |
| |
| extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeM68kAsmPrinter() { |
| RegisterAsmPrinter<M68kAsmPrinter> X(getTheM68kTarget()); |
| } |