Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(552)

Unified Diff: test/cctest/wasm/wasm-run-utils.h

Issue 2562393002: [wasm] Introduce the TrapIf and TrapUnless operators to generate trap code. (Closed)
Patch Set: Rename UseSourcePosition to IsSourcePositionUsed Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « test/cctest/wasm/test-run-wasm-64.cc ('k') | test/mjsunit/wasm/trap-location-with-trap-if.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: test/cctest/wasm/wasm-run-utils.h
diff --git a/test/cctest/wasm/wasm-run-utils.h b/test/cctest/wasm/wasm-run-utils.h
index 49a283dff5047f56b68e506c514479d7d0aaaeaa..ed8e893a7fcf7921340766d8ac0352e35aa704a3 100644
--- a/test/cctest/wasm/wasm-run-utils.h
+++ b/test/cctest/wasm/wasm-run-utils.h
@@ -5,6 +5,7 @@
#ifndef WASM_RUN_UTILS_H
#define WASM_RUN_UTILS_H
+#include <setjmp.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
@@ -22,6 +23,7 @@
#include "src/compiler/wasm-compiler.h"
#include "src/compiler/zone-stats.h"
#include "src/wasm/ast-decoder.h"
+#include "src/wasm/wasm-external-refs.h"
#include "src/wasm/wasm-interpreter.h"
#include "src/wasm/wasm-js.h"
#include "src/wasm/wasm-macro-gen.h"
@@ -611,6 +613,12 @@ class WasmFunctionCompiler : public HandleAndZoneScope,
}
};
+template <typename ReturnType>
+union ReturnTypeUnion {
+ ReturnType value;
+ uint64_t trap;
+};
+
// A helper class to build graphs from Wasm bytecode, generate machine
// code, and run that code.
template <typename ReturnType>
@@ -723,20 +731,39 @@ class WasmRunner {
}
}
+ static jmp_buf jump_buffer;
+ static int jump_value;
+ static ReturnTypeUnion<ReturnType> return_value;
+
+ template <typename P0, typename P1, typename P2, typename P3>
+ void DoCall(P0 p0, P1 p1, P2 p2, P3 p3) {
+ auto trap_callback = []() {
+ WasmRunner<ReturnType>::return_value.trap = 0xdeadbeefdeadbeef;
+ longjmp(WasmRunner<ReturnType>::jump_buffer, 1);
+ };
+ set_trap_callback_for_testing(trap_callback);
+ CodeRunner<int32_t> runner(CcTest::InitIsolateOnce(),
+ wrapper_.GetWrapperCode(), wrapper_.signature());
+
+ int32_t result = runner.Call<void*, void*, void*, void*, void*>(
+ &p0, &p1, &p2, &p3, &WasmRunner<ReturnType>::return_value.value);
+ CHECK_EQ(WASM_WRAPPER_RETURN_VALUE, result);
+ }
+
template <typename P0, typename P1, typename P2, typename P3>
ReturnType Call(P0 p0, P1 p1, P2 p2, P3 p3) {
if (interpret()) {
WasmVal args[] = {WasmVal(p0), WasmVal(p1), WasmVal(p2), WasmVal(p3)};
return CallInterpreter(ArrayVector(args));
} else {
- CodeRunner<int32_t> runner(CcTest::InitIsolateOnce(),
- wrapper_.GetWrapperCode(),
- wrapper_.signature());
- ReturnType return_value;
- int32_t result = runner.Call<void*, void*, void*, void*, void*>(
- &p0, &p1, &p2, &p3, &return_value);
- CHECK_EQ(WASM_WRAPPER_RETURN_VALUE, result);
- return return_value;
+ // Use setjmp/longjmp to deal with traps in WebAssembly code.
+ WasmRunner<ReturnType>::jump_value =
+ setjmp(WasmRunner<ReturnType>::jump_buffer);
+ if (!WasmRunner<ReturnType>::jump_value) {
+ DoCall(p0, p1, p2, p3);
+ }
+ set_trap_callback_for_testing(nullptr);
+ return WasmRunner<ReturnType>::return_value.value;
}
}
@@ -789,6 +816,13 @@ class WasmRunner {
}
};
+template <typename ReturnType>
+jmp_buf WasmRunner<ReturnType>::jump_buffer;
+template <typename ReturnType>
+int WasmRunner<ReturnType>::jump_value;
+template <typename ReturnType>
+ReturnTypeUnion<ReturnType> WasmRunner<ReturnType>::return_value;
+
// A macro to define tests that run in different engine configurations.
#define WASM_EXEC_TEST(name) \
void RunWasm_##name(WasmExecutionMode execution_mode); \
@@ -796,6 +830,19 @@ class WasmRunner {
TEST(RunWasmInterpreted_##name) { RunWasm_##name(kExecuteInterpreted); } \
void RunWasm_##name(WasmExecutionMode execution_mode)
+#define WASM_EXEC_TEST_WITH_TRAP(name) \
+ void RunWasm_##name(WasmExecutionMode execution_mode); \
+ TEST(RunWasmCompiled_##name) { RunWasm_##name(kExecuteCompiled); } \
+ void RunWasm_##name(WasmExecutionMode execution_mode); \
+ TEST(RunWasmCompiledWithTrapIf_##name) { \
+ bool trap_if = FLAG_wasm_trap_if; \
+ FLAG_wasm_trap_if = true; \
+ RunWasm_##name(kExecuteCompiled); \
+ FLAG_wasm_trap_if = trap_if; \
+ } \
+ TEST(RunWasmInterpreted_##name) { RunWasm_##name(kExecuteInterpreted); } \
+ void RunWasm_##name(WasmExecutionMode execution_mode)
+
#define WASM_EXEC_COMPILED_TEST(name) \
void RunWasm_##name(WasmExecutionMode execution_mode); \
TEST(RunWasmCompiled_##name) { RunWasm_##name(kExecuteCompiled); } \
« no previous file with comments | « test/cctest/wasm/test-run-wasm-64.cc ('k') | test/mjsunit/wasm/trap-location-with-trap-if.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698