mirror of
https://github.com/RPCSX/llvm.git
synced 2025-01-19 10:53:55 +00:00
[WebAssembly] Write initial memory in pages not bytes
Subscribers: jfb, dschuff Differential Revision: https://reviews.llvm.org/D32660 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@301687 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
8c9ed246f2
commit
649003c411
@ -24,6 +24,8 @@ namespace wasm {
|
||||
const char WasmMagic[] = {'\0', 'a', 's', 'm'};
|
||||
// Wasm binary format version
|
||||
const uint32_t WasmVersion = 0x1;
|
||||
// Wasm uses a 64k page size
|
||||
const uint32_t WasmPageSize = 65536;
|
||||
|
||||
struct WasmObjectHeader {
|
||||
StringRef Magic;
|
||||
|
@ -913,12 +913,14 @@ void WasmObjectWriter::writeObject(MCAssembler &Asm,
|
||||
// For now, always emit the memory section, since loads and stores are not
|
||||
// valid without it. In the future, we could perhaps be more clever and omit
|
||||
// it if there are no loads or stores.
|
||||
startSection(Section, wasm::WASM_SEC_MEMORY);
|
||||
uint32_t NumPages =
|
||||
(DataBytes.size() + wasm::WasmPageSize - 1) / wasm::WasmPageSize;
|
||||
|
||||
startSection(Section, wasm::WASM_SEC_MEMORY);
|
||||
encodeULEB128(1, getStream()); // number of memory spaces
|
||||
|
||||
encodeULEB128(0, getStream()); // flags
|
||||
encodeULEB128(DataBytes.size(), getStream()); // initial
|
||||
encodeULEB128(NumPages, getStream()); // initial
|
||||
|
||||
endSection(Section);
|
||||
|
||||
|
@ -32,6 +32,11 @@ entry:
|
||||
; CHECK: }
|
||||
; CHECK: Section {
|
||||
; CHECK: Type: MEMORY (0x5)
|
||||
; CHECK: Memories [
|
||||
; CHECK: Memory {
|
||||
; CHECK: InitialPages: 1
|
||||
; CHECK: }
|
||||
; CHECK: ]
|
||||
; CHECK: }
|
||||
; CHECK: Section {
|
||||
; CHECK: Type: GLOBAL (0x6)
|
||||
|
@ -518,6 +518,11 @@ WASM-NEXT: Section {
|
||||
WASM-NEXT: Type: MEMORY (0x5)
|
||||
WASM-NEXT: Size: 3
|
||||
WASM-NEXT: Offset: 66
|
||||
WASM-NEXT: Memories [
|
||||
WASM-NEXT: Memory {
|
||||
WASM-NEXT: InitialPages: 0
|
||||
WASM-NEXT: }
|
||||
WASM-NEXT: ]
|
||||
WASM-NEXT: }
|
||||
WASM-NEXT: Section {
|
||||
WASM-NEXT: Type: EXPORT (0x7)
|
||||
|
@ -150,8 +150,20 @@ void WasmDumper::printSections() {
|
||||
W.printEnum("Type", WasmSec.Type, makeArrayRef(WasmSectionTypes));
|
||||
W.printNumber("Size", (uint64_t)WasmSec.Content.size());
|
||||
W.printNumber("Offset", WasmSec.Offset);
|
||||
if (WasmSec.Type == wasm::WASM_SEC_CUSTOM) {
|
||||
switch (WasmSec.Type) {
|
||||
case wasm::WASM_SEC_CUSTOM:
|
||||
W.printString("Name", WasmSec.Name);
|
||||
break;
|
||||
case wasm::WASM_SEC_MEMORY:
|
||||
ListScope Group(W, "Memories");
|
||||
for (const wasm::WasmLimits &Memory : Obj->memories()) {
|
||||
DictScope Group(W, "Memory");
|
||||
W.printNumber("InitialPages", Memory.Initial);
|
||||
if (Memory.Flags & wasm::WASM_LIMITS_FLAG_HAS_MAX) {
|
||||
W.printNumber("MaxPages", WasmSec.Offset);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (opts::SectionRelocations) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user