Issue |
97285
|
Summary |
[RISC-V] Empty structs are ignored when passing in C++
|
Labels |
new issue
|
Assignees |
|
Reporter |
tomeksowi
|
According to RISC-V integer calling convention:
> Empty structs or union arguments or return values are ignored by C compilers which support them
as a non-standard extension. **This is not the case for C++, which requires them to be sized types.**
```C++
struct Empty {};
int after_empty(int i0, Empty e, int i1)
{
return i1;
}
int after_empty_on_stack(
int i0, int i1, int i2, int i3, int i4, int i5, int i6, int i7, Empty e, int i8)
{
return i8;
}
```
Clang doesn't assign a register nor a stack slot to the empty struct for passing:
```asm
after_empty(int, Empty, int): # @after_empty(int, Empty, int)
mv a0, a1
ret
after_empty_on_stack(int, int, int, int, int, int, int, int, Empty, int): # @after_empty_on_stack(int, int, int, int, int, int, int, int, Empty, int)
ld a0, 0(sp)
ret
```
I'd expect these functions to be `mv a0, a2` and `ld a0, 8(sp)` respectively.
This also doesn't match GCC which does allocate a register and stack slot to the empty struct argument. [Comparison with GCC on Godbolt](https://godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQYEAysib0QXLnwEEAqgGdMABQAenAAy8AVhNK0mDUMgCkAJgBCZ86UX1kBPAMqN0AYVS0AriwYhTpFwAZPAZMADlvACNMYgkpAAdUeUJHBncvHz9SROSHAWDQiJZo2MkbTDs8hiECJmICdO9ff1tMe1SauoIC8KiYuJta%2BsbMlqHukN7i/skAShtUT2Jkdg55AmJPewBqbBZ4ggBPbeMAdktTgBFjAGZLdQBBY0eQgm2mdHQIV%2B28dVJdvsjttMACfnguLNnk9ztDngBOYiYAhLBi/dQnCy/Li3e4w66PaE/D7oAD6AlJ6yYyAA1t9BOiwQyIUy3nh/L9mTdWb8ACw8vAAVgFADYBacAXsDsdQZy2QAOKGE2GE9SI5Go36nTHmX7y3Fwq4cea0TiC3i%2Bbi8VCcVxWKzbeSLZaYTE3HikAgaY3zGkgG43AB0AZDobDYtNHF5Fu9pBtHF48hA/y9HE08zgsCQaH2dBi5EoOfiedixAAbiLeQBaZD6QxceVcf40WgEGJJiCRWOREJ1Q6cD095jEQ4AeUiWjaqY9ObYglHDFo/bTvCwkU8wFcYloSatpCwLAMwHEK/3eCR7TLmF3mgCKjanjbA94rwqsdoeEixD77iwsY2eAsM%2BpBXsQkRJJglyYIehgfoY3rzFQ%2BjAPIABqeCYAA7qO8SMMB/CCCIYjsGUBFyIoqixjoUh1kY9oWHon5JpA8yoAcqS7lWo4AF7WqBxB4FgzEQPMrTtE4EAuCMvhSEEkxFCUug5CkAjSUpSQqQwPQKTM5SVB04xqVIYlVJ09TaX0pSDF0RnWeZ8mWRIonOisTl6GaManvG2wAEoAJJCK4Vaods5aVsAyDbLWR7bA2gZcIGGIQLghAkG6kK8Km6a%2Bv6QZhvlIYRpw0akJat7xomyaeghpCZogKCoLm9BkBQEBFiWIBhdWEXIFwvJNnwdBtsQHZdqeQ59sBE0juOk72MBs6MAQC5LrGa4blutA7sBB5Hiet74BeDhXjevCYPeyCPqsHqvpGt4fl%2BP4YKst4AUBe6geBihQTBx4hKAK6IchaEYdhuGWh6ZFEeIpEyAoyhqKeOj%2BLRKD0dYD3Cax7ECJxPF8TEAlCfAokVFOqTOAwbgeE0uhyYUjkJBpVS2cpVQWdMVkmQZNk05kxlk%2BJ1TjBzinGYZfMyXZEwM5zblOksrmQu5HDmqVsbef5gXBdsECVlWPYEPIszbD1sW8vFiW6ylRDEOlsyZQhOUBsGBX5SrJVldanCVSmTsq6YnnlT71WA/MoHJE4vJAA)
ISA: rv64gc
Clang version: 18.1.0 and Godbolt "trunk" at the time of filing this issue (2024-07-01).
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs