[lld] r363126 - [ELF][PPC64] Don't report "relocation refers to a discarded section" for .toc

Hans Wennborg via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 25 06:33:49 PDT 2019


On Wed, Jun 12, 2019 at 9:32 AM Fangrui Song via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
>
> Author: maskray
> Date: Wed Jun 12 00:35:42 2019
> New Revision: 363126
>
> URL: http://llvm.org/viewvc/llvm-project?rev=363126&view=rev
> Log:
> [ELF][PPC64] Don't report "relocation refers to a discarded section" for .toc
>
> Summary:
> clang (as of 2019-06-12) / gcc (as of 8.2.1) PPC64 may emit a .rela.toc

Why a date instead of a specific revision number? The date gives the
reader no clue of what Clang change introduced this.

> which references an embedded switch table in a discarded .rodata/.text
> section. The .toc and the .rela.toc are incorrectly not placed in the
> comdat.
>
> Technically a relocation from outside the group is not allowed by the ELF spec:
>
> > A symbol table entry with STB_LOCAL binding that is defined relative
> > to one of a group's sections, and that is contained in a symbol table
> > section that is not part of the group, must be discarded if the group
> > members are discarded. References to this symbol table entry from
> > outside the group are not allowed.
>
> Don't report errors to work around the bug.
>
> This should fix the ppc64le-lld-multistage-test bot while linking llvm-tblgen:

Again would've been nice to have a revision for when the errors
started happening, so this fixed could be correlated to the breaking
change.

>
>     ld.lld: error: relocation refers to a discarded section: .rodata._ZNK4llvm3MVT13getSizeInBitsEv
>     >>> defined in utils/TableGen/CMakeFiles/llvm-tblgen.dir/CodeGenRegisters.cpp.o
>     >>> referenced by CodeGenRegisters.cpp
>     >>> utils/TableGen/CMakeFiles/llvm-tblgen.dir/CodeGenRegisters.cpp.o:(.toc+0x0)
>
> Some other PPC specific sections may have similar problems. We can blacklist more
> section names when problems occur.
>
>     // A simple program that reproduces the bug.
>     // Note .rela.toc (outside the group) references a section symbol (STB_LOCAL) in a group.
>     void puts(const char *);
>     struct A {
>       void foo(int a) {
>         switch (a) {
>         case 0: puts("0"); break;
>         case 1: puts("1"); puts("1"); break;
>         case 2: puts("2"); break;
>         case 3: puts("3"); puts("4"); break;
>         case 4: puts("4"); break;
>         case 5: puts("5"); puts("5"); break;
>         case 6: puts("6"); break;
>         }
>       }
>       int a;
>     };
>     void foo(A x) { x.foo(x.a); }
>
> Reviewers: ruiu, sfertile, espindola
>
> Reviewed By: ruiu
>
> Subscribers: emaste, nemanjai, arichardson, kbarton, jsji, llvm-commits
>
> Tags: #llvm
>
> Differential Revision: https://reviews.llvm.org/D63182


More information about the llvm-commits mailing list