implement support for lowering references to global addresses. For example, we now
[oota-llvm.git] / lib / Target / X86 / AsmPrinter / X86ATTAsmPrinter.h
1 //===-- X86ATTAsmPrinter.h - Convert X86 LLVM code to AT&T assembly -------===//
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 // AT&T assembly code printer class.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #ifndef X86ATTASMPRINTER_H
15 #define X86ATTASMPRINTER_H
16
17 #include "../X86.h"
18 #include "../X86MachineFunctionInfo.h"
19 #include "../X86TargetMachine.h"
20 #include "llvm/ADT/StringSet.h"
21 #include "llvm/CodeGen/AsmPrinter.h"
22 #include "llvm/CodeGen/DwarfWriter.h"
23 #include "llvm/CodeGen/MachineModuleInfo.h"
24 #include "llvm/CodeGen/ValueTypes.h"
25 #include "llvm/Support/Compiler.h"
26
27 namespace llvm {
28
29 class MachineJumpTableInfo;
30 class MCContext;
31 class MCInst;
32 class MCOperand;
33 class MCStreamer;
34
35 class VISIBILITY_HIDDEN X86ATTAsmPrinter : public AsmPrinter {
36   const X86Subtarget *Subtarget;
37  public:
38   explicit X86ATTAsmPrinter(formatted_raw_ostream &O, TargetMachine &TM,
39                             const TargetAsmInfo *T, bool V)
40     : AsmPrinter(O, TM, T, V) {
41     Subtarget = &TM.getSubtarget<X86Subtarget>();
42   }
43
44   virtual const char *getPassName() const {
45     return "X86 AT&T-Style Assembly Printer";
46   }
47
48   void getAnalysisUsage(AnalysisUsage &AU) const {
49     AU.setPreservesAll();
50     if (Subtarget->isTargetDarwin() ||
51         Subtarget->isTargetELF() ||
52         Subtarget->isTargetCygMing()) {
53       AU.addRequired<MachineModuleInfo>();
54     }
55     AU.addRequired<DwarfWriter>();
56     AsmPrinter::getAnalysisUsage(AU);
57   }
58
59   bool doFinalization(Module &M);
60
61   /// printInstruction - This method is automatically generated by tablegen
62   /// from the instruction set description.  This method returns true if the
63   /// machine instruction was sufficiently described to print it, otherwise it
64   /// returns false.
65   void printInstruction(const MachineInstr *MI);
66   
67   
68   // New MCInst printing stuff.
69   void printInstruction(const MCInst *MI);
70   MCOperand LowerGlobalAddressOperand(const MachineOperand &MO);
71
72   virtual void printMCInst(const MCInst *MI) { printInstruction(MI); }
73
74   void printSymbolOperand(const MachineOperand &MO);
75   void printOperand(const MCInst *MI, unsigned OpNo,
76                     const char *Modifier = 0);
77   void printMemReference(const MCInst *MI, unsigned Op);
78   void printLeaMemReference(const MCInst *MI, unsigned Op);
79   void printSSECC(const MCInst *MI, unsigned Op);
80   void printPICLabel(const MCInst *MI, unsigned Op);
81   void print_pcrel_imm(const MCInst *MI, unsigned OpNo);
82   
83   void printi8mem(const MCInst *MI, unsigned OpNo) {
84     printMemReference(MI, OpNo);
85   }
86   void printi16mem(const MCInst *MI, unsigned OpNo) {
87     printMemReference(MI, OpNo);
88   }
89   void printi32mem(const MCInst *MI, unsigned OpNo) {
90     printMemReference(MI, OpNo);
91   }
92   void printi64mem(const MCInst *MI, unsigned OpNo) {
93     printMemReference(MI, OpNo);
94   }
95   void printi128mem(const MCInst *MI, unsigned OpNo) {
96     printMemReference(MI, OpNo);
97   }
98   void printf32mem(const MCInst *MI, unsigned OpNo) {
99     printMemReference(MI, OpNo);
100   }
101   void printf64mem(const MCInst *MI, unsigned OpNo) {
102     printMemReference(MI, OpNo);
103   }
104   void printf80mem(const MCInst *MI, unsigned OpNo) {
105     printMemReference(MI, OpNo);
106   }
107   void printf128mem(const MCInst *MI, unsigned OpNo) {
108     printMemReference(MI, OpNo);
109   }
110   void printlea32mem(const MCInst *MI, unsigned OpNo) {
111     printLeaMemReference(MI, OpNo);
112   }
113   void printlea64mem(const MCInst *MI, unsigned OpNo) {
114     printLeaMemReference(MI, OpNo);
115   }
116   void printlea64_32mem(const MCInst *MI, unsigned OpNo) {
117     printLeaMemReference(MI, OpNo);
118   }
119   
120   
121
122   // These methods are used by the tablegen'erated instruction printer.
123   void printOperand(const MachineInstr *MI, unsigned OpNo,
124                     const char *Modifier = 0);
125   void print_pcrel_imm(const MachineInstr *MI, unsigned OpNo);
126   void printi8mem(const MachineInstr *MI, unsigned OpNo) {
127     printMemReference(MI, OpNo);
128   }
129   void printi16mem(const MachineInstr *MI, unsigned OpNo) {
130     printMemReference(MI, OpNo);
131   }
132   void printi32mem(const MachineInstr *MI, unsigned OpNo) {
133     printMemReference(MI, OpNo);
134   }
135   void printi64mem(const MachineInstr *MI, unsigned OpNo) {
136     printMemReference(MI, OpNo);
137   }
138   void printi128mem(const MachineInstr *MI, unsigned OpNo) {
139     printMemReference(MI, OpNo);
140   }
141   void printi256mem(const MachineInstr *MI, unsigned OpNo) {
142     printMemReference(MI, OpNo);
143   }
144   void printf32mem(const MachineInstr *MI, unsigned OpNo) {
145     printMemReference(MI, OpNo);
146   }
147   void printf64mem(const MachineInstr *MI, unsigned OpNo) {
148     printMemReference(MI, OpNo);
149   }
150   void printf80mem(const MachineInstr *MI, unsigned OpNo) {
151     printMemReference(MI, OpNo);
152   }
153   void printf128mem(const MachineInstr *MI, unsigned OpNo) {
154     printMemReference(MI, OpNo);
155   }
156   void printf256mem(const MachineInstr *MI, unsigned OpNo) {
157     printMemReference(MI, OpNo);
158   }
159   void printlea32mem(const MachineInstr *MI, unsigned OpNo) {
160     printLeaMemReference(MI, OpNo);
161   }
162   void printlea64mem(const MachineInstr *MI, unsigned OpNo) {
163     printLeaMemReference(MI, OpNo);
164   }
165   void printlea64_32mem(const MachineInstr *MI, unsigned OpNo) {
166     printLeaMemReference(MI, OpNo, "subreg64");
167   }
168
169   bool printAsmMRegister(const MachineOperand &MO, char Mode);
170   bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
171                        unsigned AsmVariant, const char *ExtraCode);
172   bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo,
173                              unsigned AsmVariant, const char *ExtraCode);
174
175   void printMachineInstruction(const MachineInstr *MI);
176   void printSSECC(const MachineInstr *MI, unsigned Op);
177   void printMemReference(const MachineInstr *MI, unsigned Op,
178                          const char *Modifier=NULL);
179   void printLeaMemReference(const MachineInstr *MI, unsigned Op,
180                             const char *Modifier=NULL);
181   void printPICJumpTableSetLabel(unsigned uid,
182                                  const MachineBasicBlock *MBB) const;
183   void printPICJumpTableSetLabel(unsigned uid, unsigned uid2,
184                                  const MachineBasicBlock *MBB) const {
185     AsmPrinter::printPICJumpTableSetLabel(uid, uid2, MBB);
186   }
187   void printPICJumpTableEntry(const MachineJumpTableInfo *MJTI,
188                               const MachineBasicBlock *MBB,
189                               unsigned uid) const;
190
191   void printPICLabel(const MachineInstr *MI, unsigned Op);
192   void PrintGlobalVariable(const GlobalVariable* GVar);
193
194   void PrintPICBaseSymbol() const;
195   
196   bool runOnMachineFunction(MachineFunction &F);
197
198   void emitFunctionHeader(const MachineFunction &MF);
199
200   // Necessary for Darwin to print out the apprioriate types of linker stubs
201   StringMap<std::string> FnStubs, GVStubs, HiddenGVStubs;
202
203   // Necessary for dllexport support
204   StringSet<> CygMingStubs, DLLExportedFns, DLLExportedGVs;
205
206   // We have to propagate some information about MachineFunction to
207   // AsmPrinter. It's ok, when we're printing the function, since we have
208   // access to MachineFunction and can get the appropriate MachineFunctionInfo.
209   // Unfortunately, this is not possible when we're printing reference to
210   // Function (e.g. calling it and so on). Even more, there is no way to get the
211   // corresponding MachineFunctions: it can even be not created at all. That's
212   // why we should use additional structure, when we're collecting all necessary
213   // information.
214   //
215   // This structure is using e.g. for name decoration for stdcall & fastcall'ed
216   // function, since we have to use arguments' size for decoration.
217   typedef std::map<const Function*, X86MachineFunctionInfo> FMFInfoMap;
218   FMFInfoMap FunctionInfoMap;
219
220   void DecorateCygMingName(std::string &Name, const GlobalValue *GV);
221 };
222
223 } // end namespace llvm
224
225 #endif