haberman added a comment.

Correct me if I am wrong, but won't this produce LLVM IR that fails to validate?

The checks that exist today for `[[clang::musttail]]` are necessary to follow 
LLVM's rules about where `musttail` may appear: 
https://llvm.org/docs/LangRef.html#id328

> Calls marked musttail must obey the following additional rules:
>
> - The call must immediately precede a ret instruction, or a pointer bitcast 
> followed by a ret instruction.
> - The ret instruction must return the (possibly bitcasted) value produced by 
> the call, undef, or void.
> - The calling conventions of the caller and callee must match.
> - The callee must be varargs iff the caller is varargs. Bitcasting a 
> non-varargs function to the appropriate varargs type is legal so long as the 
> non-varargs prefixes obey the other rules.
> - The return type must not undergo automatic conversion to an sret pointer.
>
> In addition, if the calling convention is not swifttailcc or tailcc:
>
> - All ABI-impacting function attributes, such as sret, byval, inreg, 
> returned, and inalloca, must match.
> - The caller and callee prototypes must match. Pointer types of parameters or 
> return types may differ in pointee type, but not in address space.

It looks like this change would allow users to produce LLVM IR that violates 
that final condition:

> The caller and callee prototypes must match. Pointer types of parameters or 
> return types may differ in pointee type, but not in address space.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D147714/new/

https://reviews.llvm.org/D147714

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to