mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-16 12:24:03 +00:00
Revert a series of commits starting at r228886 which is triggering some
regressions for LLDB on Linux. Rafael indicated on lldb-dev that we should just go ahead and revert these but that he wasn't at a computer. The patches backed out are as follows: r228980: Add support for having multiple sections with the name and ... r228889: Invert the section relocation map. r228888: Use the existing SymbolTableIndex intsead of doing a lookup. r228886: Create the Section -> Rel Section map when it is first needed. These patches look pretty nice to me, so hoping its not too hard to get them re-instated. =D git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@229080 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -247,12 +247,11 @@ class ELFObjectWriter : public MCObjectWriter {
|
||||
const RevGroupMapTy &RevGroupMap,
|
||||
unsigned NumRegularSections);
|
||||
|
||||
void computeIndexMap(MCAssembler &Asm,
|
||||
void ComputeIndexMap(MCAssembler &Asm,
|
||||
SectionIndexMapTy &SectionIndexMap,
|
||||
RelMapTy &RelMap);
|
||||
const RelMapTy &RelMap);
|
||||
|
||||
MCSectionData *createRelocationSection(MCAssembler &Asm,
|
||||
const MCSectionData &SD);
|
||||
void CreateRelocationSections(MCAssembler &Asm, RelMapTy &RelMap);
|
||||
|
||||
void CompressDebugSections(MCAssembler &Asm, MCAsmLayout &Layout);
|
||||
|
||||
@ -264,19 +263,18 @@ class ELFObjectWriter : public MCObjectWriter {
|
||||
|
||||
// Create the sections that show up in the symbol table. Currently
|
||||
// those are the .note.GNU-stack section and the group sections.
|
||||
void createIndexedSections(MCAssembler &Asm, MCAsmLayout &Layout,
|
||||
void CreateIndexedSections(MCAssembler &Asm, MCAsmLayout &Layout,
|
||||
GroupMapTy &GroupMap,
|
||||
RevGroupMapTy &RevGroupMap,
|
||||
SectionIndexMapTy &SectionIndexMap,
|
||||
RelMapTy &RelMap);
|
||||
const RelMapTy &RelMap);
|
||||
|
||||
void ExecutePostLayoutBinding(MCAssembler &Asm,
|
||||
const MCAsmLayout &Layout) override;
|
||||
|
||||
void writeSectionHeader(MCAssembler &Asm, const GroupMapTy &GroupMap,
|
||||
void WriteSectionHeader(MCAssembler &Asm, const GroupMapTy &GroupMap,
|
||||
const MCAsmLayout &Layout,
|
||||
const SectionIndexMapTy &SectionIndexMap,
|
||||
const RelMapTy &RelMap,
|
||||
const SectionOffsetMapTy &SectionOffsetMap);
|
||||
|
||||
void ComputeSectionOrder(MCAssembler &Asm,
|
||||
@ -299,9 +297,8 @@ class ELFObjectWriter : public MCObjectWriter {
|
||||
bool IsPCRel) const override;
|
||||
|
||||
void WriteObject(MCAssembler &Asm, const MCAsmLayout &Layout) override;
|
||||
void writeSection(MCAssembler &Asm,
|
||||
void WriteSection(MCAssembler &Asm,
|
||||
const SectionIndexMapTy &SectionIndexMap,
|
||||
const RelMapTy &RelMap,
|
||||
uint32_t GroupSymbolIndex,
|
||||
uint64_t Offset, uint64_t Size, uint64_t Alignment,
|
||||
const MCSectionELF &Section);
|
||||
@ -944,9 +941,9 @@ bool ELFObjectWriter::isLocal(const MCSymbolData &Data, bool isUsedInReloc) {
|
||||
return true;
|
||||
}
|
||||
|
||||
void ELFObjectWriter::computeIndexMap(MCAssembler &Asm,
|
||||
void ELFObjectWriter::ComputeIndexMap(MCAssembler &Asm,
|
||||
SectionIndexMapTy &SectionIndexMap,
|
||||
RelMapTy &RelMap) {
|
||||
const RelMapTy &RelMap) {
|
||||
unsigned Index = 1;
|
||||
for (MCAssembler::iterator it = Asm.begin(),
|
||||
ie = Asm.end(); it != ie; ++it) {
|
||||
@ -959,20 +956,16 @@ void ELFObjectWriter::computeIndexMap(MCAssembler &Asm,
|
||||
|
||||
for (MCAssembler::iterator it = Asm.begin(),
|
||||
ie = Asm.end(); it != ie; ++it) {
|
||||
const MCSectionData &SD = *it;
|
||||
const MCSectionELF &Section =
|
||||
static_cast<const MCSectionELF &>(SD.getSection());
|
||||
static_cast<const MCSectionELF &>(it->getSection());
|
||||
if (Section.getType() == ELF::SHT_GROUP ||
|
||||
Section.getType() == ELF::SHT_REL ||
|
||||
Section.getType() == ELF::SHT_RELA)
|
||||
continue;
|
||||
SectionIndexMap[&Section] = Index++;
|
||||
if (MCSectionData *RelSD = createRelocationSection(Asm, SD)) {
|
||||
const MCSectionELF *RelSection =
|
||||
static_cast<const MCSectionELF *>(&RelSD->getSection());
|
||||
RelMap[RelSection] = &Section;
|
||||
const MCSectionELF *RelSection = RelMap.lookup(&Section);
|
||||
if (RelSection)
|
||||
SectionIndexMap[RelSection] = Index++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1122,37 +1115,42 @@ ELFObjectWriter::computeSymbolTable(MCAssembler &Asm, const MCAsmLayout &Layout,
|
||||
UndefinedSymbolData[i].SymbolData->setIndex(Index++);
|
||||
}
|
||||
|
||||
MCSectionData *
|
||||
ELFObjectWriter::createRelocationSection(MCAssembler &Asm,
|
||||
const MCSectionData &SD) {
|
||||
if (Relocations[&SD].empty())
|
||||
return nullptr;
|
||||
void ELFObjectWriter::CreateRelocationSections(MCAssembler &Asm,
|
||||
RelMapTy &RelMap) {
|
||||
for (MCAssembler::const_iterator it = Asm.begin(),
|
||||
ie = Asm.end(); it != ie; ++it) {
|
||||
const MCSectionData &SD = *it;
|
||||
if (Relocations[&SD].empty())
|
||||
continue;
|
||||
|
||||
MCContext &Ctx = Asm.getContext();
|
||||
const MCSectionELF &Section =
|
||||
static_cast<const MCSectionELF &>(SD.getSection());
|
||||
MCContext &Ctx = Asm.getContext();
|
||||
const MCSectionELF &Section =
|
||||
static_cast<const MCSectionELF&>(SD.getSection());
|
||||
|
||||
const StringRef SectionName = Section.getSectionName();
|
||||
std::string RelaSectionName = hasRelocationAddend() ? ".rela" : ".rel";
|
||||
RelaSectionName += SectionName;
|
||||
const StringRef SectionName = Section.getSectionName();
|
||||
std::string RelaSectionName = hasRelocationAddend() ? ".rela" : ".rel";
|
||||
RelaSectionName += SectionName;
|
||||
|
||||
unsigned EntrySize;
|
||||
if (hasRelocationAddend())
|
||||
EntrySize = is64Bit() ? sizeof(ELF::Elf64_Rela) : sizeof(ELF::Elf32_Rela);
|
||||
else
|
||||
EntrySize = is64Bit() ? sizeof(ELF::Elf64_Rel) : sizeof(ELF::Elf32_Rel);
|
||||
unsigned EntrySize;
|
||||
if (hasRelocationAddend())
|
||||
EntrySize = is64Bit() ? sizeof(ELF::Elf64_Rela) : sizeof(ELF::Elf32_Rela);
|
||||
else
|
||||
EntrySize = is64Bit() ? sizeof(ELF::Elf64_Rel) : sizeof(ELF::Elf32_Rel);
|
||||
|
||||
unsigned Flags = 0;
|
||||
StringRef Group = "";
|
||||
if (Section.getFlags() & ELF::SHF_GROUP) {
|
||||
Flags = ELF::SHF_GROUP;
|
||||
Group = Section.getGroup()->getName();
|
||||
unsigned Flags = 0;
|
||||
StringRef Group = "";
|
||||
if (Section.getFlags() & ELF::SHF_GROUP) {
|
||||
Flags = ELF::SHF_GROUP;
|
||||
Group = Section.getGroup()->getName();
|
||||
}
|
||||
|
||||
const MCSectionELF *RelaSection =
|
||||
Ctx.getELFSection(RelaSectionName, hasRelocationAddend() ?
|
||||
ELF::SHT_RELA : ELF::SHT_REL, Flags,
|
||||
EntrySize, Group);
|
||||
RelMap[&Section] = RelaSection;
|
||||
Asm.getOrCreateSectionData(*RelaSection);
|
||||
}
|
||||
|
||||
const MCSectionELF *RelaSection = Ctx.getELFSection(
|
||||
RelaSectionName, hasRelocationAddend() ? ELF::SHT_RELA : ELF::SHT_REL,
|
||||
Flags, EntrySize, Group, true);
|
||||
return &Asm.getOrCreateSectionData(*RelaSection);
|
||||
}
|
||||
|
||||
static SmallVector<char, 128>
|
||||
@ -1302,21 +1300,20 @@ void ELFObjectWriter::CompressDebugSections(MCAssembler &Asm,
|
||||
|
||||
void ELFObjectWriter::WriteRelocations(MCAssembler &Asm, MCAsmLayout &Layout,
|
||||
const RelMapTy &RelMap) {
|
||||
for (MCAssembler::iterator it = Asm.begin(), ie = Asm.end(); it != ie; ++it) {
|
||||
MCSectionData &RelSD = *it;
|
||||
const MCSectionELF &RelSection =
|
||||
static_cast<const MCSectionELF &>(RelSD.getSection());
|
||||
for (MCAssembler::const_iterator it = Asm.begin(),
|
||||
ie = Asm.end(); it != ie; ++it) {
|
||||
const MCSectionData &SD = *it;
|
||||
const MCSectionELF &Section =
|
||||
static_cast<const MCSectionELF&>(SD.getSection());
|
||||
|
||||
unsigned Type = RelSection.getType();
|
||||
if (Type != ELF::SHT_REL && Type != ELF::SHT_RELA)
|
||||
const MCSectionELF *RelaSection = RelMap.lookup(&Section);
|
||||
if (!RelaSection)
|
||||
continue;
|
||||
MCSectionData &RelaSD = Asm.getOrCreateSectionData(*RelaSection);
|
||||
RelaSD.setAlignment(is64Bit() ? 8 : 4);
|
||||
|
||||
const MCSectionELF *Section = RelMap.lookup(&RelSection);
|
||||
MCSectionData &SD = Asm.getOrCreateSectionData(*Section);
|
||||
RelSD.setAlignment(is64Bit() ? 8 : 4);
|
||||
|
||||
MCDataFragment *F = new MCDataFragment(&RelSD);
|
||||
WriteRelocationsFragment(Asm, F, &SD);
|
||||
MCDataFragment *F = new MCDataFragment(&RelaSD);
|
||||
WriteRelocationsFragment(Asm, F, &*it);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1448,12 +1445,12 @@ void ELFObjectWriter::CreateMetadataSections(
|
||||
ShStrTabBuilder.data().end());
|
||||
}
|
||||
|
||||
void ELFObjectWriter::createIndexedSections(MCAssembler &Asm,
|
||||
void ELFObjectWriter::CreateIndexedSections(MCAssembler &Asm,
|
||||
MCAsmLayout &Layout,
|
||||
GroupMapTy &GroupMap,
|
||||
RevGroupMapTy &RevGroupMap,
|
||||
SectionIndexMapTy &SectionIndexMap,
|
||||
RelMapTy &RelMap) {
|
||||
const RelMapTy &RelMap) {
|
||||
MCContext &Ctx = Asm.getContext();
|
||||
|
||||
// Build the groups
|
||||
@ -1477,7 +1474,7 @@ void ELFObjectWriter::createIndexedSections(MCAssembler &Asm,
|
||||
GroupMap[Group] = SignatureSymbol;
|
||||
}
|
||||
|
||||
computeIndexMap(Asm, SectionIndexMap, RelMap);
|
||||
ComputeIndexMap(Asm, SectionIndexMap, RelMap);
|
||||
|
||||
// Add sections to the groups
|
||||
for (MCAssembler::const_iterator it = Asm.begin(), ie = Asm.end();
|
||||
@ -1495,9 +1492,8 @@ void ELFObjectWriter::createIndexedSections(MCAssembler &Asm,
|
||||
}
|
||||
}
|
||||
|
||||
void ELFObjectWriter::writeSection(MCAssembler &Asm,
|
||||
void ELFObjectWriter::WriteSection(MCAssembler &Asm,
|
||||
const SectionIndexMapTy &SectionIndexMap,
|
||||
const RelMapTy &RelMap,
|
||||
uint32_t GroupSymbolIndex,
|
||||
uint64_t Offset, uint64_t Size,
|
||||
uint64_t Alignment,
|
||||
@ -1513,9 +1509,21 @@ void ELFObjectWriter::writeSection(MCAssembler &Asm,
|
||||
|
||||
case ELF::SHT_REL:
|
||||
case ELF::SHT_RELA: {
|
||||
sh_link = SymbolTableIndex;
|
||||
const MCSectionELF *SymtabSection;
|
||||
const MCSectionELF *InfoSection;
|
||||
SymtabSection =
|
||||
Asm.getContext().getELFSection(".symtab", ELF::SHT_SYMTAB, 0);
|
||||
sh_link = SectionIndexMap.lookup(SymtabSection);
|
||||
assert(sh_link && ".symtab not found");
|
||||
const MCSectionELF *InfoSection = RelMap.find(&Section)->second;
|
||||
|
||||
// Remove ".rel" and ".rela" prefixes.
|
||||
unsigned SecNameLen = (Section.getType() == ELF::SHT_REL) ? 4 : 5;
|
||||
StringRef SectionName = Section.getSectionName().substr(SecNameLen);
|
||||
StringRef GroupName =
|
||||
Section.getGroup() ? Section.getGroup()->getName() : "";
|
||||
|
||||
InfoSection = Asm.getContext().getELFSection(SectionName, ELF::SHT_PROGBITS,
|
||||
0, 0, GroupName);
|
||||
sh_info = SectionIndexMap.lookup(InfoSection);
|
||||
break;
|
||||
}
|
||||
@ -1626,10 +1634,11 @@ void ELFObjectWriter::WriteDataSectionData(MCAssembler &Asm,
|
||||
}
|
||||
}
|
||||
|
||||
void ELFObjectWriter::writeSectionHeader(
|
||||
MCAssembler &Asm, const GroupMapTy &GroupMap, const MCAsmLayout &Layout,
|
||||
const SectionIndexMapTy &SectionIndexMap, const RelMapTy &RelMap,
|
||||
const SectionOffsetMapTy &SectionOffsetMap) {
|
||||
void ELFObjectWriter::WriteSectionHeader(MCAssembler &Asm,
|
||||
const GroupMapTy &GroupMap,
|
||||
const MCAsmLayout &Layout,
|
||||
const SectionIndexMapTy &SectionIndexMap,
|
||||
const SectionOffsetMapTy &SectionOffsetMap) {
|
||||
const unsigned NumSections = Asm.size() + 1;
|
||||
|
||||
std::vector<const MCSectionELF*> Sections;
|
||||
@ -1660,7 +1669,7 @@ void ELFObjectWriter::writeSectionHeader(
|
||||
|
||||
uint64_t Size = GetSectionAddressSize(Layout, SD);
|
||||
|
||||
writeSection(Asm, SectionIndexMap, RelMap, GroupSymbolIndex,
|
||||
WriteSection(Asm, SectionIndexMap, GroupSymbolIndex,
|
||||
SectionOffsetMap.lookup(&Section), Size,
|
||||
SD.getAlignment(), Section);
|
||||
}
|
||||
@ -1707,8 +1716,10 @@ void ELFObjectWriter::WriteObject(MCAssembler &Asm,
|
||||
CompressDebugSections(Asm, const_cast<MCAsmLayout &>(Layout));
|
||||
|
||||
DenseMap<const MCSectionELF*, const MCSectionELF*> RelMap;
|
||||
CreateRelocationSections(Asm, RelMap);
|
||||
|
||||
const unsigned NumUserAndRelocSections = Asm.size();
|
||||
createIndexedSections(Asm, const_cast<MCAsmLayout&>(Layout), GroupMap,
|
||||
CreateIndexedSections(Asm, const_cast<MCAsmLayout&>(Layout), GroupMap,
|
||||
RevGroupMap, SectionIndexMap, RelMap);
|
||||
const unsigned AllSections = Asm.size();
|
||||
const unsigned NumIndexedSections = AllSections - NumUserAndRelocSections;
|
||||
@ -1780,7 +1791,7 @@ void ELFObjectWriter::WriteObject(MCAssembler &Asm,
|
||||
WriteZeros(Padding);
|
||||
|
||||
// ... then the section header table ...
|
||||
writeSectionHeader(Asm, GroupMap, Layout, SectionIndexMap, RelMap,
|
||||
WriteSectionHeader(Asm, GroupMap, Layout, SectionIndexMap,
|
||||
SectionOffsetMap);
|
||||
|
||||
// ... and then the remaining sections ...
|
||||
|
Reference in New Issue
Block a user