[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / lib / Target / M68k / M68kAsmPrinter.cpp
bloba6fc58b5a277c27b4f08781f0abbdc811fe7a782
1 //===----- M68kAsmPrinter.cpp - M68k LLVM Assembly Printer -----*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 ///
9 /// \file
10 /// This file contains a printer that converts from our internal representation
11 /// of machine-dependent LLVM code to GAS-format M68k assembly language.
12 ///
13 //===----------------------------------------------------------------------===//
15 // TODO Conform to Motorola ASM syntax
17 #include "M68kAsmPrinter.h"
19 #include "M68k.h"
20 #include "M68kMachineFunction.h"
21 #include "MCTargetDesc/M68kInstPrinter.h"
22 #include "TargetInfo/M68kTargetInfo.h"
24 #include "llvm/Support/TargetRegistry.h"
26 using namespace llvm;
28 #define DEBUG_TYPE "m68k-asm-printer"
30 bool M68kAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
31 MMFI = MF.getInfo<M68kMachineFunctionInfo>();
32 MCInstLowering = std::make_unique<M68kMCInstLower>(MF, *this);
33 AsmPrinter::runOnMachineFunction(MF);
34 return true;
37 void M68kAsmPrinter::printOperand(const MachineInstr *MI, int OpNum,
38 raw_ostream &OS) {
39 const MachineOperand &MO = MI->getOperand(OpNum);
40 switch (MO.getType()) {
41 case MachineOperand::MO_Register:
42 OS << "%" << M68kInstPrinter::getRegisterName(MO.getReg());
43 break;
44 case MachineOperand::MO_Immediate:
45 OS << '#' << MO.getImm();
46 break;
47 case MachineOperand::MO_MachineBasicBlock:
48 MO.getMBB()->getSymbol()->print(OS, MAI);
49 break;
50 case MachineOperand::MO_GlobalAddress:
51 PrintSymbolOperand(MO, OS);
52 break;
53 case MachineOperand::MO_BlockAddress:
54 GetBlockAddressSymbol(MO.getBlockAddress())->print(OS, MAI);
55 break;
56 case MachineOperand::MO_ConstantPoolIndex: {
57 const DataLayout &DL = getDataLayout();
58 OS << DL.getPrivateGlobalPrefix() << "CPI" << getFunctionNumber() << '_'
59 << MO.getIndex();
60 break;
62 default:
63 llvm_unreachable("not implemented");
67 bool M68kAsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
68 const char *ExtraCode, raw_ostream &OS) {
69 // Print the operand if there is no operand modifier.
70 if (!ExtraCode || !ExtraCode[0]) {
71 printOperand(MI, OpNo, OS);
72 return false;
75 // Fallback to the default implementation.
76 return AsmPrinter::PrintAsmOperand(MI, OpNo, ExtraCode, OS);
79 void M68kAsmPrinter::emitInstruction(const MachineInstr *MI) {
80 switch (MI->getOpcode()) {
81 default: {
82 if (MI->isPseudo()) {
83 LLVM_DEBUG(dbgs() << "Pseudo opcode(" << MI->getOpcode()
84 << ") found in EmitInstruction()\n");
85 llvm_unreachable("Cannot proceed");
87 break;
89 case M68k::TAILJMPj:
90 case M68k::TAILJMPq:
91 // Lower these as normal, but add some comments.
92 OutStreamer->AddComment("TAILCALL");
93 break;
96 MCInst TmpInst0;
97 MCInstLowering->Lower(MI, TmpInst0);
98 OutStreamer->emitInstruction(TmpInst0, getSubtargetInfo());
101 void M68kAsmPrinter::emitFunctionBodyStart() {}
103 void M68kAsmPrinter::emitFunctionBodyEnd() {}
105 void M68kAsmPrinter::emitStartOfAsmFile(Module &M) {
106 OutStreamer->emitSyntaxDirective();
109 void M68kAsmPrinter::emitEndOfAsmFile(Module &M) {}
111 extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeM68kAsmPrinter() {
112 RegisterAsmPrinter<M68kAsmPrinter> X(getTheM68kTarget());