| Eli Bendersky | 6aa4fc3 | 2013-02-19 16:47:59 +0000 | [diff] [blame] | 1 | //===-- ARMAsmPrinter.h - ARM implementation of AsmPrinter ------*- C++ -*-===// | 
| Jim Grosbach | d0d1329 | 2010-12-01 03:45:07 +0000 | [diff] [blame] | 2 | // | 
|  | 3 | //                     The LLVM Compiler Infrastructure | 
|  | 4 | // | 
|  | 5 | // This file is distributed under the University of Illinois Open Source | 
|  | 6 | // License. See LICENSE.TXT for details. | 
|  | 7 | // | 
|  | 8 | //===----------------------------------------------------------------------===// | 
| Jim Grosbach | d0d1329 | 2010-12-01 03:45:07 +0000 | [diff] [blame] | 9 |  | 
|  | 10 | #ifndef ARMASMPRINTER_H | 
|  | 11 | #define ARMASMPRINTER_H | 
|  | 12 |  | 
|  | 13 | #include "ARM.h" | 
|  | 14 | #include "ARMTargetMachine.h" | 
|  | 15 | #include "llvm/CodeGen/AsmPrinter.h" | 
|  | 16 | #include "llvm/Support/Compiler.h" | 
|  | 17 |  | 
|  | 18 | namespace llvm { | 
|  | 19 |  | 
| Jim Grosbach | 95dee40 | 2011-07-08 17:40:42 +0000 | [diff] [blame] | 20 | class MCOperand; | 
|  | 21 |  | 
| Jim Grosbach | d0d1329 | 2010-12-01 03:45:07 +0000 | [diff] [blame] | 22 | namespace ARM { | 
|  | 23 | enum DW_ISA { | 
|  | 24 | DW_ISA_ARM_thumb = 1, | 
|  | 25 | DW_ISA_ARM_arm = 2 | 
|  | 26 | }; | 
|  | 27 | } | 
|  | 28 |  | 
|  | 29 | class LLVM_LIBRARY_VISIBILITY ARMAsmPrinter : public AsmPrinter { | 
|  | 30 |  | 
|  | 31 | /// Subtarget - Keep a pointer to the ARMSubtarget around so that we can | 
|  | 32 | /// make the right decision when printing asm code for different targets. | 
|  | 33 | const ARMSubtarget *Subtarget; | 
|  | 34 |  | 
|  | 35 | /// AFI - Keep a pointer to ARMFunctionInfo for the current | 
|  | 36 | /// MachineFunction. | 
|  | 37 | ARMFunctionInfo *AFI; | 
|  | 38 |  | 
|  | 39 | /// MCP - Keep a pointer to constantpool entries of the current | 
|  | 40 | /// MachineFunction. | 
|  | 41 | const MachineConstantPool *MCP; | 
|  | 42 |  | 
| Jim Grosbach | 4b63d2a | 2012-05-18 19:12:01 +0000 | [diff] [blame] | 43 | /// InConstantPool - Maintain state when emitting a sequence of constant | 
|  | 44 | /// pool entries so we can properly mark them as data regions. | 
|  | 45 | bool InConstantPool; | 
| Jim Grosbach | d0d1329 | 2010-12-01 03:45:07 +0000 | [diff] [blame] | 46 | public: | 
|  | 47 | explicit ARMAsmPrinter(TargetMachine &TM, MCStreamer &Streamer) | 
| Jim Grosbach | 4b63d2a | 2012-05-18 19:12:01 +0000 | [diff] [blame] | 48 | : AsmPrinter(TM, Streamer), AFI(NULL), MCP(NULL), InConstantPool(false) { | 
| Jim Grosbach | d0d1329 | 2010-12-01 03:45:07 +0000 | [diff] [blame] | 49 | Subtarget = &TM.getSubtarget<ARMSubtarget>(); | 
|  | 50 | } | 
|  | 51 |  | 
| Craig Topper | db092d7 | 2012-10-09 04:23:49 +0000 | [diff] [blame] | 52 | virtual const char *getPassName() const LLVM_OVERRIDE { | 
| Eli Bendersky | 6aa4fc3 | 2013-02-19 16:47:59 +0000 | [diff] [blame] | 53 | return "ARM Assembly / Object Emitter"; | 
| Jim Grosbach | d0d1329 | 2010-12-01 03:45:07 +0000 | [diff] [blame] | 54 | } | 
|  | 55 |  | 
|  | 56 | void printOperand(const MachineInstr *MI, int OpNum, raw_ostream &O, | 
|  | 57 | const char *Modifier = 0); | 
|  | 58 |  | 
|  | 59 | virtual bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNum, | 
|  | 60 | unsigned AsmVariant, const char *ExtraCode, | 
| Craig Topper | db092d7 | 2012-10-09 04:23:49 +0000 | [diff] [blame] | 61 | raw_ostream &O) LLVM_OVERRIDE; | 
| Jim Grosbach | d0d1329 | 2010-12-01 03:45:07 +0000 | [diff] [blame] | 62 | virtual bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNum, | 
| Craig Topper | db092d7 | 2012-10-09 04:23:49 +0000 | [diff] [blame] | 63 | unsigned AsmVariant, const char *ExtraCode, | 
|  | 64 | raw_ostream &O) LLVM_OVERRIDE; | 
| Jim Grosbach | d0d1329 | 2010-12-01 03:45:07 +0000 | [diff] [blame] | 65 |  | 
|  | 66 | void EmitJumpTable(const MachineInstr *MI); | 
|  | 67 | void EmitJump2Table(const MachineInstr *MI); | 
| Craig Topper | db092d7 | 2012-10-09 04:23:49 +0000 | [diff] [blame] | 68 | virtual void EmitInstruction(const MachineInstr *MI) LLVM_OVERRIDE; | 
|  | 69 | virtual bool runOnMachineFunction(MachineFunction &F) LLVM_OVERRIDE; | 
| Jim Grosbach | d0d1329 | 2010-12-01 03:45:07 +0000 | [diff] [blame] | 70 |  | 
| Craig Topper | db092d7 | 2012-10-09 04:23:49 +0000 | [diff] [blame] | 71 | virtual void EmitConstantPool() LLVM_OVERRIDE { | 
|  | 72 | // we emit constant pools customly! | 
|  | 73 | } | 
|  | 74 | virtual void EmitFunctionBodyEnd() LLVM_OVERRIDE; | 
|  | 75 | virtual void EmitFunctionEntryLabel() LLVM_OVERRIDE; | 
|  | 76 | virtual void EmitStartOfAsmFile(Module &M) LLVM_OVERRIDE; | 
|  | 77 | virtual void EmitEndOfAsmFile(Module &M) LLVM_OVERRIDE; | 
|  | 78 | virtual void EmitXXStructor(const Constant *CV) LLVM_OVERRIDE; | 
| Jim Grosbach | d0d1329 | 2010-12-01 03:45:07 +0000 | [diff] [blame] | 79 |  | 
| Jim Grosbach | 95dee40 | 2011-07-08 17:40:42 +0000 | [diff] [blame] | 80 | // lowerOperand - Convert a MachineOperand into the equivalent MCOperand. | 
|  | 81 | bool lowerOperand(const MachineOperand &MO, MCOperand &MCOp); | 
|  | 82 |  | 
| Jim Grosbach | d0d1329 | 2010-12-01 03:45:07 +0000 | [diff] [blame] | 83 | private: | 
|  | 84 | // Helpers for EmitStartOfAsmFile() and EmitEndOfAsmFile() | 
|  | 85 | void emitAttributes(); | 
|  | 86 |  | 
|  | 87 | // Helper for ELF .o only | 
|  | 88 | void emitARMAttributeSection(); | 
|  | 89 |  | 
| Anton Korobeynikov | 62acecd | 2011-01-01 20:38:38 +0000 | [diff] [blame] | 90 | // Generic helper used to emit e.g. ARMv5 mul pseudos | 
|  | 91 | void EmitPatchedInstruction(const MachineInstr *MI, unsigned TargetOpc); | 
|  | 92 |  | 
| Anton Korobeynikov | e7410dd | 2011-03-05 18:43:32 +0000 | [diff] [blame] | 93 | void EmitUnwindingInstruction(const MachineInstr *MI); | 
|  | 94 |  | 
| Jim Grosbach | 95dee40 | 2011-07-08 17:40:42 +0000 | [diff] [blame] | 95 | // emitPseudoExpansionLowering - tblgen'erated. | 
|  | 96 | bool emitPseudoExpansionLowering(MCStreamer &OutStreamer, | 
|  | 97 | const MachineInstr *MI); | 
|  | 98 |  | 
| Jim Grosbach | d0d1329 | 2010-12-01 03:45:07 +0000 | [diff] [blame] | 99 | public: | 
| Devang Patel | 3712c14 | 2011-04-21 22:48:26 +0000 | [diff] [blame] | 100 | /// EmitDwarfRegOp - Emit dwarf register operation. | 
| David Blaikie | 81a4dc7 | 2013-06-19 21:55:13 +0000 | [diff] [blame] | 101 | virtual void EmitDwarfRegOp(const MachineLocation &MLoc, bool Indirect) const | 
|  | 102 | LLVM_OVERRIDE; | 
| Devang Patel | 3712c14 | 2011-04-21 22:48:26 +0000 | [diff] [blame] | 103 |  | 
| Craig Topper | db092d7 | 2012-10-09 04:23:49 +0000 | [diff] [blame] | 104 | virtual unsigned getISAEncoding() LLVM_OVERRIDE { | 
| Jim Grosbach | d0d1329 | 2010-12-01 03:45:07 +0000 | [diff] [blame] | 105 | // ARM/Darwin adds ISA to the DWARF info for each function. | 
|  | 106 | if (!Subtarget->isTargetDarwin()) | 
|  | 107 | return 0; | 
|  | 108 | return Subtarget->isThumb() ? | 
| Craig Topper | f6e7e12 | 2012-03-27 07:21:54 +0000 | [diff] [blame] | 109 | ARM::DW_ISA_ARM_thumb : ARM::DW_ISA_ARM_arm; | 
| Jim Grosbach | d0d1329 | 2010-12-01 03:45:07 +0000 | [diff] [blame] | 110 | } | 
|  | 111 |  | 
| Craig Topper | db092d7 | 2012-10-09 04:23:49 +0000 | [diff] [blame] | 112 | private: | 
| Jim Grosbach | 95dee40 | 2011-07-08 17:40:42 +0000 | [diff] [blame] | 113 | MCOperand GetSymbolRef(const MachineOperand &MO, const MCSymbol *Symbol); | 
| Jim Grosbach | d0d1329 | 2010-12-01 03:45:07 +0000 | [diff] [blame] | 114 | MCSymbol *GetARMJTIPICJumpTableLabel2(unsigned uid, unsigned uid2) const; | 
|  | 115 |  | 
| Dmitri Gribenko | 0011bbf | 2012-11-15 16:51:49 +0000 | [diff] [blame] | 116 | MCSymbol *GetARMSJLJEHLabel() const; | 
| Jim Grosbach | d0d1329 | 2010-12-01 03:45:07 +0000 | [diff] [blame] | 117 |  | 
| Tim Northover | db962e2c | 2013-11-25 16:24:52 +0000 | [diff] [blame] | 118 | MCSymbol *GetARMGVSymbol(const GlobalValue *GV, unsigned char TargetFlags); | 
| Jim Grosbach | 95dee40 | 2011-07-08 17:40:42 +0000 | [diff] [blame] | 119 |  | 
| Craig Topper | db092d7 | 2012-10-09 04:23:49 +0000 | [diff] [blame] | 120 | public: | 
| Jim Grosbach | d0d1329 | 2010-12-01 03:45:07 +0000 | [diff] [blame] | 121 | /// EmitMachineConstantPoolValue - Print a machine constantpool value to | 
|  | 122 | /// the .s file. | 
| Craig Topper | db092d7 | 2012-10-09 04:23:49 +0000 | [diff] [blame] | 123 | virtual void | 
|  | 124 | EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV) LLVM_OVERRIDE; | 
| Jim Grosbach | d0d1329 | 2010-12-01 03:45:07 +0000 | [diff] [blame] | 125 | }; | 
|  | 126 | } // end namespace llvm | 
|  | 127 |  | 
|  | 128 | #endif |