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.
10 #define nil ((void*)0)
11 #define nelem(x) (sizeof(x)/sizeof((x)[0]))
13 typedef uint32_t uint32;
14 typedef uint64_t uint64;
15 typedef uintptr_t uintptr;
18 * The beginning of the per-goroutine structure,
19 * as defined in ../pkg/runtime/runtime.h.
20 * Just enough to edit these two fields.
30 * Arguments to the _cgo_thread_start call.
31 * Also known to ../pkg/runtime/runtime.h.
33 typedef struct ThreadStart ThreadStart;
42 * Called by 5c/6c/8c world.
43 * Makes a local copy of the ThreadStart and
44 * calls _cgo_sys_thread_start(ts).
46 extern void (*_cgo_thread_start)(ThreadStart *ts);
49 * Creates a new operating system thread without updating any Go state
52 extern void (*_cgo_sys_thread_create)(void* (*func)(void*), void* arg);
55 * Indicates whether a dummy pthread per-thread variable is allocated.
57 extern uintptr_t *_cgo_pthread_key_created;
60 * Creates the new operating system thread (OS, arch dependent).
62 void _cgo_sys_thread_start(ThreadStart *ts);
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.
69 uintptr_t _cgo_wait_runtime_init_done(void);
72 * Call fn in the 6c world.
74 void crosscall_amd64(void (*fn)(void), void (*setg_gcc)(void*), void *g);
77 * Call fn in the 8c world.
79 void crosscall_386(void (*fn)(void));
82 * Prints error then calls abort. For linux and android.
84 void fatalf(const char* format, ...);
87 * Registers the current mach thread port for EXC_BAD_ACCESS processing.
89 void darwin_arm_init_thread_exception_port(void);
92 * Starts a mach message server processing EXC_BAD_ACCESS.
94 void darwin_arm_init_mach_exception_handler(void);
97 * The cgo context function. See runtime.SetCgoTraceback.
102 extern void (*(_cgo_get_context_function(void)))(struct context_arg*);
105 * The argument for the cgo traceback callback. See runtime.SetCgoTraceback.
107 struct cgoTracebackArg {
109 uintptr_t SigContext;
115 * TSAN support. This is only useful when building with
116 * CGO_CFLAGS="-fsanitize=thread" CGO_LDFLAGS="-fsanitize=thread" go install
119 #if defined(__has_feature)
120 # if __has_feature(thread_sanitizer)
123 #elif defined(__SANITIZE_THREAD__)
129 // These must match the definitions in yesTsanProlog in cmd/cgo/out.go.
130 // In general we should call _cgo_tsan_acquire when we enter C code,
131 // and call _cgo_tsan_release when we return to Go code.
132 // This is only necessary when calling code that might be instrumented
133 // by TSAN, which mostly means system library calls that TSAN intercepts.
134 // See the comment in cmd/cgo/out.go for more details.
136 long long _cgo_sync __attribute__ ((common));
138 extern void __tsan_acquire(void*);
139 extern void __tsan_release(void*);
141 __attribute__ ((unused))
142 static void _cgo_tsan_acquire() {
143 __tsan_acquire(&_cgo_sync);
146 __attribute__ ((unused))
147 static void _cgo_tsan_release() {
148 __tsan_release(&_cgo_sync);
151 #else // !defined(CGO_TSAN)
153 #define _cgo_tsan_acquire()
154 #define _cgo_tsan_release()
156 #endif // !defined(CGO_TSAN)