// Copyright (c) 2016, 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_DBC)

#include "vm/compiler/assembler/assembler.h"
#include "vm/compiler/backend/flow_graph_compiler.h"
#include "vm/compiler/jit/compiler.h"
#include "vm/cpu.h"
#include "vm/dart_entry.h"
#include "vm/heap/heap.h"
#include "vm/instructions.h"
#include "vm/object_store.h"
#include "vm/runtime_entry.h"
#include "vm/stack_frame.h"
#include "vm/stub_code.h"
#include "vm/tags.h"

#define __ assembler->

namespace dart {

DEFINE_FLAG(bool, inline_alloc, true, "Inline allocation of objects.");
DEFINE_FLAG(bool,
            use_slow_path,
            false,
            "Set to true for debugging & verifying the slow paths.");
DECLARE_FLAG(bool, trace_optimized_ic_calls);

void StubCode::GenerateLazyCompileStub(Assembler* assembler) {
  __ Compile();
}

void StubCode::GenerateCallClosureNoSuchMethodStub(Assembler* assembler) {
  __ NoSuchMethod();
}

// Not executed, but used as a stack marker when calling
// DRT_OptimizeInvokedFunction.
void StubCode::GenerateOptimizeFunctionStub(Assembler* assembler) {
  __ Trap();
}

// Not executed, but used as a sentinel in Simulator::JumpToFrame.
void StubCode::GenerateRunExceptionHandlerStub(Assembler* assembler) {
  __ Trap();
}

void StubCode::GenerateDeoptForRewindStub(Assembler* assembler) {
  __ DeoptRewind();
}

// TODO(vegorov) Don't generate this stub.
void StubCode::GenerateFixCallersTargetStub(Assembler* assembler) {
  __ Trap();
}

// TODO(vegorov) Don't generate these stubs.
void StubCode::GenerateAllocationStubForClass(Assembler* assembler,
                                              const Class& cls) {
  __ Trap();
}

// TODO(vegorov) Don't generate this stub.
void StubCode::GenerateMegamorphicMissStub(Assembler* assembler) {
  __ Trap();
}

// These deoptimization stubs are only used to populate stack frames
// with something meaningful to make sure GC can scan the stack during
// the last phase of deoptimization which materializes objects.
void StubCode::GenerateDeoptimizeLazyFromReturnStub(Assembler* assembler) {
  __ Trap();
}

void StubCode::GenerateDeoptimizeLazyFromThrowStub(Assembler* assembler) {
  __ Trap();
}

void StubCode::GenerateDeoptimizeStub(Assembler* assembler) {
  __ Trap();
}

// TODO(kustermann): Don't generate this stub.
void StubCode::GenerateDefaultTypeTestStub(Assembler* assembler) {
  __ Trap();
}

// TODO(kustermann): Don't generate this stub.
void StubCode::GenerateTopTypeTypeTestStub(Assembler* assembler) {
  __ Trap();
}

// TODO(kustermann): Don't generate this stub.
void StubCode::GenerateTypeRefTypeTestStub(Assembler* assembler) {
  __ Trap();
}

// TODO(kustermann): Don't generate this stub.
void StubCode::GenerateUnreachableTypeTestStub(Assembler* assembler) {
  __ Trap();
}

// TODO(kustermann): Don't generate this stub.
void StubCode::GenerateLazySpecializeTypeTestStub(Assembler* assembler) {
  __ Trap();
}

// TODO(kustermann): Don't generate this stub.
void StubCode::GenerateSlowTypeTestStub(Assembler* assembler) {
  __ Trap();
}

void StubCode::GenerateFrameAwaitingMaterializationStub(Assembler* assembler) {
  __ Trap();
}

void StubCode::GenerateAsynchronousGapMarkerStub(Assembler* assembler) {
  __ Trap();
}

void StubCode::GenerateInterpretCallStub(Assembler* assembler) {
  __ Trap();
}

void StubCode::GenerateInvokeDartCodeFromBytecodeStub(Assembler* assembler) {
  __ Trap();
}

}  // namespace dart

#endif  // defined TARGET_ARCH_DBC
