|
|
@ -43,17 +43,25 @@ typedef machine_uint_t regs_t[6]; |
|
|
|
|
|
|
|
void gc_helper_get_regs(regs_t arr) { |
|
|
|
register long rbx asm ("rbx"); |
|
|
|
asm("" : "=r"(rbx)); |
|
|
|
register long rbp asm ("rbp"); |
|
|
|
asm("" : "=r"(rbp)); |
|
|
|
register long r12 asm ("r12"); |
|
|
|
asm("" : "=r"(r12)); |
|
|
|
register long r13 asm ("r13"); |
|
|
|
asm("" : "=r"(r13)); |
|
|
|
register long r14 asm ("r14"); |
|
|
|
asm("" : "=r"(r14)); |
|
|
|
register long r15 asm ("r15"); |
|
|
|
#ifdef __clang__ |
|
|
|
// TODO:
|
|
|
|
// This is dirty workaround for Clang. It tries to get around
|
|
|
|
// uncompliant (wrt to GCC) behavior of handling register variables.
|
|
|
|
// Application of this patch here is random, and done only to unbreak
|
|
|
|
// MacOS build. Better, cross-arch ways to deal with Clang issues should
|
|
|
|
// be found.
|
|
|
|
asm("" : "=r"(rbx)); |
|
|
|
asm("" : "=r"(rbp)); |
|
|
|
asm("" : "=r"(r12)); |
|
|
|
asm("" : "=r"(r13)); |
|
|
|
asm("" : "=r"(r14)); |
|
|
|
asm("" : "=r"(r15)); |
|
|
|
#endif |
|
|
|
arr[0] = rbx; |
|
|
|
arr[1] = rbp; |
|
|
|
arr[2] = r12; |
|
|
|