gpt4 book ai didi

Haskell llvm-general JIT : calling a C function on the fly. Stephen Diehl 的教程

转载 作者:行者123 更新时间:2023-12-02 11:02:48 24 4
gpt4 key购买 nike

我正在关注Stephen Diehl's excellent LLVM Haskell tutorial在 Linux Mint 盒子上(Linux Mint 17 Qiana、GHC 7.8.4、llvm 3.4)。

我克隆了该项目的 github 存储库,并且能够使用包含的 Makefile 构建每个章节的示例。

在第 4 章中,教程向我们介绍了一个 JIT 编译器:

import qualified LLVM.General.ExecutionEngine as EE

jit :: Context -> (EE.MCJIT -> IO a) -> IO a
jit c = EE.withMCJIT c optlevel model ptrelim fastins
where
optlevel = Just 2 -- optimization level
model = Nothing -- code model ( Default )
ptrelim = Nothing -- frame pointer elimination
fastins = Nothing -- fast instruction selection

runJIT :: AST.Module -> IO (Either String ())
runJIT mod = do
...
jit context $ \executionEngine ->
...
EE.withModuleInEngine executionEngine m $ \ee -> do
mainfn <- EE.getFunction ee (AST.Name "main")
case mainfn of
Just fn -> do
res <- run fn
putStrLn $ "Evaluated to: " ++ show res
Nothing -> return ()

然后本教程通过编写 C 代码来实现操作来扩展该语言。

/* cbits
$ gcc -fPIC -shared cbits.c -o cbits.so
$ clang -fPIC -shared cbits.c -o cbits.so
*/

#include "stdio.h"

// putchard - putchar that takes a double and returns 0.
double putchard(double X) {
putchar((char)X);
fflush(stdout);
return 0;
}

makefile 通过运行来构建项目:

gcc -fPIC -shared src/chapter4/cbits.c -o src/chapter4/cbits.so
ghc -no-user-package-db -package-db .cabal-sandbox/*-packages.conf.d src/chapter4/cbits.so --make src/chapter4/*.hs -o chapter4

但是当我尝试调用 putchard() 时,出现错误:

LLVM ERROR: Program used external function 'putchard' which could not be resolved!

我在这里遗漏了什么吗?

我见过有人对本教程的原始 C++ 版本有类似的问题。他们通常通过向 gcc 构建命令(-rdynamic)添加一个标志来解决这个问题,该标志应该使链接器将所有符号(而不仅仅是使用过的符号)添加到动态符号表中。我怀疑 ghc 正在从可执行文件中剥离 putchard()

当我在 OS X 上执行完全相同的步骤时,一切正常,并且可以毫无问题地调用 putchard()

发生了什么事?

我刚刚尝试在 Centos 7 上运行该项目,它成功了。我的 Mint 机器肯定有问题。

最佳答案

也许 GHC 在链接和删除符号时有点过于热心?能否在Main.hs中使用FFI手动添加引用,然后重新编译。

{-# LANGUAGE ForeignFunctionInterface #-}

import Foreign.C.Types

foreign import ccall safe "putchard" putchard
:: CDouble -> CDouble

关于Haskell llvm-general JIT : calling a C function on the fly. Stephen Diehl 的教程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29462859/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com