[patch] Unified debug dump function names.

Lawrence Crowl crowl@googlers.com
Tue Mar 26 23:50:00 GMT 2013


On 3/26/13, Lawrence Crowl <crowl@googlers.com> wrote:
> On 3/26/13, Richard Biener <richard.guenther@gmail.com> wrote:
>> On Mar 25, 2013 Lawrence Crowl <crowl@googlers.com> wrote:
>> > On 3/25/13, Richard Biener <richard.guenther@gmail.com> wrote:
>> > > You add a not used new interface.  What for?
>> >
>> > So that people can use it.
>> >
>> > > For use from gdb only?
>> >
>> > No, for use from both gdb and internally.  It is often that
>> > folks add dumps in various places while developing/debugging.
>> > These functions support that effort without having to hunt down
>> > the name.
>>
>> But having both interfaces is bad.  As you are unconditionally
>> "dumping" to stderr using debug () is correct.  Sorry that I
>> don't follow each and every proposal - nobody follows up my
>> proposals either.
>>
>> The dump_ namespace is claimed by dumping to dumpfiles and
>> diagnostics.
>>
>> > > In which case it should be debug (), not dump ().
>> >
>> > I will use whatever name you wish, but I would have preferred
>> > that we addressed naming issues when we published the plan,
>> > not after I've done the implementation.  What name do you wish?
>>
>> debug ().
>
> Okay.
>
>> And I'd like you to remove the alternate debug_ interface that
>> is obsoleted by the overloads.
>
> I'm sure that folks have the old interfaces baked into scripts and
> dot files.  I think it would should not remove the old interface
> until they have had some time to migrate.
>
>> Btw, the overloading will provide extra headache to one of the
>> most used ways to the debug_ routines:
>>
>> (gdb) call debug_tree (fndecl)
>> <function_decl 0x7ffff6e1b900 foo
>>    type <function_type 0x7ffff6d28c78
>>        type <integer_type 0x7ffff6d175e8 int public SI
>>            size <integer_cst 0x7ffff6d1a0c0 constant 32>
>>            unit size <integer_cst 0x7ffff6d1a0e0 constant 4>
>>            align 32 symtab 0 alias set -1 canonical type
>> 0x7ffff6d175e8 precision 32 min <integer_cst 0x7ffff6d1a060
>> -2147483648> max <integer_cst 0x7ffff6d1a080 2147483647>
>> ...
>> (gdb) call debug_tree (0x7ffff6d175e8)
>> Cannot resolve function debug_tree to any overloaded instance
>> (gdb) call debug_tree<tab><tab>
>> debug_tree(tree_node*)
>> debug_tree_chain(tree_node*)
>> debug_tree_chain(tree_node*)::__FUNCTION__
>> debug_tree_ssa()
>> debug_tree_ssa_stats()
>> <aha! (ok, I know this one is 'tree')>
>> (gdb) call debug_tree ((tree_node*)0x7ffff6d175e8)
>> <integer_type 0x7ffff6d175e8 int public SI
>>    size <integer_cst 0x7ffff6d1a0c0 type <integer_type 0x7ffff6d170a8
>> bitsizetype> constant 32>
>>    unit size <integer_cst 0x7ffff6d1a0e0 type <integer_type
>> 0x7ffff6d17000 sizetype> constant 4>
>>    align 32 symtab 0 alias set -1 canonical type 0x7ffff6d175e8
>> precision 32 min <integer_cst 0x7ffff6d1a060 -2147483648> max
>> <integer_cst 0x7ffff6d1a080 2147483647>
>>    pointer_to_this <pointer_type 0x7ffff6d1f2a0>>
>>
>> but with debug () having overloads to each and every thing we'd
>> ever want to debug the list of possible types I have to cast that
>> literal address I cut&pasted will be endless.
>>
>> Any suggestion on how to improve this situation?  Yes, it's already
>> bad as with typing debug_tree I know it's a tree I am interested
>> in and
>>
>> (gdb) call debug_<tab><tab>
>> ... endless list of functions and overloads ...
>>
>> is probably as useless as
>>
>> (gdb) call debug<tab><tab>
>>
>> is after your patch.
>
> I have three suggestions, in increasing order of difficulty.
>
> First, modify the dumpers to print the type cast in front of
> the hex value.  The cut and paste is just a bit wider.
>
> Second, modify the dumpers to print the access expression (which
> would then not require the hex value).  I'm not actually sure how
> well this would work in practice.  It's a thought.
>
> Third, modify gdb to have an interactive data explorer.  As a
> straw man, "explorer foo" would open up a window with all of
> foo's elements.  Each pointer is clickable and changes your view to
> its referrent.  I've used such a tool, and while it was sometimes
> at too low a level of abstraction, it was generally quite handy
> for exploring the data.  In retrospect, it would be nice to fold
> sub-objects (in the editor sense).

