Would it be possible to define a new function
attribute that transparently adds two parameters
for file name and line number?  Or that etablishes
a binding between this information and existing
parameter names?  This might be useful for regular
"C" programs as well.

void do_something (T1 t1, T2 t2)
   __attribute ((caller_info (func => __FUNC__,
                              file => __FILE__,
                              line => __LINE__)));

Perhaps a compilation switch and a pre-defined macro
are necessary to meaningfully be able to code
the body of the function and/or to conditionally
enable the collection of the data.

The syntax above with the mix of parameter names
(but no types) and pre-defined macros may not make
sense, but perhaps the idea can be developed further
if there is interest.

Or maybe a builtin type?

void do_something (T1 t1, T2 t2,
                   const __builtin_caller_info_t * const caller_info)
   __attribute__ ((caller_info));

This comes at the cost of an additional pointer argument
but it can be set to NULL if collection of caller info
is disabled.  It can also be an opaque type established
via #define for configurations where either the compiler
doesn't support the feature or it is disabled.  Otherwise,
__builtin_caller_info_t might have the obvious fields
(function_name, file_name, line_number).

Off-hand, I can see how to make this work OK with default
argument values and/or over-loading in C++, but some more
work would be involved (by the programmer) to make this
work for regular "C" programs.

- Gary

Reply via email to