On 07/20/16 18:20, Jeff Law wrote:
> On 07/20/2016 09:41 AM, Bernd Edlinger wrote:
>> On 07/20/16 12:44, Richard Biener wrote:
>>> On Tue, 19 Jul 2016, Bernd Edlinger wrote:
>>>
>>>> Hi!
>>>>
>>>> As discussed at https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71876,
>>>> we have a _very_ old hack in gcc, that recognizes certain functions by
>>>> name, and inserts in some cases unsafe attributes, that don't work for
>>>> a freestanding environment.
>>>>
>>>> It is unsafe to return ECF_MAY_BE_ALLOCA, ECF_LEAF and ECF_NORETURN
>>>> from special_function_p, just by the name of the function, especially
>>>> for less well known functions, like "getcontext" or "savectx", which
>>>> could easily used for something completely different.
>>>
>>> Returning ECF_MAY_BE_ALLOCA is safe.  Just wanted to mention this,
>>> regardless of the followups you already received.
>>
>>
>> I dont think so.
>>
>>
>> Consider this example:
>>
>> cat test.cc
>> //extern "C"
>> void *alloca(unsigned long);
>> void bar(unsigned long n)
>> {
>>    char *x = (char*) alloca(n);
>>    if (x)
>>      *x = 0;
>> }
>>
>> g++ -O3 -S test.cc
>>
>> result:
>>
>> _Z3barm:
>> .LFB0:
>>     .cfi_startproc
>>     pushq    %rbp
>>     .cfi_def_cfa_offset 16
>>     .cfi_offset 6, -16
>>     movq    %rsp, %rbp
>>     .cfi_def_cfa_register 6
>>     call    _Z6allocam
>>     movb    $0, (%rax)
>>     leave
>>     .cfi_def_cfa 7, 8
>>     ret
>>
>> So we call a C++ function with name alloca, but because
>> special_function_p adds ECF_MAY_BE_ALLOCA, the null-pointer
>> check is eliminated, but it is not the builtin alloca,
>> but for the C++ front end it is a pretty normal function.
> Clearly if something "may be alloca", then the properties on the
> arguments/return values & side effects that are specific to alloca can
> not be relied upon.  That to me seems like a bug elsewhere in the
> compiler independent of the changes you're trying to make.
>


Yes. That is another interesting observation.  I think, originally this
flag was introduced by Jan Hubicka, and should mean, "it may be alloca
or a weak alias to alloca or maybe even something different".
But some of the later optimizations use it in a way as if it meant
"it must be alloca".  However I have not been able to come up with
a test case that makes this assumption false, but I probably just
did not try hard enough.

But I think that alloca just should not be recognized by name any
more.

>
>
> Jeff
>

Reply via email to