我一直在尋找最近由llvm-gcc生成的一些LLVM程序集,我注意到了一個我不確定它的目的的反覆陳述。在llvm代碼中出現%「alloca point」行的目的是什麼?
例如,以下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]
似乎並沒有做任何事情作爲變量它指定的是不會再次使用,並且bitcast本身是毫無意義的。我所能想到的是,它的插入實際上是爲了後來的代碼生成/分析的目的,指示代碼的有趣部分。
我也是在這條線上好奇;我今天晚上看了一些代碼生成的東西時碰到了它。它似乎是alloca邊界,但我不知道爲什麼。 – Albinofrenchy 2009-08-22 05:06:03