- LLVM9.0.0
- OCamlのllvmパッケージ
- opamからインストール
llvm 9.0.0 The OCaml bindings distributed with LLVM
-
- 現状で最新だが、バージョン9.0.0に対応するページを見る必要がある
- 他のバージョン
- 各Chapterのブランチにチェックアウト
make run
で実行
- 特に問題なし
- ビルドが通らない
File "codegen.ml", line 5, characters 5-9:
Error: Unbound module Llvm
myocamlbuild.ml
が問題らしい- 以下の部分を消す
ocaml_lib ~extern:true "llvm";;
ocaml_lib ~extern:true "llvm_analysis";;
ocamlbuild
のオプションに-use-ocamlfind
を渡す_tags
ファイルを以下のように編集
<{lexer,parser}.ml>: use_camlp4, pp(camlp4of)
<*.{byte,native}>: g++, package(llvm, llvm.analysis)
<*.ml>: package(llvm, llvm.analysis)
add
命令でdouble型の数値を加算しようとすると例外が発生する
Integer arithmetic operators only work with integral types!
%addtmp = add double %a, %b
LLVM ERROR: Broken function found, compilation aborted!
codegen.ml
のbuild_add
となっている箇所をbuild_fadd
に修正- 他の演算子についても同様
- ビルドが通らない
File "toplevel.ml", line 37, characters 25-53:
Error: Unbound module ExecutionEngine
- APIが変わっている
- 大きな変更があったコミット
run_function
に相当する関数はなくなっていて、代わりにget_function_address
を用いるCtypes
を用いて明示的に呼び出す必要がある- それに伴う変更をいくつか
- ExecutionEngineをトップレベルの評価のたびに生成するように変更する
- C言語の関数を呼び出そうとするとSegmentation Faultする
ready> extern putchard(X);
ready> putchard(42);
- などとすると落ちる
-
nativeでビルドするように変更
-
C言語側を共有ライブラリの形にしておいて、動的リンクする
$ gcc -shared bindings.c -o libbindings.so
で共有ライブラリを作り、ocamlbuild
に-lflags -cclib,-lbinding,-ccopt,-L.
を渡して動的リンクするようにする$ LD_LIBRARY_PATH=./_build ./toy.native
のように実行する
-
putchard
だけだと標準出力がフラッシュされずに画面に文字が出ないことがあるので注意
- for文のカウンタで
add
命令が使われているので例外が発生する(問題点3-2と同じ)
build_add
をbuild_fadd
に変更