2009-08-21 5 views
10

私は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] 

は変数として何もしていないようですそれが再び使用されることはなく、ビットキャスト自体は無意味です。私が考えることができるのは、コードの興味深い部分を示す、後のコード生成/解析目的のために実際に挿入されたことだけです。

+0

また、私はこの行の好奇心が強いです。私はちょうど今夜それをいくつかのコード生成のものを見ながら走った。それはallocaの境界線のように見えますが、私はその理由を知らない。 – Albinofrenchy

答えて

8

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

はい、これは正しいです。 "一時的なものを挿入する場所のためのプレースホルダとして:allocaはビットキャストの前にあり、その後実際のコード生成が始まります。それを排除し、基本的に他のものはすべて無視する」と述べた。 –

-1

インターネットでこれが見つかりました: コンパイル時にサイズを決定できるAllocasは、スタックフレームサイズが計算されたときにスタック上のスペースが割り当てられます。可変サイズのallocaの場合、ターゲット固有のコードはスタックのサイズを変更し、必要に応じてフレームポインタとスタックポインタを調整し、出力パラメータの場所をスタックの先頭に調整する必要があります。

は、スタックスペースが正しく機能するようにそのように聞こえます。

+0

質問はallocaそのものに関するものではありません。オペレータは、 "alloca point"という名前の命令について質問しています。これはノーオペレーションのようです。 –

関連する問題