summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/ELF/Writer.cpp43
-rw-r--r--lld/test/ELF/symbol-ordering-file-icf.s9
-rw-r--r--lld/test/ELF/symbol-ordering-file-warnings.s2
3 files changed, 30 insertions, 24 deletions
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index 309022dbb92..b29c383007a 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -1045,28 +1045,35 @@ static DenseMap<const InputSectionBase *, int> buildSectionOrder() {
SymbolOrderEntry &Ent = It->second;
Ent.Present = true;
- auto *D = dyn_cast<Defined>(Sym);
- if (Config->WarnSymbolOrdering) {
- if (Sym->isUndefined())
- warn(File->getName() +
- ": unable to order undefined symbol: " + Sym->getName());
- else if (Sym->isShared())
- warn(File->getName() +
- ": unable to order shared symbol: " + Sym->getName());
- else if (D && !D->Section)
- warn(File->getName() +
- ": unable to order absolute symbol: " + Sym->getName());
- else if (D && !D->Section->Live)
- warn(File->getName() +
- ": unable to order discarded symbol: " + Sym->getName());
+ auto Warning = [&](StringRef Msg) {
+ if (Config->WarnSymbolOrdering)
+ warn(File->getName() + ": " + Msg + ": " + Sym->getName());
+ };
+
+ if (Sym->isUndefined()) {
+ Warning("unable to order undefined symbol");
+ continue;
}
- if (!D)
+ if (Sym->isShared()) {
+ Warning("unable to order shared symbol");
continue;
+ }
- if (auto *Sec = dyn_cast_or_null<InputSectionBase>(D->Section)) {
- int &Priority = SectionOrder[cast<InputSectionBase>(Sec->Repl)];
- Priority = std::min(Priority, Ent.Priority);
+ auto *Sec = dyn_cast_or_null<InputSectionBase>(cast<Defined>(Sym)->Section);
+ if (!Sec) {
+ Warning("unable to order absolute symbol");
+ continue;
+ }
+ if (!Sec->Live) {
+ if (Sec->Repl == Sec)
+ Warning("unable to order discarded symbol");
+ else
+ Warning("unable to order a symbol merged by ICF");
+ continue;
}
+
+ 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
index 93e377cb53b..14a835c18cc 100644
--- a/lld/test/ELF/symbol-ordering-file-icf.s
+++ b/lld/test/ELF/symbol-ordering-file-icf.s
@@ -6,11 +6,10 @@
# 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
+## Check that we do not sort ICF'ed symbols 'foo' and 'zed'.
+# CHECK-DAG: 0000000000001000 T bar
+# CHECK-DAG: 0000000000001004 T foo
+# CHECK-DAG: 0000000000001004 T zed
.section .text.foo,"ax",@progbits
.align 4
diff --git a/lld/test/ELF/symbol-ordering-file-warnings.s b/lld/test/ELF/symbol-ordering-file-warnings.s
index aabac53b06b..a41a9fc6071 100644
--- a/lld/test/ELF/symbol-ordering-file-warnings.s
+++ b/lld/test/ELF/symbol-ordering-file-warnings.s
@@ -109,7 +109,7 @@
# WARN-NOT: warning:
# MISSING: warning: symbol ordering file: no such symbol: missing
# MISSING2: warning: symbol ordering file: no such symbol: missing_sym
-# ICF: warning: {{.*}}1.o: unable to order discarded symbol: icf2
+# ICF: warning: {{.*}}1.o: unable to order a symbol merged by ICF: icf2
# COMDAT: warning: {{.*}}1.o: unable to order discarded symbol: comdat
# COMDAT-NEXT: warning: {{.*}}2.o: unable to order discarded symbol: comdat
# MULTI: warning: {{.*}}2.o: unable to order absolute symbol: multi
OpenPOWER on IntegriCloud