我正在寻找一种将 LLVM IR 代码(最好是汇编形式)解析为一些内部 Haskell 数据类型的方法,以便以后处理。我想有一些 Haskell 包可以做到这一点,但我似乎找不到。
有什么建议么?
Haskell 的现代 LLVM 包是llvm-general library。它具有将 LLVM 字节码模块从字符串转换为 AST 的 Haskell ADT 的绑定。
import LLVM.General
import LLVM.General.Analysis
import LLVM.General.Context
import Control.Monad.Error
main :: String -> IO ()
main src = do
_ <- withContext $ \context -> do
runErrorT $ withModuleFromString context src $ \mod -> do
ast <- moduleAST mod
-- Your logic here.
return ()
有LLVM 绑定,但它们在解析部分还远未完成,并且可能落后于最近的 LLVM 版本。IR 生成要完整得多。虽然,一旦你碰到它,添加缺少的东西并不难。我已经使用这些绑定来编写编译器后端,它们从来都不是什么大事。
有什么建议么?
通过FFI使用LLVM-C API;具体来说,LLVMParseBitcode 函数应该可以解决问题。
这不是您想要的,您必须使用其他 LLVM-C 函数来查询或修改模块,但至少您将支持最新的 LLVM IR 版本。