| # Copyright (C) 2001-2022 Free Software Foundation, Inc. |
| # |
| # This file is part of GCC. |
| # |
| # GCC is free software; you can redistribute it and/or modify |
| # it under the terms of the GNU General Public License as published by |
| # the Free Software Foundation; either version 3, or (at your option) |
| # any later version. |
| # |
| # GCC is distributed in the hope that it will be useful, |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| # GNU General Public License for more details. |
| # |
| # You should have received a copy of the GNU General Public License |
| # along with GCC; see the file COPYING3. If not see |
| # <http://www.gnu.org/licenses/>. |
| |
| define help-gcc-hooks |
| help help-gcc-hooks |
| end |
| |
| document help-gcc-hooks |
| GCC gdbinit file introduces several debugging shorthands: |
| |
| pr [rtx], prl [rtx], prc [rtx], pi [rtx_insn], |
| pt [tree], pct [tree], ptc [tree], trt [tree], |
| pgs [tree], pge [tree], pdn [tree], ptn [tree], |
| pgg [gimple], pgq [gimple_seq], |
| pmz [mpz_t], |
| pdd [dw_die_ref], |
| pbm [bitmap], |
| pel [location_t], |
| pp, pbs, pcfun |
| |
| They are generally implemented by calling a function that prints to stderr, |
| and therefore will not work when the compiler is not executing. |
| |
| Most shorthands accept an optional argument. When it is not supplied, |
| they use value in GDB register $, i.e. the last printed value. |
| end |
| |
| define pp |
| eval "set $debug_arg = $%s", $argc ? "arg0" : "" |
| call debug ($debug_arg) |
| end |
| |
| document pp |
| GCC hook: debug (<multiple overloads>) |
| Print a representation of any GCC data structure for which an instance of |
| overloaded function 'debug' is available. |
| See also 'help-gcc-hooks'. |
| end |
| |
| define pr |
| eval "set $debug_arg = $%s", $argc ? "arg0" : "" |
| call debug_rtx ($debug_arg) |
| end |
| |
| document pr |
| GCC hook: debug_rtx (rtx) |
| Print the full structure of given rtx. |
| See also 'help-gcc-hooks'. |
| end |
| |
| define prl |
| eval "set $debug_arg = $%s", $argc ? "arg0" : "" |
| call debug_rtx_list ($debug_arg, debug_rtx_count) |
| end |
| |
| document prl |
| GCC hook: debug_rtx_list (rtx) |
| Print the full structure of all rtx insns beginning at given rtx. |
| Uses variable debug_rtx_count to control number of insns printed: |
| debug_rtx_count > 0: print from given rtx on. |
| debug_rtx_count < 0: print a window around given rtx. |
| |
| There is also debug_rtx_find (rtx, uid) that will scan a list for UID and print |
| it using debug_rtx_list. Usage example: set $foo=debug_rtx_find(first, 42) |
| end |
| |
| define pt |
| eval "set $debug_arg = $%s", $argc ? "arg0" : "" |
| call debug_tree ($debug_arg) |
| end |
| |
| document pt |
| GCC hook: debug_tree (tree) |
| Print the full structure of given tree. |
| See also 'help-gcc-hooks'. |
| end |
| |
| define pct |
| eval "set $debug_arg = $%s", $argc ? "arg0" : "" |
| call debug_c_tree ($debug_arg) |
| end |
| |
| document pct |
| GCC hook: debug_c_tree (tree) |
| Print given tree in C syntax. |
| See also 'help-gcc-hooks'. |
| end |
| |
| define pgg |
| eval "set $debug_arg = $%s", $argc ? "arg0" : "" |
| call debug_gimple_stmt ($debug_arg) |
| end |
| |
| document pgg |
| GCC hook: debug_gimple_stmt (gimple) |
| Print given GIMPLE statement in C syntax. |
| See also 'help-gcc-hooks'. |
| end |
| |
| define pgq |
| eval "set $debug_arg = $%s", $argc ? "arg0" : "" |
| call debug_gimple_seq ($debug_arg) |
| end |
| |
| document pgq |
| GCC hook: debug_gimple_seq (gimple_seq) |
| Print given GIMPLE sequence in C syntax. |
| See also 'help-gcc-hooks'. |
| end |
| |
| define pgs |
| eval "set $debug_arg = $%s", $argc ? "arg0" : "" |
| call debug_generic_stmt ($debug_arg) |
| end |
| |
| document pgs |
| GCC hook: debug_generic_stmt (tree) |
| Print given GENERIC statement in C syntax. |
| See also 'help-gcc-hooks'. |
| end |
| |
| define pge |
| eval "set $debug_arg = $%s", $argc ? "arg0" : "" |
| call debug_generic_expr ($debug_arg) |
| end |
| |
| document pge |
| GCC hook: debug_generic_expr (tree) |
| Print given GENERIC expression in C syntax. |
| See also 'help-gcc-hooks'. |
| end |
| |
| define pmz |
| eval "set $debug_arg = $%s", $argc ? "arg0" : "" |
| call mpz_out_str(stderr, 10, $debug_arg) |
| end |
| |
| document pmz |
| GCC hook: mpz_out_str (mpz_t) |
| Print given mpz value. |
| See also 'help-gcc-hooks'. |
| end |
| |
| define ptc |
| eval "set $debug_arg = $%s", $argc ? "arg0" : "" |
| output (enum tree_code) $debug_arg.base.code |
| echo \n |
| end |
| |
| document ptc |
| GCC hook: TREE_CODE (tree) |
| Print the tree-code of given tree node. |
| See also 'help-gcc-hooks'. |
| end |
| |
| define pdn |
| eval "set $debug_arg = $%s", $argc ? "arg0" : "" |
| output $debug_arg.decl_minimal.name->identifier.id.str |
| echo \n |
| end |
| |
| document pdn |
| GCC hook: IDENTIFIER_POINTER (DECL_NAME (tree)) |
| Print the name of given decl-node. |
| See also 'help-gcc-hooks'. |
| end |
| |
| define ptn |
| eval "set $debug_arg = $%s", $argc ? "arg0" : "" |
| output $debug_arg.type.name->decl_minimal.name->identifier.id.str |
| echo \n |
| end |
| |
| document ptn |
| GCC hook: IDENTIFIER_POINTER (DECL_NAME (TREE_TYPE (tree))) |
| Print the name of given type-node. |
| See also 'help-gcc-hooks'. |
| end |
| |
| define pdd |
| eval "set $debug_arg = $%s", $argc ? "arg0" : "" |
| call debug_dwarf_die ($debug_arg) |
| end |
| |
| document pdd |
| GCC hook: debug_dwarf_die (dw_die_ref) |
| Print given dw_die_ref. |
| See also 'help-gcc-hooks'. |
| end |
| |
| define prc |
| eval "set $debug_arg = $%s", $argc ? "arg0" : "" |
| output (enum rtx_code) $debug_arg.code |
| echo \ ( |
| output $debug_arg.mode |
| echo )\n |
| end |
| |
| document prc |
| GCC hook: GET_CODE (rtx) |
| Print the rtx-code and machine mode of given rtx. |
| See also 'help-gcc-hooks'. |
| end |
| |
| define pi |
| eval "set $debug_arg = $%s", $argc ? "arg0" : "" |
| print $debug_arg.u.fld[0].rt_rtx@7 |
| end |
| |
| document pi |
| GCC hook: X0EXP (rtx_insn) |
| Print the fields of given RTL instruction. |
| See also 'help-gcc-hooks'. |
| end |
| |
| define pbs |
| call print_binding_stack () |
| end |
| |
| document pbs |
| In cc1plus, print the current binding stack, frame by frame, up to and |
| including the global binding level. |
| end |
| |
| define pbm |
| eval "set $debug_arg = $%s", $argc ? "arg0" : "" |
| call bitmap_print (stderr, $debug_arg, "", "\n") |
| end |
| |
| document pbm |
| GCC hook: bitmap_print (bitmap) |
| Dump given bitmap as a comma-separated list of numbers. |
| See also 'help-gcc-hooks'. |
| end |
| |
| define pel |
| eval "set $debug_arg = $%s", $argc ? "arg0" : "" |
| output expand_location ($debug_arg) |
| echo \n |
| end |
| |
| document pel |
| GCC hook: expand_location (location_t) |
| Print given location. |
| See also 'help-gcc-hooks'. |
| end |
| |
| define pcfun |
| output debug_function (cfun ? cfun->decl : current_function_decl, 0) |
| echo \n |
| end |
| |
| document pcfun |
| Print current function. |
| end |
| |
| define trt |
| eval "set $debug_arg = $%s", $argc ? "arg0" : "" |
| print ($debug_arg.typed.type) |
| end |
| |
| document trt |
| GCC hook: TREE_TYPE (tree) |
| Print TREE_TYPE of given tree node. |
| See also 'help-gcc-hooks'. |
| end |
| |
| define break-on-diagnostic |
| break diagnostic_show_locus |
| end |
| |
| document break-on-diagnostic |
| Put a breakpoint on diagnostic_show_locus, called whenever a diagnostic |
| is emitted (as opposed to those warnings that are suppressed by |
| command-line options). |
| end |
| |
| define break-on-saved-diagnostic |
| break ana::diagnostic_manager::add_diagnostic |
| end |
| |
| document break-on-saved-diagnostic |
| Put a breakpoint on ana::diagnostic_manager::add_diagnostic, called within |
| the analyzer whenever a diagnostic is saved for later de-duplication and |
| possible emission. |
| end |
| |
| define reload-gdbhooks |
| python import imp; imp.reload(gdbhooks) |
| end |
| |
| document reload-gdbhooks |
| Load the gdbhooks.py module again in order to pick up any changes made to it. |
| end |
| |
| alias rh = reload-gdbhooks |
| |
| # Define some macros helpful to gdb when it is expanding macros. |
| macro define __FILE__ "gdb" |
| macro define __LINE__ 1 |
| macro define __FUNCTION__ "gdb" |
| macro define __null 0 |
| macro define input_line expand_location(input_location).line |
| macro define input_filename expand_location(input_location).file |
| |
| # Remember previous pagination status and turn it off, so that |
| # the messages for skip commands don't require pagination. |
| python __gcc_prev_pagination=gdb.parameter("pagination") |
| set pagination off |
| |
| # Gracefully handle aborts in functions used from gdb. |
| set unwindonsignal on |
| |
| # Put breakpoints at exit and fancy_abort in case abort is mapped |
| # to either fprintf/exit or fancy_abort. |
| b fancy_abort |
| |
| # Put a breakpoint on internal_error to help with debugging ICEs. |
| b internal_error |
| |
| set complaints 0 |
| # Don't let abort actually run, as it will make |
| # stdio stop working and therefore the `pr' command above as well. |
| # Put this last because gcc does not reference it any more unless |
| # USE_SYSTEM_ABORT is defined, so gdb may complain and bail out. |
| b exit |
| b abort |
| |
| # Disable strict type checking. This allows developers to (for example) |
| # make inferior calls without casting absolute address to a suitable |
| # pointer type. |
| set check type off |
| |
| # Skip all inline functions in tree.h. |
| # These are used in accessor macros. |
| # Note that this is added at the end because older gdb versions |
| # do not understand the 'skip' command. |
| # See https://sourceware.org/gdb/current/onlinedocs/gdb/Skipping-Over-Functions-and-Files.html |
| skip file tree.h |
| |
| # Also skip inline functions in is-a.h. |
| skip file is-a.h |
| |
| # And line-map.h. |
| skip file line-map.h |
| |
| # And timevar.h. |
| skip file timevar.h |
| |
| # Likewise, skip various inline functions in rtl.h. |
| skip rtx_expr_list::next |
| skip rtx_expr_list::element |
| skip rtx_insn_list::next |
| skip rtx_insn_list::insn |
| skip rtx_sequence::len |
| skip rtx_sequence::element |
| skip rtx_sequence::insn |
| skip INSN_UID |
| skip PREV_INSN |
| skip SET_PREV_INSN |
| skip NEXT_INSN |
| skip SET_NEXT_INSN |
| skip BLOCK_FOR_INSN |
| skip PATTERN |
| skip INSN_LOCATION |
| skip INSN_HAS_LOCATION |
| skip JUMP_LABEL_AS_INSN |
| |
| # Restore pagination to the previous state. |
| python if __gcc_prev_pagination: gdb.execute("set pagination on") |