2016-05-10 7 views
1

私は、OCamlのLLVM万華鏡チュートリアルで作業しています。 VirtualBoxのUbuntuの上Ubuntu Ocaml llvm unbound module ExecutionEngine

ocamlbuild -use-ocamlfind toy.byte -package llvm -package llvm.executionengine 

でコンパイルするとき、私は問題が発生しています

OCaml-Kaleidoscope\Chapter4 

チュートリアルの第三部では、私は、フォルダ内のコード例にナビゲートしています。私は取得しています

エラーが、私はこのエラーを修正するにはどうすればよい

File "toplevel.ml", line 37, characters 25-53: 
Error: Unbound module ExecutionEngine 

のですか?

答えて

1

バージョン3.4と3.7の間でllvmが大きく変更されたようです。新しいライブラリがhereである間に古いライブラリhereを見つけることができます。

前にllvmを使用したことがないので、私の解決策はより良い/良いものではありません。実際にはバグもあります。私は匿名機能を得ることができないので、名前を付けますが、いくつかの機能を持つことはできません。最初のものだけが考慮されます...しかし、ここには誰でも改善できると思っていますし、llvmが少し良くなったと知っている人は間違いなく間違いを見つけます。ましょう、話す停止コード:

まず、インストールDEPS:理由ExecutionEngineモジュール書き換えの後

opam install ctypes ctypes-foreign llvm 

は、私が

open Ctypes 
open PosixTypes 
open Foreign 

[...] 

let my_name = "my_function_name" in (* If a name has already been add, value_name the_function should contains it. You should be able to use anonyme functions but I don't manage to get them work *) 
let address = get_function_address my_name (funptr (void @-> returning double)) the_execution_engine in 
print_string "Evaluated to "; 
print_float (address); 

toplevel.ml中)によりlet result = ExecutionEngine.run_function the_function [||]の定義を変更しましたtoy.mlを更新する必要があります。

let main() = 
    ignore (initialize()); (* Change the initialize *) 

    [...] 

    (* Create the JIT. *) 
    let the_execution_engine = create Codegen.the_module in 

    [...] 

    (* Set up the optimizer pipeline. Start with registering info about how the 
    * target lays out data structures. *) 
    DataLayout.add_to_pass_manager the_fpm (data_layout the_execution_engine); (* Change also this line *) 

今、あなたがプログラムを実行することができます

ocamlbuild -use-ocamlfind toy.byte -package llvm -package llvm.executionengine && ./toy.byte 

をし、それを使用します。

ready> 43+15; 
parsed a top-level expr 
---- 

define double @__my_anom_fct__0() { 
entry: 
    ret double 5.800000e+01 
} 

Evaluated to 58. 
ready> 

をしかし、anoyingバグがあります:あなたがもう一度やり直してください場合は、エラーが発生します。これは、関数が二度目に登録されていない場合のようなものだが、それは、私は他の誰かが簡単にエラーを見つけることがLLVMを初めて使用するときだから:https://github.com/tobiasBora/llvm

ready> 1+42; 
parsed a top-level expr 
---- 

define double @__my_anom_fct__1() { 
entry: 
    ret double 4.300000e+01 
} 

Fatal error: exception Llvm_executionengine.Error("Function __my_anom_fct__1 not found") 

あなたはこのフォークに例を見つけることができます。

バグをお待ちしております。

+0

私はこれを行うと、私は次のエラーを取得: 'ファイル「toplevel.ml」、43行、文字24-33: エラー:この式は、単位型を持つ - >フロート が、式がfloat型 に期待されたがコード2で終了したコマンド 'おそらくtoplevel.mlの編集が調整を必要とします。 – CuriousStudent

関連する問題