fd959b824e
To make implicit getters/setters frameless in common cases we use graph intrinsics. We do this for boxed as well as unboxed fields. We do this only for simple cases (e.g. not if field guards or possible boxing are involved). It also removes the hand-written assembly intrinsics for the getters, which avoids bugs if boxing-state of field is not the same as boxing-state of setter/getter. Issue https://github.com/dart-lang/sdk/issues/40876 Change-Id: Id3bd7842ead0278fee61d4a21c8661ce18dbccee Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/155900 Commit-Queue: Martin Kustermann <kustermann@google.com> Reviewed-by: Alexander Markov <alexmarkov@google.com> Reviewed-by: Aske Simon Christensen <askesc@google.com> Reviewed-by: Tess Strickland <sstrickl@google.com>
60 lines
1.7 KiB
C++
60 lines
1.7 KiB
C++
// Copyright (c) 2019, 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.
|
|
// Class for intrinsifying functions.
|
|
|
|
#ifndef RUNTIME_VM_COMPILER_GRAPH_INTRINSIFIER_H_
|
|
#define RUNTIME_VM_COMPILER_GRAPH_INTRINSIFIER_H_
|
|
|
|
#if defined(DART_PRECOMPILED_RUNTIME)
|
|
#error "AOT runtime should not use compiler sources (including header files)"
|
|
#endif // defined(DART_PRECOMPILED_RUNTIME)
|
|
|
|
#include "vm/allocation.h"
|
|
#include "vm/compiler/recognized_methods_list.h"
|
|
|
|
namespace dart {
|
|
|
|
// Forward declarations.
|
|
class FlowGraphCompiler;
|
|
class ParsedFunction;
|
|
class FlowGraph;
|
|
|
|
namespace compiler {
|
|
class Assembler;
|
|
class Label;
|
|
|
|
class GraphIntrinsifier : public AllStatic {
|
|
public:
|
|
static intptr_t ParameterSlotFromSp();
|
|
|
|
static bool GraphIntrinsify(const ParsedFunction& parsed_function,
|
|
FlowGraphCompiler* compiler);
|
|
|
|
static void IntrinsicCallPrologue(Assembler* assembler);
|
|
static void IntrinsicCallEpilogue(Assembler* assembler);
|
|
|
|
private:
|
|
#define DECLARE_FUNCTION(class_name, function_name, enum_name, fp) \
|
|
static void enum_name(Assembler* assembler, Label* normal_ir_body);
|
|
|
|
GRAPH_INTRINSICS_LIST(DECLARE_FUNCTION)
|
|
|
|
#undef DECLARE_FUNCTION
|
|
|
|
#define DECLARE_FUNCTION(class_name, function_name, enum_name, fp) \
|
|
static bool Build_##enum_name(FlowGraph* flow_graph);
|
|
|
|
GRAPH_INTRINSICS_LIST(DECLARE_FUNCTION)
|
|
|
|
#undef DECLARE_FUNCTION
|
|
|
|
static bool Build_ImplicitGetter(FlowGraph* flow_graph);
|
|
static bool Build_ImplicitSetter(FlowGraph* flow_graph);
|
|
};
|
|
|
|
} // namespace compiler
|
|
} // namespace dart
|
|
|
|
#endif // RUNTIME_VM_COMPILER_GRAPH_INTRINSIFIER_H_
|