をほどくする方法を、私はCreateEntryBlockAllocaを使用してブロックスコープの先頭に変数を挿入しています:LLVMの例外。現時点で
template <typename VariableType>
static inline llvm::AllocaInst *CreateEntryBlockAlloca(BuilderParameter& buildParameters,
const std::string &VarName) {
HAssertMsg(1 != 0 , "Not Implemented");
};
template <>
inline llvm::AllocaInst *CreateEntryBlockAlloca<double>(BuilderParameter& buildParameters,
const std::string &VarName) {
llvm::Function* TheFunction = buildParameters.dag.llvmFunction;
llvm::IRBuilder<> TmpB(&TheFunction->getEntryBlock(),
TheFunction->getEntryBlock().begin());
return TmpB.CreateAlloca(llvm::Type::getDoubleTy(buildParameters.getLLVMContext()), 0,
VarName.c_str());
}
さて、私は(非POD型のためAllocasを追加したいことは、デストラクタ/クリーンアップが必要な場合があります出口で機能する)。ただし、exitスコープブロックの最後にデストラクタコールを追加するだけでは不十分です。これは、通常のDWARF例外がスローされたときに呼び出される方法が明確でないためです(この引数の目的のために、例外はPODタイプだけを投げるC++関数を呼び出すコールポイントからスローされるので、私の場合、無知は至福です。私はそれらをよく理解しない限り、intrinsic llvm exceptionsから離れていたいと思います。
私は、Allocaレジスタを持つスタック内のオフセットを持つテーブルを持つことができ、(JIT関数の呼び出しポイントにあるスタックの最下部にある)例外ハンドラを持つことができると考えていました。テーブルのオフセットとデストラクターを適切に呼び出します。
私が知らないことは、CreateAllocaで作成されたAlloca'edレジスタのオフセットをどのように問い合わせるかです。 どうすればそれを確実に行うことができますか?あなたはこれを達成するためのより良い方法があると思われる場合
また、
- LLVMのパス上に私を啓発してください技術的なコメント:JITコードがどののみboost::contextの内側と呼ばれていますtryキャッチ内でJITコードを呼び出し、キャッチ上で何も実行せず、コンテキストから抜け出してメイン実行スタックに戻ります。私が主要な実行スタックで巻き戻しを処理すると、(スタック変数をクリーンアップする)関数が終了したJITコンテキストから同じスタックの内容を上書きしないので、破損しないということです。私は
これは理由です。私はフレームが巻き戻されるたびに呼び出されるように、デストラクタのIRコードをどこにどのように構築するのか分かりません。 – lurscher
IRを正しく構築する方法を試してみるために答えを更新しました。 – servn
私にこれを説明してください。 bが呼び出されている場合は、aが呼び出され、例外がスローされます。 bフレームが巻き戻された後に@X ::〜X()を呼び出すコードはどこですか?私はAPIレベルからこれをどうやって行うのかよく分かりません – lurscher