mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-05-13 17:38:39 +00:00
Object, COFF: Infer symbol sizes from adjacent symbols
Use the position of the subsequent symbol in the object file to infer the size of it's predecessor. I hope to eventually remove whatever COFF specific details from this little algorithm so that we can unify this logic with what Mach-O does. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@221444 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
a67e1693fc
commit
42b17f97cf
@ -250,20 +250,52 @@ std::error_code COFFObjectFile::getSymbolSize(DataRefImpl Ref,
|
|||||||
return object_error::success;
|
return object_error::success;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// FIXME: Return the correct size. This requires looking at all the symbols
|
|
||||||
// in the same section as this symbol, and looking for either the next
|
// Let's attempt to get the size of the symbol by looking at the address of
|
||||||
// symbol, or the end of the section.
|
// the symbol after the symbol in question.
|
||||||
|
uint64_t SymbAddr;
|
||||||
|
if (std::error_code EC = getSymbolAddress(Ref, SymbAddr))
|
||||||
|
return EC;
|
||||||
int32_t SectionNumber = Symb.getSectionNumber();
|
int32_t SectionNumber = Symb.getSectionNumber();
|
||||||
if (!COFF::isReservedSectionNumber(SectionNumber)) {
|
if (COFF::isReservedSectionNumber(SectionNumber)) {
|
||||||
|
// Absolute and debug symbols aren't sorted in any interesting way.
|
||||||
|
Result = 0;
|
||||||
|
return object_error::success;
|
||||||
|
}
|
||||||
|
const section_iterator SecEnd = section_end();
|
||||||
|
uint64_t AfterAddr = UnknownAddressOrSize;
|
||||||
|
for (const symbol_iterator &SymbI : symbols()) {
|
||||||
|
section_iterator SecI = SecEnd;
|
||||||
|
if (std::error_code EC = SymbI->getSection(SecI))
|
||||||
|
return EC;
|
||||||
|
// Check the symbol's section, skip it if it's in the wrong section.
|
||||||
|
// First, make sure it is in any section.
|
||||||
|
if (SecI == SecEnd)
|
||||||
|
continue;
|
||||||
|
// Second, make sure it is in the same section as the symbol in question.
|
||||||
|
if (!sectionContainsSymbol(SecI->getRawDataRefImpl(), Ref))
|
||||||
|
continue;
|
||||||
|
uint64_t Addr;
|
||||||
|
if (std::error_code EC = SymbI->getAddress(Addr))
|
||||||
|
return EC;
|
||||||
|
// We want to compare our symbol in question with the closest possible
|
||||||
|
// symbol that comes after.
|
||||||
|
if (AfterAddr > Addr && Addr > SymbAddr)
|
||||||
|
AfterAddr = Addr;
|
||||||
|
}
|
||||||
|
if (AfterAddr == UnknownAddressOrSize) {
|
||||||
|
// No symbol comes after this one, assume that everything after our symbol
|
||||||
|
// is part of it.
|
||||||
const coff_section *Section = nullptr;
|
const coff_section *Section = nullptr;
|
||||||
if (std::error_code EC = getSection(SectionNumber, Section))
|
if (std::error_code EC = getSection(SectionNumber, Section))
|
||||||
return EC;
|
return EC;
|
||||||
|
|
||||||
Result = Section->SizeOfRawData - Symb.getValue();
|
Result = Section->SizeOfRawData - Symb.getValue();
|
||||||
return object_error::success;
|
} else {
|
||||||
|
// Take the difference between our symbol and the symbol that comes after
|
||||||
|
// our symbol.
|
||||||
|
Result = AfterAddr - SymbAddr;
|
||||||
}
|
}
|
||||||
|
|
||||||
Result = 0;
|
|
||||||
return object_error::success;
|
return object_error::success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
RUN: yaml2obj %p/Inputs/COFF/i386.yaml | llvm-nm -a - \
|
RUN: yaml2obj %p/Inputs/COFF/i386.yaml | llvm-nm -a -S - \
|
||||||
RUN: | FileCheck %s -check-prefix COFF
|
RUN: | FileCheck %s -check-prefix COFF
|
||||||
RUN: yaml2obj %p/Inputs/COFF/x86-64.yaml | llvm-nm -a - \
|
RUN: yaml2obj %p/Inputs/COFF/x86-64.yaml | llvm-nm -a -S - \
|
||||||
RUN: | FileCheck %s -check-prefix COFF
|
RUN: | FileCheck %s -check-prefix COFF
|
||||||
RUN: llvm-nm %p/Inputs/trivial-object-test.elf-i386 \
|
RUN: llvm-nm %p/Inputs/trivial-object-test.elf-i386 \
|
||||||
RUN: | FileCheck %s -check-prefix ELF
|
RUN: | FileCheck %s -check-prefix ELF
|
||||||
@ -49,11 +49,11 @@ RUN: llvm-nm | FileCheck %s -check-prefix A-OUT
|
|||||||
REQUIRES: shell
|
REQUIRES: shell
|
||||||
|
|
||||||
|
|
||||||
COFF: 00000000 d .data
|
COFF: 00000000 {{.*}} d .data
|
||||||
COFF: 00000000 t .text
|
COFF: 00000000 {{.*}} t .text
|
||||||
COFF: 00000000 d L{{_?}}.str
|
COFF: 00000000 0000000d d L{{_?}}.str
|
||||||
COFF: U {{_?}}SomeOtherFunction
|
COFF: U {{_?}}SomeOtherFunction
|
||||||
COFF: 00000000 T {{_?}}main
|
COFF: 00000000 {{.*}} T {{_?}}main
|
||||||
COFF: U {{_?}}puts
|
COFF: U {{_?}}puts
|
||||||
|
|
||||||
COFF-COMMON: 00000000 00000000 b .bss
|
COFF-COMMON: 00000000 00000000 b .bss
|
||||||
|
Loading…
x
Reference in New Issue
Block a user