[wasm] Add disassembly for Atomic ops in wasm-text
Fix disassembly of atomic operations for the inspector. BUG=v8:6842,v8:6532 Change-Id: I3701b55c28b10561d1726e2c0b9fe2e1b2c76b8e Reviewed-on: https://chromium-review.googlesource.com/703468 Commit-Queue: Brad Nelson <bradnelson@chromium.org> Reviewed-by: Brad Nelson <bradnelson@chromium.org> Reviewed-by: Ben Smith <binji@chromium.org> Cr-Commit-Position: refs/heads/master@{#48324}
This commit is contained in:
parent
da13b8971d
commit
3dcb40c9b3
@ -189,6 +189,12 @@ class V8_EXPORT_PRIVATE BytecodeIterator : public NON_EXPORTED_BASE(Decoder) {
|
||||
}
|
||||
|
||||
bool has_next() { return pc_ < end_; }
|
||||
|
||||
WasmOpcode prefixed_opcode() {
|
||||
byte prefix = read_u8<false>(pc_, "expected prefix");
|
||||
byte index = read_u8<false>(pc_ + 1, "expected index");
|
||||
return static_cast<WasmOpcode>(prefix << 8 | index);
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace wasm
|
||||
|
@ -190,6 +190,21 @@ void PrintWasmText(const WasmModule* module, const ModuleWireBytes& wire_bytes,
|
||||
case kExprSelect:
|
||||
os << WasmOpcodes::OpcodeName(opcode);
|
||||
break;
|
||||
case kAtomicPrefix: {
|
||||
WasmOpcode atomic_opcode = i.prefixed_opcode();
|
||||
switch (atomic_opcode) {
|
||||
FOREACH_ATOMIC_OPCODE(CASE_OPCODE) {
|
||||
MemoryAccessOperand<false> operand(&i, i.pc(), kMaxUInt32);
|
||||
os << WasmOpcodes::OpcodeName(atomic_opcode)
|
||||
<< " offset=" << operand.offset
|
||||
<< " align=" << (1ULL << operand.alignment);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
UNREACHABLE();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// This group is just printed by their internal opcode name, as they
|
||||
// should never be shown to end-users.
|
||||
@ -200,7 +215,6 @@ void PrintWasmText(const WasmModule* module, const ModuleWireBytes& wire_bytes,
|
||||
FOREACH_SIMD_1_OPERAND_OPCODE(CASE_OPCODE)
|
||||
FOREACH_SIMD_MASK_OPERAND_OPCODE(CASE_OPCODE)
|
||||
FOREACH_SIMD_MEM_OPCODE(CASE_OPCODE)
|
||||
FOREACH_ATOMIC_OPCODE(CASE_OPCODE)
|
||||
os << WasmOpcodes::OpcodeName(opcode);
|
||||
break;
|
||||
#undef CASE_OPCODE
|
||||
|
@ -12,20 +12,6 @@ namespace v8 {
|
||||
namespace internal {
|
||||
namespace wasm {
|
||||
|
||||
#define WASM_ATOMICS_OP(op) kAtomicPrefix, static_cast<byte>(op)
|
||||
#define WASM_ATOMICS_BINOP(op, x, y, representation) \
|
||||
x, y, WASM_ATOMICS_OP(op), \
|
||||
static_cast<byte>(ElementSizeLog2Of(representation)), ZERO_OFFSET
|
||||
#define WASM_ATOMICS_TERNARY_OP(op, x, y, z, representation) \
|
||||
x, y, z, WASM_ATOMICS_OP(op), \
|
||||
static_cast<byte>(ElementSizeLog2Of(representation)), ZERO_OFFSET
|
||||
#define WASM_ATOMICS_LOAD_OP(op, x, representation) \
|
||||
x, WASM_ATOMICS_OP(op), \
|
||||
static_cast<byte>(ElementSizeLog2Of(representation)), ZERO_OFFSET
|
||||
#define WASM_ATOMICS_STORE_OP(op, x, y, representation) \
|
||||
x, y, WASM_ATOMICS_OP(op), \
|
||||
static_cast<byte>(ElementSizeLog2Of(representation)), ZERO_OFFSET
|
||||
|
||||
typedef uint32_t (*Uint32BinOp)(uint32_t, uint32_t);
|
||||
typedef uint16_t (*Uint16BinOp)(uint16_t, uint16_t);
|
||||
typedef uint8_t (*Uint8BinOp)(uint8_t, uint8_t);
|
||||
@ -311,11 +297,6 @@ TEST(I32AtomicStoreLoad8U) {
|
||||
CHECK_EQ(*i, r.builder().ReadMemory(&memory[0]));
|
||||
}
|
||||
}
|
||||
#undef WASM_ATOMICS_OP
|
||||
#undef WASM_ATOMICS_BINOP
|
||||
#undef WASM_ATOMICS_TERNARY_OP
|
||||
#undef WASM_ATOMICS_LOAD_OP
|
||||
#undef WASM_ATOMICS_STORE_OP
|
||||
|
||||
} // namespace wasm
|
||||
} // namespace internal
|
||||
|
@ -18,6 +18,7 @@
|
||||
#include "src/wasm/wasm-opcodes.h"
|
||||
|
||||
#include "test/cctest/cctest.h"
|
||||
#include "test/common/wasm/flag-utils.h"
|
||||
#include "test/common/wasm/test-signatures.h"
|
||||
#include "test/common/wasm/wasm-macro-gen.h"
|
||||
#include "test/common/wasm/wasm-module-runner.h"
|
||||
@ -1185,6 +1186,43 @@ TEST(Run_WasmModule_Buffer_Externalized_Detach) {
|
||||
Cleanup();
|
||||
}
|
||||
|
||||
TEST(AtomicOpDisassembly) {
|
||||
{
|
||||
EXPERIMENTAL_FLAG_SCOPE(threads);
|
||||
TestSignatures sigs;
|
||||
Isolate* isolate = CcTest::InitIsolateOnce();
|
||||
v8::internal::AccountingAllocator allocator;
|
||||
Zone zone(&allocator, ZONE_NAME);
|
||||
|
||||
WasmModuleBuilder* builder = new (&zone) WasmModuleBuilder(&zone);
|
||||
builder->SetHasSharedMemory();
|
||||
builder->SetMaxMemorySize(16);
|
||||
WasmFunctionBuilder* f = builder->AddFunction(sigs.i_i());
|
||||
ExportAsMain(f);
|
||||
byte code[] = {
|
||||
WASM_ATOMICS_STORE_OP(kExprI32AtomicStore, WASM_ZERO, WASM_GET_LOCAL(0),
|
||||
MachineRepresentation::kWord32),
|
||||
WASM_ATOMICS_LOAD_OP(kExprI32AtomicLoad, WASM_ZERO,
|
||||
MachineRepresentation::kWord32)};
|
||||
EMIT_CODE_WITH_END(f, code);
|
||||
|
||||
HandleScope scope(isolate);
|
||||
ZoneBuffer buffer(&zone);
|
||||
builder->WriteTo(buffer);
|
||||
testing::SetupIsolateForWasmModule(isolate);
|
||||
|
||||
ErrorThrower thrower(isolate, "Test");
|
||||
MaybeHandle<WasmModuleObject> module_object = SyncCompile(
|
||||
isolate, &thrower, ModuleWireBytes(buffer.begin(), buffer.end()));
|
||||
|
||||
MaybeHandle<WasmCompiledModule> compiled_module(
|
||||
module_object.ToHandleChecked()->compiled_module(), isolate);
|
||||
CHECK(!compiled_module.is_null());
|
||||
compiled_module.ToHandleChecked()->DisassembleFunction(0);
|
||||
}
|
||||
Cleanup();
|
||||
}
|
||||
|
||||
#undef EMIT_CODE_WITH_END
|
||||
|
||||
} // namespace wasm
|
||||
|
@ -583,4 +583,21 @@ inline WasmOpcode LoadStoreOpcodeOf(MachineType type, bool store) {
|
||||
#define WASM_BR_TABLEV(val, key, count, ...) \
|
||||
val, key, kExprBrTable, U32V_1(count), __VA_ARGS__
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Atomic Operations.
|
||||
//------------------------------------------------------------------------------
|
||||
#define WASM_ATOMICS_OP(op) kAtomicPrefix, static_cast<byte>(op)
|
||||
#define WASM_ATOMICS_BINOP(op, x, y, representation) \
|
||||
x, y, WASM_ATOMICS_OP(op), \
|
||||
static_cast<byte>(ElementSizeLog2Of(representation)), ZERO_OFFSET
|
||||
#define WASM_ATOMICS_TERNARY_OP(op, x, y, z, representation) \
|
||||
x, y, z, WASM_ATOMICS_OP(op), \
|
||||
static_cast<byte>(ElementSizeLog2Of(representation)), ZERO_OFFSET
|
||||
#define WASM_ATOMICS_LOAD_OP(op, x, representation) \
|
||||
x, WASM_ATOMICS_OP(op), \
|
||||
static_cast<byte>(ElementSizeLog2Of(representation)), ZERO_OFFSET
|
||||
#define WASM_ATOMICS_STORE_OP(op, x, y, representation) \
|
||||
x, y, WASM_ATOMICS_OP(op), \
|
||||
static_cast<byte>(ElementSizeLog2Of(representation)), ZERO_OFFSET
|
||||
|
||||
#endif // V8_WASM_MACRO_GEN_H_
|
||||
|
Loading…
Reference in New Issue
Block a user