2016-11-18 01:15:38 +01:00
|
|
|
/* go-ffi.c -- libffi support functions.
|
2014-07-19 23:36:26 +02:00
|
|
|
|
|
|
|
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"
|
|
|
|
|
2016-11-18 01:15:38 +01:00
|
|
|
/* 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)
|
2014-07-19 23:36:26 +02:00
|
|
|
{
|
2016-11-18 01:15:38 +01:00
|
|
|
return &ffi_type_pointer;
|
2014-07-19 23:36:26 +02:00
|
|
|
}
|
|
|
|
|
2016-11-18 01:15:38 +01:00
|
|
|
ffi_type *
|
|
|
|
go_ffi_type_sint8(void)
|
2014-07-19 23:36:26 +02:00
|
|
|
{
|
2016-11-18 01:15:38 +01:00
|
|
|
return &ffi_type_sint8;
|
2014-07-19 23:36:26 +02:00
|
|
|
}
|
|
|
|
|
2016-11-18 01:15:38 +01:00
|
|
|
ffi_type *
|
|
|
|
go_ffi_type_sint16(void)
|
2014-07-19 23:36:26 +02:00
|
|
|
{
|
2016-11-18 01:15:38 +01:00
|
|
|
return &ffi_type_sint16;
|
2014-07-19 23:36:26 +02:00
|
|
|
}
|
|
|
|
|
2016-11-18 01:15:38 +01:00
|
|
|
ffi_type *
|
|
|
|
go_ffi_type_sint32(void)
|
2014-07-19 23:36:26 +02:00
|
|
|
{
|
2016-11-18 01:15:38 +01:00
|
|
|
return &ffi_type_sint32;
|
2014-07-19 23:36:26 +02:00
|
|
|
}
|
|
|
|
|
2016-11-18 01:15:38 +01:00
|
|
|
ffi_type *
|
|
|
|
go_ffi_type_sint64(void)
|
2014-07-19 23:36:26 +02:00
|
|
|
{
|
2016-11-18 01:15:38 +01:00
|
|
|
return &ffi_type_sint64;
|
2014-07-19 23:36:26 +02:00
|
|
|
}
|
|
|
|
|
2016-11-18 01:15:38 +01:00
|
|
|
ffi_type *
|
|
|
|
go_ffi_type_uint8(void)
|
|
|
|
{
|
|
|
|
return &ffi_type_uint8;
|
|
|
|
}
|
2015-01-16 23:58:53 +01:00
|
|
|
|
2016-11-18 01:15:38 +01:00
|
|
|
ffi_type *
|
|
|
|
go_ffi_type_uint16(void)
|
2014-07-19 23:36:26 +02:00
|
|
|
{
|
2016-11-18 01:15:38 +01:00
|
|
|
return &ffi_type_uint16;
|
|
|
|
}
|
2014-07-19 23:36:26 +02:00
|
|
|
|
2016-11-18 01:15:38 +01:00
|
|
|
ffi_type *
|
|
|
|
go_ffi_type_uint32(void)
|
|
|
|
{
|
|
|
|
return &ffi_type_uint32;
|
2014-07-19 23:36:26 +02:00
|
|
|
}
|
|
|
|
|
2016-11-18 01:15:38 +01:00
|
|
|
ffi_type *
|
|
|
|
go_ffi_type_uint64(void)
|
|
|
|
{
|
|
|
|
return &ffi_type_uint64;
|
|
|
|
}
|
2014-07-19 23:36:26 +02:00
|
|
|
|
2016-11-18 01:15:38 +01:00
|
|
|
ffi_type *
|
|
|
|
go_ffi_type_float(void)
|
2014-07-19 23:36:26 +02:00
|
|
|
{
|
|
|
|
return &ffi_type_float;
|
2016-11-18 01:15:38 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
ffi_type *
|
|
|
|
go_ffi_type_double(void)
|
|
|
|
{
|
2014-07-19 23:36:26 +02:00
|
|
|
return &ffi_type_double;
|
2016-11-18 01:15:38 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
_Bool
|
|
|
|
go_ffi_supports_complex(void)
|
|
|
|
{
|
2015-01-16 23:58:53 +01:00
|
|
|
#ifdef FFI_TARGET_HAS_COMPLEX_TYPE
|
2016-11-18 01:15:38 +01:00
|
|
|
return true;
|
2015-01-16 23:58:53 +01:00
|
|
|
#else
|
2016-11-18 01:15:38 +01:00
|
|
|
return false;
|
2014-07-19 23:36:26 +02:00
|
|
|
#endif
|
2016-11-18 01:15:38 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
ffi_type *
|
|
|
|
go_ffi_type_complex_float(void)
|
|
|
|
{
|
2015-01-16 23:58:53 +01:00
|
|
|
#ifdef FFI_TARGET_HAS_COMPLEX_TYPE
|
2016-11-18 01:15:38 +01:00
|
|
|
return &ffi_type_complex_float;
|
2015-01-16 23:58:53 +01:00
|
|
|
#else
|
2016-11-18 01:15:38 +01:00
|
|
|
abort();
|
2014-07-19 23:36:26 +02:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2016-11-18 01:15:38 +01:00
|
|
|
ffi_type *
|
|
|
|
go_ffi_type_complex_double(void)
|
2014-07-19 23:36:26 +02:00
|
|
|
{
|
2016-11-18 01:15:38 +01:00
|
|
|
#ifdef FFI_TARGET_HAS_COMPLEX_TYPE
|
|
|
|
return &ffi_type_complex_double;
|
|
|
|
#else
|
|
|
|
abort();
|
|
|
|
#endif
|
2014-07-19 23:36:26 +02:00
|
|
|
}
|
|
|
|
|
2016-11-18 01:15:38 +01:00
|
|
|
ffi_type *
|
|
|
|
go_ffi_type_void(void)
|
2014-07-19 23:36:26 +02:00
|
|
|
{
|
2016-11-18 01:15:38 +01:00
|
|
|
return &ffi_type_void;
|
2014-07-19 23:36:26 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* defined(USE_LIBFFI) */
|