6.48 Получение адреса возврата или кадра функции
Эти функции могут использоваться для получения информации о вызывающих функциях.
Эта функция возвращает адрес возврата текущей функции или одной из вызывающих функций. Аргумент level — это количество кадров для сканирования вверх по стеку вызовов. Значение
0возвращает адрес возврата текущей функции, значение1возвращает адрес возврата вызывающей функции и так далее. При инлайнинге ожидается, что функция вернёт адрес функции, к которой происходит возврат. Чтобы обойти это поведение, используйте атрибут функцииnoinline.Аргумент level должен быть целочисленной константой.
На некоторых машинах может быть невозможно определить адрес возврата любой функции, кроме текущей; в таких случаях или при достижении вершины стека эта функция возвращает
0или случайное значение. Кроме того,__builtin_frame_addressможет использоваться для определения достижения вершины стека.Возможна дополнительная пост-обработка возвращаемого значения, см.
__builtin_extract_return_addr.Эта функция должна использоваться только с ненулевым аргументом в целях отладки.
Адрес, возвращённый функцией
__builtin_return_address, может потребоваться пропустить через эту функцию, чтобы получить фактический закодированный адрес. Например, на 31-разрядной платформе S/390 старший бит необходимо маскировать, а на платформах SPARC — добавить смещение для получения истинного адреса следующей выполняемой инструкции.Если исправление не требуется, эта функция просто пропускает addr.
Эта функция выполняет обратное действие функции
__builtin_extract_return_addr.
Эта функция похожа на
__builtin_return_address, но она возвращает адрес кадра функции, а не адрес возврата функции. Вызов__builtin_frame_addressсо значением0возвращает адрес кадра текущей функции, со значением1возвращает адрес кадра вызывающей функции и так далее.Кадр — это область в стеке, которая хранит локальные переменные и сохранённые регистры. Адрес кадра обычно является адресом первого слова, помещённого в стек функцией. Однако точное определение зависит от процессора и соглашения о вызовах. Если процессор имеет специальный регистр указателя кадра, и функция имеет кадр, то
__builtin_frame_addressвозвращает значение регистра указателя кадра.На некоторых машинах может быть невозможно определить адрес кадра любой функции, кроме текущей; в таких случаях или при достижении вершины стека эта функция возвращает
0, если указатель кадра первого кадра инициализирован кодом запуска.Эта функция должна использоваться только с ненулевым аргументом в целях отладки.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-4.9.4/gcc/Return-Address.html