LLVM-常规分段错误

时间:2014-06-27 18:41:44

标签: haskell llvm

我有两个LLVM.General.Module模块,A和B.我的目标是将B链接到A,然后将程序集写入文件。我正在玩一个玩具程序,看看如何使用LLVM-General界面。我使用LLVM-General-Pure包为某些编译器后端创建LLVM.General.AST模块。

我想将这些AST带入C ++世界(LLVM.General.Module),链接它们,然后编写程序集。我在链接C ++模块时发现了错误,但我感觉错误是我生成C ++对象的方式。这是我做的:

convASTToModE ast = do
a <- withContext $ \context -> do
    x <- runErrorT $ withModuleFromAST context ast $ \mod -> return mod 
    return x
return a

评论:我找不到类型为Module的函数 - &gt;模块(就像moduleAST在使用时从C ++对象中生成AST,比如withModuleFromLLVMAssembly)来给出withModuleFromAST,这样我就可以得到一个Module,所以我只是使用了该单元。我对此的解读是,我可以使用我从ast获得的模块做一些事情,而我只是想要模块,所以我就把它拿走了。我猜这是错的,但认为它会做点什么。

当我在我的一个LLVM.General.AST.Module模块上执行此代码时,代码似乎运行正常。但是当我尝试使用它时,它会破裂。例如,如果x是LLVM.General.AST.Module,我就

mod <- convASTToModE x
case mod of
    Left _ -> error ""
    Right mod' -> do
        assemb <- moduleLLVMAssembly mod
        putStrLn assemb

我遇到了分段错误。

LLVM - 常规 - 3.4.3.0 LLVM-3.4

更新: 我尝试了以下方法:

writeASTToLLVMAssembly ast filename = do
    withContext $ \context -> do
        runErrorT $ withModuleFromAST context ast $ \mod -> do
            runErrorT $ writeLLVMAssemblyToFile (File filename) mod
    return ()

给出:

*** Error in `./LLVMImportAndLinkTest': munmap_chunk(): invalid pointer:
0x00000000012db000 ***
Aborted (core dumped)

然而,

showLLVMAssFromAST ast = do
    str <- withContext $ \context -> do
       str2 <- runErrorT $ withModuleFromAST context ast $ \mod -> do
            str3 <- moduleLLVMAssembly mod 
            return str3
       return str2
    case str of 
         Left _ -> error "ast not convertible to string"
         Right st -> return st

没有问题。

LLVM-General.3.4.3.0 LLVM-3.4

例如,找到LLVM.General.AST.Module http://lpaste.net/106407

这是通过上传获得的AST的漂亮印刷版本 http://lpaste.net/106408 进入LLVM-General。

通过编译C文件从Clang生成了LLVM程序集。

1 个答案:

答案 0 :(得分:1)

解决方案是通过将llvm-general依赖项更改为llvm-general >= 3.4.3来升级llvm-general的版本,这将修复实现中的已知错误。