github.com/guyezi/gofrontend@v0.0.0-20200228202240-7a62a49e62c0/libgo/runtime/go-ffi.c (about)

     1  /* go-ffi.c -- libffi support functions.
     2  
     3     Copyright 2009 The Go Authors. All rights reserved.
     4     Use of this source code is governed by a BSD-style
     5     license that can be found in the LICENSE file.  */
     6  
     7  #include <stdlib.h>
     8  
     9  #include "runtime.h"
    10  
    11  #ifdef USE_LIBFFI
    12  
    13  #include "ffi.h"
    14  
    15  /* The functions in this file are called by the Go runtime code to get
    16     the libffi type values.  */
    17  
    18  ffi_type *go_ffi_type_pointer(void) __attribute__ ((no_split_stack));
    19  ffi_type *go_ffi_type_pointer(void) __asm__ ("runtime.ffi_type_pointer");
    20  ffi_type *go_ffi_type_sint8(void) __attribute__ ((no_split_stack));
    21  ffi_type *go_ffi_type_sint8(void) __asm__ ("runtime.ffi_type_sint8");
    22  ffi_type *go_ffi_type_sint16(void) __attribute__ ((no_split_stack));
    23  ffi_type *go_ffi_type_sint16(void) __asm__ ("runtime.ffi_type_sint16");
    24  ffi_type *go_ffi_type_sint32(void) __attribute__ ((no_split_stack));
    25  ffi_type *go_ffi_type_sint32(void) __asm__ ("runtime.ffi_type_sint32");
    26  ffi_type *go_ffi_type_sint64(void) __attribute__ ((no_split_stack));
    27  ffi_type *go_ffi_type_sint64(void) __asm__ ("runtime.ffi_type_sint64");
    28  ffi_type *go_ffi_type_uint8(void) __attribute__ ((no_split_stack));
    29  ffi_type *go_ffi_type_uint8(void) __asm__ ("runtime.ffi_type_uint8");
    30  ffi_type *go_ffi_type_uint16(void) __attribute__ ((no_split_stack));
    31  ffi_type *go_ffi_type_uint16(void) __asm__ ("runtime.ffi_type_uint16");
    32  ffi_type *go_ffi_type_uint32(void) __attribute__ ((no_split_stack));
    33  ffi_type *go_ffi_type_uint32(void) __asm__ ("runtime.ffi_type_uint32");
    34  ffi_type *go_ffi_type_uint64(void) __attribute__ ((no_split_stack));
    35  ffi_type *go_ffi_type_uint64(void) __asm__ ("runtime.ffi_type_uint64");
    36  ffi_type *go_ffi_type_float(void) __attribute__ ((no_split_stack));
    37  ffi_type *go_ffi_type_float(void) __asm__ ("runtime.ffi_type_float");
    38  ffi_type *go_ffi_type_double(void) __attribute__ ((no_split_stack));
    39  ffi_type *go_ffi_type_double(void) __asm__ ("runtime.ffi_type_double");
    40  ffi_type *go_ffi_type_complex_float(void) __attribute__ ((no_split_stack));
    41  ffi_type *go_ffi_type_complex_float(void) __asm__ ("runtime.ffi_type_complex_float");
    42  ffi_type *go_ffi_type_complex_double(void) __attribute__ ((no_split_stack));
    43  ffi_type *go_ffi_type_complex_double(void) __asm__ ("runtime.ffi_type_complex_double");
    44  ffi_type *go_ffi_type_void(void) __attribute__ ((no_split_stack));
    45  ffi_type *go_ffi_type_void(void) __asm__ ("runtime.ffi_type_void");
    46  
    47  _Bool go_ffi_supports_complex(void) __attribute__ ((no_split_stack));
    48  _Bool go_ffi_supports_complex(void) __asm__ ("runtime.ffi_supports_complex");
    49  
    50  ffi_type *
    51  go_ffi_type_pointer(void)
    52  {
    53  	return &ffi_type_pointer;
    54  }
    55  
    56  ffi_type *
    57  go_ffi_type_sint8(void)
    58  {
    59  	return &ffi_type_sint8;
    60  }
    61  
    62  ffi_type *
    63  go_ffi_type_sint16(void)
    64  {
    65  	return &ffi_type_sint16;
    66  }
    67  
    68  ffi_type *
    69  go_ffi_type_sint32(void)
    70  {
    71  	return &ffi_type_sint32;
    72  }
    73  
    74  ffi_type *
    75  go_ffi_type_sint64(void)
    76  {
    77  	return &ffi_type_sint64;
    78  }
    79  
    80  ffi_type *
    81  go_ffi_type_uint8(void)
    82  {
    83  	return &ffi_type_uint8;
    84  }
    85  
    86  ffi_type *
    87  go_ffi_type_uint16(void)
    88  {
    89  	return &ffi_type_uint16;
    90  }
    91  
    92  ffi_type *
    93  go_ffi_type_uint32(void)
    94  {
    95  	return &ffi_type_uint32;
    96  }
    97  
    98  ffi_type *
    99  go_ffi_type_uint64(void)
   100  {
   101  	return &ffi_type_uint64;
   102  }
   103  
   104  ffi_type *
   105  go_ffi_type_float(void)
   106  {
   107  	return &ffi_type_float;
   108  }
   109  
   110  ffi_type *
   111  go_ffi_type_double(void)
   112  {
   113  	return &ffi_type_double;
   114  }
   115  
   116  _Bool
   117  go_ffi_supports_complex(void)
   118  {
   119  #ifdef FFI_TARGET_HAS_COMPLEX_TYPE
   120  	return true;
   121  #else
   122  	return false;
   123  #endif
   124  }
   125  
   126  ffi_type *
   127  go_ffi_type_complex_float(void)
   128  {
   129  #ifdef FFI_TARGET_HAS_COMPLEX_TYPE
   130  	return &ffi_type_complex_float;
   131  #else
   132  	abort();
   133  #endif
   134  }
   135  
   136  ffi_type *
   137  go_ffi_type_complex_double(void)
   138  {
   139  #ifdef FFI_TARGET_HAS_COMPLEX_TYPE
   140  	return &ffi_type_complex_double;
   141  #else
   142  	abort();
   143  #endif
   144  }
   145  
   146  ffi_type *
   147  go_ffi_type_void(void)
   148  {
   149  	return &ffi_type_void;
   150  }
   151  
   152  #endif /* defined(USE_LIBFFI) */