This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH 00/19] cleanup of memory stats prototypes
- From: Richard Biener <richard dot guenther at gmail dot com>
- To: Martin Sebor <msebor at gmail dot com>
- Cc: Trevor Saunders <tbsaunde at tbsaunde dot org>, tbsaunde+gcc at tbsaunde dot org, GCC Patches <gcc-patches at gcc dot gnu dot org>
- Date: Tue, 1 Aug 2017 11:05:48 +0200
- Subject: Re: [PATCH 00/19] cleanup of memory stats prototypes
- Authentication-results: sourceware.org; auth=none
- References: <20170727083026.23716-1-tbsaunde+gcc@tbsaunde.org> <b60182c3-5f90-63f3-98e7-33356f352f28@gmail.com> <20170731213414.5zvuz3322xrjsc2w@ball> <4fa224c2-e427-0fdb-99ba-a55cbf2dab59@gmail.com> <20170731231126.ma3hfycyurf7s67r@ball> <9894e2eb-cd37-4930-80c3-4acd38f722ef@gmail.com>
On Tue, Aug 1, 2017 at 2:11 AM, Martin Sebor <msebor@gmail.com> wrote:
> On 07/31/2017 05:11 PM, Trevor Saunders wrote:
>>
>> On Mon, Jul 31, 2017 at 04:58:15PM -0600, Martin Sebor wrote:
>>>
>>> On 07/31/2017 03:34 PM, Trevor Saunders wrote:
>>>>
>>>> On Mon, Jul 31, 2017 at 02:56:40PM -0600, Martin Sebor wrote:
>>>>>
>>>>> On 07/27/2017 02:30 AM, tbsaunde+gcc@tbsaunde.org wrote:
>>>>>>
>>>>>> From: Trevor Saunders <tbsaunde+gcc@tbsaunde.org>
>>>>>>
>>>>>> The preC++ way of passing information about the call site of a
>>>>>> function was to
>>>>>> use a macro that passed __file__, __LINE__, and __FUNCTION__ to a
>>>>>> function with
>>>>>> the same name with _stat appended to it. The way this is now done
>>>>>> with C++ is
>>>>>> to have arguments where the default value is __LINE__, __FILE__, and
>>>>>> __FUNCTION__ in the caller. This has the significant advantage that
>>>>>> if you
>>>>>> look for "^function (" you find the correct function, where in the C
>>>>>> way of
>>>>>> doing things you need to realize its a macro and check the definition
>>>>>> of the
>>>>>> macro to see what to look for next. So this removes a layer of
>>>>>> indirection,
>>>>>> and makes things somewhat more consistant in using the C++ way of
>>>>>> doing things.
>>>>>
>>>>>
>>>>> So that's what these things are for! :)
>>>>>
>>>>> I must be missing something either about the macros or about your
>>>>> changes. The way I read the changes it seems that it's no longer
>>>>> possible to call, say,
>>>>>
>>>>> t = make_node (code);
>>>>>
>>>>> and have __FILE__, __LINE__, and __FUNCTION__ passed as arguments
>>>>> behind the scenes.
>>>>>
>>>>> Instead, to achieve that, make_node has to be called like so
>>>>>
>>>>> t = make_node (code PASS_MEM_STAT);
>>>>>
>>>>> Otherwise calling make_node() with just one argument will end up
>>>>> calling it with the defaults.
>>>>
>>>>
>>>> calling it with the defaults will do the same thing the macro used to
>>>> do, so its fine unless you want to pass in a location that you got as an
>>>> argument.
>>>
>>>
>>> Sorry, I'm still not sure I understand. Please bear with me
>>> if I'm just being slow.
>>>
>>> When GATHER_STATISTICS is defined, make_node_stat is declared
>>> like so in current GCC (without your patch):
>>>
>>> extern tree
>>> make_node_stat (enum tree_code , const char * _loc_name,
>>> int _loc_line, const char * _loc_function);
>>>
>>> and the make_node macro like so:
>>>
>>> #define make_node(t) make_node_stat (t MEM_STAT_INFO)
>>>
>>> with MEM_STAT_INFO being defined as follows:
>>>
>>> #define MEM_STAT_INFO , ALONE_MEM_STAT_INFO
>>> #define ALONE_MEM_STAT_INFO __FILE__, __LINE__, __FUNCTION__
>>>
>>> So a call to
>>>
>>> t = make_node (code);
>>>
>>> expands to
>>>
>>> t = make_node_stat (code, __FILE__, __LINE__, __FUNCTION__);
>>>
>>> If I'm reading your patch correctly (please correct me if/where
>>> I'm not) then it treats the same call as just an ordinary call
>>> to the make_node function with no macro expansion taking place
>>> at the call site. I.e., it will be made with the _loc_name,
>>> _loc_line, and _loc_function arguments set to whatever their
>>> defaults are where the function is declared. To have the call
>>> do the same thing as before it will have to be made with explicit
>>> arguments, e.g., like so:
>>>
>>> t = make_node (code MEM_STAT_INFO);
>>>
>>> That seems like a (significant) difference.
>>>
>>>> I'm guessing you are missing that the functions when used as the default
>>>> argument provide the location of the call site of the function, not the
>>>> location of the prototype. Which is not the most obvious thing.
>>>
>>>
>>> I am indeed missing that. How do/can they do that when that's
>>> not how C++ 98 default arguments work? (It's only possible with
>>> GCC's __builtin_{FILE,LINE,FUNCTION} but not without these
>>> extensions.)
>>
>>
>> They use the extensions if available, and otherwise provide the wrong
>> values. However that's fine because this is just for profiling gcc
>> itself so demanding you use gcc 4.8 or greater, or bootstrap the
>> compiler you are going to profile isn't a big deal.
>
>
> Ah, okay, thanks for your patience with me. I didn't realize
> some language features/extensions get enabled as GCC bootstraps.
>
>>
>> perhaps we should just make --enable-gather-detailed-mem-statss require
>> a recent gcc instead of supporting it but providing bad data for some
>> things?
My plan was to remove the fallback (so you'd get no data). But yes,
a configure test for the extension would work as well of course.
Note it only affects non-bootstrapped builds or stage1 so the configure
test would be a bit tricky?
Of course I never use mem-stats for a bootstrapped compiler.
Richard.
>
> That would make sense to me. Either that, or documenting this
> caveat as a known limitation somewhere users of the option will
> notice (or both).
>
> Martin