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.