gcc_traceback.c revision 67845c40aa5be5001fb20ef6f6b8d52e3fe6bb1c
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// +build cgo
6// +build linux
7
8#include <stdint.h>
9
10struct cgoTracebackArg {
11	uintptr_t  Context;
12	uintptr_t  SigContext;
13	uintptr_t* Buf;
14	uintptr_t  Max;
15};
16
17// Call the user's traceback function and then call sigtramp.
18// The runtime signal handler will jump to this code.
19// We do it this way so that the user's traceback function will be called
20// by a C function with proper unwind info.
21void
22x_cgo_callers(uintptr_t sig, void *info, void *context, void (*cgoTraceback)(struct cgoTracebackArg*), uintptr_t* cgoCallers, void (*sigtramp)(uintptr_t, void*, void*)) {
23	struct cgoTracebackArg arg;
24
25	arg.Context = 0;
26	arg.SigContext = (uintptr_t)(context);
27	arg.Buf = cgoCallers;
28	arg.Max = 32; // must match len(runtime.cgoCallers)
29	(*cgoTraceback)(&arg);
30	sigtramp(sig, info, context);
31}
32