342 |
SCM_API void scm_remember_upto_here_2 (SCM obj1, SCM obj2); |
SCM_API void scm_remember_upto_here_2 (SCM obj1, SCM obj2); |
343 |
SCM_API void scm_remember_upto_here (SCM obj1, ...); |
SCM_API void scm_remember_upto_here (SCM obj1, ...); |
344 |
|
|
345 |
/* In GCC we can force a reference to an SCM with a little do-nothing asm, |
/* In GCC we can force a reference to an SCM by making it an input to an |
346 |
avoiding the code size and slowdown of an actual function call. |
empty asm. This avoids the code size and slowdown of an actual function |
347 |
__volatile__ ensures nothing will be moved across the reference, and that |
call. Unfortunately there doesn't seem to be any way to do the varargs |
348 |
it won't be optimized away (or rather only if proved unreachable). |
scm_remember_upto_here like this. |
349 |
Unfortunately there doesn't seem to be any way to do the varargs |
|
350 |
scm_remember_upto_here similarly. */ |
__volatile__ ensures nothing will be moved across the asm, and it won't |
351 |
|
be optimized away (or only if proved unreachable). Constraint "g" can be |
352 |
|
used on all processors and allows any memory or general register (or |
353 |
|
immediate) operand. The actual asm syntax doesn't matter, we don't want |
354 |
|
to use it, just ensure the operand is still alive. See "Extended Asm" in |
355 |
|
the GCC manual for more. */ |
356 |
|
|
357 |
#ifdef __GNUC__ |
#ifdef __GNUC__ |
358 |
#define scm_remember_upto_here_1(x) \ |
#define scm_remember_upto_here_1(x) \ |