[MC/Mach-O] Implement integrated assembler support for linker options.
[oota-llvm.git] / lib / CodeGen / TargetLoweringObjectFileImpl.cpp
1 //===-- llvm/CodeGen/TargetLoweringObjectFileImpl.cpp - Object File Info --===//
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 implements classes used to handle lowerings specific to common
11 // object file formats.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"
16 #include "llvm/ADT/SmallString.h"
17 #include "llvm/ADT/StringExtras.h"
18 #include "llvm/ADT/Triple.h"
19 #include "llvm/CodeGen/MachineModuleInfoImpls.h"
20 #include "llvm/IR/Constants.h"
21 #include "llvm/IR/DataLayout.h"
22 #include "llvm/IR/DerivedTypes.h"
23 #include "llvm/IR/Function.h"
24 #include "llvm/IR/GlobalVariable.h"
25 #include "llvm/IR/Module.h"
26 #include "llvm/MC/MCContext.h"
27 #include "llvm/MC/MCExpr.h"
28 #include "llvm/MC/MCSectionCOFF.h"
29 #include "llvm/MC/MCSectionELF.h"
30 #include "llvm/MC/MCSectionMachO.h"
31 #include "llvm/MC/MCStreamer.h"
32 #include "llvm/MC/MCSymbol.h"
33 #include "llvm/Support/Dwarf.h"
34 #include "llvm/Support/ELF.h"
35 #include "llvm/Support/ErrorHandling.h"
36 #include "llvm/Support/raw_ostream.h"
37 #include "llvm/Target/Mangler.h"
38 #include "llvm/Target/TargetMachine.h"
39 #include "llvm/Target/TargetOptions.h"
40 using namespace llvm;
41 using namespace dwarf;
42
43 //===----------------------------------------------------------------------===//
44 //                                  ELF
45 //===----------------------------------------------------------------------===//
46
47 MCSymbol *
48 TargetLoweringObjectFileELF::getCFIPersonalitySymbol(const GlobalValue *GV,
49                                                      Mangler *Mang,
50                                                 MachineModuleInfo *MMI) const {
51   unsigned Encoding = getPersonalityEncoding();
52   switch (Encoding & 0x70) {
53   default:
54     report_fatal_error("We do not support this DWARF encoding yet!");
55   case dwarf::DW_EH_PE_absptr:
56     return  Mang->getSymbol(GV);
57   case dwarf::DW_EH_PE_pcrel: {
58     return getContext().GetOrCreateSymbol(StringRef("DW.ref.") +
59                                           Mang->getSymbol(GV)->getName());
60   }
61   }
62 }
63
64 void TargetLoweringObjectFileELF::emitPersonalityValue(MCStreamer &Streamer,
65                                                        const TargetMachine &TM,
66                                                        const MCSymbol *Sym) const {
67   SmallString<64> NameData("DW.ref.");
68   NameData += Sym->getName();
69   MCSymbol *Label = getContext().GetOrCreateSymbol(NameData);
70   Streamer.EmitSymbolAttribute(Label, MCSA_Hidden);
71   Streamer.EmitSymbolAttribute(Label, MCSA_Weak);
72   StringRef Prefix = ".data.";
73   NameData.insert(NameData.begin(), Prefix.begin(), Prefix.end());
74   unsigned Flags = ELF::SHF_ALLOC | ELF::SHF_WRITE | ELF::SHF_GROUP;
75   const MCSection *Sec = getContext().getELFSection(NameData,
76                                                     ELF::SHT_PROGBITS,
77                                                     Flags,
78                                                     SectionKind::getDataRel(),
79                                                     0, Label->getName());
80   unsigned Size = TM.getDataLayout()->getPointerSize();
81   Streamer.SwitchSection(Sec);
82   Streamer.EmitValueToAlignment(TM.getDataLayout()->getPointerABIAlignment());
83   Streamer.EmitSymbolAttribute(Label, MCSA_ELF_TypeObject);
84   const MCExpr *E = MCConstantExpr::Create(Size, getContext());
85   Streamer.EmitELFSize(Label, E);
86   Streamer.EmitLabel(Label);
87
88   Streamer.EmitSymbolValue(Sym, Size);
89 }
90
91 const MCExpr *TargetLoweringObjectFileELF::
92 getTTypeGlobalReference(const GlobalValue *GV, Mangler *Mang,
93                         MachineModuleInfo *MMI, unsigned Encoding,
94                         MCStreamer &Streamer) const {
95
96   if (Encoding & dwarf::DW_EH_PE_indirect) {
97     MachineModuleInfoELF &ELFMMI = MMI->getObjFileInfo<MachineModuleInfoELF>();
98
99     SmallString<128> Name;
100     Mang->getNameWithPrefix(Name, GV, true);
101     Name += ".DW.stub";
102
103     // Add information about the stub reference to ELFMMI so that the stub
104     // gets emitted by the asmprinter.
105     MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str());
106     MachineModuleInfoImpl::StubValueTy &StubSym = ELFMMI.getGVStubEntry(SSym);
107     if (StubSym.getPointer() == 0) {
108       MCSymbol *Sym = Mang->getSymbol(GV);
109       StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
110     }
111
112     return TargetLoweringObjectFile::
113       getTTypeReference(MCSymbolRefExpr::Create(SSym, getContext()),
114                         Encoding & ~dwarf::DW_EH_PE_indirect, Streamer);
115   }
116
117   return TargetLoweringObjectFile::
118     getTTypeGlobalReference(GV, Mang, MMI, Encoding, Streamer);
119 }
120
121 static SectionKind
122 getELFKindForNamedSection(StringRef Name, SectionKind K) {
123   // N.B.: The defaults used in here are no the same ones used in MC.
124   // We follow gcc, MC follows gas. For example, given ".section .eh_frame",
125   // both gas and MC will produce a section with no flags. Given
126   // section(".eh_frame") gcc will produce:
127   //
128   //   .section   .eh_frame,"a",@progbits
129   if (Name.empty() || Name[0] != '.') return K;
130
131   // Some lame default implementation based on some magic section names.
132   if (Name == ".bss" ||
133       Name.startswith(".bss.") ||
134       Name.startswith(".gnu.linkonce.b.") ||
135       Name.startswith(".llvm.linkonce.b.") ||
136       Name == ".sbss" ||
137       Name.startswith(".sbss.") ||
138       Name.startswith(".gnu.linkonce.sb.") ||
139       Name.startswith(".llvm.linkonce.sb."))
140     return SectionKind::getBSS();
141
142   if (Name == ".tdata" ||
143       Name.startswith(".tdata.") ||
144       Name.startswith(".gnu.linkonce.td.") ||
145       Name.startswith(".llvm.linkonce.td."))
146     return SectionKind::getThreadData();
147
148   if (Name == ".tbss" ||
149       Name.startswith(".tbss.") ||
150       Name.startswith(".gnu.linkonce.tb.") ||
151       Name.startswith(".llvm.linkonce.tb."))
152     return SectionKind::getThreadBSS();
153
154   return K;
155 }
156
157
158 static unsigned getELFSectionType(StringRef Name, SectionKind K) {
159
160   if (Name == ".init_array")
161     return ELF::SHT_INIT_ARRAY;
162
163   if (Name == ".fini_array")
164     return ELF::SHT_FINI_ARRAY;
165
166   if (Name == ".preinit_array")
167     return ELF::SHT_PREINIT_ARRAY;
168
169   if (K.isBSS() || K.isThreadBSS())
170     return ELF::SHT_NOBITS;
171
172   return ELF::SHT_PROGBITS;
173 }
174
175
176 static unsigned
177 getELFSectionFlags(SectionKind K) {
178   unsigned Flags = 0;
179
180   if (!K.isMetadata())
181     Flags |= ELF::SHF_ALLOC;
182
183   if (K.isText())
184     Flags |= ELF::SHF_EXECINSTR;
185
186   if (K.isWriteable())
187     Flags |= ELF::SHF_WRITE;
188
189   if (K.isThreadLocal())
190     Flags |= ELF::SHF_TLS;
191
192   // K.isMergeableConst() is left out to honour PR4650
193   if (K.isMergeableCString() || K.isMergeableConst4() ||
194       K.isMergeableConst8() || K.isMergeableConst16())
195     Flags |= ELF::SHF_MERGE;
196
197   if (K.isMergeableCString())
198     Flags |= ELF::SHF_STRINGS;
199
200   return Flags;
201 }
202
203
204 const MCSection *TargetLoweringObjectFileELF::
205 getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
206                          Mangler *Mang, const TargetMachine &TM) const {
207   StringRef SectionName = GV->getSection();
208
209   // Infer section flags from the section name if we can.
210   Kind = getELFKindForNamedSection(SectionName, Kind);
211
212   return getContext().getELFSection(SectionName,
213                                     getELFSectionType(SectionName, Kind),
214                                     getELFSectionFlags(Kind), Kind);
215 }
216
217 /// getSectionPrefixForGlobal - Return the section prefix name used by options
218 /// FunctionsSections and DataSections.
219 static const char *getSectionPrefixForGlobal(SectionKind Kind) {
220   if (Kind.isText())                 return ".text.";
221   if (Kind.isReadOnly())             return ".rodata.";
222   if (Kind.isBSS())                  return ".bss.";
223
224   if (Kind.isThreadData())           return ".tdata.";
225   if (Kind.isThreadBSS())            return ".tbss.";
226
227   if (Kind.isDataNoRel())            return ".data.";
228   if (Kind.isDataRelLocal())         return ".data.rel.local.";
229   if (Kind.isDataRel())              return ".data.rel.";
230   if (Kind.isReadOnlyWithRelLocal()) return ".data.rel.ro.local.";
231
232   assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
233   return ".data.rel.ro.";
234 }
235
236
237 const MCSection *TargetLoweringObjectFileELF::
238 SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
239                        Mangler *Mang, const TargetMachine &TM) const {
240   // If we have -ffunction-section or -fdata-section then we should emit the
241   // global value to a uniqued section specifically for it.
242   bool EmitUniquedSection;
243   if (Kind.isText())
244     EmitUniquedSection = TM.getFunctionSections();
245   else
246     EmitUniquedSection = TM.getDataSections();
247
248   // If this global is linkonce/weak and the target handles this by emitting it
249   // into a 'uniqued' section name, create and return the section now.
250   if ((GV->isWeakForLinker() || EmitUniquedSection) &&
251       !Kind.isCommon()) {
252     const char *Prefix;
253     Prefix = getSectionPrefixForGlobal(Kind);
254
255     SmallString<128> Name(Prefix, Prefix+strlen(Prefix));
256     MCSymbol *Sym = Mang->getSymbol(GV);
257     Name.append(Sym->getName().begin(), Sym->getName().end());
258     StringRef Group = "";
259     unsigned Flags = getELFSectionFlags(Kind);
260     if (GV->isWeakForLinker()) {
261       Group = Sym->getName();
262       Flags |= ELF::SHF_GROUP;
263     }
264
265     return getContext().getELFSection(Name.str(),
266                                       getELFSectionType(Name.str(), Kind),
267                                       Flags, Kind, 0, Group);
268   }
269
270   if (Kind.isText()) return TextSection;
271
272   if (Kind.isMergeable1ByteCString() ||
273       Kind.isMergeable2ByteCString() ||
274       Kind.isMergeable4ByteCString()) {
275
276     // We also need alignment here.
277     // FIXME: this is getting the alignment of the character, not the
278     // alignment of the global!
279     unsigned Align =
280       TM.getDataLayout()->getPreferredAlignment(cast<GlobalVariable>(GV));
281
282     const char *SizeSpec = ".rodata.str1.";
283     if (Kind.isMergeable2ByteCString())
284       SizeSpec = ".rodata.str2.";
285     else if (Kind.isMergeable4ByteCString())
286       SizeSpec = ".rodata.str4.";
287     else
288       assert(Kind.isMergeable1ByteCString() && "unknown string width");
289
290
291     std::string Name = SizeSpec + utostr(Align);
292     return getContext().getELFSection(Name, ELF::SHT_PROGBITS,
293                                       ELF::SHF_ALLOC |
294                                       ELF::SHF_MERGE |
295                                       ELF::SHF_STRINGS,
296                                       Kind);
297   }
298
299   if (Kind.isMergeableConst()) {
300     if (Kind.isMergeableConst4() && MergeableConst4Section)
301       return MergeableConst4Section;
302     if (Kind.isMergeableConst8() && MergeableConst8Section)
303       return MergeableConst8Section;
304     if (Kind.isMergeableConst16() && MergeableConst16Section)
305       return MergeableConst16Section;
306     return ReadOnlySection;  // .const
307   }
308
309   if (Kind.isReadOnly())             return ReadOnlySection;
310
311   if (Kind.isThreadData())           return TLSDataSection;
312   if (Kind.isThreadBSS())            return TLSBSSSection;
313
314   // Note: we claim that common symbols are put in BSSSection, but they are
315   // really emitted with the magic .comm directive, which creates a symbol table
316   // entry but not a section.
317   if (Kind.isBSS() || Kind.isCommon()) return BSSSection;
318
319   if (Kind.isDataNoRel())            return DataSection;
320   if (Kind.isDataRelLocal())         return DataRelLocalSection;
321   if (Kind.isDataRel())              return DataRelSection;
322   if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection;
323
324   assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
325   return DataRelROSection;
326 }
327
328 /// getSectionForConstant - Given a mergeable constant with the
329 /// specified size and relocation information, return a section that it
330 /// should be placed in.
331 const MCSection *TargetLoweringObjectFileELF::
332 getSectionForConstant(SectionKind Kind) const {
333   if (Kind.isMergeableConst4() && MergeableConst4Section)
334     return MergeableConst4Section;
335   if (Kind.isMergeableConst8() && MergeableConst8Section)
336     return MergeableConst8Section;
337   if (Kind.isMergeableConst16() && MergeableConst16Section)
338     return MergeableConst16Section;
339   if (Kind.isReadOnly())
340     return ReadOnlySection;
341
342   if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection;
343   assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
344   return DataRelROSection;
345 }
346
347 const MCSection *
348 TargetLoweringObjectFileELF::getStaticCtorSection(unsigned Priority) const {
349   // The default scheme is .ctor / .dtor, so we have to invert the priority
350   // numbering.
351   if (Priority == 65535)
352     return StaticCtorSection;
353
354   if (UseInitArray) {
355     std::string Name = std::string(".init_array.") + utostr(Priority);
356     return getContext().getELFSection(Name, ELF::SHT_INIT_ARRAY,
357                                       ELF::SHF_ALLOC | ELF::SHF_WRITE,
358                                       SectionKind::getDataRel());
359   } else {
360     std::string Name = std::string(".ctors.") + utostr(65535 - Priority);
361     return getContext().getELFSection(Name, ELF::SHT_PROGBITS,
362                                       ELF::SHF_ALLOC |ELF::SHF_WRITE,
363                                       SectionKind::getDataRel());
364   }
365 }
366
367 const MCSection *
368 TargetLoweringObjectFileELF::getStaticDtorSection(unsigned Priority) const {
369   // The default scheme is .ctor / .dtor, so we have to invert the priority
370   // numbering.
371   if (Priority == 65535)
372     return StaticDtorSection;
373
374   if (UseInitArray) {
375     std::string Name = std::string(".fini_array.") + utostr(Priority);
376     return getContext().getELFSection(Name, ELF::SHT_FINI_ARRAY,
377                                       ELF::SHF_ALLOC | ELF::SHF_WRITE,
378                                       SectionKind::getDataRel());
379   } else {
380     std::string Name = std::string(".dtors.") + utostr(65535 - Priority);
381     return getContext().getELFSection(Name, ELF::SHT_PROGBITS,
382                                       ELF::SHF_ALLOC |ELF::SHF_WRITE,
383                                       SectionKind::getDataRel());
384   }
385 }
386
387 void
388 TargetLoweringObjectFileELF::InitializeELF(bool UseInitArray_) {
389   UseInitArray = UseInitArray_;
390   if (!UseInitArray)
391     return;
392
393   StaticCtorSection =
394     getContext().getELFSection(".init_array", ELF::SHT_INIT_ARRAY,
395                                ELF::SHF_WRITE |
396                                ELF::SHF_ALLOC,
397                                SectionKind::getDataRel());
398   StaticDtorSection =
399     getContext().getELFSection(".fini_array", ELF::SHT_FINI_ARRAY,
400                                ELF::SHF_WRITE |
401                                ELF::SHF_ALLOC,
402                                SectionKind::getDataRel());
403 }
404
405 //===----------------------------------------------------------------------===//
406 //                                 MachO
407 //===----------------------------------------------------------------------===//
408
409 /// emitModuleFlags - Perform code emission for module flags.
410 void TargetLoweringObjectFileMachO::
411 emitModuleFlags(MCStreamer &Streamer,
412                 ArrayRef<Module::ModuleFlagEntry> ModuleFlags,
413                 Mangler *Mang, const TargetMachine &TM) const {
414   unsigned VersionVal = 0;
415   unsigned ImageInfoFlags = 0;
416   MDNode *LinkerOptions = 0;
417   StringRef SectionVal;
418
419   for (ArrayRef<Module::ModuleFlagEntry>::iterator
420          i = ModuleFlags.begin(), e = ModuleFlags.end(); i != e; ++i) {
421     const Module::ModuleFlagEntry &MFE = *i;
422
423     // Ignore flags with 'Require' behavior.
424     if (MFE.Behavior == Module::Require)
425       continue;
426
427     StringRef Key = MFE.Key->getString();
428     Value *Val = MFE.Val;
429
430     if (Key == "Objective-C Image Info Version") {
431       VersionVal = cast<ConstantInt>(Val)->getZExtValue();
432     } else if (Key == "Objective-C Garbage Collection" ||
433                Key == "Objective-C GC Only" ||
434                Key == "Objective-C Is Simulated") {
435       ImageInfoFlags |= cast<ConstantInt>(Val)->getZExtValue();
436     } else if (Key == "Objective-C Image Info Section") {
437       SectionVal = cast<MDString>(Val)->getString();
438     } else if (Key == "Linker Options") {
439       LinkerOptions = cast<MDNode>(Val);
440     }
441   }
442
443   // Emit the linker options if present.
444   if (LinkerOptions) {
445     for (unsigned i = 0, e = LinkerOptions->getNumOperands(); i != e; ++i) {
446       MDNode *MDOptions = cast<MDNode>(LinkerOptions->getOperand(i));
447       SmallVector<std::string, 4> StrOptions;
448
449       // Convert to strings.
450       for (unsigned ii = 0, ie = MDOptions->getNumOperands(); ii != ie; ++ii) {
451         MDString *MDOption = cast<MDString>(MDOptions->getOperand(ii));
452         StrOptions.push_back(MDOption->getString());
453       }
454
455       Streamer.EmitLinkerOptions(StrOptions);
456     }
457   }
458
459   // The section is mandatory. If we don't have it, then we don't have GC info.
460   if (SectionVal.empty()) return;
461
462   StringRef Segment, Section;
463   unsigned TAA = 0, StubSize = 0;
464   bool TAAParsed;
465   std::string ErrorCode =
466     MCSectionMachO::ParseSectionSpecifier(SectionVal, Segment, Section,
467                                           TAA, TAAParsed, StubSize);
468   if (!ErrorCode.empty())
469     // If invalid, report the error with report_fatal_error.
470     report_fatal_error("Invalid section specifier '" + Section + "': " +
471                        ErrorCode + ".");
472
473   // Get the section.
474   const MCSectionMachO *S =
475     getContext().getMachOSection(Segment, Section, TAA, StubSize,
476                                  SectionKind::getDataNoRel());
477   Streamer.SwitchSection(S);
478   Streamer.EmitLabel(getContext().
479                      GetOrCreateSymbol(StringRef("L_OBJC_IMAGE_INFO")));
480   Streamer.EmitIntValue(VersionVal, 4);
481   Streamer.EmitIntValue(ImageInfoFlags, 4);
482   Streamer.AddBlankLine();
483 }
484
485 const MCSection *TargetLoweringObjectFileMachO::
486 getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
487                          Mangler *Mang, const TargetMachine &TM) const {
488   // Parse the section specifier and create it if valid.
489   StringRef Segment, Section;
490   unsigned TAA = 0, StubSize = 0;
491   bool TAAParsed;
492   std::string ErrorCode =
493     MCSectionMachO::ParseSectionSpecifier(GV->getSection(), Segment, Section,
494                                           TAA, TAAParsed, StubSize);
495   if (!ErrorCode.empty()) {
496     // If invalid, report the error with report_fatal_error.
497     report_fatal_error("Global variable '" + GV->getName() +
498                        "' has an invalid section specifier '" +
499                        GV->getSection() + "': " + ErrorCode + ".");
500   }
501
502   // Get the section.
503   const MCSectionMachO *S =
504     getContext().getMachOSection(Segment, Section, TAA, StubSize, Kind);
505
506   // If TAA wasn't set by ParseSectionSpecifier() above,
507   // use the value returned by getMachOSection() as a default.
508   if (!TAAParsed)
509     TAA = S->getTypeAndAttributes();
510
511   // Okay, now that we got the section, verify that the TAA & StubSize agree.
512   // If the user declared multiple globals with different section flags, we need
513   // to reject it here.
514   if (S->getTypeAndAttributes() != TAA || S->getStubSize() != StubSize) {
515     // If invalid, report the error with report_fatal_error.
516     report_fatal_error("Global variable '" + GV->getName() +
517                        "' section type or attributes does not match previous"
518                        " section specifier");
519   }
520
521   return S;
522 }
523
524 const MCSection *TargetLoweringObjectFileMachO::
525 SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
526                        Mangler *Mang, const TargetMachine &TM) const {
527
528   // Handle thread local data.
529   if (Kind.isThreadBSS()) return TLSBSSSection;
530   if (Kind.isThreadData()) return TLSDataSection;
531
532   if (Kind.isText())
533     return GV->isWeakForLinker() ? TextCoalSection : TextSection;
534
535   // If this is weak/linkonce, put this in a coalescable section, either in text
536   // or data depending on if it is writable.
537   if (GV->isWeakForLinker()) {
538     if (Kind.isReadOnly())
539       return ConstTextCoalSection;
540     return DataCoalSection;
541   }
542
543   // FIXME: Alignment check should be handled by section classifier.
544   if (Kind.isMergeable1ByteCString() &&
545       TM.getDataLayout()->getPreferredAlignment(cast<GlobalVariable>(GV)) < 32)
546     return CStringSection;
547
548   // Do not put 16-bit arrays in the UString section if they have an
549   // externally visible label, this runs into issues with certain linker
550   // versions.
551   if (Kind.isMergeable2ByteCString() && !GV->hasExternalLinkage() &&
552       TM.getDataLayout()->getPreferredAlignment(cast<GlobalVariable>(GV)) < 32)
553     return UStringSection;
554
555   if (Kind.isMergeableConst()) {
556     if (Kind.isMergeableConst4())
557       return FourByteConstantSection;
558     if (Kind.isMergeableConst8())
559       return EightByteConstantSection;
560     if (Kind.isMergeableConst16() && SixteenByteConstantSection)
561       return SixteenByteConstantSection;
562   }
563
564   // Otherwise, if it is readonly, but not something we can specially optimize,
565   // just drop it in .const.
566   if (Kind.isReadOnly())
567     return ReadOnlySection;
568
569   // If this is marked const, put it into a const section.  But if the dynamic
570   // linker needs to write to it, put it in the data segment.
571   if (Kind.isReadOnlyWithRel())
572     return ConstDataSection;
573
574   // Put zero initialized globals with strong external linkage in the
575   // DATA, __common section with the .zerofill directive.
576   if (Kind.isBSSExtern())
577     return DataCommonSection;
578
579   // Put zero initialized globals with local linkage in __DATA,__bss directive
580   // with the .zerofill directive (aka .lcomm).
581   if (Kind.isBSSLocal())
582     return DataBSSSection;
583
584   // Otherwise, just drop the variable in the normal data section.
585   return DataSection;
586 }
587
588 const MCSection *
589 TargetLoweringObjectFileMachO::getSectionForConstant(SectionKind Kind) const {
590   // If this constant requires a relocation, we have to put it in the data
591   // segment, not in the text segment.
592   if (Kind.isDataRel() || Kind.isReadOnlyWithRel())
593     return ConstDataSection;
594
595   if (Kind.isMergeableConst4())
596     return FourByteConstantSection;
597   if (Kind.isMergeableConst8())
598     return EightByteConstantSection;
599   if (Kind.isMergeableConst16() && SixteenByteConstantSection)
600     return SixteenByteConstantSection;
601   return ReadOnlySection;  // .const
602 }
603
604 /// shouldEmitUsedDirectiveFor - This hook allows targets to selectively decide
605 /// not to emit the UsedDirective for some symbols in llvm.used.
606 // FIXME: REMOVE this (rdar://7071300)
607 bool TargetLoweringObjectFileMachO::
608 shouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler *Mang) const {
609   /// On Darwin, internally linked data beginning with "L" or "l" does not have
610   /// the directive emitted (this occurs in ObjC metadata).
611   if (!GV) return false;
612
613   // Check whether the mangled name has the "Private" or "LinkerPrivate" prefix.
614   if (GV->hasLocalLinkage() && !isa<Function>(GV)) {
615     // FIXME: ObjC metadata is currently emitted as internal symbols that have
616     // \1L and \0l prefixes on them.  Fix them to be Private/LinkerPrivate and
617     // this horrible hack can go away.
618     MCSymbol *Sym = Mang->getSymbol(GV);
619     if (Sym->getName()[0] == 'L' || Sym->getName()[0] == 'l')
620       return false;
621   }
622
623   return true;
624 }
625
626 const MCExpr *TargetLoweringObjectFileMachO::
627 getTTypeGlobalReference(const GlobalValue *GV, Mangler *Mang,
628                         MachineModuleInfo *MMI, unsigned Encoding,
629                         MCStreamer &Streamer) const {
630   // The mach-o version of this method defaults to returning a stub reference.
631
632   if (Encoding & DW_EH_PE_indirect) {
633     MachineModuleInfoMachO &MachOMMI =
634       MMI->getObjFileInfo<MachineModuleInfoMachO>();
635
636     SmallString<128> Name;
637     Mang->getNameWithPrefix(Name, GV, true);
638     Name += "$non_lazy_ptr";
639
640     // Add information about the stub reference to MachOMMI so that the stub
641     // gets emitted by the asmprinter.
642     MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str());
643     MachineModuleInfoImpl::StubValueTy &StubSym =
644       GV->hasHiddenVisibility() ? MachOMMI.getHiddenGVStubEntry(SSym) :
645                                   MachOMMI.getGVStubEntry(SSym);
646     if (StubSym.getPointer() == 0) {
647       MCSymbol *Sym = Mang->getSymbol(GV);
648       StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
649     }
650
651     return TargetLoweringObjectFile::
652       getTTypeReference(MCSymbolRefExpr::Create(SSym, getContext()),
653                         Encoding & ~dwarf::DW_EH_PE_indirect, Streamer);
654   }
655
656   return TargetLoweringObjectFile::
657     getTTypeGlobalReference(GV, Mang, MMI, Encoding, Streamer);
658 }
659
660 MCSymbol *TargetLoweringObjectFileMachO::
661 getCFIPersonalitySymbol(const GlobalValue *GV, Mangler *Mang,
662                         MachineModuleInfo *MMI) const {
663   // The mach-o version of this method defaults to returning a stub reference.
664   MachineModuleInfoMachO &MachOMMI =
665     MMI->getObjFileInfo<MachineModuleInfoMachO>();
666
667   SmallString<128> Name;
668   Mang->getNameWithPrefix(Name, GV, true);
669   Name += "$non_lazy_ptr";
670
671   // Add information about the stub reference to MachOMMI so that the stub
672   // gets emitted by the asmprinter.
673   MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str());
674   MachineModuleInfoImpl::StubValueTy &StubSym = MachOMMI.getGVStubEntry(SSym);
675   if (StubSym.getPointer() == 0) {
676     MCSymbol *Sym = Mang->getSymbol(GV);
677     StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
678   }
679
680   return SSym;
681 }
682
683 //===----------------------------------------------------------------------===//
684 //                                  COFF
685 //===----------------------------------------------------------------------===//
686
687 static unsigned
688 getCOFFSectionFlags(SectionKind K) {
689   unsigned Flags = 0;
690
691   if (K.isMetadata())
692     Flags |=
693       COFF::IMAGE_SCN_MEM_DISCARDABLE;
694   else if (K.isText())
695     Flags |=
696       COFF::IMAGE_SCN_MEM_EXECUTE |
697       COFF::IMAGE_SCN_MEM_READ |
698       COFF::IMAGE_SCN_CNT_CODE;
699   else if (K.isBSS ())
700     Flags |=
701       COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA |
702       COFF::IMAGE_SCN_MEM_READ |
703       COFF::IMAGE_SCN_MEM_WRITE;
704   else if (K.isThreadLocal())
705     Flags |=
706       COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
707       COFF::IMAGE_SCN_MEM_READ |
708       COFF::IMAGE_SCN_MEM_WRITE;
709   else if (K.isReadOnly())
710     Flags |=
711       COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
712       COFF::IMAGE_SCN_MEM_READ;
713   else if (K.isWriteable())
714     Flags |=
715       COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
716       COFF::IMAGE_SCN_MEM_READ |
717       COFF::IMAGE_SCN_MEM_WRITE;
718
719   return Flags;
720 }
721
722 const MCSection *TargetLoweringObjectFileCOFF::
723 getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
724                          Mangler *Mang, const TargetMachine &TM) const {
725   int Selection = 0;
726   unsigned Characteristics = getCOFFSectionFlags(Kind);
727   SmallString<128> Name(GV->getSection().c_str());
728   if (GV->isWeakForLinker()) {
729     Selection = COFF::IMAGE_COMDAT_SELECT_ANY;
730     Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT;
731     MCSymbol *Sym = Mang->getSymbol(GV);
732     Name.append("$");
733     Name.append(Sym->getName().begin() + 1, Sym->getName().end());
734   }
735   return getContext().getCOFFSection(Name,
736                                      Characteristics,
737                                      Selection,
738                                      Kind);
739 }
740
741 static const char *getCOFFSectionPrefixForUniqueGlobal(SectionKind Kind) {
742   if (Kind.isText())
743     return ".text$";
744   if (Kind.isBSS ())
745     return ".bss$";
746   if (Kind.isThreadLocal())
747     return ".tls$";
748   if (Kind.isWriteable())
749     return ".data$";
750   return ".rdata$";
751 }
752
753
754 const MCSection *TargetLoweringObjectFileCOFF::
755 SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
756                        Mangler *Mang, const TargetMachine &TM) const {
757
758   // If this global is linkonce/weak and the target handles this by emitting it
759   // into a 'uniqued' section name, create and return the section now.
760   if (GV->isWeakForLinker()) {
761     const char *Prefix = getCOFFSectionPrefixForUniqueGlobal(Kind);
762     SmallString<128> Name(Prefix, Prefix+strlen(Prefix));
763     MCSymbol *Sym = Mang->getSymbol(GV);
764     Name.append(Sym->getName().begin() + 1, Sym->getName().end());
765
766     unsigned Characteristics = getCOFFSectionFlags(Kind);
767
768     Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT;
769
770     return getContext().getCOFFSection(Name.str(), Characteristics,
771                           COFF::IMAGE_COMDAT_SELECT_ANY, Kind);
772   }
773
774   if (Kind.isText())
775     return getTextSection();
776
777   if (Kind.isThreadLocal())
778     return getTLSDataSection();
779
780   return getDataSection();
781 }
782