172062f5744557e270a38192554c3126ea5f97434Tim Northover// AArch64AsmPrinter.h - Print machine code to an AArch64 .s file -*- C++ -*-=// 272062f5744557e270a38192554c3126ea5f97434Tim Northover// 372062f5744557e270a38192554c3126ea5f97434Tim Northover// The LLVM Compiler Infrastructure 472062f5744557e270a38192554c3126ea5f97434Tim Northover// 572062f5744557e270a38192554c3126ea5f97434Tim Northover// This file is distributed under the University of Illinois Open Source 672062f5744557e270a38192554c3126ea5f97434Tim Northover// License. See LICENSE.TXT for details. 772062f5744557e270a38192554c3126ea5f97434Tim Northover// 872062f5744557e270a38192554c3126ea5f97434Tim Northover//===----------------------------------------------------------------------===// 972062f5744557e270a38192554c3126ea5f97434Tim Northover// 105bd6cb2dabf3fea9cb9fa0b275fbc7ceb85ba970Tim Northover// This file defines the AArch64 assembly printer class. 1172062f5744557e270a38192554c3126ea5f97434Tim Northover// 1272062f5744557e270a38192554c3126ea5f97434Tim Northover//===----------------------------------------------------------------------===// 1372062f5744557e270a38192554c3126ea5f97434Tim Northover 1472062f5744557e270a38192554c3126ea5f97434Tim Northover#ifndef LLVM_AARCH64ASMPRINTER_H 1572062f5744557e270a38192554c3126ea5f97434Tim Northover#define LLVM_AARCH64ASMPRINTER_H 1672062f5744557e270a38192554c3126ea5f97434Tim Northover 1772062f5744557e270a38192554c3126ea5f97434Tim Northover#include "AArch64.h" 1872062f5744557e270a38192554c3126ea5f97434Tim Northover#include "AArch64TargetMachine.h" 1972062f5744557e270a38192554c3126ea5f97434Tim Northover#include "llvm/CodeGen/AsmPrinter.h" 2072062f5744557e270a38192554c3126ea5f97434Tim Northover#include "llvm/MC/MCStreamer.h" 2172062f5744557e270a38192554c3126ea5f97434Tim Northover#include "llvm/Support/Compiler.h" 2272062f5744557e270a38192554c3126ea5f97434Tim Northover 2372062f5744557e270a38192554c3126ea5f97434Tim Northovernamespace llvm { 2472062f5744557e270a38192554c3126ea5f97434Tim Northover 2572062f5744557e270a38192554c3126ea5f97434Tim Northoverclass MCOperand; 2672062f5744557e270a38192554c3126ea5f97434Tim Northover 2772062f5744557e270a38192554c3126ea5f97434Tim Northoverclass LLVM_LIBRARY_VISIBILITY AArch64AsmPrinter : public AsmPrinter { 2872062f5744557e270a38192554c3126ea5f97434Tim Northover 2972062f5744557e270a38192554c3126ea5f97434Tim Northover /// Subtarget - Keep a pointer to the AArch64Subtarget around so that we can 3072062f5744557e270a38192554c3126ea5f97434Tim Northover /// make the right decision when printing asm code for different targets. 3172062f5744557e270a38192554c3126ea5f97434Tim Northover const AArch64Subtarget *Subtarget; 3272062f5744557e270a38192554c3126ea5f97434Tim Northover 3372062f5744557e270a38192554c3126ea5f97434Tim Northover // emitPseudoExpansionLowering - tblgen'erated. 3472062f5744557e270a38192554c3126ea5f97434Tim Northover bool emitPseudoExpansionLowering(MCStreamer &OutStreamer, 3572062f5744557e270a38192554c3126ea5f97434Tim Northover const MachineInstr *MI); 3672062f5744557e270a38192554c3126ea5f97434Tim Northover 3772062f5744557e270a38192554c3126ea5f97434Tim Northover public: 3872062f5744557e270a38192554c3126ea5f97434Tim Northover explicit AArch64AsmPrinter(TargetMachine &TM, MCStreamer &Streamer) 3972062f5744557e270a38192554c3126ea5f97434Tim Northover : AsmPrinter(TM, Streamer) { 4072062f5744557e270a38192554c3126ea5f97434Tim Northover Subtarget = &TM.getSubtarget<AArch64Subtarget>(); 4172062f5744557e270a38192554c3126ea5f97434Tim Northover } 4272062f5744557e270a38192554c3126ea5f97434Tim Northover 4372062f5744557e270a38192554c3126ea5f97434Tim Northover bool lowerOperand(const MachineOperand &MO, MCOperand &MCOp) const; 4472062f5744557e270a38192554c3126ea5f97434Tim Northover 4572062f5744557e270a38192554c3126ea5f97434Tim Northover MCOperand lowerSymbolOperand(const MachineOperand &MO, 4672062f5744557e270a38192554c3126ea5f97434Tim Northover const MCSymbol *Sym) const; 4772062f5744557e270a38192554c3126ea5f97434Tim Northover 4872062f5744557e270a38192554c3126ea5f97434Tim Northover void EmitInstruction(const MachineInstr *MI); 4972062f5744557e270a38192554c3126ea5f97434Tim Northover void EmitEndOfAsmFile(Module &M); 5072062f5744557e270a38192554c3126ea5f97434Tim Northover 5172062f5744557e270a38192554c3126ea5f97434Tim Northover bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNum, 5272062f5744557e270a38192554c3126ea5f97434Tim Northover unsigned AsmVariant, const char *ExtraCode, 5372062f5744557e270a38192554c3126ea5f97434Tim Northover raw_ostream &O); 5472062f5744557e270a38192554c3126ea5f97434Tim Northover bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNum, 5572062f5744557e270a38192554c3126ea5f97434Tim Northover unsigned AsmVariant, const char *ExtraCode, 5672062f5744557e270a38192554c3126ea5f97434Tim Northover raw_ostream &O); 5772062f5744557e270a38192554c3126ea5f97434Tim Northover 5872062f5744557e270a38192554c3126ea5f97434Tim Northover void PrintDebugValueComment(const MachineInstr *MI, raw_ostream &OS); 5972062f5744557e270a38192554c3126ea5f97434Tim Northover 6072062f5744557e270a38192554c3126ea5f97434Tim Northover /// printSymbolicAddress - Given some kind of reasonably bare symbolic 6172062f5744557e270a38192554c3126ea5f97434Tim Northover /// reference, print out the appropriate asm string to represent it. If 6272062f5744557e270a38192554c3126ea5f97434Tim Northover /// appropriate, a relocation-specifier will be produced, composed of a 6372062f5744557e270a38192554c3126ea5f97434Tim Northover /// general class derived from the MO parameter and an instruction-specific 6472062f5744557e270a38192554c3126ea5f97434Tim Northover /// suffix, provided in Suffix. E.g. ":got_lo12:" if a Suffix of "lo12" is 6572062f5744557e270a38192554c3126ea5f97434Tim Northover /// given. 6672062f5744557e270a38192554c3126ea5f97434Tim Northover bool printSymbolicAddress(const MachineOperand &MO, 6772062f5744557e270a38192554c3126ea5f97434Tim Northover bool PrintImmediatePrefix, 6872062f5744557e270a38192554c3126ea5f97434Tim Northover StringRef Suffix, raw_ostream &O); 6972062f5744557e270a38192554c3126ea5f97434Tim Northover 7072062f5744557e270a38192554c3126ea5f97434Tim Northover MachineLocation getDebugValueLocation(const MachineInstr *MI) const; 7172062f5744557e270a38192554c3126ea5f97434Tim Northover 7272062f5744557e270a38192554c3126ea5f97434Tim Northover virtual const char *getPassName() const { 7372062f5744557e270a38192554c3126ea5f97434Tim Northover return "AArch64 Assembly Printer"; 7472062f5744557e270a38192554c3126ea5f97434Tim Northover } 7572062f5744557e270a38192554c3126ea5f97434Tim Northover 7672062f5744557e270a38192554c3126ea5f97434Tim Northover virtual bool runOnMachineFunction(MachineFunction &MF); 7772062f5744557e270a38192554c3126ea5f97434Tim Northover}; 7872062f5744557e270a38192554c3126ea5f97434Tim Northover} // end namespace llvm 7972062f5744557e270a38192554c3126ea5f97434Tim Northover 8072062f5744557e270a38192554c3126ea5f97434Tim Northover#endif 81