https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99952
Bug ID: 99952
Summary: Incompatible function call ABI between 7.5 and 9.2
Product: gcc
Version: 7.5.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: gdutor at gmail dot com
Target Milestone: ---
For such a snipet, g++-7.5.0 and g++-9.2.0 generate different ABI for function
`foo`:
```
#include <optional>
enum E {
kA,kB,kC,kD,kE,kF
};
struct S {
E e;
std::optional<unsigned int> o;
};
void foo(S s) {
fprintf(stderr, "%d\n", (int)s.e);
}
int main() {
S s;
foo(s);
return 0;
}
```
7.5.0:
```
Dump of assembler code for function foo(S):
0x0000000000400767 <+0>: push %rbp
0x0000000000400768 <+1>: mov %rsp,%rbp
0x000000000040076b <+4>: sub $0x10,%rsp
0x000000000040076f <+8>: mov %rdi,-0x8(%rbp)
0x0000000000400773 <+12>: mov -0x8(%rbp),%rax
0x0000000000400777 <+16>: mov (%rax),%eax
0x0000000000400779 <+18>: mov %eax,%edx
0x000000000040077b <+20>: mov 0x2008de(%rip),%rax # 0x601060
<stderr@@GLIBC_2.2.5>
0x0000000000400782 <+27>: mov $0x400a3c,%esi
0x0000000000400787 <+32>: mov %rax,%rdi
0x000000000040078a <+35>: mov $0x0,%eax
0x000000000040078f <+40>: callq 0x400650 <fprintf@plt>
0x0000000000400794 <+45>: nop
0x0000000000400795 <+46>: leaveq
0x0000000000400796 <+47>: retq
```
9.2.0:
```
Dump of assembler code for function foo(S):
0x0000000000401152 <+0>: push %rbp
0x0000000000401153 <+1>: mov %rsp,%rbp
0x0000000000401156 <+4>: sub $0x10,%rsp
0x000000000040115a <+8>: mov %rdi,%rdx
0x000000000040115d <+11>: mov %esi,%eax
0x000000000040115f <+13>: mov %rdx,-0x10(%rbp)
0x0000000000401163 <+17>: mov %eax,-0x8(%rbp)
0x0000000000401166 <+20>: mov -0x10(%rbp),%eax
0x0000000000401169 <+23>: mov %eax,%edx
0x000000000040116b <+25>: mov 0x2eee(%rip),%rax # 0x404060
<stderr@@GLIBC_2.2.5>
0x0000000000401172 <+32>: mov $0x402004,%esi
0x0000000000401177 <+37>: mov %rax,%rdi
0x000000000040117a <+40>: mov $0x0,%eax
0x000000000040117f <+45>: callq 0x401040 <fprintf@plt>
0x0000000000401184 <+50>: nop
0x0000000000401185 <+51>: leaveq
0x0000000000401186 <+52>: retq
```
Such an incompatibility issue causes a program crash when the program is
compiled by g++ 9.2.0, and linked against a library which is compiled by g++
7.5.0