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

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 12 12:56:57 PDT 2016


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"




More information about the llvm-commits mailing list