-
Notifications
You must be signed in to change notification settings - Fork 14.4k
[LLD][COFF] Make /wholearchive thin-archive member identifiers consistent #145487
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
[LLD][COFF] Make /wholearchive thin-archive member identifiers consistent #145487
Conversation
@llvm/pr-subscribers-lld @llvm/pr-subscribers-platform-windows Author: bd1976bris (bd1976bris) ChangesA thin archive is an archive/library format where the archive itself contains only references to member object files on disk, rather than embedding the file contents. For the non-/wholearchive case, we use the path to the archive member as the identifier for thin-archive members (see comments in Apart from consistency, my motivation for fixing this is DTLTO (#126654), where having the member identifier be the path on disk allows distribution of bitcode members during ThinLTO. Full diff: https://github.com/llvm/llvm-project/pull/145487.diff 2 Files Affected:
diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp
index f3240b22a1442..caff50d4bbae4 100644
--- a/lld/COFF/Driver.cpp
+++ b/lld/COFF/Driver.cpp
@@ -275,7 +275,12 @@ void LinkerDriver::addBuffer(std::unique_ptr<MemoryBuffer> mb,
int memberIndex = 0;
for (MemoryBufferRef m : getArchiveMembers(ctx, archive))
- addArchiveBuffer(m, "<whole-archive>", filename, memberIndex++);
+ if (!archive->isThin())
+ addArchiveBuffer(m, "<whole-archive>", filename, memberIndex++);
+ else
+ // Pass empty string as archive name so that the original filename is
+ // used as the buffer identifier.
+ addArchiveBuffer(m, "<whole-archive>", "", /*OffsetInArchive=*/0);
return;
}
addFile(make<ArchiveFile>(ctx, mbref));
diff --git a/lld/test/COFF/thin-archive.s b/lld/test/COFF/thin-archive.s
index 55d71ea635673..930c7488a7f56 100644
--- a/lld/test/COFF/thin-archive.s
+++ b/lld/test/COFF/thin-archive.s
@@ -22,12 +22,20 @@
# SYMTAB: ?f@@YAHXZ in
# NO-SYMTAB-NOT: ?f@@YAHXZ in
-# RUN: lld-link /entry:main %t.main.obj %t.lib /out:%t.exe 2>&1 | \
-# RUN: FileCheck --allow-empty %s
-# RUN: lld-link /entry:main %t.main.obj %t_thin.lib /out:%t.exe 2>&1 | \
-# RUN: FileCheck --allow-empty %s
-# RUN: lld-link /entry:main %t.main.obj /wholearchive:%t_thin.lib /out:%t.exe 2>&1 | \
-# RUN: FileCheck --allow-empty %s
+# RUN: echo /entry:main %t.main.obj /out:%t.exe /verbose > %t.rsp
+
+# RUN: lld-link @%t.rsp %t.lib 2>&1 | \
+# RUN: FileCheck --allow-empty %s --check-prefixes=CHECK,LOAD_NON_THIN
+# RUN: lld-link @%t.rsp %t_thin.lib 2>&1 | \
+# RUN: FileCheck --allow-empty %s --check-prefixes=CHECK,LOAD_THIN_SYM
+# RUN: lld-link @%t.rsp /wholearchive:%t_thin.lib 2>&1 | \
+# RUN: FileCheck --allow-empty %s --check-prefixes=CHECK,LOAD_THIN_WHOLE
+# RUN: lld-link @%t.rsp /wholearchive %t_thin.lib 2>&1 | \
+# RUN: FileCheck --allow-empty %s --check-prefixes=CHECK,LOAD_THIN_WHOLE
+
+# LOAD_NON_THIN: Loaded thin-archive{{.*}}.lib(thin-archive{{.*}}.obj) for int __cdecl f(void)
+# LOAD_THIN_SYM: Loaded {{.*}}thin-archive{{.*}}.obj for int __cdecl f(void)
+# LOAD_THIN_WHOLE: Loaded {{.*}}thin-archive{{.*}}.obj for <whole-archive>
# RUN: rm %t.lib.obj
# RUN: lld-link /entry:main %t.main.obj %t.lib /out:%t.exe 2>&1 | \
|
89db92c
to
661eddd
Compare
…tent A thin archive is an archive/library format where the archive itself contains only references to member object files on disk, rather than embedding the file contents. For the non-/wholearchive case, we use the path to the archive member as the identifier for thin-archive members (see comments in `enqueueArchiveMember`). This patch modifies the /wholearchive path to behave the same way. Apart from consistency, my motivation for fixing this is DTLTO (llvm#126654), where having the member identifier be the path on disk allows distribution of bitcode members during ThinLTO.
661eddd
to
7c8c158
Compare
Rebased and force-pushed to base this patch on a more recent commit. |
ping. |
A thin archive is an archive/library format where the archive itself contains only references to member object files on disk, rather than embedding the file contents.
For the non-/wholearchive case, we use the path to the archive member as the identifier for thin-archive members (see comments in
enqueueArchiveMember
). This patch modifies the /wholearchive path to behave the same way.Apart from consistency, my motivation for fixing this is DTLTO (#126654), where having the member identifier be the path on disk allows distribution of bitcode members during ThinLTO.