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