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