diff options
author | George Rimar <grimar@accesssoftek.com> | 2018-02-27 08:26:38 +0000 |
---|---|---|
committer | George Rimar <grimar@accesssoftek.com> | 2018-02-27 08:26:38 +0000 |
commit | a77b963c903e0e686c6ed43fbe650e967ba42bfc (patch) | |
tree | 205e68813336218e5ae0a2b0b21910a0a38a39db | |
parent | f268cd0aadd218e163dd33d69391c363d35b59ce (diff) | |
download | bcm5719-llvm-a77b963c903e0e686c6ed43fbe650e967ba42bfc.tar.gz bcm5719-llvm-a77b963c903e0e686c6ed43fbe650e967ba42bfc.zip |
[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
llvm-svn: 326179
-rw-r--r-- | lld/ELF/Writer.cpp | 2 | ||||
-rw-r--r-- | lld/test/ELF/symbol-ordering-file-icf.s | 32 |
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 |