| // 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. |
| |
| #ifndef RUNTIME_VM_COMPILER_STUB_CODE_COMPILER_H_ |
| #define RUNTIME_VM_COMPILER_STUB_CODE_COMPILER_H_ |
| |
| #include "vm/allocation.h" |
| #include "vm/compiler/runtime_api.h" |
| #include "vm/constants.h" |
| #include "vm/stub_code_list.h" |
| |
| namespace dart { |
| |
| namespace compiler { |
| |
| // Forward declarations. |
| class Assembler; |
| |
| class StubCodeCompiler : public AllStatic { |
| public: |
| #if !defined(TARGET_ARCH_DBC) && !defined(TARGET_ARCH_IA32) |
| static void GenerateBuildMethodExtractorStub( |
| Assembler* assembler, |
| const Object& closure_allocation_stub, |
| const Object& context_allocation_stub); |
| #endif |
| |
| #if !defined(DART_PRECOMPILED_RUNTIME) |
| #define STUB_CODE_GENERATE(name) \ |
| static void Generate##name##Stub(Assembler* assembler); |
| VM_STUB_CODE_LIST(STUB_CODE_GENERATE) |
| #undef STUB_CODE_GENERATE |
| |
| static void GenerateSharedStub(Assembler* assembler, |
| bool save_fpu_registers, |
| const RuntimeEntry* target, |
| intptr_t self_code_stub_offset_from_thread, |
| bool allow_return); |
| |
| static void GenerateMegamorphicMissStub(Assembler* assembler); |
| static void GenerateAllocationStubForClass(Assembler* assembler, |
| const Class& cls); |
| |
| enum Optimized { |
| kUnoptimized, |
| kOptimized, |
| }; |
| enum CallType { |
| kInstanceCall, |
| kStaticCall, |
| }; |
| enum Exactness { |
| kCheckExactness, |
| kIgnoreExactness, |
| }; |
| static void GenerateNArgsCheckInlineCacheStub( |
| Assembler* assembler, |
| intptr_t num_args, |
| const RuntimeEntry& handle_ic_miss, |
| Token::Kind kind, |
| Optimized optimized, |
| CallType type, |
| Exactness exactness); |
| static void GenerateUsageCounterIncrement(Assembler* assembler, |
| Register temp_reg); |
| static void GenerateOptimizedUsageCounterIncrement(Assembler* assembler); |
| #endif // !defined(DART_PRECOMPILED_RUNTIME) |
| }; |
| |
| } // namespace compiler |
| |
| enum DeoptStubKind { kLazyDeoptFromReturn, kLazyDeoptFromThrow, kEagerDeopt }; |
| |
| // Invocation mode for TypeCheck runtime entry that describes |
| // where we are calling it from. |
| enum TypeCheckMode { |
| // TypeCheck is invoked from LazySpecializeTypeTest stub. |
| // It should replace stub on the type with a specialized version. |
| kTypeCheckFromLazySpecializeStub, |
| |
| // TypeCheck is invoked from the SlowTypeTest stub. |
| // This means that cache can be lazily created (if needed) |
| // and dst_name can be fetched from the pool. |
| kTypeCheckFromSlowStub, |
| |
| // TypeCheck is invoked from normal inline AssertAssignable. |
| // Both cache and dst_name must be already populated. |
| kTypeCheckFromInline |
| }; |
| |
| // Zap value used to indicate unused CODE_REG in deopt. |
| static const uword kZapCodeReg = 0xf1f1f1f1; |
| |
| // Zap value used to indicate unused return address in deopt. |
| static const uword kZapReturnAddress = 0xe1e1e1e1; |
| |
| } // namespace dart |
| |
| #endif // RUNTIME_VM_COMPILER_STUB_CODE_COMPILER_H_ |