[lld] r304769 - [ELF] - Allow multiple comdats when producing relocatable output.

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 5 23:38:33 PDT 2017


Author: grimar
Date: Tue Jun  6 01:38:32 2017
New Revision: 304769

URL: http://llvm.org/viewvc/llvm-project?rev=304769&view=rev
Log:
[ELF] - Allow multiple comdats when producing relocatable output.

Previously LLD would fail for case when there are multiple comdats and -r.

That happened because it merged all ".group" (SHT_GROUP) sections into single
output, producing broken result. Such sections may have similar name, alignment and flags
and other properties. We need to produce separate output section for each such input one.

Differential revision: https://reviews.llvm.org/D33643

Added:
    lld/trunk/test/ELF/Inputs/relocatable-comdat-multiple.s
    lld/trunk/test/ELF/relocatable-comdat-multiple.s
Modified:
    lld/trunk/ELF/OutputSections.cpp

Modified: lld/trunk/ELF/OutputSections.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/OutputSections.cpp?rev=304769&r1=304768&r2=304769&view=diff
==============================================================================
--- lld/trunk/ELF/OutputSections.cpp (original)
+++ lld/trunk/ELF/OutputSections.cpp Tue Jun  6 01:38:32 2017
@@ -345,6 +345,17 @@ void elf::reportDiscarded(InputSectionBa
 
 void OutputSectionFactory::addInputSec(InputSectionBase *IS,
                                        StringRef OutsecName) {
+  // Sections with the SHT_GROUP attribute reach here only when the - r option
+  // is given. Such sections define "section groups", and InputFiles.cpp has
+  // dedup'ed section groups by their signatures. For the -r, we want to pass
+  // through all SHT_GROUP sections without merging them because merging them
+  // creates broken section contents.
+  if (IS->Type == SHT_GROUP) {
+    OutputSection *Out = nullptr;
+    addInputSec(IS, OutsecName, Out);
+    return;
+  }
+
   SectionKey Key = createKey(IS, OutsecName);
   OutputSection *&Sec = Map[Key];
   return addInputSec(IS, OutsecName, Sec);

Added: lld/trunk/test/ELF/Inputs/relocatable-comdat-multiple.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/Inputs/relocatable-comdat-multiple.s?rev=304769&view=auto
==============================================================================
--- lld/trunk/test/ELF/Inputs/relocatable-comdat-multiple.s (added)
+++ lld/trunk/test/ELF/Inputs/relocatable-comdat-multiple.s Tue Jun  6 01:38:32 2017
@@ -0,0 +1,2 @@
+.section .text.c,"axG", at progbits,bbb,comdat
+.section .text.d,"axG", at progbits,bbb,comdat

Added: lld/trunk/test/ELF/relocatable-comdat-multiple.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/relocatable-comdat-multiple.s?rev=304769&view=auto
==============================================================================
--- lld/trunk/test/ELF/relocatable-comdat-multiple.s (added)
+++ lld/trunk/test/ELF/relocatable-comdat-multiple.s Tue Jun  6 01:38:32 2017
@@ -0,0 +1,31 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
+# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %S/Inputs/relocatable-comdat-multiple.s -o %t2.o
+# RUN: ld.lld -r %t.o %t2.o -o %t
+# RUN: llvm-readobj -elf-section-groups %t | FileCheck %s
+
+# CHECK:      Groups {
+# CHECK-NEXT:   Group {
+# CHECK-NEXT:     Name: .group
+# CHECK-NEXT:     Index: 2
+# CHECK-NEXT:     Type: COMDAT
+# CHECK-NEXT:     Signature: aaa
+# CHECK-NEXT:     Section(s) in group [
+# CHECK-NEXT:       .text.a
+# CHECK-NEXT:       .text.b
+# CHECK-NEXT:     ]
+# CHECK-NEXT:   }
+# CHECK-NEXT:   Group {
+# CHECK-NEXT:     Name: .group
+# CHECK-NEXT:     Index: 5
+# CHECK-NEXT:     Type: COMDAT
+# CHECK-NEXT:     Signature: bbb
+# CHECK-NEXT:     Section(s) in group [
+# CHECK-NEXT:       .text.c
+# CHECK-NEXT:       .text.d
+# CHECK-NEXT:     ]
+# CHECK-NEXT:   }
+# CHECK-NEXT: }
+
+.section .text.a,"axG", at progbits,aaa,comdat
+.section .text.b,"axG", at progbits,aaa,comdat




More information about the llvm-commits mailing list