Hi,

On Fri, 24 Aug 2012, Diego Novillo wrote:

> > void foo (int bar) __attribute__((add_location_pack));
> > 
> > that directs GNU C++ to add a __Gcc_call_location_pack typed
> > argument at each call site (properly constructed of course)?
> 
> I really like this idea.
> 
> Couldn't we make it even more transparent?  If a function is marked with 
> __attribute__((add_location_pack)) (or some other attribute name), the 
> callers will always pass file, function and line as hidden arguments (in 
> the same way that 'this' is passed as a hidden argument).

Note that this is only half of the fix.  You also need a way to pass a 
given pack transparently to a callee, like in this situation:

void real_worker (int arg, location_pack *p);
void wrapme (location_pack *p)
{
  real_worker (1, p);
}

The location passed to the call of real_worker should be the one of the 
call to wrapme, not the call _in_ wrapme.  I.e. the same distinction that 
right now is served by MEM_STAT_INFO vs. PASS_MEM_STAT.

This distinction needs to be doable per call, e.g. if there are other 
functions that call real_worker that do want to pass the location of that 
call and not of their own callers:

void this_is_not_just_a_wrapper (location_pack *p)
{
  if (condition)
    real_worker (1 THIS_LOCATION);
  else
    real_worker (2 THIS_LOCATION);
  add_stats_for_me (p);
}

There are a few obvious ways how to make this distinction with various 
levels of ease of use.  E.g. function that need such location_pack could 
just be marked with the attribute (adding a new argument), i.e. as 
Richards suggestion, and the callers decide what should be passed, namely
__builtin_location (the location pack of the current source position where 
that token is mentioned), or __builtin_caller_location.  The latter would 
be usable only in functions marked as __attribute__((add_location_pack)), 
and would return the passed location pack, not the current source 
position.


Ciao,
Michael.

Reply via email to