Patch with rename to debug attached.
Tested on x86_64.


Add uniform debug dump function names.


Add some overloaded functions that provide uniform debug dump
function names.  These names are:

  debug: the general debug dumper
  debug_verbose: for more details
  debug_raw: for the gory details
  debug_head: for the heads of declarations, e.g. function heads
  debug_body: for the bodies of declarations, e.g. function bodies

Not all types have the last four versions.

The debug functions come in two flavors, those that take pointers
to the type, and those that take references to the type.  The first
handles printing of '<nil>' for null pointers.  The second assumes
a valid reference, and prints the content.


Example uses are as follows:

  cp_token t, *p;
  debug (t);
  debug (p);

>From the debugger, use

  call debug (t)


The functions sets implemented are:

debug (only)

    basic_block_def, const bitmap_head_def, cp_binding_level,
    cp_parser, cp_token, data_reference, die_struct, edge_def,
    gimple_statement_d, ira_allocno, ira_allocno_copy, live_range,
    lra_live_range, omega_pb_d, pt_solution, const rtx_def, sreal,
    tree_live_info_d, _var_map,

    vec<cp_token, va_gc>, vec<data_reference_p>, vec<ddr_p>,
    vec<rtx>, vec<tree, va_gc>,

debug and debug_raw

    simple_bitmap_def

debug and debug_verbose

    expr_def, struct loop, vinsn_def

debug, debug_raw, debug_verbose, debug_head, debug_body

    const tree_node


This patch is somewhat different from the original plan at
gcc.gnu.org/wiki/cxx-conversion/debugging-dumps.  The reason
is that gdb has an incomplete implementation of C++ call syntax;
requiring explicit specification of template arguments and explicit
specification of function arguments even when they have default
values.  So, the original plan would have required typing

  call dump <cp_token> (t, 0, 0, stderr)

which is undesireable.  Instead instead of templates, we overload
plain functions.  This adds a small burden of manually adding
the pointer version of dump for each type.  Instead of default
function arguments, we simply assume the default values.  Most of
the underlying dump functions did not use the options and indent
parameters anyway.  Several provide FILE* parameters, but we expect
debugging to use stderr anyway.  So, the explicit specification of
arguments was not as valuable as we thought initially.  Finally,
a change of name from dump to debug reflect the implicit output
to stderr.


Index: gcc/cp/ChangeLog

2013-03-26  Lawrence Crowl  <crowl@google.com>

	* Make-lang.in
	(CXX_PARSER_H): Add header dependence.
	* cp-tree.h
	(extern debug (cp_binding_level &)): New.
	(extern debug (cp_binding_level *)): New.
	* name-lookup.h
	(debug (cp_binding_level &)): New.
	(debug (cp_binding_level *)): New.
	* parser.c
	(debug (cp_parser &)): New.
	(debug (cp_parser *)): New.
	(debug (cp_token &)): New.
	(debug (cp_token *)): New.
	(debug (vec<cp_token, va_gc> &)): New.
	(debug (vec<cp_token, va_gc> *)): New.
	* parser.c: Add header dependence.
	(extern debug (cp_parser &)): New.
	(extern debug (cp_parser *)): New.
	(extern debug (cp_token &)): New.
	(extern debug (cp_token *)): New.
	(extern debug (vec<cp_token, va_gc> &)): New.
	(extern debug (vec<cp_token, va_gc> *)): New.

