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