On Wed, Mar 27, 2013 at 5:15 PM, Lawrence Crowl <cr...@googlers.com> wrote:
> On 3/27/13, Richard Biener <richard.guent...@gmail.com> wrote:
>> On Mar 27, 2013, Lawrence Crowl <cr...@googlers.com> wrote:
>>> 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.
>>
>> Note that generally modules should provide a
>>
>>  print_FOO (FILE *, FOO *...)
>>
>> interface which should be the worker for the dump_* interface
>> which prints to dumpfiles (and stdout/stderr with -fopt-info) and
>> the debug_* interface (which just prints to stderr).
>
> I'm not sure what you're saying here.  I haven't been adding new
> underlying functionality.  If there are missing print_FOO functions,
> shouldn't they be a separate work item?

Sure.  I just wanted to mention naming / semantics convention where
you mentioned FILE parameters.

>>> Finally, a change of name from dump to debug reflect the implicit
>>> output to stderr.
>>
>> A few more questions.  As we are now using C++ and these
>> functions are not called by GCC itself - do we really need
>> all the extern declarations in the header files?  We don't have
>> -Wstrict-prototypes issues with C++ and I do not consider the debug
>> () interface part of the public API of a module.  This avoids
>> people ending up calling debug () from inside GCC.
>
> We don't need the extern declarations for gdb, but I've written
> temporary calls to debug into the source code while I was developing.
> It would be handy to not have to add declarations simultaneously.
> Your call.

Ah, I see.  I have no strong preference here.

>> +  if (ptr)
>> +    debug (*ptr);
>> +  else
>> +    fprintf (stderr, "<nil>\n");
>>
>> can we avoid repeating this using a common helper?  I'd use a simple
>> #define like
>>
>> #define DO_DEBUG_PTR(p) do { if (p) debug (*(p)) else fprintf (stderr,
>> "<nil>\n"); } while (0)
>>
>> but I suppose you can come up with something more clever using C++?
>
> I had a template that did this for us in my earlier code.  I removed
> the template when I discovered the gdb issue.  One advantage to
> removing the template was that I no longer needed a common header and
> its inclusion in various files.  Adding the macro would reintroduce
> the header.
>
> My personal preference is to avoid the macros and just live with the
> repeated pattern.

Ok, fine with me - I just wanted to double-check.

The patch is ok as-is.

Richard.

> --
> Lawrence Crowl

Reply via email to