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"
20f22ef01cSRoman Divacky #include "llvm/CodeGen/MachineModuleInfoImpls.h"
21f22ef01cSRoman Divacky #include "llvm/MC/MCContext.h"
22f22ef01cSRoman Divacky #include "llvm/MC/MCExpr.h"
23f22ef01cSRoman Divacky #include "llvm/MC/MCSectionMachO.h"
24f22ef01cSRoman Divacky #include "llvm/MC/MCSectionELF.h"
25f22ef01cSRoman Divacky #include "llvm/MC/MCSectionCOFF.h"
263b0f4066SDimitry Andric #include "llvm/MC/MCStreamer.h"
27f22ef01cSRoman Divacky #include "llvm/MC/MCSymbol.h"
28f22ef01cSRoman Divacky #include "llvm/Target/Mangler.h"
29f22ef01cSRoman Divacky #include "llvm/Target/TargetData.h"
30f22ef01cSRoman Divacky #include "llvm/Target/TargetMachine.h"
31f22ef01cSRoman Divacky #include "llvm/Target/TargetOptions.h"
32f22ef01cSRoman Divacky #include "llvm/Support/Dwarf.h"
332754fe60SDimitry Andric #include "llvm/Support/ELF.h"
34f22ef01cSRoman Divacky #include "llvm/Support/ErrorHandling.h"
35f22ef01cSRoman Divacky #include "llvm/Support/raw_ostream.h"
36f22ef01cSRoman Divacky #include "llvm/ADT/SmallString.h"
37f22ef01cSRoman Divacky #include "llvm/ADT/StringExtras.h"
382754fe60SDimitry Andric #include "llvm/ADT/Triple.h"
39f22ef01cSRoman Divacky using namespace llvm;
40f22ef01cSRoman Divacky using namespace dwarf;
41f22ef01cSRoman Divacky 
42f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
43f22ef01cSRoman Divacky //                                  ELF
44f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
45f22ef01cSRoman Divacky 
463b0f4066SDimitry Andric MCSymbol *
473b0f4066SDimitry Andric TargetLoweringObjectFileELF::getCFIPersonalitySymbol(const GlobalValue *GV,
483b0f4066SDimitry Andric                                                      Mangler *Mang,
493b0f4066SDimitry Andric                                                 MachineModuleInfo *MMI) const {
503b0f4066SDimitry Andric   unsigned Encoding = getPersonalityEncoding();
513b0f4066SDimitry Andric   switch (Encoding & 0x70) {
523b0f4066SDimitry Andric   default:
533b0f4066SDimitry Andric     report_fatal_error("We do not support this DWARF encoding yet!");
543b0f4066SDimitry Andric   case dwarf::DW_EH_PE_absptr:
553b0f4066SDimitry Andric     return  Mang->getSymbol(GV);
563b0f4066SDimitry Andric     break;
573b0f4066SDimitry Andric   case dwarf::DW_EH_PE_pcrel: {
5817a519f9SDimitry Andric     return getContext().GetOrCreateSymbol(StringRef("DW.ref.") +
5917a519f9SDimitry Andric                                           Mang->getSymbol(GV)->getName());
603b0f4066SDimitry Andric     break;
613b0f4066SDimitry Andric   }
623b0f4066SDimitry Andric   }
633b0f4066SDimitry Andric }
643b0f4066SDimitry Andric 
653b0f4066SDimitry Andric void TargetLoweringObjectFileELF::emitPersonalityValue(MCStreamer &Streamer,
663b0f4066SDimitry Andric                                                        const TargetMachine &TM,
673b0f4066SDimitry Andric                                                        const MCSymbol *Sym) const {
6817a519f9SDimitry Andric   SmallString<64> NameData("DW.ref.");
6917a519f9SDimitry Andric   NameData += Sym->getName();
7017a519f9SDimitry Andric   MCSymbol *Label = getContext().GetOrCreateSymbol(NameData);
713b0f4066SDimitry Andric   Streamer.EmitSymbolAttribute(Label, MCSA_Hidden);
723b0f4066SDimitry Andric   Streamer.EmitSymbolAttribute(Label, MCSA_Weak);
7317a519f9SDimitry Andric   StringRef Prefix = ".data.";
7417a519f9SDimitry Andric   NameData.insert(NameData.begin(), Prefix.begin(), Prefix.end());
753b0f4066SDimitry Andric   unsigned Flags = ELF::SHF_ALLOC | ELF::SHF_WRITE | ELF::SHF_GROUP;
763b0f4066SDimitry Andric   const MCSection *Sec = getContext().getELFSection(NameData,
773b0f4066SDimitry Andric                                                     ELF::SHT_PROGBITS,
783b0f4066SDimitry Andric                                                     Flags,
793b0f4066SDimitry Andric                                                     SectionKind::getDataRel(),
803b0f4066SDimitry Andric                                                     0, Label->getName());
813b0f4066SDimitry Andric   Streamer.SwitchSection(Sec);
823b0f4066SDimitry Andric   Streamer.EmitValueToAlignment(8);
833b0f4066SDimitry Andric   Streamer.EmitSymbolAttribute(Label, MCSA_ELF_TypeObject);
843b0f4066SDimitry Andric   const MCExpr *E = MCConstantExpr::Create(8, getContext());
853b0f4066SDimitry Andric   Streamer.EmitELFSize(Label, E);
863b0f4066SDimitry Andric   Streamer.EmitLabel(Label);
873b0f4066SDimitry Andric 
883b0f4066SDimitry Andric   unsigned Size = TM.getTargetData()->getPointerSize();
893b0f4066SDimitry Andric   Streamer.EmitSymbolValue(Sym, Size);
903b0f4066SDimitry Andric }
913b0f4066SDimitry Andric 
92f22ef01cSRoman Divacky static SectionKind
93f22ef01cSRoman Divacky getELFKindForNamedSection(StringRef Name, SectionKind K) {
94bd5abe19SDimitry Andric   // N.B.: The defaults used in here are no the same ones used in MC.
95bd5abe19SDimitry Andric   // We follow gcc, MC follows gas. For example, given ".section .eh_frame",
96bd5abe19SDimitry Andric   // both gas and MC will produce a section with no flags. Given
97bd5abe19SDimitry Andric   // section(".eh_frame") gcc will produce
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.";
192f22ef01cSRoman Divacky 
193f22ef01cSRoman Divacky   if (Kind.isThreadData())           return ".tdata.";
194f22ef01cSRoman Divacky   if (Kind.isThreadBSS())            return ".tbss.";
195f22ef01cSRoman Divacky 
196f22ef01cSRoman Divacky   if (Kind.isDataNoRel())            return ".data.";
197f22ef01cSRoman Divacky   if (Kind.isDataRelLocal())         return ".data.rel.local.";
198f22ef01cSRoman Divacky   if (Kind.isDataRel())              return ".data.rel.";
199f22ef01cSRoman Divacky   if (Kind.isReadOnlyWithRelLocal()) return ".data.rel.ro.local.";
200f22ef01cSRoman Divacky 
201f22ef01cSRoman Divacky   assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
202f22ef01cSRoman Divacky   return ".data.rel.ro.";
203f22ef01cSRoman Divacky }
204f22ef01cSRoman Divacky 
205f22ef01cSRoman Divacky 
206f22ef01cSRoman Divacky const MCSection *TargetLoweringObjectFileELF::
207f22ef01cSRoman Divacky SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
208f22ef01cSRoman Divacky                        Mangler *Mang, const TargetMachine &TM) const {
209f22ef01cSRoman Divacky   // If we have -ffunction-section or -fdata-section then we should emit the
210f22ef01cSRoman Divacky   // global value to a uniqued section specifically for it.
211f22ef01cSRoman Divacky   bool EmitUniquedSection;
212f22ef01cSRoman Divacky   if (Kind.isText())
213f22ef01cSRoman Divacky     EmitUniquedSection = TM.getFunctionSections();
214f22ef01cSRoman Divacky   else
215f22ef01cSRoman Divacky     EmitUniquedSection = TM.getDataSections();
216f22ef01cSRoman Divacky 
217f22ef01cSRoman Divacky   // If this global is linkonce/weak and the target handles this by emitting it
218f22ef01cSRoman Divacky   // into a 'uniqued' section name, create and return the section now.
219f22ef01cSRoman Divacky   if ((GV->isWeakForLinker() || EmitUniquedSection) &&
220f22ef01cSRoman Divacky       !Kind.isCommon() && !Kind.isBSS()) {
221f22ef01cSRoman Divacky     const char *Prefix;
222f22ef01cSRoman Divacky     Prefix = getSectionPrefixForGlobal(Kind);
223f22ef01cSRoman Divacky 
224f22ef01cSRoman Divacky     SmallString<128> Name(Prefix, Prefix+strlen(Prefix));
225f22ef01cSRoman Divacky     MCSymbol *Sym = Mang->getSymbol(GV);
226f22ef01cSRoman Divacky     Name.append(Sym->getName().begin(), Sym->getName().end());
2272754fe60SDimitry Andric     StringRef Group = "";
2282754fe60SDimitry Andric     unsigned Flags = getELFSectionFlags(Kind);
2292754fe60SDimitry Andric     if (GV->isWeakForLinker()) {
2302754fe60SDimitry Andric       Group = Sym->getName();
2312754fe60SDimitry Andric       Flags |= ELF::SHF_GROUP;
2322754fe60SDimitry Andric     }
2332754fe60SDimitry Andric 
234f22ef01cSRoman Divacky     return getContext().getELFSection(Name.str(),
235f22ef01cSRoman Divacky                                       getELFSectionType(Name.str(), Kind),
2362754fe60SDimitry Andric                                       Flags, Kind, 0, Group);
237f22ef01cSRoman Divacky   }
238f22ef01cSRoman Divacky 
239f22ef01cSRoman Divacky   if (Kind.isText()) return TextSection;
240f22ef01cSRoman Divacky 
241f22ef01cSRoman Divacky   if (Kind.isMergeable1ByteCString() ||
242f22ef01cSRoman Divacky       Kind.isMergeable2ByteCString() ||
243f22ef01cSRoman Divacky       Kind.isMergeable4ByteCString()) {
244f22ef01cSRoman Divacky 
245f22ef01cSRoman Divacky     // We also need alignment here.
246f22ef01cSRoman Divacky     // FIXME: this is getting the alignment of the character, not the
247f22ef01cSRoman Divacky     // alignment of the global!
248f22ef01cSRoman Divacky     unsigned Align =
249f22ef01cSRoman Divacky       TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV));
250f22ef01cSRoman Divacky 
251f22ef01cSRoman Divacky     const char *SizeSpec = ".rodata.str1.";
252f22ef01cSRoman Divacky     if (Kind.isMergeable2ByteCString())
253f22ef01cSRoman Divacky       SizeSpec = ".rodata.str2.";
254f22ef01cSRoman Divacky     else if (Kind.isMergeable4ByteCString())
255f22ef01cSRoman Divacky       SizeSpec = ".rodata.str4.";
256f22ef01cSRoman Divacky     else
257f22ef01cSRoman Divacky       assert(Kind.isMergeable1ByteCString() && "unknown string width");
258f22ef01cSRoman Divacky 
259f22ef01cSRoman Divacky 
260f22ef01cSRoman Divacky     std::string Name = SizeSpec + utostr(Align);
2612754fe60SDimitry Andric     return getContext().getELFSection(Name, ELF::SHT_PROGBITS,
2622754fe60SDimitry Andric                                       ELF::SHF_ALLOC |
2632754fe60SDimitry Andric                                       ELF::SHF_MERGE |
2642754fe60SDimitry Andric                                       ELF::SHF_STRINGS,
265f22ef01cSRoman Divacky                                       Kind);
266f22ef01cSRoman Divacky   }
267f22ef01cSRoman Divacky 
268f22ef01cSRoman Divacky   if (Kind.isMergeableConst()) {
269f22ef01cSRoman Divacky     if (Kind.isMergeableConst4() && MergeableConst4Section)
270f22ef01cSRoman Divacky       return MergeableConst4Section;
271f22ef01cSRoman Divacky     if (Kind.isMergeableConst8() && MergeableConst8Section)
272f22ef01cSRoman Divacky       return MergeableConst8Section;
273f22ef01cSRoman Divacky     if (Kind.isMergeableConst16() && MergeableConst16Section)
274f22ef01cSRoman Divacky       return MergeableConst16Section;
275f22ef01cSRoman Divacky     return ReadOnlySection;  // .const
276f22ef01cSRoman Divacky   }
277f22ef01cSRoman Divacky 
278f22ef01cSRoman Divacky   if (Kind.isReadOnly())             return ReadOnlySection;
279f22ef01cSRoman Divacky 
280f22ef01cSRoman Divacky   if (Kind.isThreadData())           return TLSDataSection;
281f22ef01cSRoman Divacky   if (Kind.isThreadBSS())            return TLSBSSSection;
282f22ef01cSRoman Divacky 
283f22ef01cSRoman Divacky   // Note: we claim that common symbols are put in BSSSection, but they are
284f22ef01cSRoman Divacky   // really emitted with the magic .comm directive, which creates a symbol table
285f22ef01cSRoman Divacky   // entry but not a section.
286f22ef01cSRoman Divacky   if (Kind.isBSS() || Kind.isCommon()) return BSSSection;
287f22ef01cSRoman Divacky 
288f22ef01cSRoman Divacky   if (Kind.isDataNoRel())            return DataSection;
289f22ef01cSRoman Divacky   if (Kind.isDataRelLocal())         return DataRelLocalSection;
290f22ef01cSRoman Divacky   if (Kind.isDataRel())              return DataRelSection;
291f22ef01cSRoman Divacky   if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection;
292f22ef01cSRoman Divacky 
293f22ef01cSRoman Divacky   assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
294f22ef01cSRoman Divacky   return DataRelROSection;
295f22ef01cSRoman Divacky }
296f22ef01cSRoman Divacky 
297f22ef01cSRoman Divacky /// getSectionForConstant - Given a mergeable constant with the
298f22ef01cSRoman Divacky /// specified size and relocation information, return a section that it
299f22ef01cSRoman Divacky /// should be placed in.
300f22ef01cSRoman Divacky const MCSection *TargetLoweringObjectFileELF::
301f22ef01cSRoman Divacky getSectionForConstant(SectionKind Kind) const {
302f22ef01cSRoman Divacky   if (Kind.isMergeableConst4() && MergeableConst4Section)
303f22ef01cSRoman Divacky     return MergeableConst4Section;
304f22ef01cSRoman Divacky   if (Kind.isMergeableConst8() && MergeableConst8Section)
305f22ef01cSRoman Divacky     return MergeableConst8Section;
306f22ef01cSRoman Divacky   if (Kind.isMergeableConst16() && MergeableConst16Section)
307f22ef01cSRoman Divacky     return MergeableConst16Section;
308f22ef01cSRoman Divacky   if (Kind.isReadOnly())
309f22ef01cSRoman Divacky     return ReadOnlySection;
310f22ef01cSRoman Divacky 
311f22ef01cSRoman Divacky   if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection;
312f22ef01cSRoman Divacky   assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
313f22ef01cSRoman Divacky   return DataRelROSection;
314f22ef01cSRoman Divacky }
315f22ef01cSRoman Divacky 
316f22ef01cSRoman Divacky const MCExpr *TargetLoweringObjectFileELF::
317f22ef01cSRoman Divacky getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
318f22ef01cSRoman Divacky                                MachineModuleInfo *MMI,
319f22ef01cSRoman Divacky                                unsigned Encoding, MCStreamer &Streamer) const {
320f22ef01cSRoman Divacky 
321f22ef01cSRoman Divacky   if (Encoding & dwarf::DW_EH_PE_indirect) {
322f22ef01cSRoman Divacky     MachineModuleInfoELF &ELFMMI = MMI->getObjFileInfo<MachineModuleInfoELF>();
323f22ef01cSRoman Divacky 
324f22ef01cSRoman Divacky     SmallString<128> Name;
325f22ef01cSRoman Divacky     Mang->getNameWithPrefix(Name, GV, true);
326f22ef01cSRoman Divacky     Name += ".DW.stub";
327f22ef01cSRoman Divacky 
328f22ef01cSRoman Divacky     // Add information about the stub reference to ELFMMI so that the stub
329f22ef01cSRoman Divacky     // gets emitted by the asmprinter.
330f22ef01cSRoman Divacky     MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str());
331f22ef01cSRoman Divacky     MachineModuleInfoImpl::StubValueTy &StubSym = ELFMMI.getGVStubEntry(SSym);
332f22ef01cSRoman Divacky     if (StubSym.getPointer() == 0) {
333f22ef01cSRoman Divacky       MCSymbol *Sym = Mang->getSymbol(GV);
334f22ef01cSRoman Divacky       StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
335f22ef01cSRoman Divacky     }
336f22ef01cSRoman Divacky 
337f22ef01cSRoman Divacky     return TargetLoweringObjectFile::
3383b0f4066SDimitry Andric       getExprForDwarfReference(SSym, Encoding & ~dwarf::DW_EH_PE_indirect, Streamer);
339f22ef01cSRoman Divacky   }
340f22ef01cSRoman Divacky 
341f22ef01cSRoman Divacky   return TargetLoweringObjectFile::
342f22ef01cSRoman Divacky     getExprForDwarfGlobalReference(GV, Mang, MMI, Encoding, Streamer);
343f22ef01cSRoman Divacky }
344f22ef01cSRoman Divacky 
345f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
346f22ef01cSRoman Divacky //                                 MachO
347f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
348f22ef01cSRoman Divacky 
349f22ef01cSRoman Divacky const MCSection *TargetLoweringObjectFileMachO::
350f22ef01cSRoman Divacky getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
351f22ef01cSRoman Divacky                          Mangler *Mang, const TargetMachine &TM) const {
352f22ef01cSRoman Divacky   // Parse the section specifier and create it if valid.
353f22ef01cSRoman Divacky   StringRef Segment, Section;
3543b0f4066SDimitry Andric   unsigned TAA = 0, StubSize = 0;
3553b0f4066SDimitry Andric   bool TAAParsed;
356f22ef01cSRoman Divacky   std::string ErrorCode =
357f22ef01cSRoman Divacky     MCSectionMachO::ParseSectionSpecifier(GV->getSection(), Segment, Section,
3583b0f4066SDimitry Andric                                           TAA, TAAParsed, StubSize);
359f22ef01cSRoman Divacky   if (!ErrorCode.empty()) {
360f22ef01cSRoman Divacky     // If invalid, report the error with report_fatal_error.
361f22ef01cSRoman Divacky     report_fatal_error("Global variable '" + GV->getNameStr() +
362f22ef01cSRoman Divacky                       "' has an invalid section specifier '" + GV->getSection()+
363f22ef01cSRoman Divacky                       "': " + ErrorCode + ".");
364f22ef01cSRoman Divacky     // Fall back to dropping it into the data section.
365f22ef01cSRoman Divacky     return DataSection;
366f22ef01cSRoman Divacky   }
367f22ef01cSRoman Divacky 
368f22ef01cSRoman Divacky   // Get the section.
369f22ef01cSRoman Divacky   const MCSectionMachO *S =
370f22ef01cSRoman Divacky     getContext().getMachOSection(Segment, Section, TAA, StubSize, Kind);
371f22ef01cSRoman Divacky 
372dd6029ffSDimitry Andric   // If TAA wasn't set by ParseSectionSpecifier() above,
373dd6029ffSDimitry Andric   // use the value returned by getMachOSection() as a default.
3743b0f4066SDimitry Andric   if (!TAAParsed)
375dd6029ffSDimitry Andric     TAA = S->getTypeAndAttributes();
376dd6029ffSDimitry Andric 
377f22ef01cSRoman Divacky   // Okay, now that we got the section, verify that the TAA & StubSize agree.
378f22ef01cSRoman Divacky   // If the user declared multiple globals with different section flags, we need
379f22ef01cSRoman Divacky   // to reject it here.
380f22ef01cSRoman Divacky   if (S->getTypeAndAttributes() != TAA || S->getStubSize() != StubSize) {
381f22ef01cSRoman Divacky     // If invalid, report the error with report_fatal_error.
382f22ef01cSRoman Divacky     report_fatal_error("Global variable '" + GV->getNameStr() +
383f22ef01cSRoman Divacky                       "' section type or attributes does not match previous"
384f22ef01cSRoman Divacky                       " section specifier");
385f22ef01cSRoman Divacky   }
386f22ef01cSRoman Divacky 
387f22ef01cSRoman Divacky   return S;
388f22ef01cSRoman Divacky }
389f22ef01cSRoman Divacky 
390f22ef01cSRoman Divacky const MCSection *TargetLoweringObjectFileMachO::
391f22ef01cSRoman Divacky SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
392f22ef01cSRoman Divacky                        Mangler *Mang, const TargetMachine &TM) const {
393f22ef01cSRoman Divacky 
394f22ef01cSRoman Divacky   // Handle thread local data.
395f22ef01cSRoman Divacky   if (Kind.isThreadBSS()) return TLSBSSSection;
396f22ef01cSRoman Divacky   if (Kind.isThreadData()) return TLSDataSection;
397f22ef01cSRoman Divacky 
398f22ef01cSRoman Divacky   if (Kind.isText())
399f22ef01cSRoman Divacky     return GV->isWeakForLinker() ? TextCoalSection : TextSection;
400f22ef01cSRoman Divacky 
401f22ef01cSRoman Divacky   // If this is weak/linkonce, put this in a coalescable section, either in text
402f22ef01cSRoman Divacky   // or data depending on if it is writable.
403f22ef01cSRoman Divacky   if (GV->isWeakForLinker()) {
404f22ef01cSRoman Divacky     if (Kind.isReadOnly())
405f22ef01cSRoman Divacky       return ConstTextCoalSection;
406f22ef01cSRoman Divacky     return DataCoalSection;
407f22ef01cSRoman Divacky   }
408f22ef01cSRoman Divacky 
409f22ef01cSRoman Divacky   // FIXME: Alignment check should be handled by section classifier.
410f22ef01cSRoman Divacky   if (Kind.isMergeable1ByteCString() &&
411f22ef01cSRoman Divacky       TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV)) < 32)
412f22ef01cSRoman Divacky     return CStringSection;
413f22ef01cSRoman Divacky 
414f22ef01cSRoman Divacky   // Do not put 16-bit arrays in the UString section if they have an
415f22ef01cSRoman Divacky   // externally visible label, this runs into issues with certain linker
416f22ef01cSRoman Divacky   // versions.
417f22ef01cSRoman Divacky   if (Kind.isMergeable2ByteCString() && !GV->hasExternalLinkage() &&
418f22ef01cSRoman Divacky       TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV)) < 32)
419f22ef01cSRoman Divacky     return UStringSection;
420f22ef01cSRoman Divacky 
421f22ef01cSRoman Divacky   if (Kind.isMergeableConst()) {
422f22ef01cSRoman Divacky     if (Kind.isMergeableConst4())
423f22ef01cSRoman Divacky       return FourByteConstantSection;
424f22ef01cSRoman Divacky     if (Kind.isMergeableConst8())
425f22ef01cSRoman Divacky       return EightByteConstantSection;
426f22ef01cSRoman Divacky     if (Kind.isMergeableConst16() && SixteenByteConstantSection)
427f22ef01cSRoman Divacky       return SixteenByteConstantSection;
428f22ef01cSRoman Divacky   }
429f22ef01cSRoman Divacky 
430f22ef01cSRoman Divacky   // Otherwise, if it is readonly, but not something we can specially optimize,
431f22ef01cSRoman Divacky   // just drop it in .const.
432f22ef01cSRoman Divacky   if (Kind.isReadOnly())
433f22ef01cSRoman Divacky     return ReadOnlySection;
434f22ef01cSRoman Divacky 
435f22ef01cSRoman Divacky   // If this is marked const, put it into a const section.  But if the dynamic
436f22ef01cSRoman Divacky   // linker needs to write to it, put it in the data segment.
437f22ef01cSRoman Divacky   if (Kind.isReadOnlyWithRel())
438f22ef01cSRoman Divacky     return ConstDataSection;
439f22ef01cSRoman Divacky 
440f22ef01cSRoman Divacky   // Put zero initialized globals with strong external linkage in the
441f22ef01cSRoman Divacky   // DATA, __common section with the .zerofill directive.
442f22ef01cSRoman Divacky   if (Kind.isBSSExtern())
443f22ef01cSRoman Divacky     return DataCommonSection;
444f22ef01cSRoman Divacky 
445f22ef01cSRoman Divacky   // Put zero initialized globals with local linkage in __DATA,__bss directive
446f22ef01cSRoman Divacky   // with the .zerofill directive (aka .lcomm).
447f22ef01cSRoman Divacky   if (Kind.isBSSLocal())
448f22ef01cSRoman Divacky     return DataBSSSection;
449f22ef01cSRoman Divacky 
450f22ef01cSRoman Divacky   // Otherwise, just drop the variable in the normal data section.
451f22ef01cSRoman Divacky   return DataSection;
452f22ef01cSRoman Divacky }
453f22ef01cSRoman Divacky 
454f22ef01cSRoman Divacky const MCSection *
455f22ef01cSRoman Divacky TargetLoweringObjectFileMachO::getSectionForConstant(SectionKind Kind) const {
456f22ef01cSRoman Divacky   // If this constant requires a relocation, we have to put it in the data
457f22ef01cSRoman Divacky   // segment, not in the text segment.
458f22ef01cSRoman Divacky   if (Kind.isDataRel() || Kind.isReadOnlyWithRel())
459f22ef01cSRoman Divacky     return ConstDataSection;
460f22ef01cSRoman Divacky 
461f22ef01cSRoman Divacky   if (Kind.isMergeableConst4())
462f22ef01cSRoman Divacky     return FourByteConstantSection;
463f22ef01cSRoman Divacky   if (Kind.isMergeableConst8())
464f22ef01cSRoman Divacky     return EightByteConstantSection;
465f22ef01cSRoman Divacky   if (Kind.isMergeableConst16() && SixteenByteConstantSection)
466f22ef01cSRoman Divacky     return SixteenByteConstantSection;
467f22ef01cSRoman Divacky   return ReadOnlySection;  // .const
468f22ef01cSRoman Divacky }
469f22ef01cSRoman Divacky 
470f22ef01cSRoman Divacky /// shouldEmitUsedDirectiveFor - This hook allows targets to selectively decide
471f22ef01cSRoman Divacky /// not to emit the UsedDirective for some symbols in llvm.used.
472f22ef01cSRoman Divacky // FIXME: REMOVE this (rdar://7071300)
473f22ef01cSRoman Divacky bool TargetLoweringObjectFileMachO::
474f22ef01cSRoman Divacky shouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler *Mang) const {
475f22ef01cSRoman Divacky   /// On Darwin, internally linked data beginning with "L" or "l" does not have
476f22ef01cSRoman Divacky   /// the directive emitted (this occurs in ObjC metadata).
477f22ef01cSRoman Divacky   if (!GV) return false;
478f22ef01cSRoman Divacky 
479f22ef01cSRoman Divacky   // Check whether the mangled name has the "Private" or "LinkerPrivate" prefix.
480f22ef01cSRoman Divacky   if (GV->hasLocalLinkage() && !isa<Function>(GV)) {
481f22ef01cSRoman Divacky     // FIXME: ObjC metadata is currently emitted as internal symbols that have
482f22ef01cSRoman Divacky     // \1L and \0l prefixes on them.  Fix them to be Private/LinkerPrivate and
483f22ef01cSRoman Divacky     // this horrible hack can go away.
484f22ef01cSRoman Divacky     MCSymbol *Sym = Mang->getSymbol(GV);
485f22ef01cSRoman Divacky     if (Sym->getName()[0] == 'L' || Sym->getName()[0] == 'l')
486f22ef01cSRoman Divacky       return false;
487f22ef01cSRoman Divacky   }
488f22ef01cSRoman Divacky 
489f22ef01cSRoman Divacky   return true;
490f22ef01cSRoman Divacky }
491f22ef01cSRoman Divacky 
492f22ef01cSRoman Divacky const MCExpr *TargetLoweringObjectFileMachO::
493f22ef01cSRoman Divacky getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
494f22ef01cSRoman Divacky                                MachineModuleInfo *MMI, unsigned Encoding,
495f22ef01cSRoman Divacky                                MCStreamer &Streamer) const {
496f22ef01cSRoman Divacky   // The mach-o version of this method defaults to returning a stub reference.
497f22ef01cSRoman Divacky 
498f22ef01cSRoman Divacky   if (Encoding & DW_EH_PE_indirect) {
499f22ef01cSRoman Divacky     MachineModuleInfoMachO &MachOMMI =
500f22ef01cSRoman Divacky       MMI->getObjFileInfo<MachineModuleInfoMachO>();
501f22ef01cSRoman Divacky 
502f22ef01cSRoman Divacky     SmallString<128> Name;
503f22ef01cSRoman Divacky     Mang->getNameWithPrefix(Name, GV, true);
504f22ef01cSRoman Divacky     Name += "$non_lazy_ptr";
505f22ef01cSRoman Divacky 
506f22ef01cSRoman Divacky     // Add information about the stub reference to MachOMMI so that the stub
507f22ef01cSRoman Divacky     // gets emitted by the asmprinter.
508f22ef01cSRoman Divacky     MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str());
509f8254f43SDimitry Andric     MachineModuleInfoImpl::StubValueTy &StubSym =
510f8254f43SDimitry Andric       GV->hasHiddenVisibility() ? MachOMMI.getHiddenGVStubEntry(SSym) :
511f8254f43SDimitry Andric                                   MachOMMI.getGVStubEntry(SSym);
512f22ef01cSRoman Divacky     if (StubSym.getPointer() == 0) {
513f22ef01cSRoman Divacky       MCSymbol *Sym = Mang->getSymbol(GV);
514f22ef01cSRoman Divacky       StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
515f22ef01cSRoman Divacky     }
516f22ef01cSRoman Divacky 
517f22ef01cSRoman Divacky     return TargetLoweringObjectFile::
5183b0f4066SDimitry Andric       getExprForDwarfReference(SSym, Encoding & ~dwarf::DW_EH_PE_indirect, Streamer);
519f22ef01cSRoman Divacky   }
520f22ef01cSRoman Divacky 
521f22ef01cSRoman Divacky   return TargetLoweringObjectFile::
522f22ef01cSRoman Divacky     getExprForDwarfGlobalReference(GV, Mang, MMI, Encoding, Streamer);
523f22ef01cSRoman Divacky }
524f22ef01cSRoman Divacky 
5253b0f4066SDimitry Andric MCSymbol *TargetLoweringObjectFileMachO::
5263b0f4066SDimitry Andric getCFIPersonalitySymbol(const GlobalValue *GV, Mangler *Mang,
5273b0f4066SDimitry Andric                         MachineModuleInfo *MMI) const {
5283b0f4066SDimitry Andric   // The mach-o version of this method defaults to returning a stub reference.
5293b0f4066SDimitry Andric   MachineModuleInfoMachO &MachOMMI =
5303b0f4066SDimitry Andric     MMI->getObjFileInfo<MachineModuleInfoMachO>();
5313b0f4066SDimitry Andric 
5323b0f4066SDimitry Andric   SmallString<128> Name;
5333b0f4066SDimitry Andric   Mang->getNameWithPrefix(Name, GV, true);
5343b0f4066SDimitry Andric   Name += "$non_lazy_ptr";
5353b0f4066SDimitry Andric 
5363b0f4066SDimitry Andric   // Add information about the stub reference to MachOMMI so that the stub
5373b0f4066SDimitry Andric   // gets emitted by the asmprinter.
5383b0f4066SDimitry Andric   MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str());
539f8254f43SDimitry Andric   MachineModuleInfoImpl::StubValueTy &StubSym =
540f8254f43SDimitry Andric       GV->hasHiddenVisibility() ? MachOMMI.getHiddenGVStubEntry(SSym) :
541f8254f43SDimitry Andric                                   MachOMMI.getGVStubEntry(SSym);
5423b0f4066SDimitry Andric   if (StubSym.getPointer() == 0) {
5433b0f4066SDimitry Andric     MCSymbol *Sym = Mang->getSymbol(GV);
5443b0f4066SDimitry Andric     StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
5453b0f4066SDimitry Andric   }
5463b0f4066SDimitry Andric 
5473b0f4066SDimitry Andric   return SSym;
5483b0f4066SDimitry Andric }
5493b0f4066SDimitry Andric 
550f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
551f22ef01cSRoman Divacky //                                  COFF
552f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
553f22ef01cSRoman Divacky 
554f22ef01cSRoman Divacky static unsigned
555f22ef01cSRoman Divacky getCOFFSectionFlags(SectionKind K) {
556f22ef01cSRoman Divacky   unsigned Flags = 0;
557f22ef01cSRoman Divacky 
558ffd1746dSEd Schouten   if (K.isMetadata())
559f22ef01cSRoman Divacky     Flags |=
560ffd1746dSEd Schouten       COFF::IMAGE_SCN_MEM_DISCARDABLE;
561f22ef01cSRoman Divacky   else if (K.isText())
562f22ef01cSRoman Divacky     Flags |=
563ffd1746dSEd Schouten       COFF::IMAGE_SCN_MEM_EXECUTE |
5642754fe60SDimitry Andric       COFF::IMAGE_SCN_MEM_READ |
565ffd1746dSEd Schouten       COFF::IMAGE_SCN_CNT_CODE;
566f22ef01cSRoman Divacky   else if (K.isBSS ())
567f22ef01cSRoman Divacky     Flags |=
568ffd1746dSEd Schouten       COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA |
569ffd1746dSEd Schouten       COFF::IMAGE_SCN_MEM_READ |
570ffd1746dSEd Schouten       COFF::IMAGE_SCN_MEM_WRITE;
571f22ef01cSRoman Divacky   else if (K.isReadOnly())
572f22ef01cSRoman Divacky     Flags |=
573ffd1746dSEd Schouten       COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
574ffd1746dSEd Schouten       COFF::IMAGE_SCN_MEM_READ;
575f22ef01cSRoman Divacky   else if (K.isWriteable())
576f22ef01cSRoman Divacky     Flags |=
577ffd1746dSEd Schouten       COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
578ffd1746dSEd Schouten       COFF::IMAGE_SCN_MEM_READ |
579ffd1746dSEd Schouten       COFF::IMAGE_SCN_MEM_WRITE;
580f22ef01cSRoman Divacky 
581f22ef01cSRoman Divacky   return Flags;
582f22ef01cSRoman Divacky }
583f22ef01cSRoman Divacky 
584f22ef01cSRoman Divacky const MCSection *TargetLoweringObjectFileCOFF::
585f22ef01cSRoman Divacky getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
586f22ef01cSRoman Divacky                          Mangler *Mang, const TargetMachine &TM) const {
587f22ef01cSRoman Divacky   return getContext().getCOFFSection(GV->getSection(),
588f22ef01cSRoman Divacky                                      getCOFFSectionFlags(Kind),
589f22ef01cSRoman Divacky                                      Kind);
590f22ef01cSRoman Divacky }
591f22ef01cSRoman Divacky 
592f22ef01cSRoman Divacky static const char *getCOFFSectionPrefixForUniqueGlobal(SectionKind Kind) {
593f22ef01cSRoman Divacky   if (Kind.isText())
5942754fe60SDimitry Andric     return ".text$";
595f22ef01cSRoman Divacky   if (Kind.isBSS ())
5962754fe60SDimitry Andric     return ".bss$";
597f22ef01cSRoman Divacky   if (Kind.isWriteable())
5982754fe60SDimitry Andric     return ".data$";
5992754fe60SDimitry Andric   return ".rdata$";
600f22ef01cSRoman Divacky }
601f22ef01cSRoman Divacky 
602f22ef01cSRoman Divacky 
603f22ef01cSRoman Divacky const MCSection *TargetLoweringObjectFileCOFF::
604f22ef01cSRoman Divacky SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
605f22ef01cSRoman Divacky                        Mangler *Mang, const TargetMachine &TM) const {
606f22ef01cSRoman Divacky   assert(!Kind.isThreadLocal() && "Doesn't support TLS");
607f22ef01cSRoman Divacky 
608f22ef01cSRoman Divacky   // If this global is linkonce/weak and the target handles this by emitting it
609f22ef01cSRoman Divacky   // into a 'uniqued' section name, create and return the section now.
610f22ef01cSRoman Divacky   if (GV->isWeakForLinker()) {
611f22ef01cSRoman Divacky     const char *Prefix = getCOFFSectionPrefixForUniqueGlobal(Kind);
612f22ef01cSRoman Divacky     SmallString<128> Name(Prefix, Prefix+strlen(Prefix));
613f22ef01cSRoman Divacky     MCSymbol *Sym = Mang->getSymbol(GV);
6142754fe60SDimitry Andric     Name.append(Sym->getName().begin() + 1, Sym->getName().end());
615f22ef01cSRoman Divacky 
616f22ef01cSRoman Divacky     unsigned Characteristics = getCOFFSectionFlags(Kind);
617f22ef01cSRoman Divacky 
618ffd1746dSEd Schouten     Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT;
619f22ef01cSRoman Divacky 
620f22ef01cSRoman Divacky     return getContext().getCOFFSection(Name.str(), Characteristics,
6212754fe60SDimitry Andric                           COFF::IMAGE_COMDAT_SELECT_ANY, Kind);
622f22ef01cSRoman Divacky   }
623f22ef01cSRoman Divacky 
624f22ef01cSRoman Divacky   if (Kind.isText())
625f22ef01cSRoman Divacky     return getTextSection();
626f22ef01cSRoman Divacky 
627f22ef01cSRoman Divacky   return getDataSection();
628f22ef01cSRoman Divacky }
629f22ef01cSRoman Divacky 
630