Spec-Zone.ru › GCC 10

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

6.51 Получение адреса возврата или кадра функции ¶

Эти функции могут быть использованы для получения информации о вызывающих функциях.

Встроенная функция: void * __builtin_return_address (unsigned int level) ¶

Эта функция возвращает адрес возврата текущей функции или одной из её вызывающих функций. Аргумент level — число кадров для сканирования вверх по стеку вызовов. Значение 0 возвращает адрес возврата текущей функции, значение 1 возвращает адрес возврата вызвавшей текущую функцию, и так далее. При инлайнинге ожидаемое поведение заключается в том, что функция возвращает адрес функции, к которой происходит возврат. Чтобы обойти это поведение, используйте атрибут функции noinline.

Аргумент level должен быть целочисленной константой.

На некоторых машинах может быть невозможно определить адрес возврата любой функции, кроме текущей; в таких случаях или когда вершина стека достигнута, эта функция возвращает неопределённое значение. Кроме того, __builtin_frame_address может быть использовано для определения, достигнута ли вершина стека.

Могут потребоваться дополнительные пост-обработки возвращённого значения, см. __builtin_extract_return_addr.

Сохранённое представление адреса возврата в памяти может отличаться от адреса, возвращённого функцией __builtin_return_address. Например, на AArch64 сохранённый адрес может быть изменён с помощью подписи адреса возврата, тогда как адрес, возвращённый функцией __builtin_return_address, таковым не является.

Вызов этой функции с ненулевым аргументом может иметь непредсказуемые последствия, в том числе привести к завершению вызывающей программы. В результате вызовы, которые считаются небезопасными, диагностируются, когда включён параметр -Wframe-address. Такие вызовы должны выполняться только в ситуациях отладки.

На целевых платформах, где адреса кода представимы как void *,

void *addr = __builtin_extract_return_addr (__builtin_return_address (0));

дает адрес кода, где текущая функция вернётся. Например, такой адрес может быть использован с dladdr или другими интерфейсами, которые работают с адресами кода.

Встроенная функция: void * __builtin_extract_return_addr (void *addr) ¶

Адрес, возвращённый функцией __builtin_return_address, может потребоваться передать через эту функцию, чтобы получить фактический закодированный адрес. Например, на 31-битной платформе S/390 старший бит должен быть замаскирован, или на платформах SPARC необходимо добавить смещение для получения истинного следующего выполняемого оператора.

Если коррекция не требуется, эта функция просто пропускает addr.

Встроенная функция: void * __builtin_frob_return_addr (void *addr) ¶

Эта функция выполняет обратное действие функции __builtin_extract_return_addr.

Встроенная функция: void * __builtin_frame_address (unsigned int level) ¶

Эта функция аналогична функции __builtin_return_address, но возвращает адрес кадра функции, а не адрес возврата функции. Вызов __builtin_frame_address со значением 0 возвращает адрес кадра текущей функции, значение 1 возвращает адрес кадра вызвавшей текущую функцию, и так далее.

Кадр — это область в стеке, которая хранит локальные переменные и сохранённые регистры. Адрес кадра обычно является адресом первого слова, помещённого в стек функцией. Однако точное определение зависит от процессора и соглашения о вызовах. Если процессор имеет выделенный регистр указателя кадра, и у функции есть кадр, то __builtin_frame_address возвращает значение регистра указателя кадра.

На некоторых машинах может быть невозможно определить адрес кадра любой функции, кроме текущей; в таких случаях или когда вершина стека достигнута, эта функция возвращает 0 если первый указатель кадра правильно инициализирован кодом запуска.

Вызов этой функции с ненулевым аргументом может иметь непредсказуемые последствия, в том числе привести к завершению вызывающей программы. В результате вызовы, которые считаются небезопасными, диагностируются, когда включён параметр -Wframe-address. Такие вызовы должны выполняться только в ситуациях отладки.

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

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-10.5.0/gcc/Return-Address.html

Spec-Zone.ru

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