Issue |
98159
|
Summary |
[ARM32] Empty structs are ignored when passing in C++
|
Labels |
new issue
|
Assignees |
|
Reporter |
tomeksowi
|
Problem similar to #97285, opening new issue since the RISC-V one is closed. I'm less familiar with ARM32 so I can't point to the ABI wording that specifies empty struct handling.
```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;
}
```
```asm
after_empty(int, Empty, int):
mov r0, r1
bx lr
after_empty_on_stack(int, int, int, int, int, int, int, int, Empty, int):
ldr r0, [sp, #16]
bx lr
```
GCC passes `i1` and `i8` in `r2` and `[sp, #20]` respectively. [Comparison on Godbolt](https://godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQYEAysib0QXLnwEEAqgGdMABQAenAAy8AVhNK0mDUMgCkAJgBCZ86UX1kBPAMqN0AYVS0AriwYhTpFwAZPAZMADlvACNMYgl/AAdUeUJHBncvHz9SROSHAWDQiJZo2K5/W0x7VKECJmICdO9fcsw7PIYauoIC8KiYuJta%2BsbM8qHukN7i/rKAShtUT2Jkdg55AmJPewBqbBZ4ggBPbeMAdktTgBFjAGZLdQBBY0eQgm2mKgIYgH1MfaOIK9tnh1KRdv9jpgwUC8FxZs8nucEc8AJzETAEJYMYFcW73RHXR4IoEfL7EX4Q74Cb7rJjIADWEAR2xZwMEwNBbLesOh7Lw/i5wJuvO5ABYRcCAKwSvAANhlpzBewOkJlAA54USkUT1GiMVjgWq8cirhx5rROJLeL5uLxUJxXFYrNt5ItlpgTqYbjxSAQNGb5vSQDcbgA6EMRyNR%2BUWjii63%2B0j2ji8eQgUF%2BjiaeZwWBIND7OgxciUAvxIuxOosABupwAtMh9IYuGquKCaLQyWmIJFE5EQnVDpwff3mMRDgB5SJaSqZn0FtiCCcMWhDrO8LCRTzAVxiWhp22kLAsAzAcTro94dFVauYA%2BaAIqSqeL7D3ivVqJ2h4SLEQfuLBEw2PAWDfUhb2ISIkkwS4/lPb9DH9eYqH0YB5AANTwTAAHcJ3iRgwP4QQRDEdhJGkQQFGUNQLx0KQmyMJ0LD0H800geZUAOVIDzrCcAC87Qg4g8CwNiIHmCoqicCAXBGXwpCCSYihKXQchSAQ5NUpJ1IYHplJmGxWlnapxk0qRJPaTp6j0vpSkGLozPs6ylNsiQJLdFY3L0S0EwvZN3mIGt6yYbZG1PbYW1DLhQ3UbYIFwQgSE9b1Zl4TNs0DYMwyjHKIxjTh41IG0H2TVN019JDSFzRAUFQQt6DICgIDLCsQCrYAuFFNs%2BDoLtKF7C9R0HMChvHKcZ3sMCF0YAhl1XRNN23XdaH3MDj3g1YH3wa8HFve9eEwJ9kBfVYfQ/WMH2/X9/wwTa0uE0DDwgqDFFgk9DAQ0B12Q1CMKw3D8JtH0iOEURxHIkGqNURMdH8BiUCY6wrrEjiuIEHj%2BMEmJhNE%2BAJKMqTfBkhg3A8JpdEUwpXKkNT2kc2nUhs6Y7IskyHLJzJzIJyzxiZlTzNMjn5KciYqeZrzXSWTy4W8jgrSKxN/IeAAlABZbYAHFXFcCLRSimK4oSohiGSuE0qQzKQ3DXKctlwrirtTgyozC3ZdMXySqdirvvmCDkicUUgA%3D)
ARM64 on Clang looks ok, it matches GCC and passes `i1` in `w2`
Clang version: 18.1.0 and Godbolt "trunk" at the time of filing this issue (2024-07-09).
cc @svs-quic @efriedma-quic
Part of dotnet/runtime#84834
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs