summaryrefslogtreecommitdiff
path: root/deps/v8/test/unittests/assembler/turbo-assembler-arm64-unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/test/unittests/assembler/turbo-assembler-arm64-unittest.cc')
-rw-r--r--deps/v8/test/unittests/assembler/turbo-assembler-arm64-unittest.cc78
1 files changed, 78 insertions, 0 deletions
diff --git a/deps/v8/test/unittests/assembler/turbo-assembler-arm64-unittest.cc b/deps/v8/test/unittests/assembler/turbo-assembler-arm64-unittest.cc
new file mode 100644
index 0000000000..e354fb91d9
--- /dev/null
+++ b/deps/v8/test/unittests/assembler/turbo-assembler-arm64-unittest.cc
@@ -0,0 +1,78 @@
+// Copyright 2018 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "src/arm64/macro-assembler-arm64-inl.h"
+#include "src/macro-assembler.h"
+#include "src/simulator.h"
+#include "test/common/assembler-tester.h"
+#include "test/unittests/test-utils.h"
+#include "testing/gtest-support.h"
+
+namespace v8 {
+namespace internal {
+
+#define __ tasm.
+
+// If we are running on android and the output is not redirected (i.e. ends up
+// in the android log) then we cannot find the error message in the output. This
+// macro just returns the empty string in that case.
+#if defined(ANDROID) && !defined(V8_ANDROID_LOG_STDOUT)
+#define ERROR_MESSAGE(msg) ""
+#else
+#define ERROR_MESSAGE(msg) msg
+#endif
+
+// Test the x64 assembler by compiling some simple functions into
+// a buffer and executing them. These tests do not initialize the
+// V8 library, create a context, or use any V8 objects.
+
+class TurboAssemblerTest : public TestWithIsolate {};
+
+TEST_F(TurboAssemblerTest, TestHardAbort) {
+ size_t allocated;
+ byte* buffer = AllocateAssemblerBuffer(&allocated);
+ TurboAssembler tasm(nullptr, AssemblerOptions{}, buffer,
+ static_cast<int>(allocated), CodeObjectRequired::kNo);
+ __ set_abort_hard(true);
+
+ __ Abort(AbortReason::kNoReason);
+
+ CodeDesc desc;
+ tasm.GetCode(nullptr, &desc);
+ MakeAssemblerBufferExecutable(buffer, allocated);
+ // We need an isolate here to execute in the simulator.
+ auto f = GeneratedCode<void>::FromBuffer(isolate(), buffer);
+
+ ASSERT_DEATH_IF_SUPPORTED({ f.Call(); }, ERROR_MESSAGE("abort: no reason"));
+}
+
+TEST_F(TurboAssemblerTest, TestCheck) {
+ size_t allocated;
+ byte* buffer = AllocateAssemblerBuffer(&allocated);
+ TurboAssembler tasm(nullptr, AssemblerOptions{}, buffer,
+ static_cast<int>(allocated), CodeObjectRequired::kNo);
+ __ set_abort_hard(true);
+
+ // Fail if the first parameter is 17.
+ __ Mov(w1, Immediate(17));
+ __ Cmp(w0, w1); // 1st parameter is in {w0}.
+ __ Check(Condition::ne, AbortReason::kNoReason);
+ __ Ret();
+
+ CodeDesc desc;
+ tasm.GetCode(nullptr, &desc);
+ MakeAssemblerBufferExecutable(buffer, allocated);
+ // We need an isolate here to execute in the simulator.
+ auto f = GeneratedCode<void, int>::FromBuffer(isolate(), buffer);
+
+ f.Call(0);
+ f.Call(18);
+ ASSERT_DEATH_IF_SUPPORTED({ f.Call(17); }, ERROR_MESSAGE("abort: no reason"));
+}
+
+#undef __
+#undef ERROR_MESSAGE
+
+} // namespace internal
+} // namespace v8