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; } + + // Skip sections eliminated by GC, but we don't want to skip + // ICFed functions. + if (!Sec->Live && Sec->Repl == Sec) { + Warning("unable to order discarded symbol"); + continue; + } + + int &Priority = SectionOrder[cast(Sec->Repl)]; + Priority = std::min(Priority, Ent.Priority); } } 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 @@ -43,7 +43,7 @@ # RUN: echo "icf1" > %t-order-icf.txt # RUN: echo "icf2" >> %t-order-icf.txt # RUN: ld.lld %t1.o -o %t --symbol-ordering-file %t-order-icf.txt --icf=all \ -# RUN: --unresolved-symbols=ignore-all 2>&1 | FileCheck %s --check-prefixes=WARN,ICF +# RUN: --unresolved-symbols=ignore-all --fatal-warnings # Check that a warning is emitted for symbols discarded due to a linker script /DISCARD/ section. # RUN: echo "discard" > %t-order-discard.txt @@ -109,7 +109,6 @@ # 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 # 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