diff options
Diffstat (limited to 'lib/CodeGen/TargetLoweringObjectFileImpl.cpp')
| -rw-r--r-- | lib/CodeGen/TargetLoweringObjectFileImpl.cpp | 253 | 
1 files changed, 127 insertions, 126 deletions
| diff --git a/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/lib/CodeGen/TargetLoweringObjectFileImpl.cpp index f1e10eec724c..0b7bd98cc692 100644 --- a/lib/CodeGen/TargetLoweringObjectFileImpl.cpp +++ b/lib/CodeGen/TargetLoweringObjectFileImpl.cpp @@ -29,10 +29,12 @@  #include "llvm/Target/TargetMachine.h"  #include "llvm/Target/TargetOptions.h"  #include "llvm/Support/Dwarf.h" +#include "llvm/Support/ELF.h"  #include "llvm/Support/ErrorHandling.h"  #include "llvm/Support/raw_ostream.h"  #include "llvm/ADT/SmallString.h"  #include "llvm/ADT/StringExtras.h" +#include "llvm/ADT/Triple.h"  using namespace llvm;  using namespace dwarf; @@ -45,81 +47,81 @@ void TargetLoweringObjectFileELF::Initialize(MCContext &Ctx,    TargetLoweringObjectFile::Initialize(Ctx, TM);    BSSSection = -    getContext().getELFSection(".bss", MCSectionELF::SHT_NOBITS, -                               MCSectionELF::SHF_WRITE |MCSectionELF::SHF_ALLOC, +    getContext().getELFSection(".bss", ELF::SHT_NOBITS, +                               ELF::SHF_WRITE |ELF::SHF_ALLOC,                                 SectionKind::getBSS());    TextSection = -    getContext().getELFSection(".text", MCSectionELF::SHT_PROGBITS, -                               MCSectionELF::SHF_EXECINSTR | -                               MCSectionELF::SHF_ALLOC, +    getContext().getELFSection(".text", ELF::SHT_PROGBITS, +                               ELF::SHF_EXECINSTR | +                               ELF::SHF_ALLOC,                                 SectionKind::getText());    DataSection = -    getContext().getELFSection(".data", MCSectionELF::SHT_PROGBITS, -                               MCSectionELF::SHF_WRITE |MCSectionELF::SHF_ALLOC, +    getContext().getELFSection(".data", ELF::SHT_PROGBITS, +                               ELF::SHF_WRITE |ELF::SHF_ALLOC,                                 SectionKind::getDataRel());    ReadOnlySection = -    getContext().getELFSection(".rodata", MCSectionELF::SHT_PROGBITS, -                               MCSectionELF::SHF_ALLOC, +    getContext().getELFSection(".rodata", ELF::SHT_PROGBITS, +                               ELF::SHF_ALLOC,                                 SectionKind::getReadOnly());    TLSDataSection = -    getContext().getELFSection(".tdata", MCSectionELF::SHT_PROGBITS, -                               MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_TLS | -                               MCSectionELF::SHF_WRITE, +    getContext().getELFSection(".tdata", ELF::SHT_PROGBITS, +                               ELF::SHF_ALLOC | ELF::SHF_TLS | +                               ELF::SHF_WRITE,                                 SectionKind::getThreadData());    TLSBSSSection = -    getContext().getELFSection(".tbss", MCSectionELF::SHT_NOBITS, -                               MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_TLS | -                               MCSectionELF::SHF_WRITE, +    getContext().getELFSection(".tbss", ELF::SHT_NOBITS, +                               ELF::SHF_ALLOC | ELF::SHF_TLS | +                               ELF::SHF_WRITE,                                 SectionKind::getThreadBSS());    DataRelSection = -    getContext().getELFSection(".data.rel", MCSectionELF::SHT_PROGBITS, -                               MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_WRITE, +    getContext().getELFSection(".data.rel", ELF::SHT_PROGBITS, +                               ELF::SHF_ALLOC |ELF::SHF_WRITE,                                 SectionKind::getDataRel());    DataRelLocalSection = -    getContext().getELFSection(".data.rel.local", MCSectionELF::SHT_PROGBITS, -                               MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_WRITE, +    getContext().getELFSection(".data.rel.local", ELF::SHT_PROGBITS, +                               ELF::SHF_ALLOC |ELF::SHF_WRITE,                                 SectionKind::getDataRelLocal());    DataRelROSection = -    getContext().getELFSection(".data.rel.ro", MCSectionELF::SHT_PROGBITS, -                               MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_WRITE, +    getContext().getELFSection(".data.rel.ro", ELF::SHT_PROGBITS, +                               ELF::SHF_ALLOC |ELF::SHF_WRITE,                                 SectionKind::getReadOnlyWithRel());    DataRelROLocalSection = -    getContext().getELFSection(".data.rel.ro.local", MCSectionELF::SHT_PROGBITS, -                               MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_WRITE, +    getContext().getELFSection(".data.rel.ro.local", ELF::SHT_PROGBITS, +                               ELF::SHF_ALLOC |ELF::SHF_WRITE,                                 SectionKind::getReadOnlyWithRelLocal());    MergeableConst4Section = -    getContext().getELFSection(".rodata.cst4", MCSectionELF::SHT_PROGBITS, -                               MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_MERGE, +    getContext().getELFSection(".rodata.cst4", ELF::SHT_PROGBITS, +                               ELF::SHF_ALLOC |ELF::SHF_MERGE,                                 SectionKind::getMergeableConst4());    MergeableConst8Section = -    getContext().getELFSection(".rodata.cst8", MCSectionELF::SHT_PROGBITS, -                               MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_MERGE, +    getContext().getELFSection(".rodata.cst8", ELF::SHT_PROGBITS, +                               ELF::SHF_ALLOC |ELF::SHF_MERGE,                                 SectionKind::getMergeableConst8());    MergeableConst16Section = -    getContext().getELFSection(".rodata.cst16", MCSectionELF::SHT_PROGBITS, -                               MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_MERGE, +    getContext().getELFSection(".rodata.cst16", ELF::SHT_PROGBITS, +                               ELF::SHF_ALLOC |ELF::SHF_MERGE,                                 SectionKind::getMergeableConst16());    StaticCtorSection = -    getContext().getELFSection(".ctors", MCSectionELF::SHT_PROGBITS, -                               MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_WRITE, +    getContext().getELFSection(".ctors", ELF::SHT_PROGBITS, +                               ELF::SHF_ALLOC |ELF::SHF_WRITE,                                 SectionKind::getDataRel());    StaticDtorSection = -    getContext().getELFSection(".dtors", MCSectionELF::SHT_PROGBITS, -                               MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_WRITE, +    getContext().getELFSection(".dtors", ELF::SHT_PROGBITS, +                               ELF::SHF_ALLOC |ELF::SHF_WRITE,                                 SectionKind::getDataRel());    // Exception Handling Sections. @@ -129,50 +131,50 @@ void TargetLoweringObjectFileELF::Initialize(MCContext &Ctx,    // runtime hit for C++ apps.  Either the contents of the LSDA need to be    // adjusted or this should be a data section.    LSDASection = -    getContext().getELFSection(".gcc_except_table", MCSectionELF::SHT_PROGBITS, -                               MCSectionELF::SHF_ALLOC, +    getContext().getELFSection(".gcc_except_table", ELF::SHT_PROGBITS, +                               ELF::SHF_ALLOC,                                 SectionKind::getReadOnly()); -  EHFrameSection = -    getContext().getELFSection(".eh_frame", MCSectionELF::SHT_PROGBITS, -                               MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_WRITE, -                               SectionKind::getDataRel()); -    // Debug Info Sections.    DwarfAbbrevSection = -    getContext().getELFSection(".debug_abbrev", MCSectionELF::SHT_PROGBITS, 0, +    getContext().getELFSection(".debug_abbrev", ELF::SHT_PROGBITS, 0,                                 SectionKind::getMetadata());    DwarfInfoSection = -    getContext().getELFSection(".debug_info", MCSectionELF::SHT_PROGBITS, 0, +    getContext().getELFSection(".debug_info", ELF::SHT_PROGBITS, 0,                                 SectionKind::getMetadata());    DwarfLineSection = -    getContext().getELFSection(".debug_line", MCSectionELF::SHT_PROGBITS, 0, +    getContext().getELFSection(".debug_line", ELF::SHT_PROGBITS, 0,                                 SectionKind::getMetadata());    DwarfFrameSection = -    getContext().getELFSection(".debug_frame", MCSectionELF::SHT_PROGBITS, 0, +    getContext().getELFSection(".debug_frame", ELF::SHT_PROGBITS, 0,                                 SectionKind::getMetadata());    DwarfPubNamesSection = -    getContext().getELFSection(".debug_pubnames", MCSectionELF::SHT_PROGBITS, 0, +    getContext().getELFSection(".debug_pubnames", ELF::SHT_PROGBITS, 0,                                 SectionKind::getMetadata());    DwarfPubTypesSection = -    getContext().getELFSection(".debug_pubtypes", MCSectionELF::SHT_PROGBITS, 0, +    getContext().getELFSection(".debug_pubtypes", ELF::SHT_PROGBITS, 0,                                 SectionKind::getMetadata());    DwarfStrSection = -    getContext().getELFSection(".debug_str", MCSectionELF::SHT_PROGBITS, 0, +    getContext().getELFSection(".debug_str", ELF::SHT_PROGBITS, 0,                                 SectionKind::getMetadata());    DwarfLocSection = -    getContext().getELFSection(".debug_loc", MCSectionELF::SHT_PROGBITS, 0, +    getContext().getELFSection(".debug_loc", ELF::SHT_PROGBITS, 0,                                 SectionKind::getMetadata());    DwarfARangesSection = -    getContext().getELFSection(".debug_aranges", MCSectionELF::SHT_PROGBITS, 0, +    getContext().getELFSection(".debug_aranges", ELF::SHT_PROGBITS, 0,                                 SectionKind::getMetadata());    DwarfRangesSection = -    getContext().getELFSection(".debug_ranges", MCSectionELF::SHT_PROGBITS, 0, +    getContext().getELFSection(".debug_ranges", ELF::SHT_PROGBITS, 0,                                 SectionKind::getMetadata());    DwarfMacroInfoSection = -    getContext().getELFSection(".debug_macinfo", MCSectionELF::SHT_PROGBITS, 0, +    getContext().getELFSection(".debug_macinfo", ELF::SHT_PROGBITS, 0,                                 SectionKind::getMetadata());  } +const MCSection *TargetLoweringObjectFileELF::getEHFrameSection() const { +  return getContext().getELFSection(".eh_frame", ELF::SHT_PROGBITS, +                                    ELF::SHF_ALLOC, +                                    SectionKind::getDataRel()); +}  static SectionKind  getELFKindForNamedSection(StringRef Name, SectionKind K) { @@ -208,18 +210,18 @@ getELFKindForNamedSection(StringRef Name, SectionKind K) {  static unsigned getELFSectionType(StringRef Name, SectionKind K) {    if (Name == ".init_array") -    return MCSectionELF::SHT_INIT_ARRAY; +    return ELF::SHT_INIT_ARRAY;    if (Name == ".fini_array") -    return MCSectionELF::SHT_FINI_ARRAY; +    return ELF::SHT_FINI_ARRAY;    if (Name == ".preinit_array") -    return MCSectionELF::SHT_PREINIT_ARRAY; +    return ELF::SHT_PREINIT_ARRAY;    if (K.isBSS() || K.isThreadBSS()) -    return MCSectionELF::SHT_NOBITS; +    return ELF::SHT_NOBITS; -  return MCSectionELF::SHT_PROGBITS; +  return ELF::SHT_PROGBITS;  } @@ -228,24 +230,24 @@ getELFSectionFlags(SectionKind K) {    unsigned Flags = 0;    if (!K.isMetadata()) -    Flags |= MCSectionELF::SHF_ALLOC; +    Flags |= ELF::SHF_ALLOC;    if (K.isText()) -    Flags |= MCSectionELF::SHF_EXECINSTR; +    Flags |= ELF::SHF_EXECINSTR;    if (K.isWriteable()) -    Flags |= MCSectionELF::SHF_WRITE; +    Flags |= ELF::SHF_WRITE;    if (K.isThreadLocal()) -    Flags |= MCSectionELF::SHF_TLS; +    Flags |= ELF::SHF_TLS;    // K.isMergeableConst() is left out to honour PR4650    if (K.isMergeableCString() || K.isMergeableConst4() ||        K.isMergeableConst8() || K.isMergeableConst16()) -    Flags |= MCSectionELF::SHF_MERGE; +    Flags |= ELF::SHF_MERGE;    if (K.isMergeableCString()) -    Flags |= MCSectionELF::SHF_STRINGS; +    Flags |= ELF::SHF_STRINGS;    return Flags;  } @@ -261,23 +263,7 @@ getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,    return getContext().getELFSection(SectionName,                                      getELFSectionType(SectionName, Kind), -                                    getELFSectionFlags(Kind), Kind, true); -} - -static const char *getSectionPrefixForUniqueGlobal(SectionKind Kind) { -  if (Kind.isText())                 return ".gnu.linkonce.t."; -  if (Kind.isReadOnly())             return ".gnu.linkonce.r."; - -  if (Kind.isThreadData())           return ".gnu.linkonce.td."; -  if (Kind.isThreadBSS())            return ".gnu.linkonce.tb."; - -  if (Kind.isDataNoRel())            return ".gnu.linkonce.d."; -  if (Kind.isDataRelLocal())         return ".gnu.linkonce.d.rel.local."; -  if (Kind.isDataRel())              return ".gnu.linkonce.d.rel."; -  if (Kind.isReadOnlyWithRelLocal()) return ".gnu.linkonce.d.rel.ro.local."; - -  assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); -  return ".gnu.linkonce.d.rel.ro."; +                                    getELFSectionFlags(Kind), Kind);  }  /// getSectionPrefixForGlobal - Return the section prefix name used by options @@ -307,7 +293,7 @@ SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,    bool EmitUniquedSection;    if (Kind.isText())      EmitUniquedSection = TM.getFunctionSections(); -  else  +  else      EmitUniquedSection = TM.getDataSections();    // If this global is linkonce/weak and the target handles this by emitting it @@ -315,19 +301,21 @@ SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,    if ((GV->isWeakForLinker() || EmitUniquedSection) &&        !Kind.isCommon() && !Kind.isBSS()) {      const char *Prefix; -    if (GV->isWeakForLinker()) -      Prefix = getSectionPrefixForUniqueGlobal(Kind); -    else { -      assert(EmitUniquedSection); -      Prefix = getSectionPrefixForGlobal(Kind); -    } +    Prefix = getSectionPrefixForGlobal(Kind);      SmallString<128> Name(Prefix, Prefix+strlen(Prefix));      MCSymbol *Sym = Mang->getSymbol(GV);      Name.append(Sym->getName().begin(), Sym->getName().end()); +    StringRef Group = ""; +    unsigned Flags = getELFSectionFlags(Kind); +    if (GV->isWeakForLinker()) { +      Group = Sym->getName(); +      Flags |= ELF::SHF_GROUP; +    } +      return getContext().getELFSection(Name.str(),                                        getELFSectionType(Name.str(), Kind), -                                      getELFSectionFlags(Kind), Kind); +                                      Flags, Kind, 0, Group);    }    if (Kind.isText()) return TextSection; @@ -352,10 +340,10 @@ SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,      std::string Name = SizeSpec + utostr(Align); -    return getContext().getELFSection(Name, MCSectionELF::SHT_PROGBITS, -                                      MCSectionELF::SHF_ALLOC | -                                      MCSectionELF::SHF_MERGE | -                                      MCSectionELF::SHF_STRINGS, +    return getContext().getELFSection(Name, ELF::SHT_PROGBITS, +                                      ELF::SHF_ALLOC | +                                      ELF::SHF_MERGE | +                                      ELF::SHF_STRINGS,                                        Kind);    } @@ -450,7 +438,16 @@ void TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx,    IsFunctionEHSymbolGlobal = true;    IsFunctionEHFrameSymbolPrivate = false;    SupportsWeakOmittedEHFrame = false; -   + +  Triple T(((LLVMTargetMachine&)TM).getTargetTriple()); +  if (T.getOS() == Triple::Darwin) { +    unsigned MajNum = T.getDarwinMajorNumber(); +    if (MajNum == 7 || MajNum == 8) // 10.3 Panther, 10.4 Tiger +      CommDirectiveSupportsAlignment = false; +    if (MajNum > 9)                 // 10.6 SnowLeopard +      IsFunctionEHSymbolGlobal = false; +  } +    TargetLoweringObjectFile::Initialize(Ctx, TM);    TextSection // .text @@ -469,20 +466,20 @@ void TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx,      = getContext().getMachOSection("__DATA", "__thread_bss",                                     MCSectionMachO::S_THREAD_LOCAL_ZEROFILL,                                     SectionKind::getThreadBSS()); -                                    +    // TODO: Verify datarel below.    TLSTLVSection // .tlv      = getContext().getMachOSection("__DATA", "__thread_vars",                                     MCSectionMachO::S_THREAD_LOCAL_VARIABLES,                                     SectionKind::getDataRel()); -                                    +    TLSThreadInitSection      = getContext().getMachOSection("__DATA", "__thread_init",                            MCSectionMachO::S_THREAD_LOCAL_INIT_FUNCTION_POINTERS,                            SectionKind::getDataRel()); -                                    +    CStringSection // .cstring -    = getContext().getMachOSection("__TEXT", "__cstring",  +    = getContext().getMachOSection("__TEXT", "__cstring",                                     MCSectionMachO::S_CSTRING_LITERALS,                                     SectionKind::getMergeable1ByteCString());    UStringSection @@ -493,7 +490,7 @@ void TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx,                                     MCSectionMachO::S_4BYTE_LITERALS,                                     SectionKind::getMergeableConst4());    EightByteConstantSection // .literal8 -    = getContext().getMachOSection("__TEXT", "__literal8",  +    = getContext().getMachOSection("__TEXT", "__literal8",                                     MCSectionMachO::S_8BYTE_LITERALS,                                     SectionKind::getMergeableConst8()); @@ -517,14 +514,14 @@ void TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx,                                     MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS,                                     SectionKind::getText());    ConstTextCoalSection -    = getContext().getMachOSection("__TEXT", "__const_coal",  +    = getContext().getMachOSection("__TEXT", "__const_coal",                                     MCSectionMachO::S_COALESCED,                                     SectionKind::getReadOnly());    ConstDataSection  // .const_data      = getContext().getMachOSection("__DATA", "__const", 0,                                     SectionKind::getReadOnlyWithRel());    DataCoalSection -    = getContext().getMachOSection("__DATA","__datacoal_nt",  +    = getContext().getMachOSection("__DATA","__datacoal_nt",                                     MCSectionMachO::S_COALESCED,                                     SectionKind::getDataRel());    DataCommonSection @@ -534,7 +531,7 @@ void TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx,    DataBSSSection      = getContext().getMachOSection("__DATA","__bss", MCSectionMachO::S_ZEROFILL,                                     SectionKind::getBSS()); -   +    LazySymbolPointerSection      = getContext().getMachOSection("__DATA", "__la_symbol_ptr", @@ -566,17 +563,9 @@ void TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx,    // Exception Handling.    LSDASection = getContext().getMachOSection("__TEXT", "__gcc_except_tab", 0,                                               SectionKind::getReadOnlyWithRel()); -  EHFrameSection = -    getContext().getMachOSection("__TEXT", "__eh_frame", -                                 MCSectionMachO::S_COALESCED | -                                 MCSectionMachO::S_ATTR_NO_TOC | -                                 MCSectionMachO::S_ATTR_STRIP_STATIC_SYMS | -                                 MCSectionMachO::S_ATTR_LIVE_SUPPORT, -                                 SectionKind::getReadOnly()); -    // Debug Information.    DwarfAbbrevSection = -    getContext().getMachOSection("__DWARF", "__debug_abbrev",  +    getContext().getMachOSection("__DWARF", "__debug_abbrev",                                   MCSectionMachO::S_ATTR_DEBUG,                                   SectionKind::getMetadata());    DwarfInfoSection = @@ -623,10 +612,19 @@ void TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx,      getContext().getMachOSection("__DWARF", "__debug_inlined",                                   MCSectionMachO::S_ATTR_DEBUG,                                   SectionKind::getMetadata()); -                                  +    TLSExtraDataSection = TLSTLVSection;  } +const MCSection *TargetLoweringObjectFileMachO::getEHFrameSection() const { +  return getContext().getMachOSection("__TEXT", "__eh_frame", +                                      MCSectionMachO::S_COALESCED | +                                      MCSectionMachO::S_ATTR_NO_TOC | +                                      MCSectionMachO::S_ATTR_STRIP_STATIC_SYMS | +                                      MCSectionMachO::S_ATTR_LIVE_SUPPORT, +                                      SectionKind::getReadOnly()); +} +  const MCSection *TargetLoweringObjectFileMachO::  getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,                           Mangler *Mang, const TargetMachine &TM) const { @@ -665,7 +663,7 @@ getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,  const MCSection *TargetLoweringObjectFileMachO::  SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,                         Mangler *Mang, const TargetMachine &TM) const { -   +    // Handle thread local data.    if (Kind.isThreadBSS()) return TLSBSSSection;    if (Kind.isThreadData()) return TLSDataSection; @@ -685,7 +683,7 @@ SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,    if (Kind.isMergeable1ByteCString() &&        TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV)) < 32)      return CStringSection; -       +    // Do not put 16-bit arrays in the UString section if they have an    // externally visible label, this runs into issues with certain linker    // versions. @@ -721,7 +719,7 @@ SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,    // with the .zerofill directive (aka .lcomm).    if (Kind.isBSSLocal())      return DataBSSSection; -   +    // Otherwise, just drop the variable in the normal data section.    return DataSection;  } @@ -858,13 +856,6 @@ void TargetLoweringObjectFileCOFF::Initialize(MCContext &Ctx,                                  COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |                                  COFF::IMAGE_SCN_MEM_READ,                                  SectionKind::getReadOnly()); -  EHFrameSection = -    getContext().getCOFFSection(".eh_frame", -                                COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | -                                COFF::IMAGE_SCN_MEM_READ | -                                COFF::IMAGE_SCN_MEM_WRITE, -                                SectionKind::getDataRel()); -    // Debug info.    DwarfAbbrevSection =      getContext().getCOFFSection(".debug_abbrev", @@ -928,6 +919,15 @@ void TargetLoweringObjectFileCOFF::Initialize(MCContext &Ctx,                                  SectionKind::getMetadata());  } +const MCSection *TargetLoweringObjectFileCOFF::getEHFrameSection() const { +  return getContext().getCOFFSection(".eh_frame", +                                     COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | +                                     COFF::IMAGE_SCN_MEM_READ | +                                     COFF::IMAGE_SCN_MEM_WRITE, +                                     SectionKind::getDataRel()); +} + +  static unsigned  getCOFFSectionFlags(SectionKind K) {    unsigned Flags = 0; @@ -938,6 +938,7 @@ getCOFFSectionFlags(SectionKind K) {    else if (K.isText())      Flags |=        COFF::IMAGE_SCN_MEM_EXECUTE | +      COFF::IMAGE_SCN_MEM_READ |        COFF::IMAGE_SCN_CNT_CODE;    else if (K.isBSS ())      Flags |= @@ -967,12 +968,12 @@ getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,  static const char *getCOFFSectionPrefixForUniqueGlobal(SectionKind Kind) {    if (Kind.isText()) -    return ".text$linkonce"; +    return ".text$";    if (Kind.isBSS ()) -    return ".bss$linkonce"; +    return ".bss$";    if (Kind.isWriteable()) -    return ".data$linkonce"; -  return ".rdata$linkonce"; +    return ".data$"; +  return ".rdata$";  } @@ -987,14 +988,14 @@ SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,      const char *Prefix = getCOFFSectionPrefixForUniqueGlobal(Kind);      SmallString<128> Name(Prefix, Prefix+strlen(Prefix));      MCSymbol *Sym = Mang->getSymbol(GV); -    Name.append(Sym->getName().begin(), Sym->getName().end()); +    Name.append(Sym->getName().begin() + 1, Sym->getName().end());      unsigned Characteristics = getCOFFSectionFlags(Kind);      Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT;      return getContext().getCOFFSection(Name.str(), Characteristics, -                          COFF::IMAGE_COMDAT_SELECT_EXACT_MATCH, Kind); +                          COFF::IMAGE_COMDAT_SELECT_ANY, Kind);    }    if (Kind.isText()) | 
