[PATCH] D44923: [ELF] Disable ICF for synthetic sections

Andrew Ng via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Mar 27 06:04:20 PDT 2018


andrewng created this revision.
andrewng added reviewers: ruiu, espindola.
Herald added subscribers: arichardson, emaste.

Do not include synthetic sections in ICF.

Fixes bug PR36910.

Alternative to https://reviews.llvm.org/D44898.


https://reviews.llvm.org/D44923

Files:
  ELF/ICF.cpp
  test/ELF/icf-merged-sections.s


Index: test/ELF/icf-merged-sections.s
===================================================================
--- test/ELF/icf-merged-sections.s
+++ test/ELF/icf-merged-sections.s
@@ -1,20 +1,28 @@
 # REQUIRES: x86
 
 # RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o
-# RUN: ld.lld %t.o -o %t --icf=all --ignore-data-address-equality --print-icf-sections | FileCheck %s --check-prefix ICF
-# RUN: llvm-objdump -s -d -print-imm-hex %t | FileCheck %s
+# RUN: ld.lld %t.o -o %t --icf=all --ignore-data-address-equality --print-icf-sections | FileCheck -allow-empty --check-prefix=NOICF %s
+# RUN: llvm-readobj -s -section-data %t | FileCheck %s
 
-# ICF: selected section <internal>:(.rodata)
-# ICF-NEXT: removing identical section <internal>:(.rodata)
+# Check that merge synthetic sections are not merged by ICF.
 
-# CHECK: {{^}}.text:
-# CHECK-NEXT: movq 0x[[ADDR:[0-9a-f]+]], %rax
-# CHECK-NEXT: movq 0x[[ADDR]], %rax
-# CHECK: Contents of section .rodata:
-# CHECK-NEXT: 2a000000 00000000 67452301 10325476
+# NOICF-NOT: selected section <internal>:(.rodata)
 
-.section .rodata, "a"
-  .quad 42
+# CHECK:      Name: .rodata
+# CHECK-NEXT: Type: SHT_PROGBITS
+# CHECK-NEXT: Flags [
+# CHECK-NEXT:   SHF_ALLOC
+# CHECK-NEXT:   SHF_MERGE
+# CHECK-NEXT: ]
+# CHECK-NEXT: Address:
+# CHECK-NEXT: Offset:
+# CHECK-NEXT: Size: 16
+# CHECK-NEXT: Link:
+# CHECK-NEXT: Info:
+# CHECK-NEXT: AddressAlignment: 8
+# CHECK-NEXT: EntrySize: 0
+# CHECK-NEXT: SectionData (
+# CHECK-NEXT:   0000: 67452301 10325476 67452301 10325476
 
 .section .rodata.cst4,"aM", at progbits,4
 rodata4:
@@ -27,7 +35,3 @@
 rodata8:
   .long 0x01234567
   .long 0x76543210
-
-.section .text,"ax"
-  movq rodata4, %rax
-  movq rodata8, %rax
Index: ELF/ICF.cpp
===================================================================
--- ELF/ICF.cpp
+++ ELF/ICF.cpp
@@ -77,6 +77,7 @@
 #include "Config.h"
 #include "SymbolTable.h"
 #include "Symbols.h"
+#include "SyntheticSections.h"
 #include "lld/Common/Threads.h"
 #include "llvm/ADT/Hashing.h"
 #include "llvm/BinaryFormat/ELF.h"
@@ -161,9 +162,10 @@
 
 // Returns true if section S is subject of ICF.
 static bool isEligible(InputSection *S) {
-  // Don't merge read only data sections unless
-  // --ignore-data-address-equality was passed.
-  if (!(S->Flags & SHF_EXECINSTR) && !Config->IgnoreDataAddressEquality)
+  // Don't merge read only data sections unless --ignore-data-address-equality
+  // was passed. Don't merge synthetic sections.
+  if ((!(S->Flags & SHF_EXECINSTR) && !Config->IgnoreDataAddressEquality) ||
+      dyn_cast<SyntheticSection>(S))
     return false;
 
   // .init and .fini contains instructions that must be executed to


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D44923.139906.patch
Type: text/x-patch
Size: 2685 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180327/0581d13e/attachment.bin>


More information about the llvm-commits mailing list