Spec-Zone.ru › GCC 11

Далее: Создание вызовов функций, Предыдущее: Вложенные функции, Наверх: Расширения для семейства языков C [Оглавление][Индекс]

6.5 Нелокальные переходы ¶

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.

Далее: Создание вызовов функций, Предыдущее: Вложенные функции, Наверх: Расширения для семейства языков C [Оглавление][Индекс]

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-11.4.0/gcc/Nonlocal-Gotos.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API