Home | History | Annotate | Download | only in ARM
      1 //===-- ARMAsmPrinter.h - Print machine code to an ARM .s file ------------===//
      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 //===----------------------------------------------------------------------===//
      9 //
     10 // ARM Assembly printer class.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #ifndef ARMASMPRINTER_H
     15 #define ARMASMPRINTER_H
     16 
     17 #include "ARM.h"
     18 #include "ARMTargetMachine.h"
     19 #include "llvm/CodeGen/AsmPrinter.h"
     20 #include "llvm/Support/Compiler.h"
     21 
     22 namespace llvm {
     23 
     24 class MCOperand;
     25 
     26 namespace ARM {
     27   enum DW_ISA {
     28     DW_ISA_ARM_thumb = 1,
     29     DW_ISA_ARM_arm = 2
     30   };
     31 }
     32 
     33 class LLVM_LIBRARY_VISIBILITY ARMAsmPrinter : public AsmPrinter {
     34 
     35   /// Subtarget - Keep a pointer to the ARMSubtarget around so that we can
     36   /// make the right decision when printing asm code for different targets.
     37   const ARMSubtarget *Subtarget;
     38 
     39   /// AFI - Keep a pointer to ARMFunctionInfo for the current
     40   /// MachineFunction.
     41   ARMFunctionInfo *AFI;
     42 
     43   /// MCP - Keep a pointer to constantpool entries of the current
     44   /// MachineFunction.
     45   const MachineConstantPool *MCP;
     46 
     47 public:
     48   explicit ARMAsmPrinter(TargetMachine &TM, MCStreamer &Streamer)
     49     : AsmPrinter(TM, Streamer), AFI(NULL), MCP(NULL) {
     50       Subtarget = &TM.getSubtarget<ARMSubtarget>();
     51     }
     52 
     53   virtual const char *getPassName() const {
     54     return "ARM Assembly Printer";
     55   }
     56 
     57   void printOperand(const MachineInstr *MI, int OpNum, raw_ostream &O,
     58                     const char *Modifier = 0);
     59 
     60   virtual bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNum,
     61                                unsigned AsmVariant, const char *ExtraCode,
     62                                raw_ostream &O);
     63   virtual bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNum,
     64                                      unsigned AsmVariant,
     65                                      const char *ExtraCode, raw_ostream &O);
     66 
     67   void EmitJumpTable(const MachineInstr *MI);
     68   void EmitJump2Table(const MachineInstr *MI);
     69   virtual void EmitInstruction(const MachineInstr *MI);
     70   bool runOnMachineFunction(MachineFunction &F);
     71 
     72   virtual void EmitConstantPool() {} // we emit constant pools customly!
     73   virtual void EmitFunctionEntryLabel();
     74   void EmitStartOfAsmFile(Module &M);
     75   void EmitEndOfAsmFile(Module &M);
     76 
     77   // lowerOperand - Convert a MachineOperand into the equivalent MCOperand.
     78   bool lowerOperand(const MachineOperand &MO, MCOperand &MCOp);
     79 
     80 private:
     81   // Helpers for EmitStartOfAsmFile() and EmitEndOfAsmFile()
     82   void emitAttributes();
     83 
     84   // Helper for ELF .o only
     85   void emitARMAttributeSection();
     86 
     87   // Generic helper used to emit e.g. ARMv5 mul pseudos
     88   void EmitPatchedInstruction(const MachineInstr *MI, unsigned TargetOpc);
     89 
     90   void EmitUnwindingInstruction(const MachineInstr *MI);
     91 
     92   // emitPseudoExpansionLowering - tblgen'erated.
     93   bool emitPseudoExpansionLowering(MCStreamer &OutStreamer,
     94                                    const MachineInstr *MI);
     95 
     96 public:
     97   void PrintDebugValueComment(const MachineInstr *MI, raw_ostream &OS);
     98 
     99   MachineLocation getDebugValueLocation(const MachineInstr *MI) const;
    100 
    101   /// EmitDwarfRegOp - Emit dwarf register operation.
    102   virtual void EmitDwarfRegOp(const MachineLocation &MLoc) const;
    103 
    104   virtual unsigned getISAEncoding() {
    105     // ARM/Darwin adds ISA to the DWARF info for each function.
    106     if (!Subtarget->isTargetDarwin())
    107       return 0;
    108     return Subtarget->isThumb() ?
    109       llvm::ARM::DW_ISA_ARM_thumb : llvm::ARM::DW_ISA_ARM_arm;
    110   }
    111 
    112   MCOperand GetSymbolRef(const MachineOperand &MO, const MCSymbol *Symbol);
    113   MCSymbol *GetARMSetPICJumpTableLabel2(unsigned uid, unsigned uid2,
    114                                         const MachineBasicBlock *MBB) const;
    115   MCSymbol *GetARMJTIPICJumpTableLabel2(unsigned uid, unsigned uid2) const;
    116 
    117   MCSymbol *GetARMSJLJEHLabel(void) const;
    118 
    119   MCSymbol *GetARMGVSymbol(const GlobalValue *GV);
    120 
    121   /// EmitMachineConstantPoolValue - Print a machine constantpool value to
    122   /// the .s file.
    123   virtual void EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV);
    124 };
    125 } // end namespace llvm
    126 
    127 #endif
    128