Какова цель линии% "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
</void></i32></void></i32*>

Меня интересует цель линии:

%"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0]
</i32>

Кажется, что ничего не делает, поскольку переменная, которую он присваивает, никогда не используется снова, а сам бит-пакет бессмыслен. Все, что я могу придумать, это то, что он вставлен действительно как 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, размер которого может быть определен во время компиляции, будет выделяться в стеке, когда вычисляется размер кадра стека. Для атрибутов с переменным размером целевой конкретный код должен будет изменить размер стека, отрегулировав указатель кадра и указатель стека по мере необходимости, и отрегулируйте местоположения для исходящих параметров в верхней части стека.

звучит как его там, чтобы сделать некоторое пространство в стеке правильно.

licensed under cc by-sa 3.0 with attribution.