diff --git a/lld/MachO/DriverUtils.cpp b/lld/MachO/DriverUtils.cpp --- a/lld/MachO/DriverUtils.cpp +++ b/lld/MachO/DriverUtils.cpp @@ -186,17 +186,17 @@ Optional macho::resolveDylibPath(StringRef dylibPath) { // TODO: if a tbd and dylib are both present, we should check to make sure // they are consistent. - bool dylibExists = fs::exists(dylibPath); - searchedDylib(dylibPath, dylibExists); - if (dylibExists) - return std::string(dylibPath); - SmallString<261> tbdPath = dylibPath; path::replace_extension(tbdPath, ".tbd"); bool tbdExists = fs::exists(tbdPath); searchedDylib(tbdPath, tbdExists); if (tbdExists) return std::string(tbdPath); + + bool dylibExists = fs::exists(dylibPath); + searchedDylib(dylibPath, dylibExists); + if (dylibExists) + return std::string(dylibPath); return {}; } diff --git a/lld/test/MachO/link-search-order.s b/lld/test/MachO/link-search-order.s --- a/lld/test/MachO/link-search-order.s +++ b/lld/test/MachO/link-search-order.s @@ -48,6 +48,10 @@ # RUN: -L%tD -L%t -lhello -lgoodbye -lSystem %t/test.o -search_dylibs_first # RUN: llvm-objdump --macho --dylibs-used %t/test | FileCheck --check-prefix=DYLIB %s +################ Test that we try the tbd file before the binary for frameworks too. +# RUN: not %lld -dylib -F %t -framework Foo -o %t --print-dylib-search \ +# RUN: | FileCheck --check-prefix=FRAMEWORKSEARCH -DPATH=%t %s + # DYLIB: @executable_path/libhello.dylib # DYLIB: @executable_path/libgoodbye.dylib # DYLIB: /usr/lib/libSystem.dylib @@ -72,6 +76,9 @@ # ARCHIVESEARCH: searched [[PATH]]{{[/\\]}}libhello.dylib, found # ARCHIVESEARCH: searched [[PATH]]A{{[/\\]}}libgoodbye.a, found +# FRAMEWORKSEARCH: searched [[PATH]]{{[/\\]}}Foo.framework{{[/\\]}}Foo.tbd, not found +# FRAMEWORKSEARCH-NEXT: searched [[PATH]]{{[/\\]}}Foo.framework{{[/\\]}}Foo, not found + .section __TEXT,__text .global _main