[lld] r250100 - [ELF2] Sort PPC64 special sections
Hal Finkel via llvm-commits
llvm-commits at lists.llvm.org
Tue Oct 13 12:11:32 PDT 2015
----- Original Message -----
> From: "Rafael EspĂndola" <rafael.espindola at gmail.com>
> To: "Hal Finkel" <hfinkel at anl.gov>
> Cc: "llvm-commits" <llvm-commits at lists.llvm.org>
> Sent: Tuesday, October 13, 2015 8:50:45 AM
> Subject: Re: [lld] r250100 - [ELF2] Sort PPC64 special sections
>
> The "The last requirement" comment is now out of date.
Indeed. r250206.
>
> It is probably best if we isolate the architecture bits some more.
> How
> about replacing
>
>
> return getPPC64SectionRank(A->getName()) <
> getPPC64SectionRank(B->getName());
>
>
> With
>
> // Some architectures might have additional restrictions for sections
> in the same PT_LOAD and
> // with the same type.
> if (Config->EMachine == EM_PPC64)
> return getPPC64SectionRank(A->getName()) <
> getPPC64SectionRank(B->getName());
> return false;
>
> It will probably grow to a switch in the future.
Agreed. r250209.
Thanks again,
Hal
>
> Cheers,
> Rafael
>
>
>
> On 12 October 2015 at 16:51, Hal Finkel via llvm-commits
> <llvm-commits at lists.llvm.org> wrote:
> > Author: hfinkel
> > Date: Mon Oct 12 15:51:48 2015
> > New Revision: 250100
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=250100&view=rev
> > Log:
> > [ELF2] Sort PPC64 special sections
> >
> > PPC64 has several special sections that are intended to be accessed
> > from the
> > TOC base pointer. When a .got is present, the TOC base pointer is
> > .got + 0x8000
> > (as specified by the ABI). Furthermore, the glibc startup code
> > contains an
> > assumption that a 16-bit relocation can hold the offset from the
> > TOC base value
> > to the beginning of the .toc section. Thus, we need to make sure
> > that .toc
> > appears after .got. This much, at least, is required in practice.
> > The other
> > PPC64 special sections (.toc, .toc1, .opd, etc.) should also be
> > close by to
> > optimize access by smaller TOC-base-pointer offsets.
> >
> > Modified:
> > lld/trunk/ELF/Writer.cpp
> > lld/trunk/test/elf2/basic64be.s
> >
> > Modified: lld/trunk/ELF/Writer.cpp
> > URL:
> > http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=250100&r1=250099&r2=250100&view=diff
> > ==============================================================================
> > --- lld/trunk/ELF/Writer.cpp (original)
> > +++ lld/trunk/ELF/Writer.cpp Mon Oct 12 15:51:48 2015
> > @@ -14,6 +14,7 @@
> > #include "Target.h"
> >
> > #include "llvm/ADT/SmallPtrSet.h"
> > +#include "llvm/ADT/StringSwitch.h"
> > #include "llvm/Support/FileOutputBuffer.h"
> >
> > using namespace llvm;
> > @@ -261,6 +262,22 @@ template <class ELFT> void Writer<ELFT>:
> > }
> > }
> >
> > +// PPC64 has a number of special SHT_PROGBITS+SHF_ALLOC+SHF_WRITE
> > sections that
> > +// we would like to make sure appear is a specific order to
> > maximize their
> > +// coverage by a single signed 16-bit offset from the TOC base
> > pointer.
> > +// Conversely, the special .tocbss section should be first among
> > all SHT_NOBITS
> > +// sections. This will put it next to the loaded special PPC64
> > sections (and,
> > +// thus, within reach of the TOC base pointer).
> > +static int getPPC64SectionRank(StringRef SectionName) {
> > + return StringSwitch<int>(SectionName)
> > + .Case(".tocbss", 0)
> > + .Case(".branch_lt", 2)
> > + .Case(".toc", 3)
> > + .Case(".toc1", 4)
> > + .Case(".opd", 5)
> > + .Default(1);
> > +}
> > +
> > // Output section ordering is determined by this function.
> > template <class ELFT>
> > static bool
> > compareOutputSections(OutputSectionBase<ELFT::Is64Bits> *A,
> > @@ -302,7 +319,10 @@ static bool compareOutputSections(Output
> > // them is a p_memsz that is larger than p_filesz. Seeing that
> > it
> > // zeros the end of the PT_LOAD, so that has to correspond to
> > the
> > // nobits sections.
> > - return A->getType() != SHT_NOBITS && B->getType() == SHT_NOBITS;
> > + if (A->getType() != SHT_NOBITS && B->getType() == SHT_NOBITS)
> > + return true;
> > +
> > + return getPPC64SectionRank(A->getName()) <
> > getPPC64SectionRank(B->getName());
> > }
> >
> > // Until this function is called, common symbols do not belong to
> > any section.
> >
> > Modified: lld/trunk/test/elf2/basic64be.s
> > URL:
> > http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf2/basic64be.s?rev=250100&r1=250099&r2=250100&view=diff
> > ==============================================================================
> > --- lld/trunk/test/elf2/basic64be.s (original)
> > +++ lld/trunk/test/elf2/basic64be.s Mon Oct 12 15:51:48 2015
> > @@ -9,6 +9,14 @@
> > _start:
> > .quad .Lfoo,.TOC. at tocbase,0
> >
> > +# generate .toc and .toc1 sections to make sure that the ordering
> > is as
> > +# intended (.toc before .toc1, and both before .opd).
> > +.section ".toc1","aw"
> > +.quad 22, 37, 89, 47
> > +
> > +.section ".toc","aw"
> > +.quad 45, 86, 72, 24
> > +
> > .text
> > .Lfoo:
> > li 0,1
> > @@ -28,17 +36,17 @@ _start:
> > # CHECK-NEXT: Type: Executable (0x2)
> > # CHECK-NEXT: Machine: EM_PPC64 (0x15)
> > # CHECK-NEXT: Version: 1
> > -# CHECK-NEXT: Entry: 0x10020000
> > +# CHECK-NEXT: Entry: 0x10020040
> > # CHECK-NEXT: ProgramHeaderOffset: 0x40
> > -# CHECK-NEXT: SectionHeaderOffset: 0x20078
> > +# CHECK-NEXT: SectionHeaderOffset: 0x200C8
> > # CHECK-NEXT: Flags [ (0x0)
> > # CHECK-NEXT: ]
> > # CHECK-NEXT: HeaderSize: 64
> > # CHECK-NEXT: ProgramHeaderEntrySize: 56
> > # CHECK-NEXT: ProgramHeaderCount: 4
> > # CHECK-NEXT: SectionHeaderEntrySize: 64
> > -# CHECK-NEXT: SectionHeaderCount: 7
> > -# CHECK-NEXT: StringTableSectionIndex: 6
> > +# CHECK-NEXT: SectionHeaderCount: 9
> > +# CHECK-NEXT: StringTableSectionIndex: 8
> > # CHECK-NEXT: }
> > # CHECK-NEXT: Sections [
> > # CHECK-NEXT: Section {
> > @@ -55,18 +63,18 @@ _start:
> > # CHECK-NEXT: AddressAlignment: 0
> > # CHECK-NEXT: EntrySize: 0
> > # CHECK-NEXT: SectionData (
> > -# CHECK: )
> > +# CHECK-NEXT: )
> > # CHECK-NEXT: }
> > # CHECK-NEXT: Section {
> > # CHECK-NEXT: Index: 1
> > -# CHECK-NEXT: Name: .text
> > +# CHECK-NEXT: Name: .text (1)
> > # CHECK-NEXT: Type: SHT_PROGBITS (0x1)
> > # CHECK-NEXT: Flags [ (0x6)
> > # CHECK-NEXT: SHF_ALLOC (0x2)
> > # CHECK-NEXT: SHF_EXECINSTR (0x4)
> > # CHECK-NEXT: ]
> > # CHECK-NEXT: Address: 0x10010000
> > -# CHECK-NEXT: Offset: 0x1000
> > +# CHECK-NEXT: Offset: 0x10000
> > # CHECK-NEXT: Size: 12
> > # CHECK-NEXT: Link: 0
> > # CHECK-NEXT: Info: 0
> > @@ -77,7 +85,7 @@ _start:
> > # CHECK-NEXT: }
> > # CHECK-NEXT: Section {
> > # CHECK-NEXT: Index: 2
> > -# CHECK-NEXT: Name: .data
> > +# CHECK-NEXT: Name: .data (45)
> > # CHECK-NEXT: Type: SHT_PROGBITS (0x1)
> > # CHECK-NEXT: Flags [ (0x3)
> > # CHECK-NEXT: SHF_ALLOC (0x2)
> > @@ -95,34 +103,74 @@ _start:
> > # CHECK-NEXT: }
> > # CHECK-NEXT: Section {
> > # CHECK-NEXT: Index: 3
> > -# CHECK-NEXT: Name: .opd
> > +# CHECK-NEXT: Name: .toc (24)
> > # CHECK-NEXT: Type: SHT_PROGBITS (0x1)
> > # CHECK-NEXT: Flags [ (0x3)
> > # CHECK-NEXT: SHF_ALLOC (0x2)
> > # CHECK-NEXT: SHF_WRITE (0x1)
> > # CHECK-NEXT: ]
> > # CHECK-NEXT: Address: 0x10020000
> > -# CHECK-NEXT: Offset: 0x2000
> > -# CHECK-NEXT: Size: 24
> > +# CHECK-NEXT: Offset: 0x20000
> > +# CHECK-NEXT: Size: 32
> > # CHECK-NEXT: Link: 0
> > # CHECK-NEXT: Info: 0
> > # CHECK-NEXT: AddressAlignment: 1
> > # CHECK-NEXT: EntrySize: 0
> > # CHECK-NEXT: SectionData (
> > -# CHECK-NEXT: 0000: 00000000 10010000 00000000 00000000
> > |................|
> > -# CHECK-NEXT: 0010: 00000000 00000000
> > |........|
> > +# CHECK-NEXT: 0000: 00000000 0000002D 00000000 00000056
> > |.......-.......V|
> > +# CHECK-NEXT: 0010: 00000000 00000048 00000000 00000018
> > |.......H........|
> > # CHECK-NEXT: )
> > # CHECK-NEXT: }
> > # CHECK-NEXT: Section {
> > # CHECK-NEXT: Index: 4
> > -# CHECK-NEXT: Name: .bss
> > +# CHECK-NEXT: Name: .toc1 (51)
> > +# CHECK-NEXT: Type: SHT_PROGBITS (0x1)
> > +# CHECK-NEXT: Flags [ (0x3)
> > +# CHECK-NEXT: SHF_ALLOC (0x2)
> > +# CHECK-NEXT: SHF_WRITE (0x1)
> > +# CHECK-NEXT: ]
> > +# CHECK-NEXT: Address: 0x10020020
> > +# CHECK-NEXT: Offset: 0x20020
> > +# CHECK-NEXT: Size: 32
> > +# CHECK-NEXT: Link: 0
> > +# CHECK-NEXT: Info: 0
> > +# CHECK-NEXT: AddressAlignment: 1
> > +# CHECK-NEXT: EntrySize: 0
> > +# CHECK-NEXT: SectionData (
> > +# CHECK-NEXT: 0000: 00000000 00000016 00000000 00000025
> > |...............%|
> > +# CHECK-NEXT: 0010: 00000000 00000059 00000000 0000002F
> > |.......Y......./|
> > +# CHECK-NEXT: )
> > +# CHECK-NEXT: }
> > +# CHECK-NEXT: Section {
> > +# CHECK-NEXT: Index: 5
> > +# CHECK-NEXT: Name: .opd (19)
> > +# CHECK-NEXT: Type: SHT_PROGBITS (0x1)
> > +# CHECK-NEXT: Flags [ (0x3)
> > +# CHECK-NEXT: SHF_ALLOC (0x2)
> > +# CHECK-NEXT: SHF_WRITE (0x1)
> > +# CHECK-NEXT: ]
> > +# CHECK-NEXT: Address: 0x10020040
> > +# CHECK-NEXT: Offset: 0x20040
> > +# CHECK-NEXT: Size: 24
> > +# CHECK-NEXT: Link: 0
> > +# CHECK-NEXT: Info: 0
> > +# CHECK-NEXT: AddressAlignment: 1
> > +# CHECK-NEXT: EntrySize: 0
> > +# CHECK-NEXT: SectionData (
> > +# CHECK-NEXT: 0000: 00000000 10010000 00000000 00000000
> > |................|
> > +# CHECK-NEXT: 0010: 00000000 00000000
> > |........|
> > +# CHECK-NEXT: )
> > +# CHECK-NEXT: }
> > +# CHECK-NEXT: Section {
> > +# CHECK-NEXT: Index: 6
> > +# CHECK-NEXT: Name: .bss (14)
> > # CHECK-NEXT: Type: SHT_NOBITS (0x8)
> > # CHECK-NEXT: Flags [ (0x3)
> > # CHECK-NEXT: SHF_ALLOC (0x2)
> > # CHECK-NEXT: SHF_WRITE (0x1)
> > # CHECK-NEXT: ]
> > -# CHECK-NEXT: Address: 0x10020018
> > -# CHECK-NEXT: Offset: 0x20018
> > +# CHECK-NEXT: Address: 0x10020058
> > +# CHECK-NEXT: Offset: 0x20058
> > # CHECK-NEXT: Size: 0
> > # CHECK-NEXT: Link: 0
> > # CHECK-NEXT: Info: 0
> > @@ -130,15 +178,15 @@ _start:
> > # CHECK-NEXT: EntrySize: 0
> > # CHECK-NEXT: }
> > # CHECK-NEXT: Section {
> > -# CHECK-NEXT: Index: 5
> > -# CHECK-NEXT: Name: .symtab
> > -# CHECK-NEXT: Type: SHT_SYMTAB
> > -# CHECK-NEXT: Flags [
> > +# CHECK-NEXT: Index: 7
> > +# CHECK-NEXT: Name: .symtab (37)
> > +# CHECK-NEXT: Type: SHT_SYMTAB (0x2)
> > +# CHECK-NEXT: Flags [ (0x0)
> > # CHECK-NEXT: ]
> > # CHECK-NEXT: Address: 0x0
> > -# CHECK-NEXT: Offset: 0x20018
> > +# CHECK-NEXT: Offset: 0x20058
> > # CHECK-NEXT: Size: 48
> > -# CHECK-NEXT: Link: 6
> > +# CHECK-NEXT: Link: 8
> > # CHECK-NEXT: Info: 1
> > # CHECK-NEXT: AddressAlignment: 8
> > # CHECK-NEXT: EntrySize: 24
> > @@ -146,14 +194,14 @@ _start:
> > # CHECK: )
> > # CHECK-NEXT: }
> > # CHECK-NEXT: Section {
> > -# CHECK-NEXT: Index: 6
> > -# CHECK-NEXT: Name: .strtab
> > +# CHECK-NEXT: Index: 8
> > +# CHECK-NEXT: Name: .strtab (29)
> > # CHECK-NEXT: Type: SHT_STRTAB (0x3)
> > # CHECK-NEXT: Flags [ (0x0)
> > # CHECK-NEXT: ]
> > # CHECK-NEXT: Address: 0x0
> > -# CHECK-NEXT: Offset: 0x20048
> > -# CHECK-NEXT: Size: 46
> > +# CHECK-NEXT: Offset: 0x20088
> > +# CHECK-NEXT: Size: 57
> > # CHECK-NEXT: Link: 0
> > # CHECK-NEXT: Info: 0
> > # CHECK-NEXT: AddressAlignment: 1
> > @@ -205,8 +253,8 @@ _start:
> > # CHECK-NEXT: Offset: 0x2000
> > # CHECK-NEXT: VirtualAddress: 0x10020000
> > # CHECK-NEXT: PhysicalAddress: 0x10020000
> > -# CHECK-NEXT: FileSize: 24
> > -# CHECK-NEXT: MemSize: 24
> > +# CHECK-NEXT: FileSize: 88
> > +# CHECK-NEXT: MemSize: 88
> > # CHECK-NEXT: Flags [ (0x6)
> > # CHECK-NEXT: PF_R (0x4)
> > # CHECK-NEXT: PF_W (0x2)
> >
> >
> > _______________________________________________
> > llvm-commits mailing list
> > llvm-commits at lists.llvm.org
> > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
--
Hal Finkel
Assistant Computational Scientist
Leadership Computing Facility
Argonne National Laboratory
More information about the llvm-commits
mailing list