https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115049

--- Comment #9 from LIU Hao <lh_mouse at 126 dot com> ---
Created attachment 58656
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=58656&action=edit
reduced testcase

After spending four days on this, I have reduced a testcase. `./test.sh` should
reproduce the segfault.


The bug exists around the initialization of a global variable in 'file2.cpp':
```
auto e = new std::discard_block_engine< int >;
```

We compile this file:
```
g++ -O2 -S -masm=intel file2.cpp
```

which produces
```
        call    "_Znwy"                                  # %rax = ::operator
new
        mov     rcx, QWORD PTR "e"[rip]                  # %rcx = &e
        mov     r10, rax                                 # %r10 = %rax
        call    "_ZNSt20discard_block_engineIiEclEv"     #
std::discard_block_engine<int>::operator()(%rcx)
                                                         #  -> `this` is passed
via %rcx.
        mov     QWORD PTR "d"[rip], r10                  # d = %r10
                                                         #  -> BUG. %r10 has
been clobbered by the above call
                                                         #     and now contains
a garbage value.
        mov     DWORD PTR [r10], eax                     # *(DWORD*)%r10 = %eax
                                                         #  -> this faults.
```

Reply via email to