私は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]
は変数として何もしていないようですそれが再び使用されることはなく、ビットキャスト自体は無意味です。私が考えることができるのは、コードの興味深い部分を示す、後のコード生成/解析目的のために実際に挿入されたことだけです。
また、私はこの行の好奇心が強いです。私はちょうど今夜それをいくつかのコード生成のものを見ながら走った。それはallocaの境界線のように見えますが、私はその理由を知らない。 – Albinofrenchy