gpt4 book ai didi

Haskell LLVM——创建了重复的函数

转载 作者:行者123 更新时间:2023-12-04 20:47:01 25 4
gpt4 key购买 nike

我在使用 LLVM-Haskell 绑定(bind)时遇到的问题是我得到了“重复”的名称。我认为解释我的问题的最好方法是用一个小的具体例子(注意这个例子是人为的,对于这样一个小例子,有一些简单的方法可以解决它......但是它确实指出了我的问题)。

putc :: TFunction (Int32 -> IO Word32)
putc = newNamedFunction ExternalLinkage "putchar"

simple :: TFunction (Int32 -> IO Word32)
simple = do
internalputc <- putc
createNamedFunction ExternalLinkage "simple" $ \x -> do
call internalputc x
call internalputc x
ret (0 :: Word32)

easy :: TFunction (Int32 -> IO Word32)
easy = do
internalputc <- putc
internalsimple <- simple
createNamedFunction ExternalLinkage "easy" $ \x -> do
call internalsimple x
y <- add x (42 :: Int32)
call internalputc y
ret (0 :: Word32)

main :: IO ()
main = do
m <- newNamedModule "Main"
defineModule m easy
writeBitcodeToFile "SillyLib" m

如果您现在运行这个 haskell 程序(您将需要一些导入,例如 Data.Int/Word 和 LLVM.Core),您将获得以下输出。
; ModuleID = 'SillyLib'

declare i32 @putchar(i32)

declare i32 @putchar1(i32)

define i32 @simple(i32) {
_L1:
%1 = call i32 @putchar1(i32 %0)
%2 = call i32 @putchar1(i32 %0)
ret i32 0
}

define i32 @easy(i32) {
_L1:
%1 = call i32 @simple(i32 %0)
%2 = add i32 %0, 42
%3 = call i32 @putchar(i32 %2)
ret i32 0
}

问题是在 IR 中,(外部)putchar 被声明了两次,但第二次使用名称 putchar1。我很清楚为什么会这样,但对于解决这个问题的一般方法来说不是一个很好的感觉。 IE。我不想把所有东西都放在一个巨大的 CodeGenModule 中。

这让我想到了另一个相关的问题。 LLVM-Haskell 绑定(bind)是否适合构建编译器的后端。也许对上述问题有一个合理的解决方案——我可以想出一种使用它的方法……但手写IR代码似乎更简单……

最佳答案

您调用newNamedFunction "putchar"里面CodeGenModule monad 两次,这显然有添加 putchar 的副作用到模块两次。这导致两个声明而不是错误的事实可能是一个错误,请考虑报告它。要解决这个问题,只需制作 putc simple 的参数和 easy .这看起来大致如下(未经测试):

simple :: Function (Int32 -> IO Word32) -> TFunction (Int32 -> IO Word32)
simple putc =
createNamedFunction ExternalLinkage "simple" $ \x -> do
call putc x
call putc x
ret (0 :: Word32)

easy :: Function (Int32 -> IO Word32) -> Function (Int32 -> IO Word32)
-> TFunction (Int32 -> IO Word32)
easy putc simple' =
createNamedFunction ExternalLinkage "easy" $ \x -> do
call simple' x
y <- add x (42 :: Int32)
call putc y
ret (0 :: Word32)

main :: IO ()
main = do
m <- newNamedModule "Main"
defineModule m $ do
putc <- newNamedFunction ExternalLinkage "putchar"
simple' <- simple putc
easy putc simple'
writeBitcodeToFile "SillyLib" m

关于Haskell LLVM——创建了重复的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16181742/

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