[lld] r278555 - [ELF] - Do not use mergeable sections when LS is used.

Rafael EspĂ­ndola via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 25 11:10:42 PDT 2016


This is pretty brutal.

What are the sections in the kernel that are sometimes SHF_MERGE and
sometimes are not?

I would suggest trying

* Still creating multiple sections if one in SHF_MERGE and another is not.
* Allow adding a merge input section to a regular output section. That
way at least we disable the merging only if mismatched flags are found
and only for that section.

Cheers,
Rafael





On 12 August 2016 at 15:56, George Rimar via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
> Author: grimar
> Date: Fri Aug 12 14:56:57 2016
> New Revision: 278555
>
> URL: http://llvm.org/viewvc/llvm-project?rev=278555&view=rev
> Log:
> [ELF] - Do not use mergeable sections when LS is used.
>
> After latest changes we combine input sections with
> different attributes into single output section.
> Problem here is that regular output sections does not
> support adding mergeable input sections (and vise versa).
> Patch just temporarily disables merging for now at
> the same way we do for -O0 for example.
>
> This change helps for linking FreeBSD kernel.
>
> Differential revision: https://reviews.llvm.org/D23447
>
> Added:
>     lld/trunk/test/ELF/linkerscript/linkerscript-merge-sections.s
> Modified:
>     lld/trunk/ELF/InputFiles.cpp
>
> Modified: lld/trunk/ELF/InputFiles.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.cpp?rev=278555&r1=278554&r2=278555&view=diff
> ==============================================================================
> --- lld/trunk/ELF/InputFiles.cpp (original)
> +++ lld/trunk/ELF/InputFiles.cpp Fri Aug 12 14:56:57 2016
> @@ -11,6 +11,7 @@
>  #include "Driver.h"
>  #include "Error.h"
>  #include "InputSection.h"
> +#include "LinkerScript.h"
>  #include "SymbolTable.h"
>  #include "Symbols.h"
>  #include "llvm/ADT/STLExtras.h"
> @@ -162,6 +163,14 @@ bool elf::ObjectFile<ELFT>::shouldMerge(
>    if (Config->Optimize == 0)
>      return false;
>
> +  // We don't merge if linker script has SECTIONS command. When script
> +  // do layout it can merge several sections with different attributes
> +  // into single output sections. We currently do not support adding
> +  // mergeable input sections to regular output ones as well as adding
> +  // regular input sections to mergeable output.
> +  if (ScriptConfig->HasContents)
> +    return false;
> +
>    // A mergeable section with size 0 is useless because they don't have
>    // any data to merge. A mergeable string section with size 0 can be
>    // argued as invalid because it doesn't end with a null character.
>
> Added: lld/trunk/test/ELF/linkerscript/linkerscript-merge-sections.s
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/linkerscript/linkerscript-merge-sections.s?rev=278555&view=auto
> ==============================================================================
> --- lld/trunk/test/ELF/linkerscript/linkerscript-merge-sections.s (added)
> +++ lld/trunk/test/ELF/linkerscript/linkerscript-merge-sections.s Fri Aug 12 14:56:57 2016
> @@ -0,0 +1,28 @@
> +# REQUIRES: x86
> +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
> +
> +# RUN: echo "SECTIONS { .foo : { *(.foo.*) } }" > %t.script
> +# RUN: ld.lld -o %t1 --script %t.script %t
> +# RUN: llvm-objdump -s %t1 | FileCheck %s
> +# CHECK:      Contents of section .foo:
> +# CHECK-NEXT:  0158 01000000 02000000 00000000 73686f72  ............shor
> +# CHECK-NEXT:  0168 7420756e 7369676e 65642069 6e7400    t unsigned int.
> +
> +.global _start
> +_start:
> +  nop
> +
> +.section .foo.1, "aw"
> +writable:
> + .long 1
> +
> +.section .foo.2, "aM", at progbits,1
> +readable:
> + .long 2
> +
> +.section .foo.3, "awx"
> + .long 0
> +
> +.section .foo.4, "MS", at progbits,1
> +.LASF2:
> + .string "short unsigned int"
>
>
> _______________________________________________
> 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