7.4 Нелокальные переходы
GCC предоставляет встроенные функции __builtin_setjmp и __builtin_longjmp, которые похожи на функции библиотеки C setjmp и longjmp, но не взаимозаменяемы с ними. Встроенные версии используются внутри библиотек GCC для реализации обработки исключений на некоторых целевых платформах. В пользовательском коде вместо встроенных функций следует использовать стандартные функции библиотеки C, объявленные в <setjmp.h>.
Встроенные версии этих функций используют стандартные механизмы GCC для сохранения и восстановления регистров с помощью стека при входе в функцию и выходе из неё. Аргумент буфера перехода buf содержит только информацию, необходимую для восстановления стекового кадра, а не весь набор сохранённых значений регистров.
Важно учитывать, что GCC сохраняет и восстанавливает только те регистры, которые известны для конкретного варианта архитектуры, для которого выполняется компиляция. В некоторых случаях это может сделать функции __builtin_setjmp и __builtin_longjmp эффективнее их библиотечных аналогов, но при взаимодействии с кодом, использующим полный набор регистров, это также может привести к неправильному и непредсказуемому поведению.
Аргумент буфера перехода buf для встроенных функций следует объявлять так:
#include <stdint.h> intptr_t buf[5];
-
Встроенная функция:
int__builtin_setjmp(intptr_t *buf) Эта функция сохраняет текущий контекст стека в buf.
__builtin_setjmpвозвращает 0 при обычном возврате и 1 при возврате из__builtin_longjmpс использованием того же buf.
-
Встроенная функция:
void__builtin_longjmp(intptr_t *buf, int val) -
Эта функция восстанавливает контекст стека в buf, сохранённый предыдущим вызовом
__builtin_setjmp. После завершения__builtin_longjmpвыполнение программы продолжается так, как если бы соответствующий вызов__builtin_setjmpвернул значение val, которое должно быть равно 1.Поскольку
__builtin_longjmpзависит от механизма возврата из функции для восстановления контекста стека, её нельзя вызывать из той же функции, которая вызывает__builtin_setjmpдля инициализации buf. Её можно вызывать только из функции, вызываемой (напрямую или косвенно) функцией, вызывающей__builtin_setjmp.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-15.3.0/gcc/Nonlocal-Gotos.html