Index: ELF/Writer.cpp =================================================================== --- ELF/Writer.cpp +++ ELF/Writer.cpp @@ -1046,38 +1046,44 @@ SymbolOrder.insert({S, {Priority++, false}}); // Build a map from sections to their priorities. - for (InputFile *File : ObjectFiles) { - for (Symbol *Sym : File->getSymbols()) { - auto It = SymbolOrder.find(Sym->getName()); - if (It == SymbolOrder.end()) - continue; - 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()); - } - if (!D) - continue; + auto AddSym = [&](Symbol &Sym) { + auto It = SymbolOrder.find(Sym.getName()); + if (It == SymbolOrder.end()) + return; + SymbolOrderEntry &Ent = It->second; + Ent.Present = true; + + if (Config->WarnSymbolOrdering) { + auto *D = dyn_cast(&Sym); + InputFile *File = Sym.File; + 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()); + } + if (auto *D = dyn_cast(&Sym)) { if (auto *Sec = dyn_cast_or_null(D->Section)) { int &Priority = SectionOrder[cast(Sec->Repl)]; Priority = std::min(Priority, Ent.Priority); } } - } + }; + for (Symbol *Sym : Symtab->getSymbols()) + if (!Sym->isLazy()) + AddSym(*Sym); + for (InputFile *File : ObjectFiles) + for (Symbol *Sym : File->getSymbols()) + if (Sym->isLocal()) + AddSym(*Sym); if (Config->WarnSymbolOrdering) for (auto OrderEntry : SymbolOrder) Index: test/ELF/symbol-ordering-file-warnings.s =================================================================== --- test/ELF/symbol-ordering-file-warnings.s +++ test/ELF/symbol-ordering-file-warnings.s @@ -97,23 +97,22 @@ # WARN-NOT: warning: # SAMESYM: warning: {{.*}}.txt: duplicate ordered symbol: _start # WARN-NOT: warning: -# ABSOLUTE: warning: {{.*}}1.o: unable to order absolute symbol: absolute -# WARN-NOT: warning: # DISCARD: warning: {{.*}}1.o: unable to order discarded symbol: discard # WARN-NOT: warning: # GC: warning: {{.*}}1.o: unable to order discarded symbol: gc # WARN-NOT: warning: -# SHARED: warning: {{.*}}1.o: unable to order shared symbol: shared +# SHARED: warning: {{.*}}.so: unable to order shared symbol: shared # WARN-NOT: warning: # UNDEFINED: warning: {{.*}}3.o: unable to order undefined symbol: undefined # WARN-NOT: warning: +# ABSOLUTE: warning: {{.*}}1.o: unable to order absolute symbol: absolute +# 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 -# MULTI-NEXT: warning: {{.*}}3.o: unable to order undefined symbol: multi +# MULTI: warning: {{.*}}3.o: unable to order undefined symbol: multi +# MULTI-NEXT: warning: {{.*}}2.o: unable to order absolute symbol: multi # WARN-NOT: warning: absolute = 0x1234