Какова цель строки%"alloca point", которая встречается в коде llvm?
В последнее время я просматривал некоторую сборку LLVM, созданную llvm-gcc, и заметил повторяющееся утверждение, в котором я не уверен, для чего он предназначен.
Например, следующая программа на C:
int main(void)
{
void (*f)(void) = (0x21332);
f();
}
При компиляции с помощью "llvm-gcc -emit-llvm -S" создаст следующий код (удалены несущественные части):
define i32 @main() nounwind {
entry:
%retval = alloca i32 ; <i32*> [#uses=1]
%f = alloca void ()* ; <void ()**> [#uses=2]
%"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0]
store void ()* inttoptr (i64 135986 to void ()*), void ()** %f, align 4
%0 = load void ()** %f, align 4 ; <void ()*> [#uses=1]
call void %0() nounwind
br label %return
Я заинтересован в назначении линии:
%"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0]
Кажется, он ничего не делает, так как переменная, которую он назначает, больше никогда не используется, а сама битовая трансляция бессмысленна. Все, о чем я могу думать, это то, что он вставлен действительно как nop для последующих целей генерации / анализа кода, указывая на интересные части кода.
2 ответа
Из источника llvm-gcc: gcc / llvm-convert.cpp, он просто используется как вспомогательное значение * и будет удален с помощью прохода удаления мертвых инструкций.
// Create a dummy instruction in the entry block as a marker to insert new // alloc instructions before. It doesn't matter what this instruction is, // it is dead. This allows us to insert allocas in order without having to // scan for an insertion point. Use BitCast for int -> int
Обнаружил это в интернете: Allocas, размер которого можно определить во время компиляции, будет выделяться место в стеке при расчете размера кадра стека. Для allocas переменного размера целевой целевой код должен будет изменить размер стека, корректируя указатель кадра и указатель стека по мере необходимости, и корректировать расположение исходящих параметров в верхней части стека.
звучит так, как будто там есть место для стека, работающее правильно.