TargetLoweringObjectFileImpl.cpp revision 3574eca1b02600bac4e625297f4ecf745f4c4f32
18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt//===-- llvm/CodeGen/TargetLoweringObjectFileImpl.cpp - Object File Info --===//
28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt//
38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt//                     The LLVM Compiler Infrastructure
48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt//
5c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt// This file is distributed under the University of Illinois Open Source
6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt// License. See LICENSE.TXT for details.
78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt//
88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt//===----------------------------------------------------------------------===//
98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt//
108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// This file implements classes used to handle lowerings specific to common
118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// object file formats.
128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt//
138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt//===----------------------------------------------------------------------===//
148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"
168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/Constants.h"
178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/DerivedTypes.h"
188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/Function.h"
198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/GlobalVariable.h"
208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/Module.h"
218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/CodeGen/MachineModuleInfoImpls.h"
228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/MC/MCContext.h"
238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/MC/MCExpr.h"
248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/MC/MCSectionMachO.h"
258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/MC/MCSectionELF.h"
268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/MC/MCSectionCOFF.h"
278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/MC/MCStreamer.h"
288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/MC/MCSymbol.h"
298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/Target/Mangler.h"
308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/DataLayout.h"
318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/Target/TargetMachine.h"
328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/Target/TargetOptions.h"
338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/Support/Dwarf.h"
348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/Support/ELF.h"
358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/Support/ErrorHandling.h"
368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/Support/raw_ostream.h"
378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/ADT/SmallString.h"
388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/ADT/StringExtras.h"
398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/ADT/Triple.h"
408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtusing namespace llvm;
418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtusing namespace dwarf;
428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt//===----------------------------------------------------------------------===//
448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt//                                  ELF
458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt//===----------------------------------------------------------------------===//
468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
478d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtMCSymbol *
488d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtTargetLoweringObjectFileELF::getCFIPersonalitySymbol(const GlobalValue *GV,
498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt                                                     Mangler *Mang,
508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt                                                MachineModuleInfo *MMI) const {
518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  unsigned Encoding = getPersonalityEncoding();
528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  switch (Encoding & 0x70) {
538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  default:
548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    report_fatal_error("We do not support this DWARF encoding yet!");
558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  case dwarf::DW_EH_PE_absptr:
568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    return  Mang->getSymbol(GV);
578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  case dwarf::DW_EH_PE_pcrel: {
588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    return getContext().GetOrCreateSymbol(StringRef("DW.ref.") +
598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt                                          Mang->getSymbol(GV)->getName());
608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid TargetLoweringObjectFileELF::emitPersonalityValue(MCStreamer &Streamer,
658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt                                                       const TargetMachine &TM,
668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt                                                       const MCSymbol *Sym) const {
678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  SmallString<64> NameData("DW.ref.");
688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  NameData += Sym->getName();
698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  MCSymbol *Label = getContext().GetOrCreateSymbol(NameData);
708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Streamer.EmitSymbolAttribute(Label, MCSA_Hidden);
718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Streamer.EmitSymbolAttribute(Label, MCSA_Weak);
728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  StringRef Prefix = ".data.";
738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  NameData.insert(NameData.begin(), Prefix.begin(), Prefix.end());
748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  unsigned Flags = ELF::SHF_ALLOC | ELF::SHF_WRITE | ELF::SHF_GROUP;
758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  const MCSection *Sec = getContext().getELFSection(NameData,
768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt                                                    ELF::SHT_PROGBITS,
778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt                                                    Flags,
788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt                                                    SectionKind::getDataRel(),
798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt                                                    0, Label->getName());
808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  unsigned Size = TM.getDataLayout()->getPointerSize();
818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Streamer.SwitchSection(Sec);
828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Streamer.EmitValueToAlignment(TM.getDataLayout()->getPointerABIAlignment());
838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Streamer.EmitSymbolAttribute(Label, MCSA_ELF_TypeObject);
848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  const MCExpr *E = MCConstantExpr::Create(Size, getContext());
858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Streamer.EmitELFSize(Label, E);
868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Streamer.EmitLabel(Label);
878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Streamer.EmitSymbolValue(Sym, Size);
898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic SectionKind
928d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtgetELFKindForNamedSection(StringRef Name, SectionKind K) {
938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // N.B.: The defaults used in here are no the same ones used in MC.
948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // We follow gcc, MC follows gas. For example, given ".section .eh_frame",
958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // both gas and MC will produce a section with no flags. Given
968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // section(".eh_frame") gcc will produce:
978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  //
988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  //   .section   .eh_frame,"a",@progbits
998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (Name.empty() || Name[0] != '.') return K;
1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // Some lame default implementation based on some magic section names.
1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (Name == ".bss" ||
1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      Name.startswith(".bss.") ||
1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      Name.startswith(".gnu.linkonce.b.") ||
1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      Name.startswith(".llvm.linkonce.b.") ||
1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      Name == ".sbss" ||
1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      Name.startswith(".sbss.") ||
1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      Name.startswith(".gnu.linkonce.sb.") ||
1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      Name.startswith(".llvm.linkonce.sb."))
1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    return SectionKind::getBSS();
1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (Name == ".tdata" ||
1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      Name.startswith(".tdata.") ||
1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      Name.startswith(".gnu.linkonce.td.") ||
1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      Name.startswith(".llvm.linkonce.td."))
1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    return SectionKind::getThreadData();
1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (Name == ".tbss" ||
1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      Name.startswith(".tbss.") ||
1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      Name.startswith(".gnu.linkonce.tb.") ||
1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      Name.startswith(".llvm.linkonce.tb."))
1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    return SectionKind::getThreadBSS();
1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  return K;
1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic unsigned getELFSectionType(StringRef Name, SectionKind K) {
1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (Name == ".init_array")
1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    return ELF::SHT_INIT_ARRAY;
1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (Name == ".fini_array")
1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    return ELF::SHT_FINI_ARRAY;
1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (Name == ".preinit_array")
1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    return ELF::SHT_PREINIT_ARRAY;
1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (K.isBSS() || K.isThreadBSS())
1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    return ELF::SHT_NOBITS;
1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  return ELF::SHT_PROGBITS;
1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic unsigned
1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtgetELFSectionFlags(SectionKind K) {
1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  unsigned Flags = 0;
1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (!K.isMetadata())
1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Flags |= ELF::SHF_ALLOC;
1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (K.isText())
1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Flags |= ELF::SHF_EXECINSTR;
1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (K.isWriteable())
1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Flags |= ELF::SHF_WRITE;
1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (K.isThreadLocal())
1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Flags |= ELF::SHF_TLS;
1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // K.isMergeableConst() is left out to honour PR4650
1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (K.isMergeableCString() || K.isMergeableConst4() ||
1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      K.isMergeableConst8() || K.isMergeableConst16())
1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Flags |= ELF::SHF_MERGE;
1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (K.isMergeableCString())
1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Flags |= ELF::SHF_STRINGS;
1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  return Flags;
1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtconst MCSection *TargetLoweringObjectFileELF::
1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt                         Mangler *Mang, const TargetMachine &TM) const {
1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  StringRef SectionName = GV->getSection();
1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // Infer section flags from the section name if we can.
1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  Kind = getELFKindForNamedSection(SectionName, Kind);
1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  return getContext().getELFSection(SectionName,
1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt                                    getELFSectionType(SectionName, Kind),
1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt                                    getELFSectionFlags(Kind), Kind);
1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// getSectionPrefixForGlobal - Return the section prefix name used by options
1888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// FunctionsSections and DataSections.
1898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *getSectionPrefixForGlobal(SectionKind Kind) {
1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (Kind.isText())                 return ".text.";
1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (Kind.isReadOnly())             return ".rodata.";
1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (Kind.isBSS())                  return ".bss.";
1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (Kind.isThreadData())           return ".tdata.";
1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (Kind.isThreadBSS())            return ".tbss.";
1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (Kind.isDataNoRel())            return ".data.";
1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (Kind.isDataRelLocal())         return ".data.rel.local.";
1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (Kind.isDataRel())              return ".data.rel.";
2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (Kind.isReadOnlyWithRelLocal()) return ".data.rel.ro.local.";
2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  return ".data.rel.ro.";
2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtconst MCSection *TargetLoweringObjectFileELF::
2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt                       Mangler *Mang, const TargetMachine &TM) const {
2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // If we have -ffunction-section or -fdata-section then we should emit the
2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // global value to a uniqued section specifically for it.
2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  bool EmitUniquedSection;
2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (Kind.isText())
2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    EmitUniquedSection = TM.getFunctionSections();
2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  else
2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    EmitUniquedSection = TM.getDataSections();
2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // If this global is linkonce/weak and the target handles this by emitting it
2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // into a 'uniqued' section name, create and return the section now.
2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if ((GV->isWeakForLinker() || EmitUniquedSection) &&
2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      !Kind.isCommon()) {
2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    const char *Prefix;
2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Prefix = getSectionPrefixForGlobal(Kind);
2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    SmallString<128> Name(Prefix, Prefix+strlen(Prefix));
2268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    MCSymbol *Sym = Mang->getSymbol(GV);
2278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Name.append(Sym->getName().begin(), Sym->getName().end());
2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    StringRef Group = "";
2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    unsigned Flags = getELFSectionFlags(Kind);
2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    if (GV->isWeakForLinker()) {
2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      Group = Sym->getName();
2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      Flags |= ELF::SHF_GROUP;
2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    }
2348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    return getContext().getELFSection(Name.str(),
2368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt                                      getELFSectionType(Name.str(), Kind),
2378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt                                      Flags, Kind, 0, Group);
2388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
2398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (Kind.isText()) return TextSection;
2418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (Kind.isMergeable1ByteCString() ||
2438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      Kind.isMergeable2ByteCString() ||
2448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      Kind.isMergeable4ByteCString()) {
2458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    // We also need alignment here.
2478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    // FIXME: this is getting the alignment of the character, not the
2488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    // alignment of the global!
2498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    unsigned Align =
2508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      TM.getDataLayout()->getPreferredAlignment(cast<GlobalVariable>(GV));
2518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    const char *SizeSpec = ".rodata.str1.";
2538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    if (Kind.isMergeable2ByteCString())
2548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      SizeSpec = ".rodata.str2.";
2558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    else if (Kind.isMergeable4ByteCString())
2568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      SizeSpec = ".rodata.str4.";
2578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    else
2588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      assert(Kind.isMergeable1ByteCString() && "unknown string width");
2598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    std::string Name = SizeSpec + utostr(Align);
2628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    return getContext().getELFSection(Name, ELF::SHT_PROGBITS,
2638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt                                      ELF::SHF_ALLOC |
2648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt                                      ELF::SHF_MERGE |
2658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt                                      ELF::SHF_STRINGS,
2668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt                                      Kind);
2678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
2688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (Kind.isMergeableConst()) {
2708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    if (Kind.isMergeableConst4() && MergeableConst4Section)
2718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      return MergeableConst4Section;
2728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    if (Kind.isMergeableConst8() && MergeableConst8Section)
2738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      return MergeableConst8Section;
2748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    if (Kind.isMergeableConst16() && MergeableConst16Section)
2758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      return MergeableConst16Section;
2768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    return ReadOnlySection;  // .const
2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (Kind.isReadOnly())             return ReadOnlySection;
2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (Kind.isThreadData())           return TLSDataSection;
2828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (Kind.isThreadBSS())            return TLSBSSSection;
2838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // Note: we claim that common symbols are put in BSSSection, but they are
2858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // really emitted with the magic .comm directive, which creates a symbol table
2868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // entry but not a section.
2878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (Kind.isBSS() || Kind.isCommon()) return BSSSection;
2888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (Kind.isDataNoRel())            return DataSection;
2908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (Kind.isDataRelLocal())         return DataRelLocalSection;
2918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (Kind.isDataRel())              return DataRelSection;
2928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection;
2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
2958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  return DataRelROSection;
2968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// getSectionForConstant - Given a mergeable constant with the
2998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// specified size and relocation information, return a section that it
3008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// should be placed in.
3018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtconst MCSection *TargetLoweringObjectFileELF::
3028d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtgetSectionForConstant(SectionKind Kind) const {
3038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (Kind.isMergeableConst4() && MergeableConst4Section)
3048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    return MergeableConst4Section;
3058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (Kind.isMergeableConst8() && MergeableConst8Section)
3068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    return MergeableConst8Section;
3078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (Kind.isMergeableConst16() && MergeableConst16Section)
3088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    return MergeableConst16Section;
3098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (Kind.isReadOnly())
3108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    return ReadOnlySection;
3118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection;
3138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
3148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  return DataRelROSection;
3158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtconst MCExpr *TargetLoweringObjectFileELF::
3188d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtgetExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
3198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt                               MachineModuleInfo *MMI,
3208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt                               unsigned Encoding, MCStreamer &Streamer) const {
3218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (Encoding & dwarf::DW_EH_PE_indirect) {
3238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    MachineModuleInfoELF &ELFMMI = MMI->getObjFileInfo<MachineModuleInfoELF>();
3248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    SmallString<128> Name;
3268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Mang->getNameWithPrefix(Name, GV, true);
3278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Name += ".DW.stub";
3288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    // Add information about the stub reference to ELFMMI so that the stub
3308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    // gets emitted by the asmprinter.
3318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str());
3328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    MachineModuleInfoImpl::StubValueTy &StubSym = ELFMMI.getGVStubEntry(SSym);
3338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    if (StubSym.getPointer() == 0) {
3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      MCSymbol *Sym = Mang->getSymbol(GV);
3358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
3368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    }
3378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    return TargetLoweringObjectFile::
3398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      getExprForDwarfReference(SSym, Encoding & ~dwarf::DW_EH_PE_indirect, Streamer);
3408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
3418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  return TargetLoweringObjectFile::
3438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    getExprForDwarfGlobalReference(GV, Mang, MMI, Encoding, Streamer);
3448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtconst MCSection *
34761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry ShmidtTargetLoweringObjectFileELF::getStaticCtorSection(unsigned Priority) const {
34861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  // The default scheme is .ctor / .dtor, so we have to invert the priority
34961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  // numbering.
35061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  if (Priority == 65535)
35161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    return StaticCtorSection;
35261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
353b5d893b5dec601a58c3ce0fc9e5d6da3816ce97aDmitry Shmidt  if (UseInitArray) {
35461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    std::string Name = std::string(".init_array.") + utostr(Priority);
35561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    return getContext().getELFSection(Name, ELF::SHT_INIT_ARRAY,
35661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt                                      ELF::SHF_ALLOC | ELF::SHF_WRITE,
35761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt                                      SectionKind::getDataRel());
35861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  } else {
35961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    std::string Name = std::string(".ctors.") + utostr(65535 - Priority);
36061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    return getContext().getELFSection(Name, ELF::SHT_PROGBITS,
36161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt                                      ELF::SHF_ALLOC |ELF::SHF_WRITE,
36261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt                                      SectionKind::getDataRel());
36361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  }
36461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
36561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
36661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtconst MCSection *
36761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry ShmidtTargetLoweringObjectFileELF::getStaticDtorSection(unsigned Priority) const {
36861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  // The default scheme is .ctor / .dtor, so we have to invert the priority
36961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  // numbering.
37061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  if (Priority == 65535)
37161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    return StaticDtorSection;
37261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
37361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  if (UseInitArray) {
37461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    std::string Name = std::string(".fini_array.") + utostr(Priority);
37561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    return getContext().getELFSection(Name, ELF::SHT_FINI_ARRAY,
37661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt                                      ELF::SHF_ALLOC | ELF::SHF_WRITE,
37761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt                                      SectionKind::getDataRel());
37861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  } else {
37961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    std::string Name = std::string(".dtors.") + utostr(65535 - Priority);
38061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    return getContext().getELFSection(Name, ELF::SHT_PROGBITS,
38161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt                                      ELF::SHF_ALLOC |ELF::SHF_WRITE,
38261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt                                      SectionKind::getDataRel());
38361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  }
38461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
38561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
38661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtvoid
38761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry ShmidtTargetLoweringObjectFileELF::InitializeELF(bool UseInitArray_) {
38861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  UseInitArray = UseInitArray_;
38961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  if (!UseInitArray)
39061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    return;
39161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
39261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  StaticCtorSection =
39361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    getContext().getELFSection(".init_array", ELF::SHT_INIT_ARRAY,
39461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt                               ELF::SHF_WRITE |
39561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt                               ELF::SHF_ALLOC,
39661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt                               SectionKind::getDataRel());
39761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  StaticDtorSection =
39861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    getContext().getELFSection(".fini_array", ELF::SHT_FINI_ARRAY,
39961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt                               ELF::SHF_WRITE |
40061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt                               ELF::SHF_ALLOC,
40161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt                               SectionKind::getDataRel());
40261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
4035605286c30e1701491bd3af974ae423727750eddDmitry Shmidt
40461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt//===----------------------------------------------------------------------===//
40561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt//                                 MachO
40661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt//===----------------------------------------------------------------------===//
40761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
40861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt/// emitModuleFlags - Emit the module flags that specify the garbage collection
40961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt/// information.
41061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtvoid TargetLoweringObjectFileMachO::
41161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry ShmidtemitModuleFlags(MCStreamer &Streamer,
41261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt                ArrayRef<Module::ModuleFlagEntry> ModuleFlags,
41361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt                Mangler *Mang, const TargetMachine &TM) const {
41461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  unsigned VersionVal = 0;
41561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  unsigned ImageInfoFlags = 0;
41661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  StringRef SectionVal;
41761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
41861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  for (ArrayRef<Module::ModuleFlagEntry>::iterator
41961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt         i = ModuleFlags.begin(), e = ModuleFlags.end(); i != e; ++i) {
42061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    const Module::ModuleFlagEntry &MFE = *i;
42161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
42261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    // Ignore flags with 'Require' behavior.
42361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    if (MFE.Behavior == Module::Require)
42461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt      continue;
42561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
42661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    StringRef Key = MFE.Key->getString();
42761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    Value *Val = MFE.Val;
42861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
42961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    if (Key == "Objective-C Image Info Version")
43061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt      VersionVal = cast<ConstantInt>(Val)->getZExtValue();
43161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    else if (Key == "Objective-C Garbage Collection" ||
43261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt             Key == "Objective-C GC Only" ||
43361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt             Key == "Objective-C Is Simulated")
43461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt      ImageInfoFlags |= cast<ConstantInt>(Val)->getZExtValue();
43561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    else if (Key == "Objective-C Image Info Section")
43661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt      SectionVal = cast<MDString>(Val)->getString();
43761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  }
43861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
43961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  // The section is mandatory. If we don't have it, then we don't have GC info.
44061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  if (SectionVal.empty()) return;
44161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
44261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  StringRef Segment, Section;
44361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  unsigned TAA = 0, StubSize = 0;
44461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  bool TAAParsed;
44561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  std::string ErrorCode =
44661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    MCSectionMachO::ParseSectionSpecifier(SectionVal, Segment, Section,
44761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt                                          TAA, TAAParsed, StubSize);
44861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  if (!ErrorCode.empty())
44961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    // If invalid, report the error with report_fatal_error.
45061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    report_fatal_error("Invalid section specifier '" + Section + "': " +
45161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt                       ErrorCode + ".");
45261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
45361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  // Get the section.
45461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  const MCSectionMachO *S =
45561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    getContext().getMachOSection(Segment, Section, TAA, StubSize,
45661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt                                 SectionKind::getDataNoRel());
45761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  Streamer.SwitchSection(S);
45861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  Streamer.EmitLabel(getContext().
45961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt                     GetOrCreateSymbol(StringRef("L_OBJC_IMAGE_INFO")));
46061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  Streamer.EmitIntValue(VersionVal, 4);
46161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  Streamer.EmitIntValue(ImageInfoFlags, 4);
46261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  Streamer.AddBlankLine();
46361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
46461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
46561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtconst MCSection *TargetLoweringObjectFileMachO::
46661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry ShmidtgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
46761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt                         Mangler *Mang, const TargetMachine &TM) const {
46861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  // Parse the section specifier and create it if valid.
46961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  StringRef Segment, Section;
47061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  unsigned TAA = 0, StubSize = 0;
4715605286c30e1701491bd3af974ae423727750eddDmitry Shmidt  bool TAAParsed;
4725605286c30e1701491bd3af974ae423727750eddDmitry Shmidt  std::string ErrorCode =
47361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    MCSectionMachO::ParseSectionSpecifier(GV->getSection(), Segment, Section,
47461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt                                          TAA, TAAParsed, StubSize);
47561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  if (!ErrorCode.empty()) {
47661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    // If invalid, report the error with report_fatal_error.
47761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    report_fatal_error("Global variable '" + GV->getName() +
4788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt                       "' has an invalid section specifier '" +
4798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt                       GV->getSection() + "': " + ErrorCode + ".");
4808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
4818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // Get the section.
4838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  const MCSectionMachO *S =
4848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    getContext().getMachOSection(Segment, Section, TAA, StubSize, Kind);
4858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // If TAA wasn't set by ParseSectionSpecifier() above,
4878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // use the value returned by getMachOSection() as a default.
4888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (!TAAParsed)
4898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    TAA = S->getTypeAndAttributes();
4908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // Okay, now that we got the section, verify that the TAA & StubSize agree.
4928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // If the user declared multiple globals with different section flags, we need
4938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // to reject it here.
49461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  if (S->getTypeAndAttributes() != TAA || S->getStubSize() != StubSize) {
49561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    // If invalid, report the error with report_fatal_error.
49661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    report_fatal_error("Global variable '" + GV->getName() +
49761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt                       "' section type or attributes does not match previous"
49861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt                       " section specifier");
4998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  }
50061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
50161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  return S;
5028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtconst MCSection *TargetLoweringObjectFileMachO::
5058d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
5068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt                       Mangler *Mang, const TargetMachine &TM) const {
5078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  // Handle thread local data.
5098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  if (Kind.isThreadBSS()) return TLSBSSSection;
51061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  if (Kind.isThreadData()) return TLSDataSection;
51161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
51261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  if (Kind.isText())
51361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    return GV->isWeakForLinker() ? TextCoalSection : TextSection;
51461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
51561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  // If this is weak/linkonce, put this in a coalescable section, either in text
51661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  // or data depending on if it is writable.
51761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  if (GV->isWeakForLinker()) {
51861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    if (Kind.isReadOnly())
51961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt      return ConstTextCoalSection;
52061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    return DataCoalSection;
52161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  }
5224b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry Shmidt
52361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  // FIXME: Alignment check should be handled by section classifier.
52461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  if (Kind.isMergeable1ByteCString() &&
52561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt      TM.getDataLayout()->getPreferredAlignment(cast<GlobalVariable>(GV)) < 32)
52661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    return CStringSection;
52761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
52861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  // Do not put 16-bit arrays in the UString section if they have an
52961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  // externally visible label, this runs into issues with certain linker
53061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  // versions.
53161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  if (Kind.isMergeable2ByteCString() && !GV->hasExternalLinkage() &&
53261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt      TM.getDataLayout()->getPreferredAlignment(cast<GlobalVariable>(GV)) < 32)
53361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    return UStringSection;
53461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
5354b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry Shmidt  if (Kind.isMergeableConst()) {
53661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    if (Kind.isMergeableConst4())
53761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt      return FourByteConstantSection;
53861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    if (Kind.isMergeableConst8())
53961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt      return EightByteConstantSection;
54061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    if (Kind.isMergeableConst16() && SixteenByteConstantSection)
54161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt      return SixteenByteConstantSection;
54261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  }
54361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
54461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  // Otherwise, if it is readonly, but not something we can specially optimize,
54561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  // just drop it in .const.
54661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  if (Kind.isReadOnly())
54761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    return ReadOnlySection;
54861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
54961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  // If this is marked const, put it into a const section.  But if the dynamic
55061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  // linker needs to write to it, put it in the data segment.
55161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  if (Kind.isReadOnlyWithRel())
55261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    return ConstDataSection;
55361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
55461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  // Put zero initialized globals with strong external linkage in the
55561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  // DATA, __common section with the .zerofill directive.
55661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  if (Kind.isBSSExtern())
55761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    return DataCommonSection;
55861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
55961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  // Put zero initialized globals with local linkage in __DATA,__bss directive
56061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  // with the .zerofill directive (aka .lcomm).
56161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  if (Kind.isBSSLocal())
56261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    return DataBSSSection;
56361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
56461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  // Otherwise, just drop the variable in the normal data section.
56561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  return DataSection;
56661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
56761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
56861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtconst MCSection *
56961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry ShmidtTargetLoweringObjectFileMachO::getSectionForConstant(SectionKind Kind) const {
57061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  // If this constant requires a relocation, we have to put it in the data
57161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  // segment, not in the text segment.
57261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  if (Kind.isDataRel() || Kind.isReadOnlyWithRel())
57361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    return ConstDataSection;
57461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
57561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  if (Kind.isMergeableConst4())
57661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    return FourByteConstantSection;
57761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  if (Kind.isMergeableConst8())
57861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    return EightByteConstantSection;
57961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  if (Kind.isMergeableConst16() && SixteenByteConstantSection)
58061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    return SixteenByteConstantSection;
58168d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt  return ReadOnlySection;  // .const
58268d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt}
58368d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt
58468d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt/// shouldEmitUsedDirectiveFor - This hook allows targets to selectively decide
58568d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt/// not to emit the UsedDirective for some symbols in llvm.used.
58668d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt// FIXME: REMOVE this (rdar://7071300)
58768d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidtbool TargetLoweringObjectFileMachO::
58868d0e3ed07847339aedfac8e02f50db68c702e52Dmitry ShmidtshouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler *Mang) const {
58968d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt  /// On Darwin, internally linked data beginning with "L" or "l" does not have
59068d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt  /// the directive emitted (this occurs in ObjC metadata).
59168d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt  if (!GV) return false;
59268d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt
59368d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt  // Check whether the mangled name has the "Private" or "LinkerPrivate" prefix.
59468d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt  if (GV->hasLocalLinkage() && !isa<Function>(GV)) {
59568d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt    // FIXME: ObjC metadata is currently emitted as internal symbols that have
59661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    // \1L and \0l prefixes on them.  Fix them to be Private/LinkerPrivate and
59761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    // this horrible hack can go away.
59861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    MCSymbol *Sym = Mang->getSymbol(GV);
59961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    if (Sym->getName()[0] == 'L' || Sym->getName()[0] == 'l')
60061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt      return false;
60161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  }
60261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
60361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  return true;
60461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
60561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
60661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtconst MCExpr *TargetLoweringObjectFileMachO::
60761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry ShmidtgetExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
60861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt                               MachineModuleInfo *MMI, unsigned Encoding,
60961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt                               MCStreamer &Streamer) const {
61061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  // The mach-o version of this method defaults to returning a stub reference.
61161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
61261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt  if (Encoding & DW_EH_PE_indirect) {
61361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    MachineModuleInfoMachO &MachOMMI =
61461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt      MMI->getObjFileInfo<MachineModuleInfoMachO>();
61561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
61661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    SmallString<128> Name;
61761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    Mang->getNameWithPrefix(Name, GV, true);
61861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    Name += "$non_lazy_ptr";
61961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
62061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    // Add information about the stub reference to MachOMMI so that the stub
62161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    // gets emitted by the asmprinter.
62261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str());
62361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt    MachineModuleInfoImpl::StubValueTy &StubSym =
62461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt      GV->hasHiddenVisibility() ? MachOMMI.getHiddenGVStubEntry(SSym) :
62561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt                                  MachOMMI.getGVStubEntry(SSym);
6264b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry Shmidt    if (StubSym.getPointer() == 0) {
6274b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry Shmidt      MCSymbol *Sym = Mang->getSymbol(GV);
6284b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry Shmidt      StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
6294b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry Shmidt    }
6304b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry Shmidt
6314b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry Shmidt    return TargetLoweringObjectFile::
6324b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry Shmidt      getExprForDwarfReference(SSym, Encoding & ~dwarf::DW_EH_PE_indirect, Streamer);
6334b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry Shmidt  }
6344b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry Shmidt
6354b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry Shmidt  return TargetLoweringObjectFile::
6364b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry Shmidt    getExprForDwarfGlobalReference(GV, Mang, MMI, Encoding, Streamer);
6374b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry Shmidt}
6384b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry Shmidt
6394b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry ShmidtMCSymbol *TargetLoweringObjectFileMachO::
6404b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry ShmidtgetCFIPersonalitySymbol(const GlobalValue *GV, Mangler *Mang,
6414b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry Shmidt                        MachineModuleInfo *MMI) const {
6424ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt  // The mach-o version of this method defaults to returning a stub reference.
6434ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt  MachineModuleInfoMachO &MachOMMI =
6444ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt    MMI->getObjFileInfo<MachineModuleInfoMachO>();
6454ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt
6464ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt  SmallString<128> Name;
6474ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt  Mang->getNameWithPrefix(Name, GV, true);
6484ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt  Name += "$non_lazy_ptr";
6494ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt
6504ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt  // Add information about the stub reference to MachOMMI so that the stub
6514ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt  // gets emitted by the asmprinter.
6524ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt  MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str());
6534ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt  MachineModuleInfoImpl::StubValueTy &StubSym = MachOMMI.getGVStubEntry(SSym);
6544ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt  if (StubSym.getPointer() == 0) {
6554ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt    MCSymbol *Sym = Mang->getSymbol(GV);
6564ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt    StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
6574ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt  }
6584ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt
6594ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt  return SSym;
6604ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt}
6614ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt
6624ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt//===----------------------------------------------------------------------===//
6634ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt//                                  COFF
6644ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt//===----------------------------------------------------------------------===//
6654ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt
6664ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidtstatic unsigned
6674ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry ShmidtgetCOFFSectionFlags(SectionKind K) {
6684ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt  unsigned Flags = 0;
6694ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt
6704ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt  if (K.isMetadata())
6714ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt    Flags |=
6724ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt      COFF::IMAGE_SCN_MEM_DISCARDABLE;
6734ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt  else if (K.isText())
6744ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt    Flags |=
6754ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt      COFF::IMAGE_SCN_MEM_EXECUTE |
6764ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt      COFF::IMAGE_SCN_MEM_READ |
6774ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt      COFF::IMAGE_SCN_CNT_CODE;
6784ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt  else if (K.isBSS ())
6794ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt    Flags |=
6804ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt      COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA |
6814ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt      COFF::IMAGE_SCN_MEM_READ |
6824ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt      COFF::IMAGE_SCN_MEM_WRITE;
6834ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt  else if (K.isThreadLocal())
6844ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt    Flags |=
6854ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt      COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
6864ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt      COFF::IMAGE_SCN_MEM_READ |
6874ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt      COFF::IMAGE_SCN_MEM_WRITE;
6884ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt  else if (K.isReadOnly())
6894ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt    Flags |=
6904ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt      COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
6914ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt      COFF::IMAGE_SCN_MEM_READ;
6924ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt  else if (K.isWriteable())
6934ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt    Flags |=
6944ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt      COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
6954ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt      COFF::IMAGE_SCN_MEM_READ |
6964ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt      COFF::IMAGE_SCN_MEM_WRITE;
6974ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt
6984ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt  return Flags;
6994ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt}
7004ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt
7014ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidtconst MCSection *TargetLoweringObjectFileCOFF::
7024ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry ShmidtgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
7034ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt                         Mangler *Mang, const TargetMachine &TM) const {
7044ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt  return getContext().getCOFFSection(GV->getSection(),
7054ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt                                     getCOFFSectionFlags(Kind),
7064ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt                                     Kind);
7074ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt}
7084ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt
7094ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidtstatic const char *getCOFFSectionPrefixForUniqueGlobal(SectionKind Kind) {
7104ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt  if (Kind.isText())
7114ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt    return ".text$";
7124ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt  if (Kind.isBSS ())
7134ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt    return ".bss$";
7144ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt  if (Kind.isThreadLocal())
7154ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt    return ".tls$";
7164ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt  if (Kind.isWriteable())
7174ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt    return ".data$";
7184ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt  return ".rdata$";
7194ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt}
7204ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt
7214ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt
7224ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidtconst MCSection *TargetLoweringObjectFileCOFF::
7234ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry ShmidtSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
7244ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt                       Mangler *Mang, const TargetMachine &TM) const {
7254ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt
7264ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt  // If this global is linkonce/weak and the target handles this by emitting it
7274ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt  // into a 'uniqued' section name, create and return the section now.
7284ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt  if (GV->isWeakForLinker()) {
7294ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt    const char *Prefix = getCOFFSectionPrefixForUniqueGlobal(Kind);
7304ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt    SmallString<128> Name(Prefix, Prefix+strlen(Prefix));
7314ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt    MCSymbol *Sym = Mang->getSymbol(GV);
7324ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt    Name.append(Sym->getName().begin() + 1, Sym->getName().end());
7334ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt
7344ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt    unsigned Characteristics = getCOFFSectionFlags(Kind);
7354ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt
7364ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt    Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT;
7374ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt
738fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt    return getContext().getCOFFSection(Name.str(), Characteristics,
739fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt                          COFF::IMAGE_COMDAT_SELECT_ANY, Kind);
740fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt  }
741fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt
742fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt  if (Kind.isText())
743fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt    return getTextSection();
744fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt
745fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt  if (Kind.isThreadLocal())
746fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt    return getTLSDataSection();
747fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt
748fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt  return getDataSection();
749fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt}
750fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt
751fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt