Issue |
143701
|
Summary |
calling convention mismatch for non-POD with trivialv on mingw-w64
|
Labels |
new issue
|
Assignees |
|
Reporter |
vtjnash
|
@llvm/issue-subscribers-julialang noticed we get calling convention mismatches between i686-w64-mingw32-gcc and llvm targeting that, specifically for types such as `std::optional`. In particular, GCC says this must always be returned in memory (perhaps due to cxx03 rules) while LLVM says this can be returned in registers (Itanium rules). This seems easy to fix with some flag in the rules, but I cannot find anywhere that says why this particular case is sret, to indicate which flag to set. In general, mingw-w64 claims to be MSVC-compatible with this ABI, implying LLVM should be selecting the MicrosoftCXXABI by default here, but I cannot find any way to corroborate that being the right change to the ABI.
```
$ ~/julia/deps/srccache/llvm/build/bin/clang -S -x c++ - -o - --target=i686-w64-mingw32 -std=c++17 -O2 << EOF
#include <optional>
std::optional<void*> foo() { return (void*)0; }
EOF
.def @feat.00;
.scl 3;
.type 0;
.endef
.globl @feat.00
.set @feat.00, 1
.file "-"
.def __Z3foov;
.scl 2;
.type 32;
.endef
.text
.globl __Z3foov # -- Begin function _Z3foov
.p2align 4
__Z3foov: # @_Z3foov
# %bb.0: # %entry
xorl %eax, %eax
movl $1, %edx
retl
# -- End function
.addrsig
$ x86_64-w64-mingw32-g++ -S -x c++ - -o - -std=c++17 -O2 << EOF
#include <optional>
std::optional<void*> foo() { return (void*)0; }
EOF
.file ""
.text
.p2align 4
.globl _Z3foov
.def _Z3foov; .scl 2; .type 32; .endef
.seh_proc _Z3foov
_Z3foov:
.LFB289:
.seh_endprologue
movq %rcx, %rax
movq $0, (%rcx)
movq $1, 8(%rcx)
ret
.seh_endproc
.ident "GCC: (GNU) 10-posix 20220113"
```
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs