8f5f6971a9
The differences between the different implementations are very minor, so abstract out the few that remain into Assembler: * Change Load<X>FromPoolOffset to Load<X>FromPoolIndex and do pool offset calculations internally, since all caller sites have the pool index. (Especially important because the pool register is tagged on X64 and ARM and untagged on ARM64, so this abstracts that away.) * Add default for pool register argument on ARM, since ARM64 already had one and X64 doesn't take a pool register argument. Other changes: * Use specific TestTypeABI registers within the helper method that adds caller-side checks instead of passing registers as arguments and document which registers are used for input or output (and when, if they are used conditionally). Cq-Include-Trybots: luci.dart.try:vm-kernel-linux-debug-x64-try,vm-kernel-nnbd-linux-debug-x64-try,vm-kernel-linux-debug-ia32-try,vm-kernel-nnbd-linux-debug-ia32-try,vm-kernel-precomp-linux-debug-simarm_x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-kernel-precomp-nnbd-linux-debug-simarm_x64-try,vm-kernel-precomp-nnbd-linux-debug-x64-try,vm-kernel-linux-release-simarm-try,vm-kernel-linux-release-simarm64-try,vm-kernel-nnbd-linux-release-simarm-try,vm-kernel-nnbd-linux-release-simarm64-try,vm-kernel-precomp-linux-release-simarm-try,vm-kernel-precomp-linux-release-simarm64-try,vm-kernel-precomp-nnbd-linux-release-simarm64-try Change-Id: Ifc7a0eaa6aacf7f629aa9647b028500648af653d Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/167803 Commit-Queue: Tess Strickland <sstrickl@google.com> Reviewed-by: Martin Kustermann <kustermann@google.com>
75 lines
2.8 KiB
C++
75 lines
2.8 KiB
C++
// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
#include "vm/globals.h"
|
|
#if defined(TARGET_ARCH_ARM64)
|
|
|
|
#include "vm/code_patcher.h"
|
|
#include "vm/compiler/assembler/assembler.h"
|
|
#include "vm/dart_entry.h"
|
|
#include "vm/instructions.h"
|
|
#include "vm/native_entry.h"
|
|
#include "vm/native_entry_test.h"
|
|
#include "vm/runtime_entry.h"
|
|
#include "vm/stub_code.h"
|
|
#include "vm/symbols.h"
|
|
#include "vm/unit_test.h"
|
|
|
|
namespace dart {
|
|
|
|
#define __ assembler->
|
|
|
|
ASSEMBLER_TEST_GENERATE(IcDataAccess, assembler) {
|
|
Thread* thread = Thread::Current();
|
|
const String& class_name = String::Handle(Symbols::New(thread, "ownerClass"));
|
|
const Script& script = Script::Handle();
|
|
const Class& owner_class = Class::Handle(Class::New(
|
|
Library::Handle(), class_name, script, TokenPosition::kNoSource));
|
|
const String& function_name =
|
|
String::Handle(Symbols::New(thread, "callerFunction"));
|
|
const Function& function = Function::Handle(Function::New(
|
|
function_name, FunctionLayout::kRegularFunction, true, false, false,
|
|
false, false, owner_class, TokenPosition::kNoSource));
|
|
|
|
const String& target_name = String::Handle(String::New("targetFunction"));
|
|
const intptr_t kTypeArgsLen = 0;
|
|
const intptr_t kNumArgs = 1;
|
|
const Array& args_descriptor = Array::Handle(ArgumentsDescriptor::NewBoxed(
|
|
kTypeArgsLen, kNumArgs, Object::null_array()));
|
|
const ICData& ic_data = ICData::ZoneHandle(ICData::New(
|
|
function, target_name, args_descriptor, 15, 1, ICData::kInstance));
|
|
const Code& stub = StubCode::OneArgCheckInlineCache();
|
|
|
|
// Code accessing pp is generated, but not executed. Uninitialized pp is OK.
|
|
__ set_constant_pool_allowed(true);
|
|
|
|
compiler::ObjectPoolBuilder& op = __ object_pool_builder();
|
|
const intptr_t ic_data_index =
|
|
op.AddObject(ic_data, ObjectPool::Patchability::kPatchable);
|
|
const intptr_t stub_index =
|
|
op.AddObject(stub, ObjectPool::Patchability::kPatchable);
|
|
ASSERT((ic_data_index + 1) == stub_index);
|
|
__ LoadDoubleWordFromPoolIndex(R5, CODE_REG, ic_data_index);
|
|
__ ldr(LR, compiler::FieldAddress(
|
|
CODE_REG,
|
|
Code::entry_point_offset(Code::EntryKind::kMonomorphic)));
|
|
__ blr(LR);
|
|
__ ret();
|
|
}
|
|
|
|
ASSEMBLER_TEST_RUN(IcDataAccess, test) {
|
|
uword end = test->payload_start() + test->code().Size();
|
|
uword return_address = end - Instr::kInstrSize;
|
|
ICData& ic_data = ICData::Handle();
|
|
CodePatcher::GetInstanceCallAt(return_address, test->code(), &ic_data);
|
|
EXPECT_STREQ("targetFunction",
|
|
String::Handle(ic_data.target_name()).ToCString());
|
|
EXPECT_EQ(1, ic_data.NumArgsTested());
|
|
EXPECT_EQ(0, ic_data.NumberOfChecks());
|
|
}
|
|
|
|
} // namespace dart
|
|
|
|
#endif // defined TARGET_ARCH_ARM64
|