Ubuntu Ocaml llvm未绑定模块ExecutionEngine

时间:2016-05-10 01:18:44

标签: ubuntu ocaml ocamlbuild

我一直在研究OCaml的LLVM Kaleidoscope教程。在本教程的第三部分中,我已导航到文件夹

中的示例代码
OCaml-Kaleidoscope\Chapter4

使用

进行编译时遇到问题
ocamlbuild -use-ocamlfind toy.byte -package llvm -package llvm.executionengine

在VirtualBox Ubuntu上。

我得到的错误是

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

如何解决此错误?

1 个答案:

答案 0 :(得分:1)

似乎llvm在版本3.4和3.7之间发生了很大变化。您可以找到旧库here,而新库here

我之前从未使用llvm,所以我的解决方案不是更好/更好。事实上,甚至还有一个错误:我没有设法获得匿名功能,所以我将它们命名为,但我无法设置多个功能,只考虑第一个功能......但是这里有一个普遍的想法,任何人都可以改进,而且知道更好一点的人肯定会发现错误。停止发言,让我们的代码:

首先,安装deps:

opam install ctypes ctypes-foreign llvm

然后,由于ExecutionEngine模块重写,我将let result = ExecutionEngine.run_function the_function [||]的定义改为(在toplevel.ml

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);

您还需要更新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> 

然而,有一个令人烦恼的错误:如果你再试一次,你会收到一个错误。如果函数没有第二次注册就好了,但是因为它是我第一次使用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")

您可以在此分支上找到示例:https://github.com/tobiasBora/llvm

希望它可以提供帮助,并为此错误道歉。