| Eli Bendersky | b0b13b2 | 2013-02-19 16:38:32 +0000 | [diff] [blame] | 1 | //===-- X86AsmPrinter.h - X86 implementation of AsmPrinter ------*- C++ -*-===// | 
| Chris Lattner | b974046 | 2005-07-01 22:44:09 +0000 | [diff] [blame] | 2 | // | 
|  | 3 | //                     The LLVM Compiler Infrastructure | 
|  | 4 | // | 
| Chris Lattner | f3ebc3f | 2007-12-29 20:36:04 +0000 | [diff] [blame] | 5 | // This file is distributed under the University of Illinois Open Source | 
|  | 6 | // License. See LICENSE.TXT for details. | 
| Chris Lattner | b974046 | 2005-07-01 22:44:09 +0000 | [diff] [blame] | 7 | // | 
|  | 8 | //===----------------------------------------------------------------------===// | 
| Chris Lattner | b974046 | 2005-07-01 22:44:09 +0000 | [diff] [blame] | 9 |  | 
| Chris Lattner | 5159bbaf | 2009-09-20 07:41:30 +0000 | [diff] [blame] | 10 | #ifndef X86ASMPRINTER_H | 
|  | 11 | #define X86ASMPRINTER_H | 
| Chris Lattner | b974046 | 2005-07-01 22:44:09 +0000 | [diff] [blame] | 12 |  | 
| Craig Topper | c6d4efa | 2014-03-19 06:53:25 +0000 | [diff] [blame] | 13 | #include "X86Subtarget.h" | 
| Anton Korobeynikov | 016d1d0 | 2008-06-28 11:08:27 +0000 | [diff] [blame] | 14 | #include "llvm/CodeGen/AsmPrinter.h" | 
| Andrew Trick | 153ebe6 | 2013-10-31 22:11:56 +0000 | [diff] [blame] | 15 | #include "llvm/CodeGen/StackMaps.h" | 
| Craig Topper | c6d4efa | 2014-03-19 06:53:25 +0000 | [diff] [blame] | 16 | #include "llvm/Target/TargetMachine.h" | 
| Chris Lattner | b974046 | 2005-07-01 22:44:09 +0000 | [diff] [blame] | 17 |  | 
| Lang Hames | f49bc3f | 2014-07-24 20:40:55 +0000 | [diff] [blame^] | 18 | // Implemented in X86MCInstLower.cpp | 
|  | 19 | namespace { | 
|  | 20 | class X86MCInstLower; | 
|  | 21 | } | 
|  | 22 |  | 
| Chris Lattner | b974046 | 2005-07-01 22:44:09 +0000 | [diff] [blame] | 23 | namespace llvm { | 
| Chris Lattner | 9f40bc2 | 2009-06-24 05:46:28 +0000 | [diff] [blame] | 24 | class MCStreamer; | 
| Saleem Abdulrasool | 75e68cb | 2014-05-04 00:03:41 +0000 | [diff] [blame] | 25 | class MCSymbol; | 
| Anton Korobeynikov | 016d1d0 | 2008-06-28 11:08:27 +0000 | [diff] [blame] | 26 |  | 
| Duncan Sands | 6c5e435 | 2010-05-11 20:16:09 +0000 | [diff] [blame] | 27 | class LLVM_LIBRARY_VISIBILITY X86AsmPrinter : public AsmPrinter { | 
| Anton Korobeynikov | 016d1d0 | 2008-06-28 11:08:27 +0000 | [diff] [blame] | 28 | const X86Subtarget *Subtarget; | 
| Andrew Trick | 153ebe6 | 2013-10-31 22:11:56 +0000 | [diff] [blame] | 29 | StackMaps SM; | 
|  | 30 |  | 
| Saleem Abdulrasool | 75e68cb | 2014-05-04 00:03:41 +0000 | [diff] [blame] | 31 | void GenerateExportDirective(const MCSymbol *Sym, bool IsData); | 
|  | 32 |  | 
| Lang Hames | f49bc3f | 2014-07-24 20:40:55 +0000 | [diff] [blame^] | 33 | // This utility class tracks the length of a stackmap instruction's 'shadow'. | 
|  | 34 | // It is used by the X86AsmPrinter to ensure that the stackmap shadow | 
|  | 35 | // invariants (i.e. no other stackmaps, patchpoints, or control flow within | 
|  | 36 | // the shadow) are met, while outputting a minimal number of NOPs for padding. | 
|  | 37 | // | 
|  | 38 | // To minimise the number of NOPs used, the shadow tracker counts the number | 
|  | 39 | // of instruction bytes output since the last stackmap. Only if there are too | 
|  | 40 | // few instruction bytes to cover the shadow are NOPs used for padding. | 
|  | 41 | class StackMapShadowTracker { | 
|  | 42 | public: | 
|  | 43 | StackMapShadowTracker(TargetMachine &TM); | 
|  | 44 | ~StackMapShadowTracker(); | 
|  | 45 | void startFunction(MachineFunction &MF); | 
|  | 46 | void count(MCInst &Inst, const MCSubtargetInfo &STI); | 
|  | 47 | void reset(unsigned RequiredSize) { | 
|  | 48 | RequiredShadowSize = RequiredSize; | 
|  | 49 | CurrentShadowSize = 0; | 
|  | 50 | Count = true; | 
|  | 51 | } | 
|  | 52 | void emitShadowPadding(MCStreamer &OutStreamer, const MCSubtargetInfo &STI); | 
|  | 53 | private: | 
|  | 54 | TargetMachine &TM; | 
|  | 55 | std::unique_ptr<MCCodeEmitter> CodeEmitter; | 
|  | 56 | bool Count; | 
|  | 57 | unsigned RequiredShadowSize, CurrentShadowSize; | 
|  | 58 | }; | 
|  | 59 |  | 
|  | 60 | StackMapShadowTracker SMShadowTracker; | 
|  | 61 |  | 
|  | 62 | // All instructions emitted by the X86AsmPrinter should use this helper | 
|  | 63 | // method. | 
|  | 64 | // | 
|  | 65 | // This helper function invokes the SMShadowTracker on each instruction before | 
|  | 66 | // outputting it to the OutStream. This allows the shadow tracker to minimise | 
|  | 67 | // the number of NOPs used for stackmap padding. | 
|  | 68 | void EmitAndCountInstruction(MCInst &Inst); | 
|  | 69 |  | 
|  | 70 | void InsertStackMapShadows(MachineFunction &MF); | 
|  | 71 | void LowerSTACKMAP(const MachineInstr &MI); | 
|  | 72 | void LowerPATCHPOINT(const MachineInstr &MI); | 
|  | 73 |  | 
|  | 74 | void LowerTlsAddr(X86MCInstLower &MCInstLowering, const MachineInstr &MI); | 
|  | 75 |  | 
| Bill Wendling | c5437ea | 2009-02-24 08:30:20 +0000 | [diff] [blame] | 76 | public: | 
| Chris Lattner | d20699b | 2010-04-04 08:18:47 +0000 | [diff] [blame] | 77 | explicit X86AsmPrinter(TargetMachine &TM, MCStreamer &Streamer) | 
| Lang Hames | f49bc3f | 2014-07-24 20:40:55 +0000 | [diff] [blame^] | 78 | : AsmPrinter(TM, Streamer), SM(*this), SMShadowTracker(TM) { | 
| Anton Korobeynikov | 016d1d0 | 2008-06-28 11:08:27 +0000 | [diff] [blame] | 79 | Subtarget = &TM.getSubtarget<X86Subtarget>(); | 
|  | 80 | } | 
| Chris Lattner | b974046 | 2005-07-01 22:44:09 +0000 | [diff] [blame] | 81 |  | 
| Craig Topper | 24e685f | 2014-03-10 05:29:18 +0000 | [diff] [blame] | 82 | const char *getPassName() const override { | 
| Eli Bendersky | b0b13b2 | 2013-02-19 16:38:32 +0000 | [diff] [blame] | 83 | return "X86 Assembly / Object Emitter"; | 
| Chris Lattner | b974046 | 2005-07-01 22:44:09 +0000 | [diff] [blame] | 84 | } | 
| Chad Rosier | 24c19d2 | 2012-08-01 18:39:17 +0000 | [diff] [blame] | 85 |  | 
| Chris Lattner | 3172208 | 2009-09-12 20:34:57 +0000 | [diff] [blame] | 86 | const X86Subtarget &getSubtarget() const { return *Subtarget; } | 
| Chris Lattner | b974046 | 2005-07-01 22:44:09 +0000 | [diff] [blame] | 87 |  | 
| Craig Topper | 24e685f | 2014-03-10 05:29:18 +0000 | [diff] [blame] | 88 | void EmitStartOfAsmFile(Module &M) override; | 
| Chris Lattner | 81fe45d | 2010-03-13 02:10:00 +0000 | [diff] [blame] | 89 |  | 
| Craig Topper | 24e685f | 2014-03-10 05:29:18 +0000 | [diff] [blame] | 90 | void EmitEndOfAsmFile(Module &M) override; | 
| Chad Rosier | 24c19d2 | 2012-08-01 18:39:17 +0000 | [diff] [blame] | 91 |  | 
| Craig Topper | 24e685f | 2014-03-10 05:29:18 +0000 | [diff] [blame] | 92 | void EmitInstruction(const MachineInstr *MI) override; | 
| Chad Rosier | 24c19d2 | 2012-08-01 18:39:17 +0000 | [diff] [blame] | 93 |  | 
| Lang Hames | f49bc3f | 2014-07-24 20:40:55 +0000 | [diff] [blame^] | 94 | void EmitBasicBlockEnd(const MachineBasicBlock &MBB) override { | 
|  | 95 | SMShadowTracker.emitShadowPadding(OutStreamer, getSubtargetInfo()); | 
|  | 96 | } | 
|  | 97 |  | 
| Craig Topper | 24e685f | 2014-03-10 05:29:18 +0000 | [diff] [blame] | 98 | bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, | 
|  | 99 | unsigned AsmVariant, const char *ExtraCode, | 
|  | 100 | raw_ostream &OS) override; | 
|  | 101 | bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo, | 
|  | 102 | unsigned AsmVariant, const char *ExtraCode, | 
|  | 103 | raw_ostream &OS) override; | 
| Anton Korobeynikov | 016d1d0 | 2008-06-28 11:08:27 +0000 | [diff] [blame] | 104 |  | 
| David Majnemer | 8bce66b | 2014-07-14 22:57:27 +0000 | [diff] [blame] | 105 | /// \brief Return the symbol for the specified constant pool entry. | 
|  | 106 | MCSymbol *GetCPISymbol(unsigned CPID) const override; | 
|  | 107 |  | 
| Craig Topper | 24e685f | 2014-03-10 05:29:18 +0000 | [diff] [blame] | 108 | bool runOnMachineFunction(MachineFunction &F) override; | 
| Chris Lattner | b974046 | 2005-07-01 22:44:09 +0000 | [diff] [blame] | 109 | }; | 
|  | 110 |  | 
| Chris Lattner | b974046 | 2005-07-01 22:44:09 +0000 | [diff] [blame] | 111 | } // end namespace llvm | 
|  | 112 |  | 
|  | 113 | #endif |