/* 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 #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) */