[lld] r326179 - [ELF] - Fix case of using both --icf and --symbol-ordering-file together.

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 27 00:26:38 PST 2018


Author: grimar
Date: Tue Feb 27 00:26:38 2018
New Revision: 326179

URL: http://llvm.org/viewvc/llvm-project?rev=326179&view=rev
Log:
[ELF] - Fix case of using both --icf and --symbol-ordering-file together.

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.

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

Added:
    lld/trunk/test/ELF/symbol-ordering-file-icf.s
Modified:
    lld/trunk/ELF/Writer.cpp

Modified: lld/trunk/ELF/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=326179&r1=326178&r2=326179&view=diff
==============================================================================
--- lld/trunk/ELF/Writer.cpp (original)
+++ lld/trunk/ELF/Writer.cpp Tue Feb 27 00:26:38 2018
@@ -1056,7 +1056,7 @@ static DenseMap<const InputSectionBase *
         continue;
 
       if (auto *Sec = dyn_cast_or_null<InputSectionBase>(D->Section)) {
-        int &Priority = SectionOrder[Sec];
+        int &Priority = SectionOrder[cast<InputSectionBase>(Sec->Repl)];
         Priority = std::min(Priority, Ent.Priority);
       }
     }

Added: lld/trunk/test/ELF/symbol-ordering-file-icf.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/symbol-ordering-file-icf.s?rev=326179&view=auto
==============================================================================
--- lld/trunk/test/ELF/symbol-ordering-file-icf.s (added)
+++ lld/trunk/test/ELF/symbol-ordering-file-icf.s Tue Feb 27 00:26:38 2018
@@ -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




More information about the llvm-commits mailing list