// 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_LIB_FFI_H_
#define RUNTIME_LIB_FFI_H_

#if defined(TARGET_ARCH_DBC)

#include <platform/globals.h>

#include "runtime/vm/class_id.h"
#include "runtime/vm/compiler/backend/locations.h"
#include "runtime/vm/compiler/ffi.h"
#include "runtime/vm/object.h"
#include "runtime/vm/raw_object.h"

namespace dart {

// This structure contains all data required for an ffi call.
// It consists of the function address, all calling convention argument
// register values, argument fpu register values, number of stack arguments,
// and stack argument values. The generic DBC trampoline reads its arguments
// from this structure.
//
// Moreover, the DBC trampoline also stores the integer and floating point
// result registers in the first two slots when returning.
class FfiMarshalledArguments : public ValueObject {
 public:
  explicit FfiMarshalledArguments(uint64_t* data) : data_(data) {}

  // Copies ffi trampoline arguments (including target address) from stack into
  // a signature agnostic data structure (FfiMarshalledArguments) using the
  // signature and the stack address of the first argument. (Note that this
  // only works on DBC as the stack grows upwards in DBC.)
  static uint64_t* New(const compiler::ffi::FfiSignatureDescriptor& signature,
                       const uint64_t* arg_values);

  uint64_t IntResult() const { return data_[kOffsetIntResult]; }
  uint64_t DoubleResult() const { return data_[kOffsetDoubleResult]; }

#if defined(DEBUG)
  void Print() const;
#endif

 private:
  void SetFunctionAddress(uint64_t value) const;
  void SetRegister(::dart::host::Register reg, uint64_t value) const;
  void SetFpuRegister(::dart::host::FpuRegister reg, uint64_t value) const;
  void SetNumStackSlots(intptr_t num_args) const;
  intptr_t GetNumStackSlots() const;
  void SetStackSlotValue(intptr_t index, uint64_t value) const;

  // TODO(36809): Replace this with uword. On 32 bit architecture,
  // this should be 32 bits, as the DBC stack itself is 32 bits.
  uint64_t* data_;

  static const intptr_t kOffsetFunctionAddress = 0;
  static const intptr_t kOffsetRegisters = 1;
  static const intptr_t kOffsetFpuRegisters =
      kOffsetRegisters + ::dart::host::CallingConventions::kNumArgRegs;
  static const intptr_t kOffsetNumStackSlots =
      kOffsetFpuRegisters + ::dart::host::CallingConventions::kNumFpuArgRegs;
  static const intptr_t kOffsetStackSlotValues = kOffsetNumStackSlots + 1;

  static const intptr_t kOffsetIntResult = 0;
  static const intptr_t kOffsetDoubleResult = 1;
};

}  // namespace dart

#endif  // defined(TARGET_ARCH_DBC)

#endif  // RUNTIME_LIB_FFI_H_
