blob: 86347863aea7c477fc60deff02631ed98e687b34 [file] [log] [blame]
# Don't forget to rebuild sparse with uncommented debug options
# in the Makefile. Also, gcc 3 is known to screw up with the
# cpp macros in the debugging info.
# If a gdb_show_* function is running at a non-zero recursion
# level, only a short summary is shown, preventing further
# recursion. Also note that gdb has only one, global, scope
# for variables, so we need to be careful with recursions.
set $showing_token = 0
set $showing_ident = 0
set $showing_symbol = 0
set $ntabs = 0
define gdb_tabs
set $tmp = $ntabs
while ($tmp--)
printf "\t"
end
end
# Ptr list handling
define ptr_entry
set $ptr = $arg0
set $index = $arg1
set $entry = &($arg2)
set *($entry) = (void *) (~3UL & (unsigned long)$ptr->list[$index])
end
# Ptr list looping skeleton
define gdb_ptr_list_for_each
set $my_head = (struct ptr_list *) $arg0
set $my_list = $my_head
if ($my_head)
while (1)
set $my_nr = 0
while ($my_nr < $my_list->nr)
# Put your iterator code here
set $my_nr++
end
if (($my_list = $my_list->next) == $my_head)
loop_break
end
end
end
end
# Show symbols in a symbol_list. Non-recursive
define gdb_ptr_list_for_each_show_symbol
set $my_head = (struct ptr_list *) $arg0
set $my_list = $my_head
if ($my_head)
while (1)
set $my_nr = 0
while ($my_nr < ($my_list)->nr)
set $my_symbol = (struct symbol *) ((~3UL) & (unsigned long)($my_list)->list[$my_nr])
gdb_show_symbol($my_symbol)
set $my_nr++
end
set $my_list = ($my_list)->next
if ($my_list == $my_head)
loop_break
end
end
end
end
#define gdb_show_statement
# Recursive
define gdb_show_ctype
printf "modifiers: "
if ($arg0->modifiers & MOD_AUTO)
printf "MOD_AUTO "
end
if ($arg0->modifiers & MOD_REGISTER)
printf "MOD_REGISTER "
end
if ($arg0->modifiers & MOD_STATIC)
printf "MOD_STATIC "
end
if ($arg0->modifiers & MOD_EXTERN)
printf "MOD_EXTERN "
end
if ($arg0->modifiers & MOD_CONST)
printf "MOD_CONST "
end
if ($arg0->modifiers & MOD_VOLATILE)
printf "MOD_VOLATILE "
end
if ($arg0->modifiers & MOD_SIGNED)
printf "MOD_SIGNED "
end
if ($arg0->modifiers & MOD_UNSIGNED)
printf "MOD_UNSIGNED "
end
if ($arg0->modifiers & MOD_CHAR)
printf "MOD_CHAR "
end
if ($arg0->modifiers & MOD_SHORT)
printf "MOD_SHORT "
end
if ($arg0->modifiers & MOD_LONG)
printf "MOD_LONG "
end
if ($arg0->modifiers & MOD_LONGLONG)
printf "MOD_LONGLONG "
end
if ($arg0->modifiers & MOD_LONGLONGLONG)
printf "MOD_LONGLONGLONG "
end
if ($arg0->modifiers & MOD_TYPEDEF)
printf "MOD_TYPEDEF "
end
if ($arg0->modifiers & MOD_INLINE)
printf "MOD_INLINE "
end
if ($arg0->modifiers & MOD_ADDRESSABLE)
printf "MOD_ADDRESSABLE "
end
if ($arg0->modifiers & MOD_NOCAST)
printf "MOD_NOCAST "
end
if ($arg0->modifiers & MOD_NODEREF)
printf "MOD_NODEREF "
end
if ($arg0->modifiers & MOD_ACCESSED)
printf "MOD_ACCESSED "
end
if ($arg0->modifiers & MOD_TOPLEVEL)
printf "MOD_TOPLEVEL "
end
if ($arg0->modifiers & MOD_ASSIGNED)
printf "MOD_ASSIGNED "
end
if ($arg0->modifiers & MOD_TYPE)
printf "MOD_TYPE "
end
if ($arg0->modifiers & MOD_SAFE)
printf "MOD_SAFE "
end
if ($arg0->modifiers & MOD_USERTYPE)
printf "MOD_USERTYPE "
end
if ($arg0->modifiers & MOD_EXPLICITLY_SIGNED)
printf "MOD_EXPLICITLY_SIGNED"
end
if ($arg0->modifiers & MOD_BITWISE)
printf "MOD_BITWISE "
end
if (!$arg0->modifiers)
printf "0"
end
printf ", alignment = %d", $arg0->alignment
if ($arg0->as)
printf ", address_space = %d", $arg0->as
end
printf "\n"
set $ntabs++
if ($arg0->base_type)
gdb_tabs
printf "base_type = "
gdb_show_symbol($arg0->base_type)
end
set $ntabs--
end
define gdb_show_symbol
printf "(%x) type = ", $arg0
output $arg0->type
printf ", namespace = "
output $arg0->namespace
if ($arg0->ident)
printf ", ident = %s\n", show_ident($arg0->ident)
else
printf ", ident = NULL\n"
end
# print "zz"
gdb_tabs
printf "dump:\n"
call show_symbol($arg0)
set $ntabs++
if ($arg0->namespace == NS_SYMBOL)
gdb_tabs
printf "ctype = "
gdb_show_ctype(&($arg0->ctype))
end
set $ntabs--
end
# non-recursive
define gdb_show_symbols_next_id
set $sym = $arg0
printf "{\n"
set $ntabs++
while ($sym)
gdb_tabs
printf "symbol = "
gdb_show_symbol($sym)
set $sym = $sym->next_id
end
set $ntabs--
gdb_tabs
printf "}\n"
end
define gdb_show_ident
if ($arg0)
printf "(%p) '%s'\n", $arg0, show_ident($arg0)
else
printf "NULL\n"
end
if (! $showing_ident)
set $showing_ident = 1
set $ntabs++
set $ident = $arg0
if ($ident->symbols)
gdb_tabs
printf "symbols = "
gdb_show_symbols_next_id($ident->symbols)
end
set $ntabs--
set $showing_ident = 0
end
end
define gdb_show_token
printf "%p: '%s', type = ", $arg0, show_token($arg0)
output (enum token_type) ($arg0)->pos.type
printf "\n"
if (! $showing_token)
set $showing_token = 1
set $ntabs++
set $token = $arg0
if ($token->pos.type == TOKEN_IDENT)
gdb_tabs
printf "ident = "
gdb_show_ident $token.ident
end
if ($token->pos.type == TOKEN_MACRO_ARGUMENT)
gdb_tabs
printf "argnum = %d\n", $token->argnum
end
if ($token->pos.type == TOKEN_SPECIAL)
gdb_tabs
printf "special = \"%s\"\n", show_special($token.special)
end
set $ntabs--
set $showing_token = 0
end
end
# non-recursive
define gdb_show_tokens
set $t = $arg0
printf "{\n"
set $ntabs++
while ($t != &eof_token_entry)
gdb_tabs
printf "token = "
gdb_show_token($t)
set $t = ($t)->next
end
set $ntabs--
gdb_tabs
printf "}\n"
end