gpt4 book ai didi

Ubuntu Ocaml llvm 未绑定(bind)模块 ExecutionEngine

转载 作者:行者123 更新时间:2023-12-04 18:46:24 24 4
gpt4 key购买 nike

我一直在研究 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

如何修复此错误?

最佳答案

看来 llvm 在 3.4 和 3.7 版本之间变化很大。你可以找到旧图书馆here而新的是here .

我以前从未使用过 llvm,所以我的解决方案不是更好/更好的解决方案。好吧实际上甚至还有一个错误:我没有设法获得匿名功能,所以我命名它们,但我无法拥有几个功能,只考虑第一个......但这里有一个一般的想法,任何人都可以改进,并且稍微了解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")

你可以在这个 fork 上找到示例: https://github.com/tobiasBora/llvm .

希望它可以帮助,并为错误感到抱歉。

关于Ubuntu Ocaml llvm 未绑定(bind)模块 ExecutionEngine,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37127803/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com