// Copyright 2020 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.

package runtime

import (
	
	
)

// libc function wrappers. Must run on system stack.

//go:nosplit
//go:cgo_unsafe_args
func ( *pthreadkey,  uintptr) int32 {
	return asmcgocall(unsafe.Pointer(funcPC(pthread_key_create_trampoline)), unsafe.Pointer(&))
}
func ()

//go:nosplit
//go:cgo_unsafe_args
func ( pthreadkey,  uintptr) int32 {
	return asmcgocall(unsafe.Pointer(funcPC(pthread_setspecific_trampoline)), unsafe.Pointer(&))
}
func ()

//go:cgo_import_dynamic libc_pthread_key_create pthread_key_create "/usr/lib/libSystem.B.dylib"
//go:cgo_import_dynamic libc_pthread_setspecific pthread_setspecific "/usr/lib/libSystem.B.dylib"

// tlsinit allocates a thread-local storage slot for g.
//
// It finds the first available slot using pthread_key_create and uses
// it as the offset value for runtime.tlsg.
//
// This runs at startup on g0 stack, but before g is set, so it must
// not split stack (transitively). g is expected to be nil, so things
// (e.g. asmcgocall) will skip saving or reading g.
//
//go:nosplit
func ( *uintptr,  *[_PTHREAD_KEYS_MAX]uintptr) {
	var  pthreadkey
	 := g0_pthread_key_create(&, 0)
	if  != 0 {
		abort()
	}

	const  = 0xc476c475c47957
	 = g0_pthread_setspecific(, )
	if  != 0 {
		abort()
	}

	for ,  := range  {
		if  ==  {
			* = uintptr( * sys.PtrSize)
			g0_pthread_setspecific(, 0)
			return
		}
	}
	abort()
}