///|
/// The compiler and its entry/hostcall bridges use one Wasm-internal ABI.
/// Platform C calling conventions remain local to each trampoline emitter.
fn wasm_internal_abi(
  target : NativeTarget,
) -> @vcode.InternalAbi raise @vcode.InternalAbiError {
  match target {
    AArch64 =>
      @vcode.InternalAbi::new(
        0,
        8,
        [1, 2, 3, 4, 5, 6, 7],
        [0, 1, 2, 3, 4, 5, 6, 7],
        [0, 1, 2, 3, 4, 5, 6, 7],
        [0, 1, 2, 3, 4, 5, 6, 7],
      )
    X64 =>
      @vcode.InternalAbi::new(
        7,
        12,
        [6, 2, 1, 8, 9],
        [0, 1, 2, 3, 4, 5, 6, 7],
        [0, 2, 1, 8, 9, 6, 7, 10],
        [0, 1, 2, 3, 4, 5, 6, 7],
      )
  }
}

///|
fn wasm_internal_bridge_plan(
  param_types : ArrayView[@types.ValueType],
  result_types : ArrayView[@types.ValueType],
  target : NativeTarget,
) -> @vcode.InternalCallPlan raise HostcallImportTrampolineError {
  let params : Array[@native.ValueType] = [Ptr64]
  for ty in param_types {
    params.push(wasm_value_type(ty))
  }
  let signature = @native.Signature::new(
    params,
    result_types.map(wasm_value_type),
  )
  wasm_internal_abi(target).call_plan(signature) catch {
    error =>
      raise UnsupportedHostcallImportTrampoline(message=error.to_string())
  }
}