52930fe2b9
Since they are accessed via closures, dynamic calls are handled via dynamic closure call dispatchers and so no non-covariant argument checking remains at this point. TEST=Existing FFI tests on trybots, also added a few dynamic cast tests just in case. Bug: https://github.com/dart-lang/sdk/issues/44343 Cq-Include-Trybots: luci.dart.try:vm-precomp-ffi-qemu-linux-release-arm-try,vm-ffi-android-product-arm64-try,vm-ffi-android-product-arm-try Change-Id: If8daa2d71de4e9391dd35b31b62b67a8e7e69ffe Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/174463 Reviewed-by: Daco Harkes <dacoharkes@google.com> Reviewed-by: Martin Kustermann <kustermann@google.com> Commit-Queue: Tess Strickland <sstrickl@google.com>
91 lines
3.2 KiB
C++
91 lines
3.2 KiB
C++
// Copyright (c) 2017, 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.
|
|
|
|
#ifndef RUNTIME_VM_COMPILER_FRONTEND_PROLOGUE_BUILDER_H_
|
|
#define RUNTIME_VM_COMPILER_FRONTEND_PROLOGUE_BUILDER_H_
|
|
|
|
#if defined(DART_PRECOMPILED_RUNTIME)
|
|
#error "AOT runtime should not use compiler sources (including header files)"
|
|
#endif // defined(DART_PRECOMPILED_RUNTIME)
|
|
|
|
#include "vm/compiler/frontend/base_flow_graph_builder.h"
|
|
|
|
namespace dart {
|
|
namespace kernel {
|
|
|
|
// Responsible for building IR code for prologues of functions.
|
|
//
|
|
// This code handles initialization of local variables which the
|
|
// prologue needs to setup, including initialization of the:
|
|
//
|
|
// * current context variable, from the passed closure object
|
|
// * function_type_arguments variable, from the stack above fp
|
|
// * raw parameter variables, from the stack above fp
|
|
//
|
|
// if needed.
|
|
//
|
|
// Furthermore it performs all necessary checks which could lead into a
|
|
// no-such-method bailout, including check that:
|
|
//
|
|
// * the number of passed positional arguments is correct
|
|
// * the names of passed named arguments are correct
|
|
// * the number of function type arguments is correct
|
|
//
|
|
// if needed.
|
|
//
|
|
// Most of these things are done by interpreting the caller-supplied arguments
|
|
// descriptor.
|
|
class PrologueBuilder : public BaseFlowGraphBuilder {
|
|
public:
|
|
PrologueBuilder(const ParsedFunction* parsed_function,
|
|
intptr_t last_used_id,
|
|
bool compiling_for_osr,
|
|
bool is_inlining)
|
|
: BaseFlowGraphBuilder(parsed_function, last_used_id),
|
|
compiling_for_osr_(compiling_for_osr),
|
|
is_inlining_(is_inlining) {}
|
|
|
|
BlockEntryInstr* BuildPrologue(BlockEntryInstr* entry,
|
|
PrologueInfo* prologue_info);
|
|
|
|
Fragment BuildOptionalParameterHandling(LocalVariable* temp_var);
|
|
|
|
static bool HasEmptyPrologue(const Function& function);
|
|
static bool PrologueSkippableOnUncheckedEntry(const Function& function);
|
|
|
|
intptr_t last_used_block_id() const { return last_used_block_id_; }
|
|
|
|
private:
|
|
Fragment BuildClosureContextHandling();
|
|
|
|
Fragment BuildTypeArgumentsHandling();
|
|
|
|
LocalVariable* ParameterVariable(intptr_t index) {
|
|
return parsed_function_->RawParameterVariable(index);
|
|
}
|
|
|
|
const Instance& DefaultParameterValueAt(intptr_t i) {
|
|
if (parsed_function_->default_parameter_values() != nullptr) {
|
|
return parsed_function_->DefaultParameterValueAt(i);
|
|
}
|
|
// Only invocation dispatchers that have compile-time arguments
|
|
// descriptors lack default parameter values (because their functions only
|
|
// have optional named parameters, all of which are provided in calls.)
|
|
ASSERT(has_saved_args_desc_array());
|
|
return Instance::null_instance();
|
|
}
|
|
|
|
void SortOptionalNamedParametersInto(int* opt_param_position,
|
|
int num_fixed_params,
|
|
int num_params);
|
|
|
|
bool compiling_for_osr_;
|
|
bool is_inlining_;
|
|
};
|
|
|
|
} // namespace kernel
|
|
} // namespace dart
|
|
|
|
#endif // RUNTIME_VM_COMPILER_FRONTEND_PROLOGUE_BUILDER_H_
|