summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/ELF/Writer.cpp2
-rw-r--r--lld/test/ELF/symbol-ordering-file-icf.s32
2 files changed, 33 insertions, 1 deletions
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index 060f21adf06..1fb2895e42d 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -1056,7 +1056,7 @@ static DenseMap<const InputSectionBase *, int> buildSectionOrder() {
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);
}
}
diff --git a/lld/test/ELF/symbol-ordering-file-icf.s b/lld/test/ELF/symbol-ordering-file-icf.s
new file mode 100644
index 00000000000..93e377cb53b
--- /dev/null
+++ b/lld/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",@progbits
+.align 4
+.global foo
+foo:
+ retq
+
+.section .text.bar,"ax",@progbits
+.align 4
+.global bar
+bar:
+ nop
+ retq
+
+.section .text.zed,"ax",@progbits
+.align 4
+.global zed
+zed:
+ retq
OpenPOWER on IntegriCloud