mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-15 22:28:18 +00:00
Print the address of sections as 0 and create the metadata sections in the
same order as gnu as. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@114109 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -205,7 +205,8 @@ namespace {
|
|||||||
const MCAsmLayout &Layout);
|
const MCAsmLayout &Layout);
|
||||||
|
|
||||||
void WriteSymbolTable(MCDataFragment *F, const MCAssembler &Asm,
|
void WriteSymbolTable(MCDataFragment *F, const MCAssembler &Asm,
|
||||||
const MCAsmLayout &Layout);
|
const MCAsmLayout &Layout,
|
||||||
|
unsigned NumRegularSections);
|
||||||
|
|
||||||
void RecordRelocation(const MCAssembler &Asm, const MCAsmLayout &Layout,
|
void RecordRelocation(const MCAssembler &Asm, const MCAsmLayout &Layout,
|
||||||
const MCFragment *Fragment, const MCFixup &Fixup,
|
const MCFragment *Fragment, const MCFixup &Fixup,
|
||||||
@@ -405,7 +406,8 @@ void ELFObjectWriterImpl::WriteSymbol(MCDataFragment *F, ELFSymbolData &MSD,
|
|||||||
|
|
||||||
void ELFObjectWriterImpl::WriteSymbolTable(MCDataFragment *F,
|
void ELFObjectWriterImpl::WriteSymbolTable(MCDataFragment *F,
|
||||||
const MCAssembler &Asm,
|
const MCAssembler &Asm,
|
||||||
const MCAsmLayout &Layout) {
|
const MCAsmLayout &Layout,
|
||||||
|
unsigned NumRegularSections) {
|
||||||
// The string table must be emitted first because we need the index
|
// The string table must be emitted first because we need the index
|
||||||
// into the string table for all the symbol names.
|
// into the string table for all the symbol names.
|
||||||
assert(StringTable.size() && "Missing string table");
|
assert(StringTable.size() && "Missing string table");
|
||||||
@@ -423,20 +425,16 @@ void ELFObjectWriterImpl::WriteSymbolTable(MCDataFragment *F,
|
|||||||
WriteSymbol(F, MSD, Layout);
|
WriteSymbol(F, MSD, Layout);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write out a symbol table entry for each section.
|
// Write out a symbol table entry for each regular section.
|
||||||
// leaving out the just added .symtab which is at
|
|
||||||
// the very end
|
|
||||||
unsigned Index = 1;
|
unsigned Index = 1;
|
||||||
for (MCAssembler::const_iterator it = Asm.begin(),
|
for (MCAssembler::const_iterator it = Asm.begin();
|
||||||
ie = Asm.end(); it != ie; ++it, ++Index) {
|
Index <= NumRegularSections; ++it, ++Index) {
|
||||||
const MCSectionELF &Section =
|
const MCSectionELF &Section =
|
||||||
static_cast<const MCSectionELF&>(it->getSection());
|
static_cast<const MCSectionELF&>(it->getSection());
|
||||||
// Leave out relocations so we don't have indexes within
|
// Leave out relocations so we don't have indexes within
|
||||||
// the relocations messed up
|
// the relocations messed up
|
||||||
if (Section.getType() == ELF::SHT_RELA || Section.getType() == ELF::SHT_REL)
|
if (Section.getType() == ELF::SHT_RELA || Section.getType() == ELF::SHT_REL)
|
||||||
continue;
|
continue;
|
||||||
if (Index == Asm.size())
|
|
||||||
continue;
|
|
||||||
WriteSymbolEntry(F, 0, ELF::STT_SECTION, 0, 0, ELF::STV_DEFAULT, Index);
|
WriteSymbolEntry(F, 0, ELF::STT_SECTION, 0, 0, ELF::STV_DEFAULT, Index);
|
||||||
LastLocalSymbolIndex++;
|
LastLocalSymbolIndex++;
|
||||||
}
|
}
|
||||||
@@ -785,48 +783,41 @@ void ELFObjectWriterImpl::CreateMetadataSections(MCAssembler &Asm,
|
|||||||
const MCSection *SymtabSection;
|
const MCSection *SymtabSection;
|
||||||
unsigned EntrySize = Is64Bit ? ELF::SYMENTRY_SIZE64 : ELF::SYMENTRY_SIZE32;
|
unsigned EntrySize = Is64Bit ? ELF::SYMENTRY_SIZE64 : ELF::SYMENTRY_SIZE32;
|
||||||
|
|
||||||
|
unsigned NumRegularSections = Asm.size();
|
||||||
|
|
||||||
|
// We construct .shstrtab, .symtab and .strtab is this order to match gnu as.
|
||||||
|
const MCSection *ShstrtabSection;
|
||||||
|
ShstrtabSection = Ctx.getELFSection(".shstrtab", ELF::SHT_STRTAB, 0,
|
||||||
|
SectionKind::getReadOnly(), false);
|
||||||
|
MCSectionData &ShstrtabSD = Asm.getOrCreateSectionData(*ShstrtabSection);
|
||||||
|
ShstrtabSD.setAlignment(1);
|
||||||
|
ShstrtabIndex = Asm.size();
|
||||||
|
|
||||||
SymtabSection = Ctx.getELFSection(".symtab", ELF::SHT_SYMTAB, 0,
|
SymtabSection = Ctx.getELFSection(".symtab", ELF::SHT_SYMTAB, 0,
|
||||||
SectionKind::getReadOnly(),
|
SectionKind::getReadOnly(),
|
||||||
false, EntrySize);
|
false, EntrySize);
|
||||||
|
|
||||||
MCSectionData &SymtabSD = Asm.getOrCreateSectionData(*SymtabSection);
|
MCSectionData &SymtabSD = Asm.getOrCreateSectionData(*SymtabSection);
|
||||||
|
|
||||||
SymtabSD.setAlignment(Is64Bit ? 8 : 4);
|
SymtabSD.setAlignment(Is64Bit ? 8 : 4);
|
||||||
|
|
||||||
F = new MCDataFragment(&SymtabSD);
|
|
||||||
|
|
||||||
// Symbol table
|
|
||||||
WriteSymbolTable(F, Asm, Layout);
|
|
||||||
Asm.AddSectionToTheEnd(SymtabSD, Layout);
|
|
||||||
|
|
||||||
const MCSection *StrtabSection;
|
const MCSection *StrtabSection;
|
||||||
StrtabSection = Ctx.getELFSection(".strtab", ELF::SHT_STRTAB, 0,
|
StrtabSection = Ctx.getELFSection(".strtab", ELF::SHT_STRTAB, 0,
|
||||||
SectionKind::getReadOnly(), false);
|
SectionKind::getReadOnly(), false);
|
||||||
|
|
||||||
MCSectionData &StrtabSD = Asm.getOrCreateSectionData(*StrtabSection);
|
MCSectionData &StrtabSD = Asm.getOrCreateSectionData(*StrtabSection);
|
||||||
StrtabSD.setAlignment(1);
|
StrtabSD.setAlignment(1);
|
||||||
|
|
||||||
// FIXME: This isn't right. If the sections get rearranged this will
|
|
||||||
// be wrong. We need a proper lookup.
|
|
||||||
StringTableIndex = Asm.size();
|
StringTableIndex = Asm.size();
|
||||||
|
|
||||||
|
|
||||||
|
// Symbol table
|
||||||
|
F = new MCDataFragment(&SymtabSD);
|
||||||
|
WriteSymbolTable(F, Asm, Layout, NumRegularSections);
|
||||||
|
Asm.AddSectionToTheEnd(SymtabSD, Layout);
|
||||||
|
|
||||||
F = new MCDataFragment(&StrtabSD);
|
F = new MCDataFragment(&StrtabSD);
|
||||||
F->getContents().append(StringTable.begin(), StringTable.end());
|
F->getContents().append(StringTable.begin(), StringTable.end());
|
||||||
Asm.AddSectionToTheEnd(StrtabSD, Layout);
|
Asm.AddSectionToTheEnd(StrtabSD, Layout);
|
||||||
|
|
||||||
const MCSection *ShstrtabSection;
|
|
||||||
ShstrtabSection = Ctx.getELFSection(".shstrtab", ELF::SHT_STRTAB, 0,
|
|
||||||
SectionKind::getReadOnly(), false);
|
|
||||||
|
|
||||||
MCSectionData &ShstrtabSD = Asm.getOrCreateSectionData(*ShstrtabSection);
|
|
||||||
ShstrtabSD.setAlignment(1);
|
|
||||||
|
|
||||||
F = new MCDataFragment(&ShstrtabSD);
|
F = new MCDataFragment(&ShstrtabSD);
|
||||||
|
|
||||||
// FIXME: This isn't right. If the sections get rearranged this will
|
|
||||||
// be wrong. We need a proper lookup.
|
|
||||||
ShstrtabIndex = Asm.size();
|
|
||||||
|
|
||||||
// Section header string table.
|
// Section header string table.
|
||||||
//
|
//
|
||||||
// The first entry of a string table holds a null character so skip
|
// The first entry of a string table holds a null character so skip
|
||||||
@@ -974,7 +965,7 @@ void ELFObjectWriterImpl::WriteObject(const MCAssembler &Asm,
|
|||||||
|
|
||||||
WriteSecHdrEntry(SectionStringTableIndex[&it->getSection()],
|
WriteSecHdrEntry(SectionStringTableIndex[&it->getSection()],
|
||||||
Section.getType(), Section.getFlags(),
|
Section.getType(), Section.getFlags(),
|
||||||
Layout.getSectionAddress(&SD),
|
0,
|
||||||
SectionOffsetMap.lookup(&SD.getSection()),
|
SectionOffsetMap.lookup(&SD.getSection()),
|
||||||
Layout.getSectionSize(&SD), sh_link,
|
Layout.getSectionSize(&SD), sh_link,
|
||||||
sh_info, SD.getAlignment(),
|
sh_info, SD.getAlignment(),
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | elf-dump | FileCheck %s
|
// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | elf-dump | FileCheck %s
|
||||||
|
|
||||||
// Test that like gnu as we create text, data and bss by default.
|
// Test that like gnu as we create text, data and bss by default. Also test
|
||||||
|
// that shstrtab, symtab and strtab are listed in that order.
|
||||||
|
|
||||||
// CHECK: ('sh_name', 1) # '.text'
|
// CHECK: ('sh_name', 1) # '.text'
|
||||||
// CHECK-NEXT: ('sh_type', 1)
|
// CHECK-NEXT: ('sh_type', 1)
|
||||||
@@ -34,3 +35,36 @@
|
|||||||
// CHECK-NEXT: ('sh_info', 0)
|
// CHECK-NEXT: ('sh_info', 0)
|
||||||
// CHECK-NEXT: ('sh_addralign', 4)
|
// CHECK-NEXT: ('sh_addralign', 4)
|
||||||
// CHECK-NEXT: ('sh_entsize', 0)
|
// CHECK-NEXT: ('sh_entsize', 0)
|
||||||
|
|
||||||
|
// CHECK: ('sh_name', 18) # '.shstrtab'
|
||||||
|
// CHECK-NEXT: ('sh_type', 3)
|
||||||
|
// CHECK-NEXT: ('sh_flags', 0)
|
||||||
|
// CHECK-NEXT: ('sh_addr', 0)
|
||||||
|
// CHECK-NEXT: ('sh_offset', 64)
|
||||||
|
// CHECK-NEXT: ('sh_size', 44)
|
||||||
|
// CHECK-NEXT: ('sh_link', 0)
|
||||||
|
// CHECK-NEXT: ('sh_info', 0)
|
||||||
|
// CHECK-NEXT: ('sh_addralign', 1)
|
||||||
|
// CHECK-NEXT: ('sh_entsize', 0)
|
||||||
|
|
||||||
|
// CHECK: ('sh_name', 28) # '.symtab'
|
||||||
|
// CHECK-NEXT: ('sh_type', 2)
|
||||||
|
// CHECK-NEXT: ('sh_flags', 0)
|
||||||
|
// CHECK-NEXT: ('sh_addr', 0)
|
||||||
|
// CHECK-NEXT: ('sh_offset',
|
||||||
|
// CHECK-NEXT: ('sh_size', 96)
|
||||||
|
// CHECK-NEXT: ('sh_link', 6)
|
||||||
|
// CHECK-NEXT: ('sh_info', 4)
|
||||||
|
// CHECK-NEXT: ('sh_addralign', 8)
|
||||||
|
// CHECK-NEXT: ('sh_entsize', 24)
|
||||||
|
|
||||||
|
// CHECK: ('sh_name', 36) # '.strtab'
|
||||||
|
// CHECK-NEXT: ('sh_type', 3)
|
||||||
|
// CHECK-NEXT: ('sh_flags', 0)
|
||||||
|
// CHECK-NEXT: ('sh_addr', 0)
|
||||||
|
// CHECK-NEXT: ('sh_offset',
|
||||||
|
// CHECK-NEXT: ('sh_size', 1)
|
||||||
|
// CHECK-NEXT: ('sh_link', 0)
|
||||||
|
// CHECK-NEXT: ('sh_info', 0)
|
||||||
|
// CHECK-NEXT: ('sh_addralign', 1)
|
||||||
|
// CHECK-NEXT: ('sh_entsize', 0)
|
||||||
|
Reference in New Issue
Block a user