# Copyright (C) 2001-2020 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 # . 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: pp [any] 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: pr [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: prl [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: pt [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: pct [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: pgg [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: pgq [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: pgq [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: pge [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: pmz [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: ptc [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: pdn [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: ptn [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: pdd [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: prc [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: pi [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: pbm [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: pel [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: trt [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")