// Copyright (c) 2020, 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_FFI_NATIVE_CALLING_CONVENTION_H_
#define RUNTIME_VM_COMPILER_FFI_NATIVE_CALLING_CONVENTION_H_

#if defined(DART_PRECOMPILED_RUNTIME)
#error "AOT runtime should not use compiler sources (including header files)"
#endif  // defined(DART_PRECOMPILED_RUNTIME)

#include "platform/globals.h"
#include "vm/compiler/ffi/native_location.h"
#include "vm/compiler/ffi/native_type.h"

namespace dart {

namespace compiler {

namespace ffi {

using NativeLocations = ZoneGrowableArray<const NativeLocation*>;

// Calculates native calling convention, is not aware of Dart calling
// convention constraints.
//
// This class is meant to be embedded in a class that is aware of Dart calling
// convention constraints.
class NativeCallingConvention : public ZoneAllocated {
 public:
  static const NativeCallingConvention& FromSignature(
      Zone* zone,
      const NativeFunctionType& signature);

  const NativeLocations& argument_locations() const {
    return argument_locations_;
  }
  const NativeLocation& return_location() const { return return_location_; }

  intptr_t StackTopInBytes() const;

  void PrintTo(BaseTextBuffer* f, bool multi_line = false) const;
  void PrintToMultiLine(BaseTextBuffer* f) const;
  const char* ToCString(Zone* zone, bool multi_line = false) const;
#if !defined(FFI_UNIT_TESTS)
  const char* ToCString(bool multi_line = false) const;
#endif

 private:
  NativeCallingConvention(const NativeLocations& argument_locations,
                          const NativeLocation& return_location)
      : argument_locations_(argument_locations),
        return_location_(return_location) {}

  const NativeLocations& argument_locations_;
  const NativeLocation& return_location_;
};

}  // namespace ffi

}  // namespace compiler

}  // namespace dart

#endif  // RUNTIME_VM_COMPILER_FFI_NATIVE_CALLING_CONVENTION_H_