Index: gcc/ChangeLog

2013-03-26  Lawrence Crowl  <crowl@google.com>

	* Makefile.in: Add several missing include dependences.
	(DUMPFILE_H): New.
	(test-dump.o): New.  This object is not added to any executable,
	but is present for ad-hoc testing.
	* bitmap.c
	(debug (const bitmap_head_def &)): New.
	(debug (const bitmap_head_def *)): New.
	* bitmap.h
	(extern debug (const bitmap_head_def &)): New.
	(extern debug (const bitmap_head_def *)): New.
	* cfg.c
	(debug (edge_def &)): New.
	(debug (edge_def *)): New.
	* cfghooks.c
	(debug (basic_block_def &)): New.
	(debug (basic_block_def *)): New.
	* dumpfile.h
	(dump_node (const_tree, int, FILE *)): Correct source file.
	* dwarf2out.c
	(debug (die_struct &)): New.
	(debug (die_struct *)): New.
	* dwarf2out.h
	(extern debug (die_struct &)): New.
	(extern debug (die_struct *)): New.
	* gimple-pretty-print.c
	(debug (gimple_statement_d &)): New.
	(debug (gimple_statement_d *)): New.
	* gimple-pretty-print.h
	(extern debug (gimple_statement_d &)): New.
	(extern debug (gimple_statement_d *)): New.
	* ira-build.c
	(debug (ira_allocno_copy &)): New.
	(debug (ira_allocno_copy *)): New.
	(debug (ira_allocno &)): New.
	(debug (ira_allocno *)): New.
	* ira-int.h
	(extern debug (ira_allocno_copy &)): New.
	(extern debug (ira_allocno_copy *)): New.
	(extern debug (ira_allocno &)): New.
	(extern debug (ira_allocno *)): New.
	* ira-lives.c
	(debug (live_range &)): New.
	(debug (live_range *)): New.
	* lra-int.h
	(debug (lra_live_range &)): New.
	(debug (lra_live_range *)): New.
	* lra-lives.c
	(debug (lra_live_range &)): New.
	(debug (lra_live_range *)): New.
	* omega.c
	(debug (omega_pb_d &)): New.
	(debug (omega_pb_d *)): New.
	* omega.h
	(extern debug (omega_pb_d &)): New.
	(extern debug (omega_pb_d *)): New.
	* print-rtl.c
	(debug (const rtx_def &)): New.
	(debug (const rtx_def *)): New.
	* print-tree.c
	(debug_tree (tree): Move within file.
	(debug_raw (const tree_node &)): New.
	(debug_raw (const tree_node *)): New.
	(dump_tree_via_hooks (const tree_node *, int)): New.
	(debug (const tree_node &)): New.
	(debug (const tree_node *)): New.
	(debug_verbose (const tree_node &)): New.
	(debug_verbose (const tree_node *)): New.
	(debug_head (const tree_node &)): New.
	(debug_head (const tree_node *)): New.
	(debug_body (const tree_node &)): New.
	(debug_body (const tree_node *)): New.
	(debug_vec_tree (tree): Move and reimplement in terms of dump.
	(debug (vec<tree, va_gc> &)): New.
	(debug (vec<tree, va_gc> *)): New.
	* rtl.h
	(extern debug (const rtx_def &)): New.
	(extern debug (const rtx_def *)): New.
	* sbitmap.c
	(debug_raw (simple_bitmap_def &)): New.
	(debug_raw (simple_bitmap_def *)): New.
	(debug (simple_bitmap_def &)): New.
	(debug (simple_bitmap_def *)): New.
	* sbitmap.h
	(extern debug (simple_bitmap_def &)): New.
	(extern debug (simple_bitmap_def *)): New.
	(extern debug_raw (simple_bitmap_def &)): New.
	(extern debug_raw (simple_bitmap_def *)): New.
	* sel-sched-dump.c
	(debug (vinsn_def &)): New.
	(debug (vinsn_def *)): New.
	(debug_verbose (vinsn_def &)): New.
	(debug_verbose (vinsn_def *)): New.
	(debug (expr_def &)): New.
	(debug (expr_def *)): New.
	(debug_verbose (expr_def &)): New.
	(debug_verbose (expr_def *)): New.
	(debug (vec<rtx> &)): New.
	(debug (vec<rtx> *)): New.
	* sel-sched-dump.h
	(extern debug (vinsn_def &)): New.
	(extern debug (vinsn_def *)): New.
	(extern debug_verbose (vinsn_def &)): New.
	(extern debug_verbose (vinsn_def *)): New.
	(extern debug (expr_def &)): New.
	(extern debug (expr_def *)): New.
	(extern debug_verbose (expr_def &)): New.
	(extern debug_verbose (expr_def *)): New.
	(extern debug (vec<rtx> &)): New.
	(extern debug (vec<rtx> *)): New.
	* sel-sched-ir.h
	(_list_iter_cond_expr): Make inline instead of static.
	* sreal.c
	(debug (sreal &)): New.
	(debug (sreal *)): New.
	* sreal.h
	(extern debug (sreal &)): New.
	(extern debug (sreal *)): New.
	* tree.h
	(extern debug_raw (const tree_node &)): New.
	(extern debug_raw (const tree_node *)): New.
	(extern debug (const tree_node &)): New.
	(extern debug (const tree_node *)): New.
	(extern debug_verbose (const tree_node &)): New.
	(extern debug_verbose (const tree_node *)): New.
	(extern debug_head (const tree_node &)): New.
	(extern debug_head (const tree_node *)): New.
	(extern debug_body (const tree_node &)): New.
	(extern debug_body (const tree_node *)): New.
	(extern debug (vec<tree, va_gc> &)): New.
	(extern debug (vec<tree, va_gc> *)): New.
	* tree-cfg.c
	(debug (struct loop &)): New.
	(debug (struct loop *)): New.
	(debug_verbose (struct loop &)): New.
	(debug_verbose (struct loop *)): New.
	* tree-dump.c: Add header dependence.
	* tree-flow.h
	(extern debug (struct loop &)): New.
	(extern debug (struct loop *)): New.
	(extern debug_verbose (struct loop &)): New.
	(extern debug_verbose (struct loop *)): New.
	* tree-data-ref.c
	(debug (data_reference &)): New.
	(debug (data_reference *)): New.
	(debug (vec<data_reference_p> &)): New.
	(debug (vec<data_reference_p> *)): New.
	(debug (vec<ddr_p> &)): New.
	(debug (vec<ddr_p> *)): New.
	* tree-data-ref.h
	(extern debug (data_reference &)): New.
	(extern debug (data_reference *)): New.
	(extern debug (vec<data_reference_p> &)): New.
	(extern debug (vec<data_reference_p> *)): New.
	(extern debug (vec<ddr_p> &)): New.
	(extern debug (vec<ddr_p> *)): New.
	* tree-ssa-alias.c
	(debug (pt_solution &)): New.
	(debug (pt_solution *)): New.
	* tree-ssa-alias.h
	(extern debug (pt_solution &)): New.
	(extern debug (pt_solution *)): New.
	* tree-ssa-alias.c
	(debug (_var_map &)): New.
	(debug (_var_map *)): New.
	(debug (tree_live_info_d &)): New.
	(debug (tree_live_info_d *)): New.
	* tree-ssa-alias.h
	(extern debug (_var_map &)): New.
	(extern debug (_var_map *)): New.
	(extern debug (tree_live_info_d &)): New.
	(extern debug (tree_live_info_d *)): New.


-- 
Lawrence Crowl
-------------- next part --------------
A non-text attachment was scrubbed...
Name: patch.gz
Type: application/x-gzip
Size: 14374 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20130326/689aeca0/attachment.bin>


More information about the Gcc-patches mailing list