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