Text file src/runtime/cgo/libcgo.h

     1  // Copyright 2009 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  #include <stdint.h>
     6  #include <stdlib.h>
     7  #include <stdio.h>
     8  
     9  #undef nil
    10  #define nil ((void*)0)
    11  #define nelem(x) (sizeof(x)/sizeof((x)[0]))
    12  
    13  typedef uint32_t uint32;
    14  typedef uint64_t uint64;
    15  typedef uintptr_t uintptr;
    16  
    17  /*
    18   * The beginning of the per-goroutine structure,
    19   * as defined in ../pkg/runtime/runtime.h.
    20   * Just enough to edit these two fields.
    21   */
    22  typedef struct G G;
    23  struct G
    24  {
    25  	uintptr stacklo;
    26  	uintptr stackhi;
    27  };
    28  
    29  /*
    30   * Arguments to the _cgo_thread_start call.
    31   * Also known to ../pkg/runtime/runtime.h.
    32   */
    33  typedef struct ThreadStart ThreadStart;
    34  struct ThreadStart
    35  {
    36  	G *g;
    37  	uintptr *tls;
    38  	void (*fn)(void);
    39  };
    40  
    41  /*
    42   * Called by 5c/6c/8c world.
    43   * Makes a local copy of the ThreadStart and
    44   * calls _cgo_sys_thread_start(ts).
    45   */
    46  extern void (*_cgo_thread_start)(ThreadStart *ts);
    47  
    48  /*
    49   * Creates a new operating system thread without updating any Go state
    50   * (OS dependent).
    51   */
    52  extern void (*_cgo_sys_thread_create)(void* (*func)(void*), void* arg);
    53  
    54  /*
    55   * Indicates whether a dummy pthread per-thread variable is allocated.
    56   */
    57  extern uintptr_t *_cgo_pthread_key_created;
    58  
    59  /*
    60   * Creates the new operating system thread (OS, arch dependent).
    61   */
    62  void _cgo_sys_thread_start(ThreadStart *ts);
    63  
    64  /*
    65   * Waits for the Go runtime to be initialized (OS dependent).
    66   * If runtime.SetCgoTraceback is used to set a context function,
    67   * calls the context function and returns the context value.
    68   */
    69  uintptr_t _cgo_wait_runtime_init_done(void);
    70  
    71  /*
    72   * Get the low and high boundaries of the stack.
    73   */
    74  void x_cgo_getstackbound(uintptr bounds[2]);
    75  
    76  /*
    77   * Prints error then calls abort. For linux and android.
    78   */
    79  void fatalf(const char* format, ...) __attribute__ ((noreturn));
    80  
    81  /*
    82   * Registers the current mach thread port for EXC_BAD_ACCESS processing.
    83   */
    84  void darwin_arm_init_thread_exception_port(void);
    85  
    86  /*
    87   * Starts a mach message server processing EXC_BAD_ACCESS.
    88   */
    89  void darwin_arm_init_mach_exception_handler(void);
    90  
    91  /*
    92   * The cgo traceback callback. See runtime.SetCgoTraceback.
    93   */
    94  struct cgoTracebackArg {
    95  	uintptr_t  Context;
    96  	uintptr_t  SigContext;
    97  	uintptr_t* Buf;
    98  	uintptr_t  Max;
    99  };
   100  extern void (*(_cgo_get_traceback_function(void)))(struct cgoTracebackArg*);
   101  
   102  /*
   103   * The cgo context callback. See runtime.SetCgoTraceback.
   104   */
   105  struct cgoContextArg {
   106  	uintptr_t Context;
   107  };
   108  extern void (*(_cgo_get_context_function(void)))(struct cgoContextArg*);
   109  
   110  /*
   111   * The argument for the cgo symbolizer callback. See runtime.SetCgoTraceback.
   112   */
   113  struct cgoSymbolizerArg {
   114  	uintptr_t   PC;
   115  	const char* File;
   116  	uintptr_t   Lineno;
   117  	const char* Func;
   118  	uintptr_t   Entry;
   119  	uintptr_t   More;
   120  	uintptr_t   Data;
   121  };
   122  extern void (*(_cgo_get_symbolizer_function(void)))(struct cgoSymbolizerArg*);
   123  
   124  /*
   125   * The argument for x_cgo_set_traceback_functions. See runtime.SetCgoTraceback.
   126   */
   127  struct cgoSetTracebackFunctionsArg {
   128  	void (*Traceback)(struct cgoTracebackArg*);
   129  	void (*Context)(struct cgoContextArg*);
   130  	void (*Symbolizer)(struct cgoSymbolizerArg*);
   131  };
   132  
   133  /*
   134   * TSAN support.  This is only useful when building with
   135   *   CGO_CFLAGS="-fsanitize=thread" CGO_LDFLAGS="-fsanitize=thread" go install
   136   */
   137  #undef CGO_TSAN
   138  #if defined(__has_feature)
   139  # if __has_feature(thread_sanitizer)
   140  #  define CGO_TSAN
   141  # endif
   142  #elif defined(__SANITIZE_THREAD__)
   143  # define CGO_TSAN
   144  #endif
   145  
   146  #ifdef CGO_TSAN
   147  
   148  // _cgo_tsan_acquire tells C/C++ TSAN that we are acquiring a dummy lock. We
   149  // call this when calling from Go to C. This is necessary because TSAN cannot
   150  // see the synchronization in Go. Note that C/C++ code built with TSAN is not
   151  // the same as the Go race detector.
   152  //
   153  // cmd/cgo generates calls to _cgo_tsan_acquire and _cgo_tsan_release. For
   154  // other cgo calls, manual calls are required.
   155  //
   156  // These must match the definitions in yesTsanProlog in cmd/cgo/out.go.
   157  // In general we should call _cgo_tsan_acquire when we enter C code,
   158  // and call _cgo_tsan_release when we return to Go code.
   159  //
   160  // This is only necessary when calling code that might be instrumented
   161  // by TSAN, which mostly means system library calls that TSAN intercepts.
   162  //
   163  // See the comment in cmd/cgo/out.go for more details.
   164  
   165  long long _cgo_sync __attribute__ ((common));
   166  
   167  extern void __tsan_acquire(void*);
   168  extern void __tsan_release(void*);
   169  
   170  __attribute__ ((unused))
   171  static void _cgo_tsan_acquire() {
   172  	__tsan_acquire(&_cgo_sync);
   173  }
   174  
   175  __attribute__ ((unused))
   176  static void _cgo_tsan_release() {
   177  	__tsan_release(&_cgo_sync);
   178  }
   179  
   180  #else // !defined(CGO_TSAN)
   181  
   182  #define _cgo_tsan_acquire()
   183  #define _cgo_tsan_release()
   184  
   185  #endif // !defined(CGO_TSAN)
   186  

View as plain text