119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===-- llvm/CodeGen/TargetLoweringObjectFileImpl.cpp - Object File Info --===//
219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//                     The LLVM Compiler Infrastructure
419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// This file is distributed under the University of Illinois Open Source
619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// License. See LICENSE.TXT for details.
719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===//
919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
1019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// This file implements classes used to handle lowerings specific to common
1119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// object file formats.
1219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
1319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===//
1419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
1519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"
1619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Constants.h"
1719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/DerivedTypes.h"
1819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Function.h"
1919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/GlobalVariable.h"
2019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/CodeGen/MachineModuleInfoImpls.h"
2119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCContext.h"
2219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCExpr.h"
2319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCSectionMachO.h"
2419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCSectionELF.h"
2519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCSectionCOFF.h"
2619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCStreamer.h"
2719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCSymbol.h"
2819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Target/Mangler.h"
2919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Target/TargetData.h"
3019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Target/TargetMachine.h"
3119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Target/TargetOptions.h"
3219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Support/Dwarf.h"
3319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Support/ELF.h"
3419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Support/ErrorHandling.h"
3519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Support/raw_ostream.h"
3619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/ADT/SmallString.h"
3719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/ADT/StringExtras.h"
3819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/ADT/Triple.h"
3919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanusing namespace llvm;
4019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanusing namespace dwarf;
4119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
4219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===//
4319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//                                  ELF
4419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===//
4519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
4619bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanMCSymbol *
4719bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanTargetLoweringObjectFileELF::getCFIPersonalitySymbol(const GlobalValue *GV,
4819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                                     Mangler *Mang,
4919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                                MachineModuleInfo *MMI) const {
5019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned Encoding = getPersonalityEncoding();
5119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  switch (Encoding & 0x70) {
5219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  default:
5319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    report_fatal_error("We do not support this DWARF encoding yet!");
5419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case dwarf::DW_EH_PE_absptr:
5519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return  Mang->getSymbol(GV);
5619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    break;
5719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case dwarf::DW_EH_PE_pcrel: {
5819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return getContext().GetOrCreateSymbol(StringRef("DW.ref.") +
5919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                          Mang->getSymbol(GV)->getName());
6019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    break;
6119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
6219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
6319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
6419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
6519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid TargetLoweringObjectFileELF::emitPersonalityValue(MCStreamer &Streamer,
6619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                                       const TargetMachine &TM,
6719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                                       const MCSymbol *Sym) const {
6819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  SmallString<64> NameData("DW.ref.");
6919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  NameData += Sym->getName();
7019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCSymbol *Label = getContext().GetOrCreateSymbol(NameData);
7119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  Streamer.EmitSymbolAttribute(Label, MCSA_Hidden);
7219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  Streamer.EmitSymbolAttribute(Label, MCSA_Weak);
7319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  StringRef Prefix = ".data.";
7419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  NameData.insert(NameData.begin(), Prefix.begin(), Prefix.end());
7519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned Flags = ELF::SHF_ALLOC | ELF::SHF_WRITE | ELF::SHF_GROUP;
7619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  const MCSection *Sec = getContext().getELFSection(NameData,
7719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                                    ELF::SHT_PROGBITS,
7819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                                    Flags,
7919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                                    SectionKind::getDataRel(),
8019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                                    0, Label->getName());
8119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  Streamer.SwitchSection(Sec);
8219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  Streamer.EmitValueToAlignment(8);
8319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  Streamer.EmitSymbolAttribute(Label, MCSA_ELF_TypeObject);
8419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  const MCExpr *E = MCConstantExpr::Create(8, getContext());
8519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  Streamer.EmitELFSize(Label, E);
8619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  Streamer.EmitLabel(Label);
8719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
8819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned Size = TM.getTargetData()->getPointerSize();
8919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  Streamer.EmitSymbolValue(Sym, Size);
9019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
9119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
9219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanstatic SectionKind
9319bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumangetELFKindForNamedSection(StringRef Name, SectionKind K) {
9419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // N.B.: The defaults used in here are no the same ones used in MC.
9519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // We follow gcc, MC follows gas. For example, given ".section .eh_frame",
9619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // both gas and MC will produce a section with no flags. Given
9719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // section(".eh_frame") gcc will produce
9819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // .section	.eh_frame,"a",@progbits
9919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Name.empty() || Name[0] != '.') return K;
10019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
10119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Some lame default implementation based on some magic section names.
10219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Name == ".bss" ||
10319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Name.startswith(".bss.") ||
10419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Name.startswith(".gnu.linkonce.b.") ||
10519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Name.startswith(".llvm.linkonce.b.") ||
10619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Name == ".sbss" ||
10719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Name.startswith(".sbss.") ||
10819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Name.startswith(".gnu.linkonce.sb.") ||
10919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Name.startswith(".llvm.linkonce.sb."))
11019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return SectionKind::getBSS();
11119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
11219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Name == ".tdata" ||
11319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Name.startswith(".tdata.") ||
11419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Name.startswith(".gnu.linkonce.td.") ||
11519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Name.startswith(".llvm.linkonce.td."))
11619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return SectionKind::getThreadData();
11719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
11819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Name == ".tbss" ||
11919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Name.startswith(".tbss.") ||
12019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Name.startswith(".gnu.linkonce.tb.") ||
12119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Name.startswith(".llvm.linkonce.tb."))
12219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return SectionKind::getThreadBSS();
12319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
12419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return K;
12519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
12619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
12719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
12819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanstatic unsigned getELFSectionType(StringRef Name, SectionKind K) {
12919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
13019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Name == ".init_array")
13119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return ELF::SHT_INIT_ARRAY;
13219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
13319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Name == ".fini_array")
13419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return ELF::SHT_FINI_ARRAY;
13519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
13619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Name == ".preinit_array")
13719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return ELF::SHT_PREINIT_ARRAY;
13819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
13919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (K.isBSS() || K.isThreadBSS())
14019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return ELF::SHT_NOBITS;
14119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
14219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return ELF::SHT_PROGBITS;
14319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
14419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
14519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
14619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanstatic unsigned
14719bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumangetELFSectionFlags(SectionKind K) {
14819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned Flags = 0;
14919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
15019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (!K.isMetadata())
15119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Flags |= ELF::SHF_ALLOC;
15219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
15319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (K.isText())
15419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Flags |= ELF::SHF_EXECINSTR;
15519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
15619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (K.isWriteable())
15719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Flags |= ELF::SHF_WRITE;
15819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
15919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (K.isThreadLocal())
16019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Flags |= ELF::SHF_TLS;
16119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
16219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // K.isMergeableConst() is left out to honour PR4650
16319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (K.isMergeableCString() || K.isMergeableConst4() ||
16419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      K.isMergeableConst8() || K.isMergeableConst16())
16519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Flags |= ELF::SHF_MERGE;
16619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
16719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (K.isMergeableCString())
16819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Flags |= ELF::SHF_STRINGS;
16919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
17019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return Flags;
17119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
17219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
17319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
17419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanconst MCSection *TargetLoweringObjectFileELF::
17519bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumangetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
17619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                         Mangler *Mang, const TargetMachine &TM) const {
17719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  StringRef SectionName = GV->getSection();
17819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
17919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Infer section flags from the section name if we can.
18019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  Kind = getELFKindForNamedSection(SectionName, Kind);
18119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
18219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return getContext().getELFSection(SectionName,
18319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                    getELFSectionType(SectionName, Kind),
18419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                    getELFSectionFlags(Kind), Kind);
18519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
18619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
18719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// getSectionPrefixForGlobal - Return the section prefix name used by options
18819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// FunctionsSections and DataSections.
18919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanstatic const char *getSectionPrefixForGlobal(SectionKind Kind) {
19019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Kind.isText())                 return ".text.";
19119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Kind.isReadOnly())             return ".rodata.";
19219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
19319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Kind.isThreadData())           return ".tdata.";
19419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Kind.isThreadBSS())            return ".tbss.";
19519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
19619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Kind.isDataNoRel())            return ".data.";
19719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Kind.isDataRelLocal())         return ".data.rel.local.";
19819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Kind.isDataRel())              return ".data.rel.";
19919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Kind.isReadOnlyWithRelLocal()) return ".data.rel.ro.local.";
20019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
20119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
20219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return ".data.rel.ro.";
20319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
20419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
20519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
20619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanconst MCSection *TargetLoweringObjectFileELF::
20719bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
20819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       Mangler *Mang, const TargetMachine &TM) const {
20919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // If we have -ffunction-section or -fdata-section then we should emit the
21019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // global value to a uniqued section specifically for it.
21119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  bool EmitUniquedSection;
21219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Kind.isText())
21319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    EmitUniquedSection = TM.getFunctionSections();
21419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  else
21519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    EmitUniquedSection = TM.getDataSections();
21619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
21719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // If this global is linkonce/weak and the target handles this by emitting it
21819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // into a 'uniqued' section name, create and return the section now.
21919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if ((GV->isWeakForLinker() || EmitUniquedSection) &&
22019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      !Kind.isCommon() && !Kind.isBSS()) {
22119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    const char *Prefix;
22219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Prefix = getSectionPrefixForGlobal(Kind);
22319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
22419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    SmallString<128> Name(Prefix, Prefix+strlen(Prefix));
22519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    MCSymbol *Sym = Mang->getSymbol(GV);
22619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Name.append(Sym->getName().begin(), Sym->getName().end());
22719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    StringRef Group = "";
22819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    unsigned Flags = getELFSectionFlags(Kind);
22919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (GV->isWeakForLinker()) {
23019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Group = Sym->getName();
23119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Flags |= ELF::SHF_GROUP;
23219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
23319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
23419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return getContext().getELFSection(Name.str(),
23519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                      getELFSectionType(Name.str(), Kind),
23619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                      Flags, Kind, 0, Group);
23719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
23819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
23919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Kind.isText()) return TextSection;
24019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
24119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Kind.isMergeable1ByteCString() ||
24219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Kind.isMergeable2ByteCString() ||
24319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Kind.isMergeable4ByteCString()) {
24419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
24519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // We also need alignment here.
24619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // FIXME: this is getting the alignment of the character, not the
24719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // alignment of the global!
24819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    unsigned Align =
24919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV));
25019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
25119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    const char *SizeSpec = ".rodata.str1.";
25219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (Kind.isMergeable2ByteCString())
25319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      SizeSpec = ".rodata.str2.";
25419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    else if (Kind.isMergeable4ByteCString())
25519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      SizeSpec = ".rodata.str4.";
25619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    else
25719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      assert(Kind.isMergeable1ByteCString() && "unknown string width");
25819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
25919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
26019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    std::string Name = SizeSpec + utostr(Align);
26119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return getContext().getELFSection(Name, ELF::SHT_PROGBITS,
26219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                      ELF::SHF_ALLOC |
26319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                      ELF::SHF_MERGE |
26419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                      ELF::SHF_STRINGS,
26519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                      Kind);
26619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
26719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
26819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Kind.isMergeableConst()) {
26919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (Kind.isMergeableConst4() && MergeableConst4Section)
27019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return MergeableConst4Section;
27119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (Kind.isMergeableConst8() && MergeableConst8Section)
27219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return MergeableConst8Section;
27319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (Kind.isMergeableConst16() && MergeableConst16Section)
27419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return MergeableConst16Section;
27519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return ReadOnlySection;  // .const
27619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
27719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
27819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Kind.isReadOnly())             return ReadOnlySection;
27919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
28019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Kind.isThreadData())           return TLSDataSection;
28119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Kind.isThreadBSS())            return TLSBSSSection;
28219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
28319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Note: we claim that common symbols are put in BSSSection, but they are
28419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // really emitted with the magic .comm directive, which creates a symbol table
28519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // entry but not a section.
28619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Kind.isBSS() || Kind.isCommon()) return BSSSection;
28719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
28819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Kind.isDataNoRel())            return DataSection;
28919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Kind.isDataRelLocal())         return DataRelLocalSection;
29019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Kind.isDataRel())              return DataRelSection;
29119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection;
29219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
29319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
29419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return DataRelROSection;
29519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
29619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
29719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// getSectionForConstant - Given a mergeable constant with the
29819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// specified size and relocation information, return a section that it
29919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// should be placed in.
30019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanconst MCSection *TargetLoweringObjectFileELF::
30119bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumangetSectionForConstant(SectionKind Kind) const {
30219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Kind.isMergeableConst4() && MergeableConst4Section)
30319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return MergeableConst4Section;
30419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Kind.isMergeableConst8() && MergeableConst8Section)
30519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return MergeableConst8Section;
30619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Kind.isMergeableConst16() && MergeableConst16Section)
30719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return MergeableConst16Section;
30819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Kind.isReadOnly())
30919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return ReadOnlySection;
31019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
31119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection;
31219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
31319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return DataRelROSection;
31419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
31519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
31619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanconst MCExpr *TargetLoweringObjectFileELF::
31719bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumangetExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
31819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                               MachineModuleInfo *MMI,
31919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                               unsigned Encoding, MCStreamer &Streamer) const {
32019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
32119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Encoding & dwarf::DW_EH_PE_indirect) {
32219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    MachineModuleInfoELF &ELFMMI = MMI->getObjFileInfo<MachineModuleInfoELF>();
32319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
32419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    SmallString<128> Name;
32519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Mang->getNameWithPrefix(Name, GV, true);
32619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Name += ".DW.stub";
32719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
32819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Add information about the stub reference to ELFMMI so that the stub
32919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // gets emitted by the asmprinter.
33019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str());
33119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    MachineModuleInfoImpl::StubValueTy &StubSym = ELFMMI.getGVStubEntry(SSym);
33219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (StubSym.getPointer() == 0) {
33319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      MCSymbol *Sym = Mang->getSymbol(GV);
33419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
33519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
33619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
33719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return TargetLoweringObjectFile::
33819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      getExprForDwarfReference(SSym, Encoding & ~dwarf::DW_EH_PE_indirect, Streamer);
33919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
34019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
34119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return TargetLoweringObjectFile::
34219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    getExprForDwarfGlobalReference(GV, Mang, MMI, Encoding, Streamer);
34319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
34419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
34519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===//
34619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//                                 MachO
34719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===//
34819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
34919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanconst MCSection *TargetLoweringObjectFileMachO::
35019bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumangetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
35119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                         Mangler *Mang, const TargetMachine &TM) const {
35219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Parse the section specifier and create it if valid.
35319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  StringRef Segment, Section;
35419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned TAA = 0, StubSize = 0;
35519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  bool TAAParsed;
35619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  std::string ErrorCode =
35719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    MCSectionMachO::ParseSectionSpecifier(GV->getSection(), Segment, Section,
35819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                          TAA, TAAParsed, StubSize);
35919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (!ErrorCode.empty()) {
36019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // If invalid, report the error with report_fatal_error.
36119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    report_fatal_error("Global variable '" + GV->getNameStr() +
36219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                      "' has an invalid section specifier '" + GV->getSection()+
36319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                      "': " + ErrorCode + ".");
36419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Fall back to dropping it into the data section.
36519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return DataSection;
36619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
36719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
36819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Get the section.
36919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  const MCSectionMachO *S =
37019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    getContext().getMachOSection(Segment, Section, TAA, StubSize, Kind);
37119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
37219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // If TAA wasn't set by ParseSectionSpecifier() above,
37319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // use the value returned by getMachOSection() as a default.
37419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (!TAAParsed)
37519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    TAA = S->getTypeAndAttributes();
37619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
37719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Okay, now that we got the section, verify that the TAA & StubSize agree.
37819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // If the user declared multiple globals with different section flags, we need
37919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // to reject it here.
38019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (S->getTypeAndAttributes() != TAA || S->getStubSize() != StubSize) {
38119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // If invalid, report the error with report_fatal_error.
38219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    report_fatal_error("Global variable '" + GV->getNameStr() +
38319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                      "' section type or attributes does not match previous"
38419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                      " section specifier");
38519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
38619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
38719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return S;
38819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
38919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
39019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanconst MCSection *TargetLoweringObjectFileMachO::
39119bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
39219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       Mangler *Mang, const TargetMachine &TM) const {
39319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
39419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Handle thread local data.
39519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Kind.isThreadBSS()) return TLSBSSSection;
39619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Kind.isThreadData()) return TLSDataSection;
39719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
39819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Kind.isText())
39919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return GV->isWeakForLinker() ? TextCoalSection : TextSection;
40019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
40119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // If this is weak/linkonce, put this in a coalescable section, either in text
40219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // or data depending on if it is writable.
40319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (GV->isWeakForLinker()) {
40419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (Kind.isReadOnly())
40519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return ConstTextCoalSection;
40619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return DataCoalSection;
40719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
40819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
40919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // FIXME: Alignment check should be handled by section classifier.
41019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Kind.isMergeable1ByteCString() &&
41119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV)) < 32)
41219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return CStringSection;
41319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
41419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Do not put 16-bit arrays in the UString section if they have an
41519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // externally visible label, this runs into issues with certain linker
41619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // versions.
41719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Kind.isMergeable2ByteCString() && !GV->hasExternalLinkage() &&
41819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV)) < 32)
41919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return UStringSection;
42019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
42119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Kind.isMergeableConst()) {
42219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (Kind.isMergeableConst4())
42319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return FourByteConstantSection;
42419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (Kind.isMergeableConst8())
42519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return EightByteConstantSection;
42619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (Kind.isMergeableConst16() && SixteenByteConstantSection)
42719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return SixteenByteConstantSection;
42819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
42919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
43019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Otherwise, if it is readonly, but not something we can specially optimize,
43119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // just drop it in .const.
43219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Kind.isReadOnly())
43319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return ReadOnlySection;
43419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
43519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // If this is marked const, put it into a const section.  But if the dynamic
43619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // linker needs to write to it, put it in the data segment.
43719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Kind.isReadOnlyWithRel())
43819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return ConstDataSection;
43919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
44019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Put zero initialized globals with strong external linkage in the
44119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // DATA, __common section with the .zerofill directive.
44219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Kind.isBSSExtern())
44319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return DataCommonSection;
44419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
44519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Put zero initialized globals with local linkage in __DATA,__bss directive
44619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // with the .zerofill directive (aka .lcomm).
44719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Kind.isBSSLocal())
44819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return DataBSSSection;
44919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
45019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Otherwise, just drop the variable in the normal data section.
45119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return DataSection;
45219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
45319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
45419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanconst MCSection *
45519bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanTargetLoweringObjectFileMachO::getSectionForConstant(SectionKind Kind) const {
45619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // If this constant requires a relocation, we have to put it in the data
45719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // segment, not in the text segment.
45819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Kind.isDataRel() || Kind.isReadOnlyWithRel())
45919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return ConstDataSection;
46019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
46119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Kind.isMergeableConst4())
46219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return FourByteConstantSection;
46319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Kind.isMergeableConst8())
46419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return EightByteConstantSection;
46519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Kind.isMergeableConst16() && SixteenByteConstantSection)
46619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return SixteenByteConstantSection;
46719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return ReadOnlySection;  // .const
46819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
46919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
47019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// shouldEmitUsedDirectiveFor - This hook allows targets to selectively decide
47119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// not to emit the UsedDirective for some symbols in llvm.used.
47219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// FIXME: REMOVE this (rdar://7071300)
47319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanbool TargetLoweringObjectFileMachO::
47419bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanshouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler *Mang) const {
47519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  /// On Darwin, internally linked data beginning with "L" or "l" does not have
47619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  /// the directive emitted (this occurs in ObjC metadata).
47719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (!GV) return false;
47819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
47919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Check whether the mangled name has the "Private" or "LinkerPrivate" prefix.
48019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (GV->hasLocalLinkage() && !isa<Function>(GV)) {
48119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // FIXME: ObjC metadata is currently emitted as internal symbols that have
48219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // \1L and \0l prefixes on them.  Fix them to be Private/LinkerPrivate and
48319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // this horrible hack can go away.
48419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    MCSymbol *Sym = Mang->getSymbol(GV);
48519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (Sym->getName()[0] == 'L' || Sym->getName()[0] == 'l')
48619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return false;
48719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
48819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
48919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return true;
49019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
49119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
49219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanconst MCExpr *TargetLoweringObjectFileMachO::
49319bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumangetExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
49419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                               MachineModuleInfo *MMI, unsigned Encoding,
49519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                               MCStreamer &Streamer) const {
49619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // The mach-o version of this method defaults to returning a stub reference.
49719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
49819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Encoding & DW_EH_PE_indirect) {
49919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    MachineModuleInfoMachO &MachOMMI =
50019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      MMI->getObjFileInfo<MachineModuleInfoMachO>();
50119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
50219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    SmallString<128> Name;
50319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Mang->getNameWithPrefix(Name, GV, true);
50419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Name += "$non_lazy_ptr";
50519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
50619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Add information about the stub reference to MachOMMI so that the stub
50719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // gets emitted by the asmprinter.
50819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str());
50919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    MachineModuleInfoImpl::StubValueTy &StubSym =
51019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      GV->hasHiddenVisibility() ? MachOMMI.getHiddenGVStubEntry(SSym) :
51119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                  MachOMMI.getGVStubEntry(SSym);
51219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (StubSym.getPointer() == 0) {
51319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      MCSymbol *Sym = Mang->getSymbol(GV);
51419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
51519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
51619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
51719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return TargetLoweringObjectFile::
51819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      getExprForDwarfReference(SSym, Encoding & ~dwarf::DW_EH_PE_indirect, Streamer);
51919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
52019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
52119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return TargetLoweringObjectFile::
52219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    getExprForDwarfGlobalReference(GV, Mang, MMI, Encoding, Streamer);
52319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
52419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
52519bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanMCSymbol *TargetLoweringObjectFileMachO::
52619bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumangetCFIPersonalitySymbol(const GlobalValue *GV, Mangler *Mang,
52719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                        MachineModuleInfo *MMI) const {
52819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // The mach-o version of this method defaults to returning a stub reference.
52919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MachineModuleInfoMachO &MachOMMI =
53019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    MMI->getObjFileInfo<MachineModuleInfoMachO>();
53119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
53219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  SmallString<128> Name;
53319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  Mang->getNameWithPrefix(Name, GV, true);
53419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  Name += "$non_lazy_ptr";
53519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
53619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Add information about the stub reference to MachOMMI so that the stub
53719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // gets emitted by the asmprinter.
53819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str());
53919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MachineModuleInfoImpl::StubValueTy &StubSym =
54019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      GV->hasHiddenVisibility() ? MachOMMI.getHiddenGVStubEntry(SSym) :
54119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                  MachOMMI.getGVStubEntry(SSym);
54219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (StubSym.getPointer() == 0) {
54319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    MCSymbol *Sym = Mang->getSymbol(GV);
54419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
54519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
54619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
54719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return SSym;
54819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
54919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
55019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===//
55119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//                                  COFF
55219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===//
55319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
55419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanstatic unsigned
55519bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumangetCOFFSectionFlags(SectionKind K) {
55619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned Flags = 0;
55719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
55819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (K.isMetadata())
55919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Flags |=
56019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      COFF::IMAGE_SCN_MEM_DISCARDABLE;
56119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  else if (K.isText())
56219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Flags |=
56319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      COFF::IMAGE_SCN_MEM_EXECUTE |
56419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      COFF::IMAGE_SCN_MEM_READ |
56519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      COFF::IMAGE_SCN_CNT_CODE;
56619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  else if (K.isBSS ())
56719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Flags |=
56819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA |
56919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      COFF::IMAGE_SCN_MEM_READ |
57019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      COFF::IMAGE_SCN_MEM_WRITE;
57119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  else if (K.isReadOnly())
57219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Flags |=
57319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
57419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      COFF::IMAGE_SCN_MEM_READ;
57519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  else if (K.isWriteable())
57619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Flags |=
57719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
57819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      COFF::IMAGE_SCN_MEM_READ |
57919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      COFF::IMAGE_SCN_MEM_WRITE;
58019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
58119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return Flags;
58219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
58319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
58419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanconst MCSection *TargetLoweringObjectFileCOFF::
58519bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumangetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
58619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                         Mangler *Mang, const TargetMachine &TM) const {
58719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return getContext().getCOFFSection(GV->getSection(),
58819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                     getCOFFSectionFlags(Kind),
58919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                     Kind);
59019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
59119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
59219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanstatic const char *getCOFFSectionPrefixForUniqueGlobal(SectionKind Kind) {
59319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Kind.isText())
59419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return ".text$";
59519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Kind.isBSS ())
59619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return ".bss$";
59719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Kind.isWriteable())
59819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return ".data$";
59919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return ".rdata$";
60019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
60119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
60219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
60319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanconst MCSection *TargetLoweringObjectFileCOFF::
60419bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
60519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       Mangler *Mang, const TargetMachine &TM) const {
60619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  assert(!Kind.isThreadLocal() && "Doesn't support TLS");
60719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
60819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // If this global is linkonce/weak and the target handles this by emitting it
60919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // into a 'uniqued' section name, create and return the section now.
61019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (GV->isWeakForLinker()) {
61119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    const char *Prefix = getCOFFSectionPrefixForUniqueGlobal(Kind);
61219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    SmallString<128> Name(Prefix, Prefix+strlen(Prefix));
61319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    MCSymbol *Sym = Mang->getSymbol(GV);
61419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Name.append(Sym->getName().begin() + 1, Sym->getName().end());
61519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
61619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    unsigned Characteristics = getCOFFSectionFlags(Kind);
61719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
61819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT;
61919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
62019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return getContext().getCOFFSection(Name.str(), Characteristics,
62119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                          COFF::IMAGE_COMDAT_SELECT_ANY, Kind);
62219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
62319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
62419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Kind.isText())
62519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return getTextSection();
62619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
62719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return getDataSection();
62819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
62919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
630