[llvm] r221444 - Object, COFF: Infer symbol sizes from adjacent symbols
Rafael EspĂndola
rafael.espindola at gmail.com
Thu Nov 6 06:08:21 PST 2014
thanks!
On 6 November 2014 03:10, David Majnemer <david.majnemer at gmail.com> wrote:
> Author: majnemer
> Date: Thu Nov 6 02:10:41 2014
> New Revision: 221444
>
> URL: http://llvm.org/viewvc/llvm-project?rev=221444&view=rev
> Log:
> 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.
>
> Modified:
> llvm/trunk/lib/Object/COFFObjectFile.cpp
> llvm/trunk/test/Object/nm-trivial-object.test
>
> Modified: llvm/trunk/lib/Object/COFFObjectFile.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/COFFObjectFile.cpp?rev=221444&r1=221443&r2=221444&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Object/COFFObjectFile.cpp (original)
> +++ llvm/trunk/lib/Object/COFFObjectFile.cpp Thu Nov 6 02:10:41 2014
> @@ -250,20 +250,52 @@ std::error_code COFFObjectFile::getSymbo
> 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
> - // symbol, or the end of the section.
> +
> + // Let's attempt to get the size of the symbol by looking at the address of
> + // 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();
> - 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;
> if (std::error_code EC = getSection(SectionNumber, Section))
> return EC;
> -
> 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;
> }
>
>
> Modified: llvm/trunk/test/Object/nm-trivial-object.test
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/nm-trivial-object.test?rev=221444&r1=221443&r2=221444&view=diff
> ==============================================================================
> --- llvm/trunk/test/Object/nm-trivial-object.test (original)
> +++ llvm/trunk/test/Object/nm-trivial-object.test Thu Nov 6 02:10:41 2014
> @@ -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: 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: llvm-nm %p/Inputs/trivial-object-test.elf-i386 \
> RUN: | FileCheck %s -check-prefix ELF
> @@ -49,11 +49,11 @@ RUN: llvm-nm | FileCheck %s -check-prefi
> REQUIRES: shell
>
>
> -COFF: 00000000 d .data
> -COFF: 00000000 t .text
> -COFF: 00000000 d L{{_?}}.str
> +COFF: 00000000 {{.*}} d .data
> +COFF: 00000000 {{.*}} t .text
> +COFF: 00000000 0000000d d L{{_?}}.str
> COFF: U {{_?}}SomeOtherFunction
> -COFF: 00000000 T {{_?}}main
> +COFF: 00000000 {{.*}} T {{_?}}main
> COFF: U {{_?}}puts
>
> COFF-COMMON: 00000000 00000000 b .bss
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list