2011-09-23 13 views
2

をほどくする方法を、私は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コンテキストから同じスタックの内容を上書きしないので、破損しないということです。私は

答えて

2

十分な意味を作ってるんだ、私は知らない事がCreateAllocaで作成したAlloca'edレジスタのオフセットを照会する方法であると思います。どうすればそれを確実に行うことができますか?

allocaのアドレスを直接使用することはできますが、スタックフレームへのオフセットを取得する簡単な方法はありません。

なぜ本来のLLVM例外を使用したくないのですか?実際には、特にコードが実際に何かを捕まえることがない単純なケースでは、実際に使用するのは難しいことではありません。基本的に単純なケースでclangが生成するコードを取り、それをコピー&ペーストすることができます。

編集: http://llvm.org/demo/でのデモページに次のC++のコードを貼り付けてみてください、簡単な場合にはIRで例外を使用する方法を参照するには、次の

class X { public: ~X() __attribute((nothrow)); }; 
void a(X* p); 
void b() { X x; a(&x); } 

それは本当に複雑ではありません。

+0

これは理由です。私はフレームが巻き戻されるたびに呼び出されるように、デストラクタのIRコードをどこにどのように構築するのか分かりません。 – lurscher

+0

IRを正しく構築する方法を試してみるために答えを更新しました。 – servn

+0

私にこれを説明してください。 bが呼び出されている場合は、aが呼び出され、例外がスローされます。 bフレームが巻き戻された後に@X ::〜X()を呼び出すコードはどこですか?私はAPIレベルからこれをどうやって行うのかよく分かりません – lurscher