From 1d567592b18ea9796515436754877aac3948bd29 Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Wed, 28 May 2014 15:37:22 +0300 Subject: [PATCH] unix/gccollect.c: Make Clang workaround apply only to it. Unbreaks gcc builds. --- unix/gccollect.c | 18 +++++++++++++----- 1 file 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;