unix/gccollect.c: Make Clang workaround apply only to it. Unbreaks gcc builds.
This commit is contained in:
parent
168a9ce863
commit
1d567592b1
@ -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…
x
Reference in New Issue
Block a user