forked from OSchip/llvm-project
[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
This commit is contained in:
parent
f268cd0aad
commit
a77b963c90
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue