131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu//===-- ARMAsmPrinter.h - Print machine code to an ARM .s file --*- C++ -*-===// 2baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach// 3baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach// The LLVM Compiler Infrastructure 4baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach// 5baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach// This file is distributed under the University of Illinois Open Source 6baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach// License. See LICENSE.TXT for details. 7baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach// 8baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach//===----------------------------------------------------------------------===// 9baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach// 10baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach// ARM Assembly printer class. 11baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach// 12baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach//===----------------------------------------------------------------------===// 13baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach 14baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach#ifndef ARMASMPRINTER_H 15baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach#define ARMASMPRINTER_H 16baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach 17baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach#include "ARM.h" 18baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach#include "ARMTargetMachine.h" 19baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach#include "llvm/CodeGen/AsmPrinter.h" 20baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach#include "llvm/Support/Compiler.h" 21baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach 22baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbachnamespace llvm { 23baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach 2453e3fc463e3d9ee840510b08ebd6db17694fa2c5Jim Grosbachclass MCOperand; 2553e3fc463e3d9ee840510b08ebd6db17694fa2c5Jim Grosbach 26baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbachnamespace ARM { 27baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach enum DW_ISA { 28baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach DW_ISA_ARM_thumb = 1, 29baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach DW_ISA_ARM_arm = 2 30baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach }; 31baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach} 32baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach 33baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbachclass LLVM_LIBRARY_VISIBILITY ARMAsmPrinter : public AsmPrinter { 34baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach 35baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach /// Subtarget - Keep a pointer to the ARMSubtarget around so that we can 36baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach /// make the right decision when printing asm code for different targets. 37baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach const ARMSubtarget *Subtarget; 38baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach 39baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach /// AFI - Keep a pointer to ARMFunctionInfo for the current 40baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach /// MachineFunction. 41baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach ARMFunctionInfo *AFI; 42baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach 43baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach /// MCP - Keep a pointer to constantpool entries of the current 44baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach /// MachineFunction. 45baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach const MachineConstantPool *MCP; 46baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach 47baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbachpublic: 48baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach explicit ARMAsmPrinter(TargetMachine &TM, MCStreamer &Streamer) 49baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach : AsmPrinter(TM, Streamer), AFI(NULL), MCP(NULL) { 50baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach Subtarget = &TM.getSubtarget<ARMSubtarget>(); 51baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach } 52baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach 53baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach virtual const char *getPassName() const { 54baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach return "ARM Assembly Printer"; 55baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach } 56baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach 57baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach void printOperand(const MachineInstr *MI, int OpNum, raw_ostream &O, 58baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach const char *Modifier = 0); 59baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach 60baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach virtual bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNum, 61baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach unsigned AsmVariant, const char *ExtraCode, 62baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach raw_ostream &O); 63baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach virtual bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNum, 64baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach unsigned AsmVariant, 65baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach const char *ExtraCode, raw_ostream &O); 66baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach 67baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach void EmitJumpTable(const MachineInstr *MI); 68baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach void EmitJump2Table(const MachineInstr *MI); 69baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach virtual void EmitInstruction(const MachineInstr *MI); 70baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach bool runOnMachineFunction(MachineFunction &F); 71baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach 72baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach virtual void EmitConstantPool() {} // we emit constant pools customly! 73baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach virtual void EmitFunctionEntryLabel(); 74baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach void EmitStartOfAsmFile(Module &M); 75baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach void EmitEndOfAsmFile(Module &M); 7634982576a43887e7f062ed0a3571af2cbab003f3James Molloy void EmitXXStructor(const Constant *CV); 77baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach 7853e3fc463e3d9ee840510b08ebd6db17694fa2c5Jim Grosbach // lowerOperand - Convert a MachineOperand into the equivalent MCOperand. 7953e3fc463e3d9ee840510b08ebd6db17694fa2c5Jim Grosbach bool lowerOperand(const MachineOperand &MO, MCOperand &MCOp); 8053e3fc463e3d9ee840510b08ebd6db17694fa2c5Jim Grosbach 81baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbachprivate: 82baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach // Helpers for EmitStartOfAsmFile() and EmitEndOfAsmFile() 83baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach void emitAttributes(); 84baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach 85baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach // Helper for ELF .o only 86baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach void emitARMAttributeSection(); 87baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach 884d7286083537833880901953d29786cf831affc4Anton Korobeynikov // Generic helper used to emit e.g. ARMv5 mul pseudos 894d7286083537833880901953d29786cf831affc4Anton Korobeynikov void EmitPatchedInstruction(const MachineInstr *MI, unsigned TargetOpc); 904d7286083537833880901953d29786cf831affc4Anton Korobeynikov 9157caad7a33ff145b71545f10dcfbbf2fd0f595d3Anton Korobeynikov void EmitUnwindingInstruction(const MachineInstr *MI); 9257caad7a33ff145b71545f10dcfbbf2fd0f595d3Anton Korobeynikov 9353e3fc463e3d9ee840510b08ebd6db17694fa2c5Jim Grosbach // emitPseudoExpansionLowering - tblgen'erated. 9453e3fc463e3d9ee840510b08ebd6db17694fa2c5Jim Grosbach bool emitPseudoExpansionLowering(MCStreamer &OutStreamer, 9553e3fc463e3d9ee840510b08ebd6db17694fa2c5Jim Grosbach const MachineInstr *MI); 9653e3fc463e3d9ee840510b08ebd6db17694fa2c5Jim Grosbach 97baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbachpublic: 98baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach void PrintDebugValueComment(const MachineInstr *MI, raw_ostream &OS); 99baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach 100baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach MachineLocation getDebugValueLocation(const MachineInstr *MI) const; 101baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach 10227f5acb7d49c3ca2e3f7fe13d97cc19a78b15e1aDevang Patel /// EmitDwarfRegOp - Emit dwarf register operation. 1030be77dff1147488814b8eea6ec8619f56e3d9f5eDevang Patel virtual void EmitDwarfRegOp(const MachineLocation &MLoc) const; 10427f5acb7d49c3ca2e3f7fe13d97cc19a78b15e1aDevang Patel 105baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach virtual unsigned getISAEncoding() { 106baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach // ARM/Darwin adds ISA to the DWARF info for each function. 107baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach if (!Subtarget->isTargetDarwin()) 108baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach return 0; 109baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach return Subtarget->isThumb() ? 110c89c744b69cecac576317a98322fd295e36e9886Craig Topper ARM::DW_ISA_ARM_thumb : ARM::DW_ISA_ARM_arm; 111baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach } 112baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach 11353e3fc463e3d9ee840510b08ebd6db17694fa2c5Jim Grosbach MCOperand GetSymbolRef(const MachineOperand &MO, const MCSymbol *Symbol); 114baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach MCSymbol *GetARMSetPICJumpTableLabel2(unsigned uid, unsigned uid2, 115baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach const MachineBasicBlock *MBB) const; 116baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach MCSymbol *GetARMJTIPICJumpTableLabel2(unsigned uid, unsigned uid2) const; 117baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach 118baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach MCSymbol *GetARMSJLJEHLabel(void) const; 119baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach 1205de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng MCSymbol *GetARMGVSymbol(const GlobalValue *GV); 12153e3fc463e3d9ee840510b08ebd6db17694fa2c5Jim Grosbach 122baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach /// EmitMachineConstantPoolValue - Print a machine constantpool value to 123baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach /// the .s file. 124baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach virtual void EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV); 125baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach}; 126baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach} // end namespace llvm 127baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach 128baf120fbe8056ef68fc91b16465590fdf2311c27Jim Grosbach#endif 129