Index: COFF/Driver.cpp =================================================================== --- COFF/Driver.cpp +++ COFF/Driver.cpp @@ -768,6 +768,13 @@ return; } + // Get a list of all comdat sections for error checking. + DenseSet Set; + for (Chunk *C : Symtab->getChunks()) + if (auto *Sec = dyn_cast(C)) + if (Sec->Sym) + Set.insert(Sec->Sym->getName()); + // Open a file. StringRef Path = Arg.substr(1); std::unique_ptr MB = CHECK( @@ -780,7 +787,11 @@ for (std::string S : args::getLines(MB->getMemBufferRef())) { if (Config->Machine == I386 && !isDecorated(S)) S = "_" + S; - Config->Order[S] = INT_MIN + Config->Order.size(); + + if (Set.count(S) == 0) + warn("/order:" + Arg + ": missing symbol: " + S); + else + Config->Order[S] = INT_MIN + Config->Order.size(); } } @@ -1188,10 +1199,6 @@ } } - // Handle /order - if (auto *Arg = Args.getLastArg(OPT_order)) - parseOrderFile(Arg->getValue()); - // Handle /export for (auto *Arg : Args.filtered(OPT_export)) { Export E = parseExport(Arg->getValue()); @@ -1391,6 +1398,12 @@ if (Config->Manifest == Configuration::SideBySide) createSideBySideManifest(); + // Handle /order. We want to do this at this moment because we + // need a complete list of comdat sections to warn on nonexistent + // functions. + if (auto *Arg = Args.getLastArg(OPT_order)) + parseOrderFile(Arg->getValue()); + // Identify unreferenced COMDAT sections. if (Config->DoGC) markLive(Symtab->getChunks()); Index: test/COFF/order.test =================================================================== --- test/COFF/order.test +++ test/COFF/order.test @@ -24,6 +24,18 @@ # DEFAULT: fn4 # DEFAULT: fn1 +# RUN: echo fn1 > %t2.order +# RUN: echo fn2 >> %t2.order +# RUN: echo fn3 >> %t2.order +# RUN: echo fn4 >> %t2.order +# RUN: echo foo >> %t2.order +# RUN: lld-link -entry:fn1 -subsystem:console -debug %t1.obj %t2.obj \ +# RUN: -out:%t.exe -order:@%t2.order 2>&1 | FileCheck -check-prefix=WARN %s +# WARN: warning: /order:{{.*}} missing symbol: foo +# WARN-NOT: f2 +# WARN-NOT: f3 +# WARN-NOT: f4 + --- !COFF header: Machine: IMAGE_FILE_MACHINE_AMD64