Эквивалент _AddressOfReturnAddress () в Clang / LLVM?

Visual C ++ имеет внутреннюю функцию, называемую _1 _, который возвращает адрес адреса возврата текущей функции в стеке.

Обратите внимание, что это не то же самое, что _ 2_, который возвращает только копию обратного адреса.

Есть ли эквивалент для _AddressOfReturnAddress в Clang / LLVM?


person user541686    schedule 11.04.2013    source источник


Ответы (2)


Как указал rustyx, Clang / LLVM (и gcc) предоставляет __builtin_return_address(), что эквивалентно _ReturnAddress(). Clang / LLVM также предоставляет __builtin_frame_address(), который (в зависимости от особенностей вашего ABI, архитектуры и т. Д.) может быть в некотором роде аналогом _AddressOfReturnAddress().

В качестве примера следующий код ...

std::cout<< ((int64_t) __builtin_return_address(0)) << ' '
         << ((int64_t) __builtin_frame_address (0)) << ' '
         <<*((int64_t*)__builtin_frame_address (0)+1)<<'\n';

... печатает следующее на машине OSX.

140735807202733 140734600362944 140735807202733
person ceilingcat    schedule 06.08.2016
comment
+1 не то чтобы мне это нужно или у меня есть возможность проверить это, но я думаю, что это было, вероятно, решение, к которому я тоже пришел. Спасибо! - person user541686; 06.08.2016

Нет. LLVM IR не предоставляет встроенных функций для этого.

person Michael Spencer    schedule 01.06.2014
comment
Для _AddressOfReturnAddress нет эквивалента, но есть __builtin_return_address, который является эквивалентом для _ReturnAddress. - person rustyx; 02.10.2015