简体   繁体   English

Haskell LLVM绑定链接器错误

[英]Haskell LLVM Binding linker error

update: 更新:

I'm now on LLVM 2.9 with binding llvm-0.9.1.2 running on ghc 7.0.4 and I'm down to just one of these errors: 我现在在LLVM 2.9上结合在ghc 7.0.4上运行的llvm-0.9.1.2绑定,我只遇到以下错误之一:

/home/jfmiller28/.cabal/lib/llvm-0.9.1.2/ghc-7.0.4/libHSllvm-0.9.1.2.a(Scalar.o): In function `sm03_info':
(.text+0x24d): undefined reference to `LLVMAddLoopIndexSplitPass'
collect2: ld returned 1 exit status

I am getting the following linker error for the haskell LLVM bindings: 对于Haskell LLVM绑定,我收到以下链接器错误:

Linking llvm ...
/home/jfmiller28/.cabal/lib/llvm-0.9.0.1/ghc-6.12.3/libHSllvm-0.9.0.1.a(Core.o): In function `scZD_info':
(.text+0xf589): undefined reference to `LLVMBuildFNeg'
/home/jfmiller28/.cabal/lib/llvm-0.9.0.1/ghc-6.12.3/libHSllvm-0.9.0.1.a(Core.o): In function `sdRn_info':
(.text+0x114c5): undefined reference to `LLVMAddDestination'
/home/jfmiller28/.cabal/lib/llvm-0.9.0.1/ghc-6.12.3/libHSllvm-0.9.0.1.a(Core.o): In function `sdSb_info':
(.text+0x11545): undefined reference to `LLVMAddGlobalInAddressSpace'
...
collect2: ld returned 1 exit status

For ghc --make hello.hs : 对于ghc --make hello.hs

module Main where

import Data.Word

import LLVM.Core
import LLVM.ExecutionEngine

bldGreet :: CodeGenModule (Function (IO ()))
bldGreet = withStringNul "Hello, JIT!" (\greetz -> do
    puts <- newNamedFunction ExternalLinkage "puts" :: TFunction (Ptr Word8 -> IO Word32)
    func <- createFunction ExternalLinkage $ do
      tmp <- getElementPtr0 greetz (0::Word32, ())
      _ <- call puts tmp -- Throw away return value.
      ret ()
    return func)

main :: IO ()
main = do
    initializeNativeTarget
    greet <- simpleFunction bldGreet
    -- greet

    return ()

LLVM was installed with apt-get to /usr/lib/llvm. LLVM随apt-get安装到/ usr / lib / llvm。

The answer to the original problem was that I have a version of LLVM that was too old. 原始问题的答案是我的LLVM版本太旧了。 The the time of this writing you need LLVM 2.8 or newer. 在撰写本文时,您需要LLVM 2.8或更高版本。

The next problem had to do with an outdated line in the llvm bindings. 下一个问题与llvm绑定中的过时行有关。 The solution this time was to compile the llvm bindings from the git repository. 这次的解决方案是从git存储库编译llvm绑定。 Correct me if I am wrong, but I needed something newer the the public 0.9.1.2 release that cabal install llvm pulled down. 如果我错了,请纠正我,但是我需要一些更新的公共0.9.1.2版本,该版本将cabal install llvm下拉了。

see https://github.com/bos/llvm/issues/2 and https://github.com/bos/llvm/pull/3 参见https://github.com/bos/llvm/issues/2https://github.com/bos/llvm/pull/3

maybe this patch can make it run with LLVM 2.9 with binding llvm-0.9.1.2 running on ghc 7.0.4 也许此补丁可以使其与LLVM 2.9一起运行,并在ghc 7.0.4上运行绑定llvm-0.9.1.2

diff -rupN llvm-0.9.1.2/LLVM/FFI/Transforms/Scalar.hsc llvm-0.9.1.2-modified/LLVM/FFI/Transforms/Scalar.hsc
--- llvm-0.9.1.2/LLVM/FFI/Transforms/Scalar.hsc 2011-05-20 02:20:56.000000000 +0800
+++ llvm-0.9.1.2-modified/LLVM/FFI/Transforms/Scalar.hsc    2011-06-20 20:59:27.455828891 +0800
@@ -30,8 +30,6 @@ foreign import ccall unsafe "LLVMAddLICM
     :: PassManagerRef -> IO ()
 foreign import ccall unsafe "LLVMAddLoopDeletionPass" addLoopDeletionPass
     :: PassManagerRef -> IO ()
-foreign import ccall unsafe "LLVMAddLoopIndexSplitPass" addLoopIndexSplitPass
-    :: PassManagerRef -> IO ()
 foreign import ccall unsafe "LLVMAddLoopRotatePass" addLoopRotatePass
     :: PassManagerRef -> IO ()
 foreign import ccall unsafe "LLVMAddLoopUnrollPass" addLoopUnrollPass
diff -rupN llvm-0.9.1.2/llvm.cabal llvm-0.9.1.2-modified/llvm.cabal
--- llvm-0.9.1.2/llvm.cabal 2011-05-20 02:20:56.000000000 +0800
+++ llvm-0.9.1.2-modified/llvm.cabal    2011-06-20 21:03:29.846828930 +0800
@@ -125,7 +125,6 @@ library
       LLVM.Target.MSP430
       LLVM.Target.Mips
       LLVM.Target.Native
-      LLVM.Target.PIC16
       LLVM.Target.PowerPC
       LLVM.Target.Sparc
       LLVM.Target.SystemZ

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM