Skip to content

Instantly share code, notes, and snippets.

@Ferdi265
Created October 18, 2023 21:03
Show Gist options
  • Save Ferdi265/ebe3a1615fcf18d56d8d7947521bc5be to your computer and use it in GitHub Desktop.
Save Ferdi265/ebe3a1615fcf18d56d8d7947521bc5be to your computer and use it in GitHub Desktop.
GDB helper commands for debugging lambda-compiler binaries
define iimpls
set var $g_pair_impl = (void*)_L3Nstd4NpairL3I0
set var $g_nil_impl = (void*)_L3Nstd5NfalseL1I0
# set var $g_succ_impl = (void*)_L3Nstd4NsuccL2I0
set var $g_succ_impl = (void*)_L3Nstd2NorL2I1
set var $g_zero_impl = (void*)_L3Nstd5NfalseL1I0
end
set var $g_have_impls = 0
define itimpls
if $g_have_impls == 0
iimpls
set var $g_have_impls = 1
end
end
define ilambda
set var $lambda = (void**)$arg0
set var $refcount = (unsigned long long)($lambda[0])
set var $captures = (unsigned long long)($lambda[1])
set var $userdata = (unsigned long long)($lambda[2])
set var $impl = $lambda[3]
printf "lambda at %p: refcount = %lld, captures = %lld, userdata = %lld, impl: ", $lambda, $refcount, $captures, $userdata
x/1bx $impl
end
define plambda
ilambda $arg0
set var $cur_lambda = $lambda
set var $cur_captures = $captures
set var $cur_userdata = $userdata
set var $cur_cap = &$cur_lambda[4]
set var $i = 0
while $i < $cur_captures
if ($i == $cur_captures - 1) && ($cur_userdata == 0)
printf "└─ "
else
printf "├─ "
end
printf "$%lld: ", $i + 1
ilambda *$cur_cap
set var $cur_cap = $cur_cap + 1
set var $i = $i + 1
end
if $cur_userdata > 0
printf "└─ userdata: "
eval "x/%lldbx %p", $cur_userdata, $cur_cap
end
end
define pcont
set var $i = 0
set var $cont = (void**)$arg0
printf "continuation backtrace at %p:\n", $cont
while $cont
set var $lambda = (void**)($cont[1])
set var $cont = (void**)($cont[0])
if $cont
printf "├─ "
else
printf "└─ "
end
printf "%d: ", $i
ilambda $lambda
set var $i = $i + 1
end
end
define pnat
if $argc < 2
itimpls
set var $succ_impl = $g_succ_impl
else
set var $succ_impl = $arg1
end
if $argc < 3
itimpls
set var $zero_impl = $g_zero_impl
else
set var $zero_impl = $arg2
end
set var $lambda = (void**)$arg0
set var $orig_lambda = $lambda
set var $i = 0
while $lambda
set var $captures = (unsigned long long)($lambda[1])
if $captures == 0
set var $cur_impl = $lambda[3]
if $cur_impl != $zero_impl
printf "error: cannot be a nat: lambda at %p has invalid impl for zero\n", $lambda
set var $lambda = 0
else
printf "value of nat at %p: %lld\n", $orig_lambda, $i
set var $lambda = 0
end
end
if $captures == 1
set var $cur_impl = $lambda[3]
if $cur_impl != $succ_impl
printf "error: cannot be a nat: lambda at %p has invalid impl for succ\n", $lambda
set var $lambda = 0
else
set var $i = $i + 1
set $lambda = (void**)($lambda[4])
end
end
if $captures > 1
printf "error: cannot be a nat: lambda at %p has invalid captures for nat\n", $lambda
set var $lambda = 0
end
end
end
define plist
if $argc < 2
itimpls
set var $pair_impl = $g_pair_impl
else
set var $pair_impl = $arg1
end
if $argc < 3
itimpls
set var $nil_impl = $g_nil_impl
else
set var $nil_impl = $arg2
end
set var $lambda = (void**)$arg0
printf "list at %p:\n", $lambda
set var $orig_lambda = $lambda
while $lambda
set var $cur_captures = (unsigned long long)($lambda[1])
if $cur_captures == 0
set var $cur_impl = $lambda[3]
if $cur_impl != $nil_impl
printf "error: cannot be a list: lambda at %p has invalid impl for nil\n", $lambda
set var $lambda = 0
else
printf "└─ nil at %p\n", $lambda
set var $lambda = 0
end
end
if $cur_captures == 2
set var $cur_impl = $lambda[3]
if $cur_impl != $pair_impl
printf "error: cannot be a list: lambda at %p has invalid impl for pair\n", $lambda
set var $lambda = 0
else
set var $next_lambda = (void**)($lambda[4])
set var $val = (void**)($lambda[5])
printf "├─ "
ilambda $val
set var $lambda = $next_lambda
end
end
if $cur_captures == 1 || $cur_captures > 2
printf "error: cannot be a list: lambda at %p has invalid captures for list\n", $lambda
set var $lambda = 0
end
end
end
define pnatlist
if $argc < 2
itimpls
set var $pair_impl = $g_pair_impl
else
set var $pair_impl = $arg1
end
if $argc < 3
itimpls
set var $nil_impl = $g_nil_impl
else
set var $nil_impl = $arg2
end
if $argc < 4
itimpls
set var $succ_impl = $g_succ_impl
else
set var $succ_impl = $arg1
end
if $argc < 5
itimpls
set var $zero_impl = $g_zero_impl
else
set var $zero_impl = $arg2
end
set var $lambda = (void**)$arg0
printf "nat list at %p:\n", $lambda
set var $orig_lambda = $lambda
while $lambda
set var $cur_captures = (unsigned long long)($lambda[1])
if $cur_captures == 0
set var $cur_impl = $lambda[3]
if $cur_impl != $nil_impl
printf "error: cannot be a list: lambda at %p has invalid impl for nil\n", $lambda
set var $lambda = 0
else
printf "└─ nil at %p\n", $lambda
set var $lambda = 0
end
end
if $cur_captures == 2
set var $cur_impl = $lambda[3]
if $cur_impl != $pair_impl
printf "error: cannot be a list: lambda at %p has invalid impl for pair\n", $lambda
set var $lambda = 0
else
set var $next_lambda = (void**)($lambda[4])
set var $val = (void**)($lambda[5])
printf "├─ "
pnat $val $succ_impl $zero_impl
set var $lambda = $next_lambda
end
end
if $cur_captures == 1 || $cur_captures > 2
printf "error: cannot be a list: lambda at %p has invalid captures for list\n", $lambda
set var $lambda = 0
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment