@@ -955,6 +955,47 @@ static void processStubLibrariesPreLTO() {
955
955
}
956
956
}
957
957
958
+ static bool addStubSymbolDeps (const StubFile *stub_file, Symbol *sym,
959
+ ArrayRef<StringRef> deps) {
960
+ // The first stub library to define a given symbol sets this and
961
+ // definitions in later stub libraries are ignored.
962
+ if (sym->forceImport )
963
+ return false ; // Already handled
964
+ sym->forceImport = true ;
965
+ if (sym->traced )
966
+ message (toString (stub_file) + " : importing " + sym->getName ());
967
+ else
968
+ LLVM_DEBUG (llvm::dbgs () << toString (stub_file) << " : importing "
969
+ << sym->getName () << " \n " );
970
+ bool depsAdded = false ;
971
+ for (const auto dep : deps) {
972
+ auto *needed = symtab->find (dep);
973
+ if (!needed) {
974
+ error (toString (stub_file) + " : undefined symbol: " + dep +
975
+ " . Required by " + toString (*sym));
976
+ } else if (needed->isUndefined ()) {
977
+ error (toString (stub_file) + " : undefined symbol: " + toString (*needed) +
978
+ " . Required by " + toString (*sym));
979
+ } else {
980
+ if (needed->traced )
981
+ message (toString (stub_file) + " : exported " + toString (*needed) +
982
+ " due to import of " + sym->getName ());
983
+ else
984
+ LLVM_DEBUG (llvm::dbgs ()
985
+ << " force export: " << toString (*needed) << " \n " );
986
+ needed->forceExport = true ;
987
+ if (auto *lazy = dyn_cast<LazySymbol>(needed)) {
988
+ depsAdded = true ;
989
+ lazy->extract ();
990
+ if (!config->whyExtract .empty ())
991
+ ctx.whyExtractRecords .emplace_back (toString (stub_file),
992
+ sym->getFile (), *sym);
993
+ }
994
+ }
995
+ }
996
+ return depsAdded;
997
+ }
998
+
958
999
static void processStubLibraries () {
959
1000
log (" -- processStubLibraries" );
960
1001
bool depsAdded = false ;
@@ -963,49 +1004,28 @@ static void processStubLibraries() {
963
1004
for (auto &stub_file : ctx.stubFiles ) {
964
1005
LLVM_DEBUG (llvm::dbgs ()
965
1006
<< " processing stub file: " << stub_file->getName () << " \n " );
1007
+
1008
+ // First look for any imported symbols that directly match
1009
+ // the names of the stub imports
966
1010
for (auto [name, deps]: stub_file->symbolDependencies ) {
967
1011
auto * sym = symtab->find (name);
968
- if (!sym || !sym->isUndefined ()) {
1012
+ if (sym && sym->isUndefined ()) {
1013
+ depsAdded |= addStubSymbolDeps (stub_file, sym, deps);
1014
+ } else {
969
1015
if (sym && sym->traced )
970
1016
message (toString (stub_file) + " : stub symbol not needed: " + name);
971
1017
else
972
- LLVM_DEBUG (llvm::dbgs () << " stub symbol not needed: ` " << name << " ` \n " );
973
- continue ;
1018
+ LLVM_DEBUG (llvm::dbgs ()
1019
+ << " stub symbol not needed: ` " << name << " ` \n " ) ;
974
1020
}
975
- // The first stub library to define a given symbol sets this and
976
- // definitions in later stub libraries are ignored.
977
- if (sym->forceImport )
978
- continue ; // Already handled
979
- sym->forceImport = true ;
980
- if (sym->traced )
981
- message (toString (stub_file) + " : importing " + name);
982
- else
983
- LLVM_DEBUG (llvm::dbgs ()
984
- << toString (stub_file) << " : importing " << name << " \n " );
985
- for (const auto dep : deps) {
986
- auto * needed = symtab->find (dep);
987
- if (!needed) {
988
- error (toString (stub_file) + " : undefined symbol: " + dep +
989
- " . Required by " + toString (*sym));
990
- } else if (needed->isUndefined ()) {
991
- error (toString (stub_file) +
992
- " : undefined symbol: " + toString (*needed) +
993
- " . Required by " + toString (*sym));
994
- } else {
995
- if (needed->traced )
996
- message (toString (stub_file) + " : exported " + toString (*needed) +
997
- " due to import of " + name);
998
- else
999
- LLVM_DEBUG (llvm::dbgs ()
1000
- << " force export: " << toString (*needed) << " \n " );
1001
- needed->forceExport = true ;
1002
- if (auto *lazy = dyn_cast<LazySymbol>(needed)) {
1003
- depsAdded = true ;
1004
- lazy->extract ();
1005
- if (!config->whyExtract .empty ())
1006
- ctx.whyExtractRecords .emplace_back (stub_file->getName (),
1007
- sym->getFile (), *sym);
1008
- }
1021
+ }
1022
+
1023
+ // Secondly looks for any symbols with an `importName` that matches
1024
+ for (Symbol *sym : symtab->symbols ()) {
1025
+ if (sym->isUndefined () && sym->importName .has_value ()) {
1026
+ auto it = stub_file->symbolDependencies .find (sym->importName .value ());
1027
+ if (it != stub_file->symbolDependencies .end ()) {
1028
+ depsAdded |= addStubSymbolDeps (stub_file, sym, it->second );
1009
1029
}
1010
1030
}
1011
1031
}
0 commit comments