gpt4 book ai didi

haskell - 对 LLVM 的外部导入 prim 调用

转载 作者:行者123 更新时间:2023-12-04 21:11:26 32 4
gpt4 key购买 nike

我正在尝试使用来自此 post 的想法调用用 LLVM 编写的外部导入 prim。但我只是不断收到段错误。这是我目前所拥有的。

在 haskell

{-# LANGUAGE GHCForeignImportPrim #-}
{-# LANGUAGE MagicHash, UnboxedTuples #-}
{-# LANGUAGE ForeignFunctionInterface, UnliftedFFITypes #-}

import GHC.Prim

foreign import prim "primllvm" primllvm :: Word# -> Word# -> (# Word#, Word# #)

而在 .ll文件
define cc10 void @primllvm(i64* %baseReg, i64* %sp, i64* %hp, i64* %buffer, i64 %length, i64 %r3, i64 %r4, i64 %r5, i64 %r6, i64* %spLim, float %f1, float %f2, float %f3, float %f4, double %d1, double %d2)
{
%fp = bitcast i64* %sp to void(i64*, i64*, i64*, i64*, i64, i64, i64, i64, i64, i64*, float, float, float, float, double, double)*
tail call cc10 void %fp(i64* %baseReg, i64* %sp, i64* %hp, i64* %buffer, i64 %length, i64 %r3, i64 %r4, i64 %r5, i64 %r6, i64* %spLim, float %f1, float %f2, float %f3, float %f4, double %d1, double %d2) noreturn;
ret void
}

从理论上讲,我认为这应该将它的参数作为元组返回,但就像我说的那样,它只是段错误。任何帮助使这项工作受到赞赏。

最佳答案

我发现你的代码有两个问题:

  • 虽然你的签名说你通过了两个 Word# Haskell 方面的论点,在 LLC 方面,您有 i64* %bufferi64 %length (注意 %buffer 的类型是指针类型!)。
  • sp 中还有一层间接:sp指向栈,栈顶的是延续指针。您的代码似乎试图将堆栈指针解释为函数指针本身。

  • 我不知道 LLVM,我只是通过查看您链接的博客文章、了解 GHC 并四处玩耍,将其拼凑在一起;所以我最终不得不求助于 clang的输出,所以可能有一种更有效的方法来处理 #2,但无论如何这里有一个版本可以工作并实现两个 64 位数字的交换:
    define cc10 void @primllvm(i64* %baseReg, i64* %sp, i64* %hp,
    i64 %x, i64 %y, i64 %r3, i64 %r4, i64 %r5, i64 %r6,
    i64* %spLim,
    float %f1, float %f2, float %f3, float %f4,
    double %d1, double %d2)
    {
    %1 = getelementptr inbounds i64* %sp, i64 0
    %2 = load i64* %1, align 8
    %cont = inttoptr i64 %2 to void (i64*, i64*, i64*,
    i64, i64, i64, i64, i64, i64,
    i64*,
    float, float, float, float,
    double, double)*

    tail call cc10 void %cont(i64* %baseReg, i64* %sp, i64* %hp,
    i64 %y, i64 %x, i64 %r3, i64 %r4, i64 %r5, i64 %r6,
    i64* %spLim,
    float %f1, float %f2, float %f3, float %f4,
    double %d1, double %d2) noreturn
    ret void
    }

    用于测试的 Haskell 代码:
    {-# LANGUAGE GHCForeignImportPrim #-}
    {-# LANGUAGE MagicHash, UnboxedTuples, BangPatterns #-}
    {-# LANGUAGE ForeignFunctionInterface, UnliftedFFITypes #-}

    import GHC.Prim
    import GHC.Word

    foreign import prim "primllvm" primllvm :: Word# -> Word# -> (# Word#, Word# #)

    main :: IO ()
    main = do
    let !(W# w1) = 12
    !(W# w2) = 34
    !(# w1', w2' #) = primllvm w1 w2
    x = W# w1'
    y = W# w2'
    print (x, y)

    建筑:
    llc -filetype=obj -o Define.o Define.ll
    ghc --make Use.hs Define.o

    关于haskell - 对 LLVM 的外部导入 prim 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33910131/

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