Browse Source

unix/gccollect.c: Make Clang workaround apply only to it. Unbreaks gcc builds.

pull/633/head
Paul Sokolovsky 11 years ago
parent
commit
1d567592b1
  1. 18
      unix/gccollect.c

18
unix/gccollect.c

@ -43,17 +43,25 @@ typedef machine_uint_t regs_t[6];
void gc_helper_get_regs(regs_t arr) { void gc_helper_get_regs(regs_t arr) {
register long rbx asm ("rbx"); register long rbx asm ("rbx");
asm("" : "=r"(rbx));
register long rbp asm ("rbp"); register long rbp asm ("rbp");
asm("" : "=r"(rbp));
register long r12 asm ("r12"); register long r12 asm ("r12");
asm("" : "=r"(r12));
register long r13 asm ("r13"); register long r13 asm ("r13");
asm("" : "=r"(r13));
register long r14 asm ("r14"); register long r14 asm ("r14");
asm("" : "=r"(r14));
register long r15 asm ("r15"); 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)); asm("" : "=r"(r15));
#endif
arr[0] = rbx; arr[0] = rbx;
arr[1] = rbp; arr[1] = rbp;
arr[2] = r12; arr[2] = r12;

Loading…
Cancel
Save