Haskell LLVM中的Segfault - 通用代码生成

Car*_*ano 5 haskell llvm

我试图用跟着LLVM绑定教程在这里,并运行到段错误.下面的代码在它打印模块头的意义上工作output.ll,但它也在某个地方进行了段错误.

module Main where

import Control.Monad.Error
import LLVM.General.Module
import LLVM.General.Context
import qualified LLVM.General.AST as AST

--Create and write out an empty LLVM module
main :: IO ()
main = writeModule (AST.defaultModule { AST.moduleName = "myModule" })

outputFile :: File
outputFile = File "output.ll"

writeModule :: AST.Module -> IO ()
writeModule mod = withContext $ (\context ->
                    liftError $ withModuleFromAST context mod (\m ->
                      liftError $ writeLLVMAssemblyToFile outputFile m))

--perform the action, or fail on an error
liftError :: ErrorT String IO a -> IO a
liftError = runErrorT >=> either fail return
Run Code Online (Sandbox Code Playgroud)

我怀疑这与链接教程中的以下提示有关:

记住不要传递或尝试使用括号外的资源非常重要,因为这会导致未定义的行为和/或段错误.

我认为在这种情况下,"括号"是由withContext函数实现的,这使得看起来应该处理所有内容.

如果我改变定义writeModule

writeModule mod = do assembly <- (withContext $ (\context ->
                       liftError $ withModuleFromAST context mod moduleLLVMAssembly))
                    putStrLn assembly
Run Code Online (Sandbox Code Playgroud)

也就是说,不是写入文件而是打印出LLVM程序集的字符串表示,而不是抛出段错误.

有没有人有这些绑定的经验?我也有兴趣知道我引用警告的失败案例.也就是说,如何"忘记"不使用括号外的资源?所有似乎需要的功能都Context需要一个.这种资源范围问题不正是Haskell擅长处理的问题吗?

版本信息:

  • llvm-general-3.4.3.0
  • LLVM version 3.4
  • Default target: x86_64-apple-darwin13.2.0

Ste*_*ehl 3

如果您共享 LLVM 和 cabal 环境,这将会有所帮助,LLVM 因其自身向后不兼容而臭名昭著,因此使用最新版本的绑定可能会出现问题。

在幕后writeLLVMAssemblyToFile使用 C++ 调用来执行文件 IO 操作,我推测它保存了对 LLVM 模块的引用,作为最终确定文件资源的结果。

尝试使用将模块渲染为字符串moduleString,然后仅提升到 IO monad 以writeFile从 Haskell 进行调用,而不是通过 C++ 进行写入。

import LLVM.General.Context
import LLVM.General.Module as Mod
import qualified LLVM.General.AST as AST

import Control.Monad.Error

main :: IO ()
main = do
  writeModule (AST.defaultModule { AST.moduleName = "myModule" })
  return ()

writeModule :: AST.Module -> IO (Either String ())
writeModule ast =
  withContext $ \ctx ->
    runErrorT $ withModuleFromAST ctx ast $ \m -> do
      asm <- moduleString m
      liftIO $ writeFile "output.ll" asm
Run Code Online (Sandbox Code Playgroud)

根据我的经验,绑定仍然相当脆弱,如果问题仍然存在,您应该在问题跟踪器上询问。

编辑:这是旧版本的解决方法,随后已修复。请参阅: https: //github.com/bscarlet/llvm-general/issues/109