Hi Kewen,

On 10/11/21 1:30 AM, Kewen.Lin wrote:
> Hi Segher,
>
> Thanks for the comments.
>
> on 2021/10/1 上午6:13, Segher Boessenkool wrote:
>> Hi!
>>
>> On Thu, Sep 30, 2021 at 11:06:50AM +0800, Kewen.Lin wrote:
>>
>> [ huge snip ]
>>
>>> Based on the understanding and testing, I think it's safe to adopt this 
>>> patch.
>>> Do both Peter and you agree the rs6000_expand_builtin will catch the 
>>> invalid built-in?
>>> Is there some special case which probably escapes out?
>> The function rs6000_builtin_decl has a terribly generic name.  Where all
>> is it called from?  Do all such places allow the change in semantics?
>> Do any comments or other documentation need to change?  Is the function
>> name still good?
>
> % grep -rE "\<builtin_decl\> \(" .
> ./gcc/config/avr/avr-c.c:      fold = targetm.builtin_decl (id, true);
> ./gcc/config/avr/avr-c.c:      fold = targetm.builtin_decl (id, true);
> ./gcc/config/avr/avr-c.c:      fold = targetm.builtin_decl (id, true);
> ./gcc/config/aarch64/aarch64.c:      return aarch64_sve::builtin_decl 
> (subcode, initialize_p);
> ./gcc/config/aarch64/aarch64-protos.h:  tree builtin_decl (unsigned, bool);
> ./gcc/config/aarch64/aarch64-sve-builtins.cc:builtin_decl (unsigned int code, 
> bool)
> ./gcc/tree-streamer-in.c:          tree result = targetm.builtin_decl (fcode, 
> true);
>
> % grep -rE "\<rs6000_builtin_decl\> \(" .
> ./gcc/config/rs6000/rs6000-c.c:           if (rs6000_builtin_decl 
> (instance->bifid, false) != error_mark_node
> ./gcc/config/rs6000/rs6000-c.c:           if (rs6000_builtin_decl 
> (instance->bifid, false) != error_mark_node
> ./gcc/config/rs6000/rs6000-c.c:           if (rs6000_builtin_decl 
> (instance->bifid, false) != error_mark_node
> ./gcc/config/rs6000/rs6000-gen-builtins.c:       "extern tree 
> rs6000_builtin_decl (unsigned, "
> ./gcc/config/rs6000/rs6000-call.c:rs6000_builtin_decl (unsigned code, bool 
> initialize_p ATTRIBUTE_UNUSED)
> ./gcc/config/rs6000/rs6000-internal.h:extern tree rs6000_builtin_decl 
> (unsigned code,
>
> As above, the call sites are mainly in
>   1) function unpack_ts_function_decl_value_fields in gcc/tree-streamer-in.c
>   2) function altivec_resolve_new_overloaded_builtin in 
> gcc/config/rs6000/rs6000-c.c
>
> 2) is newly introduced by Bill's bif rewriting patch series, all uses in it 
> are
> along with rs6000_new_builtin_is_supported which adopts a new way to check bif
> supported or not (the old rs6000_builtin_is_supported_p uses builtin mask), so
> I think the builtin mask checking is useless (unexpected?) for these uses.

Things are a bit confused because we are part way through the patch series.
rs6000_builtin_decl will be changed to redirect to rs6000_new_builtin_decl when
using the new builtin support.  That function will be:

static tree
rs6000_new_builtin_decl (unsigned code, bool initialize_p ATTRIBUTE_UNUSED)
{
  rs6000_gen_builtins fcode = (rs6000_gen_builtins) code;

  if (fcode >= RS6000_OVLD_MAX)
    return error_mark_node;

  if (!rs6000_new_builtin_is_supported (fcode))
    {
      rs6000_invalid_new_builtin (fcode);
      return error_mark_node;
    }

  return rs6000_builtin_decls_x[code];
}

So, as you surmise, this will be using the new method of testing for builtin 
validity.
You can ignore the rs6000-c.c and rs6000-gen-builtins.c references of 
rs6000_builtin_decl
for purposes of fixing the existing way of doing things.

>
> Besides, the description for this hook:
>
> "tree TARGET_BUILTIN_DECL (unsigned code, bool initialize_p) [Target Hook]
> Define this hook if you have any machine-specific built-in functions that 
> need to be
> defined. It should be a function that returns the builtin function 
> declaration for the
> builtin function code code. If there is no such builtin and it cannot be 
> initialized at
> this time if initialize p is true the function should return NULL_TREE. If 
> code is out
> of range the function should return error_mark_node."
>
> It would only return error_mark_node when the code is out of range.  The 
> current
> rs6000_builtin_decl returns error_mark_node not only for "out of range", it 
> looks
> inconsistent and this patch also revise it.
>
> The hook was introduced by commit e9e4b3a892d0d19418f23bb17bdeac33f9a8bfd2,
> it meant to ensure the bif function_decl is valid (check if bif code in the
> range and the corresponding entry in bif table is not NULL).  May be better
> with name check_and_get_builtin_decl?  CC Richi, he may have more insights.
>
>>> By the way, I tested the bif rewriting patch series V5, it couldn't make 
>>> the original
>>> case in PR (S5) pass, I may miss something or the used series isn't 
>>> up-to-date.  Could
>>> you help to have a try?  I agree with Peter, if the rewriting can fix this 
>>> issue, then
>>> we don't need this patch for trunk any more, I'm happy to abandon this.  :)
>> (Mail lines are 70 or so chars max, so that they can be quoted a few
>> levels).
>>
> ah, OK, thanks.  :)
>
>> If we do need a band-aid for 10 and 11 (and we do as far as I can see),
>> I'd like to see one for just MMA there, and let all other badness fade
>> into history.  Unless you can convince me (in the patch / commit
>> message) that this is safe :-)
> Just to fix for MMA seems incomplete to me since we can simply
> construct one non-MMA but failed case.  I questioned in the other
> thread, is there any possibility for one invalid target specific
> bif to escape from the function rs6000_expand_builtin?  (note that
> folding won't handle invalid bifs, so invalid bifs won't get folded
> early.)  If no, I think it would be safe.

Yes, looking at what you wrote in the other thread about your investigations
with -DEXPECT_ERROR, the existing rs6000_expand_builtin logic makes the
patch safe from my perspective.  Thank you for digging in and checking!

>
>> Whichever way you choose, it is likely best to do the same on 10 and 11
>> as on trunk, since it will all be replaced on trunk soon anyway.
>>
> OK, will see Bill's reply (he should be back from vacation soon).  :)

I am back! :)  Agree with Segher that backporting this after a sensible
interval would be appropriate.  We have been fixing these things
piecemeal for too long, so if we have a solid general fix, I'm a fan.
Going forward with 12 and later we can rip off the band-aid and do things
right.

Thanks!
Bill

>
> BR,
> Kewen

Reply via email to