// 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. // The C++ style guide recommends using instead of . However, the // former isn't available in V8. #include // NOLINT(build/c++11) #include #include "src/codegen/arm/register-arm.h" #include "test/cctest/cctest.h" #include "test/cctest/disasm-regex-helper.h" namespace v8 { namespace internal { namespace { // Poison register. const int kPRegCode = kSpeculationPoisonRegister.code(); const std::string kPReg = // NOLINT(runtime/string) "r" + std::to_string(kPRegCode); } // namespace TEST(DisasmPoisonMonomorphicLoad) { #ifdef ENABLE_DISASSEMBLER if (i::FLAG_always_opt || !i::FLAG_opt) return; // TODO(9684): Re-enable for TurboProp if necessary. if (i::FLAG_turboprop) return; i::FLAG_allow_natives_syntax = true; i::FLAG_untrusted_code_mitigations = true; CcTest::InitializeVM(); v8::HandleScope scope(CcTest::isolate()); CompileRun( "function mono(o) { return o.x; };" "%PrepareFunctionForOptimization(mono);" "mono({ x : 1 });" "mono({ x : 1 });" "%OptimizeFunctionOnNextCall(mono);" "mono({ x : 1 });"); // Matches that the property access sequence is instrumented with // poisoning. std::vector patterns_array = { "ldr <>, \\[<>, #-1\\]", // load map "ldr <>, \\[pc, #", // load expected map "cmp <>, <>", // compare maps "bne", // deopt if different "eorne " + kPReg + ", " + kPReg + ", " + kPReg, // update the poison "csdb", // spec. barrier "ldr <>, \\[<>, #\\+[0-9]+\\]", // load the field "and <>, <>, " + kPReg, // apply the poison }; CHECK(CheckDisassemblyRegexPatterns("mono", patterns_array)); #endif // ENABLE_DISASSEMBLER } TEST(DisasmPoisonPolymorphicLoad) { #ifdef ENABLE_DISASSEMBLER if (i::FLAG_always_opt || !i::FLAG_opt) return; // TODO(9684): Re-enable for TurboProp if necessary. if (i::FLAG_turboprop) return; i::FLAG_allow_natives_syntax = true; i::FLAG_untrusted_code_mitigations = true; CcTest::InitializeVM(); v8::HandleScope scope(CcTest::isolate()); CompileRun( "function poly(o) { return o.x + 1; };" "let o1 = { x : 1 };" "let o2 = { y : 1 };" "o2.x = 2;" "%PrepareFunctionForOptimization(poly);" "poly(o2);" "poly(o1);" "poly(o2);" "%OptimizeFunctionOnNextCall(poly);" "poly(o1);"); // Matches that the property access sequence is instrumented with // poisoning. std::vector patterns_array = { "ldr <>, \\[<>, #-1\\]", // load map "ldr <>, \\[pc", // load map const #1 "cmp <>, <>", // compare maps "beq", // ? go to the load "eoreq " + kPReg + ", " + kPReg + ", " + kPReg, // update the poison "csdb", // spec. barrier "ldr <>, \\[<>, #-1\\]", // load map "ldr <>, \\[pc", // load map const #2 "cmp <>, <>", // compare maps "bne", // deopt if different "eorne " + kPReg + ", " + kPReg + ", " + kPReg, // update the poison "csdb", // spec. barrier "ldr <>, \\[<>, #\\+[0-9]+\\]", // load the field "and <>, <>, " + kPReg, // apply the poison "mov r[0-9]+, <>, asr #1", // untag "b", // goto merge point // Lcase1: "eorne " + kPReg + ", " + kPReg + ", " + kPReg, // update the poison "csdb", // spec. barrier "ldr <>, \\[<>, #\\+[0-9]+\\]", // load backing store "and <>, <>, " + kPReg, // apply the poison "ldr <>, \\[<>, #\\+[0-9]+\\]", // load the property "and <>, <>, " + kPReg, // apply the poison // Ldone: }; CHECK(CheckDisassemblyRegexPatterns("poly", patterns_array)); #endif // ENABLE_DISASSEMBLER } TEST(DisasmPoisonMonomorphicLoadFloat64) { #ifdef ENABLE_DISASSEMBLER if (i::FLAG_always_opt || !i::FLAG_opt) return; i::FLAG_allow_natives_syntax = true; i::FLAG_untrusted_code_mitigations = true; CcTest::InitializeVM(); v8::HandleScope scope(CcTest::isolate()); CompileRun( "function mono(o) { return o.x; }" "%PrepareFunctionForOptimization(mono);" "mono({ x : 1.1 });" "mono({ x : 1.1 });" "%OptimizeFunctionOnNextCall(mono);" "mono({ x : 1.1 });"); // Matches that the property access sequence is instrumented with // poisoning. std::vector patterns_array = { "ldr <>, \\[<>, #-1\\]", // load map "ldr <>, \\[pc, #", // load expected map "cmp <>, <>", // compare maps "bne", // deopt if different "eorne " + kPReg + ", " + kPReg + ", " + kPReg, // update the poison "csdb", // spec. barrier "ldr <>, \\[<>, #\\+[0-9]+\\]", // load the field "and <>, <>, " + kPReg, // apply the poison "mov <>, #[0-9]+", // addr. calculation "add ip, <>, <>", // addr. calculation "and ip, ip, " + kPReg, // apply the poison "vldr d[0-9]+, \\[ip", // load Float64 }; CHECK(CheckDisassemblyRegexPatterns("mono", patterns_array)); #endif // ENABLE_DISASSEMBLER } } // namespace internal } // namespace v8