blob: 1ec5f87870cd64f7f605fe5bcef3f4d8d23efb49 [file] [log] [blame]
/* go-ffi.c -- libffi support functions.
Copyright 2009 The Go Authors. All rights reserved.
Use of this source code is governed by a BSD-style
license that can be found in the LICENSE file. */
#include <stdlib.h>
#include "runtime.h"
#ifdef USE_LIBFFI
#include "ffi.h"
/* The functions in this file are called by the Go runtime code to get
the libffi type values. */
ffi_type *go_ffi_type_pointer(void) __attribute__ ((no_split_stack));
ffi_type *go_ffi_type_pointer(void) __asm__ ("runtime.ffi__type__pointer");
ffi_type *go_ffi_type_sint8(void) __attribute__ ((no_split_stack));
ffi_type *go_ffi_type_sint8(void) __asm__ ("runtime.ffi__type__sint8");
ffi_type *go_ffi_type_sint16(void) __attribute__ ((no_split_stack));
ffi_type *go_ffi_type_sint16(void) __asm__ ("runtime.ffi__type__sint16");
ffi_type *go_ffi_type_sint32(void) __attribute__ ((no_split_stack));
ffi_type *go_ffi_type_sint32(void) __asm__ ("runtime.ffi__type__sint32");
ffi_type *go_ffi_type_sint64(void) __attribute__ ((no_split_stack));
ffi_type *go_ffi_type_sint64(void) __asm__ ("runtime.ffi__type__sint64");
ffi_type *go_ffi_type_uint8(void) __attribute__ ((no_split_stack));
ffi_type *go_ffi_type_uint8(void) __asm__ ("runtime.ffi__type__uint8");
ffi_type *go_ffi_type_uint16(void) __attribute__ ((no_split_stack));
ffi_type *go_ffi_type_uint16(void) __asm__ ("runtime.ffi__type__uint16");
ffi_type *go_ffi_type_uint32(void) __attribute__ ((no_split_stack));
ffi_type *go_ffi_type_uint32(void) __asm__ ("runtime.ffi__type__uint32");
ffi_type *go_ffi_type_uint64(void) __attribute__ ((no_split_stack));
ffi_type *go_ffi_type_uint64(void) __asm__ ("runtime.ffi__type__uint64");
ffi_type *go_ffi_type_float(void) __attribute__ ((no_split_stack));
ffi_type *go_ffi_type_float(void) __asm__ ("runtime.ffi__type__float");
ffi_type *go_ffi_type_double(void) __attribute__ ((no_split_stack));
ffi_type *go_ffi_type_double(void) __asm__ ("runtime.ffi__type__double");
ffi_type *go_ffi_type_complex_float(void) __attribute__ ((no_split_stack));
ffi_type *go_ffi_type_complex_float(void) __asm__ ("runtime.ffi__type__complex__float");
ffi_type *go_ffi_type_complex_double(void) __attribute__ ((no_split_stack));
ffi_type *go_ffi_type_complex_double(void) __asm__ ("runtime.ffi__type__complex__double");
ffi_type *go_ffi_type_void(void) __attribute__ ((no_split_stack));
ffi_type *go_ffi_type_void(void) __asm__ ("runtime.ffi__type__void");
_Bool go_ffi_supports_complex(void) __attribute__ ((no_split_stack));
_Bool go_ffi_supports_complex(void) __asm__ ("runtime.ffi__supports__complex");
ffi_type *
go_ffi_type_pointer(void)
{
return &ffi_type_pointer;
}
ffi_type *
go_ffi_type_sint8(void)
{
return &ffi_type_sint8;
}
ffi_type *
go_ffi_type_sint16(void)
{
return &ffi_type_sint16;
}
ffi_type *
go_ffi_type_sint32(void)
{
return &ffi_type_sint32;
}
ffi_type *
go_ffi_type_sint64(void)
{
return &ffi_type_sint64;
}
ffi_type *
go_ffi_type_uint8(void)
{
return &ffi_type_uint8;
}
ffi_type *
go_ffi_type_uint16(void)
{
return &ffi_type_uint16;
}
ffi_type *
go_ffi_type_uint32(void)
{
return &ffi_type_uint32;
}
ffi_type *
go_ffi_type_uint64(void)
{
return &ffi_type_uint64;
}
ffi_type *
go_ffi_type_float(void)
{
return &ffi_type_float;
}
ffi_type *
go_ffi_type_double(void)
{
return &ffi_type_double;
}
_Bool
go_ffi_supports_complex(void)
{
#ifdef FFI_TARGET_HAS_COMPLEX_TYPE
return true;
#else
return false;
#endif
}
ffi_type *
go_ffi_type_complex_float(void)
{
#ifdef FFI_TARGET_HAS_COMPLEX_TYPE
return &ffi_type_complex_float;
#else
abort();
#endif
}
ffi_type *
go_ffi_type_complex_double(void)
{
#ifdef FFI_TARGET_HAS_COMPLEX_TYPE
return &ffi_type_complex_double;
#else
abort();
#endif
}
ffi_type *
go_ffi_type_void(void)
{
return &ffi_type_void;
}
#endif /* defined(USE_LIBFFI) */