Viewing file: gcc_traceback.c (1.52 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
// 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); }
|