【发布时间】:2018-08-29 03:21:24
【问题描述】:
关注this SO post 关于 Haskell 程序的编译 对于 LLVM IR,我采用了相同的 Haskell 程序并尝试运行其生成的 LLVM IR 代码:
quicksort [] = []
quicksort (p:xs) = (quicksort lesser) ++ [p] ++ (quicksort greater)
where
lesser = filter (< p) xs
greater = filter (>= p) xs
main = print(quicksort([5,2,1,0,8,3]))
我首先将它编译为 LLVM IR
$ ghc -keep-llvm-files main.hs
然后我将其转换为位码:
$ llvm-as main.ll
但是,当我尝试使用 lli 运行它时,我收到以下关于缺少 main 的错误:
$ lli main.bc
'main' function not found in module.
我做错了吗?谢谢。
编辑:(来自 K. A. Buhr 的回答)
$ ls -l main*
main.hs
$ ghc -keep-llvm-files main.hs
[1 of 1] Compiling Main ( main.hs, main.o )
Linking main ...
$ ls -l main*
main
main.hi
main.hs
main.ll
main.o
$ rm main main.hi main.o
$ llvm-as main.ll
$ llc main.bc -filetype=obj -o main.o
$ ghc -o main main.o
$ ./main
[0,1,2,3,5,8]
【问题讨论】:
-
也许this old answer of mine 会帮助你。
-
@K.A.Buhr 谢谢它的工作!我仍然有点困惑,因为创建的 *.ll 文件必须包含某种入口点,对吗?显然它没有被称为 main ,但它必须存在,不是吗?这个“简单”的 haskell 快速排序在 *.ll 文件中有 1706 行长,所以我在那里找不到任何东西。另外,能否请您发布答案让我接受?
-
有入口点但需要链接到ghc运行时。
-
@DanRobertson 我怎样才能找到它?我已经为“入口点”添加了 *.ll 文件,当我将标准 C 文件编译为 *.bc 然后编译为 *.ll 时,它总是出现......但是那里没有这样的东西......也为@987654329 grepped @(而不是 main)确实找到了一些结果,但它们似乎都无关紧要
-
@OrenIshShalom 恐怕我不知道。必须有某种方法可以在
.ll文件中找到函数,但我不知道它是什么
标签: haskell compilation llvm-ir lli