summaryrefslogtreecommitdiffstats
path: root/lld/wasm/Writer.cpp
diff options
context:
space:
mode:
authorThomas Lively <tlively@google.com>2019-10-15 19:05:11 +0000
committerThomas Lively <tlively@google.com>2019-10-15 19:05:11 +0000
commit190dacc3cc206fa90a44e2f4aa6b56c327d1942a (patch)
treec6efda90caff32ebc4ad49c538b1bf2a020d2aa6 /lld/wasm/Writer.cpp
parent0330fba6e16db9b5d2079313646f93485c5ccf39 (diff)
downloadbcm5719-llvm-190dacc3cc206fa90a44e2f4aa6b56c327d1942a.tar.gz
bcm5719-llvm-190dacc3cc206fa90a44e2f4aa6b56c327d1942a.zip
[WebAssembly] Elide data segments for .bss sections
Summary: WebAssembly memories are zero-initialized, so when module does not import its memory initializing .bss sections is guaranteed to be a no-op. To reduce binary size and initialization time, .bss sections are simply not emitted into the final binary unless the memory is imported. Reviewers: sbc100 Subscribers: dschuff, jgravelle-google, aheejin, sunfish, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D68965 llvm-svn: 374940
Diffstat (limited to 'lld/wasm/Writer.cpp')
-rw-r--r--lld/wasm/Writer.cpp9
1 files changed, 8 insertions, 1 deletions
diff --git a/lld/wasm/Writer.cpp b/lld/wasm/Writer.cpp
index 479b44b53fb..fe596257bea 100644
--- a/lld/wasm/Writer.cpp
+++ b/lld/wasm/Writer.cpp
@@ -669,6 +669,13 @@ void Writer::createOutputSegments() {
s = make<OutputSegment>(name);
if (config->sharedMemory || name == ".tdata")
s->initFlags = WASM_SEGMENT_IS_PASSIVE;
+ // Exported memories are guaranteed to be zero-initialized, so no need
+ // to emit data segments for bss sections.
+ // TODO: consider initializing bss sections with memory.fill
+ // instructions when memory is imported and bulk-memory is available.
+ if (!config->importMemory && !config->relocatable &&
+ name.startswith(".bss"))
+ s->isBss = true;
segments.push_back(s);
}
s->addInputSegment(segment);
@@ -961,7 +968,7 @@ void Writer::createSyntheticSections() {
out.exportSec = make<ExportSection>();
out.startSec = make<StartSection>(segments.size());
out.elemSec = make<ElemSection>();
- out.dataCountSec = make<DataCountSection>(segments.size());
+ out.dataCountSec = make<DataCountSection>(segments);
out.linkingSec = make<LinkingSection>(initFunctions, segments);
out.nameSec = make<NameSection>();
out.producersSec = make<ProducersSection>();
OpenPOWER on IntegriCloud