2011-06-23 25 views
7

背景:LLVM JIT機能を追加しようとしているおもちゃLispインタプリタを書いています。さしあたり、次の制限を課している:コンパイル時にパラメータの数がわからないときにLLVM(haskell bindings)に関数を追加する

compile :: [Value] -- List of Formal Parameters 
     -> [Value] -- Body of function 
     -> CodeGenModule(Function a)` 

:のみ整数値を関数で許可さ

  • 変数のみを考える仮パラメータ

を参照することができます質問:関数pを生成するにはどうすればよいですか? arametersは、Formal Parametersリストの長さと同じですか?

+0

良いスタートは、私が「すべてのことを理解するのを手伝ってください。 FunctionArgs fg(CodeGenFunction r()) ' –

+0

LLVMのhaskellバインディングの使用経験を共有したいですか?どのバージョンを使用しましたか? :) – Nybble

+0

@Wu:[コミット729514](https://github.com/bos/llvm/commit/72951414d7b7b377ee1a040fae2b043b7747ceff)のllvmバインディングでLLVM 2.9。 [関連項目](http://stackoverflow.com/questions/6406067/haskell-llvm-binding-linker-error) –

答えて

6

それはLLVM.CoreからわずかEDSL(種類は確かにかなり毛深いです)でこれを行うことが可能です場合、私は知らないが、あなたはLLVM.FFI.Coreを見れば、あなたはmanipulating LLVM function typescreating LLVM functionsのための低レベルの機能を見つけることができます。これは、アクションの次計画につながる:

  • functionTypeであなたの機能のためのTypeRefを作成します。
  • addFunctionを使用して、この機能をモジュールに追加します。
  • appendBasicBlock/insertBasicBlockを使用して基本ブロックを設定します。基本ブロック内の関数引数を参照するには、getParamを使用します。

基本ブロックを構築するのに素敵なモナドEDSL構文を利用することは可能です。また、LLVM.Core.Utilを見ると、FFIレイヤーを操作するためのヘルパー関数がいくつか含まれています。

関連する問題