summaryrefslogtreecommitdiffstatshomepage
path: root/unix/gccollect.c
diff options
context:
space:
mode:
Diffstat (limited to 'unix/gccollect.c')
-rw-r--r--unix/gccollect.c18
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;