我有两个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程序集。
答案 0 :(得分:1)
解决方案是通过将llvm-general依赖项更改为llvm-general >= 3.4.3
来升级llvm-general的版本,这将修复实现中的已知错误。