[lld] r356428 - [ELF] Allow sh_entsize to be unrelated to sh_addralign and not a power of 2

Hans Wennborg via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 23 07:57:40 PDT 2019


This seems to have caused new link errors for Chromium targeting
AArch64: https://bugs.chromium.org/p/chromium/issues/detail?id=953815

Can you take a look?

On Tue, Mar 19, 2019 at 12:48 AM Fangrui Song via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
>
> Author: maskray
> Date: Mon Mar 18 16:49:18 2019
> New Revision: 356428
>
> URL: http://llvm.org/viewvc/llvm-project?rev=356428&view=rev
> Log:
> [ELF] Allow sh_entsize to be unrelated to sh_addralign and not a power of 2
>
> Summary:
> This implements Rui Ueyama's idea in PR39044.
> I've checked that ld.bfd and gold do not have the power-of-2 requirement
> and do not require sh_entsize to be a multiple of sh_align.
>
> Now on the updated test merge-entsize.s, all the 3 linkers happily
> create .rodata that is not 3-byte aligned.
>
> This has a use case in Linux arch/x86/crypto/sha512-avx2-asm.S
> It uses sh_entsize of 640, which is not a power of 2.
> See https://github.com/ClangBuiltLinux/linux/issues/417
>
> Reviewers: ruiu, espindola
>
> Reviewed By: ruiu
>
> Subscribers: nickdesaulniers, E5ten, emaste, arichardson, llvm-commits
>
> Tags: #llvm
>
> Differential Revision: https://reviews.llvm.org/D59478
>
> Modified:
>     lld/trunk/ELF/SyntheticSections.cpp
>     lld/trunk/test/ELF/icf-merged-sections.s
>     lld/trunk/test/ELF/merge-entsize.s
>     lld/trunk/test/ELF/merge-gc-piece.s
>     lld/trunk/test/ELF/merge-reloc-O0.s
>     lld/trunk/test/ELF/merge-sym.s
>
> Modified: lld/trunk/ELF/SyntheticSections.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SyntheticSections.cpp?rev=356428&r1=356427&r2=356428&view=diff
> ==============================================================================
> --- lld/trunk/ELF/SyntheticSections.cpp (original)
> +++ lld/trunk/ELF/SyntheticSections.cpp Mon Mar 18 16:49:18 2019
> @@ -3016,7 +3016,6 @@ void elf::mergeSections() {
>      }
>
>      StringRef OutsecName = getOutputSectionName(MS);
> -    uint32_t Alignment = std::max<uint32_t>(MS->Alignment, MS->Entsize);
>
>      auto I = llvm::find_if(MergeSections, [=](MergeSyntheticSection *Sec) {
>        // While we could create a single synthetic section for two different
> @@ -3028,11 +3027,11 @@ void elf::mergeSections() {
>        // Using Entsize in here also allows us to propagate it to the synthetic
>        // section.
>        return Sec->Name == OutsecName && Sec->Flags == MS->Flags &&
> -             Sec->Entsize == MS->Entsize && Sec->Alignment == Alignment;
> +             Sec->Entsize == MS->Entsize && Sec->Alignment == MS->Alignment;
>      });
>      if (I == MergeSections.end()) {
>        MergeSyntheticSection *Syn =
> -          createMergeSynthetic(OutsecName, MS->Type, MS->Flags, Alignment);
> +          createMergeSynthetic(OutsecName, MS->Type, MS->Flags, MS->Alignment);
>        MergeSections.push_back(Syn);
>        I = std::prev(MergeSections.end());
>        S = Syn;
>
> Modified: lld/trunk/test/ELF/icf-merged-sections.s
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/icf-merged-sections.s?rev=356428&r1=356427&r2=356428&view=diff
> ==============================================================================
> --- lld/trunk/test/ELF/icf-merged-sections.s (original)
> +++ lld/trunk/test/ELF/icf-merged-sections.s Mon Mar 18 16:49:18 2019
> @@ -19,7 +19,7 @@
>  # CHECK-NEXT: Size: 16
>  # CHECK-NEXT: Link:
>  # CHECK-NEXT: Info:
> -# CHECK-NEXT: AddressAlignment: 8
> +# CHECK-NEXT: AddressAlignment: 1
>  # CHECK-NEXT: EntrySize: 0
>  # CHECK-NEXT: SectionData (
>  # CHECK-NEXT:   0000: 67452301 10325476 67452301 10325476
>
> Modified: lld/trunk/test/ELF/merge-entsize.s
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/merge-entsize.s?rev=356428&r1=356427&r2=356428&view=diff
> ==============================================================================
> --- lld/trunk/test/ELF/merge-entsize.s (original)
> +++ lld/trunk/test/ELF/merge-entsize.s Mon Mar 18 16:49:18 2019
> @@ -4,10 +4,15 @@
>  // RUN: llvm-readobj -s %t | FileCheck %s
>
>          .section  .rodata.1,"aM", at progbits,1
> +        .p2align 2
>          .byte 0x42
>
> -        .section  .rodata.2,"aM", at progbits,2
> +// sh_addralign = 4 while sh_entsize = 3.
> +// sh_entsize is not necessarily a power of 2 and it can be unrelated to sh_addralign.
> +        .section  .rodata.2,"aM", at progbits,3
> +        .p2align 2
>          .short 0x42
> +        .byte 0
>
>  // Since the output section has both .rodata.1 and .rodata.2, it
>  // contains elements of different sizes and we use an entsize of 0.
> @@ -23,5 +28,5 @@
>  // CHECK-NEXT: Size:
>  // CHECK-NEXT: Link:
>  // CHECK-NEXT: Info:
> -// CHECK-NEXT: AddressAlignment:
> +// CHECK-NEXT: AddressAlignment: 4
>  // CHECK-NEXT: EntrySize: 0
>
> Modified: lld/trunk/test/ELF/merge-gc-piece.s
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/merge-gc-piece.s?rev=356428&r1=356427&r2=356428&view=diff
> ==============================================================================
> --- lld/trunk/test/ELF/merge-gc-piece.s (original)
> +++ lld/trunk/test/ELF/merge-gc-piece.s Mon Mar 18 16:49:18 2019
> @@ -10,7 +10,7 @@
>  # CHECK-NEXT:   SHF_ALLOC
>  # CHECK-NEXT:   SHF_MERGE
>  # CHECK-NEXT: ]
> -# CHECK-NEXT: Address: 0x200
> +# CHECK-NEXT: Address: 0x1FD
>
>  # CHECK:      Name: .bar
>  # CHECK-NEXT: Type: SHT_PROGBITS
> @@ -24,7 +24,7 @@
>  # CHECK-NEXT: AddressAlignment:
>  # CHECK-NEXT: EntrySize:
>  # CHECK-NEXT: SectionData (
> -# CHECK-NEXT:   0000: 01020000 00000000 02020000 00000000
> +# CHECK-NEXT:   0000: FE010000 00000000 FF010000 00000000
>  # CHECK-NEXT: )
>
>          .section .foo,"aM", at progbits,8
>
> Modified: lld/trunk/test/ELF/merge-reloc-O0.s
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/merge-reloc-O0.s?rev=356428&r1=356427&r2=356428&view=diff
> ==============================================================================
> --- lld/trunk/test/ELF/merge-reloc-O0.s (original)
> +++ lld/trunk/test/ELF/merge-reloc-O0.s Mon Mar 18 16:49:18 2019
> @@ -16,7 +16,7 @@
>  # CHECK-NEXT: Size: 16
>  # CHECK-NEXT: Link:
>  # CHECK-NEXT: Info:
> -# CHECK-NEXT: AddressAlignment: 8
> +# CHECK-NEXT: AddressAlignment: 1
>  # CHECK-NEXT: EntrySize: 8
>  # CHECK-NEXT: SectionData (
>  # CHECK-NEXT:   0000: 41000000 00000000 42000000 00000000
> @@ -33,7 +33,7 @@
>  # CHECK-NEXT: Size: 8
>  # CHECK-NEXT: Link:
>  # CHECK-NEXT: Info:
> -# CHECK-NEXT: AddressAlignment: 4
> +# CHECK-NEXT: AddressAlignment: 1
>  # CHECK-NEXT: EntrySize: 4
>  # CHECK-NEXT: SectionData (
>  # CHECK-NEXT:   0000: 41000000 42000000
>
> Modified: lld/trunk/test/ELF/merge-sym.s
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/merge-sym.s?rev=356428&r1=356427&r2=356428&view=diff
> ==============================================================================
> --- lld/trunk/test/ELF/merge-sym.s (original)
> +++ lld/trunk/test/ELF/merge-sym.s Mon Mar 18 16:49:18 2019
> @@ -15,7 +15,7 @@ foo:
>  // CHECK-NEXT:   SHF_ALLOC
>  // CHECK-NEXT:   SHF_MERGE
>  // CHECK-NEXT: ]
> -// CHECK-NEXT: Address: 0x210
> +// CHECK-NEXT: Address: 0x20D
>
>  // CHECK:      Name: foo
> -// CHECK-NEXT: Value: 0x212
> +// CHECK-NEXT: Value: 0x20F
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list