1362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===-- llvm/CodeGen/TargetLoweringObjectFileImpl.cpp - Object File Info --===//
2362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//
3362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//                     The LLVM Compiler Infrastructure
4362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//
5362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov// This file is distributed under the University of Illinois Open Source
6362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov// License. See LICENSE.TXT for details.
7362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//
8362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===//
9362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//
10362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov// This file implements classes used to handle lowerings specific to common
11362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov// object file formats.
12362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//
13362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===//
14362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
15362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"
16d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/SmallString.h"
17d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/StringExtras.h"
18d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/Triple.h"
19d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/CodeGen/MachineModuleInfoImpls.h"
200b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Constants.h"
210b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DataLayout.h"
220b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DerivedTypes.h"
230b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Function.h"
240b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/GlobalVariable.h"
2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/Mangler.h"
260b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Module.h"
27362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/MC/MCContext.h"
28362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/MC/MCExpr.h"
29eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner#include "llvm/MC/MCSectionCOFF.h"
30d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/MC/MCSectionELF.h"
31d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/MC/MCSectionMachO.h"
3230deafc84adf88f643cdc39dc97a37537155347fRafael Espindola#include "llvm/MC/MCStreamer.h"
33362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/MC/MCSymbol.h"
34362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/Support/Dwarf.h"
35c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola#include "llvm/Support/ELF.h"
36362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/Support/ErrorHandling.h"
37362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/Support/raw_ostream.h"
3836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Target/TargetLowering.h"
39d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetMachine.h"
40362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovusing namespace llvm;
41293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikovusing namespace dwarf;
42362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
43362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===//
44362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//                                  ELF
45362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===//
46362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
4736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesMCSymbol *TargetLoweringObjectFileELF::getCFIPersonalitySymbol(
4836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    const GlobalValue *GV, Mangler &Mang, const TargetMachine &TM,
4936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    MachineModuleInfo *MMI) const {
5060246a96224c8b790177253bf25433b93b335d2bRafael Espindola  unsigned Encoding = getPersonalityEncoding();
51cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if ((Encoding & 0x80) == dwarf::DW_EH_PE_indirect)
52fb66f477a1c1cdde2670163bd60e42139a5009d8Rafael Espindola    return getContext().GetOrCreateSymbol(StringRef("DW.ref.") +
5336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                          TM.getSymbol(GV, Mang)->getName());
54cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if ((Encoding & 0x70) == dwarf::DW_EH_PE_absptr)
55cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return TM.getSymbol(GV, Mang);
56cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  report_fatal_error("We do not support this DWARF encoding yet!");
5730deafc84adf88f643cdc39dc97a37537155347fRafael Espindola}
5830deafc84adf88f643cdc39dc97a37537155347fRafael Espindola
5930deafc84adf88f643cdc39dc97a37537155347fRafael Espindolavoid TargetLoweringObjectFileELF::emitPersonalityValue(MCStreamer &Streamer,
6030deafc84adf88f643cdc39dc97a37537155347fRafael Espindola                                                       const TargetMachine &TM,
617afec9cc0ff1654619d30b6f30e2a4d13369c8bfRafael Espindola                                                       const MCSymbol *Sym) const {
62fb66f477a1c1cdde2670163bd60e42139a5009d8Rafael Espindola  SmallString<64> NameData("DW.ref.");
63fb66f477a1c1cdde2670163bd60e42139a5009d8Rafael Espindola  NameData += Sym->getName();
64fb66f477a1c1cdde2670163bd60e42139a5009d8Rafael Espindola  MCSymbol *Label = getContext().GetOrCreateSymbol(NameData);
65018e38c6dd8794c6c58be518ddaae99033f6d080Rafael Espindola  Streamer.EmitSymbolAttribute(Label, MCSA_Hidden);
66018e38c6dd8794c6c58be518ddaae99033f6d080Rafael Espindola  Streamer.EmitSymbolAttribute(Label, MCSA_Weak);
67fb66f477a1c1cdde2670163bd60e42139a5009d8Rafael Espindola  StringRef Prefix = ".data.";
68fb66f477a1c1cdde2670163bd60e42139a5009d8Rafael Espindola  NameData.insert(NameData.begin(), Prefix.begin(), Prefix.end());
69018e38c6dd8794c6c58be518ddaae99033f6d080Rafael Espindola  unsigned Flags = ELF::SHF_ALLOC | ELF::SHF_WRITE | ELF::SHF_GROUP;
70018e38c6dd8794c6c58be518ddaae99033f6d080Rafael Espindola  const MCSection *Sec = getContext().getELFSection(NameData,
71018e38c6dd8794c6c58be518ddaae99033f6d080Rafael Espindola                                                    ELF::SHT_PROGBITS,
72018e38c6dd8794c6c58be518ddaae99033f6d080Rafael Espindola                                                    Flags,
73018e38c6dd8794c6c58be518ddaae99033f6d080Rafael Espindola                                                    SectionKind::getDataRel(),
74018e38c6dd8794c6c58be518ddaae99033f6d080Rafael Espindola                                                    0, Label->getName());
75426c2bf5cdd2173e4a33aea8cb92cf684a724f4bChandler Carruth  unsigned Size = TM.getDataLayout()->getPointerSize();
76018e38c6dd8794c6c58be518ddaae99033f6d080Rafael Espindola  Streamer.SwitchSection(Sec);
77426c2bf5cdd2173e4a33aea8cb92cf684a724f4bChandler Carruth  Streamer.EmitValueToAlignment(TM.getDataLayout()->getPointerABIAlignment());
78018e38c6dd8794c6c58be518ddaae99033f6d080Rafael Espindola  Streamer.EmitSymbolAttribute(Label, MCSA_ELF_TypeObject);
79ca5b752d1873707c5c7d846515998ccf5002edcaDavid Chisnall  const MCExpr *E = MCConstantExpr::Create(Size, getContext());
80018e38c6dd8794c6c58be518ddaae99033f6d080Rafael Espindola  Streamer.EmitELFSize(Label, E);
81018e38c6dd8794c6c58be518ddaae99033f6d080Rafael Espindola  Streamer.EmitLabel(Label);
82018e38c6dd8794c6c58be518ddaae99033f6d080Rafael Espindola
83018e38c6dd8794c6c58be518ddaae99033f6d080Rafael Espindola  Streamer.EmitSymbolValue(Sym, Size);
8430deafc84adf88f643cdc39dc97a37537155347fRafael Espindola}
8530deafc84adf88f643cdc39dc97a37537155347fRafael Espindola
8636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesconst MCExpr *TargetLoweringObjectFileELF::getTTypeGlobalReference(
8736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    const GlobalValue *GV, unsigned Encoding, Mangler &Mang,
8836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    const TargetMachine &TM, MachineModuleInfo *MMI,
8936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    MCStreamer &Streamer) const {
9025efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov
9125efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov  if (Encoding & dwarf::DW_EH_PE_indirect) {
9225efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov    MachineModuleInfoELF &ELFMMI = MMI->getObjFileInfo<MachineModuleInfoELF>();
9325efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov
9436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    MCSymbol *SSym = getSymbolWithGlobalValueBase(GV, ".DW.stub", Mang, TM);
9525efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov
9625efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov    // Add information about the stub reference to ELFMMI so that the stub
9725efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov    // gets emitted by the asmprinter.
9825efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov    MachineModuleInfoImpl::StubValueTy &StubSym = ELFMMI.getGVStubEntry(SSym);
99dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    if (!StubSym.getPointer()) {
10036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      MCSymbol *Sym = TM.getSymbol(GV, Mang);
10125efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov      StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
10225efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov    }
10325efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov
10425efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov    return TargetLoweringObjectFile::
10525efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov      getTTypeReference(MCSymbolRefExpr::Create(SSym, getContext()),
10625efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov                        Encoding & ~dwarf::DW_EH_PE_indirect, Streamer);
10725efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov  }
10825efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov
10925efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov  return TargetLoweringObjectFile::
11036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    getTTypeGlobalReference(GV, Encoding, Mang, TM, MMI, Streamer);
11125efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov}
11225efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov
113362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovstatic SectionKind
114362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetELFKindForNamedSection(StringRef Name, SectionKind K) {
115e6657980977ed63df8bbd2604c9fefe513ac4126Rafael Espindola  // N.B.: The defaults used in here are no the same ones used in MC.
116e6657980977ed63df8bbd2604c9fefe513ac4126Rafael Espindola  // We follow gcc, MC follows gas. For example, given ".section .eh_frame",
117e6657980977ed63df8bbd2604c9fefe513ac4126Rafael Espindola  // both gas and MC will produce a section with no flags. Given
11896cb1128528a512f1ef9c28ae5e1b78a98dcc505Bill Wendling  // section(".eh_frame") gcc will produce:
11996cb1128528a512f1ef9c28ae5e1b78a98dcc505Bill Wendling  //
12096cb1128528a512f1ef9c28ae5e1b78a98dcc505Bill Wendling  //   .section   .eh_frame,"a",@progbits
121362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Name.empty() || Name[0] != '.') return K;
122362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
123362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Some lame default implementation based on some magic section names.
124362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Name == ".bss" ||
125362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".bss.") ||
126362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".gnu.linkonce.b.") ||
127362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".llvm.linkonce.b.") ||
128362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name == ".sbss" ||
129362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".sbss.") ||
130362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".gnu.linkonce.sb.") ||
131362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".llvm.linkonce.sb."))
132362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return SectionKind::getBSS();
133362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
134362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Name == ".tdata" ||
135362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".tdata.") ||
136362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".gnu.linkonce.td.") ||
137362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".llvm.linkonce.td."))
138362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return SectionKind::getThreadData();
139362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
140362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Name == ".tbss" ||
141362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".tbss.") ||
142362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".gnu.linkonce.tb.") ||
143362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".llvm.linkonce.tb."))
144362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return SectionKind::getThreadBSS();
145362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
146362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return K;
147362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
148362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
149362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
150362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovstatic unsigned getELFSectionType(StringRef Name, SectionKind K) {
151362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
152362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Name == ".init_array")
153c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola    return ELF::SHT_INIT_ARRAY;
154362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
155362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Name == ".fini_array")
156c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola    return ELF::SHT_FINI_ARRAY;
157362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
158362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Name == ".preinit_array")
159c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola    return ELF::SHT_PREINIT_ARRAY;
160362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
161362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (K.isBSS() || K.isThreadBSS())
162c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola    return ELF::SHT_NOBITS;
163362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
164c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola  return ELF::SHT_PROGBITS;
165362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
166362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
167362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
168362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovstatic unsigned
169362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetELFSectionFlags(SectionKind K) {
170362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  unsigned Flags = 0;
171362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
172362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (!K.isMetadata())
1731c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola    Flags |= ELF::SHF_ALLOC;
174362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
175362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (K.isText())
1761c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola    Flags |= ELF::SHF_EXECINSTR;
177362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
178d846e3fb5a36c625df1bea3d4ef4e337b7b6e917Rafael Espindola  if (K.isWriteable())
1791c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola    Flags |= ELF::SHF_WRITE;
180362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
181362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (K.isThreadLocal())
1821c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola    Flags |= ELF::SHF_TLS;
183362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
184362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // K.isMergeableConst() is left out to honour PR4650
185362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (K.isMergeableCString() || K.isMergeableConst4() ||
186362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      K.isMergeableConst8() || K.isMergeableConst16())
1871c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola    Flags |= ELF::SHF_MERGE;
188362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
189362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (K.isMergeableCString())
1901c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola    Flags |= ELF::SHF_STRINGS;
191362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
192362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return Flags;
193362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
194362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
195cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesstatic const Comdat *getELFComdat(const GlobalValue *GV) {
196cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const Comdat *C = GV->getComdat();
197cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if (!C)
198cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return nullptr;
199cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
200cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if (C->getSelectionKind() != Comdat::Any)
201cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    report_fatal_error("ELF COMDATs only support SelectionKind::Any, '" +
202cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                       C->getName() + "' cannot be lowered.");
203cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
204cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  return C;
205cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines}
206cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
20736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesconst MCSection *TargetLoweringObjectFileELF::getExplicitSectionGlobal(
20836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    const GlobalValue *GV, SectionKind Kind, Mangler &Mang,
20936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    const TargetMachine &TM) const {
210362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  StringRef SectionName = GV->getSection();
211362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
212362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Infer section flags from the section name if we can.
213362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  Kind = getELFKindForNamedSection(SectionName, Kind);
214362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
215cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  StringRef Group = "";
216cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  unsigned Flags = getELFSectionFlags(Kind);
217cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if (const Comdat *C = getELFComdat(GV)) {
218cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    Group = C->getName();
219cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    Flags |= ELF::SHF_GROUP;
220cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
221287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner  return getContext().getELFSection(SectionName,
222cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                    getELFSectionType(SectionName, Kind), Flags,
223cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                    Kind, /*EntrySize=*/0, Group);
224362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
225362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
22643ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner/// getSectionPrefixForGlobal - Return the section prefix name used by options
22743ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner/// FunctionsSections and DataSections.
228cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesstatic StringRef getSectionPrefixForGlobal(SectionKind Kind) {
22943ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner  if (Kind.isText())                 return ".text.";
23043ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner  if (Kind.isReadOnly())             return ".rodata.";
2311d2d5a0227d6f1381f3ffa9c331045bdfa409ee8Anton Korobeynikov  if (Kind.isBSS())                  return ".bss.";
23243ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner
23343ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner  if (Kind.isThreadData())           return ".tdata.";
23443ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner  if (Kind.isThreadBSS())            return ".tbss.";
23543ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner
23643ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner  if (Kind.isDataNoRel())            return ".data.";
23743ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner  if (Kind.isDataRelLocal())         return ".data.rel.local.";
23843ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner  if (Kind.isDataRel())              return ".data.rel.";
23943ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner  if (Kind.isReadOnlyWithRelLocal()) return ".data.rel.ro.local.";
24043ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner
24143ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner  assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
24243ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner  return ".data.rel.ro.";
24343ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner}
24443ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner
245362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileELF::
246362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
24736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                       Mangler &Mang, const TargetMachine &TM) const {
24843ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner  // If we have -ffunction-section or -fdata-section then we should emit the
24943ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner  // global value to a uniqued section specifically for it.
25043ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner  bool EmitUniquedSection;
25143ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner  if (Kind.isText())
25243ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner    EmitUniquedSection = TM.getFunctionSections();
253579d7a3dccaf3c2e91ee81c026c47a0850803820Michael J. Spencer  else
25443ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner    EmitUniquedSection = TM.getDataSections();
255362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
256362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // If this global is linkonce/weak and the target handles this by emitting it
257362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // into a 'uniqued' section name, create and return the section now.
258cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if ((GV->isWeakForLinker() || EmitUniquedSection || GV->hasComdat()) &&
2591d2d5a0227d6f1381f3ffa9c331045bdfa409ee8Anton Korobeynikov      !Kind.isCommon()) {
260cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    StringRef Prefix = getSectionPrefixForGlobal(Kind);
26143ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner
262cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    SmallString<128> Name(Prefix);
26336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    TM.getNameWithPrefix(Name, GV, Mang, true);
26436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
2655d618ef7f1ad005fc6912f3e9a08c044b082e47fRafael Espindola    StringRef Group = "";
2665d618ef7f1ad005fc6912f3e9a08c044b082e47fRafael Espindola    unsigned Flags = getELFSectionFlags(Kind);
267cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    if (GV->isWeakForLinker() || GV->hasComdat()) {
268cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      if (const Comdat *C = getELFComdat(GV))
269cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        Group = C->getName();
270cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      else
271cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        Group = Name.substr(Prefix.size());
2725d618ef7f1ad005fc6912f3e9a08c044b082e47fRafael Espindola      Flags |= ELF::SHF_GROUP;
2735d618ef7f1ad005fc6912f3e9a08c044b082e47fRafael Espindola    }
2745d618ef7f1ad005fc6912f3e9a08c044b082e47fRafael Espindola
275287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner    return getContext().getELFSection(Name.str(),
276287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                                      getELFSectionType(Name.str(), Kind),
2775d618ef7f1ad005fc6912f3e9a08c044b082e47fRafael Espindola                                      Flags, Kind, 0, Group);
278362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
279362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
280362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isText()) return TextSection;
281362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
282362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isMergeable1ByteCString() ||
283362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Kind.isMergeable2ByteCString() ||
284362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Kind.isMergeable4ByteCString()) {
285362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
286362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    // We also need alignment here.
287362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    // FIXME: this is getting the alignment of the character, not the
288362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    // alignment of the global!
289362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    unsigned Align =
2903574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow      TM.getDataLayout()->getPreferredAlignment(cast<GlobalVariable>(GV));
291362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
292362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    const char *SizeSpec = ".rodata.str1.";
293362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    if (Kind.isMergeable2ByteCString())
294362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      SizeSpec = ".rodata.str2.";
295362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    else if (Kind.isMergeable4ByteCString())
296362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      SizeSpec = ".rodata.str4.";
297362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    else
298362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      assert(Kind.isMergeable1ByteCString() && "unknown string width");
299362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
300362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
301362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    std::string Name = SizeSpec + utostr(Align);
302c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola    return getContext().getELFSection(Name, ELF::SHT_PROGBITS,
3031c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola                                      ELF::SHF_ALLOC |
3041c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola                                      ELF::SHF_MERGE |
3051c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola                                      ELF::SHF_STRINGS,
306287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                                      Kind);
307362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
308362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
309362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isMergeableConst()) {
310362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    if (Kind.isMergeableConst4() && MergeableConst4Section)
311362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      return MergeableConst4Section;
312362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    if (Kind.isMergeableConst8() && MergeableConst8Section)
313362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      return MergeableConst8Section;
314362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    if (Kind.isMergeableConst16() && MergeableConst16Section)
315362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      return MergeableConst16Section;
316362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return ReadOnlySection;  // .const
317362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
318362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
319362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isReadOnly())             return ReadOnlySection;
320362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
321362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isThreadData())           return TLSDataSection;
322362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isThreadBSS())            return TLSBSSSection;
323362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
324362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Note: we claim that common symbols are put in BSSSection, but they are
325362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // really emitted with the magic .comm directive, which creates a symbol table
326362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // entry but not a section.
327362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isBSS() || Kind.isCommon()) return BSSSection;
328362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
329362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isDataNoRel())            return DataSection;
330362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isDataRelLocal())         return DataRelLocalSection;
331362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isDataRel())              return DataRelSection;
332362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection;
333362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
334362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
335362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return DataRelROSection;
336362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
337362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
338362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov/// getSectionForConstant - Given a mergeable constant with the
339362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov/// specified size and relocation information, return a section that it
340362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov/// should be placed in.
341362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileELF::
342362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetSectionForConstant(SectionKind Kind) const {
343362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isMergeableConst4() && MergeableConst4Section)
344362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return MergeableConst4Section;
345362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isMergeableConst8() && MergeableConst8Section)
346362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return MergeableConst8Section;
347362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isMergeableConst16() && MergeableConst16Section)
348362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return MergeableConst16Section;
349362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isReadOnly())
350362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return ReadOnlySection;
351362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
352362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection;
353362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
354362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return DataRelROSection;
355362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
356362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
357dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesconst MCSection *TargetLoweringObjectFileELF::getStaticCtorSection(
358cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    unsigned Priority, const MCSymbol *KeySym) const {
3594a99f59aef358fb93eac180e49f6dcef03822046Anton Korobeynikov  // The default scheme is .ctor / .dtor, so we have to invert the priority
3604a99f59aef358fb93eac180e49f6dcef03822046Anton Korobeynikov  // numbering.
3614a99f59aef358fb93eac180e49f6dcef03822046Anton Korobeynikov  if (Priority == 65535)
3624a99f59aef358fb93eac180e49f6dcef03822046Anton Korobeynikov    return StaticCtorSection;
3634a99f59aef358fb93eac180e49f6dcef03822046Anton Korobeynikov
364d6b43a317e71246380db55a50b799b062b53cdceRafael Espindola  if (UseInitArray) {
365d6b43a317e71246380db55a50b799b062b53cdceRafael Espindola    std::string Name = std::string(".init_array.") + utostr(Priority);
366d6b43a317e71246380db55a50b799b062b53cdceRafael Espindola    return getContext().getELFSection(Name, ELF::SHT_INIT_ARRAY,
367d6b43a317e71246380db55a50b799b062b53cdceRafael Espindola                                      ELF::SHF_ALLOC | ELF::SHF_WRITE,
368d6b43a317e71246380db55a50b799b062b53cdceRafael Espindola                                      SectionKind::getDataRel());
369d6b43a317e71246380db55a50b799b062b53cdceRafael Espindola  } else {
370d6b43a317e71246380db55a50b799b062b53cdceRafael Espindola    std::string Name = std::string(".ctors.") + utostr(65535 - Priority);
371d6b43a317e71246380db55a50b799b062b53cdceRafael Espindola    return getContext().getELFSection(Name, ELF::SHT_PROGBITS,
372d6b43a317e71246380db55a50b799b062b53cdceRafael Espindola                                      ELF::SHF_ALLOC |ELF::SHF_WRITE,
373d6b43a317e71246380db55a50b799b062b53cdceRafael Espindola                                      SectionKind::getDataRel());
374d6b43a317e71246380db55a50b799b062b53cdceRafael Espindola  }
3754a99f59aef358fb93eac180e49f6dcef03822046Anton Korobeynikov}
3764a99f59aef358fb93eac180e49f6dcef03822046Anton Korobeynikov
377dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesconst MCSection *TargetLoweringObjectFileELF::getStaticDtorSection(
378cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    unsigned Priority, const MCSymbol *KeySym) const {
3794a99f59aef358fb93eac180e49f6dcef03822046Anton Korobeynikov  // The default scheme is .ctor / .dtor, so we have to invert the priority
3804a99f59aef358fb93eac180e49f6dcef03822046Anton Korobeynikov  // numbering.
3814a99f59aef358fb93eac180e49f6dcef03822046Anton Korobeynikov  if (Priority == 65535)
3824a99f59aef358fb93eac180e49f6dcef03822046Anton Korobeynikov    return StaticDtorSection;
3834a99f59aef358fb93eac180e49f6dcef03822046Anton Korobeynikov
384d6b43a317e71246380db55a50b799b062b53cdceRafael Espindola  if (UseInitArray) {
385d6b43a317e71246380db55a50b799b062b53cdceRafael Espindola    std::string Name = std::string(".fini_array.") + utostr(Priority);
386d6b43a317e71246380db55a50b799b062b53cdceRafael Espindola    return getContext().getELFSection(Name, ELF::SHT_FINI_ARRAY,
387d6b43a317e71246380db55a50b799b062b53cdceRafael Espindola                                      ELF::SHF_ALLOC | ELF::SHF_WRITE,
388d6b43a317e71246380db55a50b799b062b53cdceRafael Espindola                                      SectionKind::getDataRel());
389d6b43a317e71246380db55a50b799b062b53cdceRafael Espindola  } else {
390d6b43a317e71246380db55a50b799b062b53cdceRafael Espindola    std::string Name = std::string(".dtors.") + utostr(65535 - Priority);
391d6b43a317e71246380db55a50b799b062b53cdceRafael Espindola    return getContext().getELFSection(Name, ELF::SHT_PROGBITS,
392d6b43a317e71246380db55a50b799b062b53cdceRafael Espindola                                      ELF::SHF_ALLOC |ELF::SHF_WRITE,
393d6b43a317e71246380db55a50b799b062b53cdceRafael Espindola                                      SectionKind::getDataRel());
394d6b43a317e71246380db55a50b799b062b53cdceRafael Espindola  }
395d6b43a317e71246380db55a50b799b062b53cdceRafael Espindola}
396d6b43a317e71246380db55a50b799b062b53cdceRafael Espindola
397d6b43a317e71246380db55a50b799b062b53cdceRafael Espindolavoid
398d6b43a317e71246380db55a50b799b062b53cdceRafael EspindolaTargetLoweringObjectFileELF::InitializeELF(bool UseInitArray_) {
399d6b43a317e71246380db55a50b799b062b53cdceRafael Espindola  UseInitArray = UseInitArray_;
400d6b43a317e71246380db55a50b799b062b53cdceRafael Espindola  if (!UseInitArray)
401d6b43a317e71246380db55a50b799b062b53cdceRafael Espindola    return;
402d6b43a317e71246380db55a50b799b062b53cdceRafael Espindola
403d6b43a317e71246380db55a50b799b062b53cdceRafael Espindola  StaticCtorSection =
404d6b43a317e71246380db55a50b799b062b53cdceRafael Espindola    getContext().getELFSection(".init_array", ELF::SHT_INIT_ARRAY,
405d6b43a317e71246380db55a50b799b062b53cdceRafael Espindola                               ELF::SHF_WRITE |
406d6b43a317e71246380db55a50b799b062b53cdceRafael Espindola                               ELF::SHF_ALLOC,
407d6b43a317e71246380db55a50b799b062b53cdceRafael Espindola                               SectionKind::getDataRel());
408d6b43a317e71246380db55a50b799b062b53cdceRafael Espindola  StaticDtorSection =
409d6b43a317e71246380db55a50b799b062b53cdceRafael Espindola    getContext().getELFSection(".fini_array", ELF::SHT_FINI_ARRAY,
410d6b43a317e71246380db55a50b799b062b53cdceRafael Espindola                               ELF::SHF_WRITE |
411d6b43a317e71246380db55a50b799b062b53cdceRafael Espindola                               ELF::SHF_ALLOC,
412d6b43a317e71246380db55a50b799b062b53cdceRafael Espindola                               SectionKind::getDataRel());
4134a99f59aef358fb93eac180e49f6dcef03822046Anton Korobeynikov}
4144a99f59aef358fb93eac180e49f6dcef03822046Anton Korobeynikov
415362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===//
416362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//                                 MachO
417362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===//
418362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
41936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// getDepLibFromLinkerOpt - Extract the dependent library name from a linker
42036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// option string. Returns StringRef() if the option does not specify a library.
42136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesStringRef TargetLoweringObjectFileMachO::
42236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesgetDepLibFromLinkerOpt(StringRef LinkerOption) const {
42336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  const char *LibCmd = "-l";
42436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (LinkerOption.startswith(LibCmd))
42536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return LinkerOption.substr(strlen(LibCmd));
42636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return StringRef();
42736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
42836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
4296d49b680be6e24b547e6910c2b64914913915084Daniel Dunbar/// emitModuleFlags - Perform code emission for module flags.
430b464d3ff72790260e8c2068afe856fd7299a6834Bill Wendlingvoid TargetLoweringObjectFileMachO::
431057d521e3d91a894f6c38fcbc21ee5950fbdf7b1Bill WendlingemitModuleFlags(MCStreamer &Streamer,
432057d521e3d91a894f6c38fcbc21ee5950fbdf7b1Bill Wendling                ArrayRef<Module::ModuleFlagEntry> ModuleFlags,
43336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                Mangler &Mang, const TargetMachine &TM) const {
434b464d3ff72790260e8c2068afe856fd7299a6834Bill Wendling  unsigned VersionVal = 0;
435adb082cd6ae2ec799838cd84d54a381bca175cd4Bill Wendling  unsigned ImageInfoFlags = 0;
436dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  MDNode *LinkerOptions = nullptr;
437057d521e3d91a894f6c38fcbc21ee5950fbdf7b1Bill Wendling  StringRef SectionVal;
438b464d3ff72790260e8c2068afe856fd7299a6834Bill Wendling
439057d521e3d91a894f6c38fcbc21ee5950fbdf7b1Bill Wendling  for (ArrayRef<Module::ModuleFlagEntry>::iterator
440057d521e3d91a894f6c38fcbc21ee5950fbdf7b1Bill Wendling         i = ModuleFlags.begin(), e = ModuleFlags.end(); i != e; ++i) {
441057d521e3d91a894f6c38fcbc21ee5950fbdf7b1Bill Wendling    const Module::ModuleFlagEntry &MFE = *i;
442b464d3ff72790260e8c2068afe856fd7299a6834Bill Wendling
443b464d3ff72790260e8c2068afe856fd7299a6834Bill Wendling    // Ignore flags with 'Require' behavior.
444057d521e3d91a894f6c38fcbc21ee5950fbdf7b1Bill Wendling    if (MFE.Behavior == Module::Require)
445b464d3ff72790260e8c2068afe856fd7299a6834Bill Wendling      continue;
446b464d3ff72790260e8c2068afe856fd7299a6834Bill Wendling
447057d521e3d91a894f6c38fcbc21ee5950fbdf7b1Bill Wendling    StringRef Key = MFE.Key->getString();
448057d521e3d91a894f6c38fcbc21ee5950fbdf7b1Bill Wendling    Value *Val = MFE.Val;
449b464d3ff72790260e8c2068afe856fd7299a6834Bill Wendling
4506d49b680be6e24b547e6910c2b64914913915084Daniel Dunbar    if (Key == "Objective-C Image Info Version") {
451b464d3ff72790260e8c2068afe856fd7299a6834Bill Wendling      VersionVal = cast<ConstantInt>(Val)->getZExtValue();
4526d49b680be6e24b547e6910c2b64914913915084Daniel Dunbar    } else if (Key == "Objective-C Garbage Collection" ||
4536d49b680be6e24b547e6910c2b64914913915084Daniel Dunbar               Key == "Objective-C GC Only" ||
4546d49b680be6e24b547e6910c2b64914913915084Daniel Dunbar               Key == "Objective-C Is Simulated") {
455adb082cd6ae2ec799838cd84d54a381bca175cd4Bill Wendling      ImageInfoFlags |= cast<ConstantInt>(Val)->getZExtValue();
4566d49b680be6e24b547e6910c2b64914913915084Daniel Dunbar    } else if (Key == "Objective-C Image Info Section") {
457057d521e3d91a894f6c38fcbc21ee5950fbdf7b1Bill Wendling      SectionVal = cast<MDString>(Val)->getString();
4586d49b680be6e24b547e6910c2b64914913915084Daniel Dunbar    } else if (Key == "Linker Options") {
4596d49b680be6e24b547e6910c2b64914913915084Daniel Dunbar      LinkerOptions = cast<MDNode>(Val);
4606d49b680be6e24b547e6910c2b64914913915084Daniel Dunbar    }
4616d49b680be6e24b547e6910c2b64914913915084Daniel Dunbar  }
4626d49b680be6e24b547e6910c2b64914913915084Daniel Dunbar
4636d49b680be6e24b547e6910c2b64914913915084Daniel Dunbar  // Emit the linker options if present.
4646d49b680be6e24b547e6910c2b64914913915084Daniel Dunbar  if (LinkerOptions) {
4656d49b680be6e24b547e6910c2b64914913915084Daniel Dunbar    for (unsigned i = 0, e = LinkerOptions->getNumOperands(); i != e; ++i) {
4666d49b680be6e24b547e6910c2b64914913915084Daniel Dunbar      MDNode *MDOptions = cast<MDNode>(LinkerOptions->getOperand(i));
4676d49b680be6e24b547e6910c2b64914913915084Daniel Dunbar      SmallVector<std::string, 4> StrOptions;
4686d49b680be6e24b547e6910c2b64914913915084Daniel Dunbar
4696d49b680be6e24b547e6910c2b64914913915084Daniel Dunbar      // Convert to strings.
4706d49b680be6e24b547e6910c2b64914913915084Daniel Dunbar      for (unsigned ii = 0, ie = MDOptions->getNumOperands(); ii != ie; ++ii) {
4716d49b680be6e24b547e6910c2b64914913915084Daniel Dunbar        MDString *MDOption = cast<MDString>(MDOptions->getOperand(ii));
4726d49b680be6e24b547e6910c2b64914913915084Daniel Dunbar        StrOptions.push_back(MDOption->getString());
4736d49b680be6e24b547e6910c2b64914913915084Daniel Dunbar      }
4746d49b680be6e24b547e6910c2b64914913915084Daniel Dunbar
4756d49b680be6e24b547e6910c2b64914913915084Daniel Dunbar      Streamer.EmitLinkerOptions(StrOptions);
4766d49b680be6e24b547e6910c2b64914913915084Daniel Dunbar    }
477b464d3ff72790260e8c2068afe856fd7299a6834Bill Wendling  }
478b464d3ff72790260e8c2068afe856fd7299a6834Bill Wendling
479057d521e3d91a894f6c38fcbc21ee5950fbdf7b1Bill Wendling  // The section is mandatory. If we don't have it, then we don't have GC info.
480057d521e3d91a894f6c38fcbc21ee5950fbdf7b1Bill Wendling  if (SectionVal.empty()) return;
481057d521e3d91a894f6c38fcbc21ee5950fbdf7b1Bill Wendling
482057d521e3d91a894f6c38fcbc21ee5950fbdf7b1Bill Wendling  StringRef Segment, Section;
483057d521e3d91a894f6c38fcbc21ee5950fbdf7b1Bill Wendling  unsigned TAA = 0, StubSize = 0;
484057d521e3d91a894f6c38fcbc21ee5950fbdf7b1Bill Wendling  bool TAAParsed;
485057d521e3d91a894f6c38fcbc21ee5950fbdf7b1Bill Wendling  std::string ErrorCode =
486057d521e3d91a894f6c38fcbc21ee5950fbdf7b1Bill Wendling    MCSectionMachO::ParseSectionSpecifier(SectionVal, Segment, Section,
487057d521e3d91a894f6c38fcbc21ee5950fbdf7b1Bill Wendling                                          TAA, TAAParsed, StubSize);
4882de3ff50439918b5a822b3d06d4d7c5826e11e6cBill Wendling  if (!ErrorCode.empty())
489057d521e3d91a894f6c38fcbc21ee5950fbdf7b1Bill Wendling    // If invalid, report the error with report_fatal_error.
4902de3ff50439918b5a822b3d06d4d7c5826e11e6cBill Wendling    report_fatal_error("Invalid section specifier '" + Section + "': " +
4912de3ff50439918b5a822b3d06d4d7c5826e11e6cBill Wendling                       ErrorCode + ".");
492b464d3ff72790260e8c2068afe856fd7299a6834Bill Wendling
493057d521e3d91a894f6c38fcbc21ee5950fbdf7b1Bill Wendling  // Get the section.
494057d521e3d91a894f6c38fcbc21ee5950fbdf7b1Bill Wendling  const MCSectionMachO *S =
495057d521e3d91a894f6c38fcbc21ee5950fbdf7b1Bill Wendling    getContext().getMachOSection(Segment, Section, TAA, StubSize,
4962de3ff50439918b5a822b3d06d4d7c5826e11e6cBill Wendling                                 SectionKind::getDataNoRel());
497057d521e3d91a894f6c38fcbc21ee5950fbdf7b1Bill Wendling  Streamer.SwitchSection(S);
498057d521e3d91a894f6c38fcbc21ee5950fbdf7b1Bill Wendling  Streamer.EmitLabel(getContext().
499057d521e3d91a894f6c38fcbc21ee5950fbdf7b1Bill Wendling                     GetOrCreateSymbol(StringRef("L_OBJC_IMAGE_INFO")));
500b464d3ff72790260e8c2068afe856fd7299a6834Bill Wendling  Streamer.EmitIntValue(VersionVal, 4);
501adb082cd6ae2ec799838cd84d54a381bca175cd4Bill Wendling  Streamer.EmitIntValue(ImageInfoFlags, 4);
502b464d3ff72790260e8c2068afe856fd7299a6834Bill Wendling  Streamer.AddBlankLine();
503b464d3ff72790260e8c2068afe856fd7299a6834Bill Wendling}
504b464d3ff72790260e8c2068afe856fd7299a6834Bill Wendling
505cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesstatic void checkMachOComdat(const GlobalValue *GV) {
506cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const Comdat *C = GV->getComdat();
507cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if (!C)
508cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return;
509cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
510cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  report_fatal_error("MachO doesn't support COMDATs, '" + C->getName() +
511cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                     "' cannot be lowered.");
512cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines}
513cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
51436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesconst MCSection *TargetLoweringObjectFileMachO::getExplicitSectionGlobal(
51536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    const GlobalValue *GV, SectionKind Kind, Mangler &Mang,
51636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    const TargetMachine &TM) const {
517362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Parse the section specifier and create it if valid.
518362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  StringRef Segment, Section;
51965c8bca78854712ab2bf135c2008ed455ef0c9b7Stuart Hastings  unsigned TAA = 0, StubSize = 0;
52065c8bca78854712ab2bf135c2008ed455ef0c9b7Stuart Hastings  bool TAAParsed;
521cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
522cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  checkMachOComdat(GV);
523cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
524362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  std::string ErrorCode =
525362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    MCSectionMachO::ParseSectionSpecifier(GV->getSection(), Segment, Section,
52665c8bca78854712ab2bf135c2008ed455ef0c9b7Stuart Hastings                                          TAA, TAAParsed, StubSize);
527362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (!ErrorCode.empty()) {
52875361b69f3f327842b9dad69fa7f28ae3b688412Chris Lattner    // If invalid, report the error with report_fatal_error.
529a7b0cb759433c715065440ee2a963a04db7f2b0bBenjamin Kramer    report_fatal_error("Global variable '" + GV->getName() +
530a7b0cb759433c715065440ee2a963a04db7f2b0bBenjamin Kramer                       "' has an invalid section specifier '" +
531a7b0cb759433c715065440ee2a963a04db7f2b0bBenjamin Kramer                       GV->getSection() + "': " + ErrorCode + ".");
532362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
533362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
534362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Get the section.
535362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  const MCSectionMachO *S =
53622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    getContext().getMachOSection(Segment, Section, TAA, StubSize, Kind);
537362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
5386ad82d81cc3061a000799ad8751f018c1301906bStuart Hastings  // If TAA wasn't set by ParseSectionSpecifier() above,
5396ad82d81cc3061a000799ad8751f018c1301906bStuart Hastings  // use the value returned by getMachOSection() as a default.
54065c8bca78854712ab2bf135c2008ed455ef0c9b7Stuart Hastings  if (!TAAParsed)
5416ad82d81cc3061a000799ad8751f018c1301906bStuart Hastings    TAA = S->getTypeAndAttributes();
5426ad82d81cc3061a000799ad8751f018c1301906bStuart Hastings
543362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Okay, now that we got the section, verify that the TAA & StubSize agree.
544362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // If the user declared multiple globals with different section flags, we need
545362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // to reject it here.
546362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (S->getTypeAndAttributes() != TAA || S->getStubSize() != StubSize) {
54775361b69f3f327842b9dad69fa7f28ae3b688412Chris Lattner    // If invalid, report the error with report_fatal_error.
548a7b0cb759433c715065440ee2a963a04db7f2b0bBenjamin Kramer    report_fatal_error("Global variable '" + GV->getName() +
549a7b0cb759433c715065440ee2a963a04db7f2b0bBenjamin Kramer                       "' section type or attributes does not match previous"
550a7b0cb759433c715065440ee2a963a04db7f2b0bBenjamin Kramer                       " section specifier");
551362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
552362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
553362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return S;
554362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
555362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
55636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesbool TargetLoweringObjectFileMachO::isSectionAtomizableBySymbols(
55736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    const MCSection &Section) const {
55836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    const MCSectionMachO &SMO = static_cast<const MCSectionMachO&>(Section);
55936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
56036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // Sections holding 1 byte strings are atomized based on the data
56136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // they contain.
56236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // Sections holding 2 byte strings require symbols in order to be
56336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // atomized.
56436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // There is no dedicated section for 4 byte strings.
56536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if (SMO.getKind().isMergeable1ByteCString())
56636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      return false;
56736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
56836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if (SMO.getSegmentName() == "__DATA" &&
56936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        SMO.getSectionName() == "__cfstring")
57036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      return false;
57136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
57236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    switch (SMO.getType()) {
57336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    default:
57436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      return true;
57536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
57636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      // These sections are atomized at the element boundaries without using
57736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      // symbols.
57836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    case MachO::S_4BYTE_LITERALS:
57936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    case MachO::S_8BYTE_LITERALS:
58036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    case MachO::S_16BYTE_LITERALS:
58136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    case MachO::S_LITERAL_POINTERS:
58236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    case MachO::S_NON_LAZY_SYMBOL_POINTERS:
58336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    case MachO::S_LAZY_SYMBOL_POINTERS:
58436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    case MachO::S_MOD_INIT_FUNC_POINTERS:
58536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    case MachO::S_MOD_TERM_FUNC_POINTERS:
58636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    case MachO::S_INTERPOSING:
58736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      return false;
58836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    }
58936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
59036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
591362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileMachO::
592362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
59336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                       Mangler &Mang, const TargetMachine &TM) const {
594cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  checkMachOComdat(GV);
595fe128c6ac8a6ae6aa85f0168f99d9c28de010fd8Bill Wendling
596fe128c6ac8a6ae6aa85f0168f99d9c28de010fd8Bill Wendling  // Handle thread local data.
597fe128c6ac8a6ae6aa85f0168f99d9c28de010fd8Bill Wendling  if (Kind.isThreadBSS()) return TLSBSSSection;
598fe128c6ac8a6ae6aa85f0168f99d9c28de010fd8Bill Wendling  if (Kind.isThreadData()) return TLSDataSection;
599fe128c6ac8a6ae6aa85f0168f99d9c28de010fd8Bill Wendling
600362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isText())
6019b19dfc2e003e33892be2d80ad535d18f24c53d9Arnold Schwaighofer    return GV->isWeakForLinker() ? TextCoalSection : TextSection;
6029b19dfc2e003e33892be2d80ad535d18f24c53d9Arnold Schwaighofer
6039b19dfc2e003e33892be2d80ad535d18f24c53d9Arnold Schwaighofer  // If this is weak/linkonce, put this in a coalescable section, either in text
6049b19dfc2e003e33892be2d80ad535d18f24c53d9Arnold Schwaighofer  // or data depending on if it is writable.
605362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (GV->isWeakForLinker()) {
606362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    if (Kind.isReadOnly())
6079b19dfc2e003e33892be2d80ad535d18f24c53d9Arnold Schwaighofer      return ConstTextCoalSection;
6089b19dfc2e003e33892be2d80ad535d18f24c53d9Arnold Schwaighofer    return DataCoalSection;
609362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
610362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
611362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // FIXME: Alignment check should be handled by section classifier.
61298f15d27cda62ca2f973da0244b6b5e15f18acb7Chris Lattner  if (Kind.isMergeable1ByteCString() &&
6133574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow      TM.getDataLayout()->getPreferredAlignment(cast<GlobalVariable>(GV)) < 32)
61498f15d27cda62ca2f973da0244b6b5e15f18acb7Chris Lattner    return CStringSection;
615579d7a3dccaf3c2e91ee81c026c47a0850803820Michael J. Spencer
61698f15d27cda62ca2f973da0244b6b5e15f18acb7Chris Lattner  // Do not put 16-bit arrays in the UString section if they have an
61798f15d27cda62ca2f973da0244b6b5e15f18acb7Chris Lattner  // externally visible label, this runs into issues with certain linker
61898f15d27cda62ca2f973da0244b6b5e15f18acb7Chris Lattner  // versions.
61998f15d27cda62ca2f973da0244b6b5e15f18acb7Chris Lattner  if (Kind.isMergeable2ByteCString() && !GV->hasExternalLinkage() &&
6203574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow      TM.getDataLayout()->getPreferredAlignment(cast<GlobalVariable>(GV)) < 32)
62198f15d27cda62ca2f973da0244b6b5e15f18acb7Chris Lattner    return UStringSection;
622362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
623362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isMergeableConst()) {
624362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    if (Kind.isMergeableConst4())
625362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      return FourByteConstantSection;
626362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    if (Kind.isMergeableConst8())
627362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      return EightByteConstantSection;
62836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if (Kind.isMergeableConst16())
629362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      return SixteenByteConstantSection;
630362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
631362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
632362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Otherwise, if it is readonly, but not something we can specially optimize,
633362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // just drop it in .const.
634362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isReadOnly())
635362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return ReadOnlySection;
636362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
637362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // If this is marked const, put it into a const section.  But if the dynamic
638362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // linker needs to write to it, put it in the data segment.
639362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isReadOnlyWithRel())
640362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return ConstDataSection;
641362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
642362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Put zero initialized globals with strong external linkage in the
643362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // DATA, __common section with the .zerofill directive.
644362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isBSSExtern())
645362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return DataCommonSection;
646362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
647362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Put zero initialized globals with local linkage in __DATA,__bss directive
648362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // with the .zerofill directive (aka .lcomm).
649362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isBSSLocal())
650362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return DataBSSSection;
651579d7a3dccaf3c2e91ee81c026c47a0850803820Michael J. Spencer
652362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Otherwise, just drop the variable in the normal data section.
653362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return DataSection;
654362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
655362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
656362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *
657362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovTargetLoweringObjectFileMachO::getSectionForConstant(SectionKind Kind) const {
658362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // If this constant requires a relocation, we have to put it in the data
659362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // segment, not in the text segment.
660362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isDataRel() || Kind.isReadOnlyWithRel())
661362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return ConstDataSection;
662362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
663362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isMergeableConst4())
664362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return FourByteConstantSection;
665362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isMergeableConst8())
666362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return EightByteConstantSection;
66736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (Kind.isMergeableConst16())
668362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return SixteenByteConstantSection;
669362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return ReadOnlySection;  // .const
670362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
671362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
67236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesconst MCExpr *TargetLoweringObjectFileMachO::getTTypeGlobalReference(
67336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    const GlobalValue *GV, unsigned Encoding, Mangler &Mang,
67436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    const TargetMachine &TM, MachineModuleInfo *MMI,
67536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    MCStreamer &Streamer) const {
676362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // The mach-o version of this method defaults to returning a stub reference.
677362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
678293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov  if (Encoding & DW_EH_PE_indirect) {
679293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov    MachineModuleInfoMachO &MachOMMI =
680293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov      MMI->getObjFileInfo<MachineModuleInfoMachO>();
681293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov
68236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    MCSymbol *SSym =
68336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        getSymbolWithGlobalValueBase(GV, "$non_lazy_ptr", Mang, TM);
684293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov
685293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov    // Add information about the stub reference to MachOMMI so that the stub
686293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov    // gets emitted by the asmprinter.
687671215464c8335e383fa2db90df2eab73ef83b10Bill Wendling    MachineModuleInfoImpl::StubValueTy &StubSym =
688671215464c8335e383fa2db90df2eab73ef83b10Bill Wendling      GV->hasHiddenVisibility() ? MachOMMI.getHiddenGVStubEntry(SSym) :
689671215464c8335e383fa2db90df2eab73ef83b10Bill Wendling                                  MachOMMI.getGVStubEntry(SSym);
690dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    if (!StubSym.getPointer()) {
69136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      MCSymbol *Sym = TM.getSymbol(GV, Mang);
6924c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner      StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
693293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov    }
694362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
695362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return TargetLoweringObjectFile::
69625efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov      getTTypeReference(MCSymbolRefExpr::Create(SSym, getContext()),
69725efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov                        Encoding & ~dwarf::DW_EH_PE_indirect, Streamer);
698362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
699362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
70036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return TargetLoweringObjectFile::getTTypeGlobalReference(GV, Encoding, Mang,
70136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                                           TM, MMI, Streamer);
702362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
703362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
70436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesMCSymbol *TargetLoweringObjectFileMachO::getCFIPersonalitySymbol(
70536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    const GlobalValue *GV, Mangler &Mang, const TargetMachine &TM,
70636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    MachineModuleInfo *MMI) const {
7077afec9cc0ff1654619d30b6f30e2a4d13369c8bfRafael Espindola  // The mach-o version of this method defaults to returning a stub reference.
7087afec9cc0ff1654619d30b6f30e2a4d13369c8bfRafael Espindola  MachineModuleInfoMachO &MachOMMI =
7097afec9cc0ff1654619d30b6f30e2a4d13369c8bfRafael Espindola    MMI->getObjFileInfo<MachineModuleInfoMachO>();
7107afec9cc0ff1654619d30b6f30e2a4d13369c8bfRafael Espindola
71136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  MCSymbol *SSym = getSymbolWithGlobalValueBase(GV, "$non_lazy_ptr", Mang, TM);
7127afec9cc0ff1654619d30b6f30e2a4d13369c8bfRafael Espindola
7137afec9cc0ff1654619d30b6f30e2a4d13369c8bfRafael Espindola  // Add information about the stub reference to MachOMMI so that the stub
7147afec9cc0ff1654619d30b6f30e2a4d13369c8bfRafael Espindola  // gets emitted by the asmprinter.
715d7c2494b3cba8dce914a7d16cfca11ffcd223d4eBill Wendling  MachineModuleInfoImpl::StubValueTy &StubSym = MachOMMI.getGVStubEntry(SSym);
716dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (!StubSym.getPointer()) {
71736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    MCSymbol *Sym = TM.getSymbol(GV, Mang);
7187afec9cc0ff1654619d30b6f30e2a4d13369c8bfRafael Espindola    StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
7197afec9cc0ff1654619d30b6f30e2a4d13369c8bfRafael Espindola  }
7207afec9cc0ff1654619d30b6f30e2a4d13369c8bfRafael Espindola
7217afec9cc0ff1654619d30b6f30e2a4d13369c8bfRafael Espindola  return SSym;
7227afec9cc0ff1654619d30b6f30e2a4d13369c8bfRafael Espindola}
7237afec9cc0ff1654619d30b6f30e2a4d13369c8bfRafael Espindola
724362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===//
725362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//                                  COFF
726362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===//
727362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
728eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattnerstatic unsigned
729eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris LattnergetCOFFSectionFlags(SectionKind K) {
730eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner  unsigned Flags = 0;
731eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner
73236335be3b95f856b7eb7e0766e01ba423315e1abAnton Korobeynikov  if (K.isMetadata())
7336e5ce287b0e53c264af0ba37169ad964e19b5bb7Chris Lattner    Flags |=
73494610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar      COFF::IMAGE_SCN_MEM_DISCARDABLE;
735eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner  else if (K.isText())
736eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    Flags |=
73794610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar      COFF::IMAGE_SCN_MEM_EXECUTE |
7383931b54a5f274183f850b912e0003f9aa1600584Michael J. Spencer      COFF::IMAGE_SCN_MEM_READ |
73994610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar      COFF::IMAGE_SCN_CNT_CODE;
7406e5ce287b0e53c264af0ba37169ad964e19b5bb7Chris Lattner  else if (K.isBSS ())
7416e5ce287b0e53c264af0ba37169ad964e19b5bb7Chris Lattner    Flags |=
74294610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar      COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA |
74394610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar      COFF::IMAGE_SCN_MEM_READ |
74494610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar      COFF::IMAGE_SCN_MEM_WRITE;
745d4a19b6a72d19a6f90b676aac37118664b7b7a84Anton Korobeynikov  else if (K.isThreadLocal())
746d4a19b6a72d19a6f90b676aac37118664b7b7a84Anton Korobeynikov    Flags |=
747d4a19b6a72d19a6f90b676aac37118664b7b7a84Anton Korobeynikov      COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
748d4a19b6a72d19a6f90b676aac37118664b7b7a84Anton Korobeynikov      COFF::IMAGE_SCN_MEM_READ |
749d4a19b6a72d19a6f90b676aac37118664b7b7a84Anton Korobeynikov      COFF::IMAGE_SCN_MEM_WRITE;
750eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner  else if (K.isReadOnly())
751eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    Flags |=
75294610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar      COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
75394610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar      COFF::IMAGE_SCN_MEM_READ;
754eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner  else if (K.isWriteable())
755eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    Flags |=
75694610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar      COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
75794610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar      COFF::IMAGE_SCN_MEM_READ |
75894610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar      COFF::IMAGE_SCN_MEM_WRITE;
759eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner
760eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner  return Flags;
761362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
762362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
763cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesstatic const GlobalValue *getComdatGVForCOFF(const GlobalValue *GV) {
764cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const Comdat *C = GV->getComdat();
765cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  assert(C && "expected GV to have a Comdat!");
766cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
767cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  StringRef ComdatGVName = C->getName();
768cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  const GlobalValue *ComdatGV = GV->getParent()->getNamedValue(ComdatGVName);
769cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if (!ComdatGV)
770cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    report_fatal_error("Associative COMDAT symbol '" + ComdatGVName +
771cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                       "' does not exist.");
772cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
773cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if (ComdatGV->getComdat() != C)
774cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    report_fatal_error("Associative COMDAT symbol '" + ComdatGVName +
775cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                       "' is not a key for it's COMDAT.");
776cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
777cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  return ComdatGV;
778cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines}
779cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
780cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesstatic int getSelectionForCOFF(const GlobalValue *GV) {
781cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if (const Comdat *C = GV->getComdat()) {
782cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    const GlobalValue *ComdatKey = getComdatGVForCOFF(GV);
783cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    if (const auto *GA = dyn_cast<GlobalAlias>(ComdatKey))
784cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ComdatKey = GA->getBaseObject();
785cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    if (ComdatKey == GV) {
786cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      switch (C->getSelectionKind()) {
787cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      case Comdat::Any:
788cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        return COFF::IMAGE_COMDAT_SELECT_ANY;
789cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      case Comdat::ExactMatch:
790cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        return COFF::IMAGE_COMDAT_SELECT_EXACT_MATCH;
791cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      case Comdat::Largest:
792cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        return COFF::IMAGE_COMDAT_SELECT_LARGEST;
793cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      case Comdat::NoDuplicates:
794cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        return COFF::IMAGE_COMDAT_SELECT_NODUPLICATES;
795cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      case Comdat::SameSize:
796cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        return COFF::IMAGE_COMDAT_SELECT_SAME_SIZE;
797cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      }
798cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    } else {
799cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      return COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE;
800cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    }
801cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  } else if (GV->isWeakForLinker()) {
802cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    return COFF::IMAGE_COMDAT_SELECT_ANY;
803cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  }
804cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  return 0;
805cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines}
806cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
80736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesconst MCSection *TargetLoweringObjectFileCOFF::getExplicitSectionGlobal(
80836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    const GlobalValue *GV, SectionKind Kind, Mangler &Mang,
80936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    const TargetMachine &TM) const {
8104de5872dede6e3dd80f7ab3df5df4fe0e33e3b2eMichael J. Spencer  int Selection = 0;
8114de5872dede6e3dd80f7ab3df5df4fe0e33e3b2eMichael J. Spencer  unsigned Characteristics = getCOFFSectionFlags(Kind);
81236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  StringRef Name = GV->getSection();
81336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  StringRef COMDATSymName = "";
814cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if ((GV->isWeakForLinker() || GV->hasComdat()) && !Kind.isCommon()) {
815cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    Selection = getSelectionForCOFF(GV);
816cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    const GlobalValue *ComdatGV;
817cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    if (Selection == COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE)
818cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ComdatGV = getComdatGVForCOFF(GV);
819cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    else
820cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ComdatGV = GV;
821cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
822cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    if (!ComdatGV->hasPrivateLinkage()) {
823cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      MCSymbol *Sym = TM.getSymbol(ComdatGV, Mang);
824cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      COMDATSymName = Sym->getName();
825cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT;
826cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    } else {
827cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      Selection = 0;
828cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    }
8294de5872dede6e3dd80f7ab3df5df4fe0e33e3b2eMichael J. Spencer  }
8304de5872dede6e3dd80f7ab3df5df4fe0e33e3b2eMichael J. Spencer  return getContext().getCOFFSection(Name,
8314de5872dede6e3dd80f7ab3df5df4fe0e33e3b2eMichael J. Spencer                                     Characteristics,
83280646283796b20c6a1b7d8eb69ce6f0478d54383Nico Rieck                                     Kind,
83336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                     COMDATSymName,
83480646283796b20c6a1b7d8eb69ce6f0478d54383Nico Rieck                                     Selection);
835362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
836362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
83736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstatic const char *getCOFFSectionNameForUniqueGlobal(SectionKind Kind) {
838362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isText())
83936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return ".text";
840dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (Kind.isBSS())
84136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return ".bss";
84236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (Kind.isThreadLocal())
84336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return ".tls$";
844362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isWriteable())
84536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return ".data";
84636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return ".rdata";
847362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
848362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
849362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
850362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileCOFF::
851362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
85236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                       Mangler &Mang, const TargetMachine &TM) const {
85336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // If we have -ffunction-sections then we should emit the global value to a
85436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // uniqued section specifically for it.
85536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool EmitUniquedSection;
85636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (Kind.isText())
85736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    EmitUniquedSection = TM.getFunctionSections();
85836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  else
85936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    EmitUniquedSection = TM.getDataSections();
860362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
861362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // If this global is linkonce/weak and the target handles this by emitting it
862362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // into a 'uniqued' section name, create and return the section now.
86336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // Section names depend on the name of the symbol which is not feasible if the
86436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // symbol has private linkage.
865cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if ((GV->isWeakForLinker() || EmitUniquedSection || GV->hasComdat()) &&
866cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      !Kind.isCommon()) {
86736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    const char *Name = getCOFFSectionNameForUniqueGlobal(Kind);
8686e5ce287b0e53c264af0ba37169ad964e19b5bb7Chris Lattner    unsigned Characteristics = getCOFFSectionFlags(Kind);
8696e5ce287b0e53c264af0ba37169ad964e19b5bb7Chris Lattner
87094610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar    Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT;
871cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    int Selection = getSelectionForCOFF(GV);
872cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    if (!Selection)
873cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      Selection = COFF::IMAGE_COMDAT_SELECT_NODUPLICATES;
874cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    const GlobalValue *ComdatGV;
875cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    if (GV->hasComdat())
876cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ComdatGV = getComdatGVForCOFF(GV);
877cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    else
878cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      ComdatGV = GV;
879cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
880cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    if (!ComdatGV->hasPrivateLinkage()) {
881cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      MCSymbol *Sym = TM.getSymbol(ComdatGV, Mang);
882cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      StringRef COMDATSymName = Sym->getName();
883cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines      return getContext().getCOFFSection(Name, Characteristics, Kind,
884cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                         COMDATSymName, Selection);
885cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    }
886362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
887362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
888362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isText())
8896aa9315353574c000c5f2aa0edd34067e94b8c79David Majnemer    return TextSection;
890362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
891d4a19b6a72d19a6f90b676aac37118664b7b7a84Anton Korobeynikov  if (Kind.isThreadLocal())
8926aa9315353574c000c5f2aa0edd34067e94b8c79David Majnemer    return TLSDataSection;
893d4a19b6a72d19a6f90b676aac37118664b7b7a84Anton Korobeynikov
8946aa9315353574c000c5f2aa0edd34067e94b8c79David Majnemer  if (Kind.isReadOnly())
8959706d43b56e16eb3029314e02c499305284e99f1David Majnemer    return ReadOnlySection;
8969706d43b56e16eb3029314e02c499305284e99f1David Majnemer
897dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // Note: we claim that common symbols are put in BSSSection, but they are
898dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // really emitted with the magic .comm directive, which creates a symbol table
899dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // entry but not a section.
900dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (Kind.isBSS() || Kind.isCommon())
9016aa9315353574c000c5f2aa0edd34067e94b8c79David Majnemer    return BSSSection;
9026aa9315353574c000c5f2aa0edd34067e94b8c79David Majnemer
9036aa9315353574c000c5f2aa0edd34067e94b8c79David Majnemer  return DataSection;
904362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
905362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
90636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesStringRef TargetLoweringObjectFileCOFF::
90736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesgetDepLibFromLinkerOpt(StringRef LinkerOption) const {
90836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  const char *LibCmd = "/DEFAULTLIB:";
90936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (LinkerOption.startswith(LibCmd))
91036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return LinkerOption.substr(strlen(LibCmd));
91136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return StringRef();
91236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
91336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
9144b5581530393e647d559360f8c6f229c05aca94fReid Klecknervoid TargetLoweringObjectFileCOFF::
9154b5581530393e647d559360f8c6f229c05aca94fReid KleckneremitModuleFlags(MCStreamer &Streamer,
9164b5581530393e647d559360f8c6f229c05aca94fReid Kleckner                ArrayRef<Module::ModuleFlagEntry> ModuleFlags,
91736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                Mangler &Mang, const TargetMachine &TM) const {
918dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  MDNode *LinkerOptions = nullptr;
9194b5581530393e647d559360f8c6f229c05aca94fReid Kleckner
9204b5581530393e647d559360f8c6f229c05aca94fReid Kleckner  // Look for the "Linker Options" flag, since it's the only one we support.
9214b5581530393e647d559360f8c6f229c05aca94fReid Kleckner  for (ArrayRef<Module::ModuleFlagEntry>::iterator
9224b5581530393e647d559360f8c6f229c05aca94fReid Kleckner       i = ModuleFlags.begin(), e = ModuleFlags.end(); i != e; ++i) {
9234b5581530393e647d559360f8c6f229c05aca94fReid Kleckner    const Module::ModuleFlagEntry &MFE = *i;
9244b5581530393e647d559360f8c6f229c05aca94fReid Kleckner    StringRef Key = MFE.Key->getString();
9254b5581530393e647d559360f8c6f229c05aca94fReid Kleckner    Value *Val = MFE.Val;
9264b5581530393e647d559360f8c6f229c05aca94fReid Kleckner    if (Key == "Linker Options") {
9274b5581530393e647d559360f8c6f229c05aca94fReid Kleckner      LinkerOptions = cast<MDNode>(Val);
9284b5581530393e647d559360f8c6f229c05aca94fReid Kleckner      break;
9294b5581530393e647d559360f8c6f229c05aca94fReid Kleckner    }
9304b5581530393e647d559360f8c6f229c05aca94fReid Kleckner  }
9314b5581530393e647d559360f8c6f229c05aca94fReid Kleckner  if (!LinkerOptions)
9324b5581530393e647d559360f8c6f229c05aca94fReid Kleckner    return;
9334b5581530393e647d559360f8c6f229c05aca94fReid Kleckner
9344b5581530393e647d559360f8c6f229c05aca94fReid Kleckner  // Emit the linker options to the linker .drectve section.  According to the
9354b5581530393e647d559360f8c6f229c05aca94fReid Kleckner  // spec, this section is a space-separated string containing flags for linker.
9364b5581530393e647d559360f8c6f229c05aca94fReid Kleckner  const MCSection *Sec = getDrectveSection();
9374b5581530393e647d559360f8c6f229c05aca94fReid Kleckner  Streamer.SwitchSection(Sec);
9384b5581530393e647d559360f8c6f229c05aca94fReid Kleckner  for (unsigned i = 0, e = LinkerOptions->getNumOperands(); i != e; ++i) {
9394b5581530393e647d559360f8c6f229c05aca94fReid Kleckner    MDNode *MDOptions = cast<MDNode>(LinkerOptions->getOperand(i));
9404b5581530393e647d559360f8c6f229c05aca94fReid Kleckner    for (unsigned ii = 0, ie = MDOptions->getNumOperands(); ii != ie; ++ii) {
9414b5581530393e647d559360f8c6f229c05aca94fReid Kleckner      MDString *MDOption = cast<MDString>(MDOptions->getOperand(ii));
9424b5581530393e647d559360f8c6f229c05aca94fReid Kleckner      StringRef Op = MDOption->getString();
9434b5581530393e647d559360f8c6f229c05aca94fReid Kleckner      // Lead with a space for consistency with our dllexport implementation.
9444b5581530393e647d559360f8c6f229c05aca94fReid Kleckner      std::string Escaped(" ");
9454b5581530393e647d559360f8c6f229c05aca94fReid Kleckner      if (Op.find(" ") != StringRef::npos) {
9464b5581530393e647d559360f8c6f229c05aca94fReid Kleckner        // The PE-COFF spec says args with spaces must be quoted.  It doesn't say
9474b5581530393e647d559360f8c6f229c05aca94fReid Kleckner        // how to escape quotes, but it probably uses this algorithm:
9484b5581530393e647d559360f8c6f229c05aca94fReid Kleckner        // http://msdn.microsoft.com/en-us/library/17w5ykft(v=vs.85).aspx
9494b5581530393e647d559360f8c6f229c05aca94fReid Kleckner        // FIXME: Reuse escaping code from Support/Windows/Program.inc
9504b5581530393e647d559360f8c6f229c05aca94fReid Kleckner        Escaped.push_back('\"');
9514b5581530393e647d559360f8c6f229c05aca94fReid Kleckner        Escaped.append(Op);
9524b5581530393e647d559360f8c6f229c05aca94fReid Kleckner        Escaped.push_back('\"');
9534b5581530393e647d559360f8c6f229c05aca94fReid Kleckner      } else {
9544b5581530393e647d559360f8c6f229c05aca94fReid Kleckner        Escaped.append(Op);
9554b5581530393e647d559360f8c6f229c05aca94fReid Kleckner      }
9564b5581530393e647d559360f8c6f229c05aca94fReid Kleckner      Streamer.EmitBytes(Escaped);
9574b5581530393e647d559360f8c6f229c05aca94fReid Kleckner    }
9584b5581530393e647d559360f8c6f229c05aca94fReid Kleckner  }
9594b5581530393e647d559360f8c6f229c05aca94fReid Kleckner}
960dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
961dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesstatic const MCSection *getAssociativeCOFFSection(MCContext &Ctx,
962dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                                  const MCSection *Sec,
963cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                                  const MCSymbol *KeySym) {
964dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // Return the normal section if we don't have to be associative.
965dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (!KeySym)
966dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return Sec;
967dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
968dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // Make an associative section with the same name and kind as the normal
969dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // section.
970dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  const MCSectionCOFF *SecCOFF = cast<MCSectionCOFF>(Sec);
971dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  unsigned Characteristics =
972dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      SecCOFF->getCharacteristics() | COFF::IMAGE_SCN_LNK_COMDAT;
973dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return Ctx.getCOFFSection(SecCOFF->getSectionName(), Characteristics,
974dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                            SecCOFF->getKind(), KeySym->getName(),
975cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                            COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE);
976dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
977dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
978dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesconst MCSection *TargetLoweringObjectFileCOFF::getStaticCtorSection(
979cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    unsigned Priority, const MCSymbol *KeySym) const {
980cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  return getAssociativeCOFFSection(getContext(), StaticCtorSection, KeySym);
981dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
982dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
983dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesconst MCSection *TargetLoweringObjectFileCOFF::getStaticDtorSection(
984cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    unsigned Priority, const MCSymbol *KeySym) const {
985cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  return getAssociativeCOFFSection(getContext(), StaticDtorSection, KeySym);
986dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
987