| # 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_RESTRICT) | |
| printf "MOD_RESTRICT " | |
| end | |
| if ($arg0->modifiers & MOD_ATOMIC) | |
| printf "MOD_ATOMIC " | |
| end | |
| if ($arg0->modifiers & MOD_SIGNED) | |
| printf "MOD_SIGNED " | |
| end | |
| if ($arg0->modifiers & MOD_UNSIGNED) | |
| printf "MOD_UNSIGNED " | |
| 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_TOPLEVEL) | |
| printf "MOD_TOPLEVEL " | |
| end | |
| if ($arg0->modifiers & MOD_ASSIGNED) | |
| printf "MOD_ASSIGNED " | |
| 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 | |