[PATCH] D43234: [ELF] - Fix case of using both --icf and --symbol-ordering-file together.

George Rimar via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 13 06:05:19 PST 2018


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

Imagine that we have sections A, B, C, where A == C and
symbol ordering file containing symbols: symC, symB, symA

Previously because of ICF it was possible that final order would be
B, A or B, C. That violates order specified in ordering file.
Patch changes that.

Alternative can be to disable ICF for ordered sections. Not sure what
is better. May be we should do that instead ?


https://reviews.llvm.org/D43234

Files:
  ELF/Writer.cpp
  test/ELF/symbol-ordering-file-icf.s


Index: test/ELF/symbol-ordering-file-icf.s
===================================================================
--- test/ELF/symbol-ordering-file-icf.s
+++ test/ELF/symbol-ordering-file-icf.s
@@ -0,0 +1,32 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
+# RUN: echo "zed" > %t.order
+# RUN: echo "bar" >> %t.order
+# RUN: echo "foo" >> %t.order
+# RUN: ld.lld --icf=all --symbol-ordering-file %t.order -shared %t.o -o %t.so
+# RUN: llvm-nm %t.so | FileCheck %s
+
+## Check that after ICF merges 'foo' and 'zed' we still
+## place them before 'bar', in according to ordering file.
+# CHECK-DAG: 0000000000001000 T foo
+# CHECK-DAG: 0000000000001000 T zed
+# CHECK-DAG: 0000000000001004 T bar
+
+.section .text.foo,"ax", at progbits
+.align 4
+.global foo
+foo:
+  retq
+
+.section .text.bar,"ax", at progbits
+.align 4
+.global bar
+bar:
+  nop
+  retq
+
+.section .text.zed,"ax", at progbits
+.align 4
+.global zed
+zed:
+  retq
Index: ELF/Writer.cpp
===================================================================
--- ELF/Writer.cpp
+++ ELF/Writer.cpp
@@ -1043,6 +1043,13 @@
         continue;
       int &Priority = SectionOrder[D->Section];
       Priority = std::min(Priority, SymbolOrder.lookup(D->getName()));
+
+      // If ICF merged sections, we want to use the highest priority.
+      if (D->Section != D->Section->Repl) {
+        int &ReplPriority = SectionOrder[D->Section->Repl];
+        Priority = std::min(Priority, ReplPriority);
+        ReplPriority = Priority;
+      }
     }
   }
   return SectionOrder;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D43234.134026.patch
Type: text/x-patch
Size: 1560 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180213/edcb2614/attachment.bin>


More information about the llvm-commits mailing list