Ubuntu Ocaml llvm未绑定模块ExecutionEngine



我一直在学习OCaml的LLVM万花筒教程。在教程的第三部分,我已经导航到文件夹中的示例代码

OCaml-KaleidoscopeChapter4

使用编译时遇到问题

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

在VirtualBox Ubuntu上。

我得到的错误是

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

如何修复此错误?

llvm在3.4版和3.7版之间似乎发生了很大变化。你可以在这里找到旧图书馆,而新图书馆在这里。

我以前从未使用过llvm,所以我的解决方案不是更好/好的。事实上,甚至还有一个bug:我无法获得匿名函数,所以我命名了它们,但我无法获得几个函数,只有第一个被考虑在内。。。但这里有一个总体想法,任何人都可以改进,对llvm了解一点的人肯定会发现错误。停止说话,让我们编码:

首先,安装deps:

opam install ctypes ctypes-foreign llvm

然后,由于ExecutionEngine模块的重写,我通过(在toplevel.ml中)更改了let result = ExecutionEngine.run_function the_function [||]的定义

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.

希望它能有所帮助,并对错误表示歉意。

最新更新