diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2016-07-23 20:41:05 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2016-07-23 20:41:05 +0000 | 
| commit | 01095a5d43bbfde13731688ddcf6048ebb8b7721 (patch) | |
| tree | 4def12e759965de927d963ac65840d663ef9d1ea /lib/CodeGen/TargetLoweringObjectFileImpl.cpp | |
| parent | f0f4822ed4b66e3579e92a89f368f8fb860e218e (diff) | |
Notes
Diffstat (limited to 'lib/CodeGen/TargetLoweringObjectFileImpl.cpp')
| -rw-r--r-- | lib/CodeGen/TargetLoweringObjectFileImpl.cpp | 144 | 
1 files changed, 82 insertions, 62 deletions
| diff --git a/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/lib/CodeGen/TargetLoweringObjectFileImpl.cpp index 58ae9cc53bda..5f814c957e92 100644 --- a/lib/CodeGen/TargetLoweringObjectFileImpl.cpp +++ b/lib/CodeGen/TargetLoweringObjectFileImpl.cpp @@ -33,6 +33,7 @@  #include "llvm/MC/MCStreamer.h"  #include "llvm/MC/MCSymbolELF.h"  #include "llvm/MC/MCValue.h" +#include "llvm/ProfileData/InstrProf.h"  #include "llvm/Support/COFF.h"  #include "llvm/Support/Dwarf.h"  #include "llvm/Support/ELF.h" @@ -68,11 +69,9 @@ void TargetLoweringObjectFileELF::emitPersonalityValue(        cast<MCSymbolELF>(getContext().getOrCreateSymbol(NameData));    Streamer.EmitSymbolAttribute(Label, MCSA_Hidden);    Streamer.EmitSymbolAttribute(Label, MCSA_Weak); -  StringRef Prefix = ".data."; -  NameData.insert(NameData.begin(), Prefix.begin(), Prefix.end());    unsigned Flags = ELF::SHF_ALLOC | ELF::SHF_WRITE | ELF::SHF_GROUP; -  MCSection *Sec = getContext().getELFSection(NameData, ELF::SHT_PROGBITS, -                                              Flags, 0, Label->getName()); +  MCSection *Sec = getContext().getELFNamedSection(".data", Label->getName(), +                                                   ELF::SHT_PROGBITS, Flags, 0);    unsigned Size = DL.getPointerSize();    Streamer.SwitchSection(Sec);    Streamer.EmitValueToAlignment(DL.getPointerABIAlignment()); @@ -119,6 +118,10 @@ getELFKindForNamedSection(StringRef Name, SectionKind K) {    // section(".eh_frame") gcc will produce:    //    //   .section   .eh_frame,"a",@progbits +   +  if (Name == getInstrProfCoverageSectionName(false)) +    return SectionKind::getMetadata(); +    if (Name.empty() || Name[0] != '.') return K;    // Some lame default implementation based on some magic section names. @@ -259,9 +262,11 @@ selectELFSectionForGlobal(MCContext &Ctx, const GlobalValue *GV,        EntrySize = 4;      } else if (Kind.isMergeableConst8()) {        EntrySize = 8; -    } else { -      assert(Kind.isMergeableConst16() && "unknown data width"); +    } else if (Kind.isMergeableConst16()) {        EntrySize = 16; +    } else { +      assert(Kind.isMergeableConst32() && "unknown data width"); +      EntrySize = 32;      }    } @@ -288,12 +293,14 @@ selectELFSectionForGlobal(MCContext &Ctx, const GlobalValue *GV,    } else {      Name = getSectionPrefixForGlobal(Kind);    } +  // FIXME: Extend the section prefix to include hotness catagories such as .hot +  //  or .unlikely for functions.    if (EmitUniqueSection && UniqueSectionNames) {      Name.push_back('.');      TM.getNameWithPrefix(Name, GV, Mang, true);    } -  unsigned UniqueID = ~0; +  unsigned UniqueID = MCContext::GenericSectionID;    if (EmitUniqueSection && !UniqueSectionNames) {      UniqueID = *NextUniqueID;      (*NextUniqueID)++; @@ -346,13 +353,16 @@ bool TargetLoweringObjectFileELF::shouldPutJumpTableInFunctionSection(  /// Given a mergeable constant with the specified size and relocation  /// information, return a section that it should be placed in.  MCSection *TargetLoweringObjectFileELF::getSectionForConstant( -    const DataLayout &DL, SectionKind Kind, const Constant *C) const { +    const DataLayout &DL, SectionKind Kind, const Constant *C, +    unsigned &Align) const {    if (Kind.isMergeableConst4() && MergeableConst4Section)      return MergeableConst4Section;    if (Kind.isMergeableConst8() && MergeableConst8Section)      return MergeableConst8Section;    if (Kind.isMergeableConst16() && MergeableConst16Section)      return MergeableConst16Section; +  if (Kind.isMergeableConst32() && MergeableConst32Section) +    return MergeableConst32Section;    if (Kind.isReadOnly())      return ReadOnlySection; @@ -412,6 +422,27 @@ MCSection *TargetLoweringObjectFileELF::getStaticDtorSection(                                    KeySym);  } +const MCExpr *TargetLoweringObjectFileELF::lowerRelativeReference( +    const GlobalValue *LHS, const GlobalValue *RHS, Mangler &Mang, +    const TargetMachine &TM) const { +  // We may only use a PLT-relative relocation to refer to unnamed_addr +  // functions. +  if (!LHS->hasGlobalUnnamedAddr() || !LHS->getValueType()->isFunctionTy()) +    return nullptr; + +  // Basic sanity checks. +  if (LHS->getType()->getPointerAddressSpace() != 0 || +      RHS->getType()->getPointerAddressSpace() != 0 || LHS->isThreadLocal() || +      RHS->isThreadLocal()) +    return nullptr; + +  return MCBinaryExpr::createSub( +      MCSymbolRefExpr::create(TM.getSymbol(LHS, Mang), PLTRelativeVariantKind, +                              getContext()), +      MCSymbolRefExpr::create(TM.getSymbol(RHS, Mang), getContext()), +      getContext()); +} +  void  TargetLoweringObjectFileELF::InitializeELF(bool UseInitArray_) {    UseInitArray = UseInitArray_; @@ -443,10 +474,7 @@ emitModuleFlags(MCStreamer &Streamer,    MDNode *LinkerOptions = nullptr;    StringRef SectionVal; -  for (ArrayRef<Module::ModuleFlagEntry>::iterator -         i = ModuleFlags.begin(), e = ModuleFlags.end(); i != e; ++i) { -    const Module::ModuleFlagEntry &MFE = *i; - +  for (const auto &MFE : ModuleFlags) {      // Ignore flags with 'Require' behavior.      if (MFE.Behavior == Module::Require)        continue; @@ -459,6 +487,7 @@ emitModuleFlags(MCStreamer &Streamer,      } else if (Key == "Objective-C Garbage Collection" ||                 Key == "Objective-C GC Only" ||                 Key == "Objective-C Is Simulated" || +               Key == "Objective-C Class Properties" ||                 Key == "Objective-C Image Swift Version") {        ImageInfoFlags |= mdconst::extract<ConstantInt>(Val)->getZExtValue();      } else if (Key == "Objective-C Image Info Section") { @@ -470,16 +499,10 @@ emitModuleFlags(MCStreamer &Streamer,    // Emit the linker options if present.    if (LinkerOptions) { -    for (unsigned i = 0, e = LinkerOptions->getNumOperands(); i != e; ++i) { -      MDNode *MDOptions = cast<MDNode>(LinkerOptions->getOperand(i)); +    for (const auto &Option : LinkerOptions->operands()) {        SmallVector<std::string, 4> StrOptions; - -      // Convert to strings. -      for (unsigned ii = 0, ie = MDOptions->getNumOperands(); ii != ie; ++ii) { -        MDString *MDOption = cast<MDString>(MDOptions->getOperand(ii)); -        StrOptions.push_back(MDOption->getString()); -      } - +      for (const auto &Piece : cast<MDNode>(Option)->operands()) +        StrOptions.push_back(cast<MDString>(Piece)->getString());        Streamer.EmitLinkerOptions(StrOptions);      }    } @@ -630,7 +653,8 @@ MCSection *TargetLoweringObjectFileMachO::SelectSectionForGlobal(  }  MCSection *TargetLoweringObjectFileMachO::getSectionForConstant( -    const DataLayout &DL, SectionKind Kind, const Constant *C) const { +    const DataLayout &DL, SectionKind Kind, const Constant *C, +    unsigned &Align) const {    // If this constant requires a relocation, we have to put it in the data    // segment, not in the text segment.    if (Kind.isData() || Kind.isReadOnlyWithRel()) @@ -660,9 +684,7 @@ const MCExpr *TargetLoweringObjectFileMachO::getTTypeGlobalReference(      // Add information about the stub reference to MachOMMI so that the stub      // gets emitted by the asmprinter. -    MachineModuleInfoImpl::StubValueTy &StubSym = -      GV->hasHiddenVisibility() ? MachOMMI.getHiddenGVStubEntry(SSym) : -                                  MachOMMI.getGVStubEntry(SSym); +    MachineModuleInfoImpl::StubValueTy &StubSym = MachOMMI.getGVStubEntry(SSym);      if (!StubSym.getPointer()) {        MCSymbol *Sym = TM.getSymbol(GV, Mang);        StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage()); @@ -785,8 +807,9 @@ void TargetLoweringObjectFileMachO::getNameWithPrefix(  //===----------------------------------------------------------------------===//  static unsigned -getCOFFSectionFlags(SectionKind K) { +getCOFFSectionFlags(SectionKind K, const TargetMachine &TM) {    unsigned Flags = 0; +  bool isThumb = TM.getTargetTriple().getArch() == Triple::thumb;    if (K.isMetadata())      Flags |= @@ -795,7 +818,8 @@ getCOFFSectionFlags(SectionKind K) {      Flags |=        COFF::IMAGE_SCN_MEM_EXECUTE |        COFF::IMAGE_SCN_MEM_READ | -      COFF::IMAGE_SCN_CNT_CODE; +      COFF::IMAGE_SCN_CNT_CODE | +      (isThumb ? COFF::IMAGE_SCN_MEM_16BIT : (COFF::SectionCharacteristics)0);    else if (K.isBSS())      Flags |=        COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA | @@ -865,7 +889,7 @@ MCSection *TargetLoweringObjectFileCOFF::getExplicitSectionGlobal(      const GlobalValue *GV, SectionKind Kind, Mangler &Mang,      const TargetMachine &TM) const {    int Selection = 0; -  unsigned Characteristics = getCOFFSectionFlags(Kind); +  unsigned Characteristics = getCOFFSectionFlags(Kind, TM);    StringRef Name = GV->getSection();    StringRef COMDATSymName = "";    if (GV->hasComdat()) { @@ -884,10 +908,8 @@ MCSection *TargetLoweringObjectFileCOFF::getExplicitSectionGlobal(        Selection = 0;      }    } -  return getContext().getCOFFSection(Name, -                                     Characteristics, -                                     Kind, -                                     COMDATSymName, + +  return getContext().getCOFFSection(Name, Characteristics, Kind, COMDATSymName,                                       Selection);  } @@ -916,7 +938,7 @@ MCSection *TargetLoweringObjectFileCOFF::SelectSectionForGlobal(    if ((EmitUniquedSection && !Kind.isCommon()) || GV->hasComdat()) {      const char *Name = getCOFFSectionNameForUniqueGlobal(Kind); -    unsigned Characteristics = getCOFFSectionFlags(Kind); +    unsigned Characteristics = getCOFFSectionFlags(Kind, TM);      Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT;      int Selection = getSelectionForCOFF(GV); @@ -928,16 +950,20 @@ MCSection *TargetLoweringObjectFileCOFF::SelectSectionForGlobal(      else        ComdatGV = GV; +    unsigned UniqueID = MCContext::GenericSectionID; +    if (EmitUniquedSection) +      UniqueID = NextUniqueID++; +      if (!ComdatGV->hasPrivateLinkage()) {        MCSymbol *Sym = TM.getSymbol(ComdatGV, Mang);        StringRef COMDATSymName = Sym->getName();        return getContext().getCOFFSection(Name, Characteristics, Kind, -                                         COMDATSymName, Selection); +                                         COMDATSymName, Selection, UniqueID);      } else {        SmallString<256> TmpData;        Mang.getNameWithPrefix(TmpData, GV, /*CannotUsePrivateLabel=*/true);        return getContext().getCOFFSection(Name, Characteristics, Kind, TmpData, -                                         Selection); +                                         Selection, UniqueID);      }    } @@ -989,11 +1015,12 @@ MCSection *TargetLoweringObjectFileCOFF::getSectionForJumpTable(    SectionKind Kind = SectionKind::getReadOnly();    const char *Name = getCOFFSectionNameForUniqueGlobal(Kind); -  unsigned Characteristics = getCOFFSectionFlags(Kind); +  unsigned Characteristics = getCOFFSectionFlags(Kind, TM);    Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT; +  unsigned UniqueID = NextUniqueID++;    return getContext().getCOFFSection(Name, Characteristics, Kind, COMDATSymName, -                                     COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE); +                                     COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE, UniqueID);  }  void TargetLoweringObjectFileCOFF:: @@ -1002,32 +1029,25 @@ emitModuleFlags(MCStreamer &Streamer,                  Mangler &Mang, const TargetMachine &TM) const {    MDNode *LinkerOptions = nullptr; -  // Look for the "Linker Options" flag, since it's the only one we support. -  for (ArrayRef<Module::ModuleFlagEntry>::iterator -       i = ModuleFlags.begin(), e = ModuleFlags.end(); i != e; ++i) { -    const Module::ModuleFlagEntry &MFE = *i; +  for (const auto &MFE : ModuleFlags) {      StringRef Key = MFE.Key->getString(); -    Metadata *Val = MFE.Val; -    if (Key == "Linker Options") { -      LinkerOptions = cast<MDNode>(Val); -      break; -    } +    if (Key == "Linker Options") +      LinkerOptions = cast<MDNode>(MFE.Val);    } -  if (!LinkerOptions) -    return; -  // Emit the linker options to the linker .drectve section.  According to the -  // spec, this section is a space-separated string containing flags for linker. -  MCSection *Sec = getDrectveSection(); -  Streamer.SwitchSection(Sec); -  for (unsigned i = 0, e = LinkerOptions->getNumOperands(); i != e; ++i) { -    MDNode *MDOptions = cast<MDNode>(LinkerOptions->getOperand(i)); -    for (unsigned ii = 0, ie = MDOptions->getNumOperands(); ii != ie; ++ii) { -      MDString *MDOption = cast<MDString>(MDOptions->getOperand(ii)); -      // Lead with a space for consistency with our dllexport implementation. -      std::string Directive(" "); -      Directive.append(MDOption->getString()); -      Streamer.EmitBytes(Directive); +  if (LinkerOptions) { +    // Emit the linker options to the linker .drectve section.  According to the +    // spec, this section is a space-separated string containing flags for +    // linker. +    MCSection *Sec = getDrectveSection(); +    Streamer.SwitchSection(Sec); +    for (const auto &Option : LinkerOptions->operands()) { +      for (const auto &Piece : cast<MDNode>(Option)->operands()) { +        // Lead with a space for consistency with our dllexport implementation. +        std::string Directive(" "); +        Directive.append(cast<MDString>(Piece)->getString()); +        Streamer.EmitBytes(Directive); +      }      }    }  } @@ -1035,13 +1055,13 @@ emitModuleFlags(MCStreamer &Streamer,  MCSection *TargetLoweringObjectFileCOFF::getStaticCtorSection(      unsigned Priority, const MCSymbol *KeySym) const {    return getContext().getAssociativeCOFFSection( -      cast<MCSectionCOFF>(StaticCtorSection), KeySym); +      cast<MCSectionCOFF>(StaticCtorSection), KeySym, 0);  }  MCSection *TargetLoweringObjectFileCOFF::getStaticDtorSection(      unsigned Priority, const MCSymbol *KeySym) const {    return getContext().getAssociativeCOFFSection( -      cast<MCSectionCOFF>(StaticDtorSection), KeySym); +      cast<MCSectionCOFF>(StaticDtorSection), KeySym, 0);  }  void TargetLoweringObjectFileCOFF::emitLinkerFlagsForGlobal( | 
