Index: lld/ELF/Writer.cpp =================================================================== --- lld/ELF/Writer.cpp +++ lld/ELF/Writer.cpp @@ -1045,28 +1045,35 @@ SymbolOrderEntry &Ent = It->second; Ent.Present = true; - auto *D = dyn_cast(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(D->Section)) { - int &Priority = SectionOrder[cast(Sec->Repl)]; - Priority = std::min(Priority, Ent.Priority); + auto *Sec = dyn_cast_or_null(cast(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(Sec->Repl)]; + Priority = std::min(Priority, Ent.Priority); } } Index: lld/test/ELF/symbol-ordering-file-icf.s =================================================================== --- lld/test/ELF/symbol-ordering-file-icf.s +++ 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 Index: lld/test/ELF/symbol-ordering-file-warnings.s =================================================================== --- lld/test/ELF/symbol-ordering-file-warnings.s +++ 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