#include "config.h"
#include "unwind_i.h"
#include "dwarf_i.h"
#include <stdatomic.h>
HIDDEN define_lock (x86_64_lock);
HIDDEN atomic_bool tdep_init_done = 0;
HIDDEN const uint8_t dwarf_to_unw_regnum_map[DWARF_NUM_PRESERVED_REGS] =
{
UNW_X86_64_RAX,
UNW_X86_64_RDX,
UNW_X86_64_RCX,
UNW_X86_64_RBX,
UNW_X86_64_RSI,
UNW_X86_64_RDI,
UNW_X86_64_RBP,
UNW_X86_64_RSP,
UNW_X86_64_R8,
UNW_X86_64_R9,
UNW_X86_64_R10,
UNW_X86_64_R11,
UNW_X86_64_R12,
UNW_X86_64_R13,
UNW_X86_64_R14,
UNW_X86_64_R15,
UNW_X86_64_RIP,
#ifdef CONFIG_MSABI_SUPPORT
UNW_X86_64_XMM0,
UNW_X86_64_XMM1,
UNW_X86_64_XMM2,
UNW_X86_64_XMM3,
UNW_X86_64_XMM4,
UNW_X86_64_XMM5,
UNW_X86_64_XMM6,
UNW_X86_64_XMM7,
UNW_X86_64_XMM8,
UNW_X86_64_XMM9,
UNW_X86_64_XMM10,
UNW_X86_64_XMM11,
UNW_X86_64_XMM12,
UNW_X86_64_XMM13,
UNW_X86_64_XMM14,
UNW_X86_64_XMM15
#endif
};
HIDDEN void
tdep_init (void)
{
intrmask_t saved_mask;
intrmask_t full_mask;
sigfillset (&full_mask);
SIGPROCMASK (SIG_SETMASK, &full_mask, &saved_mask);
mutex_lock (&x86_64_lock);
{
if (atomic_load(&tdep_init_done))
goto out;
sigfillset (&unwi_full_mask);
mi_init ();
dwarf_init ();
#ifndef UNW_REMOTE_ONLY
x86_64_local_addr_space_init ();
#endif
atomic_store(&tdep_init_done, 1);
}
out:
mutex_unlock(&x86_64_lock);
SIGPROCMASK (SIG_SETMASK, &saved_mask, NULL);
}