Use StringSet instead of std::set<std::string>
[oota-llvm.git] / lib / Target / X86 / X86AsmPrinter.cpp
1 //===-- X86AsmPrinter.cpp - Convert X86 LLVM IR to X86 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 // This file the shared super class printer that converts from our internal
11 // representation of machine-dependent LLVM code to Intel and AT&T format
12 // assembly language.
13 // This printer is the output mechanism used by `llc'.
14 //
15 //===----------------------------------------------------------------------===//
16
17 #include "X86AsmPrinter.h"
18 #include "X86ATTAsmPrinter.h"
19 #include "X86COFF.h"
20 #include "X86IntelAsmPrinter.h"
21 #include "X86MachineFunctionInfo.h"
22 #include "X86Subtarget.h"
23 #include "llvm/ADT/StringExtras.h"
24 #include "llvm/CallingConv.h"
25 #include "llvm/Constants.h"
26 #include "llvm/Module.h"
27 #include "llvm/DerivedTypes.h"
28 #include "llvm/ParameterAttributes.h"
29 #include "llvm/Type.h"
30 #include "llvm/Assembly/Writer.h"
31 #include "llvm/Support/Mangler.h"
32 #include "llvm/Target/TargetAsmInfo.h"
33 #include "llvm/Target/TargetOptions.h"
34 using namespace llvm;
35
36 static X86MachineFunctionInfo calculateFunctionInfo(const Function *F,
37                                                     const TargetData *TD) {
38   X86MachineFunctionInfo Info;
39   uint64_t Size = 0;
40   
41   switch (F->getCallingConv()) {
42   case CallingConv::X86_StdCall:
43     Info.setDecorationStyle(StdCall);
44     break;
45   case CallingConv::X86_FastCall:
46     Info.setDecorationStyle(FastCall);
47     break;
48   default:
49     return Info;
50   }
51
52   unsigned argNum = 1;
53   for (Function::const_arg_iterator AI = F->arg_begin(), AE = F->arg_end();
54        AI != AE; ++AI, ++argNum) {
55     const Type* Ty = AI->getType();
56
57     // 'Dereference' type in case of byval parameter attribute
58     if (F->paramHasAttr(argNum, ParamAttr::ByVal))
59       Ty = cast<PointerType>(Ty)->getElementType();
60
61     // Size should be aligned to DWORD boundary
62     Size += ((TD->getABITypeSize(Ty) + 3)/4)*4;
63   }
64
65   // We're not supporting tooooo huge arguments :)
66   Info.setBytesToPopOnReturn((unsigned int)Size);
67   return Info;
68 }
69
70
71 /// decorateName - Query FunctionInfoMap and use this information for various
72 /// name decoration.
73 void X86SharedAsmPrinter::decorateName(std::string &Name,
74                                        const GlobalValue *GV) {
75   const Function *F = dyn_cast<Function>(GV);
76   if (!F) return;
77
78   // We don't want to decorate non-stdcall or non-fastcall functions right now
79   unsigned CC = F->getCallingConv();
80   if (CC != CallingConv::X86_StdCall && CC != CallingConv::X86_FastCall)
81     return;
82
83   // Decorate names only when we're targeting Cygwin/Mingw32 targets
84   if (!Subtarget->isTargetCygMing())
85     return;
86     
87   FMFInfoMap::const_iterator info_item = FunctionInfoMap.find(F);
88
89   const X86MachineFunctionInfo *Info;
90   if (info_item == FunctionInfoMap.end()) {
91     // Calculate apropriate function info and populate map
92     FunctionInfoMap[F] = calculateFunctionInfo(F, TM.getTargetData());
93     Info = &FunctionInfoMap[F];
94   } else {
95     Info = &info_item->second;
96   }
97   
98   const FunctionType *FT = F->getFunctionType();
99   switch (Info->getDecorationStyle()) {
100   case None:
101     break;
102   case StdCall:
103     // "Pure" variadic functions do not receive @0 suffix.
104     if (!FT->isVarArg() || (FT->getNumParams() == 0) ||
105         (FT->getNumParams() == 1 && F->hasStructRetAttr()))
106       Name += '@' + utostr_32(Info->getBytesToPopOnReturn());
107     break;
108   case FastCall:
109     // "Pure" variadic functions do not receive @0 suffix.
110     if (!FT->isVarArg() || (FT->getNumParams() == 0) ||
111         (FT->getNumParams() == 1 && F->hasStructRetAttr()))
112       Name += '@' + utostr_32(Info->getBytesToPopOnReturn());
113
114     if (Name[0] == '_') {
115       Name[0] = '@';
116     } else {
117       Name = '@' + Name;
118     }    
119     break;
120   default:
121     assert(0 && "Unsupported DecorationStyle");
122   }
123 }
124
125 /// doInitialization
126 bool X86SharedAsmPrinter::doInitialization(Module &M) {
127   if (TAI->doesSupportDebugInformation()) {
128     // Emit initial debug information.
129     DW.BeginModule(&M);
130   }
131
132   bool Result = AsmPrinter::doInitialization(M);
133
134   // Darwin wants symbols to be quoted if they have complex names.
135   if (Subtarget->isTargetDarwin())
136     Mang->setUseQuotes(true);
137
138   return Result;
139 }
140
141 /// PrintUnmangledNameSafely - Print out the printable characters in the name.
142 /// Don't print things like \n or \0.
143 static void PrintUnmangledNameSafely(const Value *V, std::ostream &OS) {
144   for (const char *Name = V->getNameStart(), *E = Name+V->getNameLen();
145        Name != E; ++Name)
146     if (isprint(*Name))
147       OS << *Name;
148 }
149
150 bool X86SharedAsmPrinter::doFinalization(Module &M) {
151   // Note: this code is not shared by the Intel printer as it is too different
152   // from how MASM does things.  When making changes here don't forget to look
153   // at X86IntelAsmPrinter::doFinalization().
154   const TargetData *TD = TM.getTargetData();
155   
156   // Print out module-level global variables here.
157   for (Module::const_global_iterator I = M.global_begin(), E = M.global_end();
158        I != E; ++I) {
159     if (!I->hasInitializer())
160       continue;   // External global require no code
161     
162     // Check to see if this is a special global used by LLVM, if so, emit it.
163     if (EmitSpecialLLVMGlobal(I)) {
164       if (Subtarget->isTargetDarwin() &&
165           TM.getRelocationModel() == Reloc::Static) {
166         if (I->getName() == "llvm.global_ctors")
167           O << ".reference .constructors_used\n";
168         else if (I->getName() == "llvm.global_dtors")
169           O << ".reference .destructors_used\n";
170       }
171       continue;
172     }
173     
174     std::string name = Mang->getValueName(I);
175     Constant *C = I->getInitializer();
176     const Type *Type = C->getType();
177     unsigned Size = TD->getABITypeSize(Type);
178     unsigned Align = TD->getPreferredAlignmentLog(I);
179
180     if (I->hasHiddenVisibility()) {
181       if (const char *Directive = TAI->getHiddenDirective())
182         O << Directive << name << "\n";
183     } else if (I->hasProtectedVisibility()) {
184       if (const char *Directive = TAI->getProtectedDirective())
185         O << Directive << name << "\n";
186     }
187     
188     if (Subtarget->isTargetELF())
189       O << "\t.type\t" << name << ",@object\n";
190     
191     if (C->isNullValue() && !I->hasSection()) {
192       if (I->hasExternalLinkage()) {
193         if (const char *Directive = TAI->getZeroFillDirective()) {
194           O << "\t.globl " << name << "\n";
195           O << Directive << "__DATA, __common, " << name << ", "
196             << Size << ", " << Align << "\n";
197           continue;
198         }
199       }
200       
201       if (!I->isThreadLocal() &&
202           (I->hasInternalLinkage() || I->hasWeakLinkage() ||
203            I->hasLinkOnceLinkage() || I->hasCommonLinkage())) {
204         if (Size == 0) Size = 1;   // .comm Foo, 0 is undefined, avoid it.
205         if (!NoZerosInBSS && TAI->getBSSSection())
206           SwitchToDataSection(TAI->getBSSSection(), I);
207         else
208           SwitchToDataSection(TAI->getDataSection(), I);
209         if (TAI->getLCOMMDirective() != NULL) {
210           if (I->hasInternalLinkage()) {
211             O << TAI->getLCOMMDirective() << name << "," << Size;
212             if (Subtarget->isTargetDarwin())
213               O << "," << Align;
214           } else if (Subtarget->isTargetDarwin() && !I->hasCommonLinkage()) {
215             O << "\t.globl " << name << "\n"
216               << TAI->getWeakDefDirective() << name << "\n";
217             SwitchToDataSection("\t.section __DATA,__datacoal_nt,coalesced", I);
218             EmitAlignment(Align, I);
219             O << name << ":\t\t\t\t" << TAI->getCommentString() << " ";
220             PrintUnmangledNameSafely(I, O);
221             O << "\n";
222             EmitGlobalConstant(C);
223             continue;
224           } else {
225             O << TAI->getCOMMDirective()  << name << "," << Size;
226             
227             // Leopard and above support aligned common symbols.
228             if (Subtarget->getDarwinVers() >= 9)
229               O << "," << Align;
230           }
231         } else {
232           if (!Subtarget->isTargetCygMing()) {
233             if (I->hasInternalLinkage())
234               O << "\t.local\t" << name << "\n";
235           }
236           O << TAI->getCOMMDirective()  << name << "," << Size;
237           if (TAI->getCOMMDirectiveTakesAlignment())
238             O << "," << (TAI->getAlignmentIsInBytes() ? (1 << Align) : Align);
239         }
240         O << "\t\t" << TAI->getCommentString() << " ";
241         PrintUnmangledNameSafely(I, O);
242         O << "\n";
243         continue;
244       }
245     }
246
247     switch (I->getLinkage()) {
248     case GlobalValue::CommonLinkage:
249     case GlobalValue::LinkOnceLinkage:
250     case GlobalValue::WeakLinkage:
251       if (Subtarget->isTargetDarwin()) {
252         O << "\t.globl " << name << "\n"
253           << TAI->getWeakDefDirective() << name << "\n";
254         if (!I->isConstant())
255           SwitchToDataSection("\t.section __DATA,__datacoal_nt,coalesced", I);
256         else {
257           const ArrayType *AT = dyn_cast<ArrayType>(Type);
258           if (AT && AT->getElementType()==Type::Int8Ty)
259             SwitchToDataSection("\t.section __TEXT,__const_coal,coalesced", I);
260           else
261             SwitchToDataSection("\t.section __DATA,__const_coal,coalesced", I);
262         }
263       } else if (Subtarget->isTargetCygMing()) {
264         std::string SectionName(".section\t.data$linkonce." +
265                                 name +
266                                 ",\"aw\"");
267         SwitchToDataSection(SectionName.c_str(), I);
268         O << "\t.globl\t" << name << "\n"
269           << "\t.linkonce same_size\n";
270       } else {
271         std::string SectionName("\t.section\t.llvm.linkonce.d." +
272                                 name +
273                                 ",\"aw\",@progbits");
274         SwitchToDataSection(SectionName.c_str(), I);
275         O << "\t.weak\t" << name << "\n";
276       }
277       break;
278     case GlobalValue::DLLExportLinkage:
279       DLLExportedGVs.insert(Mang->makeNameProper(I->getName(),""));
280       // FALL THROUGH
281     case GlobalValue::AppendingLinkage:
282       // FIXME: appending linkage variables should go into a section of
283       // their name or something.  For now, just emit them as external.
284     case GlobalValue::ExternalLinkage:
285       // If external or appending, declare as a global symbol
286       O << "\t.globl " << name << "\n";
287       // FALL THROUGH
288     case GlobalValue::InternalLinkage: {
289       if (I->isConstant()) {
290         const ConstantArray *CVA = dyn_cast<ConstantArray>(C);
291         if (TAI->getCStringSection() && CVA && CVA->isCString()) {
292           SwitchToDataSection(TAI->getCStringSection(), I);
293           break;
294         }
295       }
296       // FIXME: special handling for ".ctors" & ".dtors" sections
297       if (I->hasSection() &&
298           (I->getSection() == ".ctors" ||
299            I->getSection() == ".dtors")) {
300         std::string SectionName = ".section " + I->getSection();
301         
302         if (Subtarget->isTargetCygMing()) {
303           SectionName += ",\"aw\"";
304         } else {
305           assert(!Subtarget->isTargetDarwin());
306           SectionName += ",\"aw\",@progbits";
307         }
308         SwitchToDataSection(SectionName.c_str());
309       } else if (I->hasSection() && Subtarget->isTargetDarwin()) {
310         // Honor all section names on Darwin; ObjC uses this
311         std::string SectionName = ".section " + I->getSection();
312         SwitchToDataSection(SectionName.c_str());
313       } else {
314         if (C->isNullValue() && !NoZerosInBSS && TAI->getBSSSection())
315           SwitchToDataSection(I->isThreadLocal() ? TAI->getTLSBSSSection() :
316                               TAI->getBSSSection(), I);
317         else if (!I->isConstant())
318           SwitchToDataSection(I->isThreadLocal() ? TAI->getTLSDataSection() :
319                               TAI->getDataSection(), I);
320         else if (I->isThreadLocal())
321           SwitchToDataSection(TAI->getTLSDataSection());
322         else {
323           // Read-only data.
324           bool HasReloc = C->ContainsRelocations();
325           if (HasReloc &&
326               Subtarget->isTargetDarwin() &&
327               TM.getRelocationModel() != Reloc::Static)
328             SwitchToDataSection("\t.const_data\n");
329           else if (!HasReloc && Size == 4 &&
330                    TAI->getFourByteConstantSection())
331             SwitchToDataSection(TAI->getFourByteConstantSection(), I);
332           else if (!HasReloc && Size == 8 &&
333                    TAI->getEightByteConstantSection())
334             SwitchToDataSection(TAI->getEightByteConstantSection(), I);
335           else if (!HasReloc && Size == 16 &&
336                    TAI->getSixteenByteConstantSection())
337             SwitchToDataSection(TAI->getSixteenByteConstantSection(), I);
338           else if (TAI->getReadOnlySection())
339             SwitchToDataSection(TAI->getReadOnlySection(), I);
340           else
341             SwitchToDataSection(TAI->getDataSection(), I);
342         }
343       }
344       
345       break;
346     }
347     default:
348       assert(0 && "Unknown linkage type!");
349     }
350
351     EmitAlignment(Align, I);
352     O << name << ":\t\t\t\t" << TAI->getCommentString() << " ";
353     PrintUnmangledNameSafely(I, O);
354     O << "\n";
355     if (TAI->hasDotTypeDotSizeDirective())
356       O << "\t.size\t" << name << ", " << Size << "\n";
357     // If the initializer is a extern weak symbol, remember to emit the weak
358     // reference!
359     if (const GlobalValue *GV = dyn_cast<GlobalValue>(C))
360       if (GV->hasExternalWeakLinkage())
361         ExtWeakSymbols.insert(GV);
362
363     EmitGlobalConstant(C);
364   }
365   
366   // Output linker support code for dllexported globals
367   if (!DLLExportedGVs.empty()) {
368     SwitchToDataSection(".section .drectve");
369   }
370
371   for (StringSet<>::iterator i = DLLExportedGVs.begin(),
372          e = DLLExportedGVs.end();
373          i != e; ++i) {
374     O << "\t.ascii \" -export:" << i->getKeyData() << ",data\"\n";
375   }
376
377   if (!DLLExportedFns.empty()) {
378     SwitchToDataSection(".section .drectve");
379   }
380
381   for (StringSet<>::iterator i = DLLExportedFns.begin(),
382          e = DLLExportedFns.end();
383          i != e; ++i) {
384     O << "\t.ascii \" -export:" << i->getKeyData() << "\"\n";
385   }
386
387   if (Subtarget->isTargetDarwin()) {
388     SwitchToDataSection("");
389
390     // Output stubs for dynamically-linked functions
391     unsigned j = 1;
392     for (StringSet<>::iterator i = FnStubs.begin(), e = FnStubs.end();
393          i != e; ++i, ++j) {
394       SwitchToDataSection("\t.section __IMPORT,__jump_table,symbol_stubs,"
395                           "self_modifying_code+pure_instructions,5", 0);
396       std::string p = i->getKeyData();
397       printSuffixedName(p, "$stub");
398       O << ":\n";
399       O << "\t.indirect_symbol " << p << "\n";
400       O << "\thlt ; hlt ; hlt ; hlt ; hlt\n";
401     }
402
403     O << "\n";
404
405     if (TAI->doesSupportExceptionHandling() && MMI && !Subtarget->is64Bit()) {
406       // Add the (possibly multiple) personalities to the set of global values.
407       // Only referenced functions get into the Personalities list.
408       const std::vector<Function *>& Personalities = MMI->getPersonalities();
409
410       for (std::vector<Function *>::const_iterator I = Personalities.begin(),
411              E = Personalities.end(); I != E; ++I)
412         if (*I) GVStubs.insert("_" + (*I)->getName());
413     }
414
415     // Output stubs for external and common global variables.
416     if (!GVStubs.empty())
417       SwitchToDataSection(
418                     "\t.section __IMPORT,__pointers,non_lazy_symbol_pointers");
419     for (StringSet<>::iterator i = GVStubs.begin(), e = GVStubs.end();
420          i != e; ++i) {
421       std::string p = i->getKeyData();
422       printSuffixedName(p, "$non_lazy_ptr");
423       O << ":\n";
424       O << "\t.indirect_symbol " << p << "\n";
425       O << "\t.long\t0\n";
426     }
427
428     // Emit final debug information.
429     DW.EndModule();
430
431     // Funny Darwin hack: This flag tells the linker that no global symbols
432     // contain code that falls through to other global symbols (e.g. the obvious
433     // implementation of multiple entry points).  If this doesn't occur, the
434     // linker can safely perform dead code stripping.  Since LLVM never
435     // generates code that does this, it is always safe to set.
436     O << "\t.subsections_via_symbols\n";
437   } else if (Subtarget->isTargetCygMing()) {
438     // Emit type information for external functions
439     for (StringSet<>::iterator i = FnStubs.begin(), e = FnStubs.end();
440          i != e; ++i) {
441       O << "\t.def\t " << i->getKeyData()
442         << ";\t.scl\t" << COFF::C_EXT
443         << ";\t.type\t" << (COFF::DT_FCN << COFF::N_BTSHFT)
444         << ";\t.endef\n";
445     }
446
447     // Emit final debug information.
448     DW.EndModule();
449   } else if (Subtarget->isTargetELF()) {
450     // Emit final debug information.
451     DW.EndModule();
452   }
453
454   return AsmPrinter::doFinalization(M);
455 }
456
457 /// createX86CodePrinterPass - Returns a pass that prints the X86 assembly code
458 /// for a MachineFunction to the given output stream, using the given target
459 /// machine description.
460 ///
461 FunctionPass *llvm::createX86CodePrinterPass(std::ostream &o,
462                                              X86TargetMachine &tm) {
463   const X86Subtarget *Subtarget = &tm.getSubtarget<X86Subtarget>();
464
465   if (Subtarget->isFlavorIntel()) {
466     return new X86IntelAsmPrinter(o, tm, tm.getTargetAsmInfo());
467   } else {
468     return new X86ATTAsmPrinter(o, tm, tm.getTargetAsmInfo());
469   }
470 }