首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ubuntu Ocaml llvm未绑定模块ExecutionEngine

Ubuntu Ocaml llvm未绑定模块ExecutionEngine
EN

Stack Overflow用户
提问于 2016-05-10 09:18:44
回答 1查看 410关注 0票数 1

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

代码语言:javascript
复制
OCaml-Kaleidoscope\Chapter4

我在编译时遇到一个问题

代码语言:javascript
复制
ocamlbuild -use-ocamlfind toy.byte -package llvm -package llvm.executionengine

在VirtualBox Ubuntu上。

我得到的错误是

代码语言:javascript
复制
File "toplevel.ml", line 37, characters 25-53:
Error: Unbound module ExecutionEngine

如何修复此错误?

EN

回答 1

Stack Overflow用户

发布于 2016-05-12 12:46:24

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

我以前从未使用过llvm,所以我的解决方案不是最好的。事实上,甚至还有一个bug :我没有设法获得匿名函数,所以我给它们命名,但我不能设法拥有几个函数,只考虑了第一个函数……但这是一个普遍的想法,任何人都可以改进,并且对llvm稍有了解的人肯定会发现错误。别说了,让我们来编写代码:

首先,安装deps:

代码语言:javascript
复制
opam install ctypes ctypes-foreign llvm

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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 *)

现在你可以运行这个程序了:

代码语言:javascript
复制
ocamlbuild -use-ocamlfind toy.byte -package llvm -package llvm.executionengine && ./toy.byte 

并使用它:

代码语言:javascript
复制
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,其他人可能很容易发现这个错误:

代码语言:javascript
复制
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

希望它能有所帮助,并为这个bug道歉。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37127803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档