[lld/mac] Make -t work correctly with -flat_namespace
We used to not print dylibs referenced by other dylibs in `-t` mode. This affected reexports, and with `-flat_namespace` also just dylibs loaded by dylibs. Now we print them. Fixes PR49514. Differential Revision: https://reviews.llvm.org/D103428
This commit is contained in:
parent
e6f88dc01a
commit
222a88a243
|
@ -316,7 +316,8 @@ static InputFile *addFile(StringRef path, bool forceLoadArchive,
|
||||||
if (newFile) {
|
if (newFile) {
|
||||||
// printArchiveMemberLoad() prints both .a and .o names, so no need to
|
// printArchiveMemberLoad() prints both .a and .o names, so no need to
|
||||||
// print the .a name here.
|
// print the .a name here.
|
||||||
if (config->printEachFile && magic != file_magic::archive)
|
if (config->printEachFile && magic != file_magic::archive &&
|
||||||
|
!isa<DylibFile>(newFile))
|
||||||
message(toString(newFile));
|
message(toString(newFile));
|
||||||
inputFiles.insert(newFile);
|
inputFiles.insert(newFile);
|
||||||
}
|
}
|
||||||
|
|
|
@ -214,6 +214,8 @@ DylibFile *macho::loadDylib(MemoryBufferRef mbref, DylibFile *umbrella,
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
file = make<DylibFile>(**result, umbrella, isBundleLoader);
|
file = make<DylibFile>(**result, umbrella, isBundleLoader);
|
||||||
|
if (config->printEachFile)
|
||||||
|
message(toString(file));
|
||||||
|
|
||||||
// parseReexports() can recursively call loadDylib(). That's fine since
|
// parseReexports() can recursively call loadDylib(). That's fine since
|
||||||
// we wrote DylibFile we just loaded to the loadDylib cache via the `file`
|
// we wrote DylibFile we just loaded to the loadDylib cache via the `file`
|
||||||
|
@ -229,6 +231,8 @@ DylibFile *macho::loadDylib(MemoryBufferRef mbref, DylibFile *umbrella,
|
||||||
magic == file_magic::macho_executable ||
|
magic == file_magic::macho_executable ||
|
||||||
magic == file_magic::macho_bundle);
|
magic == file_magic::macho_bundle);
|
||||||
file = make<DylibFile>(mbref, umbrella, isBundleLoader);
|
file = make<DylibFile>(mbref, umbrella, isBundleLoader);
|
||||||
|
if (config->printEachFile)
|
||||||
|
message(toString(file));
|
||||||
|
|
||||||
// parseLoadCommands() can also recursively call loadDylib(). See comment
|
// parseLoadCommands() can also recursively call loadDylib(). See comment
|
||||||
// in previous block for why this means we must copy `file` here.
|
// in previous block for why this means we must copy `file` here.
|
||||||
|
|
|
@ -14,7 +14,15 @@
|
||||||
|
|
||||||
# With flat_namespace, the linker automatically looks in foo.dylib and
|
# With flat_namespace, the linker automatically looks in foo.dylib and
|
||||||
# bar.dylib too, but it doesn't add a LC_LOAD_DYLIB for it.
|
# bar.dylib too, but it doesn't add a LC_LOAD_DYLIB for it.
|
||||||
# RUN: %lld -flat_namespace -lSystem %t/main.o %t/baz.dylib -o %t/out
|
# RUN: %lld -flat_namespace -lSystem %t/main.o %t/baz.dylib -o %t/out -t | \
|
||||||
|
# RUN: FileCheck --check-prefix=T %s
|
||||||
|
## FIXME: The `bar.dylib` line should use `T-NEXT`, but on Windows we load
|
||||||
|
## libSystem.tbd with different slash styles and end up loading it twice
|
||||||
|
## for that reason.
|
||||||
|
# T: main.o
|
||||||
|
# T-NEXT: baz.dylib
|
||||||
|
# T: bar.dylib
|
||||||
|
# T-NEXT: foo.dylib
|
||||||
# RUN: llvm-objdump --macho --all-headers %t/out \
|
# RUN: llvm-objdump --macho --all-headers %t/out \
|
||||||
# RUN: | FileCheck --check-prefix=HEADERBITS %s
|
# RUN: | FileCheck --check-prefix=HEADERBITS %s
|
||||||
# RUN: llvm-objdump --macho --bind --lazy-bind --weak-bind %t/out \
|
# RUN: llvm-objdump --macho --bind --lazy-bind --weak-bind %t/out \
|
||||||
|
|
Loading…
Reference in New Issue