Какова цель строки% "alloca point", которая встречается в коде llvm? - PullRequest
10 голосов
/ 21 августа 2009

В последнее время я просматривал некоторую сборку 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 ]

8 голосов
/ 26 октября 2009

Из источника 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
0 голосов
/ 22 августа 2009

Нашел это в интернете: Allocas, размер которых может быть определен во время компиляции, будет выделяться в стеке при вычислении размера кадра стека. Для allocas переменного размера целевой целевой код должен будет изменить размер стека, корректируя указатель кадра и указатель стека по мере необходимости, и корректировать расположение исходящих параметров в верхней части стека.

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

...