[lld] r288151 - [ELF] - Disable emiting multiple output sections when merging is disabled.

Rafael Avila de Espindola via llvm-commits llvm-commits at lists.llvm.org
Sat Dec 3 23:27:59 PST 2016


Long term I think the best fix for creating a single outputsection is to
make merge synthetic sections. That way we produce a synthetic section
for every case we currently produce an output section and then they get
combined in a single output section.

Cheers,
Rafael


George Rimar via llvm-commits <llvm-commits at lists.llvm.org> writes:

> Author: grimar
> Date: Tue Nov 29 10:11:09 2016
> New Revision: 288151
>
> URL: http://llvm.org/viewvc/llvm-project?rev=288151&view=rev
> Log:
> [ELF] - Disable emiting multiple output sections when merging is disabled.
>
> When -O0 is specified, we do not do section merging.
> Though before this patch several sections were generated instead
> of single, what is useless.
>
> Differential revision: https://reviews.llvm.org/D27041
>
> Added:
>     lld/trunk/test/ELF/no-merge.s
> Modified:
>     lld/trunk/ELF/InputSection.cpp
>     lld/trunk/test/ELF/merge-string.s
>
> Modified: lld/trunk/ELF/InputSection.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputSection.cpp?rev=288151&r1=288150&r2=288151&view=diff
> ==============================================================================
> --- lld/trunk/ELF/InputSection.cpp (original)
> +++ lld/trunk/ELF/InputSection.cpp Tue Nov 29 10:11:09 2016
> @@ -80,6 +80,12 @@ InputSectionBase<ELFT>::InputSectionBase
>    if (V > UINT32_MAX)
>      fatal(toString(File) + ": section sh_addralign is too large");
>    Alignment = V;
> +
> +  // If it is not a mergeable section, overwrite the flag so that the flag
> +  // is consistent with the class. This inconsistency could occur when
> +  // string merging is disabled using -O0 flag.
> +  if (!Config->Relocatable && !isa<MergeInputSection<ELFT>>(this))
> +    this->Flags &= ~(SHF_MERGE | SHF_STRINGS);
>  }
>  
>  template <class ELFT>
>
> Modified: lld/trunk/test/ELF/merge-string.s
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/merge-string.s?rev=288151&r1=288150&r2=288151&view=diff
> ==============================================================================
> --- lld/trunk/test/ELF/merge-string.s (original)
> +++ lld/trunk/test/ELF/merge-string.s Tue Nov 29 10:11:09 2016
> @@ -61,8 +61,6 @@ zed:
>  // NOMERGE-NEXT: Type:    SHT_PROGBITS
>  // NOMERGE-NEXT: Flags [
>  // NOMERGE-NEXT:   SHF_ALLOC
> -// NOMERGE-NEXT:   SHF_MERGE
> -// NOMERGE-NEXT:   SHF_STRINGS
>  // NOMERGE-NEXT: ]
>  // NOMERGE-NEXT: Address:         0x1C8
>  // NOMERGE-NEXT: Offset:  0x1C8
>
> Added: lld/trunk/test/ELF/no-merge.s
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/no-merge.s?rev=288151&view=auto
> ==============================================================================
> --- lld/trunk/test/ELF/no-merge.s (added)
> +++ lld/trunk/test/ELF/no-merge.s Tue Nov 29 10:11:09 2016
> @@ -0,0 +1,25 @@
> +# REQUIRES: x86
> +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o
> +# RUN: echo "SECTIONS { .data : {*(.data.*)} }" > %t0.script
> +# RUN: ld.lld %t.o -o %t0.out --script %t0.script
> +# RUN: llvm-objdump -s %t0.out | FileCheck %s --check-prefix=OPT
> +# OPT:      Contents of section .data:
> +# OPT-NEXT:   0000 01
> +# OPT-NEXT: Contents of section .data:
> +# OPT-NEXT:   0001 6100
> +# OPT-NEXT: Contents of section .data:
> +# OPT-NEXT:   0003 03
> +
> +# RUN: ld.lld -O0 %t.o -o %t1.out --script %t0.script
> +# RUN: llvm-objdump -s %t1.out | FileCheck %s --check-prefix=NOOPT
> +# NOOPT:      Contents of section .data:
> +# NOOPT-NEXT:   0000 01610003
> +
> +.section .data.aw,"aw", at progbits
> +.byte 1
> +
> +.section .data.ams,"aMS", at progbits,1
> +.asciz "a"
> +
> +.section .data.am,"aM", at progbits,1
> +.byte 3
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list