[RTEMS Project] #4661: GCC 12 generates wrong code
RTEMS trac
trac at rtems.org
Wed Jun 8 03:45:09 UTC 2022
#4661: GCC 12 generates wrong code
--------------------------+--------------------
Reporter: Chris Johns | Owner: (none)
Type: defect | Status: new
Priority: high | Milestone: 6.1
Component: tool/gcc | Version: 6
Severity: blocker | Keywords:
Blocked By: | Blocking:
--------------------------+--------------------
Calling `exit()` in a C++ application results in `std::terminate()` being
called.
The `std::ios_base::Init::~Init()` destructor flushes `std::cout`,
`std::cerr` and `std::clog`. The flush of `std::cerr` results in terminate
being called.
The `ios_base` class uses a sentry to check the state. The code in it's
destructor is:
{{{
if (bool(_M_os.flags() & ios_base::unitbuf) && !uncaught_exception())
}}}
The `std::cerr` object has `ios_base::unitbuf` set so
`uncaught_exception()` is called. This call gets the cxa globals:
{{{
__cxa_eh_globals *globals = __cxa_get_globals ();
}}}
The `__cxa_get_globals()` checks if the `ec_globals` `init` object:
{{{
static __eh_globals_init init;
}}}
to see if it is still valid and the state is:
{{{
(gdb) p /x init
$2 = {
_M_key = 0x13010001,
_M_init = 0x1
}
}}}
However the static destructor has run and the POSIX key has been deleted.
This results in `std::terminate()` being called.
The code for the destructor on ARM is:
{{{
006562e0 <__eh_globals_init::~__eh_globals_init()>:
6562e0: 7903 ldrb r3, [r0, #4]
6562e2: b510 push {r4, lr}
6562e4: 4604 mov r4, r0
6562e6: b90b cbnz r3, 6562ec
<__eh_globals_init::~__eh_globals_init()+0xc>
6562e8: 4620 mov r0, r4
6562ea: bd10 pop {r4, pc}
6562ec: 6800 ldr r0, [r0, #0]
6562ee: f04d fe6b bl 6a3fc8 <pthread_key_delete>
6562f2: 4620 mov r0, r4
6562f4: bd10 pop {r4, pc}
}}}
and for `aarch64` it is:
{{{
0000000010222c30 <__eh_globals_init::~__eh_globals_init()>:
10222c30: 39401001 ldrb w1, [x0, #4]
10222c34: 35000041 cbnz w1, 10222c3c
<__eh_globals_init::~__eh_globals_init()+0xc>
10222c38: d65f03c0 ret
10222c3c: a9bf7bfd stp x29, x30, [sp, #-16]!
10222c40: 910003fd mov x29, sp
return pthread_key_delete (__key);
10222c44: b9400000 ldr w0, [x0]
10222c48: 94008806 bl 10244c60 <pthread_key_delete>
10222c4c: a8c17bfd ldp x29, x30, [sp], #16
10222c50: d65f03c0 ret
}}}
The `_M_init` boolean is not set to `false`.
--
Ticket URL: <http://devel.rtems.org/ticket/4661>
RTEMS Project <http://www.rtems.org/>
RTEMS Project
More information about the bugs
mailing list