summaryrefslogtreecommitdiffstats
path: root/lib.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2019-04-16 14:54:35 -0700
committerKaz Kylheku <kaz@kylheku.com>2019-04-16 14:54:35 -0700
commit59c4fe61bdbe56eb215e29535e89ad72c3a2ee4b (patch)
tree117db7d424b7038311ea108a5d9d2427f2057543 /lib.c
parent7acbe1e1fff644f60637ad96610c93f76ccd2cf4 (diff)
downloadtxr-59c4fe61bdbe56eb215e29535e89ad72c3a2ee4b.tar.gz
txr-59c4fe61bdbe56eb215e29535e89ad72c3a2ee4b.tar.bz2
txr-59c4fe61bdbe56eb215e29535e89ad72c3a2ee4b.zip
debugger: initial backtrace support.
* debug.c (debug_state): Switch to unsigned, since this is now a bitmask. (sys_print_backtrace_s): New symbol variable. (dbg_clear, dbg_set, dbg_restore): New static functions. (debug_init): Initialize sys_print_backtrace_s. Register dbg-clear, dbg-set, dbg-restore intrinsics. Register dbg-enable, dbg-step, dbg-backtrace and dbg-all bitmask variables, Lisp equivalents of DBG_ENABLE, DBG_SETP, DBG_BACKTRACE and DBG_ALL. (debug_dump_backtrace): New function. * debug.h (opt_debugger): Declaration removed. (debug_state): Declaration updated. (DBG_ENABLE, DBG_STEP, DBG_BACKTRACE, DBG_ALL): New preprocessor symbols. (debug_set_state): Inline function removed. (debug_clear, debug_set, debug_restore): New inline functions. (dbg_backtrace, dbg_fcall_begin, dbg_fcall_end): New macros. (debug_dump_backtrace): Declared. * eval.c (error_trace): Invoke debug_dump_backtrace if support is compiled in and backtraces are enabled. * lib.c (do_generic_funcall): New function, copy of generic_funcall. (generic_funcall): Now a wrapper for do_generic_funcall which registers fcall frames if backtrace support is enabled. (funcall, funcall1, funcall2, funcall3, funcall4): Route to slow generic_funcall path if backtraces are enabled. * lisplib.c (debugger_instantiate, debugger_set_entries): New static functions. (lisplib_init): Autload support for debug module via above new functions. (lisplib_try_load): Save and restore debugger state in new way using debug_set and debug_restore, with specific mask values. * parser.y (parse_once): Disable debugging in new way. * share/txr/stdlib/debug.tl New file. * sighal.h (EJ_DBG_MEMB, EJ_DBG_SAVE, EJ_DBG_REST): New macros for saving/restoring debug state. (EJ_OPT_MEMB, EJ_OPT_SAVE, EJ_OPT_REST): Reference the above macros to include debug state in extended jump context. * txr.c (help): Document --backtrace and that that -d implies --backtrace. (txr_main): Enable debugger using debug_set. Provide new --backtrace option to enable backtraces only. * unwind.c (args_s): New symbol variable. (fcall_frame_type): New static variable. (unwind_to_exit_point): Save pointer to original frame stack and restore it when calling error_trace. This is so that error_trace can walk the stack to collect a backtrace. (uw_find_frames_by_mask, uw_push_fcall): New functions. (uw_late_init): Initialize args_s and fcall_frame_type. gc-protect fcall_frame_type. Register uw-* variables corresponding to the UW_* frame types. * unwind.h (uw_frtype_t): New enum constant UW_FCALL. (struct uw_fcall): New frame structure. (union uw_frame): New member fc. (uw_push_fcall, uw_find_frames_by_mask): Declared.
Diffstat (limited to 'lib.c')
-rw-r--r--lib.c25
1 files changed, 19 insertions, 6 deletions
diff --git a/lib.c b/lib.c
index c787174f..afd6e627 100644
--- a/lib.c
+++ b/lib.c
@@ -72,6 +72,7 @@
#include "buf.h"
#include "ffi.h"
#include "txr.h"
+#include "debug.h"
#define max(a, b) ((a) > (b) ? (a) : (b))
#define min(a, b) ((a) < (b) ? (a) : (b))
@@ -6044,7 +6045,7 @@ static noreturn void callerror(val fun, val msg)
abort();
}
-val generic_funcall(val fun, struct args *args_in)
+INLINE val do_generic_funcall(val fun, struct args *args_in)
{
int variadic, fixparam, reqargs;
struct args *args = args_in;
@@ -6257,6 +6258,18 @@ val generic_funcall(val fun, struct args *args_in)
internal_error("corrupt function type field");
}
+val generic_funcall(val fun, struct args *args)
+{
+ if (dbg_backtrace) {
+ val ret;
+ dbg_fcall_begin(fun, args);
+ ret = do_generic_funcall(fun, args);
+ dbg_fcall_end;
+ return ret;
+ }
+ return do_generic_funcall(fun, args);
+}
+
static noreturn void wrongargs(val fun)
{
callerror(fun, lit("wrong number of arguments"));
@@ -6264,7 +6277,7 @@ static noreturn void wrongargs(val fun)
val funcall(val fun)
{
- if (type(fun) != FUN || fun->f.optargs) {
+ if (type(fun) != FUN || fun->f.optargs || dbg_backtrace) {
args_decl(args, ARGS_MIN);
return generic_funcall(fun, args);
}
@@ -6305,7 +6318,7 @@ val funcall(val fun)
val funcall1(val fun, val arg)
{
- if (type(fun) != FUN || fun->f.optargs) {
+ if (type(fun) != FUN || fun->f.optargs || dbg_backtrace) {
args_decl(args, ARGS_MIN);
args_add(args, arg);
return generic_funcall(fun, args);
@@ -6357,7 +6370,7 @@ val funcall1(val fun, val arg)
val funcall2(val fun, val arg1, val arg2)
{
- if (type(fun) != FUN || fun->f.optargs) {
+ if (type(fun) != FUN || fun->f.optargs || dbg_backtrace) {
args_decl(args, ARGS_MIN);
args_add2(args, arg1, arg2);
return generic_funcall(fun, args);
@@ -6415,7 +6428,7 @@ val funcall2(val fun, val arg1, val arg2)
val funcall3(val fun, val arg1, val arg2, val arg3)
{
- if (type(fun) != FUN || fun->f.optargs) {
+ if (type(fun) != FUN || fun->f.optargs || dbg_backtrace) {
args_decl(args, ARGS_MIN);
args_add3(args, arg1, arg2, arg3);
return generic_funcall(fun, args);
@@ -6479,7 +6492,7 @@ val funcall3(val fun, val arg1, val arg2, val arg3)
val funcall4(val fun, val arg1, val arg2, val arg3, val arg4)
{
- if (type(fun) != FUN || fun->f.optargs) {
+ if (type(fun) != FUN || fun->f.optargs || dbg_backtrace) {
args_decl(args, ARGS_MIN);
args_add4(args, arg1, arg2, arg3, arg4);
return generic_funcall(fun, args);