diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2015-01-18 16:17:27 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2015-01-18 16:17:27 +0000 | 
| commit | 67c32a98315f785a9ec9d531c1f571a0196c7463 (patch) | |
| tree | 4abb9cbeecc7901726dd0b4a37369596c852e9ef /lib/CodeGen/TargetLoweringObjectFileImpl.cpp | |
| parent | 9f61947910e6ab40de38e6b4034751ef1513200f (diff) | |
Vendor import of llvm RELEASE_360/rc1 tag r226102 (effectively, 3.6.0 RC1):vendor/llvm/llvm-release_360-r226102
Diffstat (limited to 'lib/CodeGen/TargetLoweringObjectFileImpl.cpp')
| -rw-r--r-- | lib/CodeGen/TargetLoweringObjectFileImpl.cpp | 179 | 
1 files changed, 76 insertions, 103 deletions
| diff --git a/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/lib/CodeGen/TargetLoweringObjectFileImpl.cpp index f59efa35031c..9f1e06b4725d 100644 --- a/lib/CodeGen/TargetLoweringObjectFileImpl.cpp +++ b/lib/CodeGen/TargetLoweringObjectFileImpl.cpp @@ -37,6 +37,7 @@  #include "llvm/Support/raw_ostream.h"  #include "llvm/Target/TargetLowering.h"  #include "llvm/Target/TargetMachine.h" +#include "llvm/Target/TargetSubtargetInfo.h"  using namespace llvm;  using namespace dwarf; @@ -72,9 +73,10 @@ void TargetLoweringObjectFileELF::emitPersonalityValue(MCStreamer &Streamer,                                                      Flags,                                                      SectionKind::getDataRel(),                                                      0, Label->getName()); -  unsigned Size = TM.getDataLayout()->getPointerSize(); +  unsigned Size = TM.getSubtargetImpl()->getDataLayout()->getPointerSize();    Streamer.SwitchSection(Sec); -  Streamer.EmitValueToAlignment(TM.getDataLayout()->getPointerABIAlignment()); +  Streamer.EmitValueToAlignment( +      TM.getSubtargetImpl()->getDataLayout()->getPointerABIAlignment());    Streamer.EmitSymbolAttribute(Label, MCSA_ELF_TypeObject);    const MCExpr *E = MCConstantExpr::Create(Size, getContext());    Streamer.EmitELFSize(Label, E); @@ -287,7 +289,8 @@ SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,      // FIXME: this is getting the alignment of the character, not the      // alignment of the global!      unsigned Align = -      TM.getDataLayout()->getPreferredAlignment(cast<GlobalVariable>(GV)); +        TM.getSubtargetImpl()->getDataLayout()->getPreferredAlignment( +            cast<GlobalVariable>(GV));      const char *SizeSpec = ".rodata.str1.";      if (Kind.isMergeable2ByteCString()) @@ -355,44 +358,59 @@ TargetLoweringObjectFileELF::getSectionForConstant(SectionKind Kind,    return DataRelROSection;  } -const MCSection *TargetLoweringObjectFileELF::getStaticCtorSection( -    unsigned Priority, const MCSymbol *KeySym) const { -  // The default scheme is .ctor / .dtor, so we have to invert the priority -  // numbering. -  if (Priority == 65535) -    return StaticCtorSection; +static const MCSectionELF *getStaticStructorSection(MCContext &Ctx, +                                                    bool UseInitArray, +                                                    bool IsCtor, +                                                    unsigned Priority, +                                                    const MCSymbol *KeySym) { +  std::string Name; +  unsigned Type; +  unsigned Flags = ELF::SHF_ALLOC | ELF::SHF_WRITE; +  SectionKind Kind = SectionKind::getDataRel(); +  StringRef COMDAT = KeySym ? KeySym->getName() : ""; + +  if (KeySym) +    Flags |= ELF::SHF_GROUP;    if (UseInitArray) { -    std::string Name = std::string(".init_array.") + utostr(Priority); -    return getContext().getELFSection(Name, ELF::SHT_INIT_ARRAY, -                                      ELF::SHF_ALLOC | ELF::SHF_WRITE, -                                      SectionKind::getDataRel()); +    if (IsCtor) { +      Type = ELF::SHT_INIT_ARRAY; +      Name = ".init_array"; +    } else { +      Type = ELF::SHT_FINI_ARRAY; +      Name = ".fini_array"; +    } +    if (Priority != 65535) { +      Name += '.'; +      Name += utostr(Priority); +    }    } else { -    std::string Name = std::string(".ctors.") + utostr(65535 - Priority); -    return getContext().getELFSection(Name, ELF::SHT_PROGBITS, -                                      ELF::SHF_ALLOC |ELF::SHF_WRITE, -                                      SectionKind::getDataRel()); +    // The default scheme is .ctor / .dtor, so we have to invert the priority +    // numbering. +    if (IsCtor) +      Name = ".ctors"; +    else +      Name = ".dtors"; +    if (Priority != 65535) { +      Name += '.'; +      Name += utostr(65535 - Priority); +    } +    Type = ELF::SHT_PROGBITS;    } + +  return Ctx.getELFSection(Name, Type, Flags, Kind, 0, COMDAT);  } -const MCSection *TargetLoweringObjectFileELF::getStaticDtorSection( +const MCSection *TargetLoweringObjectFileELF::getStaticCtorSection(      unsigned Priority, const MCSymbol *KeySym) const { -  // The default scheme is .ctor / .dtor, so we have to invert the priority -  // numbering. -  if (Priority == 65535) -    return StaticDtorSection; +  return getStaticStructorSection(getContext(), UseInitArray, true, Priority, +                                  KeySym); +} -  if (UseInitArray) { -    std::string Name = std::string(".fini_array.") + utostr(Priority); -    return getContext().getELFSection(Name, ELF::SHT_FINI_ARRAY, -                                      ELF::SHF_ALLOC | ELF::SHF_WRITE, -                                      SectionKind::getDataRel()); -  } else { -    std::string Name = std::string(".dtors.") + utostr(65535 - Priority); -    return getContext().getELFSection(Name, ELF::SHT_PROGBITS, -                                      ELF::SHF_ALLOC |ELF::SHF_WRITE, -                                      SectionKind::getDataRel()); -  } +const MCSection *TargetLoweringObjectFileELF::getStaticDtorSection( +    unsigned Priority, const MCSymbol *KeySym) const { +  return getStaticStructorSection(getContext(), UseInitArray, false, Priority, +                                  KeySym);  }  void @@ -446,14 +464,15 @@ emitModuleFlags(MCStreamer &Streamer,        continue;      StringRef Key = MFE.Key->getString(); -    Value *Val = MFE.Val; +    Metadata *Val = MFE.Val;      if (Key == "Objective-C Image Info Version") { -      VersionVal = cast<ConstantInt>(Val)->getZExtValue(); +      VersionVal = mdconst::extract<ConstantInt>(Val)->getZExtValue();      } else if (Key == "Objective-C Garbage Collection" ||                 Key == "Objective-C GC Only" || -               Key == "Objective-C Is Simulated") { -      ImageInfoFlags |= cast<ConstantInt>(Val)->getZExtValue(); +               Key == "Objective-C Is Simulated" || +               Key == "Objective-C Image Swift Version") { +      ImageInfoFlags |= mdconst::extract<ConstantInt>(Val)->getZExtValue();      } else if (Key == "Objective-C Image Info Section") {        SectionVal = cast<MDString>(Val)->getString();      } else if (Key == "Linker Options") { @@ -554,41 +573,6 @@ const MCSection *TargetLoweringObjectFileMachO::getExplicitSectionGlobal(    return S;  } -bool TargetLoweringObjectFileMachO::isSectionAtomizableBySymbols( -    const MCSection &Section) const { -    const MCSectionMachO &SMO = static_cast<const MCSectionMachO&>(Section); - -    // Sections holding 1 byte strings are atomized based on the data -    // they contain. -    // Sections holding 2 byte strings require symbols in order to be -    // atomized. -    // There is no dedicated section for 4 byte strings. -    if (SMO.getKind().isMergeable1ByteCString()) -      return false; - -    if (SMO.getSegmentName() == "__DATA" && -        SMO.getSectionName() == "__cfstring") -      return false; - -    switch (SMO.getType()) { -    default: -      return true; - -      // These sections are atomized at the element boundaries without using -      // symbols. -    case MachO::S_4BYTE_LITERALS: -    case MachO::S_8BYTE_LITERALS: -    case MachO::S_16BYTE_LITERALS: -    case MachO::S_LITERAL_POINTERS: -    case MachO::S_NON_LAZY_SYMBOL_POINTERS: -    case MachO::S_LAZY_SYMBOL_POINTERS: -    case MachO::S_MOD_INIT_FUNC_POINTERS: -    case MachO::S_MOD_TERM_FUNC_POINTERS: -    case MachO::S_INTERPOSING: -      return false; -    } -} -  const MCSection *TargetLoweringObjectFileMachO::  SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,                         Mangler &Mang, const TargetMachine &TM) const { @@ -611,17 +595,21 @@ SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,    // FIXME: Alignment check should be handled by section classifier.    if (Kind.isMergeable1ByteCString() && -      TM.getDataLayout()->getPreferredAlignment(cast<GlobalVariable>(GV)) < 32) +      TM.getSubtargetImpl()->getDataLayout()->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.    if (Kind.isMergeable2ByteCString() && !GV->hasExternalLinkage() && -      TM.getDataLayout()->getPreferredAlignment(cast<GlobalVariable>(GV)) < 32) +      TM.getSubtargetImpl()->getDataLayout()->getPreferredAlignment( +          cast<GlobalVariable>(GV)) < 32)      return UStringSection; -  if (Kind.isMergeableConst()) { +  // With MachO only variables whose corresponding symbol starts with 'l' or +  // 'L' can be merged, so we only try merging GVs with private linkage. +  if (GV->hasPrivateLinkage() && Kind.isMergeableConst()) {      if (Kind.isMergeableConst4())        return FourByteConstantSection;      if (Kind.isMergeableConst8()) @@ -739,7 +727,7 @@ getCOFFSectionFlags(SectionKind K) {        COFF::IMAGE_SCN_MEM_EXECUTE |        COFF::IMAGE_SCN_MEM_READ |        COFF::IMAGE_SCN_CNT_CODE; -  else if (K.isBSS ()) +  else if (K.isBSS())      Flags |=        COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA |        COFF::IMAGE_SCN_MEM_READ | @@ -749,7 +737,7 @@ getCOFFSectionFlags(SectionKind K) {        COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |        COFF::IMAGE_SCN_MEM_READ |        COFF::IMAGE_SCN_MEM_WRITE; -  else if (K.isReadOnly()) +  else if (K.isReadOnly() || K.isReadOnlyWithRel())      Flags |=        COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |        COFF::IMAGE_SCN_MEM_READ; @@ -774,7 +762,7 @@ static const GlobalValue *getComdatGVForCOFF(const GlobalValue *GV) {    if (ComdatGV->getComdat() != C)      report_fatal_error("Associative COMDAT symbol '" + ComdatGVName + -                       "' is not a key for it's COMDAT."); +                       "' is not a key for its COMDAT.");    return ComdatGV;  } @@ -843,9 +831,9 @@ static const char *getCOFFSectionNameForUniqueGlobal(SectionKind Kind) {      return ".bss";    if (Kind.isThreadLocal())      return ".tls$"; -  if (Kind.isWriteable()) -    return ".data"; -  return ".rdata"; +  if (Kind.isReadOnly() || Kind.isReadOnlyWithRel()) +    return ".rdata"; +  return ".data";  } @@ -893,7 +881,7 @@ SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,    if (Kind.isThreadLocal())      return TLSDataSection; -  if (Kind.isReadOnly()) +  if (Kind.isReadOnly() || Kind.isReadOnlyWithRel())      return ReadOnlySection;    // Note: we claim that common symbols are put in BSSSection, but they are @@ -924,7 +912,7 @@ emitModuleFlags(MCStreamer &Streamer,         i = ModuleFlags.begin(), e = ModuleFlags.end(); i != e; ++i) {      const Module::ModuleFlagEntry &MFE = *i;      StringRef Key = MFE.Key->getString(); -    Value *Val = MFE.Val; +    Metadata *Val = MFE.Val;      if (Key == "Linker Options") {        LinkerOptions = cast<MDNode>(Val);        break; @@ -944,7 +932,7 @@ emitModuleFlags(MCStreamer &Streamer,        StringRef Op = MDOption->getString();        // Lead with a space for consistency with our dllexport implementation.        std::string Escaped(" "); -      if (Op.find(" ") != StringRef::npos) { +      if (!Op.startswith("\"") && (Op.find(" ") != StringRef::npos)) {          // The PE-COFF spec says args with spaces must be quoted.  It doesn't say          // how to escape quotes, but it probably uses this algorithm:          // http://msdn.microsoft.com/en-us/library/17w5ykft(v=vs.85).aspx @@ -960,29 +948,14 @@ emitModuleFlags(MCStreamer &Streamer,    }  } -static const MCSection *getAssociativeCOFFSection(MCContext &Ctx, -                                                  const MCSection *Sec, -                                                  const MCSymbol *KeySym) { -  // Return the normal section if we don't have to be associative. -  if (!KeySym) -    return Sec; - -  // Make an associative section with the same name and kind as the normal -  // section. -  const MCSectionCOFF *SecCOFF = cast<MCSectionCOFF>(Sec); -  unsigned Characteristics = -      SecCOFF->getCharacteristics() | COFF::IMAGE_SCN_LNK_COMDAT; -  return Ctx.getCOFFSection(SecCOFF->getSectionName(), Characteristics, -                            SecCOFF->getKind(), KeySym->getName(), -                            COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE); -} -  const MCSection *TargetLoweringObjectFileCOFF::getStaticCtorSection(      unsigned Priority, const MCSymbol *KeySym) const { -  return getAssociativeCOFFSection(getContext(), StaticCtorSection, KeySym); +  return getContext().getAssociativeCOFFSection( +      cast<MCSectionCOFF>(StaticCtorSection), KeySym);  }  const MCSection *TargetLoweringObjectFileCOFF::getStaticDtorSection(      unsigned Priority, const MCSymbol *KeySym) const { -  return getAssociativeCOFFSection(getContext(), StaticDtorSection, KeySym); +  return getContext().getAssociativeCOFFSection( +      cast<MCSectionCOFF>(StaticDtorSection), KeySym);  } | 
