mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-22 04:50:07 +00:00
5662433c38
In _dl_tlsdesc_dynamic, there are three 'addi.d sp, sp, -size' instructions to allocate stack size for Float/LSX/LASX registers. Every 'addi.d sp, sp, -size' needs a cfi_adjust_cfa_offset because of sp is used to compute CFA. But only one 'addi.d sp, sp, -size' will be run according to HWCAP value. And all cfi_adjust_cfa_offset will be executed in stack unwinding, it result in incorrect CFA. Change _dl_tlsdesc_dynamic to _dl_tlsdesc_dynamic, _dl_tlsdesc_dynamic_lsx and _dl_tlsdesc_dynamic_lasx. Conflicting cfi instructions can be distributed to the three functions. And cfi instructions can correspond to stack down instructions.
20 lines
608 B
Plaintext
20 lines
608 B
Plaintext
#include <stddef.h>
|
|
#include <sysdep.h>
|
|
#include <tls.h>
|
|
#include <link.h>
|
|
#include <dl-tlsdesc.h>
|
|
|
|
--
|
|
|
|
-- Abuse tls.h macros to derive offsets relative to the thread register.
|
|
|
|
TLSDESC_ARG offsetof(struct tlsdesc, arg)
|
|
TLSDESC_GEN_COUNT offsetof(struct tlsdesc_dynamic_arg, gen_count)
|
|
TLSDESC_MODID offsetof(struct tlsdesc_dynamic_arg, tlsinfo.ti_module)
|
|
TLSDESC_MODOFF offsetof(struct tlsdesc_dynamic_arg, tlsinfo.ti_offset)
|
|
TCBHEAD_DTV offsetof(tcbhead_t, dtv)
|
|
DTV_COUNTER offsetof(dtv_t, counter)
|
|
TLS_DTV_UNALLOCATED TLS_DTV_UNALLOCATED
|
|
TLS_DTV_OFFSET TLS_DTV_OFFSET
|
|
SIZE_OF_TCB sizeof(tcbhead_t)
|