From 84129150ce82894e185c084f2eaec05f4c03dd4c Mon Sep 17 00:00:00 2001 From: Sam Clegg Date: Tue, 27 Oct 2020 12:46:07 -0700 Subject: [PATCH] [lld][WebAssembly] Fix memory size in dylink section for -pie exectuables This field to represents the amount of static data needed by an dynamic library or executable it should not include things like heap or stack areas, which in the case of `-pie` are not determined until runtime (e.g. __stack_pointer is imported). Differential Revision: https://reviews.llvm.org/D90261 --- lld/test/wasm/pie.ll | 11 ++++++++++- lld/wasm/Writer.cpp | 9 ++++----- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/lld/test/wasm/pie.ll b/lld/test/wasm/pie.ll index 13d30ff..9dfee45 100644 --- a/lld/test/wasm/pie.ll +++ b/lld/test/wasm/pie.ll @@ -1,5 +1,5 @@ ; RUN: llc -relocation-model=pic -mattr=+mutable-globals -filetype=obj %s -o %t.o -; RUN: wasm-ld --no-gc-sections --allow-undefined -pie -o %t.wasm %t.o +; RUN: wasm-ld --no-gc-sections --allow-undefined --experimental-pic -pie -o %t.wasm %t.o ; RUN: obj2yaml %t.wasm | FileCheck %s target triple = "wasm32-unknown-emscripten" @@ -30,6 +30,15 @@ define void @_start() { ret void } +; CHECK: Sections: +; CHECK-NEXT: - Type: CUSTOM +; CHECK-NEXT: Name: dylink +; CHECK-NEXT: MemorySize: 16 +; CHECK-NEXT: MemoryAlignment: 2 +; CHECK-NEXT: TableSize: 1 +; CHECK-NEXT: TableAlignment: 0 +; CHECK-NEXT: Needed: [] + ; CHECK: - Type: IMPORT ; CHECK-NEXT: Imports: ; CHECK-NEXT: - Module: env diff --git a/lld/wasm/Writer.cpp b/lld/wasm/Writer.cpp index aaa2974..975f173 100644 --- a/lld/wasm/Writer.cpp +++ b/lld/wasm/Writer.cpp @@ -293,10 +293,10 @@ void Writer::layoutMemory() { if (WasmSym::dataEnd) WasmSym::dataEnd->setVirtualAddress(memoryPtr); - log("mem: static data = " + Twine(memoryPtr - dataStart)); - - if (config->shared) { - out.dylinkSec->memSize = memoryPtr; + uint64_t staticDataSize = memoryPtr - dataStart; + log("mem: static data = " + Twine(staticDataSize)); + if (config->isPic) { + out.dylinkSec->memSize = staticDataSize; return; } @@ -323,7 +323,6 @@ void Writer::layoutMemory() { Twine(maxMemorySetting)); memoryPtr = config->initialMemory; } - out.dylinkSec->memSize = memoryPtr; out.memorySec->numMemoryPages = alignTo(memoryPtr, WasmPageSize) / WasmPageSize; log("mem: total pages = " + Twine(out.memorySec->numMemoryPages)); -- 2.7.4