1252723Sdim//===-- X86AsmPrinter.h - X86 implementation of AsmPrinter ------*- C++ -*-===// 2212793Sdim// 3212793Sdim// The LLVM Compiler Infrastructure 4212793Sdim// 5212793Sdim// This file is distributed under the University of Illinois Open Source 6212793Sdim// License. See LICENSE.TXT for details. 7212793Sdim// 8212793Sdim//===----------------------------------------------------------------------===// 9212793Sdim 10212793Sdim#ifndef X86ASMPRINTER_H 11212793Sdim#define X86ASMPRINTER_H 12212793Sdim 13212793Sdim#include "X86.h" 14212793Sdim#include "X86MachineFunctionInfo.h" 15212793Sdim#include "X86TargetMachine.h" 16212793Sdim#include "llvm/CodeGen/AsmPrinter.h" 17212793Sdim#include "llvm/CodeGen/MachineModuleInfo.h" 18212793Sdim#include "llvm/CodeGen/ValueTypes.h" 19263509Sdim#include "llvm/CodeGen/StackMaps.h" 20212793Sdim#include "llvm/Support/Compiler.h" 21212793Sdim 22212793Sdimnamespace llvm { 23212793Sdim 24212793Sdimclass MCStreamer; 25212793Sdim 26212793Sdimclass LLVM_LIBRARY_VISIBILITY X86AsmPrinter : public AsmPrinter { 27212793Sdim const X86Subtarget *Subtarget; 28263509Sdim StackMaps SM; 29263509Sdim 30263509Sdim // Parses operands of PATCHPOINT and STACKMAP to produce stack map Location 31263509Sdim // structures. Returns a result location and an iterator to the operand 32263509Sdim // immediately following the operands consumed. 33263509Sdim // 34263509Sdim // This method is implemented in X86MCInstLower.cpp. 35263509Sdim static std::pair<StackMaps::Location, MachineInstr::const_mop_iterator> 36263509Sdim stackmapOperandParser(MachineInstr::const_mop_iterator MOI, 37263509Sdim MachineInstr::const_mop_iterator MOE, 38263509Sdim const TargetMachine &TM); 39263509Sdim 40212793Sdim public: 41212793Sdim explicit X86AsmPrinter(TargetMachine &TM, MCStreamer &Streamer) 42263509Sdim : AsmPrinter(TM, Streamer), SM(*this, stackmapOperandParser) { 43212793Sdim Subtarget = &TM.getSubtarget<X86Subtarget>(); 44212793Sdim } 45212793Sdim 46245431Sdim virtual const char *getPassName() const LLVM_OVERRIDE { 47252723Sdim return "X86 Assembly / Object Emitter"; 48212793Sdim } 49245431Sdim 50212793Sdim const X86Subtarget &getSubtarget() const { return *Subtarget; } 51212793Sdim 52245431Sdim virtual void EmitStartOfAsmFile(Module &M) LLVM_OVERRIDE; 53212793Sdim 54245431Sdim virtual void EmitEndOfAsmFile(Module &M) LLVM_OVERRIDE; 55245431Sdim 56245431Sdim virtual void EmitInstruction(const MachineInstr *MI) LLVM_OVERRIDE; 57245431Sdim 58212793Sdim void printSymbolOperand(const MachineOperand &MO, raw_ostream &O); 59212793Sdim 60212793Sdim // These methods are used by the tablegen'erated instruction printer. 61212793Sdim void printOperand(const MachineInstr *MI, unsigned OpNo, raw_ostream &O, 62245431Sdim const char *Modifier = 0, unsigned AsmVariant = 0); 63245431Sdim void printPCRelImm(const MachineInstr *MI, unsigned OpNo, raw_ostream &O); 64212793Sdim 65212793Sdim bool printAsmMRegister(const MachineOperand &MO, char Mode, raw_ostream &O); 66245431Sdim virtual bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, 67245431Sdim unsigned AsmVariant, const char *ExtraCode, 68245431Sdim raw_ostream &OS) LLVM_OVERRIDE; 69245431Sdim virtual bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo, 70245431Sdim unsigned AsmVariant, const char *ExtraCode, 71245431Sdim raw_ostream &OS) LLVM_OVERRIDE; 72212793Sdim 73212793Sdim void printMemReference(const MachineInstr *MI, unsigned Op, raw_ostream &O, 74212793Sdim const char *Modifier=NULL); 75212793Sdim void printLeaMemReference(const MachineInstr *MI, unsigned Op, raw_ostream &O, 76212793Sdim const char *Modifier=NULL); 77212793Sdim 78245431Sdim void printIntelMemReference(const MachineInstr *MI, unsigned Op, 79245431Sdim raw_ostream &O, const char *Modifier=NULL, 80245431Sdim unsigned AsmVariant = 1); 81212793Sdim 82245431Sdim virtual bool runOnMachineFunction(MachineFunction &F) LLVM_OVERRIDE; 83212793Sdim}; 84212793Sdim 85212793Sdim} // end namespace llvm 86212793Sdim 87212793Sdim#endif 88