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 
4617a519f9SDimitry Andric TargetLoweringObjectFileELF::TargetLoweringObjectFileELF()
4717a519f9SDimitry Andric   : TargetLoweringObjectFile(),
4817a519f9SDimitry Andric     TLSDataSection(0),
4917a519f9SDimitry Andric     TLSBSSSection(0),
5017a519f9SDimitry Andric     DataRelSection(0),
5117a519f9SDimitry Andric     DataRelLocalSection(0),
5217a519f9SDimitry Andric     DataRelROSection(0),
5317a519f9SDimitry Andric     DataRelROLocalSection(0),
5417a519f9SDimitry Andric     MergeableConst4Section(0),
5517a519f9SDimitry Andric     MergeableConst8Section(0),
5617a519f9SDimitry Andric     MergeableConst16Section(0) {
5717a519f9SDimitry Andric }
5817a519f9SDimitry Andric 
59f22ef01cSRoman Divacky void TargetLoweringObjectFileELF::Initialize(MCContext &Ctx,
60f22ef01cSRoman Divacky                                              const TargetMachine &TM) {
61f22ef01cSRoman Divacky   TargetLoweringObjectFile::Initialize(Ctx, TM);
62f22ef01cSRoman Divacky 
63f22ef01cSRoman Divacky   BSSSection =
642754fe60SDimitry Andric     getContext().getELFSection(".bss", ELF::SHT_NOBITS,
652754fe60SDimitry Andric                                ELF::SHF_WRITE |ELF::SHF_ALLOC,
66f22ef01cSRoman Divacky                                SectionKind::getBSS());
67f22ef01cSRoman Divacky 
68f22ef01cSRoman Divacky   TextSection =
692754fe60SDimitry Andric     getContext().getELFSection(".text", ELF::SHT_PROGBITS,
702754fe60SDimitry Andric                                ELF::SHF_EXECINSTR |
712754fe60SDimitry Andric                                ELF::SHF_ALLOC,
72f22ef01cSRoman Divacky                                SectionKind::getText());
73f22ef01cSRoman Divacky 
74f22ef01cSRoman Divacky   DataSection =
752754fe60SDimitry Andric     getContext().getELFSection(".data", ELF::SHT_PROGBITS,
762754fe60SDimitry Andric                                ELF::SHF_WRITE |ELF::SHF_ALLOC,
77f22ef01cSRoman Divacky                                SectionKind::getDataRel());
78f22ef01cSRoman Divacky 
79f22ef01cSRoman Divacky   ReadOnlySection =
802754fe60SDimitry Andric     getContext().getELFSection(".rodata", ELF::SHT_PROGBITS,
812754fe60SDimitry Andric                                ELF::SHF_ALLOC,
82f22ef01cSRoman Divacky                                SectionKind::getReadOnly());
83f22ef01cSRoman Divacky 
84f22ef01cSRoman Divacky   TLSDataSection =
852754fe60SDimitry Andric     getContext().getELFSection(".tdata", ELF::SHT_PROGBITS,
862754fe60SDimitry Andric                                ELF::SHF_ALLOC | ELF::SHF_TLS |
872754fe60SDimitry Andric                                ELF::SHF_WRITE,
88f22ef01cSRoman Divacky                                SectionKind::getThreadData());
89f22ef01cSRoman Divacky 
90f22ef01cSRoman Divacky   TLSBSSSection =
912754fe60SDimitry Andric     getContext().getELFSection(".tbss", ELF::SHT_NOBITS,
922754fe60SDimitry Andric                                ELF::SHF_ALLOC | ELF::SHF_TLS |
932754fe60SDimitry Andric                                ELF::SHF_WRITE,
94f22ef01cSRoman Divacky                                SectionKind::getThreadBSS());
95f22ef01cSRoman Divacky 
96f22ef01cSRoman Divacky   DataRelSection =
972754fe60SDimitry Andric     getContext().getELFSection(".data.rel", ELF::SHT_PROGBITS,
982754fe60SDimitry Andric                                ELF::SHF_ALLOC |ELF::SHF_WRITE,
99f22ef01cSRoman Divacky                                SectionKind::getDataRel());
100f22ef01cSRoman Divacky 
101f22ef01cSRoman Divacky   DataRelLocalSection =
1022754fe60SDimitry Andric     getContext().getELFSection(".data.rel.local", ELF::SHT_PROGBITS,
1032754fe60SDimitry Andric                                ELF::SHF_ALLOC |ELF::SHF_WRITE,
104f22ef01cSRoman Divacky                                SectionKind::getDataRelLocal());
105f22ef01cSRoman Divacky 
106f22ef01cSRoman Divacky   DataRelROSection =
1072754fe60SDimitry Andric     getContext().getELFSection(".data.rel.ro", ELF::SHT_PROGBITS,
1082754fe60SDimitry Andric                                ELF::SHF_ALLOC |ELF::SHF_WRITE,
109f22ef01cSRoman Divacky                                SectionKind::getReadOnlyWithRel());
110f22ef01cSRoman Divacky 
111f22ef01cSRoman Divacky   DataRelROLocalSection =
1122754fe60SDimitry Andric     getContext().getELFSection(".data.rel.ro.local", ELF::SHT_PROGBITS,
1132754fe60SDimitry Andric                                ELF::SHF_ALLOC |ELF::SHF_WRITE,
114f22ef01cSRoman Divacky                                SectionKind::getReadOnlyWithRelLocal());
115f22ef01cSRoman Divacky 
116f22ef01cSRoman Divacky   MergeableConst4Section =
1172754fe60SDimitry Andric     getContext().getELFSection(".rodata.cst4", ELF::SHT_PROGBITS,
1182754fe60SDimitry Andric                                ELF::SHF_ALLOC |ELF::SHF_MERGE,
119f22ef01cSRoman Divacky                                SectionKind::getMergeableConst4());
120f22ef01cSRoman Divacky 
121f22ef01cSRoman Divacky   MergeableConst8Section =
1222754fe60SDimitry Andric     getContext().getELFSection(".rodata.cst8", ELF::SHT_PROGBITS,
1232754fe60SDimitry Andric                                ELF::SHF_ALLOC |ELF::SHF_MERGE,
124f22ef01cSRoman Divacky                                SectionKind::getMergeableConst8());
125f22ef01cSRoman Divacky 
126f22ef01cSRoman Divacky   MergeableConst16Section =
1272754fe60SDimitry Andric     getContext().getELFSection(".rodata.cst16", ELF::SHT_PROGBITS,
1282754fe60SDimitry Andric                                ELF::SHF_ALLOC |ELF::SHF_MERGE,
129f22ef01cSRoman Divacky                                SectionKind::getMergeableConst16());
130f22ef01cSRoman Divacky 
131f22ef01cSRoman Divacky   StaticCtorSection =
1322754fe60SDimitry Andric     getContext().getELFSection(".ctors", ELF::SHT_PROGBITS,
1332754fe60SDimitry Andric                                ELF::SHF_ALLOC |ELF::SHF_WRITE,
134f22ef01cSRoman Divacky                                SectionKind::getDataRel());
135f22ef01cSRoman Divacky 
136f22ef01cSRoman Divacky   StaticDtorSection =
1372754fe60SDimitry Andric     getContext().getELFSection(".dtors", ELF::SHT_PROGBITS,
1382754fe60SDimitry Andric                                ELF::SHF_ALLOC |ELF::SHF_WRITE,
139f22ef01cSRoman Divacky                                SectionKind::getDataRel());
140f22ef01cSRoman Divacky 
141f22ef01cSRoman Divacky   // Exception Handling Sections.
142f22ef01cSRoman Divacky 
143f22ef01cSRoman Divacky   // FIXME: We're emitting LSDA info into a readonly section on ELF, even though
144f22ef01cSRoman Divacky   // it contains relocatable pointers.  In PIC mode, this is probably a big
145f22ef01cSRoman Divacky   // runtime hit for C++ apps.  Either the contents of the LSDA need to be
146f22ef01cSRoman Divacky   // adjusted or this should be a data section.
147f22ef01cSRoman Divacky   LSDASection =
1482754fe60SDimitry Andric     getContext().getELFSection(".gcc_except_table", ELF::SHT_PROGBITS,
1492754fe60SDimitry Andric                                ELF::SHF_ALLOC,
150f22ef01cSRoman Divacky                                SectionKind::getReadOnly());
151f22ef01cSRoman Divacky   // Debug Info Sections.
152f22ef01cSRoman Divacky   DwarfAbbrevSection =
1532754fe60SDimitry Andric     getContext().getELFSection(".debug_abbrev", ELF::SHT_PROGBITS, 0,
154f22ef01cSRoman Divacky                                SectionKind::getMetadata());
155f22ef01cSRoman Divacky   DwarfInfoSection =
1562754fe60SDimitry Andric     getContext().getELFSection(".debug_info", ELF::SHT_PROGBITS, 0,
157f22ef01cSRoman Divacky                                SectionKind::getMetadata());
158f22ef01cSRoman Divacky   DwarfLineSection =
1592754fe60SDimitry Andric     getContext().getELFSection(".debug_line", ELF::SHT_PROGBITS, 0,
160f22ef01cSRoman Divacky                                SectionKind::getMetadata());
161f22ef01cSRoman Divacky   DwarfFrameSection =
1622754fe60SDimitry Andric     getContext().getELFSection(".debug_frame", ELF::SHT_PROGBITS, 0,
163f22ef01cSRoman Divacky                                SectionKind::getMetadata());
164f22ef01cSRoman Divacky   DwarfPubNamesSection =
1652754fe60SDimitry Andric     getContext().getELFSection(".debug_pubnames", ELF::SHT_PROGBITS, 0,
166f22ef01cSRoman Divacky                                SectionKind::getMetadata());
167f22ef01cSRoman Divacky   DwarfPubTypesSection =
1682754fe60SDimitry Andric     getContext().getELFSection(".debug_pubtypes", ELF::SHT_PROGBITS, 0,
169f22ef01cSRoman Divacky                                SectionKind::getMetadata());
170f22ef01cSRoman Divacky   DwarfStrSection =
1712754fe60SDimitry Andric     getContext().getELFSection(".debug_str", ELF::SHT_PROGBITS, 0,
172f22ef01cSRoman Divacky                                SectionKind::getMetadata());
173f22ef01cSRoman Divacky   DwarfLocSection =
1742754fe60SDimitry Andric     getContext().getELFSection(".debug_loc", ELF::SHT_PROGBITS, 0,
175f22ef01cSRoman Divacky                                SectionKind::getMetadata());
176f22ef01cSRoman Divacky   DwarfARangesSection =
1772754fe60SDimitry Andric     getContext().getELFSection(".debug_aranges", ELF::SHT_PROGBITS, 0,
178f22ef01cSRoman Divacky                                SectionKind::getMetadata());
179f22ef01cSRoman Divacky   DwarfRangesSection =
1802754fe60SDimitry Andric     getContext().getELFSection(".debug_ranges", ELF::SHT_PROGBITS, 0,
181f22ef01cSRoman Divacky                                SectionKind::getMetadata());
182f22ef01cSRoman Divacky   DwarfMacroInfoSection =
1832754fe60SDimitry Andric     getContext().getELFSection(".debug_macinfo", ELF::SHT_PROGBITS, 0,
184f22ef01cSRoman Divacky                                SectionKind::getMetadata());
185f22ef01cSRoman Divacky }
186f22ef01cSRoman Divacky 
1872754fe60SDimitry Andric const MCSection *TargetLoweringObjectFileELF::getEHFrameSection() const {
1882754fe60SDimitry Andric   return getContext().getELFSection(".eh_frame", ELF::SHT_PROGBITS,
1892754fe60SDimitry Andric                                     ELF::SHF_ALLOC,
1902754fe60SDimitry Andric                                     SectionKind::getDataRel());
1912754fe60SDimitry Andric }
192f22ef01cSRoman Divacky 
1933b0f4066SDimitry Andric MCSymbol *
1943b0f4066SDimitry Andric TargetLoweringObjectFileELF::getCFIPersonalitySymbol(const GlobalValue *GV,
1953b0f4066SDimitry Andric                                                      Mangler *Mang,
1963b0f4066SDimitry Andric                                                 MachineModuleInfo *MMI) const {
1973b0f4066SDimitry Andric   unsigned Encoding = getPersonalityEncoding();
1983b0f4066SDimitry Andric   switch (Encoding & 0x70) {
1993b0f4066SDimitry Andric   default:
2003b0f4066SDimitry Andric     report_fatal_error("We do not support this DWARF encoding yet!");
2013b0f4066SDimitry Andric   case dwarf::DW_EH_PE_absptr:
2023b0f4066SDimitry Andric     return  Mang->getSymbol(GV);
2033b0f4066SDimitry Andric     break;
2043b0f4066SDimitry Andric   case dwarf::DW_EH_PE_pcrel: {
20517a519f9SDimitry Andric     return getContext().GetOrCreateSymbol(StringRef("DW.ref.") +
20617a519f9SDimitry Andric                                           Mang->getSymbol(GV)->getName());
2073b0f4066SDimitry Andric     break;
2083b0f4066SDimitry Andric   }
2093b0f4066SDimitry Andric   }
2103b0f4066SDimitry Andric }
2113b0f4066SDimitry Andric 
2123b0f4066SDimitry Andric void TargetLoweringObjectFileELF::emitPersonalityValue(MCStreamer &Streamer,
2133b0f4066SDimitry Andric                                                        const TargetMachine &TM,
2143b0f4066SDimitry Andric                                                        const MCSymbol *Sym) const {
21517a519f9SDimitry Andric   SmallString<64> NameData("DW.ref.");
21617a519f9SDimitry Andric   NameData += Sym->getName();
21717a519f9SDimitry Andric   MCSymbol *Label = getContext().GetOrCreateSymbol(NameData);
2183b0f4066SDimitry Andric   Streamer.EmitSymbolAttribute(Label, MCSA_Hidden);
2193b0f4066SDimitry Andric   Streamer.EmitSymbolAttribute(Label, MCSA_Weak);
22017a519f9SDimitry Andric   StringRef Prefix = ".data.";
22117a519f9SDimitry Andric   NameData.insert(NameData.begin(), Prefix.begin(), Prefix.end());
2223b0f4066SDimitry Andric   unsigned Flags = ELF::SHF_ALLOC | ELF::SHF_WRITE | ELF::SHF_GROUP;
2233b0f4066SDimitry Andric   const MCSection *Sec = getContext().getELFSection(NameData,
2243b0f4066SDimitry Andric                                                     ELF::SHT_PROGBITS,
2253b0f4066SDimitry Andric                                                     Flags,
2263b0f4066SDimitry Andric                                                     SectionKind::getDataRel(),
2273b0f4066SDimitry Andric                                                     0, Label->getName());
2283b0f4066SDimitry Andric   Streamer.SwitchSection(Sec);
2293b0f4066SDimitry Andric   Streamer.EmitValueToAlignment(8);
2303b0f4066SDimitry Andric   Streamer.EmitSymbolAttribute(Label, MCSA_ELF_TypeObject);
2313b0f4066SDimitry Andric   const MCExpr *E = MCConstantExpr::Create(8, getContext());
2323b0f4066SDimitry Andric   Streamer.EmitELFSize(Label, E);
2333b0f4066SDimitry Andric   Streamer.EmitLabel(Label);
2343b0f4066SDimitry Andric 
2353b0f4066SDimitry Andric   unsigned Size = TM.getTargetData()->getPointerSize();
2363b0f4066SDimitry Andric   Streamer.EmitSymbolValue(Sym, Size);
2373b0f4066SDimitry Andric }
2383b0f4066SDimitry Andric 
239f22ef01cSRoman Divacky static SectionKind
240f22ef01cSRoman Divacky getELFKindForNamedSection(StringRef Name, SectionKind K) {
241bd5abe19SDimitry Andric   // N.B.: The defaults used in here are no the same ones used in MC.
242bd5abe19SDimitry Andric   // We follow gcc, MC follows gas. For example, given ".section .eh_frame",
243bd5abe19SDimitry Andric   // both gas and MC will produce a section with no flags. Given
244bd5abe19SDimitry Andric   // section(".eh_frame") gcc will produce
245bd5abe19SDimitry Andric   // .section	.eh_frame,"a",@progbits
246f22ef01cSRoman Divacky   if (Name.empty() || Name[0] != '.') return K;
247f22ef01cSRoman Divacky 
248f22ef01cSRoman Divacky   // Some lame default implementation based on some magic section names.
249f22ef01cSRoman Divacky   if (Name == ".bss" ||
250f22ef01cSRoman Divacky       Name.startswith(".bss.") ||
251f22ef01cSRoman Divacky       Name.startswith(".gnu.linkonce.b.") ||
252f22ef01cSRoman Divacky       Name.startswith(".llvm.linkonce.b.") ||
253f22ef01cSRoman Divacky       Name == ".sbss" ||
254f22ef01cSRoman Divacky       Name.startswith(".sbss.") ||
255f22ef01cSRoman Divacky       Name.startswith(".gnu.linkonce.sb.") ||
256f22ef01cSRoman Divacky       Name.startswith(".llvm.linkonce.sb."))
257f22ef01cSRoman Divacky     return SectionKind::getBSS();
258f22ef01cSRoman Divacky 
259f22ef01cSRoman Divacky   if (Name == ".tdata" ||
260f22ef01cSRoman Divacky       Name.startswith(".tdata.") ||
261f22ef01cSRoman Divacky       Name.startswith(".gnu.linkonce.td.") ||
262f22ef01cSRoman Divacky       Name.startswith(".llvm.linkonce.td."))
263f22ef01cSRoman Divacky     return SectionKind::getThreadData();
264f22ef01cSRoman Divacky 
265f22ef01cSRoman Divacky   if (Name == ".tbss" ||
266f22ef01cSRoman Divacky       Name.startswith(".tbss.") ||
267f22ef01cSRoman Divacky       Name.startswith(".gnu.linkonce.tb.") ||
268f22ef01cSRoman Divacky       Name.startswith(".llvm.linkonce.tb."))
269f22ef01cSRoman Divacky     return SectionKind::getThreadBSS();
270f22ef01cSRoman Divacky 
271f22ef01cSRoman Divacky   return K;
272f22ef01cSRoman Divacky }
273f22ef01cSRoman Divacky 
274f22ef01cSRoman Divacky 
275f22ef01cSRoman Divacky static unsigned getELFSectionType(StringRef Name, SectionKind K) {
276f22ef01cSRoman Divacky 
277f22ef01cSRoman Divacky   if (Name == ".init_array")
2782754fe60SDimitry Andric     return ELF::SHT_INIT_ARRAY;
279f22ef01cSRoman Divacky 
280f22ef01cSRoman Divacky   if (Name == ".fini_array")
2812754fe60SDimitry Andric     return ELF::SHT_FINI_ARRAY;
282f22ef01cSRoman Divacky 
283f22ef01cSRoman Divacky   if (Name == ".preinit_array")
2842754fe60SDimitry Andric     return ELF::SHT_PREINIT_ARRAY;
285f22ef01cSRoman Divacky 
286f22ef01cSRoman Divacky   if (K.isBSS() || K.isThreadBSS())
2872754fe60SDimitry Andric     return ELF::SHT_NOBITS;
288f22ef01cSRoman Divacky 
2892754fe60SDimitry Andric   return ELF::SHT_PROGBITS;
290f22ef01cSRoman Divacky }
291f22ef01cSRoman Divacky 
292f22ef01cSRoman Divacky 
293f22ef01cSRoman Divacky static unsigned
294f22ef01cSRoman Divacky getELFSectionFlags(SectionKind K) {
295f22ef01cSRoman Divacky   unsigned Flags = 0;
296f22ef01cSRoman Divacky 
297f22ef01cSRoman Divacky   if (!K.isMetadata())
2982754fe60SDimitry Andric     Flags |= ELF::SHF_ALLOC;
299f22ef01cSRoman Divacky 
300f22ef01cSRoman Divacky   if (K.isText())
3012754fe60SDimitry Andric     Flags |= ELF::SHF_EXECINSTR;
302f22ef01cSRoman Divacky 
303f22ef01cSRoman Divacky   if (K.isWriteable())
3042754fe60SDimitry Andric     Flags |= ELF::SHF_WRITE;
305f22ef01cSRoman Divacky 
306f22ef01cSRoman Divacky   if (K.isThreadLocal())
3072754fe60SDimitry Andric     Flags |= ELF::SHF_TLS;
308f22ef01cSRoman Divacky 
309f22ef01cSRoman Divacky   // K.isMergeableConst() is left out to honour PR4650
310f22ef01cSRoman Divacky   if (K.isMergeableCString() || K.isMergeableConst4() ||
311f22ef01cSRoman Divacky       K.isMergeableConst8() || K.isMergeableConst16())
3122754fe60SDimitry Andric     Flags |= ELF::SHF_MERGE;
313f22ef01cSRoman Divacky 
314f22ef01cSRoman Divacky   if (K.isMergeableCString())
3152754fe60SDimitry Andric     Flags |= ELF::SHF_STRINGS;
316f22ef01cSRoman Divacky 
317f22ef01cSRoman Divacky   return Flags;
318f22ef01cSRoman Divacky }
319f22ef01cSRoman Divacky 
320f22ef01cSRoman Divacky 
321f22ef01cSRoman Divacky const MCSection *TargetLoweringObjectFileELF::
322f22ef01cSRoman Divacky getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
323f22ef01cSRoman Divacky                          Mangler *Mang, const TargetMachine &TM) const {
324f22ef01cSRoman Divacky   StringRef SectionName = GV->getSection();
325f22ef01cSRoman Divacky 
326f22ef01cSRoman Divacky   // Infer section flags from the section name if we can.
327f22ef01cSRoman Divacky   Kind = getELFKindForNamedSection(SectionName, Kind);
328f22ef01cSRoman Divacky 
329f22ef01cSRoman Divacky   return getContext().getELFSection(SectionName,
330f22ef01cSRoman Divacky                                     getELFSectionType(SectionName, Kind),
3312754fe60SDimitry Andric                                     getELFSectionFlags(Kind), Kind);
332f22ef01cSRoman Divacky }
333f22ef01cSRoman Divacky 
334f22ef01cSRoman Divacky /// getSectionPrefixForGlobal - Return the section prefix name used by options
335f22ef01cSRoman Divacky /// FunctionsSections and DataSections.
336f22ef01cSRoman Divacky static const char *getSectionPrefixForGlobal(SectionKind Kind) {
337f22ef01cSRoman Divacky   if (Kind.isText())                 return ".text.";
338f22ef01cSRoman Divacky   if (Kind.isReadOnly())             return ".rodata.";
339f22ef01cSRoman Divacky 
340f22ef01cSRoman Divacky   if (Kind.isThreadData())           return ".tdata.";
341f22ef01cSRoman Divacky   if (Kind.isThreadBSS())            return ".tbss.";
342f22ef01cSRoman Divacky 
343f22ef01cSRoman Divacky   if (Kind.isDataNoRel())            return ".data.";
344f22ef01cSRoman Divacky   if (Kind.isDataRelLocal())         return ".data.rel.local.";
345f22ef01cSRoman Divacky   if (Kind.isDataRel())              return ".data.rel.";
346f22ef01cSRoman Divacky   if (Kind.isReadOnlyWithRelLocal()) return ".data.rel.ro.local.";
347f22ef01cSRoman Divacky 
348f22ef01cSRoman Divacky   assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
349f22ef01cSRoman Divacky   return ".data.rel.ro.";
350f22ef01cSRoman Divacky }
351f22ef01cSRoman Divacky 
352f22ef01cSRoman Divacky 
353f22ef01cSRoman Divacky const MCSection *TargetLoweringObjectFileELF::
354f22ef01cSRoman Divacky SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
355f22ef01cSRoman Divacky                        Mangler *Mang, const TargetMachine &TM) const {
356f22ef01cSRoman Divacky   // If we have -ffunction-section or -fdata-section then we should emit the
357f22ef01cSRoman Divacky   // global value to a uniqued section specifically for it.
358f22ef01cSRoman Divacky   bool EmitUniquedSection;
359f22ef01cSRoman Divacky   if (Kind.isText())
360f22ef01cSRoman Divacky     EmitUniquedSection = TM.getFunctionSections();
361f22ef01cSRoman Divacky   else
362f22ef01cSRoman Divacky     EmitUniquedSection = TM.getDataSections();
363f22ef01cSRoman Divacky 
364f22ef01cSRoman Divacky   // If this global is linkonce/weak and the target handles this by emitting it
365f22ef01cSRoman Divacky   // into a 'uniqued' section name, create and return the section now.
366f22ef01cSRoman Divacky   if ((GV->isWeakForLinker() || EmitUniquedSection) &&
367f22ef01cSRoman Divacky       !Kind.isCommon() && !Kind.isBSS()) {
368f22ef01cSRoman Divacky     const char *Prefix;
369f22ef01cSRoman Divacky     Prefix = getSectionPrefixForGlobal(Kind);
370f22ef01cSRoman Divacky 
371f22ef01cSRoman Divacky     SmallString<128> Name(Prefix, Prefix+strlen(Prefix));
372f22ef01cSRoman Divacky     MCSymbol *Sym = Mang->getSymbol(GV);
373f22ef01cSRoman Divacky     Name.append(Sym->getName().begin(), Sym->getName().end());
3742754fe60SDimitry Andric     StringRef Group = "";
3752754fe60SDimitry Andric     unsigned Flags = getELFSectionFlags(Kind);
3762754fe60SDimitry Andric     if (GV->isWeakForLinker()) {
3772754fe60SDimitry Andric       Group = Sym->getName();
3782754fe60SDimitry Andric       Flags |= ELF::SHF_GROUP;
3792754fe60SDimitry Andric     }
3802754fe60SDimitry Andric 
381f22ef01cSRoman Divacky     return getContext().getELFSection(Name.str(),
382f22ef01cSRoman Divacky                                       getELFSectionType(Name.str(), Kind),
3832754fe60SDimitry Andric                                       Flags, Kind, 0, Group);
384f22ef01cSRoman Divacky   }
385f22ef01cSRoman Divacky 
386f22ef01cSRoman Divacky   if (Kind.isText()) return TextSection;
387f22ef01cSRoman Divacky 
388f22ef01cSRoman Divacky   if (Kind.isMergeable1ByteCString() ||
389f22ef01cSRoman Divacky       Kind.isMergeable2ByteCString() ||
390f22ef01cSRoman Divacky       Kind.isMergeable4ByteCString()) {
391f22ef01cSRoman Divacky 
392f22ef01cSRoman Divacky     // We also need alignment here.
393f22ef01cSRoman Divacky     // FIXME: this is getting the alignment of the character, not the
394f22ef01cSRoman Divacky     // alignment of the global!
395f22ef01cSRoman Divacky     unsigned Align =
396f22ef01cSRoman Divacky       TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV));
397f22ef01cSRoman Divacky 
398f22ef01cSRoman Divacky     const char *SizeSpec = ".rodata.str1.";
399f22ef01cSRoman Divacky     if (Kind.isMergeable2ByteCString())
400f22ef01cSRoman Divacky       SizeSpec = ".rodata.str2.";
401f22ef01cSRoman Divacky     else if (Kind.isMergeable4ByteCString())
402f22ef01cSRoman Divacky       SizeSpec = ".rodata.str4.";
403f22ef01cSRoman Divacky     else
404f22ef01cSRoman Divacky       assert(Kind.isMergeable1ByteCString() && "unknown string width");
405f22ef01cSRoman Divacky 
406f22ef01cSRoman Divacky 
407f22ef01cSRoman Divacky     std::string Name = SizeSpec + utostr(Align);
4082754fe60SDimitry Andric     return getContext().getELFSection(Name, ELF::SHT_PROGBITS,
4092754fe60SDimitry Andric                                       ELF::SHF_ALLOC |
4102754fe60SDimitry Andric                                       ELF::SHF_MERGE |
4112754fe60SDimitry Andric                                       ELF::SHF_STRINGS,
412f22ef01cSRoman Divacky                                       Kind);
413f22ef01cSRoman Divacky   }
414f22ef01cSRoman Divacky 
415f22ef01cSRoman Divacky   if (Kind.isMergeableConst()) {
416f22ef01cSRoman Divacky     if (Kind.isMergeableConst4() && MergeableConst4Section)
417f22ef01cSRoman Divacky       return MergeableConst4Section;
418f22ef01cSRoman Divacky     if (Kind.isMergeableConst8() && MergeableConst8Section)
419f22ef01cSRoman Divacky       return MergeableConst8Section;
420f22ef01cSRoman Divacky     if (Kind.isMergeableConst16() && MergeableConst16Section)
421f22ef01cSRoman Divacky       return MergeableConst16Section;
422f22ef01cSRoman Divacky     return ReadOnlySection;  // .const
423f22ef01cSRoman Divacky   }
424f22ef01cSRoman Divacky 
425f22ef01cSRoman Divacky   if (Kind.isReadOnly())             return ReadOnlySection;
426f22ef01cSRoman Divacky 
427f22ef01cSRoman Divacky   if (Kind.isThreadData())           return TLSDataSection;
428f22ef01cSRoman Divacky   if (Kind.isThreadBSS())            return TLSBSSSection;
429f22ef01cSRoman Divacky 
430f22ef01cSRoman Divacky   // Note: we claim that common symbols are put in BSSSection, but they are
431f22ef01cSRoman Divacky   // really emitted with the magic .comm directive, which creates a symbol table
432f22ef01cSRoman Divacky   // entry but not a section.
433f22ef01cSRoman Divacky   if (Kind.isBSS() || Kind.isCommon()) return BSSSection;
434f22ef01cSRoman Divacky 
435f22ef01cSRoman Divacky   if (Kind.isDataNoRel())            return DataSection;
436f22ef01cSRoman Divacky   if (Kind.isDataRelLocal())         return DataRelLocalSection;
437f22ef01cSRoman Divacky   if (Kind.isDataRel())              return DataRelSection;
438f22ef01cSRoman Divacky   if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection;
439f22ef01cSRoman Divacky 
440f22ef01cSRoman Divacky   assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
441f22ef01cSRoman Divacky   return DataRelROSection;
442f22ef01cSRoman Divacky }
443f22ef01cSRoman Divacky 
444f22ef01cSRoman Divacky /// getSectionForConstant - Given a mergeable constant with the
445f22ef01cSRoman Divacky /// specified size and relocation information, return a section that it
446f22ef01cSRoman Divacky /// should be placed in.
447f22ef01cSRoman Divacky const MCSection *TargetLoweringObjectFileELF::
448f22ef01cSRoman Divacky getSectionForConstant(SectionKind Kind) const {
449f22ef01cSRoman Divacky   if (Kind.isMergeableConst4() && MergeableConst4Section)
450f22ef01cSRoman Divacky     return MergeableConst4Section;
451f22ef01cSRoman Divacky   if (Kind.isMergeableConst8() && MergeableConst8Section)
452f22ef01cSRoman Divacky     return MergeableConst8Section;
453f22ef01cSRoman Divacky   if (Kind.isMergeableConst16() && MergeableConst16Section)
454f22ef01cSRoman Divacky     return MergeableConst16Section;
455f22ef01cSRoman Divacky   if (Kind.isReadOnly())
456f22ef01cSRoman Divacky     return ReadOnlySection;
457f22ef01cSRoman Divacky 
458f22ef01cSRoman Divacky   if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection;
459f22ef01cSRoman Divacky   assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
460f22ef01cSRoman Divacky   return DataRelROSection;
461f22ef01cSRoman Divacky }
462f22ef01cSRoman Divacky 
463f22ef01cSRoman Divacky const MCExpr *TargetLoweringObjectFileELF::
464f22ef01cSRoman Divacky getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
465f22ef01cSRoman Divacky                                MachineModuleInfo *MMI,
466f22ef01cSRoman Divacky                                unsigned Encoding, MCStreamer &Streamer) const {
467f22ef01cSRoman Divacky 
468f22ef01cSRoman Divacky   if (Encoding & dwarf::DW_EH_PE_indirect) {
469f22ef01cSRoman Divacky     MachineModuleInfoELF &ELFMMI = MMI->getObjFileInfo<MachineModuleInfoELF>();
470f22ef01cSRoman Divacky 
471f22ef01cSRoman Divacky     SmallString<128> Name;
472f22ef01cSRoman Divacky     Mang->getNameWithPrefix(Name, GV, true);
473f22ef01cSRoman Divacky     Name += ".DW.stub";
474f22ef01cSRoman Divacky 
475f22ef01cSRoman Divacky     // Add information about the stub reference to ELFMMI so that the stub
476f22ef01cSRoman Divacky     // gets emitted by the asmprinter.
477f22ef01cSRoman Divacky     MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str());
478f22ef01cSRoman Divacky     MachineModuleInfoImpl::StubValueTy &StubSym = ELFMMI.getGVStubEntry(SSym);
479f22ef01cSRoman Divacky     if (StubSym.getPointer() == 0) {
480f22ef01cSRoman Divacky       MCSymbol *Sym = Mang->getSymbol(GV);
481f22ef01cSRoman Divacky       StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
482f22ef01cSRoman Divacky     }
483f22ef01cSRoman Divacky 
484f22ef01cSRoman Divacky     return TargetLoweringObjectFile::
4853b0f4066SDimitry Andric       getExprForDwarfReference(SSym, Encoding & ~dwarf::DW_EH_PE_indirect, Streamer);
486f22ef01cSRoman Divacky   }
487f22ef01cSRoman Divacky 
488f22ef01cSRoman Divacky   return TargetLoweringObjectFile::
489f22ef01cSRoman Divacky     getExprForDwarfGlobalReference(GV, Mang, MMI, Encoding, Streamer);
490f22ef01cSRoman Divacky }
491f22ef01cSRoman Divacky 
492f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
493f22ef01cSRoman Divacky //                                 MachO
494f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
495f22ef01cSRoman Divacky 
49617a519f9SDimitry Andric TargetLoweringObjectFileMachO::TargetLoweringObjectFileMachO()
49717a519f9SDimitry Andric   : TargetLoweringObjectFile(),
49817a519f9SDimitry Andric     TLSDataSection(0),
49917a519f9SDimitry Andric     TLSBSSSection(0),
50017a519f9SDimitry Andric     TLSTLVSection(0),
50117a519f9SDimitry Andric     TLSThreadInitSection(0),
50217a519f9SDimitry Andric     CStringSection(0),
50317a519f9SDimitry Andric     UStringSection(0),
50417a519f9SDimitry Andric     TextCoalSection(0),
50517a519f9SDimitry Andric     ConstTextCoalSection(0),
50617a519f9SDimitry Andric     ConstDataSection(0),
50717a519f9SDimitry Andric     DataCoalSection(0),
50817a519f9SDimitry Andric     DataCommonSection(0),
50917a519f9SDimitry Andric     DataBSSSection(0),
51017a519f9SDimitry Andric     FourByteConstantSection(0),
51117a519f9SDimitry Andric     EightByteConstantSection(0),
51217a519f9SDimitry Andric     SixteenByteConstantSection(0),
51317a519f9SDimitry Andric     LazySymbolPointerSection(0),
51417a519f9SDimitry Andric     NonLazySymbolPointerSection(0) {
51517a519f9SDimitry Andric }
51617a519f9SDimitry Andric 
517f22ef01cSRoman Divacky void TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx,
518f22ef01cSRoman Divacky                                                const TargetMachine &TM) {
519f22ef01cSRoman Divacky   IsFunctionEHFrameSymbolPrivate = false;
520f22ef01cSRoman Divacky   SupportsWeakOmittedEHFrame = false;
521f22ef01cSRoman Divacky 
5223b0f4066SDimitry Andric   // .comm doesn't support alignment before Leopard.
5232754fe60SDimitry Andric   Triple T(((LLVMTargetMachine&)TM).getTargetTriple());
5243b0f4066SDimitry Andric   if (T.isMacOSX() && T.isMacOSXVersionLT(10, 5))
5252754fe60SDimitry Andric     CommDirectiveSupportsAlignment = false;
5262754fe60SDimitry Andric 
527f22ef01cSRoman Divacky   TargetLoweringObjectFile::Initialize(Ctx, TM);
528f22ef01cSRoman Divacky 
529f22ef01cSRoman Divacky   TextSection // .text
530f22ef01cSRoman Divacky     = getContext().getMachOSection("__TEXT", "__text",
531f22ef01cSRoman Divacky                                    MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS,
532f22ef01cSRoman Divacky                                    SectionKind::getText());
533f22ef01cSRoman Divacky   DataSection // .data
534f22ef01cSRoman Divacky     = getContext().getMachOSection("__DATA", "__data", 0,
535f22ef01cSRoman Divacky                                    SectionKind::getDataRel());
536f22ef01cSRoman Divacky 
537f22ef01cSRoman Divacky   TLSDataSection // .tdata
538f22ef01cSRoman Divacky     = getContext().getMachOSection("__DATA", "__thread_data",
539f22ef01cSRoman Divacky                                    MCSectionMachO::S_THREAD_LOCAL_REGULAR,
540f22ef01cSRoman Divacky                                    SectionKind::getDataRel());
541f22ef01cSRoman Divacky   TLSBSSSection // .tbss
542f22ef01cSRoman Divacky     = getContext().getMachOSection("__DATA", "__thread_bss",
543f22ef01cSRoman Divacky                                    MCSectionMachO::S_THREAD_LOCAL_ZEROFILL,
544f22ef01cSRoman Divacky                                    SectionKind::getThreadBSS());
545f22ef01cSRoman Divacky 
546f22ef01cSRoman Divacky   // TODO: Verify datarel below.
547f22ef01cSRoman Divacky   TLSTLVSection // .tlv
548f22ef01cSRoman Divacky     = getContext().getMachOSection("__DATA", "__thread_vars",
549f22ef01cSRoman Divacky                                    MCSectionMachO::S_THREAD_LOCAL_VARIABLES,
550f22ef01cSRoman Divacky                                    SectionKind::getDataRel());
551f22ef01cSRoman Divacky 
552f22ef01cSRoman Divacky   TLSThreadInitSection
553f22ef01cSRoman Divacky     = getContext().getMachOSection("__DATA", "__thread_init",
554f22ef01cSRoman Divacky                           MCSectionMachO::S_THREAD_LOCAL_INIT_FUNCTION_POINTERS,
555f22ef01cSRoman Divacky                           SectionKind::getDataRel());
556f22ef01cSRoman Divacky 
557f22ef01cSRoman Divacky   CStringSection // .cstring
558f22ef01cSRoman Divacky     = getContext().getMachOSection("__TEXT", "__cstring",
559f22ef01cSRoman Divacky                                    MCSectionMachO::S_CSTRING_LITERALS,
560f22ef01cSRoman Divacky                                    SectionKind::getMergeable1ByteCString());
561f22ef01cSRoman Divacky   UStringSection
562f22ef01cSRoman Divacky     = getContext().getMachOSection("__TEXT","__ustring", 0,
563f22ef01cSRoman Divacky                                    SectionKind::getMergeable2ByteCString());
564f22ef01cSRoman Divacky   FourByteConstantSection // .literal4
565f22ef01cSRoman Divacky     = getContext().getMachOSection("__TEXT", "__literal4",
566f22ef01cSRoman Divacky                                    MCSectionMachO::S_4BYTE_LITERALS,
567f22ef01cSRoman Divacky                                    SectionKind::getMergeableConst4());
568f22ef01cSRoman Divacky   EightByteConstantSection // .literal8
569f22ef01cSRoman Divacky     = getContext().getMachOSection("__TEXT", "__literal8",
570f22ef01cSRoman Divacky                                    MCSectionMachO::S_8BYTE_LITERALS,
571f22ef01cSRoman Divacky                                    SectionKind::getMergeableConst8());
572f22ef01cSRoman Divacky 
573f22ef01cSRoman Divacky   // ld_classic doesn't support .literal16 in 32-bit mode, and ld64 falls back
574f22ef01cSRoman Divacky   // to using it in -static mode.
575f22ef01cSRoman Divacky   SixteenByteConstantSection = 0;
576f22ef01cSRoman Divacky   if (TM.getRelocationModel() != Reloc::Static &&
577f22ef01cSRoman Divacky       TM.getTargetData()->getPointerSize() == 32)
578f22ef01cSRoman Divacky     SixteenByteConstantSection =   // .literal16
579f22ef01cSRoman Divacky       getContext().getMachOSection("__TEXT", "__literal16",
580f22ef01cSRoman Divacky                                    MCSectionMachO::S_16BYTE_LITERALS,
581f22ef01cSRoman Divacky                                    SectionKind::getMergeableConst16());
582f22ef01cSRoman Divacky 
583f22ef01cSRoman Divacky   ReadOnlySection  // .const
584f22ef01cSRoman Divacky     = getContext().getMachOSection("__TEXT", "__const", 0,
585f22ef01cSRoman Divacky                                    SectionKind::getReadOnly());
586f22ef01cSRoman Divacky 
587f22ef01cSRoman Divacky   TextCoalSection
588f22ef01cSRoman Divacky     = getContext().getMachOSection("__TEXT", "__textcoal_nt",
589f22ef01cSRoman Divacky                                    MCSectionMachO::S_COALESCED |
590f22ef01cSRoman Divacky                                    MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS,
591f22ef01cSRoman Divacky                                    SectionKind::getText());
592f22ef01cSRoman Divacky   ConstTextCoalSection
593f22ef01cSRoman Divacky     = getContext().getMachOSection("__TEXT", "__const_coal",
594f22ef01cSRoman Divacky                                    MCSectionMachO::S_COALESCED,
595e580952dSDimitry Andric                                    SectionKind::getReadOnly());
596f22ef01cSRoman Divacky   ConstDataSection  // .const_data
597f22ef01cSRoman Divacky     = getContext().getMachOSection("__DATA", "__const", 0,
598f22ef01cSRoman Divacky                                    SectionKind::getReadOnlyWithRel());
599f22ef01cSRoman Divacky   DataCoalSection
600f22ef01cSRoman Divacky     = getContext().getMachOSection("__DATA","__datacoal_nt",
601f22ef01cSRoman Divacky                                    MCSectionMachO::S_COALESCED,
602f22ef01cSRoman Divacky                                    SectionKind::getDataRel());
603f22ef01cSRoman Divacky   DataCommonSection
604f22ef01cSRoman Divacky     = getContext().getMachOSection("__DATA","__common",
605f22ef01cSRoman Divacky                                    MCSectionMachO::S_ZEROFILL,
606f22ef01cSRoman Divacky                                    SectionKind::getBSS());
607f22ef01cSRoman Divacky   DataBSSSection
608f22ef01cSRoman Divacky     = getContext().getMachOSection("__DATA","__bss", MCSectionMachO::S_ZEROFILL,
609f22ef01cSRoman Divacky                                    SectionKind::getBSS());
610f22ef01cSRoman Divacky 
611f22ef01cSRoman Divacky 
612f22ef01cSRoman Divacky   LazySymbolPointerSection
613f22ef01cSRoman Divacky     = getContext().getMachOSection("__DATA", "__la_symbol_ptr",
614f22ef01cSRoman Divacky                                    MCSectionMachO::S_LAZY_SYMBOL_POINTERS,
615f22ef01cSRoman Divacky                                    SectionKind::getMetadata());
616f22ef01cSRoman Divacky   NonLazySymbolPointerSection
617f22ef01cSRoman Divacky     = getContext().getMachOSection("__DATA", "__nl_symbol_ptr",
618f22ef01cSRoman Divacky                                    MCSectionMachO::S_NON_LAZY_SYMBOL_POINTERS,
619f22ef01cSRoman Divacky                                    SectionKind::getMetadata());
620f22ef01cSRoman Divacky 
621f22ef01cSRoman Divacky   if (TM.getRelocationModel() == Reloc::Static) {
622f22ef01cSRoman Divacky     StaticCtorSection
623f22ef01cSRoman Divacky       = getContext().getMachOSection("__TEXT", "__constructor", 0,
624f22ef01cSRoman Divacky                                      SectionKind::getDataRel());
625f22ef01cSRoman Divacky     StaticDtorSection
626f22ef01cSRoman Divacky       = getContext().getMachOSection("__TEXT", "__destructor", 0,
627f22ef01cSRoman Divacky                                      SectionKind::getDataRel());
628f22ef01cSRoman Divacky   } else {
629f22ef01cSRoman Divacky     StaticCtorSection
630f22ef01cSRoman Divacky       = getContext().getMachOSection("__DATA", "__mod_init_func",
631f22ef01cSRoman Divacky                                      MCSectionMachO::S_MOD_INIT_FUNC_POINTERS,
632f22ef01cSRoman Divacky                                      SectionKind::getDataRel());
633f22ef01cSRoman Divacky     StaticDtorSection
634f22ef01cSRoman Divacky       = getContext().getMachOSection("__DATA", "__mod_term_func",
635f22ef01cSRoman Divacky                                      MCSectionMachO::S_MOD_TERM_FUNC_POINTERS,
636f22ef01cSRoman Divacky                                      SectionKind::getDataRel());
637f22ef01cSRoman Divacky   }
638f22ef01cSRoman Divacky 
639f22ef01cSRoman Divacky   // Exception Handling.
640f22ef01cSRoman Divacky   LSDASection = getContext().getMachOSection("__TEXT", "__gcc_except_tab", 0,
641f22ef01cSRoman Divacky                                              SectionKind::getReadOnlyWithRel());
64217a519f9SDimitry Andric 
64317a519f9SDimitry Andric   if (T.isMacOSX() && !T.isMacOSXVersionLT(10, 6))
64417a519f9SDimitry Andric     CompactUnwindSection =
64517a519f9SDimitry Andric       getContext().getMachOSection("__LD", "__compact_unwind",
64617a519f9SDimitry Andric                                    MCSectionMachO::S_ATTR_DEBUG,
64717a519f9SDimitry Andric                                    SectionKind::getReadOnly());
64817a519f9SDimitry Andric 
649f22ef01cSRoman Divacky   // Debug Information.
650f22ef01cSRoman Divacky   DwarfAbbrevSection =
651f22ef01cSRoman Divacky     getContext().getMachOSection("__DWARF", "__debug_abbrev",
652f22ef01cSRoman Divacky                                  MCSectionMachO::S_ATTR_DEBUG,
653f22ef01cSRoman Divacky                                  SectionKind::getMetadata());
654f22ef01cSRoman Divacky   DwarfInfoSection =
655f22ef01cSRoman Divacky     getContext().getMachOSection("__DWARF", "__debug_info",
656f22ef01cSRoman Divacky                                  MCSectionMachO::S_ATTR_DEBUG,
657f22ef01cSRoman Divacky                                  SectionKind::getMetadata());
658f22ef01cSRoman Divacky   DwarfLineSection =
659f22ef01cSRoman Divacky     getContext().getMachOSection("__DWARF", "__debug_line",
660f22ef01cSRoman Divacky                                  MCSectionMachO::S_ATTR_DEBUG,
661f22ef01cSRoman Divacky                                  SectionKind::getMetadata());
662f22ef01cSRoman Divacky   DwarfFrameSection =
663f22ef01cSRoman Divacky     getContext().getMachOSection("__DWARF", "__debug_frame",
664f22ef01cSRoman Divacky                                  MCSectionMachO::S_ATTR_DEBUG,
665f22ef01cSRoman Divacky                                  SectionKind::getMetadata());
666f22ef01cSRoman Divacky   DwarfPubNamesSection =
667f22ef01cSRoman Divacky     getContext().getMachOSection("__DWARF", "__debug_pubnames",
668f22ef01cSRoman Divacky                                  MCSectionMachO::S_ATTR_DEBUG,
669f22ef01cSRoman Divacky                                  SectionKind::getMetadata());
670f22ef01cSRoman Divacky   DwarfPubTypesSection =
671f22ef01cSRoman Divacky     getContext().getMachOSection("__DWARF", "__debug_pubtypes",
672f22ef01cSRoman Divacky                                  MCSectionMachO::S_ATTR_DEBUG,
673f22ef01cSRoman Divacky                                  SectionKind::getMetadata());
674f22ef01cSRoman Divacky   DwarfStrSection =
675f22ef01cSRoman Divacky     getContext().getMachOSection("__DWARF", "__debug_str",
676f22ef01cSRoman Divacky                                  MCSectionMachO::S_ATTR_DEBUG,
677f22ef01cSRoman Divacky                                  SectionKind::getMetadata());
678f22ef01cSRoman Divacky   DwarfLocSection =
679f22ef01cSRoman Divacky     getContext().getMachOSection("__DWARF", "__debug_loc",
680f22ef01cSRoman Divacky                                  MCSectionMachO::S_ATTR_DEBUG,
681f22ef01cSRoman Divacky                                  SectionKind::getMetadata());
682f22ef01cSRoman Divacky   DwarfARangesSection =
683f22ef01cSRoman Divacky     getContext().getMachOSection("__DWARF", "__debug_aranges",
684f22ef01cSRoman Divacky                                  MCSectionMachO::S_ATTR_DEBUG,
685f22ef01cSRoman Divacky                                  SectionKind::getMetadata());
686f22ef01cSRoman Divacky   DwarfRangesSection =
687f22ef01cSRoman Divacky     getContext().getMachOSection("__DWARF", "__debug_ranges",
688f22ef01cSRoman Divacky                                  MCSectionMachO::S_ATTR_DEBUG,
689f22ef01cSRoman Divacky                                  SectionKind::getMetadata());
690f22ef01cSRoman Divacky   DwarfMacroInfoSection =
691f22ef01cSRoman Divacky     getContext().getMachOSection("__DWARF", "__debug_macinfo",
692f22ef01cSRoman Divacky                                  MCSectionMachO::S_ATTR_DEBUG,
693f22ef01cSRoman Divacky                                  SectionKind::getMetadata());
694f22ef01cSRoman Divacky   DwarfDebugInlineSection =
695f22ef01cSRoman Divacky     getContext().getMachOSection("__DWARF", "__debug_inlined",
696f22ef01cSRoman Divacky                                  MCSectionMachO::S_ATTR_DEBUG,
697f22ef01cSRoman Divacky                                  SectionKind::getMetadata());
698f22ef01cSRoman Divacky 
699f22ef01cSRoman Divacky   TLSExtraDataSection = TLSTLVSection;
700f22ef01cSRoman Divacky }
701f22ef01cSRoman Divacky 
7022754fe60SDimitry Andric const MCSection *TargetLoweringObjectFileMachO::getEHFrameSection() const {
7032754fe60SDimitry Andric   return getContext().getMachOSection("__TEXT", "__eh_frame",
7042754fe60SDimitry Andric                                       MCSectionMachO::S_COALESCED |
7052754fe60SDimitry Andric                                       MCSectionMachO::S_ATTR_NO_TOC |
7062754fe60SDimitry Andric                                       MCSectionMachO::S_ATTR_STRIP_STATIC_SYMS |
7072754fe60SDimitry Andric                                       MCSectionMachO::S_ATTR_LIVE_SUPPORT,
7082754fe60SDimitry Andric                                       SectionKind::getReadOnly());
7092754fe60SDimitry Andric }
7102754fe60SDimitry Andric 
711f22ef01cSRoman Divacky const MCSection *TargetLoweringObjectFileMachO::
712f22ef01cSRoman Divacky getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
713f22ef01cSRoman Divacky                          Mangler *Mang, const TargetMachine &TM) const {
714f22ef01cSRoman Divacky   // Parse the section specifier and create it if valid.
715f22ef01cSRoman Divacky   StringRef Segment, Section;
7163b0f4066SDimitry Andric   unsigned TAA = 0, StubSize = 0;
7173b0f4066SDimitry Andric   bool TAAParsed;
718f22ef01cSRoman Divacky   std::string ErrorCode =
719f22ef01cSRoman Divacky     MCSectionMachO::ParseSectionSpecifier(GV->getSection(), Segment, Section,
7203b0f4066SDimitry Andric                                           TAA, TAAParsed, StubSize);
721f22ef01cSRoman Divacky   if (!ErrorCode.empty()) {
722f22ef01cSRoman Divacky     // If invalid, report the error with report_fatal_error.
723f22ef01cSRoman Divacky     report_fatal_error("Global variable '" + GV->getNameStr() +
724f22ef01cSRoman Divacky                       "' has an invalid section specifier '" + GV->getSection()+
725f22ef01cSRoman Divacky                       "': " + ErrorCode + ".");
726f22ef01cSRoman Divacky     // Fall back to dropping it into the data section.
727f22ef01cSRoman Divacky     return DataSection;
728f22ef01cSRoman Divacky   }
729f22ef01cSRoman Divacky 
730f22ef01cSRoman Divacky   // Get the section.
731f22ef01cSRoman Divacky   const MCSectionMachO *S =
732f22ef01cSRoman Divacky     getContext().getMachOSection(Segment, Section, TAA, StubSize, Kind);
733f22ef01cSRoman Divacky 
734dd6029ffSDimitry Andric   // If TAA wasn't set by ParseSectionSpecifier() above,
735dd6029ffSDimitry Andric   // use the value returned by getMachOSection() as a default.
7363b0f4066SDimitry Andric   if (!TAAParsed)
737dd6029ffSDimitry Andric     TAA = S->getTypeAndAttributes();
738dd6029ffSDimitry Andric 
739f22ef01cSRoman Divacky   // Okay, now that we got the section, verify that the TAA & StubSize agree.
740f22ef01cSRoman Divacky   // If the user declared multiple globals with different section flags, we need
741f22ef01cSRoman Divacky   // to reject it here.
742f22ef01cSRoman Divacky   if (S->getTypeAndAttributes() != TAA || S->getStubSize() != StubSize) {
743f22ef01cSRoman Divacky     // If invalid, report the error with report_fatal_error.
744f22ef01cSRoman Divacky     report_fatal_error("Global variable '" + GV->getNameStr() +
745f22ef01cSRoman Divacky                       "' section type or attributes does not match previous"
746f22ef01cSRoman Divacky                       " section specifier");
747f22ef01cSRoman Divacky   }
748f22ef01cSRoman Divacky 
749f22ef01cSRoman Divacky   return S;
750f22ef01cSRoman Divacky }
751f22ef01cSRoman Divacky 
752f22ef01cSRoman Divacky const MCSection *TargetLoweringObjectFileMachO::
753f22ef01cSRoman Divacky SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
754f22ef01cSRoman Divacky                        Mangler *Mang, const TargetMachine &TM) const {
755f22ef01cSRoman Divacky 
756f22ef01cSRoman Divacky   // Handle thread local data.
757f22ef01cSRoman Divacky   if (Kind.isThreadBSS()) return TLSBSSSection;
758f22ef01cSRoman Divacky   if (Kind.isThreadData()) return TLSDataSection;
759f22ef01cSRoman Divacky 
760f22ef01cSRoman Divacky   if (Kind.isText())
761f22ef01cSRoman Divacky     return GV->isWeakForLinker() ? TextCoalSection : TextSection;
762f22ef01cSRoman Divacky 
763f22ef01cSRoman Divacky   // If this is weak/linkonce, put this in a coalescable section, either in text
764f22ef01cSRoman Divacky   // or data depending on if it is writable.
765f22ef01cSRoman Divacky   if (GV->isWeakForLinker()) {
766f22ef01cSRoman Divacky     if (Kind.isReadOnly())
767f22ef01cSRoman Divacky       return ConstTextCoalSection;
768f22ef01cSRoman Divacky     return DataCoalSection;
769f22ef01cSRoman Divacky   }
770f22ef01cSRoman Divacky 
771f22ef01cSRoman Divacky   // FIXME: Alignment check should be handled by section classifier.
772f22ef01cSRoman Divacky   if (Kind.isMergeable1ByteCString() &&
773f22ef01cSRoman Divacky       TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV)) < 32)
774f22ef01cSRoman Divacky     return CStringSection;
775f22ef01cSRoman Divacky 
776f22ef01cSRoman Divacky   // Do not put 16-bit arrays in the UString section if they have an
777f22ef01cSRoman Divacky   // externally visible label, this runs into issues with certain linker
778f22ef01cSRoman Divacky   // versions.
779f22ef01cSRoman Divacky   if (Kind.isMergeable2ByteCString() && !GV->hasExternalLinkage() &&
780f22ef01cSRoman Divacky       TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV)) < 32)
781f22ef01cSRoman Divacky     return UStringSection;
782f22ef01cSRoman Divacky 
783f22ef01cSRoman Divacky   if (Kind.isMergeableConst()) {
784f22ef01cSRoman Divacky     if (Kind.isMergeableConst4())
785f22ef01cSRoman Divacky       return FourByteConstantSection;
786f22ef01cSRoman Divacky     if (Kind.isMergeableConst8())
787f22ef01cSRoman Divacky       return EightByteConstantSection;
788f22ef01cSRoman Divacky     if (Kind.isMergeableConst16() && SixteenByteConstantSection)
789f22ef01cSRoman Divacky       return SixteenByteConstantSection;
790f22ef01cSRoman Divacky   }
791f22ef01cSRoman Divacky 
792f22ef01cSRoman Divacky   // Otherwise, if it is readonly, but not something we can specially optimize,
793f22ef01cSRoman Divacky   // just drop it in .const.
794f22ef01cSRoman Divacky   if (Kind.isReadOnly())
795f22ef01cSRoman Divacky     return ReadOnlySection;
796f22ef01cSRoman Divacky 
797f22ef01cSRoman Divacky   // If this is marked const, put it into a const section.  But if the dynamic
798f22ef01cSRoman Divacky   // linker needs to write to it, put it in the data segment.
799f22ef01cSRoman Divacky   if (Kind.isReadOnlyWithRel())
800f22ef01cSRoman Divacky     return ConstDataSection;
801f22ef01cSRoman Divacky 
802f22ef01cSRoman Divacky   // Put zero initialized globals with strong external linkage in the
803f22ef01cSRoman Divacky   // DATA, __common section with the .zerofill directive.
804f22ef01cSRoman Divacky   if (Kind.isBSSExtern())
805f22ef01cSRoman Divacky     return DataCommonSection;
806f22ef01cSRoman Divacky 
807f22ef01cSRoman Divacky   // Put zero initialized globals with local linkage in __DATA,__bss directive
808f22ef01cSRoman Divacky   // with the .zerofill directive (aka .lcomm).
809f22ef01cSRoman Divacky   if (Kind.isBSSLocal())
810f22ef01cSRoman Divacky     return DataBSSSection;
811f22ef01cSRoman Divacky 
812f22ef01cSRoman Divacky   // Otherwise, just drop the variable in the normal data section.
813f22ef01cSRoman Divacky   return DataSection;
814f22ef01cSRoman Divacky }
815f22ef01cSRoman Divacky 
816f22ef01cSRoman Divacky const MCSection *
817f22ef01cSRoman Divacky TargetLoweringObjectFileMachO::getSectionForConstant(SectionKind Kind) const {
818f22ef01cSRoman Divacky   // If this constant requires a relocation, we have to put it in the data
819f22ef01cSRoman Divacky   // segment, not in the text segment.
820f22ef01cSRoman Divacky   if (Kind.isDataRel() || Kind.isReadOnlyWithRel())
821f22ef01cSRoman Divacky     return ConstDataSection;
822f22ef01cSRoman Divacky 
823f22ef01cSRoman Divacky   if (Kind.isMergeableConst4())
824f22ef01cSRoman Divacky     return FourByteConstantSection;
825f22ef01cSRoman Divacky   if (Kind.isMergeableConst8())
826f22ef01cSRoman Divacky     return EightByteConstantSection;
827f22ef01cSRoman Divacky   if (Kind.isMergeableConst16() && SixteenByteConstantSection)
828f22ef01cSRoman Divacky     return SixteenByteConstantSection;
829f22ef01cSRoman Divacky   return ReadOnlySection;  // .const
830f22ef01cSRoman Divacky }
831f22ef01cSRoman Divacky 
832f22ef01cSRoman Divacky /// shouldEmitUsedDirectiveFor - This hook allows targets to selectively decide
833f22ef01cSRoman Divacky /// not to emit the UsedDirective for some symbols in llvm.used.
834f22ef01cSRoman Divacky // FIXME: REMOVE this (rdar://7071300)
835f22ef01cSRoman Divacky bool TargetLoweringObjectFileMachO::
836f22ef01cSRoman Divacky shouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler *Mang) const {
837f22ef01cSRoman Divacky   /// On Darwin, internally linked data beginning with "L" or "l" does not have
838f22ef01cSRoman Divacky   /// the directive emitted (this occurs in ObjC metadata).
839f22ef01cSRoman Divacky   if (!GV) return false;
840f22ef01cSRoman Divacky 
841f22ef01cSRoman Divacky   // Check whether the mangled name has the "Private" or "LinkerPrivate" prefix.
842f22ef01cSRoman Divacky   if (GV->hasLocalLinkage() && !isa<Function>(GV)) {
843f22ef01cSRoman Divacky     // FIXME: ObjC metadata is currently emitted as internal symbols that have
844f22ef01cSRoman Divacky     // \1L and \0l prefixes on them.  Fix them to be Private/LinkerPrivate and
845f22ef01cSRoman Divacky     // this horrible hack can go away.
846f22ef01cSRoman Divacky     MCSymbol *Sym = Mang->getSymbol(GV);
847f22ef01cSRoman Divacky     if (Sym->getName()[0] == 'L' || Sym->getName()[0] == 'l')
848f22ef01cSRoman Divacky       return false;
849f22ef01cSRoman Divacky   }
850f22ef01cSRoman Divacky 
851f22ef01cSRoman Divacky   return true;
852f22ef01cSRoman Divacky }
853f22ef01cSRoman Divacky 
854f22ef01cSRoman Divacky const MCExpr *TargetLoweringObjectFileMachO::
855f22ef01cSRoman Divacky getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
856f22ef01cSRoman Divacky                                MachineModuleInfo *MMI, unsigned Encoding,
857f22ef01cSRoman Divacky                                MCStreamer &Streamer) const {
858f22ef01cSRoman Divacky   // The mach-o version of this method defaults to returning a stub reference.
859f22ef01cSRoman Divacky 
860f22ef01cSRoman Divacky   if (Encoding & DW_EH_PE_indirect) {
861f22ef01cSRoman Divacky     MachineModuleInfoMachO &MachOMMI =
862f22ef01cSRoman Divacky       MMI->getObjFileInfo<MachineModuleInfoMachO>();
863f22ef01cSRoman Divacky 
864f22ef01cSRoman Divacky     SmallString<128> Name;
865f22ef01cSRoman Divacky     Mang->getNameWithPrefix(Name, GV, true);
866f22ef01cSRoman Divacky     Name += "$non_lazy_ptr";
867f22ef01cSRoman Divacky 
868f22ef01cSRoman Divacky     // Add information about the stub reference to MachOMMI so that the stub
869f22ef01cSRoman Divacky     // gets emitted by the asmprinter.
870f22ef01cSRoman Divacky     MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str());
871f22ef01cSRoman Divacky     MachineModuleInfoImpl::StubValueTy &StubSym = MachOMMI.getGVStubEntry(SSym);
872f22ef01cSRoman Divacky     if (StubSym.getPointer() == 0) {
873f22ef01cSRoman Divacky       MCSymbol *Sym = Mang->getSymbol(GV);
874f22ef01cSRoman Divacky       StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
875f22ef01cSRoman Divacky     }
876f22ef01cSRoman Divacky 
877f22ef01cSRoman Divacky     return TargetLoweringObjectFile::
8783b0f4066SDimitry Andric       getExprForDwarfReference(SSym, Encoding & ~dwarf::DW_EH_PE_indirect, Streamer);
879f22ef01cSRoman Divacky   }
880f22ef01cSRoman Divacky 
881f22ef01cSRoman Divacky   return TargetLoweringObjectFile::
882f22ef01cSRoman Divacky     getExprForDwarfGlobalReference(GV, Mang, MMI, Encoding, Streamer);
883f22ef01cSRoman Divacky }
884f22ef01cSRoman Divacky 
8853b0f4066SDimitry Andric MCSymbol *TargetLoweringObjectFileMachO::
8863b0f4066SDimitry Andric getCFIPersonalitySymbol(const GlobalValue *GV, Mangler *Mang,
8873b0f4066SDimitry Andric                         MachineModuleInfo *MMI) const {
8883b0f4066SDimitry Andric   // The mach-o version of this method defaults to returning a stub reference.
8893b0f4066SDimitry Andric   MachineModuleInfoMachO &MachOMMI =
8903b0f4066SDimitry Andric     MMI->getObjFileInfo<MachineModuleInfoMachO>();
8913b0f4066SDimitry Andric 
8923b0f4066SDimitry Andric   SmallString<128> Name;
8933b0f4066SDimitry Andric   Mang->getNameWithPrefix(Name, GV, true);
8943b0f4066SDimitry Andric   Name += "$non_lazy_ptr";
8953b0f4066SDimitry Andric 
8963b0f4066SDimitry Andric   // Add information about the stub reference to MachOMMI so that the stub
8973b0f4066SDimitry Andric   // gets emitted by the asmprinter.
8983b0f4066SDimitry Andric   MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str());
8993b0f4066SDimitry Andric   MachineModuleInfoImpl::StubValueTy &StubSym = MachOMMI.getGVStubEntry(SSym);
9003b0f4066SDimitry Andric   if (StubSym.getPointer() == 0) {
9013b0f4066SDimitry Andric     MCSymbol *Sym = Mang->getSymbol(GV);
9023b0f4066SDimitry Andric     StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
9033b0f4066SDimitry Andric   }
9043b0f4066SDimitry Andric 
9053b0f4066SDimitry Andric   return SSym;
9063b0f4066SDimitry Andric }
9073b0f4066SDimitry Andric 
908f22ef01cSRoman Divacky unsigned TargetLoweringObjectFileMachO::getPersonalityEncoding() const {
909f22ef01cSRoman Divacky   return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4;
910f22ef01cSRoman Divacky }
911f22ef01cSRoman Divacky 
912f22ef01cSRoman Divacky unsigned TargetLoweringObjectFileMachO::getLSDAEncoding() const {
913f22ef01cSRoman Divacky   return DW_EH_PE_pcrel;
914f22ef01cSRoman Divacky }
915f22ef01cSRoman Divacky 
9163b0f4066SDimitry Andric unsigned TargetLoweringObjectFileMachO::getFDEEncoding(bool CFI) const {
917f22ef01cSRoman Divacky   return DW_EH_PE_pcrel;
918f22ef01cSRoman Divacky }
919f22ef01cSRoman Divacky 
920f22ef01cSRoman Divacky unsigned TargetLoweringObjectFileMachO::getTTypeEncoding() const {
921f22ef01cSRoman Divacky   return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4;
922f22ef01cSRoman Divacky }
923f22ef01cSRoman Divacky 
924f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
925f22ef01cSRoman Divacky //                                  COFF
926f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
927f22ef01cSRoman Divacky 
92817a519f9SDimitry Andric TargetLoweringObjectFileCOFF::TargetLoweringObjectFileCOFF()
92917a519f9SDimitry Andric   : TargetLoweringObjectFile(),
93017a519f9SDimitry Andric     DrectveSection(0),
93117a519f9SDimitry Andric     PDataSection(0),
93217a519f9SDimitry Andric     XDataSection(0) {
93317a519f9SDimitry Andric }
93417a519f9SDimitry Andric 
935f22ef01cSRoman Divacky void TargetLoweringObjectFileCOFF::Initialize(MCContext &Ctx,
936f22ef01cSRoman Divacky                                               const TargetMachine &TM) {
937f22ef01cSRoman Divacky   TargetLoweringObjectFile::Initialize(Ctx, TM);
938f22ef01cSRoman Divacky   TextSection =
939f22ef01cSRoman Divacky     getContext().getCOFFSection(".text",
940ffd1746dSEd Schouten                                 COFF::IMAGE_SCN_CNT_CODE |
941ffd1746dSEd Schouten                                 COFF::IMAGE_SCN_MEM_EXECUTE |
942ffd1746dSEd Schouten                                 COFF::IMAGE_SCN_MEM_READ,
943f22ef01cSRoman Divacky                                 SectionKind::getText());
944f22ef01cSRoman Divacky   DataSection =
945f22ef01cSRoman Divacky     getContext().getCOFFSection(".data",
946ffd1746dSEd Schouten                                 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
947ffd1746dSEd Schouten                                 COFF::IMAGE_SCN_MEM_READ |
948ffd1746dSEd Schouten                                 COFF::IMAGE_SCN_MEM_WRITE,
949f22ef01cSRoman Divacky                                 SectionKind::getDataRel());
950f22ef01cSRoman Divacky   ReadOnlySection =
951f22ef01cSRoman Divacky     getContext().getCOFFSection(".rdata",
952ffd1746dSEd Schouten                                 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
953ffd1746dSEd Schouten                                 COFF::IMAGE_SCN_MEM_READ,
954f22ef01cSRoman Divacky                                 SectionKind::getReadOnly());
955f22ef01cSRoman Divacky   StaticCtorSection =
956f22ef01cSRoman Divacky     getContext().getCOFFSection(".ctors",
957ffd1746dSEd Schouten                                 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
958ffd1746dSEd Schouten                                 COFF::IMAGE_SCN_MEM_READ |
959ffd1746dSEd Schouten                                 COFF::IMAGE_SCN_MEM_WRITE,
960f22ef01cSRoman Divacky                                 SectionKind::getDataRel());
961f22ef01cSRoman Divacky   StaticDtorSection =
962f22ef01cSRoman Divacky     getContext().getCOFFSection(".dtors",
963ffd1746dSEd Schouten                                 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
964ffd1746dSEd Schouten                                 COFF::IMAGE_SCN_MEM_READ |
965ffd1746dSEd Schouten                                 COFF::IMAGE_SCN_MEM_WRITE,
966f22ef01cSRoman Divacky                                 SectionKind::getDataRel());
967f22ef01cSRoman Divacky 
968f22ef01cSRoman Divacky   // FIXME: We're emitting LSDA info into a readonly section on COFF, even
969f22ef01cSRoman Divacky   // though it contains relocatable pointers.  In PIC mode, this is probably a
970f22ef01cSRoman Divacky   // big runtime hit for C++ apps.  Either the contents of the LSDA need to be
971f22ef01cSRoman Divacky   // adjusted or this should be a data section.
972f22ef01cSRoman Divacky   LSDASection =
973f22ef01cSRoman Divacky     getContext().getCOFFSection(".gcc_except_table",
974ffd1746dSEd Schouten                                 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
975ffd1746dSEd Schouten                                 COFF::IMAGE_SCN_MEM_READ,
976f22ef01cSRoman Divacky                                 SectionKind::getReadOnly());
977f22ef01cSRoman Divacky   // Debug info.
978f22ef01cSRoman Divacky   DwarfAbbrevSection =
979f22ef01cSRoman Divacky     getContext().getCOFFSection(".debug_abbrev",
980ffd1746dSEd Schouten                                 COFF::IMAGE_SCN_MEM_DISCARDABLE |
981ffd1746dSEd Schouten                                 COFF::IMAGE_SCN_MEM_READ,
982f22ef01cSRoman Divacky                                 SectionKind::getMetadata());
983f22ef01cSRoman Divacky   DwarfInfoSection =
984f22ef01cSRoman Divacky     getContext().getCOFFSection(".debug_info",
985ffd1746dSEd Schouten                                 COFF::IMAGE_SCN_MEM_DISCARDABLE |
986ffd1746dSEd Schouten                                 COFF::IMAGE_SCN_MEM_READ,
987f22ef01cSRoman Divacky                                 SectionKind::getMetadata());
988f22ef01cSRoman Divacky   DwarfLineSection =
989f22ef01cSRoman Divacky     getContext().getCOFFSection(".debug_line",
990ffd1746dSEd Schouten                                 COFF::IMAGE_SCN_MEM_DISCARDABLE |
991ffd1746dSEd Schouten                                 COFF::IMAGE_SCN_MEM_READ,
992f22ef01cSRoman Divacky                                 SectionKind::getMetadata());
993f22ef01cSRoman Divacky   DwarfFrameSection =
994f22ef01cSRoman Divacky     getContext().getCOFFSection(".debug_frame",
995ffd1746dSEd Schouten                                 COFF::IMAGE_SCN_MEM_DISCARDABLE |
996ffd1746dSEd Schouten                                 COFF::IMAGE_SCN_MEM_READ,
997f22ef01cSRoman Divacky                                 SectionKind::getMetadata());
998f22ef01cSRoman Divacky   DwarfPubNamesSection =
999f22ef01cSRoman Divacky     getContext().getCOFFSection(".debug_pubnames",
1000ffd1746dSEd Schouten                                 COFF::IMAGE_SCN_MEM_DISCARDABLE |
1001ffd1746dSEd Schouten                                 COFF::IMAGE_SCN_MEM_READ,
1002f22ef01cSRoman Divacky                                 SectionKind::getMetadata());
1003f22ef01cSRoman Divacky   DwarfPubTypesSection =
1004f22ef01cSRoman Divacky     getContext().getCOFFSection(".debug_pubtypes",
1005ffd1746dSEd Schouten                                 COFF::IMAGE_SCN_MEM_DISCARDABLE |
1006ffd1746dSEd Schouten                                 COFF::IMAGE_SCN_MEM_READ,
1007f22ef01cSRoman Divacky                                 SectionKind::getMetadata());
1008f22ef01cSRoman Divacky   DwarfStrSection =
1009f22ef01cSRoman Divacky     getContext().getCOFFSection(".debug_str",
1010ffd1746dSEd Schouten                                 COFF::IMAGE_SCN_MEM_DISCARDABLE |
1011ffd1746dSEd Schouten                                 COFF::IMAGE_SCN_MEM_READ,
1012f22ef01cSRoman Divacky                                 SectionKind::getMetadata());
1013f22ef01cSRoman Divacky   DwarfLocSection =
1014f22ef01cSRoman Divacky     getContext().getCOFFSection(".debug_loc",
1015ffd1746dSEd Schouten                                 COFF::IMAGE_SCN_MEM_DISCARDABLE |
1016ffd1746dSEd Schouten                                 COFF::IMAGE_SCN_MEM_READ,
1017f22ef01cSRoman Divacky                                 SectionKind::getMetadata());
1018f22ef01cSRoman Divacky   DwarfARangesSection =
1019f22ef01cSRoman Divacky     getContext().getCOFFSection(".debug_aranges",
1020ffd1746dSEd Schouten                                 COFF::IMAGE_SCN_MEM_DISCARDABLE |
1021ffd1746dSEd Schouten                                 COFF::IMAGE_SCN_MEM_READ,
1022f22ef01cSRoman Divacky                                 SectionKind::getMetadata());
1023f22ef01cSRoman Divacky   DwarfRangesSection =
1024f22ef01cSRoman Divacky     getContext().getCOFFSection(".debug_ranges",
1025ffd1746dSEd Schouten                                 COFF::IMAGE_SCN_MEM_DISCARDABLE |
1026ffd1746dSEd Schouten                                 COFF::IMAGE_SCN_MEM_READ,
1027f22ef01cSRoman Divacky                                 SectionKind::getMetadata());
1028f22ef01cSRoman Divacky   DwarfMacroInfoSection =
1029f22ef01cSRoman Divacky     getContext().getCOFFSection(".debug_macinfo",
1030ffd1746dSEd Schouten                                 COFF::IMAGE_SCN_MEM_DISCARDABLE |
1031ffd1746dSEd Schouten                                 COFF::IMAGE_SCN_MEM_READ,
1032f22ef01cSRoman Divacky                                 SectionKind::getMetadata());
1033f22ef01cSRoman Divacky 
1034f22ef01cSRoman Divacky   DrectveSection =
1035f22ef01cSRoman Divacky     getContext().getCOFFSection(".drectve",
1036ffd1746dSEd Schouten                                 COFF::IMAGE_SCN_LNK_INFO,
1037f22ef01cSRoman Divacky                                 SectionKind::getMetadata());
1038bd5abe19SDimitry Andric 
1039bd5abe19SDimitry Andric   PDataSection =
1040bd5abe19SDimitry Andric     getContext().getCOFFSection(".pdata",
1041bd5abe19SDimitry Andric                                 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
1042bd5abe19SDimitry Andric                                 COFF::IMAGE_SCN_MEM_READ |
1043bd5abe19SDimitry Andric                                 COFF::IMAGE_SCN_MEM_WRITE,
1044bd5abe19SDimitry Andric                                 SectionKind::getDataRel());
1045bd5abe19SDimitry Andric 
1046bd5abe19SDimitry Andric   XDataSection =
1047bd5abe19SDimitry Andric     getContext().getCOFFSection(".xdata",
1048bd5abe19SDimitry Andric                                 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
1049bd5abe19SDimitry Andric                                 COFF::IMAGE_SCN_MEM_READ |
1050bd5abe19SDimitry Andric                                 COFF::IMAGE_SCN_MEM_WRITE,
1051bd5abe19SDimitry Andric                                 SectionKind::getDataRel());
1052f22ef01cSRoman Divacky }
1053f22ef01cSRoman Divacky 
10542754fe60SDimitry Andric const MCSection *TargetLoweringObjectFileCOFF::getEHFrameSection() const {
10552754fe60SDimitry Andric   return getContext().getCOFFSection(".eh_frame",
10562754fe60SDimitry Andric                                      COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
10572754fe60SDimitry Andric                                      COFF::IMAGE_SCN_MEM_READ |
10582754fe60SDimitry Andric                                      COFF::IMAGE_SCN_MEM_WRITE,
10592754fe60SDimitry Andric                                      SectionKind::getDataRel());
10602754fe60SDimitry Andric }
10612754fe60SDimitry Andric 
1062bd5abe19SDimitry Andric const MCSection *TargetLoweringObjectFileCOFF::getWin64EHFuncTableSection(
1063bd5abe19SDimitry Andric                                                        StringRef suffix) const {
1064bd5abe19SDimitry Andric   if (suffix == "")
1065bd5abe19SDimitry Andric     return PDataSection;
1066bd5abe19SDimitry Andric   return getContext().getCOFFSection((".pdata"+suffix).str(),
1067bd5abe19SDimitry Andric                                      COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
1068bd5abe19SDimitry Andric                                      COFF::IMAGE_SCN_MEM_READ |
1069bd5abe19SDimitry Andric                                      COFF::IMAGE_SCN_MEM_WRITE,
1070bd5abe19SDimitry Andric                                      SectionKind::getDataRel());
1071bd5abe19SDimitry Andric }
1072bd5abe19SDimitry Andric 
1073bd5abe19SDimitry Andric const MCSection *TargetLoweringObjectFileCOFF::getWin64EHTableSection(
1074bd5abe19SDimitry Andric                                                        StringRef suffix) const {
1075bd5abe19SDimitry Andric   if (suffix == "")
1076bd5abe19SDimitry Andric     return XDataSection;
1077bd5abe19SDimitry Andric   return getContext().getCOFFSection((".xdata"+suffix).str(),
1078bd5abe19SDimitry Andric                                      COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
1079bd5abe19SDimitry Andric                                      COFF::IMAGE_SCN_MEM_READ |
1080bd5abe19SDimitry Andric                                      COFF::IMAGE_SCN_MEM_WRITE,
1081bd5abe19SDimitry Andric                                      SectionKind::getDataRel());
1082bd5abe19SDimitry Andric }
1083bd5abe19SDimitry Andric 
10842754fe60SDimitry Andric 
1085f22ef01cSRoman Divacky static unsigned
1086f22ef01cSRoman Divacky getCOFFSectionFlags(SectionKind K) {
1087f22ef01cSRoman Divacky   unsigned Flags = 0;
1088f22ef01cSRoman Divacky 
1089ffd1746dSEd Schouten   if (K.isMetadata())
1090f22ef01cSRoman Divacky     Flags |=
1091ffd1746dSEd Schouten       COFF::IMAGE_SCN_MEM_DISCARDABLE;
1092f22ef01cSRoman Divacky   else if (K.isText())
1093f22ef01cSRoman Divacky     Flags |=
1094ffd1746dSEd Schouten       COFF::IMAGE_SCN_MEM_EXECUTE |
10952754fe60SDimitry Andric       COFF::IMAGE_SCN_MEM_READ |
1096ffd1746dSEd Schouten       COFF::IMAGE_SCN_CNT_CODE;
1097f22ef01cSRoman Divacky   else if (K.isBSS ())
1098f22ef01cSRoman Divacky     Flags |=
1099ffd1746dSEd Schouten       COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA |
1100ffd1746dSEd Schouten       COFF::IMAGE_SCN_MEM_READ |
1101ffd1746dSEd Schouten       COFF::IMAGE_SCN_MEM_WRITE;
1102f22ef01cSRoman Divacky   else if (K.isReadOnly())
1103f22ef01cSRoman Divacky     Flags |=
1104ffd1746dSEd Schouten       COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
1105ffd1746dSEd Schouten       COFF::IMAGE_SCN_MEM_READ;
1106f22ef01cSRoman Divacky   else if (K.isWriteable())
1107f22ef01cSRoman Divacky     Flags |=
1108ffd1746dSEd Schouten       COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
1109ffd1746dSEd Schouten       COFF::IMAGE_SCN_MEM_READ |
1110ffd1746dSEd Schouten       COFF::IMAGE_SCN_MEM_WRITE;
1111f22ef01cSRoman Divacky 
1112f22ef01cSRoman Divacky   return Flags;
1113f22ef01cSRoman Divacky }
1114f22ef01cSRoman Divacky 
1115f22ef01cSRoman Divacky const MCSection *TargetLoweringObjectFileCOFF::
1116f22ef01cSRoman Divacky getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
1117f22ef01cSRoman Divacky                          Mangler *Mang, const TargetMachine &TM) const {
1118f22ef01cSRoman Divacky   return getContext().getCOFFSection(GV->getSection(),
1119f22ef01cSRoman Divacky                                      getCOFFSectionFlags(Kind),
1120f22ef01cSRoman Divacky                                      Kind);
1121f22ef01cSRoman Divacky }
1122f22ef01cSRoman Divacky 
1123f22ef01cSRoman Divacky static const char *getCOFFSectionPrefixForUniqueGlobal(SectionKind Kind) {
1124f22ef01cSRoman Divacky   if (Kind.isText())
11252754fe60SDimitry Andric     return ".text$";
1126f22ef01cSRoman Divacky   if (Kind.isBSS ())
11272754fe60SDimitry Andric     return ".bss$";
1128f22ef01cSRoman Divacky   if (Kind.isWriteable())
11292754fe60SDimitry Andric     return ".data$";
11302754fe60SDimitry Andric   return ".rdata$";
1131f22ef01cSRoman Divacky }
1132f22ef01cSRoman Divacky 
1133f22ef01cSRoman Divacky 
1134f22ef01cSRoman Divacky const MCSection *TargetLoweringObjectFileCOFF::
1135f22ef01cSRoman Divacky SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
1136f22ef01cSRoman Divacky                        Mangler *Mang, const TargetMachine &TM) const {
1137f22ef01cSRoman Divacky   assert(!Kind.isThreadLocal() && "Doesn't support TLS");
1138f22ef01cSRoman Divacky 
1139f22ef01cSRoman Divacky   // If this global is linkonce/weak and the target handles this by emitting it
1140f22ef01cSRoman Divacky   // into a 'uniqued' section name, create and return the section now.
1141f22ef01cSRoman Divacky   if (GV->isWeakForLinker()) {
1142f22ef01cSRoman Divacky     const char *Prefix = getCOFFSectionPrefixForUniqueGlobal(Kind);
1143f22ef01cSRoman Divacky     SmallString<128> Name(Prefix, Prefix+strlen(Prefix));
1144f22ef01cSRoman Divacky     MCSymbol *Sym = Mang->getSymbol(GV);
11452754fe60SDimitry Andric     Name.append(Sym->getName().begin() + 1, Sym->getName().end());
1146f22ef01cSRoman Divacky 
1147f22ef01cSRoman Divacky     unsigned Characteristics = getCOFFSectionFlags(Kind);
1148f22ef01cSRoman Divacky 
1149ffd1746dSEd Schouten     Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT;
1150f22ef01cSRoman Divacky 
1151f22ef01cSRoman Divacky     return getContext().getCOFFSection(Name.str(), Characteristics,
11522754fe60SDimitry Andric                           COFF::IMAGE_COMDAT_SELECT_ANY, Kind);
1153f22ef01cSRoman Divacky   }
1154f22ef01cSRoman Divacky 
1155f22ef01cSRoman Divacky   if (Kind.isText())
1156f22ef01cSRoman Divacky     return getTextSection();
1157f22ef01cSRoman Divacky 
1158f22ef01cSRoman Divacky   return getDataSection();
1159f22ef01cSRoman Divacky }
1160f22ef01cSRoman Divacky 
1161