Move type handling to make sure we get all created types that aren't
[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/Constants.h"
17 #include "llvm/DerivedTypes.h"
18 #include "llvm/Function.h"
19 #include "llvm/GlobalVariable.h"
20 #include "llvm/CodeGen/MachineModuleInfoImpls.h"
21 #include "llvm/MC/MCContext.h"
22 #include "llvm/MC/MCExpr.h"
23 #include "llvm/MC/MCSectionMachO.h"
24 #include "llvm/MC/MCSectionELF.h"
25 #include "llvm/MC/MCSectionCOFF.h"
26 #include "llvm/MC/MCStreamer.h"
27 #include "llvm/MC/MCSymbol.h"
28 #include "llvm/Target/Mangler.h"
29 #include "llvm/Target/TargetData.h"
30 #include "llvm/Target/TargetMachine.h"
31 #include "llvm/Target/TargetOptions.h"
32 #include "llvm/Support/Dwarf.h"
33 #include "llvm/Support/ELF.h"
34 #include "llvm/Support/ErrorHandling.h"
35 #include "llvm/Support/raw_ostream.h"
36 #include "llvm/ADT/SmallString.h"
37 #include "llvm/ADT/StringExtras.h"
38 #include "llvm/ADT/Triple.h"
39 using namespace llvm;
40 using namespace dwarf;
41
42 //===----------------------------------------------------------------------===//
43 //                                  ELF
44 //===----------------------------------------------------------------------===//
45
46 MCSymbol *
47 TargetLoweringObjectFileELF::getCFIPersonalitySymbol(const GlobalValue *GV,
48                                                      Mangler *Mang,
49                                                 MachineModuleInfo *MMI) const {
50   unsigned Encoding = getPersonalityEncoding();
51   switch (Encoding & 0x70) {
52   default:
53     report_fatal_error("We do not support this DWARF encoding yet!");
54   case dwarf::DW_EH_PE_absptr:
55     return  Mang->getSymbol(GV);
56     break;
57   case dwarf::DW_EH_PE_pcrel: {
58     return getContext().GetOrCreateSymbol(StringRef("DW.ref.") +
59                                           Mang->getSymbol(GV)->getName());
60     break;
61   }
62   }
63 }
64
65 void TargetLoweringObjectFileELF::emitPersonalityValue(MCStreamer &Streamer,
66                                                        const TargetMachine &TM,
67                                                        const MCSymbol *Sym) const {
68   SmallString<64> NameData("DW.ref.");
69   NameData += Sym->getName();
70   MCSymbol *Label = getContext().GetOrCreateSymbol(NameData);
71   Streamer.EmitSymbolAttribute(Label, MCSA_Hidden);
72   Streamer.EmitSymbolAttribute(Label, MCSA_Weak);
73   StringRef Prefix = ".data.";
74   NameData.insert(NameData.begin(), Prefix.begin(), Prefix.end());
75   unsigned Flags = ELF::SHF_ALLOC | ELF::SHF_WRITE | ELF::SHF_GROUP;
76   const MCSection *Sec = getContext().getELFSection(NameData,
77                                                     ELF::SHT_PROGBITS,
78                                                     Flags,
79                                                     SectionKind::getDataRel(),
80                                                     0, Label->getName());
81   Streamer.SwitchSection(Sec);
82   Streamer.EmitValueToAlignment(8);
83   Streamer.EmitSymbolAttribute(Label, MCSA_ELF_TypeObject);
84   const MCExpr *E = MCConstantExpr::Create(8, getContext());
85   Streamer.EmitELFSize(Label, E);
86   Streamer.EmitLabel(Label);
87
88   unsigned Size = TM.getTargetData()->getPointerSize();
89   Streamer.EmitSymbolValue(Sym, Size);
90 }
91
92 static SectionKind
93 getELFKindForNamedSection(StringRef Name, SectionKind K) {
94   // N.B.: The defaults used in here are no the same ones used in MC.
95   // We follow gcc, MC follows gas. For example, given ".section .eh_frame",
96   // both gas and MC will produce a section with no flags. Given
97   // section(".eh_frame") gcc will produce
98   // .section   .eh_frame,"a",@progbits
99   if (Name.empty() || Name[0] != '.') return K;
100
101   // Some lame default implementation based on some magic section names.
102   if (Name == ".bss" ||
103       Name.startswith(".bss.") ||
104       Name.startswith(".gnu.linkonce.b.") ||
105       Name.startswith(".llvm.linkonce.b.") ||
106       Name == ".sbss" ||
107       Name.startswith(".sbss.") ||
108       Name.startswith(".gnu.linkonce.sb.") ||
109       Name.startswith(".llvm.linkonce.sb."))
110     return SectionKind::getBSS();
111
112   if (Name == ".tdata" ||
113       Name.startswith(".tdata.") ||
114       Name.startswith(".gnu.linkonce.td.") ||
115       Name.startswith(".llvm.linkonce.td."))
116     return SectionKind::getThreadData();
117
118   if (Name == ".tbss" ||
119       Name.startswith(".tbss.") ||
120       Name.startswith(".gnu.linkonce.tb.") ||
121       Name.startswith(".llvm.linkonce.tb."))
122     return SectionKind::getThreadBSS();
123
124   return K;
125 }
126
127
128 static unsigned getELFSectionType(StringRef Name, SectionKind K) {
129
130   if (Name == ".init_array")
131     return ELF::SHT_INIT_ARRAY;
132
133   if (Name == ".fini_array")
134     return ELF::SHT_FINI_ARRAY;
135
136   if (Name == ".preinit_array")
137     return ELF::SHT_PREINIT_ARRAY;
138
139   if (K.isBSS() || K.isThreadBSS())
140     return ELF::SHT_NOBITS;
141
142   return ELF::SHT_PROGBITS;
143 }
144
145
146 static unsigned
147 getELFSectionFlags(SectionKind K) {
148   unsigned Flags = 0;
149
150   if (!K.isMetadata())
151     Flags |= ELF::SHF_ALLOC;
152
153   if (K.isText())
154     Flags |= ELF::SHF_EXECINSTR;
155
156   if (K.isWriteable())
157     Flags |= ELF::SHF_WRITE;
158
159   if (K.isThreadLocal())
160     Flags |= ELF::SHF_TLS;
161
162   // K.isMergeableConst() is left out to honour PR4650
163   if (K.isMergeableCString() || K.isMergeableConst4() ||
164       K.isMergeableConst8() || K.isMergeableConst16())
165     Flags |= ELF::SHF_MERGE;
166
167   if (K.isMergeableCString())
168     Flags |= ELF::SHF_STRINGS;
169
170   return Flags;
171 }
172
173
174 const MCSection *TargetLoweringObjectFileELF::
175 getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
176                          Mangler *Mang, const TargetMachine &TM) const {
177   StringRef SectionName = GV->getSection();
178
179   // Infer section flags from the section name if we can.
180   Kind = getELFKindForNamedSection(SectionName, Kind);
181
182   return getContext().getELFSection(SectionName,
183                                     getELFSectionType(SectionName, Kind),
184                                     getELFSectionFlags(Kind), Kind);
185 }
186
187 /// getSectionPrefixForGlobal - Return the section prefix name used by options
188 /// FunctionsSections and DataSections.
189 static const char *getSectionPrefixForGlobal(SectionKind Kind) {
190   if (Kind.isText())                 return ".text.";
191   if (Kind.isReadOnly())             return ".rodata.";
192
193   if (Kind.isThreadData())           return ".tdata.";
194   if (Kind.isThreadBSS())            return ".tbss.";
195
196   if (Kind.isDataNoRel())            return ".data.";
197   if (Kind.isDataRelLocal())         return ".data.rel.local.";
198   if (Kind.isDataRel())              return ".data.rel.";
199   if (Kind.isReadOnlyWithRelLocal()) return ".data.rel.ro.local.";
200
201   assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
202   return ".data.rel.ro.";
203 }
204
205
206 const MCSection *TargetLoweringObjectFileELF::
207 SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
208                        Mangler *Mang, const TargetMachine &TM) const {
209   // If we have -ffunction-section or -fdata-section then we should emit the
210   // global value to a uniqued section specifically for it.
211   bool EmitUniquedSection;
212   if (Kind.isText())
213     EmitUniquedSection = TM.getFunctionSections();
214   else
215     EmitUniquedSection = TM.getDataSections();
216
217   // If this global is linkonce/weak and the target handles this by emitting it
218   // into a 'uniqued' section name, create and return the section now.
219   if ((GV->isWeakForLinker() || EmitUniquedSection) &&
220       !Kind.isCommon() && !Kind.isBSS()) {
221     const char *Prefix;
222     Prefix = getSectionPrefixForGlobal(Kind);
223
224     SmallString<128> Name(Prefix, Prefix+strlen(Prefix));
225     MCSymbol *Sym = Mang->getSymbol(GV);
226     Name.append(Sym->getName().begin(), Sym->getName().end());
227     StringRef Group = "";
228     unsigned Flags = getELFSectionFlags(Kind);
229     if (GV->isWeakForLinker()) {
230       Group = Sym->getName();
231       Flags |= ELF::SHF_GROUP;
232     }
233
234     return getContext().getELFSection(Name.str(),
235                                       getELFSectionType(Name.str(), Kind),
236                                       Flags, Kind, 0, Group);
237   }
238
239   if (Kind.isText()) return TextSection;
240
241   if (Kind.isMergeable1ByteCString() ||
242       Kind.isMergeable2ByteCString() ||
243       Kind.isMergeable4ByteCString()) {
244
245     // We also need alignment here.
246     // FIXME: this is getting the alignment of the character, not the
247     // alignment of the global!
248     unsigned Align =
249       TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV));
250
251     const char *SizeSpec = ".rodata.str1.";
252     if (Kind.isMergeable2ByteCString())
253       SizeSpec = ".rodata.str2.";
254     else if (Kind.isMergeable4ByteCString())
255       SizeSpec = ".rodata.str4.";
256     else
257       assert(Kind.isMergeable1ByteCString() && "unknown string width");
258
259
260     std::string Name = SizeSpec + utostr(Align);
261     return getContext().getELFSection(Name, ELF::SHT_PROGBITS,
262                                       ELF::SHF_ALLOC |
263                                       ELF::SHF_MERGE |
264                                       ELF::SHF_STRINGS,
265                                       Kind);
266   }
267
268   if (Kind.isMergeableConst()) {
269     if (Kind.isMergeableConst4() && MergeableConst4Section)
270       return MergeableConst4Section;
271     if (Kind.isMergeableConst8() && MergeableConst8Section)
272       return MergeableConst8Section;
273     if (Kind.isMergeableConst16() && MergeableConst16Section)
274       return MergeableConst16Section;
275     return ReadOnlySection;  // .const
276   }
277
278   if (Kind.isReadOnly())             return ReadOnlySection;
279
280   if (Kind.isThreadData())           return TLSDataSection;
281   if (Kind.isThreadBSS())            return TLSBSSSection;
282
283   // Note: we claim that common symbols are put in BSSSection, but they are
284   // really emitted with the magic .comm directive, which creates a symbol table
285   // entry but not a section.
286   if (Kind.isBSS() || Kind.isCommon()) return BSSSection;
287
288   if (Kind.isDataNoRel())            return DataSection;
289   if (Kind.isDataRelLocal())         return DataRelLocalSection;
290   if (Kind.isDataRel())              return DataRelSection;
291   if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection;
292
293   assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
294   return DataRelROSection;
295 }
296
297 /// getSectionForConstant - Given a mergeable constant with the
298 /// specified size and relocation information, return a section that it
299 /// should be placed in.
300 const MCSection *TargetLoweringObjectFileELF::
301 getSectionForConstant(SectionKind Kind) const {
302   if (Kind.isMergeableConst4() && MergeableConst4Section)
303     return MergeableConst4Section;
304   if (Kind.isMergeableConst8() && MergeableConst8Section)
305     return MergeableConst8Section;
306   if (Kind.isMergeableConst16() && MergeableConst16Section)
307     return MergeableConst16Section;
308   if (Kind.isReadOnly())
309     return ReadOnlySection;
310
311   if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection;
312   assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
313   return DataRelROSection;
314 }
315
316 const MCExpr *TargetLoweringObjectFileELF::
317 getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
318                                MachineModuleInfo *MMI,
319                                unsigned Encoding, MCStreamer &Streamer) const {
320
321   if (Encoding & dwarf::DW_EH_PE_indirect) {
322     MachineModuleInfoELF &ELFMMI = MMI->getObjFileInfo<MachineModuleInfoELF>();
323
324     SmallString<128> Name;
325     Mang->getNameWithPrefix(Name, GV, true);
326     Name += ".DW.stub";
327
328     // Add information about the stub reference to ELFMMI so that the stub
329     // gets emitted by the asmprinter.
330     MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str());
331     MachineModuleInfoImpl::StubValueTy &StubSym = ELFMMI.getGVStubEntry(SSym);
332     if (StubSym.getPointer() == 0) {
333       MCSymbol *Sym = Mang->getSymbol(GV);
334       StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
335     }
336
337     return TargetLoweringObjectFile::
338       getExprForDwarfReference(SSym, Encoding & ~dwarf::DW_EH_PE_indirect, Streamer);
339   }
340
341   return TargetLoweringObjectFile::
342     getExprForDwarfGlobalReference(GV, Mang, MMI, Encoding, Streamer);
343 }
344
345 //===----------------------------------------------------------------------===//
346 //                                 MachO
347 //===----------------------------------------------------------------------===//
348
349 const MCSection *TargetLoweringObjectFileMachO::
350 getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
351                          Mangler *Mang, const TargetMachine &TM) const {
352   // Parse the section specifier and create it if valid.
353   StringRef Segment, Section;
354   unsigned TAA = 0, StubSize = 0;
355   bool TAAParsed;
356   std::string ErrorCode =
357     MCSectionMachO::ParseSectionSpecifier(GV->getSection(), Segment, Section,
358                                           TAA, TAAParsed, StubSize);
359   if (!ErrorCode.empty()) {
360     // If invalid, report the error with report_fatal_error.
361     report_fatal_error("Global variable '" + GV->getNameStr() +
362                       "' has an invalid section specifier '" + GV->getSection()+
363                       "': " + ErrorCode + ".");
364     // Fall back to dropping it into the data section.
365     return DataSection;
366   }
367
368   // Get the section.
369   const MCSectionMachO *S =
370     getContext().getMachOSection(Segment, Section, TAA, StubSize, Kind);
371
372   // If TAA wasn't set by ParseSectionSpecifier() above,
373   // use the value returned by getMachOSection() as a default.
374   if (!TAAParsed)
375     TAA = S->getTypeAndAttributes();
376
377   // Okay, now that we got the section, verify that the TAA & StubSize agree.
378   // If the user declared multiple globals with different section flags, we need
379   // to reject it here.
380   if (S->getTypeAndAttributes() != TAA || S->getStubSize() != StubSize) {
381     // If invalid, report the error with report_fatal_error.
382     report_fatal_error("Global variable '" + GV->getNameStr() +
383                       "' section type or attributes does not match previous"
384                       " section specifier");
385   }
386
387   return S;
388 }
389
390 const MCSection *TargetLoweringObjectFileMachO::
391 SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
392                        Mangler *Mang, const TargetMachine &TM) const {
393
394   // Handle thread local data.
395   if (Kind.isThreadBSS()) return TLSBSSSection;
396   if (Kind.isThreadData()) return TLSDataSection;
397
398   if (Kind.isText())
399     return GV->isWeakForLinker() ? TextCoalSection : TextSection;
400
401   // If this is weak/linkonce, put this in a coalescable section, either in text
402   // or data depending on if it is writable.
403   if (GV->isWeakForLinker()) {
404     if (Kind.isReadOnly())
405       return ConstTextCoalSection;
406     return DataCoalSection;
407   }
408
409   // FIXME: Alignment check should be handled by section classifier.
410   if (Kind.isMergeable1ByteCString() &&
411       TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV)) < 32)
412     return CStringSection;
413
414   // Do not put 16-bit arrays in the UString section if they have an
415   // externally visible label, this runs into issues with certain linker
416   // versions.
417   if (Kind.isMergeable2ByteCString() && !GV->hasExternalLinkage() &&
418       TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV)) < 32)
419     return UStringSection;
420
421   if (Kind.isMergeableConst()) {
422     if (Kind.isMergeableConst4())
423       return FourByteConstantSection;
424     if (Kind.isMergeableConst8())
425       return EightByteConstantSection;
426     if (Kind.isMergeableConst16() && SixteenByteConstantSection)
427       return SixteenByteConstantSection;
428   }
429
430   // Otherwise, if it is readonly, but not something we can specially optimize,
431   // just drop it in .const.
432   if (Kind.isReadOnly())
433     return ReadOnlySection;
434
435   // If this is marked const, put it into a const section.  But if the dynamic
436   // linker needs to write to it, put it in the data segment.
437   if (Kind.isReadOnlyWithRel())
438     return ConstDataSection;
439
440   // Put zero initialized globals with strong external linkage in the
441   // DATA, __common section with the .zerofill directive.
442   if (Kind.isBSSExtern())
443     return DataCommonSection;
444
445   // Put zero initialized globals with local linkage in __DATA,__bss directive
446   // with the .zerofill directive (aka .lcomm).
447   if (Kind.isBSSLocal())
448     return DataBSSSection;
449
450   // Otherwise, just drop the variable in the normal data section.
451   return DataSection;
452 }
453
454 const MCSection *
455 TargetLoweringObjectFileMachO::getSectionForConstant(SectionKind Kind) const {
456   // If this constant requires a relocation, we have to put it in the data
457   // segment, not in the text segment.
458   if (Kind.isDataRel() || Kind.isReadOnlyWithRel())
459     return ConstDataSection;
460
461   if (Kind.isMergeableConst4())
462     return FourByteConstantSection;
463   if (Kind.isMergeableConst8())
464     return EightByteConstantSection;
465   if (Kind.isMergeableConst16() && SixteenByteConstantSection)
466     return SixteenByteConstantSection;
467   return ReadOnlySection;  // .const
468 }
469
470 /// shouldEmitUsedDirectiveFor - This hook allows targets to selectively decide
471 /// not to emit the UsedDirective for some symbols in llvm.used.
472 // FIXME: REMOVE this (rdar://7071300)
473 bool TargetLoweringObjectFileMachO::
474 shouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler *Mang) const {
475   /// On Darwin, internally linked data beginning with "L" or "l" does not have
476   /// the directive emitted (this occurs in ObjC metadata).
477   if (!GV) return false;
478
479   // Check whether the mangled name has the "Private" or "LinkerPrivate" prefix.
480   if (GV->hasLocalLinkage() && !isa<Function>(GV)) {
481     // FIXME: ObjC metadata is currently emitted as internal symbols that have
482     // \1L and \0l prefixes on them.  Fix them to be Private/LinkerPrivate and
483     // this horrible hack can go away.
484     MCSymbol *Sym = Mang->getSymbol(GV);
485     if (Sym->getName()[0] == 'L' || Sym->getName()[0] == 'l')
486       return false;
487   }
488
489   return true;
490 }
491
492 const MCExpr *TargetLoweringObjectFileMachO::
493 getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
494                                MachineModuleInfo *MMI, unsigned Encoding,
495                                MCStreamer &Streamer) const {
496   // The mach-o version of this method defaults to returning a stub reference.
497
498   if (Encoding & DW_EH_PE_indirect) {
499     MachineModuleInfoMachO &MachOMMI =
500       MMI->getObjFileInfo<MachineModuleInfoMachO>();
501
502     SmallString<128> Name;
503     Mang->getNameWithPrefix(Name, GV, true);
504     Name += "$non_lazy_ptr";
505
506     // Add information about the stub reference to MachOMMI so that the stub
507     // gets emitted by the asmprinter.
508     MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str());
509     MachineModuleInfoImpl::StubValueTy &StubSym =
510       GV->hasHiddenVisibility() ? MachOMMI.getHiddenGVStubEntry(SSym) :
511                                   MachOMMI.getGVStubEntry(SSym);
512     if (StubSym.getPointer() == 0) {
513       MCSymbol *Sym = Mang->getSymbol(GV);
514       StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
515     }
516
517     return TargetLoweringObjectFile::
518       getExprForDwarfReference(SSym, Encoding & ~dwarf::DW_EH_PE_indirect, Streamer);
519   }
520
521   return TargetLoweringObjectFile::
522     getExprForDwarfGlobalReference(GV, Mang, MMI, Encoding, Streamer);
523 }
524
525 MCSymbol *TargetLoweringObjectFileMachO::
526 getCFIPersonalitySymbol(const GlobalValue *GV, Mangler *Mang,
527                         MachineModuleInfo *MMI) const {
528   // The mach-o version of this method defaults to returning a stub reference.
529   MachineModuleInfoMachO &MachOMMI =
530     MMI->getObjFileInfo<MachineModuleInfoMachO>();
531
532   SmallString<128> Name;
533   Mang->getNameWithPrefix(Name, GV, true);
534   Name += "$non_lazy_ptr";
535
536   // Add information about the stub reference to MachOMMI so that the stub
537   // gets emitted by the asmprinter.
538   MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str());
539   MachineModuleInfoImpl::StubValueTy &StubSym =
540       GV->hasHiddenVisibility() ? MachOMMI.getHiddenGVStubEntry(SSym) :
541                                   MachOMMI.getGVStubEntry(SSym);
542   if (StubSym.getPointer() == 0) {
543     MCSymbol *Sym = Mang->getSymbol(GV);
544     StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
545   }
546
547   return SSym;
548 }
549
550 //===----------------------------------------------------------------------===//
551 //                                  COFF
552 //===----------------------------------------------------------------------===//
553
554 static unsigned
555 getCOFFSectionFlags(SectionKind K) {
556   unsigned Flags = 0;
557
558   if (K.isMetadata())
559     Flags |=
560       COFF::IMAGE_SCN_MEM_DISCARDABLE;
561   else if (K.isText())
562     Flags |=
563       COFF::IMAGE_SCN_MEM_EXECUTE |
564       COFF::IMAGE_SCN_MEM_READ |
565       COFF::IMAGE_SCN_CNT_CODE;
566   else if (K.isBSS ())
567     Flags |=
568       COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA |
569       COFF::IMAGE_SCN_MEM_READ |
570       COFF::IMAGE_SCN_MEM_WRITE;
571   else if (K.isReadOnly())
572     Flags |=
573       COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
574       COFF::IMAGE_SCN_MEM_READ;
575   else if (K.isWriteable())
576     Flags |=
577       COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
578       COFF::IMAGE_SCN_MEM_READ |
579       COFF::IMAGE_SCN_MEM_WRITE;
580
581   return Flags;
582 }
583
584 const MCSection *TargetLoweringObjectFileCOFF::
585 getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
586                          Mangler *Mang, const TargetMachine &TM) const {
587   return getContext().getCOFFSection(GV->getSection(),
588                                      getCOFFSectionFlags(Kind),
589                                      Kind);
590 }
591
592 static const char *getCOFFSectionPrefixForUniqueGlobal(SectionKind Kind) {
593   if (Kind.isText())
594     return ".text$";
595   if (Kind.isBSS ())
596     return ".bss$";
597   if (Kind.isWriteable())
598     return ".data$";
599   return ".rdata$";
600 }
601
602
603 const MCSection *TargetLoweringObjectFileCOFF::
604 SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
605                        Mangler *Mang, const TargetMachine &TM) const {
606   assert(!Kind.isThreadLocal() && "Doesn't support TLS");
607
608   // If this global is linkonce/weak and the target handles this by emitting it
609   // into a 'uniqued' section name, create and return the section now.
610   if (GV->isWeakForLinker()) {
611     const char *Prefix = getCOFFSectionPrefixForUniqueGlobal(Kind);
612     SmallString<128> Name(Prefix, Prefix+strlen(Prefix));
613     MCSymbol *Sym = Mang->getSymbol(GV);
614     Name.append(Sym->getName().begin() + 1, Sym->getName().end());
615
616     unsigned Characteristics = getCOFFSectionFlags(Kind);
617
618     Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT;
619
620     return getContext().getCOFFSection(Name.str(), Characteristics,
621                           COFF::IMAGE_COMDAT_SELECT_ANY, Kind);
622   }
623
624   if (Kind.isText())
625     return getTextSection();
626
627   return getDataSection();
628 }
629