diff options
| -rw-r--r-- | llvm/include/llvm/MC/MCContext.h | 8 | ||||
| -rw-r--r-- | llvm/include/llvm/MC/MCSectionELF.h | 11 | ||||
| -rw-r--r-- | llvm/lib/MC/ELFObjectWriter.cpp | 14 | ||||
| -rw-r--r-- | llvm/lib/MC/MCContext.cpp | 14 | ||||
| -rw-r--r-- | llvm/lib/MC/MCParser/ELFAsmParser.cpp | 16 | ||||
| -rw-r--r-- | llvm/lib/MC/MCSectionELF.cpp | 8 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp | 3 | ||||
| -rw-r--r-- | llvm/test/MC/ELF/section.s | 4 | 
8 files changed, 48 insertions, 30 deletions
diff --git a/llvm/include/llvm/MC/MCContext.h b/llvm/include/llvm/MC/MCContext.h index 4ae170a3326..b3106936e27 100644 --- a/llvm/include/llvm/MC/MCContext.h +++ b/llvm/include/llvm/MC/MCContext.h @@ -262,7 +262,7 @@ namespace llvm {                                         unsigned EntrySize,                                         const MCSymbolELF *Group,                                         unsigned UniqueID, -                                       const MCSectionELF *Associated); +                                       const MCSymbolELF *Associated);    public:      explicit MCContext(const MCAsmInfo *MAI, const MCRegisterInfo *MRI, @@ -393,12 +393,12 @@ namespace llvm {      MCSectionELF *getELFSection(const Twine &Section, unsigned Type,                                  unsigned Flags, unsigned EntrySize,                                  const Twine &Group, unsigned UniqueID, -                                const MCSectionELF *Associated); +                                const MCSymbolELF *Associated);      MCSectionELF *getELFSection(const Twine &Section, unsigned Type,                                  unsigned Flags, unsigned EntrySize,                                  const MCSymbolELF *Group, unsigned UniqueID, -                                const MCSectionELF *Associated); +                                const MCSymbolELF *Associated);      /// Get a section with the provided group identifier. This section is      /// named by concatenating \p Prefix with '.' then \p Suffix. The \p Type @@ -411,7 +411,7 @@ namespace llvm {      MCSectionELF *createELFRelSection(const Twine &Name, unsigned Type,                                        unsigned Flags, unsigned EntrySize,                                        const MCSymbolELF *Group, -                                      const MCSectionELF *Associated); +                                      const MCSectionELF *RelInfoSection);      void renameELFSection(MCSectionELF *Section, StringRef Name); diff --git a/llvm/include/llvm/MC/MCSectionELF.h b/llvm/include/llvm/MC/MCSectionELF.h index 678e20aed5e..00c289c6bd6 100644 --- a/llvm/include/llvm/MC/MCSectionELF.h +++ b/llvm/include/llvm/MC/MCSectionELF.h @@ -45,18 +45,18 @@ class MCSectionELF final : public MCSection {    const MCSymbolELF *Group; -  /// Depending on the type of the section this is sh_link or sh_info. -  const MCSectionELF *Associated; +  /// sh_info for SHF_LINK_ORDER (can be null). +  const MCSymbol *AssociatedSymbol;  private:    friend class MCContext;    MCSectionELF(StringRef Section, unsigned type, unsigned flags, SectionKind K,                 unsigned entrySize, const MCSymbolELF *group, unsigned UniqueID, -               MCSymbol *Begin, const MCSectionELF *Associated) +               MCSymbol *Begin, const MCSymbolELF *AssociatedSymbol)        : MCSection(SV_ELF, K, Begin), SectionName(Section), Type(type),          Flags(flags), UniqueID(UniqueID), EntrySize(entrySize), Group(group), -        Associated(Associated) { +        AssociatedSymbol(AssociatedSymbol) {      if (Group)        Group->setIsSignature();    } @@ -86,7 +86,8 @@ public:    bool isUnique() const { return UniqueID != ~0U; }    unsigned getUniqueID() const { return UniqueID; } -  const MCSectionELF *getAssociatedSection() const { return Associated; } +  const MCSection *getAssociatedSection() const { return &AssociatedSymbol->getSection(); } +  const MCSymbol *getAssociatedSymbol() const { return AssociatedSymbol; }    static bool classof(const MCSection *S) {      return S->getVariant() == SV_ELF; diff --git a/llvm/lib/MC/ELFObjectWriter.cpp b/llvm/lib/MC/ELFObjectWriter.cpp index 18dd50826a5..b6f21ba26b6 100644 --- a/llvm/lib/MC/ELFObjectWriter.cpp +++ b/llvm/lib/MC/ELFObjectWriter.cpp @@ -1156,8 +1156,8 @@ void ELFObjectWriter::writeSection(const SectionIndexMapTy &SectionIndexMap,    case ELF::SHT_RELA: {      sh_link = SymbolTableIndex;      assert(sh_link && ".symtab not found"); -    const MCSectionELF *InfoSection = Section.getAssociatedSection(); -    sh_info = SectionIndexMap.lookup(InfoSection); +    const MCSection *InfoSection = Section.getAssociatedSection(); +    sh_info = SectionIndexMap.lookup(cast<MCSectionELF>(InfoSection));      break;    } @@ -1177,8 +1177,11 @@ void ELFObjectWriter::writeSection(const SectionIndexMapTy &SectionIndexMap,      break;    } -  if (Section.getFlags() & ELF::SHF_LINK_ORDER) -    sh_link = SectionIndexMap.lookup(Section.getAssociatedSection()); +  if (Section.getFlags() & ELF::SHF_LINK_ORDER) { +    const MCSymbol *Sym = Section.getAssociatedSymbol(); +    const MCSectionELF *Sec = cast<MCSectionELF>(&Sym->getSection()); +    sh_link = SectionIndexMap.lookup(Sec); +  }    WriteSecHdrEntry(StrTabBuilder.getOffset(Section.getSectionName()),                     Section.getType(), Section.getFlags(), 0, Offset, Size, @@ -1302,7 +1305,8 @@ void ELFObjectWriter::writeObject(MCAssembler &Asm,      // Remember the offset into the file for this section.      uint64_t SecStart = getStream().tell(); -    writeRelocations(Asm, *RelSection->getAssociatedSection()); +    writeRelocations(Asm, +                     cast<MCSectionELF>(*RelSection->getAssociatedSection()));      uint64_t SecEnd = getStream().tell();      SectionOffsets[RelSection] = std::make_pair(SecStart, SecEnd); diff --git a/llvm/lib/MC/MCContext.cpp b/llvm/lib/MC/MCContext.cpp index 9d5bd39b56f..4628d0ab88f 100644 --- a/llvm/lib/MC/MCContext.cpp +++ b/llvm/lib/MC/MCContext.cpp @@ -317,7 +317,7 @@ MCSectionELF *MCContext::createELFSectionImpl(StringRef Section, unsigned Type,                                                unsigned EntrySize,                                                const MCSymbolELF *Group,                                                unsigned UniqueID, -                                              const MCSectionELF *Associated) { +                                              const MCSymbolELF *Associated) {    MCSymbolELF *R;    MCSymbol *&Sym = Symbols[Section];    // A section symbol can not redefine regular symbols. There may be multiple @@ -350,15 +350,15 @@ MCSectionELF *MCContext::createELFSectionImpl(StringRef Section, unsigned Type,  MCSectionELF *MCContext::createELFRelSection(const Twine &Name, unsigned Type,                                               unsigned Flags, unsigned EntrySize,                                               const MCSymbolELF *Group, -                                             const MCSectionELF *Associated) { +                                             const MCSectionELF *RelInfoSection) {    StringMap<bool>::iterator I;    bool Inserted;    std::tie(I, Inserted) =        RelSecNames.insert(std::make_pair(Name.str(), true)); -  return createELFSectionImpl(I->getKey(), Type, Flags, -                              SectionKind::getReadOnly(), EntrySize, Group, -                              true, Associated); +  return createELFSectionImpl( +      I->getKey(), Type, Flags, SectionKind::getReadOnly(), EntrySize, Group, +      true, cast<MCSymbolELF>(RelInfoSection->getBeginSymbol()));  }  MCSectionELF *MCContext::getELFNamedSection(const Twine &Prefix, @@ -371,7 +371,7 @@ MCSectionELF *MCContext::getELFNamedSection(const Twine &Prefix,  MCSectionELF *MCContext::getELFSection(const Twine &Section, unsigned Type,                                         unsigned Flags, unsigned EntrySize,                                         const Twine &Group, unsigned UniqueID, -                                       const MCSectionELF *Associated) { +                                       const MCSymbolELF *Associated) {    MCSymbolELF *GroupSym = nullptr;    if (!Group.isTriviallyEmpty() && !Group.str().empty())      GroupSym = cast<MCSymbolELF>(getOrCreateSymbol(Group)); @@ -384,7 +384,7 @@ MCSectionELF *MCContext::getELFSection(const Twine &Section, unsigned Type,                                         unsigned Flags, unsigned EntrySize,                                         const MCSymbolELF *GroupSym,                                         unsigned UniqueID, -                                       const MCSectionELF *Associated) { +                                       const MCSymbolELF *Associated) {    StringRef Group = "";    if (GroupSym)      Group = GroupSym->getName(); diff --git a/llvm/lib/MC/MCParser/ELFAsmParser.cpp b/llvm/lib/MC/MCParser/ELFAsmParser.cpp index 8838f16d60a..4ac16615ceb 100644 --- a/llvm/lib/MC/MCParser/ELFAsmParser.cpp +++ b/llvm/lib/MC/MCParser/ELFAsmParser.cpp @@ -157,7 +157,7 @@ private:    bool maybeParseSectionType(StringRef &TypeName);    bool parseMergeSize(int64_t &Size);    bool parseGroup(StringRef &GroupName); -  bool parseMetadataSym(MCSectionELF *&Associated); +  bool parseMetadataSym(MCSymbolELF *&Associated);    bool maybeParseUniqueID(int64_t &UniqueID);  }; @@ -432,7 +432,7 @@ bool ELFAsmParser::parseGroup(StringRef &GroupName) {    return false;  } -bool ELFAsmParser::parseMetadataSym(MCSectionELF *&Associated) { +bool ELFAsmParser::parseMetadataSym(MCSymbolELF *&Associated) {    MCAsmLexer &L = getLexer();    if (L.isNot(AsmToken::Comma))      return TokError("expected metadata symbol"); @@ -440,10 +440,9 @@ bool ELFAsmParser::parseMetadataSym(MCSectionELF *&Associated) {    StringRef Name;    if (getParser().parseIdentifier(Name))      return true; -  MCSymbol *Sym = getContext().lookupSymbol(Name); -  if (!Sym || !Sym->isInSection()) +  Associated = dyn_cast_or_null<MCSymbolELF>(getContext().lookupSymbol(Name)); +  if (!Associated || !Associated->isInSection())      return TokError("symbol is not in a section: " + Name); -  Associated = cast<MCSectionELF>(&Sym->getSection());    return false;  } @@ -482,7 +481,7 @@ bool ELFAsmParser::ParseSectionArguments(bool IsPush, SMLoc loc) {    const MCExpr *Subsection = nullptr;    bool UseLastGroup = false;    StringRef UniqueStr; -  MCSectionELF *Associated = nullptr; +  MCSymbolELF *Associated = nullptr;    int64_t UniqueID = ~0;    // Set the defaults first. @@ -597,8 +596,9 @@ EndStmt:        }    } -  MCSection *ELFSection = getContext().getELFSection( -      SectionName, Type, Flags, Size, GroupName, UniqueID, Associated); +  MCSection *ELFSection = +      getContext().getELFSection(SectionName, Type, Flags, Size, GroupName, +                                 UniqueID, Associated);    getStreamer().SwitchSection(ELFSection, Subsection);    if (getContext().getGenDwarfForAssembly()) { diff --git a/llvm/lib/MC/MCSectionELF.cpp b/llvm/lib/MC/MCSectionELF.cpp index a352f84cfe9..56c51d7539e 100644 --- a/llvm/lib/MC/MCSectionELF.cpp +++ b/llvm/lib/MC/MCSectionELF.cpp @@ -103,6 +103,8 @@ void MCSectionELF::PrintSwitchToSection(const MCAsmInfo &MAI, const Triple &T,      OS << 'S';    if (Flags & ELF::SHF_TLS)      OS << 'T'; +  if (Flags & ELF::SHF_LINK_ORDER) +    OS << 'm';    // If there are target-specific flags, print them.    Triple::ArchType Arch = T.getArch(); @@ -160,6 +162,12 @@ void MCSectionELF::PrintSwitchToSection(const MCAsmInfo &MAI, const Triple &T,      OS << ",comdat";    } +  if (Flags & ELF::SHF_LINK_ORDER) { +    assert(AssociatedSymbol); +    OS << ","; +    printName(OS, AssociatedSymbol->getName()); +  } +    if (isUnique())      OS << ",unique," << UniqueID; diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp index 043b54b356a..f7bdda491cb 100644 --- a/llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp +++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp @@ -1139,7 +1139,8 @@ inline void ARMELFStreamer::SwitchToEHSection(StringRef Prefix,    if (Group)      Flags |= ELF::SHF_GROUP;    MCSectionELF *EHSection = getContext().getELFSection( -      EHSecName, Type, Flags, 0, Group, FnSection.getUniqueID(), &FnSection); +      EHSecName, Type, Flags, 0, Group, FnSection.getUniqueID(), +      static_cast<const MCSymbolELF *>(&Fn));    assert(EHSection && "Failed to get the required EH section"); diff --git a/llvm/test/MC/ELF/section.s b/llvm/test/MC/ELF/section.s index 1177bb769cc..2accab0e449 100644 --- a/llvm/test/MC/ELF/section.s +++ b/llvm/test/MC/ELF/section.s @@ -1,4 +1,5 @@  // RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | llvm-readobj -s | FileCheck %s +// RUN: llvm-mc -filetype=asm -triple x86_64-pc-linux-gnu %s -o - |  FileCheck %s --check-prefix=ASM  // Test that these names are accepted. @@ -165,6 +166,9 @@ bar:  .section .shf_metadata1,"am",@progbits,.Lshf_metadata_target2_1  .section .shf_metadata2,"am",@progbits,.Lshf_metadata_target2_2  .section .shf_metadata3,"am",@progbits,.shf_metadata_target1 +// ASM: .section .shf_metadata1,"am",@progbits,.Lshf_metadata_target2_1 +// ASM: .section .shf_metadata2,"am",@progbits,.Lshf_metadata_target2_2 +// ASM: .section .shf_metadata3,"am",@progbits,.shf_metadata_target1  // CHECK:      Section {  // CHECK:        Index: 22  | 

