Skip to content

Latest commit

 

History

History
125 lines (85 loc) · 3.25 KB

README.md

File metadata and controls

125 lines (85 loc) · 3.25 KB

OCaml Kaleidoscope in LLVM9.0.0

前提条件

  • LLVM9.0.0
  • OCamlのllvmパッケージ
    • opamからインストール
    • llvm 9.0.0 The OCaml bindings distributed with LLVM

参考文献


リポジトリの使い方

  1. 各Chapterのブランチにチェックアウト
  2. make runで実行

各Chapterの問題点とその解決方法

Chapter 1, 2

  • 特に問題なし

Chapter 3

問題点3-1

  • ビルドが通らない
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)

問題点3-2

  • add命令でdouble型の数値を加算しようとすると例外が発生する
Integer arithmetic operators only work with integral types!
  %addtmp = add double %a, %b
LLVM ERROR: Broken function found, compilation aborted!

解決方法

  • codegen.mlbuild_addとなっている箇所をbuild_faddに修正
    • 他の演算子についても同様

Chapter 4

問題点4-1

  • ビルドが通らない
File "toplevel.ml", line 37, characters 25-53:
Error: Unbound module ExecutionEngine

解決方法

  • APIが変わっている
    • 大きな変更があったコミット
    • run_functionに相当する関数はなくなっていて、代わりにget_function_addressを用いる
    • Ctypesを用いて明示的に呼び出す必要がある
    • それに伴う変更をいくつか
    • ExecutionEngineをトップレベルの評価のたびに生成するように変更する

問題点4-2

  • 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だけだと標準出力がフラッシュされずに画面に文字が出ないことがあるので注意


Chapter 5, 6, 7

問題点

  • for文のカウンタでadd命令が使われているので例外が発生する(問題点3-2と同じ)

解決方法

  • build_addbuild_faddに変更