1f22ef01cSRoman Divacky //===-- llvm/CodeGen/TargetLoweringObjectFileImpl.cpp - Object File Info --===//
2f22ef01cSRoman Divacky //
3f22ef01cSRoman Divacky //                     The LLVM Compiler Infrastructure
4f22ef01cSRoman Divacky //
5f22ef01cSRoman Divacky // This file is distributed under the University of Illinois Open Source
6f22ef01cSRoman Divacky // License. See LICENSE.TXT for details.
7f22ef01cSRoman Divacky //
8f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
9f22ef01cSRoman Divacky //
10f22ef01cSRoman Divacky // This file implements classes used to handle lowerings specific to common
11f22ef01cSRoman Divacky // object file formats.
12f22ef01cSRoman Divacky //
13f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
14f22ef01cSRoman Divacky 
15f22ef01cSRoman Divacky #include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"
16f22ef01cSRoman Divacky #include "llvm/Constants.h"
17f22ef01cSRoman Divacky #include "llvm/DerivedTypes.h"
18f22ef01cSRoman Divacky #include "llvm/Function.h"
19f22ef01cSRoman Divacky #include "llvm/GlobalVariable.h"
20dff0c46cSDimitry Andric #include "llvm/Module.h"
21f22ef01cSRoman Divacky #include "llvm/CodeGen/MachineModuleInfoImpls.h"
22f22ef01cSRoman Divacky #include "llvm/MC/MCContext.h"
23f22ef01cSRoman Divacky #include "llvm/MC/MCExpr.h"
24f22ef01cSRoman Divacky #include "llvm/MC/MCSectionMachO.h"
25f22ef01cSRoman Divacky #include "llvm/MC/MCSectionELF.h"
26f22ef01cSRoman Divacky #include "llvm/MC/MCSectionCOFF.h"
273b0f4066SDimitry Andric #include "llvm/MC/MCStreamer.h"
28f22ef01cSRoman Divacky #include "llvm/MC/MCSymbol.h"
29f22ef01cSRoman Divacky #include "llvm/Target/Mangler.h"
303861d79fSDimitry Andric #include "llvm/DataLayout.h"
31f22ef01cSRoman Divacky #include "llvm/Target/TargetMachine.h"
32f22ef01cSRoman Divacky #include "llvm/Target/TargetOptions.h"
33f22ef01cSRoman Divacky #include "llvm/Support/Dwarf.h"
342754fe60SDimitry Andric #include "llvm/Support/ELF.h"
35f22ef01cSRoman Divacky #include "llvm/Support/ErrorHandling.h"
36f22ef01cSRoman Divacky #include "llvm/Support/raw_ostream.h"
37f22ef01cSRoman Divacky #include "llvm/ADT/SmallString.h"
38f22ef01cSRoman Divacky #include "llvm/ADT/StringExtras.h"
392754fe60SDimitry Andric #include "llvm/ADT/Triple.h"
40f22ef01cSRoman Divacky using namespace llvm;
41f22ef01cSRoman Divacky using namespace dwarf;
42f22ef01cSRoman Divacky 
43f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
44f22ef01cSRoman Divacky //                                  ELF
45f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
46f22ef01cSRoman Divacky 
473b0f4066SDimitry Andric MCSymbol *
483b0f4066SDimitry Andric TargetLoweringObjectFileELF::getCFIPersonalitySymbol(const GlobalValue *GV,
493b0f4066SDimitry Andric                                                      Mangler *Mang,
503b0f4066SDimitry Andric                                                 MachineModuleInfo *MMI) const {
513b0f4066SDimitry Andric   unsigned Encoding = getPersonalityEncoding();
523b0f4066SDimitry Andric   switch (Encoding & 0x70) {
533b0f4066SDimitry Andric   default:
543b0f4066SDimitry Andric     report_fatal_error("We do not support this DWARF encoding yet!");
553b0f4066SDimitry Andric   case dwarf::DW_EH_PE_absptr:
563b0f4066SDimitry Andric     return  Mang->getSymbol(GV);
573b0f4066SDimitry Andric   case dwarf::DW_EH_PE_pcrel: {
5817a519f9SDimitry Andric     return getContext().GetOrCreateSymbol(StringRef("DW.ref.") +
5917a519f9SDimitry Andric                                           Mang->getSymbol(GV)->getName());
603b0f4066SDimitry Andric   }
613b0f4066SDimitry Andric   }
623b0f4066SDimitry Andric }
633b0f4066SDimitry Andric 
643b0f4066SDimitry Andric void TargetLoweringObjectFileELF::emitPersonalityValue(MCStreamer &Streamer,
653b0f4066SDimitry Andric                                                        const TargetMachine &TM,
663b0f4066SDimitry Andric                                                        const MCSymbol *Sym) const {
6717a519f9SDimitry Andric   SmallString<64> NameData("DW.ref.");
6817a519f9SDimitry Andric   NameData += Sym->getName();
6917a519f9SDimitry Andric   MCSymbol *Label = getContext().GetOrCreateSymbol(NameData);
703b0f4066SDimitry Andric   Streamer.EmitSymbolAttribute(Label, MCSA_Hidden);
713b0f4066SDimitry Andric   Streamer.EmitSymbolAttribute(Label, MCSA_Weak);
7217a519f9SDimitry Andric   StringRef Prefix = ".data.";
7317a519f9SDimitry Andric   NameData.insert(NameData.begin(), Prefix.begin(), Prefix.end());
743b0f4066SDimitry Andric   unsigned Flags = ELF::SHF_ALLOC | ELF::SHF_WRITE | ELF::SHF_GROUP;
753b0f4066SDimitry Andric   const MCSection *Sec = getContext().getELFSection(NameData,
763b0f4066SDimitry Andric                                                     ELF::SHT_PROGBITS,
773b0f4066SDimitry Andric                                                     Flags,
783b0f4066SDimitry Andric                                                     SectionKind::getDataRel(),
793b0f4066SDimitry Andric                                                     0, Label->getName());
803861d79fSDimitry Andric   unsigned Size = TM.getDataLayout()->getPointerSize();
813b0f4066SDimitry Andric   Streamer.SwitchSection(Sec);
823861d79fSDimitry Andric   Streamer.EmitValueToAlignment(TM.getDataLayout()->getPointerABIAlignment());
833b0f4066SDimitry Andric   Streamer.EmitSymbolAttribute(Label, MCSA_ELF_TypeObject);
84dff0c46cSDimitry Andric   const MCExpr *E = MCConstantExpr::Create(Size, getContext());
853b0f4066SDimitry Andric   Streamer.EmitELFSize(Label, E);
863b0f4066SDimitry Andric   Streamer.EmitLabel(Label);
873b0f4066SDimitry Andric 
883b0f4066SDimitry Andric   Streamer.EmitSymbolValue(Sym, Size);
893b0f4066SDimitry Andric }
903b0f4066SDimitry Andric 
91f22ef01cSRoman Divacky static SectionKind
92f22ef01cSRoman Divacky getELFKindForNamedSection(StringRef Name, SectionKind K) {
93bd5abe19SDimitry Andric   // N.B.: The defaults used in here are no the same ones used in MC.
94bd5abe19SDimitry Andric   // We follow gcc, MC follows gas. For example, given ".section .eh_frame",
95bd5abe19SDimitry Andric   // both gas and MC will produce a section with no flags. Given
967ae0e2c9SDimitry Andric   // section(".eh_frame") gcc will produce:
977ae0e2c9SDimitry Andric   //
98bd5abe19SDimitry Andric   //   .section   .eh_frame,"a",@progbits
99f22ef01cSRoman Divacky   if (Name.empty() || Name[0] != '.') return K;
100f22ef01cSRoman Divacky 
101f22ef01cSRoman Divacky   // Some lame default implementation based on some magic section names.
102f22ef01cSRoman Divacky   if (Name == ".bss" ||
103f22ef01cSRoman Divacky       Name.startswith(".bss.") ||
104f22ef01cSRoman Divacky       Name.startswith(".gnu.linkonce.b.") ||
105f22ef01cSRoman Divacky       Name.startswith(".llvm.linkonce.b.") ||
106f22ef01cSRoman Divacky       Name == ".sbss" ||
107f22ef01cSRoman Divacky       Name.startswith(".sbss.") ||
108f22ef01cSRoman Divacky       Name.startswith(".gnu.linkonce.sb.") ||
109f22ef01cSRoman Divacky       Name.startswith(".llvm.linkonce.sb."))
110f22ef01cSRoman Divacky     return SectionKind::getBSS();
111f22ef01cSRoman Divacky 
112f22ef01cSRoman Divacky   if (Name == ".tdata" ||
113f22ef01cSRoman Divacky       Name.startswith(".tdata.") ||
114f22ef01cSRoman Divacky       Name.startswith(".gnu.linkonce.td.") ||
115f22ef01cSRoman Divacky       Name.startswith(".llvm.linkonce.td."))
116f22ef01cSRoman Divacky     return SectionKind::getThreadData();
117f22ef01cSRoman Divacky 
118f22ef01cSRoman Divacky   if (Name == ".tbss" ||
119f22ef01cSRoman Divacky       Name.startswith(".tbss.") ||
120f22ef01cSRoman Divacky       Name.startswith(".gnu.linkonce.tb.") ||
121f22ef01cSRoman Divacky       Name.startswith(".llvm.linkonce.tb."))
122f22ef01cSRoman Divacky     return SectionKind::getThreadBSS();
123f22ef01cSRoman Divacky 
124f22ef01cSRoman Divacky   return K;
125f22ef01cSRoman Divacky }
126f22ef01cSRoman Divacky 
127f22ef01cSRoman Divacky 
128f22ef01cSRoman Divacky static unsigned getELFSectionType(StringRef Name, SectionKind K) {
129f22ef01cSRoman Divacky 
130f22ef01cSRoman Divacky   if (Name == ".init_array")
1312754fe60SDimitry Andric     return ELF::SHT_INIT_ARRAY;
132f22ef01cSRoman Divacky 
133f22ef01cSRoman Divacky   if (Name == ".fini_array")
1342754fe60SDimitry Andric     return ELF::SHT_FINI_ARRAY;
135f22ef01cSRoman Divacky 
136f22ef01cSRoman Divacky   if (Name == ".preinit_array")
1372754fe60SDimitry Andric     return ELF::SHT_PREINIT_ARRAY;
138f22ef01cSRoman Divacky 
139f22ef01cSRoman Divacky   if (K.isBSS() || K.isThreadBSS())
1402754fe60SDimitry Andric     return ELF::SHT_NOBITS;
141f22ef01cSRoman Divacky 
1422754fe60SDimitry Andric   return ELF::SHT_PROGBITS;
143f22ef01cSRoman Divacky }
144f22ef01cSRoman Divacky 
145f22ef01cSRoman Divacky 
146f22ef01cSRoman Divacky static unsigned
147f22ef01cSRoman Divacky getELFSectionFlags(SectionKind K) {
148f22ef01cSRoman Divacky   unsigned Flags = 0;
149f22ef01cSRoman Divacky 
150f22ef01cSRoman Divacky   if (!K.isMetadata())
1512754fe60SDimitry Andric     Flags |= ELF::SHF_ALLOC;
152f22ef01cSRoman Divacky 
153f22ef01cSRoman Divacky   if (K.isText())
1542754fe60SDimitry Andric     Flags |= ELF::SHF_EXECINSTR;
155f22ef01cSRoman Divacky 
156f22ef01cSRoman Divacky   if (K.isWriteable())
1572754fe60SDimitry Andric     Flags |= ELF::SHF_WRITE;
158f22ef01cSRoman Divacky 
159f22ef01cSRoman Divacky   if (K.isThreadLocal())
1602754fe60SDimitry Andric     Flags |= ELF::SHF_TLS;
161f22ef01cSRoman Divacky 
162f22ef01cSRoman Divacky   // K.isMergeableConst() is left out to honour PR4650
163f22ef01cSRoman Divacky   if (K.isMergeableCString() || K.isMergeableConst4() ||
164f22ef01cSRoman Divacky       K.isMergeableConst8() || K.isMergeableConst16())
1652754fe60SDimitry Andric     Flags |= ELF::SHF_MERGE;
166f22ef01cSRoman Divacky 
167f22ef01cSRoman Divacky   if (K.isMergeableCString())
1682754fe60SDimitry Andric     Flags |= ELF::SHF_STRINGS;
169f22ef01cSRoman Divacky 
170f22ef01cSRoman Divacky   return Flags;
171f22ef01cSRoman Divacky }
172f22ef01cSRoman Divacky 
173f22ef01cSRoman Divacky 
174f22ef01cSRoman Divacky const MCSection *TargetLoweringObjectFileELF::
175f22ef01cSRoman Divacky getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
176f22ef01cSRoman Divacky                          Mangler *Mang, const TargetMachine &TM) const {
177f22ef01cSRoman Divacky   StringRef SectionName = GV->getSection();
178f22ef01cSRoman Divacky 
179f22ef01cSRoman Divacky   // Infer section flags from the section name if we can.
180f22ef01cSRoman Divacky   Kind = getELFKindForNamedSection(SectionName, Kind);
181f22ef01cSRoman Divacky 
182f22ef01cSRoman Divacky   return getContext().getELFSection(SectionName,
183f22ef01cSRoman Divacky                                     getELFSectionType(SectionName, Kind),
1842754fe60SDimitry Andric                                     getELFSectionFlags(Kind), Kind);
185f22ef01cSRoman Divacky }
186f22ef01cSRoman Divacky 
187f22ef01cSRoman Divacky /// getSectionPrefixForGlobal - Return the section prefix name used by options
188f22ef01cSRoman Divacky /// FunctionsSections and DataSections.
189f22ef01cSRoman Divacky static const char *getSectionPrefixForGlobal(SectionKind Kind) {
190f22ef01cSRoman Divacky   if (Kind.isText())                 return ".text.";
191f22ef01cSRoman Divacky   if (Kind.isReadOnly())             return ".rodata.";
192dff0c46cSDimitry Andric   if (Kind.isBSS())                  return ".bss.";
193f22ef01cSRoman Divacky 
194f22ef01cSRoman Divacky   if (Kind.isThreadData())           return ".tdata.";
195f22ef01cSRoman Divacky   if (Kind.isThreadBSS())            return ".tbss.";
196f22ef01cSRoman Divacky 
197f22ef01cSRoman Divacky   if (Kind.isDataNoRel())            return ".data.";
198f22ef01cSRoman Divacky   if (Kind.isDataRelLocal())         return ".data.rel.local.";
199f22ef01cSRoman Divacky   if (Kind.isDataRel())              return ".data.rel.";
200f22ef01cSRoman Divacky   if (Kind.isReadOnlyWithRelLocal()) return ".data.rel.ro.local.";
201f22ef01cSRoman Divacky 
202f22ef01cSRoman Divacky   assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
203f22ef01cSRoman Divacky   return ".data.rel.ro.";
204f22ef01cSRoman Divacky }
205f22ef01cSRoman Divacky 
206f22ef01cSRoman Divacky 
207f22ef01cSRoman Divacky const MCSection *TargetLoweringObjectFileELF::
208f22ef01cSRoman Divacky SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
209f22ef01cSRoman Divacky                        Mangler *Mang, const TargetMachine &TM) const {
210f22ef01cSRoman Divacky   // If we have -ffunction-section or -fdata-section then we should emit the
211f22ef01cSRoman Divacky   // global value to a uniqued section specifically for it.
212f22ef01cSRoman Divacky   bool EmitUniquedSection;
213f22ef01cSRoman Divacky   if (Kind.isText())
214f22ef01cSRoman Divacky     EmitUniquedSection = TM.getFunctionSections();
215f22ef01cSRoman Divacky   else
216f22ef01cSRoman Divacky     EmitUniquedSection = TM.getDataSections();
217f22ef01cSRoman Divacky 
218f22ef01cSRoman Divacky   // If this global is linkonce/weak and the target handles this by emitting it
219f22ef01cSRoman Divacky   // into a 'uniqued' section name, create and return the section now.
220f22ef01cSRoman Divacky   if ((GV->isWeakForLinker() || EmitUniquedSection) &&
221dff0c46cSDimitry Andric       !Kind.isCommon()) {
222f22ef01cSRoman Divacky     const char *Prefix;
223f22ef01cSRoman Divacky     Prefix = getSectionPrefixForGlobal(Kind);
224f22ef01cSRoman Divacky 
225f22ef01cSRoman Divacky     SmallString<128> Name(Prefix, Prefix+strlen(Prefix));
226f22ef01cSRoman Divacky     MCSymbol *Sym = Mang->getSymbol(GV);
227f22ef01cSRoman Divacky     Name.append(Sym->getName().begin(), Sym->getName().end());
2282754fe60SDimitry Andric     StringRef Group = "";
2292754fe60SDimitry Andric     unsigned Flags = getELFSectionFlags(Kind);
2302754fe60SDimitry Andric     if (GV->isWeakForLinker()) {
2312754fe60SDimitry Andric       Group = Sym->getName();
2322754fe60SDimitry Andric       Flags |= ELF::SHF_GROUP;
2332754fe60SDimitry Andric     }
2342754fe60SDimitry Andric 
235f22ef01cSRoman Divacky     return getContext().getELFSection(Name.str(),
236f22ef01cSRoman Divacky                                       getELFSectionType(Name.str(), Kind),
2372754fe60SDimitry Andric                                       Flags, Kind, 0, Group);
238f22ef01cSRoman Divacky   }
239f22ef01cSRoman Divacky 
240f22ef01cSRoman Divacky   if (Kind.isText()) return TextSection;
241f22ef01cSRoman Divacky 
242f22ef01cSRoman Divacky   if (Kind.isMergeable1ByteCString() ||
243f22ef01cSRoman Divacky       Kind.isMergeable2ByteCString() ||
244f22ef01cSRoman Divacky       Kind.isMergeable4ByteCString()) {
245f22ef01cSRoman Divacky 
246f22ef01cSRoman Divacky     // We also need alignment here.
247f22ef01cSRoman Divacky     // FIXME: this is getting the alignment of the character, not the
248f22ef01cSRoman Divacky     // alignment of the global!
249f22ef01cSRoman Divacky     unsigned Align =
2503861d79fSDimitry Andric       TM.getDataLayout()->getPreferredAlignment(cast<GlobalVariable>(GV));
251f22ef01cSRoman Divacky 
252f22ef01cSRoman Divacky     const char *SizeSpec = ".rodata.str1.";
253f22ef01cSRoman Divacky     if (Kind.isMergeable2ByteCString())
254f22ef01cSRoman Divacky       SizeSpec = ".rodata.str2.";
255f22ef01cSRoman Divacky     else if (Kind.isMergeable4ByteCString())
256f22ef01cSRoman Divacky       SizeSpec = ".rodata.str4.";
257f22ef01cSRoman Divacky     else
258f22ef01cSRoman Divacky       assert(Kind.isMergeable1ByteCString() && "unknown string width");
259f22ef01cSRoman Divacky 
260f22ef01cSRoman Divacky 
261f22ef01cSRoman Divacky     std::string Name = SizeSpec + utostr(Align);
2622754fe60SDimitry Andric     return getContext().getELFSection(Name, ELF::SHT_PROGBITS,
2632754fe60SDimitry Andric                                       ELF::SHF_ALLOC |
2642754fe60SDimitry Andric                                       ELF::SHF_MERGE |
2652754fe60SDimitry Andric                                       ELF::SHF_STRINGS,
266f22ef01cSRoman Divacky                                       Kind);
267f22ef01cSRoman Divacky   }
268f22ef01cSRoman Divacky 
269f22ef01cSRoman Divacky   if (Kind.isMergeableConst()) {
270f22ef01cSRoman Divacky     if (Kind.isMergeableConst4() && MergeableConst4Section)
271f22ef01cSRoman Divacky       return MergeableConst4Section;
272f22ef01cSRoman Divacky     if (Kind.isMergeableConst8() && MergeableConst8Section)
273f22ef01cSRoman Divacky       return MergeableConst8Section;
274f22ef01cSRoman Divacky     if (Kind.isMergeableConst16() && MergeableConst16Section)
275f22ef01cSRoman Divacky       return MergeableConst16Section;
276f22ef01cSRoman Divacky     return ReadOnlySection;  // .const
277f22ef01cSRoman Divacky   }
278f22ef01cSRoman Divacky 
279f22ef01cSRoman Divacky   if (Kind.isReadOnly())             return ReadOnlySection;
280f22ef01cSRoman Divacky 
281f22ef01cSRoman Divacky   if (Kind.isThreadData())           return TLSDataSection;
282f22ef01cSRoman Divacky   if (Kind.isThreadBSS())            return TLSBSSSection;
283f22ef01cSRoman Divacky 
284f22ef01cSRoman Divacky   // Note: we claim that common symbols are put in BSSSection, but they are
285f22ef01cSRoman Divacky   // really emitted with the magic .comm directive, which creates a symbol table
286f22ef01cSRoman Divacky   // entry but not a section.
287f22ef01cSRoman Divacky   if (Kind.isBSS() || Kind.isCommon()) return BSSSection;
288f22ef01cSRoman Divacky 
289f22ef01cSRoman Divacky   if (Kind.isDataNoRel())            return DataSection;
290f22ef01cSRoman Divacky   if (Kind.isDataRelLocal())         return DataRelLocalSection;
291f22ef01cSRoman Divacky   if (Kind.isDataRel())              return DataRelSection;
292f22ef01cSRoman Divacky   if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection;
293f22ef01cSRoman Divacky 
294f22ef01cSRoman Divacky   assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
295f22ef01cSRoman Divacky   return DataRelROSection;
296f22ef01cSRoman Divacky }
297f22ef01cSRoman Divacky 
298f22ef01cSRoman Divacky /// getSectionForConstant - Given a mergeable constant with the
299f22ef01cSRoman Divacky /// specified size and relocation information, return a section that it
300f22ef01cSRoman Divacky /// should be placed in.
301f22ef01cSRoman Divacky const MCSection *TargetLoweringObjectFileELF::
302f22ef01cSRoman Divacky getSectionForConstant(SectionKind Kind) const {
303f22ef01cSRoman Divacky   if (Kind.isMergeableConst4() && MergeableConst4Section)
304f22ef01cSRoman Divacky     return MergeableConst4Section;
305f22ef01cSRoman Divacky   if (Kind.isMergeableConst8() && MergeableConst8Section)
306f22ef01cSRoman Divacky     return MergeableConst8Section;
307f22ef01cSRoman Divacky   if (Kind.isMergeableConst16() && MergeableConst16Section)
308f22ef01cSRoman Divacky     return MergeableConst16Section;
309f22ef01cSRoman Divacky   if (Kind.isReadOnly())
310f22ef01cSRoman Divacky     return ReadOnlySection;
311f22ef01cSRoman Divacky 
312f22ef01cSRoman Divacky   if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection;
313f22ef01cSRoman Divacky   assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
314f22ef01cSRoman Divacky   return DataRelROSection;
315f22ef01cSRoman Divacky }
316f22ef01cSRoman Divacky 
317f22ef01cSRoman Divacky const MCExpr *TargetLoweringObjectFileELF::
318f22ef01cSRoman Divacky getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
319f22ef01cSRoman Divacky                                MachineModuleInfo *MMI,
320f22ef01cSRoman Divacky                                unsigned Encoding, MCStreamer &Streamer) const {
321f22ef01cSRoman Divacky 
322f22ef01cSRoman Divacky   if (Encoding & dwarf::DW_EH_PE_indirect) {
323f22ef01cSRoman Divacky     MachineModuleInfoELF &ELFMMI = MMI->getObjFileInfo<MachineModuleInfoELF>();
324f22ef01cSRoman Divacky 
325f22ef01cSRoman Divacky     SmallString<128> Name;
326f22ef01cSRoman Divacky     Mang->getNameWithPrefix(Name, GV, true);
327f22ef01cSRoman Divacky     Name += ".DW.stub";
328f22ef01cSRoman Divacky 
329f22ef01cSRoman Divacky     // Add information about the stub reference to ELFMMI so that the stub
330f22ef01cSRoman Divacky     // gets emitted by the asmprinter.
331f22ef01cSRoman Divacky     MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str());
332f22ef01cSRoman Divacky     MachineModuleInfoImpl::StubValueTy &StubSym = ELFMMI.getGVStubEntry(SSym);
333f22ef01cSRoman Divacky     if (StubSym.getPointer() == 0) {
334f22ef01cSRoman Divacky       MCSymbol *Sym = Mang->getSymbol(GV);
335f22ef01cSRoman Divacky       StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
336f22ef01cSRoman Divacky     }
337f22ef01cSRoman Divacky 
338f22ef01cSRoman Divacky     return TargetLoweringObjectFile::
3393b0f4066SDimitry Andric       getExprForDwarfReference(SSym, Encoding & ~dwarf::DW_EH_PE_indirect, Streamer);
340f22ef01cSRoman Divacky   }
341f22ef01cSRoman Divacky 
342f22ef01cSRoman Divacky   return TargetLoweringObjectFile::
343f22ef01cSRoman Divacky     getExprForDwarfGlobalReference(GV, Mang, MMI, Encoding, Streamer);
344f22ef01cSRoman Divacky }
345f22ef01cSRoman Divacky 
346dff0c46cSDimitry Andric const MCSection *
347dff0c46cSDimitry Andric TargetLoweringObjectFileELF::getStaticCtorSection(unsigned Priority) const {
348dff0c46cSDimitry Andric   // The default scheme is .ctor / .dtor, so we have to invert the priority
349dff0c46cSDimitry Andric   // numbering.
350dff0c46cSDimitry Andric   if (Priority == 65535)
351dff0c46cSDimitry Andric     return StaticCtorSection;
352dff0c46cSDimitry Andric 
3537ae0e2c9SDimitry Andric   if (UseInitArray) {
3547ae0e2c9SDimitry Andric     std::string Name = std::string(".init_array.") + utostr(Priority);
3557ae0e2c9SDimitry Andric     return getContext().getELFSection(Name, ELF::SHT_INIT_ARRAY,
3567ae0e2c9SDimitry Andric                                       ELF::SHF_ALLOC | ELF::SHF_WRITE,
3577ae0e2c9SDimitry Andric                                       SectionKind::getDataRel());
3587ae0e2c9SDimitry Andric   } else {
359dff0c46cSDimitry Andric     std::string Name = std::string(".ctors.") + utostr(65535 - Priority);
360dff0c46cSDimitry Andric     return getContext().getELFSection(Name, ELF::SHT_PROGBITS,
361dff0c46cSDimitry Andric                                       ELF::SHF_ALLOC |ELF::SHF_WRITE,
362dff0c46cSDimitry Andric                                       SectionKind::getDataRel());
363dff0c46cSDimitry Andric   }
3647ae0e2c9SDimitry Andric }
365dff0c46cSDimitry Andric 
366dff0c46cSDimitry Andric const MCSection *
367dff0c46cSDimitry Andric TargetLoweringObjectFileELF::getStaticDtorSection(unsigned Priority) const {
368dff0c46cSDimitry Andric   // The default scheme is .ctor / .dtor, so we have to invert the priority
369dff0c46cSDimitry Andric   // numbering.
370dff0c46cSDimitry Andric   if (Priority == 65535)
371dff0c46cSDimitry Andric     return StaticDtorSection;
372dff0c46cSDimitry Andric 
3737ae0e2c9SDimitry Andric   if (UseInitArray) {
3747ae0e2c9SDimitry Andric     std::string Name = std::string(".fini_array.") + utostr(Priority);
3757ae0e2c9SDimitry Andric     return getContext().getELFSection(Name, ELF::SHT_FINI_ARRAY,
3767ae0e2c9SDimitry Andric                                       ELF::SHF_ALLOC | ELF::SHF_WRITE,
3777ae0e2c9SDimitry Andric                                       SectionKind::getDataRel());
3787ae0e2c9SDimitry Andric   } else {
379dff0c46cSDimitry Andric     std::string Name = std::string(".dtors.") + utostr(65535 - Priority);
380dff0c46cSDimitry Andric     return getContext().getELFSection(Name, ELF::SHT_PROGBITS,
381dff0c46cSDimitry Andric                                       ELF::SHF_ALLOC |ELF::SHF_WRITE,
382dff0c46cSDimitry Andric                                       SectionKind::getDataRel());
383dff0c46cSDimitry Andric   }
3847ae0e2c9SDimitry Andric }
3857ae0e2c9SDimitry Andric 
3867ae0e2c9SDimitry Andric void
3877ae0e2c9SDimitry Andric TargetLoweringObjectFileELF::InitializeELF(bool UseInitArray_) {
3887ae0e2c9SDimitry Andric   UseInitArray = UseInitArray_;
3897ae0e2c9SDimitry Andric   if (!UseInitArray)
3907ae0e2c9SDimitry Andric     return;
3917ae0e2c9SDimitry Andric 
3927ae0e2c9SDimitry Andric   StaticCtorSection =
3937ae0e2c9SDimitry Andric     getContext().getELFSection(".init_array", ELF::SHT_INIT_ARRAY,
3947ae0e2c9SDimitry Andric                                ELF::SHF_WRITE |
3957ae0e2c9SDimitry Andric                                ELF::SHF_ALLOC,
3967ae0e2c9SDimitry Andric                                SectionKind::getDataRel());
3977ae0e2c9SDimitry Andric   StaticDtorSection =
3987ae0e2c9SDimitry Andric     getContext().getELFSection(".fini_array", ELF::SHT_FINI_ARRAY,
3997ae0e2c9SDimitry Andric                                ELF::SHF_WRITE |
4007ae0e2c9SDimitry Andric                                ELF::SHF_ALLOC,
4017ae0e2c9SDimitry Andric                                SectionKind::getDataRel());
4027ae0e2c9SDimitry Andric }
403dff0c46cSDimitry Andric 
404f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
405f22ef01cSRoman Divacky //                                 MachO
406f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
407f22ef01cSRoman Divacky 
408dff0c46cSDimitry Andric /// emitModuleFlags - Emit the module flags that specify the garbage collection
409dff0c46cSDimitry Andric /// information.
410dff0c46cSDimitry Andric void TargetLoweringObjectFileMachO::
411dff0c46cSDimitry Andric emitModuleFlags(MCStreamer &Streamer,
412dff0c46cSDimitry Andric                 ArrayRef<Module::ModuleFlagEntry> ModuleFlags,
413dff0c46cSDimitry Andric                 Mangler *Mang, const TargetMachine &TM) const {
414dff0c46cSDimitry Andric   unsigned VersionVal = 0;
4157ae0e2c9SDimitry Andric   unsigned ImageInfoFlags = 0;
416dff0c46cSDimitry Andric   StringRef SectionVal;
417dff0c46cSDimitry Andric 
418dff0c46cSDimitry Andric   for (ArrayRef<Module::ModuleFlagEntry>::iterator
419dff0c46cSDimitry Andric          i = ModuleFlags.begin(), e = ModuleFlags.end(); i != e; ++i) {
420dff0c46cSDimitry Andric     const Module::ModuleFlagEntry &MFE = *i;
421dff0c46cSDimitry Andric 
422dff0c46cSDimitry Andric     // Ignore flags with 'Require' behavior.
423dff0c46cSDimitry Andric     if (MFE.Behavior == Module::Require)
424dff0c46cSDimitry Andric       continue;
425dff0c46cSDimitry Andric 
426dff0c46cSDimitry Andric     StringRef Key = MFE.Key->getString();
427dff0c46cSDimitry Andric     Value *Val = MFE.Val;
428dff0c46cSDimitry Andric 
429dff0c46cSDimitry Andric     if (Key == "Objective-C Image Info Version")
430dff0c46cSDimitry Andric       VersionVal = cast<ConstantInt>(Val)->getZExtValue();
431dff0c46cSDimitry Andric     else if (Key == "Objective-C Garbage Collection" ||
4327ae0e2c9SDimitry Andric              Key == "Objective-C GC Only" ||
4337ae0e2c9SDimitry Andric              Key == "Objective-C Is Simulated")
4347ae0e2c9SDimitry Andric       ImageInfoFlags |= cast<ConstantInt>(Val)->getZExtValue();
435dff0c46cSDimitry Andric     else if (Key == "Objective-C Image Info Section")
436dff0c46cSDimitry Andric       SectionVal = cast<MDString>(Val)->getString();
437dff0c46cSDimitry Andric   }
438dff0c46cSDimitry Andric 
439dff0c46cSDimitry Andric   // The section is mandatory. If we don't have it, then we don't have GC info.
440dff0c46cSDimitry Andric   if (SectionVal.empty()) return;
441dff0c46cSDimitry Andric 
442dff0c46cSDimitry Andric   StringRef Segment, Section;
443dff0c46cSDimitry Andric   unsigned TAA = 0, StubSize = 0;
444dff0c46cSDimitry Andric   bool TAAParsed;
445dff0c46cSDimitry Andric   std::string ErrorCode =
446dff0c46cSDimitry Andric     MCSectionMachO::ParseSectionSpecifier(SectionVal, Segment, Section,
447dff0c46cSDimitry Andric                                           TAA, TAAParsed, StubSize);
448dff0c46cSDimitry Andric   if (!ErrorCode.empty())
449dff0c46cSDimitry Andric     // If invalid, report the error with report_fatal_error.
450dff0c46cSDimitry Andric     report_fatal_error("Invalid section specifier '" + Section + "': " +
451dff0c46cSDimitry Andric                        ErrorCode + ".");
452dff0c46cSDimitry Andric 
453dff0c46cSDimitry Andric   // Get the section.
454dff0c46cSDimitry Andric   const MCSectionMachO *S =
455dff0c46cSDimitry Andric     getContext().getMachOSection(Segment, Section, TAA, StubSize,
456dff0c46cSDimitry Andric                                  SectionKind::getDataNoRel());
457dff0c46cSDimitry Andric   Streamer.SwitchSection(S);
458dff0c46cSDimitry Andric   Streamer.EmitLabel(getContext().
459dff0c46cSDimitry Andric                      GetOrCreateSymbol(StringRef("L_OBJC_IMAGE_INFO")));
460dff0c46cSDimitry Andric   Streamer.EmitIntValue(VersionVal, 4);
4617ae0e2c9SDimitry Andric   Streamer.EmitIntValue(ImageInfoFlags, 4);
462dff0c46cSDimitry Andric   Streamer.AddBlankLine();
463dff0c46cSDimitry Andric }
464dff0c46cSDimitry Andric 
465f22ef01cSRoman Divacky const MCSection *TargetLoweringObjectFileMachO::
466f22ef01cSRoman Divacky getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
467f22ef01cSRoman Divacky                          Mangler *Mang, const TargetMachine &TM) const {
468f22ef01cSRoman Divacky   // Parse the section specifier and create it if valid.
469f22ef01cSRoman Divacky   StringRef Segment, Section;
4703b0f4066SDimitry Andric   unsigned TAA = 0, StubSize = 0;
4713b0f4066SDimitry Andric   bool TAAParsed;
472f22ef01cSRoman Divacky   std::string ErrorCode =
473f22ef01cSRoman Divacky     MCSectionMachO::ParseSectionSpecifier(GV->getSection(), Segment, Section,
4743b0f4066SDimitry Andric                                           TAA, TAAParsed, StubSize);
475f22ef01cSRoman Divacky   if (!ErrorCode.empty()) {
476f22ef01cSRoman Divacky     // If invalid, report the error with report_fatal_error.
477dff0c46cSDimitry Andric     report_fatal_error("Global variable '" + GV->getName() +
478dff0c46cSDimitry Andric                        "' has an invalid section specifier '" +
479dff0c46cSDimitry Andric                        GV->getSection() + "': " + ErrorCode + ".");
480f22ef01cSRoman Divacky   }
481f22ef01cSRoman Divacky 
482f22ef01cSRoman Divacky   // Get the section.
483f22ef01cSRoman Divacky   const MCSectionMachO *S =
484f22ef01cSRoman Divacky     getContext().getMachOSection(Segment, Section, TAA, StubSize, Kind);
485f22ef01cSRoman Divacky 
486dd6029ffSDimitry Andric   // If TAA wasn't set by ParseSectionSpecifier() above,
487dd6029ffSDimitry Andric   // use the value returned by getMachOSection() as a default.
4883b0f4066SDimitry Andric   if (!TAAParsed)
489dd6029ffSDimitry Andric     TAA = S->getTypeAndAttributes();
490dd6029ffSDimitry Andric 
491f22ef01cSRoman Divacky   // Okay, now that we got the section, verify that the TAA & StubSize agree.
492f22ef01cSRoman Divacky   // If the user declared multiple globals with different section flags, we need
493f22ef01cSRoman Divacky   // to reject it here.
494f22ef01cSRoman Divacky   if (S->getTypeAndAttributes() != TAA || S->getStubSize() != StubSize) {
495f22ef01cSRoman Divacky     // If invalid, report the error with report_fatal_error.
496dff0c46cSDimitry Andric     report_fatal_error("Global variable '" + GV->getName() +
497f22ef01cSRoman Divacky                        "' section type or attributes does not match previous"
498f22ef01cSRoman Divacky                        " section specifier");
499f22ef01cSRoman Divacky   }
500f22ef01cSRoman Divacky 
501f22ef01cSRoman Divacky   return S;
502f22ef01cSRoman Divacky }
503f22ef01cSRoman Divacky 
504f22ef01cSRoman Divacky const MCSection *TargetLoweringObjectFileMachO::
505f22ef01cSRoman Divacky SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
506f22ef01cSRoman Divacky                        Mangler *Mang, const TargetMachine &TM) const {
507f22ef01cSRoman Divacky 
508f22ef01cSRoman Divacky   // Handle thread local data.
509f22ef01cSRoman Divacky   if (Kind.isThreadBSS()) return TLSBSSSection;
510f22ef01cSRoman Divacky   if (Kind.isThreadData()) return TLSDataSection;
511f22ef01cSRoman Divacky 
512f22ef01cSRoman Divacky   if (Kind.isText())
513f22ef01cSRoman Divacky     return GV->isWeakForLinker() ? TextCoalSection : TextSection;
514f22ef01cSRoman Divacky 
515f22ef01cSRoman Divacky   // If this is weak/linkonce, put this in a coalescable section, either in text
516f22ef01cSRoman Divacky   // or data depending on if it is writable.
517f22ef01cSRoman Divacky   if (GV->isWeakForLinker()) {
518f22ef01cSRoman Divacky     if (Kind.isReadOnly())
519f22ef01cSRoman Divacky       return ConstTextCoalSection;
520f22ef01cSRoman Divacky     return DataCoalSection;
521f22ef01cSRoman Divacky   }
522f22ef01cSRoman Divacky 
523f22ef01cSRoman Divacky   // FIXME: Alignment check should be handled by section classifier.
524f22ef01cSRoman Divacky   if (Kind.isMergeable1ByteCString() &&
5253861d79fSDimitry Andric       TM.getDataLayout()->getPreferredAlignment(cast<GlobalVariable>(GV)) < 32)
526f22ef01cSRoman Divacky     return CStringSection;
527f22ef01cSRoman Divacky 
528f22ef01cSRoman Divacky   // Do not put 16-bit arrays in the UString section if they have an
529f22ef01cSRoman Divacky   // externally visible label, this runs into issues with certain linker
530f22ef01cSRoman Divacky   // versions.
531f22ef01cSRoman Divacky   if (Kind.isMergeable2ByteCString() && !GV->hasExternalLinkage() &&
5323861d79fSDimitry Andric       TM.getDataLayout()->getPreferredAlignment(cast<GlobalVariable>(GV)) < 32)
533f22ef01cSRoman Divacky     return UStringSection;
534f22ef01cSRoman Divacky 
535f22ef01cSRoman Divacky   if (Kind.isMergeableConst()) {
536f22ef01cSRoman Divacky     if (Kind.isMergeableConst4())
537f22ef01cSRoman Divacky       return FourByteConstantSection;
538f22ef01cSRoman Divacky     if (Kind.isMergeableConst8())
539f22ef01cSRoman Divacky       return EightByteConstantSection;
540f22ef01cSRoman Divacky     if (Kind.isMergeableConst16() && SixteenByteConstantSection)
541f22ef01cSRoman Divacky       return SixteenByteConstantSection;
542f22ef01cSRoman Divacky   }
543f22ef01cSRoman Divacky 
544f22ef01cSRoman Divacky   // Otherwise, if it is readonly, but not something we can specially optimize,
545f22ef01cSRoman Divacky   // just drop it in .const.
546f22ef01cSRoman Divacky   if (Kind.isReadOnly())
547f22ef01cSRoman Divacky     return ReadOnlySection;
548f22ef01cSRoman Divacky 
549f22ef01cSRoman Divacky   // If this is marked const, put it into a const section.  But if the dynamic
550f22ef01cSRoman Divacky   // linker needs to write to it, put it in the data segment.
551f22ef01cSRoman Divacky   if (Kind.isReadOnlyWithRel())
552f22ef01cSRoman Divacky     return ConstDataSection;
553f22ef01cSRoman Divacky 
554f22ef01cSRoman Divacky   // Put zero initialized globals with strong external linkage in the
555f22ef01cSRoman Divacky   // DATA, __common section with the .zerofill directive.
556f22ef01cSRoman Divacky   if (Kind.isBSSExtern())
557f22ef01cSRoman Divacky     return DataCommonSection;
558f22ef01cSRoman Divacky 
559f22ef01cSRoman Divacky   // Put zero initialized globals with local linkage in __DATA,__bss directive
560f22ef01cSRoman Divacky   // with the .zerofill directive (aka .lcomm).
561f22ef01cSRoman Divacky   if (Kind.isBSSLocal())
562f22ef01cSRoman Divacky     return DataBSSSection;
563f22ef01cSRoman Divacky 
564f22ef01cSRoman Divacky   // Otherwise, just drop the variable in the normal data section.
565f22ef01cSRoman Divacky   return DataSection;
566f22ef01cSRoman Divacky }
567f22ef01cSRoman Divacky 
568f22ef01cSRoman Divacky const MCSection *
569f22ef01cSRoman Divacky TargetLoweringObjectFileMachO::getSectionForConstant(SectionKind Kind) const {
570f22ef01cSRoman Divacky   // If this constant requires a relocation, we have to put it in the data
571f22ef01cSRoman Divacky   // segment, not in the text segment.
572f22ef01cSRoman Divacky   if (Kind.isDataRel() || Kind.isReadOnlyWithRel())
573f22ef01cSRoman Divacky     return ConstDataSection;
574f22ef01cSRoman Divacky 
575f22ef01cSRoman Divacky   if (Kind.isMergeableConst4())
576f22ef01cSRoman Divacky     return FourByteConstantSection;
577f22ef01cSRoman Divacky   if (Kind.isMergeableConst8())
578f22ef01cSRoman Divacky     return EightByteConstantSection;
579f22ef01cSRoman Divacky   if (Kind.isMergeableConst16() && SixteenByteConstantSection)
580f22ef01cSRoman Divacky     return SixteenByteConstantSection;
581f22ef01cSRoman Divacky   return ReadOnlySection;  // .const
582f22ef01cSRoman Divacky }
583f22ef01cSRoman Divacky 
584f22ef01cSRoman Divacky /// shouldEmitUsedDirectiveFor - This hook allows targets to selectively decide
585f22ef01cSRoman Divacky /// not to emit the UsedDirective for some symbols in llvm.used.
586f22ef01cSRoman Divacky // FIXME: REMOVE this (rdar://7071300)
587f22ef01cSRoman Divacky bool TargetLoweringObjectFileMachO::
588f22ef01cSRoman Divacky shouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler *Mang) const {
589f22ef01cSRoman Divacky   /// On Darwin, internally linked data beginning with "L" or "l" does not have
590f22ef01cSRoman Divacky   /// the directive emitted (this occurs in ObjC metadata).
591f22ef01cSRoman Divacky   if (!GV) return false;
592f22ef01cSRoman Divacky 
593f22ef01cSRoman Divacky   // Check whether the mangled name has the "Private" or "LinkerPrivate" prefix.
594f22ef01cSRoman Divacky   if (GV->hasLocalLinkage() && !isa<Function>(GV)) {
595f22ef01cSRoman Divacky     // FIXME: ObjC metadata is currently emitted as internal symbols that have
596f22ef01cSRoman Divacky     // \1L and \0l prefixes on them.  Fix them to be Private/LinkerPrivate and
597f22ef01cSRoman Divacky     // this horrible hack can go away.
598f22ef01cSRoman Divacky     MCSymbol *Sym = Mang->getSymbol(GV);
599f22ef01cSRoman Divacky     if (Sym->getName()[0] == 'L' || Sym->getName()[0] == 'l')
600f22ef01cSRoman Divacky       return false;
601f22ef01cSRoman Divacky   }
602f22ef01cSRoman Divacky 
603f22ef01cSRoman Divacky   return true;
604f22ef01cSRoman Divacky }
605f22ef01cSRoman Divacky 
606f22ef01cSRoman Divacky const MCExpr *TargetLoweringObjectFileMachO::
607f22ef01cSRoman Divacky getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
608f22ef01cSRoman Divacky                                MachineModuleInfo *MMI, unsigned Encoding,
609f22ef01cSRoman Divacky                                MCStreamer &Streamer) const {
610f22ef01cSRoman Divacky   // The mach-o version of this method defaults to returning a stub reference.
611f22ef01cSRoman Divacky 
612f22ef01cSRoman Divacky   if (Encoding & DW_EH_PE_indirect) {
613f22ef01cSRoman Divacky     MachineModuleInfoMachO &MachOMMI =
614f22ef01cSRoman Divacky       MMI->getObjFileInfo<MachineModuleInfoMachO>();
615f22ef01cSRoman Divacky 
616f22ef01cSRoman Divacky     SmallString<128> Name;
617f22ef01cSRoman Divacky     Mang->getNameWithPrefix(Name, GV, true);
618f22ef01cSRoman Divacky     Name += "$non_lazy_ptr";
619f22ef01cSRoman Divacky 
620f22ef01cSRoman Divacky     // Add information about the stub reference to MachOMMI so that the stub
621f22ef01cSRoman Divacky     // gets emitted by the asmprinter.
622f22ef01cSRoman Divacky     MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str());
623f8254f43SDimitry Andric     MachineModuleInfoImpl::StubValueTy &StubSym =
624f8254f43SDimitry Andric       GV->hasHiddenVisibility() ? MachOMMI.getHiddenGVStubEntry(SSym) :
625f8254f43SDimitry Andric                                   MachOMMI.getGVStubEntry(SSym);
626f22ef01cSRoman Divacky     if (StubSym.getPointer() == 0) {
627f22ef01cSRoman Divacky       MCSymbol *Sym = Mang->getSymbol(GV);
628f22ef01cSRoman Divacky       StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
629f22ef01cSRoman Divacky     }
630f22ef01cSRoman Divacky 
631f22ef01cSRoman Divacky     return TargetLoweringObjectFile::
6323b0f4066SDimitry Andric       getExprForDwarfReference(SSym, Encoding & ~dwarf::DW_EH_PE_indirect, Streamer);
633f22ef01cSRoman Divacky   }
634f22ef01cSRoman Divacky 
635f22ef01cSRoman Divacky   return TargetLoweringObjectFile::
636f22ef01cSRoman Divacky     getExprForDwarfGlobalReference(GV, Mang, MMI, Encoding, Streamer);
637f22ef01cSRoman Divacky }
638f22ef01cSRoman Divacky 
6393b0f4066SDimitry Andric MCSymbol *TargetLoweringObjectFileMachO::
6403b0f4066SDimitry Andric getCFIPersonalitySymbol(const GlobalValue *GV, Mangler *Mang,
6413b0f4066SDimitry Andric                         MachineModuleInfo *MMI) const {
6423b0f4066SDimitry Andric   // The mach-o version of this method defaults to returning a stub reference.
6433b0f4066SDimitry Andric   MachineModuleInfoMachO &MachOMMI =
6443b0f4066SDimitry Andric     MMI->getObjFileInfo<MachineModuleInfoMachO>();
6453b0f4066SDimitry Andric 
6463b0f4066SDimitry Andric   SmallString<128> Name;
6473b0f4066SDimitry Andric   Mang->getNameWithPrefix(Name, GV, true);
6483b0f4066SDimitry Andric   Name += "$non_lazy_ptr";
6493b0f4066SDimitry Andric 
6503b0f4066SDimitry Andric   // Add information about the stub reference to MachOMMI so that the stub
6513b0f4066SDimitry Andric   // gets emitted by the asmprinter.
6523b0f4066SDimitry Andric   MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str());
653dff0c46cSDimitry Andric   MachineModuleInfoImpl::StubValueTy &StubSym = MachOMMI.getGVStubEntry(SSym);
6543b0f4066SDimitry Andric   if (StubSym.getPointer() == 0) {
6553b0f4066SDimitry Andric     MCSymbol *Sym = Mang->getSymbol(GV);
6563b0f4066SDimitry Andric     StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
6573b0f4066SDimitry Andric   }
6583b0f4066SDimitry Andric 
6593b0f4066SDimitry Andric   return SSym;
6603b0f4066SDimitry Andric }
6613b0f4066SDimitry Andric 
662f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
663f22ef01cSRoman Divacky //                                  COFF
664f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
665f22ef01cSRoman Divacky 
666f22ef01cSRoman Divacky static unsigned
667f22ef01cSRoman Divacky getCOFFSectionFlags(SectionKind K) {
668f22ef01cSRoman Divacky   unsigned Flags = 0;
669f22ef01cSRoman Divacky 
670ffd1746dSEd Schouten   if (K.isMetadata())
671f22ef01cSRoman Divacky     Flags |=
672ffd1746dSEd Schouten       COFF::IMAGE_SCN_MEM_DISCARDABLE;
673f22ef01cSRoman Divacky   else if (K.isText())
674f22ef01cSRoman Divacky     Flags |=
675ffd1746dSEd Schouten       COFF::IMAGE_SCN_MEM_EXECUTE |
6762754fe60SDimitry Andric       COFF::IMAGE_SCN_MEM_READ |
677ffd1746dSEd Schouten       COFF::IMAGE_SCN_CNT_CODE;
678f22ef01cSRoman Divacky   else if (K.isBSS ())
679f22ef01cSRoman Divacky     Flags |=
680ffd1746dSEd Schouten       COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA |
681ffd1746dSEd Schouten       COFF::IMAGE_SCN_MEM_READ |
682ffd1746dSEd Schouten       COFF::IMAGE_SCN_MEM_WRITE;
683dff0c46cSDimitry Andric   else if (K.isThreadLocal())
684dff0c46cSDimitry Andric     Flags |=
685dff0c46cSDimitry Andric       COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
686dff0c46cSDimitry Andric       COFF::IMAGE_SCN_MEM_READ |
687dff0c46cSDimitry Andric       COFF::IMAGE_SCN_MEM_WRITE;
688f22ef01cSRoman Divacky   else if (K.isReadOnly())
689f22ef01cSRoman Divacky     Flags |=
690ffd1746dSEd Schouten       COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
691ffd1746dSEd Schouten       COFF::IMAGE_SCN_MEM_READ;
692f22ef01cSRoman Divacky   else if (K.isWriteable())
693f22ef01cSRoman Divacky     Flags |=
694ffd1746dSEd Schouten       COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
695ffd1746dSEd Schouten       COFF::IMAGE_SCN_MEM_READ |
696ffd1746dSEd Schouten       COFF::IMAGE_SCN_MEM_WRITE;
697f22ef01cSRoman Divacky 
698f22ef01cSRoman Divacky   return Flags;
699f22ef01cSRoman Divacky }
700f22ef01cSRoman Divacky 
701f22ef01cSRoman Divacky const MCSection *TargetLoweringObjectFileCOFF::
702f22ef01cSRoman Divacky getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
703f22ef01cSRoman Divacky                          Mangler *Mang, const TargetMachine &TM) const {
704f22ef01cSRoman Divacky   return getContext().getCOFFSection(GV->getSection(),
705f22ef01cSRoman Divacky                                      getCOFFSectionFlags(Kind),
706f22ef01cSRoman Divacky                                      Kind);
707f22ef01cSRoman Divacky }
708f22ef01cSRoman Divacky 
709f22ef01cSRoman Divacky static const char *getCOFFSectionPrefixForUniqueGlobal(SectionKind Kind) {
710f22ef01cSRoman Divacky   if (Kind.isText())
7112754fe60SDimitry Andric     return ".text$";
712f22ef01cSRoman Divacky   if (Kind.isBSS ())
7132754fe60SDimitry Andric     return ".bss$";
714dff0c46cSDimitry Andric   if (Kind.isThreadLocal())
715dff0c46cSDimitry Andric     return ".tls$";
716f22ef01cSRoman Divacky   if (Kind.isWriteable())
7172754fe60SDimitry Andric     return ".data$";
7182754fe60SDimitry Andric   return ".rdata$";
719f22ef01cSRoman Divacky }
720f22ef01cSRoman Divacky 
721f22ef01cSRoman Divacky 
722f22ef01cSRoman Divacky const MCSection *TargetLoweringObjectFileCOFF::
723f22ef01cSRoman Divacky SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
724f22ef01cSRoman Divacky                        Mangler *Mang, const TargetMachine &TM) const {
725f22ef01cSRoman Divacky 
726f22ef01cSRoman Divacky   // If this global is linkonce/weak and the target handles this by emitting it
727f22ef01cSRoman Divacky   // into a 'uniqued' section name, create and return the section now.
728f22ef01cSRoman Divacky   if (GV->isWeakForLinker()) {
729f22ef01cSRoman Divacky     const char *Prefix = getCOFFSectionPrefixForUniqueGlobal(Kind);
730f22ef01cSRoman Divacky     SmallString<128> Name(Prefix, Prefix+strlen(Prefix));
731f22ef01cSRoman Divacky     MCSymbol *Sym = Mang->getSymbol(GV);
7322754fe60SDimitry Andric     Name.append(Sym->getName().begin() + 1, Sym->getName().end());
733f22ef01cSRoman Divacky 
734f22ef01cSRoman Divacky     unsigned Characteristics = getCOFFSectionFlags(Kind);
735f22ef01cSRoman Divacky 
736ffd1746dSEd Schouten     Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT;
737f22ef01cSRoman Divacky 
738f22ef01cSRoman Divacky     return getContext().getCOFFSection(Name.str(), Characteristics,
7392754fe60SDimitry Andric                           COFF::IMAGE_COMDAT_SELECT_ANY, Kind);
740f22ef01cSRoman Divacky   }
741f22ef01cSRoman Divacky 
742f22ef01cSRoman Divacky   if (Kind.isText())
743f22ef01cSRoman Divacky     return getTextSection();
744f22ef01cSRoman Divacky 
745dff0c46cSDimitry Andric   if (Kind.isThreadLocal())
746dff0c46cSDimitry Andric     return getTLSDataSection();
747dff0c46cSDimitry Andric 
748f22ef01cSRoman Divacky   return getDataSection();
749f22ef01cSRoman Divacky }
750f22ef01cSRoman Divacky 
751