rjmccall wrote:

Note that we're forced to override that ABI rule in C++ sometimes — I believe 
we're now required (since C++11?) to elide a copy/move when initializing a 
normal object with a return value, and even if we weren't, it'd clearly be 
unreasonable compiler behavior to do an extra non-trivial operation here.  I 
don't think the psABI intends that rule to have that effect anyway.

This does raise a language interoperation question, though, related to the 
tractability note I made about (2) above:
- You can call a function to initialize a global variable in C++.
- That function can be implemented in C, in which case it will expect the 
aliasing rule to still apply to its return value slot.
- We cannot do any sort of local analysis on a global variable to prove that 
the variable is not accessed during its initializer.

C++ does have some restrictions on accessing objects that are being initialized 
through other names.  It's possible that they're strong enough to satisfy the 
ABI rule here through a sort of reverse of the normal analysis: basically, any 
program that would violate the ABI rule is actually incorrect because of the 
semantic restriction.  If not, I think we may need to force copies of trivial 
return types in the caller in C++.  We can consider that separately, though.

https://github.com/llvm/llvm-project/pull/101038
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to