@@ -898,52 +898,61 @@ static void processStubLibrariesPreLTO() {
898
898
899
899
static void processStubLibraries () {
900
900
log (" -- processStubLibraries" );
901
- for (auto &stub_file : symtab->stubFiles ) {
902
- LLVM_DEBUG (llvm::dbgs ()
903
- << " processing stub file: " << stub_file->getName () << " \n " );
904
- for (auto [name, deps]: stub_file->symbolDependencies ) {
905
- auto * sym = symtab->find (name);
906
- if (!sym || !sym->isUndefined ()) {
907
- LLVM_DEBUG (llvm::dbgs () << " stub symbol not needed: " << name << " \n " );
908
- continue ;
909
- }
910
- // The first stub library to define a given symbol sets this and
911
- // definitions in later stub libraries are ignored.
912
- if (sym->forceImport )
913
- continue ; // Already handled
914
- sym->forceImport = true ;
915
- if (sym->traced )
916
- message (toString (stub_file) + " : importing " + name);
917
- else
918
- LLVM_DEBUG (llvm::dbgs ()
919
- << toString (stub_file) << " : importing " << name << " \n " );
920
- for (const auto dep : deps) {
921
- auto * needed = symtab->find (dep);
922
- if (!needed) {
923
- error (toString (stub_file) + " : undefined symbol: " + dep +
924
- " . Required by " + toString (*sym));
925
- } else if (needed->isUndefined ()) {
926
- error (toString (stub_file) +
927
- " : undefined symbol: " + toString (*needed) +
928
- " . Required by " + toString (*sym));
929
- } else {
930
- if (needed->traced )
931
- message (toString (stub_file) + " : exported " + toString (*needed) +
932
- " due to import of " + name);
901
+ bool depsAdded = false ;
902
+ do {
903
+ depsAdded = false ;
904
+ for (auto &stub_file : symtab->stubFiles ) {
905
+ LLVM_DEBUG (llvm::dbgs ()
906
+ << " processing stub file: " << stub_file->getName () << " \n " );
907
+ for (auto [name, deps]: stub_file->symbolDependencies ) {
908
+ auto * sym = symtab->find (name);
909
+ if (!sym || !sym->isUndefined ()) {
910
+ if (sym && sym->traced )
911
+ message (toString (stub_file) + " : stub symbol not needed: " + name);
933
912
else
934
- LLVM_DEBUG (llvm::dbgs ()
935
- << " force export: " << toString (*needed) << " \n " );
936
- needed->forceExport = true ;
937
- if (auto *lazy = dyn_cast<LazySymbol>(needed)) {
938
- lazy->fetch ();
939
- if (!config->whyExtract .empty ())
940
- config->whyExtractRecords .emplace_back (stub_file->getName (),
941
- sym->getFile (), *sym);
913
+ LLVM_DEBUG (llvm::dbgs () << " stub symbol not needed: `" << name << " `\n " );
914
+ continue ;
915
+ }
916
+ // The first stub library to define a given symbol sets this and
917
+ // definitions in later stub libraries are ignored.
918
+ if (sym->forceImport )
919
+ continue ; // Already handled
920
+ sym->forceImport = true ;
921
+ if (sym->traced )
922
+ message (toString (stub_file) + " : importing " + name);
923
+ else
924
+ LLVM_DEBUG (llvm::dbgs ()
925
+ << toString (stub_file) << " : importing " << name << " \n " );
926
+ for (const auto dep : deps) {
927
+ auto * needed = symtab->find (dep);
928
+ if (!needed) {
929
+ error (toString (stub_file) + " : undefined symbol: " + dep +
930
+ " . Required by " + toString (*sym));
931
+ } else if (needed->isUndefined ()) {
932
+ error (toString (stub_file) +
933
+ " : undefined symbol: " + toString (*needed) +
934
+ " . Required by " + toString (*sym));
935
+ } else {
936
+ if (needed->traced )
937
+ message (toString (stub_file) + " : exported " + toString (*needed) +
938
+ " due to import of " + name);
939
+ else
940
+ LLVM_DEBUG (llvm::dbgs ()
941
+ << " force export: " << toString (*needed) << " \n " );
942
+ needed->forceExport = true ;
943
+ if (auto *lazy = dyn_cast<LazySymbol>(needed)) {
944
+ depsAdded = true ;
945
+ lazy->fetch ();
946
+ if (!config->whyExtract .empty ())
947
+ config->whyExtractRecords .emplace_back (stub_file->getName (),
948
+ sym->getFile (), *sym);
949
+ }
942
950
}
943
951
}
944
952
}
945
953
}
946
- }
954
+ } while (depsAdded);
955
+
947
956
log (" -- done processStubLibraries" );
948
957
}
949
958
0 commit comments