2016-02-12 13 views
6

私は3つの質問があります:LLVMのIRコードで呼び出すと呼びます

1)LLVMのIRコードの呼び出し操作と呼び出し操作の違いは何ですか?コール命令がBasicBlocks hereでターミネーター操作とはみなされないのはなぜ

2)?呼び出しとコール操作の両方がアセンブリレベルの言語での間接呼び出しを生成するため

3)それは可能ですか?

答えて

7

1)R \ 呼び出しが例外を起動することができます関数の呼び出しで、事前にありがとうございます。実現すれば、ハンドル例外のブロックを定義し、もう1つは通常のフローを続行します。

2)R \ コール命令が別の関数にtransmitedされるため、制御フローの終端命令とはみなされません。 LLVMでは、ターミネータ命令は、実行可能な次の(または複数の)基本ブロックを反映する必要があります。

3)R \ 申し訳ありませんが、私は)3について

1

を知らない、それはあなたがw.r.t.を求めているかどうかは明らかではありませんa)独自のバックエンドまたはb)既存のバックエンドに関する記述

A)はい、明らかに/一般的にあなたのバックエンドであなたはそれを実装したい場合は、欲しいものを生成することがありました。 b)どのバックエンドですか? X86のCALLは、(リターンアドレス、コールスタックの分岐予測のためのサポートなども非機能な副作用を節約IE)、したがってできないX86 HWへの副作用を持っていながら、すなわちARMの呼び出しは、すでに間接分岐(すなわち、BL命令)でありますエミュレーションのない間接的な呼び出しに置き換えられます。間接ブランチを使用したAFAIK CALLエミュレーションは、X86のLLVMバックエンドの一部ではありません。

関連する問題