mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-27 21:50:40 +00:00
Fix asm printing of associated sections.
Make MCSectionELF::AssociatedSection be a link to a symbol, because that's how it works in the assembly, and use it in the asm printer. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@297769 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
152625875f
commit
c67a9ef0ea
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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();
|
||||
|
@ -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()) {
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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");
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user