Estaba interesado en qué hace exactamente setjmp al menos en x86_64 Linux, así que busqué en el código fuente de glibc , pero realmente no puedo encontrar dónde se guarda el registro. ¿Podrías explicar qué está pasando aquí?
setjmp.h
extern int _setjmp (struct __jmp_buf_tag __env[1]) __THROWNL; #define setjmp(env) _setjmp (env)bsd-_setjmp.c
int _setjmp (jmp_buf env) { return __sigsetjmp (env, 0); } libc_hidden_def (_setjmp)setjmp.c
int __libc_sigsetjmp (jmp_buf env, int savemask) { __sigjmp_save (env, savemask); __set_errno (ENOSYS); return 0; } weak_alias (__libc_sigsetjmp, __sigsetjmp) stub_warning (__sigsetjmp)sigjmp.c
int __sigjmp_save (sigjmp_buf env, int savemask) { env[0].__mask_was_saved = (savemask && __sigprocmask (SIG_BLOCK, (sigset_t *) NULL, &env[0].__saved_mask) == 0); return 0; }setjmp es una macro que llama a _setjmp . Para la arquitectura x86_64, se define en ../sysdeps/x86_64/bsd-_setjmp.S . _setjmp luego llamará a __sigsetjmp , definido en ../sysdeps/x86_64/setjmp.S ; esta función depende estrictamente de la plataforma y debe implementarse en ensamblador.