Spec-Zone.ru › GCC 5

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

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

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

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

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

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

Дополнительная постобработка возвращаемого значения может потребоваться, см. __builtin_extract_return_addr.

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

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

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

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

Встроенная функция: void * __builtin_frob_return_address (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, если указатель первого кадра должным образом инициализирован стартовым кодом.

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

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

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

Spec-Zone.ru

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