...
Text file
src/runtime/cgo/gcc_traceback.c
1// Copyright 2016 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//go:build darwin || linux
6
7#include <stdint.h>
8#include "libcgo.h"
9
10#ifndef __has_feature
11#define __has_feature(x) 0
12#endif
13
14#if __has_feature(memory_sanitizer)
15#include <sanitizer/msan_interface.h>
16#endif
17
18// Call the user's traceback function and then call sigtramp.
19// The runtime signal handler will jump to this code.
20// We do it this way so that the user's traceback function will be called
21// by a C function with proper unwind info.
22void
23x_cgo_callers(uintptr_t sig, void *info, void *context, void (*cgoTraceback)(struct cgoTracebackArg*), uintptr_t* cgoCallers, void (*sigtramp)(uintptr_t, void*, void*)) {
24 struct cgoTracebackArg arg;
25
26 arg.Context = 0;
27 arg.SigContext = (uintptr_t)(context);
28 arg.Buf = cgoCallers;
29 arg.Max = 32; // must match len(runtime.cgoCallers)
30
31#if __has_feature(memory_sanitizer)
32 // This function is called directly from the signal handler.
33 // The arguments are passed in registers, so whether msan
34 // considers cgoCallers to be initialized depends on whether
35 // it considers the appropriate register to be initialized.
36 // That can cause false reports in rare cases.
37 // Explicitly unpoison the memory to avoid that.
38 // See issue #47543 for more details.
39 __msan_unpoison(&arg, sizeof arg);
40#endif
41
42 _cgo_tsan_acquire();
43 (*cgoTraceback)(&arg);
44 _cgo_tsan_release();
45 sigtramp(sig, info, context);
46}
View as plain text