diff options
Diffstat (limited to 'unix/gccollect.c')
-rw-r--r-- | unix/gccollect.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/unix/gccollect.c b/unix/gccollect.c index 1b5a38ffc6..d934f9cae2 100644 --- a/unix/gccollect.c +++ b/unix/gccollect.c @@ -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; |