2016/09/29

Implementing a JIT Compiled Language with Haskell and LLVM を chapter 3 までやってみた

Haskell + LLVM で言語を作ってみる Implementing a JIT Compiled Language with Haskell and LLVM というページがあったのでちょっとやってみました。
LLVM-IR を吐くところまでは動いたのでそのメモ。
作成した repository は github の atton-/kaleidoscope にあります。


ページに書かれているコードを写経していたら chapter 3 くらいから問題発生。
Webに書かれていることを写経してもコンパイルが通らない。
本家のコードを chapter 2 で定義した Syntaxchapter 3 で定義された Syntax は違うようです。
他にもWebには書かれていない関数があったりしたので、エラーが出たら本家のコードを見つつ chapter 3 の Code Generation までは書けました。

ここで追加で問題発生。 llvm-general を ghci から使おうとすると

<interactive>: /usr/lib/llvm-3.5/lib/libLLVMSupport.a: unhandled ELF relocation(RelA) type 42

と出て動かない。
OSX 10.10.5 / Ubuntu 16.04 / Fedora 23 / Fedora24  on Docker で動かしたり stack を使ったりしたが解決せず。
ちなみに OSX では
lookupSymbol failed in relocateSection (RELOC_GOT)
/usr/local/Cellar/llvm35/3.5.1/lib/llvm-3.5/lib/libLLVMProfileData.a: unknown symbol `___dso_handle'
と出て動かなかったです。

https://github.com/DanielG/ghc-mod/issues/762 とかを参考にしながら
--ghc-options="-opta-Wa,-mrelax-relocations=no"
を付けて cabal で install したり stack の stack.yaml に書いたりしましたが動かず。
最終的に ghci では動かないけれど ghc では動きました。どうも良く分からない……
Fedora 23 on Docker で動かした時の Dockerfile はこれです。
一応 Ubuntu 16.04 でも ghc でなら動いたはずです。


Haskell の環境構築とかデバッグとかのノウハウの不足を感じる。
環境構築で結構力尽きた感も若干あるけれどどこまで続くかな。