[PATCH] D67250: [WebAssembly] Add fence in __wasm_init_memory
Thomas Lively via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 5 17:57:06 PDT 2019
tlively created this revision.
tlively added reviewers: aheejin, sbc100.
Herald added subscribers: llvm-commits, jfb, sunfish, jgravelle-google, dschuff.
Herald added a project: LLVM.
`memory.init` is not atomic, so without the fence there is no
guarantee that the initialized memory is visible on other threads once
they have been woken up by the initializing thread.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D67250
Files:
lld/test/wasm/data-segments.ll
lld/wasm/Writer.cpp
llvm/include/llvm/BinaryFormat/Wasm.h
Index: llvm/include/llvm/BinaryFormat/Wasm.h
===================================================================
--- llvm/include/llvm/BinaryFormat/Wasm.h
+++ llvm/include/llvm/BinaryFormat/Wasm.h
@@ -264,6 +264,7 @@
WASM_OPCODE_ATOMICS_PREFIX = 0xfe,
WASM_OPCODE_ATOMIC_NOTIFY = 0x00,
WASM_OPCODE_I32_ATOMIC_WAIT = 0x01,
+ WASM_OPCODE_ATOMIC_FENCE = 0x03,
WASM_OPCODE_I32_ATOMIC_STORE = 0x17,
WASM_OPCODE_I32_RMW_CMPXCHG = 0x48,
};
Index: lld/wasm/Writer.cpp
===================================================================
--- lld/wasm/Writer.cpp
+++ lld/wasm/Writer.cpp
@@ -726,6 +726,7 @@
// )
// (else
// ( ... initialize data segments ... )
+ // (atomic.fence)
// (i32.atomic.store align=2 offset=0
// (i32.const $__init_memory_flag)
// (i32.const 2)
@@ -779,6 +780,11 @@
}
}
+ // Fence to commit stores from memory.init instructions
+ writeU8(os, WASM_OPCODE_ATOMICS_PREFIX, "atomics prefix");
+ writeUleb128(os, WASM_OPCODE_ATOMIC_FENCE, "atomic.fence");
+ writeU8(os, 0, "memory ordering");
+
// Set flag to 2 to mark end of initialization
writeI32Const(os, flagAddress, "flag address");
writeI32Const(os, 2, "flag value");
Index: lld/test/wasm/data-segments.ll
===================================================================
--- lld/test/wasm/data-segments.ll
+++ lld/test/wasm/data-segments.ll
@@ -66,7 +66,7 @@
; PASSIVE-NEXT: Body: 0B
; PASSIVE-NEXT: - Index: 1
; PASSIVE-NEXT: Locals: []
-; PASSIVE-NEXT: Body: 41B4D60041004101FE480200044041B4D6004101427FFE0102001A0541800841004114FC08000041940841004190CE00FC08010041A4D6004100410DFC08020041B4D6004102FE17020041B4D600417FFE0002001A0BFC0900FC0901FC09020B
+; PASSIVE-NEXT: Body: 41B4D60041004101FE480200044041B4D6004101427FFE0102001A0541800841004114FC08000041940841004190CE00FC08010041A4D6004100410DFC080200FE030041B4D6004102FE17020041B4D600417FFE0002001A0BFC0900FC0901FC09020B
; PASSIVE-NEXT: - Index: 2
; PASSIVE-NEXT: Locals: []
; PASSIVE-NEXT: Body: 0B
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D67250.219014.patch
Type: text/x-patch
Size: 2198 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190906/8dffea7c/attachment.bin>
More information about the llvm-commits
mailing list