-
Notifications
You must be signed in to change notification settings - Fork 14.8k
[lld][WebAssembly] Don't mark --start-lib
/--end-lib
files as live
#137714
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
Conversation
Without this change files in `--start-lib`/`--end-lib` groups were being marked as live, which means there static constructors were being included in the link.
@llvm/pr-subscribers-lld-wasm @llvm/pr-subscribers-lld Author: Sam Clegg (sbc100) ChangesWithout this change files in Full diff: https://github.com/llvm/llvm-project/pull/137714.diff 3 Files Affected:
diff --git a/lld/test/wasm/Inputs/start-lib1.s b/lld/test/wasm/Inputs/start-lib1.s
index 229f67a4bd897..9ebfdbc2f61e1 100644
--- a/lld/test/wasm/Inputs/start-lib1.s
+++ b/lld/test/wasm/Inputs/start-lib1.s
@@ -5,3 +5,10 @@ foo:
.functype foo () -> ()
call bar
end_function
+
+# Static constructor inserted here to ensure the object file is not
+# being processed as "live". Live object files have their static constructors
+# preserved even if no symbol within is used.
+.section .init_array,"",@
+ .p2align 2
+ .int32 foo
diff --git a/lld/wasm/Driver.cpp b/lld/wasm/Driver.cpp
index de976947474e1..86c4ce397e357 100644
--- a/lld/wasm/Driver.cpp
+++ b/lld/wasm/Driver.cpp
@@ -317,10 +317,6 @@ void LinkerDriver::addFile(StringRef path) {
if (inWholeArchive) {
for (const auto &[m, offset] : members) {
auto *object = createObjectFile(m, path, offset);
- // Mark object as live; object members are normally not
- // live by default but -whole-archive is designed to treat
- // them as such.
- object->markLive();
files.push_back(object);
}
diff --git a/lld/wasm/InputFiles.cpp b/lld/wasm/InputFiles.cpp
index 614cddddd1b19..1d1b82c9879b9 100644
--- a/lld/wasm/InputFiles.cpp
+++ b/lld/wasm/InputFiles.cpp
@@ -423,8 +423,10 @@ ObjFile::ObjFile(MemoryBufferRef m, StringRef archiveName, bool lazy)
// https://github.com/llvm/llvm-project/issues/98778
checkArch(wasmObj->getArch());
- // If this isn't part of an archive, it's eagerly linked, so mark it live.
- if (archiveName.empty())
+ // Unless we are processing this as a lazy object file (e.g. part of an
+ // archive file or within `--start-lib`/`--end-lib`, it's eagerly linked, so
+ // mark it live.
+ if (!lazy)
markLive();
}
|
// Mark object as live; object members are normally not | ||
// live by default but -whole-archive is designed to treat | ||
// them as such. | ||
object->markLive(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This was unnecessary because the forth argument to createObjectFile
(lazy
) defaults to false
which then calls markLive
.
So is |
Exactly yes. |
…llvm#137714) Without this change files in `--start-lib`/`--end-lib` groups were being marked as live, which means there static constructors were being included in the link.
…llvm#137714) Without this change files in `--start-lib`/`--end-lib` groups were being marked as live, which means there static constructors were being included in the link.
…llvm#137714) Without this change files in `--start-lib`/`--end-lib` groups were being marked as live, which means there static constructors were being included in the link.
…llvm#137714) Without this change files in `--start-lib`/`--end-lib` groups were being marked as live, which means there static constructors were being included in the link.
…llvm#137714) Without this change files in `--start-lib`/`--end-lib` groups were being marked as live, which means there static constructors were being included in the link.
Without this change files in
--start-lib
/--end-lib
groups were being marked as live, which means there static constructors were being included in the link.