Initial commit: Go 1.23 release state
This commit is contained in:
46
src/runtime/cgo/gcc_traceback.c
Normal file
46
src/runtime/cgo/gcc_traceback.c
Normal file
@@ -0,0 +1,46 @@
|
||||
// Copyright 2016 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.
|
||||
|
||||
//go:build darwin || linux
|
||||
|
||||
#include <stdint.h>
|
||||
#include "libcgo.h"
|
||||
|
||||
#ifndef __has_feature
|
||||
#define __has_feature(x) 0
|
||||
#endif
|
||||
|
||||
#if __has_feature(memory_sanitizer)
|
||||
#include <sanitizer/msan_interface.h>
|
||||
#endif
|
||||
|
||||
// Call the user's traceback function and then call sigtramp.
|
||||
// The runtime signal handler will jump to this code.
|
||||
// We do it this way so that the user's traceback function will be called
|
||||
// by a C function with proper unwind info.
|
||||
void
|
||||
x_cgo_callers(uintptr_t sig, void *info, void *context, void (*cgoTraceback)(struct cgoTracebackArg*), uintptr_t* cgoCallers, void (*sigtramp)(uintptr_t, void*, void*)) {
|
||||
struct cgoTracebackArg arg;
|
||||
|
||||
arg.Context = 0;
|
||||
arg.SigContext = (uintptr_t)(context);
|
||||
arg.Buf = cgoCallers;
|
||||
arg.Max = 32; // must match len(runtime.cgoCallers)
|
||||
|
||||
#if __has_feature(memory_sanitizer)
|
||||
// This function is called directly from the signal handler.
|
||||
// The arguments are passed in registers, so whether msan
|
||||
// considers cgoCallers to be initialized depends on whether
|
||||
// it considers the appropriate register to be initialized.
|
||||
// That can cause false reports in rare cases.
|
||||
// Explicitly unpoison the memory to avoid that.
|
||||
// See issue #47543 for more details.
|
||||
__msan_unpoison(&arg, sizeof arg);
|
||||
#endif
|
||||
|
||||
_cgo_tsan_acquire();
|
||||
(*cgoTraceback)(&arg);
|
||||
_cgo_tsan_release();
|
||||
sigtramp(sig, info, context);
|
||||
}
|
||||
Reference in New Issue
Block a user