gcc/libgo/runtime/go-traceback.c

63 lines
1.2 KiB
C

/* go-traceback.c -- stack backtrace for Go.
Copyright 2012 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. */
#include "config.h"
#include "unwind.h"
#include "runtime.h"
#include "go-string.h"
static _Unwind_Reason_Code
traceback (struct _Unwind_Context *context, void *varg)
{
int *parg = (int *) varg;
uintptr pc;
int ip_before_insn = 0;
struct __go_string fn;
struct __go_string file;
int line;
#ifdef HAVE_GETIPINFO
pc = _Unwind_GetIPInfo (context, &ip_before_insn);
#else
pc = _Unwind_GetIP (context);
#endif
if (*parg > 100)
return _URC_END_OF_STACK;
++*parg;
/* FIXME: If PC is in the __morestack routine, we should ignore
it. */
/* Back up to the call instruction. */
if (!ip_before_insn)
--pc;
if (!__go_file_line (pc, &fn, &file, &line))
return _URC_END_OF_STACK;
if (runtime_showframe (fn.__data))
{
runtime_printf ("%s\n", fn.__data);
runtime_printf ("\t%s:%d\n", file.__data, line);
}
return _URC_NO_REASON;
}
/* Print a stack trace for the current goroutine. */
void
runtime_traceback ()
{
int c;
c = 0;
_Unwind_Backtrace (traceback, &c);
}