summaryrefslogtreecommitdiffstats
path: root/lld/wasm/Writer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lld/wasm/Writer.cpp')
-rw-r--r--lld/wasm/Writer.cpp21
1 files changed, 19 insertions, 2 deletions
diff --git a/lld/wasm/Writer.cpp b/lld/wasm/Writer.cpp
index 58d585bf0cb..c4a87be519c 100644
--- a/lld/wasm/Writer.cpp
+++ b/lld/wasm/Writer.cpp
@@ -263,7 +263,6 @@ void Writer::layoutMemory() {
memoryPtr += 4;
}
- // TODO: Add .bss space here.
if (WasmSym::dataEnd)
WasmSym::dataEnd->setVirtualAddress(memoryPtr);
@@ -667,7 +666,7 @@ void Writer::createOutputSegments() {
OutputSegment *&s = segmentMap[name];
if (s == nullptr) {
LLVM_DEBUG(dbgs() << "new segment: " << name << "\n");
- s = make<OutputSegment>(name, segments.size());
+ s = make<OutputSegment>(name);
if (config->sharedMemory || name == ".tdata")
s->initFlags = WASM_SEGMENT_IS_PASSIVE;
segments.push_back(s);
@@ -676,6 +675,24 @@ void Writer::createOutputSegments() {
LLVM_DEBUG(dbgs() << "added data: " << name << ": " << s->size << "\n");
}
}
+
+ // Sort segments by type, placing .bss last
+ std::stable_sort(segments.begin(), segments.end(),
+ [](const OutputSegment *a, const OutputSegment *b) {
+ auto order = [](StringRef name) {
+ return StringSwitch<int>(name)
+ .StartsWith(".rodata", 0)
+ .StartsWith(".data", 1)
+ .StartsWith(".tdata", 2)
+ .StartsWith(".bss", 4)
+ .Default(3);
+ };
+ return order(a->name) < order(b->name);
+ });
+
+ for (size_t i = 0; i < segments.size(); ++i) {
+ segments[i]->index = i;
+ }
}
static void createFunction(DefinedFunction *func, StringRef bodyContent) {
OpenPOWER on IntegriCloud