9f3c996d34
To allow any-ref parameters, we have to make sure that any-ref stack parameters get seen by the GC. This CL is a first step into that direction. The goal of this CL is to group any-ref parameters at the stack side of the parameters. This means that in the stack frame iterator we do not need information about where anyref parameters are in the stack frame. We only need information about how many anyref parameters there are at the bottom of the stack frame. R=mstarzinger@chromium.org Also-By: mstarzinger@chromium.org Bug: v8:7581 Change-Id: I3ff7cc38fabed5f8e51b5b990190e35f3ea29803 Reviewed-on: https://chromium-review.googlesource.com/c/1371827 Commit-Queue: Andreas Haas <ahaas@chromium.org> Reviewed-by: Michael Starzinger <mstarzinger@chromium.org> Cr-Commit-Position: refs/heads/master@{#58184}
72 lines
2.5 KiB
C++
72 lines
2.5 KiB
C++
// 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 "test/unittests/test-utils.h"
|
|
|
|
#include "src/compiler/linkage.h"
|
|
#include "src/compiler/wasm-compiler.h"
|
|
#include "src/machine-type.h"
|
|
#include "src/signature.h"
|
|
#include "src/wasm/value-type.h"
|
|
|
|
namespace v8 {
|
|
namespace internal {
|
|
namespace wasm {
|
|
|
|
class WasmCallDescriptorTest : public TestWithZone {};
|
|
|
|
TEST_F(WasmCallDescriptorTest, TestAnyRefIsGrouped) {
|
|
constexpr size_t kMaxCount = 30;
|
|
ValueType params[kMaxCount];
|
|
|
|
for (size_t i = 0; i < kMaxCount; i += 2) {
|
|
params[i] = ValueType::kWasmAnyRef;
|
|
CHECK_LT(i + 1, kMaxCount);
|
|
params[i + 1] = ValueType::kWasmI32;
|
|
}
|
|
|
|
for (size_t count = 1; count <= kMaxCount; ++count) {
|
|
FunctionSig sig(/*return_count=*/0, count, params);
|
|
compiler::CallDescriptor* desc =
|
|
compiler::GetWasmCallDescriptor(zone(), &sig);
|
|
|
|
// The WasmInstance is the implicit first parameter.
|
|
CHECK_EQ(count + 1, desc->ParameterCount());
|
|
|
|
bool has_untagged_stack_param = false;
|
|
bool has_tagged_register_param = false;
|
|
int max_tagged_stack_location = std::numeric_limits<int>::min();
|
|
int min_untagged_stack_location = std::numeric_limits<int>::max();
|
|
for (size_t i = 1; i < desc->ParameterCount(); ++i) {
|
|
// InputLocation i + 1, because target is the first input.
|
|
compiler::LinkageLocation location = desc->GetInputLocation(i + 1);
|
|
if (desc->GetParameterType(i).IsTagged()) {
|
|
if (location.IsRegister()) {
|
|
has_tagged_register_param = true;
|
|
} else {
|
|
CHECK(location.IsCallerFrameSlot());
|
|
max_tagged_stack_location =
|
|
std::max(max_tagged_stack_location, location.AsCallerFrameSlot());
|
|
}
|
|
} else { // !isTagged()
|
|
if (location.IsCallerFrameSlot()) {
|
|
has_untagged_stack_param = true;
|
|
min_untagged_stack_location = std::min(min_untagged_stack_location,
|
|
location.AsCallerFrameSlot());
|
|
} else {
|
|
CHECK(location.IsRegister());
|
|
}
|
|
}
|
|
}
|
|
// There should never be a tagged parameter in a register and an untagged
|
|
// parameter on the stack at the same time.
|
|
CHECK_EQ(false, has_tagged_register_param && has_untagged_stack_param);
|
|
CHECK_LT(max_tagged_stack_location, min_untagged_stack_location);
|
|
}
|
|
}
|
|
|
|
} // namespace wasm
|
|
} // namespace internal
|
|
} // namespace v8
|